authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-03-04 15:18:05-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-03-05 02:59:02-05:00
log9e3a5ecd39227aff3b2821d0c0b489eb9713b146
tree547382c647e3b5a615d062711d86417d009f0988
parente96a0fd0a1a05fe8c3b4d87df03d78ae99b7dbcb

CBE: fix behavior test failures on msvc


3 files changed, 39 insertions(+), 9 deletions(-)

lib/zig.h+3-1
......@@ -1646,7 +1646,9 @@ static inline zig_u128 zig_wrap_u128(zig_u128 val, uint8_t bits) {
16461646}
16471647
16481648static inline zig_i128 zig_wrap_i128(zig_i128 val, uint8_t bits) {
1649 return zig_make_i128(zig_wrap_i64(zig_hi_i128(val), bits - UINT8_C(64)), zig_lo_i128(val));
1649 if (bits > UINT8_C(64)) return zig_make_i128(zig_wrap_i64(zig_hi_i128(val), bits - UINT8_C(64)), zig_lo_i128(val));
1650 int64_t lo = zig_wrap_i64((int64_t)zig_lo_i128(val), bits);
1651 return zig_make_i128(zig_shr_i64(lo, 63), (uint64_t)lo);
16501652}
16511653
16521654static inline zig_u128 zig_shlw_u128(zig_u128 lhs, uint8_t rhs, uint8_t bits) {
src/codegen/c.zig+29-8
......@@ -4461,10 +4461,12 @@ fn airBitcast(f: *Function, inst: Air.Inst.Index) !CValue {
44614461 if (dest_ty.isAbiInt()) {
44624462 const dest_cty = try f.typeToCType(dest_ty, .complete);
44634463 const dest_info = dest_ty.intInfo(target);
4464 var wrap_ty_pl = Type.Payload.Bits{ .base = .{ .tag = switch (dest_info.signedness) {
4464 var info_ty_pl = Type.Payload.Bits{ .base = .{ .tag = switch (dest_info.signedness) {
44654465 .unsigned => .int_unsigned,
44664466 .signed => .int_signed,
44674467 } }, .data = dest_info.bits };
4468 var wrap_cty: ?CType = null;
4469 var need_bitcasts = false;
44684470
44694471 try f.writeCValue(writer, local, .Other);
44704472 if (dest_cty.castTag(.array)) |pl| {
......@@ -4472,14 +4474,31 @@ fn airBitcast(f: *Function, inst: Air.Inst.Index) !CValue {
44724474 .Little => pl.data.len - 1,
44734475 .Big => 0,
44744476 }});
4475 wrap_ty_pl.data -= 1;
4476 wrap_ty_pl.data %= @intCast(u16, f.byteSize(f.indexToCType(pl.data.elem_type)) * 8);
4477 wrap_ty_pl.data += 1;
4477 const elem_cty = f.indexToCType(pl.data.elem_type);
4478 wrap_cty = elem_cty.toSignedness(dest_info.signedness);
4479 need_bitcasts = wrap_cty.?.tag() == .zig_i128;
4480 info_ty_pl.data -= 1;
4481 info_ty_pl.data %= @intCast(u16, f.byteSize(elem_cty) * 8);
4482 info_ty_pl.data += 1;
44784483 }
4479 const wrap_ty = Type.initPayload(&wrap_ty_pl.base);
4480 try writer.writeAll(" = zig_wrap_");
4481 try f.object.dg.renderTypeForBuiltinFnName(writer, wrap_ty);
4484 try writer.writeAll(" = ");
4485 if (need_bitcasts) {
4486 try writer.writeAll("zig_bitcast_");
4487 try f.object.dg.renderCTypeForBuiltinFnName(writer, wrap_cty.?.toUnsigned());
4488 try writer.writeByte('(');
4489 }
4490 try writer.writeAll("zig_wrap_");
4491 const info_ty = Type.initPayload(&info_ty_pl.base);
4492 if (wrap_cty) |cty|
4493 try f.object.dg.renderCTypeForBuiltinFnName(writer, cty)
4494 else
4495 try f.object.dg.renderTypeForBuiltinFnName(writer, info_ty);
44824496 try writer.writeByte('(');
4497 if (need_bitcasts) {
4498 try writer.writeAll("zig_bitcast_");
4499 try f.object.dg.renderCTypeForBuiltinFnName(writer, wrap_cty.?);
4500 try writer.writeByte('(');
4501 }
44834502 try f.writeCValue(writer, local, .Other);
44844503 if (dest_cty.castTag(.array)) |pl| {
44854504 try writer.print("[{d}]", .{switch (target.cpu.arch.endian()) {
......@@ -4487,7 +4506,9 @@ fn airBitcast(f: *Function, inst: Air.Inst.Index) !CValue {
44874506 .Big => 0,
44884507 }});
44894508 }
4490 try f.object.dg.renderBuiltinInfo(writer, wrap_ty, .bits);
4509 if (need_bitcasts) try writer.writeByte(')');
4510 try f.object.dg.renderBuiltinInfo(writer, info_ty, .bits);
4511 if (need_bitcasts) try writer.writeByte(')');
44914512 try writer.writeAll(");\n");
44924513 }
44934514
src/codegen/c/type.zig+7
......@@ -651,6 +651,13 @@ pub const CType = extern union {
651651 });
652652 }
653653
654 pub fn toSignedness(self: CType, s: std.builtin.Signedness) CType {
655 return switch (s) {
656 .unsigned => self.toUnsigned(),
657 .signed => self.toSigned(),
658 };
659 }
660
654661 pub fn getStandardDefineAbbrev(self: CType) ?[]const u8 {
655662 return switch (self.tag()) {
656663 .char => "CHAR",