diff options
author | Maxime Dénès <mail@maximedenes.fr> | 2014-04-06 14:59:59 -0400 |
---|---|---|
committer | Maxime Dénès <mail@maximedenes.fr> | 2014-04-09 01:05:48 -0400 |
commit | b0f3857eca168ee5d843e86b7678ac3d5375b07c (patch) | |
tree | 9e4f0916dbbe6e4826fb6dc4376d1e5d449e7183 /kernel/nativevalues.ml | |
parent | aa3b8b7b24e809b379fcc86f2b21ae4380b211d5 (diff) |
Full support for int31 values in native compiler.
Diffstat (limited to 'kernel/nativevalues.ml')
-rw-r--r-- | kernel/nativevalues.ml | 12 |
1 files changed, 12 insertions, 0 deletions
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 |