zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

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 }