summaryrefslogtreecommitdiff
path: root/powerpc/PrintAsm.ml
diff options
context:
space:
mode:
authorGravatar xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2013-03-18 12:59:28 +0000
committerGravatar xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2013-03-18 12:59:28 +0000
commit91a46bd44fb13b716df6440be5ab083c24f7621e (patch)
tree5efbc5bbedb788fd31268528c2586e334a983106 /powerpc/PrintAsm.ml
parentdebae4b0c69060a637489c6d0afe93125c9d9268 (diff)
For Pfreeframe, generate an "addi" over GPR1 when possible, to work around a limitation in the a3 analyzers.
git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@2154 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'powerpc/PrintAsm.ml')
-rw-r--r--powerpc/PrintAsm.ml8
1 files changed, 6 insertions, 2 deletions
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) ->