From b0f3857eca168ee5d843e86b7678ac3d5375b07c Mon Sep 17 00:00:00 2001 From: Maxime Dénès Date: Sun, 6 Apr 2014 14:59:59 -0400 Subject: Full support for int31 values in native compiler. --- kernel/nativevalues.ml | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'kernel/nativevalues.ml') diff --git a/kernel/nativevalues.ml b/kernel/nativevalues.ml index 2a0052a60..7f2785cf9 100644 --- a/kernel/nativevalues.ml +++ b/kernel/nativevalues.ml @@ -260,6 +260,8 @@ let is_int (x:t) = let o = Obj.repr x in Obj.is_int o +let to_int (x:t) = (Obj.magic x : int) + let hobcnv = Array.init 256 (fun i -> Printf.sprintf "%.2x" i) let bohcnv = Array.init 256 (fun i -> i - (if 0x30 <= i then 0x30 else 0) - @@ -334,3 +336,13 @@ let mk_I31_accu c x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 else c x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 + +let decomp_uint c v = + if is_int v then + let r = ref c in + let v = to_int v in + for i = 30 downto 0 do + r := (!r) (mk_int ((v lsr i) land 1)); + done; + !r + else v -- cgit v1.2.3