1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -amdgpu-scalarize-global-loads=false -march=amdgcn -mtriple=amdgcn-- -mcpu=verde -verify-machineinstrs | FileCheck %s --check-prefixes=SI 3; RUN: llc < %s -march=amdgcn -mtriple=amdgcn-- -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs | FileCheck %s -check-prefixes=VI 4; RUN: llc < %s -amdgpu-scalarize-global-loads=false -march=r600 -mtriple=r600-- -mcpu=redwood -verify-machineinstrs | FileCheck %s --check-prefixes=EG 5 6declare i32 @llvm.amdgcn.workitem.id.x() #0 7 8declare i32 @llvm.amdgcn.workgroup.id.x() #0 9 10define amdgpu_kernel void @shl_v2i32(<2 x i32> addrspace(1)* %out, <2 x i32> addrspace(1)* %in) { 11; SI-LABEL: shl_v2i32: 12; SI: ; %bb.0: 13; SI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 14; SI-NEXT: s_mov_b32 s7, 0xf000 15; SI-NEXT: s_mov_b32 s6, -1 16; SI-NEXT: s_mov_b32 s10, s6 17; SI-NEXT: s_mov_b32 s11, s7 18; SI-NEXT: s_waitcnt lgkmcnt(0) 19; SI-NEXT: s_mov_b32 s8, s2 20; SI-NEXT: s_mov_b32 s9, s3 21; SI-NEXT: buffer_load_dwordx4 v[0:3], off, s[8:11], 0 22; SI-NEXT: s_mov_b32 s4, s0 23; SI-NEXT: s_mov_b32 s5, s1 24; SI-NEXT: s_waitcnt vmcnt(0) 25; SI-NEXT: v_lshl_b32_e32 v1, v1, v3 26; SI-NEXT: v_lshl_b32_e32 v0, v0, v2 27; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0 28; SI-NEXT: s_endpgm 29; 30; VI-LABEL: shl_v2i32: 31; VI: ; %bb.0: 32; VI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 33; VI-NEXT: s_waitcnt lgkmcnt(0) 34; VI-NEXT: s_load_dwordx4 s[4:7], s[2:3], 0x0 35; VI-NEXT: s_mov_b32 s3, 0xf000 36; VI-NEXT: s_mov_b32 s2, -1 37; VI-NEXT: s_waitcnt lgkmcnt(0) 38; VI-NEXT: s_lshl_b32 s5, s5, s7 39; VI-NEXT: s_lshl_b32 s4, s4, s6 40; VI-NEXT: v_mov_b32_e32 v0, s4 41; VI-NEXT: v_mov_b32_e32 v1, s5 42; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 43; VI-NEXT: s_endpgm 44; 45; EG-LABEL: shl_v2i32: 46; EG: ; %bb.0: 47; EG-NEXT: ALU 0, @8, KC0[CB0:0-32], KC1[] 48; EG-NEXT: TEX 0 @6 49; EG-NEXT: ALU 3, @9, KC0[CB0:0-32], KC1[] 50; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 51; EG-NEXT: CF_END 52; EG-NEXT: PAD 53; EG-NEXT: Fetch clause starting at 6: 54; EG-NEXT: VTX_READ_128 T0.XYZW, T0.X, 0, #1 55; EG-NEXT: ALU clause starting at 8: 56; EG-NEXT: MOV * T0.X, KC0[2].Z, 57; EG-NEXT: ALU clause starting at 9: 58; EG-NEXT: LSHL * T0.Y, T0.Y, T0.W, 59; EG-NEXT: LSHL T0.X, T0.X, T0.Z, 60; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 61; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 62 %b_ptr = getelementptr <2 x i32>, <2 x i32> addrspace(1)* %in, i32 1 63 %a = load <2 x i32>, <2 x i32> addrspace(1)* %in 64 %b = load <2 x i32>, <2 x i32> addrspace(1)* %b_ptr 65 %result = shl <2 x i32> %a, %b 66 store <2 x i32> %result, <2 x i32> addrspace(1)* %out 67 ret void 68} 69 70define amdgpu_kernel void @shl_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) { 71; SI-LABEL: shl_v4i32: 72; SI: ; %bb.0: 73; SI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 74; SI-NEXT: s_mov_b32 s7, 0xf000 75; SI-NEXT: s_mov_b32 s6, -1 76; SI-NEXT: s_mov_b32 s10, s6 77; SI-NEXT: s_mov_b32 s11, s7 78; SI-NEXT: s_waitcnt lgkmcnt(0) 79; SI-NEXT: s_mov_b32 s8, s2 80; SI-NEXT: s_mov_b32 s9, s3 81; SI-NEXT: buffer_load_dwordx4 v[0:3], off, s[8:11], 0 82; SI-NEXT: buffer_load_dwordx4 v[4:7], off, s[8:11], 0 offset:16 83; SI-NEXT: s_mov_b32 s4, s0 84; SI-NEXT: s_mov_b32 s5, s1 85; SI-NEXT: s_waitcnt vmcnt(0) 86; SI-NEXT: v_lshl_b32_e32 v3, v3, v7 87; SI-NEXT: v_lshl_b32_e32 v2, v2, v6 88; SI-NEXT: v_lshl_b32_e32 v1, v1, v5 89; SI-NEXT: v_lshl_b32_e32 v0, v0, v4 90; SI-NEXT: buffer_store_dwordx4 v[0:3], off, s[4:7], 0 91; SI-NEXT: s_endpgm 92; 93; VI-LABEL: shl_v4i32: 94; VI: ; %bb.0: 95; VI-NEXT: s_load_dwordx4 s[8:11], s[0:1], 0x24 96; VI-NEXT: s_waitcnt lgkmcnt(0) 97; VI-NEXT: s_load_dwordx8 s[0:7], s[10:11], 0x0 98; VI-NEXT: s_mov_b32 s11, 0xf000 99; VI-NEXT: s_mov_b32 s10, -1 100; VI-NEXT: s_waitcnt lgkmcnt(0) 101; VI-NEXT: s_lshl_b32 s3, s3, s7 102; VI-NEXT: s_lshl_b32 s2, s2, s6 103; VI-NEXT: s_lshl_b32 s1, s1, s5 104; VI-NEXT: s_lshl_b32 s0, s0, s4 105; VI-NEXT: v_mov_b32_e32 v0, s0 106; VI-NEXT: v_mov_b32_e32 v1, s1 107; VI-NEXT: v_mov_b32_e32 v2, s2 108; VI-NEXT: v_mov_b32_e32 v3, s3 109; VI-NEXT: buffer_store_dwordx4 v[0:3], off, s[8:11], 0 110; VI-NEXT: s_endpgm 111; 112; EG-LABEL: shl_v4i32: 113; EG: ; %bb.0: 114; EG-NEXT: ALU 0, @10, KC0[CB0:0-32], KC1[] 115; EG-NEXT: TEX 1 @6 116; EG-NEXT: ALU 5, @11, KC0[CB0:0-32], KC1[] 117; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XYZW, T1.X, 1 118; EG-NEXT: CF_END 119; EG-NEXT: PAD 120; EG-NEXT: Fetch clause starting at 6: 121; EG-NEXT: VTX_READ_128 T1.XYZW, T0.X, 16, #1 122; EG-NEXT: VTX_READ_128 T0.XYZW, T0.X, 0, #1 123; EG-NEXT: ALU clause starting at 10: 124; EG-NEXT: MOV * T0.X, KC0[2].Z, 125; EG-NEXT: ALU clause starting at 11: 126; EG-NEXT: LSHL * T0.W, T0.W, T1.W, 127; EG-NEXT: LSHL * T0.Z, T0.Z, T1.Z, 128; EG-NEXT: LSHL * T0.Y, T0.Y, T1.Y, 129; EG-NEXT: LSHL T0.X, T0.X, T1.X, 130; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 131; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 132 %b_ptr = getelementptr <4 x i32>, <4 x i32> addrspace(1)* %in, i32 1 133 %a = load <4 x i32>, <4 x i32> addrspace(1)* %in 134 %b = load <4 x i32>, <4 x i32> addrspace(1)* %b_ptr 135 %result = shl <4 x i32> %a, %b 136 store <4 x i32> %result, <4 x i32> addrspace(1)* %out 137 ret void 138} 139 140define amdgpu_kernel void @shl_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %in) { 141; SI-LABEL: shl_i16: 142; SI: ; %bb.0: 143; SI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 144; SI-NEXT: s_mov_b32 s7, 0xf000 145; SI-NEXT: s_mov_b32 s6, -1 146; SI-NEXT: s_mov_b32 s10, s6 147; SI-NEXT: s_mov_b32 s11, s7 148; SI-NEXT: s_waitcnt lgkmcnt(0) 149; SI-NEXT: s_mov_b32 s8, s2 150; SI-NEXT: s_mov_b32 s9, s3 151; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 0 152; SI-NEXT: buffer_load_ushort v1, off, s[8:11], 0 offset:2 153; SI-NEXT: s_mov_b32 s4, s0 154; SI-NEXT: s_mov_b32 s5, s1 155; SI-NEXT: s_waitcnt vmcnt(0) 156; SI-NEXT: v_lshlrev_b32_e32 v0, v1, v0 157; SI-NEXT: buffer_store_short v0, off, s[4:7], 0 158; SI-NEXT: s_endpgm 159; 160; VI-LABEL: shl_i16: 161; VI: ; %bb.0: 162; VI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 163; VI-NEXT: s_mov_b32 s7, 0xf000 164; VI-NEXT: s_mov_b32 s6, -1 165; VI-NEXT: s_mov_b32 s10, s6 166; VI-NEXT: s_mov_b32 s11, s7 167; VI-NEXT: s_waitcnt lgkmcnt(0) 168; VI-NEXT: s_mov_b32 s8, s2 169; VI-NEXT: s_mov_b32 s9, s3 170; VI-NEXT: buffer_load_ushort v0, off, s[8:11], 0 171; VI-NEXT: buffer_load_ushort v1, off, s[8:11], 0 offset:2 172; VI-NEXT: s_mov_b32 s4, s0 173; VI-NEXT: s_mov_b32 s5, s1 174; VI-NEXT: s_waitcnt vmcnt(0) 175; VI-NEXT: v_lshlrev_b32_e32 v0, v1, v0 176; VI-NEXT: buffer_store_short v0, off, s[4:7], 0 177; VI-NEXT: s_endpgm 178; 179; EG-LABEL: shl_i16: 180; EG: ; %bb.0: 181; EG-NEXT: ALU 0, @10, KC0[CB0:0-32], KC1[] 182; EG-NEXT: TEX 1 @6 183; EG-NEXT: ALU 12, @11, KC0[CB0:0-32], KC1[] 184; EG-NEXT: MEM_RAT MSKOR T0.XW, T1.X 185; EG-NEXT: CF_END 186; EG-NEXT: PAD 187; EG-NEXT: Fetch clause starting at 6: 188; EG-NEXT: VTX_READ_16 T1.X, T0.X, 2, #1 189; EG-NEXT: VTX_READ_16 T0.X, T0.X, 0, #1 190; EG-NEXT: ALU clause starting at 10: 191; EG-NEXT: MOV * T0.X, KC0[2].Z, 192; EG-NEXT: ALU clause starting at 11: 193; EG-NEXT: AND_INT T0.W, KC0[2].Y, literal.x, 194; EG-NEXT: LSHL * T1.W, T0.X, T1.X, 195; EG-NEXT: 3(4.203895e-45), 0(0.000000e+00) 196; EG-NEXT: AND_INT T1.W, PS, literal.x, 197; EG-NEXT: LSHL * T0.W, PV.W, literal.y, 198; EG-NEXT: 65535(9.183409e-41), 3(4.203895e-45) 199; EG-NEXT: LSHL T0.X, PV.W, PS, 200; EG-NEXT: LSHL * T0.W, literal.x, PS, 201; EG-NEXT: 65535(9.183409e-41), 0(0.000000e+00) 202; EG-NEXT: MOV T0.Y, 0.0, 203; EG-NEXT: MOV * T0.Z, 0.0, 204; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 205; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 206 %b_ptr = getelementptr i16, i16 addrspace(1)* %in, i16 1 207 %a = load i16, i16 addrspace(1)* %in 208 %b = load i16, i16 addrspace(1)* %b_ptr 209 %result = shl i16 %a, %b 210 store i16 %result, i16 addrspace(1)* %out 211 ret void 212} 213 214define amdgpu_kernel void @shl_i16_v_s(i16 addrspace(1)* %out, i16 addrspace(1)* %in, i16 %b) { 215; SI-LABEL: shl_i16_v_s: 216; SI: ; %bb.0: 217; SI-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 218; SI-NEXT: s_load_dword s12, s[0:1], 0xd 219; SI-NEXT: s_mov_b32 s3, 0xf000 220; SI-NEXT: s_mov_b32 s2, -1 221; SI-NEXT: s_mov_b32 s10, s2 222; SI-NEXT: s_waitcnt lgkmcnt(0) 223; SI-NEXT: s_mov_b32 s8, s6 224; SI-NEXT: s_mov_b32 s9, s7 225; SI-NEXT: s_mov_b32 s11, s3 226; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 0 227; SI-NEXT: s_mov_b32 s0, s4 228; SI-NEXT: s_mov_b32 s1, s5 229; SI-NEXT: s_waitcnt vmcnt(0) 230; SI-NEXT: v_lshlrev_b32_e32 v0, s12, v0 231; SI-NEXT: buffer_store_short v0, off, s[0:3], 0 232; SI-NEXT: s_endpgm 233; 234; VI-LABEL: shl_i16_v_s: 235; VI: ; %bb.0: 236; VI-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 237; VI-NEXT: s_load_dword s12, s[0:1], 0x34 238; VI-NEXT: s_mov_b32 s3, 0xf000 239; VI-NEXT: s_mov_b32 s2, -1 240; VI-NEXT: s_mov_b32 s10, s2 241; VI-NEXT: s_waitcnt lgkmcnt(0) 242; VI-NEXT: s_mov_b32 s8, s6 243; VI-NEXT: s_mov_b32 s9, s7 244; VI-NEXT: s_mov_b32 s11, s3 245; VI-NEXT: buffer_load_ushort v0, off, s[8:11], 0 246; VI-NEXT: s_mov_b32 s0, s4 247; VI-NEXT: s_mov_b32 s1, s5 248; VI-NEXT: s_waitcnt vmcnt(0) 249; VI-NEXT: v_lshlrev_b32_e32 v0, s12, v0 250; VI-NEXT: buffer_store_short v0, off, s[0:3], 0 251; VI-NEXT: s_endpgm 252; 253; EG-LABEL: shl_i16_v_s: 254; EG: ; %bb.0: 255; EG-NEXT: ALU 1, @10, KC0[CB0:0-32], KC1[] 256; EG-NEXT: TEX 1 @6 257; EG-NEXT: ALU 12, @12, KC0[CB0:0-32], KC1[] 258; EG-NEXT: MEM_RAT MSKOR T0.XW, T1.X 259; EG-NEXT: CF_END 260; EG-NEXT: PAD 261; EG-NEXT: Fetch clause starting at 6: 262; EG-NEXT: VTX_READ_16 T1.X, T1.X, 0, #1 263; EG-NEXT: VTX_READ_16 T0.X, T0.X, 44, #3 264; EG-NEXT: ALU clause starting at 10: 265; EG-NEXT: MOV T0.X, 0.0, 266; EG-NEXT: MOV * T1.X, KC0[2].Z, 267; EG-NEXT: ALU clause starting at 12: 268; EG-NEXT: AND_INT T0.W, KC0[2].Y, literal.x, 269; EG-NEXT: LSHL * T1.W, T1.X, T0.X, 270; EG-NEXT: 3(4.203895e-45), 0(0.000000e+00) 271; EG-NEXT: AND_INT T1.W, PS, literal.x, 272; EG-NEXT: LSHL * T0.W, PV.W, literal.y, 273; EG-NEXT: 65535(9.183409e-41), 3(4.203895e-45) 274; EG-NEXT: LSHL T0.X, PV.W, PS, 275; EG-NEXT: LSHL * T0.W, literal.x, PS, 276; EG-NEXT: 65535(9.183409e-41), 0(0.000000e+00) 277; EG-NEXT: MOV T0.Y, 0.0, 278; EG-NEXT: MOV * T0.Z, 0.0, 279; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 280; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 281 %a = load i16, i16 addrspace(1)* %in 282 %result = shl i16 %a, %b 283 store i16 %result, i16 addrspace(1)* %out 284 ret void 285} 286 287define amdgpu_kernel void @shl_i16_v_compute_s(i16 addrspace(1)* %out, i16 addrspace(1)* %in, i16 %b) { 288; SI-LABEL: shl_i16_v_compute_s: 289; SI: ; %bb.0: 290; SI-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 291; SI-NEXT: s_load_dword s12, s[0:1], 0xd 292; SI-NEXT: s_mov_b32 s3, 0xf000 293; SI-NEXT: s_mov_b32 s2, -1 294; SI-NEXT: s_mov_b32 s10, s2 295; SI-NEXT: s_waitcnt lgkmcnt(0) 296; SI-NEXT: s_mov_b32 s8, s6 297; SI-NEXT: s_mov_b32 s9, s7 298; SI-NEXT: s_mov_b32 s11, s3 299; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 0 300; SI-NEXT: s_add_i32 s12, s12, 3 301; SI-NEXT: s_mov_b32 s0, s4 302; SI-NEXT: s_mov_b32 s1, s5 303; SI-NEXT: s_waitcnt vmcnt(0) 304; SI-NEXT: v_lshlrev_b32_e32 v0, s12, v0 305; SI-NEXT: buffer_store_short v0, off, s[0:3], 0 306; SI-NEXT: s_endpgm 307; 308; VI-LABEL: shl_i16_v_compute_s: 309; VI: ; %bb.0: 310; VI-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 311; VI-NEXT: s_load_dword s12, s[0:1], 0x34 312; VI-NEXT: s_mov_b32 s3, 0xf000 313; VI-NEXT: s_mov_b32 s2, -1 314; VI-NEXT: s_mov_b32 s10, s2 315; VI-NEXT: s_waitcnt lgkmcnt(0) 316; VI-NEXT: s_mov_b32 s8, s6 317; VI-NEXT: s_mov_b32 s9, s7 318; VI-NEXT: s_mov_b32 s11, s3 319; VI-NEXT: buffer_load_ushort v0, off, s[8:11], 0 320; VI-NEXT: s_add_i32 s12, s12, 3 321; VI-NEXT: s_mov_b32 s0, s4 322; VI-NEXT: s_mov_b32 s1, s5 323; VI-NEXT: s_waitcnt vmcnt(0) 324; VI-NEXT: v_lshlrev_b32_e32 v0, s12, v0 325; VI-NEXT: buffer_store_short v0, off, s[0:3], 0 326; VI-NEXT: s_endpgm 327; 328; EG-LABEL: shl_i16_v_compute_s: 329; EG: ; %bb.0: 330; EG-NEXT: ALU 0, @12, KC0[], KC1[] 331; EG-NEXT: TEX 0 @8 332; EG-NEXT: ALU 0, @13, KC0[CB0:0-32], KC1[] 333; EG-NEXT: TEX 0 @10 334; EG-NEXT: ALU 15, @14, KC0[CB0:0-32], KC1[] 335; EG-NEXT: MEM_RAT MSKOR T0.XW, T1.X 336; EG-NEXT: CF_END 337; EG-NEXT: PAD 338; EG-NEXT: Fetch clause starting at 8: 339; EG-NEXT: VTX_READ_16 T0.X, T0.X, 44, #3 340; EG-NEXT: Fetch clause starting at 10: 341; EG-NEXT: VTX_READ_16 T1.X, T1.X, 0, #1 342; EG-NEXT: ALU clause starting at 12: 343; EG-NEXT: MOV * T0.X, 0.0, 344; EG-NEXT: ALU clause starting at 13: 345; EG-NEXT: MOV * T1.X, KC0[2].Z, 346; EG-NEXT: ALU clause starting at 14: 347; EG-NEXT: ADD_INT * T0.W, T0.X, literal.x, 348; EG-NEXT: 3(4.203895e-45), 0(0.000000e+00) 349; EG-NEXT: AND_INT T0.W, PV.W, literal.x, 350; EG-NEXT: AND_INT * T1.W, KC0[2].Y, literal.y, 351; EG-NEXT: 65535(9.183409e-41), 3(4.203895e-45) 352; EG-NEXT: LSHL * T0.W, T1.X, PV.W, 353; EG-NEXT: AND_INT T0.W, PV.W, literal.x, 354; EG-NEXT: LSHL * T1.W, T1.W, literal.y, 355; EG-NEXT: 65535(9.183409e-41), 3(4.203895e-45) 356; EG-NEXT: LSHL T0.X, PV.W, PS, 357; EG-NEXT: LSHL * T0.W, literal.x, PS, 358; EG-NEXT: 65535(9.183409e-41), 0(0.000000e+00) 359; EG-NEXT: MOV T0.Y, 0.0, 360; EG-NEXT: MOV * T0.Z, 0.0, 361; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 362; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 363 %a = load i16, i16 addrspace(1)* %in 364 %b.add = add i16 %b, 3 365 %result = shl i16 %a, %b.add 366 store i16 %result, i16 addrspace(1)* %out 367 ret void 368} 369 370define amdgpu_kernel void @shl_i16_computed_amount(i16 addrspace(1)* %out, i16 addrspace(1)* %in) { 371; SI-LABEL: shl_i16_computed_amount: 372; SI: ; %bb.0: 373; SI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 374; SI-NEXT: s_mov_b32 s7, 0xf000 375; SI-NEXT: s_mov_b32 s6, -1 376; SI-NEXT: s_mov_b32 s10, s6 377; SI-NEXT: s_mov_b32 s11, s7 378; SI-NEXT: s_waitcnt lgkmcnt(0) 379; SI-NEXT: s_mov_b32 s8, s2 380; SI-NEXT: s_mov_b32 s9, s3 381; SI-NEXT: v_lshlrev_b32_e32 v0, 1, v0 382; SI-NEXT: v_mov_b32_e32 v1, 0 383; SI-NEXT: s_mov_b32 s14, 0 384; SI-NEXT: s_mov_b32 s15, s7 385; SI-NEXT: s_mov_b64 s[12:13], s[2:3] 386; SI-NEXT: buffer_load_ushort v2, off, s[8:11], 0 glc 387; SI-NEXT: s_waitcnt vmcnt(0) 388; SI-NEXT: buffer_load_ushort v0, v[0:1], s[12:15], 0 addr64 offset:2 glc 389; SI-NEXT: s_waitcnt vmcnt(0) 390; SI-NEXT: s_mov_b32 s4, s0 391; SI-NEXT: s_mov_b32 s5, s1 392; SI-NEXT: v_add_i32_e32 v0, vcc, 3, v0 393; SI-NEXT: v_lshlrev_b32_e32 v0, v0, v2 394; SI-NEXT: buffer_store_short v0, off, s[4:7], 0 395; SI-NEXT: s_endpgm 396; 397; VI-LABEL: shl_i16_computed_amount: 398; VI: ; %bb.0: 399; VI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 400; VI-NEXT: v_lshlrev_b32_e32 v0, 1, v0 401; VI-NEXT: s_mov_b32 s7, 0xf000 402; VI-NEXT: s_mov_b32 s6, -1 403; VI-NEXT: s_mov_b32 s10, s6 404; VI-NEXT: s_waitcnt lgkmcnt(0) 405; VI-NEXT: v_mov_b32_e32 v1, s3 406; VI-NEXT: v_add_u32_e32 v0, vcc, s2, v0 407; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 408; VI-NEXT: v_add_u32_e32 v0, vcc, 2, v0 409; VI-NEXT: s_mov_b32 s8, s2 410; VI-NEXT: s_mov_b32 s9, s3 411; VI-NEXT: s_mov_b32 s11, s7 412; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 413; VI-NEXT: buffer_load_ushort v2, off, s[8:11], 0 glc 414; VI-NEXT: s_waitcnt vmcnt(0) 415; VI-NEXT: flat_load_ushort v0, v[0:1] glc 416; VI-NEXT: s_waitcnt vmcnt(0) 417; VI-NEXT: s_mov_b32 s4, s0 418; VI-NEXT: s_mov_b32 s5, s1 419; VI-NEXT: v_add_u16_e32 v0, 3, v0 420; VI-NEXT: v_lshlrev_b16_e32 v0, v0, v2 421; VI-NEXT: buffer_store_short v0, off, s[4:7], 0 422; VI-NEXT: s_endpgm 423; 424; EG-LABEL: shl_i16_computed_amount: 425; EG: ; %bb.0: 426; EG-NEXT: ALU 0, @12, KC0[CB0:0-32], KC1[] 427; EG-NEXT: TEX 0 @8 428; EG-NEXT: ALU 1, @13, KC0[CB0:0-32], KC1[] 429; EG-NEXT: TEX 0 @10 430; EG-NEXT: ALU 15, @15, KC0[CB0:0-32], KC1[] 431; EG-NEXT: MEM_RAT MSKOR T0.XW, T1.X 432; EG-NEXT: CF_END 433; EG-NEXT: PAD 434; EG-NEXT: Fetch clause starting at 8: 435; EG-NEXT: VTX_READ_16 T1.X, T1.X, 0, #1 436; EG-NEXT: Fetch clause starting at 10: 437; EG-NEXT: VTX_READ_16 T0.X, T0.X, 2, #1 438; EG-NEXT: ALU clause starting at 12: 439; EG-NEXT: MOV * T1.X, KC0[2].Z, 440; EG-NEXT: ALU clause starting at 13: 441; EG-NEXT: LSHL * T0.W, T0.X, 1, 442; EG-NEXT: ADD_INT * T0.X, KC0[2].Z, PV.W, 443; EG-NEXT: ALU clause starting at 15: 444; EG-NEXT: ADD_INT * T0.W, T0.X, literal.x, 445; EG-NEXT: 3(4.203895e-45), 0(0.000000e+00) 446; EG-NEXT: AND_INT T0.W, PV.W, literal.x, 447; EG-NEXT: AND_INT * T1.W, KC0[2].Y, literal.y, 448; EG-NEXT: 65535(9.183409e-41), 3(4.203895e-45) 449; EG-NEXT: LSHL * T0.W, T1.X, PV.W, 450; EG-NEXT: AND_INT T0.W, PV.W, literal.x, 451; EG-NEXT: LSHL * T1.W, T1.W, literal.y, 452; EG-NEXT: 65535(9.183409e-41), 3(4.203895e-45) 453; EG-NEXT: LSHL T0.X, PV.W, PS, 454; EG-NEXT: LSHL * T0.W, literal.x, PS, 455; EG-NEXT: 65535(9.183409e-41), 0(0.000000e+00) 456; EG-NEXT: MOV T0.Y, 0.0, 457; EG-NEXT: MOV * T0.Z, 0.0, 458; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 459; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 460 %tid = call i32 @llvm.amdgcn.workitem.id.x() #0 461 %gep = getelementptr inbounds i16, i16 addrspace(1)* %in, i32 %tid 462 %gep.out = getelementptr inbounds i16, i16 addrspace(1)* %out, i32 %tid 463 %b_ptr = getelementptr i16, i16 addrspace(1)* %gep, i16 1 464 %a = load volatile i16, i16 addrspace(1)* %in 465 %b = load volatile i16, i16 addrspace(1)* %b_ptr 466 %b.add = add i16 %b, 3 467 %result = shl i16 %a, %b.add 468 store i16 %result, i16 addrspace(1)* %out 469 ret void 470} 471 472define amdgpu_kernel void @shl_i16_i_s(i16 addrspace(1)* %out, i16 zeroext %a) { 473; SI-LABEL: shl_i16_i_s: 474; SI: ; %bb.0: 475; SI-NEXT: s_load_dword s4, s[0:1], 0xb 476; SI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 477; SI-NEXT: s_mov_b32 s3, 0xf000 478; SI-NEXT: s_mov_b32 s2, -1 479; SI-NEXT: s_waitcnt lgkmcnt(0) 480; SI-NEXT: s_lshl_b32 s4, s4, 12 481; SI-NEXT: v_mov_b32_e32 v0, s4 482; SI-NEXT: buffer_store_short v0, off, s[0:3], 0 483; SI-NEXT: s_endpgm 484; 485; VI-LABEL: shl_i16_i_s: 486; VI: ; %bb.0: 487; VI-NEXT: s_load_dword s4, s[0:1], 0x2c 488; VI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 489; VI-NEXT: s_mov_b32 s3, 0xf000 490; VI-NEXT: s_mov_b32 s2, -1 491; VI-NEXT: s_waitcnt lgkmcnt(0) 492; VI-NEXT: s_lshl_b32 s4, s4, 12 493; VI-NEXT: v_mov_b32_e32 v0, s4 494; VI-NEXT: buffer_store_short v0, off, s[0:3], 0 495; VI-NEXT: s_endpgm 496; 497; EG-LABEL: shl_i16_i_s: 498; EG: ; %bb.0: 499; EG-NEXT: ALU 0, @8, KC0[], KC1[] 500; EG-NEXT: TEX 0 @6 501; EG-NEXT: ALU 14, @9, KC0[CB0:0-32], KC1[] 502; EG-NEXT: MEM_RAT MSKOR T0.XW, T1.X 503; EG-NEXT: CF_END 504; EG-NEXT: PAD 505; EG-NEXT: Fetch clause starting at 6: 506; EG-NEXT: VTX_READ_16 T0.X, T0.X, 40, #3 507; EG-NEXT: ALU clause starting at 8: 508; EG-NEXT: MOV * T0.X, 0.0, 509; EG-NEXT: ALU clause starting at 9: 510; EG-NEXT: BFE_INT T0.W, T0.X, 0.0, literal.x, 511; EG-NEXT: AND_INT * T1.W, KC0[2].Y, literal.y, 512; EG-NEXT: 16(2.242078e-44), 3(4.203895e-45) 513; EG-NEXT: LSHL * T0.W, PV.W, literal.x, 514; EG-NEXT: 12(1.681558e-44), 0(0.000000e+00) 515; EG-NEXT: AND_INT T0.W, PV.W, literal.x, 516; EG-NEXT: LSHL * T1.W, T1.W, literal.y, 517; EG-NEXT: 61440(8.609578e-41), 3(4.203895e-45) 518; EG-NEXT: LSHL T0.X, PV.W, PS, 519; EG-NEXT: LSHL * T0.W, literal.x, PS, 520; EG-NEXT: 65535(9.183409e-41), 0(0.000000e+00) 521; EG-NEXT: MOV T0.Y, 0.0, 522; EG-NEXT: MOV * T0.Z, 0.0, 523; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 524; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 525 %result = shl i16 %a, 12 526 store i16 %result, i16 addrspace(1)* %out 527 ret void 528} 529 530define amdgpu_kernel void @shl_v2i16(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(1)* %in) { 531; SI-LABEL: shl_v2i16: 532; SI: ; %bb.0: 533; SI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 534; SI-NEXT: s_mov_b32 s7, 0xf000 535; SI-NEXT: s_mov_b32 s6, -1 536; SI-NEXT: s_mov_b32 s10, s6 537; SI-NEXT: s_mov_b32 s11, s7 538; SI-NEXT: s_waitcnt lgkmcnt(0) 539; SI-NEXT: s_mov_b32 s8, s2 540; SI-NEXT: s_mov_b32 s9, s3 541; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v0 542; SI-NEXT: v_mov_b32_e32 v1, 0 543; SI-NEXT: s_mov_b32 s14, 0 544; SI-NEXT: s_mov_b32 s15, s7 545; SI-NEXT: s_mov_b64 s[12:13], s[2:3] 546; SI-NEXT: buffer_load_dword v2, off, s[8:11], 0 547; SI-NEXT: buffer_load_dword v0, v[0:1], s[12:15], 0 addr64 offset:4 548; SI-NEXT: s_mov_b32 s4, s0 549; SI-NEXT: s_mov_b32 s5, s1 550; SI-NEXT: s_waitcnt vmcnt(1) 551; SI-NEXT: v_lshrrev_b32_e32 v1, 16, v2 552; SI-NEXT: s_waitcnt vmcnt(0) 553; SI-NEXT: v_lshrrev_b32_e32 v3, 16, v0 554; SI-NEXT: v_lshlrev_b32_e32 v0, v0, v2 555; SI-NEXT: v_lshlrev_b32_e32 v1, v3, v1 556; SI-NEXT: v_and_b32_e32 v0, 0xffff, v0 557; SI-NEXT: v_lshlrev_b32_e32 v1, 16, v1 558; SI-NEXT: v_or_b32_e32 v0, v0, v1 559; SI-NEXT: buffer_store_dword v0, off, s[4:7], 0 560; SI-NEXT: s_endpgm 561; 562; VI-LABEL: shl_v2i16: 563; VI: ; %bb.0: 564; VI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 565; VI-NEXT: v_lshlrev_b32_e32 v0, 2, v0 566; VI-NEXT: s_waitcnt lgkmcnt(0) 567; VI-NEXT: v_mov_b32_e32 v1, s3 568; VI-NEXT: v_add_u32_e32 v0, vcc, s2, v0 569; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 570; VI-NEXT: v_add_u32_e32 v0, vcc, 4, v0 571; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 572; VI-NEXT: flat_load_dword v0, v[0:1] 573; VI-NEXT: s_load_dword s4, s[2:3], 0x0 574; VI-NEXT: s_mov_b32 s3, 0xf000 575; VI-NEXT: s_mov_b32 s2, -1 576; VI-NEXT: s_waitcnt lgkmcnt(0) 577; VI-NEXT: s_lshr_b32 s5, s4, 16 578; VI-NEXT: v_mov_b32_e32 v1, s5 579; VI-NEXT: s_waitcnt vmcnt(0) 580; VI-NEXT: v_lshlrev_b16_e64 v2, v0, s4 581; VI-NEXT: v_lshlrev_b16_sdwa v0, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 582; VI-NEXT: v_or_b32_e32 v0, v2, v0 583; VI-NEXT: buffer_store_dword v0, off, s[0:3], 0 584; VI-NEXT: s_endpgm 585; 586; EG-LABEL: shl_v2i16: 587; EG: ; %bb.0: 588; EG-NEXT: ALU 2, @12, KC0[CB0:0-32], KC1[] 589; EG-NEXT: TEX 0 @8 590; EG-NEXT: ALU 0, @15, KC0[CB0:0-32], KC1[] 591; EG-NEXT: TEX 0 @10 592; EG-NEXT: ALU 12, @16, KC0[CB0:0-32], KC1[] 593; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.X, T7.X, 1 594; EG-NEXT: CF_END 595; EG-NEXT: PAD 596; EG-NEXT: Fetch clause starting at 8: 597; EG-NEXT: VTX_READ_32 T0.X, T0.X, 4, #1 598; EG-NEXT: Fetch clause starting at 10: 599; EG-NEXT: VTX_READ_32 T7.X, T7.X, 0, #1 600; EG-NEXT: ALU clause starting at 12: 601; EG-NEXT: LSHL * T0.W, T0.X, literal.x, 602; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 603; EG-NEXT: ADD_INT * T0.X, KC0[2].Z, PV.W, 604; EG-NEXT: ALU clause starting at 15: 605; EG-NEXT: MOV * T7.X, KC0[2].Z, 606; EG-NEXT: ALU clause starting at 16: 607; EG-NEXT: AND_INT T0.Y, T0.X, literal.x, 608; EG-NEXT: AND_INT T0.Z, T7.X, literal.x, BS:VEC_120/SCL_212 609; EG-NEXT: LSHR T0.W, T0.X, literal.y, 610; EG-NEXT: LSHR * T1.W, T7.X, literal.y, 611; EG-NEXT: 65535(9.183409e-41), 16(2.242078e-44) 612; EG-NEXT: LSHL T0.W, PS, PV.W, 613; EG-NEXT: LSHL * T1.W, PV.Z, PV.Y, 614; EG-NEXT: AND_INT T1.W, PS, literal.x, 615; EG-NEXT: LSHL * T0.W, PV.W, literal.y, 616; EG-NEXT: 65535(9.183409e-41), 16(2.242078e-44) 617; EG-NEXT: OR_INT T0.X, PV.W, PS, 618; EG-NEXT: LSHR * T7.X, KC0[2].Y, literal.x, 619; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 620 %tid = call i32 @llvm.amdgcn.workitem.id.x() #0 621 %gep = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %in, i32 %tid 622 %gep.out = getelementptr inbounds <2 x i16>, <2 x i16> addrspace(1)* %out, i32 %tid 623 %b_ptr = getelementptr <2 x i16>, <2 x i16> addrspace(1)* %gep, i16 1 624 %a = load <2 x i16>, <2 x i16> addrspace(1)* %in 625 %b = load <2 x i16>, <2 x i16> addrspace(1)* %b_ptr 626 %result = shl <2 x i16> %a, %b 627 store <2 x i16> %result, <2 x i16> addrspace(1)* %out 628 ret void 629} 630 631define amdgpu_kernel void @shl_v4i16(<4 x i16> addrspace(1)* %out, <4 x i16> addrspace(1)* %in) { 632; SI-LABEL: shl_v4i16: 633; SI: ; %bb.0: 634; SI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 635; SI-NEXT: s_mov_b32 s7, 0xf000 636; SI-NEXT: s_mov_b32 s6, 0 637; SI-NEXT: v_lshlrev_b32_e32 v4, 3, v0 638; SI-NEXT: v_mov_b32_e32 v5, 0 639; SI-NEXT: s_waitcnt lgkmcnt(0) 640; SI-NEXT: s_mov_b64 s[4:5], s[2:3] 641; SI-NEXT: buffer_load_dwordx4 v[0:3], v[4:5], s[4:7], 0 addr64 642; SI-NEXT: s_mov_b64 s[2:3], s[6:7] 643; SI-NEXT: s_waitcnt vmcnt(0) 644; SI-NEXT: v_lshrrev_b32_e32 v6, 16, v0 645; SI-NEXT: v_lshrrev_b32_e32 v7, 16, v1 646; SI-NEXT: v_lshrrev_b32_e32 v8, 16, v2 647; SI-NEXT: v_lshrrev_b32_e32 v9, 16, v3 648; SI-NEXT: v_lshlrev_b32_e32 v1, v3, v1 649; SI-NEXT: v_lshlrev_b32_e32 v0, v2, v0 650; SI-NEXT: v_lshlrev_b32_e32 v2, v9, v7 651; SI-NEXT: v_lshlrev_b32_e32 v3, v8, v6 652; SI-NEXT: v_and_b32_e32 v1, 0xffff, v1 653; SI-NEXT: v_and_b32_e32 v0, 0xffff, v0 654; SI-NEXT: v_lshlrev_b32_e32 v2, 16, v2 655; SI-NEXT: v_lshlrev_b32_e32 v3, 16, v3 656; SI-NEXT: v_or_b32_e32 v1, v1, v2 657; SI-NEXT: v_or_b32_e32 v0, v0, v3 658; SI-NEXT: buffer_store_dwordx2 v[0:1], v[4:5], s[0:3], 0 addr64 659; SI-NEXT: s_endpgm 660; 661; VI-LABEL: shl_v4i16: 662; VI: ; %bb.0: 663; VI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 664; VI-NEXT: v_lshlrev_b32_e32 v4, 3, v0 665; VI-NEXT: s_waitcnt lgkmcnt(0) 666; VI-NEXT: v_mov_b32_e32 v1, s3 667; VI-NEXT: v_add_u32_e32 v0, vcc, s2, v4 668; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 669; VI-NEXT: flat_load_dwordx4 v[0:3], v[0:1] 670; VI-NEXT: v_mov_b32_e32 v5, s1 671; VI-NEXT: v_add_u32_e32 v4, vcc, s0, v4 672; VI-NEXT: v_addc_u32_e32 v5, vcc, 0, v5, vcc 673; VI-NEXT: s_waitcnt vmcnt(0) 674; VI-NEXT: v_lshlrev_b16_e32 v6, v3, v1 675; VI-NEXT: v_lshlrev_b16_sdwa v1, v3, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 676; VI-NEXT: v_lshlrev_b16_e32 v3, v2, v0 677; VI-NEXT: v_lshlrev_b16_sdwa v0, v2, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 678; VI-NEXT: v_or_b32_e32 v1, v6, v1 679; VI-NEXT: v_or_b32_e32 v0, v3, v0 680; VI-NEXT: flat_store_dwordx2 v[4:5], v[0:1] 681; VI-NEXT: s_endpgm 682; 683; EG-LABEL: shl_v4i16: 684; EG: ; %bb.0: 685; EG-NEXT: ALU 2, @8, KC0[CB0:0-32], KC1[] 686; EG-NEXT: TEX 0 @6 687; EG-NEXT: ALU 53, @11, KC0[CB0:0-32], KC1[] 688; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T10.XY, T0.X, 1 689; EG-NEXT: CF_END 690; EG-NEXT: PAD 691; EG-NEXT: Fetch clause starting at 6: 692; EG-NEXT: VTX_READ_128 T10.XYZW, T0.X, 0, #1 693; EG-NEXT: ALU clause starting at 8: 694; EG-NEXT: LSHL * T0.W, T0.X, literal.x, 695; EG-NEXT: 3(4.203895e-45), 0(0.000000e+00) 696; EG-NEXT: ADD_INT * T0.X, KC0[2].Z, PV.W, 697; EG-NEXT: ALU clause starting at 11: 698; EG-NEXT: MOV T4.X, T10.X, 699; EG-NEXT: MOV * T5.X, T10.Y, 700; EG-NEXT: MOV T0.X, PV.X, 701; EG-NEXT: MOV T0.Y, PS, 702; EG-NEXT: MOV * T2.X, T10.Z, 703; EG-NEXT: MOV T3.X, T10.W, 704; EG-NEXT: MOV * T0.Z, T6.X, 705; EG-NEXT: MOV * T1.Y, T2.X, 706; EG-NEXT: AND_INT T1.W, PV.Y, literal.x, 707; EG-NEXT: AND_INT * T2.W, T0.X, literal.x, 708; EG-NEXT: 65535(9.183409e-41), 0(0.000000e+00) 709; EG-NEXT: LSHL * T1.W, PS, PV.W, 710; EG-NEXT: AND_INT T1.W, PV.W, literal.x, 711; EG-NEXT: AND_INT * T2.W, T0.Z, literal.y, 712; EG-NEXT: 65535(9.183409e-41), -65536(nan) 713; EG-NEXT: OR_INT * T1.W, PS, PV.W, 714; EG-NEXT: MOV * T0.Z, T3.X, 715; EG-NEXT: MOV * T6.X, T1.W, 716; EG-NEXT: MOV T1.Z, PV.X, 717; EG-NEXT: LSHR T1.W, T1.Y, literal.x, 718; EG-NEXT: LSHR * T2.W, T0.X, literal.x, 719; EG-NEXT: 16(2.242078e-44), 0(0.000000e+00) 720; EG-NEXT: LSHL T1.W, PS, PV.W, 721; EG-NEXT: AND_INT * T2.W, PV.Z, literal.x, 722; EG-NEXT: 65535(9.183409e-41), 0(0.000000e+00) 723; EG-NEXT: LSHL * T1.W, PV.W, literal.x, 724; EG-NEXT: 16(2.242078e-44), 0(0.000000e+00) 725; EG-NEXT: OR_INT * T1.W, T2.W, PV.W, 726; EG-NEXT: MOV T6.X, PV.W, 727; EG-NEXT: MOV * T0.X, T7.X, 728; EG-NEXT: AND_INT T1.W, T0.Z, literal.x, 729; EG-NEXT: AND_INT * T2.W, T0.Y, literal.x, 730; EG-NEXT: 65535(9.183409e-41), 0(0.000000e+00) 731; EG-NEXT: LSHL T1.W, PS, PV.W, 732; EG-NEXT: AND_INT * T2.W, T0.X, literal.x, 733; EG-NEXT: -65536(nan), 0(0.000000e+00) 734; EG-NEXT: AND_INT * T1.W, PV.W, literal.x, 735; EG-NEXT: 65535(9.183409e-41), 0(0.000000e+00) 736; EG-NEXT: OR_INT * T1.W, T2.W, PV.W, 737; EG-NEXT: MOV * T7.X, PV.W, 738; EG-NEXT: MOV T0.X, PV.X, 739; EG-NEXT: LSHR T1.W, T0.Z, literal.x, 740; EG-NEXT: LSHR * T2.W, T0.Y, literal.x, 741; EG-NEXT: 16(2.242078e-44), 0(0.000000e+00) 742; EG-NEXT: LSHL * T1.W, PS, PV.W, 743; EG-NEXT: AND_INT T0.Z, T0.X, literal.x, 744; EG-NEXT: LSHL T1.W, PV.W, literal.y, 745; EG-NEXT: ADD_INT * T0.W, KC0[2].Y, T0.W, 746; EG-NEXT: 65535(9.183409e-41), 16(2.242078e-44) 747; EG-NEXT: LSHR T0.X, PS, literal.x, 748; EG-NEXT: OR_INT * T10.Y, PV.Z, PV.W, 749; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 750; EG-NEXT: MOV T7.X, PV.Y, 751; EG-NEXT: MOV * T10.X, T6.X, 752 %tid = call i32 @llvm.amdgcn.workitem.id.x() #0 753 %gep = getelementptr inbounds <4 x i16>, <4 x i16> addrspace(1)* %in, i32 %tid 754 %gep.out = getelementptr inbounds <4 x i16>, <4 x i16> addrspace(1)* %out, i32 %tid 755 %b_ptr = getelementptr <4 x i16>, <4 x i16> addrspace(1)* %gep, i16 1 756 %a = load <4 x i16>, <4 x i16> addrspace(1)* %gep 757 %b = load <4 x i16>, <4 x i16> addrspace(1)* %b_ptr 758 %result = shl <4 x i16> %a, %b 759 store <4 x i16> %result, <4 x i16> addrspace(1)* %gep.out 760 ret void 761} 762 763define amdgpu_kernel void @shl_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) { 764; SI-LABEL: shl_i64: 765; SI: ; %bb.0: 766; SI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 767; SI-NEXT: s_mov_b32 s7, 0xf000 768; SI-NEXT: s_mov_b32 s6, -1 769; SI-NEXT: s_mov_b32 s10, s6 770; SI-NEXT: s_mov_b32 s11, s7 771; SI-NEXT: s_waitcnt lgkmcnt(0) 772; SI-NEXT: s_mov_b32 s8, s2 773; SI-NEXT: s_mov_b32 s9, s3 774; SI-NEXT: buffer_load_dwordx4 v[0:3], off, s[8:11], 0 775; SI-NEXT: s_mov_b32 s4, s0 776; SI-NEXT: s_mov_b32 s5, s1 777; SI-NEXT: s_waitcnt vmcnt(0) 778; SI-NEXT: v_lshl_b64 v[0:1], v[0:1], v2 779; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0 780; SI-NEXT: s_endpgm 781; 782; VI-LABEL: shl_i64: 783; VI: ; %bb.0: 784; VI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 785; VI-NEXT: s_waitcnt lgkmcnt(0) 786; VI-NEXT: s_load_dwordx4 s[4:7], s[2:3], 0x0 787; VI-NEXT: s_mov_b32 s3, 0xf000 788; VI-NEXT: s_mov_b32 s2, -1 789; VI-NEXT: s_waitcnt lgkmcnt(0) 790; VI-NEXT: s_lshl_b64 s[4:5], s[4:5], s6 791; VI-NEXT: v_mov_b32_e32 v0, s4 792; VI-NEXT: v_mov_b32_e32 v1, s5 793; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 794; VI-NEXT: s_endpgm 795; 796; EG-LABEL: shl_i64: 797; EG: ; %bb.0: 798; EG-NEXT: ALU 0, @8, KC0[CB0:0-32], KC1[] 799; EG-NEXT: TEX 0 @6 800; EG-NEXT: ALU 12, @9, KC0[CB0:0-32], KC1[] 801; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 802; EG-NEXT: CF_END 803; EG-NEXT: PAD 804; EG-NEXT: Fetch clause starting at 6: 805; EG-NEXT: VTX_READ_128 T0.XYZW, T0.X, 0, #1 806; EG-NEXT: ALU clause starting at 8: 807; EG-NEXT: MOV * T0.X, KC0[2].Z, 808; EG-NEXT: ALU clause starting at 9: 809; EG-NEXT: AND_INT T1.Y, T0.Z, literal.x, 810; EG-NEXT: LSHR T1.Z, T0.Y, 1, 811; EG-NEXT: BIT_ALIGN_INT T0.W, T0.Y, T0.X, 1, 812; EG-NEXT: NOT_INT * T1.W, T0.Z, 813; EG-NEXT: 31(4.344025e-44), 0(0.000000e+00) 814; EG-NEXT: BIT_ALIGN_INT T1.Z, PV.Z, PV.W, PS, 815; EG-NEXT: LSHL T0.W, T0.X, PV.Y, 816; EG-NEXT: AND_INT * T1.W, T0.Z, literal.x, 817; EG-NEXT: 32(4.484155e-44), 0(0.000000e+00) 818; EG-NEXT: CNDE_INT * T0.Y, PS, PV.Z, PV.W, 819; EG-NEXT: CNDE_INT T0.X, T1.W, T0.W, 0.0, 820; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 821; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 822 %b_ptr = getelementptr i64, i64 addrspace(1)* %in, i64 1 823 %a = load i64, i64 addrspace(1)* %in 824 %b = load i64, i64 addrspace(1)* %b_ptr 825 %result = shl i64 %a, %b 826 store i64 %result, i64 addrspace(1)* %out 827 ret void 828} 829 830define amdgpu_kernel void @shl_v2i64(<2 x i64> addrspace(1)* %out, <2 x i64> addrspace(1)* %in) { 831; SI-LABEL: shl_v2i64: 832; SI: ; %bb.0: 833; SI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 834; SI-NEXT: s_mov_b32 s7, 0xf000 835; SI-NEXT: s_mov_b32 s6, -1 836; SI-NEXT: s_mov_b32 s10, s6 837; SI-NEXT: s_mov_b32 s11, s7 838; SI-NEXT: s_waitcnt lgkmcnt(0) 839; SI-NEXT: s_mov_b32 s8, s2 840; SI-NEXT: s_mov_b32 s9, s3 841; SI-NEXT: buffer_load_dwordx4 v[0:3], off, s[8:11], 0 842; SI-NEXT: buffer_load_dwordx4 v[4:7], off, s[8:11], 0 offset:16 843; SI-NEXT: s_mov_b32 s4, s0 844; SI-NEXT: s_mov_b32 s5, s1 845; SI-NEXT: s_waitcnt vmcnt(0) 846; SI-NEXT: v_lshl_b64 v[2:3], v[2:3], v6 847; SI-NEXT: v_lshl_b64 v[0:1], v[0:1], v4 848; SI-NEXT: buffer_store_dwordx4 v[0:3], off, s[4:7], 0 849; SI-NEXT: s_endpgm 850; 851; VI-LABEL: shl_v2i64: 852; VI: ; %bb.0: 853; VI-NEXT: s_load_dwordx4 s[8:11], s[0:1], 0x24 854; VI-NEXT: s_waitcnt lgkmcnt(0) 855; VI-NEXT: s_load_dwordx8 s[0:7], s[10:11], 0x0 856; VI-NEXT: s_mov_b32 s11, 0xf000 857; VI-NEXT: s_mov_b32 s10, -1 858; VI-NEXT: s_waitcnt lgkmcnt(0) 859; VI-NEXT: s_lshl_b64 s[2:3], s[2:3], s6 860; VI-NEXT: s_lshl_b64 s[0:1], s[0:1], s4 861; VI-NEXT: v_mov_b32_e32 v0, s0 862; VI-NEXT: v_mov_b32_e32 v1, s1 863; VI-NEXT: v_mov_b32_e32 v2, s2 864; VI-NEXT: v_mov_b32_e32 v3, s3 865; VI-NEXT: buffer_store_dwordx4 v[0:3], off, s[8:11], 0 866; VI-NEXT: s_endpgm 867; 868; EG-LABEL: shl_v2i64: 869; EG: ; %bb.0: 870; EG-NEXT: ALU 0, @10, KC0[CB0:0-32], KC1[] 871; EG-NEXT: TEX 1 @6 872; EG-NEXT: ALU 22, @11, KC0[CB0:0-32], KC1[] 873; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T3.XYZW, T0.X, 1 874; EG-NEXT: CF_END 875; EG-NEXT: PAD 876; EG-NEXT: Fetch clause starting at 6: 877; EG-NEXT: VTX_READ_128 T1.XYZW, T0.X, 16, #1 878; EG-NEXT: VTX_READ_128 T0.XYZW, T0.X, 0, #1 879; EG-NEXT: ALU clause starting at 10: 880; EG-NEXT: MOV * T0.X, KC0[2].Z, 881; EG-NEXT: ALU clause starting at 11: 882; EG-NEXT: AND_INT T1.Y, T1.Z, literal.x, 883; EG-NEXT: LSHR T2.Z, T0.W, 1, 884; EG-NEXT: BIT_ALIGN_INT T0.W, T0.W, T0.Z, 1, 885; EG-NEXT: NOT_INT * T1.W, T1.Z, 886; EG-NEXT: 31(4.344025e-44), 0(0.000000e+00) 887; EG-NEXT: BIT_ALIGN_INT T0.W, PV.Z, PV.W, PS, 888; EG-NEXT: LSHL * T1.W, T0.Z, PV.Y, 889; EG-NEXT: AND_INT T2.X, T1.Z, literal.x, 890; EG-NEXT: AND_INT T1.Y, T1.X, literal.y, 891; EG-NEXT: LSHR T0.Z, T0.Y, 1, 892; EG-NEXT: BIT_ALIGN_INT T2.W, T0.Y, T0.X, 1, 893; EG-NEXT: NOT_INT * T3.W, T1.X, 894; EG-NEXT: 32(4.484155e-44), 31(4.344025e-44) 895; EG-NEXT: BIT_ALIGN_INT T0.Y, PV.Z, PV.W, PS, 896; EG-NEXT: LSHL T0.Z, T0.X, PV.Y, 897; EG-NEXT: AND_INT T2.W, T1.X, literal.x, BS:VEC_120/SCL_212 898; EG-NEXT: CNDE_INT * T3.W, PV.X, T0.W, T1.W, 899; EG-NEXT: 32(4.484155e-44), 0(0.000000e+00) 900; EG-NEXT: CNDE_INT T3.Y, PV.W, PV.Y, PV.Z, 901; EG-NEXT: CNDE_INT * T3.Z, T2.X, T1.W, 0.0, 902; EG-NEXT: CNDE_INT T3.X, T2.W, T0.Z, 0.0, 903; EG-NEXT: LSHR * T0.X, KC0[2].Y, literal.x, 904; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 905 %b_ptr = getelementptr <2 x i64>, <2 x i64> addrspace(1)* %in, i64 1 906 %a = load <2 x i64>, <2 x i64> addrspace(1)* %in 907 %b = load <2 x i64>, <2 x i64> addrspace(1)* %b_ptr 908 %result = shl <2 x i64> %a, %b 909 store <2 x i64> %result, <2 x i64> addrspace(1)* %out 910 ret void 911} 912 913define amdgpu_kernel void @shl_v4i64(<4 x i64> addrspace(1)* %out, <4 x i64> addrspace(1)* %in) { 914; SI-LABEL: shl_v4i64: 915; SI: ; %bb.0: 916; SI-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 917; SI-NEXT: s_mov_b32 s3, 0xf000 918; SI-NEXT: s_mov_b32 s2, -1 919; SI-NEXT: s_mov_b32 s10, s2 920; SI-NEXT: s_mov_b32 s11, s3 921; SI-NEXT: s_waitcnt lgkmcnt(0) 922; SI-NEXT: s_mov_b32 s8, s6 923; SI-NEXT: s_mov_b32 s9, s7 924; SI-NEXT: buffer_load_dwordx4 v[0:3], off, s[8:11], 0 offset:16 925; SI-NEXT: buffer_load_dwordx4 v[4:7], off, s[8:11], 0 offset:48 926; SI-NEXT: buffer_load_dwordx4 v[7:10], off, s[8:11], 0 927; SI-NEXT: buffer_load_dwordx4 v[11:14], off, s[8:11], 0 offset:32 928; SI-NEXT: s_mov_b32 s0, s4 929; SI-NEXT: s_mov_b32 s1, s5 930; SI-NEXT: s_waitcnt vmcnt(2) 931; SI-NEXT: v_lshl_b64 v[2:3], v[2:3], v6 932; SI-NEXT: v_lshl_b64 v[0:1], v[0:1], v4 933; SI-NEXT: s_waitcnt vmcnt(0) 934; SI-NEXT: v_lshl_b64 v[9:10], v[9:10], v13 935; SI-NEXT: v_lshl_b64 v[7:8], v[7:8], v11 936; SI-NEXT: buffer_store_dwordx4 v[0:3], off, s[0:3], 0 offset:16 937; SI-NEXT: buffer_store_dwordx4 v[7:10], off, s[0:3], 0 938; SI-NEXT: s_endpgm 939; 940; VI-LABEL: shl_v4i64: 941; VI: ; %bb.0: 942; VI-NEXT: s_load_dwordx4 s[16:19], s[0:1], 0x24 943; VI-NEXT: s_waitcnt lgkmcnt(0) 944; VI-NEXT: s_load_dwordx16 s[0:15], s[18:19], 0x0 945; VI-NEXT: s_mov_b32 s19, 0xf000 946; VI-NEXT: s_mov_b32 s18, -1 947; VI-NEXT: s_waitcnt lgkmcnt(0) 948; VI-NEXT: s_lshl_b64 s[6:7], s[6:7], s14 949; VI-NEXT: s_lshl_b64 s[4:5], s[4:5], s12 950; VI-NEXT: s_lshl_b64 s[2:3], s[2:3], s10 951; VI-NEXT: s_lshl_b64 s[0:1], s[0:1], s8 952; VI-NEXT: v_mov_b32_e32 v0, s4 953; VI-NEXT: v_mov_b32_e32 v1, s5 954; VI-NEXT: v_mov_b32_e32 v2, s6 955; VI-NEXT: v_mov_b32_e32 v3, s7 956; VI-NEXT: buffer_store_dwordx4 v[0:3], off, s[16:19], 0 offset:16 957; VI-NEXT: s_nop 0 958; VI-NEXT: v_mov_b32_e32 v0, s0 959; VI-NEXT: v_mov_b32_e32 v1, s1 960; VI-NEXT: v_mov_b32_e32 v2, s2 961; VI-NEXT: v_mov_b32_e32 v3, s3 962; VI-NEXT: buffer_store_dwordx4 v[0:3], off, s[16:19], 0 963; VI-NEXT: s_endpgm 964; 965; EG-LABEL: shl_v4i64: 966; EG: ; %bb.0: 967; EG-NEXT: ALU 0, @14, KC0[CB0:0-32], KC1[] 968; EG-NEXT: TEX 3 @6 969; EG-NEXT: ALU 47, @15, KC0[CB0:0-32], KC1[] 970; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T1.XYZW, T2.X, 0 971; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T4.XYZW, T0.X, 1 972; EG-NEXT: CF_END 973; EG-NEXT: Fetch clause starting at 6: 974; EG-NEXT: VTX_READ_128 T1.XYZW, T0.X, 48, #1 975; EG-NEXT: VTX_READ_128 T2.XYZW, T0.X, 0, #1 976; EG-NEXT: VTX_READ_128 T3.XYZW, T0.X, 32, #1 977; EG-NEXT: VTX_READ_128 T0.XYZW, T0.X, 16, #1 978; EG-NEXT: ALU clause starting at 14: 979; EG-NEXT: MOV * T0.X, KC0[2].Z, 980; EG-NEXT: ALU clause starting at 15: 981; EG-NEXT: AND_INT T4.Z, T1.Z, literal.x, 982; EG-NEXT: LSHR T1.W, T0.W, 1, 983; EG-NEXT: NOT_INT * T3.W, T1.Z, 984; EG-NEXT: 31(4.344025e-44), 0(0.000000e+00) 985; EG-NEXT: BIT_ALIGN_INT T4.X, T0.W, T0.Z, 1, 986; EG-NEXT: AND_INT T1.Y, T3.Z, literal.x, BS:VEC_201 987; EG-NEXT: LSHR T5.Z, T2.W, 1, BS:VEC_120/SCL_212 988; EG-NEXT: BIT_ALIGN_INT T0.W, T2.W, T2.Z, 1, BS:VEC_102/SCL_221 989; EG-NEXT: NOT_INT * T2.W, T3.Z, 990; EG-NEXT: 31(4.344025e-44), 0(0.000000e+00) 991; EG-NEXT: BIT_ALIGN_INT T3.Y, PV.Z, PV.W, PS, 992; EG-NEXT: LSHL T2.Z, T2.Z, PV.Y, 993; EG-NEXT: BIT_ALIGN_INT T0.W, T1.W, PV.X, T3.W, 994; EG-NEXT: LSHL * T1.W, T0.Z, T4.Z, 995; EG-NEXT: AND_INT T4.X, T1.Z, literal.x, 996; EG-NEXT: AND_INT T1.Y, T1.X, literal.y, 997; EG-NEXT: LSHR T0.Z, T0.Y, 1, 998; EG-NEXT: BIT_ALIGN_INT T2.W, T0.Y, T0.X, 1, 999; EG-NEXT: NOT_INT * T3.W, T1.X, 1000; EG-NEXT: 32(4.484155e-44), 31(4.344025e-44) 1001; EG-NEXT: AND_INT T5.X, T3.Z, literal.x, 1002; EG-NEXT: BIT_ALIGN_INT T0.Y, PV.Z, PV.W, PS, 1003; EG-NEXT: LSHL T0.Z, T0.X, PV.Y, 1004; EG-NEXT: AND_INT T2.W, T1.X, literal.x, BS:VEC_120/SCL_212 1005; EG-NEXT: CNDE_INT * T4.W, PV.X, T0.W, T1.W, 1006; EG-NEXT: 32(4.484155e-44), 0(0.000000e+00) 1007; EG-NEXT: AND_INT T0.X, T3.X, literal.x, 1008; EG-NEXT: CNDE_INT T4.Y, PV.W, PV.Y, PV.Z, 1009; EG-NEXT: LSHR T1.Z, T2.Y, 1, 1010; EG-NEXT: BIT_ALIGN_INT T0.W, T2.Y, T2.X, 1, 1011; EG-NEXT: NOT_INT * T3.W, T3.X, 1012; EG-NEXT: 31(4.344025e-44), 0(0.000000e+00) 1013; EG-NEXT: BIT_ALIGN_INT T1.X, PV.Z, PV.W, PS, 1014; EG-NEXT: LSHL T0.Y, T2.X, PV.X, 1015; EG-NEXT: CNDE_INT T4.Z, T4.X, T1.W, 0.0, BS:VEC_120/SCL_212 1016; EG-NEXT: AND_INT * T0.W, T3.X, literal.x, BS:VEC_201 1017; EG-NEXT: 32(4.484155e-44), 0(0.000000e+00) 1018; EG-NEXT: CNDE_INT * T1.W, T5.X, T3.Y, T2.Z, 1019; EG-NEXT: CNDE_INT T4.X, T2.W, T0.Z, 0.0, 1020; EG-NEXT: CNDE_INT T1.Y, T0.W, T1.X, T0.Y, BS:VEC_120/SCL_212 1021; EG-NEXT: ADD_INT * T2.W, KC0[2].Y, literal.x, 1022; EG-NEXT: 16(2.242078e-44), 0(0.000000e+00) 1023; EG-NEXT: LSHR T0.X, PV.W, literal.x, 1024; EG-NEXT: CNDE_INT T1.Z, T5.X, T2.Z, 0.0, 1025; EG-NEXT: CNDE_INT * T1.X, T0.W, T0.Y, 0.0, 1026; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1027; EG-NEXT: LSHR * T2.X, KC0[2].Y, literal.x, 1028; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1029 %b_ptr = getelementptr <4 x i64>, <4 x i64> addrspace(1)* %in, i64 1 1030 %a = load <4 x i64>, <4 x i64> addrspace(1)* %in 1031 %b = load <4 x i64>, <4 x i64> addrspace(1)* %b_ptr 1032 %result = shl <4 x i64> %a, %b 1033 store <4 x i64> %result, <4 x i64> addrspace(1)* %out 1034 ret void 1035} 1036 1037; Make sure load width gets reduced to i32 load. 1038define amdgpu_kernel void @s_shl_32_i64(i64 addrspace(1)* %out, [8 x i32], i64 %a) { 1039; SI-LABEL: s_shl_32_i64: 1040; SI: ; %bb.0: 1041; SI-NEXT: s_load_dword s4, s[0:1], 0x13 1042; SI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 1043; SI-NEXT: s_mov_b32 s3, 0xf000 1044; SI-NEXT: s_mov_b32 s2, -1 1045; SI-NEXT: v_mov_b32_e32 v0, 0 1046; SI-NEXT: s_waitcnt lgkmcnt(0) 1047; SI-NEXT: v_mov_b32_e32 v1, s4 1048; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1049; SI-NEXT: s_endpgm 1050; 1051; VI-LABEL: s_shl_32_i64: 1052; VI: ; %bb.0: 1053; VI-NEXT: s_load_dword s4, s[0:1], 0x4c 1054; VI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1055; VI-NEXT: s_mov_b32 s3, 0xf000 1056; VI-NEXT: s_mov_b32 s2, -1 1057; VI-NEXT: v_mov_b32_e32 v0, 0 1058; VI-NEXT: s_waitcnt lgkmcnt(0) 1059; VI-NEXT: v_mov_b32_e32 v1, s4 1060; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1061; VI-NEXT: s_endpgm 1062; 1063; EG-LABEL: s_shl_32_i64: 1064; EG: ; %bb.0: 1065; EG-NEXT: ALU 3, @4, KC0[CB0:0-32], KC1[] 1066; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 1067; EG-NEXT: CF_END 1068; EG-NEXT: PAD 1069; EG-NEXT: ALU clause starting at 4: 1070; EG-NEXT: MOV * T0.Y, KC0[4].W, 1071; EG-NEXT: MOV T0.X, 0.0, 1072; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 1073; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1074 %result = shl i64 %a, 32 1075 store i64 %result, i64 addrspace(1)* %out 1076 ret void 1077} 1078 1079define amdgpu_kernel void @v_shl_32_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %in) { 1080; SI-LABEL: v_shl_32_i64: 1081; SI: ; %bb.0: 1082; SI-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 1083; SI-NEXT: s_ashr_i32 s3, s2, 31 1084; SI-NEXT: s_lshl_b64 s[0:1], s[2:3], 3 1085; SI-NEXT: v_mov_b32_e32 v0, s0 1086; SI-NEXT: s_mov_b32 s11, 0xf000 1087; SI-NEXT: s_mov_b32 s10, 0 1088; SI-NEXT: s_waitcnt lgkmcnt(0) 1089; SI-NEXT: s_mov_b64 s[8:9], s[6:7] 1090; SI-NEXT: v_mov_b32_e32 v1, s1 1091; SI-NEXT: buffer_load_dword v3, v[0:1], s[8:11], 0 addr64 1092; SI-NEXT: s_mov_b64 s[6:7], s[10:11] 1093; SI-NEXT: v_mov_b32_e32 v2, 0 1094; SI-NEXT: s_waitcnt vmcnt(0) 1095; SI-NEXT: buffer_store_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64 1096; SI-NEXT: s_endpgm 1097; 1098; VI-LABEL: v_shl_32_i64: 1099; VI: ; %bb.0: 1100; VI-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 1101; VI-NEXT: s_ashr_i32 s3, s2, 31 1102; VI-NEXT: s_lshl_b64 s[0:1], s[2:3], 3 1103; VI-NEXT: v_mov_b32_e32 v0, 0 1104; VI-NEXT: s_waitcnt lgkmcnt(0) 1105; VI-NEXT: s_add_u32 s2, s6, s0 1106; VI-NEXT: s_addc_u32 s3, s7, s1 1107; VI-NEXT: s_load_dword s2, s[2:3], 0x0 1108; VI-NEXT: s_add_u32 s0, s4, s0 1109; VI-NEXT: s_addc_u32 s1, s5, s1 1110; VI-NEXT: v_mov_b32_e32 v3, s1 1111; VI-NEXT: v_mov_b32_e32 v2, s0 1112; VI-NEXT: s_waitcnt lgkmcnt(0) 1113; VI-NEXT: v_mov_b32_e32 v1, s2 1114; VI-NEXT: flat_store_dwordx2 v[2:3], v[0:1] 1115; VI-NEXT: s_endpgm 1116; 1117; EG-LABEL: v_shl_32_i64: 1118; EG: ; %bb.0: 1119; EG-NEXT: ALU 2, @8, KC0[CB0:0-32], KC1[] 1120; EG-NEXT: TEX 0 @6 1121; EG-NEXT: ALU 4, @11, KC0[CB0:0-32], KC1[] 1122; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T1.XY, T2.X, 1 1123; EG-NEXT: CF_END 1124; EG-NEXT: PAD 1125; EG-NEXT: Fetch clause starting at 6: 1126; EG-NEXT: VTX_READ_32 T0.X, T0.X, 0, #1 1127; EG-NEXT: ALU clause starting at 8: 1128; EG-NEXT: LSHL * T0.W, T1.X, literal.x, 1129; EG-NEXT: 3(4.203895e-45), 0(0.000000e+00) 1130; EG-NEXT: ADD_INT * T0.X, KC0[2].Z, PV.W, 1131; EG-NEXT: ALU clause starting at 11: 1132; EG-NEXT: MOV T1.X, 0.0, 1133; EG-NEXT: ADD_INT * T0.W, KC0[2].Y, T0.W, 1134; EG-NEXT: LSHR T2.X, PV.W, literal.x, 1135; EG-NEXT: MOV * T1.Y, T0.X, 1136; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1137 %tid = call i32 @llvm.amdgcn.workgroup.id.x() #0 1138 %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid 1139 %gep.out = getelementptr i64, i64 addrspace(1)* %out, i32 %tid 1140 %a = load i64, i64 addrspace(1)* %gep.in 1141 %result = shl i64 %a, 32 1142 store i64 %result, i64 addrspace(1)* %gep.out 1143 ret void 1144} 1145 1146define amdgpu_kernel void @s_shl_constant_i64(i64 addrspace(1)* %out, i64 %a) { 1147; SI-LABEL: s_shl_constant_i64: 1148; SI: ; %bb.0: 1149; SI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 1150; SI-NEXT: s_mov_b32 s6, -1 1151; SI-NEXT: s_mov_b32 s9, 0xffff 1152; SI-NEXT: s_mov_b32 s8, s6 1153; SI-NEXT: s_mov_b32 s7, 0xf000 1154; SI-NEXT: s_waitcnt lgkmcnt(0) 1155; SI-NEXT: s_mov_b32 s4, s0 1156; SI-NEXT: s_mov_b32 s5, s1 1157; SI-NEXT: s_lshl_b64 s[0:1], s[8:9], s2 1158; SI-NEXT: v_mov_b32_e32 v0, s0 1159; SI-NEXT: v_mov_b32_e32 v1, s1 1160; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0 1161; SI-NEXT: s_endpgm 1162; 1163; VI-LABEL: s_shl_constant_i64: 1164; VI: ; %bb.0: 1165; VI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1166; VI-NEXT: s_mov_b32 s6, -1 1167; VI-NEXT: s_mov_b32 s9, 0xffff 1168; VI-NEXT: s_mov_b32 s8, s6 1169; VI-NEXT: s_mov_b32 s7, 0xf000 1170; VI-NEXT: s_waitcnt lgkmcnt(0) 1171; VI-NEXT: s_mov_b32 s4, s0 1172; VI-NEXT: s_mov_b32 s5, s1 1173; VI-NEXT: s_lshl_b64 s[0:1], s[8:9], s2 1174; VI-NEXT: v_mov_b32_e32 v0, s0 1175; VI-NEXT: v_mov_b32_e32 v1, s1 1176; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0 1177; VI-NEXT: s_endpgm 1178; 1179; EG-LABEL: s_shl_constant_i64: 1180; EG: ; %bb.0: 1181; EG-NEXT: ALU 12, @4, KC0[CB0:0-32], KC1[] 1182; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 1183; EG-NEXT: CF_END 1184; EG-NEXT: PAD 1185; EG-NEXT: ALU clause starting at 4: 1186; EG-NEXT: AND_INT T0.Z, KC0[2].W, literal.x, 1187; EG-NEXT: MOV T0.W, literal.y, 1188; EG-NEXT: NOT_INT * T1.W, KC0[2].W, 1189; EG-NEXT: 31(4.344025e-44), -1(nan) 1190; EG-NEXT: BIT_ALIGN_INT T1.Z, literal.x, PV.W, PS, 1191; EG-NEXT: LSHL T0.W, literal.y, PV.Z, 1192; EG-NEXT: AND_INT * T1.W, KC0[2].W, literal.z, 1193; EG-NEXT: 32767(4.591635e-41), -1(nan) 1194; EG-NEXT: 32(4.484155e-44), 0(0.000000e+00) 1195; EG-NEXT: CNDE_INT * T0.Y, PS, PV.Z, PV.W, 1196; EG-NEXT: CNDE_INT T0.X, T1.W, T0.W, 0.0, 1197; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 1198; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1199 %shl = shl i64 281474976710655, %a 1200 store i64 %shl, i64 addrspace(1)* %out, align 8 1201 ret void 1202} 1203 1204define amdgpu_kernel void @v_shl_constant_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr) { 1205; SI-LABEL: v_shl_constant_i64: 1206; SI: ; %bb.0: 1207; SI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 1208; SI-NEXT: s_mov_b32 s7, 0xf000 1209; SI-NEXT: s_mov_b32 s6, -1 1210; SI-NEXT: s_mov_b32 s10, s6 1211; SI-NEXT: s_mov_b32 s11, s7 1212; SI-NEXT: s_waitcnt lgkmcnt(0) 1213; SI-NEXT: s_mov_b32 s8, s2 1214; SI-NEXT: s_mov_b32 s9, s3 1215; SI-NEXT: buffer_load_dword v0, off, s[8:11], 0 1216; SI-NEXT: s_mov_b32 s2, 0xab19b207 1217; SI-NEXT: s_movk_i32 s3, 0x11e 1218; SI-NEXT: s_mov_b32 s4, s0 1219; SI-NEXT: s_mov_b32 s5, s1 1220; SI-NEXT: s_waitcnt vmcnt(0) 1221; SI-NEXT: v_lshl_b64 v[0:1], s[2:3], v0 1222; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0 1223; SI-NEXT: s_endpgm 1224; 1225; VI-LABEL: v_shl_constant_i64: 1226; VI: ; %bb.0: 1227; VI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1228; VI-NEXT: s_mov_b32 s7, 0xf000 1229; VI-NEXT: s_mov_b32 s6, -1 1230; VI-NEXT: s_waitcnt lgkmcnt(0) 1231; VI-NEXT: s_load_dword s2, s[2:3], 0x0 1232; VI-NEXT: s_mov_b32 s4, s0 1233; VI-NEXT: s_mov_b32 s5, s1 1234; VI-NEXT: s_mov_b32 s0, 0xab19b207 1235; VI-NEXT: s_movk_i32 s1, 0x11e 1236; VI-NEXT: s_waitcnt lgkmcnt(0) 1237; VI-NEXT: s_lshl_b64 s[0:1], s[0:1], s2 1238; VI-NEXT: v_mov_b32_e32 v0, s0 1239; VI-NEXT: v_mov_b32_e32 v1, s1 1240; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0 1241; VI-NEXT: s_endpgm 1242; 1243; EG-LABEL: v_shl_constant_i64: 1244; EG: ; %bb.0: 1245; EG-NEXT: ALU 0, @8, KC0[CB0:0-32], KC1[] 1246; EG-NEXT: TEX 0 @6 1247; EG-NEXT: ALU 12, @9, KC0[CB0:0-32], KC1[] 1248; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 1249; EG-NEXT: CF_END 1250; EG-NEXT: PAD 1251; EG-NEXT: Fetch clause starting at 6: 1252; EG-NEXT: VTX_READ_32 T0.X, T0.X, 0, #1 1253; EG-NEXT: ALU clause starting at 8: 1254; EG-NEXT: MOV * T0.X, KC0[2].Z, 1255; EG-NEXT: ALU clause starting at 9: 1256; EG-NEXT: NOT_INT T0.Z, T0.X, 1257; EG-NEXT: MOV T0.W, literal.x, 1258; EG-NEXT: AND_INT * T1.W, T0.X, literal.y, 1259; EG-NEXT: 1435293955(1.935796e+13), 31(4.344025e-44) 1260; EG-NEXT: LSHL T1.Z, literal.x, PS, 1261; EG-NEXT: BIT_ALIGN_INT T0.W, literal.y, PV.W, PV.Z, 1262; EG-NEXT: AND_INT * T1.W, T0.X, literal.z, 1263; EG-NEXT: -1424379385(-5.460358e-13), 143(2.003857e-43) 1264; EG-NEXT: 32(4.484155e-44), 0(0.000000e+00) 1265; EG-NEXT: CNDE_INT * T0.Y, PS, PV.W, PV.Z, 1266; EG-NEXT: CNDE_INT T0.X, T1.W, T1.Z, 0.0, 1267; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 1268; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1269 %a = load i64, i64 addrspace(1)* %aptr, align 8 1270 %shl = shl i64 1231231234567, %a 1271 store i64 %shl, i64 addrspace(1)* %out, align 8 1272 ret void 1273} 1274 1275define amdgpu_kernel void @v_shl_i64_32_bit_constant(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr) { 1276; SI-LABEL: v_shl_i64_32_bit_constant: 1277; SI: ; %bb.0: 1278; SI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 1279; SI-NEXT: s_mov_b32 s7, 0xf000 1280; SI-NEXT: s_mov_b32 s6, -1 1281; SI-NEXT: s_mov_b32 s10, s6 1282; SI-NEXT: s_mov_b32 s11, s7 1283; SI-NEXT: s_waitcnt lgkmcnt(0) 1284; SI-NEXT: s_mov_b32 s8, s2 1285; SI-NEXT: s_mov_b32 s9, s3 1286; SI-NEXT: buffer_load_dword v0, off, s[8:11], 0 1287; SI-NEXT: s_mov_b64 s[2:3], 0x12d687 1288; SI-NEXT: s_mov_b32 s4, s0 1289; SI-NEXT: s_mov_b32 s5, s1 1290; SI-NEXT: s_waitcnt vmcnt(0) 1291; SI-NEXT: v_lshl_b64 v[0:1], s[2:3], v0 1292; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0 1293; SI-NEXT: s_endpgm 1294; 1295; VI-LABEL: v_shl_i64_32_bit_constant: 1296; VI: ; %bb.0: 1297; VI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1298; VI-NEXT: s_mov_b32 s7, 0xf000 1299; VI-NEXT: s_mov_b32 s6, -1 1300; VI-NEXT: s_waitcnt lgkmcnt(0) 1301; VI-NEXT: s_load_dword s2, s[2:3], 0x0 1302; VI-NEXT: s_mov_b32 s4, s0 1303; VI-NEXT: s_mov_b32 s5, s1 1304; VI-NEXT: s_mov_b64 s[0:1], 0x12d687 1305; VI-NEXT: s_waitcnt lgkmcnt(0) 1306; VI-NEXT: s_lshl_b64 s[0:1], s[0:1], s2 1307; VI-NEXT: v_mov_b32_e32 v0, s0 1308; VI-NEXT: v_mov_b32_e32 v1, s1 1309; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0 1310; VI-NEXT: s_endpgm 1311; 1312; EG-LABEL: v_shl_i64_32_bit_constant: 1313; EG: ; %bb.0: 1314; EG-NEXT: ALU 0, @8, KC0[CB0:0-32], KC1[] 1315; EG-NEXT: TEX 0 @6 1316; EG-NEXT: ALU 11, @9, KC0[CB0:0-32], KC1[] 1317; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 1318; EG-NEXT: CF_END 1319; EG-NEXT: PAD 1320; EG-NEXT: Fetch clause starting at 6: 1321; EG-NEXT: VTX_READ_32 T0.X, T0.X, 0, #1 1322; EG-NEXT: ALU clause starting at 8: 1323; EG-NEXT: MOV * T0.X, KC0[2].Z, 1324; EG-NEXT: ALU clause starting at 9: 1325; EG-NEXT: AND_INT T0.W, T0.X, literal.x, 1326; EG-NEXT: NOT_INT * T1.W, T0.X, 1327; EG-NEXT: 31(4.344025e-44), 0(0.000000e+00) 1328; EG-NEXT: BIT_ALIGN_INT T0.Z, 0.0, literal.x, PS, 1329; EG-NEXT: LSHL T0.W, literal.y, PV.W, 1330; EG-NEXT: AND_INT * T1.W, T0.X, literal.z, 1331; EG-NEXT: 617283(8.649977e-40), 1234567(1.729997e-39) 1332; EG-NEXT: 32(4.484155e-44), 0(0.000000e+00) 1333; EG-NEXT: CNDE_INT * T0.Y, PS, PV.Z, PV.W, 1334; EG-NEXT: CNDE_INT T0.X, T1.W, T0.W, 0.0, 1335; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 1336; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1337 %a = load i64, i64 addrspace(1)* %aptr, align 8 1338 %shl = shl i64 1234567, %a 1339 store i64 %shl, i64 addrspace(1)* %out, align 8 1340 ret void 1341} 1342 1343define amdgpu_kernel void @v_shl_inline_imm_64_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr) { 1344; SI-LABEL: v_shl_inline_imm_64_i64: 1345; SI: ; %bb.0: 1346; SI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 1347; SI-NEXT: s_mov_b32 s7, 0xf000 1348; SI-NEXT: s_mov_b32 s6, -1 1349; SI-NEXT: s_mov_b32 s10, s6 1350; SI-NEXT: s_mov_b32 s11, s7 1351; SI-NEXT: s_waitcnt lgkmcnt(0) 1352; SI-NEXT: s_mov_b32 s8, s2 1353; SI-NEXT: s_mov_b32 s9, s3 1354; SI-NEXT: buffer_load_dword v0, off, s[8:11], 0 1355; SI-NEXT: s_mov_b32 s4, s0 1356; SI-NEXT: s_mov_b32 s5, s1 1357; SI-NEXT: s_waitcnt vmcnt(0) 1358; SI-NEXT: v_lshl_b64 v[0:1], 64, v0 1359; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0 1360; SI-NEXT: s_endpgm 1361; 1362; VI-LABEL: v_shl_inline_imm_64_i64: 1363; VI: ; %bb.0: 1364; VI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1365; VI-NEXT: s_waitcnt lgkmcnt(0) 1366; VI-NEXT: s_load_dword s4, s[2:3], 0x0 1367; VI-NEXT: s_mov_b32 s3, 0xf000 1368; VI-NEXT: s_mov_b32 s2, -1 1369; VI-NEXT: s_waitcnt lgkmcnt(0) 1370; VI-NEXT: s_lshl_b64 s[4:5], 64, s4 1371; VI-NEXT: v_mov_b32_e32 v0, s4 1372; VI-NEXT: v_mov_b32_e32 v1, s5 1373; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1374; VI-NEXT: s_endpgm 1375; 1376; EG-LABEL: v_shl_inline_imm_64_i64: 1377; EG: ; %bb.0: 1378; EG-NEXT: ALU 0, @8, KC0[CB0:0-32], KC1[] 1379; EG-NEXT: TEX 0 @6 1380; EG-NEXT: ALU 10, @9, KC0[CB0:0-32], KC1[] 1381; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 1382; EG-NEXT: CF_END 1383; EG-NEXT: PAD 1384; EG-NEXT: Fetch clause starting at 6: 1385; EG-NEXT: VTX_READ_32 T0.X, T0.X, 0, #1 1386; EG-NEXT: ALU clause starting at 8: 1387; EG-NEXT: MOV * T0.X, KC0[2].Z, 1388; EG-NEXT: ALU clause starting at 9: 1389; EG-NEXT: AND_INT T0.W, T0.X, literal.x, 1390; EG-NEXT: NOT_INT * T1.W, T0.X, 1391; EG-NEXT: 31(4.344025e-44), 0(0.000000e+00) 1392; EG-NEXT: BIT_ALIGN_INT T0.Z, 0.0, literal.x, PS, 1393; EG-NEXT: LSHL T0.W, literal.y, PV.W, 1394; EG-NEXT: AND_INT * T1.W, T0.X, literal.x, 1395; EG-NEXT: 32(4.484155e-44), 64(8.968310e-44) 1396; EG-NEXT: CNDE_INT * T0.Y, PS, PV.Z, PV.W, 1397; EG-NEXT: CNDE_INT T0.X, T1.W, T0.W, 0.0, 1398; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 1399; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1400 %a = load i64, i64 addrspace(1)* %aptr, align 8 1401 %shl = shl i64 64, %a 1402 store i64 %shl, i64 addrspace(1)* %out, align 8 1403 ret void 1404} 1405 1406define amdgpu_kernel void @s_shl_inline_imm_64_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) { 1407; SI-LABEL: s_shl_inline_imm_64_i64: 1408; SI: ; %bb.0: 1409; SI-NEXT: s_load_dword s4, s[0:1], 0xd 1410; SI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 1411; SI-NEXT: s_mov_b32 s3, 0xf000 1412; SI-NEXT: s_mov_b32 s2, -1 1413; SI-NEXT: s_waitcnt lgkmcnt(0) 1414; SI-NEXT: s_lshl_b64 s[4:5], 64, s4 1415; SI-NEXT: v_mov_b32_e32 v0, s4 1416; SI-NEXT: v_mov_b32_e32 v1, s5 1417; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1418; SI-NEXT: s_endpgm 1419; 1420; VI-LABEL: s_shl_inline_imm_64_i64: 1421; VI: ; %bb.0: 1422; VI-NEXT: s_load_dword s4, s[0:1], 0x34 1423; VI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1424; VI-NEXT: s_mov_b32 s3, 0xf000 1425; VI-NEXT: s_mov_b32 s2, -1 1426; VI-NEXT: s_waitcnt lgkmcnt(0) 1427; VI-NEXT: s_lshl_b64 s[4:5], 64, s4 1428; VI-NEXT: v_mov_b32_e32 v0, s4 1429; VI-NEXT: v_mov_b32_e32 v1, s5 1430; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1431; VI-NEXT: s_endpgm 1432; 1433; EG-LABEL: s_shl_inline_imm_64_i64: 1434; EG: ; %bb.0: 1435; EG-NEXT: ALU 10, @4, KC0[CB0:0-32], KC1[] 1436; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 1437; EG-NEXT: CF_END 1438; EG-NEXT: PAD 1439; EG-NEXT: ALU clause starting at 4: 1440; EG-NEXT: NOT_INT T0.W, KC0[2].W, 1441; EG-NEXT: AND_INT * T1.W, KC0[2].W, literal.x, 1442; EG-NEXT: 31(4.344025e-44), 0(0.000000e+00) 1443; EG-NEXT: LSHL T0.Z, literal.x, PS, 1444; EG-NEXT: BIT_ALIGN_INT T0.W, 0.0, literal.y, PV.W, 1445; EG-NEXT: AND_INT * T1.W, KC0[2].W, literal.y, 1446; EG-NEXT: 64(8.968310e-44), 32(4.484155e-44) 1447; EG-NEXT: CNDE_INT * T0.Y, PS, PV.W, PV.Z, 1448; EG-NEXT: CNDE_INT T0.X, T1.W, T0.Z, 0.0, 1449; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 1450; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1451 %shl = shl i64 64, %a 1452 store i64 %shl, i64 addrspace(1)* %out, align 8 1453 ret void 1454} 1455 1456define amdgpu_kernel void @s_shl_inline_imm_1_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) { 1457; SI-LABEL: s_shl_inline_imm_1_i64: 1458; SI: ; %bb.0: 1459; SI-NEXT: s_load_dword s4, s[0:1], 0xd 1460; SI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 1461; SI-NEXT: s_mov_b32 s3, 0xf000 1462; SI-NEXT: s_mov_b32 s2, -1 1463; SI-NEXT: s_waitcnt lgkmcnt(0) 1464; SI-NEXT: s_lshl_b64 s[4:5], 1, s4 1465; SI-NEXT: v_mov_b32_e32 v0, s4 1466; SI-NEXT: v_mov_b32_e32 v1, s5 1467; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1468; SI-NEXT: s_endpgm 1469; 1470; VI-LABEL: s_shl_inline_imm_1_i64: 1471; VI: ; %bb.0: 1472; VI-NEXT: s_load_dword s4, s[0:1], 0x34 1473; VI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1474; VI-NEXT: s_mov_b32 s3, 0xf000 1475; VI-NEXT: s_mov_b32 s2, -1 1476; VI-NEXT: s_waitcnt lgkmcnt(0) 1477; VI-NEXT: s_lshl_b64 s[4:5], 1, s4 1478; VI-NEXT: v_mov_b32_e32 v0, s4 1479; VI-NEXT: v_mov_b32_e32 v1, s5 1480; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1481; VI-NEXT: s_endpgm 1482; 1483; EG-LABEL: s_shl_inline_imm_1_i64: 1484; EG: ; %bb.0: 1485; EG-NEXT: ALU 11, @4, KC0[CB0:0-32], KC1[] 1486; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 1487; EG-NEXT: CF_END 1488; EG-NEXT: PAD 1489; EG-NEXT: ALU clause starting at 4: 1490; EG-NEXT: AND_INT T0.W, KC0[2].W, literal.x, 1491; EG-NEXT: LSHL * T1.W, KC0[2].W, literal.y, 1492; EG-NEXT: 31(4.344025e-44), 26(3.643376e-44) 1493; EG-NEXT: ASHR T1.W, PS, literal.x, 1494; EG-NEXT: LSHL * T0.W, 1, PV.W, 1495; EG-NEXT: 31(4.344025e-44), 0(0.000000e+00) 1496; EG-NEXT: AND_INT T0.Y, PV.W, PS, 1497; EG-NEXT: AND_INT * T1.W, KC0[2].W, literal.x, 1498; EG-NEXT: 32(4.484155e-44), 0(0.000000e+00) 1499; EG-NEXT: CNDE_INT T0.X, PV.W, T0.W, 0.0, 1500; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 1501; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1502 %shl = shl i64 1, %a 1503 store i64 %shl, i64 addrspace(1)* %out, align 8 1504 ret void 1505} 1506 1507define amdgpu_kernel void @s_shl_inline_imm_1_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) { 1508; SI-LABEL: s_shl_inline_imm_1_0_i64: 1509; SI: ; %bb.0: 1510; SI-NEXT: s_load_dword s4, s[0:1], 0xd 1511; SI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 1512; SI-NEXT: s_mov_b32 s3, 0xf000 1513; SI-NEXT: s_mov_b32 s2, -1 1514; SI-NEXT: s_waitcnt lgkmcnt(0) 1515; SI-NEXT: s_lshl_b64 s[4:5], 1.0, s4 1516; SI-NEXT: v_mov_b32_e32 v0, s4 1517; SI-NEXT: v_mov_b32_e32 v1, s5 1518; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1519; SI-NEXT: s_endpgm 1520; 1521; VI-LABEL: s_shl_inline_imm_1_0_i64: 1522; VI: ; %bb.0: 1523; VI-NEXT: s_load_dword s4, s[0:1], 0x34 1524; VI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1525; VI-NEXT: s_mov_b32 s3, 0xf000 1526; VI-NEXT: s_mov_b32 s2, -1 1527; VI-NEXT: s_waitcnt lgkmcnt(0) 1528; VI-NEXT: s_lshl_b64 s[4:5], 1.0, s4 1529; VI-NEXT: v_mov_b32_e32 v0, s4 1530; VI-NEXT: v_mov_b32_e32 v1, s5 1531; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1532; VI-NEXT: s_endpgm 1533; 1534; EG-LABEL: s_shl_inline_imm_1_0_i64: 1535; EG: ; %bb.0: 1536; EG-NEXT: ALU 7, @4, KC0[CB0:0-32], KC1[] 1537; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 1538; EG-NEXT: CF_END 1539; EG-NEXT: PAD 1540; EG-NEXT: ALU clause starting at 4: 1541; EG-NEXT: NOT_INT * T0.W, KC0[2].W, 1542; EG-NEXT: BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W, 1543; EG-NEXT: AND_INT * T1.W, KC0[2].W, literal.y, 1544; EG-NEXT: 536346624(1.050321e-19), 32(4.484155e-44) 1545; EG-NEXT: CNDE_INT * T0.Y, PS, PV.W, 0.0, 1546; EG-NEXT: MOV T0.X, 0.0, 1547; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 1548; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1549 %shl = shl i64 4607182418800017408, %a 1550 store i64 %shl, i64 addrspace(1)* %out, align 8 1551 ret void 1552} 1553 1554define amdgpu_kernel void @s_shl_inline_imm_neg_1_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) { 1555; SI-LABEL: s_shl_inline_imm_neg_1_0_i64: 1556; SI: ; %bb.0: 1557; SI-NEXT: s_load_dword s4, s[0:1], 0xd 1558; SI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 1559; SI-NEXT: s_mov_b32 s3, 0xf000 1560; SI-NEXT: s_mov_b32 s2, -1 1561; SI-NEXT: s_waitcnt lgkmcnt(0) 1562; SI-NEXT: s_lshl_b64 s[4:5], -1.0, s4 1563; SI-NEXT: v_mov_b32_e32 v0, s4 1564; SI-NEXT: v_mov_b32_e32 v1, s5 1565; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1566; SI-NEXT: s_endpgm 1567; 1568; VI-LABEL: s_shl_inline_imm_neg_1_0_i64: 1569; VI: ; %bb.0: 1570; VI-NEXT: s_load_dword s4, s[0:1], 0x34 1571; VI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1572; VI-NEXT: s_mov_b32 s3, 0xf000 1573; VI-NEXT: s_mov_b32 s2, -1 1574; VI-NEXT: s_waitcnt lgkmcnt(0) 1575; VI-NEXT: s_lshl_b64 s[4:5], -1.0, s4 1576; VI-NEXT: v_mov_b32_e32 v0, s4 1577; VI-NEXT: v_mov_b32_e32 v1, s5 1578; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1579; VI-NEXT: s_endpgm 1580; 1581; EG-LABEL: s_shl_inline_imm_neg_1_0_i64: 1582; EG: ; %bb.0: 1583; EG-NEXT: ALU 7, @4, KC0[CB0:0-32], KC1[] 1584; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 1585; EG-NEXT: CF_END 1586; EG-NEXT: PAD 1587; EG-NEXT: ALU clause starting at 4: 1588; EG-NEXT: NOT_INT * T0.W, KC0[2].W, 1589; EG-NEXT: BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W, 1590; EG-NEXT: AND_INT * T1.W, KC0[2].W, literal.y, 1591; EG-NEXT: 1610088448(3.574057e+19), 32(4.484155e-44) 1592; EG-NEXT: CNDE_INT * T0.Y, PS, PV.W, 0.0, 1593; EG-NEXT: MOV T0.X, 0.0, 1594; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 1595; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1596 %shl = shl i64 13830554455654793216, %a 1597 store i64 %shl, i64 addrspace(1)* %out, align 8 1598 ret void 1599} 1600 1601define amdgpu_kernel void @s_shl_inline_imm_0_5_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) { 1602; SI-LABEL: s_shl_inline_imm_0_5_i64: 1603; SI: ; %bb.0: 1604; SI-NEXT: s_load_dword s4, s[0:1], 0xd 1605; SI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 1606; SI-NEXT: s_mov_b32 s3, 0xf000 1607; SI-NEXT: s_mov_b32 s2, -1 1608; SI-NEXT: s_waitcnt lgkmcnt(0) 1609; SI-NEXT: s_lshl_b64 s[4:5], 0.5, s4 1610; SI-NEXT: v_mov_b32_e32 v0, s4 1611; SI-NEXT: v_mov_b32_e32 v1, s5 1612; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1613; SI-NEXT: s_endpgm 1614; 1615; VI-LABEL: s_shl_inline_imm_0_5_i64: 1616; VI: ; %bb.0: 1617; VI-NEXT: s_load_dword s4, s[0:1], 0x34 1618; VI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1619; VI-NEXT: s_mov_b32 s3, 0xf000 1620; VI-NEXT: s_mov_b32 s2, -1 1621; VI-NEXT: s_waitcnt lgkmcnt(0) 1622; VI-NEXT: s_lshl_b64 s[4:5], 0.5, s4 1623; VI-NEXT: v_mov_b32_e32 v0, s4 1624; VI-NEXT: v_mov_b32_e32 v1, s5 1625; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1626; VI-NEXT: s_endpgm 1627; 1628; EG-LABEL: s_shl_inline_imm_0_5_i64: 1629; EG: ; %bb.0: 1630; EG-NEXT: ALU 7, @4, KC0[CB0:0-32], KC1[] 1631; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 1632; EG-NEXT: CF_END 1633; EG-NEXT: PAD 1634; EG-NEXT: ALU clause starting at 4: 1635; EG-NEXT: NOT_INT * T0.W, KC0[2].W, 1636; EG-NEXT: BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W, 1637; EG-NEXT: AND_INT * T1.W, KC0[2].W, literal.y, 1638; EG-NEXT: 535822336(1.016440e-19), 32(4.484155e-44) 1639; EG-NEXT: CNDE_INT * T0.Y, PS, PV.W, 0.0, 1640; EG-NEXT: MOV T0.X, 0.0, 1641; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 1642; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1643 %shl = shl i64 4602678819172646912, %a 1644 store i64 %shl, i64 addrspace(1)* %out, align 8 1645 ret void 1646} 1647 1648define amdgpu_kernel void @s_shl_inline_imm_neg_0_5_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) { 1649; SI-LABEL: s_shl_inline_imm_neg_0_5_i64: 1650; SI: ; %bb.0: 1651; SI-NEXT: s_load_dword s4, s[0:1], 0xd 1652; SI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 1653; SI-NEXT: s_mov_b32 s3, 0xf000 1654; SI-NEXT: s_mov_b32 s2, -1 1655; SI-NEXT: s_waitcnt lgkmcnt(0) 1656; SI-NEXT: s_lshl_b64 s[4:5], -0.5, s4 1657; SI-NEXT: v_mov_b32_e32 v0, s4 1658; SI-NEXT: v_mov_b32_e32 v1, s5 1659; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1660; SI-NEXT: s_endpgm 1661; 1662; VI-LABEL: s_shl_inline_imm_neg_0_5_i64: 1663; VI: ; %bb.0: 1664; VI-NEXT: s_load_dword s4, s[0:1], 0x34 1665; VI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1666; VI-NEXT: s_mov_b32 s3, 0xf000 1667; VI-NEXT: s_mov_b32 s2, -1 1668; VI-NEXT: s_waitcnt lgkmcnt(0) 1669; VI-NEXT: s_lshl_b64 s[4:5], -0.5, s4 1670; VI-NEXT: v_mov_b32_e32 v0, s4 1671; VI-NEXT: v_mov_b32_e32 v1, s5 1672; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1673; VI-NEXT: s_endpgm 1674; 1675; EG-LABEL: s_shl_inline_imm_neg_0_5_i64: 1676; EG: ; %bb.0: 1677; EG-NEXT: ALU 7, @4, KC0[CB0:0-32], KC1[] 1678; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 1679; EG-NEXT: CF_END 1680; EG-NEXT: PAD 1681; EG-NEXT: ALU clause starting at 4: 1682; EG-NEXT: NOT_INT * T0.W, KC0[2].W, 1683; EG-NEXT: BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W, 1684; EG-NEXT: AND_INT * T1.W, KC0[2].W, literal.y, 1685; EG-NEXT: 1609564160(3.458765e+19), 32(4.484155e-44) 1686; EG-NEXT: CNDE_INT * T0.Y, PS, PV.W, 0.0, 1687; EG-NEXT: MOV T0.X, 0.0, 1688; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 1689; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1690 %shl = shl i64 13826050856027422720, %a 1691 store i64 %shl, i64 addrspace(1)* %out, align 8 1692 ret void 1693} 1694 1695define amdgpu_kernel void @s_shl_inline_imm_2_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) { 1696; SI-LABEL: s_shl_inline_imm_2_0_i64: 1697; SI: ; %bb.0: 1698; SI-NEXT: s_load_dword s4, s[0:1], 0xd 1699; SI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 1700; SI-NEXT: s_mov_b32 s3, 0xf000 1701; SI-NEXT: s_mov_b32 s2, -1 1702; SI-NEXT: s_waitcnt lgkmcnt(0) 1703; SI-NEXT: s_lshl_b64 s[4:5], 2.0, s4 1704; SI-NEXT: v_mov_b32_e32 v0, s4 1705; SI-NEXT: v_mov_b32_e32 v1, s5 1706; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1707; SI-NEXT: s_endpgm 1708; 1709; VI-LABEL: s_shl_inline_imm_2_0_i64: 1710; VI: ; %bb.0: 1711; VI-NEXT: s_load_dword s4, s[0:1], 0x34 1712; VI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1713; VI-NEXT: s_mov_b32 s3, 0xf000 1714; VI-NEXT: s_mov_b32 s2, -1 1715; VI-NEXT: s_waitcnt lgkmcnt(0) 1716; VI-NEXT: s_lshl_b64 s[4:5], 2.0, s4 1717; VI-NEXT: v_mov_b32_e32 v0, s4 1718; VI-NEXT: v_mov_b32_e32 v1, s5 1719; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1720; VI-NEXT: s_endpgm 1721; 1722; EG-LABEL: s_shl_inline_imm_2_0_i64: 1723; EG: ; %bb.0: 1724; EG-NEXT: ALU 7, @4, KC0[CB0:0-32], KC1[] 1725; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 1726; EG-NEXT: CF_END 1727; EG-NEXT: PAD 1728; EG-NEXT: ALU clause starting at 4: 1729; EG-NEXT: NOT_INT * T0.W, KC0[2].W, 1730; EG-NEXT: BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W, 1731; EG-NEXT: AND_INT * T1.W, KC0[2].W, literal.y, 1732; EG-NEXT: 536870912(1.084202e-19), 32(4.484155e-44) 1733; EG-NEXT: CNDE_INT * T0.Y, PS, PV.W, 0.0, 1734; EG-NEXT: MOV T0.X, 0.0, 1735; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 1736; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1737 %shl = shl i64 4611686018427387904, %a 1738 store i64 %shl, i64 addrspace(1)* %out, align 8 1739 ret void 1740} 1741 1742define amdgpu_kernel void @s_shl_inline_imm_neg_2_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) { 1743; SI-LABEL: s_shl_inline_imm_neg_2_0_i64: 1744; SI: ; %bb.0: 1745; SI-NEXT: s_load_dword s4, s[0:1], 0xd 1746; SI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 1747; SI-NEXT: s_mov_b32 s3, 0xf000 1748; SI-NEXT: s_mov_b32 s2, -1 1749; SI-NEXT: s_waitcnt lgkmcnt(0) 1750; SI-NEXT: s_lshl_b64 s[4:5], -2.0, s4 1751; SI-NEXT: v_mov_b32_e32 v0, s4 1752; SI-NEXT: v_mov_b32_e32 v1, s5 1753; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1754; SI-NEXT: s_endpgm 1755; 1756; VI-LABEL: s_shl_inline_imm_neg_2_0_i64: 1757; VI: ; %bb.0: 1758; VI-NEXT: s_load_dword s4, s[0:1], 0x34 1759; VI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1760; VI-NEXT: s_mov_b32 s3, 0xf000 1761; VI-NEXT: s_mov_b32 s2, -1 1762; VI-NEXT: s_waitcnt lgkmcnt(0) 1763; VI-NEXT: s_lshl_b64 s[4:5], -2.0, s4 1764; VI-NEXT: v_mov_b32_e32 v0, s4 1765; VI-NEXT: v_mov_b32_e32 v1, s5 1766; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1767; VI-NEXT: s_endpgm 1768; 1769; EG-LABEL: s_shl_inline_imm_neg_2_0_i64: 1770; EG: ; %bb.0: 1771; EG-NEXT: ALU 7, @4, KC0[CB0:0-32], KC1[] 1772; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 1773; EG-NEXT: CF_END 1774; EG-NEXT: PAD 1775; EG-NEXT: ALU clause starting at 4: 1776; EG-NEXT: NOT_INT * T0.W, KC0[2].W, 1777; EG-NEXT: BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W, 1778; EG-NEXT: AND_INT * T1.W, KC0[2].W, literal.y, 1779; EG-NEXT: 1610612736(3.689349e+19), 32(4.484155e-44) 1780; EG-NEXT: CNDE_INT * T0.Y, PS, PV.W, 0.0, 1781; EG-NEXT: MOV T0.X, 0.0, 1782; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 1783; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1784 %shl = shl i64 13835058055282163712, %a 1785 store i64 %shl, i64 addrspace(1)* %out, align 8 1786 ret void 1787} 1788 1789define amdgpu_kernel void @s_shl_inline_imm_4_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) { 1790; SI-LABEL: s_shl_inline_imm_4_0_i64: 1791; SI: ; %bb.0: 1792; SI-NEXT: s_load_dword s4, s[0:1], 0xd 1793; SI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 1794; SI-NEXT: s_mov_b32 s3, 0xf000 1795; SI-NEXT: s_mov_b32 s2, -1 1796; SI-NEXT: s_waitcnt lgkmcnt(0) 1797; SI-NEXT: s_lshl_b64 s[4:5], 4.0, s4 1798; SI-NEXT: v_mov_b32_e32 v0, s4 1799; SI-NEXT: v_mov_b32_e32 v1, s5 1800; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1801; SI-NEXT: s_endpgm 1802; 1803; VI-LABEL: s_shl_inline_imm_4_0_i64: 1804; VI: ; %bb.0: 1805; VI-NEXT: s_load_dword s4, s[0:1], 0x34 1806; VI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1807; VI-NEXT: s_mov_b32 s3, 0xf000 1808; VI-NEXT: s_mov_b32 s2, -1 1809; VI-NEXT: s_waitcnt lgkmcnt(0) 1810; VI-NEXT: s_lshl_b64 s[4:5], 4.0, s4 1811; VI-NEXT: v_mov_b32_e32 v0, s4 1812; VI-NEXT: v_mov_b32_e32 v1, s5 1813; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1814; VI-NEXT: s_endpgm 1815; 1816; EG-LABEL: s_shl_inline_imm_4_0_i64: 1817; EG: ; %bb.0: 1818; EG-NEXT: ALU 7, @4, KC0[CB0:0-32], KC1[] 1819; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 1820; EG-NEXT: CF_END 1821; EG-NEXT: PAD 1822; EG-NEXT: ALU clause starting at 4: 1823; EG-NEXT: NOT_INT * T0.W, KC0[2].W, 1824; EG-NEXT: BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W, 1825; EG-NEXT: AND_INT * T1.W, KC0[2].W, literal.y, 1826; EG-NEXT: 537395200(1.151965e-19), 32(4.484155e-44) 1827; EG-NEXT: CNDE_INT * T0.Y, PS, PV.W, 0.0, 1828; EG-NEXT: MOV T0.X, 0.0, 1829; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 1830; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1831 %shl = shl i64 4616189618054758400, %a 1832 store i64 %shl, i64 addrspace(1)* %out, align 8 1833 ret void 1834} 1835 1836define amdgpu_kernel void @s_shl_inline_imm_neg_4_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) { 1837; SI-LABEL: s_shl_inline_imm_neg_4_0_i64: 1838; SI: ; %bb.0: 1839; SI-NEXT: s_load_dword s4, s[0:1], 0xd 1840; SI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 1841; SI-NEXT: s_mov_b32 s3, 0xf000 1842; SI-NEXT: s_mov_b32 s2, -1 1843; SI-NEXT: s_waitcnt lgkmcnt(0) 1844; SI-NEXT: s_lshl_b64 s[4:5], -4.0, s4 1845; SI-NEXT: v_mov_b32_e32 v0, s4 1846; SI-NEXT: v_mov_b32_e32 v1, s5 1847; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1848; SI-NEXT: s_endpgm 1849; 1850; VI-LABEL: s_shl_inline_imm_neg_4_0_i64: 1851; VI: ; %bb.0: 1852; VI-NEXT: s_load_dword s4, s[0:1], 0x34 1853; VI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1854; VI-NEXT: s_mov_b32 s3, 0xf000 1855; VI-NEXT: s_mov_b32 s2, -1 1856; VI-NEXT: s_waitcnt lgkmcnt(0) 1857; VI-NEXT: s_lshl_b64 s[4:5], -4.0, s4 1858; VI-NEXT: v_mov_b32_e32 v0, s4 1859; VI-NEXT: v_mov_b32_e32 v1, s5 1860; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 1861; VI-NEXT: s_endpgm 1862; 1863; EG-LABEL: s_shl_inline_imm_neg_4_0_i64: 1864; EG: ; %bb.0: 1865; EG-NEXT: ALU 7, @4, KC0[CB0:0-32], KC1[] 1866; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 1867; EG-NEXT: CF_END 1868; EG-NEXT: PAD 1869; EG-NEXT: ALU clause starting at 4: 1870; EG-NEXT: NOT_INT * T0.W, KC0[2].W, 1871; EG-NEXT: BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W, 1872; EG-NEXT: AND_INT * T1.W, KC0[2].W, literal.y, 1873; EG-NEXT: 1611137024(3.919933e+19), 32(4.484155e-44) 1874; EG-NEXT: CNDE_INT * T0.Y, PS, PV.W, 0.0, 1875; EG-NEXT: MOV T0.X, 0.0, 1876; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 1877; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1878 %shl = shl i64 13839561654909534208, %a 1879 store i64 %shl, i64 addrspace(1)* %out, align 8 1880 ret void 1881} 1882 1883 1884; Test with the 64-bit integer bitpattern for a 32-bit float in the 1885; low 32-bits, which is not a valid 64-bit inline immmediate. 1886define amdgpu_kernel void @s_shl_inline_imm_f32_4_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) { 1887; SI-LABEL: s_shl_inline_imm_f32_4_0_i64: 1888; SI: ; %bb.0: 1889; SI-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x9 1890; SI-NEXT: s_load_dword s2, s[0:1], 0xd 1891; SI-NEXT: s_mov_b64 s[0:1], 0x40800000 1892; SI-NEXT: s_mov_b32 s7, 0xf000 1893; SI-NEXT: s_mov_b32 s6, -1 1894; SI-NEXT: s_waitcnt lgkmcnt(0) 1895; SI-NEXT: s_lshl_b64 s[0:1], s[0:1], s2 1896; SI-NEXT: v_mov_b32_e32 v0, s0 1897; SI-NEXT: v_mov_b32_e32 v1, s1 1898; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0 1899; SI-NEXT: s_endpgm 1900; 1901; VI-LABEL: s_shl_inline_imm_f32_4_0_i64: 1902; VI: ; %bb.0: 1903; VI-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x24 1904; VI-NEXT: s_load_dword s2, s[0:1], 0x34 1905; VI-NEXT: s_mov_b64 s[0:1], 0x40800000 1906; VI-NEXT: s_mov_b32 s7, 0xf000 1907; VI-NEXT: s_mov_b32 s6, -1 1908; VI-NEXT: s_waitcnt lgkmcnt(0) 1909; VI-NEXT: s_lshl_b64 s[0:1], s[0:1], s2 1910; VI-NEXT: v_mov_b32_e32 v0, s0 1911; VI-NEXT: v_mov_b32_e32 v1, s1 1912; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0 1913; VI-NEXT: s_endpgm 1914; 1915; EG-LABEL: s_shl_inline_imm_f32_4_0_i64: 1916; EG: ; %bb.0: 1917; EG-NEXT: ALU 11, @4, KC0[CB0:0-32], KC1[] 1918; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 1919; EG-NEXT: CF_END 1920; EG-NEXT: PAD 1921; EG-NEXT: ALU clause starting at 4: 1922; EG-NEXT: NOT_INT T0.W, KC0[2].W, 1923; EG-NEXT: AND_INT * T1.W, KC0[2].W, literal.x, 1924; EG-NEXT: 31(4.344025e-44), 0(0.000000e+00) 1925; EG-NEXT: LSHL T0.Z, literal.x, PS, 1926; EG-NEXT: BIT_ALIGN_INT T0.W, 0.0, literal.y, PV.W, 1927; EG-NEXT: AND_INT * T1.W, KC0[2].W, literal.z, 1928; EG-NEXT: 1082130432(4.000000e+00), 541065216(1.626303e-19) 1929; EG-NEXT: 32(4.484155e-44), 0(0.000000e+00) 1930; EG-NEXT: CNDE_INT * T0.Y, PS, PV.W, PV.Z, 1931; EG-NEXT: CNDE_INT T0.X, T1.W, T0.Z, 0.0, 1932; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 1933; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1934 %shl = shl i64 1082130432, %a 1935 store i64 %shl, i64 addrspace(1)* %out, align 8 1936 ret void 1937} 1938 1939; FIXME: Copy of -1 register 1940define amdgpu_kernel void @s_shl_inline_imm_f32_neg_4_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) { 1941; SI-LABEL: s_shl_inline_imm_f32_neg_4_0_i64: 1942; SI: ; %bb.0: 1943; SI-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x9 1944; SI-NEXT: s_load_dword s2, s[0:1], 0xd 1945; SI-NEXT: s_mov_b32 s6, -1 1946; SI-NEXT: s_mov_b32 s0, -4.0 1947; SI-NEXT: s_mov_b32 s1, s6 1948; SI-NEXT: s_mov_b32 s7, 0xf000 1949; SI-NEXT: s_waitcnt lgkmcnt(0) 1950; SI-NEXT: s_lshl_b64 s[0:1], s[0:1], s2 1951; SI-NEXT: v_mov_b32_e32 v0, s0 1952; SI-NEXT: v_mov_b32_e32 v1, s1 1953; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0 1954; SI-NEXT: s_endpgm 1955; 1956; VI-LABEL: s_shl_inline_imm_f32_neg_4_0_i64: 1957; VI: ; %bb.0: 1958; VI-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x24 1959; VI-NEXT: s_load_dword s2, s[0:1], 0x34 1960; VI-NEXT: s_mov_b32 s6, -1 1961; VI-NEXT: s_mov_b32 s0, -4.0 1962; VI-NEXT: s_mov_b32 s1, s6 1963; VI-NEXT: s_mov_b32 s7, 0xf000 1964; VI-NEXT: s_waitcnt lgkmcnt(0) 1965; VI-NEXT: s_lshl_b64 s[0:1], s[0:1], s2 1966; VI-NEXT: v_mov_b32_e32 v0, s0 1967; VI-NEXT: v_mov_b32_e32 v1, s1 1968; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0 1969; VI-NEXT: s_endpgm 1970; 1971; EG-LABEL: s_shl_inline_imm_f32_neg_4_0_i64: 1972; EG: ; %bb.0: 1973; EG-NEXT: ALU 12, @4, KC0[CB0:0-32], KC1[] 1974; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 1975; EG-NEXT: CF_END 1976; EG-NEXT: PAD 1977; EG-NEXT: ALU clause starting at 4: 1978; EG-NEXT: AND_INT T0.Z, KC0[2].W, literal.x, 1979; EG-NEXT: MOV T0.W, literal.y, 1980; EG-NEXT: NOT_INT * T1.W, KC0[2].W, 1981; EG-NEXT: 31(4.344025e-44), -532676608(-5.534023e+19) 1982; EG-NEXT: BIT_ALIGN_INT T1.Z, literal.x, PV.W, PS, 1983; EG-NEXT: LSHL T0.W, literal.y, PV.Z, 1984; EG-NEXT: AND_INT * T1.W, KC0[2].W, literal.z, 1985; EG-NEXT: 2147483647(nan), -1065353216(-4.000000e+00) 1986; EG-NEXT: 32(4.484155e-44), 0(0.000000e+00) 1987; EG-NEXT: CNDE_INT * T0.Y, PS, PV.Z, PV.W, 1988; EG-NEXT: CNDE_INT T0.X, T1.W, T0.W, 0.0, 1989; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 1990; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 1991 %shl = shl i64 -1065353216, %a 1992 store i64 %shl, i64 addrspace(1)* %out, align 8 1993 ret void 1994} 1995 1996define amdgpu_kernel void @s_shl_inline_high_imm_f32_4_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) { 1997; SI-LABEL: s_shl_inline_high_imm_f32_4_0_i64: 1998; SI: ; %bb.0: 1999; SI-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x9 2000; SI-NEXT: s_load_dword s2, s[0:1], 0xd 2001; SI-NEXT: s_mov_b32 s0, 0 2002; SI-NEXT: s_mov_b32 s1, 4.0 2003; SI-NEXT: s_mov_b32 s7, 0xf000 2004; SI-NEXT: s_mov_b32 s6, -1 2005; SI-NEXT: s_waitcnt lgkmcnt(0) 2006; SI-NEXT: s_lshl_b64 s[0:1], s[0:1], s2 2007; SI-NEXT: v_mov_b32_e32 v0, s0 2008; SI-NEXT: v_mov_b32_e32 v1, s1 2009; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0 2010; SI-NEXT: s_endpgm 2011; 2012; VI-LABEL: s_shl_inline_high_imm_f32_4_0_i64: 2013; VI: ; %bb.0: 2014; VI-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x24 2015; VI-NEXT: s_load_dword s2, s[0:1], 0x34 2016; VI-NEXT: s_mov_b32 s0, 0 2017; VI-NEXT: s_mov_b32 s1, 4.0 2018; VI-NEXT: s_mov_b32 s7, 0xf000 2019; VI-NEXT: s_mov_b32 s6, -1 2020; VI-NEXT: s_waitcnt lgkmcnt(0) 2021; VI-NEXT: s_lshl_b64 s[0:1], s[0:1], s2 2022; VI-NEXT: v_mov_b32_e32 v0, s0 2023; VI-NEXT: v_mov_b32_e32 v1, s1 2024; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0 2025; VI-NEXT: s_endpgm 2026; 2027; EG-LABEL: s_shl_inline_high_imm_f32_4_0_i64: 2028; EG: ; %bb.0: 2029; EG-NEXT: ALU 7, @4, KC0[CB0:0-32], KC1[] 2030; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 2031; EG-NEXT: CF_END 2032; EG-NEXT: PAD 2033; EG-NEXT: ALU clause starting at 4: 2034; EG-NEXT: NOT_INT * T0.W, KC0[2].W, 2035; EG-NEXT: BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W, 2036; EG-NEXT: AND_INT * T1.W, KC0[2].W, literal.y, 2037; EG-NEXT: 541065216(1.626303e-19), 32(4.484155e-44) 2038; EG-NEXT: CNDE_INT * T0.Y, PS, PV.W, 0.0, 2039; EG-NEXT: MOV T0.X, 0.0, 2040; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 2041; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 2042 %shl = shl i64 4647714815446351872, %a 2043 store i64 %shl, i64 addrspace(1)* %out, align 8 2044 ret void 2045} 2046 2047define amdgpu_kernel void @s_shl_inline_high_imm_f32_neg_4_0_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 %a) { 2048; SI-LABEL: s_shl_inline_high_imm_f32_neg_4_0_i64: 2049; SI: ; %bb.0: 2050; SI-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x9 2051; SI-NEXT: s_load_dword s2, s[0:1], 0xd 2052; SI-NEXT: s_mov_b32 s0, 0 2053; SI-NEXT: s_mov_b32 s1, -4.0 2054; SI-NEXT: s_mov_b32 s7, 0xf000 2055; SI-NEXT: s_mov_b32 s6, -1 2056; SI-NEXT: s_waitcnt lgkmcnt(0) 2057; SI-NEXT: s_lshl_b64 s[0:1], s[0:1], s2 2058; SI-NEXT: v_mov_b32_e32 v0, s0 2059; SI-NEXT: v_mov_b32_e32 v1, s1 2060; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0 2061; SI-NEXT: s_endpgm 2062; 2063; VI-LABEL: s_shl_inline_high_imm_f32_neg_4_0_i64: 2064; VI: ; %bb.0: 2065; VI-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x24 2066; VI-NEXT: s_load_dword s2, s[0:1], 0x34 2067; VI-NEXT: s_mov_b32 s0, 0 2068; VI-NEXT: s_mov_b32 s1, -4.0 2069; VI-NEXT: s_mov_b32 s7, 0xf000 2070; VI-NEXT: s_mov_b32 s6, -1 2071; VI-NEXT: s_waitcnt lgkmcnt(0) 2072; VI-NEXT: s_lshl_b64 s[0:1], s[0:1], s2 2073; VI-NEXT: v_mov_b32_e32 v0, s0 2074; VI-NEXT: v_mov_b32_e32 v1, s1 2075; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0 2076; VI-NEXT: s_endpgm 2077; 2078; EG-LABEL: s_shl_inline_high_imm_f32_neg_4_0_i64: 2079; EG: ; %bb.0: 2080; EG-NEXT: ALU 7, @4, KC0[CB0:0-32], KC1[] 2081; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.XY, T1.X, 1 2082; EG-NEXT: CF_END 2083; EG-NEXT: PAD 2084; EG-NEXT: ALU clause starting at 4: 2085; EG-NEXT: NOT_INT * T0.W, KC0[2].W, 2086; EG-NEXT: BIT_ALIGN_INT T0.W, literal.x, 0.0, PV.W, 2087; EG-NEXT: AND_INT * T1.W, KC0[2].W, literal.y, 2088; EG-NEXT: 1614807040(5.534023e+19), 32(4.484155e-44) 2089; EG-NEXT: CNDE_INT * T0.Y, PS, PV.W, 0.0, 2090; EG-NEXT: MOV T0.X, 0.0, 2091; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.x, 2092; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 2093 %shl = shl i64 13871086852301127680, %a 2094 store i64 %shl, i64 addrspace(1)* %out, align 8 2095 ret void 2096} 2097 2098define amdgpu_kernel void @test_mul2(i32 %p) { 2099; SI-LABEL: test_mul2: 2100; SI: ; %bb.0: 2101; SI-NEXT: s_load_dword s0, s[0:1], 0x9 2102; SI-NEXT: s_mov_b32 s3, 0xf000 2103; SI-NEXT: s_mov_b32 s2, -1 2104; SI-NEXT: s_waitcnt lgkmcnt(0) 2105; SI-NEXT: s_lshl_b32 s0, s0, 1 2106; SI-NEXT: v_mov_b32_e32 v0, s0 2107; SI-NEXT: buffer_store_dword v0, off, s[0:3], 0 2108; SI-NEXT: s_waitcnt vmcnt(0) 2109; SI-NEXT: s_endpgm 2110; 2111; VI-LABEL: test_mul2: 2112; VI: ; %bb.0: 2113; VI-NEXT: s_load_dword s0, s[0:1], 0x24 2114; VI-NEXT: s_mov_b32 s3, 0xf000 2115; VI-NEXT: s_mov_b32 s2, -1 2116; VI-NEXT: s_waitcnt lgkmcnt(0) 2117; VI-NEXT: s_lshl_b32 s0, s0, 1 2118; VI-NEXT: v_mov_b32_e32 v0, s0 2119; VI-NEXT: buffer_store_dword v0, off, s[0:3], 0 2120; VI-NEXT: s_waitcnt vmcnt(0) 2121; VI-NEXT: s_endpgm 2122; 2123; EG-LABEL: test_mul2: 2124; EG: ; %bb.0: 2125; EG-NEXT: ALU 2, @4, KC0[CB0:0-32], KC1[] 2126; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T1.X, T0.X, 1 2127; EG-NEXT: CF_END 2128; EG-NEXT: PAD 2129; EG-NEXT: ALU clause starting at 4: 2130; EG-NEXT: MOV T0.X, literal.x, 2131; EG-NEXT: LSHL * T1.X, KC0[2].Y, 1, 2132; EG-NEXT: 0(0.000000e+00), 0(0.000000e+00) 2133 %i = mul i32 %p, 2 2134 store volatile i32 %i, i32 addrspace(1)* undef 2135 ret void 2136} 2137 2138define void @shl_or_k(i32 addrspace(1)* %out, i32 %in) { 2139; SI-LABEL: shl_or_k: 2140; SI: ; %bb.0: 2141; SI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2142; SI-NEXT: s_mov_b32 s6, 0 2143; SI-NEXT: v_lshlrev_b32_e32 v2, 2, v2 2144; SI-NEXT: s_mov_b32 s7, 0xf000 2145; SI-NEXT: s_mov_b32 s4, s6 2146; SI-NEXT: s_mov_b32 s5, s6 2147; SI-NEXT: v_or_b32_e32 v2, 4, v2 2148; SI-NEXT: buffer_store_dword v2, v[0:1], s[4:7], 0 addr64 2149; SI-NEXT: s_waitcnt vmcnt(0) expcnt(0) 2150; SI-NEXT: s_setpc_b64 s[30:31] 2151; 2152; VI-LABEL: shl_or_k: 2153; VI: ; %bb.0: 2154; VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2155; VI-NEXT: v_lshlrev_b32_e32 v2, 2, v2 2156; VI-NEXT: v_or_b32_e32 v2, 4, v2 2157; VI-NEXT: flat_store_dword v[0:1], v2 2158; VI-NEXT: s_waitcnt vmcnt(0) 2159; VI-NEXT: s_setpc_b64 s[30:31] 2160; 2161; EG-LABEL: shl_or_k: 2162; EG: ; %bb.0: 2163; EG-NEXT: ALU 4, @4, KC0[CB0:0-32], KC1[] 2164; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T0.X, T1.X, 1 2165; EG-NEXT: CF_END 2166; EG-NEXT: PAD 2167; EG-NEXT: ALU clause starting at 4: 2168; EG-NEXT: LSHL * T0.W, KC0[2].Z, literal.x, 2169; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 2170; EG-NEXT: OR_INT T0.X, PV.W, literal.x, 2171; EG-NEXT: LSHR * T1.X, KC0[2].Y, literal.y, 2172; EG-NEXT: 4(5.605194e-45), 2(2.802597e-45) 2173 %tmp0 = or i32 %in, 1 2174 %tmp2 = shl i32 %tmp0, 2 2175 store i32 %tmp2, i32 addrspace(1)* %out 2176 ret void 2177} 2178 2179define void @shl_or_k_two_uses(i32 addrspace(1)* %out0, i32 addrspace(1)* %out1, i32 %in) { 2180; SI-LABEL: shl_or_k_two_uses: 2181; SI: ; %bb.0: 2182; SI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2183; SI-NEXT: s_mov_b32 s6, 0 2184; SI-NEXT: v_or_b32_e32 v4, 1, v4 2185; SI-NEXT: s_mov_b32 s7, 0xf000 2186; SI-NEXT: s_mov_b32 s4, s6 2187; SI-NEXT: s_mov_b32 s5, s6 2188; SI-NEXT: v_lshlrev_b32_e32 v5, 2, v4 2189; SI-NEXT: buffer_store_dword v5, v[0:1], s[4:7], 0 addr64 2190; SI-NEXT: buffer_store_dword v4, v[2:3], s[4:7], 0 addr64 2191; SI-NEXT: s_waitcnt vmcnt(0) expcnt(0) 2192; SI-NEXT: s_setpc_b64 s[30:31] 2193; 2194; VI-LABEL: shl_or_k_two_uses: 2195; VI: ; %bb.0: 2196; VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 2197; VI-NEXT: v_or_b32_e32 v4, 1, v4 2198; VI-NEXT: v_lshlrev_b32_e32 v5, 2, v4 2199; VI-NEXT: flat_store_dword v[0:1], v5 2200; VI-NEXT: flat_store_dword v[2:3], v4 2201; VI-NEXT: s_waitcnt vmcnt(0) 2202; VI-NEXT: s_setpc_b64 s[30:31] 2203; 2204; EG-LABEL: shl_or_k_two_uses: 2205; EG: ; %bb.0: 2206; EG-NEXT: ALU 5, @4, KC0[CB0:0-32], KC1[] 2207; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T2.X, T3.X, 0 2208; EG-NEXT: MEM_RAT_CACHELESS STORE_RAW T1.X, T0.X, 1 2209; EG-NEXT: CF_END 2210; EG-NEXT: ALU clause starting at 4: 2211; EG-NEXT: LSHR T0.X, KC0[2].Z, literal.x, 2212; EG-NEXT: OR_INT * T1.X, KC0[2].W, 1, 2213; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 2214; EG-NEXT: LSHL T2.X, PS, literal.x, 2215; EG-NEXT: LSHR * T3.X, KC0[2].Y, literal.x, 2216; EG-NEXT: 2(2.802597e-45), 0(0.000000e+00) 2217 %tmp0 = or i32 %in, 1 2218 %tmp2 = shl i32 %tmp0, 2 2219 store i32 %tmp2, i32 addrspace(1)* %out0 2220 store i32 %tmp0, i32 addrspace(1)* %out1 2221 ret void 2222} 2223 2224attributes #0 = { nounwind readnone } 2225