@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.
Files changed (137) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/LICENSE +1 -1
  3. package/README.md +2 -2
  4. package/array.gr +55 -7
  5. package/array.md +606 -560
  6. package/bigint.md +228 -228
  7. package/buffer.gr +85 -53
  8. package/buffer.md +442 -319
  9. package/bytes.gr +112 -35
  10. package/bytes.md +299 -219
  11. package/char.gr +201 -99
  12. package/char.md +447 -120
  13. package/exception.gr +11 -11
  14. package/exception.md +29 -4
  15. package/float32.gr +327 -3
  16. package/float32.md +698 -111
  17. package/float64.gr +320 -3
  18. package/float64.md +698 -111
  19. package/fs.gr +1082 -0
  20. package/fs.md +630 -0
  21. package/hash.gr +142 -88
  22. package/hash.md +105 -17
  23. package/int16.md +178 -178
  24. package/int32.gr +26 -5
  25. package/int32.md +266 -231
  26. package/int64.gr +27 -2
  27. package/int64.md +266 -231
  28. package/int8.md +178 -178
  29. package/json.gr +366 -51
  30. package/json.md +431 -15
  31. package/list.gr +328 -31
  32. package/list.md +759 -336
  33. package/map.gr +20 -12
  34. package/map.md +266 -260
  35. package/marshal.gr +41 -40
  36. package/marshal.md +14 -14
  37. package/number.gr +278 -35
  38. package/number.md +688 -269
  39. package/option.md +162 -162
  40. package/package.json +5 -3
  41. package/path.gr +48 -0
  42. package/path.md +180 -89
  43. package/pervasives.gr +2 -2
  44. package/pervasives.md +275 -275
  45. package/priorityqueue.gr +7 -7
  46. package/priorityqueue.md +131 -131
  47. package/queue.gr +183 -29
  48. package/queue.md +404 -148
  49. package/random.md +43 -43
  50. package/range.gr +4 -4
  51. package/range.md +42 -42
  52. package/rational.md +123 -123
  53. package/regex.gr +52 -51
  54. package/regex.md +102 -102
  55. package/result.md +118 -118
  56. package/runtime/atof/common.md +39 -39
  57. package/runtime/atof/decimal.gr +6 -6
  58. package/runtime/atof/decimal.md +14 -14
  59. package/runtime/atof/lemire.gr +5 -5
  60. package/runtime/atof/lemire.md +1 -1
  61. package/runtime/atof/parse.gr +16 -16
  62. package/runtime/atof/parse.md +2 -2
  63. package/runtime/atof/slow.md +1 -1
  64. package/runtime/atof/table.md +2 -2
  65. package/runtime/atoi/parse.gr +3 -3
  66. package/runtime/atoi/parse.md +1 -1
  67. package/runtime/bigint.gr +15 -47
  68. package/runtime/bigint.md +54 -60
  69. package/runtime/compare.gr +2 -2
  70. package/runtime/compare.md +8 -8
  71. package/runtime/dataStructures.md +211 -211
  72. package/runtime/debugPrint.gr +4 -1
  73. package/runtime/debugPrint.md +9 -9
  74. package/runtime/equal.gr +99 -77
  75. package/runtime/equal.md +8 -8
  76. package/runtime/exception.gr +62 -82
  77. package/runtime/exception.md +62 -11
  78. package/runtime/gc.gr +39 -45
  79. package/runtime/gc.md +4 -4
  80. package/runtime/malloc.gr +7 -7
  81. package/runtime/malloc.md +13 -13
  82. package/runtime/math/kernel/cos.gr +70 -0
  83. package/runtime/math/kernel/cos.md +14 -0
  84. package/runtime/math/kernel/sin.gr +65 -0
  85. package/runtime/math/kernel/sin.md +14 -0
  86. package/runtime/math/kernel/tan.gr +136 -0
  87. package/runtime/math/kernel/tan.md +14 -0
  88. package/runtime/math/rempio2.gr +244 -0
  89. package/runtime/math/rempio2.md +14 -0
  90. package/runtime/math/trig.gr +130 -0
  91. package/runtime/math/trig.md +28 -0
  92. package/runtime/math/umuldi.gr +26 -0
  93. package/runtime/math/umuldi.md +14 -0
  94. package/runtime/numberUtils.gr +29 -29
  95. package/runtime/numberUtils.md +12 -12
  96. package/runtime/numbers.gr +373 -381
  97. package/runtime/numbers.md +348 -342
  98. package/runtime/string.gr +37 -105
  99. package/runtime/string.md +20 -26
  100. package/runtime/unsafe/constants.md +24 -24
  101. package/runtime/unsafe/conv.md +19 -19
  102. package/runtime/unsafe/memory.gr +24 -20
  103. package/runtime/unsafe/memory.md +27 -7
  104. package/runtime/unsafe/offsets.gr +36 -0
  105. package/runtime/unsafe/offsets.md +88 -0
  106. package/runtime/unsafe/panic.gr +28 -0
  107. package/runtime/unsafe/panic.md +14 -0
  108. package/runtime/unsafe/tags.md +32 -32
  109. package/runtime/unsafe/wasmf32.md +28 -28
  110. package/runtime/unsafe/wasmf64.md +28 -28
  111. package/runtime/unsafe/wasmi32.md +47 -47
  112. package/runtime/unsafe/wasmi64.md +50 -50
  113. package/runtime/utf8.gr +189 -0
  114. package/runtime/utf8.md +117 -0
  115. package/runtime/wasi.gr +4 -2
  116. package/runtime/wasi.md +147 -147
  117. package/set.gr +18 -11
  118. package/set.md +253 -247
  119. package/stack.gr +171 -2
  120. package/stack.md +371 -89
  121. package/string.gr +352 -557
  122. package/string.md +298 -255
  123. package/uint16.md +170 -170
  124. package/uint32.gr +25 -4
  125. package/uint32.md +249 -214
  126. package/uint64.gr +25 -5
  127. package/uint64.md +249 -214
  128. package/uint8.md +170 -170
  129. package/uri.gr +57 -53
  130. package/uri.md +88 -89
  131. package/wasi/file.gr +67 -59
  132. package/wasi/file.md +308 -308
  133. package/wasi/process.md +26 -26
  134. package/wasi/random.md +12 -12
  135. package/wasi/time.md +16 -16
  136. package/runtime/utils/printing.gr +0 -60
  137. package/runtime/utils/printing.md +0 -26
@@ -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 < 0N && yval > 0N || xval > 0N && yval < 0N) {
1640
- let modval = WasmI64.remS(i64abs(xval), i64abs(yval))
1641
- let result = if (modval != 0N) {
1642
- i64abs(yval) - modval * (if (yval < 0N) -1N else 1N)
1643
- } else {
1644
- modval
1645
- }
1646
- reducedInteger(result)
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
- // Fast paths
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)