mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 06:13:07 +00:00
Merge pull request #15771 from jacobly0/x86_64-behavior
x86_64: behavior
This commit is contained in:
commit
cc2daae47e
@ -1832,7 +1832,6 @@ pub fn writeIntSlice(comptime T: type, buffer: []u8, value: T, endian: Endian) v
|
||||
pub fn writeVarPackedInt(bytes: []u8, bit_offset: usize, bit_count: usize, value: anytype, endian: std.builtin.Endian) void {
|
||||
const T = @TypeOf(value);
|
||||
const uN = std.meta.Int(.unsigned, @bitSizeOf(T));
|
||||
const Log2N = std.math.Log2Int(T);
|
||||
|
||||
const bit_shift = @as(u3, @intCast(bit_offset % 8));
|
||||
const write_size = (bit_count + bit_shift + 7) / 8;
|
||||
@ -1861,9 +1860,9 @@ pub fn writeVarPackedInt(bytes: []u8, bit_offset: usize, bit_count: usize, value
|
||||
|
||||
// Write first byte, using a mask to protects bits preceding bit_offset
|
||||
const head_mask = @as(u8, 0xff) >> bit_shift;
|
||||
write_bytes[@as(usize, @intCast(i))] &= ~(head_mask << bit_shift);
|
||||
write_bytes[@as(usize, @intCast(i))] |= @as(u8, @intCast(@as(uN, @bitCast(remaining)) & head_mask)) << bit_shift;
|
||||
remaining >>= @as(Log2N, @intCast(@as(u4, 8) - bit_shift));
|
||||
write_bytes[@intCast(i)] &= ~(head_mask << bit_shift);
|
||||
write_bytes[@intCast(i)] |= @as(u8, @intCast(@as(uN, @bitCast(remaining)) & head_mask)) << bit_shift;
|
||||
remaining = math.shr(T, remaining, @as(u4, 8) - bit_shift);
|
||||
i += delta;
|
||||
|
||||
// Write bytes[1..bytes.len - 1]
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -384,7 +384,7 @@ test "Register id - different classes" {
|
||||
try expect(Register.xmm0.id() != Register.mm0.id());
|
||||
try expect(Register.mm0.id() != Register.st0.id());
|
||||
|
||||
try expect(Register.es.id() == 0b100000);
|
||||
try expect(Register.es.id() == 0b110000);
|
||||
}
|
||||
|
||||
test "Register enc - different classes" {
|
||||
|
||||
@ -369,11 +369,11 @@ pub const table = [_]Entry{
|
||||
.{ .mov, .rm, &.{ .sreg, .r32_m16 }, &.{ 0x8e }, 0, .none, .none },
|
||||
.{ .mov, .rm, &.{ .sreg, .r64_m16 }, &.{ 0x8e }, 0, .long, .none },
|
||||
.{ .mov, .fd, &.{ .al, .moffs }, &.{ 0xa0 }, 0, .none, .none },
|
||||
.{ .mov, .fd, &.{ .ax, .moffs }, &.{ 0xa1 }, 0, .none, .none },
|
||||
.{ .mov, .fd, &.{ .ax, .moffs }, &.{ 0xa1 }, 0, .short, .none },
|
||||
.{ .mov, .fd, &.{ .eax, .moffs }, &.{ 0xa1 }, 0, .none, .none },
|
||||
.{ .mov, .fd, &.{ .rax, .moffs }, &.{ 0xa1 }, 0, .long, .none },
|
||||
.{ .mov, .td, &.{ .moffs, .al }, &.{ 0xa2 }, 0, .none, .none },
|
||||
.{ .mov, .td, &.{ .moffs, .ax }, &.{ 0xa3 }, 0, .none, .none },
|
||||
.{ .mov, .td, &.{ .moffs, .ax }, &.{ 0xa3 }, 0, .short, .none },
|
||||
.{ .mov, .td, &.{ .moffs, .eax }, &.{ 0xa3 }, 0, .none, .none },
|
||||
.{ .mov, .td, &.{ .moffs, .rax }, &.{ 0xa3 }, 0, .long, .none },
|
||||
.{ .mov, .oi, &.{ .r8, .imm8 }, &.{ 0xb0 }, 0, .none, .none },
|
||||
|
||||
@ -558,7 +558,7 @@ pub fn generateSymbol(
|
||||
}
|
||||
|
||||
// Check if we should store the tag first.
|
||||
if (layout.tag_align >= layout.payload_align) {
|
||||
if (layout.tag_size > 0 and layout.tag_align >= layout.payload_align) {
|
||||
switch (try generateSymbol(bin_file, src_loc, .{
|
||||
.ty = typed_value.ty.unionTagType(mod).?,
|
||||
.val = un.tag.toValue(),
|
||||
@ -589,7 +589,7 @@ pub fn generateSymbol(
|
||||
}
|
||||
}
|
||||
|
||||
if (layout.tag_size > 0) {
|
||||
if (layout.tag_size > 0 and layout.tag_align < layout.payload_align) {
|
||||
switch (try generateSymbol(bin_file, src_loc, .{
|
||||
.ty = union_ty.tag_ty,
|
||||
.val = un.tag.toValue(),
|
||||
@ -597,10 +597,10 @@ pub fn generateSymbol(
|
||||
.ok => {},
|
||||
.fail => |em| return Result{ .fail = em },
|
||||
}
|
||||
}
|
||||
|
||||
if (layout.padding > 0) {
|
||||
try code.writer().writeByteNTimes(0, layout.padding);
|
||||
if (layout.padding > 0) {
|
||||
try code.writer().writeByteNTimes(0, layout.padding);
|
||||
}
|
||||
}
|
||||
},
|
||||
.memoized_call => unreachable,
|
||||
@ -684,10 +684,22 @@ fn lowerParentPtr(
|
||||
.struct_type,
|
||||
.anon_struct_type,
|
||||
.union_type,
|
||||
=> @as(u32, @intCast(base_type.toType().structFieldOffset(
|
||||
@as(u32, @intCast(field.index)),
|
||||
mod,
|
||||
))),
|
||||
=> switch (base_type.toType().containerLayout(mod)) {
|
||||
.Auto, .Extern => @intCast(base_type.toType().structFieldOffset(
|
||||
@intCast(field.index),
|
||||
mod,
|
||||
)),
|
||||
.Packed => if (mod.typeToStruct(base_type.toType())) |struct_obj|
|
||||
math.divExact(u16, struct_obj.packedFieldBitOffset(
|
||||
mod,
|
||||
@intCast(field.index),
|
||||
), 8) catch |err| switch (err) {
|
||||
error.UnexpectedRemainder => 0,
|
||||
error.DivisionByZero => unreachable,
|
||||
}
|
||||
else
|
||||
0,
|
||||
},
|
||||
else => unreachable,
|
||||
}),
|
||||
);
|
||||
|
||||
@ -13,7 +13,6 @@ fn value() i64 {
|
||||
return 1341;
|
||||
}
|
||||
test {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
@ -12,7 +12,6 @@ const A = union(enum) {
|
||||
};
|
||||
|
||||
test "union that needs padding bytes inside an array" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
@ -376,7 +376,6 @@ test "load pointer from packed struct" {
|
||||
}
|
||||
|
||||
test "@intFromPtr on a packed struct field" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
@ -608,7 +607,6 @@ test "pointer to container level packed struct field" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
|
||||
|
||||
@ -427,7 +427,6 @@ test "packed struct 24bits" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.cpu.arch == .wasm32) return error.SkipZigTest; // TODO
|
||||
if (builtin.cpu.arch == .arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
@ -531,7 +530,6 @@ test "packed struct fields are ordered from LSB to MSB" {
|
||||
test "implicit cast packed struct field to const ptr" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
|
||||
@ -1079,7 +1077,6 @@ test "packed struct with undefined initializers" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
|
||||
|
||||
@ -12,6 +12,11 @@ test "thread local variable" {
|
||||
}; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
if (builtin.zig_backend == .stage2_x86_64 and builtin.os.tag == .macos) {
|
||||
// Fails due to register hazards.
|
||||
return error.SkipZigTest;
|
||||
}
|
||||
|
||||
const S = struct {
|
||||
threadlocal var t: i32 = 1234;
|
||||
};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user