lib/choir/src/backends/gpu/spirv/emitter/ops.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 pub const SpirvOp = struct {
2 pub const Extension: u16 = 10;
3 pub const Capability: u16 = 17;
4 pub const ExtInstImport: u16 = 11;
5 pub const ExtInst: u16 = 12;
6 pub const MemoryModel: u16 = 14;
7 pub const EntryPoint: u16 = 15;
8 pub const ExecutionMode: u16 = 16;
9 pub const Decorate: u16 = 71;
10 pub const MemberDecorate: u16 = 72;
11
12 pub const TypeVoid: u16 = 19;
13 pub const TypeBool: u16 = 20;
14 pub const TypeInt: u16 = 21;
15 pub const TypeFloat: u16 = 22;
16 pub const TypeVector: u16 = 23;
17 pub const TypeImage: u16 = 25;
18 pub const TypeSampledImage: u16 = 27;
19 pub const TypeArray: u16 = 28;
20 pub const TypeRuntimeArray: u16 = 29;
21 pub const TypeStruct: u16 = 30;
22 pub const TypePointer: u16 = 32;
23 pub const TypeFunction: u16 = 33;
24
25 pub const ConstantTrue: u16 = 41;
26 pub const ConstantFalse: u16 = 42;
27 pub const Constant: u16 = 43;
28 pub const SpecConstant: u16 = 50;
29 pub const SpecConstantComposite: u16 = 51;
30
31 pub const ConvertFToU: u16 = 109;
32 pub const ConvertFToS: u16 = 110;
33 pub const ConvertSToF: u16 = 111;
34 pub const ConvertUToF: u16 = 112;
35 pub const UConvert: u16 = 113;
36 pub const SConvert: u16 = 114;
37 pub const FConvert: u16 = 115;
38 pub const Bitcast: u16 = 124;
39
40 pub const Function: u16 = 54;
41 pub const FunctionParameter: u16 = 55;
42 pub const FunctionEnd: u16 = 56;
43 pub const FunctionCall: u16 = 57;
44 pub const Variable: u16 = 59;
45 pub const Load: u16 = 61;
46 pub const Store: u16 = 62;
47 pub const AccessChain: u16 = 65;
48 pub const CompositeConstruct: u16 = 80;
49 pub const CompositeExtract: u16 = 81;
50 pub const ImageSampleImplicitLod: u16 = 87;
51 pub const ImageSampleExplicitLod: u16 = 88;
52 pub const DPdxFine: u16 = 210;
53 pub const DPdyFine: u16 = 211;
54 pub const FwidthFine: u16 = 212;
55
56 pub const AtomicExchange: u16 = 229;
57 pub const AtomicCompareExchange: u16 = 230;
58 pub const AtomicIAdd: u16 = 234;
59 pub const AtomicSMin: u16 = 236;
60 pub const AtomicUMin: u16 = 237;
61 pub const AtomicSMax: u16 = 238;
62 pub const AtomicUMax: u16 = 239;
63 pub const AtomicAnd: u16 = 240;
64 pub const AtomicOr: u16 = 241;
65 pub const AtomicXor: u16 = 242;
66
67 pub const LogicalEqual: u16 = 164;
68 pub const LogicalNotEqual: u16 = 165;
69 pub const LogicalOr: u16 = 166;
70 pub const LogicalAnd: u16 = 167;
71 pub const LogicalNot: u16 = 168;
72 pub const Select: u16 = 169;
73 pub const IEqual: u16 = 170;
74 pub const INotEqual: u16 = 171;
75 pub const UGreaterThan: u16 = 172;
76 pub const SGreaterThan: u16 = 173;
77 pub const UGreaterThanEqual: u16 = 174;
78 pub const SGreaterThanEqual: u16 = 175;
79 pub const ULessThan: u16 = 176;
80 pub const SLessThan: u16 = 177;
81 pub const ULessThanEqual: u16 = 178;
82 pub const SLessThanEqual: u16 = 179;
83 pub const FOrdEqual: u16 = 180;
84 pub const FUnordEqual: u16 = 181;
85 pub const FOrdNotEqual: u16 = 182;
86 pub const FUnordNotEqual: u16 = 183;
87 pub const FOrdLessThan: u16 = 184;
88 pub const FUnordLessThan: u16 = 185;
89 pub const FOrdGreaterThan: u16 = 186;
90 pub const FUnordGreaterThan: u16 = 187;
91 pub const FOrdLessThanEqual: u16 = 188;
92 pub const FUnordLessThanEqual: u16 = 189;
93 pub const FOrdGreaterThanEqual: u16 = 190;
94 pub const FUnordGreaterThanEqual: u16 = 191;
95
96 pub const SNegate: u16 = 126;
97 pub const FNegate: u16 = 127;
98 pub const IAdd: u16 = 128;
99 pub const FAdd: u16 = 129;
100 pub const ISub: u16 = 130;
101 pub const FSub: u16 = 131;
102 pub const IMul: u16 = 132;
103 pub const FMul: u16 = 133;
104 pub const UDiv: u16 = 134;
105 pub const SDiv: u16 = 135;
106 pub const FDiv: u16 = 136;
107 pub const UMulExtended: u16 = 151;
108
109 pub const ShiftRightLogical: u16 = 194;
110 pub const ShiftRightArithmetic: u16 = 195;
111 pub const ShiftLeftLogical: u16 = 196;
112 pub const BitwiseOr: u16 = 197;
113 pub const BitwiseXor: u16 = 198;
114 pub const BitwiseAnd: u16 = 199;
115 pub const Not: u16 = 200;
116
117 pub const ControlBarrier: u16 = 224;
118
119 pub const Phi: u16 = 245;
120 pub const LoopMerge: u16 = 246;
121 pub const SelectionMerge: u16 = 247;
122 pub const Label: u16 = 248;
123 pub const Branch: u16 = 249;
124 pub const BranchConditional: u16 = 250;
125 pub const Return: u16 = 253;
126 pub const ReturnValue: u16 = 254;
127
128 pub const GroupNonUniformAny: u16 = 337;
129 pub const GroupNonUniformAll: u16 = 338;
130 pub const GroupNonUniformBallot: u16 = 340;
131 pub const GroupNonUniformShuffle: u16 = 347;
132 pub const GroupNonUniformShuffleXor: u16 = 348;
133 pub const GroupNonUniformShuffleUp: u16 = 349;
134 pub const GroupNonUniformShuffleDown: u16 = 350;
135 pub const GroupNonUniformSMin: u16 = 354;
136 pub const GroupNonUniformUMin: u16 = 355;
137 pub const GroupNonUniformFMax: u16 = 356;
138 pub const GroupNonUniformFMin: u16 = 357;
139 pub const GroupNonUniformSMax: u16 = 358;
140 pub const GroupNonUniformUMax: u16 = 359;
141 pub const GroupNonUniformIAdd: u16 = 360;
142 pub const GroupNonUniformFAdd: u16 = 361;
143 pub const GroupNonUniformBitwiseAnd: u16 = 364;
144 pub const GroupNonUniformBitwiseOr: u16 = 365;
145 pub const GroupNonUniformBitwiseXor: u16 = 366;
146 pub const GroupNonUniformLogicalAnd: u16 = 367;
147 pub const GroupNonUniformLogicalOr: u16 = 368;
148 pub const GroupNonUniformLogicalXor: u16 = 369;
149 };
150
151 test "spirv op table preserves core opcode values" {
152 const testing = @import("std").testing;
153
154 try testing.expectEqual(@as(u16, 10), SpirvOp.Extension);
155 try testing.expectEqual(@as(u16, 17), SpirvOp.Capability);
156 try testing.expectEqual(@as(u16, 15), SpirvOp.EntryPoint);
157 try testing.expectEqual(@as(u16, 54), SpirvOp.Function);
158 try testing.expectEqual(@as(u16, 248), SpirvOp.Label);
159 }
160
161 test "spirv op table preserves atomic opcode block" {
162 const testing = @import("std").testing;
163
164 try testing.expectEqual(@as(u16, 229), SpirvOp.AtomicExchange);
165 try testing.expectEqual(@as(u16, 230), SpirvOp.AtomicCompareExchange);
166 try testing.expectEqual(@as(u16, 234), SpirvOp.AtomicIAdd);
167 try testing.expectEqual(@as(u16, 236), SpirvOp.AtomicSMin);
168 try testing.expectEqual(@as(u16, 237), SpirvOp.AtomicUMin);
169 try testing.expectEqual(@as(u16, 238), SpirvOp.AtomicSMax);
170 try testing.expectEqual(@as(u16, 239), SpirvOp.AtomicUMax);
171 try testing.expectEqual(@as(u16, 240), SpirvOp.AtomicAnd);
172 try testing.expectEqual(@as(u16, 241), SpirvOp.AtomicOr);
173 try testing.expectEqual(@as(u16, 242), SpirvOp.AtomicXor);
174 }
175
176 test "spirv op table preserves logical and comparison opcode block" {
177 const testing = @import("std").testing;
178
179 try testing.expectEqual(@as(u16, 164), SpirvOp.LogicalEqual);
180 try testing.expectEqual(@as(u16, 165), SpirvOp.LogicalNotEqual);
181 try testing.expectEqual(@as(u16, 166), SpirvOp.LogicalOr);
182 try testing.expectEqual(@as(u16, 167), SpirvOp.LogicalAnd);
183 try testing.expectEqual(@as(u16, 168), SpirvOp.LogicalNot);
184 try testing.expectEqual(@as(u16, 169), SpirvOp.Select);
185 try testing.expectEqual(@as(u16, 170), SpirvOp.IEqual);
186 try testing.expectEqual(@as(u16, 171), SpirvOp.INotEqual);
187 try testing.expectEqual(@as(u16, 172), SpirvOp.UGreaterThan);
188 try testing.expectEqual(@as(u16, 173), SpirvOp.SGreaterThan);
189 try testing.expectEqual(@as(u16, 174), SpirvOp.UGreaterThanEqual);
190 try testing.expectEqual(@as(u16, 175), SpirvOp.SGreaterThanEqual);
191 try testing.expectEqual(@as(u16, 176), SpirvOp.ULessThan);
192 try testing.expectEqual(@as(u16, 177), SpirvOp.SLessThan);
193 try testing.expectEqual(@as(u16, 178), SpirvOp.ULessThanEqual);
194 try testing.expectEqual(@as(u16, 179), SpirvOp.SLessThanEqual);
195 try testing.expectEqual(@as(u16, 180), SpirvOp.FOrdEqual);
196 try testing.expectEqual(@as(u16, 181), SpirvOp.FUnordEqual);
197 try testing.expectEqual(@as(u16, 182), SpirvOp.FOrdNotEqual);
198 try testing.expectEqual(@as(u16, 183), SpirvOp.FUnordNotEqual);
199 try testing.expectEqual(@as(u16, 184), SpirvOp.FOrdLessThan);
200 try testing.expectEqual(@as(u16, 185), SpirvOp.FUnordLessThan);
201 try testing.expectEqual(@as(u16, 186), SpirvOp.FOrdGreaterThan);
202 try testing.expectEqual(@as(u16, 187), SpirvOp.FUnordGreaterThan);
203 try testing.expectEqual(@as(u16, 188), SpirvOp.FOrdLessThanEqual);
204 try testing.expectEqual(@as(u16, 189), SpirvOp.FUnordLessThanEqual);
205 try testing.expectEqual(@as(u16, 190), SpirvOp.FOrdGreaterThanEqual);
206 try testing.expectEqual(@as(u16, 191), SpirvOp.FUnordGreaterThanEqual);
207 }