905 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9 %s3; RUN: llc -mtriple=amdgcn -mcpu=gfx1010 < %s | FileCheck -check-prefixes=GFX10 %s4; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -mattr=+real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX11-TRUE16 %s5; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -mattr=-real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX11-FAKE16 %s6; RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -mattr=+real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX12,GFX12-TRUE16 %s7; RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -mattr=-real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX12,GFX12-FAKE16 %s8 9define amdgpu_ps <4 x float> @gather4_2d(<8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %t) {10; GFX9-LABEL: gather4_2d:11; GFX9: ; %bb.0: ; %main_body12; GFX9-NEXT: s_mov_b64 s[12:13], exec13; GFX9-NEXT: s_wqm_b64 exec, exec14; GFX9-NEXT: s_mov_b32 s14, 0x504010015; GFX9-NEXT: v_perm_b32 v0, v1, v0, s1416; GFX9-NEXT: s_and_b64 exec, exec, s[12:13]17; GFX9-NEXT: image_gather4 v[0:3], v0, s[0:7], s[8:11] dmask:0x1 a1618; GFX9-NEXT: s_waitcnt vmcnt(0)19; GFX9-NEXT: ; return to shader part epilog20;21; GFX10-LABEL: gather4_2d:22; GFX10: ; %bb.0: ; %main_body23; GFX10-NEXT: s_mov_b32 s12, exec_lo24; GFX10-NEXT: s_wqm_b32 exec_lo, exec_lo25; GFX10-NEXT: v_perm_b32 v0, v1, v0, 0x504010026; GFX10-NEXT: s_and_b32 exec_lo, exec_lo, s1227; GFX10-NEXT: image_gather4 v[0:3], v0, s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a1628; GFX10-NEXT: s_waitcnt vmcnt(0)29; GFX10-NEXT: ; return to shader part epilog30;31; GFX11-TRUE16-LABEL: gather4_2d:32; GFX11-TRUE16: ; %bb.0: ; %main_body33; GFX11-TRUE16-NEXT: s_mov_b32 s12, exec_lo34; GFX11-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo35; GFX11-TRUE16-NEXT: v_mov_b16_e32 v0.h, v1.l36; GFX11-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s1237; GFX11-TRUE16-NEXT: image_gather4 v[0:3], v0, s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a1638; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)39; GFX11-TRUE16-NEXT: ; return to shader part epilog40;41; GFX11-FAKE16-LABEL: gather4_2d:42; GFX11-FAKE16: ; %bb.0: ; %main_body43; GFX11-FAKE16-NEXT: s_mov_b32 s12, exec_lo44; GFX11-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo45; GFX11-FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x504010046; GFX11-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s1247; GFX11-FAKE16-NEXT: image_gather4 v[0:3], v0, s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a1648; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)49; GFX11-FAKE16-NEXT: ; return to shader part epilog50;51; GFX12-TRUE16-LABEL: gather4_2d:52; GFX12-TRUE16: ; %bb.0: ; %main_body53; GFX12-TRUE16-NEXT: s_mov_b32 s12, exec_lo54; GFX12-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo55; GFX12-TRUE16-NEXT: v_mov_b16_e32 v0.h, v1.l56; GFX12-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s1257; GFX12-TRUE16-NEXT: image_gather4 v[0:3], v0, s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a1658; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x059; GFX12-TRUE16-NEXT: ; return to shader part epilog60;61; GFX12-FAKE16-LABEL: gather4_2d:62; GFX12-FAKE16: ; %bb.0: ; %main_body63; GFX12-FAKE16-NEXT: s_mov_b32 s12, exec_lo64; GFX12-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo65; GFX12-FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x504010066; GFX12-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s1267; GFX12-FAKE16-NEXT: image_gather4 v[0:3], v0, s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a1668; GFX12-FAKE16-NEXT: s_wait_samplecnt 0x069; GFX12-FAKE16-NEXT: ; return to shader part epilog70main_body:71 %v = call <4 x float> @llvm.amdgcn.image.gather4.2d.v4f32.f16(i32 1, half %s, half %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)72 ret <4 x float> %v73}74 75define amdgpu_ps <4 x float> @gather4_cube(<8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %t, half %face) {76; GFX9-LABEL: gather4_cube:77; GFX9: ; %bb.0: ; %main_body78; GFX9-NEXT: s_mov_b64 s[12:13], exec79; GFX9-NEXT: s_wqm_b64 exec, exec80; GFX9-NEXT: s_mov_b32 s14, 0x504010081; GFX9-NEXT: v_perm_b32 v1, v1, v0, s1482; GFX9-NEXT: s_and_b64 exec, exec, s[12:13]83; GFX9-NEXT: image_gather4 v[0:3], v[1:2], s[0:7], s[8:11] dmask:0x1 a16 da84; GFX9-NEXT: s_waitcnt vmcnt(0)85; GFX9-NEXT: ; return to shader part epilog86;87; GFX10-LABEL: gather4_cube:88; GFX10: ; %bb.0: ; %main_body89; GFX10-NEXT: s_mov_b32 s12, exec_lo90; GFX10-NEXT: s_wqm_b32 exec_lo, exec_lo91; GFX10-NEXT: v_perm_b32 v0, v1, v0, 0x504010092; GFX10-NEXT: s_and_b32 exec_lo, exec_lo, s1293; GFX10-NEXT: image_gather4 v[0:3], [v0, v2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_CUBE a1694; GFX10-NEXT: s_waitcnt vmcnt(0)95; GFX10-NEXT: ; return to shader part epilog96;97; GFX11-TRUE16-LABEL: gather4_cube:98; GFX11-TRUE16: ; %bb.0: ; %main_body99; GFX11-TRUE16-NEXT: s_mov_b32 s12, exec_lo100; GFX11-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo101; GFX11-TRUE16-NEXT: v_mov_b16_e32 v3.l, v2.l102; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.l, v0.l103; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.h, v1.l104; GFX11-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s12105; GFX11-TRUE16-NEXT: image_gather4 v[0:3], v[2:3], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_CUBE a16106; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)107; GFX11-TRUE16-NEXT: ; return to shader part epilog108;109; GFX11-FAKE16-LABEL: gather4_cube:110; GFX11-FAKE16: ; %bb.0: ; %main_body111; GFX11-FAKE16-NEXT: s_mov_b32 s12, exec_lo112; GFX11-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo113; GFX11-FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x5040100114; GFX11-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s12115; GFX11-FAKE16-NEXT: image_gather4 v[0:3], [v0, v2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_CUBE a16116; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)117; GFX11-FAKE16-NEXT: ; return to shader part epilog118;119; GFX12-TRUE16-LABEL: gather4_cube:120; GFX12-TRUE16: ; %bb.0: ; %main_body121; GFX12-TRUE16-NEXT: s_mov_b32 s12, exec_lo122; GFX12-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo123; GFX12-TRUE16-NEXT: v_mov_b16_e32 v0.h, v1.l124; GFX12-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s12125; GFX12-TRUE16-NEXT: image_gather4 v[0:3], [v0, v2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_CUBE a16126; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0127; GFX12-TRUE16-NEXT: ; return to shader part epilog128;129; GFX12-FAKE16-LABEL: gather4_cube:130; GFX12-FAKE16: ; %bb.0: ; %main_body131; GFX12-FAKE16-NEXT: s_mov_b32 s12, exec_lo132; GFX12-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo133; GFX12-FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x5040100134; GFX12-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s12135; GFX12-FAKE16-NEXT: image_gather4 v[0:3], [v0, v2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_CUBE a16136; GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0137; GFX12-FAKE16-NEXT: ; return to shader part epilog138main_body:139 %v = call <4 x float> @llvm.amdgcn.image.gather4.cube.v4f32.f16(i32 1, half %s, half %t, half %face, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)140 ret <4 x float> %v141}142 143define amdgpu_ps <4 x float> @gather4_2darray(<8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %t, half %slice) {144; GFX9-LABEL: gather4_2darray:145; GFX9: ; %bb.0: ; %main_body146; GFX9-NEXT: s_mov_b64 s[12:13], exec147; GFX9-NEXT: s_wqm_b64 exec, exec148; GFX9-NEXT: s_mov_b32 s14, 0x5040100149; GFX9-NEXT: v_perm_b32 v1, v1, v0, s14150; GFX9-NEXT: s_and_b64 exec, exec, s[12:13]151; GFX9-NEXT: image_gather4 v[0:3], v[1:2], s[0:7], s[8:11] dmask:0x1 a16 da152; GFX9-NEXT: s_waitcnt vmcnt(0)153; GFX9-NEXT: ; return to shader part epilog154;155; GFX10-LABEL: gather4_2darray:156; GFX10: ; %bb.0: ; %main_body157; GFX10-NEXT: s_mov_b32 s12, exec_lo158; GFX10-NEXT: s_wqm_b32 exec_lo, exec_lo159; GFX10-NEXT: v_perm_b32 v0, v1, v0, 0x5040100160; GFX10-NEXT: s_and_b32 exec_lo, exec_lo, s12161; GFX10-NEXT: image_gather4 v[0:3], [v0, v2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D_ARRAY a16162; GFX10-NEXT: s_waitcnt vmcnt(0)163; GFX10-NEXT: ; return to shader part epilog164;165; GFX11-TRUE16-LABEL: gather4_2darray:166; GFX11-TRUE16: ; %bb.0: ; %main_body167; GFX11-TRUE16-NEXT: s_mov_b32 s12, exec_lo168; GFX11-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo169; GFX11-TRUE16-NEXT: v_mov_b16_e32 v3.l, v2.l170; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.l, v0.l171; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.h, v1.l172; GFX11-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s12173; GFX11-TRUE16-NEXT: image_gather4 v[0:3], v[2:3], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D_ARRAY a16174; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)175; GFX11-TRUE16-NEXT: ; return to shader part epilog176;177; GFX11-FAKE16-LABEL: gather4_2darray:178; GFX11-FAKE16: ; %bb.0: ; %main_body179; GFX11-FAKE16-NEXT: s_mov_b32 s12, exec_lo180; GFX11-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo181; GFX11-FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x5040100182; GFX11-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s12183; GFX11-FAKE16-NEXT: image_gather4 v[0:3], [v0, v2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D_ARRAY a16184; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)185; GFX11-FAKE16-NEXT: ; return to shader part epilog186;187; GFX12-TRUE16-LABEL: gather4_2darray:188; GFX12-TRUE16: ; %bb.0: ; %main_body189; GFX12-TRUE16-NEXT: s_mov_b32 s12, exec_lo190; GFX12-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo191; GFX12-TRUE16-NEXT: v_mov_b16_e32 v0.h, v1.l192; GFX12-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s12193; GFX12-TRUE16-NEXT: image_gather4 v[0:3], [v0, v2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D_ARRAY a16194; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0195; GFX12-TRUE16-NEXT: ; return to shader part epilog196;197; GFX12-FAKE16-LABEL: gather4_2darray:198; GFX12-FAKE16: ; %bb.0: ; %main_body199; GFX12-FAKE16-NEXT: s_mov_b32 s12, exec_lo200; GFX12-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo201; GFX12-FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x5040100202; GFX12-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s12203; GFX12-FAKE16-NEXT: image_gather4 v[0:3], [v0, v2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D_ARRAY a16204; GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0205; GFX12-FAKE16-NEXT: ; return to shader part epilog206main_body:207 %v = call <4 x float> @llvm.amdgcn.image.gather4.2darray.v4f32.f16(i32 1, half %s, half %t, half %slice, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)208 ret <4 x float> %v209}210 211define amdgpu_ps <4 x float> @gather4_c_2d(<8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %s, half %t) {212; GFX9-LABEL: gather4_c_2d:213; GFX9: ; %bb.0: ; %main_body214; GFX9-NEXT: s_mov_b64 s[12:13], exec215; GFX9-NEXT: s_wqm_b64 exec, exec216; GFX9-NEXT: s_mov_b32 s14, 0x5040100217; GFX9-NEXT: v_perm_b32 v1, v2, v1, s14218; GFX9-NEXT: s_and_b64 exec, exec, s[12:13]219; GFX9-NEXT: image_gather4_c v[0:3], v[0:1], s[0:7], s[8:11] dmask:0x1 a16220; GFX9-NEXT: s_waitcnt vmcnt(0)221; GFX9-NEXT: ; return to shader part epilog222;223; GFX10-LABEL: gather4_c_2d:224; GFX10: ; %bb.0: ; %main_body225; GFX10-NEXT: s_mov_b32 s12, exec_lo226; GFX10-NEXT: s_wqm_b32 exec_lo, exec_lo227; GFX10-NEXT: v_perm_b32 v1, v2, v1, 0x5040100228; GFX10-NEXT: s_and_b32 exec_lo, exec_lo, s12229; GFX10-NEXT: image_gather4_c v[0:3], v[0:1], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16230; GFX10-NEXT: s_waitcnt vmcnt(0)231; GFX10-NEXT: ; return to shader part epilog232;233; GFX11-TRUE16-LABEL: gather4_c_2d:234; GFX11-TRUE16: ; %bb.0: ; %main_body235; GFX11-TRUE16-NEXT: s_mov_b32 s12, exec_lo236; GFX11-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo237; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.h, v2.l238; GFX11-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s12239; GFX11-TRUE16-NEXT: image_gather4_c v[0:3], v[0:1], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16240; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)241; GFX11-TRUE16-NEXT: ; return to shader part epilog242;243; GFX11-FAKE16-LABEL: gather4_c_2d:244; GFX11-FAKE16: ; %bb.0: ; %main_body245; GFX11-FAKE16-NEXT: s_mov_b32 s12, exec_lo246; GFX11-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo247; GFX11-FAKE16-NEXT: v_perm_b32 v1, v2, v1, 0x5040100248; GFX11-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s12249; GFX11-FAKE16-NEXT: image_gather4_c v[0:3], v[0:1], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16250; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)251; GFX11-FAKE16-NEXT: ; return to shader part epilog252;253; GFX12-TRUE16-LABEL: gather4_c_2d:254; GFX12-TRUE16: ; %bb.0: ; %main_body255; GFX12-TRUE16-NEXT: s_mov_b32 s12, exec_lo256; GFX12-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo257; GFX12-TRUE16-NEXT: v_mov_b16_e32 v1.h, v2.l258; GFX12-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s12259; GFX12-TRUE16-NEXT: image_gather4_c v[0:3], [v0, v1], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16260; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0261; GFX12-TRUE16-NEXT: ; return to shader part epilog262;263; GFX12-FAKE16-LABEL: gather4_c_2d:264; GFX12-FAKE16: ; %bb.0: ; %main_body265; GFX12-FAKE16-NEXT: s_mov_b32 s12, exec_lo266; GFX12-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo267; GFX12-FAKE16-NEXT: v_perm_b32 v1, v2, v1, 0x5040100268; GFX12-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s12269; GFX12-FAKE16-NEXT: image_gather4_c v[0:3], [v0, v1], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16270; GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0271; GFX12-FAKE16-NEXT: ; return to shader part epilog272main_body:273 %v = call <4 x float> @llvm.amdgcn.image.gather4.c.2d.v4f32.f32(i32 1, float %zcompare, half %s, half %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)274 ret <4 x float> %v275}276 277define amdgpu_ps <4 x float> @gather4_cl_2d(<8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %t, half %clamp) {278; GFX9-LABEL: gather4_cl_2d:279; GFX9: ; %bb.0: ; %main_body280; GFX9-NEXT: s_mov_b64 s[12:13], exec281; GFX9-NEXT: s_wqm_b64 exec, exec282; GFX9-NEXT: s_mov_b32 s14, 0x5040100283; GFX9-NEXT: v_perm_b32 v1, v1, v0, s14284; GFX9-NEXT: s_and_b64 exec, exec, s[12:13]285; GFX9-NEXT: image_gather4_cl v[0:3], v[1:2], s[0:7], s[8:11] dmask:0x1 a16286; GFX9-NEXT: s_waitcnt vmcnt(0)287; GFX9-NEXT: ; return to shader part epilog288;289; GFX10-LABEL: gather4_cl_2d:290; GFX10: ; %bb.0: ; %main_body291; GFX10-NEXT: s_mov_b32 s12, exec_lo292; GFX10-NEXT: s_wqm_b32 exec_lo, exec_lo293; GFX10-NEXT: v_perm_b32 v0, v1, v0, 0x5040100294; GFX10-NEXT: s_and_b32 exec_lo, exec_lo, s12295; GFX10-NEXT: image_gather4_cl v[0:3], [v0, v2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16296; GFX10-NEXT: s_waitcnt vmcnt(0)297; GFX10-NEXT: ; return to shader part epilog298;299; GFX11-TRUE16-LABEL: gather4_cl_2d:300; GFX11-TRUE16: ; %bb.0: ; %main_body301; GFX11-TRUE16-NEXT: s_mov_b32 s12, exec_lo302; GFX11-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo303; GFX11-TRUE16-NEXT: v_mov_b16_e32 v3.l, v2.l304; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.l, v0.l305; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.h, v1.l306; GFX11-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s12307; GFX11-TRUE16-NEXT: image_gather4_cl v[0:3], v[2:3], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16308; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)309; GFX11-TRUE16-NEXT: ; return to shader part epilog310;311; GFX11-FAKE16-LABEL: gather4_cl_2d:312; GFX11-FAKE16: ; %bb.0: ; %main_body313; GFX11-FAKE16-NEXT: s_mov_b32 s12, exec_lo314; GFX11-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo315; GFX11-FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x5040100316; GFX11-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s12317; GFX11-FAKE16-NEXT: image_gather4_cl v[0:3], [v0, v2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16318; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)319; GFX11-FAKE16-NEXT: ; return to shader part epilog320;321; GFX12-TRUE16-LABEL: gather4_cl_2d:322; GFX12-TRUE16: ; %bb.0: ; %main_body323; GFX12-TRUE16-NEXT: s_mov_b32 s12, exec_lo324; GFX12-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo325; GFX12-TRUE16-NEXT: v_mov_b16_e32 v0.h, v1.l326; GFX12-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s12327; GFX12-TRUE16-NEXT: image_gather4_cl v[0:3], [v0, v2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16328; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0329; GFX12-TRUE16-NEXT: ; return to shader part epilog330;331; GFX12-FAKE16-LABEL: gather4_cl_2d:332; GFX12-FAKE16: ; %bb.0: ; %main_body333; GFX12-FAKE16-NEXT: s_mov_b32 s12, exec_lo334; GFX12-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo335; GFX12-FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x5040100336; GFX12-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s12337; GFX12-FAKE16-NEXT: image_gather4_cl v[0:3], [v0, v2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16338; GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0339; GFX12-FAKE16-NEXT: ; return to shader part epilog340main_body:341 %v = call <4 x float> @llvm.amdgcn.image.gather4.cl.2d.v4f32.f16(i32 1, half %s, half %t, half %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)342 ret <4 x float> %v343}344 345define amdgpu_ps <4 x float> @gather4_c_cl_2d(<8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %s, half %t, half %clamp) {346; GFX9-LABEL: gather4_c_cl_2d:347; GFX9: ; %bb.0: ; %main_body348; GFX9-NEXT: s_mov_b64 s[12:13], exec349; GFX9-NEXT: s_wqm_b64 exec, exec350; GFX9-NEXT: s_mov_b32 s14, 0x5040100351; GFX9-NEXT: v_mov_b32_e32 v5, v3352; GFX9-NEXT: v_mov_b32_e32 v3, v0353; GFX9-NEXT: v_perm_b32 v4, v2, v1, s14354; GFX9-NEXT: s_and_b64 exec, exec, s[12:13]355; GFX9-NEXT: image_gather4_c_cl v[0:3], v[3:5], s[0:7], s[8:11] dmask:0x1 a16356; GFX9-NEXT: s_waitcnt vmcnt(0)357; GFX9-NEXT: ; return to shader part epilog358;359; GFX10-LABEL: gather4_c_cl_2d:360; GFX10: ; %bb.0: ; %main_body361; GFX10-NEXT: s_mov_b32 s12, exec_lo362; GFX10-NEXT: s_wqm_b32 exec_lo, exec_lo363; GFX10-NEXT: v_perm_b32 v1, v2, v1, 0x5040100364; GFX10-NEXT: s_and_b32 exec_lo, exec_lo, s12365; GFX10-NEXT: image_gather4_c_cl v[0:3], [v0, v1, v3], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16366; GFX10-NEXT: s_waitcnt vmcnt(0)367; GFX10-NEXT: ; return to shader part epilog368;369; GFX11-TRUE16-LABEL: gather4_c_cl_2d:370; GFX11-TRUE16: ; %bb.0: ; %main_body371; GFX11-TRUE16-NEXT: s_mov_b32 s12, exec_lo372; GFX11-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo373; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.h, v2.l374; GFX11-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s12375; GFX11-TRUE16-NEXT: image_gather4_c_cl v[0:3], [v0, v1, v3], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16376; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)377; GFX11-TRUE16-NEXT: ; return to shader part epilog378;379; GFX11-FAKE16-LABEL: gather4_c_cl_2d:380; GFX11-FAKE16: ; %bb.0: ; %main_body381; GFX11-FAKE16-NEXT: s_mov_b32 s12, exec_lo382; GFX11-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo383; GFX11-FAKE16-NEXT: v_perm_b32 v1, v2, v1, 0x5040100384; GFX11-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s12385; GFX11-FAKE16-NEXT: image_gather4_c_cl v[0:3], [v0, v1, v3], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16386; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)387; GFX11-FAKE16-NEXT: ; return to shader part epilog388;389; GFX12-TRUE16-LABEL: gather4_c_cl_2d:390; GFX12-TRUE16: ; %bb.0: ; %main_body391; GFX12-TRUE16-NEXT: s_mov_b32 s12, exec_lo392; GFX12-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo393; GFX12-TRUE16-NEXT: v_mov_b16_e32 v1.h, v2.l394; GFX12-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s12395; GFX12-TRUE16-NEXT: image_gather4_c_cl v[0:3], [v0, v1, v3], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16396; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0397; GFX12-TRUE16-NEXT: ; return to shader part epilog398;399; GFX12-FAKE16-LABEL: gather4_c_cl_2d:400; GFX12-FAKE16: ; %bb.0: ; %main_body401; GFX12-FAKE16-NEXT: s_mov_b32 s12, exec_lo402; GFX12-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo403; GFX12-FAKE16-NEXT: v_perm_b32 v1, v2, v1, 0x5040100404; GFX12-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s12405; GFX12-FAKE16-NEXT: image_gather4_c_cl v[0:3], [v0, v1, v3], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16406; GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0407; GFX12-FAKE16-NEXT: ; return to shader part epilog408main_body:409 %v = call <4 x float> @llvm.amdgcn.image.gather4.c.cl.2d.v4f32.f32(i32 1, float %zcompare, half %s, half %t, half %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)410 ret <4 x float> %v411}412 413define amdgpu_ps <4 x float> @gather4_b_2d(<8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %bias, half %s, half %t) {414; GFX9-LABEL: gather4_b_2d:415; GFX9: ; %bb.0: ; %main_body416; GFX9-NEXT: s_mov_b64 s[12:13], exec417; GFX9-NEXT: s_wqm_b64 exec, exec418; GFX9-NEXT: s_mov_b32 s14, 0x5040100419; GFX9-NEXT: v_perm_b32 v1, v2, v1, s14420; GFX9-NEXT: s_and_b64 exec, exec, s[12:13]421; GFX9-NEXT: image_gather4_b v[0:3], v[0:1], s[0:7], s[8:11] dmask:0x1 a16422; GFX9-NEXT: s_waitcnt vmcnt(0)423; GFX9-NEXT: ; return to shader part epilog424;425; GFX10-LABEL: gather4_b_2d:426; GFX10: ; %bb.0: ; %main_body427; GFX10-NEXT: s_mov_b32 s12, exec_lo428; GFX10-NEXT: s_wqm_b32 exec_lo, exec_lo429; GFX10-NEXT: v_perm_b32 v1, v2, v1, 0x5040100430; GFX10-NEXT: s_and_b32 exec_lo, exec_lo, s12431; GFX10-NEXT: image_gather4_b v[0:3], v[0:1], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16432; GFX10-NEXT: s_waitcnt vmcnt(0)433; GFX10-NEXT: ; return to shader part epilog434;435; GFX11-TRUE16-LABEL: gather4_b_2d:436; GFX11-TRUE16: ; %bb.0: ; %main_body437; GFX11-TRUE16-NEXT: s_mov_b32 s12, exec_lo438; GFX11-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo439; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.h, v2.l440; GFX11-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s12441; GFX11-TRUE16-NEXT: image_gather4_b v[0:3], v[0:1], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16442; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)443; GFX11-TRUE16-NEXT: ; return to shader part epilog444;445; GFX11-FAKE16-LABEL: gather4_b_2d:446; GFX11-FAKE16: ; %bb.0: ; %main_body447; GFX11-FAKE16-NEXT: s_mov_b32 s12, exec_lo448; GFX11-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo449; GFX11-FAKE16-NEXT: v_perm_b32 v1, v2, v1, 0x5040100450; GFX11-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s12451; GFX11-FAKE16-NEXT: image_gather4_b v[0:3], v[0:1], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16452; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)453; GFX11-FAKE16-NEXT: ; return to shader part epilog454;455; GFX12-TRUE16-LABEL: gather4_b_2d:456; GFX12-TRUE16: ; %bb.0: ; %main_body457; GFX12-TRUE16-NEXT: s_mov_b32 s12, exec_lo458; GFX12-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo459; GFX12-TRUE16-NEXT: v_mov_b16_e32 v1.h, v2.l460; GFX12-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s12461; GFX12-TRUE16-NEXT: image_gather4_b v[0:3], [v0, v1], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16462; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0463; GFX12-TRUE16-NEXT: ; return to shader part epilog464;465; GFX12-FAKE16-LABEL: gather4_b_2d:466; GFX12-FAKE16: ; %bb.0: ; %main_body467; GFX12-FAKE16-NEXT: s_mov_b32 s12, exec_lo468; GFX12-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo469; GFX12-FAKE16-NEXT: v_perm_b32 v1, v2, v1, 0x5040100470; GFX12-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s12471; GFX12-FAKE16-NEXT: image_gather4_b v[0:3], [v0, v1], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16472; GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0473; GFX12-FAKE16-NEXT: ; return to shader part epilog474main_body:475 %v = call <4 x float> @llvm.amdgcn.image.gather4.b.2d.v4f32.f16.f16(i32 1, half %bias, half %s, half %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)476 ret <4 x float> %v477}478 479define amdgpu_ps <4 x float> @gather4_c_b_2d(<8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %bias, float %zcompare, half %s, half %t) {480; GFX9-LABEL: gather4_c_b_2d:481; GFX9: ; %bb.0: ; %main_body482; GFX9-NEXT: s_mov_b64 s[12:13], exec483; GFX9-NEXT: s_wqm_b64 exec, exec484; GFX9-NEXT: s_mov_b32 s14, 0x5040100485; GFX9-NEXT: v_perm_b32 v2, v3, v2, s14486; GFX9-NEXT: s_and_b64 exec, exec, s[12:13]487; GFX9-NEXT: image_gather4_c_b v[0:3], v[0:2], s[0:7], s[8:11] dmask:0x1 a16488; GFX9-NEXT: s_waitcnt vmcnt(0)489; GFX9-NEXT: ; return to shader part epilog490;491; GFX10-LABEL: gather4_c_b_2d:492; GFX10: ; %bb.0: ; %main_body493; GFX10-NEXT: s_mov_b32 s12, exec_lo494; GFX10-NEXT: s_wqm_b32 exec_lo, exec_lo495; GFX10-NEXT: v_perm_b32 v2, v3, v2, 0x5040100496; GFX10-NEXT: s_and_b32 exec_lo, exec_lo, s12497; GFX10-NEXT: image_gather4_c_b v[0:3], v[0:2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16498; GFX10-NEXT: s_waitcnt vmcnt(0)499; GFX10-NEXT: ; return to shader part epilog500;501; GFX11-TRUE16-LABEL: gather4_c_b_2d:502; GFX11-TRUE16: ; %bb.0: ; %main_body503; GFX11-TRUE16-NEXT: s_mov_b32 s12, exec_lo504; GFX11-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo505; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.h, v3.l506; GFX11-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s12507; GFX11-TRUE16-NEXT: image_gather4_c_b v[0:3], v[0:2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16508; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)509; GFX11-TRUE16-NEXT: ; return to shader part epilog510;511; GFX11-FAKE16-LABEL: gather4_c_b_2d:512; GFX11-FAKE16: ; %bb.0: ; %main_body513; GFX11-FAKE16-NEXT: s_mov_b32 s12, exec_lo514; GFX11-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo515; GFX11-FAKE16-NEXT: v_perm_b32 v2, v3, v2, 0x5040100516; GFX11-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s12517; GFX11-FAKE16-NEXT: image_gather4_c_b v[0:3], v[0:2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16518; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)519; GFX11-FAKE16-NEXT: ; return to shader part epilog520;521; GFX12-TRUE16-LABEL: gather4_c_b_2d:522; GFX12-TRUE16: ; %bb.0: ; %main_body523; GFX12-TRUE16-NEXT: s_mov_b32 s12, exec_lo524; GFX12-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo525; GFX12-TRUE16-NEXT: v_mov_b16_e32 v2.h, v3.l526; GFX12-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s12527; GFX12-TRUE16-NEXT: image_gather4_c_b v[0:3], [v0, v1, v2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16528; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0529; GFX12-TRUE16-NEXT: ; return to shader part epilog530;531; GFX12-FAKE16-LABEL: gather4_c_b_2d:532; GFX12-FAKE16: ; %bb.0: ; %main_body533; GFX12-FAKE16-NEXT: s_mov_b32 s12, exec_lo534; GFX12-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo535; GFX12-FAKE16-NEXT: v_perm_b32 v2, v3, v2, 0x5040100536; GFX12-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s12537; GFX12-FAKE16-NEXT: image_gather4_c_b v[0:3], [v0, v1, v2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16538; GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0539; GFX12-FAKE16-NEXT: ; return to shader part epilog540main_body:541 %v = call <4 x float> @llvm.amdgcn.image.gather4.c.b.2d.v4f32.f16.f16(i32 1, half %bias, float %zcompare, half %s, half %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)542 ret <4 x float> %v543}544 545define amdgpu_ps <4 x float> @gather4_b_cl_2d(<8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %bias, half %s, half %t, half %clamp) {546; GFX9-LABEL: gather4_b_cl_2d:547; GFX9: ; %bb.0: ; %main_body548; GFX9-NEXT: s_mov_b64 s[12:13], exec549; GFX9-NEXT: s_wqm_b64 exec, exec550; GFX9-NEXT: s_mov_b32 s14, 0x5040100551; GFX9-NEXT: v_mov_b32_e32 v5, v3552; GFX9-NEXT: v_mov_b32_e32 v3, v0553; GFX9-NEXT: v_perm_b32 v4, v2, v1, s14554; GFX9-NEXT: s_and_b64 exec, exec, s[12:13]555; GFX9-NEXT: image_gather4_b_cl v[0:3], v[3:5], s[0:7], s[8:11] dmask:0x1 a16556; GFX9-NEXT: s_waitcnt vmcnt(0)557; GFX9-NEXT: ; return to shader part epilog558;559; GFX10-LABEL: gather4_b_cl_2d:560; GFX10: ; %bb.0: ; %main_body561; GFX10-NEXT: s_mov_b32 s12, exec_lo562; GFX10-NEXT: s_wqm_b32 exec_lo, exec_lo563; GFX10-NEXT: v_perm_b32 v1, v2, v1, 0x5040100564; GFX10-NEXT: s_and_b32 exec_lo, exec_lo, s12565; GFX10-NEXT: image_gather4_b_cl v[0:3], [v0, v1, v3], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16566; GFX10-NEXT: s_waitcnt vmcnt(0)567; GFX10-NEXT: ; return to shader part epilog568;569; GFX11-TRUE16-LABEL: gather4_b_cl_2d:570; GFX11-TRUE16: ; %bb.0: ; %main_body571; GFX11-TRUE16-NEXT: s_mov_b32 s12, exec_lo572; GFX11-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo573; GFX11-TRUE16-NEXT: v_mov_b16_e32 v4.l, v3.l574; GFX11-TRUE16-NEXT: v_mov_b16_e32 v3.l, v1.l575; GFX11-TRUE16-NEXT: v_mov_b16_e32 v3.h, v2.l576; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.l, v0.l577; GFX11-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s12578; GFX11-TRUE16-NEXT: image_gather4_b_cl v[0:3], v[2:4], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16579; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)580; GFX11-TRUE16-NEXT: ; return to shader part epilog581;582; GFX11-FAKE16-LABEL: gather4_b_cl_2d:583; GFX11-FAKE16: ; %bb.0: ; %main_body584; GFX11-FAKE16-NEXT: s_mov_b32 s12, exec_lo585; GFX11-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo586; GFX11-FAKE16-NEXT: v_perm_b32 v1, v2, v1, 0x5040100587; GFX11-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s12588; GFX11-FAKE16-NEXT: image_gather4_b_cl v[0:3], [v0, v1, v3], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16589; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)590; GFX11-FAKE16-NEXT: ; return to shader part epilog591;592; GFX12-TRUE16-LABEL: gather4_b_cl_2d:593; GFX12-TRUE16: ; %bb.0: ; %main_body594; GFX12-TRUE16-NEXT: s_mov_b32 s12, exec_lo595; GFX12-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo596; GFX12-TRUE16-NEXT: v_mov_b16_e32 v1.h, v2.l597; GFX12-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s12598; GFX12-TRUE16-NEXT: image_gather4_b_cl v[0:3], [v0, v1, v3], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16599; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0600; GFX12-TRUE16-NEXT: ; return to shader part epilog601;602; GFX12-FAKE16-LABEL: gather4_b_cl_2d:603; GFX12-FAKE16: ; %bb.0: ; %main_body604; GFX12-FAKE16-NEXT: s_mov_b32 s12, exec_lo605; GFX12-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo606; GFX12-FAKE16-NEXT: v_perm_b32 v1, v2, v1, 0x5040100607; GFX12-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s12608; GFX12-FAKE16-NEXT: image_gather4_b_cl v[0:3], [v0, v1, v3], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16609; GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0610; GFX12-FAKE16-NEXT: ; return to shader part epilog611main_body:612 %v = call <4 x float> @llvm.amdgcn.image.gather4.b.cl.2d.v4f32.f16.f16(i32 1, half %bias, half %s, half %t, half %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)613 ret <4 x float> %v614}615 616define amdgpu_ps <4 x float> @gather4_c_b_cl_2d(<8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %bias, float %zcompare, half %s, half %t, half %clamp) {617; GFX9-LABEL: gather4_c_b_cl_2d:618; GFX9: ; %bb.0: ; %main_body619; GFX9-NEXT: s_mov_b64 s[12:13], exec620; GFX9-NEXT: s_wqm_b64 exec, exec621; GFX9-NEXT: s_mov_b32 s14, 0x5040100622; GFX9-NEXT: v_mov_b32_e32 v7, v4623; GFX9-NEXT: v_mov_b32_e32 v5, v1624; GFX9-NEXT: v_mov_b32_e32 v4, v0625; GFX9-NEXT: v_perm_b32 v6, v3, v2, s14626; GFX9-NEXT: s_and_b64 exec, exec, s[12:13]627; GFX9-NEXT: image_gather4_c_b_cl v[0:3], v[4:7], s[0:7], s[8:11] dmask:0x1 a16628; GFX9-NEXT: s_waitcnt vmcnt(0)629; GFX9-NEXT: ; return to shader part epilog630;631; GFX10-LABEL: gather4_c_b_cl_2d:632; GFX10: ; %bb.0: ; %main_body633; GFX10-NEXT: s_mov_b32 s12, exec_lo634; GFX10-NEXT: s_wqm_b32 exec_lo, exec_lo635; GFX10-NEXT: v_perm_b32 v2, v3, v2, 0x5040100636; GFX10-NEXT: s_and_b32 exec_lo, exec_lo, s12637; GFX10-NEXT: image_gather4_c_b_cl v[0:3], [v0, v1, v2, v4], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16638; GFX10-NEXT: s_waitcnt vmcnt(0)639; GFX10-NEXT: ; return to shader part epilog640;641; GFX11-TRUE16-LABEL: gather4_c_b_cl_2d:642; GFX11-TRUE16: ; %bb.0: ; %main_body643; GFX11-TRUE16-NEXT: s_mov_b32 s12, exec_lo644; GFX11-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo645; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.h, v3.l646; GFX11-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s12647; GFX11-TRUE16-NEXT: image_gather4_c_b_cl v[0:3], [v0, v1, v2, v4], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16648; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)649; GFX11-TRUE16-NEXT: ; return to shader part epilog650;651; GFX11-FAKE16-LABEL: gather4_c_b_cl_2d:652; GFX11-FAKE16: ; %bb.0: ; %main_body653; GFX11-FAKE16-NEXT: s_mov_b32 s12, exec_lo654; GFX11-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo655; GFX11-FAKE16-NEXT: v_perm_b32 v2, v3, v2, 0x5040100656; GFX11-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s12657; GFX11-FAKE16-NEXT: image_gather4_c_b_cl v[0:3], [v0, v1, v2, v4], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16658; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)659; GFX11-FAKE16-NEXT: ; return to shader part epilog660;661; GFX12-TRUE16-LABEL: gather4_c_b_cl_2d:662; GFX12-TRUE16: ; %bb.0: ; %main_body663; GFX12-TRUE16-NEXT: s_mov_b32 s12, exec_lo664; GFX12-TRUE16-NEXT: s_wqm_b32 exec_lo, exec_lo665; GFX12-TRUE16-NEXT: v_mov_b16_e32 v2.h, v3.l666; GFX12-TRUE16-NEXT: s_and_b32 exec_lo, exec_lo, s12667; GFX12-TRUE16-NEXT: image_gather4_c_b_cl v[0:3], [v0, v1, v2, v4], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16668; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0669; GFX12-TRUE16-NEXT: ; return to shader part epilog670;671; GFX12-FAKE16-LABEL: gather4_c_b_cl_2d:672; GFX12-FAKE16: ; %bb.0: ; %main_body673; GFX12-FAKE16-NEXT: s_mov_b32 s12, exec_lo674; GFX12-FAKE16-NEXT: s_wqm_b32 exec_lo, exec_lo675; GFX12-FAKE16-NEXT: v_perm_b32 v2, v3, v2, 0x5040100676; GFX12-FAKE16-NEXT: s_and_b32 exec_lo, exec_lo, s12677; GFX12-FAKE16-NEXT: image_gather4_c_b_cl v[0:3], [v0, v1, v2, v4], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16678; GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0679; GFX12-FAKE16-NEXT: ; return to shader part epilog680main_body:681 %v = call <4 x float> @llvm.amdgcn.image.gather4.c.b.cl.2d.v4f32.f16.f16(i32 1, half %bias, float %zcompare, half %s, half %t, half %clamp, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)682 ret <4 x float> %v683}684 685define amdgpu_ps <4 x float> @gather4_l_2d(<8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %t, half %lod) {686; GFX9-LABEL: gather4_l_2d:687; GFX9: ; %bb.0: ; %main_body688; GFX9-NEXT: s_mov_b32 s12, 0x5040100689; GFX9-NEXT: v_perm_b32 v1, v1, v0, s12690; GFX9-NEXT: image_gather4_l v[0:3], v[1:2], s[0:7], s[8:11] dmask:0x1 a16691; GFX9-NEXT: s_waitcnt vmcnt(0)692; GFX9-NEXT: ; return to shader part epilog693;694; GFX10-LABEL: gather4_l_2d:695; GFX10: ; %bb.0: ; %main_body696; GFX10-NEXT: v_perm_b32 v0, v1, v0, 0x5040100697; GFX10-NEXT: image_gather4_l v[0:3], [v0, v2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16698; GFX10-NEXT: s_waitcnt vmcnt(0)699; GFX10-NEXT: ; return to shader part epilog700;701; GFX11-TRUE16-LABEL: gather4_l_2d:702; GFX11-TRUE16: ; %bb.0: ; %main_body703; GFX11-TRUE16-NEXT: v_mov_b16_e32 v3.l, v2.l704; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.l, v0.l705; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.h, v1.l706; GFX11-TRUE16-NEXT: image_gather4_l v[0:3], v[2:3], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16707; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)708; GFX11-TRUE16-NEXT: ; return to shader part epilog709;710; GFX11-FAKE16-LABEL: gather4_l_2d:711; GFX11-FAKE16: ; %bb.0: ; %main_body712; GFX11-FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x5040100713; GFX11-FAKE16-NEXT: image_gather4_l v[0:3], [v0, v2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16714; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)715; GFX11-FAKE16-NEXT: ; return to shader part epilog716;717; GFX12-TRUE16-LABEL: gather4_l_2d:718; GFX12-TRUE16: ; %bb.0: ; %main_body719; GFX12-TRUE16-NEXT: v_mov_b16_e32 v0.h, v1.l720; GFX12-TRUE16-NEXT: image_gather4_l v[0:3], [v0, v2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16721; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0722; GFX12-TRUE16-NEXT: ; return to shader part epilog723;724; GFX12-FAKE16-LABEL: gather4_l_2d:725; GFX12-FAKE16: ; %bb.0: ; %main_body726; GFX12-FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x5040100727; GFX12-FAKE16-NEXT: image_gather4_l v[0:3], [v0, v2], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16728; GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0729; GFX12-FAKE16-NEXT: ; return to shader part epilog730main_body:731 %v = call <4 x float> @llvm.amdgcn.image.gather4.l.2d.v4f32.f16(i32 1, half %s, half %t, half %lod, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)732 ret <4 x float> %v733}734 735define amdgpu_ps <4 x float> @gather4_c_l_2d(<8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %s, half %t, half %lod) {736; GFX9-LABEL: gather4_c_l_2d:737; GFX9: ; %bb.0: ; %main_body738; GFX9-NEXT: s_mov_b32 s12, 0x5040100739; GFX9-NEXT: v_mov_b32_e32 v5, v3740; GFX9-NEXT: v_mov_b32_e32 v3, v0741; GFX9-NEXT: v_perm_b32 v4, v2, v1, s12742; GFX9-NEXT: image_gather4_c_l v[0:3], v[3:5], s[0:7], s[8:11] dmask:0x1 a16743; GFX9-NEXT: s_waitcnt vmcnt(0)744; GFX9-NEXT: ; return to shader part epilog745;746; GFX10-LABEL: gather4_c_l_2d:747; GFX10: ; %bb.0: ; %main_body748; GFX10-NEXT: v_perm_b32 v1, v2, v1, 0x5040100749; GFX10-NEXT: image_gather4_c_l v[0:3], [v0, v1, v3], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16750; GFX10-NEXT: s_waitcnt vmcnt(0)751; GFX10-NEXT: ; return to shader part epilog752;753; GFX11-TRUE16-LABEL: gather4_c_l_2d:754; GFX11-TRUE16: ; %bb.0: ; %main_body755; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.h, v2.l756; GFX11-TRUE16-NEXT: image_gather4_c_l v[0:3], [v0, v1, v3], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16757; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)758; GFX11-TRUE16-NEXT: ; return to shader part epilog759;760; GFX11-FAKE16-LABEL: gather4_c_l_2d:761; GFX11-FAKE16: ; %bb.0: ; %main_body762; GFX11-FAKE16-NEXT: v_perm_b32 v1, v2, v1, 0x5040100763; GFX11-FAKE16-NEXT: image_gather4_c_l v[0:3], [v0, v1, v3], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16764; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)765; GFX11-FAKE16-NEXT: ; return to shader part epilog766;767; GFX12-TRUE16-LABEL: gather4_c_l_2d:768; GFX12-TRUE16: ; %bb.0: ; %main_body769; GFX12-TRUE16-NEXT: v_mov_b16_e32 v1.h, v2.l770; GFX12-TRUE16-NEXT: image_gather4_c_l v[0:3], [v0, v1, v3], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16771; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0772; GFX12-TRUE16-NEXT: ; return to shader part epilog773;774; GFX12-FAKE16-LABEL: gather4_c_l_2d:775; GFX12-FAKE16: ; %bb.0: ; %main_body776; GFX12-FAKE16-NEXT: v_perm_b32 v1, v2, v1, 0x5040100777; GFX12-FAKE16-NEXT: image_gather4_c_l v[0:3], [v0, v1, v3], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16778; GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0779; GFX12-FAKE16-NEXT: ; return to shader part epilog780main_body:781 %v = call <4 x float> @llvm.amdgcn.image.gather4.c.l.2d.v4f32.f32(i32 1, float %zcompare, half %s, half %t, half %lod, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)782 ret <4 x float> %v783}784 785define amdgpu_ps <4 x float> @gather4_lz_2d(<8 x i32> inreg %rsrc, <4 x i32> inreg %samp, half %s, half %t) {786; GFX9-LABEL: gather4_lz_2d:787; GFX9: ; %bb.0: ; %main_body788; GFX9-NEXT: s_mov_b32 s12, 0x5040100789; GFX9-NEXT: v_perm_b32 v0, v1, v0, s12790; GFX9-NEXT: image_gather4_lz v[0:3], v0, s[0:7], s[8:11] dmask:0x1 a16791; GFX9-NEXT: s_waitcnt vmcnt(0)792; GFX9-NEXT: ; return to shader part epilog793;794; GFX10-LABEL: gather4_lz_2d:795; GFX10: ; %bb.0: ; %main_body796; GFX10-NEXT: v_perm_b32 v0, v1, v0, 0x5040100797; GFX10-NEXT: image_gather4_lz v[0:3], v0, s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16798; GFX10-NEXT: s_waitcnt vmcnt(0)799; GFX10-NEXT: ; return to shader part epilog800;801; GFX11-TRUE16-LABEL: gather4_lz_2d:802; GFX11-TRUE16: ; %bb.0: ; %main_body803; GFX11-TRUE16-NEXT: v_mov_b16_e32 v0.h, v1.l804; GFX11-TRUE16-NEXT: image_gather4_lz v[0:3], v0, s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16805; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)806; GFX11-TRUE16-NEXT: ; return to shader part epilog807;808; GFX11-FAKE16-LABEL: gather4_lz_2d:809; GFX11-FAKE16: ; %bb.0: ; %main_body810; GFX11-FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x5040100811; GFX11-FAKE16-NEXT: image_gather4_lz v[0:3], v0, s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16812; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)813; GFX11-FAKE16-NEXT: ; return to shader part epilog814;815; GFX12-TRUE16-LABEL: gather4_lz_2d:816; GFX12-TRUE16: ; %bb.0: ; %main_body817; GFX12-TRUE16-NEXT: v_mov_b16_e32 v0.h, v1.l818; GFX12-TRUE16-NEXT: image_gather4_lz v[0:3], v0, s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16819; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0820; GFX12-TRUE16-NEXT: ; return to shader part epilog821;822; GFX12-FAKE16-LABEL: gather4_lz_2d:823; GFX12-FAKE16: ; %bb.0: ; %main_body824; GFX12-FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x5040100825; GFX12-FAKE16-NEXT: image_gather4_lz v[0:3], v0, s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16826; GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0827; GFX12-FAKE16-NEXT: ; return to shader part epilog828main_body:829 %v = call <4 x float> @llvm.amdgcn.image.gather4.lz.2d.v4f32.f16(i32 1, half %s, half %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)830 ret <4 x float> %v831}832 833define amdgpu_ps <4 x float> @gather4_c_lz_2d(<8 x i32> inreg %rsrc, <4 x i32> inreg %samp, float %zcompare, half %s, half %t) {834; GFX9-LABEL: gather4_c_lz_2d:835; GFX9: ; %bb.0: ; %main_body836; GFX9-NEXT: s_mov_b32 s12, 0x5040100837; GFX9-NEXT: v_perm_b32 v1, v2, v1, s12838; GFX9-NEXT: image_gather4_c_lz v[0:3], v[0:1], s[0:7], s[8:11] dmask:0x1 a16839; GFX9-NEXT: s_waitcnt vmcnt(0)840; GFX9-NEXT: ; return to shader part epilog841;842; GFX10-LABEL: gather4_c_lz_2d:843; GFX10: ; %bb.0: ; %main_body844; GFX10-NEXT: v_perm_b32 v1, v2, v1, 0x5040100845; GFX10-NEXT: image_gather4_c_lz v[0:3], v[0:1], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16846; GFX10-NEXT: s_waitcnt vmcnt(0)847; GFX10-NEXT: ; return to shader part epilog848;849; GFX11-TRUE16-LABEL: gather4_c_lz_2d:850; GFX11-TRUE16: ; %bb.0: ; %main_body851; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.h, v2.l852; GFX11-TRUE16-NEXT: image_gather4_c_lz v[0:3], v[0:1], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16853; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)854; GFX11-TRUE16-NEXT: ; return to shader part epilog855;856; GFX11-FAKE16-LABEL: gather4_c_lz_2d:857; GFX11-FAKE16: ; %bb.0: ; %main_body858; GFX11-FAKE16-NEXT: v_perm_b32 v1, v2, v1, 0x5040100859; GFX11-FAKE16-NEXT: image_gather4_c_lz v[0:3], v[0:1], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16860; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)861; GFX11-FAKE16-NEXT: ; return to shader part epilog862;863; GFX12-TRUE16-LABEL: gather4_c_lz_2d:864; GFX12-TRUE16: ; %bb.0: ; %main_body865; GFX12-TRUE16-NEXT: v_mov_b16_e32 v1.h, v2.l866; GFX12-TRUE16-NEXT: image_gather4_c_lz v[0:3], [v0, v1], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16867; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0868; GFX12-TRUE16-NEXT: ; return to shader part epilog869;870; GFX12-FAKE16-LABEL: gather4_c_lz_2d:871; GFX12-FAKE16: ; %bb.0: ; %main_body872; GFX12-FAKE16-NEXT: v_perm_b32 v1, v2, v1, 0x5040100873; GFX12-FAKE16-NEXT: image_gather4_c_lz v[0:3], [v0, v1], s[0:7], s[8:11] dmask:0x1 dim:SQ_RSRC_IMG_2D a16874; GFX12-FAKE16-NEXT: s_wait_samplecnt 0x0875; GFX12-FAKE16-NEXT: ; return to shader part epilog876main_body:877 %v = call <4 x float> @llvm.amdgcn.image.gather4.c.lz.2d.v4f32.f32(i32 1, float %zcompare, half %s, half %t, <8 x i32> %rsrc, <4 x i32> %samp, i1 0, i32 0, i32 0)878 ret <4 x float> %v879}880 881declare <4 x float> @llvm.amdgcn.image.gather4.2d.v4f32.f16(i32, half, half, <8 x i32>, <4 x i32>, i1, i32, i32) #1882declare <4 x float> @llvm.amdgcn.image.gather4.cube.v4f32.f16(i32, half, half, half, <8 x i32>, <4 x i32>, i1, i32, i32) #1883declare <4 x float> @llvm.amdgcn.image.gather4.2darray.v4f32.f16(i32, half, half, half, <8 x i32>, <4 x i32>, i1, i32, i32) #1884 885declare <4 x float> @llvm.amdgcn.image.gather4.c.2d.v4f32.f32(i32, float, half, half, <8 x i32>, <4 x i32>, i1, i32, i32) #1886declare <4 x float> @llvm.amdgcn.image.gather4.cl.2d.v4f32.f16(i32, half, half, half, <8 x i32>, <4 x i32>, i1, i32, i32) #1887declare <4 x float> @llvm.amdgcn.image.gather4.c.cl.2d.v4f32.f32(i32, float, half, half, half, <8 x i32>, <4 x i32>, i1, i32, i32) #1888 889declare <4 x float> @llvm.amdgcn.image.gather4.b.2d.v4f32.f16.f16(i32, half, half, half, <8 x i32>, <4 x i32>, i1, i32, i32) #1890declare <4 x float> @llvm.amdgcn.image.gather4.c.b.2d.v4f32.f16.f16(i32, half, float, half, half, <8 x i32>, <4 x i32>, i1, i32, i32) #1891declare <4 x float> @llvm.amdgcn.image.gather4.b.cl.2d.v4f32.f16.f16(i32, half, half, half, half, <8 x i32>, <4 x i32>, i1, i32, i32) #1892declare <4 x float> @llvm.amdgcn.image.gather4.c.b.cl.2d.v4f32.f16.f16(i32, half, float, half, half, half, <8 x i32>, <4 x i32>, i1, i32, i32) #1893 894declare <4 x float> @llvm.amdgcn.image.gather4.l.2d.v4f32.f16(i32, half, half, half, <8 x i32>, <4 x i32>, i1, i32, i32) #1895declare <4 x float> @llvm.amdgcn.image.gather4.c.l.2d.v4f32.f32(i32, float, half, half, half, <8 x i32>, <4 x i32>, i1, i32, i32) #1896 897declare <4 x float> @llvm.amdgcn.image.gather4.lz.2d.v4f32.f16(i32, half, half, <8 x i32>, <4 x i32>, i1, i32, i32) #1898declare <4 x float> @llvm.amdgcn.image.gather4.c.lz.2d.v4f32.f32(i32, float, half, half, <8 x i32>, <4 x i32>, i1, i32, i32) #1899 900attributes #0 = { nounwind }901attributes #1 = { nounwind readonly }902attributes #2 = { nounwind readnone }903;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:904; GFX12: {{.*}}905