@grain/stdlib 0.4.2 → 0.4.6
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 +52 -0
- package/LICENSE +1 -1
- package/array.gr +200 -89
- package/array.md +81 -5
- package/buffer.gr +93 -36
- package/bytes.gr +10 -10
- package/char.gr +112 -56
- package/char.md +200 -0
- package/float32.gr +120 -4
- package/float32.md +315 -0
- package/float64.gr +120 -4
- package/float64.md +315 -0
- package/hash.gr +42 -15
- package/hash.md +44 -0
- package/int32.gr +370 -75
- package/int32.md +833 -0
- package/int64.gr +370 -75
- package/int64.md +833 -0
- package/list.gr +121 -50
- package/map.gr +106 -110
- package/number.gr +37 -1
- package/number.md +66 -0
- package/option.gr +260 -53
- package/option.md +579 -0
- package/package.json +1 -1
- package/pervasives.gr +32 -20
- package/queue.gr +102 -30
- package/queue.md +191 -0
- package/range.gr +26 -26
- package/range.md +1 -1
- package/regex.md +9 -9
- package/result.gr +216 -70
- package/result.md +446 -0
- package/runtime/dataStructures.gr +28 -29
- package/runtime/debug.gr +0 -1
- package/runtime/equal.gr +37 -16
- package/runtime/exception.gr +28 -15
- package/runtime/gc.gr +33 -20
- package/runtime/malloc.gr +19 -11
- package/runtime/numberUtils.gr +208 -103
- package/runtime/numbers.gr +217 -118
- package/runtime/string.gr +98 -39
- package/runtime/stringUtils.gr +176 -0
- package/runtime/unsafe/conv.gr +10 -10
- package/runtime/unsafe/memory.gr +14 -3
- package/runtime/unsafe/printWasm.gr +4 -4
- package/runtime/unsafe/tags.gr +2 -2
- package/runtime/unsafe/wasmf32.gr +9 -2
- package/runtime/unsafe/wasmf64.gr +9 -2
- package/runtime/unsafe/wasmi32.gr +65 -47
- package/runtime/unsafe/wasmi64.gr +78 -50
- package/runtime/wasi.gr +199 -45
- package/set.gr +281 -119
- package/set.md +502 -0
- package/stack.gr +26 -26
- package/string.gr +657 -341
- package/string.md +815 -0
- package/sys/file.gr +356 -177
- package/sys/process.gr +10 -6
- package/sys/random.gr +3 -6
- package/sys/time.gr +3 -3
package/runtime/numberUtils.gr
CHANGED
|
@@ -12,7 +12,7 @@ import WasmI32, {
|
|
|
12
12
|
sub as (-),
|
|
13
13
|
shl as (<<),
|
|
14
14
|
and as (&),
|
|
15
|
-
or as (|)
|
|
15
|
+
or as (|),
|
|
16
16
|
// no signed imports, as care should be taken to use signed or unsigned operators
|
|
17
17
|
} from "runtime/unsafe/wasmi32"
|
|
18
18
|
import WasmI64 from "runtime/unsafe/wasmi64"
|
|
@@ -20,10 +20,10 @@ import WasmF64 from "runtime/unsafe/wasmf64"
|
|
|
20
20
|
import Exception from "runtime/exception"
|
|
21
21
|
import { allocateString, singleByteString } from "runtime/dataStructures"
|
|
22
22
|
|
|
23
|
-
primitive (!)
|
|
24
|
-
primitive (&&)
|
|
25
|
-
primitive (||)
|
|
26
|
-
primitive throw
|
|
23
|
+
primitive (!): Bool -> Bool = "@not"
|
|
24
|
+
primitive (&&): (Bool, Bool) -> Bool = "@and"
|
|
25
|
+
primitive (||): (Bool, Bool) -> Bool = "@or"
|
|
26
|
+
primitive throw: Exception -> a = "@throw"
|
|
27
27
|
|
|
28
28
|
export let _MAX_DOUBLE_LENGTH = 28n
|
|
29
29
|
|
|
@@ -695,49 +695,63 @@ let get_FRC_POWERS = () => {
|
|
|
695
695
|
_FRC_POWERS
|
|
696
696
|
}
|
|
697
697
|
|
|
698
|
-
let isPowerOf2 =
|
|
698
|
+
let isPowerOf2 = value => {
|
|
699
699
|
WasmI32.popcnt(value) == 1n
|
|
700
700
|
}
|
|
701
701
|
|
|
702
702
|
// Count number of decimals for u32 values
|
|
703
703
|
// In our case input value always non-zero so we can simplify some parts
|
|
704
|
-
export let decimalCount32 =
|
|
704
|
+
export let decimalCount32 = value => {
|
|
705
705
|
if (WasmI32.ltU(value, 100000n)) {
|
|
706
706
|
if (WasmI32.ltU(value, 100n)) {
|
|
707
707
|
1n + (if (WasmI32.geU(value, 10n)) 1n else 0n)
|
|
708
708
|
} else {
|
|
709
|
-
3n +
|
|
709
|
+
3n +
|
|
710
|
+
(if (WasmI32.geU(value, 10000n)) 1n else 0n) +
|
|
711
|
+
(if (WasmI32.geU(value, 1000n)) 1n else 0n)
|
|
710
712
|
}
|
|
711
713
|
} else {
|
|
712
714
|
if (WasmI32.ltU(value, 10000000n)) {
|
|
713
715
|
6n + (if (WasmI32.geU(value, 1000000n)) 1n else 0n)
|
|
714
716
|
} else {
|
|
715
|
-
8n +
|
|
717
|
+
8n +
|
|
718
|
+
(if (WasmI32.geU(value, 1000000000n)) 1n else 0n) +
|
|
719
|
+
(if (WasmI32.geU(value, 100000000n)) 1n else 0n)
|
|
716
720
|
}
|
|
717
721
|
}
|
|
718
722
|
}
|
|
719
723
|
|
|
720
724
|
// Count number of decimals for u64 values
|
|
721
725
|
// In our case input value always greater than 2^32-1 so we can skip some parts
|
|
722
|
-
let decimalCount64High =
|
|
726
|
+
let decimalCount64High = value => {
|
|
723
727
|
if (WasmI64.ltU(value, 1000000000000000N)) {
|
|
724
728
|
if (WasmI64.ltU(value, 1000000000000N)) {
|
|
725
|
-
10n +
|
|
729
|
+
10n +
|
|
730
|
+
(if (WasmI64.geU(value, 100000000000N)) 1n else 0n) +
|
|
731
|
+
(if (WasmI64.geU(value, 10000000000N)) 1n else 0n)
|
|
726
732
|
} else {
|
|
727
|
-
13n +
|
|
733
|
+
13n +
|
|
734
|
+
(if (WasmI64.geU(value, 100000000000000N)) 1n else 0n) +
|
|
735
|
+
(if (WasmI64.geU(value, 10000000000000N)) 1n else 0n)
|
|
728
736
|
}
|
|
729
737
|
} else {
|
|
730
738
|
if (WasmI64.ltU(value, 100000000000000000N)) {
|
|
731
739
|
16n + (if (WasmI64.geU(value, 10000000000000000N)) 1n else 0n)
|
|
732
740
|
} else {
|
|
733
|
-
18n +
|
|
741
|
+
18n +
|
|
742
|
+
(if (WasmI64.geU(value, 0x8AC7230489E80000N)) 1n else 0n) +
|
|
743
|
+
(if (WasmI64.geU(value, 1000000000000000000N)) 1n else 0n)
|
|
734
744
|
}
|
|
735
745
|
}
|
|
736
746
|
}
|
|
737
747
|
|
|
738
748
|
let ulog_base = (num, base) => {
|
|
739
749
|
if (isPowerOf2(base)) {
|
|
740
|
-
WasmI32.divU(
|
|
750
|
+
WasmI32.divU(
|
|
751
|
+
63n - WasmI32.wrapI64(WasmI64.clz(num)),
|
|
752
|
+
31n - WasmI32.clz(base)
|
|
753
|
+
) +
|
|
754
|
+
1n
|
|
741
755
|
} else {
|
|
742
756
|
let b64 = WasmI64.extendI32U(base)
|
|
743
757
|
let mut b = b64
|
|
@@ -750,7 +764,7 @@ let ulog_base = (num, base) => {
|
|
|
750
764
|
}
|
|
751
765
|
while (WasmI64.geU(num, 1N)) {
|
|
752
766
|
num = WasmI64.divU(num, b64)
|
|
753
|
-
e
|
|
767
|
+
e += 1n
|
|
754
768
|
}
|
|
755
769
|
e - 1n
|
|
756
770
|
}
|
|
@@ -772,11 +786,11 @@ let utoa32_dec_lut = (buffer, num, offset) => {
|
|
|
772
786
|
let digits2 = WasmI32.load16U(get_DIGITS() + (d2 << 1n), 0n)
|
|
773
787
|
|
|
774
788
|
offset -= 4n
|
|
775
|
-
WasmI32.store(buffer + offset, digits1 |
|
|
789
|
+
WasmI32.store(buffer + offset, digits1 | digits2 << 16n, 0n)
|
|
776
790
|
}
|
|
777
791
|
|
|
778
792
|
if (WasmI32.geU(num, 100n)) {
|
|
779
|
-
let t
|
|
793
|
+
let t = WasmI32.divU(num, 100n)
|
|
780
794
|
let d1 = WasmI32.remU(num, 100n)
|
|
781
795
|
num = t
|
|
782
796
|
offset -= 2n
|
|
@@ -815,13 +829,13 @@ let utoa64_dec_lut = (buffer, num, offset) => {
|
|
|
815
829
|
let mut digits2 = WasmI32.load16U(get_DIGITS() + (c2 << 1n), 0n)
|
|
816
830
|
|
|
817
831
|
offset -= 4n
|
|
818
|
-
WasmI32.store(buffer + offset, digits1 |
|
|
832
|
+
WasmI32.store(buffer + offset, digits1 | digits2 << 16n, 0n)
|
|
819
833
|
|
|
820
834
|
digits1 = WasmI32.load16U(get_DIGITS() + (b1 << 1n), 0n)
|
|
821
835
|
digits2 = WasmI32.load16U(get_DIGITS() + (b2 << 1n), 0n)
|
|
822
836
|
|
|
823
837
|
offset -= 4n
|
|
824
|
-
WasmI32.store(buffer + offset, digits1 |
|
|
838
|
+
WasmI32.store(buffer + offset, digits1 | digits2 << 16n, 0n)
|
|
825
839
|
}
|
|
826
840
|
|
|
827
841
|
utoa32_dec_lut(buffer, WasmI32.wrapI64(num), offset)
|
|
@@ -841,7 +855,11 @@ let utoa_hex_lut = (buffer, num, offset) => {
|
|
|
841
855
|
num = WasmI64.shrU(num, 8N)
|
|
842
856
|
}
|
|
843
857
|
if (WasmI32.ne(offset & 1n, 0n)) {
|
|
844
|
-
WasmI32.store8(
|
|
858
|
+
WasmI32.store8(
|
|
859
|
+
buffer,
|
|
860
|
+
WasmI32.load8U(lut + (WasmI32.wrapI64(num) << 5n), 0n),
|
|
861
|
+
0n
|
|
862
|
+
)
|
|
845
863
|
}
|
|
846
864
|
}
|
|
847
865
|
|
|
@@ -866,12 +884,16 @@ let utoa64_any_core = (buffer, num, offset, radix) => {
|
|
|
866
884
|
let base = WasmI64.extendI32U(radix)
|
|
867
885
|
let mut num = num
|
|
868
886
|
let mut offset = offset
|
|
869
|
-
if ((radix &
|
|
887
|
+
if ((radix & radix - 1n) == 0n) { // for radix which pow of two
|
|
870
888
|
let shift = WasmI64.extendI32U(WasmI32.ctz(radix) & 7n)
|
|
871
889
|
let mask = WasmI64.sub(base, 1N)
|
|
872
890
|
for (;;) {
|
|
873
891
|
offset -= 1n
|
|
874
|
-
WasmI32.store8(
|
|
892
|
+
WasmI32.store8(
|
|
893
|
+
buffer + offset,
|
|
894
|
+
WasmI32.load8U(lut + WasmI32.wrapI64(WasmI64.and(num, mask)), 0n),
|
|
895
|
+
0n
|
|
896
|
+
)
|
|
875
897
|
num = WasmI64.shrU(num, shift)
|
|
876
898
|
if (WasmI64.eqz(num)) break
|
|
877
899
|
}
|
|
@@ -879,7 +901,14 @@ let utoa64_any_core = (buffer, num, offset, radix) => {
|
|
|
879
901
|
for (;;) {
|
|
880
902
|
offset -= 1n
|
|
881
903
|
let q = WasmI64.divU(num, base)
|
|
882
|
-
WasmI32.store8(
|
|
904
|
+
WasmI32.store8(
|
|
905
|
+
buffer + offset,
|
|
906
|
+
WasmI32.load8U(
|
|
907
|
+
lut + WasmI32.wrapI64(WasmI64.sub(num, WasmI64.mul(q, base))),
|
|
908
|
+
0n
|
|
909
|
+
),
|
|
910
|
+
0n
|
|
911
|
+
)
|
|
883
912
|
num = q
|
|
884
913
|
if (WasmI64.eqz(num)) break
|
|
885
914
|
}
|
|
@@ -888,7 +917,9 @@ let utoa64_any_core = (buffer, num, offset, radix) => {
|
|
|
888
917
|
|
|
889
918
|
export let utoa32Buffered = (buf, value, radix) => {
|
|
890
919
|
if (WasmI32.ltS(radix, 2n) || WasmI32.gtS(radix, 36n)) {
|
|
891
|
-
throw Exception.InvalidArgument(
|
|
920
|
+
throw Exception.InvalidArgument(
|
|
921
|
+
"toString() radix argument must be between 2 and 36"
|
|
922
|
+
)
|
|
892
923
|
}
|
|
893
924
|
let str = if (WasmI32.eqz(value)) {
|
|
894
925
|
WasmI32.store8(buf, _CHAR_CODE_0, 0n)
|
|
@@ -907,7 +938,9 @@ export let utoa32Buffered = (buf, value, radix) => {
|
|
|
907
938
|
|
|
908
939
|
export let utoa32 = (value, radix) => {
|
|
909
940
|
if (WasmI32.ltS(radix, 2n) || WasmI32.gtS(radix, 36n)) {
|
|
910
|
-
throw Exception.InvalidArgument(
|
|
941
|
+
throw Exception.InvalidArgument(
|
|
942
|
+
"toString() radix argument must be between 2 and 36"
|
|
943
|
+
)
|
|
911
944
|
}
|
|
912
945
|
let str = if (WasmI32.eqz(value)) {
|
|
913
946
|
singleByteString(_CHAR_CODE_0)
|
|
@@ -933,7 +966,9 @@ export let utoa32 = (value, radix) => {
|
|
|
933
966
|
export let itoa32 = (value, radix) => {
|
|
934
967
|
let mut value = value
|
|
935
968
|
if (WasmI32.ltS(radix, 2n) || WasmI32.gtS(radix, 36n)) {
|
|
936
|
-
throw Exception.InvalidArgument(
|
|
969
|
+
throw Exception.InvalidArgument(
|
|
970
|
+
"toString() radix argument must be between 2 and 36"
|
|
971
|
+
)
|
|
937
972
|
}
|
|
938
973
|
let mut out = 0n
|
|
939
974
|
let sign = WasmI32.shrU(value, 31n)
|
|
@@ -962,13 +997,15 @@ export let itoa32 = (value, radix) => {
|
|
|
962
997
|
|
|
963
998
|
export let utoa64 = (value, radix) => {
|
|
964
999
|
if (WasmI32.ltS(radix, 2n) || WasmI32.gtS(radix, 36n)) {
|
|
965
|
-
throw Exception.InvalidArgument(
|
|
1000
|
+
throw Exception.InvalidArgument(
|
|
1001
|
+
"toString() radix argument must be between 2 and 36"
|
|
1002
|
+
)
|
|
966
1003
|
}
|
|
967
1004
|
let str = if (WasmI64.eqz(value)) {
|
|
968
1005
|
singleByteString(_CHAR_CODE_0)
|
|
969
1006
|
} else if (radix == 10n) {
|
|
970
1007
|
if (WasmI64.leU(value, _I32_MAX)) {
|
|
971
|
-
let val32
|
|
1008
|
+
let val32 = WasmI32.wrapI64(value)
|
|
972
1009
|
let decimals = decimalCount32(val32)
|
|
973
1010
|
let out = allocateString(decimals)
|
|
974
1011
|
utoa32_dec_core(out + 8n, val32, decimals)
|
|
@@ -980,7 +1017,8 @@ export let utoa64 = (value, radix) => {
|
|
|
980
1017
|
out
|
|
981
1018
|
}
|
|
982
1019
|
} else if (radix == 16n) {
|
|
983
|
-
let decimals = WasmI32.shrU(63n - WasmI32.wrapI64(WasmI64.clz(value)), 2n) +
|
|
1020
|
+
let decimals = WasmI32.shrU(63n - WasmI32.wrapI64(WasmI64.clz(value)), 2n) +
|
|
1021
|
+
1n
|
|
984
1022
|
let out = allocateString(decimals)
|
|
985
1023
|
utoa64_hex_core(out + 8n, value, decimals)
|
|
986
1024
|
out
|
|
@@ -995,7 +1033,9 @@ export let utoa64 = (value, radix) => {
|
|
|
995
1033
|
|
|
996
1034
|
export let itoa64 = (value, radix) => {
|
|
997
1035
|
if (WasmI32.ltS(radix, 2n) || WasmI32.gtS(radix, 36n)) {
|
|
998
|
-
throw Exception.InvalidArgument(
|
|
1036
|
+
throw Exception.InvalidArgument(
|
|
1037
|
+
"toString() radix argument must be between 2 and 36"
|
|
1038
|
+
)
|
|
999
1039
|
}
|
|
1000
1040
|
|
|
1001
1041
|
let mut value = value
|
|
@@ -1008,7 +1048,7 @@ export let itoa64 = (value, radix) => {
|
|
|
1008
1048
|
out = singleByteString(_CHAR_CODE_0)
|
|
1009
1049
|
} else if (radix == 10n) {
|
|
1010
1050
|
if (WasmI64.leU(value, _I32_MAX)) {
|
|
1011
|
-
let val32
|
|
1051
|
+
let val32 = WasmI32.wrapI64(value)
|
|
1012
1052
|
let decimals = decimalCount32(val32) + sign
|
|
1013
1053
|
out = allocateString(decimals)
|
|
1014
1054
|
utoa32_dec_core(out + 8n, val32, decimals)
|
|
@@ -1018,7 +1058,9 @@ export let itoa64 = (value, radix) => {
|
|
|
1018
1058
|
utoa64_dec_core(out + 8n, value, decimals)
|
|
1019
1059
|
}
|
|
1020
1060
|
} else if (radix == 16n) {
|
|
1021
|
-
let decimals = WasmI32.shrU(63n - WasmI32.wrapI64(WasmI64.clz(value)), 2n) +
|
|
1061
|
+
let decimals = WasmI32.shrU(63n - WasmI32.wrapI64(WasmI64.clz(value)), 2n) +
|
|
1062
|
+
1n +
|
|
1063
|
+
sign
|
|
1022
1064
|
out = allocateString(decimals)
|
|
1023
1065
|
utoa64_hex_core(out + 8n, value, decimals)
|
|
1024
1066
|
} else {
|
|
@@ -1061,9 +1103,13 @@ let grisuRound = (buffer, len, delta, rest, ten_kappa, wp_w) => {
|
|
|
1061
1103
|
let mut rest = rest
|
|
1062
1104
|
while (
|
|
1063
1105
|
WasmI64.ltU(rest, wp_w) &&
|
|
1064
|
-
WasmI64.geU(WasmI64.sub(delta, rest), ten_kappa) &&
|
|
1106
|
+
WasmI64.geU(WasmI64.sub(delta, rest), ten_kappa) &&
|
|
1107
|
+
(
|
|
1065
1108
|
WasmI64.ltU(WasmI64.add(rest, ten_kappa), wp_w) ||
|
|
1066
|
-
WasmI64.gtU(
|
|
1109
|
+
WasmI64.gtU(
|
|
1110
|
+
WasmI64.sub(wp_w, rest),
|
|
1111
|
+
WasmI64.sub(WasmI64.add(rest, ten_kappa), wp_w)
|
|
1112
|
+
)
|
|
1067
1113
|
)
|
|
1068
1114
|
) {
|
|
1069
1115
|
digit -= 1n
|
|
@@ -1076,11 +1122,13 @@ let genDigits = (buffer, w_frc, w_exp, mp_frc, mp_exp, delta, sign) => {
|
|
|
1076
1122
|
let mut delta = delta
|
|
1077
1123
|
let one_exp = 0n - mp_exp
|
|
1078
1124
|
let one_frc = WasmI64.shl(1N, WasmI64.extendI32U(one_exp))
|
|
1079
|
-
let mask
|
|
1125
|
+
let mask = WasmI64.sub(one_frc, 1N)
|
|
1080
1126
|
|
|
1081
1127
|
let mut wp_w_frc = WasmI64.sub(mp_frc, w_frc)
|
|
1082
1128
|
|
|
1083
|
-
let mut p1 = WasmI32.wrapI64(
|
|
1129
|
+
let mut p1 = WasmI32.wrapI64(
|
|
1130
|
+
WasmI64.shrU(mp_frc, WasmI64.extendI32U(one_exp))
|
|
1131
|
+
)
|
|
1084
1132
|
let mut p2 = WasmI64.and(mp_frc, mask)
|
|
1085
1133
|
|
|
1086
1134
|
let mut kappa = decimalCount32(p1)
|
|
@@ -1091,17 +1139,49 @@ let genDigits = (buffer, w_frc, w_exp, mp_frc, mp_exp, delta, sign) => {
|
|
|
1091
1139
|
while (WasmI32.gtS(kappa, 0n)) {
|
|
1092
1140
|
let mut d = 0n
|
|
1093
1141
|
match (kappa) {
|
|
1094
|
-
10n => {
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1142
|
+
10n => {
|
|
1143
|
+
d = WasmI32.divU(p1, 1000000000n)
|
|
1144
|
+
p1 = WasmI32.remU(p1, 1000000000n)
|
|
1145
|
+
},
|
|
1146
|
+
9n => {
|
|
1147
|
+
d = WasmI32.divU(p1, 100000000n)
|
|
1148
|
+
p1 = WasmI32.remU(p1, 100000000n)
|
|
1149
|
+
},
|
|
1150
|
+
8n => {
|
|
1151
|
+
d = WasmI32.divU(p1, 10000000n)
|
|
1152
|
+
p1 = WasmI32.remU(p1, 10000000n)
|
|
1153
|
+
},
|
|
1154
|
+
7n => {
|
|
1155
|
+
d = WasmI32.divU(p1, 1000000n)
|
|
1156
|
+
p1 = WasmI32.remU(p1, 1000000n)
|
|
1157
|
+
},
|
|
1158
|
+
6n => {
|
|
1159
|
+
d = WasmI32.divU(p1, 100000n)
|
|
1160
|
+
p1 = WasmI32.remU(p1, 100000n)
|
|
1161
|
+
},
|
|
1162
|
+
5n => {
|
|
1163
|
+
d = WasmI32.divU(p1, 10000n)
|
|
1164
|
+
p1 = WasmI32.remU(p1, 10000n)
|
|
1165
|
+
},
|
|
1166
|
+
4n => {
|
|
1167
|
+
d = WasmI32.divU(p1, 1000n)
|
|
1168
|
+
p1 = WasmI32.remU(p1, 1000n)
|
|
1169
|
+
},
|
|
1170
|
+
3n => {
|
|
1171
|
+
d = WasmI32.divU(p1, 100n)
|
|
1172
|
+
p1 = WasmI32.remU(p1, 100n)
|
|
1173
|
+
},
|
|
1174
|
+
2n => {
|
|
1175
|
+
d = WasmI32.divU(p1, 10n)
|
|
1176
|
+
p1 = WasmI32.remU(p1, 10n)
|
|
1177
|
+
},
|
|
1178
|
+
1n => {
|
|
1179
|
+
d = p1
|
|
1180
|
+
p1 = 0n
|
|
1181
|
+
},
|
|
1182
|
+
_ => {
|
|
1183
|
+
d = 0n
|
|
1184
|
+
},
|
|
1105
1185
|
}
|
|
1106
1186
|
|
|
1107
1187
|
if (WasmI32.ne(d | len, 0n)) {
|
|
@@ -1110,34 +1190,57 @@ let genDigits = (buffer, w_frc, w_exp, mp_frc, mp_exp, delta, sign) => {
|
|
|
1110
1190
|
}
|
|
1111
1191
|
|
|
1112
1192
|
kappa -= 1n
|
|
1113
|
-
let tmp = WasmI64.add(
|
|
1193
|
+
let tmp = WasmI64.add(
|
|
1194
|
+
WasmI64.shl(WasmI64.extendI32U(p1), WasmI64.extendI32U(one_exp)),
|
|
1195
|
+
p2
|
|
1196
|
+
)
|
|
1114
1197
|
if (WasmI64.leU(tmp, delta)) {
|
|
1115
1198
|
_K += kappa
|
|
1116
|
-
grisuRound(
|
|
1199
|
+
grisuRound(
|
|
1200
|
+
buffer,
|
|
1201
|
+
len,
|
|
1202
|
+
delta,
|
|
1203
|
+
tmp,
|
|
1204
|
+
WasmI64.shl(
|
|
1205
|
+
WasmI64.extendI32U(WasmI32.load(get_POWERS10() + (kappa << 2n), 0n)),
|
|
1206
|
+
WasmI64.extendI32U(one_exp)
|
|
1207
|
+
),
|
|
1208
|
+
wp_w_frc
|
|
1209
|
+
)
|
|
1117
1210
|
done = true
|
|
1118
1211
|
break
|
|
1119
1212
|
}
|
|
1120
1213
|
}
|
|
1121
1214
|
|
|
1122
|
-
if (!done)
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1215
|
+
if (!done)
|
|
1216
|
+
while (true) {
|
|
1217
|
+
p2 = WasmI64.mul(p2, 10N)
|
|
1218
|
+
delta = WasmI64.mul(delta, 10N)
|
|
1219
|
+
|
|
1220
|
+
let d = WasmI64.shrU(p2, WasmI64.extendI32U(one_exp))
|
|
1221
|
+
if (WasmI64.ne(WasmI64.or(d, WasmI64.extendI32U(len)), 0N)) {
|
|
1222
|
+
WasmI32.store8(
|
|
1223
|
+
buffer + len,
|
|
1224
|
+
_CHAR_CODE_0 + (WasmI32.wrapI64(d) & 0xffn),
|
|
1225
|
+
0n
|
|
1226
|
+
)
|
|
1227
|
+
len += 1n
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1230
|
+
p2 = WasmI64.and(p2, mask)
|
|
1231
|
+
kappa -= 1n
|
|
1232
|
+
if (WasmI64.ltU(p2, delta)) {
|
|
1233
|
+
_K += kappa
|
|
1234
|
+
wp_w_frc = WasmI64.mul(
|
|
1235
|
+
wp_w_frc,
|
|
1236
|
+
WasmI64.extendI32U(
|
|
1237
|
+
WasmI32.load(get_POWERS10() + (0n - kappa << 2n), 0n)
|
|
1238
|
+
)
|
|
1239
|
+
)
|
|
1240
|
+
grisuRound(buffer, len, delta, p2, one_frc, wp_w_frc)
|
|
1241
|
+
break
|
|
1242
|
+
}
|
|
1139
1243
|
}
|
|
1140
|
-
}
|
|
1141
1244
|
|
|
1142
1245
|
len
|
|
1143
1246
|
}
|
|
@@ -1148,16 +1251,21 @@ let genExponent = (buffer, k) => {
|
|
|
1148
1251
|
if (sign) k = 0n - k
|
|
1149
1252
|
let decimals = decimalCount32(k) + 1n
|
|
1150
1253
|
utoa32_dec_core(buffer, k, decimals)
|
|
1151
|
-
WasmI32.store8(buffer,
|
|
1254
|
+
WasmI32.store8(buffer, if (sign) _CHAR_CODE_MINUS else _CHAR_CODE_PLUS, 0n)
|
|
1152
1255
|
decimals
|
|
1153
1256
|
}
|
|
1154
1257
|
|
|
1155
1258
|
let grisu2 = (value, buffer, sign) => {
|
|
1156
1259
|
// frexp routine
|
|
1157
|
-
let uv
|
|
1158
|
-
let mut exp = WasmI32.wrapI64(
|
|
1260
|
+
let uv = WasmI64.reinterpretF64(value)
|
|
1261
|
+
let mut exp = WasmI32.wrapI64(
|
|
1262
|
+
WasmI64.shrU(WasmI64.and(uv, 0x7FF0000000000000N), 52N)
|
|
1263
|
+
)
|
|
1159
1264
|
let sid = WasmI64.and(uv, 0x000FFFFFFFFFFFFFN)
|
|
1160
|
-
let mut frc = WasmI64.add(
|
|
1265
|
+
let mut frc = WasmI64.add(
|
|
1266
|
+
WasmI64.shl(if (WasmI32.eqz(exp)) 0N else 1N, 52N),
|
|
1267
|
+
sid
|
|
1268
|
+
)
|
|
1161
1269
|
exp = (if (WasmI32.eqz(exp)) 1n else exp) - (0x3FFn + 52n)
|
|
1162
1270
|
|
|
1163
1271
|
// normalize boundaries
|
|
@@ -1165,29 +1273,38 @@ let grisu2 = (value, buffer, sign) => {
|
|
|
1165
1273
|
let mut exp_norm = exp - 1n
|
|
1166
1274
|
let off_norm = WasmI64.clz(frc_norm)
|
|
1167
1275
|
frc_norm = WasmI64.shl(frc_norm, off_norm)
|
|
1168
|
-
exp_norm
|
|
1276
|
+
exp_norm -= WasmI32.wrapI64(off_norm)
|
|
1169
1277
|
|
|
1170
1278
|
let m_norm = 1n + (if (WasmI64.eq(frc, 0x0010000000000000N)) 1n else 0n)
|
|
1171
1279
|
|
|
1172
|
-
let _frc_plus
|
|
1173
|
-
let _frc_minus = WasmI64.shl(
|
|
1280
|
+
let _frc_plus = frc_norm
|
|
1281
|
+
let _frc_minus = WasmI64.shl(
|
|
1282
|
+
WasmI64.sub(WasmI64.shl(frc, WasmI64.extendI32U(m_norm)), 1N),
|
|
1283
|
+
WasmI64.extendI32U(exp - m_norm - exp_norm)
|
|
1284
|
+
)
|
|
1174
1285
|
let _exp = exp_norm
|
|
1175
1286
|
|
|
1176
1287
|
// get cached power
|
|
1177
|
-
let c = WasmF64.reinterpretI64(
|
|
1178
|
-
|
|
1288
|
+
let c = WasmF64.reinterpretI64(
|
|
1289
|
+
0x3FD34413509F79FEN
|
|
1290
|
+
) // 1 / lg(10) = 0.30102999566398114
|
|
1291
|
+
let dk = WasmF64.add(
|
|
1292
|
+
WasmF64.mul(WasmF64.convertI32S(-61n - _exp), c),
|
|
1293
|
+
347.0W
|
|
1294
|
+
) // dk must be positive, so can do ceiling in positive
|
|
1179
1295
|
let mut k = WasmI32.truncF64S(dk)
|
|
1180
|
-
k += if (WasmF64.ne(WasmF64.convertI32S(k), dk)) 1n
|
|
1296
|
+
k += if (WasmF64.ne(WasmF64.convertI32S(k), dk)) 1n
|
|
1297
|
+
else 0n // conversion with ceil
|
|
1181
1298
|
|
|
1182
1299
|
let index = WasmI32.shrS(k, 3n) + 1n
|
|
1183
|
-
_K = 348n - (index << 3n)
|
|
1300
|
+
_K = 348n - (index << 3n) // decimal exponent doesn't need lookup table
|
|
1184
1301
|
let _frc_pow = WasmI64.load(get_FRC_POWERS() + (index << 3n), 0n)
|
|
1185
1302
|
let _exp_pow = WasmI32.load16S(get_EXP_POWERS() + (index << 1n), 0n)
|
|
1186
1303
|
|
|
1187
1304
|
// normalize
|
|
1188
1305
|
let off = WasmI32.wrapI64(WasmI64.clz(frc))
|
|
1189
1306
|
frc = WasmI64.shl(frc, WasmI64.extendI32U(off))
|
|
1190
|
-
exp
|
|
1307
|
+
exp -= off
|
|
1191
1308
|
|
|
1192
1309
|
let frc_pow = _frc_pow
|
|
1193
1310
|
let exp_pow = _exp_pow
|
|
@@ -1199,7 +1316,7 @@ let grisu2 = (value, buffer, sign) => {
|
|
|
1199
1316
|
let wp_exp = umul64e(_exp, exp_pow)
|
|
1200
1317
|
|
|
1201
1318
|
let wm_frc = WasmI64.add(umul64f(_frc_minus, frc_pow), 1N)
|
|
1202
|
-
let delta
|
|
1319
|
+
let delta = WasmI64.sub(wp_frc, wm_frc)
|
|
1203
1320
|
|
|
1204
1321
|
genDigits(buffer, w_frc, w_exp, wp_frc, wp_exp, delta, sign)
|
|
1205
1322
|
}
|
|
@@ -1208,34 +1325,26 @@ let prettify = (buffer, length, k) => {
|
|
|
1208
1325
|
let mut length = length
|
|
1209
1326
|
let kk = length + k
|
|
1210
1327
|
if (WasmI32.eqz(k)) {
|
|
1211
|
-
WasmI32.store16(buffer + length, _CHAR_CODE_DOT |
|
|
1328
|
+
WasmI32.store16(buffer + length, _CHAR_CODE_DOT | _CHAR_CODE_0 << 8n, 0n)
|
|
1212
1329
|
length + 2n
|
|
1213
1330
|
} else if (WasmI32.leS(length, kk) && WasmI32.leS(kk, 21n)) {
|
|
1214
1331
|
// 1234e7 -> 12340000000
|
|
1215
1332
|
for (let mut i = length; WasmI32.ltS(i, kk); i += 1n) {
|
|
1216
1333
|
WasmI32.store8(buffer + i, _CHAR_CODE_0, 0n)
|
|
1217
1334
|
}
|
|
1218
|
-
WasmI32.store16(buffer + kk, _CHAR_CODE_DOT |
|
|
1335
|
+
WasmI32.store16(buffer + kk, _CHAR_CODE_DOT | _CHAR_CODE_0 << 8n, 0n)
|
|
1219
1336
|
kk + 2n
|
|
1220
1337
|
} else if (WasmI32.gtS(kk, 0n) && WasmI32.leS(kk, 21n)) {
|
|
1221
1338
|
// 1234e-2 -> 12.34
|
|
1222
1339
|
let ptr = buffer + kk
|
|
1223
|
-
Memory.copy(
|
|
1224
|
-
ptr + 1n,
|
|
1225
|
-
ptr,
|
|
1226
|
-
0n - k
|
|
1227
|
-
)
|
|
1340
|
+
Memory.copy(ptr + 1n, ptr, 0n - k)
|
|
1228
1341
|
WasmI32.store8(buffer + kk, _CHAR_CODE_DOT, 0n)
|
|
1229
1342
|
length + 1n
|
|
1230
1343
|
} else if (WasmI32.ltS(-6n, kk) && WasmI32.leS(kk, 0n)) {
|
|
1231
1344
|
// 1234e-6 -> 0.001234
|
|
1232
1345
|
let offset = 2n - kk
|
|
1233
|
-
Memory.copy(
|
|
1234
|
-
|
|
1235
|
-
buffer,
|
|
1236
|
-
length
|
|
1237
|
-
)
|
|
1238
|
-
WasmI32.store16(buffer, _CHAR_CODE_0 | (_CHAR_CODE_DOT << 8n), 0n)
|
|
1346
|
+
Memory.copy(buffer + offset, buffer, length)
|
|
1347
|
+
WasmI32.store16(buffer, _CHAR_CODE_0 | _CHAR_CODE_DOT << 8n, 0n)
|
|
1239
1348
|
for (let mut i = 2n; WasmI32.ltS(i, offset); i += 1n) {
|
|
1240
1349
|
WasmI32.store8(buffer + i, _CHAR_CODE_0, 0n)
|
|
1241
1350
|
}
|
|
@@ -1247,13 +1356,9 @@ let prettify = (buffer, length, k) => {
|
|
|
1247
1356
|
length + 2n
|
|
1248
1357
|
} else {
|
|
1249
1358
|
let len = length
|
|
1250
|
-
Memory.copy(
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
len - 1n
|
|
1254
|
-
)
|
|
1255
|
-
WasmI32.store8(buffer, _CHAR_CODE_DOT, 1n)
|
|
1256
|
-
WasmI32.store8(buffer + len, _CHAR_CODE_e, 1n)
|
|
1359
|
+
Memory.copy(buffer + 2n, buffer + 1n, len - 1n)
|
|
1360
|
+
WasmI32.store8(buffer, _CHAR_CODE_DOT, 1n)
|
|
1361
|
+
WasmI32.store8(buffer + len, _CHAR_CODE_e, 1n)
|
|
1257
1362
|
length += genExponent(buffer + len + 2n, kk - 1n)
|
|
1258
1363
|
length + 2n
|
|
1259
1364
|
}
|
|
@@ -1281,15 +1386,15 @@ let get_dtoa_buf = () => {
|
|
|
1281
1386
|
_dtoa_buf
|
|
1282
1387
|
}
|
|
1283
1388
|
|
|
1284
|
-
let isFinite =
|
|
1389
|
+
let isFinite = value => {
|
|
1285
1390
|
WasmF64.eq(WasmF64.sub(value, value), 0.W)
|
|
1286
1391
|
}
|
|
1287
1392
|
|
|
1288
|
-
let isNaN =
|
|
1393
|
+
let isNaN = value => {
|
|
1289
1394
|
WasmF64.ne(value, value)
|
|
1290
1395
|
}
|
|
1291
1396
|
|
|
1292
|
-
export let dtoa =
|
|
1397
|
+
export let dtoa = value => {
|
|
1293
1398
|
let str = if (WasmF64.eq(value, 0.W)) {
|
|
1294
1399
|
let ret = allocateString(3n)
|
|
1295
1400
|
WasmI32.store8(ret, _CHAR_CODE_0, 8n)
|