xref: /aosp_15_r20/external/llvm/lib/Target/AMDGPU/VIInstructions.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===-- VIInstructions.td - VI Instruction Defintions ---------------------===//
2*9880d681SAndroid Build Coastguard Worker//
3*9880d681SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker//
5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker//
8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker// Instruction definitions for VI and newer.
10*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerlet SIAssemblerPredicate = DisableInst, SubtargetPredicate = isVI in {
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerlet DisableSIDecoder = 1 in {
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
17*9880d681SAndroid Build Coastguard Worker// VOP1 Instructions
18*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdefm V_CVT_F16_U16 : VOP1Inst <vop1<0, 0x39>, "v_cvt_f16_u16", VOP_F16_I16>;
21*9880d681SAndroid Build Coastguard Workerdefm V_CVT_F16_I16 : VOP1Inst <vop1<0, 0x3a>, "v_cvt_f16_i16", VOP_F16_I16>;
22*9880d681SAndroid Build Coastguard Workerdefm V_CVT_U16_F16 : VOP1Inst <vop1<0, 0x3b>, "v_cvt_u16_f16", VOP_I16_F16>;
23*9880d681SAndroid Build Coastguard Workerdefm V_CVT_I16_F16 : VOP1Inst <vop1<0, 0x3c>, "v_cvt_i16_f16", VOP_I16_F16>;
24*9880d681SAndroid Build Coastguard Workerdefm V_RCP_F16 : VOP1Inst <vop1<0, 0x3d>, "v_rcp_f16", VOP_F16_F16>;
25*9880d681SAndroid Build Coastguard Workerdefm V_SQRT_F16 : VOP1Inst <vop1<0, 0x3e>, "v_sqrt_f16", VOP_F16_F16>;
26*9880d681SAndroid Build Coastguard Workerdefm V_RSQ_F16 : VOP1Inst <vop1<0, 0x3f>, "v_rsq_f16", VOP_F16_F16>;
27*9880d681SAndroid Build Coastguard Workerdefm V_LOG_F16 : VOP1Inst <vop1<0, 0x40>, "v_log_f16", VOP_F16_F16>;
28*9880d681SAndroid Build Coastguard Workerdefm V_EXP_F16 : VOP1Inst <vop1<0, 0x41>, "v_exp_f16", VOP_F16_F16>;
29*9880d681SAndroid Build Coastguard Workerdefm V_FREXP_MANT_F16 : VOP1Inst <vop1<0, 0x42>, "v_frexp_mant_f16",
30*9880d681SAndroid Build Coastguard Worker  VOP_F16_F16
31*9880d681SAndroid Build Coastguard Worker>;
32*9880d681SAndroid Build Coastguard Workerdefm V_FREXP_EXP_I16_F16 : VOP1Inst <vop1<0, 0x43>, "v_frexp_exp_i16_f16",
33*9880d681SAndroid Build Coastguard Worker  VOP_I16_F16
34*9880d681SAndroid Build Coastguard Worker>;
35*9880d681SAndroid Build Coastguard Workerdefm V_FLOOR_F16 : VOP1Inst <vop1<0, 0x44>, "v_floor_f16", VOP_F16_F16>;
36*9880d681SAndroid Build Coastguard Workerdefm V_CEIL_F16 : VOP1Inst <vop1<0, 0x45>, "v_ceil_f16", VOP_F16_F16>;
37*9880d681SAndroid Build Coastguard Workerdefm V_TRUNC_F16 : VOP1Inst <vop1<0, 0x46>, "v_trunc_f16", VOP_F16_F16>;
38*9880d681SAndroid Build Coastguard Workerdefm V_RNDNE_F16 : VOP1Inst <vop1<0, 0x47>, "v_rndne_f16", VOP_F16_F16>;
39*9880d681SAndroid Build Coastguard Workerdefm V_FRACT_F16 : VOP1Inst <vop1<0, 0x48>, "v_fract_f16", VOP_F16_F16>;
40*9880d681SAndroid Build Coastguard Workerdefm V_SIN_F16 : VOP1Inst <vop1<0, 0x49>, "v_sin_f16", VOP_F16_F16>;
41*9880d681SAndroid Build Coastguard Workerdefm V_COS_F16 : VOP1Inst <vop1<0, 0x4a>, "v_cos_f16", VOP_F16_F16>;
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
44*9880d681SAndroid Build Coastguard Worker// VOP2 Instructions
45*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in {
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerdefm V_ADD_F16 : VOP2Inst <vop2<0, 0x1f>, "v_add_f16", VOP_F16_F16_F16>;
50*9880d681SAndroid Build Coastguard Workerdefm V_SUB_F16 : VOP2Inst <vop2<0, 0x20>, "v_sub_f16", VOP_F16_F16_F16>;
51*9880d681SAndroid Build Coastguard Workerdefm V_SUBREV_F16 : VOP2Inst <vop2<0, 0x21>, "v_subrev_f16", VOP_F16_F16_F16,
52*9880d681SAndroid Build Coastguard Worker  null_frag, "v_sub_f16"
53*9880d681SAndroid Build Coastguard Worker>;
54*9880d681SAndroid Build Coastguard Workerdefm V_MUL_F16 : VOP2Inst <vop2<0, 0x22>, "v_mul_f16", VOP_F16_F16_F16>;
55*9880d681SAndroid Build Coastguard Workerdefm V_MAC_F16 : VOP2Inst <vop2<0, 0x23>, "v_mac_f16", VOP_F16_F16_F16>;
56*9880d681SAndroid Build Coastguard Worker} // End isCommutable = 1
57*9880d681SAndroid Build Coastguard Workerdefm V_MADMK_F16 : VOP2MADK <vop2<0,0x24>, "v_madmk_f16", VOP_MADMK>;
58*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in {
59*9880d681SAndroid Build Coastguard Workerdefm V_MADAK_F16 : VOP2MADK <vop2<0,0x25>, "v_madak_f16", VOP_MADAK>;
60*9880d681SAndroid Build Coastguard Workerdefm V_ADD_U16 : VOP2Inst <vop2<0,0x26>, "v_add_u16", VOP_I16_I16_I16>;
61*9880d681SAndroid Build Coastguard Workerdefm V_SUB_U16 : VOP2Inst <vop2<0,0x27>, "v_sub_u16" , VOP_I16_I16_I16>;
62*9880d681SAndroid Build Coastguard Workerdefm V_SUBREV_U16 : VOP2Inst <vop2<0,0x28>, "v_subrev_u16", VOP_I16_I16_I16>;
63*9880d681SAndroid Build Coastguard Workerdefm V_MUL_LO_U16 : VOP2Inst <vop2<0,0x29>, "v_mul_lo_u16", VOP_I16_I16_I16>;
64*9880d681SAndroid Build Coastguard Worker} // End isCommutable = 1
65*9880d681SAndroid Build Coastguard Workerdefm V_LSHLREV_B16 : VOP2Inst <vop2<0,0x2a>, "v_lshlrev_b16", VOP_I16_I16_I16>;
66*9880d681SAndroid Build Coastguard Workerdefm V_LSHRREV_B16 : VOP2Inst <vop2<0,0x2b>, "v_lshrrev_b16", VOP_I16_I16_I16>;
67*9880d681SAndroid Build Coastguard Workerdefm V_ASHRREV_B16 : VOP2Inst <vop2<0,0x2c>, "v_ashrrev_b16", VOP_I16_I16_I16>;
68*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in {
69*9880d681SAndroid Build Coastguard Workerdefm V_MAX_F16 : VOP2Inst <vop2<0,0x2d>, "v_max_f16", VOP_F16_F16_F16>;
70*9880d681SAndroid Build Coastguard Workerdefm V_MIN_F16 : VOP2Inst <vop2<0,0x2e>, "v_min_f16", VOP_F16_F16_F16>;
71*9880d681SAndroid Build Coastguard Workerdefm V_MAX_U16 : VOP2Inst <vop2<0,0x2f>, "v_max_u16", VOP_I16_I16_I16>;
72*9880d681SAndroid Build Coastguard Workerdefm V_MAX_I16 : VOP2Inst <vop2<0,0x30>, "v_max_i16", VOP_I16_I16_I16>;
73*9880d681SAndroid Build Coastguard Workerdefm V_MIN_U16 : VOP2Inst <vop2<0,0x31>, "v_min_u16", VOP_I16_I16_I16>;
74*9880d681SAndroid Build Coastguard Workerdefm V_MIN_I16 : VOP2Inst <vop2<0,0x32>, "v_min_i16", VOP_I16_I16_I16>;
75*9880d681SAndroid Build Coastguard Worker} // End isCommutable = 1
76*9880d681SAndroid Build Coastguard Workerdefm V_LDEXP_F16 : VOP2Inst <vop2<0,0x33>, "v_ldexp_f16", VOP_F16_F16_I16>;
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
79*9880d681SAndroid Build Coastguard Worker// VOP3 Instructions
80*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
81*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in {
82*9880d681SAndroid Build Coastguard Worker    defm V_MAD_F16 : VOP3Inst <vop3<0, 0x1ea>, "v_mad_f16", VOP_F16_F16_F16_F16>;
83*9880d681SAndroid Build Coastguard Worker    defm V_MAD_U16 : VOP3Inst <vop3<0, 0x1eb>, "v_mad_u16", VOP_I16_I16_I16_I16>;
84*9880d681SAndroid Build Coastguard Worker    defm V_MAD_I16 : VOP3Inst <vop3<0, 0x1ec>, "v_mad_i16", VOP_I16_I16_I16_I16>;
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker} // let DisableSIDecoder = 1
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker// Aliases to simplify matching of floating-point instructions that
89*9880d681SAndroid Build Coastguard Worker// are VOP2 on SI and VOP3 on VI.
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerclass SI2_VI3Alias <string name, Instruction inst> : InstAlias <
92*9880d681SAndroid Build Coastguard Worker  name#" $dst, $src0, $src1",
93*9880d681SAndroid Build Coastguard Worker  (inst VGPR_32:$dst, 0, VCSrc_32:$src0, 0, VCSrc_32:$src1, 0, 0)
94*9880d681SAndroid Build Coastguard Worker>, PredicateControl {
95*9880d681SAndroid Build Coastguard Worker  let UseInstAsmMatchConverter = 0;
96*9880d681SAndroid Build Coastguard Worker}
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerdef : SI2_VI3Alias <"v_ldexp_f32", V_LDEXP_F32_e64_vi>;
99*9880d681SAndroid Build Coastguard Workerdef : SI2_VI3Alias <"v_cvt_pkaccum_u8_f32", V_CVT_PKACCUM_U8_F32_e64_vi>;
100*9880d681SAndroid Build Coastguard Workerdef : SI2_VI3Alias <"v_cvt_pknorm_i16_f32", V_CVT_PKNORM_I16_F32_e64_vi>;
101*9880d681SAndroid Build Coastguard Workerdef : SI2_VI3Alias <"v_cvt_pknorm_u16_f32", V_CVT_PKNORM_U16_F32_e64_vi>;
102*9880d681SAndroid Build Coastguard Workerdef : SI2_VI3Alias <"v_cvt_pkrtz_f16_f32", V_CVT_PKRTZ_F16_F32_e64_vi>;
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
105*9880d681SAndroid Build Coastguard Worker// SMEM Instructions
106*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Workerdef S_DCACHE_WB : SMEM_Inval <0x21,
109*9880d681SAndroid Build Coastguard Worker  "s_dcache_wb", int_amdgcn_s_dcache_wb>;
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerdef S_DCACHE_WB_VOL : SMEM_Inval <0x23,
112*9880d681SAndroid Build Coastguard Worker  "s_dcache_wb_vol", int_amdgcn_s_dcache_wb_vol>;
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerdef S_MEMREALTIME : SMEM_Ret<0x25,
115*9880d681SAndroid Build Coastguard Worker  "s_memrealtime", int_amdgcn_s_memrealtime>;
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Worker} // End SIAssemblerPredicate = DisableInst, SubtargetPredicate = isVI
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerlet Predicates = [isVI] in {
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker// 1. Offset as 20bit DWORD immediate
122*9880d681SAndroid Build Coastguard Workerdef : Pat <
123*9880d681SAndroid Build Coastguard Worker  (SIload_constant v4i32:$sbase, IMM20bit:$offset),
124*9880d681SAndroid Build Coastguard Worker  (S_BUFFER_LOAD_DWORD_IMM $sbase, (as_i32imm $offset))
125*9880d681SAndroid Build Coastguard Worker>;
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
128*9880d681SAndroid Build Coastguard Worker// DPP Patterns
129*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerdef : Pat <
132*9880d681SAndroid Build Coastguard Worker  (int_amdgcn_mov_dpp i32:$src, imm:$dpp_ctrl, imm:$row_mask, imm:$bank_mask,
133*9880d681SAndroid Build Coastguard Worker                      imm:$bound_ctrl),
134*9880d681SAndroid Build Coastguard Worker  (V_MOV_B32_dpp $src, (as_i32imm $dpp_ctrl), (as_i32imm $row_mask),
135*9880d681SAndroid Build Coastguard Worker                       (as_i32imm $bank_mask), (as_i1imm $bound_ctrl))
136*9880d681SAndroid Build Coastguard Worker>;
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
139*9880d681SAndroid Build Coastguard Worker// Misc Patterns
140*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Workerdef : Pat <
143*9880d681SAndroid Build Coastguard Worker  (i64 (readcyclecounter)),
144*9880d681SAndroid Build Coastguard Worker  (S_MEMREALTIME)
145*9880d681SAndroid Build Coastguard Worker>;
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
148*9880d681SAndroid Build Coastguard Worker// DS_PERMUTE/DS_BPERMUTE Instructions.
149*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Workerlet Uses = [EXEC] in {
152*9880d681SAndroid Build Coastguard Workerdefm DS_PERMUTE_B32 : DS_1A1D_PERMUTE <0x3e, "ds_permute_b32", VGPR_32,
153*9880d681SAndroid Build Coastguard Worker                                       int_amdgcn_ds_permute>;
154*9880d681SAndroid Build Coastguard Workerdefm DS_BPERMUTE_B32 : DS_1A1D_PERMUTE <0x3f, "ds_bpermute_b32", VGPR_32,
155*9880d681SAndroid Build Coastguard Worker                                       int_amdgcn_ds_bpermute>;
156*9880d681SAndroid Build Coastguard Worker}
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Worker} // End Predicates = [isVI]
159