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 }