xref: /llvm-project/llvm/test/CodeGen/DirectX/BufferStore.ll (revision 011b618644113996e2c0a8e57db40f89d20878e3)
190e84113SJustin Bogner; RUN: opt -S -dxil-op-lower %s | FileCheck %s
290e84113SJustin Bogner
390e84113SJustin Bognertarget triple = "dxil-pc-shadermodel6.6-compute"
490e84113SJustin Bogner
590e84113SJustin Bognerdefine void @storefloat(<4 x float> %data, i32 %index) {
690e84113SJustin Bogner
719ad7dd8SHelena Kotas  ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217,
819ad7dd8SHelena Kotas  ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]]
990e84113SJustin Bogner  %buffer = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0)
10aa07f922SJustin Bogner      @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0(
1190e84113SJustin Bogner          i32 0, i32 0, i32 1, i32 0, i1 false)
1290e84113SJustin Bogner
1390e84113SJustin Bogner  ; The temporary casts should all have been cleaned up
14aa07f922SJustin Bogner  ; CHECK-NOT: %dx.resource.casthandle
1590e84113SJustin Bogner
1690e84113SJustin Bogner  ; CHECK: [[DATA0_0:%.*]] = extractelement <4 x float> %data, i32 0
1790e84113SJustin Bogner  ; CHECK: [[DATA0_1:%.*]] = extractelement <4 x float> %data, i32 1
1890e84113SJustin Bogner  ; CHECK: [[DATA0_2:%.*]] = extractelement <4 x float> %data, i32 2
1990e84113SJustin Bogner  ; CHECK: [[DATA0_3:%.*]] = extractelement <4 x float> %data, i32 3
20*011b6186SFinn Plummer  ; CHECK: call void @dx.op.bufferStore.f32(i32 69, %dx.types.Handle [[HANDLE]], i32 %index, i32 undef, float [[DATA0_0]], float [[DATA0_1]], float [[DATA0_2]], float [[DATA0_3]], i8 15){{$}}
21aa07f922SJustin Bogner  call void @llvm.dx.resource.store.typedbuffer(
2290e84113SJustin Bogner      target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer,
2390e84113SJustin Bogner      i32 %index, <4 x float> %data)
2490e84113SJustin Bogner
2590e84113SJustin Bogner  ret void
2690e84113SJustin Bogner}
2790e84113SJustin Bogner
2890e84113SJustin Bognerdefine void @storeint(<4 x i32> %data, i32 %index) {
2990e84113SJustin Bogner
3019ad7dd8SHelena Kotas  ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217,
3119ad7dd8SHelena Kotas  ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]]
3290e84113SJustin Bogner  %buffer = call target("dx.TypedBuffer", <4 x i32>, 1, 0, 0)
33aa07f922SJustin Bogner      @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4i32_1_0_0(
3490e84113SJustin Bogner          i32 0, i32 0, i32 1, i32 0, i1 false)
3590e84113SJustin Bogner
3690e84113SJustin Bogner  ; CHECK: [[DATA0_0:%.*]] = extractelement <4 x i32> %data, i32 0
3790e84113SJustin Bogner  ; CHECK: [[DATA0_1:%.*]] = extractelement <4 x i32> %data, i32 1
3890e84113SJustin Bogner  ; CHECK: [[DATA0_2:%.*]] = extractelement <4 x i32> %data, i32 2
3990e84113SJustin Bogner  ; CHECK: [[DATA0_3:%.*]] = extractelement <4 x i32> %data, i32 3
40*011b6186SFinn Plummer  ; CHECK: call void @dx.op.bufferStore.i32(i32 69, %dx.types.Handle [[HANDLE]], i32 %index, i32 undef, i32 [[DATA0_0]], i32 [[DATA0_1]], i32 [[DATA0_2]], i32 [[DATA0_3]], i8 15){{$}}
41aa07f922SJustin Bogner  call void @llvm.dx.resource.store.typedbuffer(
4290e84113SJustin Bogner      target("dx.TypedBuffer", <4 x i32>, 1, 0, 0) %buffer,
4390e84113SJustin Bogner      i32 %index, <4 x i32> %data)
4490e84113SJustin Bogner
4590e84113SJustin Bogner  ret void
4690e84113SJustin Bogner}
4790e84113SJustin Bogner
4890e84113SJustin Bognerdefine void @storehalf(<4 x half> %data, i32 %index) {
4990e84113SJustin Bogner
5019ad7dd8SHelena Kotas  ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217,
5119ad7dd8SHelena Kotas  ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]]
5290e84113SJustin Bogner  %buffer = call target("dx.TypedBuffer", <4 x half>, 1, 0, 0)
53aa07f922SJustin Bogner      @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f16_1_0_0(
5490e84113SJustin Bogner          i32 0, i32 0, i32 1, i32 0, i1 false)
5590e84113SJustin Bogner
5690e84113SJustin Bogner  ; The temporary casts should all have been cleaned up
57aa07f922SJustin Bogner  ; CHECK-NOT: %dx.resource.casthandle
5890e84113SJustin Bogner
5990e84113SJustin Bogner  ; CHECK: [[DATA0_0:%.*]] = extractelement <4 x half> %data, i32 0
6090e84113SJustin Bogner  ; CHECK: [[DATA0_1:%.*]] = extractelement <4 x half> %data, i32 1
6190e84113SJustin Bogner  ; CHECK: [[DATA0_2:%.*]] = extractelement <4 x half> %data, i32 2
6290e84113SJustin Bogner  ; CHECK: [[DATA0_3:%.*]] = extractelement <4 x half> %data, i32 3
63*011b6186SFinn Plummer  ; CHECK: call void @dx.op.bufferStore.f16(i32 69, %dx.types.Handle [[HANDLE]], i32 %index, i32 undef, half [[DATA0_0]], half [[DATA0_1]], half [[DATA0_2]], half [[DATA0_3]], i8 15){{$}}
64aa07f922SJustin Bogner  call void @llvm.dx.resource.store.typedbuffer(
6590e84113SJustin Bogner      target("dx.TypedBuffer", <4 x half>, 1, 0, 0) %buffer,
6690e84113SJustin Bogner      i32 %index, <4 x half> %data)
6790e84113SJustin Bogner
6890e84113SJustin Bogner  ret void
6990e84113SJustin Bogner}
7090e84113SJustin Bogner
7190e84113SJustin Bognerdefine void @storei16(<4 x i16> %data, i32 %index) {
7290e84113SJustin Bogner
7319ad7dd8SHelena Kotas  ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217,
7419ad7dd8SHelena Kotas  ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]]
7590e84113SJustin Bogner  %buffer = call target("dx.TypedBuffer", <4 x i16>, 1, 0, 0)
76aa07f922SJustin Bogner      @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4i16_1_0_0(
7790e84113SJustin Bogner          i32 0, i32 0, i32 1, i32 0, i1 false)
7890e84113SJustin Bogner
7990e84113SJustin Bogner  ; The temporary casts should all have been cleaned up
80aa07f922SJustin Bogner  ; CHECK-NOT: %dx.resource.casthandle
8190e84113SJustin Bogner
8290e84113SJustin Bogner  ; CHECK: [[DATA0_0:%.*]] = extractelement <4 x i16> %data, i32 0
8390e84113SJustin Bogner  ; CHECK: [[DATA0_1:%.*]] = extractelement <4 x i16> %data, i32 1
8490e84113SJustin Bogner  ; CHECK: [[DATA0_2:%.*]] = extractelement <4 x i16> %data, i32 2
8590e84113SJustin Bogner  ; CHECK: [[DATA0_3:%.*]] = extractelement <4 x i16> %data, i32 3
86*011b6186SFinn Plummer  ; CHECK: call void @dx.op.bufferStore.i16(i32 69, %dx.types.Handle [[HANDLE]], i32 %index, i32 undef, i16 [[DATA0_0]], i16 [[DATA0_1]], i16 [[DATA0_2]], i16 [[DATA0_3]], i8 15){{$}}
87aa07f922SJustin Bogner  call void @llvm.dx.resource.store.typedbuffer(
8890e84113SJustin Bogner      target("dx.TypedBuffer", <4 x i16>, 1, 0, 0) %buffer,
8990e84113SJustin Bogner      i32 %index, <4 x i16> %data)
9090e84113SJustin Bogner
9190e84113SJustin Bogner  ret void
9290e84113SJustin Bogner}
932c88ac9dSJustin Bogner
942c88ac9dSJustin Bognerdefine void @store_scalarized_floats(float %data0, float %data1, float %data2, float %data3, i32 %index) {
952c88ac9dSJustin Bogner
962c88ac9dSJustin Bogner  ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217,
972c88ac9dSJustin Bogner  ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]]
982c88ac9dSJustin Bogner  %buffer = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0)
99aa07f922SJustin Bogner      @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0(
1002c88ac9dSJustin Bogner          i32 0, i32 0, i32 1, i32 0, i1 false)
1012c88ac9dSJustin Bogner
1022c88ac9dSJustin Bogner  ; We shouldn't end up with any inserts/extracts.
1032c88ac9dSJustin Bogner  ; CHECK-NOT: insertelement
1042c88ac9dSJustin Bogner  ; CHECK-NOT: extractelement
1052c88ac9dSJustin Bogner
1062c88ac9dSJustin Bogner  ; CHECK: call void @dx.op.bufferStore.f32(i32 69, %dx.types.Handle [[HANDLE]], i32 %index, i32 undef, float %data0, float %data1, float %data2, float %data3, i8 15)
1072c88ac9dSJustin Bogner  %vec.upto0 = insertelement <4 x float> poison, float %data0, i64 0
1082c88ac9dSJustin Bogner  %vec.upto1 = insertelement <4 x float> %vec.upto0, float %data1, i64 1
1092c88ac9dSJustin Bogner  %vec.upto2 = insertelement <4 x float> %vec.upto1, float %data2, i64 2
1102c88ac9dSJustin Bogner  %vec = insertelement <4 x float> %vec.upto2, float %data3, i64 3
111aa07f922SJustin Bogner  call void @llvm.dx.resource.store.typedbuffer(
1122c88ac9dSJustin Bogner      target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer,
1132c88ac9dSJustin Bogner      i32 %index, <4 x float> %vec)
1142c88ac9dSJustin Bogner
1152c88ac9dSJustin Bogner  ret void
1162c88ac9dSJustin Bogner}
117