aboutsummaryrefslogtreecommitdiffstats
path: root/mppa_k1c
diff options
context:
space:
mode:
authorCyril SIX <cyril.six@kalray.eu>2019-02-08 17:56:28 +0100
committerCyril SIX <cyril.six@kalray.eu>2019-02-08 17:57:12 +0100
commit9784c802b7e6c101669bb0db8f8aea881f0a1d5b (patch)
treed64cab3b25a624d4917b1e0f8703bfecd6ad3011 /mppa_k1c
parentfdcc810259e2580a3bf94f715472fdc17782f27a (diff)
downloadcompcert-kvx-9784c802b7e6c101669bb0db8f8aea881f0a1d5b.tar.gz
compcert-kvx-9784c802b7e6c101669bb0db8f8aea881f0a1d5b.zip
Fix for immediate size miscomputation in postpass oracle.
Diffstat (limited to 'mppa_k1c')
-rw-r--r--mppa_k1c/PostpassSchedulingOracle.ml23
1 files changed, 11 insertions, 12 deletions
diff --git a/mppa_k1c/PostpassSchedulingOracle.ml b/mppa_k1c/PostpassSchedulingOracle.ml
index d15248a2..040e9e8d 100644
--- a/mppa_k1c/PostpassSchedulingOracle.ml
+++ b/mppa_k1c/PostpassSchedulingOracle.ml
@@ -198,35 +198,34 @@ type inst_info = {
type imm_encoding = U6 | S10 | U27L5 | U27L10 | E27U27L10
let rec pow a = function
- | 0 -> 1
- | 1 -> a
+ | 0 -> Int64.one
+ | 1 -> Int64.of_int a
| n -> let b = pow a (n/2) in
- b * b * (if n mod 2 = 0 then 1 else a)
+ Int64.mul b (Int64.mul b (if n mod 2 = 0 then Int64.one else Int64.of_int a))
-let signed_interval n = begin
+let signed_interval n : (int64 * int64) = begin
assert (n > 0);
- let min = - pow 2 (n-1)
- and max = pow 2 (n-1) - 1
+ let min = Int64.neg @@ pow 2 (n-1)
+ and max = Int64.sub (pow 2 (n-1)) Int64.one
in (min, max)
end
let within i interv = match interv with (min, max) -> (i >= min && i <= max)
-let signed_length i =
- let rec f i n =
+let signed_length (i:int64) =
+ let rec f (i:int64) n =
let interv = signed_interval n
in if (within i interv) then n else f i (n+1)
in f i 1
-let encode_imm imm =
- let i = Int64.to_int imm
- in let length = signed_length i
+let encode_imm (imm:int64) =
+ let length = signed_length imm
in if length <= 7 then U6 (* Unsigned -> 1 bit less needed *)
else if length <= 10 then S10
else if length <= 32 then U27L5 (* Upper 27 Lower 5 is signed *)
else if length <= 37 then U27L10
else if length <= 64 then E27U27L10
- else failwith @@ sprintf "encode_imm: integer too big! (%d)" i
+ else failwith @@ sprintf "encode_imm: integer too big! (%Ld)" imm
(** Resources *)
let resource_names = ["ISSUE"; "TINY"; "LITE"; "ALU"; "LSU"; "MAU"; "BCU"; "ACC"; "DATA"; "TCA"; "BRE"; "BRO"; "NOP"]