275 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti < %s | FileCheck -check-prefix=GFX6 %s3; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 < %s | FileCheck -check-prefixes=GFX10PLUS,GFX10 %s4; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 < %s | FileCheck -check-prefixes=GFX10PLUS,GFX11 %s5; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1200 < %s | FileCheck -check-prefixes=GFX12 %s6 7define amdgpu_ps <4 x float> @load_2d_v4f32_xyzw(<8 x i32> inreg %rsrc, i32 %s, i32 %t) {8; GFX6-LABEL: load_2d_v4f32_xyzw:9; GFX6: ; %bb.0:10; GFX6-NEXT: s_mov_b32 s0, s211; GFX6-NEXT: s_mov_b32 s1, s312; GFX6-NEXT: s_mov_b32 s2, s413; GFX6-NEXT: s_mov_b32 s3, s514; GFX6-NEXT: s_mov_b32 s4, s615; GFX6-NEXT: s_mov_b32 s5, s716; GFX6-NEXT: s_mov_b32 s6, s817; GFX6-NEXT: s_mov_b32 s7, s918; GFX6-NEXT: image_load v[0:3], v[0:1], s[0:7] dmask:0xf unorm19; GFX6-NEXT: s_waitcnt vmcnt(0)20; GFX6-NEXT: ; return to shader part epilog21;22; GFX10PLUS-LABEL: load_2d_v4f32_xyzw:23; GFX10PLUS: ; %bb.0:24; GFX10PLUS-NEXT: s_mov_b32 s0, s225; GFX10PLUS-NEXT: s_mov_b32 s1, s326; GFX10PLUS-NEXT: s_mov_b32 s2, s427; GFX10PLUS-NEXT: s_mov_b32 s3, s528; GFX10PLUS-NEXT: s_mov_b32 s4, s629; GFX10PLUS-NEXT: s_mov_b32 s5, s730; GFX10PLUS-NEXT: s_mov_b32 s6, s831; GFX10PLUS-NEXT: s_mov_b32 s7, s932; GFX10PLUS-NEXT: image_load v[0:3], v[0:1], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D unorm33; GFX10PLUS-NEXT: s_waitcnt vmcnt(0)34; GFX10PLUS-NEXT: ; return to shader part epilog35;36; GFX12-LABEL: load_2d_v4f32_xyzw:37; GFX12: ; %bb.0:38; GFX12-NEXT: s_mov_b32 s0, s239; GFX12-NEXT: s_mov_b32 s1, s340; GFX12-NEXT: s_mov_b32 s2, s441; GFX12-NEXT: s_mov_b32 s3, s542; GFX12-NEXT: s_mov_b32 s4, s643; GFX12-NEXT: s_mov_b32 s5, s744; GFX12-NEXT: s_mov_b32 s6, s845; GFX12-NEXT: s_mov_b32 s7, s946; GFX12-NEXT: image_load v[0:3], [v0, v1], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D47; GFX12-NEXT: s_wait_loadcnt 0x048; GFX12-NEXT: ; return to shader part epilog49 %v = call <4 x float> @llvm.amdgcn.image.load.2d.v4f32.i32(i32 15, i32 %s, i32 %t, <8 x i32> %rsrc, i32 0, i32 0)50 ret <4 x float> %v51}52 53define amdgpu_ps <4 x float> @load_2d_v4f32_xyzw_tfe(<8 x i32> inreg %rsrc, ptr addrspace(1) inreg %out, i32 %s, i32 %t) {54; GFX6-LABEL: load_2d_v4f32_xyzw_tfe:55; GFX6: ; %bb.0:56; GFX6-NEXT: v_mov_b32_e32 v5, v057; GFX6-NEXT: v_mov_b32_e32 v0, 058; GFX6-NEXT: s_mov_b32 s0, s259; GFX6-NEXT: s_mov_b32 s1, s360; GFX6-NEXT: s_mov_b32 s2, s461; GFX6-NEXT: s_mov_b32 s3, s562; GFX6-NEXT: s_mov_b32 s4, s663; GFX6-NEXT: s_mov_b32 s5, s764; GFX6-NEXT: s_mov_b32 s6, s865; GFX6-NEXT: s_mov_b32 s7, s966; GFX6-NEXT: v_mov_b32_e32 v6, v167; GFX6-NEXT: v_mov_b32_e32 v1, v068; GFX6-NEXT: v_mov_b32_e32 v2, v069; GFX6-NEXT: v_mov_b32_e32 v3, v070; GFX6-NEXT: v_mov_b32_e32 v4, v071; GFX6-NEXT: image_load v[0:4], v[5:6], s[0:7] dmask:0xf unorm tfe72; GFX6-NEXT: s_mov_b32 s8, s1073; GFX6-NEXT: s_mov_b32 s9, s1174; GFX6-NEXT: s_mov_b32 s10, -175; GFX6-NEXT: s_mov_b32 s11, 0xf00076; GFX6-NEXT: s_waitcnt vmcnt(0)77; GFX6-NEXT: buffer_store_dword v4, off, s[8:11], 078; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0)79; GFX6-NEXT: ; return to shader part epilog80;81; GFX10-LABEL: load_2d_v4f32_xyzw_tfe:82; GFX10: ; %bb.0:83; GFX10-NEXT: v_mov_b32_e32 v7, 084; GFX10-NEXT: v_mov_b32_e32 v5, v085; GFX10-NEXT: v_mov_b32_e32 v6, v186; GFX10-NEXT: s_mov_b32 s0, s287; GFX10-NEXT: s_mov_b32 s1, s388; GFX10-NEXT: v_mov_b32_e32 v8, v789; GFX10-NEXT: v_mov_b32_e32 v9, v790; GFX10-NEXT: v_mov_b32_e32 v10, v791; GFX10-NEXT: v_mov_b32_e32 v11, v792; GFX10-NEXT: s_mov_b32 s2, s493; GFX10-NEXT: s_mov_b32 s3, s594; GFX10-NEXT: s_mov_b32 s4, s695; GFX10-NEXT: s_mov_b32 s5, s796; GFX10-NEXT: s_mov_b32 s6, s897; GFX10-NEXT: s_mov_b32 s7, s998; GFX10-NEXT: v_mov_b32_e32 v0, v799; GFX10-NEXT: v_mov_b32_e32 v1, v8100; GFX10-NEXT: v_mov_b32_e32 v2, v9101; GFX10-NEXT: v_mov_b32_e32 v3, v10102; GFX10-NEXT: v_mov_b32_e32 v4, v11103; GFX10-NEXT: image_load v[0:4], v[5:6], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D unorm tfe104; GFX10-NEXT: s_waitcnt vmcnt(0)105; GFX10-NEXT: global_store_dword v7, v4, s[10:11]106; GFX10-NEXT: ; return to shader part epilog107;108; GFX11-LABEL: load_2d_v4f32_xyzw_tfe:109; GFX11: ; %bb.0:110; GFX11-NEXT: v_mov_b32_e32 v7, 0111; GFX11-NEXT: v_dual_mov_b32 v5, v0 :: v_dual_mov_b32 v6, v1112; GFX11-NEXT: s_mov_b32 s0, s2113; GFX11-NEXT: s_mov_b32 s1, s3114; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2)115; GFX11-NEXT: v_mov_b32_e32 v8, v7116; GFX11-NEXT: v_mov_b32_e32 v9, v7117; GFX11-NEXT: v_mov_b32_e32 v10, v7118; GFX11-NEXT: v_mov_b32_e32 v11, v7119; GFX11-NEXT: s_mov_b32 s2, s4120; GFX11-NEXT: s_mov_b32 s3, s5121; GFX11-NEXT: s_mov_b32 s4, s6122; GFX11-NEXT: s_mov_b32 s5, s7123; GFX11-NEXT: s_mov_b32 s6, s8124; GFX11-NEXT: s_mov_b32 s7, s9125; GFX11-NEXT: v_dual_mov_b32 v0, v7 :: v_dual_mov_b32 v1, v8126; GFX11-NEXT: v_dual_mov_b32 v2, v9 :: v_dual_mov_b32 v3, v10127; GFX11-NEXT: v_mov_b32_e32 v4, v11128; GFX11-NEXT: image_load v[0:4], v[5:6], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D unorm tfe129; GFX11-NEXT: s_waitcnt vmcnt(0)130; GFX11-NEXT: global_store_b32 v7, v4, s[10:11]131; GFX11-NEXT: ; return to shader part epilog132;133; GFX12-LABEL: load_2d_v4f32_xyzw_tfe:134; GFX12: ; %bb.0:135; GFX12-NEXT: v_mov_b32_e32 v7, 0136; GFX12-NEXT: v_dual_mov_b32 v5, v0 :: v_dual_mov_b32 v6, v1137; GFX12-NEXT: s_mov_b32 s0, s2138; GFX12-NEXT: s_mov_b32 s1, s3139; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_2)140; GFX12-NEXT: v_dual_mov_b32 v8, v7 :: v_dual_mov_b32 v9, v7141; GFX12-NEXT: v_dual_mov_b32 v10, v7 :: v_dual_mov_b32 v11, v7142; GFX12-NEXT: s_mov_b32 s2, s4143; GFX12-NEXT: s_mov_b32 s3, s5144; GFX12-NEXT: s_mov_b32 s4, s6145; GFX12-NEXT: s_mov_b32 s5, s7146; GFX12-NEXT: s_mov_b32 s6, s8147; GFX12-NEXT: s_mov_b32 s7, s9148; GFX12-NEXT: v_dual_mov_b32 v0, v7 :: v_dual_mov_b32 v1, v8149; GFX12-NEXT: v_dual_mov_b32 v2, v9 :: v_dual_mov_b32 v3, v10150; GFX12-NEXT: v_mov_b32_e32 v4, v11151; GFX12-NEXT: image_load v[0:4], [v5, v6], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D tfe152; GFX12-NEXT: s_wait_loadcnt 0x0153; GFX12-NEXT: global_store_b32 v7, v4, s[10:11]154; GFX12-NEXT: ; return to shader part epilog155 %v = call { <4 x float>, i32 } @llvm.amdgcn.image.load.2d.sl_v4f32i32s.i32(i32 15, i32 %s, i32 %t, <8 x i32> %rsrc, i32 1, i32 0)156 %v.vec = extractvalue { <4 x float>, i32 } %v, 0157 %v.err = extractvalue { <4 x float>, i32 } %v, 1158 store i32 %v.err, ptr addrspace(1) %out, align 4159 ret <4 x float> %v.vec160}161 162define amdgpu_ps <4 x float> @load_2d_v4f32_xyzw_tfe_lwe(<8 x i32> inreg %rsrc, ptr addrspace(1) inreg %out, i32 %s, i32 %t) {163; GFX6-LABEL: load_2d_v4f32_xyzw_tfe_lwe:164; GFX6: ; %bb.0:165; GFX6-NEXT: v_mov_b32_e32 v5, v0166; GFX6-NEXT: v_mov_b32_e32 v0, 0167; GFX6-NEXT: s_mov_b32 s0, s2168; GFX6-NEXT: s_mov_b32 s1, s3169; GFX6-NEXT: s_mov_b32 s2, s4170; GFX6-NEXT: s_mov_b32 s3, s5171; GFX6-NEXT: s_mov_b32 s4, s6172; GFX6-NEXT: s_mov_b32 s5, s7173; GFX6-NEXT: s_mov_b32 s6, s8174; GFX6-NEXT: s_mov_b32 s7, s9175; GFX6-NEXT: v_mov_b32_e32 v6, v1176; GFX6-NEXT: v_mov_b32_e32 v1, v0177; GFX6-NEXT: v_mov_b32_e32 v2, v0178; GFX6-NEXT: v_mov_b32_e32 v3, v0179; GFX6-NEXT: v_mov_b32_e32 v4, v0180; GFX6-NEXT: image_load v[0:4], v[5:6], s[0:7] dmask:0xf unorm tfe lwe181; GFX6-NEXT: s_mov_b32 s8, s10182; GFX6-NEXT: s_mov_b32 s9, s11183; GFX6-NEXT: s_mov_b32 s10, -1184; GFX6-NEXT: s_mov_b32 s11, 0xf000185; GFX6-NEXT: s_waitcnt vmcnt(0)186; GFX6-NEXT: buffer_store_dword v4, off, s[8:11], 0187; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0)188; GFX6-NEXT: ; return to shader part epilog189;190; GFX10-LABEL: load_2d_v4f32_xyzw_tfe_lwe:191; GFX10: ; %bb.0:192; GFX10-NEXT: v_mov_b32_e32 v7, 0193; GFX10-NEXT: v_mov_b32_e32 v5, v0194; GFX10-NEXT: v_mov_b32_e32 v6, v1195; GFX10-NEXT: s_mov_b32 s0, s2196; GFX10-NEXT: s_mov_b32 s1, s3197; GFX10-NEXT: v_mov_b32_e32 v8, v7198; GFX10-NEXT: v_mov_b32_e32 v9, v7199; GFX10-NEXT: v_mov_b32_e32 v10, v7200; GFX10-NEXT: v_mov_b32_e32 v11, v7201; GFX10-NEXT: s_mov_b32 s2, s4202; GFX10-NEXT: s_mov_b32 s3, s5203; GFX10-NEXT: s_mov_b32 s4, s6204; GFX10-NEXT: s_mov_b32 s5, s7205; GFX10-NEXT: s_mov_b32 s6, s8206; GFX10-NEXT: s_mov_b32 s7, s9207; GFX10-NEXT: v_mov_b32_e32 v0, v7208; GFX10-NEXT: v_mov_b32_e32 v1, v8209; GFX10-NEXT: v_mov_b32_e32 v2, v9210; GFX10-NEXT: v_mov_b32_e32 v3, v10211; GFX10-NEXT: v_mov_b32_e32 v4, v11212; GFX10-NEXT: image_load v[0:4], v[5:6], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D unorm tfe lwe213; GFX10-NEXT: s_waitcnt vmcnt(0)214; GFX10-NEXT: global_store_dword v7, v4, s[10:11]215; GFX10-NEXT: ; return to shader part epilog216;217; GFX11-LABEL: load_2d_v4f32_xyzw_tfe_lwe:218; GFX11: ; %bb.0:219; GFX11-NEXT: v_mov_b32_e32 v7, 0220; GFX11-NEXT: v_dual_mov_b32 v5, v0 :: v_dual_mov_b32 v6, v1221; GFX11-NEXT: s_mov_b32 s0, s2222; GFX11-NEXT: s_mov_b32 s1, s3223; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2)224; GFX11-NEXT: v_mov_b32_e32 v8, v7225; GFX11-NEXT: v_mov_b32_e32 v9, v7226; GFX11-NEXT: v_mov_b32_e32 v10, v7227; GFX11-NEXT: v_mov_b32_e32 v11, v7228; GFX11-NEXT: s_mov_b32 s2, s4229; GFX11-NEXT: s_mov_b32 s3, s5230; GFX11-NEXT: s_mov_b32 s4, s6231; GFX11-NEXT: s_mov_b32 s5, s7232; GFX11-NEXT: s_mov_b32 s6, s8233; GFX11-NEXT: s_mov_b32 s7, s9234; GFX11-NEXT: v_dual_mov_b32 v0, v7 :: v_dual_mov_b32 v1, v8235; GFX11-NEXT: v_dual_mov_b32 v2, v9 :: v_dual_mov_b32 v3, v10236; GFX11-NEXT: v_mov_b32_e32 v4, v11237; GFX11-NEXT: image_load v[0:4], v[5:6], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D unorm tfe lwe238; GFX11-NEXT: s_waitcnt vmcnt(0)239; GFX11-NEXT: global_store_b32 v7, v4, s[10:11]240; GFX11-NEXT: ; return to shader part epilog241;242; GFX12-LABEL: load_2d_v4f32_xyzw_tfe_lwe:243; GFX12: ; %bb.0:244; GFX12-NEXT: v_mov_b32_e32 v7, 0245; GFX12-NEXT: v_dual_mov_b32 v5, v0 :: v_dual_mov_b32 v6, v1246; GFX12-NEXT: s_mov_b32 s0, s2247; GFX12-NEXT: s_mov_b32 s1, s3248; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_2)249; GFX12-NEXT: v_dual_mov_b32 v8, v7 :: v_dual_mov_b32 v9, v7250; GFX12-NEXT: v_dual_mov_b32 v10, v7 :: v_dual_mov_b32 v11, v7251; GFX12-NEXT: s_mov_b32 s2, s4252; GFX12-NEXT: s_mov_b32 s3, s5253; GFX12-NEXT: s_mov_b32 s4, s6254; GFX12-NEXT: s_mov_b32 s5, s7255; GFX12-NEXT: s_mov_b32 s6, s8256; GFX12-NEXT: s_mov_b32 s7, s9257; GFX12-NEXT: v_dual_mov_b32 v0, v7 :: v_dual_mov_b32 v1, v8258; GFX12-NEXT: v_dual_mov_b32 v2, v9 :: v_dual_mov_b32 v3, v10259; GFX12-NEXT: v_mov_b32_e32 v4, v11260; GFX12-NEXT: image_load v[0:4], [v5, v6], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D tfe261; GFX12-NEXT: s_wait_loadcnt 0x0262; GFX12-NEXT: global_store_b32 v7, v4, s[10:11]263; GFX12-NEXT: ; return to shader part epilog264 %v = call { <4 x float>, i32 } @llvm.amdgcn.image.load.2d.sl_v4f32i32s.i32(i32 15, i32 %s, i32 %t, <8 x i32> %rsrc, i32 3, i32 0)265 %v.vec = extractvalue { <4 x float>, i32 } %v, 0266 %v.err = extractvalue { <4 x float>, i32 } %v, 1267 store i32 %v.err, ptr addrspace(1) %out, align 4268 ret <4 x float> %v.vec269}270 271declare <4 x float> @llvm.amdgcn.image.load.2d.v4f32.i32(i32 immarg, i32, i32, <8 x i32>, i32 immarg, i32 immarg) #0272declare { <4 x float>, i32 } @llvm.amdgcn.image.load.2d.sl_v4f32i32s.i32(i32 immarg, i32, i32, <8 x i32>, i32 immarg, i32 immarg) #0273 274attributes #0 = { nounwind readonly }275