| author | |
| committer | |
| log | 814a34f263cbfeabbf7a898b3b70fa781baaccac |
| tree | 7a0c74c058b5c3113183ef0966b2f6387b826128 |
| parent | 53fef94b9fb2b04d208a0671aa58e90f93f412cf |
7 files changed, 451 insertions(+), 0 deletions(-)
std/special/compiler_rt/floattidf.zig created+69| ... | @@ -0,0 +1,69 @@ | ||
| 1 | const builtin = @import("builtin"); | ||
| 2 | const is_test = builtin.is_test; | ||
| 3 | |||
| 4 | const DBL_MANT_DIG = 53; | ||
| 5 | |||
| 6 | pub extern fn __floattidf(arg: i128) f64 { | ||
| 7 | @setRuntimeSafety(is_test); | ||
| 8 | |||
| 9 | if (arg == 0) | ||
| 10 | return 0.0; | ||
| 11 | |||
| 12 | var ai = arg; | ||
| 13 | const N: u32 = 128; | ||
| 14 | const si = ai >> @intCast(u7, (N - 1)); | ||
| 15 | ai = ((ai ^ si) -% si); | ||
| 16 | var a = @bitCast(u128, ai); | ||
| 17 | |||
| 18 | const sd = @bitCast(i32, N - @clz(a)); // number of significant digits | ||
| 19 | var e: i32 = sd - 1; // exponent | ||
| 20 | if (sd > DBL_MANT_DIG) { | ||
| 21 | // start: 0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx | ||
| 22 | // finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR | ||
| 23 | // 12345678901234567890123456 | ||
| 24 | // 1 = msb 1 bit | ||
| 25 | // P = bit DBL_MANT_DIG-1 bits to the right of 1 | ||
| 26 | // Q = bit DBL_MANT_DIG bits to the right of 1 | ||
| 27 | // R = "or" of all bits to the right of Q | ||
| 28 | switch (sd) { | ||
| 29 | DBL_MANT_DIG + 1 => { | ||
| 30 | a <<= 1; | ||
| 31 | }, | ||
| 32 | DBL_MANT_DIG + 2 => {}, | ||
| 33 | else => { | ||
| 34 | const shift1_amt = @intCast(i32, sd - (DBL_MANT_DIG + 2)); | ||
| 35 | const shift1_amt_u7 = @intCast(u7, shift1_amt); | ||
| 36 | |||
| 37 | const shift2_amt = @intCast(i32, N + (DBL_MANT_DIG + 2)) - sd; | ||
| 38 | const shift2_amt_u7 = @intCast(u7, shift2_amt); | ||
| 39 | |||
| 40 | a = (a >> shift1_amt_u7) | @boolToInt((a & (@intCast(u128, @maxValue(u128)) >> shift2_amt_u7)) != 0); | ||
| 41 | }, | ||
| 42 | } | ||
| 43 | // finish | ||
| 44 | a |= @boolToInt((a & 4) != 0); // Or P into R | ||
| 45 | a +%= 1; // round - this step may add a significant bit | ||
| 46 | a >>= 2; // dump Q and R | ||
| 47 | // a is now rounded to DBL_MANT_DIG or DBL_MANT_DIG+1 bits | ||
| 48 | if ((a & (u128(1) << DBL_MANT_DIG)) != 0) { | ||
| 49 | a >>= 1; | ||
| 50 | e +%= 1; | ||
| 51 | } | ||
| 52 | // a is now rounded to DBL_MANT_DIG bits | ||
| 53 | } else { | ||
| 54 | a <<= @intCast(u7, DBL_MANT_DIG - sd); | ||
| 55 | // a is now rounded to DBL_MANT_DIG bits | ||
| 56 | } | ||
| 57 | |||
| 58 | const s = @bitCast(u128, arg) >> (128 - 32); | ||
| 59 | const high: u64 = (@intCast(u64, s) & 0x80000000) | // sign | ||
| 60 | (@intCast(u32, (e + 1023)) << 20) | // exponent | ||
| 61 | (@truncate(u32, a >> 32) & 0x000fffff); // mantissa-high | ||
| 62 | const low: u64 = @truncate(u32, a); // mantissa-low | ||
| 63 | |||
| 64 | return @bitCast(f64, low | (high << 32)); | ||
| 65 | } | ||
| 66 | |||
| 67 | test "import floattidf" { | ||
| 68 | _ = @import("floattidf_test.zig"); | ||
| 69 | } | ||
std/special/compiler_rt/floattidf_test.zig created+84| ... | @@ -0,0 +1,84 @@ | ||
| 1 | const __floattidf = @import("floattidf.zig").__floattidf; | ||
| 2 | const assert = @import("std").debug.assert; | ||
| 3 | |||
| 4 | fn test__floattidf(a: i128, expected: f64) void { | ||
| 5 | const x = __floattidf(a); | ||
| 6 | assert(x == expected); | ||
| 7 | } | ||
| 8 | |||
| 9 | test "floattidf" { | ||
| 10 | test__floattidf(0, 0.0); | ||
| 11 | |||
| 12 | test__floattidf(1, 1.0); | ||
| 13 | test__floattidf(2, 2.0); | ||
| 14 | test__floattidf(20, 20.0); | ||
| 15 | test__floattidf(-1, -1.0); | ||
| 16 | test__floattidf(-2, -2.0); | ||
| 17 | test__floattidf(-20, -20.0); | ||
| 18 | |||
| 19 | test__floattidf(0x7FFFFF8000000000, 0x1.FFFFFEp+62); | ||
| 20 | test__floattidf(0x7FFFFFFFFFFFF800, 0x1.FFFFFFFFFFFFEp+62); | ||
| 21 | test__floattidf(0x7FFFFF0000000000, 0x1.FFFFFCp+62); | ||
| 22 | test__floattidf(0x7FFFFFFFFFFFF000, 0x1.FFFFFFFFFFFFCp+62); | ||
| 23 | |||
| 24 | test__floattidf(make_ti(0x8000008000000000, 0), -0x1.FFFFFEp+126); | ||
| 25 | test__floattidf(make_ti(0x8000000000000800, 0), -0x1.FFFFFFFFFFFFEp+126); | ||
| 26 | test__floattidf(make_ti(0x8000010000000000, 0), -0x1.FFFFFCp+126); | ||
| 27 | test__floattidf(make_ti(0x8000000000001000, 0), -0x1.FFFFFFFFFFFFCp+126); | ||
| 28 | |||
| 29 | test__floattidf(make_ti(0x8000000000000000, 0), -0x1.000000p+127); | ||
| 30 | test__floattidf(make_ti(0x8000000000000001, 0), -0x1.000000p+127); | ||
| 31 | |||
| 32 | test__floattidf(0x0007FB72E8000000, 0x1.FEDCBAp+50); | ||
| 33 | |||
| 34 | test__floattidf(0x0007FB72EA000000, 0x1.FEDCBA8p+50); | ||
| 35 | test__floattidf(0x0007FB72EB000000, 0x1.FEDCBACp+50); | ||
| 36 | test__floattidf(0x0007FB72EBFFFFFF, 0x1.FEDCBAFFFFFFCp+50); | ||
| 37 | test__floattidf(0x0007FB72EC000000, 0x1.FEDCBBp+50); | ||
| 38 | test__floattidf(0x0007FB72E8000001, 0x1.FEDCBA0000004p+50); | ||
| 39 | |||
| 40 | test__floattidf(0x0007FB72E6000000, 0x1.FEDCB98p+50); | ||
| 41 | test__floattidf(0x0007FB72E7000000, 0x1.FEDCB9Cp+50); | ||
| 42 | test__floattidf(0x0007FB72E7FFFFFF, 0x1.FEDCB9FFFFFFCp+50); | ||
| 43 | test__floattidf(0x0007FB72E4000001, 0x1.FEDCB90000004p+50); | ||
| 44 | test__floattidf(0x0007FB72E4000000, 0x1.FEDCB9p+50); | ||
| 45 | |||
| 46 | test__floattidf(0x023479FD0E092DC0, 0x1.1A3CFE870496Ep+57); | ||
| 47 | test__floattidf(0x023479FD0E092DA1, 0x1.1A3CFE870496Dp+57); | ||
| 48 | test__floattidf(0x023479FD0E092DB0, 0x1.1A3CFE870496Ep+57); | ||
| 49 | test__floattidf(0x023479FD0E092DB8, 0x1.1A3CFE870496Ep+57); | ||
| 50 | test__floattidf(0x023479FD0E092DB6, 0x1.1A3CFE870496Ep+57); | ||
| 51 | test__floattidf(0x023479FD0E092DBF, 0x1.1A3CFE870496Ep+57); | ||
| 52 | test__floattidf(0x023479FD0E092DC1, 0x1.1A3CFE870496Ep+57); | ||
| 53 | test__floattidf(0x023479FD0E092DC7, 0x1.1A3CFE870496Ep+57); | ||
| 54 | test__floattidf(0x023479FD0E092DC8, 0x1.1A3CFE870496Ep+57); | ||
| 55 | test__floattidf(0x023479FD0E092DCF, 0x1.1A3CFE870496Ep+57); | ||
| 56 | test__floattidf(0x023479FD0E092DD0, 0x1.1A3CFE870496Ep+57); | ||
| 57 | test__floattidf(0x023479FD0E092DD1, 0x1.1A3CFE870496Fp+57); | ||
| 58 | test__floattidf(0x023479FD0E092DD8, 0x1.1A3CFE870496Fp+57); | ||
| 59 | test__floattidf(0x023479FD0E092DDF, 0x1.1A3CFE870496Fp+57); | ||
| 60 | test__floattidf(0x023479FD0E092DE0, 0x1.1A3CFE870496Fp+57); | ||
| 61 | |||
| 62 | test__floattidf(make_ti(0x023479FD0E092DC0, 0), 0x1.1A3CFE870496Ep+121); | ||
| 63 | test__floattidf(make_ti(0x023479FD0E092DA1, 1), 0x1.1A3CFE870496Dp+121); | ||
| 64 | test__floattidf(make_ti(0x023479FD0E092DB0, 2), 0x1.1A3CFE870496Ep+121); | ||
| 65 | test__floattidf(make_ti(0x023479FD0E092DB8, 3), 0x1.1A3CFE870496Ep+121); | ||
| 66 | test__floattidf(make_ti(0x023479FD0E092DB6, 4), 0x1.1A3CFE870496Ep+121); | ||
| 67 | test__floattidf(make_ti(0x023479FD0E092DBF, 5), 0x1.1A3CFE870496Ep+121); | ||
| 68 | test__floattidf(make_ti(0x023479FD0E092DC1, 6), 0x1.1A3CFE870496Ep+121); | ||
| 69 | test__floattidf(make_ti(0x023479FD0E092DC7, 7), 0x1.1A3CFE870496Ep+121); | ||
| 70 | test__floattidf(make_ti(0x023479FD0E092DC8, 8), 0x1.1A3CFE870496Ep+121); | ||
| 71 | test__floattidf(make_ti(0x023479FD0E092DCF, 9), 0x1.1A3CFE870496Ep+121); | ||
| 72 | test__floattidf(make_ti(0x023479FD0E092DD0, 0), 0x1.1A3CFE870496Ep+121); | ||
| 73 | test__floattidf(make_ti(0x023479FD0E092DD1, 11), 0x1.1A3CFE870496Fp+121); | ||
| 74 | test__floattidf(make_ti(0x023479FD0E092DD8, 12), 0x1.1A3CFE870496Fp+121); | ||
| 75 | test__floattidf(make_ti(0x023479FD0E092DDF, 13), 0x1.1A3CFE870496Fp+121); | ||
| 76 | test__floattidf(make_ti(0x023479FD0E092DE0, 14), 0x1.1A3CFE870496Fp+121); | ||
| 77 | } | ||
| 78 | |||
| 79 | fn make_ti(high: u64, low: u64) i128 { | ||
| 80 | var result: u128 = high; | ||
| 81 | result <<= 64; | ||
| 82 | result |= low; | ||
| 83 | return @bitCast(i128, result); | ||
| 84 | } | ||
std/special/compiler_rt/floattisf.zig created+69| ... | @@ -0,0 +1,69 @@ | ||
| 1 | const builtin = @import("builtin"); | ||
| 2 | const is_test = builtin.is_test; | ||
| 3 | |||
| 4 | const FLT_MANT_DIG = 24; | ||
| 5 | |||
| 6 | pub extern fn __floattisf(arg: i128) f32 { | ||
| 7 | @setRuntimeSafety(is_test); | ||
| 8 | |||
| 9 | if (arg == 0) | ||
| 10 | return 0.0; | ||
| 11 | |||
| 12 | var ai = arg; | ||
| 13 | const N: u32 = 128; | ||
| 14 | const si = ai >> @intCast(u7, (N - 1)); | ||
| 15 | ai = ((ai ^ si) -% si); | ||
| 16 | var a = @bitCast(u128, ai); | ||
| 17 | |||
| 18 | const sd = @bitCast(i32, N - @clz(a)); // number of significant digits | ||
| 19 | var e: i32 = sd - 1; // exponent | ||
| 20 | |||
| 21 | if (sd > FLT_MANT_DIG) { | ||
| 22 | // start: 0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx | ||
| 23 | // finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR | ||
| 24 | // 12345678901234567890123456 | ||
| 25 | // 1 = msb 1 bit | ||
| 26 | // P = bit FLT_MANT_DIG-1 bits to the right of 1 | ||
| 27 | // Q = bit FLT_MANT_DIG bits to the right of 1 | ||
| 28 | // R = "or" of all bits to the right of Q | ||
| 29 | switch (sd) { | ||
| 30 | FLT_MANT_DIG + 1 => { | ||
| 31 | a <<= 1; | ||
| 32 | }, | ||
| 33 | FLT_MANT_DIG + 2 => {}, | ||
| 34 | else => { | ||
| 35 | const shift1_amt = @intCast(i32, sd - (FLT_MANT_DIG + 2)); | ||
| 36 | const shift1_amt_u7 = @intCast(u7, shift1_amt); | ||
| 37 | |||
| 38 | const shift2_amt = @intCast(i32, N + (FLT_MANT_DIG + 2)) - sd; | ||
| 39 | const shift2_amt_u7 = @intCast(u7, shift2_amt); | ||
| 40 | |||
| 41 | a = (a >> shift1_amt_u7) | @boolToInt((a & (@intCast(u128, @maxValue(u128)) >> shift2_amt_u7)) != 0); | ||
| 42 | }, | ||
| 43 | } | ||
| 44 | // finish | ||
| 45 | a |= @boolToInt((a & 4) != 0); // Or P into R | ||
| 46 | a +%= 1; // round - this step may add a significant bit | ||
| 47 | a >>= 2; // dump Q and R | ||
| 48 | // a is now rounded to FLT_MANT_DIG or FLT_MANT_DIG+1 bits | ||
| 49 | if ((a & (u128(1) << FLT_MANT_DIG)) != 0) { | ||
| 50 | a >>= 1; | ||
| 51 | e +%= 1; | ||
| 52 | } | ||
| 53 | // a is now rounded to FLT_MANT_DIG bits | ||
| 54 | } else { | ||
| 55 | a <<= @intCast(u7, FLT_MANT_DIG - sd); | ||
| 56 | // a is now rounded to FLT_MANT_DIG bits | ||
| 57 | } | ||
| 58 | |||
| 59 | const s = @bitCast(u128, arg) >> (128 - 32); | ||
| 60 | const r = (@intCast(u32, s) & 0x80000000) | // sign | ||
| 61 | (@intCast(u32, (e + 127)) << 23) | // exponent | ||
| 62 | (@truncate(u32, a) & 0x007fffff); // mantissa-high | ||
| 63 | |||
| 64 | return @bitCast(f32, r); | ||
| 65 | } | ||
| 66 | |||
| 67 | test "import floattisf" { | ||
| 68 | _ = @import("floattisf_test.zig"); | ||
| 69 | } | ||
std/special/compiler_rt/floattisf_test.zig created+60| ... | @@ -0,0 +1,60 @@ | ||
| 1 | const __floattisf = @import("floattisf.zig").__floattisf; | ||
| 2 | const assert = @import("std").debug.assert; | ||
| 3 | |||
| 4 | fn test__floattisf(a: i128, expected: f32) void { | ||
| 5 | const x = __floattisf(a); | ||
| 6 | assert(x == expected); | ||
| 7 | } | ||
| 8 | |||
| 9 | test "floattisf" { | ||
| 10 | test__floattisf(0, 0.0); | ||
| 11 | |||
| 12 | test__floattisf(1, 1.0); | ||
| 13 | test__floattisf(2, 2.0); | ||
| 14 | test__floattisf(-1, -1.0); | ||
| 15 | test__floattisf(-2, -2.0); | ||
| 16 | |||
| 17 | test__floattisf(0x7FFFFF8000000000, 0x1.FFFFFEp+62); | ||
| 18 | test__floattisf(0x7FFFFF0000000000, 0x1.FFFFFCp+62); | ||
| 19 | |||
| 20 | test__floattisf(make_ti(0xFFFFFFFFFFFFFFFF, 0x8000008000000000), -0x1.FFFFFEp+62); | ||
| 21 | test__floattisf(make_ti(0xFFFFFFFFFFFFFFFF, 0x8000010000000000), -0x1.FFFFFCp+62); | ||
| 22 | |||
| 23 | test__floattisf(make_ti(0xFFFFFFFFFFFFFFFF, 0x8000000000000000), -0x1.000000p+63); | ||
| 24 | test__floattisf(make_ti(0xFFFFFFFFFFFFFFFF, 0x8000000000000001), -0x1.000000p+63); | ||
| 25 | |||
| 26 | test__floattisf(0x0007FB72E8000000, 0x1.FEDCBAp+50); | ||
| 27 | |||
| 28 | test__floattisf(0x0007FB72EA000000, 0x1.FEDCBAp+50); | ||
| 29 | test__floattisf(0x0007FB72EB000000, 0x1.FEDCBAp+50); | ||
| 30 | test__floattisf(0x0007FB72EBFFFFFF, 0x1.FEDCBAp+50); | ||
| 31 | test__floattisf(0x0007FB72EC000000, 0x1.FEDCBCp+50); | ||
| 32 | test__floattisf(0x0007FB72E8000001, 0x1.FEDCBAp+50); | ||
| 33 | |||
| 34 | test__floattisf(0x0007FB72E6000000, 0x1.FEDCBAp+50); | ||
| 35 | test__floattisf(0x0007FB72E7000000, 0x1.FEDCBAp+50); | ||
| 36 | test__floattisf(0x0007FB72E7FFFFFF, 0x1.FEDCBAp+50); | ||
| 37 | test__floattisf(0x0007FB72E4000001, 0x1.FEDCBAp+50); | ||
| 38 | test__floattisf(0x0007FB72E4000000, 0x1.FEDCB8p+50); | ||
| 39 | |||
| 40 | test__floattisf(make_ti(0x0007FB72E8000000, 0), 0x1.FEDCBAp+114); | ||
| 41 | |||
| 42 | test__floattisf(make_ti(0x0007FB72EA000000, 0), 0x1.FEDCBAp+114); | ||
| 43 | test__floattisf(make_ti(0x0007FB72EB000000, 0), 0x1.FEDCBAp+114); | ||
| 44 | test__floattisf(make_ti(0x0007FB72EBFFFFFF, 0), 0x1.FEDCBAp+114); | ||
| 45 | test__floattisf(make_ti(0x0007FB72EC000000, 0), 0x1.FEDCBCp+114); | ||
| 46 | test__floattisf(make_ti(0x0007FB72E8000001, 0), 0x1.FEDCBAp+114); | ||
| 47 | |||
| 48 | test__floattisf(make_ti(0x0007FB72E6000000, 0), 0x1.FEDCBAp+114); | ||
| 49 | test__floattisf(make_ti(0x0007FB72E7000000, 0), 0x1.FEDCBAp+114); | ||
| 50 | test__floattisf(make_ti(0x0007FB72E7FFFFFF, 0), 0x1.FEDCBAp+114); | ||
| 51 | test__floattisf(make_ti(0x0007FB72E4000001, 0), 0x1.FEDCBAp+114); | ||
| 52 | test__floattisf(make_ti(0x0007FB72E4000000, 0), 0x1.FEDCB8p+114); | ||
| 53 | } | ||
| 54 | |||
| 55 | fn make_ti(high: u64, low: u64) i128 { | ||
| 56 | var result: u128 = high; | ||
| 57 | result <<= 64; | ||
| 58 | result |= low; | ||
| 59 | return @bitCast(i128, result); | ||
| 60 | } | ||
std/special/compiler_rt/floattitf.zig created+69| ... | @@ -0,0 +1,69 @@ | ||
| 1 | const builtin = @import("builtin"); | ||
| 2 | const is_test = builtin.is_test; | ||
| 3 | |||
| 4 | const LDBL_MANT_DIG = 113; | ||
| 5 | |||
| 6 | pub extern fn __floattitf(arg: i128) f128 { | ||
| 7 | @setRuntimeSafety(is_test); | ||
| 8 | |||
| 9 | if (arg == 0) | ||
| 10 | return 0.0; | ||
| 11 | |||
| 12 | var ai = arg; | ||
| 13 | const N: u32 = 128; | ||
| 14 | const si = ai >> @intCast(u7, (N - 1)); | ||
| 15 | ai = ((ai ^ si) -% si); | ||
| 16 | var a = @bitCast(u128, ai); | ||
| 17 | |||
| 18 | const sd = @bitCast(i32, N - @clz(a)); // number of significant digits | ||
| 19 | var e: i32 = sd - 1; // exponent | ||
| 20 | if (sd > LDBL_MANT_DIG) { | ||
| 21 | // start: 0000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQxxxxxxxxxxxxxxxxxx | ||
| 22 | // finish: 000000000000000000000000000000000000001xxxxxxxxxxxxxxxxxxxxxxPQR | ||
| 23 | // 12345678901234567890123456 | ||
| 24 | // 1 = msb 1 bit | ||
| 25 | // P = bit LDBL_MANT_DIG-1 bits to the right of 1 | ||
| 26 | // Q = bit LDBL_MANT_DIG bits to the right of 1 | ||
| 27 | // R = "or" of all bits to the right of Q | ||
| 28 | switch (sd) { | ||
| 29 | LDBL_MANT_DIG + 1 => { | ||
| 30 | a <<= 1; | ||
| 31 | }, | ||
| 32 | LDBL_MANT_DIG + 2 => {}, | ||
| 33 | else => { | ||
| 34 | const shift1_amt = @intCast(i32, sd - (LDBL_MANT_DIG + 2)); | ||
| 35 | const shift1_amt_u7 = @intCast(u7, shift1_amt); | ||
| 36 | |||
| 37 | const shift2_amt = @intCast(i32, N + (LDBL_MANT_DIG + 2)) - sd; | ||
| 38 | const shift2_amt_u7 = @intCast(u7, shift2_amt); | ||
| 39 | |||
| 40 | a = (a >> shift1_amt_u7) | @boolToInt((a & (@intCast(u128, @maxValue(u128)) >> shift2_amt_u7)) != 0); | ||
| 41 | }, | ||
| 42 | } | ||
| 43 | // finish | ||
| 44 | a |= @boolToInt((a & 4) != 0); // Or P into R | ||
| 45 | a +%= 1; // round - this step may add a significant bit | ||
| 46 | a >>= 2; // dump Q and R | ||
| 47 | // a is now rounded to LDBL_MANT_DIG or LDBL_MANT_DIG+1 bits | ||
| 48 | if ((a & (u128(1) << LDBL_MANT_DIG)) != 0) { | ||
| 49 | a >>= 1; | ||
| 50 | e +%= 1; | ||
| 51 | } | ||
| 52 | // a is now rounded to LDBL_MANT_DIG bits | ||
| 53 | } else { | ||
| 54 | a <<= @intCast(u7, LDBL_MANT_DIG - sd); | ||
| 55 | // a is now rounded to LDBL_MANT_DIG bits | ||
| 56 | } | ||
| 57 | |||
| 58 | const s = @bitCast(u128, arg) >> (128 - 64); | ||
| 59 | const high: u128 = (@intCast(u64, s) & 0x8000000000000000) | // sign | ||
| 60 | (@intCast(u64, (e + 16383)) << 48) | // exponent | ||
| 61 | (@truncate(u64, a >> 64) & 0x0000ffffffffffff); // mantissa-high | ||
| 62 | const low = @truncate(u64, a); // mantissa-low | ||
| 63 | |||
| 64 | return @bitCast(f128, low | (high << 64)); | ||
| 65 | } | ||
| 66 | |||
| 67 | test "import floattitf" { | ||
| 68 | _ = @import("floattitf_test.zig"); | ||
| 69 | } | ||
std/special/compiler_rt/floattitf_test.zig created+96| ... | @@ -0,0 +1,96 @@ | ||
| 1 | const __floattitf = @import("floattitf.zig").__floattitf; | ||
| 2 | const assert = @import("std").debug.assert; | ||
| 3 | |||
| 4 | fn test__floattitf(a: i128, expected: f128) void { | ||
| 5 | const x = __floattitf(a); | ||
| 6 | assert(x == expected); | ||
| 7 | } | ||
| 8 | |||
| 9 | test "floattitf" { | ||
| 10 | test__floattitf(0, 0.0); | ||
| 11 | |||
| 12 | test__floattitf(1, 1.0); | ||
| 13 | test__floattitf(2, 2.0); | ||
| 14 | test__floattitf(20, 20.0); | ||
| 15 | test__floattitf(-1, -1.0); | ||
| 16 | test__floattitf(-2, -2.0); | ||
| 17 | test__floattitf(-20, -20.0); | ||
| 18 | |||
| 19 | test__floattitf(0x7FFFFF8000000000, 0x1.FFFFFEp+62); | ||
| 20 | test__floattitf(0x7FFFFFFFFFFFF800, 0x1.FFFFFFFFFFFFEp+62); | ||
| 21 | test__floattitf(0x7FFFFF0000000000, 0x1.FFFFFCp+62); | ||
| 22 | test__floattitf(0x7FFFFFFFFFFFF000, 0x1.FFFFFFFFFFFFCp+62); | ||
| 23 | |||
| 24 | test__floattitf(make_ti(0x8000008000000000, 0), -0x1.FFFFFEp+126); | ||
| 25 | test__floattitf(make_ti(0x8000000000000800, 0), -0x1.FFFFFFFFFFFFEp+126); | ||
| 26 | test__floattitf(make_ti(0x8000010000000000, 0), -0x1.FFFFFCp+126); | ||
| 27 | test__floattitf(make_ti(0x8000000000001000, 0), -0x1.FFFFFFFFFFFFCp+126); | ||
| 28 | |||
| 29 | test__floattitf(make_ti(0x8000000000000000, 0), -0x1.000000p+127); | ||
| 30 | test__floattitf(make_ti(0x8000000000000001, 0), -0x1.FFFFFFFFFFFFFFFCp+126); | ||
| 31 | |||
| 32 | test__floattitf(0x0007FB72E8000000, 0x1.FEDCBAp+50); | ||
| 33 | |||
| 34 | test__floattitf(0x0007FB72EA000000, 0x1.FEDCBA8p+50); | ||
| 35 | test__floattitf(0x0007FB72EB000000, 0x1.FEDCBACp+50); | ||
| 36 | test__floattitf(0x0007FB72EBFFFFFF, 0x1.FEDCBAFFFFFFCp+50); | ||
| 37 | test__floattitf(0x0007FB72EC000000, 0x1.FEDCBBp+50); | ||
| 38 | test__floattitf(0x0007FB72E8000001, 0x1.FEDCBA0000004p+50); | ||
| 39 | |||
| 40 | test__floattitf(0x0007FB72E6000000, 0x1.FEDCB98p+50); | ||
| 41 | test__floattitf(0x0007FB72E7000000, 0x1.FEDCB9Cp+50); | ||
| 42 | test__floattitf(0x0007FB72E7FFFFFF, 0x1.FEDCB9FFFFFFCp+50); | ||
| 43 | test__floattitf(0x0007FB72E4000001, 0x1.FEDCB90000004p+50); | ||
| 44 | test__floattitf(0x0007FB72E4000000, 0x1.FEDCB9p+50); | ||
| 45 | |||
| 46 | test__floattitf(0x023479FD0E092DC0, 0x1.1A3CFE870496Ep+57); | ||
| 47 | test__floattitf(0x023479FD0E092DA1, 0x1.1A3CFE870496D08p+57); | ||
| 48 | test__floattitf(0x023479FD0E092DB0, 0x1.1A3CFE870496D8p+57); | ||
| 49 | test__floattitf(0x023479FD0E092DB8, 0x1.1A3CFE870496DCp+57); | ||
| 50 | test__floattitf(0x023479FD0E092DB6, 0x1.1A3CFE870496DBp+57); | ||
| 51 | test__floattitf(0x023479FD0E092DBF, 0x1.1A3CFE870496DF8p+57); | ||
| 52 | test__floattitf(0x023479FD0E092DC1, 0x1.1A3CFE870496E08p+57); | ||
| 53 | test__floattitf(0x023479FD0E092DC7, 0x1.1A3CFE870496E38p+57); | ||
| 54 | test__floattitf(0x023479FD0E092DC8, 0x1.1A3CFE870496E4p+57); | ||
| 55 | test__floattitf(0x023479FD0E092DCF, 0x1.1A3CFE870496E78p+57); | ||
| 56 | test__floattitf(0x023479FD0E092DD0, 0x1.1A3CFE870496E8p+57); | ||
| 57 | test__floattitf(0x023479FD0E092DD1, 0x1.1A3CFE870496E88p+57); | ||
| 58 | test__floattitf(0x023479FD0E092DD8, 0x1.1A3CFE870496ECp+57); | ||
| 59 | test__floattitf(0x023479FD0E092DDF, 0x1.1A3CFE870496EF8p+57); | ||
| 60 | test__floattitf(0x023479FD0E092DE0, 0x1.1A3CFE870496Fp+57); | ||
| 61 | |||
| 62 | test__floattitf(make_ti(0x023479FD0E092DC0, 0), 0x1.1A3CFE870496Ep+121); | ||
| 63 | test__floattitf(make_ti(0x023479FD0E092DA1, 1), 0x1.1A3CFE870496D08p+121); | ||
| 64 | test__floattitf(make_ti(0x023479FD0E092DB0, 2), 0x1.1A3CFE870496D8p+121); | ||
| 65 | test__floattitf(make_ti(0x023479FD0E092DB8, 3), 0x1.1A3CFE870496DCp+121); | ||
| 66 | test__floattitf(make_ti(0x023479FD0E092DB6, 4), 0x1.1A3CFE870496DBp+121); | ||
| 67 | test__floattitf(make_ti(0x023479FD0E092DBF, 5), 0x1.1A3CFE870496DF8p+121); | ||
| 68 | test__floattitf(make_ti(0x023479FD0E092DC1, 6), 0x1.1A3CFE870496E08p+121); | ||
| 69 | test__floattitf(make_ti(0x023479FD0E092DC7, 7), 0x1.1A3CFE870496E38p+121); | ||
| 70 | test__floattitf(make_ti(0x023479FD0E092DC8, 8), 0x1.1A3CFE870496E4p+121); | ||
| 71 | test__floattitf(make_ti(0x023479FD0E092DCF, 9), 0x1.1A3CFE870496E78p+121); | ||
| 72 | test__floattitf(make_ti(0x023479FD0E092DD0, 0), 0x1.1A3CFE870496E8p+121); | ||
| 73 | test__floattitf(make_ti(0x023479FD0E092DD1, 11), 0x1.1A3CFE870496E88p+121); | ||
| 74 | test__floattitf(make_ti(0x023479FD0E092DD8, 12), 0x1.1A3CFE870496ECp+121); | ||
| 75 | test__floattitf(make_ti(0x023479FD0E092DDF, 13), 0x1.1A3CFE870496EF8p+121); | ||
| 76 | test__floattitf(make_ti(0x023479FD0E092DE0, 14), 0x1.1A3CFE870496Fp+121); | ||
| 77 | |||
| 78 | test__floattitf(make_ti(0, 0xFFFFFFFFFFFFFFFF), 0x1.FFFFFFFFFFFFFFFEp+63); | ||
| 79 | |||
| 80 | test__floattitf(make_ti(0x123456789ABCDEF0, 0x123456789ABC2801), 0x1.23456789ABCDEF0123456789ABC3p+124); | ||
| 81 | test__floattitf(make_ti(0x123456789ABCDEF0, 0x123456789ABC3000), 0x1.23456789ABCDEF0123456789ABC3p+124); | ||
| 82 | test__floattitf(make_ti(0x123456789ABCDEF0, 0x123456789ABC37FF), 0x1.23456789ABCDEF0123456789ABC3p+124); | ||
| 83 | test__floattitf(make_ti(0x123456789ABCDEF0, 0x123456789ABC3800), 0x1.23456789ABCDEF0123456789ABC4p+124); | ||
| 84 | test__floattitf(make_ti(0x123456789ABCDEF0, 0x123456789ABC4000), 0x1.23456789ABCDEF0123456789ABC4p+124); | ||
| 85 | test__floattitf(make_ti(0x123456789ABCDEF0, 0x123456789ABC47FF), 0x1.23456789ABCDEF0123456789ABC4p+124); | ||
| 86 | test__floattitf(make_ti(0x123456789ABCDEF0, 0x123456789ABC4800), 0x1.23456789ABCDEF0123456789ABC4p+124); | ||
| 87 | test__floattitf(make_ti(0x123456789ABCDEF0, 0x123456789ABC4801), 0x1.23456789ABCDEF0123456789ABC5p+124); | ||
| 88 | test__floattitf(make_ti(0x123456789ABCDEF0, 0x123456789ABC57FF), 0x1.23456789ABCDEF0123456789ABC5p+124); | ||
| 89 | } | ||
| 90 | |||
| 91 | fn make_ti(high: u64, low: u64) i128 { | ||
| 92 | var result: u128 = high; | ||
| 93 | result <<= 64; | ||
| 94 | result |= low; | ||
| 95 | return @bitCast(i128, result); | ||
| 96 | } | ||
std/special/compiler_rt/index.zig+4| ... | @@ -21,6 +21,10 @@ comptime { | ... | @@ -21,6 +21,10 @@ comptime { |
| 21 | 21 | ||
| 22 | @export("__unordtf2", @import("comparetf2.zig").__unordtf2, linkage); | 22 | @export("__unordtf2", @import("comparetf2.zig").__unordtf2, linkage); |
| 23 | 23 | ||
| 24 | @export("__floattitf", @import("floattitf.zig").__floattitf, linkage); | ||
| 25 | @export("__floattidf", @import("floattidf.zig").__floattidf, linkage); | ||
| 26 | @export("__floattisf", @import("floattisf.zig").__floattisf, linkage); | ||
| 27 | |||
| 24 | @export("__floatunditf", @import("floatunditf.zig").__floatunditf, linkage); | 28 | @export("__floatunditf", @import("floatunditf.zig").__floatunditf, linkage); |
| 25 | @export("__floatunsitf", @import("floatunsitf.zig").__floatunsitf, linkage); | 29 | @export("__floatunsitf", @import("floatunsitf.zig").__floatunsitf, linkage); |
| 26 | 30 |