1361 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2;RUN: llc < %s -mtriple=amdgcn -mcpu=verde | FileCheck --check-prefixes=GFX6 %s3;RUN: llc < %s -mtriple=amdgcn -mcpu=tonga | FileCheck --check-prefixes=GFX8PLUS %s4;RUN: llc < %s -mtriple=amdgcn -mcpu=gfx1100 | FileCheck --check-prefixes=GFX11 %s5;RUN: llc < %s -mtriple=amdgcn -mcpu=gfx1100 -mattr=-enable-prt-strict-null | FileCheck --check-prefixes=NOPRT %s6;RUN: llc < %s -mtriple=amdgcn -mcpu=gfx1200 | FileCheck --check-prefixes=GFX12,GFX12-SDAG %s7;RUN: llc < %s -global-isel -mtriple=amdgcn -mcpu=gfx1200 | FileCheck --check-prefixes=GFX12,GFX12-GISEL %s8 9define amdgpu_ps {<4 x float>, <4 x float>, <4 x float>} @buffer_load(<4 x i32> inreg) {10; GFX6-LABEL: buffer_load:11; GFX6: ; %bb.0: ; %main_body12; GFX6-NEXT: v_mov_b32_e32 v8, 013; GFX6-NEXT: buffer_load_format_xyzw v[0:3], v8, s[0:3], 0 idxen14; GFX6-NEXT: buffer_load_format_xyzw v[4:7], v8, s[0:3], 0 idxen glc15; GFX6-NEXT: buffer_load_format_xyzw v[8:11], v8, s[0:3], 0 idxen slc16; GFX6-NEXT: s_waitcnt vmcnt(0)17; GFX6-NEXT: ; return to shader part epilog18;19; GFX8PLUS-LABEL: buffer_load:20; GFX8PLUS: ; %bb.0: ; %main_body21; GFX8PLUS-NEXT: v_mov_b32_e32 v8, 022; GFX8PLUS-NEXT: buffer_load_format_xyzw v[0:3], v8, s[0:3], 0 idxen23; GFX8PLUS-NEXT: buffer_load_format_xyzw v[4:7], v8, s[0:3], 0 idxen glc24; GFX8PLUS-NEXT: buffer_load_format_xyzw v[8:11], v8, s[0:3], 0 idxen slc25; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)26; GFX8PLUS-NEXT: ; return to shader part epilog27;28; GFX11-LABEL: buffer_load:29; GFX11: ; %bb.0: ; %main_body30; GFX11-NEXT: v_mov_b32_e32 v8, 031; GFX11-NEXT: s_clause 0x232; GFX11-NEXT: buffer_load_format_xyzw v[0:3], v8, s[0:3], 0 idxen33; GFX11-NEXT: buffer_load_format_xyzw v[4:7], v8, s[0:3], 0 idxen glc34; GFX11-NEXT: buffer_load_format_xyzw v[8:11], v8, s[0:3], 0 idxen slc35; GFX11-NEXT: s_waitcnt vmcnt(0)36; GFX11-NEXT: ; return to shader part epilog37;38; NOPRT-LABEL: buffer_load:39; NOPRT: ; %bb.0: ; %main_body40; NOPRT-NEXT: v_mov_b32_e32 v8, 041; NOPRT-NEXT: s_clause 0x242; NOPRT-NEXT: buffer_load_format_xyzw v[0:3], v8, s[0:3], 0 idxen43; NOPRT-NEXT: buffer_load_format_xyzw v[4:7], v8, s[0:3], 0 idxen glc44; NOPRT-NEXT: buffer_load_format_xyzw v[8:11], v8, s[0:3], 0 idxen slc45; NOPRT-NEXT: s_waitcnt vmcnt(0)46; NOPRT-NEXT: ; return to shader part epilog47;48; GFX12-LABEL: buffer_load:49; GFX12: ; %bb.0: ; %main_body50; GFX12-NEXT: v_mov_b32_e32 v8, 051; GFX12-NEXT: s_clause 0x252; GFX12-NEXT: buffer_load_format_xyzw v[0:3], v8, s[0:3], null idxen53; GFX12-NEXT: buffer_load_format_xyzw v[4:7], v8, s[0:3], null idxen th:TH_LOAD_NT54; GFX12-NEXT: buffer_load_format_xyzw v[8:11], v8, s[0:3], null idxen th:TH_LOAD_HT55; GFX12-NEXT: s_wait_loadcnt 0x056; GFX12-NEXT: ; return to shader part epilog57main_body:58 %data = call <4 x float> @llvm.amdgcn.struct.buffer.load.format.v4f32(<4 x i32> %0, i32 0, i32 0, i32 0, i32 0)59 %data_glc = call <4 x float> @llvm.amdgcn.struct.buffer.load.format.v4f32(<4 x i32> %0, i32 0, i32 0, i32 0, i32 1)60 %data_slc = call <4 x float> @llvm.amdgcn.struct.buffer.load.format.v4f32(<4 x i32> %0, i32 0, i32 0, i32 0, i32 2)61 %r0 = insertvalue {<4 x float>, <4 x float>, <4 x float>} poison, <4 x float> %data, 062 %r1 = insertvalue {<4 x float>, <4 x float>, <4 x float>} %r0, <4 x float> %data_glc, 163 %r2 = insertvalue {<4 x float>, <4 x float>, <4 x float>} %r1, <4 x float> %data_slc, 264 ret {<4 x float>, <4 x float>, <4 x float>} %r265}66 67define amdgpu_ps <4 x float> @buffer_load_immoffs(<4 x i32> inreg) {68; GFX6-LABEL: buffer_load_immoffs:69; GFX6: ; %bb.0: ; %main_body70; GFX6-NEXT: v_mov_b32_e32 v0, 071; GFX6-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], 0 idxen offset:4272; GFX6-NEXT: s_waitcnt vmcnt(0)73; GFX6-NEXT: ; return to shader part epilog74;75; GFX8PLUS-LABEL: buffer_load_immoffs:76; GFX8PLUS: ; %bb.0: ; %main_body77; GFX8PLUS-NEXT: v_mov_b32_e32 v0, 078; GFX8PLUS-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], 0 idxen offset:4279; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)80; GFX8PLUS-NEXT: ; return to shader part epilog81;82; GFX11-LABEL: buffer_load_immoffs:83; GFX11: ; %bb.0: ; %main_body84; GFX11-NEXT: v_mov_b32_e32 v0, 085; GFX11-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], 0 idxen offset:4286; GFX11-NEXT: s_waitcnt vmcnt(0)87; GFX11-NEXT: ; return to shader part epilog88;89; NOPRT-LABEL: buffer_load_immoffs:90; NOPRT: ; %bb.0: ; %main_body91; NOPRT-NEXT: v_mov_b32_e32 v0, 092; NOPRT-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], 0 idxen offset:4293; NOPRT-NEXT: s_waitcnt vmcnt(0)94; NOPRT-NEXT: ; return to shader part epilog95;96; GFX12-LABEL: buffer_load_immoffs:97; GFX12: ; %bb.0: ; %main_body98; GFX12-NEXT: v_mov_b32_e32 v0, 099; GFX12-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], null idxen offset:42100; GFX12-NEXT: s_wait_loadcnt 0x0101; GFX12-NEXT: ; return to shader part epilog102main_body:103 %data = call <4 x float> @llvm.amdgcn.struct.buffer.load.format.v4f32(<4 x i32> %0, i32 0, i32 42, i32 0, i32 0)104 ret <4 x float> %data105}106 107define amdgpu_ps <4 x float> @buffer_load_immoffs_large(<4 x i32> inreg) {108; GFX6-LABEL: buffer_load_immoffs_large:109; GFX6: ; %bb.0: ; %main_body110; GFX6-NEXT: v_mov_b32_e32 v8, 0111; GFX6-NEXT: s_movk_i32 s4, 0x7ffc112; GFX6-NEXT: buffer_load_format_xyzw v[0:3], v8, s[0:3], 60 idxen offset:4092113; GFX6-NEXT: buffer_load_format_xyzw v[4:7], v8, s[0:3], s4 idxen offset:4092114; GFX6-NEXT: s_mov_b32 s4, 0x8ffc115; GFX6-NEXT: buffer_load_format_xyzw v[8:11], v8, s[0:3], s4 idxen offset:4116; GFX6-NEXT: s_waitcnt vmcnt(1)117; GFX6-NEXT: v_add_f32_e32 v3, v3, v7118; GFX6-NEXT: v_add_f32_e32 v2, v2, v6119; GFX6-NEXT: v_add_f32_e32 v1, v1, v5120; GFX6-NEXT: v_add_f32_e32 v0, v0, v4121; GFX6-NEXT: s_waitcnt vmcnt(0)122; GFX6-NEXT: v_add_f32_e32 v0, v8, v0123; GFX6-NEXT: v_add_f32_e32 v1, v9, v1124; GFX6-NEXT: v_add_f32_e32 v2, v10, v2125; GFX6-NEXT: v_add_f32_e32 v3, v11, v3126; GFX6-NEXT: ; return to shader part epilog127;128; GFX8PLUS-LABEL: buffer_load_immoffs_large:129; GFX8PLUS: ; %bb.0: ; %main_body130; GFX8PLUS-NEXT: v_mov_b32_e32 v8, 0131; GFX8PLUS-NEXT: s_movk_i32 s4, 0x7ffc132; GFX8PLUS-NEXT: buffer_load_format_xyzw v[0:3], v8, s[0:3], 60 idxen offset:4092133; GFX8PLUS-NEXT: buffer_load_format_xyzw v[4:7], v8, s[0:3], s4 idxen offset:4092134; GFX8PLUS-NEXT: s_mov_b32 s4, 0x8ffc135; GFX8PLUS-NEXT: buffer_load_format_xyzw v[8:11], v8, s[0:3], s4 idxen offset:4136; GFX8PLUS-NEXT: s_waitcnt vmcnt(1)137; GFX8PLUS-NEXT: v_add_f32_e32 v3, v3, v7138; GFX8PLUS-NEXT: v_add_f32_e32 v2, v2, v6139; GFX8PLUS-NEXT: v_add_f32_e32 v1, v1, v5140; GFX8PLUS-NEXT: v_add_f32_e32 v0, v0, v4141; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)142; GFX8PLUS-NEXT: v_add_f32_e32 v0, v8, v0143; GFX8PLUS-NEXT: v_add_f32_e32 v1, v9, v1144; GFX8PLUS-NEXT: v_add_f32_e32 v2, v10, v2145; GFX8PLUS-NEXT: v_add_f32_e32 v3, v11, v3146; GFX8PLUS-NEXT: ; return to shader part epilog147;148; GFX11-LABEL: buffer_load_immoffs_large:149; GFX11: ; %bb.0: ; %main_body150; GFX11-NEXT: v_mov_b32_e32 v8, 0151; GFX11-NEXT: s_movk_i32 s4, 0x7ffc152; GFX11-NEXT: s_clause 0x1153; GFX11-NEXT: buffer_load_format_xyzw v[0:3], v8, s[0:3], 60 idxen offset:4092154; GFX11-NEXT: buffer_load_format_xyzw v[4:7], v8, s[0:3], s4 idxen offset:4092155; GFX11-NEXT: s_mov_b32 s4, 0x8ffc156; GFX11-NEXT: s_waitcnt vmcnt(0)157; GFX11-NEXT: v_add_f32_e32 v1, v1, v5158; GFX11-NEXT: buffer_load_format_xyzw v[8:11], v8, s[0:3], s4 idxen offset:4159; GFX11-NEXT: v_dual_add_f32 v0, v0, v4 :: v_dual_add_f32 v3, v3, v7160; GFX11-NEXT: s_waitcnt vmcnt(0)161; GFX11-NEXT: v_dual_add_f32 v2, v2, v6 :: v_dual_add_f32 v1, v9, v1162; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)163; GFX11-NEXT: v_dual_add_f32 v0, v8, v0 :: v_dual_add_f32 v3, v11, v3164; GFX11-NEXT: v_add_f32_e32 v2, v10, v2165; GFX11-NEXT: ; return to shader part epilog166;167; NOPRT-LABEL: buffer_load_immoffs_large:168; NOPRT: ; %bb.0: ; %main_body169; NOPRT-NEXT: v_mov_b32_e32 v8, 0170; NOPRT-NEXT: s_movk_i32 s4, 0x7ffc171; NOPRT-NEXT: s_clause 0x1172; NOPRT-NEXT: buffer_load_format_xyzw v[0:3], v8, s[0:3], 60 idxen offset:4092173; NOPRT-NEXT: buffer_load_format_xyzw v[4:7], v8, s[0:3], s4 idxen offset:4092174; NOPRT-NEXT: s_mov_b32 s4, 0x8ffc175; NOPRT-NEXT: s_waitcnt vmcnt(0)176; NOPRT-NEXT: v_add_f32_e32 v1, v1, v5177; NOPRT-NEXT: buffer_load_format_xyzw v[8:11], v8, s[0:3], s4 idxen offset:4178; NOPRT-NEXT: v_dual_add_f32 v0, v0, v4 :: v_dual_add_f32 v3, v3, v7179; NOPRT-NEXT: s_waitcnt vmcnt(0)180; NOPRT-NEXT: v_dual_add_f32 v2, v2, v6 :: v_dual_add_f32 v1, v9, v1181; NOPRT-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)182; NOPRT-NEXT: v_dual_add_f32 v0, v8, v0 :: v_dual_add_f32 v3, v11, v3183; NOPRT-NEXT: v_add_f32_e32 v2, v10, v2184; NOPRT-NEXT: ; return to shader part epilog185;186; GFX12-LABEL: buffer_load_immoffs_large:187; GFX12: ; %bb.0: ; %main_body188; GFX12-NEXT: v_mov_b32_e32 v8, 0189; GFX12-NEXT: s_mov_b32 s4, 60190; GFX12-NEXT: s_movk_i32 s5, 0x7ffc191; GFX12-NEXT: s_clause 0x1192; GFX12-NEXT: buffer_load_format_xyzw v[0:3], v8, s[0:3], s4 idxen offset:4092193; GFX12-NEXT: buffer_load_format_xyzw v[4:7], v8, s[0:3], s5 idxen offset:4092194; GFX12-NEXT: s_mov_b32 s4, 0x8ffc195; GFX12-NEXT: s_wait_loadcnt 0x0196; GFX12-NEXT: v_add_f32_e32 v1, v1, v5197; GFX12-NEXT: buffer_load_format_xyzw v[8:11], v8, s[0:3], s4 idxen offset:4198; GFX12-NEXT: v_dual_add_f32 v0, v0, v4 :: v_dual_add_f32 v3, v3, v7199; GFX12-NEXT: s_wait_loadcnt 0x0200; GFX12-NEXT: v_dual_add_f32 v2, v2, v6 :: v_dual_add_f32 v1, v9, v1201; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)202; GFX12-NEXT: v_dual_add_f32 v0, v8, v0 :: v_dual_add_f32 v3, v11, v3203; GFX12-NEXT: v_add_f32_e32 v2, v10, v2204; GFX12-NEXT: ; return to shader part epilog205main_body:206 %d.0 = call <4 x float> @llvm.amdgcn.struct.buffer.load.format.v4f32(<4 x i32> %0, i32 0, i32 4092, i32 60, i32 0)207 %d.1 = call <4 x float> @llvm.amdgcn.struct.buffer.load.format.v4f32(<4 x i32> %0, i32 0, i32 4092, i32 32764, i32 0)208 %d.2 = call <4 x float> @llvm.amdgcn.struct.buffer.load.format.v4f32(<4 x i32> %0, i32 0, i32 4, i32 36860, i32 0)209 %d.3 = fadd <4 x float> %d.0, %d.1210 %data = fadd <4 x float> %d.2, %d.3211 ret <4 x float> %data212}213 214define amdgpu_ps <4 x float> @buffer_load_voffset_large_12bit(<4 x i32> inreg) {215; GFX6-LABEL: buffer_load_voffset_large_12bit:216; GFX6: ; %bb.0: ; %main_body217; GFX6-NEXT: v_mov_b32_e32 v0, 0218; GFX6-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], 0 idxen offset:4092219; GFX6-NEXT: s_waitcnt vmcnt(0)220; GFX6-NEXT: ; return to shader part epilog221;222; GFX8PLUS-LABEL: buffer_load_voffset_large_12bit:223; GFX8PLUS: ; %bb.0: ; %main_body224; GFX8PLUS-NEXT: v_mov_b32_e32 v0, 0225; GFX8PLUS-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], 0 idxen offset:4092226; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)227; GFX8PLUS-NEXT: ; return to shader part epilog228;229; GFX11-LABEL: buffer_load_voffset_large_12bit:230; GFX11: ; %bb.0: ; %main_body231; GFX11-NEXT: v_mov_b32_e32 v0, 0232; GFX11-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], 0 idxen offset:4092233; GFX11-NEXT: s_waitcnt vmcnt(0)234; GFX11-NEXT: ; return to shader part epilog235;236; NOPRT-LABEL: buffer_load_voffset_large_12bit:237; NOPRT: ; %bb.0: ; %main_body238; NOPRT-NEXT: v_mov_b32_e32 v0, 0239; NOPRT-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], 0 idxen offset:4092240; NOPRT-NEXT: s_waitcnt vmcnt(0)241; NOPRT-NEXT: ; return to shader part epilog242;243; GFX12-LABEL: buffer_load_voffset_large_12bit:244; GFX12: ; %bb.0: ; %main_body245; GFX12-NEXT: v_mov_b32_e32 v0, 0246; GFX12-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], null idxen offset:4092247; GFX12-NEXT: s_wait_loadcnt 0x0248; GFX12-NEXT: ; return to shader part epilog249main_body:250 %data = call <4 x float> @llvm.amdgcn.struct.buffer.load.format.v4f32(<4 x i32> %0, i32 0, i32 4092, i32 0, i32 0)251 ret <4 x float> %data252}253 254define amdgpu_ps <4 x float> @buffer_load_voffset_large_13bit(<4 x i32> inreg) {255; GFX6-LABEL: buffer_load_voffset_large_13bit:256; GFX6: ; %bb.0: ; %main_body257; GFX6-NEXT: s_mov_b32 s4, 0258; GFX6-NEXT: v_mov_b32_e32 v1, 0x1000259; GFX6-NEXT: v_mov_b32_e32 v0, s4260; GFX6-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:4092261; GFX6-NEXT: s_waitcnt vmcnt(0)262; GFX6-NEXT: ; return to shader part epilog263;264; GFX8PLUS-LABEL: buffer_load_voffset_large_13bit:265; GFX8PLUS: ; %bb.0: ; %main_body266; GFX8PLUS-NEXT: s_mov_b32 s4, 0267; GFX8PLUS-NEXT: v_mov_b32_e32 v1, 0x1000268; GFX8PLUS-NEXT: v_mov_b32_e32 v0, s4269; GFX8PLUS-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:4092270; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)271; GFX8PLUS-NEXT: ; return to shader part epilog272;273; GFX11-LABEL: buffer_load_voffset_large_13bit:274; GFX11: ; %bb.0: ; %main_body275; GFX11-NEXT: s_mov_b32 s4, 0276; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)277; GFX11-NEXT: v_dual_mov_b32 v1, 0x1000 :: v_dual_mov_b32 v0, s4278; GFX11-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:4092279; GFX11-NEXT: s_waitcnt vmcnt(0)280; GFX11-NEXT: ; return to shader part epilog281;282; NOPRT-LABEL: buffer_load_voffset_large_13bit:283; NOPRT: ; %bb.0: ; %main_body284; NOPRT-NEXT: s_mov_b32 s4, 0285; NOPRT-NEXT: s_delay_alu instid0(SALU_CYCLE_1)286; NOPRT-NEXT: v_dual_mov_b32 v1, 0x1000 :: v_dual_mov_b32 v0, s4287; NOPRT-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:4092288; NOPRT-NEXT: s_waitcnt vmcnt(0)289; NOPRT-NEXT: ; return to shader part epilog290;291; GFX12-LABEL: buffer_load_voffset_large_13bit:292; GFX12: ; %bb.0: ; %main_body293; GFX12-NEXT: v_mov_b32_e32 v0, 0294; GFX12-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], null idxen offset:8188295; GFX12-NEXT: s_wait_loadcnt 0x0296; GFX12-NEXT: ; return to shader part epilog297main_body:298 %data = call <4 x float> @llvm.amdgcn.struct.buffer.load.format.v4f32(<4 x i32> %0, i32 0, i32 8188, i32 0, i32 0)299 ret <4 x float> %data300}301 302define amdgpu_ps <4 x float> @buffer_load_voffset_large_16bit(<4 x i32> inreg) {303; GFX6-LABEL: buffer_load_voffset_large_16bit:304; GFX6: ; %bb.0: ; %main_body305; GFX6-NEXT: s_mov_b32 s4, 0306; GFX6-NEXT: v_mov_b32_e32 v1, 0xf000307; GFX6-NEXT: v_mov_b32_e32 v0, s4308; GFX6-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:4092309; GFX6-NEXT: s_waitcnt vmcnt(0)310; GFX6-NEXT: ; return to shader part epilog311;312; GFX8PLUS-LABEL: buffer_load_voffset_large_16bit:313; GFX8PLUS: ; %bb.0: ; %main_body314; GFX8PLUS-NEXT: s_mov_b32 s4, 0315; GFX8PLUS-NEXT: v_mov_b32_e32 v1, 0xf000316; GFX8PLUS-NEXT: v_mov_b32_e32 v0, s4317; GFX8PLUS-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:4092318; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)319; GFX8PLUS-NEXT: ; return to shader part epilog320;321; GFX11-LABEL: buffer_load_voffset_large_16bit:322; GFX11: ; %bb.0: ; %main_body323; GFX11-NEXT: s_mov_b32 s4, 0324; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)325; GFX11-NEXT: v_dual_mov_b32 v1, 0xf000 :: v_dual_mov_b32 v0, s4326; GFX11-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:4092327; GFX11-NEXT: s_waitcnt vmcnt(0)328; GFX11-NEXT: ; return to shader part epilog329;330; NOPRT-LABEL: buffer_load_voffset_large_16bit:331; NOPRT: ; %bb.0: ; %main_body332; NOPRT-NEXT: s_mov_b32 s4, 0333; NOPRT-NEXT: s_delay_alu instid0(SALU_CYCLE_1)334; NOPRT-NEXT: v_dual_mov_b32 v1, 0xf000 :: v_dual_mov_b32 v0, s4335; NOPRT-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:4092336; NOPRT-NEXT: s_waitcnt vmcnt(0)337; NOPRT-NEXT: ; return to shader part epilog338;339; GFX12-LABEL: buffer_load_voffset_large_16bit:340; GFX12: ; %bb.0: ; %main_body341; GFX12-NEXT: v_mov_b32_e32 v0, 0342; GFX12-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], null idxen offset:65532343; GFX12-NEXT: s_wait_loadcnt 0x0344; GFX12-NEXT: ; return to shader part epilog345main_body:346 %data = call <4 x float> @llvm.amdgcn.struct.buffer.load.format.v4f32(<4 x i32> %0, i32 0, i32 65532, i32 0, i32 0)347 ret <4 x float> %data348}349 350define amdgpu_ps <4 x float> @buffer_load_voffset_large_23bit(<4 x i32> inreg) {351; GFX6-LABEL: buffer_load_voffset_large_23bit:352; GFX6: ; %bb.0: ; %main_body353; GFX6-NEXT: s_mov_b32 s4, 0354; GFX6-NEXT: v_mov_b32_e32 v1, 0x7ff000355; GFX6-NEXT: v_mov_b32_e32 v0, s4356; GFX6-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:4092357; GFX6-NEXT: s_waitcnt vmcnt(0)358; GFX6-NEXT: ; return to shader part epilog359;360; GFX8PLUS-LABEL: buffer_load_voffset_large_23bit:361; GFX8PLUS: ; %bb.0: ; %main_body362; GFX8PLUS-NEXT: s_mov_b32 s4, 0363; GFX8PLUS-NEXT: v_mov_b32_e32 v1, 0x7ff000364; GFX8PLUS-NEXT: v_mov_b32_e32 v0, s4365; GFX8PLUS-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:4092366; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)367; GFX8PLUS-NEXT: ; return to shader part epilog368;369; GFX11-LABEL: buffer_load_voffset_large_23bit:370; GFX11: ; %bb.0: ; %main_body371; GFX11-NEXT: s_mov_b32 s4, 0372; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)373; GFX11-NEXT: v_dual_mov_b32 v1, 0x7ff000 :: v_dual_mov_b32 v0, s4374; GFX11-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:4092375; GFX11-NEXT: s_waitcnt vmcnt(0)376; GFX11-NEXT: ; return to shader part epilog377;378; NOPRT-LABEL: buffer_load_voffset_large_23bit:379; NOPRT: ; %bb.0: ; %main_body380; NOPRT-NEXT: s_mov_b32 s4, 0381; NOPRT-NEXT: s_delay_alu instid0(SALU_CYCLE_1)382; NOPRT-NEXT: v_dual_mov_b32 v1, 0x7ff000 :: v_dual_mov_b32 v0, s4383; NOPRT-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:4092384; NOPRT-NEXT: s_waitcnt vmcnt(0)385; NOPRT-NEXT: ; return to shader part epilog386;387; GFX12-LABEL: buffer_load_voffset_large_23bit:388; GFX12: ; %bb.0: ; %main_body389; GFX12-NEXT: v_mov_b32_e32 v0, 0390; GFX12-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], null idxen offset:8388604391; GFX12-NEXT: s_wait_loadcnt 0x0392; GFX12-NEXT: ; return to shader part epilog393main_body:394 %data = call <4 x float> @llvm.amdgcn.struct.buffer.load.format.v4f32(<4 x i32> %0, i32 0, i32 8388604, i32 0, i32 0)395 ret <4 x float> %data396}397 398define amdgpu_ps <4 x float> @buffer_load_voffset_large_24bit(<4 x i32> inreg) {399; GFX6-LABEL: buffer_load_voffset_large_24bit:400; GFX6: ; %bb.0: ; %main_body401; GFX6-NEXT: s_mov_b32 s4, 0402; GFX6-NEXT: v_mov_b32_e32 v1, 0xfff000403; GFX6-NEXT: v_mov_b32_e32 v0, s4404; GFX6-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:4092405; GFX6-NEXT: s_waitcnt vmcnt(0)406; GFX6-NEXT: ; return to shader part epilog407;408; GFX8PLUS-LABEL: buffer_load_voffset_large_24bit:409; GFX8PLUS: ; %bb.0: ; %main_body410; GFX8PLUS-NEXT: s_mov_b32 s4, 0411; GFX8PLUS-NEXT: v_mov_b32_e32 v1, 0xfff000412; GFX8PLUS-NEXT: v_mov_b32_e32 v0, s4413; GFX8PLUS-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:4092414; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)415; GFX8PLUS-NEXT: ; return to shader part epilog416;417; GFX11-LABEL: buffer_load_voffset_large_24bit:418; GFX11: ; %bb.0: ; %main_body419; GFX11-NEXT: s_mov_b32 s4, 0420; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)421; GFX11-NEXT: v_dual_mov_b32 v1, 0xfff000 :: v_dual_mov_b32 v0, s4422; GFX11-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:4092423; GFX11-NEXT: s_waitcnt vmcnt(0)424; GFX11-NEXT: ; return to shader part epilog425;426; NOPRT-LABEL: buffer_load_voffset_large_24bit:427; NOPRT: ; %bb.0: ; %main_body428; NOPRT-NEXT: s_mov_b32 s4, 0429; NOPRT-NEXT: s_delay_alu instid0(SALU_CYCLE_1)430; NOPRT-NEXT: v_dual_mov_b32 v1, 0xfff000 :: v_dual_mov_b32 v0, s4431; NOPRT-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:4092432; NOPRT-NEXT: s_waitcnt vmcnt(0)433; NOPRT-NEXT: ; return to shader part epilog434;435; GFX12-SDAG-LABEL: buffer_load_voffset_large_24bit:436; GFX12-SDAG: ; %bb.0: ; %main_body437; GFX12-SDAG-NEXT: v_dual_mov_b32 v1, 0x800000 :: v_dual_mov_b32 v0, 0438; GFX12-SDAG-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], null idxen offen offset:8388604439; GFX12-SDAG-NEXT: s_wait_loadcnt 0x0440; GFX12-SDAG-NEXT: ; return to shader part epilog441;442; GFX12-GISEL-LABEL: buffer_load_voffset_large_24bit:443; GFX12-GISEL: ; %bb.0: ; %main_body444; GFX12-GISEL-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x800000445; GFX12-GISEL-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], null idxen offen offset:8388604446; GFX12-GISEL-NEXT: s_wait_loadcnt 0x0447; GFX12-GISEL-NEXT: ; return to shader part epilog448main_body:449 %data = call <4 x float> @llvm.amdgcn.struct.buffer.load.format.v4f32(<4 x i32> %0, i32 0, i32 16777212, i32 0, i32 0)450 ret <4 x float> %data451}452 453define amdgpu_ps <4 x float> @buffer_load_idx(<4 x i32> inreg, i32) {454; GFX6-LABEL: buffer_load_idx:455; GFX6: ; %bb.0: ; %main_body456; GFX6-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], 0 idxen457; GFX6-NEXT: s_waitcnt vmcnt(0)458; GFX6-NEXT: ; return to shader part epilog459;460; GFX8PLUS-LABEL: buffer_load_idx:461; GFX8PLUS: ; %bb.0: ; %main_body462; GFX8PLUS-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], 0 idxen463; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)464; GFX8PLUS-NEXT: ; return to shader part epilog465;466; GFX11-LABEL: buffer_load_idx:467; GFX11: ; %bb.0: ; %main_body468; GFX11-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], 0 idxen469; GFX11-NEXT: s_waitcnt vmcnt(0)470; GFX11-NEXT: ; return to shader part epilog471;472; NOPRT-LABEL: buffer_load_idx:473; NOPRT: ; %bb.0: ; %main_body474; NOPRT-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], 0 idxen475; NOPRT-NEXT: s_waitcnt vmcnt(0)476; NOPRT-NEXT: ; return to shader part epilog477;478; GFX12-LABEL: buffer_load_idx:479; GFX12: ; %bb.0: ; %main_body480; GFX12-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], null idxen481; GFX12-NEXT: s_wait_loadcnt 0x0482; GFX12-NEXT: ; return to shader part epilog483main_body:484 %data = call <4 x float> @llvm.amdgcn.struct.buffer.load.format.v4f32(<4 x i32> %0, i32 %1, i32 0, i32 0, i32 0)485 ret <4 x float> %data486}487 488define amdgpu_ps <4 x float> @buffer_load_ofs(<4 x i32> inreg, i32) {489; GFX6-LABEL: buffer_load_ofs:490; GFX6: ; %bb.0: ; %main_body491; GFX6-NEXT: s_mov_b32 s4, 0492; GFX6-NEXT: v_mov_b32_e32 v1, v0493; GFX6-NEXT: v_mov_b32_e32 v0, s4494; GFX6-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen495; GFX6-NEXT: s_waitcnt vmcnt(0)496; GFX6-NEXT: ; return to shader part epilog497;498; GFX8PLUS-LABEL: buffer_load_ofs:499; GFX8PLUS: ; %bb.0: ; %main_body500; GFX8PLUS-NEXT: s_mov_b32 s4, 0501; GFX8PLUS-NEXT: v_mov_b32_e32 v1, v0502; GFX8PLUS-NEXT: v_mov_b32_e32 v0, s4503; GFX8PLUS-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen504; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)505; GFX8PLUS-NEXT: ; return to shader part epilog506;507; GFX11-LABEL: buffer_load_ofs:508; GFX11: ; %bb.0: ; %main_body509; GFX11-NEXT: s_mov_b32 s4, 0510; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)511; GFX11-NEXT: v_dual_mov_b32 v1, v0 :: v_dual_mov_b32 v0, s4512; GFX11-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen513; GFX11-NEXT: s_waitcnt vmcnt(0)514; GFX11-NEXT: ; return to shader part epilog515;516; NOPRT-LABEL: buffer_load_ofs:517; NOPRT: ; %bb.0: ; %main_body518; NOPRT-NEXT: s_mov_b32 s4, 0519; NOPRT-NEXT: s_delay_alu instid0(SALU_CYCLE_1)520; NOPRT-NEXT: v_dual_mov_b32 v1, v0 :: v_dual_mov_b32 v0, s4521; NOPRT-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen522; NOPRT-NEXT: s_waitcnt vmcnt(0)523; NOPRT-NEXT: ; return to shader part epilog524;525; GFX12-LABEL: buffer_load_ofs:526; GFX12: ; %bb.0: ; %main_body527; GFX12-NEXT: v_dual_mov_b32 v1, v0 :: v_dual_mov_b32 v0, 0528; GFX12-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], null idxen offen529; GFX12-NEXT: s_wait_loadcnt 0x0530; GFX12-NEXT: ; return to shader part epilog531main_body:532 %data = call <4 x float> @llvm.amdgcn.struct.buffer.load.format.v4f32(<4 x i32> %0, i32 0, i32 %1, i32 0, i32 0)533 ret <4 x float> %data534}535 536define amdgpu_ps <4 x float> @buffer_load_ofs_imm(<4 x i32> inreg, i32) {537; GFX6-LABEL: buffer_load_ofs_imm:538; GFX6: ; %bb.0: ; %main_body539; GFX6-NEXT: s_mov_b32 s4, 0540; GFX6-NEXT: v_mov_b32_e32 v1, v0541; GFX6-NEXT: v_mov_b32_e32 v0, s4542; GFX6-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:60543; GFX6-NEXT: s_waitcnt vmcnt(0)544; GFX6-NEXT: ; return to shader part epilog545;546; GFX8PLUS-LABEL: buffer_load_ofs_imm:547; GFX8PLUS: ; %bb.0: ; %main_body548; GFX8PLUS-NEXT: s_mov_b32 s4, 0549; GFX8PLUS-NEXT: v_mov_b32_e32 v1, v0550; GFX8PLUS-NEXT: v_mov_b32_e32 v0, s4551; GFX8PLUS-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:60552; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)553; GFX8PLUS-NEXT: ; return to shader part epilog554;555; GFX11-LABEL: buffer_load_ofs_imm:556; GFX11: ; %bb.0: ; %main_body557; GFX11-NEXT: s_mov_b32 s4, 0558; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)559; GFX11-NEXT: v_dual_mov_b32 v1, v0 :: v_dual_mov_b32 v0, s4560; GFX11-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:60561; GFX11-NEXT: s_waitcnt vmcnt(0)562; GFX11-NEXT: ; return to shader part epilog563;564; NOPRT-LABEL: buffer_load_ofs_imm:565; NOPRT: ; %bb.0: ; %main_body566; NOPRT-NEXT: s_mov_b32 s4, 0567; NOPRT-NEXT: s_delay_alu instid0(SALU_CYCLE_1)568; NOPRT-NEXT: v_dual_mov_b32 v1, v0 :: v_dual_mov_b32 v0, s4569; NOPRT-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen offset:60570; NOPRT-NEXT: s_waitcnt vmcnt(0)571; NOPRT-NEXT: ; return to shader part epilog572;573; GFX12-LABEL: buffer_load_ofs_imm:574; GFX12: ; %bb.0: ; %main_body575; GFX12-NEXT: v_dual_mov_b32 v1, v0 :: v_dual_mov_b32 v0, 0576; GFX12-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], null idxen offen offset:60577; GFX12-NEXT: s_wait_loadcnt 0x0578; GFX12-NEXT: ; return to shader part epilog579main_body:580 %ofs = add i32 %1, 60581 %data = call <4 x float> @llvm.amdgcn.struct.buffer.load.format.v4f32(<4 x i32> %0, i32 0, i32 %ofs, i32 0, i32 0)582 ret <4 x float> %data583}584 585define amdgpu_ps <4 x float> @buffer_load_both(<4 x i32> inreg, i32, i32) {586; GFX6-LABEL: buffer_load_both:587; GFX6: ; %bb.0: ; %main_body588; GFX6-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen589; GFX6-NEXT: s_waitcnt vmcnt(0)590; GFX6-NEXT: ; return to shader part epilog591;592; GFX8PLUS-LABEL: buffer_load_both:593; GFX8PLUS: ; %bb.0: ; %main_body594; GFX8PLUS-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen595; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)596; GFX8PLUS-NEXT: ; return to shader part epilog597;598; GFX11-LABEL: buffer_load_both:599; GFX11: ; %bb.0: ; %main_body600; GFX11-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen601; GFX11-NEXT: s_waitcnt vmcnt(0)602; GFX11-NEXT: ; return to shader part epilog603;604; NOPRT-LABEL: buffer_load_both:605; NOPRT: ; %bb.0: ; %main_body606; NOPRT-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], 0 idxen offen607; NOPRT-NEXT: s_waitcnt vmcnt(0)608; NOPRT-NEXT: ; return to shader part epilog609;610; GFX12-LABEL: buffer_load_both:611; GFX12: ; %bb.0: ; %main_body612; GFX12-NEXT: buffer_load_format_xyzw v[0:3], v[0:1], s[0:3], null idxen offen613; GFX12-NEXT: s_wait_loadcnt 0x0614; GFX12-NEXT: ; return to shader part epilog615main_body:616 %data = call <4 x float> @llvm.amdgcn.struct.buffer.load.format.v4f32(<4 x i32> %0, i32 %1, i32 %2, i32 0, i32 0)617 ret <4 x float> %data618}619 620define amdgpu_ps <4 x float> @buffer_load_both_reversed(<4 x i32> inreg, i32, i32) {621; GFX6-LABEL: buffer_load_both_reversed:622; GFX6: ; %bb.0: ; %main_body623; GFX6-NEXT: v_mov_b32_e32 v2, v0624; GFX6-NEXT: buffer_load_format_xyzw v[0:3], v[1:2], s[0:3], 0 idxen offen625; GFX6-NEXT: s_waitcnt vmcnt(0)626; GFX6-NEXT: ; return to shader part epilog627;628; GFX8PLUS-LABEL: buffer_load_both_reversed:629; GFX8PLUS: ; %bb.0: ; %main_body630; GFX8PLUS-NEXT: v_mov_b32_e32 v2, v0631; GFX8PLUS-NEXT: buffer_load_format_xyzw v[0:3], v[1:2], s[0:3], 0 idxen offen632; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)633; GFX8PLUS-NEXT: ; return to shader part epilog634;635; GFX11-LABEL: buffer_load_both_reversed:636; GFX11: ; %bb.0: ; %main_body637; GFX11-NEXT: v_mov_b32_e32 v2, v0638; GFX11-NEXT: buffer_load_format_xyzw v[0:3], v[1:2], s[0:3], 0 idxen offen639; GFX11-NEXT: s_waitcnt vmcnt(0)640; GFX11-NEXT: ; return to shader part epilog641;642; NOPRT-LABEL: buffer_load_both_reversed:643; NOPRT: ; %bb.0: ; %main_body644; NOPRT-NEXT: v_mov_b32_e32 v2, v0645; NOPRT-NEXT: buffer_load_format_xyzw v[0:3], v[1:2], s[0:3], 0 idxen offen646; NOPRT-NEXT: s_waitcnt vmcnt(0)647; NOPRT-NEXT: ; return to shader part epilog648;649; GFX12-LABEL: buffer_load_both_reversed:650; GFX12: ; %bb.0: ; %main_body651; GFX12-NEXT: v_mov_b32_e32 v2, v0652; GFX12-NEXT: buffer_load_format_xyzw v[0:3], v[1:2], s[0:3], null idxen offen653; GFX12-NEXT: s_wait_loadcnt 0x0654; GFX12-NEXT: ; return to shader part epilog655main_body:656 %data = call <4 x float> @llvm.amdgcn.struct.buffer.load.format.v4f32(<4 x i32> %0, i32 %2, i32 %1, i32 0, i32 0)657 ret <4 x float> %data658}659 660define amdgpu_ps float @buffer_load_x(<4 x i32> inreg %rsrc) {661; GFX6-LABEL: buffer_load_x:662; GFX6: ; %bb.0: ; %main_body663; GFX6-NEXT: v_mov_b32_e32 v0, 0664; GFX6-NEXT: buffer_load_format_x v0, v0, s[0:3], 0 idxen665; GFX6-NEXT: s_waitcnt vmcnt(0)666; GFX6-NEXT: ; return to shader part epilog667;668; GFX8PLUS-LABEL: buffer_load_x:669; GFX8PLUS: ; %bb.0: ; %main_body670; GFX8PLUS-NEXT: v_mov_b32_e32 v0, 0671; GFX8PLUS-NEXT: buffer_load_format_x v0, v0, s[0:3], 0 idxen672; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)673; GFX8PLUS-NEXT: ; return to shader part epilog674;675; GFX11-LABEL: buffer_load_x:676; GFX11: ; %bb.0: ; %main_body677; GFX11-NEXT: v_mov_b32_e32 v0, 0678; GFX11-NEXT: buffer_load_format_x v0, v0, s[0:3], 0 idxen679; GFX11-NEXT: s_waitcnt vmcnt(0)680; GFX11-NEXT: ; return to shader part epilog681;682; NOPRT-LABEL: buffer_load_x:683; NOPRT: ; %bb.0: ; %main_body684; NOPRT-NEXT: v_mov_b32_e32 v0, 0685; NOPRT-NEXT: buffer_load_format_x v0, v0, s[0:3], 0 idxen686; NOPRT-NEXT: s_waitcnt vmcnt(0)687; NOPRT-NEXT: ; return to shader part epilog688;689; GFX12-LABEL: buffer_load_x:690; GFX12: ; %bb.0: ; %main_body691; GFX12-NEXT: v_mov_b32_e32 v0, 0692; GFX12-NEXT: buffer_load_format_x v0, v0, s[0:3], null idxen693; GFX12-NEXT: s_wait_loadcnt 0x0694; GFX12-NEXT: ; return to shader part epilog695main_body:696 %data = call float @llvm.amdgcn.struct.buffer.load.format.f32(<4 x i32> %rsrc, i32 0, i32 0, i32 0, i32 0)697 ret float %data698}699 700define amdgpu_ps float @buffer_load_x_i32(<4 x i32> inreg %rsrc) {701; GFX6-LABEL: buffer_load_x_i32:702; GFX6: ; %bb.0: ; %main_body703; GFX6-NEXT: v_mov_b32_e32 v0, 0704; GFX6-NEXT: buffer_load_format_x v0, v0, s[0:3], 0 idxen705; GFX6-NEXT: s_waitcnt vmcnt(0)706; GFX6-NEXT: ; return to shader part epilog707;708; GFX8PLUS-LABEL: buffer_load_x_i32:709; GFX8PLUS: ; %bb.0: ; %main_body710; GFX8PLUS-NEXT: v_mov_b32_e32 v0, 0711; GFX8PLUS-NEXT: buffer_load_format_x v0, v0, s[0:3], 0 idxen712; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)713; GFX8PLUS-NEXT: ; return to shader part epilog714;715; GFX11-LABEL: buffer_load_x_i32:716; GFX11: ; %bb.0: ; %main_body717; GFX11-NEXT: v_mov_b32_e32 v0, 0718; GFX11-NEXT: buffer_load_format_x v0, v0, s[0:3], 0 idxen719; GFX11-NEXT: s_waitcnt vmcnt(0)720; GFX11-NEXT: ; return to shader part epilog721;722; NOPRT-LABEL: buffer_load_x_i32:723; NOPRT: ; %bb.0: ; %main_body724; NOPRT-NEXT: v_mov_b32_e32 v0, 0725; NOPRT-NEXT: buffer_load_format_x v0, v0, s[0:3], 0 idxen726; NOPRT-NEXT: s_waitcnt vmcnt(0)727; NOPRT-NEXT: ; return to shader part epilog728;729; GFX12-LABEL: buffer_load_x_i32:730; GFX12: ; %bb.0: ; %main_body731; GFX12-NEXT: v_mov_b32_e32 v0, 0732; GFX12-NEXT: buffer_load_format_x v0, v0, s[0:3], null idxen733; GFX12-NEXT: s_wait_loadcnt 0x0734; GFX12-NEXT: ; return to shader part epilog735main_body:736 %data = call i32 @llvm.amdgcn.struct.buffer.load.format.i32(<4 x i32> %rsrc, i32 0, i32 0, i32 0, i32 0)737 %fdata = bitcast i32 %data to float738 ret float %fdata739}740 741define amdgpu_ps <2 x float> @buffer_load_xy(<4 x i32> inreg %rsrc) {742; GFX6-LABEL: buffer_load_xy:743; GFX6: ; %bb.0: ; %main_body744; GFX6-NEXT: v_mov_b32_e32 v0, 0745; GFX6-NEXT: buffer_load_format_xy v[0:1], v0, s[0:3], 0 idxen746; GFX6-NEXT: s_waitcnt vmcnt(0)747; GFX6-NEXT: ; return to shader part epilog748;749; GFX8PLUS-LABEL: buffer_load_xy:750; GFX8PLUS: ; %bb.0: ; %main_body751; GFX8PLUS-NEXT: v_mov_b32_e32 v0, 0752; GFX8PLUS-NEXT: buffer_load_format_xy v[0:1], v0, s[0:3], 0 idxen753; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)754; GFX8PLUS-NEXT: ; return to shader part epilog755;756; GFX11-LABEL: buffer_load_xy:757; GFX11: ; %bb.0: ; %main_body758; GFX11-NEXT: v_mov_b32_e32 v0, 0759; GFX11-NEXT: buffer_load_format_xy v[0:1], v0, s[0:3], 0 idxen760; GFX11-NEXT: s_waitcnt vmcnt(0)761; GFX11-NEXT: ; return to shader part epilog762;763; NOPRT-LABEL: buffer_load_xy:764; NOPRT: ; %bb.0: ; %main_body765; NOPRT-NEXT: v_mov_b32_e32 v0, 0766; NOPRT-NEXT: buffer_load_format_xy v[0:1], v0, s[0:3], 0 idxen767; NOPRT-NEXT: s_waitcnt vmcnt(0)768; NOPRT-NEXT: ; return to shader part epilog769;770; GFX12-LABEL: buffer_load_xy:771; GFX12: ; %bb.0: ; %main_body772; GFX12-NEXT: v_mov_b32_e32 v0, 0773; GFX12-NEXT: buffer_load_format_xy v[0:1], v0, s[0:3], null idxen774; GFX12-NEXT: s_wait_loadcnt 0x0775; GFX12-NEXT: ; return to shader part epilog776main_body:777 %data = call <2 x float> @llvm.amdgcn.struct.buffer.load.format.v2f32(<4 x i32> %rsrc, i32 0, i32 0, i32 0, i32 0)778 ret <2 x float> %data779}780 781define amdgpu_cs float @buffer_load_v4i32_tfe(<4 x i32> inreg %rsrc, ptr addrspace(1) %out) {782; GFX6-LABEL: buffer_load_v4i32_tfe:783; GFX6: ; %bb.0:784; GFX6-NEXT: v_mov_b32_e32 v2, 0785; GFX6-NEXT: v_mov_b32_e32 v7, 2786; GFX6-NEXT: v_mov_b32_e32 v3, v2787; GFX6-NEXT: v_mov_b32_e32 v4, v2788; GFX6-NEXT: v_mov_b32_e32 v5, v2789; GFX6-NEXT: v_mov_b32_e32 v6, v2790; GFX6-NEXT: buffer_load_format_xyzw v[2:6], v7, s[0:3], 0 idxen tfe791; GFX6-NEXT: s_mov_b32 s2, 0792; GFX6-NEXT: s_mov_b32 s3, 0xf000793; GFX6-NEXT: s_mov_b32 s0, s2794; GFX6-NEXT: s_mov_b32 s1, s2795; GFX6-NEXT: s_waitcnt vmcnt(0)796; GFX6-NEXT: buffer_store_dwordx4 v[2:5], v[0:1], s[0:3], 0 addr64797; GFX6-NEXT: v_mov_b32_e32 v0, v6798; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0)799; GFX6-NEXT: ; return to shader part epilog800;801; GFX8PLUS-LABEL: buffer_load_v4i32_tfe:802; GFX8PLUS: ; %bb.0:803; GFX8PLUS-NEXT: v_mov_b32_e32 v2, 0804; GFX8PLUS-NEXT: v_mov_b32_e32 v7, 2805; GFX8PLUS-NEXT: v_mov_b32_e32 v3, v2806; GFX8PLUS-NEXT: v_mov_b32_e32 v4, v2807; GFX8PLUS-NEXT: v_mov_b32_e32 v5, v2808; GFX8PLUS-NEXT: v_mov_b32_e32 v6, v2809; GFX8PLUS-NEXT: buffer_load_format_xyzw v[2:6], v7, s[0:3], 0 idxen tfe810; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)811; GFX8PLUS-NEXT: flat_store_dwordx4 v[0:1], v[2:5]812; GFX8PLUS-NEXT: v_mov_b32_e32 v0, v6813; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)814; GFX8PLUS-NEXT: ; return to shader part epilog815;816; GFX11-LABEL: buffer_load_v4i32_tfe:817; GFX11: ; %bb.0:818; GFX11-NEXT: v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v7, 2819; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)820; GFX11-NEXT: v_mov_b32_e32 v3, v2821; GFX11-NEXT: v_mov_b32_e32 v4, v2822; GFX11-NEXT: v_mov_b32_e32 v5, v2823; GFX11-NEXT: v_mov_b32_e32 v6, v2824; GFX11-NEXT: buffer_load_format_xyzw v[2:6], v7, s[0:3], 0 idxen tfe825; GFX11-NEXT: s_waitcnt vmcnt(0)826; GFX11-NEXT: global_store_b128 v[0:1], v[2:5], off827; GFX11-NEXT: v_mov_b32_e32 v0, v6828; GFX11-NEXT: ; return to shader part epilog829;830; NOPRT-LABEL: buffer_load_v4i32_tfe:831; NOPRT: ; %bb.0:832; NOPRT-NEXT: v_mov_b32_e32 v2, 2833; NOPRT-NEXT: v_mov_b32_e32 v6, 0834; NOPRT-NEXT: buffer_load_format_xyzw v[2:6], v2, s[0:3], 0 idxen tfe835; NOPRT-NEXT: s_waitcnt vmcnt(0)836; NOPRT-NEXT: global_store_b128 v[0:1], v[2:5], off837; NOPRT-NEXT: v_mov_b32_e32 v0, v6838; NOPRT-NEXT: ; return to shader part epilog839;840; GFX12-LABEL: buffer_load_v4i32_tfe:841; GFX12: ; %bb.0:842; GFX12-NEXT: v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v7, 2843; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)844; GFX12-NEXT: v_dual_mov_b32 v3, v2 :: v_dual_mov_b32 v4, v2845; GFX12-NEXT: v_dual_mov_b32 v5, v2 :: v_dual_mov_b32 v6, v2846; GFX12-NEXT: buffer_load_format_xyzw v[2:6], v7, s[0:3], null idxen tfe847; GFX12-NEXT: s_wait_loadcnt 0x0848; GFX12-NEXT: global_store_b128 v[0:1], v[2:5], off849; GFX12-NEXT: v_mov_b32_e32 v0, v6850; GFX12-NEXT: ; return to shader part epilog851 %load = call { <4 x i32>, i32 } @llvm.amdgcn.struct.buffer.load.format.sl_v4i32i32s(<4 x i32> %rsrc, i32 2, i32 0, i32 0, i32 0)852 %data = extractvalue { <4 x i32>, i32 } %load, 0853 store <4 x i32> %data, ptr addrspace(1) %out854 %status = extractvalue { <4 x i32>, i32 } %load, 1855 %fstatus = bitcast i32 %status to float856 ret float %fstatus857}858 859define amdgpu_cs float @buffer_load_v4f32_tfe(<4 x i32> inreg %rsrc, ptr addrspace(1) %out) {860; GFX6-LABEL: buffer_load_v4f32_tfe:861; GFX6: ; %bb.0:862; GFX6-NEXT: v_mov_b32_e32 v2, 0863; GFX6-NEXT: v_mov_b32_e32 v3, v2864; GFX6-NEXT: v_mov_b32_e32 v4, v2865; GFX6-NEXT: v_mov_b32_e32 v5, v2866; GFX6-NEXT: v_mov_b32_e32 v6, v2867; GFX6-NEXT: buffer_load_format_xyzw v[2:6], v2, s[0:3], 0 idxen tfe868; GFX6-NEXT: s_mov_b32 s2, 0869; GFX6-NEXT: s_mov_b32 s3, 0xf000870; GFX6-NEXT: s_mov_b32 s0, s2871; GFX6-NEXT: s_mov_b32 s1, s2872; GFX6-NEXT: s_waitcnt vmcnt(0)873; GFX6-NEXT: buffer_store_dwordx4 v[2:5], v[0:1], s[0:3], 0 addr64874; GFX6-NEXT: v_mov_b32_e32 v0, v6875; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0)876; GFX6-NEXT: ; return to shader part epilog877;878; GFX8PLUS-LABEL: buffer_load_v4f32_tfe:879; GFX8PLUS: ; %bb.0:880; GFX8PLUS-NEXT: v_mov_b32_e32 v2, 0881; GFX8PLUS-NEXT: v_mov_b32_e32 v3, v2882; GFX8PLUS-NEXT: v_mov_b32_e32 v4, v2883; GFX8PLUS-NEXT: v_mov_b32_e32 v5, v2884; GFX8PLUS-NEXT: v_mov_b32_e32 v6, v2885; GFX8PLUS-NEXT: buffer_load_format_xyzw v[2:6], v2, s[0:3], 0 idxen tfe886; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)887; GFX8PLUS-NEXT: flat_store_dwordx4 v[0:1], v[2:5]888; GFX8PLUS-NEXT: v_mov_b32_e32 v0, v6889; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)890; GFX8PLUS-NEXT: ; return to shader part epilog891;892; GFX11-LABEL: buffer_load_v4f32_tfe:893; GFX11: ; %bb.0:894; GFX11-NEXT: v_mov_b32_e32 v2, 0895; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)896; GFX11-NEXT: v_mov_b32_e32 v3, v2897; GFX11-NEXT: v_mov_b32_e32 v4, v2898; GFX11-NEXT: v_mov_b32_e32 v5, v2899; GFX11-NEXT: v_mov_b32_e32 v6, v2900; GFX11-NEXT: buffer_load_format_xyzw v[2:6], v2, s[0:3], 0 idxen tfe901; GFX11-NEXT: s_waitcnt vmcnt(0)902; GFX11-NEXT: global_store_b128 v[0:1], v[2:5], off903; GFX11-NEXT: v_mov_b32_e32 v0, v6904; GFX11-NEXT: ; return to shader part epilog905;906; NOPRT-LABEL: buffer_load_v4f32_tfe:907; NOPRT: ; %bb.0:908; NOPRT-NEXT: v_mov_b32_e32 v6, 0909; NOPRT-NEXT: buffer_load_format_xyzw v[2:6], v6, s[0:3], 0 idxen tfe910; NOPRT-NEXT: s_waitcnt vmcnt(0)911; NOPRT-NEXT: global_store_b128 v[0:1], v[2:5], off912; NOPRT-NEXT: v_mov_b32_e32 v0, v6913; NOPRT-NEXT: ; return to shader part epilog914;915; GFX12-LABEL: buffer_load_v4f32_tfe:916; GFX12: ; %bb.0:917; GFX12-NEXT: v_mov_b32_e32 v2, 0918; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)919; GFX12-NEXT: v_dual_mov_b32 v3, v2 :: v_dual_mov_b32 v4, v2920; GFX12-NEXT: v_dual_mov_b32 v5, v2 :: v_dual_mov_b32 v6, v2921; GFX12-NEXT: buffer_load_format_xyzw v[2:6], v2, s[0:3], null idxen tfe922; GFX12-NEXT: s_wait_loadcnt 0x0923; GFX12-NEXT: global_store_b128 v[0:1], v[2:5], off924; GFX12-NEXT: v_mov_b32_e32 v0, v6925; GFX12-NEXT: ; return to shader part epilog926 %load = call { <4 x float>, i32 } @llvm.amdgcn.struct.buffer.load.format.sl_v4f32i32s(<4 x i32> %rsrc, i32 0, i32 0, i32 0, i32 0)927 %data = extractvalue { <4 x float>, i32 } %load, 0928 store <4 x float> %data, ptr addrspace(1) %out929 %status = extractvalue { <4 x float>, i32 } %load, 1930 %fstatus = bitcast i32 %status to float931 ret float %fstatus932}933 934define amdgpu_cs float @buffer_load_v3i32_tfe(<4 x i32> inreg %rsrc, ptr addrspace(1) %out) {935; GFX6-LABEL: buffer_load_v3i32_tfe:936; GFX6: ; %bb.0:937; GFX6-NEXT: v_mov_b32_e32 v2, 0938; GFX6-NEXT: v_mov_b32_e32 v3, v2939; GFX6-NEXT: v_mov_b32_e32 v4, v2940; GFX6-NEXT: v_mov_b32_e32 v5, v2941; GFX6-NEXT: buffer_load_format_xyz v[2:5], v2, s[0:3], 0 idxen tfe942; GFX6-NEXT: s_mov_b32 s2, 0943; GFX6-NEXT: s_mov_b32 s3, 0xf000944; GFX6-NEXT: s_mov_b32 s0, s2945; GFX6-NEXT: s_mov_b32 s1, s2946; GFX6-NEXT: s_waitcnt vmcnt(0)947; GFX6-NEXT: buffer_store_dword v4, v[0:1], s[0:3], 0 addr64 offset:8948; GFX6-NEXT: buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64949; GFX6-NEXT: v_mov_b32_e32 v0, v5950; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0)951; GFX6-NEXT: ; return to shader part epilog952;953; GFX8PLUS-LABEL: buffer_load_v3i32_tfe:954; GFX8PLUS: ; %bb.0:955; GFX8PLUS-NEXT: v_mov_b32_e32 v2, 0956; GFX8PLUS-NEXT: v_mov_b32_e32 v3, v2957; GFX8PLUS-NEXT: v_mov_b32_e32 v4, v2958; GFX8PLUS-NEXT: v_mov_b32_e32 v5, v2959; GFX8PLUS-NEXT: buffer_load_format_xyz v[2:5], v2, s[0:3], 0 idxen tfe960; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)961; GFX8PLUS-NEXT: flat_store_dwordx3 v[0:1], v[2:4]962; GFX8PLUS-NEXT: v_mov_b32_e32 v0, v5963; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)964; GFX8PLUS-NEXT: ; return to shader part epilog965;966; GFX11-LABEL: buffer_load_v3i32_tfe:967; GFX11: ; %bb.0:968; GFX11-NEXT: v_mov_b32_e32 v2, 0969; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)970; GFX11-NEXT: v_mov_b32_e32 v3, v2971; GFX11-NEXT: v_mov_b32_e32 v4, v2972; GFX11-NEXT: v_mov_b32_e32 v5, v2973; GFX11-NEXT: buffer_load_format_xyz v[2:5], v2, s[0:3], 0 idxen tfe974; GFX11-NEXT: s_waitcnt vmcnt(0)975; GFX11-NEXT: global_store_b96 v[0:1], v[2:4], off976; GFX11-NEXT: v_mov_b32_e32 v0, v5977; GFX11-NEXT: ; return to shader part epilog978;979; NOPRT-LABEL: buffer_load_v3i32_tfe:980; NOPRT: ; %bb.0:981; NOPRT-NEXT: v_mov_b32_e32 v5, 0982; NOPRT-NEXT: buffer_load_format_xyz v[2:5], v5, s[0:3], 0 idxen tfe983; NOPRT-NEXT: s_waitcnt vmcnt(0)984; NOPRT-NEXT: global_store_b96 v[0:1], v[2:4], off985; NOPRT-NEXT: v_mov_b32_e32 v0, v5986; NOPRT-NEXT: ; return to shader part epilog987;988; GFX12-LABEL: buffer_load_v3i32_tfe:989; GFX12: ; %bb.0:990; GFX12-NEXT: v_mov_b32_e32 v2, 0991; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)992; GFX12-NEXT: v_dual_mov_b32 v3, v2 :: v_dual_mov_b32 v4, v2993; GFX12-NEXT: v_mov_b32_e32 v5, v2994; GFX12-NEXT: buffer_load_format_xyz v[2:5], v2, s[0:3], null idxen tfe995; GFX12-NEXT: s_wait_loadcnt 0x0996; GFX12-NEXT: global_store_b96 v[0:1], v[2:4], off997; GFX12-NEXT: v_mov_b32_e32 v0, v5998; GFX12-NEXT: ; return to shader part epilog999 %load = call { <3 x i32>, i32 } @llvm.amdgcn.struct.buffer.load.format.sl_v3i32i32s(<4 x i32> %rsrc, i32 0, i32 0, i32 0, i32 0)1000 %data = extractvalue { <3 x i32>, i32 } %load, 01001 store <3 x i32> %data, ptr addrspace(1) %out1002 %status = extractvalue { <3 x i32>, i32 } %load, 11003 %fstatus = bitcast i32 %status to float1004 ret float %fstatus1005}1006 1007define amdgpu_cs float @buffer_load_v3f32_tfe(<4 x i32> inreg %rsrc, ptr addrspace(1) %out) {1008; GFX6-LABEL: buffer_load_v3f32_tfe:1009; GFX6: ; %bb.0:1010; GFX6-NEXT: v_mov_b32_e32 v2, 01011; GFX6-NEXT: v_mov_b32_e32 v3, v21012; GFX6-NEXT: v_mov_b32_e32 v4, v21013; GFX6-NEXT: v_mov_b32_e32 v5, v21014; GFX6-NEXT: buffer_load_format_xyz v[2:5], v2, s[0:3], 0 idxen tfe1015; GFX6-NEXT: s_mov_b32 s2, 01016; GFX6-NEXT: s_mov_b32 s3, 0xf0001017; GFX6-NEXT: s_mov_b32 s0, s21018; GFX6-NEXT: s_mov_b32 s1, s21019; GFX6-NEXT: s_waitcnt vmcnt(0)1020; GFX6-NEXT: buffer_store_dword v4, v[0:1], s[0:3], 0 addr64 offset:81021; GFX6-NEXT: buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr641022; GFX6-NEXT: v_mov_b32_e32 v0, v51023; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0)1024; GFX6-NEXT: ; return to shader part epilog1025;1026; GFX8PLUS-LABEL: buffer_load_v3f32_tfe:1027; GFX8PLUS: ; %bb.0:1028; GFX8PLUS-NEXT: v_mov_b32_e32 v2, 01029; GFX8PLUS-NEXT: v_mov_b32_e32 v3, v21030; GFX8PLUS-NEXT: v_mov_b32_e32 v4, v21031; GFX8PLUS-NEXT: v_mov_b32_e32 v5, v21032; GFX8PLUS-NEXT: buffer_load_format_xyz v[2:5], v2, s[0:3], 0 idxen tfe1033; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)1034; GFX8PLUS-NEXT: flat_store_dwordx3 v[0:1], v[2:4]1035; GFX8PLUS-NEXT: v_mov_b32_e32 v0, v51036; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)1037; GFX8PLUS-NEXT: ; return to shader part epilog1038;1039; GFX11-LABEL: buffer_load_v3f32_tfe:1040; GFX11: ; %bb.0:1041; GFX11-NEXT: v_mov_b32_e32 v2, 01042; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1043; GFX11-NEXT: v_mov_b32_e32 v3, v21044; GFX11-NEXT: v_mov_b32_e32 v4, v21045; GFX11-NEXT: v_mov_b32_e32 v5, v21046; GFX11-NEXT: buffer_load_format_xyz v[2:5], v2, s[0:3], 0 idxen tfe1047; GFX11-NEXT: s_waitcnt vmcnt(0)1048; GFX11-NEXT: global_store_b96 v[0:1], v[2:4], off1049; GFX11-NEXT: v_mov_b32_e32 v0, v51050; GFX11-NEXT: ; return to shader part epilog1051;1052; NOPRT-LABEL: buffer_load_v3f32_tfe:1053; NOPRT: ; %bb.0:1054; NOPRT-NEXT: v_mov_b32_e32 v5, 01055; NOPRT-NEXT: buffer_load_format_xyz v[2:5], v5, s[0:3], 0 idxen tfe1056; NOPRT-NEXT: s_waitcnt vmcnt(0)1057; NOPRT-NEXT: global_store_b96 v[0:1], v[2:4], off1058; NOPRT-NEXT: v_mov_b32_e32 v0, v51059; NOPRT-NEXT: ; return to shader part epilog1060;1061; GFX12-LABEL: buffer_load_v3f32_tfe:1062; GFX12: ; %bb.0:1063; GFX12-NEXT: v_mov_b32_e32 v2, 01064; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1065; GFX12-NEXT: v_dual_mov_b32 v3, v2 :: v_dual_mov_b32 v4, v21066; GFX12-NEXT: v_mov_b32_e32 v5, v21067; GFX12-NEXT: buffer_load_format_xyz v[2:5], v2, s[0:3], null idxen tfe1068; GFX12-NEXT: s_wait_loadcnt 0x01069; GFX12-NEXT: global_store_b96 v[0:1], v[2:4], off1070; GFX12-NEXT: v_mov_b32_e32 v0, v51071; GFX12-NEXT: ; return to shader part epilog1072 %load = call { <3 x float>, i32 } @llvm.amdgcn.struct.buffer.load.format.sl_v3f32i32s(<4 x i32> %rsrc, i32 0, i32 0, i32 0, i32 0)1073 %data = extractvalue { <3 x float>, i32 } %load, 01074 store <3 x float> %data, ptr addrspace(1) %out1075 %status = extractvalue { <3 x float>, i32 } %load, 11076 %fstatus = bitcast i32 %status to float1077 ret float %fstatus1078}1079 1080define amdgpu_cs float @buffer_load_v2i32_tfe(<4 x i32> inreg %rsrc, ptr addrspace(1) %out) {1081; GFX6-LABEL: buffer_load_v2i32_tfe:1082; GFX6: ; %bb.0:1083; GFX6-NEXT: v_mov_b32_e32 v2, 01084; GFX6-NEXT: v_mov_b32_e32 v3, v21085; GFX6-NEXT: v_mov_b32_e32 v4, v21086; GFX6-NEXT: v_mov_b32_e32 v5, v21087; GFX6-NEXT: buffer_load_format_xyz v[2:5], v2, s[0:3], 0 idxen tfe1088; GFX6-NEXT: s_mov_b32 s2, 01089; GFX6-NEXT: s_mov_b32 s3, 0xf0001090; GFX6-NEXT: s_mov_b32 s0, s21091; GFX6-NEXT: s_mov_b32 s1, s21092; GFX6-NEXT: s_waitcnt vmcnt(0)1093; GFX6-NEXT: buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr641094; GFX6-NEXT: v_mov_b32_e32 v0, v41095; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0)1096; GFX6-NEXT: ; return to shader part epilog1097;1098; GFX8PLUS-LABEL: buffer_load_v2i32_tfe:1099; GFX8PLUS: ; %bb.0:1100; GFX8PLUS-NEXT: v_mov_b32_e32 v2, 01101; GFX8PLUS-NEXT: v_mov_b32_e32 v3, v21102; GFX8PLUS-NEXT: v_mov_b32_e32 v4, v21103; GFX8PLUS-NEXT: buffer_load_format_xy v[2:4], v2, s[0:3], 0 idxen tfe1104; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)1105; GFX8PLUS-NEXT: flat_store_dwordx2 v[0:1], v[2:3]1106; GFX8PLUS-NEXT: v_mov_b32_e32 v0, v41107; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)1108; GFX8PLUS-NEXT: ; return to shader part epilog1109;1110; GFX11-LABEL: buffer_load_v2i32_tfe:1111; GFX11: ; %bb.0:1112; GFX11-NEXT: v_mov_b32_e32 v2, 01113; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1114; GFX11-NEXT: v_mov_b32_e32 v3, v21115; GFX11-NEXT: v_mov_b32_e32 v4, v21116; GFX11-NEXT: buffer_load_format_xy v[2:4], v2, s[0:3], 0 idxen tfe1117; GFX11-NEXT: s_waitcnt vmcnt(0)1118; GFX11-NEXT: global_store_b64 v[0:1], v[2:3], off1119; GFX11-NEXT: v_mov_b32_e32 v0, v41120; GFX11-NEXT: ; return to shader part epilog1121;1122; NOPRT-LABEL: buffer_load_v2i32_tfe:1123; NOPRT: ; %bb.0:1124; NOPRT-NEXT: v_mov_b32_e32 v4, 01125; NOPRT-NEXT: buffer_load_format_xy v[2:4], v4, s[0:3], 0 idxen tfe1126; NOPRT-NEXT: s_waitcnt vmcnt(0)1127; NOPRT-NEXT: global_store_b64 v[0:1], v[2:3], off1128; NOPRT-NEXT: v_mov_b32_e32 v0, v41129; NOPRT-NEXT: ; return to shader part epilog1130;1131; GFX12-LABEL: buffer_load_v2i32_tfe:1132; GFX12: ; %bb.0:1133; GFX12-NEXT: v_mov_b32_e32 v2, 01134; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1135; GFX12-NEXT: v_dual_mov_b32 v3, v2 :: v_dual_mov_b32 v4, v21136; GFX12-NEXT: buffer_load_format_xy v[2:4], v2, s[0:3], null idxen tfe1137; GFX12-NEXT: s_wait_loadcnt 0x01138; GFX12-NEXT: global_store_b64 v[0:1], v[2:3], off1139; GFX12-NEXT: v_mov_b32_e32 v0, v41140; GFX12-NEXT: ; return to shader part epilog1141 %load = call { <2 x i32>, i32 } @llvm.amdgcn.struct.buffer.load.format.sl_v2i32i32s(<4 x i32> %rsrc, i32 0, i32 0, i32 0, i32 0)1142 %data = extractvalue { <2 x i32>, i32 } %load, 01143 store <2 x i32> %data, ptr addrspace(1) %out1144 %status = extractvalue { <2 x i32>, i32 } %load, 11145 %fstatus = bitcast i32 %status to float1146 ret float %fstatus1147}1148 1149define amdgpu_cs float @buffer_load_v2f32_tfe(<4 x i32> inreg %rsrc, ptr addrspace(1) %out) {1150; GFX6-LABEL: buffer_load_v2f32_tfe:1151; GFX6: ; %bb.0:1152; GFX6-NEXT: v_mov_b32_e32 v2, 01153; GFX6-NEXT: v_mov_b32_e32 v3, v21154; GFX6-NEXT: v_mov_b32_e32 v4, v21155; GFX6-NEXT: v_mov_b32_e32 v5, v21156; GFX6-NEXT: buffer_load_format_xyz v[2:5], v2, s[0:3], 0 idxen tfe1157; GFX6-NEXT: s_mov_b32 s2, 01158; GFX6-NEXT: s_mov_b32 s3, 0xf0001159; GFX6-NEXT: s_mov_b32 s0, s21160; GFX6-NEXT: s_mov_b32 s1, s21161; GFX6-NEXT: s_waitcnt vmcnt(0)1162; GFX6-NEXT: buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr641163; GFX6-NEXT: v_mov_b32_e32 v0, v41164; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0)1165; GFX6-NEXT: ; return to shader part epilog1166;1167; GFX8PLUS-LABEL: buffer_load_v2f32_tfe:1168; GFX8PLUS: ; %bb.0:1169; GFX8PLUS-NEXT: v_mov_b32_e32 v2, 01170; GFX8PLUS-NEXT: v_mov_b32_e32 v3, v21171; GFX8PLUS-NEXT: v_mov_b32_e32 v4, v21172; GFX8PLUS-NEXT: buffer_load_format_xy v[2:4], v2, s[0:3], 0 idxen tfe1173; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)1174; GFX8PLUS-NEXT: flat_store_dwordx2 v[0:1], v[2:3]1175; GFX8PLUS-NEXT: v_mov_b32_e32 v0, v41176; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)1177; GFX8PLUS-NEXT: ; return to shader part epilog1178;1179; GFX11-LABEL: buffer_load_v2f32_tfe:1180; GFX11: ; %bb.0:1181; GFX11-NEXT: v_mov_b32_e32 v2, 01182; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1183; GFX11-NEXT: v_mov_b32_e32 v3, v21184; GFX11-NEXT: v_mov_b32_e32 v4, v21185; GFX11-NEXT: buffer_load_format_xy v[2:4], v2, s[0:3], 0 idxen tfe1186; GFX11-NEXT: s_waitcnt vmcnt(0)1187; GFX11-NEXT: global_store_b64 v[0:1], v[2:3], off1188; GFX11-NEXT: v_mov_b32_e32 v0, v41189; GFX11-NEXT: ; return to shader part epilog1190;1191; NOPRT-LABEL: buffer_load_v2f32_tfe:1192; NOPRT: ; %bb.0:1193; NOPRT-NEXT: v_mov_b32_e32 v4, 01194; NOPRT-NEXT: buffer_load_format_xy v[2:4], v4, s[0:3], 0 idxen tfe1195; NOPRT-NEXT: s_waitcnt vmcnt(0)1196; NOPRT-NEXT: global_store_b64 v[0:1], v[2:3], off1197; NOPRT-NEXT: v_mov_b32_e32 v0, v41198; NOPRT-NEXT: ; return to shader part epilog1199;1200; GFX12-LABEL: buffer_load_v2f32_tfe:1201; GFX12: ; %bb.0:1202; GFX12-NEXT: v_mov_b32_e32 v2, 01203; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1204; GFX12-NEXT: v_dual_mov_b32 v3, v2 :: v_dual_mov_b32 v4, v21205; GFX12-NEXT: buffer_load_format_xy v[2:4], v2, s[0:3], null idxen tfe1206; GFX12-NEXT: s_wait_loadcnt 0x01207; GFX12-NEXT: global_store_b64 v[0:1], v[2:3], off1208; GFX12-NEXT: v_mov_b32_e32 v0, v41209; GFX12-NEXT: ; return to shader part epilog1210 %load = call { <2 x float>, i32 } @llvm.amdgcn.struct.buffer.load.format.sl_v2f32i32s(<4 x i32> %rsrc, i32 0, i32 0, i32 0, i32 0)1211 %data = extractvalue { <2 x float>, i32 } %load, 01212 store <2 x float> %data, ptr addrspace(1) %out1213 %status = extractvalue { <2 x float>, i32 } %load, 11214 %fstatus = bitcast i32 %status to float1215 ret float %fstatus1216}1217 1218define amdgpu_cs float @buffer_load_i32_tfe(<4 x i32> inreg %rsrc, ptr addrspace(1) %out) {1219; GFX6-LABEL: buffer_load_i32_tfe:1220; GFX6: ; %bb.0:1221; GFX6-NEXT: v_mov_b32_e32 v2, 01222; GFX6-NEXT: v_mov_b32_e32 v3, v21223; GFX6-NEXT: buffer_load_format_x v[2:3], v2, s[0:3], 0 idxen tfe1224; GFX6-NEXT: s_mov_b32 s2, 01225; GFX6-NEXT: s_mov_b32 s3, 0xf0001226; GFX6-NEXT: s_mov_b32 s0, s21227; GFX6-NEXT: s_mov_b32 s1, s21228; GFX6-NEXT: s_waitcnt vmcnt(0)1229; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641230; GFX6-NEXT: v_mov_b32_e32 v0, v31231; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0)1232; GFX6-NEXT: ; return to shader part epilog1233;1234; GFX8PLUS-LABEL: buffer_load_i32_tfe:1235; GFX8PLUS: ; %bb.0:1236; GFX8PLUS-NEXT: v_mov_b32_e32 v2, 01237; GFX8PLUS-NEXT: v_mov_b32_e32 v3, v21238; GFX8PLUS-NEXT: buffer_load_format_x v[2:3], v2, s[0:3], 0 idxen tfe1239; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)1240; GFX8PLUS-NEXT: flat_store_dword v[0:1], v21241; GFX8PLUS-NEXT: v_mov_b32_e32 v0, v31242; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)1243; GFX8PLUS-NEXT: ; return to shader part epilog1244;1245; GFX11-LABEL: buffer_load_i32_tfe:1246; GFX11: ; %bb.0:1247; GFX11-NEXT: v_mov_b32_e32 v2, 01248; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1249; GFX11-NEXT: v_mov_b32_e32 v3, v21250; GFX11-NEXT: buffer_load_format_x v[2:3], v2, s[0:3], 0 idxen tfe1251; GFX11-NEXT: s_waitcnt vmcnt(0)1252; GFX11-NEXT: global_store_b32 v[0:1], v2, off1253; GFX11-NEXT: v_mov_b32_e32 v0, v31254; GFX11-NEXT: ; return to shader part epilog1255;1256; NOPRT-LABEL: buffer_load_i32_tfe:1257; NOPRT: ; %bb.0:1258; NOPRT-NEXT: v_mov_b32_e32 v3, 01259; NOPRT-NEXT: buffer_load_format_x v[2:3], v3, s[0:3], 0 idxen tfe1260; NOPRT-NEXT: s_waitcnt vmcnt(0)1261; NOPRT-NEXT: global_store_b32 v[0:1], v2, off1262; NOPRT-NEXT: v_mov_b32_e32 v0, v31263; NOPRT-NEXT: ; return to shader part epilog1264;1265; GFX12-LABEL: buffer_load_i32_tfe:1266; GFX12: ; %bb.0:1267; GFX12-NEXT: v_mov_b32_e32 v2, 01268; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1269; GFX12-NEXT: v_mov_b32_e32 v3, v21270; GFX12-NEXT: buffer_load_format_x v[2:3], v2, s[0:3], null idxen tfe1271; GFX12-NEXT: s_wait_loadcnt 0x01272; GFX12-NEXT: global_store_b32 v[0:1], v2, off1273; GFX12-NEXT: v_mov_b32_e32 v0, v31274; GFX12-NEXT: ; return to shader part epilog1275 %load = call { i32, i32 } @llvm.amdgcn.struct.buffer.load.format.sl_i32i32s(<4 x i32> %rsrc, i32 0, i32 0, i32 0, i32 0)1276 %data = extractvalue { i32, i32 } %load, 01277 store i32 %data, ptr addrspace(1) %out1278 %status = extractvalue { i32, i32 } %load, 11279 %fstatus = bitcast i32 %status to float1280 ret float %fstatus1281}1282 1283define amdgpu_cs float @buffer_load_f32_tfe(<4 x i32> inreg %rsrc, ptr addrspace(1) %out) {1284; GFX6-LABEL: buffer_load_f32_tfe:1285; GFX6: ; %bb.0:1286; GFX6-NEXT: v_mov_b32_e32 v2, 01287; GFX6-NEXT: v_mov_b32_e32 v3, v21288; GFX6-NEXT: buffer_load_format_x v[2:3], v2, s[0:3], 0 idxen tfe1289; GFX6-NEXT: s_mov_b32 s2, 01290; GFX6-NEXT: s_mov_b32 s3, 0xf0001291; GFX6-NEXT: s_mov_b32 s0, s21292; GFX6-NEXT: s_mov_b32 s1, s21293; GFX6-NEXT: s_waitcnt vmcnt(0)1294; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641295; GFX6-NEXT: v_mov_b32_e32 v0, v31296; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0)1297; GFX6-NEXT: ; return to shader part epilog1298;1299; GFX8PLUS-LABEL: buffer_load_f32_tfe:1300; GFX8PLUS: ; %bb.0:1301; GFX8PLUS-NEXT: v_mov_b32_e32 v2, 01302; GFX8PLUS-NEXT: v_mov_b32_e32 v3, v21303; GFX8PLUS-NEXT: buffer_load_format_x v[2:3], v2, s[0:3], 0 idxen tfe1304; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)1305; GFX8PLUS-NEXT: flat_store_dword v[0:1], v21306; GFX8PLUS-NEXT: v_mov_b32_e32 v0, v31307; GFX8PLUS-NEXT: s_waitcnt vmcnt(0)1308; GFX8PLUS-NEXT: ; return to shader part epilog1309;1310; GFX11-LABEL: buffer_load_f32_tfe:1311; GFX11: ; %bb.0:1312; GFX11-NEXT: v_mov_b32_e32 v2, 01313; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1314; GFX11-NEXT: v_mov_b32_e32 v3, v21315; GFX11-NEXT: buffer_load_format_x v[2:3], v2, s[0:3], 0 idxen tfe1316; GFX11-NEXT: s_waitcnt vmcnt(0)1317; GFX11-NEXT: global_store_b32 v[0:1], v2, off1318; GFX11-NEXT: v_mov_b32_e32 v0, v31319; GFX11-NEXT: ; return to shader part epilog1320;1321; NOPRT-LABEL: buffer_load_f32_tfe:1322; NOPRT: ; %bb.0:1323; NOPRT-NEXT: v_mov_b32_e32 v3, 01324; NOPRT-NEXT: buffer_load_format_x v[2:3], v3, s[0:3], 0 idxen tfe1325; NOPRT-NEXT: s_waitcnt vmcnt(0)1326; NOPRT-NEXT: global_store_b32 v[0:1], v2, off1327; NOPRT-NEXT: v_mov_b32_e32 v0, v31328; NOPRT-NEXT: ; return to shader part epilog1329;1330; GFX12-LABEL: buffer_load_f32_tfe:1331; GFX12: ; %bb.0:1332; GFX12-NEXT: v_mov_b32_e32 v2, 01333; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1334; GFX12-NEXT: v_mov_b32_e32 v3, v21335; GFX12-NEXT: buffer_load_format_x v[2:3], v2, s[0:3], null idxen tfe1336; GFX12-NEXT: s_wait_loadcnt 0x01337; GFX12-NEXT: global_store_b32 v[0:1], v2, off1338; GFX12-NEXT: v_mov_b32_e32 v0, v31339; GFX12-NEXT: ; return to shader part epilog1340 %load = call { float, i32 } @llvm.amdgcn.struct.buffer.load.format.sl_f32i32s(<4 x i32> %rsrc, i32 0, i32 0, i32 0, i32 0)1341 %data = extractvalue { float, i32 } %load, 01342 store float %data, ptr addrspace(1) %out1343 %status = extractvalue { float, i32 } %load, 11344 %fstatus = bitcast i32 %status to float1345 ret float %fstatus1346}1347 1348declare float @llvm.amdgcn.struct.buffer.load.format.f32(<4 x i32>, i32, i32, i32, i32) #01349declare <2 x float> @llvm.amdgcn.struct.buffer.load.format.v2f32(<4 x i32>, i32, i32, i32, i32) #01350declare <4 x float> @llvm.amdgcn.struct.buffer.load.format.v4f32(<4 x i32>, i32, i32, i32, i32) #01351declare i32 @llvm.amdgcn.struct.buffer.load.format.i32(<4 x i32>, i32, i32, i32, i32) #01352declare { <4 x i32>, i32 } @llvm.amdgcn.struct.buffer.load.format.sl_v4i32i32s(<4 x i32>, i32, i32, i32, i32 immarg) #01353declare { <4 x float>, i32 } @llvm.amdgcn.struct.buffer.load.format.sl_v4f32i32s(<4 x i32>, i32, i32, i32, i32 immarg) #01354declare { <3 x i32>, i32 } @llvm.amdgcn.struct.buffer.load.format.sl_v3i32i32s(<4 x i32>, i32, i32, i32, i32 immarg) #01355declare { <3 x float>, i32 } @llvm.amdgcn.struct.buffer.load.format.sl_v3f32i32s(<4 x i32>, i32, i32, i32, i32 immarg) #01356declare { <2 x i32>, i32 } @llvm.amdgcn.struct.buffer.load.format.sl_v2i32i32s(<4 x i32>, i32, i32, i32, i32 immarg) #01357declare { <2 x float>, i32 } @llvm.amdgcn.struct.buffer.load.format.sl_v2f32i32s(<4 x i32>, i32, i32, i32, i32 immarg) #01358declare { i32, i32 } @llvm.amdgcn.struct.buffer.load.format.sl_i32i32s(<4 x i32>, i32, i32, i32, i32 immarg) #01359declare { float, i32 } @llvm.amdgcn.struct.buffer.load.format.sl_f32i32s(<4 x i32>, i32, i32, i32, i32 immarg) #01360attributes #0 = { nounwind readonly }1361