| author | |
| committer | |
| log | db88b414722e698a392ec65a3ef46730341aea25 |
| tree | 9915a092d16f85355a27265a7d31637631217d1a |
| parent | 5e7f3d5daaea1e6f5e835648ffd085797b667824 |
4 files changed, 6 insertions(+), 10 deletions(-)
src/arch/x86_64/CodeGen.zig+6-4| ... | @@ -2435,6 +2435,7 @@ fn airMulDivBinOp(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -2435,6 +2435,7 @@ fn airMulDivBinOp(self: *Self, inst: Air.Inst.Index) !void { |
| 2435 | } }; | 2435 | } }; |
| 2436 | const src_ty = Type.initPayload(&src_pl.base); | 2436 | const src_ty = Type.initPayload(&src_pl.base); |
| 2437 | 2437 | ||
| 2438 | try self.spillEflagsIfOccupied(); | ||
| 2438 | try self.spillRegisters(&.{ .rax, .rdx }); | 2439 | try self.spillRegisters(&.{ .rax, .rdx }); |
| 2439 | const lhs = try self.resolveInst(bin_op.lhs); | 2440 | const lhs = try self.resolveInst(bin_op.lhs); |
| 2440 | const rhs = try self.resolveInst(bin_op.rhs); | 2441 | const rhs = try self.resolveInst(bin_op.rhs); |
| ... | @@ -7236,15 +7237,16 @@ fn airSwitchBr(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -7236,15 +7237,16 @@ fn airSwitchBr(self: *Self, inst: Air.Inst.Index) !void { |
| 7236 | var relocs = try self.gpa.alloc(u32, items.len); | 7237 | var relocs = try self.gpa.alloc(u32, items.len); |
| 7237 | defer self.gpa.free(relocs); | 7238 | defer self.gpa.free(relocs); |
| 7238 | 7239 | ||
| 7239 | for (items, relocs) |item, *reloc| { | 7240 | try self.spillEflagsIfOccupied(); |
| 7240 | try self.spillEflagsIfOccupied(); | 7241 | for (items, relocs, 0..) |item, *reloc, i| { |
| 7241 | const item_mcv = try self.resolveInst(item); | 7242 | const item_mcv = try self.resolveInst(item); |
| 7242 | try self.genBinOpMir(.cmp, condition_ty, condition, item_mcv); | 7243 | try self.genBinOpMir(.cmp, condition_ty, condition, item_mcv); |
| 7243 | reloc.* = try self.asmJccReloc(undefined, .ne); | 7244 | reloc.* = try self.asmJccReloc(undefined, if (i < relocs.len - 1) .e else .ne); |
| 7244 | } | 7245 | } |
| 7245 | 7246 | ||
| 7246 | for (liveness.deaths[case_i]) |operand| self.processDeath(operand); | 7247 | for (liveness.deaths[case_i]) |operand| self.processDeath(operand); |
| 7247 | 7248 | ||
| 7249 | for (relocs[0 .. relocs.len - 1]) |reloc| try self.performReloc(reloc); | ||
| 7248 | try self.genBody(case_body); | 7250 | try self.genBody(case_body); |
| 7249 | try self.restoreState(state, &.{}, .{ | 7251 | try self.restoreState(state, &.{}, .{ |
| 7250 | .emit_instructions = false, | 7252 | .emit_instructions = false, |
| ... | @@ -7253,7 +7255,7 @@ fn airSwitchBr(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -7253,7 +7255,7 @@ fn airSwitchBr(self: *Self, inst: Air.Inst.Index) !void { |
| 7253 | .close_scope = true, | 7255 | .close_scope = true, |
| 7254 | }); | 7256 | }); |
| 7255 | 7257 | ||
| 7256 | for (relocs) |reloc| try self.performReloc(reloc); | 7258 | try self.performReloc(relocs[relocs.len - 1]); |
| 7257 | } | 7259 | } |
| 7258 | 7260 | ||
| 7259 | if (switch_br.data.else_body_len > 0) { | 7261 | if (switch_br.data.else_body_len > 0) { |
test/behavior/inline_switch.zig-1| ... | @@ -94,7 +94,6 @@ test "inline else error" { | ... | @@ -94,7 +94,6 @@ test "inline else error" { |
| 94 | 94 | ||
| 95 | test "inline else enum" { | 95 | test "inline else enum" { |
| 96 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 96 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 97 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | ||
| 98 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 97 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 99 | 98 | ||
| 100 | const E2 = enum(u8) { a = 2, b = 3, c = 4, d = 5 }; | 99 | const E2 = enum(u8) { a = 2, b = 3, c = 4, d = 5 }; |
test/behavior/switch.zig-4| ... | @@ -88,7 +88,6 @@ fn nonConstSwitch(foo: SwitchStatementFoo) !void { | ... | @@ -88,7 +88,6 @@ fn nonConstSwitch(foo: SwitchStatementFoo) !void { |
| 88 | const SwitchStatementFoo = enum { A, B, C, D }; | 88 | const SwitchStatementFoo = enum { A, B, C, D }; |
| 89 | 89 | ||
| 90 | test "switch with multiple expressions" { | 90 | test "switch with multiple expressions" { |
| 91 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | ||
| 92 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 91 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 93 | 92 | ||
| 94 | const x = switch (returnsFive()) { | 93 | const x = switch (returnsFive()) { |
| ... | @@ -275,7 +274,6 @@ fn testSwitchEnumPtrCapture() !void { | ... | @@ -275,7 +274,6 @@ fn testSwitchEnumPtrCapture() !void { |
| 275 | } | 274 | } |
| 276 | 275 | ||
| 277 | test "switch handles all cases of number" { | 276 | test "switch handles all cases of number" { |
| 278 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | ||
| 279 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 277 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 280 | 278 | ||
| 281 | try testSwitchHandleAllCases(); | 279 | try testSwitchHandleAllCases(); |
| ... | @@ -455,7 +453,6 @@ test "else prong of switch on error set excludes other cases" { | ... | @@ -455,7 +453,6 @@ test "else prong of switch on error set excludes other cases" { |
| 455 | } | 453 | } |
| 456 | 454 | ||
| 457 | test "switch prongs with error set cases make a new error set type for capture value" { | 455 | test "switch prongs with error set cases make a new error set type for capture value" { |
| 458 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | ||
| 459 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 456 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 460 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 457 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 461 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 458 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| ... | @@ -532,7 +529,6 @@ test "switch with null and T peer types and inferred result location type" { | ... | @@ -532,7 +529,6 @@ test "switch with null and T peer types and inferred result location type" { |
| 532 | test "switch prongs with cases with identical payload types" { | 529 | test "switch prongs with cases with identical payload types" { |
| 533 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 530 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 534 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 531 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 535 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | ||
| 536 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 532 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 537 | 533 | ||
| 538 | const Union = union(enum) { | 534 | const Union = union(enum) { |
test/behavior/union.zig-1| ... | @@ -1288,7 +1288,6 @@ test "return an extern union from C calling convention" { | ... | @@ -1288,7 +1288,6 @@ test "return an extern union from C calling convention" { |
| 1288 | test "noreturn field in union" { | 1288 | test "noreturn field in union" { |
| 1289 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1289 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1290 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1290 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1291 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | ||
| 1292 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1291 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1293 | 1292 | ||
| 1294 | const U = union(enum) { | 1293 | const U = union(enum) { |