diff options
-rw-r--r-- | checklink/Check.ml | 8 | ||||
-rw-r--r-- | powerpc/PrintAsm.ml | 8 |
2 files changed, 13 insertions, 3 deletions
diff --git a/checklink/Check.ml b/checklink/Check.ml index bda2a03d..5821953e 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 152a4f7c..fd71b145 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) -> |