1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-04 14:20:26 +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:
pcpa 2015-01-08 10:45:30 -02:00
parent af9df5faeb
commit 32c4f90a2b
11 changed files with 876 additions and 173 deletions

View file

@ -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>
* lib/jit_ppc-cpu.c, lib/jit_ppc.c: Correct some endianess issues

View file

@ -140,7 +140,7 @@ typedef jit_int32_t jit_fpr_t;
# include <lightning/jit_hppa.h>
#elif defined(__aarch64__)
# include <lightning/jit_aarch64.h>
#elif defined(__s390x__)
#elif defined(__s390__) || defined(__s390x__)
# include <lightning/jit_s390x.h>
#elif defined(__alpha__)
# include <lightning/jit_alpha.h>

View file

@ -115,7 +115,7 @@ typedef jit_uint64_t jit_regset_t;
# define JIT_RET _R0
# define JIT_FRET _V0
typedef jit_uint64_t jit_regset_t;
#elif defined(__s390x__)
#elif defined(__s390__) || defined(__s390x__)
# define JIT_SP _R15
# define JIT_RET _R2
# define JIT_FRET _F0

View file

@ -33,7 +33,11 @@ typedef enum {
#define jit_r_num() 3
#define jit_v(i) (_R11 + ((i) << 1))
#define jit_v_num() 3
#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_num() 6
#define JIT_R0 _R12

View file

@ -100,9 +100,13 @@ jit_init_debug(const char *progname)
# if defined(__sparc__)
disasm_info.endian = disasm_info.display_endian = BFD_ENDIAN_BIG;
# endif
# if defined(__s390x__)
# if defined(__s390__) || defined(__s390x__)
disasm_info.arch = bfd_arch_s390;
# if __WORDSIZE == 32
disasm_info.mach = bfd_mach_s390_31;
# else
disasm_info.mach = bfd_mach_s390_64;
# endif
disasm_info.endian = disasm_info.display_endian = BFD_ENDIAN_BIG;
disasm_info.disassembler_options = "zarch";
# endif

File diff suppressed because it is too large Load diff

View file

@ -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 truncr_f_i(r0,r1) CFEBR(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_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_d(r0,r1) CDGBR(r0,r1)
# endif
# define extr_d_f(r0,r1) LEDBR(r0,r1)
# define extr_f_d(r0,r1) LDEBR(r0,r1)
# 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)
{
union {
#if __WORDSIZE == 32
jit_int32_t i[2];
#else
jit_int64_t l;
#endif
jit_float64_t d;
} data;
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) {
data.d = *i0;
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);
stxi_l(-8, _FP_REGNO, rn(reg));
#endif
jit_unget_reg_but_zero(reg);
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;
reg = jit_get_reg_but_zero(0);
movr(rn(reg), r1);
AGR(rn(reg), r2);
addr(rn(reg), rn(reg), r2);
ldr_f(r0, rn(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;
reg = jit_get_reg_but_zero(0);
movr(rn(reg), r1);
AGR(rn(reg), r2);
addr(rn(reg), rn(reg), r2);
ldr_d(r0, rn(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 {
reg = jit_get_reg_but_zero(0);
movi(rn(reg), i0);
AGR(rn(reg), r1);
addr(rn(reg), rn(reg), r1);
ldr_f(r0, rn(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 {
reg = jit_get_reg_but_zero(0);
movi(rn(reg), i0);
AGR(rn(reg), r1);
addr(rn(reg), rn(reg), r1);
ldr_d(r0, rn(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;
reg = jit_get_reg_but_zero(0);
movr(rn(reg), r0);
AGR(rn(reg), r1);
addr(rn(reg), rn(reg), r1);
str_f(rn(reg), r2);
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;
reg = jit_get_reg_but_zero(0);
movr(rn(reg), r0);
AGR(rn(reg), r1);
addr(rn(reg), rn(reg), r1);
str_d(rn(reg), r2);
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 {
reg = jit_get_reg_but_zero(0);
movi(rn(reg), i0);
AGR(rn(reg), r0);
addr(rn(reg), rn(reg), r0);
str_f(rn(reg), r1);
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 {
reg = jit_get_reg_but_zero(0);
movi(rn(reg), i0);
AGR(rn(reg), r0);
addr(rn(reg), rn(reg), r0);
str_d(rn(reg), r1);
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)
{
jit_word_t unord, eq;
LGHI(r0, 1); /* set to one */
movi(r0, 1); /* set to one */
CEBR(r1, r2);
unord = _jit->pc.w; /* keep set to one if unord */
BRC(CC_O, 0);
eq = _jit->pc.w;
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(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)
{
jit_word_t unord, eq;
LGHI(r0, 1); /* set to one */
movi(r0, 1); /* set to one */
CDBR(r1, r2);
unord = _jit->pc.w; /* keep set to one if unord */
BRC(CC_O, 0);
eq = _jit->pc.w;
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(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)
{
jit_word_t unord, eq;
LGHI(r0, 0); /* set to zero */
movi(r0, 0); /* set to zero */
CEBR(r1, r2);
unord = _jit->pc.w; /* keep set to zero if unord */
BRC(CC_O, 0);
eq = _jit->pc.w;
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(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)
{
jit_word_t unord, eq;
LGHI(r0, 0); /* set to zero */
movi(r0, 0); /* set to zero */
CDBR(r1, r2);
unord = _jit->pc.w; /* keep set to zero if unord */
BRC(CC_O, 0);
eq = _jit->pc.w;
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(eq, _jit->pc.w);
}

View file

@ -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
#define JIT_INSTR_MAX 68
0, /* data */

View file

@ -22,6 +22,11 @@
#define rc(value) jit_class_##value
#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
@ -69,7 +74,8 @@ jit_register_t _rvs[] = {
{ rc(fpr) | 0x5, "%f5" },
{ rc(fpr) | 0x7, "%f7" },
{ 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) | 0x9, "%f9" },
{ rc(fpr) | rc(sav) | 0xa, "%f10" },
@ -239,7 +245,7 @@ _jit_arg_f(jit_state_t *_jit)
{
jit_int32_t offset;
assert(_jitc->function);
if (_jitc->function->self.argf < 4)
if (_jitc->function->self.argf < NUM_FLOAT_REG_ARGS)
offset = _jitc->function->self.argf++;
else {
offset = _jitc->function->self.size;
@ -251,7 +257,7 @@ _jit_arg_f(jit_state_t *_jit)
jit_bool_t
_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 *
@ -259,11 +265,11 @@ _jit_arg_d(jit_state_t *_jit)
{
jit_int32_t offset;
assert(_jitc->function);
if (_jitc->function->self.argf < 4)
if (_jitc->function->self.argf < NUM_FLOAT_REG_ARGS)
offset = _jitc->function->self.argf++;
else {
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));
}
@ -317,13 +323,19 @@ _jit_getarg_us(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
void
_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);
#endif
}
else
jit_ldxi_i(u, JIT_FP,
v->u.w + (__WORDSIZE >> 3) - sizeof(jit_int32_t));
}
#if __WORDSIZE == 64
void
_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
jit_ldxi_l(u, JIT_FP, v->u.w);
}
#endif
void
_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);
else
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
@ -398,13 +415,16 @@ void
_jit_pushargr_f(jit_state_t *_jit, jit_int32_t u)
{
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);
++_jitc->function->call.argf;
}
else {
jit_stxi_f(_jitc->function->call.size + stack_framesize +
(__WORDSIZE >> 3) - sizeof(jit_float32_t), JIT_SP, u);
jit_stxi_f(_jitc->function->call.size + stack_framesize
#if __WORDSIZE == 64
+ (__WORDSIZE >> 3) - sizeof(jit_float32_t)
#endif
, JIT_SP, u);
_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;
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);
++_jitc->function->call.argf;
}
else {
regno = jit_get_reg(jit_class_fpr);
jit_movi_f(regno, u);
jit_stxi_f(_jitc->function->call.size + stack_framesize +
(__WORDSIZE >> 3) - sizeof(jit_float32_t), JIT_SP, regno);
jit_stxi_f(_jitc->function->call.size + stack_framesize
#if __WORDSIZE == 64
+ (__WORDSIZE >> 3) - sizeof(jit_float32_t)
#endif
, JIT_SP, regno);
jit_unget_reg(regno);
_jitc->function->call.size += sizeof(jit_word_t);
}
@ -432,13 +455,13 @@ void
_jit_pushargr_d(jit_state_t *_jit, jit_int32_t u)
{
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);
++_jitc->function->call.argf;
}
else {
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;
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);
++_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_stxi_d(_jitc->function->call.size + stack_framesize, JIT_SP, 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
_jit_retval_i(jit_state_t *_jit, jit_int32_t r0)
{
#if __WORDSIZE == 64
jit_extr_i(r0, JIT_RET);
#else
jit_movr(r0, JIT_RET);
#endif
}
#if __WORDSIZE == 64
void
_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);
}
#endif
void
_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_rr(trunc, _f_i);
case_rr(trunc, _d_i);
#if __WORDSIZE == 64
case_rr(trunc, _f_l);
case_rr(trunc, _d_l);
#endif
case_rr(ld, _c);
case_rw(ld, _c);
case_rr(ld, _uc);
@ -774,10 +805,12 @@ _emit_code(jit_state_t *_jit)
case_rw(ld, _us);
case_rr(ld, _i);
case_rw(ld, _i);
#if __WORDSIZE == 64
case_rr(ld, _ui);
case_rw(ld, _ui);
case_rr(ld, _l);
case_rw(ld, _l);
#endif
case_rrr(ldx, _c);
case_rrw(ldx, _c);
case_rrr(ldx, _uc);
@ -788,35 +821,45 @@ _emit_code(jit_state_t *_jit)
case_rrw(ldx, _us);
case_rrr(ldx, _i);
case_rrw(ldx, _i);
#if __WORDSIZE == 64
case_rrr(ldx, _ui);
case_rrw(ldx, _ui);
case_rrr(ldx, _l);
case_rrw(ldx, _l);
#endif
case_rr(st, _c);
case_wr(st, _c);
case_rr(st, _s);
case_wr(st, _s);
case_rr(st, _i);
case_wr(st, _i);
#if __WORDSIZE == 64
case_rr(st, _l);
case_wr(st, _l);
#endif
case_rrr(stx, _c);
case_wrr(stx, _c);
case_rrr(stx, _s);
case_wrr(stx, _s);
case_rrr(stx, _i);
case_wrr(stx, _i);
#if __WORDSIZE == 64
case_rrr(stx, _l);
case_wrr(stx, _l);
#endif
case_rr(hton, _us);
case_rr(hton, _ui);
#if __WORDSIZE == 64
case_rr(hton, _ul);
#endif
case_rr(ext, _c);
case_rr(ext, _uc);
case_rr(ext, _s);
case_rr(ext, _us);
#if __WORDSIZE == 64
case_rr(ext, _i);
case_rr(ext, _ui);
#endif
case_rr(mov,);
case jit_code_movi:
if (node->flag & jit_flag_node) {

View file

@ -46,7 +46,7 @@ static jit_int16_t _szs[jit_code_last_code + 1] = {
# include "jit_hppa-sz.c"
# elif defined(__aarch64__)
# include "jit_aarch64-sz.c"
# elif defined(__s390x__)
# elif defined(__s390__) || defined(__s390x__)
# include "jit_s390x-sz.c"
# elif defined(__alpha__)
# include "jit_alpha-sz.c"

View file

@ -3185,7 +3185,7 @@ _patch_register(jit_state_t *_jit, jit_node_t *node, jit_node_t *link,
# include "jit_hppa.c"
#elif defined(__aarch64__)
# include "jit_aarch64.c"
#elif defined(__s390x__)
#elif defined(__s390__) || defined(__s390x__)
# include "jit_s390x.c"
#elif defined(__alpha__)
# include "jit_alpha.c"