summaryrefslogtreecommitdiff
path: root/caml
diff options
context:
space:
mode:
authorGravatar xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2006-09-17 15:54:05 +0000
committerGravatar xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2006-09-17 15:54:05 +0000
commit1346309fd03e19da52156a700d037c348f27af0d (patch)
tree7d0eb69cfc0947049664675abad5849d561530dc /caml
parent400338c7686dfe864c024e14f832997eafd3f9f3 (diff)
Suite des stubs variadiques.
Correction bug dans Piuctf. Utiliser la 'red zone' en dessous de SP pour les conversions int<->float git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@110 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'caml')
-rw-r--r--caml/PrintPPC.ml29
1 files changed, 13 insertions, 16 deletions
diff --git a/caml/PrintPPC.ml b/caml/PrintPPC.ml
index 087a35a..3ee79d1 100644
--- a/caml/PrintPPC.ml
+++ b/caml/PrintPPC.ml
@@ -171,9 +171,8 @@ let print_instruction oc labels = function
fprintf oc " fcmpu cr0, %a, %a\n" freg r1 freg r2
| Pfcti(r1, r2) ->
fprintf oc " fctiwz f13, %a\n" freg r2;
- fprintf oc " stfdu f13, -8(r1)\n";
- fprintf oc " lwz %a, 4(r1)\n" ireg r1;
- fprintf oc " addi r1, r1, 8\n"
+ fprintf oc " stfd f13, -8(r1)\n";
+ fprintf oc " lwz %a, -4(r1)\n" ireg r1
| Pfdiv(r1, r2, r3) ->
fprintf oc " fdiv %a, %a, %a\n" freg r1 freg r2 freg r3
| Pfmadd(r1, r2, r3, r4) ->
@@ -193,13 +192,12 @@ let print_instruction oc labels = function
| Pictf(r1, r2) ->
let lbl = new_label() in
fprintf oc " addis r2, 0, 0x4330\n";
- fprintf oc " stwu r2, -8(r1)\n";
+ fprintf oc " stw r2, -8(r1)\n";
fprintf oc " addis r2, %a, 0x8000\n" ireg r2;
- fprintf oc " stw r2, 4(r1)\n";
+ fprintf oc " stw r2, -4(r1)\n";
fprintf oc " addis r2, 0, ha16(L%d)\n" lbl;
fprintf oc " lfd f13, lo16(L%d)(r2)\n" lbl;
- fprintf oc " lfd %a, 0(r1)\n" freg r1;
- fprintf oc " addi r1, r1, 8\n";
+ fprintf oc " lfd %a, -8(r1)\n" freg r1;
fprintf oc " fsub %a, %a, f13\n" freg r1 freg r1;
fprintf oc " .const_data\n";
fprintf oc "L%d: .long 0x43300000, 0x80000000\n" lbl;
@@ -207,13 +205,12 @@ let print_instruction oc labels = function
| Piuctf(r1, r2) ->
let lbl = new_label() in
fprintf oc " addis r2, 0, 0x4330\n";
- fprintf oc " stwu r2, -8(r1)\n";
- fprintf oc " stw %a, 4(r1)\n" ireg r2;
+ fprintf oc " stw r2, -8(r1)\n";
+ fprintf oc " stw %a, -4(r1)\n" ireg r2;
fprintf oc " addis r2, 0, ha16(L%d)\n" lbl;
fprintf oc " lfd f13, lo16(L%d)(r2)\n" lbl;
- fprintf oc " lfd %a, 0(r1)\n" freg r1;
- fprintf oc " addi r1, r1, 8\n";
- fprintf oc " fsub %a, %a, f12\n" freg r1 freg r1;
+ fprintf oc " lfd %a, -8(r1)\n" freg r1;
+ fprintf oc " fsub %a, %a, f13\n" freg r1 freg r1;
fprintf oc " .const_data\n";
fprintf oc "L%d: .long 0x43300000, 0x00000000\n" lbl;
fprintf oc " .text\n"
@@ -369,7 +366,7 @@ let variadic_stub oc stub_name fun_name ty_args =
let frame_size = max 56 (24 + arg_size) in
fprintf oc " mflr r0\n";
fprintf oc " stwu r1, %d(r1)\n" (-frame_size);
- fprintf oc " stw r0, %d(r1)\n" frame_size;
+ fprintf oc " stw r0, %d(r1)\n" (frame_size + 4);
(* Copy our parameters to our stack frame.
As an optimization, don't copy parameters that are already in
integer registers, since these stay in place. *)
@@ -383,7 +380,7 @@ let variadic_stub oc stub_name fun_name ty_args =
copy (gpr + 1) fpr (src_ofs + 4) (dst_ofs + 4) rem
| Tfloat :: rem ->
if fpr <= 10 then begin
- fprintf oc " stfd r%d, %d(r1)\n" gpr dst_ofs
+ fprintf oc " stfd f%d, %d(r1)\n" fpr dst_ofs
end else begin
fprintf oc " lfd f0, %d(r1)\n" src_ofs;
fprintf oc " stfd f0, %d(r1)\n" dst_ofs
@@ -410,9 +407,9 @@ let variadic_stub oc stub_name fun_name ty_args =
fprintf oc " mtctr r11\n";
fprintf oc " bctrl\n";
(* Free our frame and return *)
- fprintf oc " lwz r0, %d(r1)\n" frame_size;
+ fprintf oc " lwz r0, %d(r1)\n" (frame_size + 4);
fprintf oc " mtlr r0\n";
- fprintf oc " addi r1, %d, r1\n" frame_size;
+ fprintf oc " addi r1, r1, %d\n" frame_size;
fprintf oc " blr\n";
(* The function pointer *)
fprintf oc " .non_lazy_symbol_pointer\n";