aboutsummaryrefslogtreecommitdiffhomepage
path: root/kernel/nativevalues.ml
diff options
context:
space:
mode:
authorGravatar Maxime Dénès <mail@maximedenes.fr>2014-04-06 14:59:59 -0400
committerGravatar Maxime Dénès <mail@maximedenes.fr>2014-04-09 01:05:48 -0400
commitb0f3857eca168ee5d843e86b7678ac3d5375b07c (patch)
tree9e4f0916dbbe6e4826fb6dc4376d1e5d449e7183 /kernel/nativevalues.ml
parentaa3b8b7b24e809b379fcc86f2b21ae4380b211d5 (diff)
Full support for int31 values in native compiler.
Diffstat (limited to 'kernel/nativevalues.ml')
-rw-r--r--kernel/nativevalues.ml12
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