1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-02 13:00:26 +02:00

Pass all but the (not yet implemented) qmul and qdiv tests in sparc

* check/float.tst: Add sparc to list of known NaN and +-Inf
	to integer conversion.

	* check/lightning.c: Define __sparc__ to preprocessor in
	the sparc backend.

	* include/lightning/jit_private.h: Correct wrong definition
	of emit_stxi_d, that has lived for a long time, but would
	cause problems whenever needing to spill/reload a float
	register.

	* include/lightning/jit_sparc.h: Can only use %g2,%g3,%g4
	for scratch variables, as other "global" registers are
	reserved for the system, e.g. libc.
	  Reorder float register naming to make it easier to
	access odd float registers, so that generating code for
	pusharg and getarg is easier for the IR.

	* lib/jit_mips-cpu.c, lib/jit_ppc-cpu.c: Update to match
	new code in jit_sparc-cpu.c. It must call jit_get_reg
	with jit_class_nospill if using the register to move
	an unconditional branch address to it, as the reload
	will not happen (actually could happen in the delay
	slot...)

	* lib/jit_sparc-cpu.c: Correct wrong macro definition for
	ldxr_s.
	  Properly implement div* and implement rem. Div* needs
	to use the y register, and rem* needs to be synthesized.
	  Correct b?sub* macro definitions.

	* lib/jit_sparc-fpu.c: Correct reversed float to/from double
	conversion.
	  Correct wrong jit_get_reg call asking for a gpr and then
	using the fpr with that number.
	  Correct wrong branch displacement computation for
	conditional branches.

	* lib/jit_sparc.c: Correct getarg_d and pushargi_d implementation.
	  Add rem* entries to the switch converting IR to machine code.

	* lib/lightning.c: Correct a problem detected when adding
	the jit_class_nospill flag to jit_get_reg, that was caused
	when having a branch to an "epilog" node, what would cause
	the code to think all registers in unknown state were live,
	while in truth, all registers in unknown state in the
	"just after return" point are actually dead.
This commit is contained in:
pcpa 2013-02-19 01:06:18 -03:00
parent 610a569300
commit e304bc8bf9
11 changed files with 238 additions and 81 deletions

View file

@ -1,3 +1,53 @@
2013-02-18 Paulo Andrade <pcpa@gnu.org>
* check/float.tst: Add sparc to list of known NaN and +-Inf
to integer conversion.
* check/lightning.c: Define __sparc__ to preprocessor in
the sparc backend.
* include/lightning/jit_private.h: Correct wrong definition
of emit_stxi_d, that has lived for a long time, but would
cause problems whenever needing to spill/reload a float
register.
* include/lightning/jit_sparc.h: Can only use %g2,%g3,%g4
for scratch variables, as other "global" registers are
reserved for the system, e.g. libc.
Reorder float register naming to make it easier to
access odd float registers, so that generating code for
pusharg and getarg is easier for the IR.
* lib/jit_mips-cpu.c, lib/jit_ppc-cpu.c: Update to match
new code in jit_sparc-cpu.c. It must call jit_get_reg
with jit_class_nospill if using the register to move
an unconditional branch address to it, as the reload
will not happen (actually could happen in the delay
slot...)
* lib/jit_sparc-cpu.c: Correct wrong macro definition for
ldxr_s.
Properly implement div* and implement rem. Div* needs
to use the y register, and rem* needs to be synthesized.
Correct b?sub* macro definitions.
* lib/jit_sparc-fpu.c: Correct reversed float to/from double
conversion.
Correct wrong jit_get_reg call asking for a gpr and then
using the fpr with that number.
Correct wrong branch displacement computation for
conditional branches.
* lib/jit_sparc.c: Correct getarg_d and pushargi_d implementation.
Add rem* entries to the switch converting IR to machine code.
* lib/lightning.c: Correct a problem detected when adding
the jit_class_nospill flag to jit_get_reg, that was caused
when having a branch to an "epilog" node, what would cause
the code to think all registers in unknown state were live,
while in truth, all registers in unknown state in the
"just after return" point are actually dead.
2013-02-17 Paulo Andrade <pcpa@gnu.org>
* include/lightning/jit_sparc.h, lib/jit_sparc-cpu.c,

View file

@ -14,14 +14,14 @@ ok:
# define x80 0x8000000000000000
#endif
#if __mips__
#if __mips__ || __sparc__
# define wnan x7f
#elif __arm__
# define wnan 0
#else
# define wnan x80
#endif
#if __mips__ || __arm__ || __ppc__
#if __mips__ || __arm__ || __ppc__ || __sparc__
# define wpinf x7f
#else
# define wpinf x80

View file

@ -3962,6 +3962,11 @@ main(int argc, char *argv[])
opt_short += snprintf(cmdline + opt_short,
sizeof(cmdline) - opt_short,
" -D__arm__=1");
#endif
#if defined(__sparc__)
opt_short += snprintf(cmdline + opt_short,
sizeof(cmdline) - opt_short,
" -D__sparc__=1");
#endif
if ((parser.fp = popen(cmdline, "r")) == NULL)
error("cannot execute %s", cmdline);

View file

@ -440,7 +440,7 @@ _emit_stxi(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
extern void
_emit_ldxi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
#define emit_stxi_d(i0, r0, r1) _emit_stxi(_jit, i0, r0, r1)
#define emit_stxi_d(i0, r0, r1) _emit_stxi_d(_jit, i0, r0, r1)
extern void
_emit_stxi_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);

View file

@ -28,11 +28,11 @@
typedef enum {
#define jit_arg_reg_p(i) ((i) >= 0 && (i) < 6)
#define jit_r(i) (_G2 + (i))
#define jit_r_num() 6
#define jit_r_num() 3
#define jit_v(i) (_L0 + (i))
#define jit_v_num() 8
#define jit_arg_f_reg_p(i) ((i) >= 0 && (i) < 6)
#define jit_f(i) (_F0 + (i))
#define jit_f(i) (_F0 + ((i) << 1))
#define jit_f_num() 8
#define JIT_R0 _G2
#define JIT_R1 _G3
@ -45,12 +45,13 @@ typedef enum {
_L0, _L1, _L2, _L3, _L4, _L5, _L6, _L7,
_I0, _I1, _I2, _I3, _I4, _I5, _FP, _I7,
#define JIT_F0 _F0
#define JIT_F1 _F1
#define JIT_F2 _F2
#define JIT_F3 _F3
#define JIT_F4 _F4
#define JIT_F5 _F5
#define JIT_F1 _F2
#define JIT_F2 _F4
#define JIT_F3 _F6
#define JIT_F4 _F8
#define JIT_F5 _F10
_F0, _F1, _F2, _F3, _F4, _F5, _F6, _F7,
_F8, _F9, _F10, _F11, _F12, _F13, _F14, _F15,
#define JIT_NOREG _NOREG
_NOREG,
} jit_reg_t;

View file

@ -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);

View file

@ -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);

View file

@ -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);
@ -925,26 +935,49 @@ _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))
SDIVI(r1, i0, r0);
else {
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 {
movi(rn(reg), i0);
divr(r0, r1, rn(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);
@ -953,6 +986,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)
{
@ -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,

View file

@ -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);
}

View file

@ -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,);

View file

@ -1636,7 +1636,6 @@ _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;
@ -1661,7 +1660,6 @@ _jit_update(jit_state_t *_jit, jit_node_t *node,
}
continue;
}
}
/* assume value is live due to jump to unknown location */
jit_regset_ior(*live, *live, *mask);
jit_regset_set_ui(*mask, 0);