xref: /llvm-project/llvm/test/CodeGen/DirectX/ResourceAccess/store_rawbuffer.ll (revision 2f39d138dc38a1fdf4754e4e26dd0aeb7409b13d)
1; RUN: opt -S -dxil-resource-access %s | FileCheck %s
2
3target triple = "dxil-pc-shadermodel6.6-compute"
4
5; CHECK-LABEL: define void @storef32_struct
6define void @storef32_struct(i32 %index, float %data) {
7  %buffer = call target("dx.RawBuffer", float, 1, 0, 0)
8      @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false)
9
10  ; CHECK-NOT: @llvm.dx.resource.getpointer
11  %ptr = call ptr @llvm.dx.resource.getpointer(
12      target("dx.RawBuffer", float, 1, 0, 0) %buffer, i32 %index)
13
14  ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_f32_1_0_0t.f32(target("dx.RawBuffer", float, 1, 0, 0) %buffer, i32 %index, i32 0, float %data)
15  store float %data, ptr %ptr
16
17  ret void
18}
19
20; CHECK-LABEL: define void @storef32_byte
21define void @storef32_byte(i32 %offset, float %data) {
22  %buffer = call target("dx.RawBuffer", i8, 1, 0, 0)
23      @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false)
24
25  ; CHECK-NOT: @llvm.dx.resource.getpointer
26  %ptr = call ptr @llvm.dx.resource.getpointer(
27      target("dx.RawBuffer", i8, 1, 0, 0) %buffer, i32 %offset)
28
29  ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_i8_1_0_0t.f32(target("dx.RawBuffer", i8, 1, 0, 0) %buffer, i32 %offset, i32 0, float %data)
30  store float %data, ptr %ptr
31
32  ret void
33}
34
35; CHECK-LABEL: define void @storev4f32_struct
36define void @storev4f32_struct(i32 %index, <4 x float> %data) {
37  %buffer = call target("dx.RawBuffer", <4 x float>, 1, 0, 0)
38      @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false)
39
40  ; CHECK-NOT: @llvm.dx.resource.getpointer
41  %ptr = call ptr @llvm.dx.resource.getpointer(
42      target("dx.RawBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index)
43
44  ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_v4f32_1_0_0t.v4f32(target("dx.RawBuffer", <4 x float>, 1, 0, 0) %buffer, i32 %index, i32 0, <4 x float> %data)
45  store <4 x float> %data, ptr %ptr
46
47  ret void
48}
49
50; CHECK-LABEL: define void @storev4f32_byte
51define void @storev4f32_byte(i32 %offset, <4 x float> %data) {
52  %buffer = call target("dx.RawBuffer", i8, 1, 0, 0)
53      @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false)
54
55  ; CHECK-NOT: @llvm.dx.resource.getpointer
56  %ptr = call ptr @llvm.dx.resource.getpointer(
57      target("dx.RawBuffer", i8, 1, 0, 0) %buffer, i32 %offset)
58
59  ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_i8_1_0_0t.v4f32(target("dx.RawBuffer", i8, 1, 0, 0) %buffer, i32 %offset, i32 0, <4 x float> %data)
60  store <4 x float> %data, ptr %ptr
61
62  ret void
63}
64
65; CHECK-LABEL: define void @storeelements
66define void @storeelements(i32 %index, <4 x float> %dataf32, <4 x i32> %datai32) {
67  %buffer = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 1, 0, 0)
68      @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false)
69
70  ; CHECK-NOT: @llvm.dx.resource.getpointer
71  %ptr = call ptr @llvm.dx.resource.getpointer(
72      target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 1, 0, 0) %buffer,
73      i32 %index)
74
75  ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_sl_v4f32v4i32s_1_0_0t.v4f32(target("dx.RawBuffer", { <4 x float>, <4 x i32> }, 1, 0, 0) %buffer, i32 %index, i32 0, <4 x float> %dataf32)
76  store <4 x float> %dataf32, ptr %ptr
77
78  ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_sl_v4f32v4i32s_1_0_0t.v4i32(target("dx.RawBuffer", { <4 x float>, <4 x i32> }, 1, 0, 0) %buffer, i32 %index, i32 16, <4 x i32> %datai32)
79  %addri32 = getelementptr inbounds nuw i8, ptr %ptr, i32 16
80  store <4 x i32> %datai32, ptr %addri32
81
82  ret void
83}
84
85; CHECK-LABEL: define void @storenested
86define void @storenested(i32 %index, i32 %datai32, <4 x float> %dataf32, <3 x half> %dataf16) {
87  %buffer = call
88      target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 1, 0, 0)
89      @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false)
90
91  ; CHECK-NOT: @llvm.dx.resource.getpointer
92  %ptr = call ptr @llvm.dx.resource.getpointer(
93      target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 1, 0, 0) %buffer,
94      i32 %index)
95
96  ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_sl_i32sl_v4f32v3f16ss_1_0_0t.i32(target("dx.RawBuffer", { i32, { <4 x float>, <3 x half> } }, 1, 0, 0) %buffer, i32 %index, i32 0, i32 %datai32)
97  store i32 %datai32, ptr %ptr
98
99  ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_sl_i32sl_v4f32v3f16ss_1_0_0t.v4f32(target("dx.RawBuffer", { i32, { <4 x float>, <3 x half> } }, 1, 0, 0) %buffer, i32 %index, i32 4, <4 x float> %dataf32)
100  %addrf32 = getelementptr inbounds nuw i8, ptr %ptr, i32 4
101  store <4 x float> %dataf32, ptr %addrf32
102
103  ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_sl_i32sl_v4f32v3f16ss_1_0_0t.v3f16(target("dx.RawBuffer", { i32, { <4 x float>, <3 x half> } }, 1, 0, 0) %buffer, i32 %index, i32 20, <3 x half> %dataf16)
104  %addrf16 = getelementptr inbounds nuw i8, ptr %ptr, i32 20
105  store <3 x half> %dataf16, ptr %addrf16
106
107  ret void
108}
109
110; byteaddressbuf.Store<int64_t4>
111; CHECK-LABEL: define void @storev4f64_byte
112define void @storev4f64_byte(i32 %offset, <4 x double> %data) {
113  %buffer = call target("dx.RawBuffer", i8, 1, 0, 0)
114      @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false)
115
116  ; CHECK-NOT: @llvm.dx.resource.getpointer
117  %ptr = call ptr @llvm.dx.resource.getpointer(
118      target("dx.RawBuffer", i8, 1, 0, 0) %buffer, i32 %offset)
119
120  ; CHECK: call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_i8_1_0_0t.v4f64(target("dx.RawBuffer", i8, 1, 0, 0) %buffer, i32 %offset, i32 0, <4 x double> %data)
121  store <4 x double> %data, ptr %ptr
122
123  ret void
124}
125