@grain/stdlib 0.4.4 → 0.4.5
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 +7 -0
- package/array.gr +76 -57
- package/buffer.gr +7 -4
- package/bytes.gr +10 -10
- package/char.gr +112 -56
- package/char.md +200 -0
- package/hash.gr +17 -13
- package/list.gr +78 -61
- package/map.gr +106 -110
- package/number.gr +25 -7
- package/number.md +34 -0
- package/option.gr +25 -25
- package/package.json +1 -1
- package/pervasives.gr +32 -20
- package/queue.gr +4 -1
- package/range.gr +26 -26
- 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 +31 -18
- package/runtime/malloc.gr +19 -11
- package/runtime/numberUtils.gr +208 -105
- package/runtime/numbers.gr +217 -118
- package/runtime/string.gr +98 -39
- package/runtime/stringUtils.gr +6 -2
- 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 +111 -116
- package/stack.gr +26 -26
- package/string.gr +273 -119
- 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,10 +1103,12 @@ 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) &&
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1106
|
+
WasmI64.geU(WasmI64.sub(delta, rest), ten_kappa) &&
|
|
1107
|
+
(WasmI64.ltU(WasmI64.add(rest, ten_kappa), wp_w) ||
|
|
1108
|
+
WasmI64.gtU(
|
|
1109
|
+
WasmI64.sub(wp_w, rest),
|
|
1110
|
+
WasmI64.sub(WasmI64.add(rest, ten_kappa), wp_w)
|
|
1111
|
+
))
|
|
1068
1112
|
) {
|
|
1069
1113
|
digit -= 1n
|
|
1070
1114
|
rest = WasmI64.add(rest, ten_kappa)
|
|
@@ -1076,11 +1120,13 @@ let genDigits = (buffer, w_frc, w_exp, mp_frc, mp_exp, delta, sign) => {
|
|
|
1076
1120
|
let mut delta = delta
|
|
1077
1121
|
let one_exp = 0n - mp_exp
|
|
1078
1122
|
let one_frc = WasmI64.shl(1N, WasmI64.extendI32U(one_exp))
|
|
1079
|
-
let mask
|
|
1123
|
+
let mask = WasmI64.sub(one_frc, 1N)
|
|
1080
1124
|
|
|
1081
1125
|
let mut wp_w_frc = WasmI64.sub(mp_frc, w_frc)
|
|
1082
1126
|
|
|
1083
|
-
let mut p1 = WasmI32.wrapI64(
|
|
1127
|
+
let mut p1 = WasmI32.wrapI64(
|
|
1128
|
+
WasmI64.shrU(mp_frc, WasmI64.extendI32U(one_exp))
|
|
1129
|
+
)
|
|
1084
1130
|
let mut p2 = WasmI64.and(mp_frc, mask)
|
|
1085
1131
|
|
|
1086
1132
|
let mut kappa = decimalCount32(p1)
|
|
@@ -1091,17 +1137,49 @@ let genDigits = (buffer, w_frc, w_exp, mp_frc, mp_exp, delta, sign) => {
|
|
|
1091
1137
|
while (WasmI32.gtS(kappa, 0n)) {
|
|
1092
1138
|
let mut d = 0n
|
|
1093
1139
|
match (kappa) {
|
|
1094
|
-
10n => {
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1140
|
+
10n => {
|
|
1141
|
+
d = WasmI32.divU(p1, 1000000000n)
|
|
1142
|
+
p1 = WasmI32.remU(p1, 1000000000n)
|
|
1143
|
+
},
|
|
1144
|
+
9n => {
|
|
1145
|
+
d = WasmI32.divU(p1, 100000000n)
|
|
1146
|
+
p1 = WasmI32.remU(p1, 100000000n)
|
|
1147
|
+
},
|
|
1148
|
+
8n => {
|
|
1149
|
+
d = WasmI32.divU(p1, 10000000n)
|
|
1150
|
+
p1 = WasmI32.remU(p1, 10000000n)
|
|
1151
|
+
},
|
|
1152
|
+
7n => {
|
|
1153
|
+
d = WasmI32.divU(p1, 1000000n)
|
|
1154
|
+
p1 = WasmI32.remU(p1, 1000000n)
|
|
1155
|
+
},
|
|
1156
|
+
6n => {
|
|
1157
|
+
d = WasmI32.divU(p1, 100000n)
|
|
1158
|
+
p1 = WasmI32.remU(p1, 100000n)
|
|
1159
|
+
},
|
|
1160
|
+
5n => {
|
|
1161
|
+
d = WasmI32.divU(p1, 10000n)
|
|
1162
|
+
p1 = WasmI32.remU(p1, 10000n)
|
|
1163
|
+
},
|
|
1164
|
+
4n => {
|
|
1165
|
+
d = WasmI32.divU(p1, 1000n)
|
|
1166
|
+
p1 = WasmI32.remU(p1, 1000n)
|
|
1167
|
+
},
|
|
1168
|
+
3n => {
|
|
1169
|
+
d = WasmI32.divU(p1, 100n)
|
|
1170
|
+
p1 = WasmI32.remU(p1, 100n)
|
|
1171
|
+
},
|
|
1172
|
+
2n => {
|
|
1173
|
+
d = WasmI32.divU(p1, 10n)
|
|
1174
|
+
p1 = WasmI32.remU(p1, 10n)
|
|
1175
|
+
},
|
|
1176
|
+
1n => {
|
|
1177
|
+
d = p1
|
|
1178
|
+
p1 = 0n
|
|
1179
|
+
},
|
|
1180
|
+
_ => {
|
|
1181
|
+
d = 0n
|
|
1182
|
+
},
|
|
1105
1183
|
}
|
|
1106
1184
|
|
|
1107
1185
|
if (WasmI32.ne(d | len, 0n)) {
|
|
@@ -1110,35 +1188,58 @@ let genDigits = (buffer, w_frc, w_exp, mp_frc, mp_exp, delta, sign) => {
|
|
|
1110
1188
|
}
|
|
1111
1189
|
|
|
1112
1190
|
kappa -= 1n
|
|
1113
|
-
let tmp = WasmI64.add(
|
|
1191
|
+
let tmp = WasmI64.add(
|
|
1192
|
+
WasmI64.shl(WasmI64.extendI32U(p1), WasmI64.extendI32U(one_exp)),
|
|
1193
|
+
p2
|
|
1194
|
+
)
|
|
1114
1195
|
if (WasmI64.leU(tmp, delta)) {
|
|
1115
1196
|
_K += kappa
|
|
1116
|
-
grisuRound(
|
|
1197
|
+
grisuRound(
|
|
1198
|
+
buffer,
|
|
1199
|
+
len,
|
|
1200
|
+
delta,
|
|
1201
|
+
tmp,
|
|
1202
|
+
WasmI64.shl(
|
|
1203
|
+
WasmI64.extendI32U(WasmI32.load(get_POWERS10() + (kappa << 2n), 0n)),
|
|
1204
|
+
WasmI64.extendI32U(one_exp)
|
|
1205
|
+
),
|
|
1206
|
+
wp_w_frc
|
|
1207
|
+
)
|
|
1117
1208
|
done = true
|
|
1118
1209
|
break
|
|
1119
1210
|
}
|
|
1120
1211
|
}
|
|
1121
1212
|
|
|
1122
|
-
if (!done)
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1213
|
+
if (!done)
|
|
1214
|
+
while (true) {
|
|
1215
|
+
p2 = WasmI64.mul(p2, 10N)
|
|
1216
|
+
delta = WasmI64.mul(delta, 10N)
|
|
1217
|
+
|
|
1218
|
+
let d = WasmI64.shrU(p2, WasmI64.extendI32U(one_exp))
|
|
1219
|
+
if (WasmI64.ne(WasmI64.or(d, WasmI64.extendI32U(len)), 0N)) {
|
|
1220
|
+
WasmI32.store8(
|
|
1221
|
+
buffer + len,
|
|
1222
|
+
_CHAR_CODE_0 + (WasmI32.wrapI64(d) & 0xffn),
|
|
1223
|
+
0n
|
|
1224
|
+
)
|
|
1225
|
+
len += 1n
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
p2 = WasmI64.and(p2, mask)
|
|
1229
|
+
kappa -= 1n
|
|
1230
|
+
if (WasmI64.ltU(p2, delta)) {
|
|
1231
|
+
_K += kappa
|
|
1232
|
+
wp_w_frc = WasmI64.mul(
|
|
1233
|
+
wp_w_frc,
|
|
1234
|
+
WasmI64.extendI32U(
|
|
1235
|
+
WasmI32.load(get_POWERS10() + (0n - kappa << 2n), 0n)
|
|
1236
|
+
)
|
|
1237
|
+
)
|
|
1238
|
+
grisuRound(buffer, len, delta, p2, one_frc, wp_w_frc)
|
|
1239
|
+
break
|
|
1240
|
+
}
|
|
1130
1241
|
}
|
|
1131
1242
|
|
|
1132
|
-
p2 = WasmI64.and(p2, mask)
|
|
1133
|
-
kappa -= 1n
|
|
1134
|
-
if (WasmI64.ltU(p2, delta)) {
|
|
1135
|
-
_K += kappa
|
|
1136
|
-
wp_w_frc = WasmI64.mul(wp_w_frc, WasmI64.extendI32U(WasmI32.load(get_POWERS10() + ((0n - kappa) << 2n), 0n)))
|
|
1137
|
-
grisuRound(buffer, len, delta, p2, one_frc, wp_w_frc)
|
|
1138
|
-
break
|
|
1139
|
-
}
|
|
1140
|
-
}
|
|
1141
|
-
|
|
1142
1243
|
len
|
|
1143
1244
|
}
|
|
1144
1245
|
|
|
@@ -1148,16 +1249,21 @@ let genExponent = (buffer, k) => {
|
|
|
1148
1249
|
if (sign) k = 0n - k
|
|
1149
1250
|
let decimals = decimalCount32(k) + 1n
|
|
1150
1251
|
utoa32_dec_core(buffer, k, decimals)
|
|
1151
|
-
WasmI32.store8(buffer,
|
|
1252
|
+
WasmI32.store8(buffer, if (sign) _CHAR_CODE_MINUS else _CHAR_CODE_PLUS, 0n)
|
|
1152
1253
|
decimals
|
|
1153
1254
|
}
|
|
1154
1255
|
|
|
1155
1256
|
let grisu2 = (value, buffer, sign) => {
|
|
1156
1257
|
// frexp routine
|
|
1157
|
-
let uv
|
|
1158
|
-
let mut exp = WasmI32.wrapI64(
|
|
1258
|
+
let uv = WasmI64.reinterpretF64(value)
|
|
1259
|
+
let mut exp = WasmI32.wrapI64(
|
|
1260
|
+
WasmI64.shrU(WasmI64.and(uv, 0x7FF0000000000000N), 52N)
|
|
1261
|
+
)
|
|
1159
1262
|
let sid = WasmI64.and(uv, 0x000FFFFFFFFFFFFFN)
|
|
1160
|
-
let mut frc = WasmI64.add(
|
|
1263
|
+
let mut frc = WasmI64.add(
|
|
1264
|
+
WasmI64.shl(if (WasmI32.eqz(exp)) 0N else 1N, 52N),
|
|
1265
|
+
sid
|
|
1266
|
+
)
|
|
1161
1267
|
exp = (if (WasmI32.eqz(exp)) 1n else exp) - (0x3FFn + 52n)
|
|
1162
1268
|
|
|
1163
1269
|
// normalize boundaries
|
|
@@ -1165,29 +1271,38 @@ let grisu2 = (value, buffer, sign) => {
|
|
|
1165
1271
|
let mut exp_norm = exp - 1n
|
|
1166
1272
|
let off_norm = WasmI64.clz(frc_norm)
|
|
1167
1273
|
frc_norm = WasmI64.shl(frc_norm, off_norm)
|
|
1168
|
-
exp_norm
|
|
1274
|
+
exp_norm -= WasmI32.wrapI64(off_norm)
|
|
1169
1275
|
|
|
1170
1276
|
let m_norm = 1n + (if (WasmI64.eq(frc, 0x0010000000000000N)) 1n else 0n)
|
|
1171
1277
|
|
|
1172
|
-
let _frc_plus
|
|
1173
|
-
let _frc_minus = WasmI64.shl(
|
|
1278
|
+
let _frc_plus = frc_norm
|
|
1279
|
+
let _frc_minus = WasmI64.shl(
|
|
1280
|
+
WasmI64.sub(WasmI64.shl(frc, WasmI64.extendI32U(m_norm)), 1N),
|
|
1281
|
+
WasmI64.extendI32U(exp - m_norm - exp_norm)
|
|
1282
|
+
)
|
|
1174
1283
|
let _exp = exp_norm
|
|
1175
1284
|
|
|
1176
1285
|
// get cached power
|
|
1177
|
-
let c = WasmF64.reinterpretI64(
|
|
1178
|
-
|
|
1286
|
+
let c = WasmF64.reinterpretI64(
|
|
1287
|
+
0x3FD34413509F79FEN
|
|
1288
|
+
) // 1 / lg(10) = 0.30102999566398114
|
|
1289
|
+
let dk = WasmF64.add(
|
|
1290
|
+
WasmF64.mul(WasmF64.convertI32S(-61n - _exp), c),
|
|
1291
|
+
347.0W
|
|
1292
|
+
) // dk must be positive, so can do ceiling in positive
|
|
1179
1293
|
let mut k = WasmI32.truncF64S(dk)
|
|
1180
|
-
k += if (WasmF64.ne(WasmF64.convertI32S(k), dk)) 1n
|
|
1294
|
+
k += if (WasmF64.ne(WasmF64.convertI32S(k), dk)) 1n
|
|
1295
|
+
else 0n // conversion with ceil
|
|
1181
1296
|
|
|
1182
1297
|
let index = WasmI32.shrS(k, 3n) + 1n
|
|
1183
|
-
_K = 348n - (index << 3n)
|
|
1298
|
+
_K = 348n - (index << 3n) // decimal exponent doesn't need lookup table
|
|
1184
1299
|
let _frc_pow = WasmI64.load(get_FRC_POWERS() + (index << 3n), 0n)
|
|
1185
1300
|
let _exp_pow = WasmI32.load16S(get_EXP_POWERS() + (index << 1n), 0n)
|
|
1186
1301
|
|
|
1187
1302
|
// normalize
|
|
1188
1303
|
let off = WasmI32.wrapI64(WasmI64.clz(frc))
|
|
1189
1304
|
frc = WasmI64.shl(frc, WasmI64.extendI32U(off))
|
|
1190
|
-
exp
|
|
1305
|
+
exp -= off
|
|
1191
1306
|
|
|
1192
1307
|
let frc_pow = _frc_pow
|
|
1193
1308
|
let exp_pow = _exp_pow
|
|
@@ -1199,7 +1314,7 @@ let grisu2 = (value, buffer, sign) => {
|
|
|
1199
1314
|
let wp_exp = umul64e(_exp, exp_pow)
|
|
1200
1315
|
|
|
1201
1316
|
let wm_frc = WasmI64.add(umul64f(_frc_minus, frc_pow), 1N)
|
|
1202
|
-
let delta
|
|
1317
|
+
let delta = WasmI64.sub(wp_frc, wm_frc)
|
|
1203
1318
|
|
|
1204
1319
|
genDigits(buffer, w_frc, w_exp, wp_frc, wp_exp, delta, sign)
|
|
1205
1320
|
}
|
|
@@ -1208,34 +1323,26 @@ let prettify = (buffer, length, k) => {
|
|
|
1208
1323
|
let mut length = length
|
|
1209
1324
|
let kk = length + k
|
|
1210
1325
|
if (WasmI32.eqz(k)) {
|
|
1211
|
-
WasmI32.store16(buffer + length, _CHAR_CODE_DOT |
|
|
1326
|
+
WasmI32.store16(buffer + length, _CHAR_CODE_DOT | _CHAR_CODE_0 << 8n, 0n)
|
|
1212
1327
|
length + 2n
|
|
1213
1328
|
} else if (WasmI32.leS(length, kk) && WasmI32.leS(kk, 21n)) {
|
|
1214
1329
|
// 1234e7 -> 12340000000
|
|
1215
1330
|
for (let mut i = length; WasmI32.ltS(i, kk); i += 1n) {
|
|
1216
1331
|
WasmI32.store8(buffer + i, _CHAR_CODE_0, 0n)
|
|
1217
1332
|
}
|
|
1218
|
-
WasmI32.store16(buffer + kk, _CHAR_CODE_DOT |
|
|
1333
|
+
WasmI32.store16(buffer + kk, _CHAR_CODE_DOT | _CHAR_CODE_0 << 8n, 0n)
|
|
1219
1334
|
kk + 2n
|
|
1220
1335
|
} else if (WasmI32.gtS(kk, 0n) && WasmI32.leS(kk, 21n)) {
|
|
1221
1336
|
// 1234e-2 -> 12.34
|
|
1222
1337
|
let ptr = buffer + kk
|
|
1223
|
-
Memory.copy(
|
|
1224
|
-
ptr + 1n,
|
|
1225
|
-
ptr,
|
|
1226
|
-
0n - k
|
|
1227
|
-
)
|
|
1338
|
+
Memory.copy(ptr + 1n, ptr, 0n - k)
|
|
1228
1339
|
WasmI32.store8(buffer + kk, _CHAR_CODE_DOT, 0n)
|
|
1229
1340
|
length + 1n
|
|
1230
1341
|
} else if (WasmI32.ltS(-6n, kk) && WasmI32.leS(kk, 0n)) {
|
|
1231
1342
|
// 1234e-6 -> 0.001234
|
|
1232
1343
|
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)
|
|
1344
|
+
Memory.copy(buffer + offset, buffer, length)
|
|
1345
|
+
WasmI32.store16(buffer, _CHAR_CODE_0 | _CHAR_CODE_DOT << 8n, 0n)
|
|
1239
1346
|
for (let mut i = 2n; WasmI32.ltS(i, offset); i += 1n) {
|
|
1240
1347
|
WasmI32.store8(buffer + i, _CHAR_CODE_0, 0n)
|
|
1241
1348
|
}
|
|
@@ -1247,13 +1354,9 @@ let prettify = (buffer, length, k) => {
|
|
|
1247
1354
|
length + 2n
|
|
1248
1355
|
} else {
|
|
1249
1356
|
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)
|
|
1357
|
+
Memory.copy(buffer + 2n, buffer + 1n, len - 1n)
|
|
1358
|
+
WasmI32.store8(buffer, _CHAR_CODE_DOT, 1n)
|
|
1359
|
+
WasmI32.store8(buffer + len, _CHAR_CODE_e, 1n)
|
|
1257
1360
|
length += genExponent(buffer + len + 2n, kk - 1n)
|
|
1258
1361
|
length + 2n
|
|
1259
1362
|
}
|
|
@@ -1281,15 +1384,15 @@ let get_dtoa_buf = () => {
|
|
|
1281
1384
|
_dtoa_buf
|
|
1282
1385
|
}
|
|
1283
1386
|
|
|
1284
|
-
let isFinite =
|
|
1387
|
+
let isFinite = value => {
|
|
1285
1388
|
WasmF64.eq(WasmF64.sub(value, value), 0.W)
|
|
1286
1389
|
}
|
|
1287
1390
|
|
|
1288
|
-
let isNaN =
|
|
1391
|
+
let isNaN = value => {
|
|
1289
1392
|
WasmF64.ne(value, value)
|
|
1290
1393
|
}
|
|
1291
1394
|
|
|
1292
|
-
export let dtoa =
|
|
1395
|
+
export let dtoa = value => {
|
|
1293
1396
|
let str = if (WasmF64.eq(value, 0.W)) {
|
|
1294
1397
|
let ret = allocateString(3n)
|
|
1295
1398
|
WasmI32.store8(ret, _CHAR_CODE_0, 8n)
|