extendxftf2.zig (1604B) - Raw
1 const std = @import("std"); 2 const common = @import("./common.zig"); 3 4 pub const panic = common.panic; 5 6 comptime { 7 @export(&__extendxftf2, .{ .name = "__extendxftf2", .linkage = common.linkage, .visibility = common.visibility }); 8 } 9 10 fn __extendxftf2(a: f80) callconv(.c) f128 { 11 const src_int_bit: u64 = 0x8000000000000000; 12 const src_sig_mask = ~src_int_bit; 13 const src_sig_bits = std.math.floatMantissaBits(f80) - 1; // -1 for the integer bit 14 const dst_sig_bits = std.math.floatMantissaBits(f128); 15 16 const dst_bits = @bitSizeOf(f128); 17 18 // Break a into a sign and representation of the absolute value 19 var a_rep = std.math.F80.fromFloat(a); 20 const sign = a_rep.exp & 0x8000; 21 a_rep.exp &= 0x7FFF; 22 var abs_result: u128 = undefined; 23 24 if (a_rep.exp == 0 and a_rep.fraction == 0) { 25 // zero 26 abs_result = 0; 27 } else if (a_rep.exp == 0x7FFF) { 28 // a is nan or infinite 29 abs_result = @as(u128, a_rep.fraction) << (dst_sig_bits - src_sig_bits); 30 abs_result |= @as(u128, a_rep.exp) << dst_sig_bits; 31 } else if (a_rep.fraction & src_int_bit != 0) { 32 // a is a normal value 33 abs_result = @as(u128, a_rep.fraction & src_sig_mask) << (dst_sig_bits - src_sig_bits); 34 abs_result |= @as(u128, a_rep.exp) << dst_sig_bits; 35 } else { 36 // a is denormal 37 abs_result = @as(u128, a_rep.fraction) << (dst_sig_bits - src_sig_bits); 38 } 39 40 // Apply the signbit to (dst_t)abs(a). 41 const result: u128 align(@alignOf(f128)) = abs_result | @as(u128, sign) << (dst_bits - 16); 42 return @bitCast(result); 43 }