authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2023-10-16 02:04:09+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2023-10-16 02:04:09+02:00
logfd6b3db34252f2a548630c0e57fe80f32202aa12
tree0111caae6ee7e5c69a98702199609b163ed27405
parenta1e0b9979ab2a47ad1d13dd06106c3143d9a1c9e
parent8c153221b9e1ff34edd18382770d02aae36dbe74
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #17293 from Snektron/spirv-aaaa

spirv: more instructions

96 files changed, 1136 insertions(+), 764 deletions(-)

.github/CODEOWNERS+4-1
......@@ -1,4 +1,4 @@
1# Autodoc
1# Autodoc
22/src/Autodoc.zig @kristoff-it
33/src/autodoc/* @kristoff-it
44/lib/docs/* @kristoff-it
......@@ -11,3 +11,6 @@
1111
1212# resinator
1313/src/resinator/* @squeek502
14
15# SPIR-V selfhosted backend
16/src/codegen/spirv* @Snektron
lib/std/testing.zig+12-4
......@@ -21,11 +21,15 @@ pub var base_allocator_instance = std.heap.FixedBufferAllocator.init("");
2121/// TODO https://github.com/ziglang/zig/issues/5738
2222pub var log_level = std.log.Level.warn;
2323
24fn print(comptime fmt: []const u8, args: anytype) void {
25 // Disable printing in tests for simple backends.
26 if (builtin.zig_backend == .stage2_spirv64) return;
24// Disable printing in tests for simple backends.
25pub const backend_can_print = builtin.zig_backend != .stage2_spirv64;
2726
28 std.debug.print(fmt, args);
27fn print(comptime fmt: []const u8, args: anytype) void {
28 if (@inComptime()) {
29 @compileError(std.fmt.comptimePrint(fmt, args));
30 } else if (backend_can_print) {
31 std.debug.print(fmt, args);
32 }
2933}
3034
3135/// This function is intended to be used only in tests. It prints diagnostics to stderr
......@@ -300,6 +304,10 @@ pub fn expectEqualSlices(comptime T: type, expected: []const T, actual: []const
300304 break :diff_index if (expected.len == actual.len) return else shortest;
301305 };
302306
307 if (!backend_can_print) {
308 return error.TestExpectedEqual;
309 }
310
303311 print("slices differ. first difference occurs at index {d} (0x{X})\n", .{ diff_index, diff_index });
304312
305313 // TODO: Should this be configurable by the caller?
src/InternPool.zig+10-5
......@@ -1556,10 +1556,10 @@ pub const Key = union(enum) {
15561556 // These are strange: we'll sometimes represent them as f128, even if the
15571557 // underlying type is smaller. f80 is an exception: see float_c_longdouble_f80.
15581558 const a_val = switch (a_info.storage) {
1559 inline else => |val| @as(f128, @floatCast(val)),
1559 inline else => |val| @as(u128, @bitCast(@as(f128, @floatCast(val)))),
15601560 };
15611561 const b_val = switch (b_info.storage) {
1562 inline else => |val| @as(f128, @floatCast(val)),
1562 inline else => |val| @as(u128, @bitCast(@as(f128, @floatCast(val)))),
15631563 };
15641564 return a_val == b_val;
15651565 }
......@@ -1567,9 +1567,14 @@ pub const Key = union(enum) {
15671567 const StorageTag = @typeInfo(Key.Float.Storage).Union.tag_type.?;
15681568 assert(@as(StorageTag, a_info.storage) == @as(StorageTag, b_info.storage));
15691569
1570 return switch (a_info.storage) {
1571 inline else => |val, tag| val == @field(b_info.storage, @tagName(tag)),
1572 };
1570 switch (a_info.storage) {
1571 inline else => |val, tag| {
1572 const Bits = std.meta.Int(.unsigned, @bitSizeOf(@TypeOf(val)));
1573 const a_bits: Bits = @bitCast(val);
1574 const b_bits: Bits = @bitCast(@field(b_info.storage, @tagName(tag)));
1575 return a_bits == b_bits;
1576 },
1577 }
15731578 },
15741579
15751580 .opaque_type => |a_info| {
src/arch/wasm/CodeGen.zig+21-7
......@@ -6253,8 +6253,10 @@ fn airMulWithOverflow(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
62536253 func.finishAir(inst, result_ptr, &.{ extra.lhs, extra.rhs });
62546254}
62556255
6256fn airMaxMin(func: *CodeGen, inst: Air.Inst.Index, op: enum { max, min }) InnerError!void {
6256fn airMaxMin(func: *CodeGen, inst: Air.Inst.Index, op: Op) InnerError!void {
6257 assert(op == .max or op == .min);
62576258 const mod = func.bin_file.base.options.module.?;
6259 const target = mod.getTarget();
62586260 const bin_op = func.air.instructions.items(.data)[inst].bin_op;
62596261
62606262 const ty = func.typeOfIndex(inst);
......@@ -6269,13 +6271,25 @@ fn airMaxMin(func: *CodeGen, inst: Air.Inst.Index, op: enum { max, min }) InnerE
62696271 const lhs = try func.resolveInst(bin_op.lhs);
62706272 const rhs = try func.resolveInst(bin_op.rhs);
62716273
6272 // operands to select from
6273 try func.lowerToStack(lhs);
6274 try func.lowerToStack(rhs);
6275 _ = try func.cmp(lhs, rhs, ty, if (op == .max) .gt else .lt);
6274 if (ty.zigTypeTag(mod) == .Float) {
6275 var fn_name_buf: [64]u8 = undefined;
6276 const float_bits = ty.floatBits(target);
6277 const fn_name = std.fmt.bufPrint(&fn_name_buf, "{s}f{s}{s}", .{
6278 target_util.libcFloatPrefix(float_bits),
6279 @tagName(op),
6280 target_util.libcFloatSuffix(float_bits),
6281 }) catch unreachable;
6282 const result = try func.callIntrinsic(fn_name, &.{ ty.ip_index, ty.ip_index }, ty, &.{ lhs, rhs });
6283 try func.lowerToStack(result);
6284 } else {
6285 // operands to select from
6286 try func.lowerToStack(lhs);
6287 try func.lowerToStack(rhs);
6288 _ = try func.cmp(lhs, rhs, ty, if (op == .max) .gt else .lt);
62766289
6277 // based on the result from comparison, return operand 0 or 1.
6278 try func.addTag(.select);
6290 // based on the result from comparison, return operand 0 or 1.
6291 try func.addTag(.select);
6292 }
62796293
62806294 // store result in local
62816295 const result_ty = if (isByRef(ty, mod)) Type.u32 else ty;
src/codegen/llvm.zig+1
......@@ -3050,6 +3050,7 @@ pub const Object = struct {
30503050 decl_val: InternPool.Index,
30513051 llvm_addr_space: Builder.AddrSpace,
30523052 ) Error!Builder.Variable.Index {
3053 // TODO: Add address space to the anon_decl_map
30533054 const gop = try o.anon_decl_map.getOrPut(o.gpa, decl_val);
30543055 if (gop.found_existing) return gop.value_ptr.ptr(&o.builder).kind.variable;
30553056 errdefer assert(o.anon_decl_map.remove(decl_val));
src/codegen/spirv.zig+953-310
......@@ -52,18 +52,136 @@ const Block = struct {
5252
5353const BlockMap = std.AutoHashMapUnmanaged(Air.Inst.Index, *Block);
5454
55/// Maps Zig decl indices to linking SPIR-V linking information.
56pub const DeclLinkMap = std.AutoHashMap(Module.Decl.Index, SpvModule.Decl.Index);
55/// This structure holds information that is relevant to the entire compilation,
56/// in contrast to `DeclGen`, which only holds relevant information about a
57/// single decl.
58pub const Object = struct {
59 /// A general-purpose allocator that can be used for any allocation for this Object.
60 gpa: Allocator,
61
62 /// the SPIR-V module that represents the final binary.
63 spv: SpvModule,
64
65 /// The Zig module that this object file is generated for.
66 /// A map of Zig decl indices to SPIR-V decl indices.
67 decl_link: std.AutoHashMapUnmanaged(Decl.Index, SpvModule.Decl.Index) = .{},
68
69 /// A map of Zig InternPool indices for anonymous decls to SPIR-V decl indices.
70 anon_decl_link: std.AutoHashMapUnmanaged(struct { InternPool.Index, StorageClass }, SpvModule.Decl.Index) = .{},
71
72 /// A map that maps AIR intern pool indices to SPIR-V cache references (which
73 /// is basically the same thing except for SPIR-V).
74 /// This map is typically only used for structures that are deemed heavy enough
75 /// that it is worth to store them here. The SPIR-V module also interns types,
76 /// and so the main purpose of this map is to avoid recomputation and to
77 /// cache extra information about the type rather than to aid in validity
78 /// of the SPIR-V module.
79 type_map: TypeMap = .{},
80
81 pub fn init(gpa: Allocator) Object {
82 return .{
83 .gpa = gpa,
84 .spv = SpvModule.init(gpa),
85 };
86 }
87
88 pub fn deinit(self: *Object) void {
89 self.spv.deinit();
90 self.decl_link.deinit(self.gpa);
91 self.anon_decl_link.deinit(self.gpa);
92 self.type_map.deinit(self.gpa);
93 }
94
95 fn genDecl(
96 self: *Object,
97 mod: *Module,
98 decl_index: Decl.Index,
99 air: Air,
100 liveness: Liveness,
101 ) !void {
102 var decl_gen = DeclGen{
103 .gpa = self.gpa,
104 .object = self,
105 .module = mod,
106 .spv = &self.spv,
107 .decl_index = decl_index,
108 .air = air,
109 .liveness = liveness,
110 .type_map = &self.type_map,
111 .current_block_label_id = undefined,
112 };
113 defer decl_gen.deinit();
114
115 decl_gen.genDecl() catch |err| switch (err) {
116 error.CodegenFail => {
117 try mod.failed_decls.put(mod.gpa, decl_index, decl_gen.error_msg.?);
118 },
119 else => |other| {
120 // There might be an error that happened *after* self.error_msg
121 // was already allocated, so be sure to free it.
122 if (decl_gen.error_msg) |error_msg| {
123 error_msg.deinit(mod.gpa);
124 }
125
126 return other;
127 },
128 };
129 }
130
131 pub fn updateFunc(
132 self: *Object,
133 mod: *Module,
134 func_index: InternPool.Index,
135 air: Air,
136 liveness: Liveness,
137 ) !void {
138 const decl_index = mod.funcInfo(func_index).owner_decl;
139 // TODO: Separate types for generating decls and functions?
140 try self.genDecl(mod, decl_index, air, liveness);
141 }
142
143 pub fn updateDecl(
144 self: *Object,
145 mod: *Module,
146 decl_index: Decl.Index,
147 ) !void {
148 try self.genDecl(mod, decl_index, undefined, undefined);
149 }
150
151 /// Fetch or allocate a result id for decl index. This function also marks the decl as alive.
152 /// Note: Function does not actually generate the decl, it just allocates an index.
153 pub fn resolveDecl(self: *Object, mod: *Module, decl_index: Decl.Index) !SpvModule.Decl.Index {
154 const decl = mod.declPtr(decl_index);
155 try mod.markDeclAlive(decl);
156
157 const entry = try self.decl_link.getOrPut(self.gpa, decl_index);
158 if (!entry.found_existing) {
159 // TODO: Extern fn?
160 const kind: SpvModule.DeclKind = if (decl.val.isFuncBody(mod))
161 .func
162 else
163 .global;
164
165 entry.value_ptr.* = try self.spv.allocDecl(kind);
166 }
167
168 return entry.value_ptr.*;
169 }
170};
57171
58172/// This structure is used to compile a declaration, and contains all relevant meta-information to deal with that.
59pub const DeclGen = struct {
173const DeclGen = struct {
60174 /// A general-purpose allocator that can be used for any allocations for this DeclGen.
61175 gpa: Allocator,
62176
177 /// The object that this decl is generated into.
178 object: *Object,
179
63180 /// The Zig module that we are generating decls for.
64181 module: *Module,
65182
66183 /// The SPIR-V module that instructions should be emitted into.
184 /// This is the same as `self.object.spv`, repeated here for brevity.
67185 spv: *SpvModule,
68186
69187 /// The decl we are currently generating code for.
......@@ -77,27 +195,19 @@ pub const DeclGen = struct {
77195 /// Note: If the declaration is not a function, this value will be undefined!
78196 liveness: Liveness,
79197
80 /// Maps Zig Decl indices to SPIR-V globals.
81 decl_link: *DeclLinkMap,
82
83198 /// An array of function argument result-ids. Each index corresponds with the
84199 /// function argument of the same index.
85200 args: std.ArrayListUnmanaged(IdRef) = .{},
86201
87202 /// A counter to keep track of how many `arg` instructions we've seen yet.
88 next_arg_index: u32,
203 next_arg_index: u32 = 0,
89204
90205 /// A map keeping track of which instruction generated which result-id.
91206 inst_results: InstMap = .{},
92207
93 /// A map that maps AIR intern pool indices to SPIR-V cache references (which
94 /// is basically the same thing except for SPIR-V).
95 /// This map is typically only used for structures that are deemed heavy enough
96 /// that it is worth to store them here. The SPIR-V module also interns types,
97 /// and so the main purpose of this map is to avoid recomputation and to
98 /// cache extra information about the type rather than to aid in validity
99 /// of the SPIR-V module.
100 type_map: TypeMap = .{},
208 /// A map that maps AIR intern pool indices to SPIR-V cache references.
209 /// See Object.type_map
210 type_map: *TypeMap,
101211
102212 /// We need to keep track of result ids for block labels, as well as the 'incoming'
103213 /// blocks for a block.
......@@ -115,7 +225,7 @@ pub const DeclGen = struct {
115225
116226 /// If `gen` returned `Error.CodegenFail`, this contains an explanatory message.
117227 /// Memory is owned by `module.gpa`.
118 error_msg: ?*Module.ErrorMsg,
228 error_msg: ?*Module.ErrorMsg = null,
119229
120230 /// Possible errors the `genDecl` function may return.
121231 const Error = error{ CodegenFail, OutOfMemory };
......@@ -154,6 +264,12 @@ pub const DeclGen = struct {
154264 /// This is the actual number of bits of the type, not the size of the backing integer.
155265 bits: u16,
156266
267 /// The number of bits required to store the type.
268 /// For `integer` and `float`, this is equal to `bits`.
269 /// For `strange_integer` and `bool` this is the size of the backing integer.
270 /// For `composite_integer` this is 0 (TODO)
271 backing_bits: u16,
272
157273 /// Whether the type is a vector.
158274 is_vector: bool,
159275
......@@ -175,65 +291,10 @@ pub const DeclGen = struct {
175291 indirect,
176292 };
177293
178 /// Initialize the common resources of a DeclGen. Some fields are left uninitialized,
179 /// only set when `gen` is called.
180 pub fn init(
181 allocator: Allocator,
182 module: *Module,
183 spv: *SpvModule,
184 decl_link: *DeclLinkMap,
185 ) DeclGen {
186 return .{
187 .gpa = allocator,
188 .module = module,
189 .spv = spv,
190 .decl_index = undefined,
191 .air = undefined,
192 .liveness = undefined,
193 .decl_link = decl_link,
194 .next_arg_index = undefined,
195 .current_block_label_id = undefined,
196 .error_msg = undefined,
197 };
198 }
199
200 /// Generate the code for `decl`. If a reportable error occurred during code generation,
201 /// a message is returned by this function. Callee owns the memory. If this function
202 /// returns such a reportable error, it is valid to be called again for a different decl.
203 pub fn gen(self: *DeclGen, decl_index: Decl.Index, air: Air, liveness: Liveness) !?*Module.ErrorMsg {
204 // Reset internal resources, we don't want to re-allocate these.
205 self.decl_index = decl_index;
206 self.air = air;
207 self.liveness = liveness;
208 self.args.items.len = 0;
209 self.next_arg_index = 0;
210 self.inst_results.clearRetainingCapacity();
211 self.blocks.clearRetainingCapacity();
212 self.current_block_label_id = undefined;
213 self.func.reset();
214 self.base_line_stack.items.len = 0;
215 self.error_msg = null;
216
217 self.genDecl() catch |err| switch (err) {
218 error.CodegenFail => return self.error_msg,
219 else => |others| {
220 // There might be an error that happened *after* self.error_msg
221 // was already allocated, so be sure to free it.
222 if (self.error_msg) |error_msg| {
223 error_msg.deinit(self.module.gpa);
224 }
225 return others;
226 },
227 };
228
229 return null;
230 }
231
232294 /// Free resources owned by the DeclGen.
233295 pub fn deinit(self: *DeclGen) void {
234296 self.args.deinit(self.gpa);
235297 self.inst_results.deinit(self.gpa);
236 self.type_map.deinit(self.gpa);
237298 self.blocks.deinit(self.gpa);
238299 self.func.deinit(self.gpa);
239300 self.base_line_stack.deinit(self.gpa);
......@@ -269,7 +330,7 @@ pub const DeclGen = struct {
269330 .func => |func| func.owner_decl,
270331 else => unreachable,
271332 };
272 const spv_decl_index = try self.resolveDecl(fn_decl_index);
333 const spv_decl_index = try self.object.resolveDecl(mod, fn_decl_index);
273334 try self.func.decl_deps.put(self.spv.gpa, spv_decl_index, {});
274335 return self.spv.declPtr(spv_decl_index).result_id;
275336 }
......@@ -280,25 +341,87 @@ pub const DeclGen = struct {
280341 return self.inst_results.get(index).?; // Assertion means instruction does not dominate usage.
281342 }
282343
283 /// Fetch or allocate a result id for decl index. This function also marks the decl as alive.
284 /// Note: Function does not actually generate the decl.
285 fn resolveDecl(self: *DeclGen, decl_index: Module.Decl.Index) !SpvModule.Decl.Index {
344 fn resolveAnonDecl(self: *DeclGen, val: InternPool.Index, storage_class: StorageClass) !IdRef {
345 // TODO: This cannot be a function at this point, but it should probably be handled anyway.
346 const spv_decl_index = blk: {
347 const entry = try self.object.anon_decl_link.getOrPut(self.object.gpa, .{ val, storage_class });
348 if (entry.found_existing) {
349 try self.func.decl_deps.put(self.spv.gpa, entry.value_ptr.*, {});
350 return self.spv.declPtr(entry.value_ptr.*).result_id;
351 }
352
353 const spv_decl_index = try self.spv.allocDecl(.global);
354 try self.func.decl_deps.put(self.spv.gpa, spv_decl_index, {});
355 entry.value_ptr.* = spv_decl_index;
356 break :blk spv_decl_index;
357 };
358
286359 const mod = self.module;
287 const decl = mod.declPtr(decl_index);
288 try mod.markDeclAlive(decl);
360 const ty = mod.intern_pool.typeOf(val).toType();
361 const ty_ref = try self.resolveType(ty, .indirect);
362 const ptr_ty_ref = try self.spv.ptrType(ty_ref, storage_class);
289363
290 const entry = try self.decl_link.getOrPut(decl_index);
291 if (!entry.found_existing) {
292 // TODO: Extern fn?
293 const kind: SpvModule.DeclKind = if (decl.val.isFuncBody(mod))
294 .func
295 else
296 .global;
364 const var_id = self.spv.declPtr(spv_decl_index).result_id;
297365
298 entry.value_ptr.* = try self.spv.allocDecl(kind);
299 }
366 const section = &self.spv.sections.types_globals_constants;
367 try section.emit(self.spv.gpa, .OpVariable, .{
368 .id_result_type = self.typeId(ptr_ty_ref),
369 .id_result = var_id,
370 .storage_class = storage_class,
371 });
300372
301 return entry.value_ptr.*;
373 // TODO: At some point we will be able to generate this all constant here, but then all of
374 // constant() will need to be implemented such that it doesn't generate any at-runtime code.
375 // NOTE: Because this is a global, we really only want to initialize it once. Therefore the
376 // constant lowering of this value will need to be deferred to some other function, which
377 // is then added to the list of initializers using endGlobal().
378
379 // Save the current state so that we can temporarily generate into a different function.
380 // TODO: This should probably be made a little more robust.
381 const func = self.func;
382 defer self.func = func;
383 const block_label_id = self.current_block_label_id;
384 defer self.current_block_label_id = block_label_id;
385
386 self.func = .{};
387
388 // TODO: Merge this with genDecl?
389 const begin = self.spv.beginGlobal();
390
391 const void_ty_ref = try self.resolveType(Type.void, .direct);
392 const initializer_proto_ty_ref = try self.spv.resolve(.{ .function_type = .{
393 .return_type = void_ty_ref,
394 .parameters = &.{},
395 } });
396
397 const initializer_id = self.spv.allocId();
398 try self.func.prologue.emit(self.spv.gpa, .OpFunction, .{
399 .id_result_type = self.typeId(void_ty_ref),
400 .id_result = initializer_id,
401 .function_control = .{},
402 .function_type = self.typeId(initializer_proto_ty_ref),
403 });
404 const root_block_id = self.spv.allocId();
405 try self.func.prologue.emit(self.spv.gpa, .OpLabel, .{
406 .id_result = root_block_id,
407 });
408 self.current_block_label_id = root_block_id;
409
410 const val_id = try self.constant(ty, val.toValue(), .indirect);
411 try self.func.body.emit(self.spv.gpa, .OpStore, .{
412 .pointer = var_id,
413 .object = val_id,
414 });
415
416 self.spv.endGlobal(spv_decl_index, begin, var_id, initializer_id);
417 try self.func.body.emit(self.spv.gpa, .OpReturn, {});
418 try self.func.body.emit(self.spv.gpa, .OpFunctionEnd, {});
419 try self.spv.addFunction(spv_decl_index, self.func);
420
421 try self.spv.debugNameFmt(var_id, "__anon_{d}", .{@intFromEnum(val)});
422 try self.spv.debugNameFmt(initializer_id, "initializer of __anon_{d}", .{@intFromEnum(val)});
423
424 return var_id;
302425 }
303426
304427 /// Start a new SPIR-V block, Emits the label of the new block, and stores which
......@@ -376,12 +499,14 @@ pub const DeclGen = struct {
376499 return switch (ty.zigTypeTag(mod)) {
377500 .Bool => ArithmeticTypeInfo{
378501 .bits = 1, // Doesn't matter for this class.
502 .backing_bits = self.backingIntBits(1).?,
379503 .is_vector = false,
380504 .signedness = .unsigned, // Technically, but doesn't matter for this class.
381505 .class = .bool,
382506 },
383507 .Float => ArithmeticTypeInfo{
384508 .bits = ty.floatBits(target),
509 .backing_bits = ty.floatBits(target), // TODO: F80?
385510 .is_vector = false,
386511 .signedness = .signed, // Technically, but doesn't matter for this class.
387512 .class = .float,
......@@ -392,6 +517,7 @@ pub const DeclGen = struct {
392517 const maybe_backing_bits = self.backingIntBits(int_info.bits);
393518 break :blk ArithmeticTypeInfo{
394519 .bits = int_info.bits,
520 .backing_bits = maybe_backing_bits orelse 0,
395521 .is_vector = false,
396522 .signedness = int_info.signedness,
397523 .class = if (maybe_backing_bits) |backing_bits|
......@@ -403,8 +529,19 @@ pub const DeclGen = struct {
403529 .composite_integer,
404530 };
405531 },
532 .Enum => return self.arithmeticTypeInfo(ty.intTagType(mod)),
406533 // As of yet, there is no vector support in the self-hosted compiler.
407 .Vector => self.todo("implement arithmeticTypeInfo for Vector", .{}),
534 .Vector => blk: {
535 const child_type = ty.childType(mod);
536 const child_ty_info = try self.arithmeticTypeInfo(child_type);
537 break :blk ArithmeticTypeInfo{
538 .bits = child_ty_info.bits,
539 .backing_bits = child_ty_info.backing_bits,
540 .is_vector = true,
541 .signedness = child_ty_info.signedness,
542 .class = child_ty_info.class,
543 };
544 },
408545 // TODO: For which types is this the case?
409546 // else => self.todo("implement arithmeticTypeInfo for {}", .{ty.fmt(self.module)}),
410547 else => unreachable,
......@@ -482,7 +619,7 @@ pub const DeclGen = struct {
482619 return result_id;
483620 }
484621
485 /// Construct a struct at runtime.
622 /// Construct an array at runtime.
486623 /// result_ty_ref must be an array type.
487624 /// Constituents should be in `indirect` representation (as the elements of an array should be).
488625 /// Result is in `direct` representation.
......@@ -521,59 +658,6 @@ pub const DeclGen = struct {
521658 return result_id;
522659 }
523660
524 fn constructDeclRef(self: *DeclGen, ty: Type, decl_index: Decl.Index) !IdRef {
525 const mod = self.module;
526 const ty_ref = try self.resolveType(ty, .direct);
527 const ty_id = self.typeId(ty_ref);
528 const decl = mod.declPtr(decl_index);
529 const spv_decl_index = try self.resolveDecl(decl_index);
530 switch (mod.intern_pool.indexToKey(decl.val.ip_index)) {
531 .func => {
532 // TODO: Properly lower function pointers. For now we are going to hack around it and
533 // just generate an empty pointer. Function pointers are represented by a pointer to usize.
534 // TODO: Add dependency
535 return try self.spv.constNull(ty_ref);
536 },
537 .extern_func => unreachable, // TODO
538 else => {
539 const decl_id = self.spv.declPtr(spv_decl_index).result_id;
540 try self.func.decl_deps.put(self.spv.gpa, spv_decl_index, {});
541
542 const final_storage_class = spvStorageClass(decl.@"addrspace");
543
544 const decl_ty_ref = try self.resolveType(decl.ty, .indirect);
545 const decl_ptr_ty_ref = try self.spv.ptrType(decl_ty_ref, final_storage_class);
546
547 const ptr_id = switch (final_storage_class) {
548 .Generic => blk: {
549 // Pointer should be Generic, but is actually placed in CrossWorkgroup.
550 const result_id = self.spv.allocId();
551 try self.func.body.emit(self.spv.gpa, .OpPtrCastToGeneric, .{
552 .id_result_type = self.typeId(decl_ptr_ty_ref),
553 .id_result = result_id,
554 .pointer = decl_id,
555 });
556 break :blk result_id;
557 },
558 else => decl_id,
559 };
560
561 if (decl_ptr_ty_ref != ty_ref) {
562 // Differing pointer types, insert a cast.
563 const casted_ptr_id = self.spv.allocId();
564 try self.func.body.emit(self.spv.gpa, .OpBitcast, .{
565 .id_result_type = ty_id,
566 .id_result = casted_ptr_id,
567 .operand = ptr_id,
568 });
569 return casted_ptr_id;
570 } else {
571 return ptr_id;
572 }
573 },
574 }
575 }
576
577661 /// This function generates a load for a constant in direct (ie, non-memory) representation.
578662 /// When the constant is simple, it can be generated directly using OpConstant instructions.
579663 /// When the constant is more complicated however, it needs to be constructed using multiple values. This
......@@ -738,7 +822,7 @@ pub const DeclGen = struct {
738822 return try self.constructStruct(result_ty_ref, &.{ payload_id, has_pl_id });
739823 },
740824 .aggregate => |aggregate| switch (ip.indexToKey(ty.ip_index)) {
741 .array_type => |array_type| {
825 inline .array_type, .vector_type => |array_type, tag| {
742826 const elem_ty = array_type.child.toType();
743827 const elem_ty_ref = try self.resolveType(elem_ty, .indirect);
744828
......@@ -765,9 +849,14 @@ pub const DeclGen = struct {
765849 }
766850 },
767851 }
768 if (array_type.sentinel != .none) {
769 constituents[constituents.len - 1] = try self.constant(elem_ty, array_type.sentinel.toValue(), .indirect);
852
853 switch (tag) {
854 inline .array_type => if (array_type.sentinel != .none) {
855 constituents[constituents.len - 1] = try self.constant(elem_ty, array_type.sentinel.toValue(), .indirect);
856 },
857 else => {},
770858 }
859
771860 return try self.constructArray(result_ty_ref, constituents);
772861 },
773862 .struct_type => {
......@@ -796,7 +885,7 @@ pub const DeclGen = struct {
796885
797886 return try self.constructStruct(result_ty_ref, constituents.items);
798887 },
799 .vector_type, .anon_struct_type => unreachable, // TODO
888 .anon_struct_type => unreachable, // TODO
800889 else => unreachable,
801890 },
802891 .un => |un| {
......@@ -817,9 +906,9 @@ pub const DeclGen = struct {
817906 const result_ty_ref = try self.resolveType(ptr_ty, .direct);
818907 const mod = self.module;
819908 switch (mod.intern_pool.indexToKey(ptr_val.toIntern()).ptr.addr) {
820 .decl => |decl| return try self.constructDeclRef(ptr_ty, decl),
821 .anon_decl => @panic("TODO"),
822 .mut_decl => |decl_mut| return try self.constructDeclRef(ptr_ty, decl_mut.decl),
909 .decl => |decl| return try self.constantDeclRef(ptr_ty, decl),
910 .mut_decl => |decl_mut| return try self.constantDeclRef(ptr_ty, decl_mut.decl),
911 .anon_decl => |anon_decl| return try self.constantAnonDeclRef(ptr_ty, anon_decl),
823912 .int => |int| {
824913 const ptr_id = self.spv.allocId();
825914 // TODO: This can probably be an OpSpecConstantOp Bitcast, but
......@@ -836,16 +925,156 @@ pub const DeclGen = struct {
836925 .opt_payload => unreachable, // TODO
837926 .comptime_field => unreachable,
838927 .elem => |elem_ptr| {
839 const elem_ptr_ty = mod.intern_pool.typeOf(elem_ptr.base).toType();
840 const parent_ptr_id = try self.constantPtr(elem_ptr_ty, elem_ptr.base.toValue());
928 const parent_ptr_ty = mod.intern_pool.typeOf(elem_ptr.base).toType();
929 const parent_ptr_id = try self.constantPtr(parent_ptr_ty, elem_ptr.base.toValue());
841930 const size_ty_ref = try self.sizeType();
842931 const index_id = try self.constInt(size_ty_ref, elem_ptr.index);
843 return self.ptrAccessChain(result_ty_ref, parent_ptr_id, index_id, &.{});
932
933 const elem_ptr_id = try self.ptrElemPtr(parent_ptr_ty, parent_ptr_id, index_id);
934
935 // TODO: Can we consolidate this in ptrElemPtr?
936 const elem_ty = parent_ptr_ty.elemType2(mod); // use elemType() so that we get T for *[N]T.
937 const elem_ty_ref = try self.resolveType(elem_ty, .direct);
938 const elem_ptr_ty_ref = try self.spv.ptrType(elem_ty_ref, spvStorageClass(parent_ptr_ty.ptrAddressSpace(mod)));
939
940 if (elem_ptr_ty_ref == result_ty_ref) {
941 return elem_ptr_id;
942 }
943 // This may happen when we have pointer-to-array and the result is
944 // another pointer-to-array instead of a pointer-to-element.
945 const result_id = self.spv.allocId();
946 try self.func.body.emit(self.spv.gpa, .OpBitcast, .{
947 .id_result_type = self.typeId(result_ty_ref),
948 .id_result = result_id,
949 .operand = elem_ptr_id,
950 });
951 return result_id;
844952 },
845953 .field => unreachable, // TODO
846954 }
847955 }
848956
957 fn constantAnonDeclRef(self: *DeclGen, ty: Type, decl_val: InternPool.Index) !IdRef {
958 // TODO: Merge this function with constantDeclRef.
959
960 const mod = self.module;
961 const ip = &mod.intern_pool;
962 const ty_ref = try self.resolveType(ty, .direct);
963 const decl_ty = ip.typeOf(decl_val).toType();
964
965 if (decl_val.toValue().getFunction(mod)) |func| {
966 _ = func;
967 unreachable; // TODO
968 } else if (decl_val.toValue().getExternFunc(mod)) |func| {
969 _ = func;
970 unreachable;
971 }
972
973 // const is_fn_body = decl_ty.zigTypeTag(mod) == .Fn;
974 if (!decl_ty.isFnOrHasRuntimeBitsIgnoreComptime(mod)) {
975 // Pointer to nothing - return undefoined
976 return self.spv.constUndef(ty_ref);
977 }
978
979 if (decl_ty.zigTypeTag(mod) == .Fn) {
980 unreachable; // TODO
981 }
982
983 const final_storage_class = spvStorageClass(ty.ptrAddressSpace(mod));
984 const actual_storage_class = switch (final_storage_class) {
985 .Generic => .CrossWorkgroup,
986 else => |other| other,
987 };
988
989 const decl_id = try self.resolveAnonDecl(decl_val, actual_storage_class);
990 const decl_ty_ref = try self.resolveType(decl_ty, .indirect);
991 const decl_ptr_ty_ref = try self.spv.ptrType(decl_ty_ref, final_storage_class);
992
993 const ptr_id = switch (final_storage_class) {
994 .Generic => blk: {
995 const result_id = self.spv.allocId();
996 try self.func.body.emit(self.spv.gpa, .OpPtrCastToGeneric, .{
997 .id_result_type = self.typeId(decl_ptr_ty_ref),
998 .id_result = result_id,
999 .pointer = decl_id,
1000 });
1001 break :blk result_id;
1002 },
1003 else => decl_id,
1004 };
1005
1006 if (decl_ptr_ty_ref != ty_ref) {
1007 // Differing pointer types, insert a cast.
1008 const casted_ptr_id = self.spv.allocId();
1009 try self.func.body.emit(self.spv.gpa, .OpBitcast, .{
1010 .id_result_type = self.typeId(ty_ref),
1011 .id_result = casted_ptr_id,
1012 .operand = ptr_id,
1013 });
1014 return casted_ptr_id;
1015 } else {
1016 return ptr_id;
1017 }
1018 }
1019
1020 fn constantDeclRef(self: *DeclGen, ty: Type, decl_index: Decl.Index) !IdRef {
1021 const mod = self.module;
1022 const ty_ref = try self.resolveType(ty, .direct);
1023 const ty_id = self.typeId(ty_ref);
1024 const decl = mod.declPtr(decl_index);
1025 switch (mod.intern_pool.indexToKey(decl.val.ip_index)) {
1026 .func => {
1027 // TODO: Properly lower function pointers. For now we are going to hack around it and
1028 // just generate an empty pointer. Function pointers are represented by a pointer to usize.
1029 return try self.spv.constUndef(ty_ref);
1030 },
1031 .extern_func => unreachable, // TODO
1032 else => {},
1033 }
1034
1035 if (!decl.ty.isFnOrHasRuntimeBitsIgnoreComptime(mod)) {
1036 // Pointer to nothing - return undefined.
1037 return self.spv.constUndef(ty_ref);
1038 }
1039
1040 const spv_decl_index = try self.object.resolveDecl(mod, decl_index);
1041
1042 const decl_id = self.spv.declPtr(spv_decl_index).result_id;
1043 try self.func.decl_deps.put(self.spv.gpa, spv_decl_index, {});
1044
1045 const final_storage_class = spvStorageClass(decl.@"addrspace");
1046
1047 const decl_ty_ref = try self.resolveType(decl.ty, .indirect);
1048 const decl_ptr_ty_ref = try self.spv.ptrType(decl_ty_ref, final_storage_class);
1049
1050 const ptr_id = switch (final_storage_class) {
1051 .Generic => blk: {
1052 // Pointer should be Generic, but is actually placed in CrossWorkgroup.
1053 const result_id = self.spv.allocId();
1054 try self.func.body.emit(self.spv.gpa, .OpPtrCastToGeneric, .{
1055 .id_result_type = self.typeId(decl_ptr_ty_ref),
1056 .id_result = result_id,
1057 .pointer = decl_id,
1058 });
1059 break :blk result_id;
1060 },
1061 else => decl_id,
1062 };
1063
1064 if (decl_ptr_ty_ref != ty_ref) {
1065 // Differing pointer types, insert a cast.
1066 const casted_ptr_id = self.spv.allocId();
1067 try self.func.body.emit(self.spv.gpa, .OpBitcast, .{
1068 .id_result_type = ty_id,
1069 .id_result = casted_ptr_id,
1070 .operand = ptr_id,
1071 });
1072 return casted_ptr_id;
1073 } else {
1074 return ptr_id;
1075 }
1076 }
1077
8491078 // Turn a Zig type's name into a cache reference.
8501079 fn resolveTypeName(self: *DeclGen, ty: Type) !CacheString {
8511080 var name = std.ArrayList(u8).init(self.gpa);
......@@ -968,6 +1197,22 @@ pub const DeclGen = struct {
9681197 return ty_ref;
9691198 }
9701199
1200 fn resolveFnReturnType(self: *DeclGen, ret_ty: Type) !CacheRef {
1201 const mod = self.module;
1202 if (!ret_ty.hasRuntimeBitsIgnoreComptime(mod)) {
1203 // If the return type is an error set or an error union, then we make this
1204 // anyerror return type instead, so that it can be coerced into a function
1205 // pointer type which has anyerror as the return type.
1206 if (ret_ty.isError(mod)) {
1207 return self.resolveType(Type.anyerror, .direct);
1208 } else {
1209 return self.resolveType(Type.void, .direct);
1210 }
1211 }
1212
1213 return try self.resolveType(ret_ty, .direct);
1214 }
1215
9711216 /// Turn a Zig type into a SPIR-V Type, and return a reference to it.
9721217 fn resolveType(self: *DeclGen, ty: Type, repr: Repr) Error!CacheRef {
9731218 const mod = self.module;
......@@ -975,14 +1220,31 @@ pub const DeclGen = struct {
9751220 log.debug("resolveType: ty = {}", .{ty.fmt(mod)});
9761221 const target = self.getTarget();
9771222 switch (ty.zigTypeTag(mod)) {
978 .Void, .NoReturn => return try self.spv.resolve(.void_type),
1223 .NoReturn => {
1224 assert(repr == .direct);
1225 return try self.spv.resolve(.void_type);
1226 },
1227 .Void => switch (repr) {
1228 .direct => return try self.spv.resolve(.void_type),
1229 // Pointers to void
1230 .indirect => return try self.spv.resolve(.{ .opaque_type = .{
1231 .name = try self.spv.resolveString("void"),
1232 } }),
1233 },
9791234 .Bool => switch (repr) {
9801235 .direct => return try self.spv.resolve(.bool_type),
9811236 .indirect => return try self.intType(.unsigned, 1),
9821237 },
9831238 .Int => {
9841239 const int_info = ty.intInfo(mod);
985 // TODO: Integers in OpenCL kernels are always unsigned.
1240 if (int_info.bits == 0) {
1241 // Some times, the backend will be asked to generate a pointer to i0. OpTypeInt
1242 // with 0 bits is invalid, so return an opaque type in this case.
1243 assert(repr == .indirect);
1244 return try self.spv.resolve(.{ .opaque_type = .{
1245 .name = try self.spv.resolveString("u0"),
1246 } });
1247 }
9861248 return try self.intType(int_info.signedness, int_info.bits);
9871249 },
9881250 .Enum => {
......@@ -1012,10 +1274,32 @@ pub const DeclGen = struct {
10121274
10131275 const elem_ty = ty.childType(mod);
10141276 const elem_ty_ref = try self.resolveType(elem_ty, .indirect);
1015 const total_len = std.math.cast(u32, ty.arrayLenIncludingSentinel(mod)) orelse {
1277 var total_len = std.math.cast(u32, ty.arrayLenIncludingSentinel(mod)) orelse {
10161278 return self.fail("array type of {} elements is too large", .{ty.arrayLenIncludingSentinel(mod)});
10171279 };
1018 const ty_ref = try self.spv.arrayType(total_len, elem_ty_ref);
1280 const ty_ref = if (!elem_ty.hasRuntimeBitsIgnoreComptime(mod)) blk: {
1281 // The size of the array would be 0, but that is not allowed in SPIR-V.
1282 // This path can be reached when the backend is asked to generate a pointer to
1283 // an array of some zero-bit type. This should always be an indirect path.
1284 assert(repr == .indirect);
1285
1286 // We cannot use the child type here, so just use an opaque type.
1287 break :blk try self.spv.resolve(.{ .opaque_type = .{
1288 .name = try self.spv.resolveString("zero-sized array"),
1289 } });
1290 } else if (total_len == 0) blk: {
1291 // The size of the array would be 0, but that is not allowed in SPIR-V.
1292 // This path can be reached for example when there is a slicing of a pointer
1293 // that produces a zero-length array. In all cases where this type can be generated,
1294 // this should be an indirect path.
1295 assert(repr == .indirect);
1296
1297 // In this case, we have an array of a non-zero sized type. In this case,
1298 // generate an array of 1 element instead, so that ptr_elem_ptr instructions
1299 // can be lowered to ptrAccessChain instead of manually performing the math.
1300 break :blk try self.spv.arrayType(1, elem_ty_ref);
1301 } else try self.spv.arrayType(total_len, elem_ty_ref);
1302
10191303 try self.type_map.put(self.gpa, ty.toIntern(), .{ .ty_ref = ty_ref });
10201304 return ty_ref;
10211305 },
......@@ -1030,14 +1314,19 @@ pub const DeclGen = struct {
10301314
10311315 const param_ty_refs = try self.gpa.alloc(CacheRef, fn_info.param_types.len);
10321316 defer self.gpa.free(param_ty_refs);
1033 for (param_ty_refs, fn_info.param_types.get(ip)) |*param_type, fn_param_type| {
1034 param_type.* = try self.resolveType(fn_param_type.toType(), .direct);
1317 var param_index: usize = 0;
1318 for (fn_info.param_types.get(ip)) |param_ty_index| {
1319 const param_ty = param_ty_index.toType();
1320 if (!param_ty.hasRuntimeBitsIgnoreComptime(mod)) continue;
1321
1322 param_ty_refs[param_index] = try self.resolveType(param_ty, .direct);
1323 param_index += 1;
10351324 }
1036 const return_ty_ref = try self.resolveType(fn_info.return_type.toType(), .direct);
1325 const return_ty_ref = try self.resolveFnReturnType(fn_info.return_type.toType());
10371326
10381327 const ty_ref = try self.spv.resolve(.{ .function_type = .{
10391328 .return_type = return_ty_ref,
1040 .parameters = param_ty_refs,
1329 .parameters = param_ty_refs[0..param_index],
10411330 } });
10421331
10431332 try self.type_map.put(self.gpa, ty.toIntern(), .{ .ty_ref = ty_ref });
......@@ -1072,19 +1361,14 @@ pub const DeclGen = struct {
10721361 } });
10731362 },
10741363 .Vector => {
1075 // Although not 100% the same, Zig vectors map quite neatly to SPIR-V vectors (including many integer and float operations
1076 // which work on them), so simply use those.
1077 // Note: SPIR-V vectors only support bools, ints and floats, so pointer vectors need to be supported another way.
1078 // "composite integers" (larger than the largest supported native type) can probably be represented by an array of vectors.
1079 // TODO: The SPIR-V spec mentions that vector sizes may be quite restricted! look into which we can use, and whether OpTypeVector
1080 // is adequate at all for this.
1081
1082 // TODO: Properly verify sizes and child type.
1083
1084 return try self.spv.resolve(.{ .vector_type = .{
1085 .component_type = try self.resolveType(ty.childType(mod), repr),
1086 .component_count = @as(u32, @intCast(ty.vectorLen(mod))),
1087 } });
1364 if (self.type_map.get(ty.toIntern())) |info| return info.ty_ref;
1365
1366 const elem_ty = ty.childType(mod);
1367 const elem_ty_ref = try self.resolveType(elem_ty, .indirect);
1368
1369 const ty_ref = try self.spv.arrayType(ty.vectorLen(mod), elem_ty_ref);
1370 try self.type_map.put(self.gpa, ty.toIntern(), .{ .ty_ref = ty_ref });
1371 return ty_ref;
10881372 },
10891373 .Struct => {
10901374 if (self.type_map.get(ty.toIntern())) |info| return info.ty_ref;
......@@ -1126,10 +1410,16 @@ pub const DeclGen = struct {
11261410
11271411 var it = struct_type.iterateRuntimeOrder(ip);
11281412 while (it.next()) |field_index| {
1129 const field_ty = struct_type.field_types.get(ip)[field_index];
1130 const field_name = ip.stringToSlice(struct_type.field_names.get(ip)[field_index]);
1131 try member_types.append(try self.resolveType(field_ty.toType(), .indirect));
1132 try member_names.append(try self.spv.resolveString(field_name));
1413 const field_ty = struct_type.field_types.get(ip)[field_index].toType();
1414 if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) {
1415 // This is a zero-bit field - we only needed it for the alignment.
1416 continue;
1417 }
1418
1419 const field_name = struct_type.fieldName(ip, field_index).unwrap() orelse
1420 try ip.getOrPutStringFmt(mod.gpa, "{d}", .{field_index});
1421 try member_types.append(try self.resolveType(field_ty, .indirect));
1422 try member_names.append(try self.spv.resolveString(ip.stringToSlice(field_name)));
11331423 }
11341424
11351425 const ty_ref = try self.spv.resolve(.{ .struct_type = .{
......@@ -1215,6 +1505,13 @@ pub const DeclGen = struct {
12151505 try self.type_map.put(self.gpa, ty.toIntern(), .{ .ty_ref = ty_ref });
12161506 return ty_ref;
12171507 },
1508 .Opaque => {
1509 return try self.spv.resolve(.{
1510 .opaque_type = .{
1511 .name = .none, // TODO
1512 },
1513 });
1514 },
12181515
12191516 .Null,
12201517 .Undefined,
......@@ -1431,7 +1728,7 @@ pub const DeclGen = struct {
14311728 const mod = self.module;
14321729 const ip = &mod.intern_pool;
14331730 const decl = mod.declPtr(self.decl_index);
1434 const spv_decl_index = try self.resolveDecl(self.decl_index);
1731 const spv_decl_index = try self.object.resolveDecl(mod, self.decl_index);
14351732
14361733 const decl_id = self.spv.declPtr(spv_decl_index).result_id;
14371734
......@@ -1439,20 +1736,23 @@ pub const DeclGen = struct {
14391736
14401737 if (decl.val.getFunction(mod)) |_| {
14411738 assert(decl.ty.zigTypeTag(mod) == .Fn);
1739 const fn_info = mod.typeToFunc(decl.ty).?;
1740 const return_ty_ref = try self.resolveFnReturnType(fn_info.return_type.toType());
1741
14421742 const prototype_id = try self.resolveTypeId(decl.ty);
14431743 try self.func.prologue.emit(self.spv.gpa, .OpFunction, .{
1444 .id_result_type = try self.resolveTypeId(decl.ty.fnReturnType(mod)),
1744 .id_result_type = self.typeId(return_ty_ref),
14451745 .id_result = decl_id,
14461746 .function_control = .{}, // TODO: We can set inline here if the type requires it.
14471747 .function_type = prototype_id,
14481748 });
14491749
1450 const fn_info = mod.typeToFunc(decl.ty).?;
1451
14521750 try self.args.ensureUnusedCapacity(self.gpa, fn_info.param_types.len);
1453 for (0..fn_info.param_types.len) |i| {
1454 const param_type = fn_info.param_types.get(ip)[i];
1455 const param_type_id = try self.resolveTypeId(param_type.toType());
1751 for (fn_info.param_types.get(ip)) |param_ty_index| {
1752 const param_ty = param_ty_index.toType();
1753 if (!param_ty.hasRuntimeBitsIgnoreComptime(mod)) continue;
1754
1755 const param_type_id = try self.resolveTypeId(param_ty);
14561756 const arg_result_id = self.spv.allocId();
14571757 try self.func.prologue.emit(self.spv.gpa, .OpFunctionParameter, .{
14581758 .id_result_type = param_type_id,
......@@ -1693,11 +1993,15 @@ pub const DeclGen = struct {
16931993
16941994 .shl => try self.airShift(inst, .OpShiftLeftLogical),
16951995
1996 .min => try self.airMinMax(inst, .lt),
1997 .max => try self.airMinMax(inst, .gt),
1998
16961999 .bitcast => try self.airBitCast(inst),
16972000 .intcast, .trunc => try self.airIntCast(inst),
16982001 .int_from_ptr => try self.airIntFromPtr(inst),
16992002 .float_from_int => try self.airFloatFromInt(inst),
17002003 .int_from_float => try self.airIntFromFloat(inst),
2004 .fpext, .fptrunc => try self.airFloatCast(inst),
17012005 .not => try self.airNot(inst),
17022006
17032007 .array_to_slice => try self.airArrayToSlice(inst),
......@@ -1723,12 +2027,13 @@ pub const DeclGen = struct {
17232027 .struct_field_ptr_index_2 => try self.airStructFieldPtrIndex(inst, 2),
17242028 .struct_field_ptr_index_3 => try self.airStructFieldPtrIndex(inst, 3),
17252029
1726 .cmp_eq => try self.airCmp(inst, .eq),
1727 .cmp_neq => try self.airCmp(inst, .neq),
1728 .cmp_gt => try self.airCmp(inst, .gt),
1729 .cmp_gte => try self.airCmp(inst, .gte),
1730 .cmp_lt => try self.airCmp(inst, .lt),
1731 .cmp_lte => try self.airCmp(inst, .lte),
2030 .cmp_eq => try self.airCmp(inst, .eq),
2031 .cmp_neq => try self.airCmp(inst, .neq),
2032 .cmp_gt => try self.airCmp(inst, .gt),
2033 .cmp_gte => try self.airCmp(inst, .gte),
2034 .cmp_lt => try self.airCmp(inst, .lt),
2035 .cmp_lte => try self.airCmp(inst, .lte),
2036 .cmp_vector => try self.airVectorCmp(inst),
17322037
17332038 .arg => self.airArg(),
17342039 .alloc => try self.airAlloc(inst),
......@@ -1784,13 +2089,30 @@ pub const DeclGen = struct {
17842089 try self.inst_results.putNoClobber(self.gpa, inst, result_id);
17852090 }
17862091
1787 fn airBinOpSimple(self: *DeclGen, inst: Air.Inst.Index, comptime opcode: Opcode) !?IdRef {
1788 if (self.liveness.isUnused(inst)) return null;
1789 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
1790 const lhs_id = try self.resolve(bin_op.lhs);
1791 const rhs_id = try self.resolve(bin_op.rhs);
2092 fn binOpSimple(self: *DeclGen, ty: Type, lhs_id: IdRef, rhs_id: IdRef, comptime opcode: Opcode) !IdRef {
2093 const mod = self.module;
2094
2095 if (ty.isVector(mod)) {
2096 const child_ty = ty.childType(mod);
2097 const vector_len = ty.vectorLen(mod);
2098
2099 var constituents = try self.gpa.alloc(IdRef, vector_len);
2100 defer self.gpa.free(constituents);
2101
2102 for (constituents, 0..) |*constituent, i| {
2103 const lhs_index_id = try self.extractField(child_ty, lhs_id, @intCast(i));
2104 const rhs_index_id = try self.extractField(child_ty, rhs_id, @intCast(i));
2105 const result_id = try self.binOpSimple(child_ty, lhs_index_id, rhs_index_id, opcode);
2106 constituent.* = try self.convertToIndirect(child_ty, result_id);
2107 }
2108
2109 const result_ty = try self.resolveType(child_ty, .indirect);
2110 const result_ty_ref = try self.spv.arrayType(vector_len, result_ty);
2111 return try self.constructArray(result_ty_ref, constituents);
2112 }
2113
17922114 const result_id = self.spv.allocId();
1793 const result_type_id = try self.resolveTypeId(self.typeOfIndex(inst));
2115 const result_type_id = try self.resolveTypeId(ty);
17942116 try self.func.body.emit(self.spv.gpa, opcode, .{
17952117 .id_result_type = result_type_id,
17962118 .id_result = result_id,
......@@ -1800,6 +2122,17 @@ pub const DeclGen = struct {
18002122 return result_id;
18012123 }
18022124
2125 fn airBinOpSimple(self: *DeclGen, inst: Air.Inst.Index, comptime opcode: Opcode) !?IdRef {
2126 if (self.liveness.isUnused(inst)) return null;
2127
2128 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
2129 const lhs_id = try self.resolve(bin_op.lhs);
2130 const rhs_id = try self.resolve(bin_op.rhs);
2131 const ty = self.typeOf(bin_op.lhs);
2132
2133 return try self.binOpSimple(ty, lhs_id, rhs_id, opcode);
2134 }
2135
18032136 fn airShift(self: *DeclGen, inst: Air.Inst.Index, comptime opcode: Opcode) !?IdRef {
18042137 if (self.liveness.isUnused(inst)) return null;
18052138 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
......@@ -1825,19 +2158,99 @@ pub const DeclGen = struct {
18252158 return result_id;
18262159 }
18272160
1828 fn maskStrangeInt(self: *DeclGen, ty_ref: CacheRef, value_id: IdRef, bits: u16) !IdRef {
1829 const mask_value = if (bits == 64) 0xFFFF_FFFF_FFFF_FFFF else (@as(u64, 1) << @as(u6, @intCast(bits))) - 1;
2161 fn airMinMax(self: *DeclGen, inst: Air.Inst.Index, op: std.math.CompareOperator) !?IdRef {
2162 if (self.liveness.isUnused(inst)) return null;
2163
2164 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
2165 const lhs_id = try self.resolve(bin_op.lhs);
2166 const rhs_id = try self.resolve(bin_op.rhs);
2167 const result_ty = self.typeOfIndex(inst);
2168 const result_ty_ref = try self.resolveType(result_ty, .direct);
2169
2170 const info = try self.arithmeticTypeInfo(result_ty);
2171 // TODO: Use fmin for OpenCL
2172 const cmp_id = try self.cmp(op, result_ty, lhs_id, rhs_id);
2173 const selection_id = switch (info.class) {
2174 .float => blk: {
2175 // cmp uses OpFOrd. When we have 0 [<>] nan this returns false,
2176 // but we want it to pick lhs. Therefore we also have to check if
2177 // rhs is nan. We don't need to care about the result when both
2178 // are nan.
2179 const rhs_is_nan_id = self.spv.allocId();
2180 const bool_ty_ref = try self.resolveType(Type.bool, .direct);
2181 try self.func.body.emit(self.spv.gpa, .OpIsNan, .{
2182 .id_result_type = self.typeId(bool_ty_ref),
2183 .id_result = rhs_is_nan_id,
2184 .x = rhs_id,
2185 });
2186 const float_cmp_id = self.spv.allocId();
2187 try self.func.body.emit(self.spv.gpa, .OpLogicalOr, .{
2188 .id_result_type = self.typeId(bool_ty_ref),
2189 .id_result = float_cmp_id,
2190 .operand_1 = cmp_id,
2191 .operand_2 = rhs_is_nan_id,
2192 });
2193 break :blk float_cmp_id;
2194 },
2195 else => cmp_id,
2196 };
2197
18302198 const result_id = self.spv.allocId();
1831 const mask_id = try self.constInt(ty_ref, mask_value);
1832 try self.func.body.emit(self.spv.gpa, .OpBitwiseAnd, .{
1833 .id_result_type = self.typeId(ty_ref),
2199 try self.func.body.emit(self.spv.gpa, .OpSelect, .{
2200 .id_result_type = self.typeId(result_ty_ref),
18342201 .id_result = result_id,
1835 .operand_1 = value_id,
1836 .operand_2 = mask_id,
2202 .condition = selection_id,
2203 .object_1 = lhs_id,
2204 .object_2 = rhs_id,
18372205 });
18382206 return result_id;
18392207 }
18402208
2209 /// This function canonicalizes a "strange" integer value:
2210 /// For unsigned integers, the value is masked so that only the relevant bits can contain
2211 /// non-zeros.
2212 /// For signed integers, the value is also sign extended.
2213 fn normalizeInt(self: *DeclGen, ty_ref: CacheRef, value_id: IdRef, info: ArithmeticTypeInfo) !IdRef {
2214 assert(info.class != .composite_integer); // TODO
2215 if (info.bits == info.backing_bits) {
2216 return value_id;
2217 }
2218
2219 switch (info.signedness) {
2220 .unsigned => {
2221 const mask_value = if (info.bits == 64) 0xFFFF_FFFF_FFFF_FFFF else (@as(u64, 1) << @as(u6, @intCast(info.bits))) - 1;
2222 const result_id = self.spv.allocId();
2223 const mask_id = try self.constInt(ty_ref, mask_value);
2224 try self.func.body.emit(self.spv.gpa, .OpBitwiseAnd, .{
2225 .id_result_type = self.typeId(ty_ref),
2226 .id_result = result_id,
2227 .operand_1 = value_id,
2228 .operand_2 = mask_id,
2229 });
2230 return result_id;
2231 },
2232 .signed => {
2233 // Shift left and right so that we can copy the sight bit that way.
2234 const shift_amt_id = try self.constInt(ty_ref, info.backing_bits - info.bits);
2235 const left_id = self.spv.allocId();
2236 try self.func.body.emit(self.spv.gpa, .OpShiftLeftLogical, .{
2237 .id_result_type = self.typeId(ty_ref),
2238 .id_result = left_id,
2239 .base = value_id,
2240 .shift = shift_amt_id,
2241 });
2242 const right_id = self.spv.allocId();
2243 try self.func.body.emit(self.spv.gpa, .OpShiftRightArithmetic, .{
2244 .id_result_type = self.typeId(ty_ref),
2245 .id_result = right_id,
2246 .base = left_id,
2247 .shift = shift_amt_id,
2248 });
2249 return right_id;
2250 },
2251 }
2252 }
2253
18412254 fn airArithOp(
18422255 self: *DeclGen,
18432256 inst: Air.Inst.Index,
......@@ -1848,18 +2261,52 @@ pub const DeclGen = struct {
18482261 comptime modular: bool,
18492262 ) !?IdRef {
18502263 if (self.liveness.isUnused(inst)) return null;
2264
18512265 // LHS and RHS are guaranteed to have the same type, and AIR guarantees
18522266 // the result to be the same as the LHS and RHS, which matches SPIR-V.
18532267 const ty = self.typeOfIndex(inst);
18542268 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
1855 var lhs_id = try self.resolve(bin_op.lhs);
1856 var rhs_id = try self.resolve(bin_op.rhs);
1857
1858 const result_ty_ref = try self.resolveType(ty, .direct);
2269 const lhs_id = try self.resolve(bin_op.lhs);
2270 const rhs_id = try self.resolve(bin_op.rhs);
18592271
18602272 assert(self.typeOf(bin_op.lhs).eql(ty, self.module));
18612273 assert(self.typeOf(bin_op.rhs).eql(ty, self.module));
18622274
2275 return try self.arithOp(ty, lhs_id, rhs_id, fop, sop, uop, modular);
2276 }
2277
2278 fn arithOp(
2279 self: *DeclGen,
2280 ty: Type,
2281 lhs_id_: IdRef,
2282 rhs_id_: IdRef,
2283 comptime fop: Opcode,
2284 comptime sop: Opcode,
2285 comptime uop: Opcode,
2286 /// true if this operation holds under modular arithmetic.
2287 comptime modular: bool,
2288 ) !IdRef {
2289 var rhs_id = rhs_id_;
2290 var lhs_id = lhs_id_;
2291
2292 const mod = self.module;
2293 const result_ty_ref = try self.resolveType(ty, .direct);
2294
2295 if (ty.isVector(mod)) {
2296 const child_ty = ty.childType(mod);
2297 const vector_len = ty.vectorLen(mod);
2298 var constituents = try self.gpa.alloc(IdRef, vector_len);
2299 defer self.gpa.free(constituents);
2300
2301 for (constituents, 0..) |*constituent, i| {
2302 const lhs_index_id = try self.extractField(child_ty, lhs_id, @intCast(i));
2303 const rhs_index_id = try self.extractField(child_ty, rhs_id, @intCast(i));
2304 constituent.* = try self.arithOp(child_ty, lhs_index_id, rhs_index_id, fop, sop, uop, modular);
2305 }
2306
2307 return self.constructArray(result_ty_ref, constituents);
2308 }
2309
18632310 // Binary operations are generally applicable to both scalar and vector operations
18642311 // in SPIR-V, but int and float versions of operations require different opcodes.
18652312 const info = try self.arithmeticTypeInfo(ty);
......@@ -1870,8 +2317,8 @@ pub const DeclGen = struct {
18702317 },
18712318 .strange_integer => blk: {
18722319 if (!modular) {
1873 lhs_id = try self.maskStrangeInt(result_ty_ref, lhs_id, info.bits);
1874 rhs_id = try self.maskStrangeInt(result_ty_ref, rhs_id, info.bits);
2320 lhs_id = try self.normalizeInt(result_ty_ref, lhs_id, info);
2321 rhs_id = try self.normalizeInt(result_ty_ref, rhs_id, info);
18752322 }
18762323 break :blk switch (info.signedness) {
18772324 .signed => @as(usize, 1),
......@@ -2174,8 +2621,7 @@ pub const DeclGen = struct {
21742621
21752622 fn cmp(
21762623 self: *DeclGen,
2177 comptime op: std.math.CompareOperator,
2178 bool_ty_id: IdRef,
2624 op: std.math.CompareOperator,
21792625 ty: Type,
21802626 lhs_id: IdRef,
21812627 rhs_id: IdRef,
......@@ -2183,38 +2629,104 @@ pub const DeclGen = struct {
21832629 const mod = self.module;
21842630 var cmp_lhs_id = lhs_id;
21852631 var cmp_rhs_id = rhs_id;
2186 const opcode: Opcode = opcode: {
2187 const op_ty = switch (ty.zigTypeTag(mod)) {
2188 .Int, .Bool, .Float => ty,
2189 .Enum => ty.intTagType(mod),
2190 .ErrorSet => Type.u16,
2191 .Pointer => blk: {
2192 // Note that while SPIR-V offers OpPtrEqual and OpPtrNotEqual, they are
2193 // currently not implemented in the SPIR-V LLVM translator. Thus, we emit these using
2194 // OpConvertPtrToU...
2195 cmp_lhs_id = self.spv.allocId();
2196 cmp_rhs_id = self.spv.allocId();
2197
2198 const usize_ty_id = self.typeId(try self.sizeType());
2199
2200 try self.func.body.emit(self.spv.gpa, .OpConvertPtrToU, .{
2201 .id_result_type = usize_ty_id,
2202 .id_result = cmp_lhs_id,
2203 .pointer = lhs_id,
2204 });
2632 const bool_ty_ref = try self.resolveType(Type.bool, .direct);
2633 const op_ty = switch (ty.zigTypeTag(mod)) {
2634 .Int, .Bool, .Float => ty,
2635 .Enum => ty.intTagType(mod),
2636 .ErrorSet => Type.u16,
2637 .Pointer => blk: {
2638 // Note that while SPIR-V offers OpPtrEqual and OpPtrNotEqual, they are
2639 // currently not implemented in the SPIR-V LLVM translator. Thus, we emit these using
2640 // OpConvertPtrToU...
2641 cmp_lhs_id = self.spv.allocId();
2642 cmp_rhs_id = self.spv.allocId();
2643
2644 const usize_ty_id = self.typeId(try self.sizeType());
2645
2646 try self.func.body.emit(self.spv.gpa, .OpConvertPtrToU, .{
2647 .id_result_type = usize_ty_id,
2648 .id_result = cmp_lhs_id,
2649 .pointer = lhs_id,
2650 });
22052651
2206 try self.func.body.emit(self.spv.gpa, .OpConvertPtrToU, .{
2207 .id_result_type = usize_ty_id,
2208 .id_result = cmp_rhs_id,
2209 .pointer = rhs_id,
2210 });
2652 try self.func.body.emit(self.spv.gpa, .OpConvertPtrToU, .{
2653 .id_result_type = usize_ty_id,
2654 .id_result = cmp_rhs_id,
2655 .pointer = rhs_id,
2656 });
22112657
2212 break :blk Type.usize;
2213 },
2214 .Optional => unreachable, // TODO
2215 else => unreachable,
2216 };
2658 break :blk Type.usize;
2659 },
2660 .Optional => {
2661 const payload_ty = ty.optionalChild(mod);
2662 if (ty.optionalReprIsPayload(mod)) {
2663 assert(payload_ty.hasRuntimeBitsIgnoreComptime(mod));
2664 assert(!payload_ty.isSlice(mod));
2665 return self.cmp(op, payload_ty, lhs_id, rhs_id);
2666 }
2667
2668 const lhs_valid_id = if (payload_ty.hasRuntimeBitsIgnoreComptime(mod))
2669 try self.extractField(Type.bool, lhs_id, 1)
2670 else
2671 try self.convertToDirect(Type.bool, lhs_id);
2672
2673 const rhs_valid_id = if (payload_ty.hasRuntimeBitsIgnoreComptime(mod))
2674 try self.extractField(Type.bool, rhs_id, 1)
2675 else
2676 try self.convertToDirect(Type.bool, rhs_id);
2677
2678 const valid_cmp_id = try self.cmp(op, Type.bool, lhs_valid_id, rhs_valid_id);
2679 if (!payload_ty.hasRuntimeBitsIgnoreComptime(mod)) {
2680 return valid_cmp_id;
2681 }
2682
2683 // TODO: Should we short circuit here? It shouldn't affect correctness, but
2684 // perhaps it will generate more efficient code.
2685
2686 const lhs_pl_id = try self.extractField(payload_ty, lhs_id, 0);
2687 const rhs_pl_id = try self.extractField(payload_ty, rhs_id, 0);
2688
2689 const pl_cmp_id = try self.cmp(op, payload_ty, lhs_pl_id, rhs_pl_id);
22172690
2691 // op == .eq => lhs_valid == rhs_valid && lhs_pl == rhs_pl
2692 // op == .neq => lhs_valid != rhs_valid || lhs_pl != rhs_pl
2693
2694 const result_id = self.spv.allocId();
2695 const args = .{
2696 .id_result_type = self.typeId(bool_ty_ref),
2697 .id_result = result_id,
2698 .operand_1 = valid_cmp_id,
2699 .operand_2 = pl_cmp_id,
2700 };
2701 switch (op) {
2702 .eq => try self.func.body.emit(self.spv.gpa, .OpLogicalAnd, args),
2703 .neq => try self.func.body.emit(self.spv.gpa, .OpLogicalOr, args),
2704 else => unreachable,
2705 }
2706 return result_id;
2707 },
2708 .Vector => {
2709 const child_ty = ty.childType(mod);
2710 const vector_len = ty.vectorLen(mod);
2711 const bool_ty_ref_indirect = try self.resolveType(Type.bool, .indirect);
2712
2713 var constituents = try self.gpa.alloc(IdRef, vector_len);
2714 defer self.gpa.free(constituents);
2715
2716 for (constituents, 0..) |*constituent, i| {
2717 const lhs_index_id = try self.extractField(child_ty, cmp_lhs_id, @intCast(i));
2718 const rhs_index_id = try self.extractField(child_ty, cmp_rhs_id, @intCast(i));
2719 const result_id = try self.cmp(op, child_ty, lhs_index_id, rhs_index_id);
2720 constituent.* = try self.convertToIndirect(Type.bool, result_id);
2721 }
2722
2723 const result_ty_ref = try self.spv.arrayType(vector_len, bool_ty_ref_indirect);
2724 return try self.constructArray(result_ty_ref, constituents);
2725 },
2726 else => unreachable,
2727 };
2728
2729 const opcode: Opcode = opcode: {
22182730 const info = try self.arithmeticTypeInfo(op_ty);
22192731 const signedness = switch (info.class) {
22202732 .composite_integer => {
......@@ -2222,7 +2734,7 @@ pub const DeclGen = struct {
22222734 },
22232735 .float => break :opcode switch (op) {
22242736 .eq => .OpFOrdEqual,
2225 .neq => .OpFOrdNotEqual,
2737 .neq => .OpFUnordNotEqual,
22262738 .lt => .OpFOrdLessThan,
22272739 .lte => .OpFOrdLessThanEqual,
22282740 .gt => .OpFOrdGreaterThan,
......@@ -2236,8 +2748,8 @@ pub const DeclGen = struct {
22362748 .strange_integer => sign: {
22372749 const op_ty_ref = try self.resolveType(op_ty, .direct);
22382750 // Mask operands before performing comparison.
2239 cmp_lhs_id = try self.maskStrangeInt(op_ty_ref, cmp_lhs_id, info.bits);
2240 cmp_rhs_id = try self.maskStrangeInt(op_ty_ref, cmp_rhs_id, info.bits);
2751 cmp_lhs_id = try self.normalizeInt(op_ty_ref, cmp_lhs_id, info);
2752 cmp_rhs_id = try self.normalizeInt(op_ty_ref, cmp_rhs_id, info);
22412753 break :sign info.signedness;
22422754 },
22432755 .integer => info.signedness,
......@@ -2265,7 +2777,7 @@ pub const DeclGen = struct {
22652777
22662778 const result_id = self.spv.allocId();
22672779 try self.func.body.emitRaw(self.spv.gpa, opcode, 4);
2268 self.func.body.writeOperand(spec.IdResultType, bool_ty_id);
2780 self.func.body.writeOperand(spec.IdResultType, self.typeId(bool_ty_ref));
22692781 self.func.body.writeOperand(spec.IdResult, result_id);
22702782 self.func.body.writeOperand(spec.IdResultType, cmp_lhs_id);
22712783 self.func.body.writeOperand(spec.IdResultType, cmp_rhs_id);
......@@ -2281,11 +2793,22 @@ pub const DeclGen = struct {
22812793 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
22822794 const lhs_id = try self.resolve(bin_op.lhs);
22832795 const rhs_id = try self.resolve(bin_op.rhs);
2284 const bool_ty_id = try self.resolveTypeId(Type.bool);
22852796 const ty = self.typeOf(bin_op.lhs);
2286 assert(ty.eql(self.typeOf(bin_op.rhs), self.module));
22872797
2288 return try self.cmp(op, bool_ty_id, ty, lhs_id, rhs_id);
2798 return try self.cmp(op, ty, lhs_id, rhs_id);
2799 }
2800
2801 fn airVectorCmp(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
2802 if (self.liveness.isUnused(inst)) return null;
2803
2804 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
2805 const vec_cmp = self.air.extraData(Air.VectorCmp, ty_pl.payload).data;
2806 const lhs_id = try self.resolve(vec_cmp.lhs);
2807 const rhs_id = try self.resolve(vec_cmp.rhs);
2808 const op = vec_cmp.compareOperator();
2809 const ty = self.typeOf(vec_cmp.lhs);
2810
2811 return try self.cmp(op, ty, lhs_id, rhs_id);
22892812 }
22902813
22912814 fn bitCast(
......@@ -2295,26 +2818,58 @@ pub const DeclGen = struct {
22952818 src_id: IdRef,
22962819 ) !IdRef {
22972820 const mod = self.module;
2821 const src_ty_ref = try self.resolveType(src_ty, .direct);
22982822 const dst_ty_ref = try self.resolveType(dst_ty, .direct);
2299 const result_id = self.spv.allocId();
2823 if (src_ty_ref == dst_ty_ref) {
2824 return src_id;
2825 }
23002826
23012827 // TODO: Some more cases are missing here
23022828 // See fn bitCast in llvm.zig
23032829
23042830 if (src_ty.zigTypeTag(mod) == .Int and dst_ty.isPtrAtRuntime(mod)) {
2831 const result_id = self.spv.allocId();
23052832 try self.func.body.emit(self.spv.gpa, .OpConvertUToPtr, .{
23062833 .id_result_type = self.typeId(dst_ty_ref),
23072834 .id_result = result_id,
23082835 .integer_value = src_id,
23092836 });
2310 } else {
2837 return result_id;
2838 }
2839
2840 // We can only use OpBitcast for specific conversions: between numerical types, and
2841 // between pointers. If the resolved spir-v types fall into this category then emit OpBitcast,
2842 // otherwise use a temporary and perform a pointer cast.
2843 const src_key = self.spv.cache.lookup(src_ty_ref);
2844 const dst_key = self.spv.cache.lookup(dst_ty_ref);
2845
2846 if ((src_key.isNumericalType() and dst_key.isNumericalType()) or (src_key == .ptr_type and dst_key == .ptr_type)) {
2847 const result_id = self.spv.allocId();
23112848 try self.func.body.emit(self.spv.gpa, .OpBitcast, .{
23122849 .id_result_type = self.typeId(dst_ty_ref),
23132850 .id_result = result_id,
23142851 .operand = src_id,
23152852 });
2853 return result_id;
23162854 }
2317 return result_id;
2855
2856 const src_ptr_ty_ref = try self.spv.ptrType(src_ty_ref, .Function);
2857 const dst_ptr_ty_ref = try self.spv.ptrType(dst_ty_ref, .Function);
2858
2859 const tmp_id = self.spv.allocId();
2860 try self.func.prologue.emit(self.spv.gpa, .OpVariable, .{
2861 .id_result_type = self.typeId(src_ptr_ty_ref),
2862 .id_result = tmp_id,
2863 .storage_class = .Function,
2864 });
2865 try self.store(src_ty, tmp_id, src_id, false);
2866 const casted_ptr_id = self.spv.allocId();
2867 try self.func.body.emit(self.spv.gpa, .OpBitcast, .{
2868 .id_result_type = self.typeId(dst_ptr_ty_ref),
2869 .id_result = casted_ptr_id,
2870 .operand = tmp_id,
2871 });
2872 return try self.load(dst_ty, casted_ptr_id, false);
23182873 }
23192874
23202875 fn airBitCast(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
......@@ -2331,25 +2886,33 @@ pub const DeclGen = struct {
23312886
23322887 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
23332888 const operand_id = try self.resolve(ty_op.operand);
2334 const dest_ty = self.typeOfIndex(inst);
2335 const dest_ty_id = try self.resolveTypeId(dest_ty);
2889 const src_ty = self.typeOf(ty_op.operand);
2890 const dst_ty = self.typeOfIndex(inst);
2891 const src_ty_ref = try self.resolveType(src_ty, .direct);
2892 const dst_ty_ref = try self.resolveType(dst_ty, .direct);
23362893
2337 const mod = self.module;
2338 const dest_info = dest_ty.intInfo(mod);
2894 const src_info = try self.arithmeticTypeInfo(src_ty);
2895 const dst_info = try self.arithmeticTypeInfo(dst_ty);
23392896
2340 // TODO: Masking?
2897 // While intcast promises that the value already fits, the upper bits of a
2898 // strange integer may contain garbage. Therefore, mask/sign extend it before.
2899 const src_id = try self.normalizeInt(src_ty_ref, operand_id, src_info);
2900
2901 if (src_info.backing_bits == dst_info.backing_bits) {
2902 return src_id;
2903 }
23412904
23422905 const result_id = self.spv.allocId();
2343 switch (dest_info.signedness) {
2906 switch (dst_info.signedness) {
23442907 .signed => try self.func.body.emit(self.spv.gpa, .OpSConvert, .{
2345 .id_result_type = dest_ty_id,
2908 .id_result_type = self.typeId(dst_ty_ref),
23462909 .id_result = result_id,
2347 .signed_value = operand_id,
2910 .signed_value = src_id,
23482911 }),
23492912 .unsigned => try self.func.body.emit(self.spv.gpa, .OpUConvert, .{
2350 .id_result_type = dest_ty_id,
2913 .id_result_type = self.typeId(dst_ty_ref),
23512914 .id_result = result_id,
2352 .unsigned_value = operand_id,
2915 .unsigned_value = src_id,
23532916 }),
23542917 }
23552918 return result_id;
......@@ -2422,6 +2985,23 @@ pub const DeclGen = struct {
24222985 return result_id;
24232986 }
24242987
2988 fn airFloatCast(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
2989 if (self.liveness.isUnused(inst)) return null;
2990
2991 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
2992 const operand_id = try self.resolve(ty_op.operand);
2993 const dest_ty = self.typeOfIndex(inst);
2994 const dest_ty_id = try self.resolveTypeId(dest_ty);
2995
2996 const result_id = self.spv.allocId();
2997 try self.func.body.emit(self.spv.gpa, .OpFConvert, .{
2998 .id_result_type = dest_ty_id,
2999 .id_result = result_id,
3000 .float_value = operand_id,
3001 });
3002 return result_id;
3003 }
3004
24253005 fn airNot(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
24263006 if (self.liveness.isUnused(inst)) return null;
24273007 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
......@@ -2461,22 +3041,23 @@ pub const DeclGen = struct {
24613041 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
24623042 const array_ptr_ty = self.typeOf(ty_op.operand);
24633043 const array_ty = array_ptr_ty.childType(mod);
2464 const elem_ty = array_ptr_ty.elemType2(mod); // use elemType() so that we get T for *[N]T.
2465 const elem_ty_ref = try self.resolveType(elem_ty, .indirect);
2466 const elem_ptr_ty_ref = try self.spv.ptrType(elem_ty_ref, spvStorageClass(array_ptr_ty.ptrAddressSpace(mod)));
24673044 const slice_ty = self.typeOfIndex(inst);
3045 const elem_ptr_ty = slice_ty.slicePtrFieldType(mod);
3046
3047 const elem_ptr_ty_ref = try self.resolveType(elem_ptr_ty, .direct);
24683048 const slice_ty_ref = try self.resolveType(slice_ty, .direct);
24693049 const size_ty_ref = try self.sizeType();
24703050
24713051 const array_ptr_id = try self.resolve(ty_op.operand);
24723052 const len_id = try self.constInt(size_ty_ref, array_ty.arrayLen(mod));
24733053
2474 if (!array_ty.hasRuntimeBitsIgnoreComptime(mod)) {
2475 unreachable; // TODO
2476 }
3054 const elem_ptr_id = if (!array_ty.hasRuntimeBitsIgnoreComptime(mod))
3055 // Note: The pointer is something like *opaque{}, so we need to bitcast it to the element type.
3056 try self.bitCast(elem_ptr_ty, array_ptr_ty, array_ptr_id)
3057 else
3058 // Convert the pointer-to-array to a pointer to the first element.
3059 try self.accessChain(elem_ptr_ty_ref, array_ptr_id, &.{0});
24773060
2478 // Convert the pointer-to-array to a pointer to the first element.
2479 const elem_ptr_id = try self.accessChain(elem_ptr_ty_ref, array_ptr_id, &.{0});
24803061 return try self.constructStruct(slice_ty_ref, &.{ elem_ptr_id, len_id });
24813062 }
24823063
......@@ -2500,6 +3081,7 @@ pub const DeclGen = struct {
25003081 if (self.liveness.isUnused(inst)) return null;
25013082
25023083 const mod = self.module;
3084 const ip = &mod.intern_pool;
25033085 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
25043086 const result_ty = self.typeOfIndex(inst);
25053087 const result_ty_ref = try self.resolveType(result_ty, .direct);
......@@ -2508,15 +3090,53 @@ pub const DeclGen = struct {
25083090
25093091 switch (result_ty.zigTypeTag(mod)) {
25103092 .Vector => unreachable, // TODO
2511 .Struct => unreachable, // TODO
3093 .Struct => {
3094 if (mod.typeToPackedStruct(result_ty)) |struct_type| {
3095 _ = struct_type;
3096 unreachable; // TODO
3097 }
3098
3099 const constituents = try self.gpa.alloc(IdRef, elements.len);
3100 defer self.gpa.free(constituents);
3101 var index: usize = 0;
3102
3103 switch (ip.indexToKey(result_ty.toIntern())) {
3104 .anon_struct_type => |tuple| {
3105 for (tuple.types.get(ip), elements, 0..) |field_ty, element, i| {
3106 if ((try result_ty.structFieldValueComptime(mod, i)) != null) continue;
3107 assert(field_ty.toType().hasRuntimeBits(mod));
3108
3109 const id = try self.resolve(element);
3110 constituents[index] = try self.convertToIndirect(field_ty.toType(), id);
3111 index += 1;
3112 }
3113 },
3114 .struct_type => |struct_type| {
3115 var it = struct_type.iterateRuntimeOrder(ip);
3116 for (elements, 0..) |element, i| {
3117 const field_index = it.next().?;
3118 if ((try result_ty.structFieldValueComptime(mod, i)) != null) continue;
3119 const field_ty = struct_type.field_types.get(ip)[field_index].toType();
3120 assert(field_ty.hasRuntimeBitsIgnoreComptime(mod));
3121
3122 const id = try self.resolve(element);
3123 constituents[index] = try self.convertToIndirect(field_ty, id);
3124 index += 1;
3125 }
3126 },
3127 else => unreachable,
3128 }
3129
3130 return try self.constructStruct(result_ty_ref, constituents[0..index]);
3131 },
25123132 .Array => {
25133133 const array_info = result_ty.arrayInfo(mod);
25143134 const n_elems: usize = @intCast(result_ty.arrayLenIncludingSentinel(mod));
25153135 const elem_ids = try self.gpa.alloc(IdRef, n_elems);
25163136 defer self.gpa.free(elem_ids);
25173137
2518 for (elements, 0..) |elem_inst, i| {
2519 const id = try self.resolve(elem_inst);
3138 for (elements, 0..) |element, i| {
3139 const id = try self.resolve(element);
25203140 elem_ids[i] = try self.convertToIndirect(array_info.elem_type, id);
25213141 }
25223142
......@@ -2540,7 +3160,8 @@ pub const DeclGen = struct {
25403160
25413161 fn airSliceElemPtr(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
25423162 const mod = self.module;
2543 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
3163 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
3164 const bin_op = self.air.extraData(Air.Bin, ty_pl.payload).data;
25443165 const slice_ty = self.typeOf(bin_op.lhs);
25453166 if (!slice_ty.isVolatilePtr(mod) and self.liveness.isUnused(inst)) return null;
25463167
......@@ -2593,14 +3214,17 @@ pub const DeclGen = struct {
25933214 const mod = self.module;
25943215 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
25953216 const bin_op = self.air.extraData(Air.Bin, ty_pl.payload).data;
2596 const ptr_ty = self.typeOf(bin_op.lhs);
2597 const elem_ty = ptr_ty.childType(mod);
2598 // TODO: Make this return a null ptr or something
2599 if (!elem_ty.hasRuntimeBitsIgnoreComptime(mod)) return null;
2600
3217 const src_ptr_ty = self.typeOf(bin_op.lhs);
3218 const elem_ty = src_ptr_ty.childType(mod);
26013219 const ptr_id = try self.resolve(bin_op.lhs);
3220
3221 if (!elem_ty.hasRuntimeBitsIgnoreComptime(mod)) {
3222 const dst_ptr_ty = self.typeOfIndex(inst);
3223 return try self.bitCast(dst_ptr_ty, src_ptr_ty, ptr_id);
3224 }
3225
26023226 const index_id = try self.resolve(bin_op.rhs);
2603 return try self.ptrElemPtr(ptr_ty, ptr_id, index_id);
3227 return try self.ptrElemPtr(src_ptr_ty, ptr_id, index_id);
26043228 }
26053229
26063230 fn airArrayElemVal(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
......@@ -3101,15 +3725,25 @@ pub const DeclGen = struct {
31013725
31023726 fn airRet(self: *DeclGen, inst: Air.Inst.Index) !void {
31033727 const operand = self.air.instructions.items(.data)[inst].un_op;
3104 const operand_ty = self.typeOf(operand);
3728 const ret_ty = self.typeOf(operand);
31053729 const mod = self.module;
3106 if (operand_ty.hasRuntimeBits(mod)) {
3107 // TODO: If we return an empty struct, this branch is also hit incorrectly.
3108 const operand_id = try self.resolve(operand);
3109 try self.func.body.emit(self.spv.gpa, .OpReturnValue, .{ .value = operand_id });
3110 } else {
3111 try self.func.body.emit(self.spv.gpa, .OpReturn, {});
3730 if (!ret_ty.hasRuntimeBitsIgnoreComptime(mod)) {
3731 const decl = mod.declPtr(self.decl_index);
3732 const fn_info = mod.typeToFunc(decl.ty).?;
3733 if (fn_info.return_type.toType().isError(mod)) {
3734 // Functions with an empty error set are emitted with an error code
3735 // return type and return zero so they can be function pointers coerced
3736 // to functions that return anyerror.
3737 const err_ty_ref = try self.resolveType(Type.anyerror, .direct);
3738 const no_err_id = try self.constInt(err_ty_ref, 0);
3739 return try self.func.body.emit(self.spv.gpa, .OpReturnValue, .{ .value = no_err_id });
3740 } else {
3741 return try self.func.body.emit(self.spv.gpa, .OpReturn, {});
3742 }
31123743 }
3744
3745 const operand_id = try self.resolve(operand);
3746 try self.func.body.emit(self.spv.gpa, .OpReturnValue, .{ .value = operand_id });
31133747 }
31143748
31153749 fn airRetLoad(self: *DeclGen, inst: Air.Inst.Index) !void {
......@@ -3119,8 +3753,18 @@ pub const DeclGen = struct {
31193753 const ret_ty = ptr_ty.childType(mod);
31203754
31213755 if (!ret_ty.hasRuntimeBitsIgnoreComptime(mod)) {
3122 try self.func.body.emit(self.spv.gpa, .OpReturn, {});
3123 return;
3756 const decl = mod.declPtr(self.decl_index);
3757 const fn_info = mod.typeToFunc(decl.ty).?;
3758 if (fn_info.return_type.toType().isError(mod)) {
3759 // Functions with an empty error set are emitted with an error code
3760 // return type and return zero so they can be function pointers coerced
3761 // to functions that return anyerror.
3762 const err_ty_ref = try self.resolveType(Type.anyerror, .direct);
3763 const no_err_id = try self.constInt(err_ty_ref, 0);
3764 return try self.func.body.emit(self.spv.gpa, .OpReturnValue, .{ .value = no_err_id });
3765 } else {
3766 return try self.func.body.emit(self.spv.gpa, .OpReturn, {});
3767 }
31243768 }
31253769
31263770 const ptr = try self.resolve(un_op);
......@@ -3297,31 +3941,26 @@ pub const DeclGen = struct {
32973941 payload_ty;
32983942
32993943 const ptr_id = if (payload_ty.isSlice(mod))
3300 try self.extractField(Type.bool, operand_id, 0)
3944 try self.extractField(ptr_ty, operand_id, 0)
33013945 else
33023946 operand_id;
33033947
33043948 const payload_ty_ref = try self.resolveType(ptr_ty, .direct);
33053949 const null_id = try self.spv.constNull(payload_ty_ref);
3306 const result_id = self.spv.allocId();
3307 const operands = .{
3308 .id_result_type = self.typeId(bool_ty_ref),
3309 .id_result = result_id,
3310 .operand_1 = ptr_id,
3311 .operand_2 = null_id,
3950 const op: std.math.CompareOperator = switch (pred) {
3951 .is_null => .eq,
3952 .is_non_null => .neq,
33123953 };
3313 switch (pred) {
3314 .is_null => try self.func.body.emit(self.spv.gpa, .OpPtrEqual, operands),
3315 .is_non_null => try self.func.body.emit(self.spv.gpa, .OpPtrNotEqual, operands),
3316 }
3317 return result_id;
3954 return try self.cmp(op, ptr_ty, ptr_id, null_id);
33183955 }
33193956
3320 const is_non_null_id = if (optional_ty.hasRuntimeBitsIgnoreComptime(mod))
3957 const is_non_null_id = if (payload_ty.hasRuntimeBitsIgnoreComptime(mod))
33213958 try self.extractField(Type.bool, operand_id, 1)
33223959 else
33233960 // Optional representation is bool indicating whether the optional is set
3324 operand_id;
3961 // Optionals with no payload are represented as an (indirect) bool, so convert
3962 // it back to the direct bool here.
3963 try self.convertToDirect(Type.bool, operand_id);
33253964
33263965 return switch (pred) {
33273966 .is_null => blk: {
......@@ -3400,17 +4039,19 @@ pub const DeclGen = struct {
34004039 const payload_ty = self.typeOf(ty_op.operand);
34014040
34024041 if (!payload_ty.hasRuntimeBitsIgnoreComptime(mod)) {
3403 return try self.constBool(true, .direct);
4042 return try self.constBool(true, .indirect);
34044043 }
34054044
34064045 const operand_id = try self.resolve(ty_op.operand);
4046
34074047 const optional_ty = self.typeOfIndex(inst);
34084048 if (optional_ty.optionalReprIsPayload(mod)) {
34094049 return operand_id;
34104050 }
34114051
34124052 const optional_ty_ref = try self.resolveType(optional_ty, .direct);
3413 const members = [_]IdRef{ operand_id, try self.constBool(true, .indirect) };
4053 const payload_id = try self.convertToIndirect(payload_ty, operand_id);
4054 const members = [_]IdRef{ payload_id, try self.constBool(true, .indirect) };
34144055 return try self.constructStruct(optional_ty_ref, &members);
34154056 }
34164057
......@@ -3437,6 +4078,7 @@ pub const DeclGen = struct {
34374078 };
34384079 break :blk if (backing_bits <= 32) @as(u32, 1) else 2;
34394080 },
4081 .ErrorSet => 1,
34404082 else => return self.todo("implement switch for type {s}", .{@tagName(cond_ty.zigTypeTag(mod))}), // TODO: Figure out which types apply here, and work around them as we can only do integers.
34414083 };
34424084
......@@ -3490,6 +4132,7 @@ pub const DeclGen = struct {
34904132 // TODO: figure out of cond_ty is correct (something with enum literals)
34914133 break :blk (try value.intFromEnum(cond_ty, mod)).toUnsignedInt(mod); // TODO: composite integer constants
34924134 },
4135 .ErrorSet => value.getErrorInt(mod),
34934136 else => unreachable,
34944137 };
34954138 const int_lit: spec.LiteralContextDependentNumber = switch (cond_words) {
......@@ -3533,10 +4176,10 @@ pub const DeclGen = struct {
35334176
35344177 fn airDbgStmt(self: *DeclGen, inst: Air.Inst.Index) !void {
35354178 const dbg_stmt = self.air.instructions.items(.data)[inst].dbg_stmt;
3536 const src_fname_id = try self.spv.resolveSourceFileName(
3537 self.module,
3538 self.module.declPtr(self.decl_index),
3539 );
4179 const mod = self.module;
4180 const decl = mod.declPtr(self.decl_index);
4181 const path = decl.getFileScope(mod).sub_file_path;
4182 const src_fname_id = try self.spv.resolveSourceFileName(path);
35404183 const base_line = self.base_line_stack.getLast();
35414184 try self.func.body.emit(self.spv.gpa, .OpLine, .{
35424185 .file = src_fname_id,
......@@ -3710,7 +4353,7 @@ pub const DeclGen = struct {
37104353 const fn_info = mod.typeToFunc(zig_fn_ty).?;
37114354 const return_type = fn_info.return_type;
37124355
3713 const result_type_id = try self.resolveTypeId(return_type.toType());
4356 const result_type_ref = try self.resolveFnReturnType(return_type.toType());
37144357 const result_id = self.spv.allocId();
37154358 const callee_id = try self.resolve(pl_op.operand);
37164359
......@@ -3722,16 +4365,16 @@ pub const DeclGen = struct {
37224365 // Note: resolve() might emit instructions, so we need to call it
37234366 // before starting to emit OpFunctionCall instructions. Hence the
37244367 // temporary params buffer.
3725 const arg_id = try self.resolve(arg);
37264368 const arg_ty = self.typeOf(arg);
37274369 if (!arg_ty.hasRuntimeBitsIgnoreComptime(mod)) continue;
4370 const arg_id = try self.resolve(arg);
37284371
37294372 params[n_params] = arg_id;
37304373 n_params += 1;
37314374 }
37324375
37334376 try self.func.body.emit(self.spv.gpa, .OpFunctionCall, .{
3734 .id_result_type = result_type_id,
4377 .id_result_type = self.typeId(result_type_ref),
37354378 .id_result = result_id,
37364379 .function = callee_id,
37374380 .id_ref_3 = params[0..n_params],
src/codegen/spirv/Cache.zig+32
......@@ -81,6 +81,9 @@ const Tag = enum {
8181 /// have member names trailing.
8282 /// data is payload to SimpleStructType
8383 type_struct_simple_with_member_names,
84 /// Opaque type.
85 /// data is name string.
86 type_opaque,
8487
8588 // -- Values
8689 /// Value of type u8
......@@ -235,6 +238,7 @@ pub const Key = union(enum) {
235238 function_type: FunctionType,
236239 ptr_type: PointerType,
237240 struct_type: StructType,
241 opaque_type: OpaqueType,
238242
239243 // -- values
240244 int: Int,
......@@ -289,6 +293,10 @@ pub const Key = union(enum) {
289293 }
290294 };
291295
296 pub const OpaqueType = struct {
297 name: String = .none,
298 };
299
292300 pub const Int = struct {
293301 /// The type: any bitness integer.
294302 ty: Ref,
......@@ -427,6 +435,13 @@ pub const Key = union(enum) {
427435 else => unreachable,
428436 };
429437 }
438
439 pub fn isNumericalType(self: Key) bool {
440 return switch (self) {
441 .int_type, .float_type => true,
442 else => false,
443 };
444 }
430445};
431446
432447pub fn deinit(self: *Self, spv: *const Module) void {
......@@ -539,6 +554,13 @@ fn emit(
539554 }
540555 // TODO: Decorations?
541556 },
557 .opaque_type => |opaque_type| {
558 const name = if (self.getString(opaque_type.name)) |name| name else "";
559 try section.emit(spv.gpa, .OpTypeOpaque, .{
560 .id_result = result_id,
561 .literal_string = name,
562 });
563 },
542564 .int => |int| {
543565 const int_type = self.lookup(int.ty).int_type;
544566 const ty_id = self.resultId(int.ty);
......@@ -697,6 +719,11 @@ pub fn resolve(self: *Self, spv: *Module, key: Key) !Ref {
697719 };
698720 }
699721 },
722 .opaque_type => |opaque_type| Item{
723 .tag = .type_opaque,
724 .result_id = result_id,
725 .data = @intFromEnum(opaque_type.name),
726 },
700727 .int => |int| blk: {
701728 const int_type = self.lookup(int.ty).int_type;
702729 if (int_type.signedness == .unsigned and int_type.bits == 8) {
......@@ -874,6 +901,11 @@ pub fn lookup(self: *const Self, ref: Ref) Key {
874901 },
875902 };
876903 },
904 .type_opaque => .{
905 .opaque_type = .{
906 .name = @as(String, @enumFromInt(data)),
907 },
908 },
877909 .float16 => .{ .float = .{
878910 .ty = self.get(.{ .float_type = .{ .bits = 16 } }),
879911 .value = .{ .float16 = @as(f16, @bitCast(@as(u16, @intCast(data)))) },
src/codegen/spirv/Module.zig+21-22
......@@ -11,9 +11,6 @@ const std = @import("std");
1111const Allocator = std.mem.Allocator;
1212const assert = std.debug.assert;
1313
14const ZigModule = @import("../../Module.zig");
15const ZigDecl = ZigModule.Decl;
16
1714const spec = @import("spec.zig");
1815const Word = spec.Word;
1916const IdRef = spec.IdRef;
......@@ -103,15 +100,12 @@ pub const EntryPoint = struct {
103100 /// The declaration that should be exported.
104101 decl_index: Decl.Index,
105102 /// The name of the kernel to be exported.
106 name: []const u8,
103 name: CacheString,
107104};
108105
109106/// A general-purpose allocator which may be used to allocate resources for this module
110107gpa: Allocator,
111108
112/// An arena allocator used to store things that have the same lifetime as this module.
113arena: Allocator,
114
115109/// Module layout, according to SPIR-V Spec section 2.4, "Logical Layout of a Module".
116110sections: struct {
117111 /// Capability instructions
......@@ -150,7 +144,7 @@ next_result_id: Word,
150144/// Cache for results of OpString instructions for module file names fed to OpSource.
151145/// Since OpString is pretty much only used for those, we don't need to keep track of all strings,
152146/// just the ones for OpLine. Note that OpLine needs the result of OpString, and not that of OpSource.
153source_file_names: std.StringHashMapUnmanaged(IdRef) = .{},
147source_file_names: std.AutoArrayHashMapUnmanaged(CacheString, IdRef) = .{},
154148
155149/// SPIR-V type- and constant cache. This structure is used to store information about these in a more
156150/// efficient manner.
......@@ -176,10 +170,9 @@ globals: struct {
176170 section: Section = .{},
177171} = .{},
178172
179pub fn init(gpa: Allocator, arena: Allocator) Module {
173pub fn init(gpa: Allocator) Module {
180174 return .{
181175 .gpa = gpa,
182 .arena = arena,
183176 .next_result_id = 1, // 0 is an invalid SPIR-V result id, so start counting at 1.
184177 };
185178}
......@@ -321,7 +314,7 @@ fn entryPoints(self: *Module) !Section {
321314 try entry_points.emit(self.gpa, .OpEntryPoint, .{
322315 .execution_model = .Kernel,
323316 .entry_point = entry_point_id,
324 .name = entry_point.name,
317 .name = self.cache.getString(entry_point.name).?,
325318 .interface = interface.items,
326319 });
327320 }
......@@ -422,6 +415,18 @@ pub fn flush(self: *Module, file: std.fs.File) !void {
422415 0, // Schema (currently reserved for future use)
423416 };
424417
418 var source = Section{};
419 defer source.deinit(self.gpa);
420 try self.sections.debug_strings.emit(self.gpa, .OpSource, .{
421 .source_language = .Unknown,
422 .version = 0,
423 // We cannot emit these because the Khronos translator does not parse this instruction
424 // correctly.
425 // See https://github.com/KhronosGroup/SPIRV-LLVM-Translator/issues/2188
426 .file = null,
427 .source = null,
428 });
429
425430 // Note: needs to be kept in order according to section 2.3!
426431 const buffers = &[_][]const Word{
427432 &header,
......@@ -429,6 +434,7 @@ pub fn flush(self: *Module, file: std.fs.File) !void {
429434 self.sections.extensions.toWords(),
430435 entry_points.toWords(),
431436 self.sections.execution_modes.toWords(),
437 source.toWords(),
432438 self.sections.debug_strings.toWords(),
433439 self.sections.debug_names.toWords(),
434440 self.sections.annotations.toWords(),
......@@ -464,9 +470,9 @@ pub fn addFunction(self: *Module, decl_index: Decl.Index, func: Fn) !void {
464470/// Fetch the result-id of an OpString instruction that encodes the path of the source
465471/// file of the decl. This function may also emit an OpSource with source-level information regarding
466472/// the decl.
467pub fn resolveSourceFileName(self: *Module, zig_module: *ZigModule, zig_decl: *ZigDecl) !IdRef {
468 const path = zig_decl.getFileScope(zig_module).sub_file_path;
469 const result = try self.source_file_names.getOrPut(self.gpa, path);
473pub fn resolveSourceFileName(self: *Module, path: []const u8) !IdRef {
474 const path_ref = try self.resolveString(path);
475 const result = try self.source_file_names.getOrPut(self.gpa, path_ref);
470476 if (!result.found_existing) {
471477 const file_result_id = self.allocId();
472478 result.value_ptr.* = file_result_id;
......@@ -474,13 +480,6 @@ pub fn resolveSourceFileName(self: *Module, zig_module: *ZigModule, zig_decl: *Z
474480 .id_result = file_result_id,
475481 .string = path,
476482 });
477
478 try self.sections.debug_strings.emit(self.gpa, .OpSource, .{
479 .source_language = .Unknown, // TODO: Register Zig source language.
480 .version = 0, // TODO: Zig version as u32?
481 .file = file_result_id,
482 .source = null, // TODO: Store actual source also?
483 });
484483 }
485484
486485 return result.value_ptr.*;
......@@ -641,7 +640,7 @@ pub fn endGlobal(self: *Module, global_index: Decl.Index, begin_inst: u32, resul
641640pub fn declareEntryPoint(self: *Module, decl_index: Decl.Index, name: []const u8) !void {
642641 try self.entry_points.append(self.gpa, .{
643642 .decl_index = decl_index,
644 .name = try self.arena.dupe(u8, name),
643 .name = try self.resolveString(name),
645644 });
646645}
647646
src/link/SpirV.zig+18-37
......@@ -45,9 +45,7 @@ const IdResult = spec.IdResult;
4545
4646base: link.File,
4747
48spv: SpvModule,
49spv_arena: ArenaAllocator,
50decl_link: codegen.DeclLinkMap,
48object: codegen.Object,
5149
5250pub fn createEmpty(gpa: Allocator, options: link.Options) !*SpirV {
5351 const self = try gpa.create(SpirV);
......@@ -58,11 +56,8 @@ pub fn createEmpty(gpa: Allocator, options: link.Options) !*SpirV {
5856 .file = null,
5957 .allocator = gpa,
6058 },
61 .spv = undefined,
62 .spv_arena = ArenaAllocator.init(gpa),
63 .decl_link = codegen.DeclLinkMap.init(self.base.allocator),
59 .object = codegen.Object.init(gpa),
6460 };
65 self.spv = SpvModule.init(gpa, self.spv_arena.allocator());
6661 errdefer self.deinit();
6762
6863 // TODO: Figure out where to put all of these
......@@ -99,9 +94,7 @@ pub fn openPath(allocator: Allocator, sub_path: []const u8, options: link.Option
9994}
10095
10196pub fn deinit(self: *SpirV) void {
102 self.spv.deinit();
103 self.spv_arena.deinit();
104 self.decl_link.deinit();
97 self.object.deinit();
10598}
10699
107100pub fn updateFunc(self: *SpirV, module: *Module, func_index: InternPool.Index, air: Air, liveness: Liveness) !void {
......@@ -113,12 +106,7 @@ pub fn updateFunc(self: *SpirV, module: *Module, func_index: InternPool.Index, a
113106 const decl = module.declPtr(func.owner_decl);
114107 log.debug("lowering function {s}", .{module.intern_pool.stringToSlice(decl.name)});
115108
116 var decl_gen = codegen.DeclGen.init(self.base.allocator, module, &self.spv, &self.decl_link);
117 defer decl_gen.deinit();
118
119 if (try decl_gen.gen(func.owner_decl, air, liveness)) |msg| {
120 try module.failed_decls.put(module.gpa, func.owner_decl, msg);
121 }
109 try self.object.updateFunc(module, func_index, air, liveness);
122110}
123111
124112pub fn updateDecl(self: *SpirV, module: *Module, decl_index: Module.Decl.Index) !void {
......@@ -129,12 +117,7 @@ pub fn updateDecl(self: *SpirV, module: *Module, decl_index: Module.Decl.Index)
129117 const decl = module.declPtr(decl_index);
130118 log.debug("lowering declaration {s}", .{module.intern_pool.stringToSlice(decl.name)});
131119
132 var decl_gen = codegen.DeclGen.init(self.base.allocator, module, &self.spv, &self.decl_link);
133 defer decl_gen.deinit();
134
135 if (try decl_gen.gen(decl_index, undefined, undefined)) |msg| {
136 try module.failed_decls.put(module.gpa, decl_index, msg);
137 }
120 try self.object.updateDecl(module, decl_index);
138121}
139122
140123pub fn updateDeclExports(
......@@ -145,15 +128,9 @@ pub fn updateDeclExports(
145128) !void {
146129 const decl = mod.declPtr(decl_index);
147130 if (decl.val.isFuncBody(mod) and decl.ty.fnCallingConvention(mod) == .Kernel) {
148 // TODO: Unify with resolveDecl in spirv.zig.
149 const entry = try self.decl_link.getOrPut(decl_index);
150 if (!entry.found_existing) {
151 entry.value_ptr.* = try self.spv.allocDecl(.func);
152 }
153 const spv_decl_index = entry.value_ptr.*;
154
131 const spv_decl_index = try self.object.resolveDecl(mod, decl_index);
155132 for (exports) |exp| {
156 try self.spv.declareEntryPoint(spv_decl_index, mod.intern_pool.stringToSlice(exp.opts.name));
133 try self.object.spv.declareEntryPoint(spv_decl_index, mod.intern_pool.stringToSlice(exp.opts.name));
157134 }
158135 }
159136
......@@ -185,15 +162,19 @@ pub fn flushModule(self: *SpirV, comp: *Compilation, prog_node: *std.Progress.No
185162 sub_prog_node.activate();
186163 defer sub_prog_node.end();
187164
165 const spv = &self.object.spv;
166
188167 const target = comp.getTarget();
189 try writeCapabilities(&self.spv, target);
190 try writeMemoryModel(&self.spv, target);
168 try writeCapabilities(spv, target);
169 try writeMemoryModel(spv, target);
191170
192171 // We need to export the list of error names somewhere so that we can pretty-print them in the
193172 // executor. This is not really an important thing though, so we can just dump it in any old
194173 // nonsemantic instruction. For now, just put it in OpSourceExtension with a special name.
195174
196 var error_info = std.ArrayList(u8).init(self.spv.arena);
175 var error_info = std.ArrayList(u8).init(self.object.gpa);
176 defer error_info.deinit();
177
197178 try error_info.appendSlice("zig_errors");
198179 const module = self.base.options.module.?;
199180 for (module.global_error_set.keys()) |name_nts| {
......@@ -207,17 +188,17 @@ pub fn flushModule(self: *SpirV, comp: *Compilation, prog_node: *std.Progress.No
207188 defer self.base.allocator.free(escaped_name);
208189 try error_info.writer().print(":{s}", .{escaped_name});
209190 }
210 try self.spv.sections.debug_strings.emit(self.spv.gpa, .OpSourceExtension, .{
191 try spv.sections.debug_strings.emit(spv.gpa, .OpSourceExtension, .{
211192 .extension = error_info.items,
212193 });
213194
214 try self.spv.flush(self.base.file.?);
195 try spv.flush(self.base.file.?);
215196}
216197
217198fn writeCapabilities(spv: *SpvModule, target: std.Target) !void {
218199 // TODO: Integrate with a hypothetical feature system
219200 const caps: []const spec.Capability = switch (target.os.tag) {
220 .opencl => &.{ .Kernel, .Addresses, .Int8, .Int16, .Int64, .Float64, .GenericPointer },
201 .opencl => &.{ .Kernel, .Addresses, .Int8, .Int16, .Int64, .Float64, .Float16, .GenericPointer },
221202 .glsl450 => &.{.Shader},
222203 .vulkan => &.{.Shader},
223204 else => unreachable, // TODO
......@@ -249,7 +230,7 @@ fn writeMemoryModel(spv: *SpvModule, target: std.Target) !void {
249230 };
250231
251232 // TODO: Put this in a proper section.
252 try spv.sections.capabilities.emit(spv.gpa, .OpMemoryModel, .{
233 try spv.sections.extensions.emit(spv.gpa, .OpMemoryModel, .{
253234 .addressing_model = addressing_model,
254235 .memory_model = memory_model,
255236 });
test/behavior/abs.zig-1
......@@ -48,7 +48,6 @@ test "@abs unsigned integers" {
4848 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
4949 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
5050 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
51 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
5251
5352 try comptime testAbsUnsignedIntegers();
5453 try testAbsUnsignedIntegers();
test/behavior/align.zig-7
......@@ -18,7 +18,6 @@ test "global variable alignment" {
1818test "slicing array of length 1 can not assume runtime index is always zero" {
1919 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2020 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
21 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2221
2322 var runtime_index: usize = 1;
2423 const slice = @as(*align(4) [1]u8, &foo)[runtime_index..];
......@@ -226,7 +225,6 @@ fn fnWithAlignedStack() i32 {
226225test "implicitly decreasing slice alignment" {
227226 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
228227 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
229 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
230228
231229 const a: u32 align(4) = 3;
232230 const b: u32 align(8) = 4;
......@@ -396,7 +394,6 @@ test "function align expression depends on generic parameter" {
396394
397395test "function callconv expression depends on generic parameter" {
398396 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
399 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
400397
401398 const S = struct {
402399 fn doTheTest() !void {
......@@ -414,7 +411,6 @@ test "function callconv expression depends on generic parameter" {
414411
415412test "runtime-known array index has best alignment possible" {
416413 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
417 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
418414
419415 // take full advantage of over-alignment
420416 var array align(4) = [_]u8{ 1, 2, 3, 4 };
......@@ -546,7 +542,6 @@ test "align(N) on functions" {
546542 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
547543 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
548544 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
549 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
550545
551546 if (builtin.zig_backend == .stage2_c) {
552547 // https://github.com/ziglang/zig/issues/16845
......@@ -585,7 +580,6 @@ test "comptime alloc alignment" {
585580test "@alignCast null" {
586581 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
587582 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
588 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
589583
590584 var ptr: ?*anyopaque = null;
591585 const aligned: ?*anyopaque = @alignCast(ptr);
......@@ -601,7 +595,6 @@ test "sub-aligned pointer field access" {
601595 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
602596 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
603597 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
604 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
605598 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
606599
607600 // Originally reported at https://github.com/ziglang/zig/issues/14904
test/behavior/array.zig-6
......@@ -72,7 +72,6 @@ test "array concat with tuple" {
7272 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
7373 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
7474 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
75 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
7675
7776 const array: [2]u8 = .{ 1, 2 };
7877 {
......@@ -261,7 +260,6 @@ fn doSomeMangling(array: *[4]u8) void {
261260
262261test "implicit cast zero sized array ptr to slice" {
263262 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
264 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
265263
266264 {
267265 var b = "".*;
......@@ -299,7 +297,6 @@ const Str = struct { a: []Sub };
299297test "set global var array via slice embedded in struct" {
300298 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
301299 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
302 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
303300
304301 var s = Str{ .a = s_array[0..] };
305302
......@@ -569,7 +566,6 @@ test "type coercion of anon struct literal to array" {
569566 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
570567 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
571568 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
572 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
573569
574570 const S = struct {
575571 const U = union {
......@@ -652,7 +648,6 @@ test "array init of container level array variable" {
652648 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
653649 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
654650 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
655 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
656651
657652 const S = struct {
658653 var pair: [2]usize = .{ 1, 2 };
......@@ -732,7 +727,6 @@ test "slicing array of zero-sized values" {
732727 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
733728 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
734729 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
735 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
736730
737731 var arr: [32]u0 = undefined;
738732 for (arr[0..]) |*zero|
test/behavior/basic.zig-13
......@@ -357,8 +357,6 @@ fn f2(x: bool) []const u8 {
357357}
358358
359359test "variable is allowed to be a pointer to an opaque type" {
360 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
361
362360 var x: i32 = 1234;
363361 _ = hereIsAnOpaqueType(@as(*OpaqueA, @ptrCast(&x)));
364362}
......@@ -380,8 +378,6 @@ fn testTakeAddressOfParameter(f: f32) !void {
380378}
381379
382380test "pointer to void return type" {
383 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
384
385381 try testPointerToVoidReturnType();
386382}
387383fn testPointerToVoidReturnType() anyerror!void {
......@@ -397,7 +393,6 @@ test "array 2D const double ptr" {
397393 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
398394 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
399395 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
400 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
401396
402397 const rect_2d_vertexes = [_][1]f32{
403398 [_]f32{1.0},
......@@ -410,7 +405,6 @@ test "array 2D const double ptr with offset" {
410405 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
411406 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
412407 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
413 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
414408
415409 const rect_2d_vertexes = [_][2]f32{
416410 [_]f32{ 3.0, 4.239 },
......@@ -423,7 +417,6 @@ test "array 3D const double ptr with offset" {
423417 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
424418 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
425419 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
426 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
427420
428421 const rect_3d_vertexes = [_][2][2]f32{
429422 [_][2]f32{
......@@ -478,7 +471,6 @@ fn testStructInFn() !void {
478471
479472test "fn call returning scalar optional in equality expression" {
480473 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
481 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
482474 try expect(getNull() == null);
483475}
484476
......@@ -489,7 +481,6 @@ fn getNull() ?*i32 {
489481test "global variable assignment with optional unwrapping with var initialized to undefined" {
490482 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
491483 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
492 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
493484
494485 const S = struct {
495486 var data: i32 = 1234;
......@@ -578,8 +569,6 @@ test "comptime cast fn to ptr" {
578569}
579570
580571test "equality compare fn ptrs" {
581 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
582
583572 var a = &emptyFn;
584573 try expect(a == a);
585574}
......@@ -649,7 +638,6 @@ test "string escapes" {
649638 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
650639 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
651640 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
652 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
653641
654642 try expectEqualStrings("\"", "\x22");
655643 try expectEqualStrings("\'", "\x27");
......@@ -846,7 +834,6 @@ test "labeled block implicitly ends in a break" {
846834test "catch in block has correct result location" {
847835 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
848836 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
849 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
850837
851838 const S = struct {
852839 fn open() error{A}!@This() {
test/behavior/bitcast.zig-8
......@@ -149,8 +149,6 @@ test "bitcast literal [4]u8 param to u32" {
149149}
150150
151151test "bitcast generates a temporary value" {
152 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
153
154152 var y = @as(u16, 0x55AA);
155153 const x = @as(u16, @bitCast(@as([2]u8, @bitCast(y))));
156154 try expect(y == x);
......@@ -186,7 +184,6 @@ test "@bitCast packed structs at runtime and comptime" {
186184test "@bitCast extern structs at runtime and comptime" {
187185 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
188186 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
189 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
190187
191188 const Full = extern struct {
192189 number: u16,
......@@ -241,7 +238,6 @@ test "bitcast packed struct to integer and back" {
241238test "implicit cast to error union by returning" {
242239 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
243240 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
244 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
245241
246242 const S = struct {
247243 fn entry() !void {
......@@ -271,8 +267,6 @@ test "comptime bitcast used in expression has the correct type" {
271267}
272268
273269test "bitcast passed as tuple element" {
274 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
275
276270 const S = struct {
277271 fn foo(args: anytype) !void {
278272 try comptime expect(@TypeOf(args[0]) == f32);
......@@ -283,8 +277,6 @@ test "bitcast passed as tuple element" {
283277}
284278
285279test "triple level result location with bitcast sandwich passed as tuple element" {
286 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
287
288280 const S = struct {
289281 fn foo(args: anytype) !void {
290282 try comptime expect(@TypeOf(args[0]) == f64);
test/behavior/bugs/10684.zig-1
......@@ -6,7 +6,6 @@ test "slicing slices" {
66 if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO
77 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
88 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
9 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
109
1110 const foo = "1234";
1211 const bar = foo[0..4];
test/behavior/bugs/1076.zig-1
......@@ -6,7 +6,6 @@ const expect = std.testing.expect;
66test "comptime code should not modify constant data" {
77 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
88 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
9 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
109
1110 try testCastPtrOfArrayToSliceAndPtr();
1211 try comptime testCastPtrOfArrayToSliceAndPtr();
test/behavior/bugs/11046.zig-1
......@@ -13,7 +13,6 @@ test "fixed" {
1313 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1414 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1515 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
16 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1716
1817 bar() catch |err| switch (err) {
1918 error.Foo => {}, // error: expected (inferred error set of bar), found error{Foo}
test/behavior/bugs/11139.zig-1
......@@ -6,7 +6,6 @@ test "store array of array of structs at comptime" {
66 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
77 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
88 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
9 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
109
1110 try expect(storeArrayOfArrayOfStructs() == 15);
1211 try comptime expect(storeArrayOfArrayOfStructs() == 15);
test/behavior/bugs/11213.zig-2
......@@ -3,8 +3,6 @@ const builtin = @import("builtin");
33const testing = std.testing;
44
55test {
6 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
7
86 const g: error{Test}!void = error.Test;
97
108 var v: u32 = 0;
test/behavior/bugs/11995.zig-1
......@@ -20,7 +20,6 @@ test {
2020 if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO
2121 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2222 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
23 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2423
2524 var string: [5]u8 = "hello".*;
2625 const arg_data = wuffs_base__slice_u8{ .ptr = @as([*c]u8, @ptrCast(&string)), .len = string.len };
test/behavior/bugs/12092.zig-1
......@@ -17,7 +17,6 @@ test {
1717 if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO
1818 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1919 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
20 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2120
2221 var baz: u32 = 24;
2322 try takeFoo(&.{
test/behavior/bugs/12142.zig-1
......@@ -22,7 +22,6 @@ test {
2222 if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO
2323 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2424 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
25 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2625
2726 const test_struct = Test{
2827 .holders = &.{
test/behavior/bugs/12551.zig-1
......@@ -4,7 +4,6 @@ const builtin = @import("builtin");
44test {
55 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
66 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
7 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
87
98 try std.testing.expect(for ([1]u8{0}) |x| {
109 if (x == 0) break true;
test/behavior/bugs/12644.zig-2
......@@ -10,8 +10,6 @@ fn main0() !void {
1010}
1111
1212test "issue12644" {
13 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
14
1513 main0() catch |e| {
1614 try std.testing.expect(e == error.AnError);
1715 };
test/behavior/bugs/12890.zig-1
......@@ -11,7 +11,6 @@ fn a(b: []u3, c: u3) void {
1111test {
1212 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1313 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
14 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1514
1615 var arr: [8]u3 = undefined;
1716 a(&arr, 5);
test/behavior/bugs/12891.zig-6
......@@ -29,7 +29,6 @@ test "inf >= 1" {
2929test "isNan(nan * 1)" {
3030 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
3131 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
32 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
3332
3433 const nan_times_one = comptime std.math.nan(f64) * 1;
3534 try std.testing.expect(std.math.isNan(nan_times_one));
......@@ -37,7 +36,6 @@ test "isNan(nan * 1)" {
3736test "runtime isNan(nan * 1)" {
3837 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
3938 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
40 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
4139
4240 const nan_times_one = std.math.nan(f64) * 1;
4341 try std.testing.expect(std.math.isNan(nan_times_one));
......@@ -45,7 +43,6 @@ test "runtime isNan(nan * 1)" {
4543test "isNan(nan * 0)" {
4644 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
4745 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
48 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
4946
5047 const nan_times_zero = comptime std.math.nan(f64) * 0;
5148 try std.testing.expect(std.math.isNan(nan_times_zero));
......@@ -55,7 +52,6 @@ test "isNan(nan * 0)" {
5552test "isNan(inf * 0)" {
5653 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
5754 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
58 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
5955
6056 const inf_times_zero = comptime std.math.inf(f64) * 0;
6157 try std.testing.expect(std.math.isNan(inf_times_zero));
......@@ -65,7 +61,6 @@ test "isNan(inf * 0)" {
6561test "runtime isNan(nan * 0)" {
6662 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
6763 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
68 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
6964
7065 const nan_times_zero = std.math.nan(f64) * 0;
7166 try std.testing.expect(std.math.isNan(nan_times_zero));
......@@ -75,7 +70,6 @@ test "runtime isNan(nan * 0)" {
7570test "runtime isNan(inf * 0)" {
7671 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
7772 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
78 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
7973
8074 const inf_times_zero = std.math.inf(f64) * 0;
8175 try std.testing.expect(std.math.isNan(inf_times_zero));
test/behavior/bugs/12972.zig-1
......@@ -6,7 +6,6 @@ test {
66 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
77 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
88 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
9 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
109
1110 const c: u8 = 42;
1211 f(&[_:null]?u8{c});
test/behavior/bugs/13064.zig-1
......@@ -6,7 +6,6 @@ test {
66 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
77 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
88 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
9 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
109
1110 var x: [10][10]u32 = undefined;
1211
test/behavior/bugs/13065.zig-1
......@@ -11,7 +11,6 @@ test {
1111 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1212 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1313 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
14 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1514
1615 var x = U{ .array = undefined };
1716
test/behavior/bugs/13366.zig-1
......@@ -16,7 +16,6 @@ test {
1616 if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO
1717 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1818 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
19 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2019
2120 var a: u32 = 16;
2221 var reason = .{ .c_import = .{ .a = a } };
test/behavior/bugs/1381.zig-1
......@@ -15,7 +15,6 @@ test "union that needs padding bytes inside an array" {
1515 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1616 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
1717 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
18 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1918
2019 var as = [_]A{
2120 A{ .B = B{ .D = 1 } },
test/behavior/bugs/1442.zig-1
......@@ -10,7 +10,6 @@ test "const error union field alignment" {
1010 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
1111 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1212 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
13 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1413
1514 var union_or_err: anyerror!Union = Union{ .Color = 1234 };
1615 try std.testing.expect((union_or_err catch unreachable).Color == 1234);
test/behavior/bugs/1607.zig-1
......@@ -14,7 +14,6 @@ test "slices pointing at the same address as global array." {
1414 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
1515 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1616 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
17 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1817
1918 try checkAddress(&a);
2019 try comptime checkAddress(&a);
test/behavior/bugs/1741.zig+1-1
......@@ -4,7 +4,7 @@ const builtin = @import("builtin");
44test "fixed" {
55 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
66 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
7 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
7 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // flaky
88
99 const x: f32 align(128) = 12.34;
1010 try std.testing.expect(@intFromPtr(&x) % 128 == 0);
test/behavior/bugs/2346.zig+2
......@@ -1,3 +1,5 @@
1const builtin = @import("builtin");
2
13test "fixed" {
24 const a: *void = undefined;
35 const b: *[1]void = a;
test/behavior/bugs/2578.zig-1
......@@ -15,7 +15,6 @@ test "fixed" {
1515 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1616 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1717 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
18 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1918
2019 bar(t);
2120}
test/behavior/bugs/2692.zig-1
......@@ -7,7 +7,6 @@ fn foo(a: []u8) void {
77test "address of 0 length array" {
88 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
99 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
10 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1110
1211 var pt: [0]u8 = undefined;
1312 foo(&pt);
test/behavior/bugs/3046.zig-1
......@@ -16,7 +16,6 @@ test "fixed" {
1616 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
1717 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1818 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
19 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2019
2120 some_struct = SomeStruct{
2221 .field = couldFail() catch @as(i32, 0),
test/behavior/bugs/3367.zig-2
......@@ -10,8 +10,6 @@ const Mixin = struct {
1010};
1111
1212test "container member access usingnamespace decls" {
13 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
14
1513 var foo = Foo{};
1614 foo.two();
1715}
test/behavior/bugs/3742.zig-1
......@@ -40,7 +40,6 @@ test "fixed" {
4040 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
4141 if (builtin.zig_backend == .stage2_llvm and
4242 builtin.cpu.arch == .aarch64 and builtin.os.tag == .windows) return error.SkipZigTest;
43 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
4443
4544 ArgSerializer.serializeCommand(GET.init("banana"));
4645}
test/behavior/bugs/3779.zig-3
......@@ -34,7 +34,6 @@ const ptr_type_name: [*:0]const u8 = type_name;
3434test "@typeName() returns a string literal" {
3535 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
3636 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
37 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
3837
3938 try std.testing.expect(*const [type_name.len:0]u8 == @TypeOf(type_name));
4039 try std.testing.expect(std.mem.eql(u8, "behavior.bugs.3779.TestType", type_name));
......@@ -48,7 +47,6 @@ const expected_contents = "hello zig\n";
4847test "@embedFile() returns a string literal" {
4948 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
5049 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
51 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
5250
5351 try std.testing.expect(*const [expected_contents.len:0]u8 == @TypeOf(actual_contents));
5452 try std.testing.expect(std.mem.eql(u8, expected_contents, actual_contents));
......@@ -63,7 +61,6 @@ fn testFnForSrc() std.builtin.SourceLocation {
6361test "@src() returns a struct containing 0-terminated string slices" {
6462 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
6563 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
66 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
6764
6865 const src = testFnForSrc();
6966 try std.testing.expect([:0]const u8 == @TypeOf(src.file));
test/behavior/bugs/5487.zig-1
......@@ -13,6 +13,5 @@ test "crash" {
1313 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
1414 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1515 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
16 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1716 _ = io.multiWriter(.{writer()});
1817}
test/behavior/bugs/6905.zig-1
......@@ -5,7 +5,6 @@ test "sentinel-terminated 0-length slices" {
55 if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO
66 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
77 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
8 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
98
109 var u32s: [4]u32 = [_]u32{ 0, 1, 2, 3 };
1110
test/behavior/bugs/726.zig-2
......@@ -5,7 +5,6 @@ test "@ptrCast from const to nullable" {
55 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
66 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
77 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
8 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
98
109 const c: u8 = 4;
1110 var x: ?*const u8 = @as(?*const u8, @ptrCast(&c));
......@@ -16,7 +15,6 @@ test "@ptrCast from var in empty struct to nullable" {
1615 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
1716 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1817 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
19 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2018
2119 const container = struct {
2220 var c: u8 = 4;
test/behavior/bugs/8646.zig-1
......@@ -10,7 +10,6 @@ test {
1010 if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO
1111 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1212 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1413
1514 try std.testing.expect(array[0].len == 1);
1615 try std.testing.expectEqualStrings("hello", array[0][0]);
test/behavior/call.zig-6
......@@ -90,7 +90,6 @@ test "result location of function call argument through runtime condition and st
9090 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
9191 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
9292 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
93 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
9493
9594 const E = enum { a, b };
9695 const S = struct {
......@@ -400,7 +399,6 @@ test "recursive inline call with comptime known argument" {
400399test "inline while with @call" {
401400 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
402401 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
403 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
404402
405403 const S = struct {
406404 fn inc(a: *u32) void {
......@@ -416,8 +414,6 @@ test "inline while with @call" {
416414}
417415
418416test "method call as parameter type" {
419 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
420
421417 const S = struct {
422418 fn foo(x: anytype, y: @TypeOf(x).Inner()) @TypeOf(y) {
423419 return y;
......@@ -436,7 +432,6 @@ test "non-anytype generic parameters provide result type" {
436432 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
437433 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
438434 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
439 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
440435
441436 const S = struct {
442437 fn f(comptime T: type, y: T) !void {
......@@ -467,7 +462,6 @@ test "argument to generic function has correct result type" {
467462 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
468463 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
469464 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
470 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
471465
472466 const S = struct {
473467 fn foo(_: anytype, e: enum { a, b }) bool {
test/behavior/cast.zig+3-55
......@@ -67,6 +67,8 @@ test "implicit cast comptime_int to comptime_float" {
6767}
6868
6969test "comptime_int @floatFromInt" {
70 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
71
7072 {
7173 const result = @as(f16, @floatFromInt(1234));
7274 try expect(@TypeOf(result) == f16);
......@@ -179,7 +181,6 @@ fn expectIntFromFloat(comptime F: type, f: F, comptime I: type, i: I) !void {
179181test "implicitly cast indirect pointer to maybe-indirect pointer" {
180182 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
181183 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
182 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
183184
184185 const S = struct {
185186 const Self = @This();
......@@ -240,7 +241,6 @@ test "coerce undefined to optional" {
240241 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
241242 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
242243 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
243 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
244244
245245 try expect(MakeType(void).getNull() == null);
246246 try expect(MakeType(void).getNonNull() != null);
......@@ -261,7 +261,6 @@ fn MakeType(comptime T: type) type {
261261test "implicit cast from *[N]T to [*c]T" {
262262 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
263263 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
264 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
265264
266265 var x: [4]u16 = [4]u16{ 0, 1, 2, 3 };
267266 var y: [*c]u16 = &x;
......@@ -273,8 +272,6 @@ test "implicit cast from *[N]T to [*c]T" {
273272}
274273
275274test "*usize to *void" {
276 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
277
278275 var i = @as(usize, 0);
279276 var v = @as(*void, @ptrCast(&i));
280277 v.* = {};
......@@ -390,7 +387,6 @@ test "cast from ?[*]T to ??[*]T" {
390387test "peer type unsigned int to signed" {
391388 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
392389 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
393 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
394390
395391 var w: u31 = 5;
396392 var x: u8 = 7;
......@@ -469,7 +465,6 @@ fn castToOptionalTypeError(z: i32) !void {
469465test "implicitly cast from [0]T to anyerror![]T" {
470466 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
471467 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
472 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
473468
474469 try testCastZeroArrayToErrSliceMut();
475470 try comptime testCastZeroArrayToErrSliceMut();
......@@ -487,7 +482,6 @@ test "peer type resolution: [0]u8, []const u8, and anyerror![]u8" {
487482 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
488483 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
489484 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
490 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
491485
492486 const S = struct {
493487 fn doTheTest() anyerror!void {
......@@ -568,7 +562,6 @@ fn testPeerErrorAndArray2(x: u8) anyerror![]const u8 {
568562test "single-item pointer of array to slice to unknown length pointer" {
569563 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
570564 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
571 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
572565
573566 try testCastPtrOfArrayToSliceAndPtr();
574567 try comptime testCastPtrOfArrayToSliceAndPtr();
......@@ -598,7 +591,6 @@ fn testCastPtrOfArrayToSliceAndPtr() !void {
598591test "cast *[1][*]const u8 to [*]const ?[*]const u8" {
599592 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
600593 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
601 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
602594
603595 const window_name = [1][*]const u8{"window name"};
604596 const x: [*]const ?[*]const u8 = &window_name;
......@@ -653,7 +645,6 @@ test "@floatCast cast down" {
653645 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
654646 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
655647 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
656 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
657648
658649 {
659650 var double: f64 = 0.001534;
......@@ -670,7 +661,6 @@ test "@floatCast cast down" {
670661test "peer type resolution: unreachable, error set, unreachable" {
671662 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
672663 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
673 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
674664
675665 const Error = error{
676666 FileDescriptorAlreadyPresentInSet,
......@@ -829,7 +819,6 @@ test "peer cast *[0]T to E![]const T" {
829819 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
830820 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
831821 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
832 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
833822
834823 var buffer: [5]u8 = "abcde".*;
835824 var buf: anyerror![]const u8 = buffer[0..];
......@@ -844,7 +833,6 @@ test "peer cast *[0]T to []const T" {
844833 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
845834 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
846835 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
847 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
848836
849837 var buffer: [5]u8 = "abcde".*;
850838 var buf: []const u8 = buffer[0..];
......@@ -866,7 +854,6 @@ test "peer resolution of string literals" {
866854 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
867855 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
868856 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
869 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
870857
871858 const S = struct {
872859 const E = enum { a, b, c, d };
......@@ -888,7 +875,6 @@ test "peer resolution of string literals" {
888875test "peer cast [:x]T to []T" {
889876 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
890877 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
891 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
892878
893879 const S = struct {
894880 fn doTheTest() !void {
......@@ -905,7 +891,6 @@ test "peer cast [:x]T to []T" {
905891test "peer cast [N:x]T to [N]T" {
906892 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
907893 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
908 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
909894
910895 const S = struct {
911896 fn doTheTest() !void {
......@@ -1102,7 +1087,6 @@ test "implicit cast from [*]T to ?*anyopaque" {
11021087 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
11031088 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
11041089 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1105 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
11061090
11071091 var a = [_]u8{ 3, 2, 1 };
11081092 var runtime_zero: usize = 0;
......@@ -1165,7 +1149,6 @@ test "implicit ptr to *anyopaque" {
11651149 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
11661150 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
11671151 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1168 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
11691152
11701153 var a: u32 = 1;
11711154 var ptr: *align(@alignOf(u32)) anyopaque = &a;
......@@ -1179,7 +1162,6 @@ test "implicit ptr to *anyopaque" {
11791162test "return null from fn () anyerror!?&T" {
11801163 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
11811164 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1182 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
11831165
11841166 const a = returnNullFromOptionalTypeErrorRef();
11851167 const b = returnNullLitFromOptionalTypeErrorRef();
......@@ -1196,7 +1178,6 @@ fn returnNullLitFromOptionalTypeErrorRef() anyerror!?*A {
11961178test "peer type resolution: [0]u8 and []const u8" {
11971179 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
11981180 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1199 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
12001181
12011182 try expect(peerTypeEmptyArrayAndSlice(true, "hi").len == 0);
12021183 try expect(peerTypeEmptyArrayAndSlice(false, "hi").len == 1);
......@@ -1217,7 +1198,6 @@ test "implicitly cast from [N]T to ?[]const T" {
12171198 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
12181199 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
12191200 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1220 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
12211201
12221202 try expect(mem.eql(u8, castToOptionalSlice().?, "hi"));
12231203 try comptime expect(mem.eql(u8, castToOptionalSlice().?, "hi"));
......@@ -1269,7 +1249,6 @@ test "implicit cast from *T to ?*anyopaque" {
12691249 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
12701250 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
12711251 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1272 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
12731252
12741253 var a: u8 = 1;
12751254 incrementVoidPtrValue(&a);
......@@ -1283,7 +1262,6 @@ fn incrementVoidPtrValue(value: ?*anyopaque) void {
12831262test "implicit cast *[0]T to E![]const u8" {
12841263 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
12851264 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1286 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
12871265
12881266 var x = @as(anyerror![]const u8, &[0]u8{});
12891267 try expect((x catch unreachable).len == 0);
......@@ -1303,7 +1281,6 @@ test "*const [N]null u8 to ?[]const u8" {
13031281 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
13041282 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13051283 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1306 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
13071284
13081285 const S = struct {
13091286 fn doTheTest() !void {
......@@ -1339,15 +1316,12 @@ test "assignment to optional pointer result loc" {
13391316 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
13401317 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13411318 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1342 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
13431319
13441320 var foo: struct { ptr: ?*anyopaque } = .{ .ptr = &global_struct };
13451321 try expect(foo.ptr.? == @as(*anyopaque, @ptrCast(&global_struct)));
13461322}
13471323
13481324test "cast between *[N]void and []void" {
1349 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1350
13511325 var a: [4]void = undefined;
13521326 var b: []void = &a;
13531327 try expect(b.len == 4);
......@@ -1409,7 +1383,6 @@ test "peer type resolution: unreachable, null, slice" {
14091383 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
14101384 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
14111385 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1412 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
14131386
14141387 const S = struct {
14151388 fn doTheTest(num: usize, word: []const u8) !void {
......@@ -1449,7 +1422,6 @@ test "cast compatible optional types" {
14491422 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
14501423 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
14511424 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1452 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
14531425
14541426 var a: ?[:0]const u8 = null;
14551427 var b: ?[]const u8 = a;
......@@ -1533,7 +1505,6 @@ test "cast typed undefined to int" {
15331505
15341506test "implicit cast from [:0]T to [*c]T" {
15351507 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1536 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
15371508
15381509 var a: [:0]const u8 = "foo";
15391510 var b: [*c]const u8 = a;
......@@ -1544,6 +1515,7 @@ test "implicit cast from [:0]T to [*c]T" {
15441515
15451516test "bitcast packed struct with u0" {
15461517 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1518 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
15471519
15481520 const S = packed struct(u2) { a: u0, b: u2 };
15491521 const s = @as(S, @bitCast(@as(u2, 2)));
......@@ -1571,8 +1543,6 @@ test "single item pointer to pointer to array to slice" {
15711543}
15721544
15731545test "peer type resolution forms error union" {
1574 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1575
15761546 var foo: i32 = 123;
15771547 const result = if (foo < 0) switch (-foo) {
15781548 0 => unreachable,
......@@ -1610,7 +1580,6 @@ test "peer type resolution: const sentinel slice and mutable non-sentinel slice"
16101580 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
16111581 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
16121582 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1613 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
16141583
16151584 const S = struct {
16161585 fn doTheTest(comptime T: type, comptime s: T) !void {
......@@ -1639,7 +1608,6 @@ test "peer type resolution: float and comptime-known fixed-width integer" {
16391608 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
16401609 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
16411610 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1642 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
16431611
16441612 const i: u8 = 100;
16451613 var f: f32 = 1.234;
......@@ -1660,7 +1628,6 @@ test "peer type resolution: same array type with sentinel" {
16601628 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
16611629 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
16621630 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1663 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
16641631
16651632 var a: [2:0]u32 = .{ 0, 1 };
16661633 var b: [2:0]u32 = .{ 2, 3 };
......@@ -1681,7 +1648,6 @@ test "peer type resolution: array with sentinel and array without sentinel" {
16811648 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
16821649 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
16831650 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1684 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
16851651
16861652 var a: [2:0]u32 = .{ 0, 1 };
16871653 var b: [2]u32 = .{ 2, 3 };
......@@ -1702,7 +1668,6 @@ test "peer type resolution: array and vector with same child type" {
17021668 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
17031669 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
17041670 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1705 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
17061671
17071672 var arr: [2]u32 = .{ 0, 1 };
17081673 var vec: @Vector(2, u32) = .{ 2, 3 };
......@@ -1746,7 +1711,6 @@ test "peer type resolution: error union and optional of same type" {
17461711 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
17471712 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
17481713 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1749 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
17501714
17511715 const E = error{Foo};
17521716 var a: E!*u8 = error.Foo;
......@@ -1768,7 +1732,6 @@ test "peer type resolution: C pointer and @TypeOf(null)" {
17681732 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
17691733 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
17701734 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1771 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
17721735
17731736 var a: [*c]c_int = 0x1000;
17741737 const b = null;
......@@ -1789,7 +1752,6 @@ test "peer type resolution: three-way resolution combines error set and optional
17891752 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
17901753 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
17911754 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1792 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
17931755
17941756 const E = error{Foo};
17951757 var a: E = error.Foo;
......@@ -1852,7 +1814,6 @@ test "peer type resolution: optional fixed-width int and comptime_int" {
18521814 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
18531815 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
18541816 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1855 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
18561817
18571818 var a: ?i32 = 42;
18581819 const b: comptime_int = 50;
......@@ -1873,7 +1834,6 @@ test "peer type resolution: array and tuple" {
18731834 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
18741835 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
18751836 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1876 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
18771837
18781838 var arr: [3]i32 = .{ 1, 2, 3 };
18791839 const tup = .{ 4, 5, 6 };
......@@ -1896,7 +1856,6 @@ test "peer type resolution: vector and tuple" {
18961856 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
18971857 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
18981858 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1899 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
19001859
19011860 var vec: @Vector(3, i32) = .{ 1, 2, 3 };
19021861 const tup = .{ 4, 5, 6 };
......@@ -1919,7 +1878,6 @@ test "peer type resolution: vector and array and tuple" {
19191878 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
19201879 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
19211880 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1922 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
19231881
19241882 var vec: @Vector(2, i8) = .{ 10, 20 };
19251883 var arr: [2]i8 = .{ 30, 40 };
......@@ -1960,7 +1918,6 @@ test "peer type resolution: empty tuple pointer and slice" {
19601918 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
19611919 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
19621920 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1963 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
19641921
19651922 var a: [:0]const u8 = "Hello";
19661923 var b = &.{};
......@@ -1980,7 +1937,6 @@ test "peer type resolution: tuple pointer and slice" {
19801937 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
19811938 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
19821939 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1983 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
19841940
19851941 var a: [:0]const u8 = "Hello";
19861942 var b = &.{ @as(u8, 'x'), @as(u8, 'y'), @as(u8, 'z') };
......@@ -2000,7 +1956,6 @@ test "peer type resolution: tuple pointer and optional slice" {
20001956 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
20011957 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
20021958 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2003 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
20041959
20051960 var a: ?[:0]const u8 = null;
20061961 var b = &.{ @as(u8, 'x'), @as(u8, 'y'), @as(u8, 'z') };
......@@ -2116,7 +2071,6 @@ test "peer type resolution: C pointer and many pointer" {
21162071 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
21172072 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
21182073 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2119 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
21202074
21212075 var buf = "hello".*;
21222076
......@@ -2138,7 +2092,6 @@ test "peer type resolution: pointer attributes are combined correctly" {
21382092 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
21392093 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
21402094 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2141 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
21422095
21432096 var buf_a align(4) = "foo".*;
21442097 var buf_b align(4) = "bar".*;
......@@ -2181,7 +2134,6 @@ test "cast builtins can wrap result in optional" {
21812134 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
21822135 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
21832136 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2184 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
21852137
21862138 const S = struct {
21872139 const MyEnum = enum(u32) { _ };
......@@ -2257,7 +2209,6 @@ test "cast builtins can wrap result in error union and optional" {
22572209 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
22582210 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
22592211 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2260 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
22612212
22622213 const S = struct {
22632214 const MyEnum = enum(u32) { _ };
......@@ -2422,7 +2373,6 @@ test "@intFromBool on vector" {
24222373
24232374test "numeric coercions with undefined" {
24242375 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
2425 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
24262376
24272377 const from: i32 = undefined;
24282378 var to: f32 = from;
......@@ -2434,7 +2384,6 @@ test "numeric coercions with undefined" {
24342384test "15-bit int to float" {
24352385 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
24362386 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
2437 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
24382387
24392388 var a: u15 = 42;
24402389 var b: f32 = @floatFromInt(a);
......@@ -2462,7 +2411,6 @@ test "result information is preserved through many nested structures" {
24622411 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
24632412 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
24642413 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2465 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
24662414
24672415 const S = struct {
24682416 fn doTheTest() !void {
test/behavior/cast_int.zig+3
......@@ -149,6 +149,8 @@ const Piece = packed struct {
149149
150150test "load non byte-sized optional value" {
151151 // Originally reported at https://github.com/ziglang/zig/issues/14200
152 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
153
152154 // note: this bug is triggered by the == operator, expectEqual will hide it
153155 var opt: ?Piece = try Piece.charToPiece('p');
154156 try expect(opt.?.type == .PAWN);
......@@ -162,6 +164,7 @@ test "load non byte-sized optional value" {
162164
163165test "load non byte-sized value in struct" {
164166 if (builtin.cpu.arch.endian() != .Little) return error.SkipZigTest; // packed struct TODO
167 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
165168
166169 // note: this bug is triggered by the == operator, expectEqual will hide it
167170 // using ptrCast not to depend on unitialised memory state
test/behavior/comptime_memory.zig-4
......@@ -426,8 +426,6 @@ test "mutate entire slice at comptime" {
426426}
427427
428428test "dereference undefined pointer to zero-bit type" {
429 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
430
431429 const p0: *void = undefined;
432430 try testing.expectEqual({}, p0.*);
433431
......@@ -436,8 +434,6 @@ test "dereference undefined pointer to zero-bit type" {
436434}
437435
438436test "type pun extern struct" {
439 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
440
441437 const S = extern struct { f: u8 };
442438 comptime var s = S{ .f = 123 };
443439 @as(*u8, @ptrCast(&s)).* = 72;
test/behavior/const_slice_child.zig-1
......@@ -10,7 +10,6 @@ test "const slice child" {
1010 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1111 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1212 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
13 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1413
1514 const strs = [_][*]const u8{ "one", "two", "three" };
1615 argv = &strs;
test/behavior/defer.zig-3
......@@ -34,7 +34,6 @@ test "defer and labeled break" {
3434test "errdefer does not apply to fn inside fn" {
3535 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
3636 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
37 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
3837
3938 if (testNestedFnErrDefer()) |_| @panic("expected error") else |e| try expect(e == error.Bad);
4039}
......@@ -95,7 +94,6 @@ test "mixing normal and error defers" {
9594 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
9695 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
9796 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
98 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
9997
10098 try expect(runSomeErrorDefers(true) catch unreachable);
10199 try expect(result[0] == 'c');
......@@ -160,7 +158,6 @@ test "reference to errdefer payload" {
160158test "simple else prong doesn't emit an error for unreachable else prong" {
161159 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
162160 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
163 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
164161
165162 const S = struct {
166163 fn foo() error{Foo}!void {
test/behavior/empty_union.zig-4
......@@ -44,8 +44,6 @@ test "empty extern union" {
4444}
4545
4646test "empty union passed as argument" {
47 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
48
4947 const U = union(enum) {
5048 fn f(u: @This()) void {
5149 switch (u) {}
......@@ -55,8 +53,6 @@ test "empty union passed as argument" {
5553}
5654
5755test "empty enum passed as argument" {
58 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
59
6056 const E = enum {
6157 fn f(e: @This()) void {
6258 switch (e) {}
test/behavior/enum.zig-8
......@@ -617,7 +617,6 @@ test "enum with specified tag values" {
617617test "non-exhaustive enum" {
618618 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
619619 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
620 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
621620
622621 const S = struct {
623622 const E = enum(u8) { a, b, _ };
......@@ -660,8 +659,6 @@ test "non-exhaustive enum" {
660659}
661660
662661test "empty non-exhaustive enum" {
663 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
664
665662 const S = struct {
666663 const E = enum(u8) { _ };
667664
......@@ -683,7 +680,6 @@ test "empty non-exhaustive enum" {
683680test "single field non-exhaustive enum" {
684681 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
685682 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
686 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
687683
688684 const S = struct {
689685 const E = enum(u8) { a, _ };
......@@ -856,8 +852,6 @@ fn doALoopThing(id: EnumWithOneMember) void {
856852}
857853
858854test "comparison operator on enum with one member is comptime-known" {
859 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
860
861855 doALoopThing(EnumWithOneMember.Eof);
862856}
863857
......@@ -1211,8 +1205,6 @@ test "enum tag from a local variable" {
12111205}
12121206
12131207test "auto-numbered enum with signed tag type" {
1214 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1215
12161208 const E = enum(i32) { a, b };
12171209
12181210 try std.testing.expectEqual(@as(i32, 0), @intFromEnum(E.a));
test/behavior/error.zig-10
......@@ -124,7 +124,6 @@ test "debug info for optional error set" {
124124
125125test "implicit cast to optional to error union to return result loc" {
126126 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
127 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
128127
129128 const S = struct {
130129 fn entry() !void {
......@@ -218,7 +217,6 @@ fn testErrorSetType() !void {
218217
219218test "explicit error set cast" {
220219 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
221 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
222220
223221 try testExplicitErrorSetCast(Set1.A);
224222 try comptime testExplicitErrorSetCast(Set1.A);
......@@ -320,7 +318,6 @@ test "error inference with an empty set" {
320318
321319test "error union peer type resolution" {
322320 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
323 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
324321
325322 try testErrorUnionPeerTypeResolution(1);
326323}
......@@ -404,7 +401,6 @@ test "nested error union function call in optional unwrap" {
404401 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
405402 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
406403 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
407 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
408404
409405 const S = struct {
410406 const Foo = struct {
......@@ -469,7 +465,6 @@ test "optional error set is the same size as error set" {
469465 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
470466 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
471467 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
472 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
473468
474469 try comptime expect(@sizeOf(?anyerror) == @sizeOf(anyerror));
475470 try comptime expect(@alignOf(?anyerror) == @alignOf(anyerror));
......@@ -485,7 +480,6 @@ test "optional error set is the same size as error set" {
485480test "nested catch" {
486481 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
487482 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
488 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
489483
490484 const S = struct {
491485 fn entry() !void {
......@@ -536,7 +530,6 @@ test "return result loc as peer result loc in inferred error set function" {
536530 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
537531 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
538532 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
539 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
540533
541534 const S = struct {
542535 fn doTheTest() !void {
......@@ -568,7 +561,6 @@ test "error payload type is correctly resolved" {
568561 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
569562 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
570563 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
571 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
572564
573565 const MyIntWrapper = struct {
574566 const Self = @This();
......@@ -736,7 +728,6 @@ test "ret_ptr doesn't cause own inferred error set to be resolved" {
736728
737729test "simple else prong allowed even when all errors handled" {
738730 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
739 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
740731
741732 const S = struct {
742733 fn foo() !u8 {
......@@ -920,7 +911,6 @@ test "optional error union return type" {
920911test "optional error set return type" {
921912 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
922913 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
923 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
924914
925915 const E = error{ A, B };
926916 const S = struct {
test/behavior/eval.zig-8
......@@ -441,7 +441,6 @@ test "binary math operator in partially inlined function" {
441441 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
442442 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
443443 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
444 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
445444
446445 var s: [4]u32 = undefined;
447446 var b: [16]u8 = undefined;
......@@ -710,7 +709,6 @@ fn loopNTimes(comptime n: usize) void {
710709}
711710
712711test "variable inside inline loop that has different types on different iterations" {
713 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
714712 try testVarInsideInlineLoop(.{ true, @as(u32, 42) });
715713}
716714
......@@ -760,7 +758,6 @@ test "array concatenation peer resolves element types - value" {
760758 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
761759 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
762760 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
763 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
764761
765762 var a = [2]u3{ 1, 7 };
766763 var b = [3]u8{ 200, 225, 255 };
......@@ -777,7 +774,6 @@ test "array concatenation peer resolves element types - pointer" {
777774 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
778775 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
779776 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
780 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
781777
782778 var a = [2]u3{ 1, 7 };
783779 var b = [3]u8{ 200, 225, 255 };
......@@ -794,7 +790,6 @@ test "array concatenation sets the sentinel - value" {
794790 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
795791 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
796792 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
797 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
798793
799794 var a = [2]u3{ 1, 7 };
800795 var b = [3:69]u8{ 200, 225, 255 };
......@@ -812,7 +807,6 @@ test "array concatenation sets the sentinel - value" {
812807test "array concatenation sets the sentinel - pointer" {
813808 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
814809 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
815 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
816810
817811 var a = [2]u3{ 1, 7 };
818812 var b = [3:69]u8{ 200, 225, 255 };
......@@ -1668,8 +1662,6 @@ test "early exit in container level const" {
16681662}
16691663
16701664test "@inComptime" {
1671 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1672
16731665 const S = struct {
16741666 fn inComptime() bool {
16751667 return @inComptime();
test/behavior/floatop.zig+18-2
......@@ -29,6 +29,7 @@ test "add f32/f64" {
2929
3030test "add f80/f128/c_longdouble" {
3131 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
32 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
3233
3334 try testAdd(f80);
3435 try comptime testAdd(f80);
......@@ -60,6 +61,7 @@ test "sub f32/f64" {
6061
6162test "sub f80/f128/c_longdouble" {
6263 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
64 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
6365
6466 try testSub(f80);
6567 try comptime testSub(f80);
......@@ -91,6 +93,7 @@ test "mul f32/f64" {
9193
9294test "mul f80/f128/c_longdouble" {
9395 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
96 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
9497
9598 try testMul(f80);
9699 try comptime testMul(f80);
......@@ -200,7 +203,6 @@ test "different sized float comparisons" {
200203 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
201204 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
202205 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
203 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
204206 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
205207
206208 try testDifferentSizedFloatComparisons();
......@@ -235,6 +237,7 @@ fn testDifferentSizedFloatComparisons() !void {
235237test "negative f128 intFromFloat at compile-time" {
236238 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
237239 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
240 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
238241
239242 const a: f128 = -2;
240243 var b = @as(i64, @intFromFloat(a));
......@@ -908,6 +911,7 @@ test "@abs f16" {
908911 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
909912 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
910913 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
914 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
911915
912916 try testFabs(f16);
913917 try comptime testFabs(f16);
......@@ -917,6 +921,7 @@ test "@abs f32/f64" {
917921 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
918922 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
919923 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
924 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
920925
921926 try testFabs(f32);
922927 try comptime testFabs(f32);
......@@ -930,6 +935,7 @@ test "@abs f80/f128/c_longdouble" {
930935 if (builtin.zig_backend == .stage2_c and builtin.cpu.arch.isArmOrThumb()) return error.SkipZigTest;
931936 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
932937 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
938 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
933939
934940 try testFabs(f80);
935941 try comptime testFabs(f80);
......@@ -1007,6 +1013,7 @@ test "@floor f16" {
10071013 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
10081014 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
10091015 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
1016 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
10101017
10111018 try testFloor(f16);
10121019 try comptime testFloor(f16);
......@@ -1017,6 +1024,7 @@ test "@floor f32/f64" {
10171024 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
10181025 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
10191026 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
1027 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
10201028
10211029 try testFloor(f32);
10221030 try comptime testFloor(f32);
......@@ -1030,6 +1038,7 @@ test "@floor f80/f128/c_longdouble" {
10301038 if (builtin.zig_backend == .stage2_c and builtin.cpu.arch.isArmOrThumb()) return error.SkipZigTest;
10311039 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
10321040 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
1041 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
10331042
10341043 if (builtin.zig_backend == .stage2_llvm and builtin.os.tag == .windows) {
10351044 // https://github.com/ziglang/zig/issues/12602
......@@ -1089,6 +1098,7 @@ test "@ceil f16" {
10891098 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
10901099 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
10911100 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
1101 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
10921102
10931103 try testCeil(f16);
10941104 try comptime testCeil(f16);
......@@ -1099,6 +1109,7 @@ test "@ceil f32/f64" {
10991109 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
11001110 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
11011111 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
1112 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
11021113
11031114 try testCeil(f32);
11041115 try comptime testCeil(f32);
......@@ -1112,6 +1123,7 @@ test "@ceil f80/f128/c_longdouble" {
11121123 if (builtin.zig_backend == .stage2_c and builtin.cpu.arch.isArmOrThumb()) return error.SkipZigTest;
11131124 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
11141125 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
1126 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
11151127
11161128 if (builtin.zig_backend == .stage2_llvm and builtin.os.tag == .windows) {
11171129 // https://github.com/ziglang/zig/issues/12602
......@@ -1148,8 +1160,8 @@ fn testCeil(comptime T: type) !void {
11481160test "@ceil with vectors" {
11491161 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
11501162 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1151 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
11521163 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1164 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
11531165 if (builtin.zig_backend == .stage2_x86_64 and
11541166 !comptime std.Target.x86.featureSetHas(builtin.cpu.features, .sse4_1)) return error.SkipZigTest;
11551167
......@@ -1171,6 +1183,7 @@ test "@trunc f16" {
11711183 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
11721184 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
11731185 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
1186 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
11741187
11751188 if (builtin.zig_backend == .stage2_llvm and builtin.cpu.arch.isMIPS()) {
11761189 // https://github.com/ziglang/zig/issues/16846
......@@ -1186,6 +1199,7 @@ test "@trunc f32/f64" {
11861199 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
11871200 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
11881201 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
1202 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
11891203
11901204 if (builtin.zig_backend == .stage2_llvm and builtin.cpu.arch.isMIPS()) {
11911205 // https://github.com/ziglang/zig/issues/16846
......@@ -1204,6 +1218,7 @@ test "@trunc f80/f128/c_longdouble" {
12041218 if (builtin.zig_backend == .stage2_c and builtin.cpu.arch.isArmOrThumb()) return error.SkipZigTest;
12051219 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
12061220 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
1221 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
12071222
12081223 if (builtin.zig_backend == .stage2_llvm and builtin.os.tag == .windows) {
12091224 // https://github.com/ziglang/zig/issues/12602
......@@ -1390,6 +1405,7 @@ test "comptime fixed-width float non-zero divided by zero produces signed Inf" {
13901405 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13911406 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
13921407 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1408 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
13931409
13941410 inline for (.{ f16, f32, f64, f80, f128 }) |F| {
13951411 const pos = @as(F, 1) / @as(F, 0);
test/behavior/fn.zig-11
......@@ -201,7 +201,6 @@ fn addPointCoords(pt: Point) i32 {
201201
202202test "pass by non-copying value through var arg" {
203203 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
204 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
205204
206205 try expect((try addPointCoordsVar(Point{ .x = 1, .y = 2 })) == 3);
207206}
......@@ -257,7 +256,6 @@ test "implicit cast fn call result to optional in field result" {
257256 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
258257 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
259258 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
260 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
261259
262260 const S = struct {
263261 fn entry() !void {
......@@ -284,7 +282,6 @@ test "implicit cast fn call result to optional in field result" {
284282test "void parameters" {
285283 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
286284 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
287 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
288285
289286 try voidFun(1, void{}, 2, {});
290287}
......@@ -348,7 +345,6 @@ test "function call with anon list literal" {
348345 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
349346 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
350347 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
351 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
352348
353349 const S = struct {
354350 fn doTheTest() !void {
......@@ -369,7 +365,6 @@ test "function call with anon list literal - 2D" {
369365 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
370366 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
371367 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
372 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
373368
374369 const S = struct {
375370 fn doTheTest() !void {
......@@ -415,7 +410,6 @@ test "function with inferred error set but returning no error" {
415410
416411test "import passed byref to function in return type" {
417412 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
418 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
419413
420414 const S = struct {
421415 fn get() @import("std").ArrayListUnmanaged(i32) {
......@@ -451,7 +445,6 @@ test "implicit cast function to function ptr" {
451445test "method call with optional and error union first param" {
452446 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
453447 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
454 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
455448
456449 const S = struct {
457450 x: i32 = 1234,
......@@ -471,7 +464,6 @@ test "method call with optional and error union first param" {
471464test "method call with optional pointer first param" {
472465 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
473466 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
474 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
475467
476468 const S = struct {
477469 x: i32 = 1234,
......@@ -528,7 +520,6 @@ test "function returns function returning type" {
528520
529521test "peer type resolution of inferred error set with non-void payload" {
530522 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
531 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
532523
533524 const S = struct {
534525 fn openDataFile(mode: enum { read, write }) !u32 {
......@@ -571,8 +562,6 @@ test "lazy values passed to anytype parameter" {
571562}
572563
573564test "pass and return comptime-only types" {
574 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
575
576565 const S = struct {
577566 fn returnNull(comptime x: @Type(.Null)) @Type(.Null) {
578567 return x;
test/behavior/for.zig-16
......@@ -7,7 +7,6 @@ const mem = std.mem;
77test "continue in for loop" {
88 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
99 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
10 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1110
1211 const array = [_]i32{ 1, 2, 3, 4, 5 };
1312 var sum: i32 = 0;
......@@ -70,7 +69,6 @@ test "basic for loop" {
7069 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
7170 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
7271 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
73 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
7472
7573 const expected_result = [_]u8{ 9, 8, 7, 6, 0, 1, 2, 3 } ** 3;
7674
......@@ -114,7 +112,6 @@ test "for with null and T peer types and inferred result location type" {
114112 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
115113 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
116114 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
117 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
118115
119116 const S = struct {
120117 fn doTheTest(slice: []const u8) !void {
......@@ -135,7 +132,6 @@ test "for with null and T peer types and inferred result location type" {
135132test "2 break statements and an else" {
136133 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
137134 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
138 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
139135
140136 const S = struct {
141137 fn entry(t: bool, f: bool) !void {
......@@ -157,7 +153,6 @@ test "for loop with pointer elem var" {
157153 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
158154 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
159155 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
160 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
161156
162157 const source = "abcdefg";
163158 var target: [source.len]u8 = undefined;
......@@ -184,7 +179,6 @@ fn mangleString(s: []u8) void {
184179test "for copies its payload" {
185180 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
186181 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
187 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
188182
189183 const S = struct {
190184 fn doTheTest() !void {
......@@ -204,7 +198,6 @@ test "for on slice with allowzero ptr" {
204198 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
205199 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
206200 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
207 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
208201
209202 const S = struct {
210203 fn doTheTest(slice: []const u8) !void {
......@@ -220,7 +213,6 @@ test "for on slice with allowzero ptr" {
220213test "else continue outer for" {
221214 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
222215 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
223 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
224216
225217 var i: usize = 6;
226218 var buf: [5]u8 = undefined;
......@@ -282,7 +274,6 @@ test "two counters" {
282274test "1-based counter and ptr to array" {
283275 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
284276 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
285 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
286277
287278 var ok: usize = 0;
288279
......@@ -344,7 +335,6 @@ test "two slices, one captured by-ref" {
344335 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
345336 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
346337 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
347 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
348338
349339 var buf: [10]u8 = undefined;
350340 const slice1: []const u8 = "blah";
......@@ -364,7 +354,6 @@ test "raw pointer and slice" {
364354 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
365355 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
366356 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
367 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
368357
369358 var buf: [10]u8 = undefined;
370359 const slice: []const u8 = "blah";
......@@ -384,7 +373,6 @@ test "raw pointer and counter" {
384373 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
385374 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
386375 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
387 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
388376
389377 var buf: [10]u8 = undefined;
390378 const ptr: [*]u8 = &buf;
......@@ -433,7 +421,6 @@ test "inline for with counter as the comptime-known" {
433421 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
434422 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
435423 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
436 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
437424
438425 var runtime_slice = "hello";
439426 var runtime_i: usize = 3;
......@@ -464,7 +451,6 @@ test "inline for on tuple pointer" {
464451 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
465452 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
466453 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
467 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
468454
469455 const S = struct { u32, u32, u32 };
470456 var s: S = .{ 100, 200, 300 };
......@@ -480,7 +466,6 @@ test "ref counter that starts at zero" {
480466 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
481467 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
482468 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
483 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
484469
485470 for ([_]usize{ 0, 1, 2 }, 0..) |i, j| {
486471 try expectEqual(i, j);
......@@ -496,7 +481,6 @@ test "inferred alloc ptr of for loop" {
496481 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
497482 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
498483 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
499 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
500484
501485 {
502486 var cond = false;
test/behavior/generics.zig-4
......@@ -153,7 +153,6 @@ test "generic fn with implicit cast" {
153153 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
154154 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
155155 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
156 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
157156
158157 try expect(getFirstByte(u8, &[_]u8{13}) == 13);
159158 try expect(getFirstByte(u16, &[_]u16{
......@@ -280,7 +279,6 @@ test "generic function instantiation turns into comptime call" {
280279
281280test "generic function with void and comptime parameter" {
282281 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
283 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
284282
285283 const S = struct { x: i32 };
286284 const namespace = struct {
......@@ -315,7 +313,6 @@ test "generic function instantiation non-duplicates" {
315313 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
316314 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
317315 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
318 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
319316 if (builtin.os.tag == .wasi) return error.SkipZigTest;
320317
321318 const S = struct {
......@@ -433,7 +430,6 @@ test "generic function passed as comptime argument" {
433430
434431test "return type of generic function is function pointer" {
435432 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
436 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
437433
438434 const S = struct {
439435 fn b(comptime T: type) ?*const fn () error{}!T {
test/behavior/if.zig-3
......@@ -45,7 +45,6 @@ var global_with_err: anyerror!u32 = error.SomeError;
4545
4646test "unwrap mutable global var" {
4747 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
48 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
4948
5049 if (global_with_val) |v| {
5150 try expect(v == 0);
......@@ -116,7 +115,6 @@ test "if peer expressions inferred optional type" {
116115 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
117116 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
118117 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
119 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
120118
121119 var self: []const u8 = "abcdef";
122120 var index: usize = 0;
......@@ -134,7 +132,6 @@ test "if-else expression with runtime condition result location is inferred opti
134132 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
135133 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
136134 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
137 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
138135
139136 const A = struct { b: u64, c: u64 };
140137 var d: bool = true;
test/behavior/inline_switch.zig-1
......@@ -84,7 +84,6 @@ test "inline else bool" {
8484test "inline else error" {
8585 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
8686 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
87 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
8887
8988 const Err = error{ a, b, c };
9089 var a = Err.a;
test/behavior/int_comparison_elision.zig+1-2
......@@ -4,8 +4,6 @@ const maxInt = std.math.maxInt;
44const builtin = @import("builtin");
55
66test "int comparison elision" {
7 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
8
97 testIntEdges(u0);
108 testIntEdges(i0);
119 testIntEdges(u1);
......@@ -17,6 +15,7 @@ test "int comparison elision" {
1715 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1816 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1917 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
18 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2019
2120 // TODO: panic: integer overflow with int types > 65528 bits wide
2221 // TODO: LLVM generates too many parameters for wasmtime when splitting up int > 64000 bits wide
test/behavior/ir_block_deps.zig-1
......@@ -21,7 +21,6 @@ test "ir block deps" {
2121 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2222 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2323 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
24 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2524
2625 try expect((foo(1) catch unreachable) == 0);
2726 try expect((foo(2) catch unreachable) == 0);
test/behavior/lower_strlit_to_vector.zig-1
......@@ -6,7 +6,6 @@ test "strlit to vector" {
66 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
77 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
88 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
9 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
109
1110 const strlit = "0123456789abcdef0123456789ABCDEF";
1211 const vec_from_strlit: @Vector(32, u8) = strlit.*;
test/behavior/math.zig+6-3
......@@ -413,6 +413,7 @@ test "division" {
413413 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
414414 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
415415 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
416 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
416417 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
417418
418419 if (builtin.zig_backend == .stage2_llvm and builtin.cpu.arch.isMIPS()) {
......@@ -468,6 +469,9 @@ fn testDivision() !void {
468469 try expect(mod(i32, -14, -12) == -2);
469470 try expect(mod(i32, -2, -12) == -2);
470471
472 try expect(divTrunc(i20, 20, -5) == -4);
473 try expect(divTrunc(i20, -20, -4) == 5);
474
471475 comptime {
472476 try expect(
473477 1194735857077236777412821811143690633098347576 % 508740759824825164163191790951174292733114988 == 177254337427586449086438229241342047632117600,
......@@ -1116,6 +1120,8 @@ test "@shlWithOverflow" {
11161120}
11171121
11181122test "overflow arithmetic with u0 values" {
1123 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1124
11191125 {
11201126 var a: u0 = 0;
11211127 const ov = @addWithOverflow(a, 0);
......@@ -1284,8 +1290,6 @@ fn testShrExact(x: u8) !void {
12841290}
12851291
12861292test "shift left/right on u0 operand" {
1287 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1288
12891293 const S = struct {
12901294 fn doTheTest() !void {
12911295 var x: u0 = 0;
......@@ -1562,7 +1566,6 @@ test "vector comparison" {
15621566 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
15631567 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
15641568 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1565 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
15661569
15671570 const S = struct {
15681571 fn doTheTest() !void {
test/behavior/maximum_minimum.zig+12-9
......@@ -9,14 +9,16 @@ test "@max" {
99 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1010 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1111 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
12 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1312
1413 const S = struct {
1514 fn doTheTest() !void {
1615 var x: i32 = 10;
1716 var y: f32 = 0.68;
17 var nan: f32 = std.math.nan(f32);
1818 try expect(@as(i32, 10) == @max(@as(i32, -3), x));
1919 try expect(@as(f32, 3.2) == @max(@as(f32, 3.2), y));
20 try expect(y == @max(nan, y));
21 try expect(y == @max(y, nan));
2022 }
2123 };
2224 try S.doTheTest();
......@@ -58,14 +60,16 @@ test "@min" {
5860 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
5961 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
6062 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
61 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
6263
6364 const S = struct {
6465 fn doTheTest() !void {
6566 var x: i32 = 10;
6667 var y: f32 = 0.68;
68 var nan: f32 = std.math.nan(f32);
6769 try expect(@as(i32, -3) == @min(@as(i32, -3), x));
6870 try expect(@as(f32, 0.68) == @min(@as(f32, 3.2), y));
71 try expect(y == @min(nan, y));
72 try expect(y == @min(y, nan));
6973 }
7074 };
7175 try S.doTheTest();
......@@ -119,6 +123,12 @@ test "@min/max for floats" {
119123 try expectEqual(x, @min(y, x));
120124 try expectEqual(y, @max(x, y));
121125 try expectEqual(y, @max(y, x));
126
127 if (T != comptime_float) {
128 var nan: T = std.math.nan(T);
129 try expectEqual(y, @max(nan, y));
130 try expectEqual(y, @max(y, nan));
131 }
122132 }
123133 };
124134
......@@ -137,8 +147,6 @@ test "@min/@max on lazy values" {
137147}
138148
139149test "@min/@max more than two arguments" {
140 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
141
142150 const x: u32 = 30;
143151 const y: u32 = 10;
144152 const z: u32 = 20;
......@@ -151,7 +159,6 @@ test "@min/@max more than two vector arguments" {
151159 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
152160 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
153161 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
154 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
155162
156163 const x: @Vector(2, u32) = .{ 3, 2 };
157164 const y: @Vector(2, u32) = .{ 4, 1 };
......@@ -164,7 +171,6 @@ test "@min/@max notices bounds" {
164171 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
165172 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
166173 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
167 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
168174
169175 var x: u16 = 20;
170176 const y = 30;
......@@ -214,7 +220,6 @@ test "@min/@max notices bounds from types" {
214220 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
215221 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
216222 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
217 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
218223
219224 var x: u16 = 123;
220225 var y: u32 = 456;
......@@ -295,8 +300,6 @@ test "@min/@max notices bounds from vector types when element of comptime-known
295300}
296301
297302test "@min/@max of signed and unsigned runtime integers" {
298 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
299
300303 var x: i32 = -1;
301304 var y: u31 = 1;
302305
test/behavior/merge_error_sets.zig-1
......@@ -13,7 +13,6 @@ fn foo() C!void {
1313
1414test "merge error sets" {
1515 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
16 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1716
1817 if (foo()) {
1918 @panic("unexpected");
test/behavior/null.zig-4
......@@ -53,7 +53,6 @@ test "maybe return" {
5353 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
5454 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
5555 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
56 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
5756
5857 try maybeReturnImpl();
5958 try comptime maybeReturnImpl();
......@@ -84,7 +83,6 @@ fn testTestNullRuntime(x: ?i32) !void {
8483test "optional void" {
8584 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
8685 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
87 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
8886
8987 try optionalVoidImpl();
9088 try comptime optionalVoidImpl();
......@@ -108,7 +106,6 @@ const Empty = struct {};
108106test "optional struct{}" {
109107 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
110108 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
111 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
112109
113110 _ = try optionalEmptyStructImpl();
114111 _ = try comptime optionalEmptyStructImpl();
......@@ -134,7 +131,6 @@ test "null with default unwrap" {
134131
135132test "optional pointer to 0 bit type null value at runtime" {
136133 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
137 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
138134
139135 const EmptyStruct = struct {};
140136 var x: ?*EmptyStruct = null;
test/behavior/optional.zig-16
......@@ -27,7 +27,6 @@ pub const EmptyStruct = struct {};
2727
2828test "optional pointer to size zero struct" {
2929 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
30 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
3130
3231 var e = EmptyStruct{};
3332 var o: ?*EmptyStruct = &e;
......@@ -35,8 +34,6 @@ test "optional pointer to size zero struct" {
3534}
3635
3736test "equality compare optional pointers" {
38 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
39
4037 try testNullPtrsEql();
4138 try comptime testNullPtrsEql();
4239}
......@@ -61,7 +58,6 @@ test "optional with void type" {
6158 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
6259 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
6360 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
64 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
6561
6662 const Foo = struct {
6763 x: ?void,
......@@ -96,7 +92,6 @@ test "nested optional field in struct" {
9692 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
9793 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
9894 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
99 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
10095
10196 const S2 = struct {
10297 y: u8,
......@@ -114,7 +109,6 @@ test "equality compare optional with non-optional" {
114109 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
115110 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
116111 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
117 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
118112
119113 try test_cmp_optional_non_optional();
120114 try comptime test_cmp_optional_non_optional();
......@@ -152,7 +146,6 @@ fn test_cmp_optional_non_optional() !void {
152146test "unwrap function call with optional pointer return value" {
153147 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
154148 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
155 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
156149
157150 const S = struct {
158151 fn entry() !void {
......@@ -174,7 +167,6 @@ test "unwrap function call with optional pointer return value" {
174167test "nested orelse" {
175168 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
176169 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
177 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
178170
179171 const S = struct {
180172 fn entry() !void {
......@@ -257,7 +249,6 @@ test "0-bit child type coerced to optional return ptr result location" {
257249 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
258250 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
259251 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
260 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
261252
262253 const S = struct {
263254 fn doTheTest() !void {
......@@ -310,7 +301,6 @@ test "array of optional unaligned types" {
310301 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
311302 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
312303 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
313 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
314304
315305 const Enum = enum { one, two, three };
316306
......@@ -400,7 +390,6 @@ const NoReturn = struct {
400390
401391test "optional of noreturn used with if" {
402392 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
403 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
404393
405394 NoReturn.a = 64;
406395 if (NoReturn.loop()) |_| {
......@@ -412,7 +401,6 @@ test "optional of noreturn used with if" {
412401
413402test "optional of noreturn used with orelse" {
414403 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
415 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
416404
417405 NoReturn.a = 64;
418406 const val = NoReturn.testOrelse();
......@@ -448,7 +436,6 @@ test "Optional slice size is optimized" {
448436 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
449437 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
450438 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
451 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
452439
453440 try expect(@sizeOf(?[]u8) == @sizeOf([]u8));
454441 var a: ?[]const u8 = null;
......@@ -460,7 +447,6 @@ test "Optional slice size is optimized" {
460447test "peer type resolution in nested if expressions" {
461448 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
462449 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
463 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
464450
465451 const Thing = struct { n: i32 };
466452 var a = false;
......@@ -500,8 +486,6 @@ test "cast slice to const slice nested in error union and optional" {
500486}
501487
502488test "variable of optional of noreturn" {
503 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
504
505489 var null_opv: ?noreturn = null;
506490 try std.testing.expectEqual(@as(?noreturn, null), null_opv);
507491}
test/behavior/packed-struct.zig+5
......@@ -622,6 +622,7 @@ test "@intFromPtr on a packed struct field unaligned and nested" {
622622
623623test "packed struct fields modification" {
624624 // Originally reported at https://github.com/ziglang/zig/issues/16615
625 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
625626
626627 const Small = packed struct {
627628 val: u8 = 0,
......@@ -980,6 +981,8 @@ test "store undefined to packed result location" {
980981}
981982
982983test "bitcast back and forth" {
984 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
985
983986 // Originally reported at https://github.com/ziglang/zig/issues/9914
984987 const S = packed struct { one: u6, two: u1 };
985988 const s = S{ .one = 0b110101, .two = 0b1 };
......@@ -991,6 +994,7 @@ test "bitcast back and forth" {
991994
992995test "field access of packed struct smaller than its abi size inside struct initialized with rls" {
993996 // Originally reported at https://github.com/ziglang/zig/issues/14200
997 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
994998
995999 const S = struct {
9961000 ps: packed struct { x: i2, y: i2 },
......@@ -1039,6 +1043,7 @@ test "modify nested packed struct aligned field" {
10391043
10401044test "assigning packed struct inside another packed struct" {
10411045 // Originally reported at https://github.com/ziglang/zig/issues/9674
1046 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
10421047
10431048 const S = struct {
10441049 const Inner = packed struct {
test/behavior/packed-union.zig+1
......@@ -88,6 +88,7 @@ test "flags in packed union at offset" {
8888
8989test "packed union in packed struct" {
9090 // Originally reported at https://github.com/ziglang/zig/issues/16581
91 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
9192
9293 const ReadRequest = packed struct { key: i32 };
9394 const RequestType = enum {
test/behavior/pointers.zig-7
......@@ -149,7 +149,6 @@ test "implicit casting between C pointer and optional non-C pointer" {
149149 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
150150 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
151151 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
152 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
153152
154153 var slice: []const u8 = "aoeu";
155154 const opt_many_ptr: ?[*]const u8 = slice.ptr;
......@@ -192,7 +191,6 @@ test "allowzero pointer and slice" {
192191 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
193192 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
194193 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
195 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
196194
197195 var ptr = @as([*]allowzero i32, @ptrFromInt(0));
198196 var opt_ptr: ?[*]allowzero i32 = ptr;
......@@ -211,7 +209,6 @@ test "assign null directly to C pointer and test null equality" {
211209 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
212210 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
213211 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
214 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
215212
216213 var x: [*c]i32 = null;
217214 try expect(x == null);
......@@ -278,7 +275,6 @@ test "array initialization types" {
278275test "null terminated pointer" {
279276 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
280277 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
281 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
282278
283279 const S = struct {
284280 fn doTheTest() !void {
......@@ -413,7 +409,6 @@ test "indexing array with sentinel returns correct type" {
413409 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
414410 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
415411 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
416 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
417412
418413 var s: [:0]const u8 = "abc";
419414 try testing.expectEqualSlices(u8, "*const u8", @typeName(@TypeOf(&s[0])));
......@@ -498,7 +493,6 @@ test "ptrCast comptime known slice to C pointer" {
498493 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
499494 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
500495 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
501 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
502496
503497 const s: [:0]const u8 = "foo";
504498 var p = @as([*c]const u8, @ptrCast(s));
......@@ -509,7 +503,6 @@ test "intFromPtr on a generic function" {
509503 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
510504 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
511505 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
512 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
513506
514507 const S = struct {
515508 fn generic(i: anytype) @TypeOf(i) {
test/behavior/ptrcast.zig+2-2
......@@ -233,7 +233,6 @@ test "implicit optional pointer to optional anyopaque pointer" {
233233 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
234234 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
235235 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
236 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
237236
238237 var buf: [4]u8 = "aoeu".*;
239238 var x: ?[*]u8 = &buf;
......@@ -246,7 +245,6 @@ test "@ptrCast slice to slice" {
246245 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
247246 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
248247 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
249 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
250248
251249 const S = struct {
252250 fn foo(slice: []u32) []i32 {
......@@ -286,6 +284,8 @@ test "@ptrCast undefined value at comptime" {
286284}
287285
288286test "comptime @ptrCast with packed struct leaves value unmodified" {
287 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
288
289289 const S = packed struct { three: u3 };
290290 const st: S = .{ .three = 6 };
291291 try expect(st.three == 6);
test/behavior/ptrfromint.zig-2
......@@ -33,7 +33,6 @@ test "@ptrFromInt creates null pointer" {
3333 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
3434 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
3535 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
36 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
3736
3837 const ptr = @as(?*u32, @ptrFromInt(0));
3938 try expectEqual(@as(?*u32, null), ptr);
......@@ -43,7 +42,6 @@ test "@ptrFromInt creates allowzero zero pointer" {
4342 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
4443 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
4544 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
46 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
4745
4846 const ptr = @as(*allowzero u32, @ptrFromInt(0));
4947 try expectEqual(@as(usize, 0), @intFromPtr(ptr));
test/behavior/sizeof_and_typeof.zig-3
......@@ -18,8 +18,6 @@ test "@sizeOf on compile-time types" {
1818}
1919
2020test "@TypeOf() with multiple arguments" {
21 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
22
2321 {
2422 var var_1: u32 = undefined;
2523 var var_2: u8 = undefined;
......@@ -268,7 +266,6 @@ test "runtime instructions inside typeof in comptime only scope" {
268266 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
269267 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
270268 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
271 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
272269
273270 {
274271 var y: i8 = 2;
test/behavior/slice.zig-19
......@@ -64,7 +64,6 @@ test "comptime slice of undefined pointer of length 0" {
6464
6565test "implicitly cast array of size 0 to slice" {
6666 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
67 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
6867
6968 var msg = [_]u8{};
7069 try assertLenIsZero(&msg);
......@@ -172,7 +171,6 @@ test "comptime pointer cast array and then slice" {
172171test "slicing zero length array" {
173172 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
174173 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
175 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
176174
177175 const s1 = ""[0..];
178176 const s2 = ([_]u32{})[0..];
......@@ -183,8 +181,6 @@ test "slicing zero length array" {
183181}
184182
185183test "slicing pointer by length" {
186 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
187
188184 const array = [_]u8{ 1, 2, 3, 4, 5, 6, 7, 8 };
189185 const ptr: [*]const u8 = @as([*]const u8, @ptrCast(&array));
190186 const slice = ptr[1..][0..5];
......@@ -219,7 +215,6 @@ test "slice string literal has correct type" {
219215
220216test "result location zero sized array inside struct field implicit cast to slice" {
221217 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
222 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
223218
224219 const E = struct {
225220 entries: []u32,
......@@ -232,7 +227,6 @@ test "runtime safety lets us slice from len..len" {
232227 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
233228 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
234229 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
235 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
236230
237231 var an_array = [_]u8{ 1, 2, 3 };
238232 try expect(mem.eql(u8, sliceFromLenToLen(an_array[0..], 3, 3), ""));
......@@ -245,7 +239,6 @@ fn sliceFromLenToLen(a_slice: []u8, start: usize, end: usize) []u8 {
245239test "C pointer" {
246240 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
247241 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
248 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
249242
250243 var buf: [*c]const u8 = "kjdhfkjdhfdkjhfkfjhdfkjdhfkdjhfdkjhf";
251244 var len: u32 = 10;
......@@ -257,7 +250,6 @@ test "C pointer slice access" {
257250 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
258251 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
259252 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
260 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
261253
262254 var buf: [10]u32 = [1]u32{42} ** 10;
263255 const c_ptr = @as([*c]const u32, @ptrCast(&buf));
......@@ -287,7 +279,6 @@ fn sliceSum(comptime q: []const u8) i32 {
287279test "slice type with custom alignment" {
288280 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
289281 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
290 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
291282
292283 const LazilyResolvedType = struct {
293284 anything: i32,
......@@ -361,7 +352,6 @@ test "slice syntax resulting in pointer-to-array" {
361352 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
362353 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
363354 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
364 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
365355
366356 const S = struct {
367357 fn doTheTest() !void {
......@@ -586,7 +576,6 @@ test "slice pointer-to-array null terminated" {
586576
587577test "slice pointer-to-array zero length" {
588578 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
589 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
590579
591580 comptime {
592581 {
......@@ -795,8 +784,6 @@ test "global slice field access" {
795784}
796785
797786test "slice of void" {
798 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
799
800787 var n: usize = 10;
801788 var arr: [12]void = undefined;
802789 const slice = @as([]void, &arr)[0..n];
......@@ -804,8 +791,6 @@ test "slice of void" {
804791}
805792
806793test "slice with dereferenced value" {
807 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
808
809794 var a: usize = 0;
810795 var idx: *usize = &a;
811796 _ = blk: {
......@@ -821,7 +806,6 @@ test "slice with dereferenced value" {
821806
822807test "empty slice ptr is non null" {
823808 if (builtin.zig_backend == .stage2_aarch64 and builtin.os.tag == .macos) return error.SkipZigTest; // TODO
824 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
825809
826810 {
827811 const empty_slice: []u8 = &[_]u8{};
......@@ -840,7 +824,6 @@ test "empty slice ptr is non null" {
840824test "slice decays to many pointer" {
841825 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
842826 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
843 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
844827
845828 var buf: [8]u8 = "abcdefg\x00".*;
846829 const p: [*:0]const u8 = buf[0..7 :0];
......@@ -851,7 +834,6 @@ test "write through pointer to optional slice arg" {
851834 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
852835 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
853836 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
854 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
855837
856838 const S = struct {
857839 fn bar(foo: *?[]const u8) !void {
......@@ -871,7 +853,6 @@ test "modify slice length at comptime" {
871853 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
872854 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
873855 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
874 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
875856
876857 const arr: [2]u8 = .{ 10, 20 };
877858 comptime var s: []const u8 = arr[0..0];
test/behavior/src.zig-3
......@@ -17,7 +17,6 @@ test "@src" {
1717 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1818 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1919 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
20 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2120
2221 try doTheTest();
2322}
......@@ -34,8 +33,6 @@ test "@src used as a comptime parameter" {
3433}
3534
3635test "@src in tuple passed to anytype function" {
37 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
38
3936 const S = struct {
4037 fn Foo(a: anytype) u32 {
4138 return a[0].line;
test/behavior/struct.zig-16
......@@ -134,8 +134,6 @@ test "invoke static method in global scope" {
134134const empty_global_instance = StructWithNoFields{};
135135
136136test "return empty struct instance" {
137 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
138
139137 _ = returnEmptyStructInstance();
140138}
141139fn returnEmptyStructInstance() StructWithNoFields {
......@@ -311,7 +309,6 @@ test "struct point to self" {
311309test "void struct fields" {
312310 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
313311 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
314 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
315312
316313 const foo = VoidStructFieldsFoo{
317314 .a = void{},
......@@ -329,7 +326,6 @@ const VoidStructFieldsFoo = struct {
329326
330327test "return empty struct from fn" {
331328 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
332 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
333329
334330 _ = testReturnEmptyStructFromFn();
335331}
......@@ -340,7 +336,6 @@ fn testReturnEmptyStructFromFn() EmptyStruct2 {
340336
341337test "pass slice of empty struct to fn" {
342338 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
343 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
344339
345340 try expect(testPassSliceOfEmptyStructToFn(&[_]EmptyStruct2{EmptyStruct2{}}) == 1);
346341}
......@@ -889,8 +884,6 @@ test "anonymous struct literal syntax" {
889884}
890885
891886test "fully anonymous struct" {
892 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
893
894887 const S = struct {
895888 fn doTheTest() !void {
896889 try dump(.{
......@@ -913,8 +906,6 @@ test "fully anonymous struct" {
913906}
914907
915908test "fully anonymous list literal" {
916 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
917
918909 const S = struct {
919910 fn doTheTest() !void {
920911 try dump(.{ @as(u32, 1234), @as(f64, 12.34), true, "hi" });
......@@ -960,7 +951,6 @@ test "tuple element initialized with fn call" {
960951 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
961952 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
962953 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
963 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
964954
965955 const S = struct {
966956 fn doTheTest() !void {
......@@ -1229,7 +1219,6 @@ test "typed init through error unions and optionals" {
12291219 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
12301220 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
12311221 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1232 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
12331222
12341223 const S = struct {
12351224 a: u32,
......@@ -1550,7 +1539,6 @@ test "no dependency loop on optional field wrapped in generic function" {
15501539test "optional field init with tuple" {
15511540 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
15521541 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1553 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
15541542
15551543 const S = struct {
15561544 a: ?struct { b: u32 },
......@@ -1652,7 +1640,6 @@ test "struct field pointer has correct alignment" {
16521640 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
16531641 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
16541642 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1655 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
16561643
16571644 const S = struct {
16581645 fn doTheTest() !void {
......@@ -1683,7 +1670,6 @@ test "extern struct field pointer has correct alignment" {
16831670 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
16841671 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
16851672 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1686 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
16871673
16881674 const S = struct {
16891675 fn doTheTest() !void {
......@@ -1721,8 +1707,6 @@ test "extern struct field pointer has correct alignment" {
17211707}
17221708
17231709test "packed struct field in anonymous struct" {
1724 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1725
17261710 const T = packed struct {
17271711 f1: bool = false,
17281712 };
test/behavior/switch.zig-7
......@@ -623,7 +623,6 @@ test "switch capture copies its payload" {
623623 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
624624 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
625625 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
626 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
627626
628627 const S = struct {
629628 fn doTheTest() !void {
......@@ -710,8 +709,6 @@ test "comptime inline switch" {
710709}
711710
712711test "switch capture peer type resolution" {
713 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
714
715712 const U = union(enum) {
716713 a: u32,
717714 b: u64,
......@@ -727,8 +724,6 @@ test "switch capture peer type resolution" {
727724}
728725
729726test "switch capture peer type resolution for in-memory coercible payloads" {
730 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
731
732727 const T1 = c_int;
733728 const T2 = @Type(@typeInfo(T1));
734729
......@@ -777,8 +772,6 @@ test "switch pointer capture peer type resolution" {
777772}
778773
779774test "inline switch range that includes the maximum value of the switched type" {
780 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
781
782775 const inputs: [3]u8 = .{ 0, 254, 255 };
783776 for (inputs) |input| {
784777 switch (input) {
test/behavior/switch_prong_err_enum.zig-1
......@@ -24,7 +24,6 @@ test "switch prong returns error enum" {
2424 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
2525 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2626 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
27 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2827
2928 switch (doThing(17) catch unreachable) {
3029 FormValue.Address => |payload| {
test/behavior/switch_prong_implicit_cast.zig-1
......@@ -18,7 +18,6 @@ test "switch prong implicit cast" {
1818 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
1919 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2020 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
21 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2221
2322 const result = switch (foo(2) catch unreachable) {
2423 FormValue.One => false,
test/behavior/threadlocal.zig-1
......@@ -33,7 +33,6 @@ test "pointer to thread local array" {
3333 else => return error.SkipZigTest,
3434 }; // TODO
3535 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
36 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
3736
3837 const s = "Hello world";
3938 std.mem.copy(u8, buffer[0..], s);
test/behavior/try.zig-3
......@@ -4,7 +4,6 @@ const expect = std.testing.expect;
44
55test "try on error union" {
66 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
7 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
87
98 try tryOnErrorUnionImpl();
109 try comptime tryOnErrorUnionImpl();
......@@ -40,8 +39,6 @@ fn failIfTrue(ok: bool) anyerror!void {
4039}
4140
4241test "try then not executed with assignment" {
43 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
44
4542 if (failIfTrue(true)) {
4643 unreachable;
4744 } else |err| {
test/behavior/tuple.zig-10
......@@ -10,7 +10,6 @@ test "tuple concatenation" {
1010 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1111 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1212 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
13 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1413
1514 const S = struct {
1615 fn doTheTest() !void {
......@@ -269,7 +268,6 @@ test "tuple in tuple passed to generic function" {
269268 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
270269 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
271270 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
272 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
273271
274272 const S = struct {
275273 fn pair(x: f32, y: f32) std.meta.Tuple(&.{ f32, f32 }) {
......@@ -310,8 +308,6 @@ test "tuple type with void field" {
310308}
311309
312310test "zero sized struct in tuple handled correctly" {
313 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
314
315311 const State = struct {
316312 const Self = @This();
317313 data: @Type(.{
......@@ -351,7 +347,6 @@ test "branching inside tuple literal" {
351347 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
352348 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
353349 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
354 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
355350
356351 const S = struct {
357352 fn foo(a: anytype) !void {
......@@ -366,7 +361,6 @@ test "tuple initialized with a runtime known value" {
366361 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
367362 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
368363 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
369 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
370364
371365 const E = union(enum) { e: []const u8 };
372366 const W = union(enum) { w: E };
......@@ -380,7 +374,6 @@ test "tuple of struct concatenation and coercion to array" {
380374 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
381375 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
382376 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
383 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
384377
385378 const StructWithDefault = struct { value: f32 = 42 };
386379 const SomeStruct = struct { array: [4]StructWithDefault };
......@@ -395,7 +388,6 @@ test "nested runtime conditionals in tuple initializer" {
395388 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
396389 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
397390 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
398 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
399391
400392 var data: u8 = 0;
401393 const x = .{
......@@ -430,7 +422,6 @@ test "tuple pointer is indexable" {
430422 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
431423 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
432424 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
433 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
434425
435426 const S = struct { u32, bool };
436427
......@@ -454,7 +445,6 @@ test "coerce anon tuple to tuple" {
454445 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
455446 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
456447 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
457 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
458448
459449 var x: u8 = 1;
460450 var y: u16 = 2;
test/behavior/tuple_declarations.zig-2
......@@ -7,7 +7,6 @@ const expectEqualStrings = testing.expectEqualStrings;
77test "tuple declaration type info" {
88 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
99 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
10 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1110
1211 {
1312 const T = struct { comptime u32 align(2) = 1, []const u8 };
......@@ -36,7 +35,6 @@ test "tuple declaration type info" {
3635test "Tuple declaration usage" {
3736 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
3837 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
39 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
4038
4139 const T = struct { u32, []const u8 };
4240 var t: T = .{ 1, "foo" };
test/behavior/type.zig-3
......@@ -202,7 +202,6 @@ test "Type.Opaque" {
202202 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
203203 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
204204 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
205 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
206205
207206 const Opaque = @Type(.{
208207 .Opaque = .{
......@@ -260,7 +259,6 @@ test "Type.Struct" {
260259 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
261260 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
262261 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
263 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
264262
265263 const A = @Type(@typeInfo(struct { x: u8, y: u32 }));
266264 const infoA = @typeInfo(A).Struct;
......@@ -348,7 +346,6 @@ test "Type.Struct" {
348346test "Type.Enum" {
349347 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
350348 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
351 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
352349
353350 const Foo = @Type(.{
354351 .Enum = .{
test/behavior/type_info.zig-1
......@@ -565,7 +565,6 @@ test "value from struct @typeInfo default_value can be loaded at comptime" {
565565test "@typeInfo decls and usingnamespace" {
566566 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
567567 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
568 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
569568
570569 const A = struct {
571570 pub const x = 5;
test/behavior/type_info_only_pub_decls.zig-2
......@@ -15,8 +15,6 @@ const other = struct {
1515};
1616
1717test {
18 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
19
2018 const ti = @typeInfo(other);
2119 const decls = ti.Struct.decls;
2220
test/behavior/typename.zig-2
......@@ -67,7 +67,6 @@ test "basic" {
6767 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
6868 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
6969 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
70 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
7170
7271 try expectEqualStrings("i64", @typeName(i64));
7372 try expectEqualStrings("*usize", @typeName(*usize));
......@@ -231,7 +230,6 @@ test "comptime parameters not converted to anytype in function type" {
231230 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
232231 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
233232 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
234 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
235233
236234 const T = fn (fn (type) void, void) void;
237235 try expectEqualStrings("fn (comptime fn (comptime type) void, void) void", @typeName(T));
test/behavior/union.zig+10-7
......@@ -97,7 +97,6 @@ const FooExtern = extern union {
9797test "basic extern unions" {
9898 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
9999 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
100 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
101100
102101 var foo = FooExtern{ .int = 1 };
103102 try expect(foo.int == 1);
......@@ -218,7 +217,6 @@ test "union with specified enum tag" {
218217 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
219218 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
220219 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
221 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
222220
223221 try doTest();
224222 try comptime doTest();
......@@ -381,7 +379,6 @@ test "tagged union initialization with runtime void" {
381379 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
382380 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
383381 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
384 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
385382
386383 try expect(testTaggedUnionInit({}));
387384}
......@@ -466,7 +463,6 @@ test "initialize global array of union" {
466463 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
467464 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
468465 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
469 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
470466
471467 glbl_array[1] = FooUnion{ .U1 = 2 };
472468 glbl_array[0] = FooUnion{ .U0 = 1 };
......@@ -966,7 +962,6 @@ test "cast from anonymous struct to union" {
966962 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
967963 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
968964 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
969 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
970965
971966 const S = struct {
972967 const U = union(enum) {
......@@ -1056,7 +1051,6 @@ test "containers with single-field enums" {
10561051 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
10571052 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
10581053 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1059 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
10601054
10611055 const S = struct {
10621056 const A = union(enum) { f1 };
......@@ -1573,7 +1567,6 @@ test "undefined-layout union field pointer has correct alignment" {
15731567 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
15741568 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
15751569 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1576 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
15771570
15781571 const S = struct {
15791572 fn doTheTest(comptime U: type) !void {
......@@ -1659,6 +1652,8 @@ test "union with 128 bit integer" {
16591652}
16601653
16611654test "memset extern union" {
1655 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1656
16621657 const U = extern union {
16631658 foo: u8,
16641659 bar: u32,
......@@ -1678,6 +1673,8 @@ test "memset extern union" {
16781673}
16791674
16801675test "memset packed union" {
1676 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1677
16811678 const U = packed union {
16821679 a: u32,
16831680 b: u8,
......@@ -1703,6 +1700,8 @@ fn littleToNativeEndian(comptime T: type, v: T) T {
17031700}
17041701
17051702test "reinterpret extern union" {
1703 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1704
17061705 const U = extern union {
17071706 foo: u8,
17081707 baz: u32 align(8),
......@@ -1771,6 +1770,8 @@ test "reinterpret extern union" {
17711770}
17721771
17731772test "reinterpret packed union" {
1773 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1774
17741775 const U = packed union {
17751776 foo: u8,
17761777 bar: u29,
......@@ -1842,6 +1843,8 @@ test "reinterpret packed union" {
18421843}
18431844
18441845test "reinterpret packed union inside packed struct" {
1846 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1847
18451848 const U = packed union {
18461849 a: u7,
18471850 b: u1,
test/behavior/usingnamespace.zig-1
......@@ -55,7 +55,6 @@ usingnamespace @import("usingnamespace/a.zig");
5555test "two files usingnamespace import each other" {
5656 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
5757 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
58 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
5958
6059 try expect(@This().ok());
6160}
test/behavior/var_args.zig-10
......@@ -14,8 +14,6 @@ fn add(args: anytype) i32 {
1414}
1515
1616test "add arbitrary args" {
17 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
18
1917 try expect(add(.{ @as(i32, 1), @as(i32, 2), @as(i32, 3), @as(i32, 4) }) == 10);
2018 try expect(add(.{@as(i32, 1234)}) == 1234);
2119 try expect(add(.{}) == 0);
......@@ -26,15 +24,12 @@ fn readFirstVarArg(args: anytype) void {
2624}
2725
2826test "send void arg to var args" {
29 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
30
3127 readFirstVarArg(.{{}});
3228}
3329
3430test "pass args directly" {
3531 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
3632 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
37 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
3833
3934 try expect(addSomeStuff(.{ @as(i32, 1), @as(i32, 2), @as(i32, 3), @as(i32, 4) }) == 10);
4035 try expect(addSomeStuff(.{@as(i32, 1234)}) == 1234);
......@@ -48,7 +43,6 @@ fn addSomeStuff(args: anytype) i32 {
4843test "runtime parameter before var args" {
4944 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
5045 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
51 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
5246
5347 try expect((try extraFn(10, .{})) == 0);
5448 try expect((try extraFn(10, .{false})) == 1);
......@@ -87,15 +81,11 @@ fn foo2(args: anytype) bool {
8781}
8882
8983test "array of var args functions" {
90 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
91
9284 try expect(foos[0](.{}));
9385 try expect(!foos[1](.{}));
9486}
9587
9688test "pass zero length array to var args param" {
97 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
98
9989 doNothingWithFirstArg(.{""});
10090}
10191
test/behavior/vector.zig-21
......@@ -11,7 +11,6 @@ test "implicit cast vector to array - bool" {
1111 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1212 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1313 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
14 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1514
1615 const S = struct {
1716 fn doTheTest() !void {
......@@ -29,7 +28,6 @@ test "vector wrap operators" {
2928 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
3029 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
3130 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
32 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
3331 if (builtin.zig_backend == .stage2_x86_64 and
3432 !comptime std.Target.x86.featureSetHas(builtin.cpu.features, .sse4_1)) return error.SkipZigTest; // TODO
3533
......@@ -54,7 +52,6 @@ test "vector bin compares with mem.eql" {
5452 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
5553 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
5654 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
57 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
5855
5956 const S = struct {
6057 fn doTheTest() !void {
......@@ -124,7 +121,6 @@ test "vector bit operators" {
124121 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
125122 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
126123 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
127 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
128124
129125 const S = struct {
130126 fn doTheTest() !void {
......@@ -143,7 +139,6 @@ test "implicit cast vector to array" {
143139 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
144140 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
145141 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
146 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
147142
148143 const S = struct {
149144 fn doTheTest() !void {
......@@ -161,7 +156,6 @@ test "array to vector" {
161156 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
162157 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
163158 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
164 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
165159
166160 const S = struct {
167161 fn doTheTest() !void {
......@@ -286,7 +280,6 @@ test "vector casts of sizes not divisible by 8" {
286280 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
287281 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
288282 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
289 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
290283
291284 const S = struct {
292285 fn doTheTest() !void {
......@@ -367,7 +360,6 @@ test "load vector elements via comptime index" {
367360 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
368361 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
369362 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
370 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
371363
372364 const S = struct {
373365 fn doTheTest() !void {
......@@ -389,7 +381,6 @@ test "store vector elements via comptime index" {
389381 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
390382 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
391383 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
392 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
393384
394385 const S = struct {
395386 fn doTheTest() !void {
......@@ -417,7 +408,6 @@ test "load vector elements via runtime index" {
417408 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
418409 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
419410 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
420 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
421411
422412 const S = struct {
423413 fn doTheTest() !void {
......@@ -439,7 +429,6 @@ test "store vector elements via runtime index" {
439429 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
440430 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
441431 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
442 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
443432
444433 const S = struct {
445434 fn doTheTest() !void {
......@@ -462,7 +451,6 @@ test "initialize vector which is a struct field" {
462451 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
463452 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
464453 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
465 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
466454
467455 const Vec4Obj = struct {
468456 data: @Vector(4, f32),
......@@ -486,7 +474,6 @@ test "vector comparison operators" {
486474 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
487475 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
488476 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
489 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
490477
491478 const S = struct {
492479 fn doTheTest() !void {
......@@ -1168,7 +1155,6 @@ test "loading the second vector from a slice of vectors" {
11681155 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
11691156 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
11701157 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1171 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
11721158
11731159 @setRuntimeSafety(false);
11741160 var small_bases = [2]@Vector(2, u8){
......@@ -1185,7 +1171,6 @@ test "array of vectors is copied" {
11851171 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
11861172 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
11871173 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1188 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
11891174
11901175 const Vec3 = @Vector(3, i32);
11911176 var points = [_]Vec3{
......@@ -1256,7 +1241,6 @@ test "zero multiplicand" {
12561241 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
12571242 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
12581243 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1259 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
12601244
12611245 const zeros = @Vector(2, u32){ 0.0, 0.0 };
12621246 var ones = @Vector(2, u32){ 1.0, 1.0 };
......@@ -1317,7 +1301,6 @@ test "load packed vector element" {
13171301 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
13181302 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13191303 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1320 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
13211304 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
13221305 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
13231306
......@@ -1348,7 +1331,6 @@ test "store to vector in slice" {
13481331 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
13491332 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
13501333 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1351 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
13521334
13531335 var v = [_]@Vector(3, f32){
13541336 .{ 1, 1, 1 },
......@@ -1412,7 +1394,6 @@ test "store vector with memset" {
14121394test "addition of vectors represented as strings" {
14131395 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
14141396 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1415 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
14161397
14171398 const V = @Vector(3, u8);
14181399 const foo: V = "foo".*;
......@@ -1438,7 +1419,6 @@ test "vector pointer is indexable" {
14381419 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
14391420 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
14401421 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1441 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
14421422
14431423 const V = @Vector(2, u32);
14441424
......@@ -1479,7 +1459,6 @@ test "bitcast to vector with different child type" {
14791459 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
14801460 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
14811461 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1482 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
14831462
14841463 const S = struct {
14851464 fn doTheTest() !void {
test/behavior/void.zig-2
......@@ -20,7 +20,6 @@ test "compare void with void compile time known" {
2020
2121test "iterate over a void slice" {
2222 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
23 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2423
2524 var j: usize = 0;
2625 for (times(10), 0..) |_, i| {
......@@ -37,7 +36,6 @@ test "void optional" {
3736 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
3837 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
3938 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
40 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
4139
4240 var x: ?void = {};
4341 try expect(x != null);
test/behavior/while.zig-1
......@@ -172,7 +172,6 @@ test "while with optional as condition with else" {
172172
173173test "while with error union condition" {
174174 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
175 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
176175
177176 numbers_left = 10;
178177 var sum: i32 = 0;
test/behavior/widening.zig-2
......@@ -22,8 +22,6 @@ fn zero() u0 {
2222 return 0;
2323}
2424test "integer widening u0 to u8" {
25 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
26
2725 const a: u8 = zero();
2826 try expect(a == 0);
2927}