summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--checklink/Check.ml8
-rw-r--r--powerpc/PrintAsm.ml8
2 files changed, 13 insertions, 3 deletions
diff --git a/checklink/Check.ml b/checklink/Check.ml
index bda2a03..5821953 100644
--- a/checklink/Check.ml
+++ b/checklink/Check.ml
@@ -1742,11 +1742,17 @@ let rec compare_code ccode ecode pc: checker = fun fw ->
end
| Pfreeframe(sz, ofs) ->
begin match ecode with
+ | ADDI(rD, rA, simm) :: es ->
+ OK(fw)
+ >>= match_iregs GPR1 rD
+ >>= match_iregs GPR1 rA
+ >>= match_z_int32 sz (exts simm)
+ >>= recur_simpl
| LWZ(rD, rA, d) :: es ->
OK(fw)
>>= match_iregs GPR1 rD
>>= match_iregs GPR1 rA
- >>= match_z_int32 ofs (Int32.neg (exts d))
+ >>= match_z_int32 ofs (exts d)
>>= recur_simpl
| _ -> error
end
diff --git a/powerpc/PrintAsm.ml b/powerpc/PrintAsm.ml
index 152a4f7..fd71b14 100644
--- a/powerpc/PrintAsm.ml
+++ b/powerpc/PrintAsm.ml
@@ -564,8 +564,12 @@ let print_instruction oc tbl pc fallthrough = function
| Pextsh(r1, r2) ->
fprintf oc " extsh %a, %a\n" ireg r1 ireg r2
| Pfreeframe(sz, ofs) ->
- (* Note: could also do an add on GPR1 using sz *)
- fprintf oc " lwz %a, %ld(%a)\n" ireg GPR1 (camlint_of_coqint ofs) ireg GPR1
+ let sz = camlint_of_coqint sz
+ and ofs = camlint_of_coqint ofs in
+ if sz < 0x8000l then
+ fprintf oc " addi %a, %a, %ld\n" ireg GPR1 ireg GPR1 sz
+ else
+ fprintf oc " lwz %a, %ld(%a)\n" ireg GPR1 ofs ireg GPR1
| Pfabs(r1, r2) ->
fprintf oc " fabs %a, %a\n" freg r1 freg r2
| Pfadd(r1, r2, r3) ->