| ... | ... | @@ -91,12 +91,10 @@ pub fn generateFunction( |
| 91 | 91 | |
| 92 | 92 | fn writeFloat(comptime F: type, f: F, target: Target, endian: std.builtin.Endian, code: []u8) void { |
| 93 | 93 | _ = target; |
| 94 | | const Int = @Type(.{ .Int = .{ |
| 95 | | .signedness = .unsigned, |
| 96 | | .bits = @typeInfo(F).Float.bits, |
| 97 | | } }); |
| 94 | const bits = @typeInfo(F).Float.bits; |
| 95 | const Int = @Type(.{ .Int = .{ .signedness = .unsigned, .bits = bits } }); |
| 98 | 96 | const int = @bitCast(Int, f); |
| 99 | | mem.writeInt(Int, code[0..@sizeOf(Int)], int, endian); |
| 97 | mem.writeInt(Int, code[0..@divExact(bits, 8)], int, endian); |
| 100 | 98 | } |
| 101 | 99 | |
| 102 | 100 | pub fn generateLazySymbol( |
| ... | ... | @@ -187,18 +185,14 @@ pub fn generateSymbol( |
| 187 | 185 | }; |
| 188 | 186 | }, |
| 189 | 187 | .Float => { |
| 190 | | const float_bits = typed_value.ty.floatBits(target); |
| 191 | | switch (float_bits) { |
| 188 | switch (typed_value.ty.floatBits(target)) { |
| 192 | 189 | 16 => writeFloat(f16, typed_value.val.toFloat(f16), target, endian, try code.addManyAsArray(2)), |
| 193 | 190 | 32 => writeFloat(f32, typed_value.val.toFloat(f32), target, endian, try code.addManyAsArray(4)), |
| 194 | 191 | 64 => writeFloat(f64, typed_value.val.toFloat(f64), target, endian, try code.addManyAsArray(8)), |
| 195 | | 80 => return Result{ |
| 196 | | .fail = try ErrorMsg.create( |
| 197 | | bin_file.allocator, |
| 198 | | src_loc, |
| 199 | | "TODO handle f80 in generateSymbol", |
| 200 | | .{}, |
| 201 | | ), |
| 192 | 80 => { |
| 193 | writeFloat(f80, typed_value.val.toFloat(f80), target, endian, try code.addManyAsArray(10)); |
| 194 | const abi_size = math.cast(usize, typed_value.ty.abiSize(target)) orelse return error.Overflow; |
| 195 | try code.appendNTimes(0, abi_size - 10); |
| 202 | 196 | }, |
| 203 | 197 | 128 => writeFloat(f128, typed_value.val.toFloat(f128), target, endian, try code.addManyAsArray(16)), |
| 204 | 198 | else => unreachable, |