xref: /llvm-project/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.raw.ptr.tbuffer.store.ll (revision 3277c7cd28154e33637a168acb26cea7ac1f7fff)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2;RUN: llc < %s -mtriple=amdgcn -mcpu=verde -verify-machineinstrs | FileCheck -check-prefixes=PREGFX10 %s
3;RUN: llc < %s -mtriple=amdgcn -mcpu=tonga -verify-machineinstrs | FileCheck -check-prefixes=PREGFX10 %s
4;RUN: llc < %s -mtriple=amdgcn -mcpu=gfx1010 -verify-machineinstrs | FileCheck -check-prefixes=GFX10 %s
5;RUN: llc < %s -mtriple=amdgcn -mcpu=gfx1100 -verify-machineinstrs | FileCheck -check-prefixes=GFX11 %s
6
7define amdgpu_ps void @tbuffer_store(ptr addrspace(8) inreg, <4 x float>, <4 x float>, <4 x float>) {
8; PREGFX10-LABEL: tbuffer_store:
9; PREGFX10:       ; %bb.0: ; %main_body
10; PREGFX10-NEXT:    tbuffer_store_format_xyzw v[0:3], off, s[0:3], 0 format:[BUF_DATA_FORMAT_16_16_16_16,BUF_NUM_FORMAT_USCALED]
11; PREGFX10-NEXT:    tbuffer_store_format_xyzw v[4:7], off, s[0:3], 0 format:[BUF_DATA_FORMAT_32_32_32,BUF_NUM_FORMAT_SSCALED] glc
12; PREGFX10-NEXT:    tbuffer_store_format_xyzw v[8:11], off, s[0:3], 0 format:[BUF_DATA_FORMAT_32_32_32_32,BUF_NUM_FORMAT_UINT] slc
13; PREGFX10-NEXT:    tbuffer_store_format_xyzw v[8:11], off, s[0:3], 0 format:[BUF_DATA_FORMAT_32_32_32_32,BUF_NUM_FORMAT_UINT] glc
14; PREGFX10-NEXT:    s_endpgm
15;
16; GFX10-LABEL: tbuffer_store:
17; GFX10:       ; %bb.0: ; %main_body
18; GFX10-NEXT:    tbuffer_store_format_xyzw v[0:3], off, s[0:3], 0 format:[BUF_FMT_10_10_10_2_UNORM]
19; GFX10-NEXT:    tbuffer_store_format_xyzw v[4:7], off, s[0:3], 0 format:[BUF_FMT_8_8_8_8_SINT] glc
20; GFX10-NEXT:    tbuffer_store_format_xyzw v[8:11], off, s[0:3], 0 format:78 slc
21; GFX10-NEXT:    tbuffer_store_format_xyzw v[8:11], off, s[0:3], 0 format:78 glc dlc
22; GFX10-NEXT:    s_endpgm
23;
24; GFX11-LABEL: tbuffer_store:
25; GFX11:       ; %bb.0: ; %main_body
26; GFX11-NEXT:    s_clause 0x3
27; GFX11-NEXT:    tbuffer_store_format_xyzw v[0:3], off, s[0:3], 0 format:[BUF_FMT_8_8_8_8_USCALED]
28; GFX11-NEXT:    tbuffer_store_format_xyzw v[4:7], off, s[0:3], 0 format:[BUF_FMT_32_32_32_32_UINT] glc
29; GFX11-NEXT:    tbuffer_store_format_xyzw v[8:11], off, s[0:3], 0 format:78 slc
30; GFX11-NEXT:    tbuffer_store_format_xyzw v[8:11], off, s[0:3], 0 format:78 glc dlc
31; GFX11-NEXT:    s_endpgm
32main_body:
33  %in1 = bitcast <4 x float> %1 to <4 x i32>
34  %in2 = bitcast <4 x float> %2 to <4 x i32>
35  %in3 = bitcast <4 x float> %3 to <4 x i32>
36  call void @llvm.amdgcn.raw.ptr.tbuffer.store.v4i32(<4 x i32> %in1, ptr addrspace(8) %0, i32 0, i32 0, i32 44, i32 0)
37  call void @llvm.amdgcn.raw.ptr.tbuffer.store.v4i32(<4 x i32> %in2, ptr addrspace(8) %0, i32 0, i32 0, i32 61, i32 1)
38  call void @llvm.amdgcn.raw.ptr.tbuffer.store.v4i32(<4 x i32> %in3, ptr addrspace(8) %0, i32 0, i32 0, i32 78, i32 2)
39  call void @llvm.amdgcn.raw.ptr.tbuffer.store.v4f32(<4 x float> %3, ptr addrspace(8) %0, i32 0, i32 0, i32 78, i32 5)
40  ret void
41}
42
43define amdgpu_ps void @tbuffer_store_immoffs(ptr addrspace(8) inreg, <4 x float>) {
44; PREGFX10-LABEL: tbuffer_store_immoffs:
45; PREGFX10:       ; %bb.0: ; %main_body
46; PREGFX10-NEXT:    tbuffer_store_format_xyzw v[0:3], off, s[0:3], 0 format:[BUF_DATA_FORMAT_16_16,BUF_NUM_FORMAT_FLOAT] offset:42
47; PREGFX10-NEXT:    s_endpgm
48;
49; GFX10-LABEL: tbuffer_store_immoffs:
50; GFX10:       ; %bb.0: ; %main_body
51; GFX10-NEXT:    tbuffer_store_format_xyzw v[0:3], off, s[0:3], 0 format:117 offset:42
52; GFX10-NEXT:    s_endpgm
53;
54; GFX11-LABEL: tbuffer_store_immoffs:
55; GFX11:       ; %bb.0: ; %main_body
56; GFX11-NEXT:    tbuffer_store_format_xyzw v[0:3], off, s[0:3], 0 format:117 offset:42
57; GFX11-NEXT:    s_endpgm
58main_body:
59  %in1 = bitcast <4 x float> %1 to <4 x i32>
60  call void @llvm.amdgcn.raw.ptr.tbuffer.store.v4i32(<4 x i32> %in1, ptr addrspace(8) %0, i32 42, i32 0, i32 117, i32 0)
61  ret void
62}
63
64define amdgpu_ps void @tbuffer_store_scalar_and_imm_offs(ptr addrspace(8) inreg, <4 x float> %vdata, i32 inreg %soffset) {
65; PREGFX10-LABEL: tbuffer_store_scalar_and_imm_offs:
66; PREGFX10:       ; %bb.0: ; %main_body
67; PREGFX10-NEXT:    tbuffer_store_format_xyzw v[0:3], off, s[0:3], s4 format:[BUF_DATA_FORMAT_16_16,BUF_NUM_FORMAT_FLOAT] offset:42
68; PREGFX10-NEXT:    s_endpgm
69;
70; GFX10-LABEL: tbuffer_store_scalar_and_imm_offs:
71; GFX10:       ; %bb.0: ; %main_body
72; GFX10-NEXT:    tbuffer_store_format_xyzw v[0:3], off, s[0:3], s4 format:117 offset:42
73; GFX10-NEXT:    s_endpgm
74;
75; GFX11-LABEL: tbuffer_store_scalar_and_imm_offs:
76; GFX11:       ; %bb.0: ; %main_body
77; GFX11-NEXT:    tbuffer_store_format_xyzw v[0:3], off, s[0:3], s4 format:117 offset:42
78; GFX11-NEXT:    s_endpgm
79main_body:
80  %in1 = bitcast <4 x float> %vdata to <4 x i32>
81  call void @llvm.amdgcn.raw.ptr.tbuffer.store.v4i32(<4 x i32> %in1, ptr addrspace(8) %0, i32 42, i32 %soffset, i32 117, i32 0)
82  ret void
83}
84
85define amdgpu_ps void @buffer_store_ofs(ptr addrspace(8) inreg, <4 x float> %vdata, i32 %voffset) {
86; PREGFX10-LABEL: buffer_store_ofs:
87; PREGFX10:       ; %bb.0: ; %main_body
88; PREGFX10-NEXT:    tbuffer_store_format_xyzw v[0:3], v4, s[0:3], 0 format:[BUF_DATA_FORMAT_8_8,BUF_NUM_FORMAT_FLOAT] offen
89; PREGFX10-NEXT:    s_endpgm
90;
91; GFX10-LABEL: buffer_store_ofs:
92; GFX10:       ; %bb.0: ; %main_body
93; GFX10-NEXT:    tbuffer_store_format_xyzw v[0:3], v4, s[0:3], 0 format:115 offen
94; GFX10-NEXT:    s_endpgm
95;
96; GFX11-LABEL: buffer_store_ofs:
97; GFX11:       ; %bb.0: ; %main_body
98; GFX11-NEXT:    tbuffer_store_format_xyzw v[0:3], v4, s[0:3], 0 format:115 offen
99; GFX11-NEXT:    s_endpgm
100main_body:
101  %in1 = bitcast <4 x float> %vdata to <4 x i32>
102  call void @llvm.amdgcn.raw.ptr.tbuffer.store.v4i32(<4 x i32> %in1, ptr addrspace(8) %0, i32 %voffset, i32 0, i32 115, i32 0)
103  ret void
104}
105
106define amdgpu_ps void @buffer_store_x1(ptr addrspace(8) inreg %rsrc, float %data) {
107; PREGFX10-LABEL: buffer_store_x1:
108; PREGFX10:       ; %bb.0: ; %main_body
109; PREGFX10-NEXT:    tbuffer_store_format_x v0, off, s[0:3], 0 format:[BUF_DATA_FORMAT_32_32_32,BUF_NUM_FORMAT_FLOAT]
110; PREGFX10-NEXT:    s_endpgm
111;
112; GFX10-LABEL: buffer_store_x1:
113; GFX10:       ; %bb.0: ; %main_body
114; GFX10-NEXT:    tbuffer_store_format_x v0, off, s[0:3], 0 format:125
115; GFX10-NEXT:    s_endpgm
116;
117; GFX11-LABEL: buffer_store_x1:
118; GFX11:       ; %bb.0: ; %main_body
119; GFX11-NEXT:    tbuffer_store_format_x v0, off, s[0:3], 0 format:125
120; GFX11-NEXT:    s_endpgm
121main_body:
122  %data.i = bitcast float %data to i32
123  call void @llvm.amdgcn.raw.ptr.tbuffer.store.i32(i32 %data.i, ptr addrspace(8) %rsrc, i32 0, i32 0, i32 125, i32 0)
124  ret void
125}
126
127define amdgpu_ps void @buffer_store_x2(ptr addrspace(8) inreg %rsrc, <2 x float> %data) {
128; PREGFX10-LABEL: buffer_store_x2:
129; PREGFX10:       ; %bb.0: ; %main_body
130; PREGFX10-NEXT:    tbuffer_store_format_xy v[0:1], off, s[0:3], 0 format:[BUF_NUM_FORMAT_USCALED]
131; PREGFX10-NEXT:    s_endpgm
132;
133; GFX10-LABEL: buffer_store_x2:
134; GFX10:       ; %bb.0: ; %main_body
135; GFX10-NEXT:    tbuffer_store_format_xy v[0:1], off, s[0:3], 0 format:[BUF_FMT_10_11_11_SSCALED]
136; GFX10-NEXT:    s_endpgm
137;
138; GFX11-LABEL: buffer_store_x2:
139; GFX11:       ; %bb.0: ; %main_body
140; GFX11-NEXT:    tbuffer_store_format_xy v[0:1], off, s[0:3], 0 format:[BUF_FMT_10_10_10_2_SNORM]
141; GFX11-NEXT:    s_endpgm
142main_body:
143  %data.i = bitcast <2 x float> %data to <2 x i32>
144  call void @llvm.amdgcn.raw.ptr.tbuffer.store.v2i32(<2 x i32> %data.i, ptr addrspace(8) %rsrc, i32 0, i32 0, i32 33, i32 0)
145  ret void
146}
147
148define amdgpu_ps void @buffer_store_voffset_large_12bit(ptr addrspace(8) inreg %rsrc, <4 x float> %data) {
149; PREGFX10-LABEL: buffer_store_voffset_large_12bit:
150; PREGFX10:       ; %bb.0: ; %main_body
151; PREGFX10-NEXT:    tbuffer_store_format_xyzw v[0:3], off, s[0:3], 0 format:[BUF_DATA_FORMAT_RESERVED_15,BUF_NUM_FORMAT_SSCALED] offset:4092
152; PREGFX10-NEXT:    s_endpgm
153;
154; GFX10-LABEL: buffer_store_voffset_large_12bit:
155; GFX10:       ; %bb.0: ; %main_body
156; GFX10-NEXT:    tbuffer_store_format_xyzw v[0:3], off, s[0:3], 0 format:[BUF_FMT_32_32_SINT] offset:4092
157; GFX10-NEXT:    s_endpgm
158;
159; GFX11-LABEL: buffer_store_voffset_large_12bit:
160; GFX11:       ; %bb.0: ; %main_body
161; GFX11-NEXT:    tbuffer_store_format_xyzw v[0:3], off, s[0:3], 0 format:[BUF_FMT_32_32_32_32_FLOAT] offset:4092
162; GFX11-NEXT:    s_endpgm
163main_body:
164  call void @llvm.amdgcn.raw.ptr.tbuffer.store.v4f32(<4 x float> %data, ptr addrspace(8) %rsrc, i32 4092, i32 0, i32 63, i32 0)
165  ret void
166}
167
168define amdgpu_ps void @buffer_store_voffset_large_13bit(ptr addrspace(8) inreg %rsrc, <4 x float> %data) {
169; PREGFX10-LABEL: buffer_store_voffset_large_13bit:
170; PREGFX10:       ; %bb.0: ; %main_body
171; PREGFX10-NEXT:    v_mov_b32_e32 v4, 0x1000
172; PREGFX10-NEXT:    tbuffer_store_format_xyzw v[0:3], v4, s[0:3], 0 format:[BUF_DATA_FORMAT_RESERVED_15,BUF_NUM_FORMAT_SSCALED] offen offset:4092
173; PREGFX10-NEXT:    s_endpgm
174;
175; GFX10-LABEL: buffer_store_voffset_large_13bit:
176; GFX10:       ; %bb.0: ; %main_body
177; GFX10-NEXT:    v_mov_b32_e32 v4, 0x1000
178; GFX10-NEXT:    tbuffer_store_format_xyzw v[0:3], v4, s[0:3], 0 format:[BUF_FMT_32_32_SINT] offen offset:4092
179; GFX10-NEXT:    s_endpgm
180;
181; GFX11-LABEL: buffer_store_voffset_large_13bit:
182; GFX11:       ; %bb.0: ; %main_body
183; GFX11-NEXT:    v_mov_b32_e32 v4, 0x1000
184; GFX11-NEXT:    tbuffer_store_format_xyzw v[0:3], v4, s[0:3], 0 format:[BUF_FMT_32_32_32_32_FLOAT] offen offset:4092
185; GFX11-NEXT:    s_endpgm
186main_body:
187  call void @llvm.amdgcn.raw.ptr.tbuffer.store.v4f32(<4 x float> %data, ptr addrspace(8) %rsrc, i32 8188, i32 0, i32 63, i32 0)
188  ret void
189}
190
191define amdgpu_ps void @buffer_store_voffset_large_16bit(ptr addrspace(8) inreg %rsrc, <4 x float> %data) {
192; PREGFX10-LABEL: buffer_store_voffset_large_16bit:
193; PREGFX10:       ; %bb.0: ; %main_body
194; PREGFX10-NEXT:    v_mov_b32_e32 v4, 0xf000
195; PREGFX10-NEXT:    tbuffer_store_format_xyzw v[0:3], v4, s[0:3], 0 format:[BUF_DATA_FORMAT_RESERVED_15,BUF_NUM_FORMAT_SSCALED] offen offset:4092
196; PREGFX10-NEXT:    s_endpgm
197;
198; GFX10-LABEL: buffer_store_voffset_large_16bit:
199; GFX10:       ; %bb.0: ; %main_body
200; GFX10-NEXT:    v_mov_b32_e32 v4, 0xf000
201; GFX10-NEXT:    tbuffer_store_format_xyzw v[0:3], v4, s[0:3], 0 format:[BUF_FMT_32_32_SINT] offen offset:4092
202; GFX10-NEXT:    s_endpgm
203;
204; GFX11-LABEL: buffer_store_voffset_large_16bit:
205; GFX11:       ; %bb.0: ; %main_body
206; GFX11-NEXT:    v_mov_b32_e32 v4, 0xf000
207; GFX11-NEXT:    tbuffer_store_format_xyzw v[0:3], v4, s[0:3], 0 format:[BUF_FMT_32_32_32_32_FLOAT] offen offset:4092
208; GFX11-NEXT:    s_endpgm
209main_body:
210  call void @llvm.amdgcn.raw.ptr.tbuffer.store.v4f32(<4 x float> %data, ptr addrspace(8) %rsrc, i32 65532, i32 0, i32 63, i32 0)
211  ret void
212}
213
214define amdgpu_ps void @buffer_store_voffset_large_23bit(ptr addrspace(8) inreg %rsrc, <4 x float> %data) {
215; PREGFX10-LABEL: buffer_store_voffset_large_23bit:
216; PREGFX10:       ; %bb.0: ; %main_body
217; PREGFX10-NEXT:    v_mov_b32_e32 v4, 0x7ff000
218; PREGFX10-NEXT:    tbuffer_store_format_xyzw v[0:3], v4, s[0:3], 0 format:[BUF_DATA_FORMAT_RESERVED_15,BUF_NUM_FORMAT_SSCALED] offen offset:4092
219; PREGFX10-NEXT:    s_endpgm
220;
221; GFX10-LABEL: buffer_store_voffset_large_23bit:
222; GFX10:       ; %bb.0: ; %main_body
223; GFX10-NEXT:    v_mov_b32_e32 v4, 0x7ff000
224; GFX10-NEXT:    tbuffer_store_format_xyzw v[0:3], v4, s[0:3], 0 format:[BUF_FMT_32_32_SINT] offen offset:4092
225; GFX10-NEXT:    s_endpgm
226;
227; GFX11-LABEL: buffer_store_voffset_large_23bit:
228; GFX11:       ; %bb.0: ; %main_body
229; GFX11-NEXT:    v_mov_b32_e32 v4, 0x7ff000
230; GFX11-NEXT:    tbuffer_store_format_xyzw v[0:3], v4, s[0:3], 0 format:[BUF_FMT_32_32_32_32_FLOAT] offen offset:4092
231; GFX11-NEXT:    s_endpgm
232main_body:
233  call void @llvm.amdgcn.raw.ptr.tbuffer.store.v4f32(<4 x float> %data, ptr addrspace(8) %rsrc, i32 8388604, i32 0, i32 63, i32 0)
234  ret void
235}
236
237define amdgpu_ps void @buffer_store_voffset_large_24bit(ptr addrspace(8) inreg %rsrc, <4 x float> %data) {
238; PREGFX10-LABEL: buffer_store_voffset_large_24bit:
239; PREGFX10:       ; %bb.0: ; %main_body
240; PREGFX10-NEXT:    v_mov_b32_e32 v4, 0xfff000
241; PREGFX10-NEXT:    tbuffer_store_format_xyzw v[0:3], v4, s[0:3], 0 format:[BUF_DATA_FORMAT_RESERVED_15,BUF_NUM_FORMAT_SSCALED] offen offset:4092
242; PREGFX10-NEXT:    s_endpgm
243;
244; GFX10-LABEL: buffer_store_voffset_large_24bit:
245; GFX10:       ; %bb.0: ; %main_body
246; GFX10-NEXT:    v_mov_b32_e32 v4, 0xfff000
247; GFX10-NEXT:    tbuffer_store_format_xyzw v[0:3], v4, s[0:3], 0 format:[BUF_FMT_32_32_SINT] offen offset:4092
248; GFX10-NEXT:    s_endpgm
249;
250; GFX11-LABEL: buffer_store_voffset_large_24bit:
251; GFX11:       ; %bb.0: ; %main_body
252; GFX11-NEXT:    v_mov_b32_e32 v4, 0xfff000
253; GFX11-NEXT:    tbuffer_store_format_xyzw v[0:3], v4, s[0:3], 0 format:[BUF_FMT_32_32_32_32_FLOAT] offen offset:4092
254; GFX11-NEXT:    s_endpgm
255main_body:
256  call void @llvm.amdgcn.raw.ptr.tbuffer.store.v4f32(<4 x float> %data, ptr addrspace(8) %rsrc, i32 16777212, i32 0, i32 63, i32 0)
257  ret void
258}
259
260declare void @llvm.amdgcn.raw.ptr.tbuffer.store.i32(i32, ptr addrspace(8), i32, i32, i32, i32) #0
261declare void @llvm.amdgcn.raw.ptr.tbuffer.store.v2i32(<2 x i32>, ptr addrspace(8), i32, i32, i32, i32) #0
262declare void @llvm.amdgcn.raw.ptr.tbuffer.store.v4i32(<4 x i32>, ptr addrspace(8), i32, i32, i32, i32) #0
263declare void @llvm.amdgcn.raw.ptr.tbuffer.store.v4f32(<4 x float>, ptr addrspace(8), i32, i32, i32, i32) #0
264attributes #0 = { nounwind }
265attributes #1 = { nounwind readonly }
266