xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.image.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker;RUN: llc < %s -march=amdgcn -mcpu=verde -verify-machineinstrs | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker;RUN: llc < %s -march=amdgcn -mcpu=tonga -verify-machineinstrs | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: {{^}}image_load_v4i32:
5*9880d681SAndroid Build Coastguard Worker;CHECK: image_load v[0:3], v[0:3], s[0:7] dmask:0xf unorm
6*9880d681SAndroid Build Coastguard Worker;CHECK: s_waitcnt vmcnt(0)
7*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps <4 x float> @image_load_v4i32(<8 x i32> inreg %rsrc, <4 x i32> %c) {
8*9880d681SAndroid Build Coastguard Workermain_body:
9*9880d681SAndroid Build Coastguard Worker  %tex = call <4 x float> @llvm.amdgcn.image.load.v4i32(<4 x i32> %c, <8 x i32> %rsrc, i32 15, i1 0, i1 0, i1 0, i1 0)
10*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %tex
11*9880d681SAndroid Build Coastguard Worker}
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: {{^}}image_load_v2i32:
14*9880d681SAndroid Build Coastguard Worker;CHECK: image_load v[0:3], v[0:1], s[0:7] dmask:0xf unorm
15*9880d681SAndroid Build Coastguard Worker;CHECK: s_waitcnt vmcnt(0)
16*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps <4 x float> @image_load_v2i32(<8 x i32> inreg %rsrc, <2 x i32> %c) {
17*9880d681SAndroid Build Coastguard Workermain_body:
18*9880d681SAndroid Build Coastguard Worker  %tex = call <4 x float> @llvm.amdgcn.image.load.v2i32(<2 x i32> %c, <8 x i32> %rsrc, i32 15, i1 0, i1 0, i1 0, i1 0)
19*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %tex
20*9880d681SAndroid Build Coastguard Worker}
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: {{^}}image_load_i32:
23*9880d681SAndroid Build Coastguard Worker;CHECK: image_load v[0:3], v0, s[0:7] dmask:0xf unorm
24*9880d681SAndroid Build Coastguard Worker;CHECK: s_waitcnt vmcnt(0)
25*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps <4 x float> @image_load_i32(<8 x i32> inreg %rsrc, i32 %c) {
26*9880d681SAndroid Build Coastguard Workermain_body:
27*9880d681SAndroid Build Coastguard Worker  %tex = call <4 x float> @llvm.amdgcn.image.load.i32(i32 %c, <8 x i32> %rsrc, i32 15, i1 0, i1 0, i1 0, i1 0)
28*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %tex
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: {{^}}image_load_mip:
32*9880d681SAndroid Build Coastguard Worker;CHECK: image_load_mip v[0:3], v[0:3], s[0:7] dmask:0xf unorm
33*9880d681SAndroid Build Coastguard Worker;CHECK: s_waitcnt vmcnt(0)
34*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps <4 x float> @image_load_mip(<8 x i32> inreg %rsrc, <4 x i32> %c) {
35*9880d681SAndroid Build Coastguard Workermain_body:
36*9880d681SAndroid Build Coastguard Worker  %tex = call <4 x float> @llvm.amdgcn.image.load.mip.v4i32(<4 x i32> %c, <8 x i32> %rsrc, i32 15, i1 0, i1 0, i1 0, i1 0)
37*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %tex
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: {{^}}image_load_1:
41*9880d681SAndroid Build Coastguard Worker;CHECK: image_load v0, v[0:3], s[0:7] dmask:0x1 unorm
42*9880d681SAndroid Build Coastguard Worker;CHECK: s_waitcnt vmcnt(0)
43*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps float @image_load_1(<8 x i32> inreg %rsrc, <4 x i32> %c) {
44*9880d681SAndroid Build Coastguard Workermain_body:
45*9880d681SAndroid Build Coastguard Worker  %tex = call <4 x float> @llvm.amdgcn.image.load.v4i32(<4 x i32> %c, <8 x i32> %rsrc, i32 15, i1 0, i1 0, i1 0, i1 0)
46*9880d681SAndroid Build Coastguard Worker  %elt = extractelement <4 x float> %tex, i32 0
47*9880d681SAndroid Build Coastguard Worker; Only first component used, test that dmask etc. is changed accordingly
48*9880d681SAndroid Build Coastguard Worker  ret float %elt
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: {{^}}image_store_v4i32:
52*9880d681SAndroid Build Coastguard Worker;CHECK: image_store v[0:3], v[4:7], s[0:7] dmask:0xf unorm
53*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @image_store_v4i32(<8 x i32> inreg %rsrc, <4 x float> %data, <4 x i32> %coords) {
54*9880d681SAndroid Build Coastguard Workermain_body:
55*9880d681SAndroid Build Coastguard Worker  call void @llvm.amdgcn.image.store.v4i32(<4 x float> %data, <4 x i32> %coords, <8 x i32> %rsrc, i32 15, i1 0, i1 0, i1 0, i1 0)
56*9880d681SAndroid Build Coastguard Worker  ret void
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: {{^}}image_store_v2i32:
60*9880d681SAndroid Build Coastguard Worker;CHECK: image_store v[0:3], v[4:5], s[0:7] dmask:0xf unorm
61*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @image_store_v2i32(<8 x i32> inreg %rsrc, <4 x float> %data, <2 x i32> %coords) {
62*9880d681SAndroid Build Coastguard Workermain_body:
63*9880d681SAndroid Build Coastguard Worker  call void @llvm.amdgcn.image.store.v2i32(<4 x float> %data, <2 x i32> %coords, <8 x i32> %rsrc, i32 15, i1 0, i1 0, i1 0, i1 0)
64*9880d681SAndroid Build Coastguard Worker  ret void
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: {{^}}image_store_i32:
68*9880d681SAndroid Build Coastguard Worker;CHECK: image_store v[0:3], v4, s[0:7] dmask:0xf unorm
69*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @image_store_i32(<8 x i32> inreg %rsrc, <4 x float> %data, i32 %coords) {
70*9880d681SAndroid Build Coastguard Workermain_body:
71*9880d681SAndroid Build Coastguard Worker  call void @llvm.amdgcn.image.store.i32(<4 x float> %data, i32 %coords, <8 x i32> %rsrc, i32 15, i1 0, i1 0, i1 0, i1 0)
72*9880d681SAndroid Build Coastguard Worker  ret void
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: {{^}}image_store_mip:
76*9880d681SAndroid Build Coastguard Worker;CHECK: image_store_mip v[0:3], v[4:7], s[0:7] dmask:0xf unorm
77*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @image_store_mip(<8 x i32> inreg %rsrc, <4 x float> %data, <4 x i32> %coords) {
78*9880d681SAndroid Build Coastguard Workermain_body:
79*9880d681SAndroid Build Coastguard Worker  call void @llvm.amdgcn.image.store.mip.v4i32(<4 x float> %data, <4 x i32> %coords, <8 x i32> %rsrc, i32 15, i1 0, i1 0, i1 0, i1 0)
80*9880d681SAndroid Build Coastguard Worker  ret void
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker; Ideally, the register allocator would avoid the wait here
84*9880d681SAndroid Build Coastguard Worker;
85*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: {{^}}image_store_wait:
86*9880d681SAndroid Build Coastguard Worker;CHECK: image_store v[0:3], v4, s[0:7] dmask:0xf unorm
87*9880d681SAndroid Build Coastguard Worker;CHECK: s_waitcnt vmcnt(0) expcnt(0)
88*9880d681SAndroid Build Coastguard Worker;CHECK: image_load v[0:3], v4, s[8:15] dmask:0xf unorm
89*9880d681SAndroid Build Coastguard Worker;CHECK: s_waitcnt vmcnt(0)
90*9880d681SAndroid Build Coastguard Worker;CHECK: image_store v[0:3], v4, s[16:23] dmask:0xf unorm
91*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @image_store_wait(<8 x i32> inreg, <8 x i32> inreg, <8 x i32> inreg, <4 x float>, i32) {
92*9880d681SAndroid Build Coastguard Workermain_body:
93*9880d681SAndroid Build Coastguard Worker  call void @llvm.amdgcn.image.store.i32(<4 x float> %3, i32 %4, <8 x i32> %0, i32 15, i1 0, i1 0, i1 0, i1 0)
94*9880d681SAndroid Build Coastguard Worker  %data = call <4 x float> @llvm.amdgcn.image.load.i32(i32 %4, <8 x i32> %1, i32 15, i1 0, i1 0, i1 0, i1 0)
95*9880d681SAndroid Build Coastguard Worker  call void @llvm.amdgcn.image.store.i32(<4 x float> %data, i32 %4, <8 x i32> %2, i32 15, i1 0, i1 0, i1 0, i1 0)
96*9880d681SAndroid Build Coastguard Worker  ret void
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.amdgcn.image.store.i32(<4 x float>, i32, <8 x i32>, i32, i1, i1, i1, i1) #0
100*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.amdgcn.image.store.v2i32(<4 x float>, <2 x i32>, <8 x i32>, i32, i1, i1, i1, i1) #0
101*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.amdgcn.image.store.v4i32(<4 x float>, <4 x i32>, <8 x i32>, i32, i1, i1, i1, i1) #0
102*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.amdgcn.image.store.mip.v4i32(<4 x float>, <4 x i32>, <8 x i32>, i32, i1, i1, i1, i1) #0
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.amdgcn.image.load.i32(i32, <8 x i32>, i32, i1, i1, i1, i1) #1
105*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.amdgcn.image.load.v2i32(<2 x i32>, <8 x i32>, i32, i1, i1, i1, i1) #1
106*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.amdgcn.image.load.v4i32(<4 x i32>, <8 x i32>, i32, i1, i1, i1, i1) #1
107*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.amdgcn.image.load.mip.v4i32(<4 x i32>, <8 x i32>, i32, i1, i1, i1, i1) #1
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind }
110*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind readonly }
111