1; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn--amdhsa -mcpu=gfx1010 -mattr=-flat-for-global,-xnack -verify-machineinstrs -show-mc-encoding < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX10 %s 2; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn--amdhsa -mcpu=gfx900 -mattr=-flat-for-global,-xnack -verify-machineinstrs -show-mc-encoding < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX9 %s 3; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn--amdhsa -mcpu=fiji -mattr=-flat-for-global,-xnack -verify-machineinstrs -show-mc-encoding < %s | FileCheck -enable-var-scope -check-prefixes=GCN,VI %s 4; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn--amdhsa -mcpu=kaveri -mattr=-flat-for-global -verify-machineinstrs -show-mc-encoding < %s | FileCheck -enable-var-scope -check-prefixes=GCN %s 5; FIXME: Merge into imm.ll 6 7; GCN-LABEL: {{^}}store_inline_imm_neg_0.0_v2i16: 8; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x80008000 ; encoding 9; GCN: buffer_store_dword [[REG]] 10define amdgpu_kernel void @store_inline_imm_neg_0.0_v2i16(<2 x i16> addrspace(1)* %out) #0 { 11 store <2 x i16> <i16 -32768, i16 -32768>, <2 x i16> addrspace(1)* %out 12 ret void 13} 14 15; GCN-LABEL: {{^}}store_inline_imm_0.0_v2f16: 16; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0 ; encoding 17; GCN: buffer_store_dword [[REG]] 18define amdgpu_kernel void @store_inline_imm_0.0_v2f16(<2 x half> addrspace(1)* %out) #0 { 19 store <2 x half> <half 0.0, half 0.0>, <2 x half> addrspace(1)* %out 20 ret void 21} 22 23; GCN-LABEL: {{^}}store_imm_neg_0.0_v2f16: 24; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x80008000 ; encoding 25; GCN: buffer_store_dword [[REG]] 26define amdgpu_kernel void @store_imm_neg_0.0_v2f16(<2 x half> addrspace(1)* %out) #0 { 27 store <2 x half> <half -0.0, half -0.0>, <2 x half> addrspace(1)* %out 28 ret void 29} 30 31; GCN-LABEL: {{^}}store_inline_imm_0.5_v2f16: 32; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x38003800 ; encoding 33; GCN: buffer_store_dword [[REG]] 34define amdgpu_kernel void @store_inline_imm_0.5_v2f16(<2 x half> addrspace(1)* %out) #0 { 35 store <2 x half> <half 0.5, half 0.5>, <2 x half> addrspace(1)* %out 36 ret void 37} 38 39; GCN-LABEL: {{^}}store_inline_imm_m_0.5_v2f16: 40; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0xb800b800 ; encoding 41; GCN: buffer_store_dword [[REG]] 42define amdgpu_kernel void @store_inline_imm_m_0.5_v2f16(<2 x half> addrspace(1)* %out) #0 { 43 store <2 x half> <half -0.5, half -0.5>, <2 x half> addrspace(1)* %out 44 ret void 45} 46 47; GCN-LABEL: {{^}}store_inline_imm_1.0_v2f16: 48; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x3c003c00 ; encoding 49; GCN: buffer_store_dword [[REG]] 50define amdgpu_kernel void @store_inline_imm_1.0_v2f16(<2 x half> addrspace(1)* %out) #0 { 51 store <2 x half> <half 1.0, half 1.0>, <2 x half> addrspace(1)* %out 52 ret void 53} 54 55; GCN-LABEL: {{^}}store_inline_imm_m_1.0_v2f16: 56; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0xbc00bc00 ; encoding 57; GCN: buffer_store_dword [[REG]] 58define amdgpu_kernel void @store_inline_imm_m_1.0_v2f16(<2 x half> addrspace(1)* %out) #0 { 59 store <2 x half> <half -1.0, half -1.0>, <2 x half> addrspace(1)* %out 60 ret void 61} 62 63; GCN-LABEL: {{^}}store_inline_imm_2.0_v2f16: 64; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x40004000 ; encoding 65; GCN: buffer_store_dword [[REG]] 66define amdgpu_kernel void @store_inline_imm_2.0_v2f16(<2 x half> addrspace(1)* %out) #0 { 67 store <2 x half> <half 2.0, half 2.0>, <2 x half> addrspace(1)* %out 68 ret void 69} 70 71; GCN-LABEL: {{^}}store_inline_imm_m_2.0_v2f16: 72; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0xc000c000 ; encoding 73; GCN: buffer_store_dword [[REG]] 74define amdgpu_kernel void @store_inline_imm_m_2.0_v2f16(<2 x half> addrspace(1)* %out) #0 { 75 store <2 x half> <half -2.0, half -2.0>, <2 x half> addrspace(1)* %out 76 ret void 77} 78 79; GCN-LABEL: {{^}}store_inline_imm_4.0_v2f16: 80; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x44004400 ; encoding 81; GCN: buffer_store_dword [[REG]] 82define amdgpu_kernel void @store_inline_imm_4.0_v2f16(<2 x half> addrspace(1)* %out) #0 { 83 store <2 x half> <half 4.0, half 4.0>, <2 x half> addrspace(1)* %out 84 ret void 85} 86 87; GCN-LABEL: {{^}}store_inline_imm_m_4.0_v2f16: 88; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0xc400c400 ; encoding 89; GCN: buffer_store_dword [[REG]] 90define amdgpu_kernel void @store_inline_imm_m_4.0_v2f16(<2 x half> addrspace(1)* %out) #0 { 91 store <2 x half> <half -4.0, half -4.0>, <2 x half> addrspace(1)* %out 92 ret void 93} 94 95; GCN-LABEL: {{^}}store_inline_imm_inv_2pi_v2f16: 96; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x31183118 ; encoding 97; GCN: buffer_store_dword [[REG]] 98define amdgpu_kernel void @store_inline_imm_inv_2pi_v2f16(<2 x half> addrspace(1)* %out) #0 { 99 store <2 x half> <half 0xH3118, half 0xH3118>, <2 x half> addrspace(1)* %out 100 ret void 101} 102 103; GCN-LABEL: {{^}}store_inline_imm_m_inv_2pi_v2f16: 104; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0xb118b118 ; encoding 105; GCN: buffer_store_dword [[REG]] 106define amdgpu_kernel void @store_inline_imm_m_inv_2pi_v2f16(<2 x half> addrspace(1)* %out) #0 { 107 store <2 x half> <half 0xHB118, half 0xHB118>, <2 x half> addrspace(1)* %out 108 ret void 109} 110 111; GCN-LABEL: {{^}}store_literal_imm_v2f16: 112; GCN: v_mov_b32_e32 [[REG:v[0-9]+]], 0x6c006c00 113; GCN: buffer_store_dword [[REG]] 114define amdgpu_kernel void @store_literal_imm_v2f16(<2 x half> addrspace(1)* %out) #0 { 115 store <2 x half> <half 4096.0, half 4096.0>, <2 x half> addrspace(1)* %out 116 ret void 117} 118 119; GCN-LABEL: {{^}}add_inline_imm_0.0_v2f16: 120; GFX9: s_load_dword [[VAL:s[0-9]+]] 121; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 0 ; encoding 122; GFX9: buffer_store_dword [[REG]] 123 124; FIXME: Shouldn't need right shift and SDWA, also extra copy 125; VI-DAG: s_load_dword [[VAL:s[0-9]+]] 126; VI-DAG: v_mov_b32_e32 [[CONST0:v[0-9]+]], 0 127; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16 128; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]] 129 130; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST0]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 131; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 0 132; VI: v_or_b32 133; VI: buffer_store_dword 134define amdgpu_kernel void @add_inline_imm_0.0_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 { 135 %y = fadd <2 x half> %x, <half 0.0, half 0.0> 136 store <2 x half> %y, <2 x half> addrspace(1)* %out 137 ret void 138} 139 140; GCN-LABEL: {{^}}add_inline_imm_0.5_v2f16: 141; GFX10: s_load_dword [[VAL:s[0-9]+]] 142; GFX10: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 0.5 op_sel_hi:[1,0] ; encoding: [0x00,0x40,0x0f,0xcc,0x02,0xe0,0x01,0x08] 143; GFX10: buffer_store_dword [[REG]] 144 145; GFX9: s_load_dword [[VAL:s[0-9]+]] 146; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 0.5 op_sel_hi:[1,0] ; encoding: [0x00,0x40,0x8f,0xd3,0x06,0xe0,0x01,0x08] 147; GFX9: buffer_store_dword [[REG]] 148 149; FIXME: Shouldn't need right shift and SDWA, also extra copy 150; VI-DAG: s_load_dword [[VAL:s[0-9]+]] 151; VI-DAG: v_mov_b32_e32 [[CONST05:v[0-9]+]], 0x3800 152; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16 153; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]] 154 155; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST05]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 156; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 0.5 157; VI: v_or_b32 158; VI: buffer_store_dword 159define amdgpu_kernel void @add_inline_imm_0.5_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 { 160 %y = fadd <2 x half> %x, <half 0.5, half 0.5> 161 store <2 x half> %y, <2 x half> addrspace(1)* %out 162 ret void 163} 164 165; GCN-LABEL: {{^}}add_inline_imm_neg_0.5_v2f16: 166; GFX10: s_load_dword [[VAL:s[0-9]+]] 167; GFX10: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], -0.5 op_sel_hi:[1,0] ; encoding: [0x00,0x40,0x0f,0xcc,0x02,0xe2,0x01,0x08] 168; GFX10: buffer_store_dword [[REG]] 169 170; GFX9: s_load_dword [[VAL:s[0-9]+]] 171; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], -0.5 op_sel_hi:[1,0] ; encoding: [0x00,0x40,0x8f,0xd3,0x06,0xe2,0x01,0x08] 172; GFX9: buffer_store_dword [[REG]] 173 174; FIXME: Shouldn't need right shift and SDWA, also extra copy 175; VI-DAG: s_load_dword [[VAL:s[0-9]+]] 176; VI-DAG: v_mov_b32_e32 [[CONSTM05:v[0-9]+]], 0xb800 177; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16 178; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]] 179 180; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONSTM05]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 181; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], -0.5 182; VI: v_or_b32 183; VI: buffer_store_dword 184define amdgpu_kernel void @add_inline_imm_neg_0.5_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 { 185 %y = fadd <2 x half> %x, <half -0.5, half -0.5> 186 store <2 x half> %y, <2 x half> addrspace(1)* %out 187 ret void 188} 189 190; GCN-LABEL: {{^}}add_inline_imm_1.0_v2f16: 191; GFX9: s_load_dword [[VAL:s[0-9]+]] 192; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 1.0 op_sel_hi:[1,0] ; encoding 193; GFX9: buffer_store_dword [[REG]] 194 195; FIXME: Shouldn't need right shift and SDWA, also extra copy 196; VI-DAG: s_load_dword [[VAL:s[0-9]+]] 197; VI-DAG: v_mov_b32_e32 [[CONST1:v[0-9]+]], 0x3c00 198; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16 199; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]] 200 201; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST1]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 202; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 1.0 203; VI: v_or_b32 204; VI: buffer_store_dword 205define amdgpu_kernel void @add_inline_imm_1.0_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 { 206 %y = fadd <2 x half> %x, <half 1.0, half 1.0> 207 store <2 x half> %y, <2 x half> addrspace(1)* %out 208 ret void 209} 210 211; GCN-LABEL: {{^}}add_inline_imm_neg_1.0_v2f16: 212; GFX9: s_load_dword [[VAL:s[0-9]+]] 213; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], -1.0 op_sel_hi:[1,0] ; encoding 214; GFX9: buffer_store_dword [[REG]] 215 216 217; FIXME: Shouldn't need right shift and SDWA, also extra copy 218; VI-DAG: s_load_dword [[VAL:s[0-9]+]] 219; VI-DAG: v_mov_b32_e32 [[CONST1:v[0-9]+]], 0xbc00 220; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16 221; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]] 222 223; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST1]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 224; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], -1.0 225; VI: v_or_b32 226; VI: buffer_store_dword 227define amdgpu_kernel void @add_inline_imm_neg_1.0_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 { 228 %y = fadd <2 x half> %x, <half -1.0, half -1.0> 229 store <2 x half> %y, <2 x half> addrspace(1)* %out 230 ret void 231} 232 233; GCN-LABEL: {{^}}add_inline_imm_2.0_v2f16: 234; GFX9: s_load_dword [[VAL:s[0-9]+]] 235; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 2.0 op_sel_hi:[1,0] ; encoding 236; GFX9: buffer_store_dword [[REG]] 237 238; FIXME: Shouldn't need right shift and SDWA, also extra copy 239; VI-DAG: s_load_dword [[VAL:s[0-9]+]] 240; VI-DAG: v_mov_b32_e32 [[CONST2:v[0-9]+]], 0x4000 241; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16 242; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]] 243 244; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST2]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 245; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 2.0 246; VI: v_or_b32 247; VI: buffer_store_dword 248define amdgpu_kernel void @add_inline_imm_2.0_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 { 249 %y = fadd <2 x half> %x, <half 2.0, half 2.0> 250 store <2 x half> %y, <2 x half> addrspace(1)* %out 251 ret void 252} 253 254; GCN-LABEL: {{^}}add_inline_imm_neg_2.0_v2f16: 255; GFX9: s_load_dword [[VAL:s[0-9]+]] 256; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], -2.0 op_sel_hi:[1,0] ; encoding 257; GFX9: buffer_store_dword [[REG]] 258 259; FIXME: Shouldn't need right shift and SDWA, also extra copy 260; VI-DAG: s_load_dword [[VAL:s[0-9]+]] 261; VI-DAG: v_mov_b32_e32 [[CONSTM2:v[0-9]+]], 0xc000 262; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16 263; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]] 264 265; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONSTM2]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 266; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], -2.0 267; VI: v_or_b32 268; VI: buffer_store_dword 269define amdgpu_kernel void @add_inline_imm_neg_2.0_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 { 270 %y = fadd <2 x half> %x, <half -2.0, half -2.0> 271 store <2 x half> %y, <2 x half> addrspace(1)* %out 272 ret void 273} 274 275; GCN-LABEL: {{^}}add_inline_imm_4.0_v2f16: 276; GFX9: s_load_dword [[VAL:s[0-9]+]] 277; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 4.0 op_sel_hi:[1,0] ; encoding 278; GFX9: buffer_store_dword [[REG]] 279 280; FIXME: Shouldn't need right shift and SDWA, also extra copy 281; VI-DAG: s_load_dword [[VAL:s[0-9]+]] 282; VI-DAG: v_mov_b32_e32 [[CONST4:v[0-9]+]], 0x4400 283; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16 284; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]] 285 286; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST4]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 287; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 4.0 288; VI: v_or_b32 289; VI: buffer_store_dword 290define amdgpu_kernel void @add_inline_imm_4.0_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 { 291 %y = fadd <2 x half> %x, <half 4.0, half 4.0> 292 store <2 x half> %y, <2 x half> addrspace(1)* %out 293 ret void 294} 295 296; GCN-LABEL: {{^}}add_inline_imm_neg_4.0_v2f16: 297; GFX9: s_load_dword [[VAL:s[0-9]+]] 298; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], -4.0 op_sel_hi:[1,0] ; encoding 299; GFX9: buffer_store_dword [[REG]] 300 301; FIXME: Shouldn't need right shift and SDWA, also extra copy 302; VI-DAG: s_load_dword [[VAL:s[0-9]+]] 303; VI-DAG: v_mov_b32_e32 [[CONSTM4:v[0-9]+]], 0xc400 304; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16 305; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]] 306 307; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONSTM4]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 308; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], -4.0 309; VI: v_or_b32 310; VI: buffer_store_dword 311define amdgpu_kernel void @add_inline_imm_neg_4.0_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 { 312 %y = fadd <2 x half> %x, <half -4.0, half -4.0> 313 store <2 x half> %y, <2 x half> addrspace(1)* %out 314 ret void 315} 316 317; GCN-LABEL: {{^}}commute_add_inline_imm_0.5_v2f16: 318; GFX9: buffer_load_dword [[VAL:v[0-9]+]] 319; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 0.5 320; GFX9: buffer_store_dword [[REG]] 321 322; VI-DAG: v_mov_b32_e32 [[CONST05:v[0-9]+]], 0x3800 323; VI-DAG: buffer_load_dword 324; VI-NOT: and 325; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, v{{[0-9]+}}, [[CONST05]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 326; VI-DAG: v_add_f16_e32 v{{[0-9]+}}, 0.5, v{{[0-9]+}} 327; VI: v_or_b32 328; VI: buffer_store_dword 329define amdgpu_kernel void @commute_add_inline_imm_0.5_v2f16(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %in) #0 { 330 %x = load <2 x half>, <2 x half> addrspace(1)* %in 331 %y = fadd <2 x half> %x, <half 0.5, half 0.5> 332 store <2 x half> %y, <2 x half> addrspace(1)* %out 333 ret void 334} 335 336; GCN-LABEL: {{^}}commute_add_literal_v2f16: 337; GFX10: v_pk_add_f16 v0, 0x6400, v0 op_sel_hi:[0,1] ; encoding: [0x00,0x40,0x0f,0xcc,0xff,0x00,0x02,0x10,0x00,0x64,0x00,0x00] 338 339; GFX9-DAG: buffer_load_dword [[VAL:v[0-9]+]] 340; GFX9-DAG: s_movk_i32 [[K:s[0-9]+]], 0x6400 ; encoding 341; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], [[K]] op_sel_hi:[1,0] ; encoding: [0x00,0x40,0x8f,0xd3,0x00,0x01,0x00,0x08] 342; GFX9: buffer_store_dword [[REG]] 343 344; VI-DAG: buffer_load_dword 345; VI-NOT: and 346; VI-DAG: v_add_f16_e32 v{{[0-9]+}}, 0x6400, v{{[0-9]+}} 347; gfx8 does not support sreg or imm in sdwa - this will be move then 348; VI-DAG: v_mov_b32_e32 [[VK:v[0-9]+]], 0x6400 349; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, v{{[0-9]+}}, [[VK]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 350; VI: v_or_b32_e32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 351; VI: buffer_store_dword 352define amdgpu_kernel void @commute_add_literal_v2f16(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %in) #0 { 353 %x = load <2 x half>, <2 x half> addrspace(1)* %in 354 %y = fadd <2 x half> %x, <half 1024.0, half 1024.0> 355 store <2 x half> %y, <2 x half> addrspace(1)* %out 356 ret void 357} 358 359; GCN-LABEL: {{^}}add_inline_imm_1_v2f16: 360; GFX9: s_load_dword [[VAL:s[0-9]+]] 361; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 1 op_sel_hi:[1,0] ; encoding 362; GFX9: buffer_store_dword [[REG]] 363 364; FIXME: Shouldn't need right shift and SDWA, also extra copy 365; VI-DAG: s_load_dword [[VAL:s[0-9]+]] 366; VI-DAG: v_mov_b32_e32 [[CONST1:v[0-9]+]], 1 ; encoding 367; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16 368; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]] 369 370; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST1]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 371; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 1 ; encoding 372; VI: v_or_b32 373; VI: buffer_store_dword 374define amdgpu_kernel void @add_inline_imm_1_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 { 375 %y = fadd <2 x half> %x, <half 0xH0001, half 0xH0001> 376 store <2 x half> %y, <2 x half> addrspace(1)* %out 377 ret void 378} 379 380; GCN-LABEL: {{^}}add_inline_imm_2_v2f16: 381; GFX9: s_load_dword [[VAL:s[0-9]+]] 382; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 2 op_sel_hi:[1,0] ; encoding 383; GFX9: buffer_store_dword [[REG]] 384 385 386; FIXME: Shouldn't need right shift and SDWA, also extra copy 387; VI-DAG: s_load_dword [[VAL:s[0-9]+]] 388; VI-DAG: v_mov_b32_e32 [[CONST2:v[0-9]+]], 2 ; encoding 389; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16 390; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]] 391 392; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST2]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 393; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 2 ; encoding 394; VI: v_or_b32 395; VI: buffer_store_dword 396define amdgpu_kernel void @add_inline_imm_2_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 { 397 %y = fadd <2 x half> %x, <half 0xH0002, half 0xH0002> 398 store <2 x half> %y, <2 x half> addrspace(1)* %out 399 ret void 400} 401 402; GCN-LABEL: {{^}}add_inline_imm_16_v2f16: 403; GFX9: s_load_dword [[VAL:s[0-9]+]] 404; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 16 op_sel_hi:[1,0] ; encoding 405; GFX9: buffer_store_dword [[REG]] 406 407 408; FIXME: Shouldn't need right shift and SDWA, also extra copy 409; VI-DAG: s_load_dword [[VAL:s[0-9]+]] 410; VI-DAG: v_mov_b32_e32 [[CONST16:v[0-9]+]], 16 ; encoding 411; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16 412; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]] 413 414; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST16]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 415; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 16 ; encoding 416; VI: v_or_b32 417; VI: buffer_store_dword 418define amdgpu_kernel void @add_inline_imm_16_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 { 419 %y = fadd <2 x half> %x, <half 0xH0010, half 0xH0010> 420 store <2 x half> %y, <2 x half> addrspace(1)* %out 421 ret void 422} 423 424; GCN-LABEL: {{^}}add_inline_imm_neg_1_v2f16: 425; GFX9: s_add_i32 [[VAL:s[0-9]+]], s6, -1 426; GFX9: v_mov_b32_e32 [[REG:v[0-9]+]], [[VAL]] 427; GFX9: buffer_store_dword [[REG]] 428 429; VI: s_load_dword [[VAL:s[0-9]+]] 430; VI: s_add_i32 [[ADD:s[0-9]+]], [[VAL]], -1 ; encoding 431; VI: v_mov_b32_e32 [[REG:v[0-9]+]], [[ADD]] 432; VI: buffer_store_dword [[REG]] 433define amdgpu_kernel void @add_inline_imm_neg_1_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 { 434 %xbc = bitcast <2 x half> %x to i32 435 %y = add i32 %xbc, -1 436 %ybc = bitcast i32 %y to <2 x half> 437 store <2 x half> %ybc, <2 x half> addrspace(1)* %out 438 ret void 439} 440 441; GCN-LABEL: {{^}}add_inline_imm_neg_2_v2f16: 442; GFX9: s_add_i32 [[VAL:s[0-9]+]], s6, 0xfffefffe 443; GFX9: v_mov_b32_e32 [[REG:v[0-9]+]], [[VAL]] 444; GFX9: buffer_store_dword [[REG]] 445 446; VI: s_load_dword [[VAL:s[0-9]+]] 447; VI: s_add_i32 [[ADD:s[0-9]+]], [[VAL]], 0xfffefffe ; encoding 448; VI: v_mov_b32_e32 [[REG:v[0-9]+]], [[ADD]] 449; VI: buffer_store_dword [[REG]] 450define amdgpu_kernel void @add_inline_imm_neg_2_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 { 451 %xbc = bitcast <2 x half> %x to i32 452 %y = add i32 %xbc, 4294901758 ; 0xfffefffe 453 %ybc = bitcast i32 %y to <2 x half> 454 store <2 x half> %ybc, <2 x half> addrspace(1)* %out 455 ret void 456} 457 458; GCN-LABEL: {{^}}add_inline_imm_neg_16_v2f16: 459; GFX9: s_add_i32 [[VAL:s[0-9]+]], s6, 0xfff0fff0 460; GFX9: v_mov_b32_e32 [[REG:v[0-9]+]], [[VAL]] 461; GFX9: buffer_store_dword [[REG]] 462 463 464; VI: s_load_dword [[VAL:s[0-9]+]] 465; VI: s_add_i32 [[ADD:s[0-9]+]], [[VAL]], 0xfff0fff0 ; encoding 466; VI: v_mov_b32_e32 [[REG:v[0-9]+]], [[ADD]] 467; VI: buffer_store_dword [[REG]] 468define amdgpu_kernel void @add_inline_imm_neg_16_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 { 469 %xbc = bitcast <2 x half> %x to i32 470 %y = add i32 %xbc, 4293984240 ; 0xfff0fff0 471 %ybc = bitcast i32 %y to <2 x half> 472 store <2 x half> %ybc, <2 x half> addrspace(1)* %out 473 ret void 474} 475 476; GCN-LABEL: {{^}}add_inline_imm_63_v2f16: 477; GFX9: s_load_dword [[VAL:s[0-9]+]] 478; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 63 479; GFX9: buffer_store_dword [[REG]] 480 481; FIXME: Shouldn't need right shift and SDWA, also extra copy 482; VI-DAG: s_load_dword [[VAL:s[0-9]+]] 483; VI-DAG: v_mov_b32_e32 [[CONST63:v[0-9]+]], 63 484; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16 485; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]] 486 487; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST63]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 488; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 63 489; VI: v_or_b32 490; VI: buffer_store_dword 491define amdgpu_kernel void @add_inline_imm_63_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 { 492 %y = fadd <2 x half> %x, <half 0xH003F, half 0xH003F> 493 store <2 x half> %y, <2 x half> addrspace(1)* %out 494 ret void 495} 496 497; GCN-LABEL: {{^}}add_inline_imm_64_v2f16: 498; GFX9: s_load_dword [[VAL:s[0-9]+]] 499; GFX9: v_pk_add_f16 [[REG:v[0-9]+]], [[VAL]], 64 500; GFX9: buffer_store_dword [[REG]] 501 502; FIXME: Shouldn't need right shift and SDWA, also extra copy 503; VI-DAG: s_load_dword [[VAL:s[0-9]+]] 504; VI-DAG: v_mov_b32_e32 [[CONST64:v[0-9]+]], 64 505; VI-DAG: s_lshr_b32 [[SHR:s[0-9]+]], [[VAL]], 16 506; VI-DAG: v_mov_b32_e32 [[V_SHR:v[0-9]+]], [[SHR]] 507 508; VI-DAG: v_add_f16_sdwa v{{[0-9]+}}, [[V_SHR]], [[CONST64]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 509; VI-DAG: v_add_f16_e64 v{{[0-9]+}}, [[VAL]], 64 510; VI: v_or_b32 511; VI: buffer_store_dword 512define amdgpu_kernel void @add_inline_imm_64_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %x) #0 { 513 %y = fadd <2 x half> %x, <half 0xH0040, half 0xH0040> 514 store <2 x half> %y, <2 x half> addrspace(1)* %out 515 ret void 516} 517 518; GCN-LABEL: {{^}}mul_inline_imm_0.5_v2i16: 519; GFX9: s_mov_b32 [[K:s[0-9]+]], 0x38003800 520; GFX9: v_pk_mul_lo_u16 v0, v0, [[K]] 521 522; GFX10: v_pk_mul_lo_u16 v0, 0x3800, v0 op_sel_hi:[0,1] ; encoding: [0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0xff,0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x00,0x38,0x00,0x00] 523define <2 x i16> @mul_inline_imm_0.5_v2i16(<2 x i16> %x) { 524 %y = mul <2 x i16> %x, bitcast (<2 x half> <half 0.5, half 0.5> to <2 x i16>) 525 ret <2 x i16> %y 526} 527 528; GCN-LABEL: {{^}}mul_inline_imm_neg_0.5_v2i16: 529; GFX9: s_mov_b32 [[K:s[0-9]+]], 0xb800b800 530; GFX9: v_pk_mul_lo_u16 v0, v0, [[K]] 531 532; GFX10: v_pk_mul_lo_u16 v0, 0xb800, v0 op_sel_hi:[0,1] ; encoding: [0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0xff,0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x00,0xb8,0x00,0x00] 533define <2 x i16> @mul_inline_imm_neg_0.5_v2i16(<2 x i16> %x) { 534 %y = mul <2 x i16> %x, bitcast (<2 x half> <half -0.5, half -0.5> to <2 x i16>) 535 ret <2 x i16> %y 536} 537 538; GCN-LABEL: {{^}}mul_inline_imm_1.0_v2i16: 539; GFX9: s_mov_b32 [[K:s[0-9]+]], 0x3c003c00 540; GFX9: v_pk_mul_lo_u16 v0, v0, [[K]] 541 542; GFX10: v_pk_mul_lo_u16 v0, 0x3c00, v0 op_sel_hi:[0,1] ; encoding: [0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0xff,0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x00,0x3c,0x00,0x00] 543define <2 x i16> @mul_inline_imm_1.0_v2i16(<2 x i16> %x) { 544 %y = mul <2 x i16> %x, bitcast (<2 x half> <half 1.0, half 1.0> to <2 x i16>) 545 ret <2 x i16> %y 546} 547 548; GCN-LABEL: {{^}}mul_inline_imm_neg_1.0_v2i16: 549; GFX9: s_mov_b32 [[K:s[0-9]+]], 0xbc00bc00 550; GFX9: v_pk_mul_lo_u16 v0, v0, [[K]] 551 552; GFX10: v_pk_mul_lo_u16 v0, 0xbc00, v0 op_sel_hi:[0,1] ; encoding: [0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0xff,0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x00,0xbc,0x00,0x00] 553define <2 x i16> @mul_inline_imm_neg_1.0_v2i16(<2 x i16> %x) { 554 %y = mul <2 x i16> %x, bitcast (<2 x half> <half -1.0, half -1.0> to <2 x i16>) 555 ret <2 x i16> %y 556} 557 558; GCN-LABEL: {{^}}shl_inline_imm_2.0_v2i16: 559; GFX9: s_mov_b32 [[K:s[0-9]+]], 0x40004000 560; GFX9: v_pk_lshlrev_b16 v0, v0, [[K]] 561 562; GFX10: v_pk_lshlrev_b16 v0, v0, 0x4000 op_sel_hi:[1,0] ; encoding: [0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0xff,0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x00,0x40,0x00,0x00] 563define <2 x i16> @shl_inline_imm_2.0_v2i16(<2 x i16> %x) { 564 %y = shl <2 x i16> bitcast (<2 x half> <half 2.0, half 2.0> to <2 x i16>), %x 565 ret <2 x i16> %y 566} 567 568; GCN-LABEL: {{^}}shl_inline_imm_neg_2.0_v2i16: 569; GFX9: s_mov_b32 [[K:s[0-9]+]], 0xc000c000 570; GFX9: v_pk_lshlrev_b16 v0, v0, [[K]] 571 572; GFX10: v_pk_lshlrev_b16 v0, v0, 0xc000 op_sel_hi:[1,0] ; encoding: [0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0xff,0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x00,0xc0,0x00,0x00] 573define <2 x i16> @shl_inline_imm_neg_2.0_v2i16(<2 x i16> %x) { 574 %y = shl <2 x i16> bitcast (<2 x half> <half -2.0, half -2.0> to <2 x i16>), %x 575 ret <2 x i16> %y 576} 577 578; GCN-LABEL: {{^}}mul_inline_imm_4.0_v2i16: 579; GFX9: s_mov_b32 [[K:s[0-9]+]], 0x44004400 580; GFX9: v_pk_mul_lo_u16 v0, v0, [[K]] 581 582; GFX10: v_pk_mul_lo_u16 v0, 0x4400, v0 op_sel_hi:[0,1] ; encoding: [0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0xff,0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x00,0x44,0x00,0x00] 583define <2 x i16> @mul_inline_imm_4.0_v2i16(<2 x i16> %x) { 584 %y = mul <2 x i16> %x, bitcast (<2 x half> <half 4.0, half 4.0> to <2 x i16>) 585 ret <2 x i16> %y 586 587} 588 589; GCN-LABEL: {{^}}mul_inline_imm_neg_4.0_v2i16: 590; GFX9: s_mov_b32 [[K:s[0-9]+]], 0xc400c400 591; GFX9: v_pk_mul_lo_u16 v0, v0, [[K]] 592 593; GFX10: v_pk_mul_lo_u16 v0, 0xc400, v0 op_sel_hi:[0,1] ; encoding: [0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0xff,0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x00,0xc4,0x00,0x00] 594define <2 x i16> @mul_inline_imm_neg_4.0_v2i16(<2 x i16> %x) { 595 %y = mul <2 x i16> %x, bitcast (<2 x half> <half -4.0, half -4.0> to <2 x i16>) 596 ret <2 x i16> %y 597} 598 599; GCN-LABEL: {{^}}mul_inline_imm_inv2pi_v2i16: 600; GFX9: s_mov_b32 [[K:s[0-9]+]], 0x31183118 601; GFX9: v_pk_mul_lo_u16 v0, v0, [[K]] 602 603; GFX10: v_pk_mul_lo_u16 v0, 0x3118, v0 op_sel_hi:[0,1] ; encoding: [0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0xff,0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x{{[0-9a-f]+}},0x18,0x31,0x00,0x00] 604define <2 x i16> @mul_inline_imm_inv2pi_v2i16(<2 x i16> %x) { 605 %y = mul <2 x i16> %x, bitcast (<2 x half> <half 0xH3118, half 0xH3118> to <2 x i16>) 606 ret <2 x i16> %y 607} 608 609attributes #0 = { nounwind } 610