aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBernhard Schommer <bernhardschommer@gmail.com>2022-12-15 19:33:03 +0100
committerXavier Leroy <xavier.leroy@college-de-france.fr>2023-02-20 10:39:49 +0100
commitb6ba61c4c7df3f173f7aad2d96d8927d1a525fe3 (patch)
tree6c943b8eb0d383abae3415c61b6544a81ca611e3
parent668d546f670996d22e5d2a2f6f83752a8254dc23 (diff)
downloadcompcert-b6ba61c4c7df3f173f7aad2d96d8927d1a525fe3.tar.gz
compcert-b6ba61c4c7df3f173f7aad2d96d8927d1a525fe3.zip
ARM code generation: fix offset checks for loads
The check `Int.ltu x Int.zero` is always false, we replace this by using signed integer comparisons. We cannot use `Int.sign_ext` because the offsets are not signed integers but rather unsigned integers plus an additional sign bit.
-rw-r--r--arm/Asmgen.v6
1 files changed, 3 insertions, 3 deletions
diff --git a/arm/Asmgen.v b/arm/Asmgen.v
index 1a1e7f2f..64bb9c34 100644
--- a/arm/Asmgen.v
+++ b/arm/Asmgen.v
@@ -93,20 +93,20 @@ In particular, if [n] is a representable immediate argument, we should have
*)
Definition mk_immed_mem_word (x: int): int :=
- if Int.ltu x Int.zero then
+ if Int.lt x Int.zero then
Int.neg (Int.zero_ext (if thumb tt then 8 else 12) (Int.neg x))
else
Int.zero_ext 12 x.
Definition mk_immed_mem_small (x: int): int :=
- if Int.ltu x Int.zero then
+ if Int.lt x Int.zero then
Int.neg (Int.zero_ext 8 (Int.neg x))
else
Int.zero_ext 8 x.
Definition mk_immed_mem_float (x: int): int :=
let x := Int.and x (Int.repr (-4)) in (**r mask low 2 bits off *)
- if Int.ltu x Int.zero then
+ if Int.lt x Int.zero then
Int.neg (Int.zero_ext 10 (Int.neg x))
else
Int.zero_ext 10 x.