| ... | ... | @@ -179453,7 +179453,26 @@ fn airBitCast(self: *CodeGen, inst: Air.Inst.Index) !void { |
| 179453 | 179453 | .gt => src_ty, |
| 179454 | 179454 | }, |
| 179455 | 179455 | .register_mask => src_ty, |
| 179456 | | }, dst_mcv, src_mcv, .{}); |
| 179456 | }, dst_mcv, if (src_ty.isVector(zcu) and src_ty.childType(zcu).toIntern() == .bool_type) src_mcv: { |
| 179457 | try self.spillEflagsIfOccupied(); |
| 179458 | const dst_signedness: std.builtin.Signedness = if (dst_ty.scalarType(zcu).isSignedInt(zcu)) .signed else .unsigned; |
| 179459 | switch (src_mcv) { |
| 179460 | .immediate => |src_imm| break :src_mcv .{ .immediate = switch (dst_signedness) { |
| 179461 | .unsigned => @as(u1, @truncate(src_imm)), |
| 179462 | .signed => @as(u8, @bitCast(@as(i8, @as(i1, @bitCast(@as(u1, @truncate(src_imm))))))), |
| 179463 | } }, |
| 179464 | else => { |
| 179465 | try self.spillEflagsIfOccupied(); |
| 179466 | const tmp_reg = try self.copyToTmpRegister(.u8, src_mcv); |
| 179467 | try self.asmRegisterImmediate(.{ ._, .@"and" }, tmp_reg.to8(), .u(1)); |
| 179468 | switch (dst_signedness) { |
| 179469 | .unsigned => {}, |
| 179470 | .signed => try self.asmRegister(.{ ._, .neg }, tmp_reg.to8()), |
| 179471 | } |
| 179472 | break :src_mcv .{ .register = tmp_reg }; |
| 179473 | }, |
| 179474 | } |
| 179475 | } else src_mcv, .{}); |
| 179457 | 179476 | break :dst dst_mcv; |
| 179458 | 179477 | }; |
| 179459 | 179478 | |
| ... | ... | @@ -182778,7 +182797,7 @@ const Temp = struct { |
| 182778 | 182797 | break :part_ty .usize; |
| 182779 | 182798 | }, |
| 182780 | 182799 | }, |
| 182781 | | .struct_type => { |
| 182800 | .struct_type, .union_type => { |
| 182782 | 182801 | assert(src_regs.len - part_index == std.math.divCeil(u32, src_abi_size, 8) catch unreachable); |
| 182783 | 182802 | break :part_ty switch (src_abi_size) { |
| 182784 | 182803 | 0, 3, 5...7 => unreachable, |