guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 151/437: Add new varargs test and correct related test c


From: Andy Wingo
Subject: [Guile-commits] 151/437: Add new varargs test and correct related test case failures in all ports.
Date: Mon, 2 Jul 2018 05:14:07 -0400 (EDT)

wingo pushed a commit to branch lightning
in repository guile.

commit 6227bf5bf996f94249e34246b78d9b3ef5031b78
Author: pcpa <address@hidden>
Date:   Thu Dec 13 18:26:57 2012 -0200

    Add new varargs test and correct related test case failures in all ports.
---
 ChangeLog           |  21 ++++
 check/Makefile.am   |   4 +-
 check/varargs.ok    |   3 +
 check/varargs.tst   | 283 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 include/lightning.h |   4 +
 lib/jit_arm-swf.c   |  36 +++----
 lib/jit_arm.c       |   4 +-
 lib/jit_mips.c      | 140 +++++++++++++++-----------
 lib/jit_ppc.c       |  16 ++-
 9 files changed, 430 insertions(+), 81 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 2fe54b3..23b4c7c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2012-12-13 Paulo Andrade <address@hidden>
+
+       * check/varargs.ok, check/varargs.tst: New test cases implementing
+       simple varargs calls with a large amount of arguments to exercise
+       excess arguments on stack.
+
+       * include/lightning.h: Include config.h if HAVE_CONFIG_H is
+       defined.
+
+       * lib/jit_arm.c: Allocate a fpr register, not a gpr one for
+       temporary when pushing varargs arguments in the stack.
+
+       * lib/jit_arm-swf.c: Correct code changing the wrong offset
+       in jit_absr_d and jit_negr_d in software float.
+
+       * lib/jit_mips.c: Correct calculation of offsets of arguments
+       on stack.
+
+       * lib/jit_ppc.c: Correct bogus logic for "next" offset of arguments
+       on stack and adjust for fixed offset of stack arguments.
+
 2012-12-12 Paulo Andrade <address@hidden>
 
        * include/lightning.h, lib/jit_arm.c, lib/jit_mips.c,
diff --git a/check/Makefile.am b/check/Makefile.am
index 4ecc243..a5e9163 100644
--- a/check/Makefile.am
+++ b/check/Makefile.am
@@ -57,6 +57,7 @@ EXTRA_DIST =                          \
        alu_rsh.tst     alu_rsh.ok      \
        alu_com.tst     alu_com.ok      \
        alu_neg.tst     alu_neg.ok      \
+       varargs.tst     varargs.ok      \
        check.sh        run-test        \
        all.tst
 
@@ -71,7 +72,8 @@ TESTS = 3to2 add allocai              \
        alu_mul alu_div alu_rem         \
        alu_and alu_or alu_xor          \
        alu_lsh alu_rsh                 \
-       alu_com alu_neg
+       alu_com alu_neg                 \
+       varargs
 
 CLEANFILES = $(TESTS)
 
diff --git a/check/varargs.ok b/check/varargs.ok
new file mode 100644
index 0000000..5dcccb0
--- /dev/null
+++ b/check/varargs.ok
@@ -0,0 +1,3 @@
+0 1 2 3 4 5 6 7 8 9
+0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0
+0 0.0 1 1.0 2 2.0 3 3.0 4 4.0 5 5.0 6 6.0 7 7.0 8 8.0 9 9.0
diff --git a/check/varargs.tst b/check/varargs.tst
new file mode 100644
index 0000000..65c81a4
--- /dev/null
+++ b/check/varargs.tst
@@ -0,0 +1,283 @@
+.data  1024
+ifmt:
+.c     "%d %d %d %d %d %d %d %d %d %d\n"
+.align 4
+ichk:
+.i     9 8 7 6 5 4 3 2 1 0
+dfmt:
+.c     "%.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f\n"
+lfmt:
+.c     "%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf\n"
+dchk:
+.align 8
+.d     9.0 8.0 7.0 6.0 5.0 4.0 3.0 2.0 1.0 0.0
+idfmt:
+.c     "%d %.1f %d %.1f %d %.1f %d %.1f %d %.1f %d %.1f %d %.1f %d %.1f %d 
%.1f %d %.1f\n"
+ldfmt:
+.c     "%d %lf %d %lf %d %lf %d %lf %d %lf %d %lf %d %lf %d %lf %d %lf %d 
%lf\n"
+buff:
+.align 4
+.size  256
+
+.code
+       jmpi main
+
+main:
+       prolog
+
+       /*
+               sprintf(buff, "%d %d %d %d %d %d %d %d %d %d\n",
+                       0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
+        */
+       prepare
+               pushargi buff
+               pushargi ifmt
+               ellipsis
+               pushargi 0
+               pushargi 1
+               pushargi 2
+               pushargi 3
+               pushargi 4
+               pushargi 5
+               pushargi 6
+               pushargi 7
+               pushargi 8
+               pushargi 9
+       finishi @sprintf
+
+       /*
+               sscanf(buff, "%d %d %d %d %d %d %d %d %d %d\n",
+                      ichk+0, ichk+1, ichk+2, ichk+3, ichk+4,
+                      ichk+5, ichk+6, ichk+7, ichk+8, ichk+9);
+        */
+       movi %v0 ichk
+       prepare
+               pushargi buff
+               pushargi ifmt
+               ellipsis
+               pushargr %v0            /* 0 */
+               addi %v0 %v0 4
+               pushargr %v0            /* 1 */
+               addi %v0 %v0 4
+               pushargr %v0            /* 2 */
+               addi %v0 %v0 4
+               pushargr %v0            /* 3 */
+               addi %v0 %v0 4
+               pushargr %v0            /* 4 */
+               addi %v0 %v0 4
+               pushargr %v0            /* 5 */
+               addi %v0 %v0 4
+               pushargr %v0            /* 6 */
+               addi %v0 %v0 4
+               pushargr %v0            /* 7 */
+               addi %v0 %v0 4
+               pushargr %v0            /* 8 */
+               addi %v0 %v0 4
+               pushargr %v0            /* 9 */
+       finishi @sscanf
+
+       movi %v0 ichk
+       movi %r0 0
+loopi:
+       ldr_i %r1 %v0
+       beqr nexti %r0 %r1
+       calli @abort
+nexti:
+       addi %r0 %r0 1
+       bgei outi %r0 10
+       addi %v0 %v0 4
+       jmpi loopi
+outi:
+
+       prepare
+               pushargi buff
+               ellipsis
+       finishi @printf
+
+       /*
+               sprintf(buff,
+                       "%.1f %.1f %.1f %.1f %.1f "
+                       "%.1f %.1f %.1f %.1f %.1f\n",
+                       0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0);
+        */
+       prepare
+               pushargi buff
+               pushargi dfmt
+               ellipsis
+               pushargi_d 0.0
+               pushargi_d 1.0
+               pushargi_d 2.0
+               pushargi_d 3.0
+               pushargi_d 4.0
+               pushargi_d 5.0
+               pushargi_d 6.0
+               pushargi_d 7.0
+               pushargi_d 8.0
+               pushargi_d 9.0
+       finishi @sprintf
+
+       /*
+               sscanf(buff, "%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf\n",
+                      dchk+0, dchk+1, dchk+2, dchk+3, dchk+4,
+                      dchk+5, dchk+6, dchk+7, dchk+8, dchk+9);
+        */
+       movi %v0 dchk
+       prepare
+               pushargi buff
+               pushargi lfmt
+               ellipsis
+               pushargr %v0            /* 0 */
+               addi %v0 %v0 8
+               pushargr %v0            /* 1 */
+               addi %v0 %v0 8
+               pushargr %v0            /* 2 */
+               addi %v0 %v0 8
+               pushargr %v0            /* 3 */
+               addi %v0 %v0 8
+               pushargr %v0            /* 4 */
+               addi %v0 %v0 8
+               pushargr %v0            /* 5 */
+               addi %v0 %v0 8
+               pushargr %v0            /* 6 */
+               addi %v0 %v0 8
+               pushargr %v0            /* 7 */
+               addi %v0 %v0 8
+               pushargr %v0            /* 8 */
+               addi %v0 %v0 8
+               pushargr %v0            /* 9 */
+       finishi @sscanf
+
+       movi %v0 dchk
+       movi_d %f0 0.0
+loopd:
+       ldr_d %f1 %v0
+       beqr_d nextd %f0 %f1
+       calli @abort
+nextd:
+       addi_d %f0 %f0 1.0
+       bgei_d outd %f0 10.0
+       addi %v0 %v0 8
+       jmpi loopd
+outd:
+
+       prepare
+               pushargi buff
+               ellipsis
+       finishi @printf
+
+       /*
+           sprintf(buff,
+                  "%d %.1f %d %.1f %d %.1f %d %.1f %d %.1f "
+                  "%d %.1f %d %.1f %d %.1f %d %.1f %d %.1f\n",
+                  0, 0.0, 1, 1.0, 2, 2.0, 3, 3.0, 4, 4.0,
+                  5, 5.0, 6, 6.0, 7, 7.0, 8, 8.0, 9, 9.0);
+        */
+       prepare
+               pushargi buff
+               pushargi idfmt
+               ellipsis
+               pushargi 0
+               pushargi_d 0.0
+               pushargi 1
+               pushargi_d 1.0
+               pushargi 2
+               pushargi_d 2.0
+               pushargi 3
+               pushargi_d 3.0
+               pushargi 4
+               pushargi_d 4.0
+               pushargi 5
+               pushargi_d 5.0
+               pushargi 6
+               pushargi_d 6.0
+               pushargi 7
+               pushargi_d 7.0
+               pushargi 8
+               pushargi_d 8.0
+               pushargi 9
+               pushargi_d 9.0
+       finishi @sprintf
+
+       /*
+               sscanf(buff,
+                     "%d %lf %d %lf %d %lf %d %lf %d %lf "
+                     "%d %lf %d %lf %d %lf %d %lf %d %lf\n",
+                     ichk+0, dchk+0, ichk+1, dchk+1, ichk+2,
+                     dchk+2, ichk+3, dchk+3, ichk+4, dchk+4,
+                     ichk+5, dchk+5, ichk+6, dchk+6, ichk+7,
+                     dchk+7, ichk+8, dchk+8, ichk+9, dchk+9);
+        */
+       movi %v0 ichk
+       movi %v1 dchk
+       prepare
+               pushargi buff
+               pushargi ldfmt
+               ellipsis
+               pushargr %v0            /* 0 */
+               addi %v0 %v0 4
+               pushargr %v1
+               addi %v1 %v1 8
+               pushargr %v0            /* 1 */
+               addi %v0 %v0 4
+               pushargr %v1
+               addi %v1 %v1 8
+               pushargr %v0            /* 2 */
+               addi %v0 %v0 4
+               pushargr %v1
+               addi %v1 %v1 8
+               pushargr %v0            /* 3 */
+               addi %v0 %v0 4
+               pushargr %v1
+               addi %v1 %v1 8
+               pushargr %v0            /* 4 */
+               addi %v0 %v0 4
+               pushargr %v1
+               addi %v1 %v1 8
+               pushargr %v0            /* 5 */
+               addi %v0 %v0 4
+               pushargr %v1
+               addi %v1 %v1 8
+               pushargr %v0            /* 6 */
+               addi %v0 %v0 4
+               pushargr %v1
+               addi %v1 %v1 8
+               pushargr %v0            /* 7 */
+               addi %v0 %v0 4
+               pushargr %v1
+               addi %v1 %v1 8
+               pushargr %v0            /* 8 */
+               addi %v0 %v0 4
+               pushargr %v1
+               addi %v1 %v1 8
+               pushargr %v0            /* 9 */
+               pushargr %v1
+       finishi @sscanf
+
+       movi %v0 ichk
+       movi %v1 dchk
+       movi %r0 0
+       movi_d %f0 0.0
+loopid:
+       ldr_i %r1 %v0
+       beqr checkd %r0 %r1
+       calli @abort
+checkd:
+       ldr_d %f1 %v1
+       beqr_d nextid %f0 %f1
+       calli @abort
+nextid:
+       addi %r0 %r0 1
+       addi_d %f0 %f0 1.0
+       bgei outid %r0 10
+       addi %v0 %v0 4
+       addi %v1 %v1 8
+       jmpi loopid
+outid:
+
+       prepare
+               pushargi buff
+               ellipsis
+       finishi @printf
+
+       ret
+       epilog
diff --git a/include/lightning.h b/include/lightning.h
index 56cefe5..7a38276 100644
--- a/include/lightning.h
+++ b/include/lightning.h
@@ -18,6 +18,10 @@
 #ifndef _lightning_h
 #define _lightning_h
 
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include <unistd.h>
 #include <stdlib.h>
 #include <stdint.h>
diff --git a/lib/jit_arm-swf.c b/lib/jit_arm-swf.c
index ad0d12d..1315693 100644
--- a/lib/jit_arm-swf.c
+++ b/lib/jit_arm-swf.c
@@ -1740,25 +1740,25 @@ _swf_absr_d(jit_state_t *_jit, jit_int32_t r0, 
jit_int32_t r1)
     if (jit_fpr_p(r1)) {
        if (jit_fpr_p(r0) && !jit_thumb_p() && jit_armv5e_p() &&
            r0 != r1 && (reg = jit_get_reg_pair()) != JIT_NOREG) {
-           LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 8);
+           LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 4);
            swf_bici(rn(reg), rn(reg), 0x80000000);
-           STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8);
+           STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 4);
            jit_unget_reg_pair(reg);
        }
        else {
            reg = jit_get_reg(jit_class_gpr);
-           swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
+           swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
            swf_bici(rn(reg), rn(reg), 0x80000000);
            if (jit_fpr_p(r0)) {
-               swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
+               swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
                if (r0 != r1) {
-                   swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
-                   swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
+                   swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
+                   swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
                }
            }
            else {
                movr(r0, rn(reg));
-               swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
+               swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
                movr(r0 + 1, rn(reg));
            }
            jit_unget_reg(reg);
@@ -1768,9 +1768,9 @@ _swf_absr_d(jit_state_t *_jit, jit_int32_t r0, 
jit_int32_t r1)
        reg = jit_get_reg(jit_class_gpr);
        movr(rn(reg), r1);
        swf_bici(rn(reg), rn(reg), 0x80000000);
-       swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
-       movr(rn(reg), r1 + 1);
        swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
+       movr(rn(reg), r1 + 1);
+       swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
        jit_unget_reg(reg);
     }
     else {
@@ -1812,25 +1812,25 @@ _swf_negr_d(jit_state_t *_jit, jit_int32_t r0, 
jit_int32_t r1)
     if (jit_fpr_p(r1)) {
        if (jit_fpr_p(r0) && !jit_thumb_p() && jit_armv5e_p() &&
            r0 != r1 && (reg = jit_get_reg_pair()) != JIT_NOREG) {
-           LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 8);
+           LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 4);
            EORI(rn(reg), rn(reg), encode_arm_immediate(0x80000000));
-           STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8);
+           STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 4);
            jit_unget_reg_pair(reg);
        }
        else {
            reg = jit_get_reg(jit_class_gpr);
-           swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
+           swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
            xori(rn(reg), rn(reg), 0x80000000);
            if (jit_fpr_p(r0)) {
-               swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
+               swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
                if (r0 != r1) {
-                   swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
-                   swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
+                   swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
+                   swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
                }
            }
            else {
                movr(r0, rn(reg));
-               swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
+               swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
                movr(r0 + 1, rn(reg));
            }
            jit_unget_reg(reg);
@@ -1840,9 +1840,9 @@ _swf_negr_d(jit_state_t *_jit, jit_int32_t r0, 
jit_int32_t r1)
        reg = jit_get_reg(jit_class_gpr);
        movr(rn(reg), r1);
        xori(rn(reg), rn(reg), 0x80000000);
-       swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
-       movr(rn(reg), r1 + 1);
        swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
+       movr(rn(reg), r1 + 1);
+       swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
        jit_unget_reg(reg);
     }
     else {
diff --git a/lib/jit_arm.c b/lib/jit_arm.c
index adafcb2..e4af92e 100644
--- a/lib/jit_arm.c
+++ b/lib/jit_arm.c
@@ -563,7 +563,7 @@ _jit_pushargi_f(jit_state_t *_jit, jit_float32_t u)
            return;
        }
     }
-    regno = jit_get_reg(jit_class_gpr);
+    regno = jit_get_reg(jit_class_fpr);
     jit_movi_f(regno, u);
     jit_stxi_f(_jit->function->call.size, JIT_SP, regno);
     jit_unget_reg(regno);
@@ -624,7 +624,7 @@ _jit_pushargi_d(jit_state_t *_jit, jit_float64_t u)
     }
     if (_jit->function->call.size & 7)
        _jit->function->call.size += 4;
-    regno = jit_get_reg(jit_class_gpr);
+    regno = jit_get_reg(jit_class_fpr);
     jit_movi_d(regno, u);
     jit_stxi_d(_jit->function->call.size, JIT_SP, regno);
     jit_unget_reg(regno);
diff --git a/lib/jit_mips.c b/lib/jit_mips.c
index 7b6f99d..bfca206 100644
--- a/lib/jit_mips.c
+++ b/lib/jit_mips.c
@@ -421,58 +421,69 @@ _jit_getarg_d(jit_state_t *_jit, jit_int32_t u, 
jit_int32_t v)
 void
 _jit_pushargr(jit_state_t *_jit, jit_int32_t u)
 {
+    jit_word_t         offset;
+
     assert(_jit->function);
-    if (_jit->function->call.argf) {
-       _jit->function->call.argi = _jit->function->call.argf;
+    offset = _jit->function->call.size >> 2;
+    if (_jit->function->call.argf)
        _jit->function->call.argf = 0;
-    }
-    if (_jit->function->call.argi < 4) {
-       jit_movr(_A0 - _jit->function->call.argi, u);
-       ++_jit->function->call.argi;
-    }
+    if (offset < 4)
+       jit_movr(_A0 - offset, u);
     else
        jit_stxi(_jit->function->call.size, JIT_SP, u);
+    _jit->function->call.argi = offset + 1;
     _jit->function->call.size += sizeof(jit_word_t);
 }
 
 void
 _jit_pushargi(jit_state_t *_jit, jit_word_t u)
 {
-    jit_int32_t                 regno;
+    jit_int32_t                regno;
+    jit_word_t         offset;
 
     assert(_jit->function);
-    if (_jit->function->call.argf) {
-       _jit->function->call.argi = _jit->function->call.argf;
+    offset = _jit->function->call.size >> 2;
+    if (_jit->function->call.argf)
        _jit->function->call.argf = 0;
-    }
-    if (_jit->function->call.argi < 4) {
-       jit_movi(_A0 - _jit->function->call.argi, u);
-       ++_jit->function->call.argi;
-    }
+    if (offset < 4)
+       jit_movi(_A0 - offset, u);
     else {
        regno = jit_get_reg(jit_class_gpr);
        jit_movi(regno, u);
        jit_stxi(_jit->function->call.size, JIT_SP, regno);
        jit_unget_reg(regno);
     }
+    _jit->function->call.argi = offset + 1;
     _jit->function->call.size += sizeof(jit_word_t);
 }
 
 void
 _jit_pushargr_f(jit_state_t *_jit, jit_int32_t u)
 {
+    jit_word_t         offset;
+
     assert(_jit->function);
-    if (_jit->function->call.argi) {
-       jit_new_node_ww(jit_code_pushargr_f,
-                       _A0 - _jit->function->call.argi, u);
-       _jit->function->call.argi += 2;
-    }
-    else if (_jit->function->call.argf < 4) {
-       jit_movr_f(_F12 - (_jit->function->call.argf >> 1), u);
-       _jit->function->call.argf += 2;
+    offset = _jit->function->call.size >> 2;
+    if (offset < 3) {
+       if (offset & 1) {
+           ++offset;
+           _jit->function->call.size += 4;
+       }
+       if (_jit->function->call.argi)
+           jit_new_node_ww(jit_code_pushargr_f, _A0 - offset, u);
+       else
+           jit_movr_f(_F12 - (offset >> 1), u);
     }
     else
        jit_stxi_f(_jit->function->call.size, JIT_SP, u);
+    if (offset < 3) {
+       if (!_jit->function->call.argi)
+           _jit->function->call.argf = offset + 2;
+       else
+           _jit->function->call.argi = offset + 2;
+    }
+    else
+       _jit->function->call.argi = offset + 1;
     _jit->function->call.size += sizeof(jit_float32_t);
 }
 
@@ -480,17 +491,19 @@ void
 _jit_pushargi_f(jit_state_t *_jit, jit_float32_t u)
 {
     jit_int32_t                regno;
+    jit_word_t         offset;
 
-    if (_jit->function->call.argi) {
-       if (_jit->function->call.argi & 1)
-           ++_jit->function->call.argi;
-       jit_new_node_wf(jit_code_pushargi_f,
-                       _A0 - _jit->function->call.argi, u);
-       _jit->function->call.argi += 2;
-    }
-    else if (_jit->function->call.argf < 4) {
-       jit_movi_f(_F12 - (_jit->function->call.argf >> 1), u);
-       _jit->function->call.argf += 2;
+    assert(_jit->function);
+    offset = _jit->function->call.size >> 2;
+    if (offset < 3) {
+       if (offset & 1) {
+           ++offset;
+           _jit->function->call.size += 4;
+       }
+       if (_jit->function->call.argi)
+           jit_new_node_ww(jit_code_pushargi_f, _A0 - offset, u);
+       else
+           jit_movi_f(_F12 - (offset >> 1), u);
     }
     else {
        assert(_jit->function);
@@ -499,26 +512,38 @@ _jit_pushargi_f(jit_state_t *_jit, jit_float32_t u)
        jit_stxi_f(_jit->function->call.size, JIT_SP, regno);
        jit_unget_reg(regno);
     }
+    if (offset < 3) {
+       if (!_jit->function->call.argi)
+           _jit->function->call.argf = offset + 2;
+       else
+           _jit->function->call.argi = offset + 2;
+    }
+    else
+       _jit->function->call.argi = offset + 1;
     _jit->function->call.size += sizeof(jit_float32_t);
 }
 
 void
 _jit_pushargr_d(jit_state_t *_jit, jit_int32_t u)
 {
+    jit_word_t         offset;
+
     assert(_jit->function);
-    if (_jit->function->call.argi) {
-       if (_jit->function->call.argi & 1)
-           ++_jit->function->call.argi;
-       jit_new_node_ww(jit_code_pushargr_d,
-                       _A0 - _jit->function->call.argi, u);
-       _jit->function->call.argi += 2;
-    }
-    else if (_jit->function->call.argf < 4) {
-       jit_movr_d(_F12 - (_jit->function->call.argf >> 1), u);
-       _jit->function->call.argf += 2;
+    if (_jit->function->call.size & 7)
+       _jit->function->call.size += 4;
+    offset = _jit->function->call.size >> 2;
+    if (offset < 3) {
+       if (_jit->function->call.argi)
+           jit_new_node_ww(jit_code_pushargr_d, _A0 - offset, u);
+       else
+           jit_movr_d(_F12 - (offset >> 1), u);
     }
     else
        jit_stxi_d(_jit->function->call.size, JIT_SP, u);
+    if (offset < 3 && !_jit->function->call.argi)
+       _jit->function->call.argf = offset + 2;
+    else
+       _jit->function->call.argi = offset + 2;
     _jit->function->call.size += sizeof(jit_float64_t);
 }
 
@@ -526,25 +551,28 @@ void
 _jit_pushargi_d(jit_state_t *_jit, jit_float64_t u)
 {
     jit_int32_t                regno;
+    jit_word_t         offset;
 
-    if (_jit->function->call.argi) {
-       if (_jit->function->call.argi & 1)
-           ++_jit->function->call.argi;
-       jit_new_node_wd(jit_code_pushargi_d,
-                       _A0 - _jit->function->call.argi, u);
-       _jit->function->call.argi += 2;
-    }
-    else if (_jit->function->call.argf < 4) {
-       jit_movi_d(_F12 - (_jit->function->call.argf >> 1), u);
-       _jit->function->call.argf += 2;
+    assert(_jit->function);
+    if (_jit->function->call.size & 7)
+       _jit->function->call.size += 4;
+    offset = _jit->function->call.size >> 2;
+    if (offset < 3) {
+       if (_jit->function->call.argi)
+           jit_new_node_ww(jit_code_pushargi_d, _A0 - offset, u);
+       else
+           jit_movi_d(_F12 - (offset >> 1), u);
     }
     else {
-       assert(_jit->function);
        regno = jit_get_reg(jit_class_fpr);
-       jit_movi_f(regno, u);
-       jit_stxi_f(_jit->function->call.size, JIT_SP, regno);
+       jit_movi_d(regno, u);
+       jit_stxi_d(_jit->function->call.size, JIT_SP, regno);
        jit_unget_reg(regno);
     }
+    if (offset < 3 && !_jit->function->call.argi)
+       _jit->function->call.argf = offset + 2;
+    else
+       _jit->function->call.argi = offset + 2;
     _jit->function->call.size += sizeof(jit_float64_t);
 }
 
diff --git a/lib/jit_ppc.c b/lib/jit_ppc.c
index 618adef..6e5da81 100644
--- a/lib/jit_ppc.c
+++ b/lib/jit_ppc.c
@@ -379,6 +379,8 @@ _jit_pushargr(jit_state_t *_jit, jit_int32_t u)
        ++_jit->function->call.argi;
     }
     else {
+       if (!_jit->function->call.size)
+           _jit->function->call.size = 56;
        jit_stxi(_jit->function->call.size, JIT_SP, u);
        _jit->function->call.size += sizeof(jit_word_t);
     }
@@ -394,6 +396,8 @@ _jit_pushargi(jit_state_t *_jit, jit_word_t u)
        ++_jit->function->call.argi;
     }
     else {
+       if (!_jit->function->call.size)
+           _jit->function->call.size = 56;
        regno = jit_get_reg(jit_class_gpr);
        jit_movi(regno, u);
        jit_stxi(_jit->function->call.size, JIT_SP, regno);
@@ -424,7 +428,7 @@ _jit_pushargr_d(jit_state_t *_jit, jit_int32_t u)
        if (!(_jit->function->call.kind & jit_call_varargs))
            return;
     }
-    if (_jit->function->call.argi < 6) {
+    if (_jit->function->call.argi < 8) {
        jit_stxi_d(-8, JIT_FP, u);
        jit_ldxi(JIT_RA0 - _jit->function->call.argi, JIT_FP, -8);
        _jit->function->call.argi++;
@@ -432,8 +436,10 @@ _jit_pushargr_d(jit_state_t *_jit, jit_int32_t u)
        _jit->function->call.argi++;
     }
     else {
+       if (!_jit->function->call.size)
+           _jit->function->call.size = 56;
        jit_stxi_d(_jit->function->call.size, JIT_SP, u);
-       _jit->function->call.size += (sizeof(jit_float64_t) + 8) & -8;
+       _jit->function->call.size += sizeof(jit_float64_t);
     }
 }
 
@@ -451,7 +457,7 @@ _jit_pushargi_d(jit_state_t *_jit, jit_float64_t u)
     }
     regno = jit_get_reg(jit_class_fpr);
     jit_movi_d(regno, u);
-    if (_jit->function->call.argi < 6) {
+    if (_jit->function->call.argi < 8) {
        jit_stxi_d(-8, JIT_FP, regno);
        jit_ldxi(JIT_RA0 - _jit->function->call.argi, JIT_FP, -8);
        _jit->function->call.argi++;
@@ -459,8 +465,10 @@ _jit_pushargi_d(jit_state_t *_jit, jit_float64_t u)
        _jit->function->call.argi++;
     }
     else {
+       if (!_jit->function->call.size)
+           _jit->function->call.size = 56;
        jit_stxi_d(_jit->function->call.size, JIT_SP, regno);
-       _jit->function->call.size += (sizeof(jit_float64_t) + 8) & -8;
+       _jit->function->call.size += sizeof(jit_float64_t);
     }
     jit_unget_reg(regno);
 }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]