mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-04 22:40:25 +02:00
S390: Add support for 32 bit.
* include/lightning.h, include/lightning/jit_private.h, include/lightning/jit_s390x.h, lib/jit_disasm.c, lib/jit_s390x-cpu.c, lib/jit_s390x-fpu.c, lib/jit_s390x-sz.c, lib/jit_s390x.c, lib/jit_size.c, lib/lightning.c: Add support for generating jit for s390 32 bit. This change also removed %f15 from the list of temporaries fpr registers; it was not being used, but if were, it would corrupt the stack frame because the spill address would overwrite grp offsets.
This commit is contained in:
parent
af9df5faeb
commit
32c4f90a2b
11 changed files with 876 additions and 173 deletions
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
||||||
|
2015-01-08 Paulo Andrade <pcpa@gnu.org>
|
||||||
|
|
||||||
|
* include/lightning.h, include/lightning/jit_private.h,
|
||||||
|
include/lightning/jit_s390x.h, lib/jit_disasm.c,
|
||||||
|
lib/jit_s390x-cpu.c, lib/jit_s390x-fpu.c, lib/jit_s390x-sz.c,
|
||||||
|
lib/jit_s390x.c, lib/jit_size.c, lib/lightning.c:
|
||||||
|
Add support for generating jit for s390 32 bit. This change
|
||||||
|
also removed %f15 from the list of temporaries fpr registers;
|
||||||
|
it was not being used, but if were, it would corrupt the
|
||||||
|
stack frame because the spill address would overwrite grp
|
||||||
|
offsets.
|
||||||
|
|
||||||
2014-12-26 Paulo Andrade <pcpa@gnu.org>
|
2014-12-26 Paulo Andrade <pcpa@gnu.org>
|
||||||
|
|
||||||
* lib/jit_ppc-cpu.c, lib/jit_ppc.c: Correct some endianess issues
|
* lib/jit_ppc-cpu.c, lib/jit_ppc.c: Correct some endianess issues
|
||||||
|
|
|
@ -140,7 +140,7 @@ typedef jit_int32_t jit_fpr_t;
|
||||||
# include <lightning/jit_hppa.h>
|
# include <lightning/jit_hppa.h>
|
||||||
#elif defined(__aarch64__)
|
#elif defined(__aarch64__)
|
||||||
# include <lightning/jit_aarch64.h>
|
# include <lightning/jit_aarch64.h>
|
||||||
#elif defined(__s390x__)
|
#elif defined(__s390__) || defined(__s390x__)
|
||||||
# include <lightning/jit_s390x.h>
|
# include <lightning/jit_s390x.h>
|
||||||
#elif defined(__alpha__)
|
#elif defined(__alpha__)
|
||||||
# include <lightning/jit_alpha.h>
|
# include <lightning/jit_alpha.h>
|
||||||
|
|
|
@ -115,7 +115,7 @@ typedef jit_uint64_t jit_regset_t;
|
||||||
# define JIT_RET _R0
|
# define JIT_RET _R0
|
||||||
# define JIT_FRET _V0
|
# define JIT_FRET _V0
|
||||||
typedef jit_uint64_t jit_regset_t;
|
typedef jit_uint64_t jit_regset_t;
|
||||||
#elif defined(__s390x__)
|
#elif defined(__s390__) || defined(__s390x__)
|
||||||
# define JIT_SP _R15
|
# define JIT_SP _R15
|
||||||
# define JIT_RET _R2
|
# define JIT_RET _R2
|
||||||
# define JIT_FRET _F0
|
# define JIT_FRET _F0
|
||||||
|
|
|
@ -33,7 +33,11 @@ typedef enum {
|
||||||
#define jit_r_num() 3
|
#define jit_r_num() 3
|
||||||
#define jit_v(i) (_R11 + ((i) << 1))
|
#define jit_v(i) (_R11 + ((i) << 1))
|
||||||
#define jit_v_num() 3
|
#define jit_v_num() 3
|
||||||
#define jit_arg_f_reg_p(i) ((i) >= 0 && (i) <= 4)
|
#if __WORDSIZE == 32
|
||||||
|
# define jit_arg_f_reg_p(i) ((i) >= 0 && (i) <= 2)
|
||||||
|
#else
|
||||||
|
# define jit_arg_f_reg_p(i) ((i) >= 0 && (i) <= 4)
|
||||||
|
#endif
|
||||||
#define jit_f(i) (_F8 + (i))
|
#define jit_f(i) (_F8 + (i))
|
||||||
#define jit_f_num() 6
|
#define jit_f_num() 6
|
||||||
#define JIT_R0 _R12
|
#define JIT_R0 _R12
|
||||||
|
|
|
@ -100,9 +100,13 @@ jit_init_debug(const char *progname)
|
||||||
# if defined(__sparc__)
|
# if defined(__sparc__)
|
||||||
disasm_info.endian = disasm_info.display_endian = BFD_ENDIAN_BIG;
|
disasm_info.endian = disasm_info.display_endian = BFD_ENDIAN_BIG;
|
||||||
# endif
|
# endif
|
||||||
# if defined(__s390x__)
|
# if defined(__s390__) || defined(__s390x__)
|
||||||
disasm_info.arch = bfd_arch_s390;
|
disasm_info.arch = bfd_arch_s390;
|
||||||
|
# if __WORDSIZE == 32
|
||||||
|
disasm_info.mach = bfd_mach_s390_31;
|
||||||
|
# else
|
||||||
disasm_info.mach = bfd_mach_s390_64;
|
disasm_info.mach = bfd_mach_s390_64;
|
||||||
|
# endif
|
||||||
disasm_info.endian = disasm_info.display_endian = BFD_ENDIAN_BIG;
|
disasm_info.endian = disasm_info.display_endian = BFD_ENDIAN_BIG;
|
||||||
disasm_info.disassembler_options = "zarch";
|
disasm_info.disassembler_options = "zarch";
|
||||||
# endif
|
# endif
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -354,10 +354,17 @@ static void _movi_d(jit_state_t*,jit_int32_t,jit_float64_t*);
|
||||||
# define sqrtr_d(r0,r1) SQDBR(r0,r1)
|
# define sqrtr_d(r0,r1) SQDBR(r0,r1)
|
||||||
# define truncr_f_i(r0,r1) CFEBR(r0,RND_ZERO,r1)
|
# define truncr_f_i(r0,r1) CFEBR(r0,RND_ZERO,r1)
|
||||||
# define truncr_d_i(r0,r1) CFDBR(r0,RND_ZERO,r1)
|
# define truncr_d_i(r0,r1) CFDBR(r0,RND_ZERO,r1)
|
||||||
|
# if __WORDSIZE == 64
|
||||||
# define truncr_f_l(r0,r1) CGEBR(r0,RND_ZERO,r1)
|
# define truncr_f_l(r0,r1) CGEBR(r0,RND_ZERO,r1)
|
||||||
# define truncr_d_l(r0,r1) CGDBR(r0,RND_ZERO,r1)
|
# define truncr_d_l(r0,r1) CGDBR(r0,RND_ZERO,r1)
|
||||||
|
# endif
|
||||||
|
# if __WORDSIZE == 32
|
||||||
|
# define extr_f(r0,r1) CEFBR(r0,r1)
|
||||||
|
# define extr_d(r0,r1) CDFBR(r0,r1)
|
||||||
|
# else
|
||||||
# define extr_f(r0,r1) CEGBR(r0,r1)
|
# define extr_f(r0,r1) CEGBR(r0,r1)
|
||||||
# define extr_d(r0,r1) CDGBR(r0,r1)
|
# define extr_d(r0,r1) CDGBR(r0,r1)
|
||||||
|
# endif
|
||||||
# define extr_d_f(r0,r1) LEDBR(r0,r1)
|
# define extr_d_f(r0,r1) LEDBR(r0,r1)
|
||||||
# define extr_f_d(r0,r1) LDEBR(r0,r1)
|
# define extr_f_d(r0,r1) LDEBR(r0,r1)
|
||||||
# define addr_f(r0,r1,r2) _addr_f(_jit,r0,r1,r2)
|
# define addr_f(r0,r1,r2) _addr_f(_jit,r0,r1,r2)
|
||||||
|
@ -889,7 +896,11 @@ static void
|
||||||
_movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t *i0)
|
_movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t *i0)
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
|
#if __WORDSIZE == 32
|
||||||
|
jit_int32_t i[2];
|
||||||
|
#else
|
||||||
jit_int64_t l;
|
jit_int64_t l;
|
||||||
|
#endif
|
||||||
jit_float64_t d;
|
jit_float64_t d;
|
||||||
} data;
|
} data;
|
||||||
jit_int32_t reg;
|
jit_int32_t reg;
|
||||||
|
@ -899,8 +910,15 @@ _movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t *i0)
|
||||||
else if (_jitc->no_data) {
|
else if (_jitc->no_data) {
|
||||||
data.d = *i0;
|
data.d = *i0;
|
||||||
reg = jit_get_reg_but_zero(0);
|
reg = jit_get_reg_but_zero(0);
|
||||||
|
#if __WORDSIZE == 32
|
||||||
|
movi(rn(reg), data.i[0]);
|
||||||
|
stxi_i(-8, _FP_REGNO, rn(reg));
|
||||||
|
movi(rn(reg), data.i[1]);
|
||||||
|
stxi_i(-4, _FP_REGNO, rn(reg));
|
||||||
|
#else
|
||||||
movi(rn(reg), data.l);
|
movi(rn(reg), data.l);
|
||||||
stxi_l(-8, _FP_REGNO, rn(reg));
|
stxi_l(-8, _FP_REGNO, rn(reg));
|
||||||
|
#endif
|
||||||
jit_unget_reg_but_zero(reg);
|
jit_unget_reg_but_zero(reg);
|
||||||
ldxi_d(r0, _FP_REGNO, -8);
|
ldxi_d(r0, _FP_REGNO, -8);
|
||||||
}
|
}
|
||||||
|
@ -1046,7 +1064,7 @@ _ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
||||||
jit_int32_t reg;
|
jit_int32_t reg;
|
||||||
reg = jit_get_reg_but_zero(0);
|
reg = jit_get_reg_but_zero(0);
|
||||||
movr(rn(reg), r1);
|
movr(rn(reg), r1);
|
||||||
AGR(rn(reg), r2);
|
addr(rn(reg), rn(reg), r2);
|
||||||
ldr_f(r0, rn(reg));
|
ldr_f(r0, rn(reg));
|
||||||
jit_unget_reg_but_zero(reg);
|
jit_unget_reg_but_zero(reg);
|
||||||
}
|
}
|
||||||
|
@ -1057,7 +1075,7 @@ _ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
||||||
jit_int32_t reg;
|
jit_int32_t reg;
|
||||||
reg = jit_get_reg_but_zero(0);
|
reg = jit_get_reg_but_zero(0);
|
||||||
movr(rn(reg), r1);
|
movr(rn(reg), r1);
|
||||||
AGR(rn(reg), r2);
|
addr(rn(reg), rn(reg), r2);
|
||||||
ldr_d(r0, rn(reg));
|
ldr_d(r0, rn(reg));
|
||||||
jit_unget_reg_but_zero(reg);
|
jit_unget_reg_but_zero(reg);
|
||||||
}
|
}
|
||||||
|
@ -1073,7 +1091,7 @@ _ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
|
||||||
else {
|
else {
|
||||||
reg = jit_get_reg_but_zero(0);
|
reg = jit_get_reg_but_zero(0);
|
||||||
movi(rn(reg), i0);
|
movi(rn(reg), i0);
|
||||||
AGR(rn(reg), r1);
|
addr(rn(reg), rn(reg), r1);
|
||||||
ldr_f(r0, rn(reg));
|
ldr_f(r0, rn(reg));
|
||||||
jit_unget_reg_but_zero(reg);
|
jit_unget_reg_but_zero(reg);
|
||||||
}
|
}
|
||||||
|
@ -1090,7 +1108,7 @@ _ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
|
||||||
else {
|
else {
|
||||||
reg = jit_get_reg_but_zero(0);
|
reg = jit_get_reg_but_zero(0);
|
||||||
movi(rn(reg), i0);
|
movi(rn(reg), i0);
|
||||||
AGR(rn(reg), r1);
|
addr(rn(reg), rn(reg), r1);
|
||||||
ldr_d(r0, rn(reg));
|
ldr_d(r0, rn(reg));
|
||||||
jit_unget_reg_but_zero(reg);
|
jit_unget_reg_but_zero(reg);
|
||||||
}
|
}
|
||||||
|
@ -1122,7 +1140,7 @@ _stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
||||||
jit_int32_t reg;
|
jit_int32_t reg;
|
||||||
reg = jit_get_reg_but_zero(0);
|
reg = jit_get_reg_but_zero(0);
|
||||||
movr(rn(reg), r0);
|
movr(rn(reg), r0);
|
||||||
AGR(rn(reg), r1);
|
addr(rn(reg), rn(reg), r1);
|
||||||
str_f(rn(reg), r2);
|
str_f(rn(reg), r2);
|
||||||
jit_unget_reg_but_zero(reg);
|
jit_unget_reg_but_zero(reg);
|
||||||
}
|
}
|
||||||
|
@ -1133,7 +1151,7 @@ _stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
||||||
jit_int32_t reg;
|
jit_int32_t reg;
|
||||||
reg = jit_get_reg_but_zero(0);
|
reg = jit_get_reg_but_zero(0);
|
||||||
movr(rn(reg), r0);
|
movr(rn(reg), r0);
|
||||||
AGR(rn(reg), r1);
|
addr(rn(reg), rn(reg), r1);
|
||||||
str_d(rn(reg), r2);
|
str_d(rn(reg), r2);
|
||||||
jit_unget_reg_but_zero(reg);
|
jit_unget_reg_but_zero(reg);
|
||||||
}
|
}
|
||||||
|
@ -1149,7 +1167,7 @@ _stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
|
||||||
else {
|
else {
|
||||||
reg = jit_get_reg_but_zero(0);
|
reg = jit_get_reg_but_zero(0);
|
||||||
movi(rn(reg), i0);
|
movi(rn(reg), i0);
|
||||||
AGR(rn(reg), r0);
|
addr(rn(reg), rn(reg), r0);
|
||||||
str_f(rn(reg), r1);
|
str_f(rn(reg), r1);
|
||||||
jit_unget_reg_but_zero(reg);
|
jit_unget_reg_but_zero(reg);
|
||||||
}
|
}
|
||||||
|
@ -1166,7 +1184,7 @@ _stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
|
||||||
else {
|
else {
|
||||||
reg = jit_get_reg_but_zero(0);
|
reg = jit_get_reg_but_zero(0);
|
||||||
movi(rn(reg), i0);
|
movi(rn(reg), i0);
|
||||||
AGR(rn(reg), r0);
|
addr(rn(reg), rn(reg), r0);
|
||||||
str_d(rn(reg), r1);
|
str_d(rn(reg), r1);
|
||||||
jit_unget_reg_but_zero(reg);
|
jit_unget_reg_but_zero(reg);
|
||||||
}
|
}
|
||||||
|
@ -1176,13 +1194,13 @@ static void
|
||||||
_uneqr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
_uneqr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
||||||
{
|
{
|
||||||
jit_word_t unord, eq;
|
jit_word_t unord, eq;
|
||||||
LGHI(r0, 1); /* set to one */
|
movi(r0, 1); /* set to one */
|
||||||
CEBR(r1, r2);
|
CEBR(r1, r2);
|
||||||
unord = _jit->pc.w; /* keep set to one if unord */
|
unord = _jit->pc.w; /* keep set to one if unord */
|
||||||
BRC(CC_O, 0);
|
BRC(CC_O, 0);
|
||||||
eq = _jit->pc.w;
|
eq = _jit->pc.w;
|
||||||
BRC(CC_E, 0); /* keep set to one if eq */
|
BRC(CC_E, 0); /* keep set to one if eq */
|
||||||
LGHI(r0, 0); /* set to zero */
|
movi(r0, 0); /* set to zero */
|
||||||
patch_at(unord, _jit->pc.w);
|
patch_at(unord, _jit->pc.w);
|
||||||
patch_at(eq, _jit->pc.w);
|
patch_at(eq, _jit->pc.w);
|
||||||
}
|
}
|
||||||
|
@ -1191,13 +1209,13 @@ static void
|
||||||
_uneqr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
_uneqr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
||||||
{
|
{
|
||||||
jit_word_t unord, eq;
|
jit_word_t unord, eq;
|
||||||
LGHI(r0, 1); /* set to one */
|
movi(r0, 1); /* set to one */
|
||||||
CDBR(r1, r2);
|
CDBR(r1, r2);
|
||||||
unord = _jit->pc.w; /* keep set to one if unord */
|
unord = _jit->pc.w; /* keep set to one if unord */
|
||||||
BRC(CC_O, 0);
|
BRC(CC_O, 0);
|
||||||
eq = _jit->pc.w;
|
eq = _jit->pc.w;
|
||||||
BRC(CC_E, 0); /* keep set to one if eq */
|
BRC(CC_E, 0); /* keep set to one if eq */
|
||||||
LGHI(r0, 0); /* set to zero */
|
movi(r0, 0); /* set to zero */
|
||||||
patch_at(unord, _jit->pc.w);
|
patch_at(unord, _jit->pc.w);
|
||||||
patch_at(eq, _jit->pc.w);
|
patch_at(eq, _jit->pc.w);
|
||||||
}
|
}
|
||||||
|
@ -1206,13 +1224,13 @@ static void
|
||||||
_ltgtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
_ltgtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
||||||
{
|
{
|
||||||
jit_word_t unord, eq;
|
jit_word_t unord, eq;
|
||||||
LGHI(r0, 0); /* set to zero */
|
movi(r0, 0); /* set to zero */
|
||||||
CEBR(r1, r2);
|
CEBR(r1, r2);
|
||||||
unord = _jit->pc.w; /* keep set to zero if unord */
|
unord = _jit->pc.w; /* keep set to zero if unord */
|
||||||
BRC(CC_O, 0);
|
BRC(CC_O, 0);
|
||||||
eq = _jit->pc.w;
|
eq = _jit->pc.w;
|
||||||
BRC(CC_E, 0); /* keep set to zero if eq */
|
BRC(CC_E, 0); /* keep set to zero if eq */
|
||||||
LGHI(r0, 1); /* set to one */
|
movi(r0, 1); /* set to one */
|
||||||
patch_at(unord, _jit->pc.w);
|
patch_at(unord, _jit->pc.w);
|
||||||
patch_at(eq, _jit->pc.w);
|
patch_at(eq, _jit->pc.w);
|
||||||
}
|
}
|
||||||
|
@ -1221,13 +1239,13 @@ static void
|
||||||
_ltgtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
_ltgtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
||||||
{
|
{
|
||||||
jit_word_t unord, eq;
|
jit_word_t unord, eq;
|
||||||
LGHI(r0, 0); /* set to zero */
|
movi(r0, 0); /* set to zero */
|
||||||
CDBR(r1, r2);
|
CDBR(r1, r2);
|
||||||
unord = _jit->pc.w; /* keep set to zero if unord */
|
unord = _jit->pc.w; /* keep set to zero if unord */
|
||||||
BRC(CC_O, 0);
|
BRC(CC_O, 0);
|
||||||
eq = _jit->pc.w;
|
eq = _jit->pc.w;
|
||||||
BRC(CC_E, 0); /* keep set to zero if eq */
|
BRC(CC_E, 0); /* keep set to zero if eq */
|
||||||
LGHI(r0, 1); /* set to one */
|
movi(r0, 1); /* set to one */
|
||||||
patch_at(unord, _jit->pc.w);
|
patch_at(unord, _jit->pc.w);
|
||||||
patch_at(eq, _jit->pc.w);
|
patch_at(eq, _jit->pc.w);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,360 @@
|
||||||
|
|
||||||
|
#if __WORDSIZE == 32
|
||||||
|
#define JIT_INSTR_MAX 50
|
||||||
|
0, /* data */
|
||||||
|
0, /* live */
|
||||||
|
2, /* align */
|
||||||
|
0, /* save */
|
||||||
|
0, /* load */
|
||||||
|
0, /* #name */
|
||||||
|
0, /* #note */
|
||||||
|
2, /* label */
|
||||||
|
38, /* prolog */
|
||||||
|
0, /* arg */
|
||||||
|
4, /* addr */
|
||||||
|
12, /* addi */
|
||||||
|
4, /* addcr */
|
||||||
|
10, /* addci */
|
||||||
|
6, /* addxr */
|
||||||
|
10, /* addxi */
|
||||||
|
6, /* subr */
|
||||||
|
12, /* subi */
|
||||||
|
6, /* subcr */
|
||||||
|
10, /* subci */
|
||||||
|
8, /* subxr */
|
||||||
|
10, /* subxi */
|
||||||
|
14, /* rsbi */
|
||||||
|
6, /* mulr */
|
||||||
|
14, /* muli */
|
||||||
|
46, /* qmulr */
|
||||||
|
50, /* qmuli */
|
||||||
|
10, /* qmulr_u */
|
||||||
|
18, /* qmuli_u */
|
||||||
|
10, /* divr */
|
||||||
|
18, /* divi */
|
||||||
|
16, /* divr_u */
|
||||||
|
24, /* divi_u */
|
||||||
|
12, /* qdivr */
|
||||||
|
16, /* qdivi */
|
||||||
|
18, /* qdivr_u */
|
||||||
|
22, /* qdivi_u */
|
||||||
|
10, /* remr */
|
||||||
|
18, /* remi */
|
||||||
|
16, /* remr_u */
|
||||||
|
24, /* remi_u */
|
||||||
|
4, /* andr */
|
||||||
|
10, /* andi */
|
||||||
|
4, /* orr */
|
||||||
|
10, /* ori */
|
||||||
|
4, /* xorr */
|
||||||
|
12, /* xori */
|
||||||
|
8, /* lshr */
|
||||||
|
10, /* lshi */
|
||||||
|
8, /* rshr */
|
||||||
|
10, /* rshi */
|
||||||
|
8, /* rshr_u */
|
||||||
|
10, /* rshi_u */
|
||||||
|
2, /* negr */
|
||||||
|
8, /* comr */
|
||||||
|
16, /* ltr */
|
||||||
|
20, /* lti */
|
||||||
|
16, /* ltr_u */
|
||||||
|
20, /* lti_u */
|
||||||
|
16, /* ler */
|
||||||
|
20, /* lei */
|
||||||
|
16, /* ler_u */
|
||||||
|
20, /* lei_u */
|
||||||
|
16, /* eqr */
|
||||||
|
20, /* eqi */
|
||||||
|
16, /* ger */
|
||||||
|
20, /* gei */
|
||||||
|
16, /* ger_u */
|
||||||
|
20, /* gei_u */
|
||||||
|
16, /* gtr */
|
||||||
|
20, /* gti */
|
||||||
|
16, /* gtr_u */
|
||||||
|
20, /* gti_u */
|
||||||
|
16, /* ner */
|
||||||
|
20, /* nei */
|
||||||
|
2, /* movr */
|
||||||
|
8, /* movi */
|
||||||
|
4, /* extr_c */
|
||||||
|
4, /* extr_uc */
|
||||||
|
4, /* extr_s */
|
||||||
|
4, /* extr_us */
|
||||||
|
0, /* extr_i */
|
||||||
|
0, /* extr_ui */
|
||||||
|
4, /* htonr_us */
|
||||||
|
2, /* htonr_ui */
|
||||||
|
0, /* htonr_ul */
|
||||||
|
6, /* ldr_c */
|
||||||
|
12, /* ldi_c */
|
||||||
|
6, /* ldr_uc */
|
||||||
|
14, /* ldi_uc */
|
||||||
|
6, /* ldr_s */
|
||||||
|
12, /* ldi_s */
|
||||||
|
6, /* ldr_us */
|
||||||
|
12, /* ldi_us */
|
||||||
|
6, /* ldr_i */
|
||||||
|
12, /* ldi_i */
|
||||||
|
0, /* ldr_ui */
|
||||||
|
0, /* ldi_ui */
|
||||||
|
0, /* ldr_l */
|
||||||
|
0, /* ldi_l */
|
||||||
|
10, /* ldxr_c */
|
||||||
|
16, /* ldxi_c */
|
||||||
|
10, /* ldxr_uc */
|
||||||
|
16, /* ldxi_uc */
|
||||||
|
10, /* ldxr_s */
|
||||||
|
16, /* ldxi_s */
|
||||||
|
10, /* ldxr_us */
|
||||||
|
16, /* ldxi_us */
|
||||||
|
10, /* ldxr_i */
|
||||||
|
16, /* ldxi_i */
|
||||||
|
0, /* ldxr_ui */
|
||||||
|
0, /* ldxi_ui */
|
||||||
|
0, /* ldxr_l */
|
||||||
|
0, /* ldxi_l */
|
||||||
|
4, /* str_c */
|
||||||
|
12, /* sti_c */
|
||||||
|
4, /* str_s */
|
||||||
|
10, /* sti_s */
|
||||||
|
4, /* str_i */
|
||||||
|
10, /* sti_i */
|
||||||
|
0, /* str_l */
|
||||||
|
0, /* sti_l */
|
||||||
|
8, /* stxr_c */
|
||||||
|
16, /* stxi_c */
|
||||||
|
8, /* stxr_s */
|
||||||
|
16, /* stxi_s */
|
||||||
|
8, /* stxr_i */
|
||||||
|
16, /* stxi_i */
|
||||||
|
0, /* stxr_l */
|
||||||
|
0, /* stxi_l */
|
||||||
|
8, /* bltr */
|
||||||
|
12, /* blti */
|
||||||
|
8, /* bltr_u */
|
||||||
|
12, /* blti_u */
|
||||||
|
8, /* bler */
|
||||||
|
12, /* blei */
|
||||||
|
8, /* bler_u */
|
||||||
|
12, /* blei_u */
|
||||||
|
8, /* beqr */
|
||||||
|
16, /* beqi */
|
||||||
|
8, /* bger */
|
||||||
|
12, /* bgei */
|
||||||
|
8, /* bger_u */
|
||||||
|
12, /* bgei_u */
|
||||||
|
8, /* bgtr */
|
||||||
|
12, /* bgti */
|
||||||
|
8, /* bgtr_u */
|
||||||
|
12, /* bgti_u */
|
||||||
|
8, /* bner */
|
||||||
|
16, /* bnei */
|
||||||
|
12, /* bmsr */
|
||||||
|
14, /* bmsi */
|
||||||
|
12, /* bmcr */
|
||||||
|
14, /* bmci */
|
||||||
|
8, /* boaddr */
|
||||||
|
12, /* boaddi */
|
||||||
|
8, /* boaddr_u */
|
||||||
|
12, /* boaddi_u */
|
||||||
|
8, /* bxaddr */
|
||||||
|
12, /* bxaddi */
|
||||||
|
8, /* bxaddr_u */
|
||||||
|
12, /* bxaddi_u */
|
||||||
|
8, /* bosubr */
|
||||||
|
12, /* bosubi */
|
||||||
|
8, /* bosubr_u */
|
||||||
|
12, /* bosubi_u */
|
||||||
|
8, /* bxsubr */
|
||||||
|
12, /* bxsubi */
|
||||||
|
8, /* bxsubr_u */
|
||||||
|
12, /* bxsubi_u */
|
||||||
|
2, /* jmpr */
|
||||||
|
10, /* jmpi */
|
||||||
|
2, /* callr */
|
||||||
|
10, /* calli */
|
||||||
|
36, /* epilog */
|
||||||
|
0, /* arg_f */
|
||||||
|
6, /* addr_f */
|
||||||
|
24, /* addi_f */
|
||||||
|
8, /* subr_f */
|
||||||
|
24, /* subi_f */
|
||||||
|
28, /* rsbi_f */
|
||||||
|
6, /* mulr_f */
|
||||||
|
24, /* muli_f */
|
||||||
|
8, /* divr_f */
|
||||||
|
24, /* divi_f */
|
||||||
|
4, /* negr_f */
|
||||||
|
4, /* absr_f */
|
||||||
|
4, /* sqrtr_f */
|
||||||
|
16, /* ltr_f */
|
||||||
|
36, /* lti_f */
|
||||||
|
16, /* ler_f */
|
||||||
|
36, /* lei_f */
|
||||||
|
16, /* eqr_f */
|
||||||
|
36, /* eqi_f */
|
||||||
|
16, /* ger_f */
|
||||||
|
36, /* gei_f */
|
||||||
|
16, /* gtr_f */
|
||||||
|
36, /* gti_f */
|
||||||
|
16, /* ner_f */
|
||||||
|
36, /* nei_f */
|
||||||
|
16, /* unltr_f */
|
||||||
|
36, /* unlti_f */
|
||||||
|
16, /* unler_f */
|
||||||
|
36, /* unlei_f */
|
||||||
|
20, /* uneqr_f */
|
||||||
|
40, /* uneqi_f */
|
||||||
|
16, /* unger_f */
|
||||||
|
36, /* ungei_f */
|
||||||
|
16, /* ungtr_f */
|
||||||
|
36, /* ungti_f */
|
||||||
|
20, /* ltgtr_f */
|
||||||
|
40, /* ltgti_f */
|
||||||
|
16, /* ordr_f */
|
||||||
|
36, /* ordi_f */
|
||||||
|
16, /* unordr_f */
|
||||||
|
36, /* unordi_f */
|
||||||
|
4, /* truncr_f_i */
|
||||||
|
0, /* truncr_f_l */
|
||||||
|
4, /* extr_f */
|
||||||
|
4, /* extr_d_f */
|
||||||
|
2, /* movr_f */
|
||||||
|
20, /* movi_f */
|
||||||
|
4, /* ldr_f */
|
||||||
|
10, /* ldi_f */
|
||||||
|
8, /* ldxr_f */
|
||||||
|
14, /* ldxi_f */
|
||||||
|
4, /* str_f */
|
||||||
|
10, /* sti_f */
|
||||||
|
8, /* stxr_f */
|
||||||
|
14, /* stxi_f */
|
||||||
|
10, /* bltr_f */
|
||||||
|
28, /* blti_f */
|
||||||
|
10, /* bler_f */
|
||||||
|
30, /* blei_f */
|
||||||
|
10, /* beqr_f */
|
||||||
|
30, /* beqi_f */
|
||||||
|
10, /* bger_f */
|
||||||
|
30, /* bgei_f */
|
||||||
|
10, /* bgtr_f */
|
||||||
|
30, /* bgti_f */
|
||||||
|
10, /* bner_f */
|
||||||
|
30, /* bnei_f */
|
||||||
|
10, /* bunltr_f */
|
||||||
|
28, /* bunlti_f */
|
||||||
|
10, /* bunler_f */
|
||||||
|
28, /* bunlei_f */
|
||||||
|
18, /* buneqr_f */
|
||||||
|
36, /* buneqi_f */
|
||||||
|
10, /* bunger_f */
|
||||||
|
30, /* bungei_f */
|
||||||
|
10, /* bungtr_f */
|
||||||
|
30, /* bungti_f */
|
||||||
|
18, /* bltgtr_f */
|
||||||
|
38, /* bltgti_f */
|
||||||
|
10, /* bordr_f */
|
||||||
|
30, /* bordi_f */
|
||||||
|
10, /* bunordr_f */
|
||||||
|
28, /* bunordi_f */
|
||||||
|
0, /* arg_d */
|
||||||
|
6, /* addr_d */
|
||||||
|
34, /* addi_d */
|
||||||
|
8, /* subr_d */
|
||||||
|
34, /* subi_d */
|
||||||
|
38, /* rsbi_d */
|
||||||
|
6, /* mulr_d */
|
||||||
|
34, /* muli_d */
|
||||||
|
8, /* divr_d */
|
||||||
|
34, /* divi_d */
|
||||||
|
4, /* negr_d */
|
||||||
|
4, /* absr_d */
|
||||||
|
4, /* sqrtr_d */
|
||||||
|
16, /* ltr_d */
|
||||||
|
46, /* lti_d */
|
||||||
|
16, /* ler_d */
|
||||||
|
46, /* lei_d */
|
||||||
|
16, /* eqr_d */
|
||||||
|
46, /* eqi_d */
|
||||||
|
16, /* ger_d */
|
||||||
|
46, /* gei_d */
|
||||||
|
16, /* gtr_d */
|
||||||
|
46, /* gti_d */
|
||||||
|
16, /* ner_d */
|
||||||
|
46, /* nei_d */
|
||||||
|
16, /* unltr_d */
|
||||||
|
46, /* unlti_d */
|
||||||
|
16, /* unler_d */
|
||||||
|
46, /* unlei_d */
|
||||||
|
20, /* uneqr_d */
|
||||||
|
50, /* uneqi_d */
|
||||||
|
16, /* unger_d */
|
||||||
|
46, /* ungei_d */
|
||||||
|
16, /* ungtr_d */
|
||||||
|
46, /* ungti_d */
|
||||||
|
20, /* ltgtr_d */
|
||||||
|
50, /* ltgti_d */
|
||||||
|
16, /* ordr_d */
|
||||||
|
46, /* ordi_d */
|
||||||
|
16, /* unordr_d */
|
||||||
|
46, /* unordi_d */
|
||||||
|
4, /* truncr_d_i */
|
||||||
|
0, /* truncr_d_l */
|
||||||
|
4, /* extr_d */
|
||||||
|
4, /* extr_f_d */
|
||||||
|
2, /* movr_d */
|
||||||
|
30, /* movi_d */
|
||||||
|
4, /* ldr_d */
|
||||||
|
10, /* ldi_d */
|
||||||
|
8, /* ldxr_d */
|
||||||
|
14, /* ldxi_d */
|
||||||
|
4, /* str_d */
|
||||||
|
10, /* sti_d */
|
||||||
|
8, /* stxr_d */
|
||||||
|
14, /* stxi_d */
|
||||||
|
10, /* bltr_d */
|
||||||
|
38, /* blti_d */
|
||||||
|
10, /* bler_d */
|
||||||
|
38, /* blei_d */
|
||||||
|
10, /* beqr_d */
|
||||||
|
40, /* beqi_d */
|
||||||
|
10, /* bger_d */
|
||||||
|
40, /* bgei_d */
|
||||||
|
10, /* bgtr_d */
|
||||||
|
40, /* bgti_d */
|
||||||
|
10, /* bner_d */
|
||||||
|
40, /* bnei_d */
|
||||||
|
10, /* bunltr_d */
|
||||||
|
38, /* bunlti_d */
|
||||||
|
10, /* bunler_d */
|
||||||
|
38, /* bunlei_d */
|
||||||
|
18, /* buneqr_d */
|
||||||
|
46, /* buneqi_d */
|
||||||
|
10, /* bunger_d */
|
||||||
|
40, /* bungei_d */
|
||||||
|
10, /* bungtr_d */
|
||||||
|
40, /* bungti_d */
|
||||||
|
18, /* bltgtr_d */
|
||||||
|
48, /* bltgti_d */
|
||||||
|
10, /* bordr_d */
|
||||||
|
40, /* bordi_d */
|
||||||
|
10, /* bunordr_d */
|
||||||
|
38, /* bunordi_d */
|
||||||
|
0, /* movr_w_f */
|
||||||
|
0, /* movr_ww_d */
|
||||||
|
0, /* movr_w_d */
|
||||||
|
0, /* movr_f_w */
|
||||||
|
0, /* movi_f_w */
|
||||||
|
0, /* movr_d_ww */
|
||||||
|
0, /* movi_d_ww */
|
||||||
|
0, /* movr_d_w */
|
||||||
|
0, /* movi_d_w */
|
||||||
|
0, /* x86_retval_f */
|
||||||
|
0, /* x86_retval_d */
|
||||||
|
#endif /* __WORDSIZE */
|
||||||
|
|
||||||
#if __WORDSIZE == 64
|
#if __WORDSIZE == 64
|
||||||
#define JIT_INSTR_MAX 68
|
#define JIT_INSTR_MAX 68
|
||||||
0, /* data */
|
0, /* data */
|
||||||
|
|
|
@ -22,6 +22,11 @@
|
||||||
|
|
||||||
#define rc(value) jit_class_##value
|
#define rc(value) jit_class_##value
|
||||||
#define rn(reg) (jit_regno(_rvs[jit_regno(reg)].spec))
|
#define rn(reg) (jit_regno(_rvs[jit_regno(reg)].spec))
|
||||||
|
#if __WORDSIZE == 32
|
||||||
|
# define NUM_FLOAT_REG_ARGS 2
|
||||||
|
#else
|
||||||
|
# define NUM_FLOAT_REG_ARGS 4
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prototypes
|
* Prototypes
|
||||||
|
@ -69,7 +74,8 @@ jit_register_t _rvs[] = {
|
||||||
{ rc(fpr) | 0x5, "%f5" },
|
{ rc(fpr) | 0x5, "%f5" },
|
||||||
{ rc(fpr) | 0x7, "%f7" },
|
{ rc(fpr) | 0x7, "%f7" },
|
||||||
{ rc(fpr) | rc(sav) | 0xe, "%f14" },
|
{ rc(fpr) | rc(sav) | 0xe, "%f14" },
|
||||||
{ rc(fpr) | rc(sav) | 0xf, "%f15" },
|
/* Do not use as temporary to simplify stack layout */
|
||||||
|
{ 0xf, "%f15" },
|
||||||
{ rc(fpr) | rc(sav) | 0x8, "%f8" },
|
{ rc(fpr) | rc(sav) | 0x8, "%f8" },
|
||||||
{ rc(fpr) | rc(sav) | 0x9, "%f9" },
|
{ rc(fpr) | rc(sav) | 0x9, "%f9" },
|
||||||
{ rc(fpr) | rc(sav) | 0xa, "%f10" },
|
{ rc(fpr) | rc(sav) | 0xa, "%f10" },
|
||||||
|
@ -239,7 +245,7 @@ _jit_arg_f(jit_state_t *_jit)
|
||||||
{
|
{
|
||||||
jit_int32_t offset;
|
jit_int32_t offset;
|
||||||
assert(_jitc->function);
|
assert(_jitc->function);
|
||||||
if (_jitc->function->self.argf < 4)
|
if (_jitc->function->self.argf < NUM_FLOAT_REG_ARGS)
|
||||||
offset = _jitc->function->self.argf++;
|
offset = _jitc->function->self.argf++;
|
||||||
else {
|
else {
|
||||||
offset = _jitc->function->self.size;
|
offset = _jitc->function->self.size;
|
||||||
|
@ -251,7 +257,7 @@ _jit_arg_f(jit_state_t *_jit)
|
||||||
jit_bool_t
|
jit_bool_t
|
||||||
_jit_arg_f_reg_p(jit_state_t *_jit, jit_int32_t offset)
|
_jit_arg_f_reg_p(jit_state_t *_jit, jit_int32_t offset)
|
||||||
{
|
{
|
||||||
return (offset >= 0 && offset < 4);
|
return (offset >= 0 && offset < NUM_FLOAT_REG_ARGS);
|
||||||
}
|
}
|
||||||
|
|
||||||
jit_node_t *
|
jit_node_t *
|
||||||
|
@ -259,11 +265,11 @@ _jit_arg_d(jit_state_t *_jit)
|
||||||
{
|
{
|
||||||
jit_int32_t offset;
|
jit_int32_t offset;
|
||||||
assert(_jitc->function);
|
assert(_jitc->function);
|
||||||
if (_jitc->function->self.argf < 4)
|
if (_jitc->function->self.argf < NUM_FLOAT_REG_ARGS)
|
||||||
offset = _jitc->function->self.argf++;
|
offset = _jitc->function->self.argf++;
|
||||||
else {
|
else {
|
||||||
offset = _jitc->function->self.size;
|
offset = _jitc->function->self.size;
|
||||||
_jitc->function->self.size += sizeof(jit_word_t);
|
_jitc->function->self.size += sizeof(jit_float64_t);
|
||||||
}
|
}
|
||||||
return (jit_new_node_w(jit_code_arg_d, offset));
|
return (jit_new_node_w(jit_code_arg_d, offset));
|
||||||
}
|
}
|
||||||
|
@ -317,13 +323,19 @@ _jit_getarg_us(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
|
||||||
void
|
void
|
||||||
_jit_getarg_i(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
|
_jit_getarg_i(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
|
||||||
{
|
{
|
||||||
if (v->u.w < 5)
|
if (v->u.w < 5) {
|
||||||
|
#if __WORDSIZE == 32
|
||||||
|
jit_movr(u, _R2 - v->u.w);
|
||||||
|
#else
|
||||||
jit_extr_i(u, _R2 - v->u.w);
|
jit_extr_i(u, _R2 - v->u.w);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
else
|
else
|
||||||
jit_ldxi_i(u, JIT_FP,
|
jit_ldxi_i(u, JIT_FP,
|
||||||
v->u.w + (__WORDSIZE >> 3) - sizeof(jit_int32_t));
|
v->u.w + (__WORDSIZE >> 3) - sizeof(jit_int32_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if __WORDSIZE == 64
|
||||||
void
|
void
|
||||||
_jit_getarg_ui(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
|
_jit_getarg_ui(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
|
||||||
{
|
{
|
||||||
|
@ -342,6 +354,7 @@ _jit_getarg_l(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
|
||||||
else
|
else
|
||||||
jit_ldxi_l(u, JIT_FP, v->u.w);
|
jit_ldxi_l(u, JIT_FP, v->u.w);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
_jit_getarg_f(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
|
_jit_getarg_f(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
|
||||||
|
@ -350,7 +363,11 @@ _jit_getarg_f(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
|
||||||
jit_movr_f(u, _F0 - v->u.w);
|
jit_movr_f(u, _F0 - v->u.w);
|
||||||
else
|
else
|
||||||
jit_ldxi_f(u, JIT_FP,
|
jit_ldxi_f(u, JIT_FP,
|
||||||
v->u.w + (__WORDSIZE >> 3) - sizeof(jit_float32_t));
|
v->u.w
|
||||||
|
#if __WORDSIZE == 64
|
||||||
|
+ (__WORDSIZE >> 3) - sizeof(jit_float32_t)
|
||||||
|
#endif
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -398,13 +415,16 @@ void
|
||||||
_jit_pushargr_f(jit_state_t *_jit, jit_int32_t u)
|
_jit_pushargr_f(jit_state_t *_jit, jit_int32_t u)
|
||||||
{
|
{
|
||||||
assert(_jitc->function);
|
assert(_jitc->function);
|
||||||
if (_jitc->function->call.argf < 4) {
|
if (_jitc->function->call.argf < NUM_FLOAT_REG_ARGS) {
|
||||||
jit_movr_f(_F0 - _jitc->function->call.argf, u);
|
jit_movr_f(_F0 - _jitc->function->call.argf, u);
|
||||||
++_jitc->function->call.argf;
|
++_jitc->function->call.argf;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
jit_stxi_f(_jitc->function->call.size + stack_framesize +
|
jit_stxi_f(_jitc->function->call.size + stack_framesize
|
||||||
(__WORDSIZE >> 3) - sizeof(jit_float32_t), JIT_SP, u);
|
#if __WORDSIZE == 64
|
||||||
|
+ (__WORDSIZE >> 3) - sizeof(jit_float32_t)
|
||||||
|
#endif
|
||||||
|
, JIT_SP, u);
|
||||||
_jitc->function->call.size += sizeof(jit_word_t);
|
_jitc->function->call.size += sizeof(jit_word_t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -414,15 +434,18 @@ _jit_pushargi_f(jit_state_t *_jit, jit_float32_t u)
|
||||||
{
|
{
|
||||||
jit_int32_t regno;
|
jit_int32_t regno;
|
||||||
assert(_jitc->function);
|
assert(_jitc->function);
|
||||||
if (_jitc->function->call.argf < 4) {
|
if (_jitc->function->call.argf < NUM_FLOAT_REG_ARGS) {
|
||||||
jit_movi_f(_F0 - _jitc->function->call.argf, u);
|
jit_movi_f(_F0 - _jitc->function->call.argf, u);
|
||||||
++_jitc->function->call.argf;
|
++_jitc->function->call.argf;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
regno = jit_get_reg(jit_class_fpr);
|
regno = jit_get_reg(jit_class_fpr);
|
||||||
jit_movi_f(regno, u);
|
jit_movi_f(regno, u);
|
||||||
jit_stxi_f(_jitc->function->call.size + stack_framesize +
|
jit_stxi_f(_jitc->function->call.size + stack_framesize
|
||||||
(__WORDSIZE >> 3) - sizeof(jit_float32_t), JIT_SP, regno);
|
#if __WORDSIZE == 64
|
||||||
|
+ (__WORDSIZE >> 3) - sizeof(jit_float32_t)
|
||||||
|
#endif
|
||||||
|
, JIT_SP, regno);
|
||||||
jit_unget_reg(regno);
|
jit_unget_reg(regno);
|
||||||
_jitc->function->call.size += sizeof(jit_word_t);
|
_jitc->function->call.size += sizeof(jit_word_t);
|
||||||
}
|
}
|
||||||
|
@ -432,13 +455,13 @@ void
|
||||||
_jit_pushargr_d(jit_state_t *_jit, jit_int32_t u)
|
_jit_pushargr_d(jit_state_t *_jit, jit_int32_t u)
|
||||||
{
|
{
|
||||||
assert(_jitc->function);
|
assert(_jitc->function);
|
||||||
if (_jitc->function->call.argf < 4) {
|
if (_jitc->function->call.argf < NUM_FLOAT_REG_ARGS) {
|
||||||
jit_movr_d(_F0 - _jitc->function->call.argf, u);
|
jit_movr_d(_F0 - _jitc->function->call.argf, u);
|
||||||
++_jitc->function->call.argf;
|
++_jitc->function->call.argf;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
jit_stxi_d(_jitc->function->call.size + stack_framesize, JIT_SP, u);
|
jit_stxi_d(_jitc->function->call.size + stack_framesize, JIT_SP, u);
|
||||||
_jitc->function->call.size += sizeof(jit_word_t);
|
_jitc->function->call.size += sizeof(jit_float64_t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -447,7 +470,7 @@ _jit_pushargi_d(jit_state_t *_jit, jit_float64_t u)
|
||||||
{
|
{
|
||||||
jit_int32_t regno;
|
jit_int32_t regno;
|
||||||
assert(_jitc->function);
|
assert(_jitc->function);
|
||||||
if (_jitc->function->call.argf < 4) {
|
if (_jitc->function->call.argf < NUM_FLOAT_REG_ARGS) {
|
||||||
jit_movi_d(_F0 - _jitc->function->call.argf, u);
|
jit_movi_d(_F0 - _jitc->function->call.argf, u);
|
||||||
++_jitc->function->call.argf;
|
++_jitc->function->call.argf;
|
||||||
}
|
}
|
||||||
|
@ -456,7 +479,7 @@ _jit_pushargi_d(jit_state_t *_jit, jit_float64_t u)
|
||||||
jit_movi_d(regno, u);
|
jit_movi_d(regno, u);
|
||||||
jit_stxi_d(_jitc->function->call.size + stack_framesize, JIT_SP, regno);
|
jit_stxi_d(_jitc->function->call.size + stack_framesize, JIT_SP, regno);
|
||||||
jit_unget_reg(regno);
|
jit_unget_reg(regno);
|
||||||
_jitc->function->call.size += sizeof(jit_word_t);
|
_jitc->function->call.size += sizeof(jit_float64_t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -536,9 +559,14 @@ _jit_retval_us(jit_state_t *_jit, jit_int32_t r0)
|
||||||
void
|
void
|
||||||
_jit_retval_i(jit_state_t *_jit, jit_int32_t r0)
|
_jit_retval_i(jit_state_t *_jit, jit_int32_t r0)
|
||||||
{
|
{
|
||||||
|
#if __WORDSIZE == 64
|
||||||
jit_extr_i(r0, JIT_RET);
|
jit_extr_i(r0, JIT_RET);
|
||||||
|
#else
|
||||||
|
jit_movr(r0, JIT_RET);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if __WORDSIZE == 64
|
||||||
void
|
void
|
||||||
_jit_retval_ui(jit_state_t *_jit, jit_int32_t r0)
|
_jit_retval_ui(jit_state_t *_jit, jit_int32_t r0)
|
||||||
{
|
{
|
||||||
|
@ -550,6 +578,7 @@ _jit_retval_l(jit_state_t *_jit, jit_int32_t r0)
|
||||||
{
|
{
|
||||||
jit_movr(r0, JIT_RET);
|
jit_movr(r0, JIT_RET);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
_jit_retval_f(jit_state_t *_jit, jit_int32_t r0)
|
_jit_retval_f(jit_state_t *_jit, jit_int32_t r0)
|
||||||
|
@ -762,8 +791,10 @@ _emit_code(jit_state_t *_jit)
|
||||||
case_rrw(xor,);
|
case_rrw(xor,);
|
||||||
case_rr(trunc, _f_i);
|
case_rr(trunc, _f_i);
|
||||||
case_rr(trunc, _d_i);
|
case_rr(trunc, _d_i);
|
||||||
|
#if __WORDSIZE == 64
|
||||||
case_rr(trunc, _f_l);
|
case_rr(trunc, _f_l);
|
||||||
case_rr(trunc, _d_l);
|
case_rr(trunc, _d_l);
|
||||||
|
#endif
|
||||||
case_rr(ld, _c);
|
case_rr(ld, _c);
|
||||||
case_rw(ld, _c);
|
case_rw(ld, _c);
|
||||||
case_rr(ld, _uc);
|
case_rr(ld, _uc);
|
||||||
|
@ -774,10 +805,12 @@ _emit_code(jit_state_t *_jit)
|
||||||
case_rw(ld, _us);
|
case_rw(ld, _us);
|
||||||
case_rr(ld, _i);
|
case_rr(ld, _i);
|
||||||
case_rw(ld, _i);
|
case_rw(ld, _i);
|
||||||
|
#if __WORDSIZE == 64
|
||||||
case_rr(ld, _ui);
|
case_rr(ld, _ui);
|
||||||
case_rw(ld, _ui);
|
case_rw(ld, _ui);
|
||||||
case_rr(ld, _l);
|
case_rr(ld, _l);
|
||||||
case_rw(ld, _l);
|
case_rw(ld, _l);
|
||||||
|
#endif
|
||||||
case_rrr(ldx, _c);
|
case_rrr(ldx, _c);
|
||||||
case_rrw(ldx, _c);
|
case_rrw(ldx, _c);
|
||||||
case_rrr(ldx, _uc);
|
case_rrr(ldx, _uc);
|
||||||
|
@ -788,35 +821,45 @@ _emit_code(jit_state_t *_jit)
|
||||||
case_rrw(ldx, _us);
|
case_rrw(ldx, _us);
|
||||||
case_rrr(ldx, _i);
|
case_rrr(ldx, _i);
|
||||||
case_rrw(ldx, _i);
|
case_rrw(ldx, _i);
|
||||||
|
#if __WORDSIZE == 64
|
||||||
case_rrr(ldx, _ui);
|
case_rrr(ldx, _ui);
|
||||||
case_rrw(ldx, _ui);
|
case_rrw(ldx, _ui);
|
||||||
case_rrr(ldx, _l);
|
case_rrr(ldx, _l);
|
||||||
case_rrw(ldx, _l);
|
case_rrw(ldx, _l);
|
||||||
|
#endif
|
||||||
case_rr(st, _c);
|
case_rr(st, _c);
|
||||||
case_wr(st, _c);
|
case_wr(st, _c);
|
||||||
case_rr(st, _s);
|
case_rr(st, _s);
|
||||||
case_wr(st, _s);
|
case_wr(st, _s);
|
||||||
case_rr(st, _i);
|
case_rr(st, _i);
|
||||||
case_wr(st, _i);
|
case_wr(st, _i);
|
||||||
|
#if __WORDSIZE == 64
|
||||||
case_rr(st, _l);
|
case_rr(st, _l);
|
||||||
case_wr(st, _l);
|
case_wr(st, _l);
|
||||||
|
#endif
|
||||||
case_rrr(stx, _c);
|
case_rrr(stx, _c);
|
||||||
case_wrr(stx, _c);
|
case_wrr(stx, _c);
|
||||||
case_rrr(stx, _s);
|
case_rrr(stx, _s);
|
||||||
case_wrr(stx, _s);
|
case_wrr(stx, _s);
|
||||||
case_rrr(stx, _i);
|
case_rrr(stx, _i);
|
||||||
case_wrr(stx, _i);
|
case_wrr(stx, _i);
|
||||||
|
#if __WORDSIZE == 64
|
||||||
case_rrr(stx, _l);
|
case_rrr(stx, _l);
|
||||||
case_wrr(stx, _l);
|
case_wrr(stx, _l);
|
||||||
|
#endif
|
||||||
case_rr(hton, _us);
|
case_rr(hton, _us);
|
||||||
case_rr(hton, _ui);
|
case_rr(hton, _ui);
|
||||||
|
#if __WORDSIZE == 64
|
||||||
case_rr(hton, _ul);
|
case_rr(hton, _ul);
|
||||||
|
#endif
|
||||||
case_rr(ext, _c);
|
case_rr(ext, _c);
|
||||||
case_rr(ext, _uc);
|
case_rr(ext, _uc);
|
||||||
case_rr(ext, _s);
|
case_rr(ext, _s);
|
||||||
case_rr(ext, _us);
|
case_rr(ext, _us);
|
||||||
|
#if __WORDSIZE == 64
|
||||||
case_rr(ext, _i);
|
case_rr(ext, _i);
|
||||||
case_rr(ext, _ui);
|
case_rr(ext, _ui);
|
||||||
|
#endif
|
||||||
case_rr(mov,);
|
case_rr(mov,);
|
||||||
case jit_code_movi:
|
case jit_code_movi:
|
||||||
if (node->flag & jit_flag_node) {
|
if (node->flag & jit_flag_node) {
|
||||||
|
|
|
@ -46,7 +46,7 @@ static jit_int16_t _szs[jit_code_last_code + 1] = {
|
||||||
# include "jit_hppa-sz.c"
|
# include "jit_hppa-sz.c"
|
||||||
# elif defined(__aarch64__)
|
# elif defined(__aarch64__)
|
||||||
# include "jit_aarch64-sz.c"
|
# include "jit_aarch64-sz.c"
|
||||||
# elif defined(__s390x__)
|
# elif defined(__s390__) || defined(__s390x__)
|
||||||
# include "jit_s390x-sz.c"
|
# include "jit_s390x-sz.c"
|
||||||
# elif defined(__alpha__)
|
# elif defined(__alpha__)
|
||||||
# include "jit_alpha-sz.c"
|
# include "jit_alpha-sz.c"
|
||||||
|
|
|
@ -3185,7 +3185,7 @@ _patch_register(jit_state_t *_jit, jit_node_t *node, jit_node_t *link,
|
||||||
# include "jit_hppa.c"
|
# include "jit_hppa.c"
|
||||||
#elif defined(__aarch64__)
|
#elif defined(__aarch64__)
|
||||||
# include "jit_aarch64.c"
|
# include "jit_aarch64.c"
|
||||||
#elif defined(__s390x__)
|
#elif defined(__s390__) || defined(__s390x__)
|
||||||
# include "jit_s390x.c"
|
# include "jit_s390x.c"
|
||||||
#elif defined(__alpha__)
|
#elif defined(__alpha__)
|
||||||
# include "jit_alpha.c"
|
# include "jit_alpha.c"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue