mips: Add initial mips release 6 support. - 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:
authorpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2023年02月20日 15:05:27 -0300
committerpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2023年02月20日 15:05:27 -0300
commitd2420fd946cb665b8968f37df5305b426613c277 (patch)
tree56faa66fa3ab5cffbad87afd2366c0534d866412 /lib
parent75e5274ba59feab99a2afcf329d890911ed01eaf (diff)
downloadlightning-d2420fd946cb665b8968f37df5305b426613c277.tar.gz
mips: Add initial mips release 6 support.
Initially tested only on mips32el. * check/float.tst: Add conditionals for mips release for expected NaN truncated to an integer. * check/lightning.c: Add extra preprocessor for mips release. * include/lightning/jit_mips.h: Make the NEW_ABI preprocessor defined to zero if using the n32 or n64 abis. This makes it easier to create runtime checks with an always true or false condition. * lib/jit_mips-cpu.c, lib/jit_mips-fpu.c: Implement mips release 6 support. * lib/jit_mips.c: Add more reliable mips release detection code.
Diffstat (limited to 'lib')
-rw-r--r--lib/jit_mips-cpu.c 310
-rw-r--r--lib/jit_mips-fpu.c 1413
-rw-r--r--lib/jit_mips.c 8
3 files changed, 1294 insertions, 437 deletions
diff --git a/lib/jit_mips-cpu.c b/lib/jit_mips-cpu.c
index 7d0fa92..d19a2e6 100644
--- a/lib/jit_mips-cpu.c
+++ b/lib/jit_mips-cpu.c
@@ -27,11 +27,13 @@ typedef union {
struct { jit_uint32_t _:16; jit_uint32_t b : 5; } ft;
struct { jit_uint32_t _:11; jit_uint32_t b : 5; } rd;
struct { jit_uint32_t _:11; jit_uint32_t b : 5; } fs;
+ struct { jit_uint32_t _: 7; jit_uint32_t b : 9; } i9;
struct { jit_uint32_t _: 6; jit_uint32_t b : 5; } ic;
struct { jit_uint32_t _: 6; jit_uint32_t b : 5; } fd;
struct { jit_uint32_t _: 6; jit_uint32_t b : 10; } tr;
struct { jit_uint32_t _: 6; jit_uint32_t b : 20; } br;
struct { jit_uint32_t b : 6; } tc;
+ struct { jit_uint32_t b : 5; } cn;
struct { jit_uint32_t b : 11; } cc;
struct { jit_uint32_t b : 16; } is;
struct { jit_uint32_t b : 26; } ii;
@@ -43,11 +45,13 @@ typedef union {
struct { jit_uint32_t _:11; jit_uint32_t b : 5; } ft;
struct { jit_uint32_t _:16; jit_uint32_t b : 5; } rd;
struct { jit_uint32_t _:16; jit_uint32_t b : 5; } fs;
+ struct { jit_uint32_t _:16; jit_uint32_t b : 9; } i9;
struct { jit_uint32_t _:21; jit_uint32_t b : 5; } ic;
struct { jit_uint32_t _:21; jit_uint32_t b : 5; } fd;
struct { jit_uint32_t _:21; jit_uint32_t b : 10; } tr;
struct { jit_uint32_t _:21; jit_uint32_t b : 20; } br;
struct { jit_uint32_t _:26; jit_uint32_t b : 6; } tc;
+ struct { jit_uint32_t _:27; jit_uint32_t b : 5; } cn;
struct { jit_uint32_t _:21; jit_uint32_t b : 11; } cc;
struct { jit_uint32_t _:16; jit_uint32_t b : 16; } is;
struct { jit_uint32_t _: 6; jit_uint32_t b : 26; } ii;
@@ -189,6 +193,8 @@ typedef union {
# define MIPS_CT 0x06
# define MIPS_MTH 0x07
# define MIPS_BC 0x08
+# define MIPS_BC1EQZ 0x09 /* release 6 */
+# define MIPS_BC1NEZ 0x0d /* release 6 */
# define MIPS_WRPGPR 0x0e
# define MIPS_BGZAL 0x11
# define MIPS_MFMC0 0x11
@@ -305,6 +311,9 @@ _hrrrit(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,
# define rrr_t(rs,rt,rd,tc) hrrr_t(0,rs,rt,rd,tc)
# define hrri(hc,rs,rt,im) _hrri(_jit,hc,rs,rt,im)
static void _hrri(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
+# define hrri9(hc,rs,rt,i9,tc) _hrri9(_jit,hc,rs,rt,i9,tc)
+static void _hrri9(jit_state_t*,jit_int32_t,jit_int32_t,
+ jit_int32_t,jit_int32_t,jit_int32_t);
# define hi(hc,im) _hi(_jit,hc,im)
static void _hi(jit_state_t*,jit_int32_t,jit_int32_t);
# define NOP(i0) ii(0)
@@ -321,13 +330,29 @@ static void _nop(jit_state_t*,jit_int32_t);
# define DSUBU(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_DSUBU)
# define MUL(rd,rs,rt) hrrr_t(MIPS_SPECIAL2,rs,rt,rd,MIPS_MUL)
# define MULT(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_MULT)
+# define MUL_R6(rd,rs,rt) hrrrit(MIPS_SPECIAL, rs, rt, rd, 2, 24)
+# define MUH_R6(rd,rs,rt) hrrrit(MIPS_SPECIAL, rs, rt, rd, 3, 24)
# define MULTU(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_MULTU)
+# define MULU_R6(rd,rs,rt) hrrrit(MIPS_SPECIAL, rs, rt, rd, 2, 25)
+# define MUHU_R6(rd,rs,rt) hrrrit(MIPS_SPECIAL, rs, rt, rd, 3, 25)
# define DMULT(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_DMULT)
+# define DMUL_R6(rd,rs,rt) hrrrit(MIPS_SPECIAL, rs, rt, rd, 2, 28)
+# define DMUH_R6(rd,rs,rt) hrrrit(MIPS_SPECIAL, rs, rt, rd, 3, 28)
# define DMULTU(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_DMULTU)
+# define DMULU_R6(rd,rs,rt) hrrrit(MIPS_SPECIAL, rs, rt, rd, 2, 29)
+# define DMUHU_R6(rd,rs,rt) hrrrit(MIPS_SPECIAL, rs, rt, rd, 3, 29)
# define DIV(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_DIV)
+# define DIV_R6(rd,rs,rt) hrrrit(MIPS_SPECIAL, rs, rt, rd, 2, 26)
+# define MOD_R6(rd,rs,rt) hrrrit(MIPS_SPECIAL, rs, rt, rd, 3, 26)
# define DIVU(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_DIVU)
+# define DIVU_R6(rd,rs,rt) hrrrit(MIPS_SPECIAL, rs, rt, rd, 2, 27)
+# define MODU_R6(rd,rs,rt) hrrrit(MIPS_SPECIAL, rs, rt, rd, 3, 27)
# define DDIV(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_DDIV)
+# define DDIV_R6(rd,rs,rt) hrrrit(MIPS_SPECIAL, rs, rt, rd, 2, 30)
+# define DMOD_R6(rd,rs,rt) hrrrit(MIPS_SPECIAL, rs, rt, rd, 3, 30)
# define DDIVU(rs,rt) rrr_t(rs,rt,_ZERO_REGNO,MIPS_DDIVU)
+# define DDIVU_R6(rd,rs,rt) hrrrit(MIPS_SPECIAL, rs, rt, rd, 2, 31)
+# define DMODU_R6(rd,rs,rt) hrrrit(MIPS_SPECIAL, rs, rt, rd, 3, 31)
# define SLLV(rd,rt,rs) rrr_t(rs,rt,rd,MIPS_SLLV)
# define SLL(rd,rt,sa) rrit(rt,rd,sa,MIPS_SLL)
# define DSLLV(rd,rt,rs) rrr_t(rs,rt,rd,MIPS_DSLLV)
@@ -362,6 +387,7 @@ static void _nop(jit_state_t*,jit_int32_t);
# define ANDI(rt,rs,im) hrri(MIPS_ANDI,rs,rt,im)
# define OR(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_OR)
# define ORI(rt,rs,im) hrri(MIPS_ORI,rs,rt,im)
+# define NOR(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_NOR)
# define XOR(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_XOR)
# define XORI(rt,rs,im) hrri(MIPS_XORI,rs,rt,im)
# define LB(rt,of,rb) hrri(MIPS_LB,rb,rt,of)
@@ -372,13 +398,17 @@ static void _nop(jit_state_t*,jit_int32_t);
# define LWU(rt,of,rb) hrri(MIPS_LWU,rb,rt,of)
# define LD(rt,of,rb) hrri(MIPS_LD,rb,rt,of)
# define LL(rt,of,rb) hrri(MIPS_LL,rb,rt,of)
+# define LL_R6(rt,of,rb) hrri9(MIPS_SPECIAL3,rb,rt,of,54)
# define LLD(rt,of,rb) hrri(MIPS_LLD,rb,rt,of)
+# define LLD_R6(rt,of,rb) hrri9(MIPS_SPECIAL3,rb,rt,of,55)
# define SB(rt,of,rb) hrri(MIPS_SB,rb,rt,of)
# define SH(rt,of,rb) hrri(MIPS_SH,rb,rt,of)
# define SW(rt,of,rb) hrri(MIPS_SW,rb,rt,of)
# define SD(rt,of,rb) hrri(MIPS_SD,rb,rt,of)
# define SC(rt,of,rb) hrri(MIPS_SC,rb,rt,of)
+# define SC_R6(rt,of,rb) hrri9(MIPS_SPECIAL3,rb,rt,of,38)
# define SCD(rt,of,rb) hrri(MIPS_SCD,rb,rt,of)
+# define SCD_R6(rt,of,rb) hrri9(MIPS_SPECIAL3,rb,rt,of,39)
# define WSBH(rd,rt) hrrrit(MIPS_SPECIAL3,0,rt,rd,MIPS_WSBH,MIPS_BSHFL)
# define SEB(rd,rt) hrrrit(MIPS_SPECIAL3,0,rt,rd,MIPS_SEB,MIPS_BSHFL)
# define SEH(rd,rt) hrrrit(MIPS_SPECIAL3,0,rt,rd,MIPS_SEH,MIPS_BSHFL)
@@ -413,6 +443,8 @@ static void _nop(jit_state_t*,jit_int32_t);
# define JAL(i0) hi(MIPS_JAL,i0)
# define MOVN(rd,rs,rt) hrrrit(0,rs,rt,rd,0,MIPS_MOVN)
# define MOVZ(rd,rs,rt) hrrrit(0,rs,rt,rd,0,MIPS_MOVZ)
+# define SELEQZ(rd,rs,rt) hrrrit(0,rs,rt,rd,0,53)
+# define SELNEZ(rd,rs,rt) hrrrit(0,rs,rt,rd,0,55)
# define comr(r0,r1) xori(r0,r1,-1)
# define negr(r0,r1) subr(r0,_ZERO_REGNO,r1)
# define bitswap(r0,r1) _bitswap(_jit, r0, r1);
@@ -430,17 +462,33 @@ static void _ctzr(jit_state_t*, jit_int32_t, jit_int32_t);
# define addiu(r0,r1,i0) ADDIU(r0,r1,i0)
# define subr(rd,rs,rt) SUBU(rd,rs,rt)
# define mult(rs,rt) MULT(rs,rt)
+# define mul_r6(rd,rs,rt) MUL_R6(rd,rs,rt)
+# define muh_r6(rd,rs,rt) MUH_R6(rd,rs,rt)
# define multu(rs,rt) MULTU(rs,rt)
+# define mulu_r6(rd,rs,rt) MULU_R6(rd,rs,rt)
+# define muhu_r6(rd,rs,rt) MUHU_R6(rd,rs,rt)
# define div(rs,rt) DIV(rs,rt)
# define divu(rs,rt) DIVU(rs,rt)
+# define div_r6(rd,rs,rt) DIV_R6(rd,rs,rt)
+# define divu_r6(rd,rs,rt) DIVU_R6(rd,rs,rt)
+# define mod_r6(rd,rs,rt) MOD_R6(rd,rs,rt)
+# define modu_r6(rd,rs,rt) MODU_R6(rd,rs,rt)
# else
# define addr(rd,rs,rt) DADDU(rd,rs,rt)
# define addiu(r0,r1,i0) DADDIU(r0,r1,i0)
# define subr(rd,rs,rt) DSUBU(rd,rs,rt)
# define mult(rs,rt) DMULT(rs,rt)
+# define mul_r6(rd,rs,rt) DMUL_R6(rd,rs,rt)
+# define muu_r6(rd,rs,rt) DMUU_R6(rd,rs,rt)
# define multu(rs,rt) DMULTU(rs,rt)
+# define mulu_r6(rd,rs,rt) DMULU_R6(rd,rs,rt)
+# define muhu_r6(rd,rs,rt) DMUHU_R6(rd,rs,rt)
# define div(rs,rt) DDIV(rs,rt)
# define divu(rs,rt) DDIVU(rs,rt)
+# define div_r6(rd,rs,rt) DDIV_R6(rd,rs,rt)
+# define divu_r6(rd,rs,rt) DDIVU_R6(rd,rs,rt)
+# define mod_r6(rd,rs,rt) DMOD_R6(rd,rs,rt)
+# define modu_r6(rd,rs,rt) DMODU_R6(rd,rs,rt)
# endif
# define extr(rd,rt,lsb,nb) _extr(_jit,rd,rt,lsb,nb)
static void _extr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
@@ -541,8 +589,10 @@ static void _movr(jit_state_t*,jit_int32_t,jit_int32_t);
static void _movi(jit_state_t*,jit_int32_t,jit_word_t);
# define movi_p(r0,i0) _movi_p(_jit,r0,i0)
static jit_word_t _movi_p(jit_state_t*,jit_int32_t,jit_word_t);
-# define movnr(r0,r1,r2) MOVN(r0, r1, r2)
-# define movzr(r0,r1,r2) MOVZ(r0, r1, r2)
+# define movnr(r0, r1, r2) _movnr(_jit, r0, r1, r2)
+static void _movnr(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
+# define movzr(r0, r1, r2) _movzr(_jit, r0, r1, r2)
+static void _movzr(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
# define casx(r0, r1, r2, r3, i0) _casx(_jit, r0, r1, r2, r3, i0)
static void _casx(jit_state_t *_jit,jit_int32_t,jit_int32_t,
jit_int32_t,jit_int32_t,jit_word_t);
@@ -997,6 +1047,20 @@ _hrri(jit_state_t *_jit, jit_int32_t hc,
}
static void
+_hrri9(jit_state_t *_jit, jit_int32_t hc,
+ jit_int32_t rs, jit_int32_t rt, jit_int32_t i9, jit_int32_t tc)
+{
+ jit_instr_t i;
+ i.op = 0;
+ i.tc.b = tc;
+ i.i9.b = i9;
+ i.rt.b = rt;
+ i.rs.b = rs;
+ i.hc.b = hc;
+ ii(i.op);
+}
+
+static void
_hi(jit_state_t *_jit, jit_int32_t hc, jit_int32_t im)
{
jit_instr_t i;
@@ -1090,12 +1154,10 @@ static void
_clor(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
#if __WORDSIZE == 32
- /* must sign extend top 32 bits */
- SLL(r0, r1, 0);
if (jit_mips6_p())
- CLO_R6(r0, r0);
+ CLO_R6(r0, r1);
else
- CLO(r0, r0);
+ CLO(r0, r1);
#else
if (jit_mips6_p())
DCLO_R6(r0, r1);
@@ -1108,12 +1170,10 @@ static void
_clzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
#if __WORDSIZE == 32
- /* must sign extend top 32 bits */
- SLL(r0, r1, 0);
if (jit_mips6_p())
- CLZ_R6(r0, r0);
+ CLZ_R6(r0, r1);
else
- CLZ(r0, r0);
+ CLZ(r0, r1);
#else
if (jit_mips6_p())
DCLZ_R6(r0, r1);
@@ -1128,16 +1188,15 @@ _ctor(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
if (jit_mips6_p()) {
#if __WORDSIZE == 32
BITSWAP(r0, r1);
- /* must sign extend top 32 bits */
- SLL(r0, r0, 0);
+ bswapr_ui(r0, r0);
CLO_R6(r0, r0);
#else
DBITSWAP(r0, r1);
+ bswapr_ul(r0, r0);
DCLO_R6(r0, r0);
#endif
}
else {
- //fallback_cto(r0, r1);
bitswap(r0, r1);
clor(r0, r0);
}
@@ -1149,16 +1208,15 @@ _ctzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
if (jit_mips6_p()) {
#if __WORDSIZE == 32
BITSWAP(r0, r1);
- /* must sign extend top 32 bits */
- SLL(r0, r0, 0);
+ bswapr_ui(r0, r0);
CLZ_R6(r0, r0);
#else
DBITSWAP(r0, r1);
+ bswapr_ul(r0, r0);
DCLZ_R6(r0, r0);
#endif
}
else {
- //fallback_ctz(r0, r1);
bitswap(r0, r1);
clzr(r0, r0);
}
@@ -1358,11 +1416,15 @@ _rsbi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
static void
_mulr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
- if (jit_mips2_p() && __WORDSIZE == 32)
- MUL(r0, r1, r2);
+ if (jit_mips6_p())
+ mul_r6(r0, r1, r2);
else {
- multu(r1, r2);
- MFLO(r0);
+ if (jit_mips2_p() && __WORDSIZE == 32)
+ MUL(r0, r1, r2);
+ else {
+ multu(r1, r2);
+ MFLO(r0);
+ }
}
}
@@ -1381,12 +1443,38 @@ static void
_iqmulr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
jit_int32_t r2, jit_int32_t r3, jit_bool_t sign)
{
- if (sign)
- mult(r2, r3);
- else
- multu(r2, r3);
- MFLO(r0);
- MFHI(r1);
+ jit_int32_t t0;
+ if (jit_mips6_p()) {
+ if (r0 == r2 || r0 == r3) {
+ t0 = jit_get_reg(jit_class_gpr);
+ if (sign)
+ mul_r6(rn(t0), r2, r3);
+ else
+ mulu_r6(rn(t0), r2, r3);
+ }
+ else {
+ if (sign)
+ mul_r6(r0, r2, r3);
+ else
+ mulu_r6(r0, r2, r3);
+ }
+ if (sign)
+ muh_r6(r1, r2, r3);
+ else
+ muhu_r6(r1, r2, r3);
+ if (r0 == r2 || r0 == r3) {
+ movr(r0, rn(t0));
+ jit_unget_reg(t0);
+ }
+ }
+ else {
+ if (sign)
+ mult(r2, r3);
+ else
+ multu(r2, r3);
+ MFLO(r0);
+ MFHI(r1);
+ }
}
static void
@@ -1403,8 +1491,12 @@ _iqmuli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
static void
_divr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
- div(r1, r2);
- MFLO(r0);
+ if (jit_mips6_p())
+ div_r6(r0, r1, r2);
+ else {
+ div(r1, r2);
+ MFLO(r0);
+ }
}
static void
@@ -1420,8 +1512,12 @@ _divi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
static void
_divr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
- divu(r1, r2);
- MFLO(r0);
+ if (jit_mips6_p())
+ divu_r6(r0, r1, r2);
+ else {
+ divu(r1, r2);
+ MFLO(r0);
+ }
}
static void
@@ -1438,12 +1534,39 @@ static void
_iqdivr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
jit_int32_t r2, jit_int32_t r3, jit_bool_t sign)
{
- if (sign)
- div(r2, r3);
- else
- divu(r2, r3);
- MFLO(r0);
- MFHI(r1);
+ jit_int32_t t0;
+ if (jit_mips6_p()) {
+ if (r0 == r2 || r0 == r3)
+ t0 = jit_get_reg(jit_class_gpr);
+ else
+ t0 = _NOREG;
+ if (sign) {
+ if (t0 == _NOREG)
+ div_r6(r0, r2, r3);
+ else
+ div_r6(rn(t0), r2, r3);
+ mod_r6(r1, r2, r3);
+ }
+ else {
+ if (t0 == _NOREG)
+ divu_r6(r0, r2, r3);
+ else
+ divu_r6(rn(t0), r2, r3);
+ modu_r6(r1, r2, r3);
+ }
+ if (t0 != _NOREG) {
+ movr(r0, rn(t0));
+ jit_unget_reg(t0);
+ }
+ }
+ else {
+ if (sign)
+ div(r2, r3);
+ else
+ divu(r2, r3);
+ MFLO(r0);
+ MFHI(r1);
+ }
}
static void
@@ -1460,8 +1583,12 @@ _iqdivi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
static void
_remr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
- div(r1, r2);
- MFHI(r0);
+ if (jit_mips6_p())
+ mod_r6(r0, r1, r2);
+ else {
+ div(r1, r2);
+ MFHI(r0);
+ }
}
static void
@@ -1477,8 +1604,12 @@ _remi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
static void
_remr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
- divu(r1, r2);
- MFHI(r0);
+ if (jit_mips6_p())
+ modu_r6(r0, r1, r2);
+ else {
+ divu(r1, r2);
+ MFHI(r0);
+ }
}
static void
@@ -1650,6 +1781,36 @@ _movi_p(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
}
static void
+_movnr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
+{
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_gpr);
+ SELNEZ(rn(reg), r1, r2);
+ SELEQZ(r0, r0, r2);
+ OR(r0, r0, rn(reg));
+ jit_unget_reg(reg);
+ }
+ else
+ MOVN(r0, r1, r2);
+}
+
+static void
+_movzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
+{
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_gpr);
+ SELEQZ(rn(reg), r1, r2);
+ SELNEZ(r0, r0, r2);
+ OR(r0, r0, rn(reg));
+ jit_unget_reg(reg);
+ }
+ else
+ MOVZ(r0, r1, r2);
+}
+
+static void
_casx(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
jit_int32_t r2, jit_int32_t r3, jit_word_t i0)
{
@@ -1664,9 +1825,11 @@ _casx(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
/* retry: */
retry = _jit->pc.w;
# if __WORDSIZE == 32
- LL(r0, 0, r1);
+ if (jit_mips6_p()) LL_R6(r0, 0, r1);
+ else LL(r0, 0, r1);
# else
- LLD(r0, 0, r1);
+ if (jit_mips6_p()) LLD_R6(r0, 0, r1);
+ else LLD(r0, 0, r1);
# endif
jump0 = _jit->pc.w;
BNE(r0, r2, 1); /* bne done r0 r2 */
@@ -1674,9 +1837,11 @@ _casx(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
movr(r0, r3); /* after jump and delay slot */
/* store new value */
# if __WORDSIZE == 32
- SC(r0, 0, r1);
+ if (jit_mips6_p()) SC_R6(r0, 0, r1);
+ else SC(r0, 0, r1);
# else
- SCD(r0, 0, r1);
+ if (jit_mips6_p()) SCD_R6(r0, 0, r1);
+ else SCD(r0, 0, r1);
# endif
jump1 = _jit->pc.w;
BEQ(r0, _ZERO_REGNO, 0); /* beqi retry r0 0 */
@@ -2329,7 +2494,7 @@ static jit_bool_t _can_swap_ds(jit_state_t *_jit, jit_node_t *prev,
{
jit_int32_t offset;
- if (!prev)
+ if (jit_mips6_p() || !prev)
return 0;
switch (prev->code) {
@@ -2855,7 +3020,7 @@ _boaddr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
addr(rn(t1), r0, r1); /* t1 = r0 + r1 */
SLT(rn(t2), rn(t1), r0); /* t2 = t1 < r0 */
SLT(rn(t1), r0, rn(t1)); /* t1 = r0 < t1 */
- MOVZ(rn(t1), rn(t2), rn(t0)); /* if (r0 == 0) t1 = t2 */
+ movzr(rn(t1), rn(t2), rn(t0)); /* if (r0 == 0) t1 = t2 */
w = _jit->pc.w;
BNE(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
/* delay slot */
@@ -2883,7 +3048,7 @@ _boaddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
addiu(rn(t1), r0, i1);
SLT(rn(t2), r0, rn(t1));
SLT(rn(t1), rn(t1), r0);
- MOVZ(rn(t1), rn(t2), rn(t0));
+ movzr(rn(t1), rn(t2), rn(t0));
w = _jit->pc.w;
BNE(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
/* delay slot */
@@ -2965,7 +3130,7 @@ _bxaddr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
addr(rn(t1), r0, r1); /* t1 = r0 + r1 */
SLT(rn(t2), rn(t1), r0); /* t2 = t1 < r0 */
SLT(rn(t1), r0, rn(t1)); /* t1 = r0 < t1 */
- MOVZ(rn(t1), rn(t2), rn(t0)); /* if (r0 == 0) t1 = t2 */
+ movzr(rn(t1), rn(t2), rn(t0)); /* if (r0 == 0) t1 = t2 */
w = _jit->pc.w;
BEQ(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
/* delay slot */
@@ -2993,7 +3158,7 @@ _bxaddi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
addiu(rn(t1), r0, i1);
SLT(rn(t2), r0, rn(t1));
SLT(rn(t1), rn(t1), r0);
- MOVZ(rn(t1), rn(t2), rn(t0));
+ movzr(rn(t1), rn(t2), rn(t0));
w = _jit->pc.w;
BEQ(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
/* delay slot */
@@ -3075,7 +3240,7 @@ _bosubr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
subr(rn(t1), r0, r1); /* t1 = r0 - r1 */
SLT(rn(t2), rn(t1), r0); /* t2 = t1 < r0 */
SLT(rn(t1), r0, rn(t1)); /* t1 = r0 < t1 */
- MOVZ(rn(t1), rn(t2), rn(t0)); /* if (r0 == 0) t1 = t2 */
+ movzr(rn(t1), rn(t2), rn(t0)); /* if (r0 == 0) t1 = t2 */
w = _jit->pc.w;
BNE(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
/* delay slot */
@@ -3103,7 +3268,7 @@ _bosubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
addiu(rn(t1), r0, -i1);
SLT(rn(t2), rn(t1), r0);
SLT(rn(t1), r0, rn(t1));
- MOVZ(rn(t1), rn(t2), rn(t0));
+ movzr(rn(t1), rn(t2), rn(t0));
w = _jit->pc.w;
BNE(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
/* delay slot */
@@ -3185,7 +3350,7 @@ _bxsubr(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
subr(rn(t1), r0, r1); /* t1 = r0 - r1 */
SLT(rn(t2), rn(t1), r0); /* t2 = t1 < r0 */
SLT(rn(t1), r0, rn(t1)); /* t1 = r0 < t1 */
- MOVZ(rn(t1), rn(t2), rn(t0)); /* if (t0 == 0) t1 = t2 */
+ movzr(rn(t1), rn(t2), rn(t0)); /* if (t0 == 0) t1 = t2 */
w = _jit->pc.w;
BEQ(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
/* delay slot */
@@ -3213,7 +3378,7 @@ _bxsubi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
addiu(rn(t1), r0, -i1);
SLT(rn(t2), rn(t1), r0);
SLT(rn(t1), r0, rn(t1));
- MOVZ(rn(t1), rn(t2), rn(t0));
+ movzr(rn(t1), rn(t2), rn(t0));
w = _jit->pc.w;
BEQ(rn(t1), _ZERO_REGNO, ((i0 - w) >> 2) - 1);
/* delay slot */
@@ -3375,12 +3540,12 @@ _calli(jit_state_t *_jit, jit_word_t i0, jit_node_t *prev, jit_bool_t patch)
if (patch && swap_ds) {
op = *--_jit->pc.ui;
w -= sizeof(jit_int32_t);
- BGEZAL(_ZERO_REGNO, disp);
+ BGEZAL(_ZERO_REGNO, disp); /* Renamed to BAL in mips release 6 */
ii(op);
goto done;
}
if (patch || can_sign_extend_short_p(disp)) {
- BGEZAL(_ZERO_REGNO, disp);
+ BGEZAL(_ZERO_REGNO, disp); /* Renamed to BAL in mips release 6 */
NOP(1);
goto done;
}
@@ -3656,16 +3821,31 @@ _patch_at(jit_state_t *_jit, jit_word_t instr, jit_word_t label)
break;
case MIPS_COP1: case MIPS_COP2:
- assert(i.rs.b == MIPS_BC);
- switch (i.rt.b) {
- case MIPS_BCF: case MIPS_BCFL:
- case MIPS_BCT: case MIPS_BCTL:
- i.is.b = ((label - instr) >> 2) - 1;
- u.i[0] = i.op;
- break;
- default:
- assert(!"unhandled branch opcode");
- break;
+ if (jit_mips6_p()) {
+ switch (i.rs.b) {
+ case MIPS_BC1EQZ: case MIPS_BC1NEZ:
+ assert(jit_mips6_p());
+ i.is.b = ((label - instr) >> 2) - 1;
+ u.i[0] = i.op;
+ break;
+ default:
+ assert(!"unhandled branch opcode");
+ break;
+ }
+ }
+ else {
+ assert(i.rs.b == MIPS_BC);
+ switch (i.rt.b) {
+ case MIPS_BCF: case MIPS_BCFL:
+ case MIPS_BCT: case MIPS_BCTL:
+ assert(!jit_mips6_p());
+ i.is.b = ((label - instr) >> 2) - 1;
+ u.i[0] = i.op;
+ break;
+ default:
+ assert(!"unhandled branch opcode");
+ break;
+ }
}
break;
diff --git a/lib/jit_mips-fpu.c b/lib/jit_mips-fpu.c
index 8bff202..6681ba4 100644
--- a/lib/jit_mips-fpu.c
+++ b/lib/jit_mips-fpu.c
@@ -27,6 +27,8 @@
# define MIPS_fmt_PS 0x16 /* 2 x float32 */
# define MIPS_fmt_S_PU 0x20
# define MIPS_fmt_S_PL 0x26
+# define MIPS_condn_S 0x14 /* release 6 */
+# define MIPS_condn_D 0x15 /* release 6 */
# define MIPS_ADD_fmt 0x00
# define MIPS_LWXC1 0x00
# define MIPS_SUB_fmt 0x01
@@ -88,6 +90,23 @@
# define MIPS_cond_NGE 0x3d
# define MIPS_cond_LE 0x3e
# define MIPS_cond_UGT 0x3f
+/* Mips release 6 */
+# define MIPS_cmp_AF 0x00
+# define MIPS_cmp_UN 0x01
+# define MIPS_cmp_EQ 0x02
+# define MIPS_cmp_UEQ 0x03
+# define MIPS_cmp_LT 0x04
+# define MIPS_cmp_ULT 0x05
+# define MIPS_cmp_LE 0x06
+# define MIPS_cmp_ULE 0x07
+# define MIPS_cmp_SAF 0x08
+# define MIPS_cmp_SUN 0x09
+# define MIPS_cmp_SEQ 0x0a
+# define MIPS_cmp_SUEQ 0x0b
+# define MIPS_cmp_SLT 0x0c
+# define MIPS_cmp_SULT 0x0d
+# define MIPS_cmp_SLE 0x0e
+# define MIPS_cmp_SULE 0x0f
# define ADD_S(fd,fs,ft) hrrrit(MIPS_COP1,MIPS_fmt_S,ft,fs,fd,MIPS_ADD_fmt)
# define ADD_D(fd,fs,ft) hrrrit(MIPS_COP1,MIPS_fmt_D,ft,fs,fd,MIPS_ADD_fmt)
# define SUB_S(fd,fs,ft) hrrrit(MIPS_COP1,MIPS_fmt_S,ft,fs,fd,MIPS_SUB_fmt)
@@ -103,7 +122,9 @@
# define SQRT_S(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_S,0,fs,fd,MIPS_SQRT_fmt)
# define SQRT_D(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_D,0,fs,fd,MIPS_SQRT_fmt)
# define MFC1(rt, fs) hrrrit(MIPS_COP1,MIPS_MF,rt,fs,0,0)
+# define MFHC1(rt, fs) hrrrit(MIPS_COP1,MIPS_MFH,rt,fs,0,0)
# define MTC1(rt, fs) hrrrit(MIPS_COP1,MIPS_MT,rt,fs,0,0)
+# define MTHC1(rt, fs) hrrrit(MIPS_COP1,MIPS_MTH,rt,fs,0,0)
# define DMFC1(rt, fs) hrrrit(MIPS_COP1,MIPS_DMF,rt,fs,0,0)
# define DMTC1(rt, fs) hrrrit(MIPS_COP1,MIPS_DMT,rt,fs,0,0)
# define CVT_D_S(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_S,0,fs,fd,MIPS_CVT_fmt_D)
@@ -130,7 +151,9 @@
# define MOV_S(fd, fs) hrrrit(MIPS_COP1,MIPS_fmt_S,0,fs,fd,MIPS_MOV_fmt)
# define MOV_D(fd, fs) hrrrit(MIPS_COP1,MIPS_fmt_D,0,fs,fd,MIPS_MOV_fmt)
# define BC1F(im) hrri(MIPS_COP1,MIPS_BC,MIPS_BCF,im)
+# define BC1EQZ(ft,im) hrri(MIPS_COP1,MIPS_BC1EQZ,ft,im)
# define BC1T(im) hrri(MIPS_COP1,MIPS_BC,MIPS_BCT,im)
+# define BC1NEZ(ft,im) hrri(MIPS_COP1,MIPS_BC1NEZ,ft,im)
# define C_F_S(fs,ft) c_cond_fmt(MIPS_fmt_S,ft,fs,MIPS_cond_F)
# define C_F_D(fs,ft) c_cond_fmt(MIPS_fmt_D,ft,fs,MIPS_cond_F)
# define C_F_PS(fs,ft) c_cond_fmt(MIPS_fmt_PS,ft,fs,MIPS_cond_F)
@@ -183,6 +206,42 @@
static void
_c_cond_fmt(jit_state_t *_jit, jit_int32_t fm,
jit_int32_t ft, jit_int32_t fs, jit_int32_t cc);
+# define CMP_AF_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_AF)
+# define CMP_AF_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_AF)
+# define CMP_UN_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_UN)
+# define CMP_UN_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_UN)
+# define CMP_EQ_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_EQ)
+# define CMP_EQ_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_EQ)
+# define CMP_UEQ_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_UEQ)
+# define CMP_UEQ_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_UEQ)
+# define CMP_LT_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_LT)
+# define CMP_LT_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_LT)
+# define CMP_ULT_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_ULT)
+# define CMP_ULT_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_ULT)
+# define CMP_LE_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_LE)
+# define CMP_LE_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_LE)
+# define CMP_ULE_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_ULE)
+# define CMP_ULE_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_ULE)
+# define CMP_SAF_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_SAF)
+# define CMP_SAF_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_SAF)
+# define CMP_SUN_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_SUN)
+# define CMP_SUN_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_SUN)
+# define CMP_SEQ_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_SEQ)
+# define CMP_SEQ_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_SEQ)
+# define CMP_SUEQ_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_SUEQ)
+# define CMP_SUEQ_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_SUEQ)
+# define CMP_SLT_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_SLT)
+# define CMP_SLT_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_SLT)
+# define CMP_SULT_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_SULT)
+# define CMP_SULT_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_SULT)
+# define CMP_SLE_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_SLE)
+# define CMP_SLE_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_SLE)
+# define CMP_SULE_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_SULE)
+# define CMP_SULE_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_SULE)
+# define cmp_cond_fmt(fm,fd,ft,fs,cn) _cmp_cond_fmt(_jit,fm,fd,ft,fs,cn)
+static void
+_cmp_cond_fmt(jit_state_t *_jit, jit_int32_t fm, jit_int32_t fd,
+ jit_int32_t ft, jit_int32_t fs, jit_int32_t cn);
# define addr_f(r0,r1,r2) ADD_S(r0,r1,r2)
# define addi_f(r0,r1,i0) _addi_f(_jit,r0,r1,i0)
static void _addi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
@@ -568,6 +627,20 @@ _c_cond_fmt(jit_state_t *_jit, jit_int32_t fm,
ii(i.op);
}
+static void
+_cmp_cond_fmt(jit_state_t *_jit, jit_int32_t fm, jit_int32_t fd,
+ jit_int32_t ft, jit_int32_t fs, jit_int32_t cn)
+{
+ jit_instr_t i;
+ i.cn.b = cn;
+ i.ft.b = ft;
+ i.fs.b = fs;
+ i.fd.b = fd;
+ i.fm.b = fm;
+ i.hc.b = MIPS_COP1;
+ ii(i.op);
+}
+
# define fpr_opi(name, type, size) \
static void \
_##name##i_##type(jit_state_t *_jit, \
@@ -829,16 +902,28 @@ static void
_movr_ww_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
assert(r1 == r2 - 1);
- MTC1(r1, r0 + BE_P);
- MTC1(r2, r0 + LE_P);
+ if (jit_mips6_p()) {
+ MTC1(r1, r0);
+ MTHC1(r2, r0);
+ }
+ else {
+ MTC1(r1, r0 + BE_P);
+ MTC1(r2, r0 + LE_P);
+ }
}
static void
_movr_d_ww(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
assert(r0 == r1 - 1);
- MFC1(r0, r2 + BE_P);
- MFC1(r1, r2 + LE_P);
+ if (jit_mips6_p()) {
+ MFC1(r0, r2);
+ MFHC1(r1, r2);
+ }
+ else {
+ MFC1(r0, r2 + BE_P);
+ MFC1(r1, r2 + LE_P);
+ }
}
static void
@@ -896,40 +981,40 @@ _truncr_d_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
static void
_ldr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
-# if __WORDSIZE == 64 || NEW_ABI
- LDC1(r0, 0, r1);
-# else
- LWC1(r0 + BE_P, 0, r1);
- LWC1(r0 + LE_P, 4, r1);
-# endif
+ if (jit_mips6_p() || __WORDSIZE == 64 || NEW_ABI)
+ LDC1(r0, 0, r1);
+ else {
+ LWC1(r0 + BE_P, 0, r1);
+ LWC1(r0 + LE_P, 4, r1);
+ }
}
static void
_ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
jit_int32_t reg;
-# if __WORDSIZE == 64 || NEW_ABI
- if (can_sign_extend_short_p(i0))
- LDC1(r0, i0, _ZERO_REGNO);
- else {
- reg = jit_get_reg(jit_class_gpr);
- movi(rn(reg), i0);
- LDC1(r0, 0, rn(reg));
- jit_unget_reg(reg);
- }
-# else
- if (can_sign_extend_short_p(i0) && can_sign_extend_short_p(i0 + 4)) {
- LWC1(r0 + BE_P, i0, _ZERO_REGNO);
- LWC1(r0 + LE_P, i0 + 4, _ZERO_REGNO);
+ if (jit_mips6_p() || __WORDSIZE == 64 || NEW_ABI) {
+ if (can_sign_extend_short_p(i0))
+ LDC1(r0, i0, _ZERO_REGNO);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ LDC1(r0, 0, rn(reg));
+ jit_unget_reg(reg);
+ }
}
else {
- reg = jit_get_reg(jit_class_gpr);
- movi(rn(reg), i0);
- LWC1(r0 + BE_P, 0, rn(reg));
- LWC1(r0 + LE_P, 4, rn(reg));
- jit_unget_reg(reg);
+ if (can_sign_extend_short_p(i0) && can_sign_extend_short_p(i0 + 4)) {
+ LWC1(r0 + BE_P, i0, _ZERO_REGNO);
+ LWC1(r0 + LE_P, i0 + 4, _ZERO_REGNO);
+ }
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ ldr_d(r0, rn(reg));
+ jit_unget_reg(reg);
+ }
}
-# endif
}
static void
@@ -946,52 +1031,60 @@ static void
_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
-# if __WORDSIZE == 64 || NEW_ABI
- if (can_sign_extend_short_p(i0))
- LDC1(r0, i0, r1);
-# else
- if (can_sign_extend_short_p(i0) && can_sign_extend_short_p(i0 + 4)) {
- LWC1(r0 + BE_P, i0, r1);
- LWC1(r0 + LE_P, i0 + 4, r1);
+ if (jit_mips6_p() || __WORDSIZE == 64 || NEW_ABI) {
+ if (can_sign_extend_short_p(i0))
+ LDC1(r0, i0, r1);
+ else
+ goto fallback;
}
-# endif
else {
- reg = jit_get_reg(jit_class_gpr);
- addi(rn(reg), r1, i0);
- ldr_d(r0, rn(reg));
- jit_unget_reg(reg);
+ if (can_sign_extend_short_p(i0) && can_sign_extend_short_p(i0 + 4)) {
+ LWC1(r0 + BE_P, i0, r1);
+ LWC1(r0 + LE_P, i0 + 4, r1);
+ }
+ else {
+ fallback:
+ reg = jit_get_reg(jit_class_gpr);
+ addi(rn(reg), r1, i0);
+ ldr_d(r0, rn(reg));
+ jit_unget_reg(reg);
+ }
}
}
static void
_str_d(jit_state_t *_jit,jit_int32_t r0, jit_int32_t r1)
{
-# if __WORDSIZE == 64 || NEW_ABI
- SDC1(r1, 0, r0);
-# else
- SWC1(r1 + BE_P, 0, r0);
- SWC1(r1 + LE_P, 4, r0);
-# endif
+ if (jit_mips6_p() || __WORDSIZE == 64 || NEW_ABI)
+ SDC1(r1, 0, r0);
+ else {
+ SWC1(r1 + BE_P, 0, r0);
+ SWC1(r1 + LE_P, 4, r0);
+ }
}
static void
_sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
{
jit_int32_t reg;
-# if __WORDSIZE == 64 || NEW_ABI
- if (can_sign_extend_short_p(i0))
- SDC1(r0, i0, _ZERO_REGNO);
-# else
- if (can_sign_extend_short_p(i0) && can_sign_extend_short_p(i0 + 4)) {
- SWC1(r0 + BE_P, i0, _ZERO_REGNO);
- SWC1(r0 + LE_P, i0 + 4, _ZERO_REGNO);
+ if (jit_mips6_p() || __WORDSIZE == 64 || NEW_ABI) {
+ if (can_sign_extend_short_p(i0))
+ SDC1(r0, i0, _ZERO_REGNO);
+ else
+ goto fallback;
}
-# endif
else {
- reg = jit_get_reg(jit_class_gpr);
- movi(rn(reg), i0);
- str_d(rn(reg), r0);
- jit_unget_reg(reg);
+ if (can_sign_extend_short_p(i0) && can_sign_extend_short_p(i0 + 4)) {
+ SWC1(r0 + BE_P, i0, _ZERO_REGNO);
+ SWC1(r0 + LE_P, i0 + 4, _ZERO_REGNO);
+ }
+ else {
+ fallback:
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ str_d(rn(reg), r0);
+ jit_unget_reg(reg);
+ }
}
}
@@ -1009,20 +1102,24 @@ static void
_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
{
jit_int32_t reg;
-# if __WORDSIZE == 64 || NEW_ABI
- if (can_sign_extend_short_p(i0))
- SDC1(r1, i0, r0);
-# else
- if (can_sign_extend_short_p(i0) && can_sign_extend_short_p(i0 + 4)) {
- SWC1(r1 + BE_P, i0, r0);
- SWC1(r1 + LE_P, i0 + 4, r0);
+ if (jit_mips6_p() || __WORDSIZE == 64 || NEW_ABI) {
+ if (can_sign_extend_short_p(i0))
+ SDC1(r1, i0, r0);
+ else
+ goto fallback;
}
-# endif
else {
- reg = jit_get_reg(jit_class_gpr);
- addi(rn(reg), r0, i0);
- str_d(rn(reg), r1);
- jit_unget_reg(reg);
+ if (can_sign_extend_short_p(i0) && can_sign_extend_short_p(i0 + 4)) {
+ SWC1(r1 + BE_P, i0, r0);
+ SWC1(r1 + LE_P, i0 + 4, r0);
+ }
+ else {
+ fallback:
+ reg = jit_get_reg(jit_class_gpr);
+ addi(rn(reg), r0, i0);
+ str_d(rn(reg), r1);
+ jit_unget_reg(reg);
+ }
}
}
@@ -1058,30 +1155,49 @@ _movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t *i0)
else
DMTC1(_ZERO_REGNO, r0);
# else
- if (_jitc->no_data)
- reg = jit_get_reg(jit_class_gpr);
- if (data.i[0]) {
+ if (jit_mips6_p()) {
if (_jitc->no_data) {
- movi(rn(reg), data.i[0]);
- MTC1(rn(reg), r0 + BE_P);
+ reg = jit_get_reg(jit_class_gpr);
+# if __WORDSIZE == 64
+ movi(rn(reg), data.l);
+ DMTC1(rn(reg), r0);
+# else
+ movi(rn(reg), data.i[0 + BE_P]);
+ MTC1(rn(reg), r0);
+ movi(rn(reg), data.i[0 + LE_P]);
+ MTHC1(rn(reg), r0);
+# endif
+ jit_unget_reg(reg);
}
else
- ldi_f(r0 + BE_P, (jit_word_t)i0);
+ ldi_d(r0, (jit_word_t)i0);
}
- else
- MTC1(_ZERO_REGNO, r0 + BE_P);
- if (data.i[1]) {
- if (_jitc->no_data) {
- movi(rn(reg), data.i[1]);
- MTC1(rn(reg), r0 + LE_P);
+ else {
+ if (_jitc->no_data)
+ reg = jit_get_reg(jit_class_gpr);
+ if (data.i[0]) {
+ if (_jitc->no_data) {
+ movi(rn(reg), data.i[0]);
+ MTC1(rn(reg), r0 + BE_P);
+ }
+ else
+ ldi_f(r0 + BE_P, (jit_word_t)i0);
}
else
- ldi_f(r0 + LE_P, ((jit_word_t)i0) + 4);
+ MTC1(_ZERO_REGNO, r0 + BE_P);
+ if (data.i[1]) {
+ if (_jitc->no_data) {
+ movi(rn(reg), data.i[1]);
+ MTC1(rn(reg), r0 + LE_P);
+ }
+ else
+ ldi_f(r0 + LE_P, ((jit_word_t)i0) + 4);
+ }
+ else
+ MTC1(_ZERO_REGNO, r0 + LE_P);
+ if (_jitc->no_data)
+ jit_unget_reg(reg);
}
- else
- MTC1(_ZERO_REGNO, r0 + LE_P);
- if (_jitc->no_data)
- jit_unget_reg(reg);
# endif
}
@@ -1089,13 +1205,23 @@ static void
_ltr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_OLT_S(r1, r2);
- w = _jit->pc.w;
- BC1T(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_LT_S(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ andi(r0, r0, 1);
+ }
+ else {
+ C_OLT_S(r1, r2);
+ w = _jit->pc.w;
+ BC1T(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
fopi(lt)
@@ -1103,13 +1229,23 @@ static void
_ler_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_OLE_S(r1, r2);
- w = _jit->pc.w;
- BC1T(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_LE_S(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ andi(r0, r0, 1);
+ }
+ else {
+ C_OLE_S(r1, r2);
+ w = _jit->pc.w;
+ BC1T(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
fopi(le)
@@ -1117,13 +1253,23 @@ static void
_eqr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_EQ_S(r1, r2);
- w = _jit->pc.w;
- BC1T(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_EQ_S(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ andi(r0, r0, 1);
+ }
+ else {
+ C_EQ_S(r1, r2);
+ w = _jit->pc.w;
+ BC1T(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
fopi(eq)
@@ -1131,13 +1277,23 @@ static void
_ger_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_ULT_S(r1, r2);
- w = _jit->pc.w;
- BC1F(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_ULT_S(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ addi(r0, r0, 1);
+ }
+ else {
+ C_ULT_S(r1, r2);
+ w = _jit->pc.w;
+ BC1F(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
fopi(ge)
@@ -1145,27 +1301,47 @@ static void
_gtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_ULE_S(r1, r2);
- w = _jit->pc.w;
- BC1F(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
-}
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_ULE_S(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ addi(r0, r0, 1);
+ }
+ else {
+ C_ULE_S(r1, r2);
+ w = _jit->pc.w;
+ BC1F(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
+ }
fopi(gt)
static void
_ner_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_EQ_S(r1, r2);
- w = _jit->pc.w;
- BC1F(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_EQ_S(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ addi(r0, r0, 1);
+ }
+ else {
+ C_EQ_S(r1, r2);
+ w = _jit->pc.w;
+ BC1F(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
fopi(ne)
@@ -1173,13 +1349,23 @@ static void
_unltr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_ULT_S(r1, r2);
- w = _jit->pc.w;
- BC1T(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_ULT_S(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ andi(r0, r0, 1);
+ }
+ else {
+ C_ULT_S(r1, r2);
+ w = _jit->pc.w;
+ BC1T(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
fopi(unlt)
@@ -1187,13 +1373,22 @@ static void
_unler_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_ULE_S(r1, r2);
- w = _jit->pc.w;
- BC1T(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_ULE_S(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ andi(r0, r0, 1);
+ }
+ else {
+ C_ULE_S(r1, r2);
+ BC1T(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
fopi(unle)
@@ -1201,13 +1396,23 @@ static void
_uneqr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_UEQ_S(r1, r2);
- w = _jit->pc.w;
- BC1T(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_UEQ_S(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ andi(r0, r0, 1);
+ }
+ else {
+ C_UEQ_S(r1, r2);
+ w = _jit->pc.w;
+ BC1T(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
fopi(uneq)
@@ -1215,13 +1420,23 @@ static void
_unger_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_OLT_S(r1, r2);
- w = _jit->pc.w;
- BC1F(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_LT_S(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ addi(r0, r0, 1);
+ }
+ else {
+ C_OLT_S(r1, r2);
+ w = _jit->pc.w;
+ BC1F(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
fopi(unge)
@@ -1229,13 +1444,23 @@ static void
_ungtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_OLE_S(r1, r2);
- w = _jit->pc.w;
- BC1F(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_LE_S(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ addi(r0, r0, 1);
+ }
+ else {
+ C_OLE_S(r1, r2);
+ w = _jit->pc.w;
+ BC1F(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
fopi(ungt)
@@ -1243,13 +1468,23 @@ static void
_ltgtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_UEQ_S(r1, r2);
- w = _jit->pc.w;
- BC1F(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_UEQ_S(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ addi(r0, r0, 1);
+ }
+ else {
+ C_UEQ_S(r1, r2);
+ w = _jit->pc.w;
+ BC1F(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
fopi(ltgt)
@@ -1257,13 +1492,23 @@ static void
_ordr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_UN_S(r1, r2);
- w = _jit->pc.w;
- BC1F(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_UN_S(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ addi(r0, r0, 1);
+ }
+ else {
+ C_UN_S(r1, r2);
+ w = _jit->pc.w;
+ BC1F(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
fopi(ord)
@@ -1271,13 +1516,23 @@ static void
_unordr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_UN_S(r1, r2);
- w = _jit->pc.w;
- BC1T(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_UN_S(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ andi(r0, r0, 1);
+ }
+ else {
+ C_UN_S(r1, r2);
+ w = _jit->pc.w;
+ BC1T(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
fopi(unord)
@@ -1285,9 +1540,19 @@ static jit_word_t
_bltr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_OLT_S(r1, r2);
- w = _jit->pc.w;
- BC1T(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_LT_S(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_OLT_S(r1, r2);
+ w = _jit->pc.w;
+ BC1T(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1297,9 +1562,19 @@ static jit_word_t
_bler_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_OLE_S(r1, r2);
- w = _jit->pc.w;
- BC1T(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_LE_S(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_OLE_S(r1, r2);
+ w = _jit->pc.w;
+ BC1T(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1309,9 +1584,19 @@ static jit_word_t
_beqr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_EQ_S(r1, r2);
- w = _jit->pc.w;
- BC1T(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_EQ_S(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_EQ_S(r1, r2);
+ w = _jit->pc.w;
+ BC1T(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1321,9 +1606,19 @@ static jit_word_t
_bger_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_ULT_S(r1, r2);
- w = _jit->pc.w;
- BC1F(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_ULT_S(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_ULT_S(r1, r2);
+ w = _jit->pc.w;
+ BC1F(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1333,9 +1628,19 @@ static jit_word_t
_bgtr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_ULE_S(r1, r2);
- w = _jit->pc.w;
- BC1F(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_ULE_S(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_ULE_S(r1, r2);
+ w = _jit->pc.w;
+ BC1F(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1345,9 +1650,19 @@ static jit_word_t
_bner_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_EQ_S(r1, r2);
- w = _jit->pc.w;
- BC1F(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_EQ_S(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_EQ_S(r1, r2);
+ w = _jit->pc.w;
+ BC1F(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1357,9 +1672,19 @@ static jit_word_t
_bunltr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_ULT_S(r1, r2);
- w = _jit->pc.w;
- BC1T(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_ULT_S(rn(reg), r1, r2);
+ jit_unget_reg(reg);
+ w = _jit->pc.w;
+ BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
+ }
+ else {
+ C_ULT_S(r1, r2);
+ w = _jit->pc.w;
+ BC1T(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1369,9 +1694,19 @@ static jit_word_t
_bunler_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_ULE_S(r1, r2);
- w = _jit->pc.w;
- BC1T(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_ULE_S(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_ULE_S(r1, r2);
+ w = _jit->pc.w;
+ BC1T(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1381,9 +1716,19 @@ static jit_word_t
_buneqr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_UEQ_S(r1, r2);
- w = _jit->pc.w;
- BC1T(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_UEQ_S(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_UEQ_S(r1, r2);
+ w = _jit->pc.w;
+ BC1T(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1393,9 +1738,19 @@ static jit_word_t
_bunger_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_OLT_S(r1, r2);
- w = _jit->pc.w;
- BC1F(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_LT_S(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_OLT_S(r1, r2);
+ w = _jit->pc.w;
+ BC1F(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1405,9 +1760,19 @@ static jit_word_t
_bungtr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_OLE_S(r1, r2);
- w = _jit->pc.w;
- BC1F(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_LE_S(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_OLE_S(r1, r2);
+ w = _jit->pc.w;
+ BC1F(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1417,9 +1782,19 @@ static jit_word_t
_bltgtr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_UEQ_S(r1, r2);
- w = _jit->pc.w;
- BC1F(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_UEQ_S(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_UEQ_S(r1, r2);
+ w = _jit->pc.w;
+ BC1F(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1429,9 +1804,19 @@ static jit_word_t
_bordr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_UN_S(r1, r2);
- w = _jit->pc.w;
- BC1F(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_UN_S(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_UN_S(r1, r2);
+ w = _jit->pc.w;
+ BC1F(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1441,9 +1826,19 @@ static jit_word_t
_bunordr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_UN_S(r1, r2);
- w = _jit->pc.w;
- BC1T(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_UN_S(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_UN_S(r1, r2);
+ w = _jit->pc.w;
+ BC1T(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1453,13 +1848,23 @@ static void
_ltr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_OLT_D(r1, r2);
- w = _jit->pc.w;
- BC1T(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_LT_D(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ andi(r0, r0, 1);
+ }
+ else {
+ C_OLT_D(r1, r2);
+ w = _jit->pc.w;
+ BC1T(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
dopi(lt)
@@ -1467,13 +1872,23 @@ static void
_ler_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_OLE_D(r1, r2);
- w = _jit->pc.w;
- BC1T(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_LE_D(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ andi(r0, r0, 1);
+ }
+ else {
+ C_OLE_D(r1, r2);
+ w = _jit->pc.w;
+ BC1T(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
dopi(le)
@@ -1481,13 +1896,23 @@ static void
_eqr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_EQ_D(r1, r2);
- w = _jit->pc.w;
- BC1T(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_EQ_D(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ andi(r0, r0, 1);
+ }
+ else {
+ C_EQ_D(r1, r2);
+ w = _jit->pc.w;
+ BC1T(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
dopi(eq)
@@ -1495,13 +1920,23 @@ static void
_ger_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_ULT_D(r1, r2);
- w = _jit->pc.w;
- BC1F(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_ULT_D(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ addi(r0, r0, 1);
+ }
+ else {
+ C_ULT_D(r1, r2);
+ w = _jit->pc.w;
+ BC1F(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
dopi(ge)
@@ -1509,13 +1944,23 @@ static void
_gtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_ULE_D(r1, r2);
- w = _jit->pc.w;
- BC1F(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_ULE_D(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ addi(r0, r0, 1);
+ }
+ else {
+ C_ULE_D(r1, r2);
+ w = _jit->pc.w;
+ BC1F(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
dopi(gt)
@@ -1523,13 +1968,23 @@ static void
_ner_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_EQ_D(r1, r2);
- w = _jit->pc.w;
- BC1F(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_EQ_D(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ addi(r0, r0, 1);
+ }
+ else {
+ C_EQ_D(r1, r2);
+ w = _jit->pc.w;
+ BC1F(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
dopi(ne)
@@ -1537,13 +1992,23 @@ static void
_unltr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_ULT_D(r1, r2);
- w = _jit->pc.w;
- BC1T(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_ULT_D(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ andi(r0, r0, 1);
+ }
+ else {
+ C_ULT_D(r1, r2);
+ w = _jit->pc.w;
+ BC1T(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
dopi(unlt)
@@ -1551,13 +2016,23 @@ static void
_unler_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_ULE_D(r1, r2);
- w = _jit->pc.w;
- BC1T(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_ULE_D(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ andi(r0, r0, 1);
+ }
+ else {
+ C_ULE_D(r1, r2);
+ w = _jit->pc.w;
+ BC1T(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
dopi(unle)
@@ -1565,13 +2040,23 @@ static void
_uneqr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_UEQ_D(r1, r2);
- w = _jit->pc.w;
- BC1T(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_UEQ_D(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ andi(r0, r0, 1);
+ }
+ else {
+ C_UEQ_D(r1, r2);
+ w = _jit->pc.w;
+ BC1T(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
dopi(uneq)
@@ -1579,13 +2064,23 @@ static void
_unger_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_OLT_D(r1, r2);
- w = _jit->pc.w;
- BC1F(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_LT_D(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ addi(r0, r0, 1);
+ }
+ else {
+ C_OLT_D(r1, r2);
+ w = _jit->pc.w;
+ BC1F(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
dopi(unge)
@@ -1593,13 +2088,23 @@ static void
_ungtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_OLE_D(r1, r2);
- w = _jit->pc.w;
- BC1F(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_LE_D(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ addi(r0, r0, 1);
+ }
+ else {
+ C_OLE_D(r1, r2);
+ w = _jit->pc.w;
+ BC1F(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
dopi(ungt)
@@ -1607,13 +2112,23 @@ static void
_ltgtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_UEQ_D(r1, r2);
- w = _jit->pc.w;
- BC1F(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_UEQ_D(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ addi(r0, r0, 1);
+ }
+ else {
+ C_UEQ_D(r1, r2);
+ w = _jit->pc.w;
+ BC1F(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
dopi(ltgt)
@@ -1621,13 +2136,23 @@ static void
_ordr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_UN_D(r1, r2);
- w = _jit->pc.w;
- BC1F(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_UN_D(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ addi(r0, r0, 1);
+ }
+ else {
+ C_UN_D(r1, r2);
+ w = _jit->pc.w;
+ BC1F(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
dopi(ord)
@@ -1635,13 +2160,23 @@ static void
_unordr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_UN_D(r1, r2);
- w = _jit->pc.w;
- BC1T(0);
- /* delay slot */
- movi(r0, 1);
- movi(r0, 0);
- patch_at(w, _jit->pc.w);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr);
+ CMP_UN_D(rn(reg), r1, r2);
+ MFC1(r0, rn(reg));
+ jit_unget_reg(reg);
+ andi(r0, r0, 1);
+ }
+ else {
+ C_UN_D(r1, r2);
+ w = _jit->pc.w;
+ BC1T(0);
+ /* delay slot */
+ movi(r0, 1);
+ movi(r0, 0);
+ patch_at(w, _jit->pc.w);
+ }
}
dopi(unord)
@@ -1649,9 +2184,19 @@ static jit_word_t
_bltr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_OLT_D(r1, r2);
- w = _jit->pc.w;
- BC1T(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_LT_D(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_OLT_D(r1, r2);
+ w = _jit->pc.w;
+ BC1T(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1661,9 +2206,19 @@ static jit_word_t
_bler_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_OLE_D(r1, r2);
- w = _jit->pc.w;
- BC1T(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_LE_D(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_OLE_D(r1, r2);
+ w = _jit->pc.w;
+ BC1T(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1673,9 +2228,19 @@ static jit_word_t
_beqr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_EQ_D(r1, r2);
- w = _jit->pc.w;
- BC1T(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_EQ_D(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_EQ_D(r1, r2);
+ w = _jit->pc.w;
+ BC1T(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1685,9 +2250,19 @@ static jit_word_t
_bger_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_ULT_D(r1, r2);
- w = _jit->pc.w;
- BC1F(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_ULT_D(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_ULT_D(r1, r2);
+ w = _jit->pc.w;
+ BC1F(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1697,9 +2272,19 @@ static jit_word_t
_bgtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_ULE_D(r1, r2);
- w = _jit->pc.w;
- BC1F(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_ULE_D(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_ULE_D(r1, r2);
+ w = _jit->pc.w;
+ BC1F(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1709,9 +2294,19 @@ static jit_word_t
_bner_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_EQ_D(r1, r2);
- w = _jit->pc.w;
- BC1F(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_EQ_D(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_EQ_D(r1, r2);
+ w = _jit->pc.w;
+ BC1F(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1721,9 +2316,19 @@ static jit_word_t
_bunltr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_ULT_D(r1, r2);
- w = _jit->pc.w;
- BC1T(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_ULT_D(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_ULT_D(r1, r2);
+ w = _jit->pc.w;
+ BC1T(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1733,9 +2338,19 @@ static jit_word_t
_bunler_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_ULE_D(r1, r2);
- w = _jit->pc.w;
- BC1T(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_ULE_D(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_ULE_D(r1, r2);
+ w = _jit->pc.w;
+ BC1T(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1745,9 +2360,19 @@ static jit_word_t
_buneqr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_UEQ_D(r1, r2);
- w = _jit->pc.w;
- BC1T(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_UEQ_D(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_UEQ_D(r1, r2);
+ w = _jit->pc.w;
+ BC1T(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1757,9 +2382,19 @@ static jit_word_t
_bunger_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_OLT_D(r1, r2);
- w = _jit->pc.w;
- BC1F(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_LT_D(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_OLT_D(r1, r2);
+ w = _jit->pc.w;
+ BC1F(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1769,9 +2404,19 @@ static jit_word_t
_bungtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_OLE_D(r1, r2);
- w = _jit->pc.w;
- BC1F(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_LE_D(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_OLE_D(r1, r2);
+ w = _jit->pc.w;
+ BC1F(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1781,9 +2426,19 @@ static jit_word_t
_bltgtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_UEQ_D(r1, r2);
- w = _jit->pc.w;
- BC1F(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_UEQ_D(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_UEQ_D(r1, r2);
+ w = _jit->pc.w;
+ BC1F(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1793,9 +2448,19 @@ static jit_word_t
_bordr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_UN_D(r1, r2);
- w = _jit->pc.w;
- BC1F(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_UN_D(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_UN_D(r1, r2);
+ w = _jit->pc.w;
+ BC1F(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
@@ -1805,9 +2470,19 @@ static jit_word_t
_bunordr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
{
jit_word_t w;
- C_UN_D(r1, r2);
- w = _jit->pc.w;
- BC1T(((i0 - w) >> 2) - 1);
+ jit_int32_t reg;
+ if (jit_mips6_p()) {
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ CMP_UN_D(rn(reg), r1, r2);
+ w = _jit->pc.w;
+ BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
+ jit_unget_reg(reg);
+ }
+ else {
+ C_UN_D(r1, r2);
+ w = _jit->pc.w;
+ BC1T(((i0 - w) >> 2) - 1);
+ }
NOP(1);
return (w);
}
diff --git a/lib/jit_mips.c b/lib/jit_mips.c
index 0c50882..2f5d602 100644
--- a/lib/jit_mips.c
+++ b/lib/jit_mips.c
@@ -192,11 +192,13 @@ jit_get_cpu(void)
fclose(fp);
}
#endif
- /* This is very fragile -- with clang, __mips is defined as 64 */
-#if defined _MIPS_ARCH /* OpenBSD/clang */
+#if __mips_isa_rev
+ if (!jit_cpu.release)
+ jit_cpu.release = __mips_isa_rev;
+#elif defined _MIPS_ARCH
if (!jit_cpu.release)
jit_cpu.release = strtoul(&_MIPS_ARCH[4], NULL, 10);
-#elif defined(__mips) /* Linux/gcc */
+#elif defined(__mips) && __mips < 6
if (!jit_cpu.release)
jit_cpu.release = __mips;
#endif
generated by cgit v1.2.3 (git 2.39.1) at 2025年09月20日 10:03:15 +0000

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