@grain/stdlib 0.6.6 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +67 -0
- package/LICENSE +1 -1
- package/README.md +2 -2
- package/array.gr +55 -7
- package/array.md +606 -560
- package/bigint.md +228 -228
- package/buffer.gr +85 -53
- package/buffer.md +442 -319
- package/bytes.gr +112 -35
- package/bytes.md +299 -219
- package/char.gr +201 -99
- package/char.md +447 -120
- package/exception.gr +11 -11
- package/exception.md +29 -4
- package/float32.gr +327 -3
- package/float32.md +698 -111
- package/float64.gr +320 -3
- package/float64.md +698 -111
- package/fs.gr +1082 -0
- package/fs.md +630 -0
- package/hash.gr +142 -88
- package/hash.md +105 -17
- package/int16.md +178 -178
- package/int32.gr +26 -5
- package/int32.md +266 -231
- package/int64.gr +27 -2
- package/int64.md +266 -231
- package/int8.md +178 -178
- package/json.gr +366 -51
- package/json.md +431 -15
- package/list.gr +328 -31
- package/list.md +759 -336
- package/map.gr +20 -12
- package/map.md +266 -260
- package/marshal.gr +41 -40
- package/marshal.md +14 -14
- package/number.gr +278 -35
- package/number.md +688 -269
- package/option.md +162 -162
- package/package.json +5 -3
- package/path.gr +48 -0
- package/path.md +180 -89
- package/pervasives.gr +2 -2
- package/pervasives.md +275 -275
- package/priorityqueue.gr +7 -7
- package/priorityqueue.md +131 -131
- package/queue.gr +183 -29
- package/queue.md +404 -148
- package/random.md +43 -43
- package/range.gr +4 -4
- package/range.md +42 -42
- package/rational.md +123 -123
- package/regex.gr +52 -51
- package/regex.md +102 -102
- package/result.md +118 -118
- package/runtime/atof/common.md +39 -39
- package/runtime/atof/decimal.gr +6 -6
- package/runtime/atof/decimal.md +14 -14
- package/runtime/atof/lemire.gr +5 -5
- package/runtime/atof/lemire.md +1 -1
- package/runtime/atof/parse.gr +16 -16
- package/runtime/atof/parse.md +2 -2
- package/runtime/atof/slow.md +1 -1
- package/runtime/atof/table.md +2 -2
- package/runtime/atoi/parse.gr +3 -3
- package/runtime/atoi/parse.md +1 -1
- package/runtime/bigint.gr +15 -47
- package/runtime/bigint.md +54 -60
- package/runtime/compare.gr +2 -2
- package/runtime/compare.md +8 -8
- package/runtime/dataStructures.md +211 -211
- package/runtime/debugPrint.gr +4 -1
- package/runtime/debugPrint.md +9 -9
- package/runtime/equal.gr +99 -77
- package/runtime/equal.md +8 -8
- package/runtime/exception.gr +62 -82
- package/runtime/exception.md +62 -11
- package/runtime/gc.gr +39 -45
- package/runtime/gc.md +4 -4
- package/runtime/malloc.gr +7 -7
- package/runtime/malloc.md +13 -13
- package/runtime/math/kernel/cos.gr +70 -0
- package/runtime/math/kernel/cos.md +14 -0
- package/runtime/math/kernel/sin.gr +65 -0
- package/runtime/math/kernel/sin.md +14 -0
- package/runtime/math/kernel/tan.gr +136 -0
- package/runtime/math/kernel/tan.md +14 -0
- package/runtime/math/rempio2.gr +244 -0
- package/runtime/math/rempio2.md +14 -0
- package/runtime/math/trig.gr +130 -0
- package/runtime/math/trig.md +28 -0
- package/runtime/math/umuldi.gr +26 -0
- package/runtime/math/umuldi.md +14 -0
- package/runtime/numberUtils.gr +29 -29
- package/runtime/numberUtils.md +12 -12
- package/runtime/numbers.gr +373 -381
- package/runtime/numbers.md +348 -342
- package/runtime/string.gr +37 -105
- package/runtime/string.md +20 -26
- package/runtime/unsafe/constants.md +24 -24
- package/runtime/unsafe/conv.md +19 -19
- package/runtime/unsafe/memory.gr +24 -20
- package/runtime/unsafe/memory.md +27 -7
- package/runtime/unsafe/offsets.gr +36 -0
- package/runtime/unsafe/offsets.md +88 -0
- package/runtime/unsafe/panic.gr +28 -0
- package/runtime/unsafe/panic.md +14 -0
- package/runtime/unsafe/tags.md +32 -32
- package/runtime/unsafe/wasmf32.md +28 -28
- package/runtime/unsafe/wasmf64.md +28 -28
- package/runtime/unsafe/wasmi32.md +47 -47
- package/runtime/unsafe/wasmi64.md +50 -50
- package/runtime/utf8.gr +189 -0
- package/runtime/utf8.md +117 -0
- package/runtime/wasi.gr +4 -2
- package/runtime/wasi.md +147 -147
- package/set.gr +18 -11
- package/set.md +253 -247
- package/stack.gr +171 -2
- package/stack.md +371 -89
- package/string.gr +352 -557
- package/string.md +298 -255
- package/uint16.md +170 -170
- package/uint32.gr +25 -4
- package/uint32.md +249 -214
- package/uint64.gr +25 -5
- package/uint64.md +249 -214
- package/uint8.md +170 -170
- package/uri.gr +57 -53
- package/uri.md +88 -89
- package/wasi/file.gr +67 -59
- package/wasi/file.md +308 -308
- package/wasi/process.md +26 -26
- package/wasi/random.md +12 -12
- package/wasi/time.md +16 -16
- package/runtime/utils/printing.gr +0 -60
- package/runtime/utils/printing.md +0 -26
package/runtime/numbers.gr
CHANGED
|
@@ -109,8 +109,8 @@ provide let isFloat = x => {
|
|
|
109
109
|
provide let isInteger = x => {
|
|
110
110
|
if (isBoxedNumber(x)) {
|
|
111
111
|
let tag = WasmI32.load(x, 4n)
|
|
112
|
-
tag == Tags._GRAIN_INT64_BOXED_NUM_TAG
|
|
113
|
-
tag == Tags._GRAIN_BIGINT_BOXED_NUM_TAG
|
|
112
|
+
tag == Tags._GRAIN_INT64_BOXED_NUM_TAG
|
|
113
|
+
|| tag == Tags._GRAIN_BIGINT_BOXED_NUM_TAG
|
|
114
114
|
} else {
|
|
115
115
|
true
|
|
116
116
|
}
|
|
@@ -416,8 +416,8 @@ provide let coerceNumberToWasmF32 = (x: Number) => {
|
|
|
416
416
|
},
|
|
417
417
|
t when t == Tags._GRAIN_RATIONAL_BOXED_NUM_TAG => {
|
|
418
418
|
use WasmF32.{ (/) }
|
|
419
|
-
BI.toFloat32(boxedRationalNumerator(xVal))
|
|
420
|
-
BI.toFloat32(boxedRationalDenominator(xVal))
|
|
419
|
+
BI.toFloat32(boxedRationalNumerator(xVal))
|
|
420
|
+
/ BI.toFloat32(boxedRationalDenominator(xVal))
|
|
421
421
|
},
|
|
422
422
|
t when t == Tags._GRAIN_FLOAT64_BOXED_NUM_TAG => {
|
|
423
423
|
use WasmF64.{ (<), (>) }
|
|
@@ -454,8 +454,8 @@ provide let coerceNumberToWasmF64 = (x: Number) => {
|
|
|
454
454
|
},
|
|
455
455
|
t when t == Tags._GRAIN_RATIONAL_BOXED_NUM_TAG => {
|
|
456
456
|
use WasmF64.{ (/) }
|
|
457
|
-
BI.toFloat64(boxedRationalNumerator(xVal))
|
|
458
|
-
BI.toFloat64(boxedRationalDenominator(xVal))
|
|
457
|
+
BI.toFloat64(boxedRationalNumerator(xVal))
|
|
458
|
+
/ BI.toFloat64(boxedRationalDenominator(xVal))
|
|
459
459
|
},
|
|
460
460
|
t when t == Tags._GRAIN_FLOAT64_BOXED_NUM_TAG => {
|
|
461
461
|
boxedFloat64Number(xVal)
|
|
@@ -879,8 +879,8 @@ let numberAddSubSimpleHelp = (x, y, isSub) => {
|
|
|
879
879
|
let xval64 = WasmI64.extendI32S(xval)
|
|
880
880
|
let result = if (isSub) xval64 - yBoxedVal else xval64 + yBoxedVal
|
|
881
881
|
if (
|
|
882
|
-
yBoxedVal >= 0N && result < xval64
|
|
883
|
-
yBoxedVal < 0N && result > xval64
|
|
882
|
+
yBoxedVal >= 0N && result < xval64
|
|
883
|
+
|| yBoxedVal < 0N && result > xval64
|
|
884
884
|
) {
|
|
885
885
|
// Overflow. Promote to BigInt
|
|
886
886
|
let xBig = BI.makeWrappedInt32(xval)
|
|
@@ -962,8 +962,8 @@ let numberAddSubInt64Help = (xval, y, isSub) => {
|
|
|
962
962
|
let xval64 = xval
|
|
963
963
|
let result = if (isSub) xval64 - yBoxedVal else xval64 + yBoxedVal
|
|
964
964
|
if (
|
|
965
|
-
yBoxedVal >= 0N && result < xval64
|
|
966
|
-
yBoxedVal < 0N && result > xval64
|
|
965
|
+
yBoxedVal >= 0N && result < xval64
|
|
966
|
+
|| yBoxedVal < 0N && result > xval64
|
|
967
967
|
) {
|
|
968
968
|
// Overflow. Promote to BigInt
|
|
969
969
|
let xBig = BI.makeWrappedInt64(xval64)
|
|
@@ -1157,8 +1157,8 @@ provide let cmpRationals = (x, y) => {
|
|
|
1157
1157
|
let yDenominator = boxedRationalDenominator(y)
|
|
1158
1158
|
|
|
1159
1159
|
if (
|
|
1160
|
-
BI.cmp(xNumerator, yNumerator) == 0n
|
|
1161
|
-
BI.cmp(xDenominator, yDenominator) == 0n
|
|
1160
|
+
BI.cmp(xNumerator, yNumerator) == 0n
|
|
1161
|
+
&& BI.cmp(xDenominator, yDenominator) == 0n
|
|
1162
1162
|
) {
|
|
1163
1163
|
0n
|
|
1164
1164
|
} else {
|
|
@@ -1613,7 +1613,7 @@ let i64abs = x => {
|
|
|
1613
1613
|
|
|
1614
1614
|
@unsafe
|
|
1615
1615
|
let numberMod = (x, y) => {
|
|
1616
|
-
use WasmI64.{ (!=), (-), (*), (<), (>) }
|
|
1616
|
+
use WasmI64.{ (!=), (-), (*), (<), (>), (^) }
|
|
1617
1617
|
// incRef x and y to reuse them via WasmI32.toGrain
|
|
1618
1618
|
Memory.incRef(x)
|
|
1619
1619
|
Memory.incRef(y)
|
|
@@ -1636,14 +1636,14 @@ let numberMod = (x, y) => {
|
|
|
1636
1636
|
throw Exception.ModuloByZero
|
|
1637
1637
|
}
|
|
1638
1638
|
// We implement true modulo
|
|
1639
|
-
if (xval
|
|
1640
|
-
let
|
|
1641
|
-
let
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1639
|
+
if ((xval ^ yval) < 0N) {
|
|
1640
|
+
let xabs = i64abs(xval)
|
|
1641
|
+
let yabs = i64abs(yval)
|
|
1642
|
+
let mval = WasmI64.remS(xabs, yabs)
|
|
1643
|
+
let mres = yabs - mval
|
|
1644
|
+
reducedInteger(
|
|
1645
|
+
if (mval != 0N) (if (yval < 0N) 0N - mres else mres) else 0N
|
|
1646
|
+
)
|
|
1647
1647
|
} else {
|
|
1648
1648
|
reducedInteger(WasmI64.remS(xval, yval))
|
|
1649
1649
|
}
|
|
@@ -1739,8 +1739,8 @@ let cmpFloat = (x: WasmI32, y: WasmI32) => {
|
|
|
1739
1739
|
throw InvariantViolation
|
|
1740
1740
|
},
|
|
1741
1741
|
t when t == Tags._GRAIN_RATIONAL_BOXED_NUM_TAG => {
|
|
1742
|
-
BI.toFloat64(boxedRationalNumerator(y))
|
|
1743
|
-
BI.toFloat64(boxedRationalDenominator(y))
|
|
1742
|
+
BI.toFloat64(boxedRationalNumerator(y))
|
|
1743
|
+
/ BI.toFloat64(boxedRationalDenominator(y))
|
|
1744
1744
|
},
|
|
1745
1745
|
t when t == Tags._GRAIN_FLOAT64_BOXED_NUM_TAG => {
|
|
1746
1746
|
boxedFloat64Number(y)
|
|
@@ -1809,9 +1809,9 @@ let cmpSmallInt = (x: WasmI32, y: WasmI32) => {
|
|
|
1809
1809
|
use WasmF64.{ (<), (/) }
|
|
1810
1810
|
// Rationals and ints are never considered equal
|
|
1811
1811
|
if (
|
|
1812
|
-
WasmF64.convertI64S(xi)
|
|
1813
|
-
BI.toFloat64(boxedRationalNumerator(y))
|
|
1814
|
-
BI.toFloat64(boxedRationalDenominator(y))
|
|
1812
|
+
WasmF64.convertI64S(xi)
|
|
1813
|
+
< BI.toFloat64(boxedRationalNumerator(y))
|
|
1814
|
+
/ BI.toFloat64(boxedRationalDenominator(y))
|
|
1815
1815
|
)
|
|
1816
1816
|
-1n
|
|
1817
1817
|
else
|
|
@@ -1832,8 +1832,8 @@ let cmpRational = (x: WasmI32, y: WasmI32) => {
|
|
|
1832
1832
|
use WasmI32.{ (-) }
|
|
1833
1833
|
if (isSimpleNumber(y)) {
|
|
1834
1834
|
use WasmF64.{ (/), (<) }
|
|
1835
|
-
let xf = BI.toFloat64(boxedRationalNumerator(x))
|
|
1836
|
-
BI.toFloat64(boxedRationalDenominator(x))
|
|
1835
|
+
let xf = BI.toFloat64(boxedRationalNumerator(x))
|
|
1836
|
+
/ BI.toFloat64(boxedRationalDenominator(x))
|
|
1837
1837
|
// Rationals and ints are never considered equal
|
|
1838
1838
|
if (xf < WasmF64.convertI32S(untagSimple(y))) -1n else 1n
|
|
1839
1839
|
} else {
|
|
@@ -2426,8 +2426,8 @@ provide let coerceNumberToInt32 = (number: Number) => {
|
|
|
2426
2426
|
provide let coerceNumberToInt64 = (number: Number) => {
|
|
2427
2427
|
let x = WasmI32.fromGrain(number)
|
|
2428
2428
|
let result = if (
|
|
2429
|
-
!isSimpleNumber(x)
|
|
2430
|
-
boxedNumberTag(x) == Tags._GRAIN_INT64_BOXED_NUM_TAG
|
|
2429
|
+
!isSimpleNumber(x)
|
|
2430
|
+
&& boxedNumberTag(x) == Tags._GRAIN_INT64_BOXED_NUM_TAG
|
|
2431
2431
|
) {
|
|
2432
2432
|
// avoid extra malloc and prevent x from being freed
|
|
2433
2433
|
Memory.incRef(x)
|
|
@@ -2514,8 +2514,8 @@ provide let coerceNumberToFloat32 = (number: Number) => {
|
|
|
2514
2514
|
provide let coerceNumberToFloat64 = (number: Number) => {
|
|
2515
2515
|
let x = WasmI32.fromGrain(number)
|
|
2516
2516
|
let result = if (
|
|
2517
|
-
!isSimpleNumber(x)
|
|
2518
|
-
boxedNumberTag(x) == Tags._GRAIN_FLOAT64_BOXED_NUM_TAG
|
|
2517
|
+
!isSimpleNumber(x)
|
|
2518
|
+
&& boxedNumberTag(x) == Tags._GRAIN_FLOAT64_BOXED_NUM_TAG
|
|
2519
2519
|
) {
|
|
2520
2520
|
// avoid extra malloc and prevent x from being freed
|
|
2521
2521
|
Memory.incRef(x)
|
|
@@ -2709,9 +2709,9 @@ let convertInexactToExactHelp = x => {
|
|
|
2709
2709
|
} else {
|
|
2710
2710
|
let tag = boxedNumberTag(x)
|
|
2711
2711
|
if (
|
|
2712
|
-
tag == Tags._GRAIN_INT64_BOXED_NUM_TAG
|
|
2713
|
-
tag == Tags._GRAIN_BIGINT_BOXED_NUM_TAG
|
|
2714
|
-
tag == Tags._GRAIN_RATIONAL_BOXED_NUM_TAG
|
|
2712
|
+
tag == Tags._GRAIN_INT64_BOXED_NUM_TAG
|
|
2713
|
+
|| tag == Tags._GRAIN_BIGINT_BOXED_NUM_TAG
|
|
2714
|
+
|| tag == Tags._GRAIN_RATIONAL_BOXED_NUM_TAG
|
|
2715
2715
|
) {
|
|
2716
2716
|
Memory.incRef(x)
|
|
2717
2717
|
x
|
|
@@ -2923,6 +2923,343 @@ let rec expBySquaring = (y, x, n) => {
|
|
|
2923
2923
|
}
|
|
2924
2924
|
}
|
|
2925
2925
|
|
|
2926
|
+
// Math.pow for floats
|
|
2927
|
+
@unsafe
|
|
2928
|
+
provide let powf = (x: WasmF64, y: WasmF64) => {
|
|
2929
|
+
// Based on https://git.musl-libc.org/cgit/musl/tree/src/math/pow.c
|
|
2930
|
+
use WasmF64.{ (==), (!=), (<=), (/), (*), (+) }
|
|
2931
|
+
// Fast paths
|
|
2932
|
+
if (WasmF64.abs(y) <= 2.0W) {
|
|
2933
|
+
if (y == 2.0W) {
|
|
2934
|
+
return x * x
|
|
2935
|
+
} else if (y == 0.5W) {
|
|
2936
|
+
if (x != InfinityW) {
|
|
2937
|
+
return WasmF64.abs(WasmF64.sqrt(x))
|
|
2938
|
+
} else {
|
|
2939
|
+
return InfinityW
|
|
2940
|
+
}
|
|
2941
|
+
} else if (y == -1.0W) {
|
|
2942
|
+
return 1.0W / x
|
|
2943
|
+
} else if (y == 1.0W) {
|
|
2944
|
+
return x
|
|
2945
|
+
} else if (y == 0.0W) {
|
|
2946
|
+
return NaNW
|
|
2947
|
+
}
|
|
2948
|
+
}
|
|
2949
|
+
// Full calculation
|
|
2950
|
+
let dp_h1 = WasmF64.reinterpretI64(0x3FE2B80340000000N)
|
|
2951
|
+
let dp_l1 = WasmF64.reinterpretI64(0x3E4CFDEB43CFD006N)
|
|
2952
|
+
let two53 = WasmF64.reinterpretI64(0x4340000000000000N)
|
|
2953
|
+
let huge = WasmF64.reinterpretI64(0x7E37E43C8800759CN)
|
|
2954
|
+
let tiny = WasmF64.reinterpretI64(0x01A56E1FC2F8F359N)
|
|
2955
|
+
let l1 = WasmF64.reinterpretI64(0x3FE3333333333303N)
|
|
2956
|
+
let l2 = WasmF64.reinterpretI64(0x3FDB6DB6DB6FABFFN)
|
|
2957
|
+
let l3 = WasmF64.reinterpretI64(0x3FD55555518F264DN)
|
|
2958
|
+
let l4 = WasmF64.reinterpretI64(0x3FD17460A91D4101N)
|
|
2959
|
+
let l5 = WasmF64.reinterpretI64(0x3FCD864A93C9DB65N)
|
|
2960
|
+
let l6 = WasmF64.reinterpretI64(0x3FCA7E284A454EEFN)
|
|
2961
|
+
let p1 = WasmF64.reinterpretI64(0x3FC555555555553EN)
|
|
2962
|
+
let p2 = WasmF64.reinterpretI64(0xBF66C16C16BEBD93N)
|
|
2963
|
+
let p3 = WasmF64.reinterpretI64(0x3F11566AAF25DE2CN)
|
|
2964
|
+
let p4 = WasmF64.reinterpretI64(0xBEBBBD41C5D26BF1N)
|
|
2965
|
+
let p5 = WasmF64.reinterpretI64(0x3E66376972BEA4D0N)
|
|
2966
|
+
let lg2 = WasmF64.reinterpretI64(0x3FE62E42FEFA39EFN)
|
|
2967
|
+
let lg2_h = WasmF64.reinterpretI64(0x3FE62E4300000000N)
|
|
2968
|
+
let lg2_l = WasmF64.reinterpretI64(0xBE205C610CA86C39N)
|
|
2969
|
+
let ovt = WasmF64.reinterpretI64(0x3C971547652B82FEN)
|
|
2970
|
+
let cp = WasmF64.reinterpretI64(0x3FEEC709DC3A03FDN)
|
|
2971
|
+
let cp_h = WasmF64.reinterpretI64(0x3FEEC709E0000000N)
|
|
2972
|
+
let cp_l = WasmF64.reinterpretI64(0xBE3E2FE0145B01F5N)
|
|
2973
|
+
let ivln2 = WasmF64.reinterpretI64(0x3FF71547652B82FEN)
|
|
2974
|
+
let ivln2_h = WasmF64.reinterpretI64(0x3FF7154760000000N)
|
|
2975
|
+
let ivln2_l = WasmF64.reinterpretI64(0x3E54AE0BF85DDF44N)
|
|
2976
|
+
let inv3 = WasmF64.reinterpretI64(0x3FD5555555555555N)
|
|
2977
|
+
use WasmI32.{
|
|
2978
|
+
(==),
|
|
2979
|
+
(!=),
|
|
2980
|
+
(>=),
|
|
2981
|
+
(<=),
|
|
2982
|
+
(&),
|
|
2983
|
+
(|),
|
|
2984
|
+
(>),
|
|
2985
|
+
(<),
|
|
2986
|
+
(<<),
|
|
2987
|
+
(>>),
|
|
2988
|
+
(-),
|
|
2989
|
+
(+),
|
|
2990
|
+
}
|
|
2991
|
+
use WasmI64.{ (>>) as shrSWasmI64 }
|
|
2992
|
+
let u_ = WasmI64.reinterpretF64(x)
|
|
2993
|
+
let hx = WasmI32.wrapI64(shrSWasmI64(u_, 32N))
|
|
2994
|
+
let lx = WasmI32.wrapI64(u_)
|
|
2995
|
+
let u_ = WasmI64.reinterpretF64(y)
|
|
2996
|
+
let hy = WasmI32.wrapI64(shrSWasmI64(u_, 32N))
|
|
2997
|
+
let ly = WasmI32.wrapI64(u_)
|
|
2998
|
+
let mut ix = hx & 0x7FFFFFFFn
|
|
2999
|
+
let iy = hy & 0x7FFFFFFFn
|
|
3000
|
+
if ((iy | ly) == 0n) { // x**0 = 1, even if x is NaN
|
|
3001
|
+
return 1.0W
|
|
3002
|
+
} else if (
|
|
3003
|
+
// Either Argument is Nan
|
|
3004
|
+
ix > 0x7FF00000n
|
|
3005
|
+
|| ix == 0x7FF00000n && lx != 0n
|
|
3006
|
+
|| iy > 0x7FF00000n
|
|
3007
|
+
|| iy == 0x7FF00000n && ly != 0n
|
|
3008
|
+
) {
|
|
3009
|
+
use WasmF64.{ (+) }
|
|
3010
|
+
return x + y
|
|
3011
|
+
}
|
|
3012
|
+
let mut yisint = 0n
|
|
3013
|
+
let mut k = 0n
|
|
3014
|
+
if (hx < 0n) {
|
|
3015
|
+
if (iy >= 0x43400000n) {
|
|
3016
|
+
yisint = 2n
|
|
3017
|
+
} else if (iy >= 0x3FF00000n) {
|
|
3018
|
+
k = (iy >> 20n) - 0x3FFn
|
|
3019
|
+
let mut offset = 0n
|
|
3020
|
+
let mut _ly = 0n
|
|
3021
|
+
if (k > 20n) {
|
|
3022
|
+
offset = 52n - k
|
|
3023
|
+
_ly = ly
|
|
3024
|
+
} else {
|
|
3025
|
+
offset = 20n - k
|
|
3026
|
+
_ly = iy
|
|
3027
|
+
}
|
|
3028
|
+
let jj = _ly >> offset
|
|
3029
|
+
if (jj << offset == _ly) yisint = 2n - (jj & 1n)
|
|
3030
|
+
}
|
|
3031
|
+
}
|
|
3032
|
+
if (ly == 0n) {
|
|
3033
|
+
if (iy == 0x7FF00000n) { // y is +- inf
|
|
3034
|
+
if ((ix - 0x3FF00000n | lx) == 0n) { // C: (-1)**+-inf is 1, JS: NaN
|
|
3035
|
+
return NaNW
|
|
3036
|
+
} else if (ix >= 0x3FF00000n) { // (|x|>1)**+-inf = inf,0
|
|
3037
|
+
return if (hy >= 0n) y else 0.0W
|
|
3038
|
+
} else { // (|x|<1)**+-inf = 0,inf
|
|
3039
|
+
return if (hy >= 0n) 0.0W else y * -1.0W
|
|
3040
|
+
}
|
|
3041
|
+
} else if (iy == 0x3FF00000n) {
|
|
3042
|
+
return if (hy >= 0n) x else 1.0W / x
|
|
3043
|
+
} else if (hy == 0x3FE00000n) {
|
|
3044
|
+
return x * x
|
|
3045
|
+
} else if (hy == 0x3FE00000n) {
|
|
3046
|
+
if (hx >= 0n) {
|
|
3047
|
+
return WasmF64.sqrt(x)
|
|
3048
|
+
}
|
|
3049
|
+
}
|
|
3050
|
+
}
|
|
3051
|
+
let mut ax = WasmF64.abs(x)
|
|
3052
|
+
let mut z = 0.0W
|
|
3053
|
+
if (lx == 0n && (ix == 0n || ix == 0x7FF00000n || ix == 0x3FF00000n)) {
|
|
3054
|
+
z = ax
|
|
3055
|
+
if (hy < 0n) z = 1.0W / z
|
|
3056
|
+
if (hx < 0n) {
|
|
3057
|
+
if ((ix - 0x3FF00000n | yisint) == 0n) {
|
|
3058
|
+
use WasmF64.{ (-) }
|
|
3059
|
+
let d = z - z
|
|
3060
|
+
z = d / d
|
|
3061
|
+
} else if (yisint == 1n) {
|
|
3062
|
+
z *= -1.0W
|
|
3063
|
+
}
|
|
3064
|
+
}
|
|
3065
|
+
return z
|
|
3066
|
+
}
|
|
3067
|
+
let mut s = 1.0W
|
|
3068
|
+
if (hx < 0n) {
|
|
3069
|
+
if (yisint == 0n) {
|
|
3070
|
+
return NaNW
|
|
3071
|
+
} else if (yisint == 1n) {
|
|
3072
|
+
s = -1.0W
|
|
3073
|
+
}
|
|
3074
|
+
}
|
|
3075
|
+
let mut t1 = 0.0W
|
|
3076
|
+
and t2 = 0.0W
|
|
3077
|
+
and p_h = 0.0W
|
|
3078
|
+
and p_l = 0.0W
|
|
3079
|
+
and r = 0.0W
|
|
3080
|
+
and t = 0.0W
|
|
3081
|
+
and u = 0.0W
|
|
3082
|
+
and v = 0.0W
|
|
3083
|
+
and w = 0.0W
|
|
3084
|
+
let mut j = 0n
|
|
3085
|
+
and n = 0n
|
|
3086
|
+
if (iy > 0x41E00000n) {
|
|
3087
|
+
if (iy > 0x43F00000n) {
|
|
3088
|
+
if (ix <= 0x3FEFFFFFn) {
|
|
3089
|
+
let output = if (hy < 0n) huge * huge else tiny * tiny
|
|
3090
|
+
return output
|
|
3091
|
+
} else if (ix >= 0x3FF00000n) {
|
|
3092
|
+
let output = if (hy > 0n) huge * huge else tiny * tiny
|
|
3093
|
+
return output
|
|
3094
|
+
}
|
|
3095
|
+
}
|
|
3096
|
+
if (ix < 0x3FEFFFFFn) {
|
|
3097
|
+
if (hy < 0n) {
|
|
3098
|
+
return s * huge * huge
|
|
3099
|
+
} else {
|
|
3100
|
+
return s * tiny * tiny
|
|
3101
|
+
}
|
|
3102
|
+
} else if (ix > 0x3FF00000n) {
|
|
3103
|
+
if (hy > 0n) {
|
|
3104
|
+
return s * huge * huge
|
|
3105
|
+
} else {
|
|
3106
|
+
return s * tiny * tiny
|
|
3107
|
+
}
|
|
3108
|
+
} else {
|
|
3109
|
+
use WasmF64.{ (-), (+) }
|
|
3110
|
+
use WasmI64.{ (&) }
|
|
3111
|
+
t = ax - 1.0W
|
|
3112
|
+
w = t * t * (0.5W - t * (inv3 - t * 0.25W))
|
|
3113
|
+
u = ivln2_h * t
|
|
3114
|
+
v = t * ivln2_l - w * ivln2
|
|
3115
|
+
t1 = u + v
|
|
3116
|
+
t1 = WasmF64.reinterpretI64(
|
|
3117
|
+
WasmI64.reinterpretF64(t1) & 0xFFFFFFFF00000000N
|
|
3118
|
+
)
|
|
3119
|
+
t2 = v - (t1 - u)
|
|
3120
|
+
}
|
|
3121
|
+
} else {
|
|
3122
|
+
let mut ss = 0.0W
|
|
3123
|
+
and s2 = 0.0W
|
|
3124
|
+
and s_h = 0.0W
|
|
3125
|
+
and s_l = 0.0W
|
|
3126
|
+
and t_h = 0.0W
|
|
3127
|
+
and t_l = 0.0W
|
|
3128
|
+
n = 0n
|
|
3129
|
+
if (ix < 0x00100000n) {
|
|
3130
|
+
use WasmI64.{ (>>>) }
|
|
3131
|
+
ax *= two53
|
|
3132
|
+
n -= 53n
|
|
3133
|
+
ix = WasmI32.wrapI64(WasmI64.reinterpretF64(ax) >>> 32N)
|
|
3134
|
+
}
|
|
3135
|
+
n += (ix >> 20n) - 0x3FFn
|
|
3136
|
+
j = ix & 0x000FFFFFn
|
|
3137
|
+
ix = j | 0x3FF00000n
|
|
3138
|
+
if (j <= 0x3988En) {
|
|
3139
|
+
k = 0n
|
|
3140
|
+
} else if (j < 0xBB67An) {
|
|
3141
|
+
k = 1n
|
|
3142
|
+
} else {
|
|
3143
|
+
k = 0n
|
|
3144
|
+
n += 1n
|
|
3145
|
+
ix -= 0x00100000n
|
|
3146
|
+
}
|
|
3147
|
+
use WasmI64.{ (&), (|), (<<) }
|
|
3148
|
+
ax = WasmF64.reinterpretI64(
|
|
3149
|
+
WasmI64.reinterpretF64(ax) & 0xFFFFFFFFN | WasmI64.extendI32S(ix) << 32N
|
|
3150
|
+
)
|
|
3151
|
+
let bp = if (k != 0n) 1.5W else 1.0W
|
|
3152
|
+
use WasmF64.{ (+), (-) }
|
|
3153
|
+
u = ax - bp
|
|
3154
|
+
v = 1.0W / (ax + bp)
|
|
3155
|
+
ss = u * v
|
|
3156
|
+
s_h = ss
|
|
3157
|
+
s_h = WasmF64.reinterpretI64(
|
|
3158
|
+
WasmI64.reinterpretF64(s_h) & 0xFFFFFFFF00000000N
|
|
3159
|
+
)
|
|
3160
|
+
use WasmI32.{ (+), (|), (<<) as shlWasmI64 }
|
|
3161
|
+
t_h = WasmF64.reinterpretI64(
|
|
3162
|
+
WasmI64.extendI32S(
|
|
3163
|
+
(ix >> 1n | 0x20000000n) + 0x00080000n + shlWasmI64(k, 18n)
|
|
3164
|
+
)
|
|
3165
|
+
<< 32N
|
|
3166
|
+
)
|
|
3167
|
+
use WasmF64.{ (+) }
|
|
3168
|
+
t_l = ax - (t_h - bp)
|
|
3169
|
+
s_l = v * (u - s_h * t_h - s_h * t_l)
|
|
3170
|
+
s2 = ss * ss
|
|
3171
|
+
//formatter-ignore
|
|
3172
|
+
r = s2 * s2 * (l1 + s2 * (l2 + s2 * (l3 + s2 * (l4 + s2 * (l5 + s2 * l6)))))
|
|
3173
|
+
r += s_l * (s_h + ss)
|
|
3174
|
+
s2 = s_h * s_h
|
|
3175
|
+
t_h = 3.0W + s2 + r
|
|
3176
|
+
t_h = WasmF64.reinterpretI64(
|
|
3177
|
+
WasmI64.reinterpretF64(t_h) & 0xFFFFFFFF00000000N
|
|
3178
|
+
)
|
|
3179
|
+
t_l = r - (t_h - 3.0W - s2)
|
|
3180
|
+
u = s_h * t_h
|
|
3181
|
+
v = s_l * t_h + t_l * ss
|
|
3182
|
+
p_h = u + v
|
|
3183
|
+
p_h = WasmF64.reinterpretI64(
|
|
3184
|
+
WasmI64.reinterpretF64(p_h) & 0xFFFFFFFF00000000N
|
|
3185
|
+
)
|
|
3186
|
+
p_l = v - (p_h - u)
|
|
3187
|
+
let z_h = cp_h * p_h
|
|
3188
|
+
let dp_l = if (k != 0n) dp_l1 else 0.0W
|
|
3189
|
+
let z_l = cp_l * p_h + p_l * cp + dp_l
|
|
3190
|
+
t = WasmF64.convertI32S(n)
|
|
3191
|
+
let dp_h = if (k != 0n) dp_h1 else 0.0W
|
|
3192
|
+
t1 = z_h + z_l + dp_h + t
|
|
3193
|
+
t1 = WasmF64.reinterpretI64(
|
|
3194
|
+
WasmI64.reinterpretF64(t1) & 0xFFFFFFFF00000000N
|
|
3195
|
+
)
|
|
3196
|
+
t2 = z_l - (t1 - t - dp_h - z_h)
|
|
3197
|
+
}
|
|
3198
|
+
use WasmF64.{ (>), (-), (+) }
|
|
3199
|
+
use WasmI64.{ (&), (>>), (<<) }
|
|
3200
|
+
let y1 = WasmF64.reinterpretI64(
|
|
3201
|
+
WasmI64.reinterpretF64(y) & 0xFFFFFFFF00000000N
|
|
3202
|
+
)
|
|
3203
|
+
p_l = (y - y1) * t1 + y * t2
|
|
3204
|
+
p_h = y1 * t1
|
|
3205
|
+
z = p_l + p_h
|
|
3206
|
+
let u_ = WasmI64.reinterpretF64(z)
|
|
3207
|
+
let j = WasmI32.wrapI64(u_ >> 32N)
|
|
3208
|
+
let i = WasmI32.wrapI64(u_)
|
|
3209
|
+
use WasmI32.{ (-) as addWasmI32, (&) }
|
|
3210
|
+
if (j >= 0x40900000n) {
|
|
3211
|
+
if ((addWasmI32(j, 0x40900000n) | i) != 0n || p_l + ovt > z - p_h) {
|
|
3212
|
+
return s * huge * huge
|
|
3213
|
+
}
|
|
3214
|
+
} else if ((j & 0x7FFFFFFFn) >= 0x4090CC00n) {
|
|
3215
|
+
use WasmF64.{ (<=) }
|
|
3216
|
+
if (addWasmI32(j, 0xC090CC00n | i) != 0n || p_l <= z - p_h) {
|
|
3217
|
+
return s * tiny * tiny
|
|
3218
|
+
}
|
|
3219
|
+
}
|
|
3220
|
+
use WasmI32.{ (&), (>>), (-), (+), (>), (*), (<<), (^) }
|
|
3221
|
+
let i = j & 0x7FFFFFFFn
|
|
3222
|
+
k = (i >> 20n) - 0x3FFn
|
|
3223
|
+
n = 0n
|
|
3224
|
+
if (i > 0x3FE00000n) {
|
|
3225
|
+
use WasmI64.{ (<<) }
|
|
3226
|
+
n = j + (0x00100000n >> (k + 1n))
|
|
3227
|
+
k = ((n & 0x7FFFFFFFn) >> 20n) - 0x3FFn
|
|
3228
|
+
t = 0.0W
|
|
3229
|
+
t = WasmF64.reinterpretI64(
|
|
3230
|
+
WasmI64.extendI32S(n & (0x000FFFFFn >> k ^ -1n)) << 32N
|
|
3231
|
+
)
|
|
3232
|
+
n = (n & 0x000FFFFFn | 0x00100000n) >> (20n - k)
|
|
3233
|
+
if (j < 0n) n *= -1n
|
|
3234
|
+
use WasmF64.{ (-) }
|
|
3235
|
+
p_h -= t
|
|
3236
|
+
}
|
|
3237
|
+
use WasmI64.{ (&), (|) }
|
|
3238
|
+
use WasmF64.{ (*), (+), (-) }
|
|
3239
|
+
t = p_l + p_h
|
|
3240
|
+
t = WasmF64.reinterpretI64(WasmI64.reinterpretF64(t) & 0xFFFFFFFF00000000N)
|
|
3241
|
+
u = t * lg2_h
|
|
3242
|
+
v = (p_l - (t - p_h)) * lg2 + t * lg2_l
|
|
3243
|
+
z = u + v
|
|
3244
|
+
w = v - (z - u)
|
|
3245
|
+
t = z * z
|
|
3246
|
+
t1 = z - t * (p1 + t * (p2 + t * (p3 + t * (p4 + t * p5))))
|
|
3247
|
+
r = z * t1 / (t1 - 2.0W) - (w + z * w)
|
|
3248
|
+
z = 1.0W - (r - z)
|
|
3249
|
+
use WasmI32.{ (+) }
|
|
3250
|
+
let j = WasmI32.wrapI64(shrSWasmI64(WasmI64.reinterpretF64(z), 32N))
|
|
3251
|
+
+ (n << 20n)
|
|
3252
|
+
if (j >> 20n <= 0n) {
|
|
3253
|
+
z = scalbn(z, n)
|
|
3254
|
+
} else {
|
|
3255
|
+
use WasmI64.{ (<<) }
|
|
3256
|
+
z = WasmF64.reinterpretI64(
|
|
3257
|
+
WasmI64.reinterpretF64(z) & 0xFFFFFFFFN | WasmI64.extendI32S(j) << 32N
|
|
3258
|
+
)
|
|
3259
|
+
}
|
|
3260
|
+
return s * z
|
|
3261
|
+
}
|
|
3262
|
+
|
|
2926
3263
|
// Math.pow is largely based on https://git.musl-libc.org/cgit/musl/tree/src/math/pow.c
|
|
2927
3264
|
/*
|
|
2928
3265
|
* ====================================================
|
|
@@ -2976,354 +3313,9 @@ provide let (**) = (base, power) => {
|
|
|
2976
3313
|
expBySquaring(1, denominator, power)
|
|
2977
3314
|
numerator / denominator
|
|
2978
3315
|
} else {
|
|
2979
|
-
// Based on https://git.musl-libc.org/cgit/musl/tree/src/math/pow.c
|
|
2980
|
-
use WasmF64.{ (==), (!=), (<=), (/), (*), (+) }
|
|
2981
3316
|
let x = coerceNumberToWasmF64(base)
|
|
2982
3317
|
let y = coerceNumberToWasmF64(power)
|
|
2983
|
-
|
|
2984
|
-
if (WasmF64.abs(y) <= 2.0W) {
|
|
2985
|
-
if (y == 2.0W) {
|
|
2986
|
-
return WasmI32.toGrain(newFloat64(x * x)): Number
|
|
2987
|
-
} else if (y == 0.5W) {
|
|
2988
|
-
if (x != InfinityW) {
|
|
2989
|
-
return WasmI32.toGrain(newFloat64(WasmF64.abs(WasmF64.sqrt(x)))):
|
|
2990
|
-
Number
|
|
2991
|
-
} else {
|
|
2992
|
-
return Infinity
|
|
2993
|
-
}
|
|
2994
|
-
} else if (y == -1.0W) {
|
|
2995
|
-
return WasmI32.toGrain(newFloat64(1.0W / x)): Number
|
|
2996
|
-
} else if (y == 1.0W) {
|
|
2997
|
-
return WasmI32.toGrain(newFloat64(x)): Number
|
|
2998
|
-
} else if (y == 0.0W) {
|
|
2999
|
-
return NaN
|
|
3000
|
-
}
|
|
3001
|
-
}
|
|
3002
|
-
// Full calculation
|
|
3003
|
-
let dp_h1 = WasmF64.reinterpretI64(0x3FE2B80340000000N)
|
|
3004
|
-
let dp_l1 = WasmF64.reinterpretI64(0x3E4CFDEB43CFD006N)
|
|
3005
|
-
let two53 = WasmF64.reinterpretI64(0x4340000000000000N)
|
|
3006
|
-
let huge = WasmF64.reinterpretI64(0x7E37E43C8800759CN)
|
|
3007
|
-
let tiny = WasmF64.reinterpretI64(0x01A56E1FC2F8F359N)
|
|
3008
|
-
let l1 = WasmF64.reinterpretI64(0x3FE3333333333303N)
|
|
3009
|
-
let l2 = WasmF64.reinterpretI64(0x3FDB6DB6DB6FABFFN)
|
|
3010
|
-
let l3 = WasmF64.reinterpretI64(0x3FD55555518F264DN)
|
|
3011
|
-
let l4 = WasmF64.reinterpretI64(0x3FD17460A91D4101N)
|
|
3012
|
-
let l5 = WasmF64.reinterpretI64(0x3FCD864A93C9DB65N)
|
|
3013
|
-
let l6 = WasmF64.reinterpretI64(0x3FCA7E284A454EEFN)
|
|
3014
|
-
let p1 = WasmF64.reinterpretI64(0x3FC555555555553EN)
|
|
3015
|
-
let p2 = WasmF64.reinterpretI64(0xBF66C16C16BEBD93N)
|
|
3016
|
-
let p3 = WasmF64.reinterpretI64(0x3F11566AAF25DE2CN)
|
|
3017
|
-
let p4 = WasmF64.reinterpretI64(0xBEBBBD41C5D26BF1N)
|
|
3018
|
-
let p5 = WasmF64.reinterpretI64(0x3E66376972BEA4D0N)
|
|
3019
|
-
let lg2 = WasmF64.reinterpretI64(0x3FE62E42FEFA39EFN)
|
|
3020
|
-
let lg2_h = WasmF64.reinterpretI64(0x3FE62E4300000000N)
|
|
3021
|
-
let lg2_l = WasmF64.reinterpretI64(0xBE205C610CA86C39N)
|
|
3022
|
-
let ovt = WasmF64.reinterpretI64(0x3C971547652B82FEN)
|
|
3023
|
-
let cp = WasmF64.reinterpretI64(0x3FEEC709DC3A03FDN)
|
|
3024
|
-
let cp_h = WasmF64.reinterpretI64(0x3FEEC709E0000000N)
|
|
3025
|
-
let cp_l = WasmF64.reinterpretI64(0xBE3E2FE0145B01F5N)
|
|
3026
|
-
let ivln2 = WasmF64.reinterpretI64(0x3FF71547652B82FEN)
|
|
3027
|
-
let ivln2_h = WasmF64.reinterpretI64(0x3FF7154760000000N)
|
|
3028
|
-
let ivln2_l = WasmF64.reinterpretI64(0x3E54AE0BF85DDF44N)
|
|
3029
|
-
let inv3 = WasmF64.reinterpretI64(0x3FD5555555555555N)
|
|
3030
|
-
use WasmI32.{
|
|
3031
|
-
(==),
|
|
3032
|
-
(!=),
|
|
3033
|
-
(>=),
|
|
3034
|
-
(<=),
|
|
3035
|
-
(&),
|
|
3036
|
-
(|),
|
|
3037
|
-
(>),
|
|
3038
|
-
(<),
|
|
3039
|
-
(<<),
|
|
3040
|
-
(>>),
|
|
3041
|
-
(-),
|
|
3042
|
-
(+),
|
|
3043
|
-
}
|
|
3044
|
-
use WasmI64.{ (>>) as shrSWasmI64 }
|
|
3045
|
-
let u_ = WasmI64.reinterpretF64(x)
|
|
3046
|
-
let hx = WasmI32.wrapI64(shrSWasmI64(u_, 32N))
|
|
3047
|
-
let lx = WasmI32.wrapI64(u_)
|
|
3048
|
-
let u_ = WasmI64.reinterpretF64(y)
|
|
3049
|
-
let hy = WasmI32.wrapI64(shrSWasmI64(u_, 32N))
|
|
3050
|
-
let ly = WasmI32.wrapI64(u_)
|
|
3051
|
-
let mut ix = hx & 0x7FFFFFFFn
|
|
3052
|
-
let iy = hy & 0x7FFFFFFFn
|
|
3053
|
-
if ((iy | ly) == 0n) { // x**0 = 1, even if x is NaN
|
|
3054
|
-
return 1
|
|
3055
|
-
} else if (
|
|
3056
|
-
// Either Argument is Nan
|
|
3057
|
-
ix > 0x7FF00000n ||
|
|
3058
|
-
ix == 0x7FF00000n && lx != 0n ||
|
|
3059
|
-
iy > 0x7FF00000n ||
|
|
3060
|
-
iy == 0x7FF00000n && ly != 0n
|
|
3061
|
-
) {
|
|
3062
|
-
use WasmF64.{ (+) }
|
|
3063
|
-
return WasmI32.toGrain(newFloat64(x + y)): Number
|
|
3064
|
-
}
|
|
3065
|
-
let mut yisint = 0n
|
|
3066
|
-
let mut k = 0n
|
|
3067
|
-
if (hx < 0n) {
|
|
3068
|
-
if (iy >= 0x43400000n) {
|
|
3069
|
-
yisint = 2n
|
|
3070
|
-
} else if (iy >= 0x3FF00000n) {
|
|
3071
|
-
k = (iy >> 20n) - 0x3FFn
|
|
3072
|
-
let mut offset = 0n
|
|
3073
|
-
let mut _ly = 0n
|
|
3074
|
-
if (k > 20n) {
|
|
3075
|
-
offset = 52n - k
|
|
3076
|
-
_ly = ly
|
|
3077
|
-
} else {
|
|
3078
|
-
offset = 20n - k
|
|
3079
|
-
_ly = iy
|
|
3080
|
-
}
|
|
3081
|
-
let jj = _ly >> offset
|
|
3082
|
-
if (jj << offset == _ly) yisint = 2n - (jj & 1n)
|
|
3083
|
-
}
|
|
3084
|
-
}
|
|
3085
|
-
if (ly == 0n) {
|
|
3086
|
-
if (iy == 0x7FF00000n) { // y is +- inf
|
|
3087
|
-
if ((ix - 0x3FF00000n | lx) == 0n) { // C: (-1)**+-inf is 1, JS: NaN
|
|
3088
|
-
return NaN
|
|
3089
|
-
} else if (ix >= 0x3FF00000n) { // (|x|>1)**+-inf = inf,0
|
|
3090
|
-
if (hy >= 0n)
|
|
3091
|
-
return WasmI32.toGrain(newFloat64(y)): Number
|
|
3092
|
-
else
|
|
3093
|
-
return 0.0
|
|
3094
|
-
} else { // (|x|<1)**+-inf = 0,inf
|
|
3095
|
-
if (hy >= 0n)
|
|
3096
|
-
return 0.0
|
|
3097
|
-
else
|
|
3098
|
-
return WasmI32.toGrain(newFloat64(y * -1.0W)): Number
|
|
3099
|
-
}
|
|
3100
|
-
} else if (iy == 0x3FF00000n) {
|
|
3101
|
-
if (hy >= 0n)
|
|
3102
|
-
return WasmI32.toGrain(newFloat64(x)): Number
|
|
3103
|
-
else
|
|
3104
|
-
return WasmI32.toGrain(newFloat64(1.0W / x)): Number
|
|
3105
|
-
} else if (hy == 0x3FE00000n) {
|
|
3106
|
-
return WasmI32.toGrain(newFloat64(x * x)): Number
|
|
3107
|
-
} else if (hy == 0x3FE00000n) {
|
|
3108
|
-
if (hx >= 0n) {
|
|
3109
|
-
return WasmI32.toGrain(newFloat64(WasmF64.sqrt(x))): Number
|
|
3110
|
-
}
|
|
3111
|
-
}
|
|
3112
|
-
}
|
|
3113
|
-
let mut ax = WasmF64.abs(x)
|
|
3114
|
-
let mut z = 0.0W
|
|
3115
|
-
if (lx == 0n && (ix == 0n || ix == 0x7FF00000n || ix == 0x3FF00000n)) {
|
|
3116
|
-
z = ax
|
|
3117
|
-
if (hy < 0n) z = 1.0W / z
|
|
3118
|
-
if (hx < 0n) {
|
|
3119
|
-
if ((ix - 0x3FF00000n | yisint) == 0n) {
|
|
3120
|
-
use WasmF64.{ (-) }
|
|
3121
|
-
let d = z - z
|
|
3122
|
-
z = d / d
|
|
3123
|
-
} else if (yisint == 1n) {
|
|
3124
|
-
z *= -1.0W
|
|
3125
|
-
}
|
|
3126
|
-
}
|
|
3127
|
-
return WasmI32.toGrain(newFloat64(z)): Number
|
|
3128
|
-
}
|
|
3129
|
-
let mut s = 1.0W
|
|
3130
|
-
if (hx < 0n) {
|
|
3131
|
-
if (yisint == 0n) {
|
|
3132
|
-
return NaN
|
|
3133
|
-
} else if (yisint == 1n) {
|
|
3134
|
-
s = -1.0W
|
|
3135
|
-
}
|
|
3136
|
-
}
|
|
3137
|
-
let mut t1 = 0.0W
|
|
3138
|
-
and t2 = 0.0W
|
|
3139
|
-
and p_h = 0.0W
|
|
3140
|
-
and p_l = 0.0W
|
|
3141
|
-
and r = 0.0W
|
|
3142
|
-
and t = 0.0W
|
|
3143
|
-
and u = 0.0W
|
|
3144
|
-
and v = 0.0W
|
|
3145
|
-
and w = 0.0W
|
|
3146
|
-
let mut j = 0n
|
|
3147
|
-
and n = 0n
|
|
3148
|
-
if (iy > 0x41E00000n) {
|
|
3149
|
-
if (iy > 0x43F00000n) {
|
|
3150
|
-
if (ix <= 0x3FEFFFFFn) {
|
|
3151
|
-
let output = if (hy < 0n) huge * huge else tiny * tiny
|
|
3152
|
-
return WasmI32.toGrain(newFloat64(output)): Number
|
|
3153
|
-
} else if (ix >= 0x3FF00000n) {
|
|
3154
|
-
let output = if (hy > 0n) huge * huge else tiny * tiny
|
|
3155
|
-
return WasmI32.toGrain(newFloat64(output)): Number
|
|
3156
|
-
}
|
|
3157
|
-
}
|
|
3158
|
-
if (ix < 0x3FEFFFFFn) {
|
|
3159
|
-
if (hy < 0n) {
|
|
3160
|
-
return WasmI32.toGrain(newFloat64(s * huge * huge)): Number
|
|
3161
|
-
} else {
|
|
3162
|
-
return WasmI32.toGrain(newFloat64(s * tiny * tiny)): Number
|
|
3163
|
-
}
|
|
3164
|
-
} else if (ix > 0x3FF00000n) {
|
|
3165
|
-
if (hy > 0n) {
|
|
3166
|
-
return WasmI32.toGrain(newFloat64(s * huge * huge)): Number
|
|
3167
|
-
} else {
|
|
3168
|
-
return WasmI32.toGrain(newFloat64(s * tiny * tiny)): Number
|
|
3169
|
-
}
|
|
3170
|
-
} else {
|
|
3171
|
-
use WasmF64.{ (-), (+) }
|
|
3172
|
-
use WasmI64.{ (&) }
|
|
3173
|
-
t = ax - 1.0W
|
|
3174
|
-
w = t * t * (0.5W - t * (inv3 - t * 0.25W))
|
|
3175
|
-
u = ivln2_h * t
|
|
3176
|
-
v = t * ivln2_l - w * ivln2
|
|
3177
|
-
t1 = u + v
|
|
3178
|
-
t1 = WasmF64.reinterpretI64(
|
|
3179
|
-
WasmI64.reinterpretF64(t1) & 0xFFFFFFFF00000000N
|
|
3180
|
-
)
|
|
3181
|
-
t2 = v - (t1 - u)
|
|
3182
|
-
}
|
|
3183
|
-
} else {
|
|
3184
|
-
let mut ss = 0.0W
|
|
3185
|
-
and s2 = 0.0W
|
|
3186
|
-
and s_h = 0.0W
|
|
3187
|
-
and s_l = 0.0W
|
|
3188
|
-
and t_h = 0.0W
|
|
3189
|
-
and t_l = 0.0W
|
|
3190
|
-
n = 0n
|
|
3191
|
-
if (ix < 0x00100000n) {
|
|
3192
|
-
use WasmI64.{ (>>>) }
|
|
3193
|
-
ax *= two53
|
|
3194
|
-
n -= 53n
|
|
3195
|
-
ix = WasmI32.wrapI64(WasmI64.reinterpretF64(ax) >>> 32N)
|
|
3196
|
-
}
|
|
3197
|
-
n += (ix >> 20n) - 0x3FFn
|
|
3198
|
-
j = ix & 0x000FFFFFn
|
|
3199
|
-
ix = j | 0x3FF00000n
|
|
3200
|
-
if (j <= 0x3988En) {
|
|
3201
|
-
k = 0n
|
|
3202
|
-
} else if (j < 0xBB67An) {
|
|
3203
|
-
k = 1n
|
|
3204
|
-
} else {
|
|
3205
|
-
k = 0n
|
|
3206
|
-
n += 1n
|
|
3207
|
-
ix -= 0x00100000n
|
|
3208
|
-
}
|
|
3209
|
-
use WasmI64.{ (&), (|), (<<) }
|
|
3210
|
-
ax = WasmF64.reinterpretI64(
|
|
3211
|
-
WasmI64.reinterpretF64(ax) & 0xFFFFFFFFN | WasmI64.extendI32S(ix) << 32N
|
|
3212
|
-
)
|
|
3213
|
-
let bp = if (k != 0n) 1.5W else 1.0W
|
|
3214
|
-
use WasmF64.{ (+), (-) }
|
|
3215
|
-
u = ax - bp
|
|
3216
|
-
v = 1.0W / (ax + bp)
|
|
3217
|
-
ss = u * v
|
|
3218
|
-
s_h = ss
|
|
3219
|
-
s_h = WasmF64.reinterpretI64(
|
|
3220
|
-
WasmI64.reinterpretF64(s_h) & 0xFFFFFFFF00000000N
|
|
3221
|
-
)
|
|
3222
|
-
use WasmI32.{ (+), (|), (<<) as shlWasmI64 }
|
|
3223
|
-
t_h = WasmF64.reinterpretI64(
|
|
3224
|
-
WasmI64.extendI32S(
|
|
3225
|
-
(ix >> 1n | 0x20000000n) + 0x00080000n + shlWasmI64(k, 18n)
|
|
3226
|
-
) <<
|
|
3227
|
-
32N
|
|
3228
|
-
)
|
|
3229
|
-
use WasmF64.{ (+) }
|
|
3230
|
-
t_l = ax - (t_h - bp)
|
|
3231
|
-
s_l = v * (u - s_h * t_h - s_h * t_l)
|
|
3232
|
-
s2 = ss * ss
|
|
3233
|
-
//formatter-ignore
|
|
3234
|
-
r = s2 * s2 * (l1 + s2 * (l2 + s2 * (l3 + s2 * (l4 + s2 * (l5 + s2 * l6)))))
|
|
3235
|
-
r += s_l * (s_h + ss)
|
|
3236
|
-
s2 = s_h * s_h
|
|
3237
|
-
t_h = 3.0W + s2 + r
|
|
3238
|
-
t_h = WasmF64.reinterpretI64(
|
|
3239
|
-
WasmI64.reinterpretF64(t_h) & 0xFFFFFFFF00000000N
|
|
3240
|
-
)
|
|
3241
|
-
t_l = r - (t_h - 3.0W - s2)
|
|
3242
|
-
u = s_h * t_h
|
|
3243
|
-
v = s_l * t_h + t_l * ss
|
|
3244
|
-
p_h = u + v
|
|
3245
|
-
p_h = WasmF64.reinterpretI64(
|
|
3246
|
-
WasmI64.reinterpretF64(p_h) & 0xFFFFFFFF00000000N
|
|
3247
|
-
)
|
|
3248
|
-
p_l = v - (p_h - u)
|
|
3249
|
-
let z_h = cp_h * p_h
|
|
3250
|
-
let dp_l = if (k != 0n) dp_l1 else 0.0W
|
|
3251
|
-
let z_l = cp_l * p_h + p_l * cp + dp_l
|
|
3252
|
-
t = WasmF64.convertI32S(n)
|
|
3253
|
-
let dp_h = if (k != 0n) dp_h1 else 0.0W
|
|
3254
|
-
t1 = z_h + z_l + dp_h + t
|
|
3255
|
-
t1 = WasmF64.reinterpretI64(
|
|
3256
|
-
WasmI64.reinterpretF64(t1) & 0xFFFFFFFF00000000N
|
|
3257
|
-
)
|
|
3258
|
-
t2 = z_l - (t1 - t - dp_h - z_h)
|
|
3259
|
-
}
|
|
3260
|
-
use WasmF64.{ (>), (-), (+) }
|
|
3261
|
-
use WasmI64.{ (&), (>>), (<<) }
|
|
3262
|
-
let y1 = WasmF64.reinterpretI64(
|
|
3263
|
-
WasmI64.reinterpretF64(y) & 0xFFFFFFFF00000000N
|
|
3264
|
-
)
|
|
3265
|
-
p_l = (y - y1) * t1 + y * t2
|
|
3266
|
-
p_h = y1 * t1
|
|
3267
|
-
z = p_l + p_h
|
|
3268
|
-
let u_ = WasmI64.reinterpretF64(z)
|
|
3269
|
-
let j = WasmI32.wrapI64(u_ >> 32N)
|
|
3270
|
-
let i = WasmI32.wrapI64(u_)
|
|
3271
|
-
use WasmI32.{ (-) as addWasmI32, (&) }
|
|
3272
|
-
if (j >= 0x40900000n) {
|
|
3273
|
-
if ((addWasmI32(j, 0x40900000n) | i) != 0n) {
|
|
3274
|
-
return WasmI32.toGrain(newFloat64(s * huge * huge)): Number
|
|
3275
|
-
} else if (p_l + ovt > z - p_h) {
|
|
3276
|
-
return WasmI32.toGrain(newFloat64(s * huge * huge)): Number
|
|
3277
|
-
}
|
|
3278
|
-
} else if ((j & 0x7FFFFFFFn) >= 0x4090CC00n) {
|
|
3279
|
-
use WasmF64.{ (<=) }
|
|
3280
|
-
if (addWasmI32(j, 0xC090CC00n | i) != 0n) {
|
|
3281
|
-
return WasmI32.toGrain(newFloat64(s * tiny * tiny)): Number
|
|
3282
|
-
} else if (p_l <= z - p_h) {
|
|
3283
|
-
return WasmI32.toGrain(newFloat64(s * tiny * tiny)): Number
|
|
3284
|
-
}
|
|
3285
|
-
}
|
|
3286
|
-
use WasmI32.{ (&), (>>), (-), (+), (>), (*), (<<), (^) }
|
|
3287
|
-
let i = j & 0x7FFFFFFFn
|
|
3288
|
-
k = (i >> 20n) - 0x3FFn
|
|
3289
|
-
n = 0n
|
|
3290
|
-
if (i > 0x3FE00000n) {
|
|
3291
|
-
use WasmI64.{ (<<) }
|
|
3292
|
-
n = j + (0x00100000n >> (k + 1n))
|
|
3293
|
-
k = ((n & 0x7FFFFFFFn) >> 20n) - 0x3FFn
|
|
3294
|
-
t = 0.0W
|
|
3295
|
-
t = WasmF64.reinterpretI64(
|
|
3296
|
-
WasmI64.extendI32S(n & (0x000FFFFFn >> k ^ -1n)) << 32N
|
|
3297
|
-
)
|
|
3298
|
-
n = (n & 0x000FFFFFn | 0x00100000n) >> (20n - k)
|
|
3299
|
-
if (j < 0n) n *= -1n
|
|
3300
|
-
use WasmF64.{ (-) }
|
|
3301
|
-
p_h -= t
|
|
3302
|
-
}
|
|
3303
|
-
use WasmI64.{ (&), (|) }
|
|
3304
|
-
use WasmF64.{ (*), (+), (-) }
|
|
3305
|
-
t = p_l + p_h
|
|
3306
|
-
t = WasmF64.reinterpretI64(WasmI64.reinterpretF64(t) & 0xFFFFFFFF00000000N)
|
|
3307
|
-
u = t * lg2_h
|
|
3308
|
-
v = (p_l - (t - p_h)) * lg2 + t * lg2_l
|
|
3309
|
-
z = u + v
|
|
3310
|
-
w = v - (z - u)
|
|
3311
|
-
t = z * z
|
|
3312
|
-
t1 = z - t * (p1 + t * (p2 + t * (p3 + t * (p4 + t * p5))))
|
|
3313
|
-
r = z * t1 / (t1 - 2.0W) - (w + z * w)
|
|
3314
|
-
z = 1.0W - (r - z)
|
|
3315
|
-
use WasmI32.{ (+) }
|
|
3316
|
-
let j = WasmI32.wrapI64(shrSWasmI64(WasmI64.reinterpretF64(z), 32N)) +
|
|
3317
|
-
(n << 20n)
|
|
3318
|
-
if (j >> 20n <= 0n) {
|
|
3319
|
-
z = scalbn(z, n)
|
|
3320
|
-
} else {
|
|
3321
|
-
use WasmI64.{ (<<) }
|
|
3322
|
-
z = WasmF64.reinterpretI64(
|
|
3323
|
-
WasmI64.reinterpretF64(z) & 0xFFFFFFFFN | WasmI64.extendI32S(j) << 32N
|
|
3324
|
-
)
|
|
3325
|
-
}
|
|
3326
|
-
WasmI32.toGrain(newFloat64(s * z)): Number
|
|
3318
|
+
WasmI32.toGrain(newFloat64(powf(x, y))): Number
|
|
3327
3319
|
}
|
|
3328
3320
|
|
|
3329
3321
|
ignore(base)
|