porffor 0.56.4 → 0.56.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.
@@ -92,6 +92,8 @@ export const BuiltinVars = function(ctx) {
92
92
  this.__Int32Array_BYTES_PER_ELEMENT = [ number(4) ];
93
93
  this.__Float32Array_BYTES_PER_ELEMENT = [ number(4) ];
94
94
  this.__Float64Array_BYTES_PER_ELEMENT = [ number(8) ];
95
+ this.__BigInt64Array_BYTES_PER_ELEMENT = [ number(8) ];
96
+ this.__BigUint64Array_BYTES_PER_ELEMENT = [ number(8) ];
95
97
 
96
98
  ObjectBuiltins.call(this, ctx, Prefs);
97
99
  };
@@ -881,6 +883,187 @@ export const BuiltinFuncs = function() {
881
883
  ]
882
884
  };
883
885
 
886
+ this.__Porffor_bigint_fromU64 = {
887
+ params: [ Valtype.i64 ],
888
+ locals: [ Valtype.i32, Valtype.i32, Valtype.i32 ],
889
+ localNames: [ 'x', 'hi', 'lo', 'ptr' ],
890
+ returns: [ Valtype.f64 ],
891
+ returnType: TYPES.bigint,
892
+ wasm: (scope, { builtin }) => [
893
+ // x is u64 so abs(x) = x
894
+ [ Opcodes.local_get, 0 ],
895
+ number(32, Valtype.i64),
896
+ [ Opcodes.i64_shr_u ],
897
+ [ Opcodes.i32_wrap_i64 ],
898
+ [ Opcodes.local_tee, 1 ],
899
+
900
+ [ Opcodes.local_get, 0 ],
901
+ [ Opcodes.i32_wrap_i64 ],
902
+ [ Opcodes.local_set, 2 ],
903
+
904
+ // if abs(x) < 0x8000000000000, return x as bigint
905
+ number(0x8000000000000 / (2 ** 32), Valtype.i32),
906
+ [ Opcodes.i32_lt_u ],
907
+ [ Opcodes.if, Blocktype.void ],
908
+ [ Opcodes.local_get, 0 ],
909
+ [ Opcodes.f64_convert_i64_u ],
910
+ [ Opcodes.return ],
911
+ [ Opcodes.end ],
912
+
913
+ number(16, Valtype.i32),
914
+ [ Opcodes.call, builtin('__Porffor_allocateBytes') ],
915
+ [ Opcodes.local_tee, 3 ],
916
+
917
+ // sign is already 0
918
+ // digit count = 2
919
+ number(2, Valtype.i32),
920
+ [ Opcodes.i32_store16, 0, 2 ],
921
+
922
+ // hi and lo as digits
923
+ [ Opcodes.local_get, 3 ],
924
+ [ Opcodes.local_get, 1 ],
925
+ [ Opcodes.i32_store, 0, 4 ],
926
+
927
+ [ Opcodes.local_get, 3 ],
928
+ [ Opcodes.local_get, 2 ],
929
+ [ Opcodes.i32_store, 0, 8 ],
930
+
931
+ [ Opcodes.local_get, 3 ],
932
+ Opcodes.i32_from_u,
933
+ number(0x8000000000000, Valtype.f64),
934
+ [ Opcodes.f64_add ]
935
+ ]
936
+ };
937
+
938
+ this.__Porffor_bigint_fromS64 = {
939
+ params: [ Valtype.i64 ],
940
+ locals: [ Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i64 ],
941
+ localNames: [ 'x', 'hi', 'lo', 'ptr', 'abs' ],
942
+ returns: [ Valtype.f64 ],
943
+ returnType: TYPES.bigint,
944
+ wasm: (scope, { builtin }) => [
945
+ // abs = abs(x) = ((x >> 63) ^ x) - (x >> 63)
946
+ [ Opcodes.local_get, 0 ],
947
+ [ Opcodes.i64_const, 63 ],
948
+ [ Opcodes.i64_shr_s ],
949
+ [ Opcodes.local_get, 0 ],
950
+ [ Opcodes.i64_xor ],
951
+ [ Opcodes.local_get, 0 ],
952
+ [ Opcodes.i64_const, 63 ],
953
+ [ Opcodes.i64_shr_s ],
954
+ [ Opcodes.i64_sub ],
955
+ [ Opcodes.local_tee, 4 ],
956
+
957
+ number(32, Valtype.i64),
958
+ [ Opcodes.i64_shr_u ],
959
+ [ Opcodes.i32_wrap_i64 ],
960
+ [ Opcodes.local_tee, 1 ],
961
+
962
+ [ Opcodes.local_get, 4 ],
963
+ [ Opcodes.i32_wrap_i64 ],
964
+ [ Opcodes.local_set, 2 ],
965
+
966
+ // if hi < (0x8000000000000 / 2**32), return (hi * 2**32) + lo as bigint
967
+ number(0x8000000000000 / (2 ** 32), Valtype.i32),
968
+ [ Opcodes.i32_lt_u ],
969
+ [ Opcodes.if, Blocktype.void ],
970
+ [ Opcodes.local_get, 0 ],
971
+ [ Opcodes.f64_convert_i64_s ],
972
+ [ Opcodes.return ],
973
+ [ Opcodes.end ],
974
+
975
+ number(16, Valtype.i32),
976
+ [ Opcodes.call, builtin('__Porffor_allocateBytes') ],
977
+ [ Opcodes.local_tee, 3 ],
978
+
979
+ // sign = x != abs
980
+ [ Opcodes.local_get, 0 ],
981
+ [ Opcodes.local_get, 4 ],
982
+ [ Opcodes.i64_ne ],
983
+ [ Opcodes.i32_store8, 0, 0 ],
984
+
985
+ // digit count = 2
986
+ [ Opcodes.local_get, 3 ],
987
+ number(2, Valtype.i32),
988
+ [ Opcodes.i32_store16, 0, 2 ],
989
+
990
+ // hi and lo as digits
991
+ [ Opcodes.local_get, 3 ],
992
+ [ Opcodes.local_get, 1 ],
993
+ [ Opcodes.i32_store, 0, 4 ],
994
+
995
+ [ Opcodes.local_get, 3 ],
996
+ [ Opcodes.local_get, 2 ],
997
+ [ Opcodes.i32_store, 0, 8 ],
998
+
999
+ [ Opcodes.local_get, 3 ],
1000
+ Opcodes.i32_from_u,
1001
+ number(0x8000000000000, Valtype.f64),
1002
+ [ Opcodes.f64_add ]
1003
+ ]
1004
+ };
1005
+
1006
+ this.__Porffor_bigint_toI64 = {
1007
+ params: [ Valtype.f64 ],
1008
+ locals: [ Valtype.i32, Valtype.i32 ],
1009
+ localNames: [ 'x', 'ptr', 'digits' ],
1010
+ returns: [ Valtype.i64 ],
1011
+ returnType: TYPES.bigint,
1012
+ wasm: () => [
1013
+ // if abs(x) < 0x8000000000000, return x as u64
1014
+ [ Opcodes.local_get, 0 ],
1015
+ [ Opcodes.f64_abs ],
1016
+ number(0x8000000000000, Valtype.f64),
1017
+ [ Opcodes.f64_lt ],
1018
+ [ Opcodes.if, Blocktype.void ],
1019
+ [ Opcodes.local_get, 0 ],
1020
+ Opcodes.i64_trunc_sat_f64_s,
1021
+ [ Opcodes.return ],
1022
+ [ Opcodes.end ],
1023
+
1024
+ [ Opcodes.local_get, 0 ],
1025
+ number(0x8000000000000, Valtype.f64),
1026
+ [ Opcodes.f64_sub ],
1027
+ Opcodes.i32_to_u,
1028
+ [ Opcodes.local_tee, 1 ],
1029
+
1030
+ // if sign == 1, * -1, else * 1
1031
+ [ Opcodes.i32_load8_u, 0, 0 ],
1032
+ [ Opcodes.if, Valtype.i64 ],
1033
+ number(-1, Valtype.i64),
1034
+ [ Opcodes.else ],
1035
+ number(1, Valtype.i64),
1036
+ [ Opcodes.end ],
1037
+
1038
+ // move ptr to final 2 digits
1039
+ [ Opcodes.local_get, 1 ],
1040
+ [ Opcodes.i32_load16_u, 0, 2 ],
1041
+ [ Opcodes.local_tee, 2 ],
1042
+ [ Opcodes.i32_const, 2 ],
1043
+ [ Opcodes.i32_gt_u ],
1044
+ [ Opcodes.if, Blocktype.void ],
1045
+ [ Opcodes.local_get, 2 ],
1046
+ [ Opcodes.i32_const, 2 ],
1047
+ [ Opcodes.i32_sub ],
1048
+ [ Opcodes.i32_const, 4 ],
1049
+ [ Opcodes.i32_mul ],
1050
+ [ Opcodes.local_get, 1 ],
1051
+ [ Opcodes.i32_add ],
1052
+ [ Opcodes.local_set, 1 ],
1053
+ [ Opcodes.end ],
1054
+
1055
+ [ Opcodes.local_get, 1 ],
1056
+ [ Opcodes.i32_load, 0, 4 ],
1057
+ [ Opcodes.i64_extend_i32_u ],
1058
+ [ Opcodes.i64_const, 128, 128, 128, 128, 16 ], // todo: fix >2**32 for regular seb 128 encoding
1059
+ [ Opcodes.i64_mul ],
1060
+ [ Opcodes.local_get, 1 ],
1061
+ [ Opcodes.i32_load, 0, 8 ],
1062
+ [ Opcodes.i64_extend_i32_u ],
1063
+ [ Opcodes.i64_add ],
1064
+ [ Opcodes.i64_mul ] // * sign earlier
1065
+ ]
1066
+ };
884
1067
 
885
1068
  PrecompiledBuiltins.BuiltinFuncs.call(this);
886
1069
  };