1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefix=GFX9 %s 3; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck -check-prefix=GFX10 %s 4; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck -check-prefix=GFX11 %s 5; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GFX8-UNPACKED %s 6 7define amdgpu_ps void @load_1d_f16_tfe_dmask0(<8 x i32> inreg %rsrc, i32 %s) { 8; GFX9-LABEL: load_1d_f16_tfe_dmask0: 9; GFX9: ; %bb.0: 10; GFX9-NEXT: v_mov_b32_e32 v1, 0 11; GFX9-NEXT: s_mov_b32 s11, s9 12; GFX9-NEXT: s_mov_b32 s10, s8 13; GFX9-NEXT: s_mov_b32 s9, s7 14; GFX9-NEXT: s_mov_b32 s8, s6 15; GFX9-NEXT: s_mov_b32 s7, s5 16; GFX9-NEXT: s_mov_b32 s6, s4 17; GFX9-NEXT: s_mov_b32 s5, s3 18; GFX9-NEXT: s_mov_b32 s4, s2 19; GFX9-NEXT: v_mov_b32_e32 v2, v1 20; GFX9-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x1 unorm tfe d16 21; GFX9-NEXT: s_waitcnt vmcnt(0) 22; GFX9-NEXT: global_store_short v[0:1], v1, off 23; GFX9-NEXT: s_waitcnt vmcnt(0) 24; GFX9-NEXT: global_store_dword v[0:1], v2, off 25; GFX9-NEXT: s_waitcnt vmcnt(0) 26; GFX9-NEXT: s_endpgm 27; 28; GFX10-LABEL: load_1d_f16_tfe_dmask0: 29; GFX10: ; %bb.0: 30; GFX10-NEXT: v_mov_b32_e32 v1, 0 31; GFX10-NEXT: s_mov_b32 s11, s9 32; GFX10-NEXT: s_mov_b32 s10, s8 33; GFX10-NEXT: s_mov_b32 s9, s7 34; GFX10-NEXT: s_mov_b32 s8, s6 35; GFX10-NEXT: s_mov_b32 s7, s5 36; GFX10-NEXT: s_mov_b32 s6, s4 37; GFX10-NEXT: s_mov_b32 s5, s3 38; GFX10-NEXT: s_mov_b32 s4, s2 39; GFX10-NEXT: v_mov_b32_e32 v2, v1 40; GFX10-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x1 dim:SQ_RSRC_IMG_1D unorm tfe d16 41; GFX10-NEXT: s_waitcnt vmcnt(0) 42; GFX10-NEXT: global_store_short v[0:1], v1, off 43; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 44; GFX10-NEXT: global_store_dword v[0:1], v2, off 45; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 46; GFX10-NEXT: s_endpgm 47; 48; GFX11-LABEL: load_1d_f16_tfe_dmask0: 49; GFX11: ; %bb.0: 50; GFX11-NEXT: v_mov_b32_e32 v1, 0 51; GFX11-NEXT: s_mov_b32 s11, s9 52; GFX11-NEXT: s_mov_b32 s10, s8 53; GFX11-NEXT: s_mov_b32 s9, s7 54; GFX11-NEXT: s_mov_b32 s8, s6 55; GFX11-NEXT: s_mov_b32 s7, s5 56; GFX11-NEXT: s_mov_b32 s6, s4 57; GFX11-NEXT: s_mov_b32 s5, s3 58; GFX11-NEXT: s_mov_b32 s4, s2 59; GFX11-NEXT: v_mov_b32_e32 v2, v1 60; GFX11-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x1 dim:SQ_RSRC_IMG_1D unorm tfe d16 61; GFX11-NEXT: s_waitcnt vmcnt(0) 62; GFX11-NEXT: global_store_b16 v[0:1], v1, off dlc 63; GFX11-NEXT: s_waitcnt_vscnt null, 0x0 64; GFX11-NEXT: global_store_b32 v[0:1], v2, off dlc 65; GFX11-NEXT: s_waitcnt_vscnt null, 0x0 66; GFX11-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 67; GFX11-NEXT: s_endpgm 68; 69; GFX8-UNPACKED-LABEL: load_1d_f16_tfe_dmask0: 70; GFX8-UNPACKED: ; %bb.0: 71; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v1, 0 72; GFX8-UNPACKED-NEXT: s_mov_b32 s11, s9 73; GFX8-UNPACKED-NEXT: s_mov_b32 s10, s8 74; GFX8-UNPACKED-NEXT: s_mov_b32 s9, s7 75; GFX8-UNPACKED-NEXT: s_mov_b32 s8, s6 76; GFX8-UNPACKED-NEXT: s_mov_b32 s7, s5 77; GFX8-UNPACKED-NEXT: s_mov_b32 s6, s4 78; GFX8-UNPACKED-NEXT: s_mov_b32 s5, s3 79; GFX8-UNPACKED-NEXT: s_mov_b32 s4, s2 80; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v2, v1 81; GFX8-UNPACKED-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x1 unorm tfe d16 82; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 83; GFX8-UNPACKED-NEXT: flat_store_short v[0:1], v1 84; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 85; GFX8-UNPACKED-NEXT: flat_store_dword v[0:1], v2 86; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 87; GFX8-UNPACKED-NEXT: s_endpgm 88 %v = call { half, i32 } @llvm.amdgcn.image.load.1d.sl_f16i32s.i32(i32 0, i32 %s, <8 x i32> %rsrc, i32 1, i32 0) 89 %v.data = extractvalue { half, i32 } %v, 0 90 %v.err = extractvalue { half, i32 } %v, 1 91 store volatile half %v.data, half addrspace(1)* undef 92 store volatile i32 %v.err, i32 addrspace(1)* undef 93 ret void 94} 95 96define amdgpu_ps void @load_1d_f16_tfe_dmask1(<8 x i32> inreg %rsrc, i32 %s) { 97; GFX9-LABEL: load_1d_f16_tfe_dmask1: 98; GFX9: ; %bb.0: 99; GFX9-NEXT: v_mov_b32_e32 v1, 0 100; GFX9-NEXT: s_mov_b32 s11, s9 101; GFX9-NEXT: s_mov_b32 s10, s8 102; GFX9-NEXT: s_mov_b32 s9, s7 103; GFX9-NEXT: s_mov_b32 s8, s6 104; GFX9-NEXT: s_mov_b32 s7, s5 105; GFX9-NEXT: s_mov_b32 s6, s4 106; GFX9-NEXT: s_mov_b32 s5, s3 107; GFX9-NEXT: s_mov_b32 s4, s2 108; GFX9-NEXT: v_mov_b32_e32 v2, v1 109; GFX9-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x1 unorm tfe d16 110; GFX9-NEXT: s_waitcnt vmcnt(0) 111; GFX9-NEXT: global_store_short v[0:1], v1, off 112; GFX9-NEXT: s_waitcnt vmcnt(0) 113; GFX9-NEXT: global_store_dword v[0:1], v2, off 114; GFX9-NEXT: s_waitcnt vmcnt(0) 115; GFX9-NEXT: s_endpgm 116; 117; GFX10-LABEL: load_1d_f16_tfe_dmask1: 118; GFX10: ; %bb.0: 119; GFX10-NEXT: v_mov_b32_e32 v1, 0 120; GFX10-NEXT: s_mov_b32 s11, s9 121; GFX10-NEXT: s_mov_b32 s10, s8 122; GFX10-NEXT: s_mov_b32 s9, s7 123; GFX10-NEXT: s_mov_b32 s8, s6 124; GFX10-NEXT: s_mov_b32 s7, s5 125; GFX10-NEXT: s_mov_b32 s6, s4 126; GFX10-NEXT: s_mov_b32 s5, s3 127; GFX10-NEXT: s_mov_b32 s4, s2 128; GFX10-NEXT: v_mov_b32_e32 v2, v1 129; GFX10-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x1 dim:SQ_RSRC_IMG_1D unorm tfe d16 130; GFX10-NEXT: s_waitcnt vmcnt(0) 131; GFX10-NEXT: global_store_short v[0:1], v1, off 132; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 133; GFX10-NEXT: global_store_dword v[0:1], v2, off 134; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 135; GFX10-NEXT: s_endpgm 136; 137; GFX11-LABEL: load_1d_f16_tfe_dmask1: 138; GFX11: ; %bb.0: 139; GFX11-NEXT: v_mov_b32_e32 v1, 0 140; GFX11-NEXT: s_mov_b32 s11, s9 141; GFX11-NEXT: s_mov_b32 s10, s8 142; GFX11-NEXT: s_mov_b32 s9, s7 143; GFX11-NEXT: s_mov_b32 s8, s6 144; GFX11-NEXT: s_mov_b32 s7, s5 145; GFX11-NEXT: s_mov_b32 s6, s4 146; GFX11-NEXT: s_mov_b32 s5, s3 147; GFX11-NEXT: s_mov_b32 s4, s2 148; GFX11-NEXT: v_mov_b32_e32 v2, v1 149; GFX11-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x1 dim:SQ_RSRC_IMG_1D unorm tfe d16 150; GFX11-NEXT: s_waitcnt vmcnt(0) 151; GFX11-NEXT: global_store_b16 v[0:1], v1, off dlc 152; GFX11-NEXT: s_waitcnt_vscnt null, 0x0 153; GFX11-NEXT: global_store_b32 v[0:1], v2, off dlc 154; GFX11-NEXT: s_waitcnt_vscnt null, 0x0 155; GFX11-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 156; GFX11-NEXT: s_endpgm 157; 158; GFX8-UNPACKED-LABEL: load_1d_f16_tfe_dmask1: 159; GFX8-UNPACKED: ; %bb.0: 160; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v1, 0 161; GFX8-UNPACKED-NEXT: s_mov_b32 s11, s9 162; GFX8-UNPACKED-NEXT: s_mov_b32 s10, s8 163; GFX8-UNPACKED-NEXT: s_mov_b32 s9, s7 164; GFX8-UNPACKED-NEXT: s_mov_b32 s8, s6 165; GFX8-UNPACKED-NEXT: s_mov_b32 s7, s5 166; GFX8-UNPACKED-NEXT: s_mov_b32 s6, s4 167; GFX8-UNPACKED-NEXT: s_mov_b32 s5, s3 168; GFX8-UNPACKED-NEXT: s_mov_b32 s4, s2 169; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v2, v1 170; GFX8-UNPACKED-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x1 unorm tfe d16 171; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 172; GFX8-UNPACKED-NEXT: flat_store_short v[0:1], v1 173; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 174; GFX8-UNPACKED-NEXT: flat_store_dword v[0:1], v2 175; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 176; GFX8-UNPACKED-NEXT: s_endpgm 177 %v = call { half, i32 } @llvm.amdgcn.image.load.1d.sl_f16i32s.i32(i32 1, i32 %s, <8 x i32> %rsrc, i32 1, i32 0) 178 %v.data = extractvalue { half, i32 } %v, 0 179 %v.err = extractvalue { half, i32 } %v, 1 180 store volatile half %v.data, half addrspace(1)* undef 181 store volatile i32 %v.err, i32 addrspace(1)* undef 182 ret void 183} 184 185define amdgpu_ps void @load_1d_v2f16_tfe_dmask0(<8 x i32> inreg %rsrc, i32 %s) { 186; GFX9-LABEL: load_1d_v2f16_tfe_dmask0: 187; GFX9: ; %bb.0: 188; GFX9-NEXT: v_mov_b32_e32 v1, 0 189; GFX9-NEXT: s_mov_b32 s11, s9 190; GFX9-NEXT: s_mov_b32 s10, s8 191; GFX9-NEXT: s_mov_b32 s9, s7 192; GFX9-NEXT: s_mov_b32 s8, s6 193; GFX9-NEXT: s_mov_b32 s7, s5 194; GFX9-NEXT: s_mov_b32 s6, s4 195; GFX9-NEXT: s_mov_b32 s5, s3 196; GFX9-NEXT: s_mov_b32 s4, s2 197; GFX9-NEXT: v_mov_b32_e32 v2, v1 198; GFX9-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x1 unorm tfe d16 199; GFX9-NEXT: s_waitcnt vmcnt(0) 200; GFX9-NEXT: global_store_dword v[0:1], v1, off 201; GFX9-NEXT: s_waitcnt vmcnt(0) 202; GFX9-NEXT: global_store_dword v[0:1], v2, off 203; GFX9-NEXT: s_waitcnt vmcnt(0) 204; GFX9-NEXT: s_endpgm 205; 206; GFX10-LABEL: load_1d_v2f16_tfe_dmask0: 207; GFX10: ; %bb.0: 208; GFX10-NEXT: v_mov_b32_e32 v1, 0 209; GFX10-NEXT: s_mov_b32 s11, s9 210; GFX10-NEXT: s_mov_b32 s10, s8 211; GFX10-NEXT: s_mov_b32 s9, s7 212; GFX10-NEXT: s_mov_b32 s8, s6 213; GFX10-NEXT: s_mov_b32 s7, s5 214; GFX10-NEXT: s_mov_b32 s6, s4 215; GFX10-NEXT: s_mov_b32 s5, s3 216; GFX10-NEXT: s_mov_b32 s4, s2 217; GFX10-NEXT: v_mov_b32_e32 v2, v1 218; GFX10-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x1 dim:SQ_RSRC_IMG_1D unorm tfe d16 219; GFX10-NEXT: s_waitcnt vmcnt(0) 220; GFX10-NEXT: global_store_dword v[0:1], v1, off 221; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 222; GFX10-NEXT: global_store_dword v[0:1], v2, off 223; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 224; GFX10-NEXT: s_endpgm 225; 226; GFX11-LABEL: load_1d_v2f16_tfe_dmask0: 227; GFX11: ; %bb.0: 228; GFX11-NEXT: v_mov_b32_e32 v1, 0 229; GFX11-NEXT: s_mov_b32 s11, s9 230; GFX11-NEXT: s_mov_b32 s10, s8 231; GFX11-NEXT: s_mov_b32 s9, s7 232; GFX11-NEXT: s_mov_b32 s8, s6 233; GFX11-NEXT: s_mov_b32 s7, s5 234; GFX11-NEXT: s_mov_b32 s6, s4 235; GFX11-NEXT: s_mov_b32 s5, s3 236; GFX11-NEXT: s_mov_b32 s4, s2 237; GFX11-NEXT: v_mov_b32_e32 v2, v1 238; GFX11-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x1 dim:SQ_RSRC_IMG_1D unorm tfe d16 239; GFX11-NEXT: s_waitcnt vmcnt(0) 240; GFX11-NEXT: global_store_b32 v[0:1], v1, off dlc 241; GFX11-NEXT: s_waitcnt_vscnt null, 0x0 242; GFX11-NEXT: global_store_b32 v[0:1], v2, off dlc 243; GFX11-NEXT: s_waitcnt_vscnt null, 0x0 244; GFX11-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 245; GFX11-NEXT: s_endpgm 246; 247; GFX8-UNPACKED-LABEL: load_1d_v2f16_tfe_dmask0: 248; GFX8-UNPACKED: ; %bb.0: 249; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v1, 0 250; GFX8-UNPACKED-NEXT: s_mov_b32 s11, s9 251; GFX8-UNPACKED-NEXT: s_mov_b32 s10, s8 252; GFX8-UNPACKED-NEXT: s_mov_b32 s9, s7 253; GFX8-UNPACKED-NEXT: s_mov_b32 s8, s6 254; GFX8-UNPACKED-NEXT: s_mov_b32 s7, s5 255; GFX8-UNPACKED-NEXT: s_mov_b32 s6, s4 256; GFX8-UNPACKED-NEXT: s_mov_b32 s5, s3 257; GFX8-UNPACKED-NEXT: s_mov_b32 s4, s2 258; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v2, v1 259; GFX8-UNPACKED-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x1 unorm tfe d16 260; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 261; GFX8-UNPACKED-NEXT: flat_store_dword v[0:1], v1 262; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 263; GFX8-UNPACKED-NEXT: flat_store_dword v[0:1], v2 264; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 265; GFX8-UNPACKED-NEXT: s_endpgm 266 %v = call { <2 x half>, i32 } @llvm.amdgcn.image.load.1d.sl_v2f16i32s.i32(i32 0, i32 %s, <8 x i32> %rsrc, i32 1, i32 0) 267 %v.data = extractvalue { <2 x half>, i32 } %v, 0 268 %v.err = extractvalue { <2 x half>, i32 } %v, 1 269 store volatile <2 x half> %v.data, <2 x half> addrspace(1)* undef 270 store volatile i32 %v.err, i32 addrspace(1)* undef 271 ret void 272} 273 274define amdgpu_ps void @load_1d_v2f16_tfe_dmask1(<8 x i32> inreg %rsrc, i32 %s) { 275; GFX9-LABEL: load_1d_v2f16_tfe_dmask1: 276; GFX9: ; %bb.0: 277; GFX9-NEXT: v_mov_b32_e32 v1, 0 278; GFX9-NEXT: s_mov_b32 s11, s9 279; GFX9-NEXT: s_mov_b32 s10, s8 280; GFX9-NEXT: s_mov_b32 s9, s7 281; GFX9-NEXT: s_mov_b32 s8, s6 282; GFX9-NEXT: s_mov_b32 s7, s5 283; GFX9-NEXT: s_mov_b32 s6, s4 284; GFX9-NEXT: s_mov_b32 s5, s3 285; GFX9-NEXT: s_mov_b32 s4, s2 286; GFX9-NEXT: v_mov_b32_e32 v2, v1 287; GFX9-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x1 unorm tfe d16 288; GFX9-NEXT: s_waitcnt vmcnt(0) 289; GFX9-NEXT: global_store_dword v[0:1], v1, off 290; GFX9-NEXT: s_waitcnt vmcnt(0) 291; GFX9-NEXT: global_store_dword v[0:1], v2, off 292; GFX9-NEXT: s_waitcnt vmcnt(0) 293; GFX9-NEXT: s_endpgm 294; 295; GFX10-LABEL: load_1d_v2f16_tfe_dmask1: 296; GFX10: ; %bb.0: 297; GFX10-NEXT: v_mov_b32_e32 v1, 0 298; GFX10-NEXT: s_mov_b32 s11, s9 299; GFX10-NEXT: s_mov_b32 s10, s8 300; GFX10-NEXT: s_mov_b32 s9, s7 301; GFX10-NEXT: s_mov_b32 s8, s6 302; GFX10-NEXT: s_mov_b32 s7, s5 303; GFX10-NEXT: s_mov_b32 s6, s4 304; GFX10-NEXT: s_mov_b32 s5, s3 305; GFX10-NEXT: s_mov_b32 s4, s2 306; GFX10-NEXT: v_mov_b32_e32 v2, v1 307; GFX10-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x1 dim:SQ_RSRC_IMG_1D unorm tfe d16 308; GFX10-NEXT: s_waitcnt vmcnt(0) 309; GFX10-NEXT: global_store_dword v[0:1], v1, off 310; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 311; GFX10-NEXT: global_store_dword v[0:1], v2, off 312; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 313; GFX10-NEXT: s_endpgm 314; 315; GFX11-LABEL: load_1d_v2f16_tfe_dmask1: 316; GFX11: ; %bb.0: 317; GFX11-NEXT: v_mov_b32_e32 v1, 0 318; GFX11-NEXT: s_mov_b32 s11, s9 319; GFX11-NEXT: s_mov_b32 s10, s8 320; GFX11-NEXT: s_mov_b32 s9, s7 321; GFX11-NEXT: s_mov_b32 s8, s6 322; GFX11-NEXT: s_mov_b32 s7, s5 323; GFX11-NEXT: s_mov_b32 s6, s4 324; GFX11-NEXT: s_mov_b32 s5, s3 325; GFX11-NEXT: s_mov_b32 s4, s2 326; GFX11-NEXT: v_mov_b32_e32 v2, v1 327; GFX11-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x1 dim:SQ_RSRC_IMG_1D unorm tfe d16 328; GFX11-NEXT: s_waitcnt vmcnt(0) 329; GFX11-NEXT: global_store_b32 v[0:1], v1, off dlc 330; GFX11-NEXT: s_waitcnt_vscnt null, 0x0 331; GFX11-NEXT: global_store_b32 v[0:1], v2, off dlc 332; GFX11-NEXT: s_waitcnt_vscnt null, 0x0 333; GFX11-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 334; GFX11-NEXT: s_endpgm 335; 336; GFX8-UNPACKED-LABEL: load_1d_v2f16_tfe_dmask1: 337; GFX8-UNPACKED: ; %bb.0: 338; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v1, 0 339; GFX8-UNPACKED-NEXT: s_mov_b32 s11, s9 340; GFX8-UNPACKED-NEXT: s_mov_b32 s10, s8 341; GFX8-UNPACKED-NEXT: s_mov_b32 s9, s7 342; GFX8-UNPACKED-NEXT: s_mov_b32 s8, s6 343; GFX8-UNPACKED-NEXT: s_mov_b32 s7, s5 344; GFX8-UNPACKED-NEXT: s_mov_b32 s6, s4 345; GFX8-UNPACKED-NEXT: s_mov_b32 s5, s3 346; GFX8-UNPACKED-NEXT: s_mov_b32 s4, s2 347; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v2, v1 348; GFX8-UNPACKED-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x1 unorm tfe d16 349; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 350; GFX8-UNPACKED-NEXT: flat_store_dword v[0:1], v1 351; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 352; GFX8-UNPACKED-NEXT: flat_store_dword v[0:1], v2 353; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 354; GFX8-UNPACKED-NEXT: s_endpgm 355 %v = call { <2 x half>, i32 } @llvm.amdgcn.image.load.1d.sl_v2f16i32s.i32(i32 1, i32 %s, <8 x i32> %rsrc, i32 1, i32 0) 356 %v.data = extractvalue { <2 x half>, i32 } %v, 0 357 %v.err = extractvalue { <2 x half>, i32 } %v, 1 358 store volatile <2 x half> %v.data, <2 x half> addrspace(1)* undef 359 store volatile i32 %v.err, i32 addrspace(1)* undef 360 ret void 361} 362 363define amdgpu_ps void @load_1d_v2f16_tfe_dmask3(<8 x i32> inreg %rsrc, i32 %s) { 364; GFX9-LABEL: load_1d_v2f16_tfe_dmask3: 365; GFX9: ; %bb.0: 366; GFX9-NEXT: v_mov_b32_e32 v1, 0 367; GFX9-NEXT: s_mov_b32 s11, s9 368; GFX9-NEXT: s_mov_b32 s10, s8 369; GFX9-NEXT: s_mov_b32 s9, s7 370; GFX9-NEXT: s_mov_b32 s8, s6 371; GFX9-NEXT: s_mov_b32 s7, s5 372; GFX9-NEXT: s_mov_b32 s6, s4 373; GFX9-NEXT: s_mov_b32 s5, s3 374; GFX9-NEXT: s_mov_b32 s4, s2 375; GFX9-NEXT: v_mov_b32_e32 v2, v1 376; GFX9-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x3 unorm tfe d16 377; GFX9-NEXT: s_waitcnt vmcnt(0) 378; GFX9-NEXT: global_store_dword v[0:1], v1, off 379; GFX9-NEXT: s_waitcnt vmcnt(0) 380; GFX9-NEXT: global_store_dword v[0:1], v2, off 381; GFX9-NEXT: s_waitcnt vmcnt(0) 382; GFX9-NEXT: s_endpgm 383; 384; GFX10-LABEL: load_1d_v2f16_tfe_dmask3: 385; GFX10: ; %bb.0: 386; GFX10-NEXT: v_mov_b32_e32 v1, 0 387; GFX10-NEXT: s_mov_b32 s11, s9 388; GFX10-NEXT: s_mov_b32 s10, s8 389; GFX10-NEXT: s_mov_b32 s9, s7 390; GFX10-NEXT: s_mov_b32 s8, s6 391; GFX10-NEXT: s_mov_b32 s7, s5 392; GFX10-NEXT: s_mov_b32 s6, s4 393; GFX10-NEXT: s_mov_b32 s5, s3 394; GFX10-NEXT: s_mov_b32 s4, s2 395; GFX10-NEXT: v_mov_b32_e32 v2, v1 396; GFX10-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm tfe d16 397; GFX10-NEXT: s_waitcnt vmcnt(0) 398; GFX10-NEXT: global_store_dword v[0:1], v1, off 399; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 400; GFX10-NEXT: global_store_dword v[0:1], v2, off 401; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 402; GFX10-NEXT: s_endpgm 403; 404; GFX11-LABEL: load_1d_v2f16_tfe_dmask3: 405; GFX11: ; %bb.0: 406; GFX11-NEXT: v_mov_b32_e32 v1, 0 407; GFX11-NEXT: s_mov_b32 s11, s9 408; GFX11-NEXT: s_mov_b32 s10, s8 409; GFX11-NEXT: s_mov_b32 s9, s7 410; GFX11-NEXT: s_mov_b32 s8, s6 411; GFX11-NEXT: s_mov_b32 s7, s5 412; GFX11-NEXT: s_mov_b32 s6, s4 413; GFX11-NEXT: s_mov_b32 s5, s3 414; GFX11-NEXT: s_mov_b32 s4, s2 415; GFX11-NEXT: v_mov_b32_e32 v2, v1 416; GFX11-NEXT: image_load v[1:2], v0, s[4:11] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm tfe d16 417; GFX11-NEXT: s_waitcnt vmcnt(0) 418; GFX11-NEXT: global_store_b32 v[0:1], v1, off dlc 419; GFX11-NEXT: s_waitcnt_vscnt null, 0x0 420; GFX11-NEXT: global_store_b32 v[0:1], v2, off dlc 421; GFX11-NEXT: s_waitcnt_vscnt null, 0x0 422; GFX11-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 423; GFX11-NEXT: s_endpgm 424; 425; GFX8-UNPACKED-LABEL: load_1d_v2f16_tfe_dmask3: 426; GFX8-UNPACKED: ; %bb.0: 427; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v1, 0 428; GFX8-UNPACKED-NEXT: s_mov_b32 s11, s9 429; GFX8-UNPACKED-NEXT: s_mov_b32 s10, s8 430; GFX8-UNPACKED-NEXT: s_mov_b32 s9, s7 431; GFX8-UNPACKED-NEXT: s_mov_b32 s8, s6 432; GFX8-UNPACKED-NEXT: s_mov_b32 s7, s5 433; GFX8-UNPACKED-NEXT: s_mov_b32 s6, s4 434; GFX8-UNPACKED-NEXT: s_mov_b32 s5, s3 435; GFX8-UNPACKED-NEXT: s_mov_b32 s4, s2 436; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v2, v1 437; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v3, v1 438; GFX8-UNPACKED-NEXT: image_load v[1:3], v0, s[4:11] dmask:0x3 unorm tfe d16 439; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 440; GFX8-UNPACKED-NEXT: v_lshlrev_b32_e32 v0, 16, v2 441; GFX8-UNPACKED-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 442; GFX8-UNPACKED-NEXT: flat_store_dword v[0:1], v0 443; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 444; GFX8-UNPACKED-NEXT: flat_store_dword v[0:1], v3 445; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 446; GFX8-UNPACKED-NEXT: s_endpgm 447 %v = call { <2 x half>, i32 } @llvm.amdgcn.image.load.1d.sl_v2f16i32s.i32(i32 3, i32 %s, <8 x i32> %rsrc, i32 1, i32 0) 448 %v.data = extractvalue { <2 x half>, i32 } %v, 0 449 %v.err = extractvalue { <2 x half>, i32 } %v, 1 450 store volatile <2 x half> %v.data, <2 x half> addrspace(1)* undef 451 store volatile i32 %v.err, i32 addrspace(1)* undef 452 ret void 453} 454 455define amdgpu_ps void @load_1d_v3f16_tfe_dmask7(<8 x i32> inreg %rsrc, i32 %s) { 456; GFX9-LABEL: load_1d_v3f16_tfe_dmask7: 457; GFX9: ; %bb.0: 458; GFX9-NEXT: v_mov_b32_e32 v1, 0 459; GFX9-NEXT: s_mov_b32 s11, s9 460; GFX9-NEXT: s_mov_b32 s10, s8 461; GFX9-NEXT: s_mov_b32 s9, s7 462; GFX9-NEXT: s_mov_b32 s8, s6 463; GFX9-NEXT: s_mov_b32 s7, s5 464; GFX9-NEXT: s_mov_b32 s6, s4 465; GFX9-NEXT: s_mov_b32 s5, s3 466; GFX9-NEXT: s_mov_b32 s4, s2 467; GFX9-NEXT: v_mov_b32_e32 v2, v1 468; GFX9-NEXT: v_mov_b32_e32 v3, v1 469; GFX9-NEXT: image_load v[1:3], v0, s[4:11] dmask:0x7 unorm tfe d16 470; GFX9-NEXT: s_waitcnt vmcnt(0) 471; GFX9-NEXT: global_store_short v[0:1], v2, off 472; GFX9-NEXT: s_waitcnt vmcnt(0) 473; GFX9-NEXT: global_store_dword v[0:1], v1, off 474; GFX9-NEXT: s_waitcnt vmcnt(0) 475; GFX9-NEXT: global_store_dword v[0:1], v3, off 476; GFX9-NEXT: s_waitcnt vmcnt(0) 477; GFX9-NEXT: s_endpgm 478; 479; GFX10-LABEL: load_1d_v3f16_tfe_dmask7: 480; GFX10: ; %bb.0: 481; GFX10-NEXT: v_mov_b32_e32 v1, 0 482; GFX10-NEXT: s_mov_b32 s11, s9 483; GFX10-NEXT: s_mov_b32 s10, s8 484; GFX10-NEXT: s_mov_b32 s9, s7 485; GFX10-NEXT: s_mov_b32 s8, s6 486; GFX10-NEXT: s_mov_b32 s7, s5 487; GFX10-NEXT: s_mov_b32 s6, s4 488; GFX10-NEXT: s_mov_b32 s5, s3 489; GFX10-NEXT: s_mov_b32 s4, s2 490; GFX10-NEXT: v_mov_b32_e32 v2, v1 491; GFX10-NEXT: v_mov_b32_e32 v3, v1 492; GFX10-NEXT: image_load v[1:3], v0, s[4:11] dmask:0x7 dim:SQ_RSRC_IMG_1D unorm tfe d16 493; GFX10-NEXT: s_waitcnt vmcnt(0) 494; GFX10-NEXT: global_store_short v[0:1], v2, off 495; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 496; GFX10-NEXT: global_store_dword v[0:1], v1, off 497; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 498; GFX10-NEXT: global_store_dword v[0:1], v3, off 499; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 500; GFX10-NEXT: s_endpgm 501; 502; GFX11-LABEL: load_1d_v3f16_tfe_dmask7: 503; GFX11: ; %bb.0: 504; GFX11-NEXT: v_mov_b32_e32 v1, 0 505; GFX11-NEXT: s_mov_b32 s11, s9 506; GFX11-NEXT: s_mov_b32 s10, s8 507; GFX11-NEXT: s_mov_b32 s9, s7 508; GFX11-NEXT: s_mov_b32 s8, s6 509; GFX11-NEXT: s_mov_b32 s7, s5 510; GFX11-NEXT: s_mov_b32 s6, s4 511; GFX11-NEXT: s_mov_b32 s5, s3 512; GFX11-NEXT: s_mov_b32 s4, s2 513; GFX11-NEXT: v_mov_b32_e32 v2, v1 514; GFX11-NEXT: v_mov_b32_e32 v3, v1 515; GFX11-NEXT: image_load v[1:3], v0, s[4:11] dmask:0x7 dim:SQ_RSRC_IMG_1D unorm tfe d16 516; GFX11-NEXT: s_waitcnt vmcnt(0) 517; GFX11-NEXT: global_store_b16 v[0:1], v2, off dlc 518; GFX11-NEXT: s_waitcnt_vscnt null, 0x0 519; GFX11-NEXT: global_store_b32 v[0:1], v1, off dlc 520; GFX11-NEXT: s_waitcnt_vscnt null, 0x0 521; GFX11-NEXT: global_store_b32 v[0:1], v3, off dlc 522; GFX11-NEXT: s_waitcnt_vscnt null, 0x0 523; GFX11-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 524; GFX11-NEXT: s_endpgm 525; 526; GFX8-UNPACKED-LABEL: load_1d_v3f16_tfe_dmask7: 527; GFX8-UNPACKED: ; %bb.0: 528; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v1, 0 529; GFX8-UNPACKED-NEXT: s_mov_b32 s11, s9 530; GFX8-UNPACKED-NEXT: s_mov_b32 s10, s8 531; GFX8-UNPACKED-NEXT: s_mov_b32 s9, s7 532; GFX8-UNPACKED-NEXT: s_mov_b32 s8, s6 533; GFX8-UNPACKED-NEXT: s_mov_b32 s7, s5 534; GFX8-UNPACKED-NEXT: s_mov_b32 s6, s4 535; GFX8-UNPACKED-NEXT: s_mov_b32 s5, s3 536; GFX8-UNPACKED-NEXT: s_mov_b32 s4, s2 537; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v2, v1 538; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v3, v1 539; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v4, v1 540; GFX8-UNPACKED-NEXT: image_load v[1:4], v0, s[4:11] dmask:0x7 unorm tfe d16 541; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 542; GFX8-UNPACKED-NEXT: v_lshlrev_b32_e32 v0, 16, v2 543; GFX8-UNPACKED-NEXT: flat_store_short v[0:1], v3 544; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 545; GFX8-UNPACKED-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 546; GFX8-UNPACKED-NEXT: flat_store_dword v[0:1], v0 547; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 548; GFX8-UNPACKED-NEXT: flat_store_dword v[0:1], v4 549; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 550; GFX8-UNPACKED-NEXT: s_endpgm 551 %v = call { <3 x half>, i32 } @llvm.amdgcn.image.load.1d.sl_v3f16i32s.i32(i32 7, i32 %s, <8 x i32> %rsrc, i32 1, i32 0) 552 %v.data = extractvalue { <3 x half>, i32 } %v, 0 553 %v.err = extractvalue { <3 x half>, i32 } %v, 1 554 store volatile <3 x half> %v.data, <3 x half> addrspace(1)* undef 555 store volatile i32 %v.err, i32 addrspace(1)* undef 556 ret void 557} 558 559define amdgpu_ps void @load_1d_v4f16_tfe_dmask15(<8 x i32> inreg %rsrc, i32 %s) { 560; GFX9-LABEL: load_1d_v4f16_tfe_dmask15: 561; GFX9: ; %bb.0: 562; GFX9-NEXT: v_mov_b32_e32 v1, 0 563; GFX9-NEXT: s_mov_b32 s11, s9 564; GFX9-NEXT: s_mov_b32 s10, s8 565; GFX9-NEXT: s_mov_b32 s9, s7 566; GFX9-NEXT: s_mov_b32 s8, s6 567; GFX9-NEXT: s_mov_b32 s7, s5 568; GFX9-NEXT: s_mov_b32 s6, s4 569; GFX9-NEXT: s_mov_b32 s5, s3 570; GFX9-NEXT: s_mov_b32 s4, s2 571; GFX9-NEXT: v_mov_b32_e32 v2, v1 572; GFX9-NEXT: v_mov_b32_e32 v3, v1 573; GFX9-NEXT: image_load v[1:3], v0, s[4:11] dmask:0xf unorm tfe d16 574; GFX9-NEXT: s_waitcnt vmcnt(0) 575; GFX9-NEXT: global_store_dwordx2 v[0:1], v[1:2], off 576; GFX9-NEXT: s_waitcnt vmcnt(0) 577; GFX9-NEXT: global_store_dword v[0:1], v3, off 578; GFX9-NEXT: s_waitcnt vmcnt(0) 579; GFX9-NEXT: s_endpgm 580; 581; GFX10-LABEL: load_1d_v4f16_tfe_dmask15: 582; GFX10: ; %bb.0: 583; GFX10-NEXT: v_mov_b32_e32 v1, 0 584; GFX10-NEXT: s_mov_b32 s11, s9 585; GFX10-NEXT: s_mov_b32 s10, s8 586; GFX10-NEXT: s_mov_b32 s9, s7 587; GFX10-NEXT: s_mov_b32 s8, s6 588; GFX10-NEXT: s_mov_b32 s7, s5 589; GFX10-NEXT: s_mov_b32 s6, s4 590; GFX10-NEXT: s_mov_b32 s5, s3 591; GFX10-NEXT: s_mov_b32 s4, s2 592; GFX10-NEXT: v_mov_b32_e32 v2, v1 593; GFX10-NEXT: v_mov_b32_e32 v3, v1 594; GFX10-NEXT: image_load v[1:3], v0, s[4:11] dmask:0xf dim:SQ_RSRC_IMG_1D unorm tfe d16 595; GFX10-NEXT: s_waitcnt vmcnt(0) 596; GFX10-NEXT: global_store_dwordx2 v[0:1], v[1:2], off 597; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 598; GFX10-NEXT: global_store_dword v[0:1], v3, off 599; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 600; GFX10-NEXT: s_endpgm 601; 602; GFX11-LABEL: load_1d_v4f16_tfe_dmask15: 603; GFX11: ; %bb.0: 604; GFX11-NEXT: v_mov_b32_e32 v1, 0 605; GFX11-NEXT: s_mov_b32 s11, s9 606; GFX11-NEXT: s_mov_b32 s10, s8 607; GFX11-NEXT: s_mov_b32 s9, s7 608; GFX11-NEXT: s_mov_b32 s8, s6 609; GFX11-NEXT: s_mov_b32 s7, s5 610; GFX11-NEXT: s_mov_b32 s6, s4 611; GFX11-NEXT: s_mov_b32 s5, s3 612; GFX11-NEXT: s_mov_b32 s4, s2 613; GFX11-NEXT: v_mov_b32_e32 v2, v1 614; GFX11-NEXT: v_mov_b32_e32 v3, v1 615; GFX11-NEXT: image_load v[1:3], v0, s[4:11] dmask:0xf dim:SQ_RSRC_IMG_1D unorm tfe d16 616; GFX11-NEXT: s_waitcnt vmcnt(0) 617; GFX11-NEXT: global_store_b64 v[0:1], v[1:2], off dlc 618; GFX11-NEXT: s_waitcnt_vscnt null, 0x0 619; GFX11-NEXT: global_store_b32 v[0:1], v3, off dlc 620; GFX11-NEXT: s_waitcnt_vscnt null, 0x0 621; GFX11-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 622; GFX11-NEXT: s_endpgm 623; 624; GFX8-UNPACKED-LABEL: load_1d_v4f16_tfe_dmask15: 625; GFX8-UNPACKED: ; %bb.0: 626; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v1, 0 627; GFX8-UNPACKED-NEXT: s_mov_b32 s11, s9 628; GFX8-UNPACKED-NEXT: s_mov_b32 s10, s8 629; GFX8-UNPACKED-NEXT: s_mov_b32 s9, s7 630; GFX8-UNPACKED-NEXT: s_mov_b32 s8, s6 631; GFX8-UNPACKED-NEXT: s_mov_b32 s7, s5 632; GFX8-UNPACKED-NEXT: s_mov_b32 s6, s4 633; GFX8-UNPACKED-NEXT: s_mov_b32 s5, s3 634; GFX8-UNPACKED-NEXT: s_mov_b32 s4, s2 635; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v2, v1 636; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v3, v1 637; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v4, v1 638; GFX8-UNPACKED-NEXT: v_mov_b32_e32 v5, v1 639; GFX8-UNPACKED-NEXT: image_load v[1:5], v0, s[4:11] dmask:0xf unorm tfe d16 640; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 641; GFX8-UNPACKED-NEXT: v_lshlrev_b32_e32 v0, 16, v4 642; GFX8-UNPACKED-NEXT: v_lshlrev_b32_e32 v4, 16, v2 643; GFX8-UNPACKED-NEXT: v_or_b32_sdwa v2, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 644; GFX8-UNPACKED-NEXT: v_or_b32_sdwa v1, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 645; GFX8-UNPACKED-NEXT: flat_store_dwordx2 v[0:1], v[1:2] 646; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 647; GFX8-UNPACKED-NEXT: flat_store_dword v[0:1], v5 648; GFX8-UNPACKED-NEXT: s_waitcnt vmcnt(0) 649; GFX8-UNPACKED-NEXT: s_endpgm 650 %v = call { <4 x half>, i32 } @llvm.amdgcn.image.load.1d.sl_v4f16i32s.i32(i32 15, i32 %s, <8 x i32> %rsrc, i32 1, i32 0) 651 %v.data = extractvalue { <4 x half>, i32 } %v, 0 652 %v.err = extractvalue { <4 x half>, i32 } %v, 1 653 store volatile <4 x half> %v.data, <4 x half> addrspace(1)* undef 654 store volatile i32 %v.err, i32 addrspace(1)* undef 655 ret void 656} 657 658declare { half, i32 } @llvm.amdgcn.image.load.1d.sl_f16i32s.i32(i32 immarg, i32, <8 x i32>, i32 immarg, i32 immarg) #0 659declare { <2 x half>, i32 } @llvm.amdgcn.image.load.1d.sl_v2f16i32s.i32(i32 immarg, i32, <8 x i32>, i32 immarg, i32 immarg) #0 660declare { <3 x half>, i32 } @llvm.amdgcn.image.load.1d.sl_v3f16i32s.i32(i32 immarg, i32, <8 x i32>, i32 immarg, i32 immarg) #0 661declare { <4 x half>, i32 } @llvm.amdgcn.image.load.1d.sl_v4f16i32s.i32(i32 immarg, i32, <8 x i32>, i32 immarg, i32 immarg) #0 662 663attributes #0 = { nounwind readonly } 664