1; RUN: llc < %s -march=amdgcn -mcpu=tonga -verify-machineinstrs | FileCheck -check-prefixes=GCN,UNPACKED,GFX89 %s 2; RUN: llc < %s -march=amdgcn -mcpu=gfx810 -verify-machineinstrs | FileCheck -check-prefixes=GCN,GFX81,GFX89 %s 3; RUN: llc < %s -march=amdgcn -mcpu=gfx900 -verify-machineinstrs | FileCheck -check-prefixes=GCN,PACKED,GFX89 %s 4; RUN: llc < %s -march=amdgcn -mcpu=gfx1010 -verify-machineinstrs | FileCheck -check-prefixes=GCN,GFX10 %s 5; RUN: llc < %s -march=amdgcn -mcpu=gfx1100 -verify-machineinstrs | FileCheck -check-prefixes=GCN,GFX10 %s 6 7; GCN-LABEL: {{^}}image_load_f16: 8; GFX89: image_load v0, v[0:1], s[0:7] dmask:0x1 unorm d16{{$}} 9; GFX10: image_load v0, v[0:1], s[0:7] dmask:0x1 dim:SQ_RSRC_IMG_2D unorm d16{{$}} 10define amdgpu_ps half @image_load_f16(<8 x i32> inreg %rsrc, i32 %s, i32 %t) { 11main_body: 12 %tex = call half @llvm.amdgcn.image.load.2d.f16.i32(i32 1, i32 %s, i32 %t, <8 x i32> %rsrc, i32 0, i32 0) 13 ret half %tex 14} 15 16; GCN-LABEL: {{^}}image_load_v2f16: 17; UNPACKED: image_load v[0:1], v[0:1], s[0:7] dmask:0x3 unorm d16{{$}} 18; PACKED: image_load v0, v[0:1], s[0:7] dmask:0x3 unorm d16{{$}} 19; GFX81: image_load v0, v[0:1], s[0:7] dmask:0x3 unorm d16{{$}} 20; GFX10: image_load v0, v[0:1], s[0:7] dmask:0x3 dim:SQ_RSRC_IMG_2D unorm d16{{$}} 21define amdgpu_ps float @image_load_v2f16(<8 x i32> inreg %rsrc, i32 %s, i32 %t) { 22main_body: 23 %tex = call <2 x half> @llvm.amdgcn.image.load.2d.v2f16.i32(i32 3, i32 %s, i32 %t, <8 x i32> %rsrc, i32 0, i32 0) 24 %r = bitcast <2 x half> %tex to float 25 ret float %r 26} 27 28; GCN-LABEL: {{^}}image_load_v3f16: 29; UNPACKED: image_load v[0:2], v[0:1], s[0:7] dmask:0x7 unorm d16{{$}} 30; PACKED: image_load v[0:1], v[0:1], s[0:7] dmask:0x7 unorm d16{{$}} 31; GFX10: image_load v[0:1], v[0:1], s[0:7] dmask:0x7 dim:SQ_RSRC_IMG_2D unorm d16{{$}} 32define amdgpu_ps <2 x float> @image_load_v3f16(<8 x i32> inreg %rsrc, i32 %s, i32 %t) { 33main_body: 34 %tex = call <3 x half> @llvm.amdgcn.image.load.2d.v3f16.i32(i32 7, i32 %s, i32 %t, <8 x i32> %rsrc, i32 0, i32 0) 35 %ext = shufflevector <3 x half> %tex, <3 x half> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 36 %r = bitcast <4 x half> %ext to <2 x float> 37 ret <2 x float> %r 38} 39 40; GCN-LABEL: {{^}}image_load_v4f16: 41; UNPACKED: image_load v[0:3], v[0:1], s[0:7] dmask:0xf unorm d16{{$}} 42; PACKED: image_load v[0:1], v[0:1], s[0:7] dmask:0xf unorm d16{{$}} 43; GFX81: image_load v[0:1], v[0:1], s[0:7] dmask:0xf unorm d16{{$}} 44; GFX10: image_load v[0:1], v[0:1], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D unorm d16{{$}} 45define amdgpu_ps <2 x float> @image_load_v4f16(<8 x i32> inreg %rsrc, i32 %s, i32 %t) { 46main_body: 47 %tex = call <4 x half> @llvm.amdgcn.image.load.2d.v4f16.i32(i32 15, i32 %s, i32 %t, <8 x i32> %rsrc, i32 0, i32 0) 48 %r = bitcast <4 x half> %tex to <2 x float> 49 ret <2 x float> %r 50} 51 52; GCN-LABEL: {{^}}image_load_mip_v4f16: 53; UNPACKED: image_load_mip v[0:3], v[0:2], s[0:7] dmask:0xf unorm d16{{$}} 54; PACKED: image_load_mip v[0:1], v[0:2], s[0:7] dmask:0xf unorm d16{{$}} 55; GFX81: image_load_mip v[0:1], v[0:2], s[0:7] dmask:0xf unorm d16{{$}} 56; GFX10: image_load_mip v[0:1], v[0:2], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D unorm d16{{$}} 57define amdgpu_ps <2 x float> @image_load_mip_v4f16(<8 x i32> inreg %rsrc, i32 %s, i32 %t, i32 %mip) { 58main_body: 59 %tex = call <4 x half> @llvm.amdgcn.image.load.mip.2d.v4f16.i32(i32 15, i32 %s, i32 %t, i32 %mip, <8 x i32> %rsrc, i32 0, i32 0) 60 %r = bitcast <4 x half> %tex to <2 x float> 61 ret <2 x float> %r 62} 63 64; GCN-LABEL: {{^}}image_load_3d_v2f16: 65; UNPACKED: image_load v[0:1], v[0:2], s[0:7] dmask:0x3 unorm d16{{$}} 66; PACKED: image_load v0, v[0:2], s[0:7] dmask:0x3 unorm d16{{$}} 67; GFX81: image_load v0, v[0:2], s[0:7] dmask:0x3 unorm d16{{$}} 68; GFX10: image_load v0, v[0:2], s[0:7] dmask:0x3 dim:SQ_RSRC_IMG_3D unorm d16{{$}} 69define amdgpu_ps float @image_load_3d_v2f16(<8 x i32> inreg %rsrc, i32 %s, i32 %t, i32 %r) { 70main_body: 71 %tex = call <2 x half> @llvm.amdgcn.image.load.3d.v2f16.i32(i32 3, i32 %s, i32 %t, i32 %r, <8 x i32> %rsrc, i32 0, i32 0) 72 %x = bitcast <2 x half> %tex to float 73 ret float %x 74} 75 76 77; GCN-LABEL: {{^}}image_load_3d_v3f16: 78; UNPACKED: image_load v[0:2], v[0:2], s[0:7] dmask:0x7 unorm d16 79; PACKED: image_load v[0:1], v[0:2], s[0:7] dmask:0x7 unorm d16 80; GFX81: image_load v[0:1], v[0:2], s[0:7] dmask:0x7 unorm d16 81; GFX10: image_load v[0:1], v[0:2], s[0:7] dmask:0x7 dim:SQ_RSRC_IMG_3D unorm d16{{$}} 82define amdgpu_ps <2 x float> @image_load_3d_v3f16(<8 x i32> inreg %rsrc, i32 %s, i32 %t, i32 %r) { 83main_body: 84 %tex = call <3 x half> @llvm.amdgcn.image.load.3d.v3f16.i32(i32 7, i32 %s, i32 %t, i32 %r, <8 x i32> %rsrc, i32 0, i32 0) 85 %ext = shufflevector <3 x half> %tex, <3 x half> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 86 %res = bitcast <4 x half> %ext to <2 x float> 87 ret <2 x float> %res 88} 89 90; GCN-LABEL: {{^}}image_store_f16 91; GFX89: image_store v2, v[0:1], s[0:7] dmask:0x1 unorm d16{{$}} 92; GFX10: image_store v2, v[0:1], s[0:7] dmask:0x1 dim:SQ_RSRC_IMG_2D unorm d16{{$}} 93define amdgpu_ps void @image_store_f16(<8 x i32> inreg %rsrc, i32 %s, i32 %t, half %data) { 94main_body: 95 call void @llvm.amdgcn.image.store.2d.f16.i32(half %data, i32 1, i32 %s, i32 %t, <8 x i32> %rsrc, i32 0, i32 0) 96 ret void 97} 98 99; GCN-LABEL: {{^}}image_store_v2f16 100; UNPACKED: v_lshrrev_b32_e32 101; UNPACKED: v_and_b32_e32 102; UNPACKED: image_store v[{{[0-9:]+}}], v[0:1], s[0:7] dmask:0x3 unorm d16{{$}} 103; PACKED: image_store v2, v[0:1], s[0:7] dmask:0x3 unorm d16{{$}} 104; GFX81: image_store v[2:3], v[0:1], s[0:7] dmask:0x3 unorm d16{{$}} 105; GFX10: image_store v2, v[0:1], s[0:7] dmask:0x3 dim:SQ_RSRC_IMG_2D unorm d16{{$}} 106define amdgpu_ps void @image_store_v2f16(<8 x i32> inreg %rsrc, i32 %s, i32 %t, float %in) { 107main_body: 108 %data = bitcast float %in to <2 x half> 109 call void @llvm.amdgcn.image.store.2d.v2f16.i32(<2 x half> %data, i32 3, i32 %s, i32 %t, <8 x i32> %rsrc, i32 0, i32 0) 110 ret void 111} 112 113; GCN-LABEL: {{^}}image_store_v3f16: 114; UNPACKED: image_store v[2:4], v[0:1], s[0:7] dmask:0x7 unorm d16 115; PACKED: image_store v[2:3], v[0:1], s[0:7] dmask:0x7 unorm d16 116; GFX81: image_store v[2:4], v[0:1], s[0:7] dmask:0x7 unorm d16 117; GFX10: image_store v[2:3], v[0:1], s[0:7] dmask:0x7 dim:SQ_RSRC_IMG_2D unorm d16{{$}} 118define amdgpu_ps void @image_store_v3f16(<8 x i32> inreg %rsrc, i32 %s, i32 %t, <2 x float> %in) { 119main_body: 120 %r = bitcast <2 x float> %in to <4 x half> 121 %data = shufflevector <4 x half> %r, <4 x half> undef, <3 x i32> <i32 0, i32 1, i32 2> 122 call void @llvm.amdgcn.image.store.2d.v3f16.i32(<3 x half> %data, i32 7, i32 %s, i32 %t, <8 x i32> %rsrc, i32 0, i32 0) 123 ret void 124} 125 126; GCN-LABEL: {{^}}image_store_v4f16 127; UNPACKED: v_lshrrev_b32_e32 128; UNPACKED: v_and_b32_e32 129; UNPACKED: v_lshrrev_b32_e32 130; UNPACKED: v_and_b32_e32 131; UNPACKED: image_store v[{{[0-9:]+}}], v[0:1], s[0:7] dmask:0xf unorm d16{{$}} 132; PACKED: image_store v[2:3], v[0:1], s[0:7] dmask:0xf unorm d16{{$}} 133; GFX81: image_store v[2:5], v[0:1], s[0:7] dmask:0xf unorm d16{{$}} 134; GFX10: image_store v[2:3], v[0:1], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_2D unorm d16{{$}} 135define amdgpu_ps void @image_store_v4f16(<8 x i32> inreg %rsrc, i32 %s, i32 %t, <2 x float> %in) { 136main_body: 137 %data = bitcast <2 x float> %in to <4 x half> 138 call void @llvm.amdgcn.image.store.2d.v4f16.i32(<4 x half> %data, i32 15, i32 %s, i32 %t, <8 x i32> %rsrc, i32 0, i32 0) 139 ret void 140} 141 142; GCN-LABEL: {{^}}image_store_mip_1d_v4f16 143; UNPACKED: v_lshrrev_b32_e32 144; UNPACKED: v_and_b32_e32 145; UNPACKED: v_lshrrev_b32_e32 146; UNPACKED: v_and_b32_e32 147; UNPACKED: image_store_mip v[{{[0-9:]+}}], v[0:1], s[0:7] dmask:0xf unorm d16{{$}} 148; PACKED: image_store_mip v[2:3], v[0:1], s[0:7] dmask:0xf unorm d16{{$}} 149; GFX81: image_store_mip v[2:5], v[0:1], s[0:7] dmask:0xf unorm d16{{$}} 150; GFX10: image_store_mip v[2:3], v[0:1], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_1D unorm d16{{$}} 151define amdgpu_ps void @image_store_mip_1d_v4f16(<8 x i32> inreg %rsrc, i32 %s, i32 %mip, <2 x float> %in) { 152main_body: 153 %data = bitcast <2 x float> %in to <4 x half> 154 call void @llvm.amdgcn.image.store.mip.1d.v4f16.i32(<4 x half> %data, i32 15, i32 %s, i32 %mip, <8 x i32> %rsrc, i32 0, i32 0) 155 ret void 156} 157 158declare half @llvm.amdgcn.image.load.2d.f16.i32(i32, i32, i32, <8 x i32>, i32, i32) #1 159declare <2 x half> @llvm.amdgcn.image.load.2d.v2f16.i32(i32, i32, i32, <8 x i32>, i32, i32) #1 160declare <3 x half> @llvm.amdgcn.image.load.2d.v3f16.i32(i32, i32, i32, <8 x i32>, i32, i32) #1 161declare <4 x half> @llvm.amdgcn.image.load.2d.v4f16.i32(i32, i32, i32, <8 x i32>, i32, i32) #1 162declare <4 x half> @llvm.amdgcn.image.load.mip.2d.v4f16.i32(i32, i32, i32, i32, <8 x i32>, i32, i32) #1 163declare <2 x half> @llvm.amdgcn.image.load.3d.v2f16.i32(i32, i32, i32, i32, <8 x i32>, i32, i32) #1 164declare <3 x half> @llvm.amdgcn.image.load.3d.v3f16.i32(i32, i32, i32, i32, <8 x i32>, i32, i32) #1 165 166declare void @llvm.amdgcn.image.store.2d.f16.i32(half, i32, i32, i32, <8 x i32>, i32, i32) #0 167declare void @llvm.amdgcn.image.store.2d.v2f16.i32(<2 x half>, i32, i32, i32, <8 x i32>, i32, i32) #0 168declare void @llvm.amdgcn.image.store.2d.v3f16.i32(<3 x half>, i32, i32, i32, <8 x i32>, i32, i32) #0 169declare void @llvm.amdgcn.image.store.2d.v4f16.i32(<4 x half>, i32, i32, i32, <8 x i32>, i32, i32) #0 170declare void @llvm.amdgcn.image.store.mip.1d.v4f16.i32(<4 x half>, i32, i32, i32, <8 x i32>, i32, i32) #0 171declare void @llvm.amdgcn.image.store.3d.v2f16.i32(<2 x half>, i32, i32, i32, i32, <8 x i32>, i32, i32) #0 172declare void @llvm.amdgcn.image.store.3d.v3f16.i32(<3 x half>, i32, i32, i32, i32, <8 x i32>, i32, i32) #0 173 174attributes #0 = { nounwind } 175attributes #1 = { nounwind readonly } 176attributes #2 = { nounwind readnone } 177