authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-10-20 04:34:10-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-10-21 10:55:41-04:00
logc880644d929ff8e403494ff7e6e347b4857db263
treecbc3002540eab62b3d2757c2b86e9e47cc39e68a
parent9358a7528f74cfa8b45f98e83749b8e695d9a941

x86_64: disable difficult std tests and hack around more zero-bit types


9 files changed, 96 insertions(+), 50 deletions(-)

lib/std/crypto/ecdsa.zig+24-6
......@@ -372,7 +372,10 @@ pub fn Ecdsa(comptime Curve: type, comptime Hash: type) type {
372372}
373373
374374test "ECDSA - Basic operations over EcdsaP384Sha384" {
375 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
375 switch (builtin.zig_backend) {
376 .stage2_c, .stage2_x86_64 => return error.SkipZigTest,
377 else => {},
378 }
376379
377380 const Scheme = EcdsaP384Sha384;
378381 const kp = try Scheme.KeyPair.create(null);
......@@ -388,7 +391,10 @@ test "ECDSA - Basic operations over EcdsaP384Sha384" {
388391}
389392
390393test "ECDSA - Basic operations over Secp256k1" {
391 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
394 switch (builtin.zig_backend) {
395 .stage2_c, .stage2_x86_64 => return error.SkipZigTest,
396 else => {},
397 }
392398
393399 const Scheme = EcdsaSecp256k1Sha256oSha256;
394400 const kp = try Scheme.KeyPair.create(null);
......@@ -404,7 +410,10 @@ test "ECDSA - Basic operations over Secp256k1" {
404410}
405411
406412test "ECDSA - Basic operations over EcdsaP384Sha256" {
407 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
413 switch (builtin.zig_backend) {
414 .stage2_c, .stage2_x86_64 => return error.SkipZigTest,
415 else => {},
416 }
408417
409418 const Scheme = Ecdsa(crypto.ecc.P384, crypto.hash.sha2.Sha256);
410419 const kp = try Scheme.KeyPair.create(null);
......@@ -420,7 +429,10 @@ test "ECDSA - Basic operations over EcdsaP384Sha256" {
420429}
421430
422431test "ECDSA - Verifying a existing signature with EcdsaP384Sha256" {
423 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
432 switch (builtin.zig_backend) {
433 .stage2_c, .stage2_x86_64 => return error.SkipZigTest,
434 else => {},
435 }
424436
425437 const Scheme = Ecdsa(crypto.ecc.P384, crypto.hash.sha2.Sha256);
426438 // zig fmt: off
......@@ -464,7 +476,10 @@ const TestVector = struct {
464476};
465477
466478test "ECDSA - Test vectors from Project Wycheproof" {
467 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
479 switch (builtin.zig_backend) {
480 .stage2_c, .stage2_x86_64 => return error.SkipZigTest,
481 else => {},
482 }
468483
469484 const vectors = [_]TestVector{
470485 .{ .key = "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e", .msg = "313233343030", .sig = "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802204cd60b855d442f5b3c7b11eb6c4e0ae7525fe710fab9aa7c77a67f79e6fadd76", .result = .valid },
......@@ -878,7 +893,10 @@ fn tvTry(vector: TestVector) !void {
878893}
879894
880895test "ECDSA - Sec1 encoding/decoding" {
881 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
896 switch (builtin.zig_backend) {
897 .stage2_c, .stage2_x86_64 => return error.SkipZigTest,
898 else => {},
899 }
882900
883901 const Scheme = EcdsaP384Sha384;
884902 const kp = try Scheme.KeyPair.create(null);
lib/std/crypto/ff.zig+4-1
......@@ -912,7 +912,10 @@ const ct_unprotected = struct {
912912};
913913
914914test {
915 if (@import("builtin").zig_backend == .stage2_c) return error.SkipZigTest;
915 switch (@import("builtin").zig_backend) {
916 .stage2_c, .stage2_x86_64 => return error.SkipZigTest,
917 else => {},
918 }
916919
917920 const M = Modulus(256);
918921 const m = try M.fromPrimitive(u256, 3429938563481314093726330772853735541133072814650493833233);
lib/std/crypto/pcurves/p384.zig+4-1
......@@ -478,7 +478,10 @@ pub const AffineCoordinates = struct {
478478};
479479
480480test {
481 if (@import("builtin").zig_backend == .stage2_c) return error.SkipZigTest;
481 switch (@import("builtin").zig_backend) {
482 .stage2_c, .stage2_x86_64 => return error.SkipZigTest,
483 else => {},
484 }
482485
483486 _ = @import("tests/p384.zig");
484487}
lib/std/crypto/pcurves/secp256k1.zig+4-1
......@@ -556,7 +556,10 @@ pub const AffineCoordinates = struct {
556556};
557557
558558test {
559 if (@import("builtin").zig_backend == .stage2_c) return error.SkipZigTest;
559 switch (@import("builtin").zig_backend) {
560 .stage2_c, .stage2_x86_64 => return error.SkipZigTest,
561 else => {},
562 }
560563
561564 _ = @import("tests/secp256k1.zig");
562565}
lib/std/math/big/int_test.zig+2
......@@ -3031,6 +3031,8 @@ fn byteSwapTest(comptime T: type, comptime input: comptime_int, comptime expecte
30313031}
30323032
30333033test "big int byte swap" {
3034 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
3035
30343036 var a = try Managed.initSet(testing.allocator, 0x01_ffffffff_ffffffff_ffffffff);
30353037 defer a.deinit();
30363038
lib/std/math/log10.zig+1-1
......@@ -170,11 +170,11 @@ test "log10_int vs old implementation" {
170170test "log10_int close to powers of 10" {
171171 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
172172 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
173 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
174173 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
175174 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
176175 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
177176 if (builtin.zig_backend == .stage2_llvm and comptime builtin.target.isWasm()) return error.SkipZigTest; // TODO
177 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
178178
179179 const int_types = .{ u8, u16, u32, u64, u128, u256, u512 };
180180 const max_log_values: [7]usize = .{ 2, 4, 9, 19, 38, 77, 154 };
lib/std/math/nextafter.zig+2
......@@ -103,6 +103,8 @@ fn nextAfterFloat(comptime T: type, x: T, y: T) T {
103103}
104104
105105test "math.nextAfter.int" {
106 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
107
106108 try expect(nextAfter(i0, 0, 0) == 0);
107109 try expect(nextAfter(u0, 0, 0) == 0);
108110 try expect(nextAfter(i1, 0, 0) == 0);
src/arch/x86_64/CodeGen.zig+53-38
......@@ -2895,13 +2895,16 @@ fn airIntCast(self: *Self, inst: Air.Inst.Index) !void {
28952895 }.signedness;
28962896
28972897 const src_mcv = try self.resolveInst(ty_op.operand);
2898 const src_storage_bits = switch (src_mcv) {
2898 const src_storage_bits: u16 = switch (src_mcv) {
28992899 .register, .register_offset => 64,
2900 .load_frame => |frame_addr| self.getFrameAddrSize(frame_addr) * 8,
2900 .register_pair => 128,
2901 .load_frame => |frame_addr| @intCast(self.getFrameAddrSize(frame_addr) * 8),
29012902 else => src_int_info.bits,
29022903 };
29032904
29042905 const dst_mcv = if (dst_int_info.bits <= src_storage_bits and
2906 std.math.divCeil(u16, dst_int_info.bits, 64) catch unreachable ==
2907 std.math.divCeil(u32, src_storage_bits, 64) catch unreachable and
29052908 self.reuseOperand(inst, ty_op.operand, 0, src_mcv)) src_mcv else dst: {
29062909 const dst_mcv = try self.allocRegOrMem(inst, true);
29072910 try self.genCopy(min_ty, dst_mcv, src_mcv);
......@@ -3646,7 +3649,10 @@ fn airMulWithOverflow(self: *Self, inst: Air.Inst.Index) !void {
36463649 },
36473650 else => {
36483651 // For now, this is the only supported multiply that doesn't fit in a register.
3649 assert(dst_info.bits <= 128 and src_bits == 64);
3652 if (dst_info.bits > 128 or src_bits != 64)
3653 return self.fail("TODO implement airWithOverflow from {} to {}", .{
3654 src_ty.fmt(mod), dst_ty.fmt(mod),
3655 });
36503656
36513657 const frame_index =
36523658 try self.allocFrameIndex(FrameAlloc.initType(tuple_ty, mod));
......@@ -4424,42 +4430,46 @@ fn airPtrElemVal(self: *Self, inst: Air.Inst.Index) !void {
44244430 // this is identical to the `airPtrElemPtr` codegen expect here an
44254431 // additional `mov` is needed at the end to get the actual value
44264432
4427 const elem_ty = ptr_ty.elemType2(mod);
4428 const elem_abi_size: u32 = @intCast(elem_ty.abiSize(mod));
4429 const index_ty = self.typeOf(bin_op.rhs);
4430 const index_mcv = try self.resolveInst(bin_op.rhs);
4431 const index_lock = switch (index_mcv) {
4432 .register => |reg| self.register_manager.lockRegAssumeUnused(reg),
4433 else => null,
4434 };
4435 defer if (index_lock) |lock| self.register_manager.unlockReg(lock);
4433 const result = result: {
4434 const elem_ty = ptr_ty.elemType2(mod);
4435 if (!elem_ty.hasRuntimeBitsIgnoreComptime(mod)) break :result .none;
44364436
4437 const offset_reg = try self.elemOffset(index_ty, index_mcv, elem_abi_size);
4438 const offset_lock = self.register_manager.lockRegAssumeUnused(offset_reg);
4439 defer self.register_manager.unlockReg(offset_lock);
4437 const elem_abi_size: u32 = @intCast(elem_ty.abiSize(mod));
4438 const index_ty = self.typeOf(bin_op.rhs);
4439 const index_mcv = try self.resolveInst(bin_op.rhs);
4440 const index_lock = switch (index_mcv) {
4441 .register => |reg| self.register_manager.lockRegAssumeUnused(reg),
4442 else => null,
4443 };
4444 defer if (index_lock) |lock| self.register_manager.unlockReg(lock);
44404445
4441 const ptr_mcv = try self.resolveInst(bin_op.lhs);
4442 const elem_ptr_reg = if (ptr_mcv.isRegister() and self.liveness.operandDies(inst, 0))
4443 ptr_mcv.register
4444 else
4445 try self.copyToTmpRegister(ptr_ty, ptr_mcv);
4446 const elem_ptr_lock = self.register_manager.lockRegAssumeUnused(elem_ptr_reg);
4447 defer self.register_manager.unlockReg(elem_ptr_lock);
4448 try self.asmRegisterRegister(
4449 .{ ._, .add },
4450 elem_ptr_reg,
4451 offset_reg,
4452 );
4446 const offset_reg = try self.elemOffset(index_ty, index_mcv, elem_abi_size);
4447 const offset_lock = self.register_manager.lockRegAssumeUnused(offset_reg);
4448 defer self.register_manager.unlockReg(offset_lock);
44534449
4454 const dst_mcv = try self.allocRegOrMem(inst, true);
4455 const dst_lock = switch (dst_mcv) {
4456 .register => |reg| self.register_manager.lockRegAssumeUnused(reg),
4457 else => null,
4458 };
4459 defer if (dst_lock) |lock| self.register_manager.unlockReg(lock);
4460 try self.load(dst_mcv, ptr_ty, .{ .register = elem_ptr_reg });
4450 const ptr_mcv = try self.resolveInst(bin_op.lhs);
4451 const elem_ptr_reg = if (ptr_mcv.isRegister() and self.liveness.operandDies(inst, 0))
4452 ptr_mcv.register
4453 else
4454 try self.copyToTmpRegister(ptr_ty, ptr_mcv);
4455 const elem_ptr_lock = self.register_manager.lockRegAssumeUnused(elem_ptr_reg);
4456 defer self.register_manager.unlockReg(elem_ptr_lock);
4457 try self.asmRegisterRegister(
4458 .{ ._, .add },
4459 elem_ptr_reg,
4460 offset_reg,
4461 );
44614462
4462 return self.finishAir(inst, dst_mcv, .{ bin_op.lhs, bin_op.rhs, .none });
4463 const dst_mcv = try self.allocRegOrMem(inst, true);
4464 const dst_lock = switch (dst_mcv) {
4465 .register => |reg| self.register_manager.lockRegAssumeUnused(reg),
4466 else => null,
4467 };
4468 defer if (dst_lock) |lock| self.register_manager.unlockReg(lock);
4469 try self.load(dst_mcv, ptr_ty, .{ .register = elem_ptr_reg });
4470 break :result dst_mcv;
4471 };
4472 return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });
44634473}
44644474
44654475fn airPtrElemPtr(self: *Self, inst: Air.Inst.Index) !void {
......@@ -5790,15 +5800,17 @@ fn packedLoad(self: *Self, dst_mcv: MCValue, ptr_ty: Type, ptr_mcv: MCValue) Inn
57905800 const ptr_info = ptr_ty.ptrInfo(mod);
57915801
57925802 const val_ty = ptr_info.child.toType();
5803 if (!val_ty.hasRuntimeBitsIgnoreComptime(mod)) return;
57935804 const val_abi_size: u32 = @intCast(val_ty.abiSize(mod));
5805
5806 if (val_abi_size > 8) return self.fail("TODO implement packed load of {}", .{val_ty.fmt(mod)});
5807
57945808 const limb_abi_size: u32 = @min(val_abi_size, 8);
57955809 const limb_abi_bits = limb_abi_size * 8;
57965810 const val_byte_off: i32 = @intCast(ptr_info.packed_offset.bit_offset / limb_abi_bits * limb_abi_size);
57975811 const val_bit_off = ptr_info.packed_offset.bit_offset % limb_abi_bits;
57985812 const val_extra_bits = self.regExtraBits(val_ty);
57995813
5800 if (val_abi_size > 8) return self.fail("TODO implement packed load of {}", .{val_ty.fmt(mod)});
5801
58025814 const ptr_reg = try self.copyToTmpRegister(ptr_ty, ptr_mcv);
58035815 const ptr_lock = self.register_manager.lockRegAssumeUnused(ptr_reg);
58045816 defer self.register_manager.unlockReg(ptr_lock);
......@@ -5861,6 +5873,7 @@ fn packedLoad(self: *Self, dst_mcv: MCValue, ptr_ty: Type, ptr_mcv: MCValue) Inn
58615873fn load(self: *Self, dst_mcv: MCValue, ptr_ty: Type, ptr_mcv: MCValue) InnerError!void {
58625874 const mod = self.bin_file.options.module.?;
58635875 const dst_ty = ptr_ty.childType(mod);
5876 if (!dst_ty.hasRuntimeBitsIgnoreComptime(mod)) return;
58645877 switch (ptr_mcv) {
58655878 .none,
58665879 .unreach,
......@@ -5937,6 +5950,7 @@ fn packedStore(self: *Self, ptr_ty: Type, ptr_mcv: MCValue, src_mcv: MCValue) In
59375950 const mod = self.bin_file.options.module.?;
59385951 const ptr_info = ptr_ty.ptrInfo(mod);
59395952 const src_ty = ptr_ty.childType(mod);
5953 if (!src_ty.hasRuntimeBitsIgnoreComptime(mod)) return;
59405954
59415955 const limb_abi_size: u16 = @min(ptr_info.packed_offset.host_size, 8);
59425956 const limb_abi_bits = limb_abi_size * 8;
......@@ -6008,6 +6022,7 @@ fn packedStore(self: *Self, ptr_ty: Type, ptr_mcv: MCValue, src_mcv: MCValue) In
60086022fn store(self: *Self, ptr_ty: Type, ptr_mcv: MCValue, src_mcv: MCValue) InnerError!void {
60096023 const mod = self.bin_file.options.module.?;
60106024 const src_ty = ptr_ty.childType(mod);
6025 if (!src_ty.hasRuntimeBitsIgnoreComptime(mod)) return;
60116026 switch (ptr_mcv) {
60126027 .none,
60136028 .unreach,
......@@ -11286,7 +11301,6 @@ fn genSetReg(self: *Self, dst_reg: Register, ty: Type, src_mcv: MCValue) InnerEr
1128611301 .none,
1128711302 .unreach,
1128811303 .dead,
11289 .register_pair,
1129011304 .register_overflow,
1129111305 .reserved_frame,
1129211306 => unreachable,
......@@ -11390,6 +11404,7 @@ fn genSetReg(self: *Self, dst_reg: Register, ty: Type, src_mcv: MCValue) InnerEr
1139011404 },
1139111405 .x87, .mmx => unreachable,
1139211406 },
11407 .register_pair => |src_regs| try self.genSetReg(dst_reg, ty, .{ .register = src_regs[0] }),
1139311408 .register_offset,
1139411409 .indirect,
1139511410 .load_frame,
src/codegen.zig+2-2
......@@ -545,7 +545,7 @@ pub fn generateSymbol(
545545
546546 if (layout.payload_size == 0) {
547547 return generateSymbol(bin_file, src_loc, .{
548 .ty = typed_value.ty.unionTagType(mod).?,
548 .ty = typed_value.ty.unionTagTypeSafety(mod).?,
549549 .val = un.tag.toValue(),
550550 }, code, debug_output, reloc_info);
551551 }
......@@ -553,7 +553,7 @@ pub fn generateSymbol(
553553 // Check if we should store the tag first.
554554 if (layout.tag_size > 0 and layout.tag_align.compare(.gte, layout.payload_align)) {
555555 switch (try generateSymbol(bin_file, src_loc, .{
556 .ty = typed_value.ty.unionTagType(mod).?,
556 .ty = typed_value.ty.unionTagTypeSafety(mod).?,
557557 .val = un.tag.toValue(),
558558 }, code, debug_output, reloc_info)) {
559559 .ok => {},