| author | |
| committer | |
| log | 7c85ea65ba9f85be44aa8af3745a6038b132bd7f |
| tree | 4eeab33da7bddb8669826f8bf7597513ddc0e83d |
| parent | 82ba9b8560f6f173953e6d89321235036b98bafe |
3 files changed, 24 insertions(+), 17 deletions(-)
src/arch/x86_64/CodeGen.zig+20-10| ... | ... | @@ -8480,7 +8480,8 @@ fn genBinOp( |
| 8480 | 8480 | if (maybe_mask_reg) |mask_reg| self.register_manager.lockRegAssumeUnused(mask_reg) else null; |
| 8481 | 8481 | defer if (mask_lock) |lock| self.register_manager.unlockReg(lock); |
| 8482 | 8482 | |
| 8483 | const ordered_air = if (lhs_ty.isVector(mod) and switch (lhs_ty.childType(mod).zigTypeTag(mod)) { | |
| 8483 | const ordered_air: [2]Air.Inst.Ref = if (lhs_ty.isVector(mod) and | |
| 8484 | switch (lhs_ty.childType(mod).zigTypeTag(mod)) { | |
| 8484 | 8485 | .Int => switch (air_tag) { |
| 8485 | 8486 | .cmp_lt, .cmp_gte => true, |
| 8486 | 8487 | else => false, |
| ... | ... | @@ -8490,14 +8491,24 @@ fn genBinOp( |
| 8490 | 8491 | else => false, |
| 8491 | 8492 | }, |
| 8492 | 8493 | else => unreachable, |
| 8493 | }) .{ .lhs = rhs_air, .rhs = lhs_air } else .{ .lhs = lhs_air, .rhs = rhs_air }; | |
| 8494 | }) .{ rhs_air, lhs_air } else .{ lhs_air, rhs_air }; | |
| 8494 | 8495 | |
| 8495 | const lhs_mcv = try self.resolveInst(ordered_air.lhs); | |
| 8496 | var rhs_mcv = try self.resolveInst(ordered_air.rhs); | |
| 8496 | if (lhs_ty.isAbiInt(mod)) for (ordered_air) |op_air| { | |
| 8497 | switch (try self.resolveInst(op_air)) { | |
| 8498 | .register => |op_reg| switch (op_reg.class()) { | |
| 8499 | .sse => try self.register_manager.getReg(op_reg, null), | |
| 8500 | else => {}, | |
| 8501 | }, | |
| 8502 | else => {}, | |
| 8503 | } | |
| 8504 | }; | |
| 8505 | ||
| 8506 | const lhs_mcv = try self.resolveInst(ordered_air[0]); | |
| 8507 | var rhs_mcv = try self.resolveInst(ordered_air[1]); | |
| 8497 | 8508 | switch (lhs_mcv) { |
| 8498 | 8509 | .immediate => |imm| switch (imm) { |
| 8499 | 8510 | 0 => switch (air_tag) { |
| 8500 | .sub, .sub_wrap => return self.genUnOp(maybe_inst, .neg, ordered_air.rhs), | |
| 8511 | .sub, .sub_wrap => return self.genUnOp(maybe_inst, .neg, ordered_air[1]), | |
| 8501 | 8512 | else => {}, |
| 8502 | 8513 | }, |
| 8503 | 8514 | else => {}, |
| ... | ... | @@ -8549,10 +8560,10 @@ fn genBinOp( |
| 8549 | 8560 | }; |
| 8550 | 8561 | if (maybe_inst) |inst| { |
| 8551 | 8562 | if ((!sse_op or lhs_mcv.isRegister()) and |
| 8552 | self.reuseOperandAdvanced(inst, ordered_air.lhs, 0, lhs_mcv, tracked_inst)) | |
| 8563 | self.reuseOperandAdvanced(inst, ordered_air[0], 0, lhs_mcv, tracked_inst)) | |
| 8553 | 8564 | break :dst lhs_mcv; |
| 8554 | 8565 | if (is_commutative and (!sse_op or rhs_mcv.isRegister()) and |
| 8555 | self.reuseOperandAdvanced(inst, ordered_air.rhs, 1, rhs_mcv, tracked_inst)) | |
| 8566 | self.reuseOperandAdvanced(inst, ordered_air[1], 1, rhs_mcv, tracked_inst)) | |
| 8556 | 8567 | { |
| 8557 | 8568 | flipped = true; |
| 8558 | 8569 | break :dst rhs_mcv; |
| ... | ... | @@ -8563,7 +8574,7 @@ fn genBinOp( |
| 8563 | 8574 | copied_to_dst = false |
| 8564 | 8575 | else |
| 8565 | 8576 | try self.genCopy(lhs_ty, dst_mcv, lhs_mcv); |
| 8566 | rhs_mcv = try self.resolveInst(ordered_air.rhs); | |
| 8577 | rhs_mcv = try self.resolveInst(ordered_air[1]); | |
| 8567 | 8578 | break :dst dst_mcv; |
| 8568 | 8579 | }; |
| 8569 | 8580 | const dst_locks: [2]?RegisterLock = switch (dst_mcv) { |
| ... | ... | @@ -15445,7 +15456,7 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void { |
| 15445 | 15456 | } |
| 15446 | 15457 | break :result .{ .load_frame = .{ .index = frame_index } }; |
| 15447 | 15458 | }, |
| 15448 | .Array => { | |
| 15459 | .Array, .Vector => { | |
| 15449 | 15460 | const frame_index = try self.allocFrameIndex(FrameAlloc.initSpill(result_ty, mod)); |
| 15450 | 15461 | const elem_ty = result_ty.childType(mod); |
| 15451 | 15462 | const elem_size: u32 = @intCast(elem_ty.abiSize(mod)); |
| ... | ... | @@ -15467,7 +15478,6 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void { |
| 15467 | 15478 | ); |
| 15468 | 15479 | break :result .{ .load_frame = .{ .index = frame_index } }; |
| 15469 | 15480 | }, |
| 15470 | .Vector => return self.fail("TODO implement aggregate_init for vectors", .{}), | |
| 15471 | 15481 | else => unreachable, |
| 15472 | 15482 | } |
| 15473 | 15483 | }; |
test/behavior/cast.zig+3-6| ... | ... | @@ -1476,7 +1476,7 @@ test "coerce between pointers of compatible differently-named floats" { |
| 1476 | 1476 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 1477 | 1477 | if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest; |
| 1478 | 1478 | |
| 1479 | if (builtin.os.tag == .windows) { | |
| 1479 | if (builtin.zig_backend == .stage2_llvm and builtin.os.tag == .windows) { | |
| 1480 | 1480 | // https://github.com/ziglang/zig/issues/12396 |
| 1481 | 1481 | return error.SkipZigTest; |
| 1482 | 1482 | } |
| ... | ... | @@ -1723,7 +1723,6 @@ test "peer type resolution: array and vector with same child type" { |
| 1723 | 1723 | test "peer type resolution: array with smaller child type and vector with larger child type" { |
| 1724 | 1724 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1725 | 1725 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1726 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | |
| 1727 | 1726 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1728 | 1727 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1729 | 1728 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -2311,11 +2310,11 @@ test "cast builtins can wrap result in error union and optional" { |
| 2311 | 2310 | |
| 2312 | 2311 | test "@floatCast on vector" { |
| 2313 | 2312 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 2314 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | |
| 2315 | 2313 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2316 | 2314 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 2317 | 2315 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 2318 | 2316 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 2317 | if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest; | |
| 2319 | 2318 | |
| 2320 | 2319 | const S = struct { |
| 2321 | 2320 | fn doTheTest() !void { |
| ... | ... | @@ -2332,7 +2331,6 @@ test "@floatCast on vector" { |
| 2332 | 2331 | |
| 2333 | 2332 | test "@ptrFromInt on vector" { |
| 2334 | 2333 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 2335 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | |
| 2336 | 2334 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2337 | 2335 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 2338 | 2336 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -2382,11 +2380,11 @@ test "@intFromPtr on vector" { |
| 2382 | 2380 | |
| 2383 | 2381 | test "@floatFromInt on vector" { |
| 2384 | 2382 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 2385 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | |
| 2386 | 2383 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2387 | 2384 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 2388 | 2385 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 2389 | 2386 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 2387 | if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest; | |
| 2390 | 2388 | |
| 2391 | 2389 | const S = struct { |
| 2392 | 2390 | fn doTheTest() !void { |
| ... | ... | @@ -2403,7 +2401,6 @@ test "@floatFromInt on vector" { |
| 2403 | 2401 | |
| 2404 | 2402 | test "@intFromFloat on vector" { |
| 2405 | 2403 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 2406 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | |
| 2407 | 2404 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2408 | 2405 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 2409 | 2406 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
test/behavior/vector.zig+1-1| ... | ... | @@ -222,7 +222,7 @@ test "array to vector with element type coercion" { |
| 222 | 222 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 223 | 223 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 224 | 224 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 225 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; | |
| 225 | if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest; | |
| 226 | 226 | |
| 227 | 227 | const S = struct { |
| 228 | 228 | fn doTheTest() !void { |