1#!amber
2# Test OpSDiv instruction
3
4SHADER compute test SPIRV-ASM
5                         OpCapability Shader
6
7                         OpMemoryModel Logical GLSL450
8                         OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationId
9                         OpExecutionMode %main LocalSize 1 1 1
10
11                         OpDecorate %gl_GlobalInvocationId BuiltIn GlobalInvocationId
12                         OpDecorate %ra_uint ArrayStride 4
13                         OpDecorate %struct_uint3 BufferBlock
14                         OpMemberDecorate %struct_uint3 0 Offset 0
15                         OpDecorate %input0 DescriptorSet 0
16                         OpDecorate %input0 Binding 0
17                         OpDecorate %input1 DescriptorSet 0
18                         OpDecorate %input1 Binding 1
19                         OpDecorate %output DescriptorSet 0
20                         OpDecorate %output Binding 2
21
22                 %uint = OpTypeInt 32 0
23             %ptr_uint = OpTypePointer Uniform %uint
24       %ptr_input_uint = OpTypePointer Input %uint
25                %uint3 = OpTypeVector %uint 3
26      %ptr_input_uint3 = OpTypePointer Input %uint3
27                 %void = OpTypeVoid
28               %voidFn = OpTypeFunction %void
29
30               %uint_0 = OpConstant %uint 0
31               %uint_1 = OpConstant %uint 1
32              %ra_uint = OpTypeRuntimeArray %uint
33         %struct_uint3 = OpTypeStruct %ra_uint
34     %ptr_struct_uint3 = OpTypePointer Uniform %struct_uint3
35
36%gl_GlobalInvocationId = OpVariable %ptr_input_uint3 Input
37               %input0 = OpVariable %ptr_struct_uint3 Uniform
38               %input1 = OpVariable %ptr_struct_uint3 Uniform
39
40               %output = OpVariable %ptr_struct_uint3 Uniform
41                 %main = OpFunction %void None %voidFn
42            %mainStart = OpLabel
43            %index_ptr = OpAccessChain %ptr_input_uint %gl_GlobalInvocationId %uint_0
44                %index = OpLoad %uint %index_ptr
45              %in_ptr0 = OpAccessChain %ptr_uint %input0 %uint_0 %index
46             %invalue0 = OpLoad %uint %in_ptr0
47              %in_ptr1 = OpAccessChain %ptr_uint %input1 %uint_0 %index
48             %invalue1 = OpLoad %uint %in_ptr1
49
50             %outvalue = OpSDiv %uint %invalue0 %invalue1
51              %out_ptr = OpAccessChain %ptr_uint %output %uint_0 %index
52                         OpStore %out_ptr %outvalue
53
54                         OpReturn
55                         OpFunctionEnd
56END
57BUFFER data0 DATA_TYPE int32 DATA
58 0 -2  3  4 -5
59END
60
61BUFFER data1 DATA_TYPE int32 DATA
62 1 -1 -1  1  1
63END
64
65BUFFER data2 DATA_TYPE int32 DATA
66 8  8  8  8  8
67END
68
69BUFFER expected0 DATA_TYPE int32 DATA
70 0  2 -3  4 -5
71END
72
73PIPELINE compute compute_pipeline
74	ATTACH test
75	BIND BUFFER data0 AS storage DESCRIPTOR_SET 0 BINDING 0
76	BIND BUFFER data1 AS storage DESCRIPTOR_SET 0 BINDING 1
77	BIND BUFFER data2 AS storage DESCRIPTOR_SET 0 BINDING 2
78END
79
80RUN compute_pipeline 5 1 1
81
82EXPECT data2 EQ_BUFFER expected0
83