From 1346309fd03e19da52156a700d037c348f27af0d Mon Sep 17 00:00:00 2001
From: xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>
Date: Sun, 17 Sep 2006 15:54:05 +0000
Subject: [PATCH] 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
---
 caml/PrintPPC.ml | 29 +++++++++++++----------------
 1 file changed, 13 insertions(+), 16 deletions(-)

diff --git a/caml/PrintPPC.ml b/caml/PrintPPC.ml
index 087a35a86..3ee79d127 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";
-- 
GitLab