guile-commits
[Top][All Lists]
Advanced

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

[Guile-commits] 300/437: Add consistency check on temporaries during a j


From: Andy Wingo
Subject: [Guile-commits] 300/437: Add consistency check on temporaries during a jump
Date: Mon, 2 Jul 2018 05:14:40 -0400 (EDT)

wingo pushed a commit to branch lightning
in repository guile.

commit b58960638da7480a469fbcd4f239e57e8d1733c5
Author: pcpa <address@hidden>
Date:   Sat Aug 16 20:31:55 2014 -0300

    Add consistency check on temporaries during a jump
    
        * lib/jit_aarch64-cpu.c, lib/jit_aarch64-fpu.c,
        lib/jit_arm-cpu.c, lib/jit_arm-vfp.c,
        lib/jit_hppa-cpu.c, lib/jit_hppa-fpu.c,
        lib/jit_ia64-cpu.c, lib/jit_ia64-fpu.c,
        lib/jit_mips-cpu.c, lib/jit_mips-fpu.c,
        lib/jit_ppc-cpu.c, lib/jit_ppc-fpu.c,
        lib/jit_s390x-cpu.c, lib/jit_s390x-fpu.c,
        lib/jit_s390x.c, lib/jit_sparc-cpu.c,
        lib/jit_x86-cpu.c, lib/jit_x86-sse.c,
        lib/jit_x86-x87.c: Review generation of all branch
        instructions and always adds the jit_class_nospill
        bitfield for temporary registers that cannot be spilled
        because the reload would be after a conditional jump; the
        patch only adds an extra assertion. These conditions do
        not happen on documented lightning usage, but can happen
        if one uses the not exported jit_get_reg and jit_unget_reg
        calls and cause enough register starvation.
---
 ChangeLog             |  20 ++++++++
 lib/jit_aarch64-cpu.c |   4 +-
 lib/jit_aarch64-fpu.c |  10 ++--
 lib/jit_arm-cpu.c     |   2 +-
 lib/jit_arm-vfp.c     |   6 ++-
 lib/jit_hppa-cpu.c    |  14 +++---
 lib/jit_hppa-fpu.c    |   4 +-
 lib/jit_ia64-cpu.c    |  36 ++++++-------
 lib/jit_ia64-fpu.c    |   3 +-
 lib/jit_mips-cpu.c    | 136 +++++++++++++++++++++++++-------------------------
 lib/jit_mips-fpu.c    |   3 +-
 lib/jit_ppc-cpu.c     |  24 ++++-----
 lib/jit_ppc-fpu.c     |   3 +-
 lib/jit_s390x-cpu.c   |  68 ++++++++++++-------------
 lib/jit_s390x-fpu.c   |  44 ++++++++--------
 lib/jit_s390x.c       |   8 +--
 lib/jit_sparc-cpu.c   |   6 +--
 lib/jit_x86-cpu.c     |  16 +++---
 lib/jit_x86-sse.c     |   3 +-
 lib/jit_x86-x87.c     |   3 +-
 20 files changed, 221 insertions(+), 192 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 74fe082..1b02030 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,25 @@
 2014-08-16 Paulo Andrade <address@hidden>
 
+       * lib/jit_aarch64-cpu.c, lib/jit_aarch64-fpu.c,
+       lib/jit_arm-cpu.c, lib/jit_arm-vfp.c,
+       lib/jit_hppa-cpu.c, lib/jit_hppa-fpu.c,
+       lib/jit_ia64-cpu.c, lib/jit_ia64-fpu.c,
+       lib/jit_mips-cpu.c, lib/jit_mips-fpu.c,
+       lib/jit_ppc-cpu.c, lib/jit_ppc-fpu.c,
+       lib/jit_s390x-cpu.c, lib/jit_s390x-fpu.c,
+       lib/jit_s390x.c, lib/jit_sparc-cpu.c,
+       lib/jit_x86-cpu.c, lib/jit_x86-sse.c,
+       lib/jit_x86-x87.c: Review generation of all branch
+       instructions and always adds the jit_class_nospill
+       bitfield for temporary registers that cannot be spilled
+       because the reload would be after a conditional jump; the
+       patch only adds an extra assertion. These conditions do
+       not happen on documented lightning usage, but can happen
+       if one uses the not exported jit_get_reg and jit_unget_reg
+       calls and cause enough register starvation.
+
+2014-08-16 Paulo Andrade <address@hidden>
+
        * lib/jit_alpha.c: Correct wrong bitmask of most argument
        float register arguments, that were being set as callee
        save instead of argument registers class.
diff --git a/lib/jit_aarch64-cpu.c b/lib/jit_aarch64-cpu.c
index 5cd9af2..804fecb 100644
--- a/lib/jit_aarch64-cpu.c
+++ b/lib/jit_aarch64-cpu.c
@@ -2087,7 +2087,7 @@ _jmpi(jit_state_t *_jit, jit_word_t i0)
     if (w >= -33554432 && w <= 33554431)
        B(w);
     else {
-       reg = jit_get_reg(jit_class_gpr);
+       reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(reg), i0);
        jmpr(rn(reg));
        jit_unget_reg(reg);
@@ -2099,7 +2099,7 @@ _jmpi_p(jit_state_t *_jit, jit_word_t i0)
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     w = movi_p(rn(reg), i0);
     jmpr(rn(reg));
     jit_unget_reg(reg);
diff --git a/lib/jit_aarch64-fpu.c b/lib/jit_aarch64-fpu.c
index 41d6e44..ad20714 100644
--- a/lib/jit_aarch64-fpu.c
+++ b/lib/jit_aarch64-fpu.c
@@ -383,7 +383,8 @@ _b##name##i_f(jit_state_t *_jit,                            
        \
              jit_word_t i0, jit_int32_t r0, jit_float32_t i1)          \
 {                                                                      \
     jit_word_t         word;                                           \
-    jit_int32_t                reg = jit_get_reg(jit_class_fpr);               
\
+    jit_int32_t                reg = jit_get_reg(jit_class_fpr|                
\
+                                         jit_class_nospill);           \
     movi_f(rn(reg), i1);                                               \
     word = b##name##r_f(i0, r0, rn(reg));                              \
     jit_unget_reg(reg);                                                        
\
@@ -395,7 +396,8 @@ _b##name##i_d(jit_state_t *_jit,                            
        \
              jit_word_t i0, jit_int32_t r0, jit_float64_t i1)          \
 {                                                                      \
     jit_word_t         word;                                           \
-    jit_int32_t                reg = jit_get_reg(jit_class_fpr);               
\
+    jit_int32_t                reg = jit_get_reg(jit_class_fpr|                
\
+                                         jit_class_nospill);           \
     movi_d(rn(reg), i1);                                               \
     word = b##name##r_d(i0, r0, rn(reg));                              \
     jit_unget_reg(reg);                                                        
\
@@ -591,7 +593,7 @@ _fbcci(jit_state_t *_jit, jit_int32_t cc,
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_fpr);
+    reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
     movi_f(rn(reg), i1);
     w = fbccr(cc, i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -806,7 +808,7 @@ _dbcci(jit_state_t *_jit, jit_int32_t cc,
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_fpr);
+    reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
     movi_d(rn(reg), i1);
     w = dbccr(cc, i0, r0, rn(reg));
     jit_unget_reg(reg);
diff --git a/lib/jit_arm-cpu.c b/lib/jit_arm-cpu.c
index 08db893..1be40b5 100644
--- a/lib/jit_arm-cpu.c
+++ b/lib/jit_arm-cpu.c
@@ -2582,7 +2582,7 @@ _jmpi_p(jit_state_t *_jit, jit_word_t i0)
 #if 0
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     w = movi_p(rn(reg), i0);
     jmpr(rn(reg));
     jit_unget_reg(reg);
diff --git a/lib/jit_arm-vfp.c b/lib/jit_arm-vfp.c
index c1ee41e..9b61dda 100644
--- a/lib/jit_arm-vfp.c
+++ b/lib/jit_arm-vfp.c
@@ -1431,7 +1431,8 @@ _vfp_b##name##i_f(jit_state_t *_jit,                      
                \
                  jit_int32_t r0, jit_int32_t r1, jit_float32_t i0)     \
 {                                                                      \
     jit_word_t         word;                                           \
-    jit_int32_t                reg = jit_get_reg(jit_class_fpr);               
\
+    jit_int32_t                reg = jit_get_reg(jit_class_fpr|                
\
+                                         jit_class_nospill);           \
     vfp_movi_f(rn(reg), i0);                                           \
     word = vfp_b##name##r_f(r0, r1, rn(reg));                          \
     jit_unget_reg(reg);                                                        
\
@@ -1443,7 +1444,8 @@ _vfp_b##name##i_d(jit_state_t *_jit,                      
                \
                  jit_int32_t r0, jit_int32_t r1, jit_float64_t i0)     \
 {                                                                      \
     jit_word_t         word;                                           \
-    jit_int32_t                reg = jit_get_reg(jit_class_fpr);               
\
+    jit_int32_t                reg = jit_get_reg(jit_class_fpr|                
\
+                                         jit_class_nospill);           \
     vfp_movi_d(rn(reg), i0);                                           \
     word = vfp_b##name##r_d(r0, r1, rn(reg));                          \
     jit_unget_reg(reg);                                                        
\
diff --git a/lib/jit_hppa-cpu.c b/lib/jit_hppa-cpu.c
index 2a88f9f..30de58c 100644
--- a/lib/jit_hppa-cpu.c
+++ b/lib/jit_hppa-cpu.c
@@ -2294,7 +2294,7 @@ _bcmpi(jit_state_t *_jit, jit_word_t c, jit_word_t ci,
        CMPIB_N_(ci, i1, r0, ((i0 - w) >> 2) - 2);
     }
     else {
-       reg = jit_get_reg(jit_class_gpr);
+       reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(reg), i1);
        w = _jit->pc.w;
        CMPB_N_(c, r0, rn(reg), ((i0 - w) >> 2) - 2);
@@ -2310,7 +2310,7 @@ _bmxr(jit_state_t *_jit, jit_bool_t c,
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     andr(rn(reg), r0, r1);
     w = c ? bnei(i0, rn(reg), 0) : beqi(i0, rn(reg), 0);
     jit_unget_reg(reg);
@@ -2323,7 +2323,7 @@ _bmxi(jit_state_t *_jit, jit_bool_t c,
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     andr(rn(reg), r0, rn(reg));
     w = c ? bnei(i0, rn(reg), 0) : beqi(i0, rn(reg), 0);
@@ -2352,7 +2352,7 @@ _boaddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
        NOP();
     }
     else {
-       reg = jit_get_reg(jit_class_gpr);
+       reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(reg), i1);
        w = boaddr(i0, r0, rn(reg));
        jit_unget_reg(reg);
@@ -2381,7 +2381,7 @@ _boaddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1)
        NOP();
     }
     else {
-       reg = jit_get_reg(jit_class_gpr);
+       reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(reg), i1);
        w = boaddr_u(i0, r0, rn(reg));
        jit_unget_reg(reg);
@@ -2410,7 +2410,7 @@ _bxaddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
        NOP();
     }
     else {
-       reg = jit_get_reg(jit_class_gpr);
+       reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(reg), i1);
        w = bxaddr(i0, r0, rn(reg));
        jit_unget_reg(reg);
@@ -2439,7 +2439,7 @@ _bxaddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1)
        NOP();
     }
     else {
-       reg = jit_get_reg(jit_class_gpr);
+       reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(reg), i1);
        w = bxaddr_u(i0, r0, rn(reg));
        jit_unget_reg(reg);
diff --git a/lib/jit_hppa-fpu.c b/lib/jit_hppa-fpu.c
index c1861b1..d1b6efe 100644
--- a/lib/jit_hppa-fpu.c
+++ b/lib/jit_hppa-fpu.c
@@ -965,7 +965,7 @@ _bcmpi_f(jit_state_t *_jit, jit_word_t c,
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_fpr);
+    reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
     movi_f(rn(reg), i1);
     FCMP_S_(r0, rn(reg), c);
     FTEST();
@@ -995,7 +995,7 @@ _bcmpi_d(jit_state_t *_jit, jit_word_t c,
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_fpr);
+    reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
     movi_d(rn(reg), i1);
     FCMP_D_(r0, rn(reg), c);
     FTEST();
diff --git a/lib/jit_ia64-cpu.c b/lib/jit_ia64-cpu.c
index ae197ea..6774e36 100644
--- a/lib/jit_ia64-cpu.c
+++ b/lib/jit_ia64-cpu.c
@@ -4638,7 +4638,7 @@ _blei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = bler(i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -4661,7 +4661,7 @@ _blei_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = bler_u(i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -4774,7 +4774,7 @@ _bgti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = bgtr(i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -4797,7 +4797,7 @@ _bgti_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = bgtr_u(i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -4905,9 +4905,9 @@ _baddr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1,
     jit_int32_t                t1;
     jit_int32_t                t2;
     /* t1 = r0 + r1;   overflow = r1 < 0 ? r0 < t1 : t1 < r0 */
-    t0 = jit_get_reg(jit_class_gpr);
-    t1 = jit_get_reg(jit_class_gpr);
-    t2 = jit_get_reg(jit_class_gpr);
+    t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
     lti(rn(t0), r1, 0);                        /* t0 = r1 < 0 */
     addr(rn(t1), r0, r1);              /* t1 = r0 + r1 */
     ltr(rn(t2), rn(t1), r0);           /* t2 = t1 < r0 */
@@ -4931,7 +4931,7 @@ _baddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1,
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = baddr(i0, r0, rn(reg), carry);
     jit_unget_reg(reg);
@@ -4945,8 +4945,8 @@ _baddr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_int32_t r1,
     jit_word_t         w;
     jit_int32_t                t0;
     jit_int32_t                t1;
-    t0 = jit_get_reg(jit_class_gpr);
-    t1 = jit_get_reg(jit_class_gpr);
+    t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
     addr(rn(t0), r0, r1);
     ltr_u(rn(t1), rn(t0), r0);
     CMPI_EQ(PR_6, PR_7, 0, rn(t1));
@@ -4965,7 +4965,7 @@ _baddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1,
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = baddr_u(i0, r0, rn(reg), carry);
     jit_unget_reg(reg);
@@ -4981,9 +4981,9 @@ _bsubr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1,
     jit_int32_t                t1;
     jit_int32_t                t2;
     /* t1 = r0 - r1;   overflow = 0 < r1 ? r0 < t1 : t1 < r0 */
-    t0 = jit_get_reg(jit_class_gpr);
-    t1 = jit_get_reg(jit_class_gpr);
-    t2 = jit_get_reg(jit_class_gpr);
+    t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
     gti(rn(t0), r1, 0);                        /* t0 = r1 > 0 */
     subr(rn(t1), r0, r1);              /* t1 = r0 - r1 */
     ltr(rn(t2), rn(t1), r0);           /* t2 = t1 < r0 */
@@ -5007,7 +5007,7 @@ _bsubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1,
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = bsubr(i0, r0, rn(reg), carry);
     jit_unget_reg(reg);
@@ -5021,8 +5021,8 @@ _bsubr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_int32_t r1,
     jit_word_t         w;
     jit_int32_t                t0;
     jit_int32_t                t1;
-    t0 = jit_get_reg(jit_class_gpr);
-    t1 = jit_get_reg(jit_class_gpr);
+    t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
     subr(rn(t0), r0, r1);
     ltr_u(rn(t1), r0, rn(t0));
     CMPI_EQ(PR_6, PR_7, 0, rn(t1));
@@ -5041,7 +5041,7 @@ _bsubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1,
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = bsubr_u(i0, r0, rn(reg), carry);
     jit_unget_reg(reg);
diff --git a/lib/jit_ia64-fpu.c b/lib/jit_ia64-fpu.c
index 71e325a..5557d7b 100644
--- a/lib/jit_ia64-fpu.c
+++ b/lib/jit_ia64-fpu.c
@@ -1095,7 +1095,8 @@ _b##name##i_##type(jit_state_t *_jit,                     
                \
                  jit_float##size##_t *i1)                              \
 {                                                                      \
     jit_word_t         word;                                           \
-    jit_int32_t                reg = jit_get_reg(jit_class_fpr);               
\
+    jit_int32_t                reg = jit_get_reg(jit_class_fpr|                
\
+                                         jit_class_nospill);           \
     movi_##type(rn(reg), i1);                                          \
     word = b##name##r_##type(i0, r0, rn(reg));                         \
     jit_unget_reg(reg);                                                        
\
diff --git a/lib/jit_mips-cpu.c b/lib/jit_mips-cpu.c
index aa48b64..ce7e7ed 100644
--- a/lib/jit_mips-cpu.c
+++ b/lib/jit_mips-cpu.c
@@ -1918,7 +1918,7 @@ _bltr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
     jit_word_t         w;
     jit_int32_t                reg;
 
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     SLTU(rn(reg), r0, r1);
     w = _jit->pc.w;
     BNE(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
@@ -1937,7 +1937,7 @@ _blti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
     jit_bool_t         zero_p;
 
     if (!(zero_p = i1 == 0))
-       reg = jit_get_reg(jit_class_gpr);
+       reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     if (can_sign_extend_short_p(i1)) {
        if (!zero_p)
            SLTI(rn(reg), r0, i1);
@@ -1965,7 +1965,7 @@ _blti_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
     jit_word_t         w;
     jit_int32_t                reg;
 
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     if (can_sign_extend_short_p(i1)) {
        SLTIU(rn(reg), r0, i1);
        w = _jit->pc.w;
@@ -1987,7 +1987,7 @@ _bler(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
     jit_word_t         w;
     jit_int32_t                reg;
 
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     SLT(rn(reg), r1, r0);
     w = _jit->pc.w;
     BEQ(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
@@ -2003,7 +2003,7 @@ _bler_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
     jit_word_t         w;
     jit_int32_t                reg;
 
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     SLTU(rn(reg), r1, r0);
     w = _jit->pc.w;
     BEQ(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
@@ -2025,7 +2025,7 @@ _blei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
        NOP(1);
     }
     else {
-       reg = jit_get_reg(jit_class_gpr);
+       reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(reg), i1);
        w = bler(i0, r0, rn(reg));
        jit_unget_reg(reg);
@@ -2046,7 +2046,7 @@ _blei_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
        NOP(1);
     }
     else {
-       reg = jit_get_reg(jit_class_gpr);
+       reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(reg), i1);
        w = bler_u(i0, r0, rn(reg));
        jit_unget_reg(reg);
@@ -2079,7 +2079,7 @@ _beqi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
        NOP(1);
     }
     else {
-       reg = jit_get_reg(jit_class_gpr);
+       reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(reg), i1);
        w = beqr(i0, r0, rn(reg));
        jit_unget_reg(reg);
@@ -2094,7 +2094,7 @@ _bger(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
     jit_word_t         w;
     jit_int32_t                reg;
 
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     SLT(rn(reg), r0, r1);
     w = _jit->pc.w;
     BEQ(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
@@ -2110,7 +2110,7 @@ _bger_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
     jit_word_t         w;
     jit_int32_t                reg;
 
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     SLTU(rn(reg), r0, r1);
     w = _jit->pc.w;
     BEQ(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
@@ -2129,7 +2129,7 @@ _bgei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
     jit_bool_t         zero_p;
 
     if (!(zero_p = i1 == 0))
-       reg = jit_get_reg(jit_class_gpr);
+       reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     if (can_sign_extend_short_p(i1)) {
        if (!zero_p)
            SLTI(rn(reg), r0, i1);
@@ -2157,7 +2157,7 @@ _bgei_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
     jit_word_t         w;
     jit_int32_t                reg;
 
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     if (can_sign_extend_short_p(i1)) {
        SLTIU(rn(reg), r0, i1);
        w = _jit->pc.w;
@@ -2179,7 +2179,7 @@ _bgtr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
     jit_word_t         w;
     jit_int32_t                reg;
 
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     SLT(rn(reg), r1, r0);
     w = _jit->pc.w;
     BNE(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
@@ -2195,7 +2195,7 @@ _bgtr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
     jit_word_t         w;
     jit_int32_t                reg;
 
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     SLTU(rn(reg), r1, r0);
     w = _jit->pc.w;
     BNE(rn(reg), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
@@ -2217,7 +2217,7 @@ _bgti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
        NOP(1);
     }
     else {
-       reg = jit_get_reg(jit_class_gpr);
+       reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(reg), i1);
        w = bgtr(i0, r0, rn(reg));
        jit_unget_reg(reg);
@@ -2238,7 +2238,7 @@ _bgti_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
        NOP(1);
     }
     else {
-       reg = jit_get_reg(jit_class_gpr);
+       reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(reg), i1);
        w = bgtr_u(i0, r0, rn(reg));
        jit_unget_reg(reg);
@@ -2271,7 +2271,7 @@ _bnei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
        NOP(1);
     }
     else {
-       reg = jit_get_reg(jit_class_gpr);
+       reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(reg), i1);
        w = bner(i0, r0, rn(reg));
        jit_unget_reg(reg);
@@ -2317,9 +2317,9 @@ _boaddr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
     jit_int32_t                t2;
 
     /* t1 = r0 + r1;   overflow = r1 < 0 ? r0 < t1 : t1 < r0 */
-    t0 = jit_get_reg(jit_class_gpr);
-    t1 = jit_get_reg(jit_class_gpr);
-    t2 = jit_get_reg(jit_class_gpr);
+    t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
     SLT(rn(t0), r1, _ZERO_REGNO);      /* t0 = r1 < 0 */
     addr(rn(t1), r0, r1);              /* t1 = r0 + r1 */
     SLT(rn(t2), rn(t1), r0);           /* t2 = t1 < r0 */
@@ -2345,9 +2345,9 @@ _boaddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
     jit_int32_t                t2;
 
     if (can_sign_extend_short_p(i1)) {
-       t0 = jit_get_reg(jit_class_gpr);
-       t1 = jit_get_reg(jit_class_gpr);
-       t2 = jit_get_reg(jit_class_gpr);
+       t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+       t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+       t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
        SLTI(rn(t0), _ZERO_REGNO, i1);
        addiu(rn(t1), r0, i1);
        SLT(rn(t2), r0, rn(t1));
@@ -2377,8 +2377,8 @@ _boaddr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_int32_t r1)
     jit_int32_t                t0;
     jit_int32_t                t1;
 
-    t0 = jit_get_reg(jit_class_gpr);
-    t1 = jit_get_reg(jit_class_gpr);
+    t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
     addr(rn(t0), r0, r1);
     SLTU(rn(t1), rn(t0), r0);
     w = _jit->pc.w;
@@ -2398,8 +2398,8 @@ _boaddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1)
     jit_int32_t                t1;
 
     if (can_sign_extend_short_p(i0)) {
-       t0 = jit_get_reg(jit_class_gpr);
-       t1 = jit_get_reg(jit_class_gpr);
+       t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+       t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
        addiu(rn(t0), r0, i1);
        SLTU(rn(t1), rn(t0), r0);
        w = _jit->pc.w;
@@ -2410,7 +2410,7 @@ _boaddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1)
        jit_unget_reg(t0);
     }
     else {
-       t0 = jit_get_reg(jit_class_gpr);
+       t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(t0), i1);
        w = boaddr_u(i0, r0, rn(t0));
        jit_unget_reg(t0);
@@ -2427,9 +2427,9 @@ _bxaddr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
     jit_int32_t                t2;
 
     /* t1 = r0 + r1;   overflow = r1 < 0 ? r0 < t1 : t1 < r0 */
-    t0 = jit_get_reg(jit_class_gpr);
-    t1 = jit_get_reg(jit_class_gpr);
-    t2 = jit_get_reg(jit_class_gpr);
+    t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
     SLT(rn(t0), r1, _ZERO_REGNO);      /* t0 = r1 < 0 */
     addr(rn(t1), r0, r1);              /* t1 = r0 + r1 */
     SLT(rn(t2), rn(t1), r0);           /* t2 = t1 < r0 */
@@ -2455,9 +2455,9 @@ _bxaddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
     jit_int32_t                t2;
 
     if (can_sign_extend_short_p(i1)) {
-       t0 = jit_get_reg(jit_class_gpr);
-       t1 = jit_get_reg(jit_class_gpr);
-       t2 = jit_get_reg(jit_class_gpr);
+       t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+       t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+       t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
        SLTI(rn(t0), _ZERO_REGNO, i1);
        addiu(rn(t1), r0, i1);
        SLT(rn(t2), r0, rn(t1));
@@ -2472,7 +2472,7 @@ _bxaddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
        jit_unget_reg(t0);
     }
     else {
-       t0 = jit_get_reg(jit_class_gpr);
+       t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(t0), i1);
        w = bxaddr(i0, r0, rn(t0));
        jit_unget_reg(t0);
@@ -2487,8 +2487,8 @@ _bxaddr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_int32_t r1)
     jit_int32_t                t0;
     jit_int32_t                t1;
 
-    t0 = jit_get_reg(jit_class_gpr);
-    t1 = jit_get_reg(jit_class_gpr);
+    t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
     addr(rn(t0), r0, r1);
     SLTU(rn(t1), rn(t0), r0);
     w = _jit->pc.w;
@@ -2508,8 +2508,8 @@ _bxaddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1)
     jit_int32_t                t1;
 
     if (can_sign_extend_short_p(i0)) {
-       t0 = jit_get_reg(jit_class_gpr);
-       t1 = jit_get_reg(jit_class_gpr);
+       t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+       t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
        addiu(rn(t0), r0, i1);
        SLTU(rn(t1), rn(t0), r0);
        w = _jit->pc.w;
@@ -2520,7 +2520,7 @@ _bxaddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1)
        jit_unget_reg(t0);
     }
     else {
-       t0 = jit_get_reg(jit_class_gpr);
+       t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(t0), i1);
        w = bxaddr_u(i0, r0, rn(t0));
        jit_unget_reg(t0);
@@ -2537,9 +2537,9 @@ _bosubr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
     jit_int32_t                t2;
 
     /* t1 = r0 - r1;   overflow = 0 < r1 ? r0 < t1 : t1 < r0 */
-    t0 = jit_get_reg(jit_class_gpr);
-    t1 = jit_get_reg(jit_class_gpr);
-    t2 = jit_get_reg(jit_class_gpr);
+    t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
     SLT(rn(t0), _ZERO_REGNO, r1);      /* t0 = 0 < r1 */
     subr(rn(t1), r0, r1);              /* t1 = r0 - r1 */
     SLT(rn(t2), rn(t1), r0);           /* t2 = t1 < r0 */
@@ -2565,9 +2565,9 @@ _bosubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
     jit_int32_t                t2;
 
     if (can_sign_extend_short_p(i1) && (i1 & 0xffff) != 0x8000) {
-       t0 = jit_get_reg(jit_class_gpr);
-       t1 = jit_get_reg(jit_class_gpr);
-       t2 = jit_get_reg(jit_class_gpr);
+       t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+       t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+       t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
        SLTI(rn(t0), _ZERO_REGNO, i1);
        addiu(rn(t1), r0, -i1);
        SLT(rn(t2), rn(t1), r0);
@@ -2582,7 +2582,7 @@ _bosubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
        jit_unget_reg(t0);
     }
     else {
-       t0 = jit_get_reg(jit_class_gpr);
+       t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(t0), i1);
        w = bosubr(i0, r0, rn(t0));
        jit_unget_reg(t0);
@@ -2597,8 +2597,8 @@ _bosubr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_int32_t r1)
     jit_int32_t                t0;
     jit_int32_t                t1;
 
-    t0 = jit_get_reg(jit_class_gpr);
-    t1 = jit_get_reg(jit_class_gpr);
+    t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
     subr(rn(t0), r0, r1);
     SLTU(rn(t1), r0, rn(t0));
     w = _jit->pc.w;
@@ -2618,8 +2618,8 @@ _bosubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1)
     jit_int32_t                t1;
 
     if (can_sign_extend_short_p(i0) && (i0 & 0xffff) != 0x8000) {
-       t0 = jit_get_reg(jit_class_gpr);
-       t1 = jit_get_reg(jit_class_gpr);
+       t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+       t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
        addiu(rn(t0), r0, -i1);
        SLTU(rn(t1), r0, rn(t0));
        w = _jit->pc.w;
@@ -2630,7 +2630,7 @@ _bosubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1)
        jit_unget_reg(t0);
     }
     else {
-       t0 = jit_get_reg(jit_class_gpr);
+       t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(t0), i1);
        w = bosubr_u(i0, r0, rn(t0));
        jit_unget_reg(t0);
@@ -2647,9 +2647,9 @@ _bxsubr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
     jit_int32_t                t2;
 
     /* t1 = r0 - r1;   overflow = 0 < r1 ? r0 < t1 : t1 < r0 */
-    t0 = jit_get_reg(jit_class_gpr);
-    t1 = jit_get_reg(jit_class_gpr);
-    t2 = jit_get_reg(jit_class_gpr);
+    t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
     SLT(rn(t0), _ZERO_REGNO, r1);      /* t0 = 0 < r1 */
     subr(rn(t1), r0, r1);              /* t1 = r0 - r1 */
     SLT(rn(t2), rn(t1), r0);           /* t2 = t1 < r0 */
@@ -2675,9 +2675,9 @@ _bxsubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
     jit_int32_t                t2;
 
     if (can_sign_extend_short_p(i1) && (i1 & 0xffff) != 0x8000) {
-       t0 = jit_get_reg(jit_class_gpr);
-       t1 = jit_get_reg(jit_class_gpr);
-       t2 = jit_get_reg(jit_class_gpr);
+       t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+       t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+       t2 = jit_get_reg(jit_class_gpr|jit_class_nospill);
        SLTI(rn(t0), _ZERO_REGNO, i1);
        addiu(rn(t1), r0, -i1);
        SLT(rn(t2), rn(t1), r0);
@@ -2692,7 +2692,7 @@ _bxsubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
        jit_unget_reg(t0);
     }
     else {
-       t0 = jit_get_reg(jit_class_gpr);
+       t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(t0), i1);
        w = bxsubr(i0, r0, rn(t0));
        jit_unget_reg(t0);
@@ -2707,8 +2707,8 @@ _bxsubr_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_int32_t r1)
     jit_int32_t                t0;
     jit_int32_t                t1;
 
-    t0 = jit_get_reg(jit_class_gpr);
-    t1 = jit_get_reg(jit_class_gpr);
+    t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
     subr(rn(t0), r0, r1);
     SLTU(rn(t1), r0, rn(t0));
     w = _jit->pc.w;
@@ -2728,8 +2728,8 @@ _bxsubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1)
     jit_int32_t                t1;
 
     if (can_sign_extend_short_p(i0) && (i0 & 0xffff) != 0x8000) {
-       t0 = jit_get_reg(jit_class_gpr);
-       t1 = jit_get_reg(jit_class_gpr);
+       t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
+       t1 = jit_get_reg(jit_class_gpr|jit_class_nospill);
        addiu(rn(t0), r0, -i1);
        SLTU(rn(t1), r0, rn(t0));
        w = _jit->pc.w;
@@ -2740,7 +2740,7 @@ _bxsubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1)
        jit_unget_reg(t0);
     }
     else {
-       t0 = jit_get_reg(jit_class_gpr);
+       t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(t0), i1);
        w = bxsubr_u(i0, r0, rn(t0));
        jit_unget_reg(t0);
@@ -2753,7 +2753,7 @@ _bmsr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
 {
     jit_word_t         w;
     jit_int32_t                t0;
-    t0 = jit_get_reg(jit_class_gpr);
+    t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
     AND(rn(t0), r0, r1);
     w = _jit->pc.w;
     BNE(_ZERO_REGNO, rn(t0), ((i0 - w) >> 2) - 1);
@@ -2767,7 +2767,7 @@ _bmsi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
 {
     jit_word_t         w;
     jit_int32_t                t0;
-    t0 = jit_get_reg(jit_class_gpr);
+    t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
     if (can_zero_extend_short_p(i1)) {
        ANDI(rn(t0), r0, i1);
        w = _jit->pc.w;
@@ -2787,7 +2787,7 @@ _bmcr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
 {
     jit_word_t         w;
     jit_int32_t                t0;
-    t0 = jit_get_reg(jit_class_gpr);
+    t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
     AND(rn(t0), r0, r1);
     w = _jit->pc.w;
     BEQ(_ZERO_REGNO, rn(t0), ((i0 - w) >> 2) - 1);
@@ -2801,7 +2801,7 @@ _bmci(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
 {
     jit_word_t         w;
     jit_int32_t                t0;
-    t0 = jit_get_reg(jit_class_gpr);
+    t0 = jit_get_reg(jit_class_gpr|jit_class_nospill);
     if (can_zero_extend_short_p(i1)) {
        ANDI(rn(t0), r0, i1);
        w = _jit->pc.w;
diff --git a/lib/jit_mips-fpu.c b/lib/jit_mips-fpu.c
index 0a56d5f..bd83103 100644
--- a/lib/jit_mips-fpu.c
+++ b/lib/jit_mips-fpu.c
@@ -571,7 +571,8 @@ _b##name##i_##type(jit_state_t *_jit,                       
                \
                  jit_float##size##_t *i1)                              \
 {                                                                      \
     jit_word_t         word;                                           \
-    jit_int32_t                reg = jit_get_reg(jit_class_fpr);               
\
+    jit_int32_t                reg = jit_get_reg(jit_class_fpr|                
\
+                                         jit_class_nospill);           \
     movi_##type(rn(reg), i1);                                          \
     word = b##name##r_##type(i0, r0, rn(reg));                         \
     jit_unget_reg(reg);                                                        
\
diff --git a/lib/jit_ppc-cpu.c b/lib/jit_ppc-cpu.c
index eb18395..1413875 100644
--- a/lib/jit_ppc-cpu.c
+++ b/lib/jit_ppc-cpu.c
@@ -1931,7 +1931,7 @@ _bmsr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     andr(rn(reg), r0, r1);
     w = bnei(i0, rn(reg), 0);
     jit_unget_reg(reg);
@@ -1943,7 +1943,7 @@ _bmsi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     andi(rn(reg), r0, i1);
     w = bnei(i0, rn(reg), 0);
     jit_unget_reg(reg);
@@ -1955,7 +1955,7 @@ _bmcr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     andr(rn(reg), r0, r1);
     w = beqi(i0, rn(reg), 0);
     jit_unget_reg(reg);
@@ -1967,7 +1967,7 @@ _bmci(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     andi(rn(reg), r0, i1);
     w = beqi(i0, rn(reg), 0);
     jit_unget_reg(reg);
@@ -1991,7 +1991,7 @@ _boaddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = boaddr(i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -2015,7 +2015,7 @@ _bxaddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = bxaddr(i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -2039,7 +2039,7 @@ _bosubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = bosubr(i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -2063,7 +2063,7 @@ _bxsubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = bxsubr(i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -2095,7 +2095,7 @@ _boaddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1)
        BEQ(d);
        return (w);
     }
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = boaddr_u(i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -2127,7 +2127,7 @@ _bxaddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1)
        BNE(d);
        return (w);
     }
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = bxaddr_u(i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -2151,7 +2151,7 @@ _bosubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1)
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = bosubr_u(i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -2175,7 +2175,7 @@ _bxsubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1)
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = bxsubr_u(i0, r0, rn(reg));
     jit_unget_reg(reg);
diff --git a/lib/jit_ppc-fpu.c b/lib/jit_ppc-fpu.c
index 2bef7e3..fcfca82 100644
--- a/lib/jit_ppc-fpu.c
+++ b/lib/jit_ppc-fpu.c
@@ -549,7 +549,8 @@ _b##name##i_##type(jit_state_t *_jit,                       
                \
                  jit_float##size##_t *i1)                              \
 {                                                                      \
     jit_word_t         word;                                           \
-    jit_int32_t                reg = jit_get_reg(jit_class_fpr);               
\
+    jit_int32_t                reg = jit_get_reg(jit_class_fpr|                
\
+                                         jit_class_nospill);           \
     movi_##type(rn(reg), i1);                                          \
     word = b##name##r_##type(i0, r0, rn(reg));                         \
     jit_unget_reg(reg);                                                        
\
diff --git a/lib/jit_s390x-cpu.c b/lib/jit_s390x-cpu.c
index fdceaee..afba9db 100644
--- a/lib/jit_s390x-cpu.c
+++ b/lib/jit_s390x-cpu.c
@@ -1999,7 +1999,7 @@ _bri(jit_state_t *_jit, jit_int32_t cc,
      jit_word_t i0, jit_int32_t r0, jit_word_t i1)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     brr(cc, i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -2011,7 +2011,7 @@ _bri_p(jit_state_t *_jit, jit_int32_t cc,
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = brr_p(cc, i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -2049,7 +2049,7 @@ _bri_u(jit_state_t *_jit, jit_int32_t cc,
        jit_word_t i0, jit_int32_t r0, jit_word_t i1)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     brr_u(cc, i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -2061,7 +2061,7 @@ _bri_u_p(jit_state_t *_jit, jit_int32_t cc,
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = brr_u_p(cc, i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -2089,7 +2089,7 @@ _baddi(jit_state_t *_jit, jit_int32_t c, jit_bool_t s,
        jit_word_t i0, jit_int32_t r0, jit_word_t i1)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     baddr(c, s, i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -2114,7 +2114,7 @@ _baddi_p(jit_state_t *_jit, jit_int32_t c, jit_bool_t s,
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = baddr_p(c, s, i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -2142,7 +2142,7 @@ _bsubi(jit_state_t *_jit, jit_int32_t c, jit_bool_t s,
        jit_word_t i0, jit_int32_t r0, jit_word_t i1)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     bsubr(c, s, i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -2167,7 +2167,7 @@ _bsubi_p(jit_state_t *_jit, jit_int32_t c, jit_bool_t s,
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     w = bsubr_p(c, s, i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -2657,7 +2657,7 @@ static void
 _lshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movi(rn(reg), i0);
     lshr(r0, r1, rn(reg));
     jit_unget_reg_but_zero(reg);
@@ -2667,7 +2667,7 @@ static void
 _rshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movi(rn(reg), i0);
     rshr(r0, r1, rn(reg));
     jit_unget_reg_but_zero(reg);
@@ -2677,7 +2677,7 @@ static void
 _rshi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movi(rn(reg), i0);
     rshr_u(r0, r1, rn(reg));
     jit_unget_reg_but_zero(reg);
@@ -2790,7 +2790,7 @@ _ldxi_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t 
r1, jit_word_t i0)
        ldr_c(r0, r0);
     }
     else {
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(0);
        movi(rn(reg), i0);
        AGR(rn(reg), r1);
        ldr_c(r0, rn(reg));
@@ -2831,7 +2831,7 @@ _ldxi_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t 
r1, jit_word_t i0)
        ldr_uc(r0, r0);
     }
     else {
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(0);
        movi(rn(reg), i0);
        AGR(rn(reg), r1);
        ldr_uc(r0, rn(reg));
@@ -2872,7 +2872,7 @@ _ldxi_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t 
r1, jit_word_t i0)
        ldr_s(r0, r0);
     }
     else {
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(0);
        movi(rn(reg), i0);
        AGR(rn(reg), r1);
        ldr_s(r0, rn(reg));
@@ -2913,7 +2913,7 @@ _ldxi_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t 
r1, jit_word_t i0)
        ldr_us(r0, r0);
     }
     else {
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(0);
        movi(rn(reg), i0);
        AGR(rn(reg), r1);
        ldr_us(r0, rn(reg));
@@ -2954,7 +2954,7 @@ _ldxi_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t 
r1, jit_word_t i0)
        ldr_i(r0, r0);
     }
     else {
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(0);
        movi(rn(reg), i0);
        AGR(rn(reg), r1);
        ldr_i(r0, rn(reg));
@@ -2995,7 +2995,7 @@ _ldxi_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t 
r1, jit_word_t i0)
        ldr_ui(r0, r0);
     }
     else {
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(0);
        movi(rn(reg), i0);
        AGR(rn(reg), r1);
        ldr_ui(r0, rn(reg));
@@ -3036,7 +3036,7 @@ _ldxi_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t 
r1, jit_word_t i0)
        ldr_l(r0, r0);
     }
     else {
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(0);
        movi(rn(reg), i0);
        AGR(rn(reg), r1);
        ldr_l(r0, rn(reg));
@@ -3048,7 +3048,7 @@ static void
 _sti_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movi(rn(reg), i0);
     str_c(rn(reg), r0);
     jit_unget_reg_but_zero(reg);
@@ -3058,7 +3058,7 @@ static void
 _stxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movr(rn(reg), r0);
     AGR(rn(reg), r1);
     str_c(rn(reg), r2);
@@ -3074,7 +3074,7 @@ _stxi_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
     else if (s20_p(i0))
        STCY(r1, x20(i0), 0, r0);
     else {
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(0);
        addi(rn(reg), r0, i0);
        str_c(rn(reg), r1);
        jit_unget_reg_but_zero(reg);
@@ -3085,7 +3085,7 @@ static void
 _sti_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movi(rn(reg), i0);
     str_s(rn(reg), r0);
     jit_unget_reg_but_zero(reg);
@@ -3095,7 +3095,7 @@ static void
 _stxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movr(rn(reg), r0);
     AGR(rn(reg), r1);
     str_s(rn(reg), r2);
@@ -3111,7 +3111,7 @@ _stxi_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
     else if (s20_p(i0))
        STHY(r1, x20(i0), 0, r0);
     else {
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(0);
        addi(rn(reg), r0, i0);
        str_s(r1, rn(reg));
        jit_unget_reg_but_zero(reg);
@@ -3122,7 +3122,7 @@ static void
 _sti_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movi(rn(reg), i0);
     str_i(rn(reg), r0);
     jit_unget_reg_but_zero(reg);
@@ -3132,7 +3132,7 @@ static void
 _stxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movr(rn(reg), r0);
     AGR(rn(reg), r1);
     str_i(rn(reg), r2);
@@ -3148,7 +3148,7 @@ _stxi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
     else if (s20_p(i0))
        STY(r1, x20(i0), 0, r0);
     else {
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(0);
        addi(rn(reg), r0, i0);
        str_i(rn(reg), r1);
        jit_unget_reg_but_zero(reg);
@@ -3159,7 +3159,7 @@ static void
 _sti_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movi(rn(reg), i0);
     str_l(rn(reg), r0);
     jit_unget_reg_but_zero(reg);
@@ -3169,7 +3169,7 @@ static void
 _stxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movr(rn(reg), r0);
     AGR(rn(reg), r1);
     str_l(rn(reg), r2);
@@ -3183,7 +3183,7 @@ _stxi_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
     if (s20_p(i0))
        STG(r1, x20(i0), 0, r0);
     else {
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(0);
        addi(rn(reg), r0, i0);
        str_l(rn(reg), r1);
        jit_unget_reg_but_zero(reg);
@@ -3201,7 +3201,7 @@ _jmpi(jit_state_t *_jit, jit_word_t i0)
     else if (s32_p(d))
        BRL(d);
     else {
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(jit_class_nospill);
        movi(rn(reg), i0);
        jmpr(rn(reg));
        jit_unget_reg_but_zero(reg);
@@ -3213,7 +3213,7 @@ _jmpi_p(jit_state_t *_jit, jit_word_t i0)
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(jit_class_nospill);
     w = movi_p(rn(reg), i0);
     jmpr(rn(reg));
     jit_unget_reg_but_zero(reg);
@@ -3229,7 +3229,7 @@ _calli(jit_state_t *_jit, jit_word_t i0)
     if (s32_p(d))
        BRASL(_R14_REGNO, d);
     else {
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(0);
        movi(rn(reg), i0);
        callr(rn(reg));
        jit_unget_reg_but_zero(reg);
@@ -3241,7 +3241,7 @@ _calli_p(jit_state_t *_jit, jit_word_t i0)
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     w = movi_p(rn(reg), i0);
     callr(rn(reg));
     jit_unget_reg_but_zero(reg);
diff --git a/lib/jit_s390x-fpu.c b/lib/jit_s390x-fpu.c
index d5b681d..25c2b6f 100644
--- a/lib/jit_s390x-fpu.c
+++ b/lib/jit_s390x-fpu.c
@@ -656,7 +656,7 @@ _fi(jit_state_t *_jit, jit_int32_t cc,
      jit_int32_t r0, jit_int32_t r1, jit_float32_t *i0)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_fpr);
+    reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
     movi_f(rn(reg), i0);
     fr(cc, r0, r1, rn(reg));
     jit_unget_reg(reg);
@@ -667,7 +667,7 @@ _di(jit_state_t *_jit, jit_int32_t cc,
      jit_int32_t r0, jit_int32_t r1, jit_float64_t *i0)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_fpr);
+    reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
     movi_d(rn(reg), i0);
     dr(cc, r0, r1, rn(reg));
     jit_unget_reg(reg);
@@ -731,7 +731,7 @@ _bfi(jit_state_t *_jit, jit_int32_t cc,
      jit_word_t i0, jit_int32_t r0, jit_float32_t *i1)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi_f(rn(reg), i1);
     bfr(cc, i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -742,7 +742,7 @@ _bdi(jit_state_t *_jit, jit_int32_t cc,
      jit_word_t i0, jit_int32_t r0, jit_float64_t *i1)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi_d(rn(reg), i1);
     bdr(cc, i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -754,7 +754,7 @@ _bfi_p(jit_state_t *_jit, jit_int32_t cc,
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi_f(rn(reg), i1);
     w = bfr_p(cc, i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -767,7 +767,7 @@ _bdi_p(jit_state_t *_jit, jit_int32_t cc,
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi_d(rn(reg), i1);
     w = bdr_p(cc, i0, r0, rn(reg));
     jit_unget_reg(reg);
@@ -798,7 +798,7 @@ _buneqi(jit_state_t *_jit, jit_int32_t db,
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_fpr);
+    reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
     if (db)
        movi_d(rn(reg), (jit_float64_t *)i1);
     else
@@ -832,7 +832,7 @@ _bltgti(jit_state_t *_jit, jit_int32_t db,
 {
     jit_word_t         w;
     jit_int32_t                reg;
-    reg = jit_get_reg(jit_class_fpr);
+    reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
     if (db)
        movi_d(rn(reg), (jit_float64_t *)i1);
     else
@@ -862,7 +862,7 @@ _movi_f(jit_state_t *_jit, jit_int32_t r0, jit_float32_t 
*i0)
        LZER(r0);
     else if (_jitc->no_data) {
        data.f = *i0;
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(0);
        movi(rn(reg), data.i & 0xffffffff);
        stxi_i(-4, _FP_REGNO, rn(reg));
        jit_unget_reg_but_zero(reg);
@@ -892,7 +892,7 @@ _movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t 
*i0)
        LZDR(r0);
     else if (_jitc->no_data) {
        data.d = *i0;
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(0);
        movi(rn(reg), data.l);
        stxi_l(-8, _FP_REGNO, rn(reg));
        jit_unget_reg_but_zero(reg);
@@ -1018,7 +1018,7 @@ static void
 _ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movi(rn(reg), i0);
     ldr_f(r0, rn(reg));
     jit_unget_reg_but_zero(reg);
@@ -1028,7 +1028,7 @@ static void
 _ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movi(rn(reg), i0);
     ldr_d(r0, rn(reg));
     jit_unget_reg_but_zero(reg);
@@ -1038,7 +1038,7 @@ static void
 _ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movr(rn(reg), r1);
     AGR(rn(reg), r2);
     ldr_f(r0, rn(reg));
@@ -1049,7 +1049,7 @@ static void
 _ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movr(rn(reg), r1);
     AGR(rn(reg), r2);
     ldr_d(r0, rn(reg));
@@ -1065,7 +1065,7 @@ _ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t 
r1, jit_word_t i0)
     else if (s20_p(i0))
        LEY(r0, x20(i0), 0, r1);
     else {
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(0);
        movi(rn(reg), i0);
        AGR(rn(reg), r1);
        ldr_f(r0, rn(reg));
@@ -1082,7 +1082,7 @@ _ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t 
r1, jit_word_t i0)
     else if (s20_p(i0))
        LDY(r0, x20(i0), 0, r1);
     else {
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(0);
        movi(rn(reg), i0);
        AGR(rn(reg), r1);
        ldr_d(r0, rn(reg));
@@ -1094,7 +1094,7 @@ static void
 _sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movi(rn(reg), i0);
     str_f(rn(reg), r0);
     jit_unget_reg_but_zero(reg);
@@ -1104,7 +1104,7 @@ static void
 _sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movi(rn(reg), i0);
     str_d(rn(reg), r0);
     jit_unget_reg_but_zero(reg);
@@ -1114,7 +1114,7 @@ static void
 _stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movr(rn(reg), r0);
     AGR(rn(reg), r1);
     str_f(rn(reg), r2);
@@ -1125,7 +1125,7 @@ static void
 _stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
 {
     jit_int32_t                reg;
-    reg = jit_get_reg_but_zero();
+    reg = jit_get_reg_but_zero(0);
     movr(rn(reg), r0);
     AGR(rn(reg), r1);
     str_d(rn(reg), r2);
@@ -1141,7 +1141,7 @@ _stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
     else if (s20_p(i0))
        STEY(r1, x20(i0), 0, r0);
     else {
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(0);
        movi(rn(reg), i0);
        AGR(rn(reg), r0);
        str_f(rn(reg), r1);
@@ -1158,7 +1158,7 @@ _stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_int32_t r1)
     else if (s20_p(i0))
        STDY(r1, x20(i0), 0, r0);
     else {
-       reg = jit_get_reg_but_zero();
+       reg = jit_get_reg_but_zero(0);
        movi(rn(reg), i0);
        AGR(rn(reg), r0);
        str_d(rn(reg), r1);
diff --git a/lib/jit_s390x.c b/lib/jit_s390x.c
index fb6d4e4..184780b 100644
--- a/lib/jit_s390x.c
+++ b/lib/jit_s390x.c
@@ -30,8 +30,8 @@
 static jit_int32_t _jit_get_reg_pair(jit_state_t*);
 #define jit_unget_reg_pair(regno)      _jit_unget_reg_pair(_jit,regno)
 static void _jit_unget_reg_pair(jit_state_t*,jit_int32_t);
-#define jit_get_reg_but_zero()         _jit_get_reg_but_zero(_jit)
-static jit_int32_t _jit_get_reg_but_zero(jit_state_t*);
+#define jit_get_reg_but_zero(flags)    _jit_get_reg_but_zero(_jit,flags)
+static jit_int32_t _jit_get_reg_but_zero(jit_state_t*,jit_int32_t);
 #define jit_unget_reg_but_zero(reg)    jit_unget_reg(reg)
 #define patch(instr, node)             _patch(_jit, instr, node)
 static void _patch(jit_state_t*,jit_word_t,jit_node_t*);
@@ -1239,12 +1239,12 @@ _jit_unget_reg_pair(jit_state_t *_jit, jit_int32_t reg)
 }
 
 static jit_int32_t
-_jit_get_reg_but_zero(jit_state_t *_jit)
+_jit_get_reg_but_zero(jit_state_t *_jit, jit_int32_t flags)
 {
     jit_int32_t                reg;
     reg = jit_get_reg(jit_class_gpr);
     if (reg == _R0) {
-       reg = jit_get_reg(jit_class_gpr);
+       reg = jit_get_reg(jit_class_gpr|flags);
        jit_unget_reg(_R0);
     }
     return (reg);
diff --git a/lib/jit_sparc-cpu.c b/lib/jit_sparc-cpu.c
index 2e5f3b4..c4b5521 100644
--- a/lib/jit_sparc-cpu.c
+++ b/lib/jit_sparc-cpu.c
@@ -1466,7 +1466,7 @@ _bw(jit_state_t *_jit, jit_int32_t cc,
        NOP();
     }
     else {
-       reg = jit_get_reg(jit_class_gpr);
+       reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(reg), i1);
        w = br(cc, i0, r0, rn(reg));
        jit_unget_reg(reg);
@@ -1511,7 +1511,7 @@ _b_asw(jit_state_t *_jit, jit_bool_t jif, jit_bool_t add, 
jit_bool_t sgn,
        NOP();
     }
     else {
-       reg = jit_get_reg(jit_class_gpr);
+       reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(reg), i1);
        w = b_asr(jif, add, sgn, i0, r0, rn(reg));
        jit_unget_reg(reg);
@@ -1544,7 +1544,7 @@ _bm_w(jit_state_t *_jit, jit_bool_t set,
        NOP();
     }
     else {
-       reg = jit_get_reg(jit_class_gpr);
+       reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
        movi(rn(reg), i1);
        w = bm_r(set, i0, r0, rn(reg));
        jit_unget_reg(reg);
diff --git a/lib/jit_x86-cpu.c b/lib/jit_x86-cpu.c
index e79697a..ce67c20 100644
--- a/lib/jit_x86-cpu.c
+++ b/lib/jit_x86-cpu.c
@@ -3089,7 +3089,7 @@ _boaddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
        jo(i0);
        return (_jit->pc.w);
     }
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     jit_unget_reg(reg);
     return (boaddr(i0, r0, rn(reg)));
@@ -3112,7 +3112,7 @@ _boaddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1)
        jc(i0);
        return (_jit->pc.w);
     }
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     jit_unget_reg(reg);
     return (boaddr_u(i0, r0, rn(reg)));
@@ -3135,7 +3135,7 @@ _bxaddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
        jno(i0);
        return (_jit->pc.w);
     }
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     jit_unget_reg(reg);
     return (bxaddr(i0, r0, rn(reg)));
@@ -3158,7 +3158,7 @@ _bxaddi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1)
        jnc(i0);
        return (_jit->pc.w);
     }
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     jit_unget_reg(reg);
     return (bxaddr_u(i0, r0, rn(reg)));
@@ -3181,7 +3181,7 @@ _bosubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
        jo(i0);
        return (_jit->pc.w);
     }
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     jit_unget_reg(reg);
     return (bosubr(i0, r0, rn(reg)));
@@ -3204,7 +3204,7 @@ _bosubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1)
        jc(i0);
        return (_jit->pc.w);
     }
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     jit_unget_reg(reg);
     return (bosubr_u(i0, r0, rn(reg)));
@@ -3227,7 +3227,7 @@ _bxsubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, 
jit_word_t i1)
        jno(i0);
        return (_jit->pc.w);
     }
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     jit_unget_reg(reg);
     return (bxsubr(i0, r0, rn(reg)));
@@ -3250,7 +3250,7 @@ _bxsubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t 
r0, jit_word_t i1)
        jnc(i0);
        return (_jit->pc.w);
     }
-    reg = jit_get_reg(jit_class_gpr);
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
     movi(rn(reg), i1);
     jit_unget_reg(reg);
     return (bxsubr_u(i0, r0, rn(reg)));
diff --git a/lib/jit_x86-sse.c b/lib/jit_x86-sse.c
index ca5f8a4..edac0fc 100644
--- a/lib/jit_x86-sse.c
+++ b/lib/jit_x86-sse.c
@@ -442,7 +442,8 @@ _sse_b##name##i_##type(jit_state_t *_jit,                   
        \
                       jit_float##size##_t *i1)                         \
 {                                                                      \
     jit_word_t         word;                                           \
-    jit_int32_t                reg = jit_get_reg(jit_class_fpr|jit_class_xpr); 
\
+    jit_int32_t                reg = jit_get_reg(jit_class_fpr|jit_class_xpr|  
\
+                                         jit_class_nospill);           \
     assert(jit_sse_reg_p(reg));                                                
\
     sse_movi_##type(rn(reg), i1);                                      \
     word = sse_b##name##r_##type(i0, r0, rn(reg));                     \
diff --git a/lib/jit_x86-x87.c b/lib/jit_x86-x87.c
index 5f8e014..8faa140 100644
--- a/lib/jit_x86-x87.c
+++ b/lib/jit_x86-x87.c
@@ -395,7 +395,8 @@ _x87_b##name##i_##type(jit_state_t *_jit,                   
        \
                       jit_float##size##_t *i1)                         \
 {                                                                      \
     jit_word_t         word;                                           \
-    jit_int32_t                reg = jit_get_reg(jit_class_fpr);               
\
+    jit_int32_t                reg = jit_get_reg(jit_class_fpr|                
\
+                                         jit_class_nospill);           \
     assert(jit_x87_reg_p(reg));                                                
\
     x87_movi_##type(rn(reg), i1);                                      \
     word = x87_b##name##r_##type(i0, r0, rn(reg));                     \



reply via email to

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