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