• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* -*- mesa-c++  -*-
2  *
3  * Copyright (c) 2018 Collabora LTD
4  *
5  * Author: Gert Wollny <gert.wollny@collabora.com>
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a
8  * copy of this software and associated documentation files (the "Software"),
9  * to deal in the Software without restriction, including without limitation
10  * on the rights to use, copy, modify, merge, publish, distribute, sub
11  * license, and/or sell copies of the Software, and to permit persons to whom
12  * the Software is furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice (including the next
15  * paragraph) shall be included in all copies or substantial portions of the
16  * Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
22  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24  * USE OR OTHER DEALINGS IN THE SOFTWARE.
25  */
26 
27 #include "sfn_alu_defines.h"
28 
29 namespace r600 {
30 
31 #define A AluOp::a
32 #define V AluOp::v
33 #define T AluOp::t
34 #define X AluOp::x
35 
36 const std::map<EAluOp, AluOp> alu_ops = {
37    {op0_nop,                       AluOp(0, 0, 0, 0, A, A, A, "NOP")                      },
38    {op0_group_barrier,             AluOp(0, 0, 0, 0, X, X, X, "GROUP_BARRIER")            },
39    {op0_group_seq_begin,           AluOp(0, 0, 0, 0, A, A, A, "GROUP_SEQ_BEGIN")          },
40    {op0_group_seq_end,             AluOp(0, 0, 0, 0, A, A, A, "GROUP_SEQ_END")            },
41    {op0_pred_set_clr,              AluOp(0, 0, 0, 0, A, A, A, "PRED_SET_CLR")             },
42    {op0_store_flags,               AluOp(0, 0, 0, 0, V, V, V, "STORE_FLAGS")              },
43    {op0_lds_1a,                    AluOp(0, 0, 0, 0, V, V, V, "LDS_1A")                   },
44    {op0_lds_1a1d,                  AluOp(0, 0, 0, 0, V, V, V, "LDS_1A1D")                 },
45    {op0_lds_2a,                    AluOp(0, 0, 0, 0, V, V, V, "LDS_2A")                   },
46 
47    {op1_bcnt_int,                  AluOp(1, 0, 0, 0, V, V, V, "BCNT_INT")                 },
48    {op1_bcnt_accum_prev_int,       AluOp(1, 0, 0, 0, V, V, V, "BCNT_ACCUM_PREV_INT")      },
49    {op1_bfrev_int,                 AluOp(1, 0, 0, 0, A, A, A, "BFREV_INT")                },
50    {op1_ceil,                      AluOp(1, 1, 1, 0, A, A, A, "CEIL")                     },
51    {op1_cos,                       AluOp(1, 1, 1, 0, T, T, T, "COS")                      },
52    {op1_exp_ieee,                  AluOp(1, 1, 1, 0, T, T, T, "EXP_IEEE")                 },
53    {op1_floor,                     AluOp(1, 1, 1, 0, A, A, A, "FLOOR")                    },
54    {op1_flt_to_int,                AluOp(1, 1, 0, 0, T, T, V, "FLT_TO_INT")               },
55    {op1_flt_to_uint,               AluOp(1, 1, 0, 0, T, T, T, "FLT_TO_UINT")              },
56    {op1_flt_to_int_rpi,            AluOp(1, 1, 0, 0, V, V, V, "FLT_TO_INT_RPI")           },
57    {op1_flt_to_int_floor,          AluOp(1, 1, 0, 0, V, V, V, "FLT_TO_INT_FLOOR")         },
58    {op1_flt16_to_flt32,            AluOp(1, 0, 1, 0, V, V, V, "FLT16_TO_FLT32")           },
59    {op1_flt32_to_flt16,            AluOp(1, 1, 0, 0, V, V, V, "FLT32_TO_FLT16")           },
60    {op1_flt32_to_flt64,            AluOp(1, 1, 0, 0, V, V, V, "FLT32_TO_FLT64")           },
61    {op1_flt64_to_flt32,            AluOp(1, 1, 1, 1, A, A, A, "FLT64_TO_FLT32")           },
62    {op1_fract,                     AluOp(1, 1, 0, 0, A, A, A, "FRACT")                    },
63    {op1_fract_64,                  AluOp(1, 1, 0, 1, V, V, V, "FRACT_64")                 },
64    {op1_frexp_64,                  AluOp(1, 1, 0, 1, V, V, V, "FREXP_64")                 },
65    {op1_int_to_flt,                AluOp(1, 0, 1, 0, T, T, T, "INT_TO_FLT")               },
66    {op1_ldexp_64,                  AluOp(1, 1, 0, 1, V, V, V, "LDEXP_64")                 },
67    {op1_interp_load_p0,            AluOp(1, 0, 0, 0,  V, V, V, "INTERP_LOAD_P0")           },
68    {op1_interp_load_p10,           AluOp(1, 0, 0, 0, V, V, V, "INTERP_LOAD_P10")          },
69    {op1_interp_load_p20,           AluOp(1, 0, 0, 0, V, V, V, "INTERP_LOAD_P20")          },
70    {op1_load_store_flags,          AluOp(1, 0, 0, 0, V, V, V, "LOAD_STORE_FLAGS")         },
71    {op1_log_clamped,               AluOp(1, 1, 1, 0, T, T, T, "LOG_CLAMPED")              },
72    {op1_log_ieee,                  AluOp(1, 1, 1, 0, T, T, T, "LOG_IEEE")                 },
73    {op1_max4,                      AluOp(1, 1, 1, 0, V, V, V, "MAX4")                     },
74    {op1_mbcnt_32hi_int,            AluOp(1, 0, 0, 0, V, V, V, "MBCNT_32HI_INT")           },
75    {op1_mbcnt_32lo_accum_prev_int, AluOp(1, 0, 0, 0, V, V, V, "MBCNT_32LO_ACCUM_PREV_INT")},
76    {op1_mov,                       AluOp(1, 0, 0, 0, A, A, A, "MOV")                      },
77    {op1_mova_int,                  AluOp(1, 0, 0, 0, X, X, X, "MOVA_INT")                 },
78    {op1_not_int,                   AluOp(1, 0, 0, 0, A, A, A, "NOT_INT")                  },
79    {op1_offset_to_flt,             AluOp(1, 0, 0, 0, V, V, V, "OFFSET_TO_FLT")            },
80    {op1_pred_set_inv,              AluOp(1, 0, 0, 0, A, A, A, "PRED_SET_INV")             },
81    {op1_pred_set_restore,          AluOp(1, 0, 0, 0, A, A, A, "PRED_SET_RESTORE")         },
82    {op1_set_cf_idx0,               AluOp(1, 0, 0, 0, A, A, A, "SET_CF_IDX0")              },
83    {op1_set_cf_idx1,               AluOp(1, 0, 0, 0, A, A, A, "SET_CF_IDX1")              },
84    {op1_recip_clamped,             AluOp(1, 1, 1, 0, T, T, T, "RECIP_CLAMPED")            },
85    {op1_recip_ff,                  AluOp(1, 1, 1, 0, T, T, T, "RECIP_FF")                 },
86    {op1_recip_ieee,                AluOp(1, 1, 1, 0, T, T, T, "RECIP_IEEE")               },
87    {op1_recipsqrt_clamped,         AluOp(1, 1, 1, 0, T, T, T, "RECIPSQRT_CLAMPED")        },
88    {op1_recipsqrt_ff,              AluOp(1, 1, 1, 0, T, T, T, "RECIPSQRT_FF")             },
89    {op1_recipsqrt_ieee1,           AluOp(1, 1, 1, 0, T, T, T, "RECIPSQRT_IEEE")           },
90    {op1_recip_int,                 AluOp(1, 0, 0, 0, T, T, T, "RECIP_INT")                },
91    {op1_recip_uint,                AluOp(1, 0, 0, 0, T, T, T, "RECIP_UINT")               },
92    {op1_recip_64,                  AluOp(2, 1, 0, 1, T, T, T, "RECIP_64")                 },
93    {op1_recip_clamped_64,          AluOp(2, 1, 0, 1, T, T, T, "RECIP_CLAMPED_64")         },
94    {op1_recipsqrt_64,              AluOp(2, 1, 0, 1, T, T, T, "RECIPSQRT_64")             },
95    {op1_recipsqrt_clamped_64,      AluOp(2, 1, 0, 1, T, T, T, "RECIPSQRT_CLAMPED_64")     },
96    {op1_rndne,                     AluOp(1, 1, 1, 0, A, A, A, "RNDNE")                    },
97    {op1_sqrt_ieee,                 AluOp(1, 1, 1, 0, T, T, T, "SQRT_IEEE")                },
98    {op1_sin,                       AluOp(1, 1, 1, 0, T, T, T, "SIN")                      },
99    {op1_trunc,                     AluOp(1, 1, 1, 0, A, A, A, "TRUNC")                    },
100    {op1_sqrt_64,                   AluOp(2, 1, 0, 1,  T, T, T, "SQRT_64")                  },
101    {op1_ubyte0_flt,                AluOp(1, 0, 0, 0, V, V, V, "UBYTE0_FLT")               },
102    {op1_ubyte1_flt,                AluOp(1, 0, 0, 0, V, V, V, "UBYTE1_FLT")               },
103    {op1_ubyte2_flt,                AluOp(1, 0, 0, 0, V, V, V, "UBYTE2_FLT")               },
104    {op1_ubyte3_flt,                AluOp(1, 0, 0, 0, V, V, V, "UBYTE3_FLT")               },
105    {op1_uint_to_flt,               AluOp(1, 0, 1, 0, T, T, T, "UINT_TO_FLT")              },
106    {op1_ffbh_uint,                 AluOp(1, 0, 0, 0, V, V, V, "FFBH_UINT")                },
107    {op1_ffbl_int,                  AluOp(1, 0, 0, 0, V, V, V, "FFBL_INT")                 },
108    {op1_ffbh_int,                  AluOp(1, 0, 0, 0, V, V, V, "FFBH_INT")                 },
109    {op1_flt_to_uint4,              AluOp(1, 1, 0, 0, V, V, V, "FLT_TO_UINT4")             },
110    {op1v_flt32_to_flt64,           AluOp(1, 1, 0, 1, A, A, A, "FLT32_TO_FLT64")           },
111    {op1v_flt64_to_flt32,           AluOp(1, 1, 1, 1, V, V, V, "FLT64_TO_FLT32")           },
112 
113    {op2_add,                       AluOp(2, 1, 1, 0, A, A, A, "ADD")                      },
114    {op2_bfm_int,                   AluOp(2, 0, 0, 0, V, V, V, "BFM_INT")                  },
115    {op2_mul,                       AluOp(2, 1, 1, 0, A, A, A, "MUL")                      },
116    {op2_mul_ieee,                  AluOp(2, 1, 1, 0, A, A, A, "MUL_IEEE")                 },
117    {op2_max,                       AluOp(2, 1, 1, 0, A, A, A, "MAX")                      },
118    {op2_min,                       AluOp(2, 1, 1, 0, A, A, A, "MIN")                      },
119    {op2_max_dx10,                  AluOp(2, 1, 1, 0, A, A, A, "MAX_DX10")                 },
120    {op2_min_dx10,                  AluOp(2, 1, 1, 0, A, A, A, "MIN_DX10")                 },
121    {op2_sete,                      AluOp(2, 1, 0, 0, A, A, A, "SETE")                     },
122    {op2_setgt,                     AluOp(2, 1, 0, 0, A, A, A, "SETGT")                    },
123    {op2_setge,                     AluOp(2, 1, 0, 0, A, A, A, "SETGE")                    },
124    {op2_setne,                     AluOp(2, 1, 0, 0, A, A, A, "SETNE")                    },
125    {op2_sete_dx10,                 AluOp(2, 1, 0, 0, A, A, A, "SETE_DX10")                },
126    {op2_setgt_dx10,                AluOp(2, 1, 0, 0, A, A, A, "SETGT_DX10")               },
127    {op2_setge_dx10,                AluOp(2, 1, 0, 0, A, A, A, "SETGE_DX10")               },
128    {op2_setne_dx10,                AluOp(2, 1, 0, 0, A, A, A, "SETNE_DX10")               },
129    {op2_ashr_int,                  AluOp(2, 0, 0, 0, T, A, A, "ASHR_INT")                 },
130    {op2_lshr_int,                  AluOp(2, 0, 0, 0, T, A, A, "LSHR_INT")                 },
131    {op2_lshl_int,                  AluOp(2, 0, 0, 0, T, A, A, "LSHL_INT")                 },
132    {op2_mul_64,                    AluOp(2, 1, 1, 1, A, A, A, "MUL_64")                   },
133    {op2_pred_setgt_uint,           AluOp(2, 0, 0, 0, A, A, A, "PRED_SETGT_UINT")          },
134    {op2_pred_setge_uint,           AluOp(2, 0, 0, 0, A, A, A, "PRED_SETGE_UINT")          },
135    {op2_pred_sete,                 AluOp(2, 1, 0, 0, A, A, A, "PRED_SETE")                },
136    {op2_pred_setgt,                AluOp(2, 1, 0, 0, A, A, A, "PRED_SETGT")               },
137    {op2_pred_setge,                AluOp(2, 1, 0, 0, A, A, A, "PRED_SETGE")               },
138    {op2_pred_setne,                AluOp(2, 1, 0, 0, A, A, A, "PRED_SETNE")               },
139    {op2_pred_set_pop,              AluOp(2, 1, 0, 0, A, A, A, "PRED_SET_POP")             },
140    {op2_pred_sete_push,            AluOp(2, 1, 0, 0, A, A, A, "PRED_SETE_PUSH")           },
141    {op2_pred_setgt_push,           AluOp(2, 1, 0, 0, A, A, A, "PRED_SETGT_PUSH")          },
142    {op2_pred_setge_push,           AluOp(2, 1, 0, 0, A, A, A, "PRED_SETGE_PUSH")          },
143    {op2_pred_setne_push,           AluOp(2, 1, 0, 0, A, A, A, "PRED_SETNE_PUSH")          },
144    {op2_kille,                     AluOp(2, 1, 0, 0, A, A, A, "KILLE")                    },
145    {op2_killgt,                    AluOp(2, 1, 0, 0, A, A, A, "KILLGT")                   },
146    {op2_killge,                    AluOp(2, 1, 0, 0, A, A, A, "KILLGE")                   },
147    {op2_killne,                    AluOp(2, 1, 0, 0, A, A, A, "KILLNE")                   },
148    {op2_and_int,                   AluOp(2, 0, 0, 0, A, A, A, "AND_INT")                  },
149    {op2_or_int,                    AluOp(2, 0, 0, 0, A, A, A, "OR_INT")                   },
150    {op2_xor_int,                   AluOp(2, 0, 0, 0, A, A, A, "XOR_INT")                  },
151    {op2_add_int,                   AluOp(2, 0, 0, 0, A, A, A, "ADD_INT")                  },
152    {op2_sub_int,                   AluOp(2, 0, 0, 0, A, A, A, "SUB_INT")                  },
153    {op2_max_int,                   AluOp(2, 0, 0, 0, A, A, A, "MAX_INT")                  },
154    {op2_min_int,                   AluOp(2, 0, 0, 0, A, A, A, "MIN_INT")                  },
155    {op2_max_uint,                  AluOp(2, 0, 0, 0, A, A, A, "MAX_UINT")                 },
156    {op2_min_uint,                  AluOp(2, 0, 0, 0, A, A, A, "MIN_UINT")                 },
157    {op2_sete_int,                  AluOp(2, 0, 0, 0, A, A, A, "SETE_INT")                 },
158    {op2_setgt_int,                 AluOp(2, 0, 0, 0, A, A, A, "SETGT_INT")                },
159    {op2_setge_int,                 AluOp(2, 0, 0, 0, A, A, A, "SETGE_INT")                },
160    {op2_setne_int,                 AluOp(2, 0, 0, 0, A, A, A, "SETNE_INT")                },
161    {op2_setgt_uint,                AluOp(2, 0, 0, 0, A, A, A, "SETGT_UINT")               },
162    {op2_setge_uint,                AluOp(2, 0, 0, 0, A, A, A, "SETGE_UINT")               },
163    {op2_killgt_uint,               AluOp(2, 0, 0, 0, A, A, A, "KILLGT_UINT")              },
164    {op2_killge_uint,               AluOp(2, 0, 0, 0, A, A, A, "KILLGE_UINT")              },
165    {op2_prede_int,                 AluOp(2, 0, 0, 0, A, A, A, "PREDE_INT")                },
166    {op2_pred_setgt_int,            AluOp(2, 0, 0, 0, A, A, A, "PRED_SETGT_INT")           },
167    {op2_pred_setge_int,            AluOp(2, 0, 0, 0, A, A, A, "PRED_SETGE_INT")           },
168    {op2_pred_setne_int,            AluOp(2, 0, 0, 0, A, A, A, "PRED_SETNE_INT")           },
169    {op2_kille_int,                 AluOp(2, 0, 0, 0, A, A, A, "KILLE_INT")                },
170    {op2_killgt_int,                AluOp(2, 0, 0, 0, A, A, A, "KILLGT_INT")               },
171    {op2_killge_int,                AluOp(2, 0, 0, 0, A, A, A, "KILLGE_INT")               },
172    {op2_killne_int,                AluOp(2, 0, 0, 0, A, A, A, "KILLNE_INT")               },
173    {op2_pred_sete_push_int,        AluOp(2, 0, 0, 0, A, A, A, "PRED_SETE_PUSH_INT")       },
174    {op2_pred_setgt_push_int,       AluOp(2, 0, 0, 0, A, A, A, "PRED_SETGT_PUSH_INT")      },
175    {op2_pred_setge_push_int,       AluOp(2, 0, 0, 0, A, A, A, "PRED_SETGE_PUSH_INT")      },
176    {op2_pred_setne_push_int,       AluOp(2, 0, 0, 0, A, A, A, "PRED_SETNE_PUSH_INT")      },
177    {op2_pred_setlt_push_int,       AluOp(2, 0, 0, 0, A, A, A, "PRED_SETLT_PUSH_INT")      },
178    {op2_pred_setle_push_int,       AluOp(2, 0, 0, 0, A, A, A, "PRED_SETLE_PUSH_INT")      },
179    {op2_addc_uint,                 AluOp(2, 0, 0, 0, A, A, A, "ADDC_UINT")                },
180    {op2_subb_uint,                 AluOp(2, 0, 0, 0, A, A, A, "SUBB_UINT")                },
181    {op2_set_mode,                  AluOp(2, 0, 0, 0, A, A, A, "SET_MODE")                 },
182    {op2_set_lds_size,              AluOp(2, 0, 0, 0, A, A, A, "SET_LDS_SIZE")             },
183    {op2_mullo_int,                 AluOp(2, 0, 0, 0, T, T, T, "MULLO_INT")                },
184    {op2_mulhi_int,                 AluOp(2, 0, 0, 0, T, T, T, "MULHI_INT")                },
185    {op2_mullo_uint,                AluOp(2, 0, 0, 0, T, T, T, "MULLO_UINT")               },
186    {op2_mulhi_uint,                AluOp(2, 0, 0, 0, T, T, T, "MULHI_UINT")               },
187    {op2_dot_ieee,                  AluOp(2, 1, 1, 0, V, V, V, "DOT_IEEE")                 },
188    {op2_mulhi_uint24,              AluOp(2, 0, 0, 0, V, V, V, "MULHI_UINT24")             },
189    {op2_mul_uint24,                AluOp(2, 0, 0, 0, V, V, V, "MUL_UINT24")               },
190    {op2_sete_64,                   AluOp(2, 1, 0, 1, V, V, V, "SETE_64")                  },
191    {op2_setne_64,                  AluOp(2, 1, 0, 1, V, V, V, "SETNE_64")                 },
192    {op2_setgt_64,                  AluOp(2, 1, 0, 1, V, V, V, "SETGT_64")                 },
193    {op2_setge_64,                  AluOp(2, 1, 0, 1, V, V, V, "SETGE_64")                 },
194    {op2_min_64,                    AluOp(2, 1, 0, 1, V, V, V, "MIN_64")                   },
195    {op2_max_64,                    AluOp(2, 1, 0, 1, V, V, V, "MAX_64")                   },
196    {op2_dot4,                      AluOp(2, 1, 1, 0, V, V, V, "DOT4")                     },
197    {op2_dot4_ieee,                 AluOp(2, 1, 1, 0, V, V, V, "DOT4_IEEE")                },
198    {op2_cube,                      AluOp(2, 1, 0, 0, V, V, V, "CUBE")                     },
199    {op2_pred_setgt_64,             AluOp(2, 1, 0, 1, V, V, V, "PRED_SETGT_64")            },
200    {op2_pred_sete_64,              AluOp(2, 1, 0, 1, V, V, V, "PRED_SETE_64")             },
201    {op2_pred_setge_64,             AluOp(2, 1, 0, 1, V, V, V, "PRED_SETGE_64")            },
202    {OP2V_MUL_64,                   AluOp(2, 1, 0, 1, V, V, V, "MUL_64")                   },
203    {op2_add_64,                    AluOp(2, 1, 1, 1, V, V, V, "ADD_64")                   },
204    {op2_sad_accum_prev_uint,       AluOp(2, 0, 0, 0, V, V, V, "SAD_ACCUM_PREV_UINT")      },
205    {op2_dot,                       AluOp(2, 1, 0, 0, V, V, V, "DOT")                      },
206    {op1_mul_prev,                  AluOp(2, 1, 0, 0, V, V, V, "MUL_PREV")                 },
207    {op1_mul_ieee_prev,             AluOp(2, 1, 0, 0, V, V, V, "MUL_IEEE_PREV")            },
208    {op1_add_prev,                  AluOp(2, 1, 0, 0, V, V, V, "ADD_PREV")                 },
209    {op2_muladd_prev,               AluOp(2, 1, 0, 0, V, V, V, "MULADD_PREV")              },
210    {op2_muladd_ieee_prev,          AluOp(2, 1, 0, 0, V, V, V, "MULADD_IEEE_PREV")         },
211    {op2_interp_xy,                 AluOp(2, 0, 0, 0, V, V, V, "INTERP_XY")                },
212    {op2_interp_zw,                 AluOp(2, 0, 0, 0, V, V, V, "INTERP_ZW")                },
213    {op2_interp_x,                  AluOp(2, 0, 0, 0, V, V, V, "INTERP_X")                 },
214    {op2_interp_z,                  AluOp(2, 0, 0, 0, V, V, V, "INTERP_Z")                 },
215 
216    {op3_bfe_uint,                  AluOp(3, 0, 0, 0, V, V, V, "BFE_UINT")                 },
217    {op3_bfe_int,                   AluOp(3, 0, 0, 0, V, V, V, "BFE_INT")                  },
218    {op3_bfi_int,                   AluOp(3, 0, 0, 0, V, V, V, "BFI_INT")                  },
219    {op3_fma,                       AluOp(3, 1, 1, 0, V, V, V, "FMA")                      },
220    {op3_cndne_64,                  AluOp(3, 1, 0, 1, V, V, V, "CNDNE_64")                 },
221    {op3_fma_64,                    AluOp(3, 1, 1, 1, V, V, V, "FMA_64")                   },
222    {op3_lerp_uint,                 AluOp(3, 0, 0, 0, V, V, V, "LERP_UINT")                },
223    {op3_bit_align_int,             AluOp(3, 0, 0, 0, V, V, V, "BIT_ALIGN_INT")            },
224    {op3_byte_align_int,            AluOp(3, 0, 0, 0, V, V, V, "BYTE_ALIGN_INT")           },
225    {op3_sad_accum_uint,            AluOp(3, 0, 0, 0, V, V, V, "SAD_ACCUM_UINT")           },
226    {op3_sad_accum_hi_uint,         AluOp(3, 0, 0, 0, V, V, V, "SAD_ACCUM_HI_UINT")        },
227    {op3_muladd_uint24,             AluOp(3, 0, 0, 0, V, V, V, "MULADD_UINT24")            },
228    {op3_lds_idx_op,                AluOp(3, 0, 0, 0, X, X, X, "LDS_IDX_OP")               },
229    {op3_muladd,                    AluOp(3, 1, 1, 0, A, A, A, "MULADD")                   },
230    {op3_muladd_m2,                 AluOp(3, 1, 1, 0, A, A, A, "MULADD_M2")                },
231    {op3_muladd_m4,                 AluOp(3, 1, 1, 0, A, A, A, "MULADD_M4")                },
232    {op3_muladd_d2,                 AluOp(3, 1, 1, 0, A, A, A, "MULADD_D2")                },
233    {op3_muladd_ieee,               AluOp(3, 1, 1, 0, A, A, A, "MULADD_IEEE")              },
234    {op3_cnde,                      AluOp(3, 0, 0, 0, A, A, A, "CNDE")                     },
235    {op3_cndgt,                     AluOp(3, 0, 0, 0, A, A, A, "CNDGT")                    },
236    {op3_cndge,                     AluOp(3, 0, 0, 0, A, A, A, "CNDGE")                    },
237    {op3_cnde_int,                  AluOp(3, 0, 0, 0, A, A, A, "CNDE_INT")                 },
238    {op3_cndgt_int,                 AluOp(3, 0, 0, 0, A, A, A, "CNDGT_INT")                },
239    {op3_cndge_int,                 AluOp(3, 0, 0, 0,A, A, A, "CNDGE_INT")                },
240    {op3_mul_lit,                   AluOp(3, 1, 0, 0,T, T, T, "MUL_LIT")                  }
241 };
242 
243 #undef A
244 #undef V
245 #undef T
246 #undef X
247 
248 const std::map<AluInlineConstants, AluInlineConstantDescr> alu_src_const = {
249    {ALU_SRC_LDS_OQ_A,            {false, "LDS_OQ_A"}           },
250    {ALU_SRC_LDS_OQ_B,            {false, "LDS_OQ_B"}           },
251    {ALU_SRC_LDS_OQ_A_POP,        {false, "LDS_OQ_A_POP"}       },
252    {ALU_SRC_LDS_OQ_B_POP,        {false, "LDS_OQ_B_POP"}       },
253    {ALU_SRC_LDS_DIRECT_A,        {false, "LDS_DIRECT_A"}       },
254    {ALU_SRC_LDS_DIRECT_B,        {false, "LDS_DIRECT_B"}       },
255    {ALU_SRC_TIME_HI,             {false, "TIME_HI"}            },
256    {ALU_SRC_TIME_LO,             {false, "TIME_LO"}            },
257    {ALU_SRC_MASK_HI,             {false, "MASK_HI"}            },
258    {ALU_SRC_MASK_LO,             {false, "MASK_LO"}            },
259    {ALU_SRC_HW_WAVE_ID,          {false, "HW_WAVE_ID"}         },
260    {ALU_SRC_SIMD_ID,             {false, "SIMD_ID"}            },
261    {ALU_SRC_SE_ID,               {false, "SE_ID"}              },
262    {ALU_SRC_HW_THREADGRP_ID,     {false, "HW_THREADGRP_ID"}    },
263    {ALU_SRC_WAVE_ID_IN_GRP,      {false, "WAVE_ID_IN_GRP"}     },
264    {ALU_SRC_NUM_THREADGRP_WAVES, {false, "NUM_THREADGRP_WAVES"}},
265    {ALU_SRC_HW_ALU_ODD,          {false, "HW_ALU_ODD"}         },
266    {ALU_SRC_LOOP_IDX,            {false, "LOOP_IDX"}           },
267    {ALU_SRC_PARAM_BASE_ADDR,     {false, "PARAM_BASE_ADDR"}    },
268    {ALU_SRC_NEW_PRIM_MASK,       {false, "NEW_PRIM_MASK"}      },
269    {ALU_SRC_PRIM_MASK_HI,        {false, "PRIM_MASK_HI"}       },
270    {ALU_SRC_PRIM_MASK_LO,        {false, "PRIM_MASK_LO"}       },
271    {ALU_SRC_1_DBL_L,             {false, "1.0L"}               },
272    {ALU_SRC_1_DBL_M,             {false, "1.0H"}               },
273    {ALU_SRC_0_5_DBL_L,           {false, "0.5L"}               },
274    {ALU_SRC_0_5_DBL_M,           {false, "0.5H"}               },
275    {ALU_SRC_0,                   {false, "0"}                  },
276    {ALU_SRC_1,                   {false, "1.0"}                },
277    {ALU_SRC_1_INT,               {false, "1"}                  },
278    {ALU_SRC_M_1_INT,             {false, "-1"}                 },
279    {ALU_SRC_0_5,                 {false, "0.5"}                },
280    {ALU_SRC_LITERAL,             {true, "ALU_SRC_LITERAL"}     },
281    {ALU_SRC_PV,                  {true, "PV"}                  },
282    {ALU_SRC_PS,                  {false, "PS"}                 }
283 };
284 
285 const std::map<ESDOp, LDSOp> lds_ops = {
286    {DS_OP_ADD,                      {2, "ADD"}                     },
287    {DS_OP_SUB,                      {2, "SUB"}                     },
288    {DS_OP_RSUB,                     {2, "RSUB"}                    },
289    {DS_OP_INC,                      {2, "INC"}                     },
290    {DS_OP_DEC,                      {2, "DEC"}                     },
291    {DS_OP_MIN_INT,                  {2, "MIN_INT"}                 },
292    {DS_OP_MAX_INT,                  {2, "MAX_INT"}                 },
293    {DS_OP_MIN_UINT,                 {2, "MIN_UINT"}                },
294    {DS_OP_MAX_UINT,                 {2, "MAX_UINT"}                },
295    {DS_OP_AND,                      {2, "AND"}                     },
296    {DS_OP_OR,                       {2, "OR"}                      },
297    {DS_OP_XOR,                      {2, "XOR"}                     },
298    {DS_OP_MSKOR,                    {3, "MSKOR"}                   },
299    {DS_OP_WRITE,                    {2, "WRITE"}                   },
300    {DS_OP_WRITE_REL,                {3, "WRITE_REL"}               },
301    {DS_OP_WRITE2,                   {3, "WRITE2"}                  },
302    {DS_OP_CMP_STORE,                {3, "CMP_STORE"}               },
303    {DS_OP_CMP_STORE_SPF,            {3, "CMP_STORE_SPF"}           },
304    {DS_OP_BYTE_WRITE,               {2, "BYTE_WRITE"}              },
305    {DS_OP_SHORT_WRITE,              {2, "SHORT_WRITE"}             },
306    {DS_OP_ADD_RET,                  {2, "ADD_RET"}                 },
307    {DS_OP_SUB_RET,                  {2, "SUB_RET"}                 },
308    {DS_OP_RSUB_RET,                 {2, "RSUB_RET"}                },
309    {DS_OP_INC_RET,                  {2, "INC_RET"}                 },
310    {DS_OP_DEC_RET,                  {2, "DEC_RET"}                 },
311    {DS_OP_MIN_INT_RET,              {2, "MIN_INT_RET"}             },
312    {DS_OP_MAX_INT_RET,              {2, "MAX_INT_RET"}             },
313    {DS_OP_MIN_UINT_RET,             {2, "MIN_UINT_RET"}            },
314    {DS_OP_MAX_UINT_RET,             {2, "MAX_UINT_RET"}            },
315    {DS_OP_AND_RET,                  {2, "AND_RET"}                 },
316    {DS_OP_OR_RET,                   {2, "OR_RET"}                  },
317    {DS_OP_XOR_RET,                  {2, "XOR_RET"}                 },
318    {DS_OP_MSKOR_RET,                {3, "MSKOR_RET"}               },
319    {DS_OP_XCHG_RET,                 {2, "XCHG_RET"}                },
320    {DS_OP_XCHG_REL_RET,             {3, "XCHG_REL_RET"}            },
321    {DS_OP_XCHG2_RET,                {3, "XCHG2_RET"}               },
322    {DS_OP_CMP_XCHG_RET,             {3, "CMP_XCHG_RET"}            },
323    {DS_OP_CMP_XCHG_SPF_RET,         {3, "CMP_XCHG_SPF_RET"}        },
324    {DS_OP_READ_RET,                 {1, "READ_RET"}                },
325    {DS_OP_READ_REL_RET,             {1, "READ_REL_RET"}            },
326    {DS_OP_READ2_RET,                {2, "READ2_RET"}               },
327    {DS_OP_READWRITE_RET,            {3, "READWRITE_RET"}           },
328    {DS_OP_BYTE_READ_RET,            {1, "BYTE_READ_RET"}           },
329    {DS_OP_UBYTE_READ_RET,           {1, "UBYTE_READ_RET"}          },
330    {DS_OP_SHORT_READ_RET,           {1, "SHORT_READ_RET"}          },
331    {DS_OP_USHORT_READ_RET,          {1, "USHORT_READ_RET"}         },
332    {DS_OP_ATOMIC_ORDERED_ALLOC_RET, {3, "ATOMIC_ORDERED_ALLOC_RET"}},
333    {LDS_ADD_RET,                    {2, "LDS_ADD_RET"}             },
334    {LDS_ADD,                        {2, "LDS_ADD"}                 },
335    {LDS_AND_RET,                    {2, "LDS_AND_RET"}             },
336    {LDS_AND,                        {2, "LDS_AND"}                 },
337    {LDS_WRITE,                      {2, "LDS_WRITE"}               },
338    {LDS_OR_RET,                     {2, "LDS_OR_RET"}              },
339    {LDS_OR,                         {2, "LDS_OR"}                  },
340    {LDS_MAX_INT_RET,                {2, "LDS_MAX_INT_RET"}         },
341    {LDS_MAX_INT,                    {2, "LDS_MAX_INT"}             },
342    {LDS_MAX_UINT_RET,               {2, "LDS_MAX_UINT_RET"}        },
343    {LDS_MAX_UINT,                   {2, "LDS_MAX_UINT"}            },
344    {LDS_MIN_INT_RET,                {2, "LDS_MIN_INT_RET"}         },
345    {LDS_MIN_INT,                    {2, "LDS_MIN_INT"}             },
346    {LDS_MIN_UINT_RET,               {2, "LDS_MIN_UINT_RET"}        },
347    {LDS_MIN_UINT,                   {2, "LDS_MIN_UINT"}            },
348    {LDS_XOR_RET,                    {2, "LDS_XOR"}                 },
349    {LDS_XOR,                        {2, "LDS_XOR"}                 },
350    {LDS_XCHG_RET,                   {2, "LDS_XCHG_RET"}            },
351    {LDS_CMP_XCHG_RET,               {3, "LDS_CMP_XCHG_RET"}        },
352    {LDS_WRITE_REL,                  {3, "LDS_WRITE_REL"}           },
353 };
354 
355 } // namespace r600
356