lightning.git - Portable just-in-time compiler library

index : lightning.git
Portable just-in-time compiler library
summary refs log tree commit diff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/jit_mips-cpu.c 2
-rw-r--r--lib/jit_ppc-cpu.c 4
-rw-r--r--lib/jit_sparc-cpu.c 135
-rw-r--r--lib/jit_sparc-fpu.c 28
-rw-r--r--lib/jit_sparc.c 28
-rw-r--r--lib/lightning.c 44
6 files changed, 171 insertions, 70 deletions
diff --git a/lib/jit_mips-cpu.c b/lib/jit_mips-cpu.c
index fc5356b..0774e97 100644
--- a/lib/jit_mips-cpu.c
+++ b/lib/jit_mips-cpu.c
@@ -2223,7 +2223,7 @@ _jmpi(jit_state_t *_jit, jit_word_t i0)
NOP(1);
}
else {
- reg = jit_get_reg(jit_class_gpr);
+ reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
movi_p(rn(reg), i0);
jmpr(rn(reg));
jit_unget_reg(reg);
diff --git a/lib/jit_ppc-cpu.c b/lib/jit_ppc-cpu.c
index f593d41..1685626 100644
--- a/lib/jit_ppc-cpu.c
+++ b/lib/jit_ppc-cpu.c
@@ -2410,7 +2410,7 @@ _jmpi(jit_state_t *_jit, jit_word_t i0)
{
jit_int32_t reg;
jit_word_t w, d;
- reg = jit_get_reg(jit_class_gpr);
+ reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
w = _jit->pc.w;
d = (i0 - w) & ~3;
B(d);
@@ -2424,7 +2424,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_sparc-cpu.c b/lib/jit_sparc-cpu.c
index 77ea71f..cf1728b 100644
--- a/lib/jit_sparc-cpu.c
+++ b/lib/jit_sparc-cpu.c
@@ -93,7 +93,7 @@ static void _f3a(jit_state_t*,jit_int32_t,
# define LDSB(rs1, rs2, rd) f3r(3, rd, 9, rs1, rs2)
# define LDSBI(rs1, imm, rd) f3i(3, rd, 9, rs1, imm)
# define LDSH(rs1, rs2, rd) f3r(3, rd, 10, rs1, rs2)
-# define LDSHI(rs1, imm, rd) f3r(3, rd, 10, rs1, imm)
+# define LDSHI(rs1, imm, rd) f3i(3, rd, 10, rs1, imm)
# define LDUB(rs1, rs2, rd) f3r(3, rd, 1, rs1, rs2)
# define LDUBI(rs1, imm, rd) f3i(3, rd, 1, rs1, imm)
# define LDUH(rs1, rs2, rd) f3r(3, rd, 2, rs1, rs2)
@@ -461,12 +461,22 @@ static void _subxi(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
# define muli(r0, r1, i0) _muli(_jit, r0, r1, i0)
static void _muli(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
-# define divr(r0, r1, r2) SDIV(r1, r2, r0)
+# define divr(r0, r1, r2) _divr(_jit, r0, r1, r2)
+static void _divr(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
# define divi(r0, r1, i0) _divi(_jit, r0, r1, i0)
static void _divi(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
-# define divr_u(r0, r1, r2) UDIV(r1, r2, r0)
+# define divr_u(r0, r1, r2) _divr_u(_jit, r0, r1, r2)
+static void _divr_u(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
# define divi_u(r0, r1, i0) _divi_u(_jit, r0, r1, i0)
static void _divi_u(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+# define remr(r0, r1, r2) _remr(_jit, r0, r1, r2)
+static void _remr(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
+# define remi(r0, r1, i0) _remi(_jit, r0, r1, i0)
+static void _remi(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+# define remr_u(r0, r1, r2) _remr_u(_jit, r0, r1, r2)
+static void _remr_u(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
+# define remi_u(r0, r1, i0) _remi_u(_jit, r0, r1, i0)
+static void _remi_u(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
# define andr(r0, r1, r2) AND(r1, r2, r0)
# define andi(r0, r1, i0) _andi(_jit, r0, r1, i0)
@@ -619,14 +629,14 @@ _b_asw(jit_state_t*,jit_bool_t,jit_bool_t,jit_bool_t,
# define bxaddi(i0, r0, i1) b_asw(0, 1, 1, i0, r0, i1)
# define bxaddr_u(i0, r0, r1) b_asr(0, 1, 0, i0, r0, r1)
# define bxaddi_u(i0, r0, i1) b_asw(0, 1, 0, i0, r0, i1)
-# define bosubr(i0, r0, r1) b_asr(1, 1, 1, i0, r0, r1)
-# define bosubi(i0, r0, i1) b_asw(1, 1, 1, i0, r0, i1)
-# define bosubr_u(i0, r0, r1) b_asr(1, 1, 0, i0, r0, r1)
-# define bosubi_u(i0, r0, i1) b_asw(1, 1, 0, i0, r0, i1)
-# define bxsubr(i0, r0, r1) b_asr(0, 1, 1, i0, r0, r1)
-# define bxsubi(i0, r0, i1) b_asw(0, 1, 1, i0, r0, i1)
-# define bxsubr_u(i0, r0, r1) b_asr(0, 1, 0, i0, r0, r1)
-# define bxsubi_u(i0, r0, i1) b_asw(0, 1, 0, i0, r0, i1)
+# define bosubr(i0, r0, r1) b_asr(1, 0, 1, i0, r0, r1)
+# define bosubi(i0, r0, i1) b_asw(1, 0, 1, i0, r0, i1)
+# define bosubr_u(i0, r0, r1) b_asr(1, 0, 0, i0, r0, r1)
+# define bosubi_u(i0, r0, i1) b_asw(1, 0, 0, i0, r0, i1)
+# define bxsubr(i0, r0, r1) b_asr(0, 0, 1, i0, r0, r1)
+# define bxsubi(i0, r0, i1) b_asw(0, 0, 1, i0, r0, i1)
+# define bxsubr_u(i0, r0, r1) b_asr(0, 0, 0, i0, r0, r1)
+# define bxsubi_u(i0, r0, i1) b_asw(0, 0, 0, i0, r0, i1)
# define bm_r(set, i0, r0, r1) _bm_r(_jit,set,i0,r0,r1)
static jit_word_t
_bm_r(jit_state_t*,jit_bool_t,jit_word_t,jit_int32_t,jit_int32_t);
@@ -926,25 +936,48 @@ _muli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
}
static void
+_divr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
+{
+ jit_int32_t reg;
+ reg = jit_get_reg(jit_class_gpr);
+ rshi(rn(reg), r1, 31);
+ WRY(rn(reg), 0);
+ SDIV(r1, r2, r0);
+ jit_unget_reg(reg);
+}
+
+static void
_divi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
- if (s13_p(i0))
+ reg = jit_get_reg(jit_class_gpr);
+ if (s13_p(i0)) {
+ rshi(rn(reg), r1, 31);
+ WRY(rn(reg), 0);
SDIVI(r1, i0, r0);
+ }
else {
- reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i0);
divr(r0, r1, rn(reg));
- jit_unget_reg(reg);
}
+ jit_unget_reg(reg);
+}
+
+static void
+_divr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
+{
+ WRYI(0, 0);
+ UDIV(r1, r2, r0);
}
static void
_divi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
- if (s13_p(i0))
+ if (s13_p(i0)) {
+ WRYI(0, 0);
UDIVI(r1, i0, r0);
+ }
else {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i0);
@@ -954,6 +987,62 @@ _divi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
}
static void
+_remr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
+{
+ jit_int32_t reg;
+ if (r0 == r1 || r0 == r2) {
+ reg = jit_get_reg(jit_class_gpr);
+ divr(rn(reg), r1, r2);
+ mulr(rn(reg), r2, rn(reg));
+ subr(r0, r1, rn(reg));
+ jit_unget_reg(reg);
+ }
+ else {
+ divr(r0, r1, r2);
+ mulr(r0, r2, r0);
+ subr(r0, r1, r0);
+ }
+}
+
+static void
+_remi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ jit_int32_t reg;
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ remr(r0, r1, rn(reg));
+ jit_unget_reg(reg);
+}
+
+static void
+_remr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
+{
+ jit_int32_t reg;
+ if (r0 == r1 || r0 == r2) {
+ reg = jit_get_reg(jit_class_gpr);
+ divr_u(rn(reg), r1, r2);
+ mulr(rn(reg), r2, rn(reg));
+ subr(r0, r1, rn(reg));
+ jit_unget_reg(reg);
+ }
+ else {
+ divr_u(r0, r1, r2);
+ mulr(r0, r2, r0);
+ subr(r0, r1, r0);
+ }
+}
+
+static void
+_remi_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(jit_class_gpr);
+ movi(rn(reg), i0);
+ remr_u(r0, r1, rn(reg));
+ jit_unget_reg(reg);
+}
+
+static void
_andi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
@@ -1316,6 +1405,7 @@ _b_asr(jit_state_t *_jit, jit_bool_t jif, jit_bool_t add, jit_bool_t sgn,
(jif ? SPARC_BVS : SPARC_BVC) :
(jif ? SPARC_BCS : SPARC_BCC),
(i0 - w) >> 2);
+ NOP();
return (w);
}
@@ -1327,14 +1417,15 @@ _b_asw(jit_state_t *_jit, jit_bool_t jif, jit_bool_t add, jit_bool_t sgn,
jit_int32_t reg;
if (s13_p(i1)) {
if (add)
- ADDcc(r0, i1, r0);
+ ADDIcc(r0, i1, r0);
else
- SUBcc(r0, i1, r0);
+ SUBIcc(r0, i1, r0);
w = _jit->pc.w;
B(sgn ?
(jif ? SPARC_BVS : SPARC_BVC) :
(jif ? SPARC_BCS : SPARC_BCC),
(i0 - w) >> 2);
+ NOP();
}
else {
reg = jit_get_reg(jit_class_gpr);
@@ -1396,9 +1487,10 @@ _jmpi(jit_state_t *_jit, jit_word_t i0)
NOP();
}
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);
}
}
@@ -1407,7 +1499,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);
@@ -1446,8 +1538,9 @@ static void
_prolog(jit_state_t *_jit, jit_node_t *node)
{
/* align at 16 bytes boundary */
- _jit->function->stack = ((stack_framesize - _jit->function->self.aoff)
- + 15) & -16;
+ _jit->function->stack = ((stack_framesize +
+ _jit->function->self.alen -
+ _jit->function->self.aoff) + 15) & -16;
SAVEI(_SP_REGNO, -_jit->function->stack, _SP_REGNO);
/* (most) other backends do not save incoming arguments, so,
diff --git a/lib/jit_sparc-fpu.c b/lib/jit_sparc-fpu.c
index 6a8ce6b..29413b6 100644
--- a/lib/jit_sparc-fpu.c
+++ b/lib/jit_sparc-fpu.c
@@ -36,7 +36,7 @@
# define SPARC_FBG 6 /* greater - G */
# define SPARC_FBUG 5 /* unordered or greater - G or U */
# define SPARC_FBL 4 /* less - L */
-# define SPARC_FBUL 5 /* unordered or less - L or U */
+# define SPARC_FBUL 3 /* unordered or less - L or U */
# define SPARC_FBLG 2 /* less or greater - L or G */
# define SPARC_FBNE 1 /* not equal - L or G or U */
# define SPARC_FBNZ SPARC_FBNE
@@ -147,7 +147,7 @@ static void _extr_f(jit_state_t*, jit_int32_t, jit_int32_t);
# define truncr_f(r0, r1) truncr_f_i(r0, r1)
# define truncr_f_i(r0, r1) _truncr_f_i(_jit, r0, r1)
static void _truncr_f_i(jit_state_t*, jit_int32_t, jit_int32_t);
-# define extr_d_f(r0, r1) FSTOD(r1, r0)
+# define extr_d_f(r0, r1) FDTOS(r1, r0)
# define movi_f(r0, i0) ldi_f(r0, (jit_word_t)i0)
# define movr_f(r0, r1) FMOVS(r1, r0)
# define negr_f(r0, r1) FNEGS(r1, r0)
@@ -159,7 +159,7 @@ static void _extr_d(jit_state_t*, jit_int32_t, jit_int32_t);
# define truncr_d(r0, r1) truncr_d_i(r0, r1)
# define truncr_d_i(r0, r1) _truncr_d_i(_jit, r0, r1)
static void _truncr_d_i(jit_state_t*, jit_int32_t, jit_int32_t);
-# define extr_f_d(r0, r1) FDTOS(r1, r0)
+# define extr_f_d(r0, r1) FSTOD(r1, r0)
# define movi_d(r0, i0) ldi_d(r0, (jit_word_t)i0)
# define movr_d(r0, r1) _movr_d(_jit, r0, r1)
static void _movr_d(jit_state_t*, jit_int32_t, jit_int32_t);
@@ -415,7 +415,7 @@ _fop1f(jit_state_t *_jit, jit_int32_t op,
jit_int32_t r0, jit_int32_t r1, jit_float32_t *i0)
{
jit_int32_t reg;
- reg = jit_get_reg(jit_class_gpr);
+ reg = jit_get_reg(jit_class_fpr);
movi_f(rn(reg), i0);
FPop1(r0, r1, op, rn(reg));
jit_unget_reg(reg);
@@ -426,7 +426,7 @@ _fop1d(jit_state_t *_jit, jit_int32_t op,
jit_int32_t r0, jit_int32_t r1, jit_float64_t *i0)
{
jit_int32_t reg;
- reg = jit_get_reg(jit_class_gpr);
+ reg = jit_get_reg(jit_class_fpr);
movi_d(rn(reg), i0);
FPop1(r0, r1, op, rn(reg));
jit_unget_reg(reg);
@@ -444,7 +444,7 @@ static void
_truncr_f_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
jit_int32_t reg;
- reg = jit_get_reg(jit_class_gpr);
+ reg = jit_get_reg(jit_class_fpr);
FSTOI(r1, rn(reg));
stxi_f(-8, _FP_REGNO, rn(reg));
ldxi_i(r0, _FP_REGNO, -8);
@@ -558,8 +558,8 @@ _stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
static void
_extr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
- stxi(-4, _FP_REGNO, r1);
- stxi(-8, _FP_REGNO, 0);
+ stxi(-8, _FP_REGNO, r1);
+ stxi(-4, _FP_REGNO, 0);
ldxi_d(r0, _FP_REGNO, -8);
FITOD(r0, r0);
}
@@ -568,10 +568,10 @@ static void
_truncr_d_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
jit_int32_t reg;
- reg = jit_get_reg(jit_class_gpr);
+ reg = jit_get_reg(jit_class_fpr);
FDTOI(r1, rn(reg));
stxi_d(-8, _FP_REGNO, rn(reg));
- ldxi_i(r0, _FP_REGNO, -4);
+ ldxi_i(r0, _FP_REGNO, -8);
jit_unget_reg(reg);
}
@@ -638,7 +638,7 @@ _fbr(jit_state_t *_jit, jit_int32_t cc,
jit_word_t w;
FCMPS(r0, r1);
w = _jit->pc.w;
- FB(cc, ((i0 - w) >> 2) - 1);
+ FB(cc, (i0 - w) >> 2);
NOP();
return (w);
}
@@ -654,7 +654,7 @@ _fbw(jit_state_t *_jit, jit_int32_t cc,
FCMPS(r0, rn(reg));
jit_unget_reg(reg);
w = _jit->pc.w;
- FB(cc, ((i0 - w) >> 2) - 1);
+ FB(cc, (i0 - w) >> 2);
NOP();
return (w);
}
@@ -666,7 +666,7 @@ _dbr(jit_state_t *_jit, jit_int32_t cc,
jit_word_t w;
FCMPD(r0, r1);
w = _jit->pc.w;
- FB(cc, ((i0 - w) >> 2) - 1);
+ FB(cc, (i0 - w) >> 2);
NOP();
return (w);
}
@@ -682,7 +682,7 @@ _dbw(jit_state_t *_jit, jit_int32_t cc,
FCMPD(r0, rn(reg));
jit_unget_reg(reg);
w = _jit->pc.w;
- FB(cc, ((i0 - w) >> 2) - 1);
+ FB(cc, (i0 - w) >> 2);
NOP();
return (w);
}
diff --git a/lib/jit_sparc.c b/lib/jit_sparc.c
index 71c334c..43862c3 100644
--- a/lib/jit_sparc.c
+++ b/lib/jit_sparc.c
@@ -39,9 +39,9 @@ jit_register_t _rvs[] = {
{ rc(gpr) | 0x02, "%g2" },
{ rc(gpr) | 0x03, "%g3" },
{ rc(gpr) | 0x04, "%g4" },
- { rc(gpr) | 0x05, "%g5" },
- { rc(gpr) | 0x06, "%g6" },
- { rc(gpr) | 0x07, "%g7" },
+ { 0x05, "%g5" },
+ { 0x06, "%g6" },
+ { 0x07, "%g7" },
{ rc(arg) | rc(gpr) | 0x08, "%o0" },
{ rc(arg) | rc(gpr) | 0x09, "%o1" },
{ rc(arg) | rc(gpr) | 0x0a, "%o2" },
@@ -67,13 +67,21 @@ jit_register_t _rvs[] = {
{ rc(sav) | 0x1e, "%fp" },
{ 0x1f, "%i7" },
{ rc(fpr) | 0x00, "%f0" },
+ { 0x01, "%f1" },
{ rc(fpr) | 0x02, "%f2" },
+ { 0x03, "%f3" },
{ rc(fpr) | 0x04, "%f4" },
+ { 0x05, "%f5" },
{ rc(fpr) | 0x06, "%f6" },
+ { 0x06, "%f7" },
{ rc(fpr) | 0x08, "%f8" },
+ { 0x09, "%f9" },
{ rc(fpr) | 0x0a, "%f10" },
+ { 0x0b, "%f11" },
{ rc(fpr) | 0x0c, "%f12" },
+ { 0x0d, "%f13" },
{ rc(fpr) | 0x0e, "%f14" },
+ { 0x0f, "%f15" },
{ _NOREG, "<none>" },
};
@@ -364,12 +372,10 @@ _jit_getarg_d(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
else if (v->u.w < 6) {
jit_stxi(-8, JIT_FP, _I0 + v->u.w);
jit_ldxi_f(u, JIT_FP, -8);
- jit_ldxi_f(u, JIT_FP, stack_framesize);
- }
- else {
- jit_ldxi_f(u, JIT_FP, v->u.w);
- jit_ldxi_f(u + 1, JIT_FP, v->u.w + 4);
+ jit_ldxi_f(u + 1, JIT_FP, stack_framesize);
}
+ else
+ jit_ldxi_d(u, JIT_FP, v->u.w);
}
void
@@ -469,7 +475,7 @@ _jit_pushargi_d(jit_state_t *_jit, jit_float64_t u)
_jit->function->call.argi += 2;
}
else if (_jit->function->call.argi < 6) {
- jit_stxi_d(-8, JIT_FP, regno);
+ jit_stxi_f(-8, JIT_FP, regno);
jit_ldxi(_O0 + _jit->function->call.argi, JIT_FP, -8);
++_jit->function->call.argi;
jit_stxi_f(stack_framesize, JIT_SP, regno + 1);
@@ -713,6 +719,10 @@ _emit_code(jit_state_t *_jit)
case_rrw(div,);
case_rrr(div, _u);
case_rrw(div, _u);
+ case_rrr(rem,);
+ case_rrw(rem,);
+ case_rrr(rem, _u);
+ case_rrw(rem, _u);
case_rrr(and,);
case_rrw(and,);
diff --git a/lib/lightning.c b/lib/lightning.c
index c2c7619..a9b77f6 100644
--- a/lib/lightning.c
+++ b/lib/lightning.c
@@ -1636,31 +1636,29 @@ _jit_update(jit_state_t *_jit, jit_node_t *node,
node = label;
goto restart;
}
- if (label->code == jit_code_label) {
- block = _jit->blocks.ptr + label->v.w;
- if (mpz_tstbit(_jit->blockmask, label->v.w))
- continue;
- mpz_setbit(_jit->blockmask, label->v.w);
- jit_regset_and(ztmp, *mask, block->reglive);
- if (jit_regset_set_p(ztmp)) {
- jit_regset_ior(*live, *live, ztmp);
- jit_regset_com(ztmp, ztmp);
- jit_regset_and(*mask, *mask, ztmp);
- }
- if (jit_regset_set_p(*mask) == 0)
- return;
- /* restore mask if branch is conditional */
- zmask = *mask;
- jit_update(block->label->next, live, &zmask);
- jit_regset_xor(ztmp, zmask, *mask);
- /* remove known live registers from mask */
- if (jit_regset_set_p(ztmp)) {
- jit_regset_and(ztmp, ztmp, *live);
- jit_regset_com(ztmp, ztmp);
- jit_regset_and(*mask, *mask, ztmp);
- }
+ block = _jit->blocks.ptr + label->v.w;
+ if (mpz_tstbit(_jit->blockmask, label->v.w))
continue;
+ mpz_setbit(_jit->blockmask, label->v.w);
+ jit_regset_and(ztmp, *mask, block->reglive);
+ if (jit_regset_set_p(ztmp)) {
+ jit_regset_ior(*live, *live, ztmp);
+ jit_regset_com(ztmp, ztmp);
+ jit_regset_and(*mask, *mask, ztmp);
}
+ if (jit_regset_set_p(*mask) == 0)
+ return;
+ /* restore mask if branch is conditional */
+ zmask = *mask;
+ jit_update(block->label->next, live, &zmask);
+ jit_regset_xor(ztmp, zmask, *mask);
+ /* remove known live registers from mask */
+ if (jit_regset_set_p(ztmp)) {
+ jit_regset_and(ztmp, ztmp, *live);
+ jit_regset_com(ztmp, ztmp);
+ jit_regset_and(*mask, *mask, ztmp);
+ }
+ continue;
}
/* assume value is live due to jump to unknown location */
jit_regset_ior(*live, *live, *mask);
generated by cgit v1.2.3 (git 2.46.0) at 2025年10月04日 11:40:47 +0000

AltStyle によって変換されたページ (->オリジナル) /