Skip to content

Commit d811fbd

Browse files
committed
Remove unused js int64 primitive
1 parent f44b0a3 commit d811fbd

10 files changed

+61
-79
lines changed

jscomp/core/js_long.ml

-6
Original file line numberDiff line numberDiff line change
@@ -159,12 +159,6 @@ let compare (args : J.expression list) =
159159

160160
let of_string (args : J.expression list) =
161161
int64_call "of_string" args
162-
let discard_sign (args : J.expression list) =
163-
int64_call "discard_sign" args
164-
let div_mod (args : J.expression list) =
165-
int64_call "div_mod" args
166-
let to_hex (args : J.expression list) =
167-
int64_call "to_hex" args
168162
let get64 = int64_call "get64"
169163
let float_of_bits = int64_call "float_of_bits"
170164
let bits_of_float = int64_call "bits_of_float"

jscomp/core/js_long.mli

-3
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,6 @@ val equal_null : int64_call
5757
val equal_undefined : int64_call
5858
val equal_nullable : int64_call
5959

60-
val discard_sign : int64_call
61-
val div_mod : int64_call
62-
val to_hex : int64_call
6360
val to_float : int64_call
6461
val of_float : int64_call
6562
val compare : int64_call

jscomp/core/lam_dispatch_primitive.ml

+1-7
Original file line numberDiff line numberDiff line change
@@ -296,13 +296,7 @@ let translate loc (prim_name : string)
296296
| "caml_int64_of_float"
297297
-> Js_long.of_float args
298298
| "caml_int64_compare"
299-
-> Js_long.compare args
300-
| "js_int64_discard_sign"
301-
-> Js_long.discard_sign args
302-
| "js_int64_div_mod"
303-
-> Js_long.div_mod args
304-
| "js_int64_to_hex"
305-
-> Js_long.to_hex args
299+
-> Js_long.compare args
306300
| "caml_int64_bits_of_float"
307301
-> Js_long.bits_of_float args
308302
| "caml_int64_float_of_bits"

jscomp/runtime/caml_format.ml

+17-12
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,11 @@ let caml_format_int fmt i =
377377
let f = parse_format fmt in
378378
aux f i
379379

380+
(* FIXME: improve codegen for such cases
381+
let div_mod (x : int64) (y : int64) : int64 * int64 =
382+
let a, b = Caml_int64.(div_mod (unsafe_of_int64 x) (unsafe_of_int64 y)) in
383+
Caml_int64.unsafe_to_int64 a , Caml_int64.unsafe_to_int64 b
384+
*)
380385
let caml_int64_format fmt x =
381386
let module String = Bs_string in
382387
let f = parse_format fmt in
@@ -391,14 +396,14 @@ let caml_int64_format fmt x =
391396

392397
begin match f.base with
393398
| Hex ->
394-
s := Caml_int64_extern.to_hex x ^ !s
399+
s := Caml_int64.to_hex x ^ !s
395400
| Oct ->
396401
let wbase = 8L in
397402
let cvtbl = "01234567" in
398403

399404
if x < 0L then
400405
begin
401-
let y = Caml_int64.(unsafe_to_int64 (discard_sign (unsafe_of_int64 x))) in
406+
let y = Caml_int64.discard_sign x in
402407
(* 2 ^ 63 + y `div_mod` 8 *)
403408
let quotient_l = 1152921504606846976L (**)
404409
(* {lo = 0n; hi = 268435456n } *) (* 2 ^ 31 / 8 *)
@@ -407,7 +412,7 @@ let caml_int64_format fmt x =
407412
(* let c, d = Caml_int64.div_mod (Caml_int64.add y modulus_l) wbase in
408413
we can not do the code above, it can overflow when y is really large
409414
*)
410-
let c, d = Caml_int64_extern.div_mod y wbase in
415+
let c, d = Caml_int64.div_mod y wbase in
411416

412417
let quotient =
413418
ref (Caml_int64_extern.add quotient_l c ) in
@@ -417,22 +422,22 @@ let caml_int64_format fmt x =
417422
cvtbl.[ Caml_int64_extern.to_int !modulus] ^ !s ;
418423

419424
while !quotient <> 0L do
420-
let a, b = Caml_int64_extern.div_mod (!quotient) wbase in
425+
let a, b = Caml_int64.div_mod (!quotient) wbase in
421426
quotient := a;
422427
modulus := b;
423428
s := Bs_string.of_char cvtbl.[Caml_int64_extern.to_int !modulus] ^ !s ;
424429
done;
425430
end
426431
else
427-
let a, b = Caml_int64_extern.div_mod x wbase in
432+
let a, b = Caml_int64.div_mod x wbase in
428433
let quotient = ref a in
429434
let modulus = ref b in
430435
s :=
431436
Bs_string.of_char
432437
cvtbl.[ Caml_int64_extern.to_int !modulus] ^ !s ;
433438

434439
while !quotient <> 0L do
435-
let a, b = Caml_int64_extern.div_mod (!quotient) wbase in
440+
let a, b = Caml_int64.div_mod (!quotient) wbase in
436441
quotient := a;
437442
modulus := b;
438443
s := Bs_string.of_char cvtbl.[Caml_int64_extern.to_int !modulus] ^ !s ;
@@ -443,7 +448,7 @@ let caml_int64_format fmt x =
443448
let cvtbl = "0123456789" in
444449

445450
if x < 0L then
446-
let y = Caml_int64.(unsafe_to_int64 (discard_sign (unsafe_of_int64 x))) in
451+
let y = Caml_int64.discard_sign x in
447452
(* 2 ^ 63 + y `div_mod` 10 *)
448453

449454
let quotient_l = 922337203685477580L (* 2 ^ 63 / 10 *)
@@ -454,8 +459,8 @@ let caml_int64_format fmt x =
454459
(* let c, d = Caml_int64.div_mod (Caml_int64.add y modulus_l) wbase in
455460
we can not do the code above, it can overflow when y is really large
456461
*)
457-
let c, d = Caml_int64_extern.div_mod y wbase in
458-
let e ,f = Caml_int64_extern.div_mod (Caml_int64_extern.add modulus_l d) wbase in
462+
let c, d = Caml_int64.div_mod y wbase in
463+
let e ,f = Caml_int64.div_mod (Caml_int64_extern.add modulus_l d) wbase in
459464
let quotient =
460465
ref (Caml_int64_extern.add (Caml_int64_extern.add quotient_l c )
461466
e) in
@@ -465,22 +470,22 @@ let caml_int64_format fmt x =
465470
cvtbl.[Caml_int64_extern.to_int !modulus] ^ !s ;
466471

467472
while !quotient <> 0L do
468-
let a, b = Caml_int64_extern.div_mod (!quotient) wbase in
473+
let a, b = Caml_int64.div_mod (!quotient) wbase in
469474
quotient := a;
470475
modulus := b;
471476
s := Bs_string.of_char cvtbl.[Caml_int64_extern.to_int !modulus] ^ !s ;
472477
done;
473478

474479
else
475-
let a, b = Caml_int64_extern.div_mod x wbase in
480+
let a, b = Caml_int64.div_mod x wbase in
476481
let quotient = ref a in
477482
let modulus = ref b in
478483
s :=
479484
Bs_string.of_char
480485
cvtbl.[ Caml_int64_extern.to_int !modulus] ^ !s ;
481486

482487
while !quotient <> 0L do
483-
let a, b = Caml_int64_extern.div_mod (!quotient) wbase in
488+
let a, b = Caml_int64.div_mod (!quotient) wbase in
484489
quotient := a;
485490
modulus := b;
486491
s := Bs_string.of_char cvtbl.[Caml_int64_extern.to_int !modulus] ^ !s ;

jscomp/runtime/caml_int64.ml

+17-13
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ let lognot x = Caml_nativeint.logxor x (-1n)
4646

4747
type t = { hi : nativeint; lo : nativeint ; }
4848

49+
external unsafe_to_int64 : t -> int64 = "%identity"
50+
external unsafe_of_int64 : int64 -> t = "%identity"
51+
52+
4953
let to_unsigned (x : nativeint) =
5054
x >>> 0
5155

@@ -374,9 +378,9 @@ let mod_ self other =
374378
sub self (mul (div self other) other)
375379

376380

377-
let div_mod self other =
378-
let quotient = div self other in
379-
quotient, sub self (mul quotient other)
381+
let div_mod (self : int64) (other : int64) : int64 * int64 =
382+
let quotient = div (unsafe_of_int64 self) (unsafe_of_int64 other) in
383+
unsafe_to_int64 quotient, unsafe_to_int64 (sub (unsafe_of_int64 self) (mul quotient (unsafe_of_int64 other)))
380384

381385
let compare self other =
382386
let v = Pervasives.compare self.hi other.hi in
@@ -392,23 +396,25 @@ let to_int32 x = Caml_nativeint.logor x.lo 0n (* signed integer *)
392396

393397
(* width does matter, will it be relevant to endian order? *)
394398

395-
let to_hex x =
399+
let to_hex (x : int64) =
400+
let {hi = x_hi; lo = x_lo} = unsafe_of_int64 x in
396401
let aux v =
397402
Bs_string.of_int (Caml_nativeint.to_int (Caml_nativeint.shift_right_logical v 0)) ~base:16
398403
in
399-
match x.hi, x.lo with
404+
match x_hi, x_lo with
400405
| 0n, 0n -> "0"
401-
| _, 0n -> aux x.hi ^ "00000000"
402-
| 0n, _ -> aux x.lo
406+
| _, 0n -> aux x_hi ^ "00000000"
407+
| 0n, _ -> aux x_lo
403408
| _, _ ->
404-
let lo = aux x.lo in
409+
let lo = aux x_lo in
405410
let pad = 8 -Bs_string.length lo in
406411
if pad <= 0 then
407-
aux x.hi ^ lo
412+
aux x_hi ^ lo
408413
else
409-
aux x.hi ^ Caml_utils.repeat pad "0" [@bs] ^ lo
414+
aux x_hi ^ Caml_utils.repeat pad "0" [@bs] ^ lo
410415

411-
let discard_sign x = {x with hi = Caml_nativeint.logand 0x7fff_ffffn x.hi }
416+
let discard_sign (x : int64) : int64 =
417+
unsafe_to_int64 { (unsafe_of_int64 x) with hi = Caml_nativeint.logand 0x7fff_ffffn (unsafe_of_int64 x).hi }
412418

413419
(* >>> 0 does not change its bit representation
414420
it simply makes sure it is an unsigned integer
@@ -465,5 +471,3 @@ let get64 (s : string) (i:int) : t =
465471
(Caml_nativeint.of_int (Caml_char.code s.[i+6]) << 48 )
466472
(Caml_nativeint.of_int (Caml_char.code s.[i+7]) << 56 )))
467473

468-
external unsafe_to_int64 : t -> int64 = "%identity"
469-
external unsafe_of_int64 : int64 -> t = "%identity"

jscomp/runtime/caml_int64.mli

+7-4
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,18 @@ val of_float : float -> t
7171
val div : t -> t -> t
7272
val mod_ : t -> t -> t
7373

74-
val div_mod : t -> t -> t * t
74+
7575
val compare : t -> t -> int
76-
val to_hex : t -> string
7776

78-
val discard_sign : t -> t
77+
78+
7979
val float_of_bits : t -> float
8080
val bits_of_float : float -> t
8181
val get64 : string -> int -> t
8282

8383

8484
external unsafe_to_int64 : t -> int64 = "%identity"
85-
external unsafe_of_int64 : int64 -> t = "%identity"
85+
external unsafe_of_int64 : int64 -> t = "%identity"
86+
val div_mod : int64 -> int64 -> int64 * int64
87+
val to_hex : int64 -> string
88+
val discard_sign : int64 -> int64

jscomp/runtime/caml_int64_extern.ml

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ external to_int : int64 -> int = "%int64_to_int"
1212
(* external discard_sign : int64 -> int64 = "js_int64_discard_sign" *)
1313
(* Same as {!Caml_int64.discard_sign} *)
1414

15-
external div_mod : int64 -> int64 -> int64 * int64 = "js_int64_div_mod"
15+
(* external div_mod : int64 -> int64 -> int64 * int64 = "js_int64_div_mod" *)
1616
(* Same as {!Caml_int64.div_mod} *)
1717

18-
external to_hex : int64 -> string = "js_int64_to_hex"
18+
(* external to_hex : int64 -> string = "js_int64_to_hex" *)
1919
(* same as {!Caml_int64.to_hex}*)

jscomp/test/int64_test.ml

+3-3
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,9 @@ let suites : Mt.pair_suites = Mt.[
129129
Eq(Array.map Int64.to_int32
130130
[|0L; 0x0000_0000_8000_0000L|], [|0l;-2147483648l|]));
131131
"discard_sign", (fun _ ->
132-
Eq(Caml_int64.(unsafe_to_int64 (discard_sign (unsafe_of_int64 (-1L)))), 0x7fff_ffff_ffff_ffffL));
133-
"div_mod", (fun _ -> Eq(Js_int64.div_mod 7L 3L , (2L,1L)));
134-
"to_hex", (fun _ -> Eq(Js_int64.to_hex (-1L), "ffffffffffffffff"));
132+
Eq(Caml_int64.discard_sign (-1L), 0x7fff_ffff_ffff_ffffL));
133+
"div_mod", (fun _ -> Eq(Caml_int64.div_mod 7L 3L , (2L,1L)));
134+
"to_hex", (fun _ -> Eq(Caml_int64.to_hex (-1L), "ffffffffffffffff"));
135135
"generic_compare", (fun _ ->
136136
Eq(generic_compare 0x0000_0001_0000_0000L 0x0000_0000_0000_0001L > 0 , true));
137137
"test_compier_literal", (fun _ ->

lib/js/caml_int64.js

+13-13
Original file line numberDiff line numberDiff line change
@@ -505,32 +505,32 @@ function to_int32(x) {
505505
}
506506

507507
function to_hex(x) {
508+
var x_lo = x[/* lo */1];
509+
var x_hi = x[/* hi */0];
508510
var aux = function (v) {
509511
return (v >>> 0).toString(16);
510512
};
511-
var match = x[/* hi */0];
512-
var match$1 = x[/* lo */1];
513513
var exit = 0;
514-
if (match !== 0 || match$1 !== 0) {
514+
if (x_hi !== 0 || x_lo !== 0) {
515515
exit = 1;
516516
} else {
517517
return "0";
518518
}
519519
if (exit === 1) {
520-
if (match$1 !== 0) {
521-
if (match !== 0) {
522-
var lo = aux(x[/* lo */1]);
520+
if (x_lo !== 0) {
521+
if (x_hi !== 0) {
522+
var lo = aux(x_lo);
523523
var pad = 8 - lo.length | 0;
524524
if (pad <= 0) {
525-
return aux(x[/* hi */0]) + lo;
525+
return aux(x_hi) + lo;
526526
} else {
527-
return aux(x[/* hi */0]) + (Caml_utils.repeat(pad, "0") + lo);
527+
return aux(x_hi) + (Caml_utils.repeat(pad, "0") + lo);
528528
}
529529
} else {
530-
return aux(x[/* lo */1]);
530+
return aux(x_lo);
531531
}
532532
} else {
533-
return aux(x[/* hi */0]) + "00000000";
533+
return aux(x_hi) + "00000000";
534534
}
535535
}
536536

@@ -598,11 +598,11 @@ exports.to_float = to_float;
598598
exports.of_float = of_float;
599599
exports.div = div;
600600
exports.mod_ = mod_;
601-
exports.div_mod = div_mod;
602601
exports.compare = compare;
603-
exports.to_hex = to_hex;
604-
exports.discard_sign = discard_sign;
605602
exports.float_of_bits = float_of_bits;
606603
exports.bits_of_float = bits_of_float;
607604
exports.get64 = get64;
605+
exports.div_mod = div_mod;
606+
exports.to_hex = to_hex;
607+
exports.discard_sign = discard_sign;
608608
/* Caml_int32 Not a pure module */

lib/whole_compiler.ml

+1-16
Original file line numberDiff line numberDiff line change
@@ -92452,9 +92452,6 @@ val equal_null : int64_call
9245292452
val equal_undefined : int64_call
9245392453
val equal_nullable : int64_call
9245492454

92455-
val discard_sign : int64_call
92456-
val div_mod : int64_call
92457-
val to_hex : int64_call
9245892455
val to_float : int64_call
9245992456
val of_float : int64_call
9246092457
val compare : int64_call
@@ -92626,12 +92623,6 @@ let compare (args : J.expression list) =
9262692623

9262792624
let of_string (args : J.expression list) =
9262892625
int64_call "of_string" args
92629-
let discard_sign (args : J.expression list) =
92630-
int64_call "discard_sign" args
92631-
let div_mod (args : J.expression list) =
92632-
int64_call "div_mod" args
92633-
let to_hex (args : J.expression list) =
92634-
int64_call "to_hex" args
9263592626
let get64 = int64_call "get64"
9263692627
let float_of_bits = int64_call "float_of_bits"
9263792628
let bits_of_float = int64_call "bits_of_float"
@@ -95039,13 +95030,7 @@ let translate loc (prim_name : string)
9503995030
| "caml_int64_of_float"
9504095031
-> Js_long.of_float args
9504195032
| "caml_int64_compare"
95042-
-> Js_long.compare args
95043-
| "js_int64_discard_sign"
95044-
-> Js_long.discard_sign args
95045-
| "js_int64_div_mod"
95046-
-> Js_long.div_mod args
95047-
| "js_int64_to_hex"
95048-
-> Js_long.to_hex args
95033+
-> Js_long.compare args
9504995034
| "caml_int64_bits_of_float"
9505095035
-> Js_long.bits_of_float args
9505195036
| "caml_int64_float_of_bits"

0 commit comments

Comments
 (0)