diff options
author | Bernhard Schommer <bernhardschommer@gmail.com> | 2022-12-15 19:33:03 +0100 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@college-de-france.fr> | 2023-02-20 10:39:49 +0100 |
commit | b6ba61c4c7df3f173f7aad2d96d8927d1a525fe3 (patch) | |
tree | 6c943b8eb0d383abae3415c61b6544a81ca611e3 | |
parent | 668d546f670996d22e5d2a2f6f83752a8254dc23 (diff) | |
download | compcert-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.v | 6 |
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. |