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

x86: Implement support for the x32 abi

* include/lightning/jit_private.h, include/lightning/jit_x86.h,
	lib/jit_disasm.c, lib/jit_x86-cpu.c, lib/jit_x86-sse.c,
	lib/jit_x86-sz.c, lib/jit_x86-x87.c, lib/jit_x86.c,
	size.c: Implement support for the x32 abi. Built and
	tested on Gentoo default/linux/amd64/13.0/x32 profile.
This commit is contained in:
Paulo Andrade 2014-12-24 14:14:38 -02:00
parent 3b829ab075
commit fdf41c1fa4
10 changed files with 637 additions and 183 deletions

View file

@ -1,3 +1,11 @@
2014-12-24 Paulo Andrade <pcpa@gnu.org>
* include/lightning/jit_private.h, include/lightning/jit_x86.h,
lib/jit_disasm.c, lib/jit_x86-cpu.c, lib/jit_x86-sse.c,
lib/jit_x86-sz.c, lib/jit_x86-x87.c, lib/jit_x86.c,
size.c: Implement support for the x32 abi. Built and
tested on Gentoo default/linux/amd64/13.0/x32 profile.
2014-12-24 Paulo Andrade <pcpa@gnu.org>
* lib/jit_names.c: Add missing rsbi_f and rsbi_d strings.

View file

@ -50,7 +50,7 @@
#if defined(__i386__) || defined(__x86_64__)
# define JIT_SP _RSP
# define JIT_RET _RAX
# if __WORDSIZE == 32
# if __X32
# define JIT_FRET _ST0
typedef jit_uint32_t jit_regset_t;
# else

View file

@ -28,10 +28,20 @@
*/
#define jit_sse2_p() jit_cpu.sse2
#define jit_x87_reg_p(reg) ((reg) >= _ST0 && (reg) <= _ST7)
#if __WORDSIZE == 32
# if defined(__x86_64__)
# define __X64_32 1
# define __X64 1
# else
# define __X32 1
# endif
#else
# define __X64 1
#endif
#define JIT_FP _RBP
typedef enum {
#if __WORDSIZE == 32
#if __X32
# define jit_arg_reg_p(i) 0
# define jit_r(i) (_RAX + (i))
# define jit_r_num() 3

View file

@ -79,7 +79,11 @@ jit_init_debug(const char *progname)
# if defined(__i386__) || defined(__x86_64__)
disasm_info.arch = bfd_arch_i386;
# if defined(__x86_64__)
# if __WORDSIZE == 32
disasm_info.mach = bfd_mach_x64_32;
# else
disasm_info.mach = bfd_mach_x86_64;
# endif
# else
disasm_info.mach = bfd_mach_i386_i386;
# endif

View file

@ -21,7 +21,8 @@
#define USE_INC_DEC 0
#if PROTO
# if __WORDSIZE == 32
# if __X32 || __X64_32
# define WIDE 0
# define ldi(u, v) ldi_i(u, v)
# define ldxi(u, v, w) ldxi_i(u, v, w)
# define sti(u, v) sti_i(u, v)
@ -29,25 +30,24 @@
# define can_sign_extend_int_p(im) 1
# define can_zero_extend_int_p(im) 1
# define fits_uint32_p(im) 1
# define reg8_p(rn) \
((rn) >= _RAX_REGNO && (rn) <= _RBX_REGNO)
# else
# define WIDE 1
# define ldi(u, v) ldi_l(u, v)
# define ldxi(u, v, w) ldxi_l(u, v, w)
# define sti(u, v) sti_l(u, v)
# define stxi(u, v, w) stxi_l(u, v, w)
# define can_sign_extend_int_p(im) \
(((im) >= 0 && (long)(im) <= 0x7fffffffL) || \
((im) < 0 && (long)(im) > -0x80000000L))
(((im) >= 0 && (long long)(im) <= 0x7fffffffLL) || \
((im) < 0 && (long long)(im) > -0x80000000LL))
# define can_zero_extend_int_p(im) \
((im) >= 0 && (im) < 0x80000000L)
# define fits_uint32_p(im) (((im) & 0xffffffff00000000L) == 0)
# if __CYGWIN__
((im) >= 0 && (im) < 0x80000000LL)
# define fits_uint32_p(im) (((im) & 0xffffffff00000000LL) == 0)
# endif
# if __X32 || __CYGWIN__ || __X64_32
# define reg8_p(rn) \
(r7(rn) >= _RAX_REGNO && r7(rn) <= _RBX_REGNO)
# else
((rn) >= _RAX_REGNO && (rn) <= _RBX_REGNO)
# else
# define reg8_p(rn) 1
# endif
# endif
# define _RAX_REGNO 0
# define _RCX_REGNO 1
@ -127,8 +127,10 @@
# define ic(c) *_jit->pc.uc++ = c
# define is(s) *_jit->pc.us++ = s
# define ii(i) *_jit->pc.ui++ = i
# if __WORDSIZE == 64
# if __X64 && !__X64_32
# define il(l) *_jit->pc.ul++ = l
# else
# define il(l) ii(l)
# endif
# define patch_abs(instr, label) \
*(jit_word_t *)(instr - sizeof(jit_word_t)) = label
@ -363,7 +365,7 @@ static void _movcr_u(jit_state_t*,jit_int32_t,jit_int32_t);
static void _movsr(jit_state_t*,jit_int32_t,jit_int32_t);
# define movsr_u(r0, r1) _movsr_u(_jit, r0, r1)
static void _movsr_u(jit_state_t*,jit_int32_t,jit_int32_t);
# if __WORDSIZE == 64
# if __X64 && !__X64_32
# define movir(r0, r1) _movir(_jit, r0, r1)
static void _movir(jit_state_t*,jit_int32_t,jit_int32_t);
# define movir_u(r0, r1) _movir_u(_jit, r0, r1)
@ -377,7 +379,7 @@ static void _extr_c(jit_state_t*,jit_int32_t,jit_int32_t);
static void _extr_uc(jit_state_t*,jit_int32_t,jit_int32_t);
# define extr_s(r0, r1) movsr(r0, r1)
# define extr_us(r0, r1) movsr_u(r0, r1)
# if __WORDSIZE == 64
# if __X64 && !__X64_32
# define extr_i(r0, r1) movir(r0, r1)
# define extr_ui(r0, r1) movir_u(r0, r1)
# endif
@ -397,19 +399,28 @@ static void _ldi_s(jit_state_t*, jit_int32_t, jit_word_t);
static void _ldr_us(jit_state_t*, jit_int32_t, jit_int32_t);
# define ldi_us(r0, i0) _ldi_us(_jit, r0, i0)
static void _ldi_us(jit_state_t*, jit_int32_t, jit_word_t);
# define ldr_i(r0, r1) _ldr_i(_jit, r0, r1)
# if __X32 || !__X64_32
# define ldr_i(r0, r1) _ldr_i(_jit, r0, r1)
static void _ldr_i(jit_state_t*, jit_int32_t, jit_int32_t);
# define ldi_i(r0, i0) _ldi_i(_jit, r0, i0)
# define ldi_i(r0, i0) _ldi_i(_jit, r0, i0)
static void _ldi_i(jit_state_t*, jit_int32_t, jit_word_t);
# if __WORDSIZE == 64
# define ldr_ui(r0, r1) _ldr_ui(_jit, r0, r1)
# endif
# if __X64
# if __X64_32
# define ldr_i(r0, r1) _ldr_ui(_jit, r0, r1)
# define ldi_i(r0, i0) _ldi_ui(_jit, r0, i0)
# else
# define ldr_ui(r0, r1) _ldr_ui(_jit, r0, r1)
# define ldi_ui(r0, i0) _ldi_ui(_jit, r0, i0)
# endif
static void _ldr_ui(jit_state_t*, jit_int32_t, jit_int32_t);
# define ldi_ui(r0, i0) _ldi_ui(_jit, r0, i0)
static void _ldi_ui(jit_state_t*, jit_int32_t, jit_word_t);
# define ldr_l(r0, r1) _ldr_l(_jit, r0, r1)
# if !__X64_32
# define ldr_l(r0, r1) _ldr_l(_jit, r0, r1)
static void _ldr_l(jit_state_t*, jit_int32_t, jit_int32_t);
# define ldi_l(r0, i0) _ldi_l(_jit, r0, i0)
# define ldi_l(r0, i0) _ldi_l(_jit, r0, i0)
static void _ldi_l(jit_state_t*, jit_int32_t, jit_word_t);
# endif
# endif
# define ldxr_c(r0, r1, r2) _ldxr_c(_jit, r0, r1, r2)
static void _ldxr_c(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
@ -427,19 +438,29 @@ static void _ldxi_s(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
static void _ldxr_us(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
# define ldxi_us(r0, r1, i0) _ldxi_us(_jit, r0, r1, i0)
static void _ldxi_us(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
# define ldxr_i(r0, r1, r2) _ldxr_i(_jit, r0, r1, r2)
# if __X32 || !__X64_32
# define ldxr_i(r0, r1, r2) _ldxr_i(_jit, r0, r1, r2)
static void _ldxr_i(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
# define ldxi_i(r0, r1, i0) _ldxi_i(_jit, r0, r1, i0)
# define ldxi_i(r0, r1, i0) _ldxi_i(_jit, r0, r1, i0)
static void _ldxi_i(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
# if __WORDSIZE == 64
# define ldxr_ui(r0, r1, r2) _ldxr_ui(_jit, r0, r1, r2)
# endif
# if __X64
# if __X64_32
# define ldxr_i(r0, r1, r2) _ldxr_ui(_jit, r0, r1, r2)
# define ldxi_i(r0, r1, i0) _ldxi_ui(_jit, r0, r1, i0)
# else
# define ldxr_ui(r0, r1, r2) _ldxr_ui(_jit, r0, r1, r2)
# define ldxi_ui(r0, r1, i0) _ldxi_ui(_jit, r0, r1, i0)
# endif
static void _ldxr_ui(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
# define ldxi_ui(r0, r1, i0) _ldxi_ui(_jit, r0, r1, i0)
static void _ldxi_ui(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
# define ldxr_l(r0, r1, r2) _ldxr_l(_jit, r0, r1, r2)
# if !__X64_32
# define ldxr_l(r0, r1, r2) _ldxr_l(_jit, r0, r1, r2)
static void _ldxr_l(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
# define ldxi_l(r0, r1, i0) _ldxi_l(_jit, r0, r1, i0)
# define ldxi_l(r0, r1, i0) _ldxi_l(_jit, r0, r1, i0)
static void _ldxi_l(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
# endif
# endif
# define str_c(r0, r1) _str_c(_jit, r0, r1)
static void _str_c(jit_state_t*, jit_int32_t, jit_int32_t);
@ -453,7 +474,7 @@ static void _sti_s(jit_state_t*, jit_word_t, jit_int32_t);
static void _str_i(jit_state_t*, jit_int32_t, jit_int32_t);
# define sti_i(i0, r0) _sti_i(_jit, i0, r0)
static void _sti_i(jit_state_t*, jit_word_t, jit_int32_t);
# if __WORDSIZE == 64
# if __X64 && !__X64_32
# define str_l(r0, r1) _str_l(_jit, r0, r1)
static void _str_l(jit_state_t*, jit_int32_t, jit_int32_t);
# define sti_l(i0, r0) _sti_l(_jit, i0, r0)
@ -471,7 +492,7 @@ static void _stxi_s(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
static void _stxr_i(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
# define stxi_i(i0, r0, r1) _stxi_i(_jit, i0, r0, r1)
static void _stxi_i(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
# if __WORDSIZE == 64
# if __X64 && !__X64_32
# define stxr_l(r0, r1, r2) _stxr_l(_jit, r0, r1, r2)
static void _stxr_l(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
# define stxi_l(i0, r0, r1) _stxi_l(_jit, i0, r0, r1)
@ -642,7 +663,7 @@ static void _epilog(jit_state_t*, jit_node_t*);
# define patch_at(node, instr, label) _patch_at(_jit, node, instr, label)
static void _patch_at(jit_state_t*, jit_node_t*, jit_word_t, jit_word_t);
# if !defined(HAVE_FFSL)
# if __WORDSIZE == 32
# if __X32
# define ffsl(i) ffs(i)
# else
static int ffsl(long);
@ -655,7 +676,7 @@ static void
_rex(jit_state_t *_jit, jit_int32_t l, jit_int32_t w,
jit_int32_t r, jit_int32_t x, jit_int32_t b)
{
#if __WORDSIZE == 64
#if __X64
jit_int32_t v = 0x40 | (w << 3);
if (r != _NOREG)
@ -675,7 +696,7 @@ _rx(jit_state_t *_jit, jit_int32_t rd, jit_int32_t md,
{
if (ri == _NOREG) {
if (rb == _NOREG) {
#if __WORDSIZE == 32
#if __X32
mrm(0x00, r7(rd), 0x05);
#else
mrm(0x00, r7(rd), 0x04);
@ -784,7 +805,7 @@ static void
_lea(jit_state_t *_jit, jit_int32_t md, jit_int32_t rb,
jit_int32_t ri, jit_int32_t ms, jit_int32_t rd)
{
rex(0, 1, rd, ri, rb);
rex(0, WIDE, rd, ri, rb);
ic(0x8d);
rx(rd, md, rb, ri, ms);
}
@ -792,21 +813,21 @@ _lea(jit_state_t *_jit, jit_int32_t md, jit_int32_t rb,
static void
_pushr(jit_state_t *_jit, jit_int32_t r0)
{
rex(0, 0, 0, 0, r0);
rex(0, WIDE, 0, 0, r0);
ic(0x50 | r7(r0));
}
static void
_popr(jit_state_t *_jit, jit_int32_t r0)
{
rex(0, 0, 0, 0, r0);
rex(0, WIDE, 0, 0, r0);
ic(0x58 | r7(r0));
}
static void
_xchgr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
rex(0, 1, r1, _NOREG, r0);
rex(0, WIDE, r1, _NOREG, r0);
ic(0x87);
mrm(0x03, r7(r1), r7(r0));
}
@ -814,7 +835,7 @@ _xchgr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
static void
_testr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
rex(0, 1, r1, _NOREG, r0);
rex(0, WIDE, r1, _NOREG, r0);
ic(0x85);
mrm(0x03, r7(r1), r7(r0));
}
@ -822,7 +843,7 @@ _testr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
static void
_testi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
rex(0, 1, _NOREG, _NOREG, r0);
rex(0, WIDE, _NOREG, _NOREG, r0);
if (r0 == _RAX_REGNO)
ic(0xa9);
else {
@ -844,7 +865,7 @@ _cc(jit_state_t *_jit, jit_int32_t code, jit_int32_t r0)
static void
_alur(jit_state_t *_jit, jit_int32_t code, jit_int32_t r0, jit_int32_t r1)
{
rex(0, 1, r1, _NOREG, r0);
rex(0, WIDE, r1, _NOREG, r0);
ic(code | 0x01);
mrm(0x03, r7(r1), r7(r0));
}
@ -854,7 +875,7 @@ _alui(jit_state_t *_jit, jit_int32_t code, jit_int32_t r0, jit_word_t i0)
{
jit_int32_t reg;
if (can_sign_extend_int_p(i0)) {
rex(0, 1, _NOREG, _NOREG, r0);
rex(0, WIDE, _NOREG, _NOREG, r0);
if ((jit_int8_t)i0 == i0) {
ic(0x83);
ic(0xc0 | code | r7(r0));
@ -1121,7 +1142,7 @@ _rsbi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
static void
_imulr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
rex(0, 1, r0, _NOREG, r1);
rex(0, WIDE, r0, _NOREG, r1);
ic(0x0f);
ic(0xaf);
mrm(0x03, r7(r0), r7(r1));
@ -1132,7 +1153,7 @@ _imuli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
if (can_sign_extend_int_p(i0)) {
rex(0, 1, r0, _NOREG, r1);
rex(0, WIDE, r0, _NOREG, r1);
if ((jit_int8_t)i0 == i0) {
ic(0x6b);
mrm(0x03, r7(r0), r7(r1));
@ -1298,7 +1319,7 @@ _iqmuli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
static void
_sign_extend_rdx_rax(jit_state_t *_jit)
{
rex(0, 1, 0, 0, 0);
rex(0, WIDE, 0, 0, 0);
ic(0x99);
}
@ -1706,7 +1727,7 @@ _xori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
static void
_irotshr(jit_state_t *_jit, jit_int32_t code, jit_int32_t r0)
{
rex(0, 1, _RCX_REGNO, _NOREG, r0);
rex(0, WIDE, _RCX_REGNO, _NOREG, r0);
ic(0xd3);
mrm(0x03, code, r7(r0));
}
@ -1762,7 +1783,7 @@ _rotshr(jit_state_t *_jit, jit_int32_t code,
static void
_irotshi(jit_state_t *_jit, jit_int32_t code, jit_int32_t r0, jit_word_t i0)
{
rex(0, 1, _NOREG, _NOREG, r0);
rex(0, WIDE, _NOREG, _NOREG, r0);
if (i0 == 1) {
ic(0xd1);
mrm(0x03, code, r7(r0));
@ -1797,7 +1818,7 @@ _lshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
static void
_unr(jit_state_t *_jit, jit_int32_t code, jit_int32_t r0)
{
rex(0, 1, _NOREG, _NOREG, r0);
rex(0, WIDE, _NOREG, _NOREG, r0);
ic(0xf7);
mrm(0x03, code, r7(r0));
}
@ -1825,8 +1846,8 @@ static void
_incr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
movr(r0, r1);
# if __WORDSIZE == 64
rex(0, 1, _NOREG, _NOREG, r0);
# if __X64
rex(0, WIDE, _NOREG, _NOREG, r0);
ic(0xff);
ic(0xc0 | r7(r0));
# else
@ -1838,8 +1859,8 @@ static void
_decr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
movr(r0, r1);
# if __WORDSIZE == 64
rex(0, 1, _NOREG, _NOREG, r0);
# if __X64
rex(0, WIDE, _NOREG, _NOREG, r0);
ic(0xff);
ic(0xc8 | r7(r0));
# else
@ -2088,17 +2109,21 @@ _movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
static void
_imovi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
#if __WORDSIZE == 64
#if __X64
# if !__X64_32
if (fits_uint32_p(i0)) {
# endif
rex(0, 0, _NOREG, _NOREG, r0);
ic(0xb8 | r7(r0));
ii(i0);
# if !__X64_32
}
else {
rex(0, 1, _NOREG, _NOREG, r0);
ic(0xb8 | r7(r0));
il(i0);
}
# endif
#else
ic(0xb8 | r7(r0));
ii(i0);
@ -2117,21 +2142,16 @@ _movi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
static jit_word_t
_movi_p(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
#if __WORDSIZE == 64
rex(0, 1, _NOREG, _NOREG, r0);
rex(0, WIDE, _NOREG, _NOREG, r0);
ic(0xb8 | r7(r0));
il(i0);
#else
ic(0xb8 | r7(r0));
ii(i0);
#endif
return (_jit->pc.w);
}
static void
_movcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
rex(0, 1, r0, _NOREG, r1);
rex(0, WIDE, r0, _NOREG, r1);
ic(0x0f);
ic(0xbe);
mrm(0x03, r7(r0), r7(r1));
@ -2140,7 +2160,7 @@ _movcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
static void
_movcr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
rex(0, 1, r0, _NOREG, r1);
rex(0, WIDE, r0, _NOREG, r1);
ic(0x0f);
ic(0xb6);
mrm(0x03, r7(r0), r7(r1));
@ -2149,7 +2169,7 @@ _movcr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
static void
_movsr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
rex(0, 1, r0, _NOREG, r1);
rex(0, WIDE, r0, _NOREG, r1);
ic(0x0f);
ic(0xbf);
mrm(0x03, r7(r0), r7(r1));
@ -2158,13 +2178,13 @@ _movsr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
static void
_movsr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
rex(0, 1, r0, _NOREG, r1);
rex(0, WIDE, r0, _NOREG, r1);
ic(0x0f);
ic(0xb7);
mrm(0x03, r7(r0), r7(r1));
}
#if __WORDSIZE == 64
#if __X64
static void
_movir(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
@ -2186,7 +2206,7 @@ static void
_htonr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
movr(r0, r1);
rex(0, 1, _NOREG, _NOREG, r0);
rex(0, WIDE, _NOREG, _NOREG, r0);
ic(0x0f);
ic(0xc8 | r7(r0));
}
@ -2222,7 +2242,7 @@ _extr_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
static void
_ldr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
rex(0, 1, r0, _NOREG, r1);
rex(0, WIDE, r0, _NOREG, r1);
ic(0x0f);
ic(0xbe);
rx(r0, 0, r1, _NOREG, _SCL1);
@ -2233,7 +2253,7 @@ _ldi_c(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
jit_int32_t reg;
if (can_sign_extend_int_p(i0)) {
rex(0, 1, r0, _NOREG, _NOREG);
rex(0, WIDE, r0, _NOREG, _NOREG);
ic(0x0f);
ic(0xbe);
rx(r0, i0, _NOREG, _NOREG, _SCL1);
@ -2249,7 +2269,7 @@ _ldi_c(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
static void
_ldr_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
rex(0, 1, r0, _NOREG, r1);
rex(0, WIDE, r0, _NOREG, r1);
ic(0x0f);
ic(0xb6);
rx(r0, 0, r1, _NOREG, _SCL1);
@ -2260,7 +2280,7 @@ _ldi_uc(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
jit_int32_t reg;
if (can_sign_extend_int_p(i0)) {
rex(0, 1, r0, _NOREG, _NOREG);
rex(0, WIDE, r0, _NOREG, _NOREG);
ic(0x0f);
ic(0xb6);
rx(r0, i0, _NOREG, _NOREG, _SCL1);
@ -2276,7 +2296,7 @@ _ldi_uc(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
static void
_ldr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
rex(0, 1, r0, _NOREG, r1);
rex(0, WIDE, r0, _NOREG, r1);
ic(0x0f);
ic(0xbf);
rx(r0, 0, r1, _NOREG, _SCL1);
@ -2287,7 +2307,7 @@ _ldi_s(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
jit_int32_t reg;
if (can_sign_extend_int_p(i0)) {
rex(0, 1, r0, _NOREG, _NOREG);
rex(0, WIDE, r0, _NOREG, _NOREG);
ic(0x0f);
ic(0xbf);
rx(r0, i0, _NOREG, _NOREG, _SCL1);
@ -2303,7 +2323,7 @@ _ldi_s(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
static void
_ldr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
rex(0, 1, r0, _NOREG, r1);
rex(0, WIDE, r0, _NOREG, r1);
ic(0x0f);
ic(0xb7);
rx(r0, 0, r1, _NOREG, _SCL1);
@ -2314,7 +2334,7 @@ _ldi_us(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
jit_int32_t reg;
if (can_sign_extend_int_p(i0)) {
rex(0, 1, r0, _NOREG, _NOREG);
rex(0, WIDE, r0, _NOREG, _NOREG);
ic(0x0f);
ic(0xb7);
rx(r0, i0, _NOREG, _NOREG, _SCL1);
@ -2327,11 +2347,12 @@ _ldi_us(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
}
}
#if __X32 || !__X64_32
static void
_ldr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
#if __WORDSIZE == 64
rex(0, 1, r0, _NOREG, r1);
#if __X64
rex(0, WIDE, r0, _NOREG, r1);
ic(0x63);
#else
ic(0x8b);
@ -2344,8 +2365,8 @@ _ldi_i(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
jit_int32_t reg;
if (can_sign_extend_int_p(i0)) {
#if __WORDSIZE == 64
rex(0, 1, r0, _NOREG, _NOREG);
#if __X64
rex(0, WIDE, r0, _NOREG, _NOREG);
ic(0x63);
#else
ic(0x8b);
@ -2359,8 +2380,9 @@ _ldi_i(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
jit_unget_reg(reg);
}
}
#endif
#if __WORDSIZE == 64
#if __X64
static void
_ldr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
@ -2386,6 +2408,7 @@ _ldi_ui(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
}
}
# if !__X64_32
static void
_ldr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
@ -2410,12 +2433,13 @@ _ldi_l(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
jit_unget_reg(reg);
}
}
# endif
#endif
static void
_ldxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
rex(0, 1, r0, r1, r2);
rex(0, WIDE, r0, r1, r2);
ic(0x0f);
ic(0xbe);
rx(r0, 0, r2, r1, _SCL1);
@ -2426,7 +2450,7 @@ _ldxi_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
if (can_sign_extend_int_p(i0)) {
rex(0, 1, r0, _NOREG, r1);
rex(0, WIDE, r0, _NOREG, r1);
ic(0x0f);
ic(0xbe);
rx(r0, i0, r1, _NOREG, _SCL1);
@ -2442,7 +2466,7 @@ _ldxi_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
static void
_ldxr_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
rex(0, 1, r0, r1, r2);
rex(0, WIDE, r0, r1, r2);
ic(0x0f);
ic(0xb6);
rx(r0, 0, r2, r1, _SCL1);
@ -2453,7 +2477,7 @@ _ldxi_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
if (can_sign_extend_int_p(i0)) {
rex(0, 1, r0, _NOREG, r1);
rex(0, WIDE, r0, _NOREG, r1);
ic(0x0f);
ic(0xb6);
rx(r0, i0, r1, _NOREG, _SCL1);
@ -2469,7 +2493,7 @@ _ldxi_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
static void
_ldxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
rex(0, 1, r0, r1, r2);
rex(0, WIDE, r0, r1, r2);
ic(0x0f);
ic(0xbf);
rx(r0, 0, r2, r1, _SCL1);
@ -2480,7 +2504,7 @@ _ldxi_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
if (can_sign_extend_int_p(i0)) {
rex(0, 1, r0, _NOREG, r1);
rex(0, WIDE, r0, _NOREG, r1);
ic(0x0f);
ic(0xbf);
rx(r0, i0, r1, _NOREG, _SCL1);
@ -2496,7 +2520,7 @@ _ldxi_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
static void
_ldxr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
rex(0, 1, r0, r1, r2);
rex(0, WIDE, r0, r1, r2);
ic(0x0f);
ic(0xb7);
rx(r0, 0, r2, r1, _SCL1);
@ -2507,7 +2531,7 @@ _ldxi_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
if (can_sign_extend_int_p(i0)) {
rex(0, 1, r0, _NOREG, r1);
rex(0, WIDE, r0, _NOREG, r1);
ic(0x0f);
ic(0xb7);
rx(r0, i0, r1, _NOREG, _SCL1);
@ -2520,11 +2544,12 @@ _ldxi_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
}
}
#if __X64 || !__X64_32
static void
_ldxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
#if __WORDSIZE == 64
rex(0, 1, r0, r1, r2);
#if __X64
rex(0, WIDE, r0, r1, r2);
ic(0x63);
#else
ic(0x8b);
@ -2537,8 +2562,8 @@ _ldxi_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
if (can_sign_extend_int_p(i0)) {
#if __WORDSIZE == 64
rex(0, 1, r0, _NOREG, r1);
#if __X64
rex(0, WIDE, r0, _NOREG, r1);
ic(0x63);
#else
ic(0x8b);
@ -2552,8 +2577,9 @@ _ldxi_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
jit_unget_reg(reg);
}
}
#endif
#if __WORDSIZE == 64
#if __X64
static void
_ldxr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
@ -2579,6 +2605,7 @@ _ldxi_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
}
}
# if !__X64_32
static void
_ldxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
@ -2603,6 +2630,7 @@ _ldxi_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
jit_unget_reg(reg);
}
}
# endif
#endif
static void
@ -2703,7 +2731,7 @@ _sti_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
}
}
#if __WORDSIZE == 64
#if __X64 && !__X64_32
static void
_str_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
@ -2828,7 +2856,7 @@ _stxi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
}
}
#if __WORDSIZE == 64
#if __X64 && !__X64_32
static void
_stxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
@ -3286,7 +3314,7 @@ _bxsubi_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
static void
_callr(jit_state_t *_jit, jit_int32_t r0)
{
#if __WORDSIZE == 32
#if __X32
emms();
#endif
rex(0, 0, _NOREG, _NOREG, r0);
@ -3298,7 +3326,7 @@ static jit_word_t
_calli(jit_state_t *_jit, jit_word_t i0)
{
jit_word_t word;
#if __WORDSIZE == 64
#if __X64
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
@ -3319,7 +3347,7 @@ _calli(jit_state_t *_jit, jit_word_t i0)
static void
_jmpr(jit_state_t *_jit, jit_int32_t r0)
{
rex(0, 1, _NOREG, _NOREG, r0);
rex(0, WIDE, _NOREG, _NOREG, r0);
ic(0xff);
mrm(0x03, 0x04, r7(r0));
}
@ -3344,7 +3372,7 @@ _prolog(jit_state_t *_jit, jit_node_t *node)
return;
_jitc->function->self.aoff = frame;
}
#if __WORDSIZE == 64 && __CYGWIN__
#if __X64 && __CYGWIN__
_jitc->function->stack = (((/* first 32 bytes must be allocated */
(_jitc->function->self.alen > 32 ?
_jitc->function->self.alen : 32) -
@ -3356,9 +3384,9 @@ _prolog(jit_state_t *_jit, jit_node_t *node)
_jitc->function->self.aoff) + 15) & -16) +
stack_adjust;
#endif
subi(_RSP_REGNO, _RSP_REGNO, stack_framesize - REAL_WORDSIZE);
/* callee save registers */
subi(_RSP_REGNO, _RSP_REGNO, stack_framesize - sizeof(jit_word_t));
#if __WORDSIZE == 32
#if __X32
if (jit_regset_tstbit(&_jitc->function->regset, _RDI))
stxi(12, _RSP_REGNO, _RDI_REGNO);
if (jit_regset_tstbit(&_jitc->function->regset, _RSI))
@ -3428,7 +3456,7 @@ _epilog(jit_state_t *_jit, jit_node_t *node)
return;
/* callee save registers */
movr(_RSP_REGNO, _RBP_REGNO);
#if __WORDSIZE == 32
#if __X32
if (jit_regset_tstbit(&_jitc->function->regset, _RDI))
ldxi(_RDI_REGNO, _RSP_REGNO, 12);
if (jit_regset_tstbit(&_jitc->function->regset, _RSI))
@ -3485,7 +3513,7 @@ _epilog(jit_state_t *_jit, jit_node_t *node)
# endif
#endif
ldxi(_RBP_REGNO, _RSP_REGNO, 0);
addi(_RSP_REGNO, _RSP_REGNO, stack_framesize - sizeof(jit_word_t));
addi(_RSP_REGNO, _RSP_REGNO, stack_framesize - REAL_WORDSIZE);
ic(0xc3);
}
@ -3495,9 +3523,9 @@ _patch_at(jit_state_t *_jit, jit_node_t *node,
jit_word_t instr, jit_word_t label)
{
switch (node->code) {
#if __WORDSIZE == 64
# if __X64
case jit_code_calli:
#endif
# endif
case jit_code_movi:
patch_abs(instr, label);
break;
@ -3507,7 +3535,7 @@ _patch_at(jit_state_t *_jit, jit_node_t *node,
}
}
# if __WORDSIZE == 64 && !defined(HAVE_FFSL)
# if __X64 && !defined(HAVE_FFSL)
static int
ffsl(long i)
{

View file

@ -18,6 +18,15 @@
*/
#if PROTO
# if __X32
# define sse_address_p(i0) 1
# else
# if __X64_32
# define sse_address_p(i0) ((jit_word_t)(i0) >= 0)
# else
# define sse_address_p(i0) can_sign_extend_int_p(i0)
# endif
# endif
# define _XMM6_REGNO 6
# define _XMM7_REGNO 7
# define _XMM8_REGNO 8
@ -78,7 +87,7 @@ static void _ssexi(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t)
# define andpdr(r0, r1) ssexr(0x66, X86_SSE_AND, r0, r1)
# define sse_truncr_f_i(r0, r1) ssexr(0xf3, X86_SSE_CVTTSI, r0, r1)
# define sse_truncr_d_i(r0, r1) ssexr(0xf2, X86_SSE_CVTTSI, r0, r1)
# if __WORDSIZE == 64
# if __X64
# define sse_truncr_f_l(r0, r1) sselxr(0xf3, X86_SSE_CVTTSI, r0, r1)
# define sse_truncr_d_l(r0, r1) sselxr(0xf2, X86_SSE_CVTTSI, r0, r1)
# define sse_extr_f(r0, r1) sselxr(0xf3, X86_SSE_CVTIS, r0, r1)
@ -100,7 +109,7 @@ static void _ssexi(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t)
# define psll(r0, i0) ssexi(0x72, r0, 0x06, i0)
# define pslq(r0, i0) ssexi(0x73, r0, 0x06, i0)
# define movdqxr(r0,r1) sselxr(0x66,X86_SSE_X2G,r0,r1)
# if __WORDSIZE == 64
# if __X64 && !__X64_32
# define sselxr(p,c,r0,r1) _sselxr(_jit,p,c,r0,r1)
static void
_sselxr(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
@ -502,7 +511,7 @@ _ssexi(jit_state_t *_jit, jit_int32_t c, jit_int32_t r0,
ic(i);
}
#if __WORDSIZE == 64
#if __X64
static void
_sselxr(jit_state_t *_jit, jit_int32_t p, jit_int32_t c,
jit_int32_t r0, jit_int32_t r1)
@ -794,9 +803,9 @@ _sse_movi_f(jit_state_t *_jit, jit_int32_t r0, jit_float32_t *i0)
xorpsr(r0, r0);
else {
ldi = !_jitc->no_data;
#if __WORDSIZE == 64
#if __X64
/* if will allocate a register for offset, just use immediate */
if (ldi && !can_sign_extend_int_p((jit_word_t)i0))
if (ldi && !sse_address_p(i0))
ldi = 0;
#endif
if (ldi)
@ -915,7 +924,7 @@ static void
_sse_ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
jit_int32_t reg;
if (can_sign_extend_int_p(i0))
if (sse_address_p(i0))
movssmr(i0, _NOREG, _NOREG, _SCL1, r0);
else {
reg = jit_get_reg(jit_class_gpr);
@ -943,7 +952,7 @@ static void
_sse_sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
{
jit_int32_t reg;
if (can_sign_extend_int_p(i0))
if (sse_address_p(i0))
movssrm(r0, i0, _NOREG, _NOREG, _SCL1);
else {
reg = jit_get_reg(jit_class_gpr);
@ -1241,16 +1250,16 @@ _sse_movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t *i0)
xorpdr(r0, r0);
else {
ldi = !_jitc->no_data;
#if __WORDSIZE == 64
#if __X64
/* if will allocate a register for offset, just use immediate */
if (ldi && !can_sign_extend_int_p((jit_word_t)i0))
if (ldi && !sse_address_p(i0))
ldi = 0;
#endif
if (ldi)
sse_ldi_d(r0, (jit_word_t)i0);
else {
reg = jit_get_reg(jit_class_gpr);
#if __WORDSIZE == 64
#if __X64 && !__X64_32
movi(rn(reg), data.w);
movdqxr(r0, rn(reg));
jit_unget_reg(reg);
@ -1270,7 +1279,7 @@ static void
_sse_ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
jit_int32_t reg;
if (can_sign_extend_int_p(i0))
if (sse_address_p(i0))
movsdmr(i0, _NOREG, _NOREG, _SCL1, r0);
else {
reg = jit_get_reg(jit_class_gpr);
@ -1289,7 +1298,7 @@ _sse_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
else {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i0);
sse_ldxr_f(r0, r1, rn(reg));
sse_ldxr_d(r0, r1, rn(reg));
jit_unget_reg(reg);
}
}
@ -1298,7 +1307,7 @@ static void
_sse_sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
{
jit_int32_t reg;
if (can_sign_extend_int_p(i0))
if (sse_address_p(i0))
movsdrm(r0, i0, _NOREG, _NOREG, _SCL1);
else {
reg = jit_get_reg(jit_class_gpr);

View file

@ -1,5 +1,5 @@
#if __WORDSIZE == 32
#if __X32
#define JIT_INSTR_MAX 42
0, /* data */
0, /* live */
@ -351,9 +351,9 @@
0, /* movi_d_w */
10, /* x86_retval_f */
10, /* x86_retval_d */
#endif /* __WORDSIZE */
#endif /* __X32 */
#if __WORDSIZE == 64
#if __X64
#if __CYGWIN__
#define JIT_INSTR_MAX 71
0, /* data */
@ -708,6 +708,360 @@
0, /* x86_retval_d */
#else
# if __X64_32
#define JIT_INSTR_MAX 44
0, /* data */
0, /* live */
3, /* align */
0, /* save */
0, /* load */
0, /* #name */
0, /* #note */
3, /* label */
39, /* prolog */
0, /* arg */
5, /* addr */
7, /* addi */
6, /* addcr */
7, /* addci */
6, /* addxr */
7, /* addxi */
6, /* subr */
7, /* subi */
9, /* subcr */
7, /* subci */
9, /* subxr */
7, /* subxi */
10, /* rsbi */
7, /* mulr */
8, /* muli */
18, /* qmulr */
24, /* qmuli */
18, /* qmulr_u */
24, /* qmuli_u */
19, /* divr */
22, /* divi */
20, /* divr_u */
23, /* divi_u */
22, /* qdivr */
25, /* qdivi */
23, /* qdivr_u */
26, /* qdivi_u */
19, /* remr */
22, /* remi */
20, /* remr_u */
23, /* remi_u */
6, /* andr */
9, /* andi */
6, /* orr */
10, /* ori */
6, /* xorr */
10, /* xori */
9, /* lshr */
8, /* lshi */
9, /* rshr */
7, /* rshi */
9, /* rshr_u */
7, /* rshi_u */
6, /* negr */
6, /* comr */
13, /* ltr */
14, /* lti */
13, /* ltr_u */
14, /* lti_u */
13, /* ler */
14, /* lei */
13, /* ler_u */
14, /* lei_u */
13, /* eqr */
14, /* eqi */
13, /* ger */
14, /* gei */
13, /* ger_u */
14, /* gei_u */
13, /* gtr */
14, /* gti */
13, /* gtr_u */
14, /* gti_u */
13, /* ner */
14, /* nei */
3, /* movr */
6, /* movi */
7, /* extr_c */
7, /* extr_uc */
4, /* extr_s */
4, /* extr_us */
0, /* extr_i */
0, /* extr_ui */
6, /* htonr */
5, /* ldr_c */
9, /* ldi_c */
5, /* ldr_uc */
9, /* ldi_uc */
5, /* ldr_s */
9, /* ldi_s */
5, /* ldr_us */
9, /* ldi_us */
4, /* ldr_i */
8, /* ldi_i */
0, /* ldr_ui */
0, /* ldi_ui */
0, /* ldr_l */
0, /* ldi_l */
6, /* ldxr_c */
7, /* ldxi_c */
6, /* ldxr_uc */
7, /* ldxi_uc */
6, /* ldxr_s */
7, /* ldxi_s */
6, /* ldxr_us */
7, /* ldxi_us */
5, /* ldxr_i */
7, /* ldxi_i */
0, /* ldxr_ui */
0, /* ldxi_ui */
0, /* ldxr_l */
0, /* ldxi_l */
7, /* str_c */
11, /* sti_c */
5, /* str_s */
9, /* sti_s */
4, /* str_i */
8, /* sti_i */
0, /* str_l */
0, /* sti_l */
8, /* stxr_c */
7, /* stxi_c */
6, /* stxr_s */
7, /* stxi_s */
5, /* stxr_i */
6, /* stxi_i */
0, /* stxr_l */
0, /* stxi_l */
9, /* bltr */
10, /* blti */
9, /* bltr_u */
10, /* blti_u */
9, /* bler */
12, /* blei */
9, /* bler_u */
10, /* blei_u */
9, /* beqr */
13, /* beqi */
9, /* bger */
10, /* bgei */
9, /* bger_u */
10, /* bgei_u */
9, /* bgtr */
10, /* bgti */
9, /* bgtr_u */
10, /* bgti_u */
9, /* bner */
13, /* bnei */
9, /* bmsr */
13, /* bmsi */
9, /* bmcr */
13, /* bmci */
9, /* boaddr */
10, /* boaddi */
9, /* boaddr_u */
10, /* boaddi_u */
9, /* bxaddr */
10, /* bxaddi */
9, /* bxaddr_u */
10, /* bxaddi_u */
9, /* bosubr */
10, /* bosubi */
9, /* bosubr_u */
10, /* bosubi_u */
9, /* bxsubr */
10, /* bxsubi */
9, /* bxsubr_u */
10, /* bxsubi_u */
2, /* jmpr */
5, /* jmpi */
3, /* callr */
9, /* calli */
34, /* epilog */
0, /* arg_f */
10, /* addr_f */
21, /* addi_f */
15, /* subr_f */
21, /* subi_f */
26, /* rsbi_f */
10, /* mulr_f */
21, /* muli_f */
15, /* divr_f */
21, /* divi_f */
15, /* negr_f */
15, /* absr_f */
5, /* sqrtr_f */
15, /* ltr_f */
26, /* lti_f */
15, /* ler_f */
26, /* lei_f */
17, /* eqr_f */
28, /* eqi_f */
15, /* ger_f */
26, /* gei_f */
15, /* gtr_f */
26, /* gti_f */
20, /* ner_f */
31, /* nei_f */
15, /* unltr_f */
26, /* unlti_f */
15, /* unler_f */
26, /* unlei_f */
15, /* uneqr_f */
26, /* uneqi_f */
15, /* unger_f */
26, /* ungei_f */
15, /* ungtr_f */
26, /* ungti_f */
15, /* ltgtr_f */
26, /* ltgti_f */
15, /* ordr_f */
26, /* ordi_f */
15, /* unordr_f */
26, /* unordi_f */
5, /* truncr_f_i */
0, /* truncr_f_l */
5, /* extr_f */
5, /* extr_d_f */
5, /* movr_f */
11, /* movi_f */
6, /* ldr_f */
10, /* ldi_f */
7, /* ldxr_f */
9, /* ldxi_f */
6, /* str_f */
10, /* sti_f */
7, /* stxr_f */
9, /* stxi_f */
10, /* bltr_f */
21, /* blti_f */
10, /* bler_f */
21, /* blei_f */
12, /* beqr_f */
23, /* beqi_f */
10, /* bger_f */
21, /* bgei_f */
10, /* bgtr_f */
21, /* bgti_f */
13, /* bner_f */
24, /* bnei_f */
10, /* bunltr_f */
21, /* bunlti_f */
10, /* bunler_f */
21, /* bunlei_f */
10, /* buneqr_f */
21, /* buneqi_f */
10, /* bunger_f */
21, /* bungei_f */
10, /* bungtr_f */
21, /* bungti_f */
10, /* bltgtr_f */
21, /* bltgti_f */
10, /* bordr_f */
21, /* bordi_f */
10, /* bunordr_f */
21, /* bunordi_f */
0, /* arg_d */
10, /* addr_d */
33, /* addi_d */
15, /* subr_d */
33, /* subi_d */
38, /* rsbi_d */
10, /* mulr_d */
33, /* muli_d */
15, /* divr_d */
33, /* divi_d */
22, /* negr_d */
16, /* absr_d */
5, /* sqrtr_d */
16, /* ltr_d */
39, /* lti_d */
16, /* ler_d */
39, /* lei_d */
18, /* eqr_d */
41, /* eqi_d */
16, /* ger_d */
39, /* gei_d */
16, /* gtr_d */
39, /* gti_d */
21, /* ner_d */
44, /* nei_d */
16, /* unltr_d */
39, /* unlti_d */
16, /* unler_d */
39, /* unlei_d */
16, /* uneqr_d */
39, /* uneqi_d */
16, /* unger_d */
39, /* ungei_d */
16, /* ungtr_d */
39, /* ungti_d */
16, /* ltgtr_d */
39, /* ltgti_d */
16, /* ordr_d */
39, /* ordi_d */
16, /* unordr_d */
39, /* unordi_d */
5, /* truncr_d_i */
0, /* truncr_d_l */
5, /* extr_d */
5, /* extr_f_d */
5, /* movr_d */
23, /* movi_d */
6, /* ldr_d */
10, /* ldi_d */
7, /* ldxr_d */
9, /* ldxi_d */
6, /* str_d */
10, /* sti_d */
7, /* stxr_d */
9, /* stxi_d */
11, /* bltr_d */
34, /* blti_d */
11, /* bler_d */
34, /* blei_d */
13, /* beqr_d */
36, /* beqi_d */
11, /* bger_d */
34, /* bgei_d */
11, /* bgtr_d */
34, /* bgti_d */
14, /* bner_d */
37, /* bnei_d */
11, /* bunltr_d */
34, /* bunlti_d */
11, /* bunler_d */
34, /* bunlei_d */
11, /* buneqr_d */
34, /* buneqi_d */
11, /* bunger_d */
34, /* bungei_d */
11, /* bungtr_d */
34, /* bungti_d */
11, /* bltgtr_d */
34, /* bltgti_d */
11, /* bordr_d */
34, /* bordi_d */
11, /* bunordr_d */
34, /* 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 */
# else
#define JIT_INSTR_MAX 43
0, /* data */
0, /* live */
@ -1060,4 +1414,5 @@
0, /* x86_retval_f */
0, /* x86_retval_d */
#endif /* __CYGWIN__ */
#endif /* __WORDSIZE */
# endif /* __X64_32 */
#endif /* __X64 */

View file

@ -18,6 +18,15 @@
*/
#if PROTO
# if __X32
# define x87_address_p(i0) 1
# else
# if __X64_32
# define x87_address_p(i0) ((jit_word_t)(i0) >= 0)
# else
# define x87_address_p(i0) can_sign_extend_int_p(i0)
# endif
# endif
# define _ST0_REGNO 0
# define _ST1_REGNO 1
# define _ST2_REGNO 2
@ -115,7 +124,7 @@ static void _x87_sqrtr_d(jit_state_t*, jit_int32_t, jit_int32_t);
# define x87_truncr_f_i(r0, r1) _x87_truncr_d_i(_jit, r0, r1)
# define x87_truncr_d_i(r0, r1) _x87_truncr_d_i(_jit, r0, r1)
static void _x87_truncr_d_i(jit_state_t*, jit_int32_t, jit_int32_t);
# if __WORDSIZE == 64
# if __X64
# define x87_truncr_f_l(r0, r1) _x87_truncr_d_l(_jit, r0, r1)
# define x87_truncr_d_l(r0, r1) _x87_truncr_d_l(_jit, r0, r1)
static void _x87_truncr_d_l(jit_state_t*, jit_int32_t, jit_int32_t);
@ -680,7 +689,7 @@ _x87_truncr_d_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
#endif
}
# if __WORDSIZE == 64
# if __X64
static void
_x87_truncr_d_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
@ -694,7 +703,7 @@ static void
_x87_extr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
stxi(CVT_OFFSET, _RBP_REGNO, r1);
# if __WORDSIZE == 32
# if __X32
fildlm(CVT_OFFSET, _RBP_REGNO, _NOREG, _SCL1);
# else
fildqm(CVT_OFFSET, _RBP_REGNO, _NOREG, _SCL1);
@ -863,7 +872,7 @@ static void
_x87_ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
jit_int32_t reg;
if (can_sign_extend_int_p(i0)) {
if (x87_address_p(i0)) {
fldsm(i0, _NOREG, _NOREG, _SCL1);
fstpr(r0 + 1);
}
@ -914,7 +923,7 @@ static void
_x87_sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
{
jit_int32_t reg;
if (!can_sign_extend_int_p(i0)) {
if (!x87_address_p(i0)) {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i0);
x87_str_f(rn(reg), r0);
@ -1005,7 +1014,7 @@ _x87_movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t *i0)
else {
if (_jitc->no_data) {
reg = jit_get_reg(jit_class_gpr);
#if __WORDSIZE == 32
#if __X32 || __X64_32
movi(rn(reg), data.ii[0]);
stxi_i(CVT_OFFSET, _RBP_REGNO, rn(reg));
movi(rn(reg), data.ii[1]);
@ -1120,7 +1129,7 @@ static void
_x87_ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
jit_int32_t reg;
if (can_sign_extend_int_p(i0)) {
if (x87_address_p(i0)) {
fldlm(i0, _NOREG, _NOREG, _SCL1);
fstpr(r0 + 1);
}
@ -1171,7 +1180,7 @@ static void
_x87_sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
{
jit_int32_t reg;
if (!can_sign_extend_int_p(i0)) {
if (!x87_address_p(i0)) {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i0);
x87_str_d(rn(reg), r0);

View file

@ -23,10 +23,11 @@
#define rc(value) jit_class_##value
#define rn(reg) (jit_regno(_rvs[jit_regno(reg)].spec))
#if __WORDSIZE == 32
#if __X32
# define stack_framesize 20
# define stack_adjust 12
# define CVT_OFFSET -12
# define REAL_WORDSIZE 4
#else
# if __CYGWIN__
# define stack_framesize 152
@ -35,8 +36,10 @@
# endif
# define stack_adjust 8
# define CVT_OFFSET -8
# define REAL_WORDSIZE 8
#endif
/*
* Prototypes
*/
@ -62,7 +65,7 @@ static void _x87_from_sse_d(jit_state_t*,jit_int32_t,jit_int32_t);
*/
jit_cpu_t jit_cpu;
jit_register_t _rvs[] = {
#if __WORDSIZE == 32
#if __X32
{ rc(gpr) | rc(rg8) | 0, "%eax" },
{ rc(gpr) | rc(rg8) | 1, "%ecx" },
{ rc(gpr) | rc(rg8) | 2, "%edx" },
@ -248,12 +251,12 @@ jit_get_cpu(void)
} bits;
jit_uword_t cpuid;
} edx;
#if __WORDSIZE == 32
#if __X32
int ac, flags;
#endif
jit_uword_t eax, ebx;
#if __WORDSIZE == 32
#if __X32
/* adapted from glibc __sysconf */
__asm__ volatile ("pushfl;\n\t"
"popl %0;\n\t"
@ -275,7 +278,7 @@ jit_get_cpu(void)
#endif
/* query %eax = 1 function */
#if __WORDSIZE == 32
#if __X32 || __X64_32
__asm__ volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1"
#else
__asm__ volatile ("xchgq %%rbx, %1; cpuid; xchgq %%rbx, %1"
@ -302,9 +305,13 @@ jit_get_cpu(void)
jit_cpu.aes = ecx.bits.aes;
jit_cpu.avx = ecx.bits.avx;
#if __WORDSIZE == 64
/* query %eax = 0x80000001 function */
#if __X64
# if __X64_32
__asm__ volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1"
# else
__asm__ volatile ("xchgq %%rbx, %1; cpuid; xchgq %%rbx, %1"
# endif
: "=a" (eax), "=r" (ebx),
"=c" (ecx.cpuid), "=d" (edx.cpuid)
: "0" (0x80000001));
@ -315,13 +322,13 @@ jit_get_cpu(void)
void
_jit_init(jit_state_t *_jit)
{
#if __WORDSIZE == 32
#if __X32
jit_int32_t regno;
static jit_bool_t first = 1;
#endif
_jitc->reglen = jit_size(_rvs) - 1;
#if __WORDSIZE == 32
#if __X32
if (first) {
if (!jit_cpu.sse2) {
for (regno = _jitc->reglen; regno >= 0; regno--) {
@ -467,7 +474,7 @@ _jit_arg(jit_state_t *_jit)
jit_int32_t offset;
assert(_jitc->function);
#if __WORDSIZE == 64
#if __X64
if (jit_arg_reg_p(_jitc->function->self.argi)) {
offset = _jitc->function->self.argi++;
# if __CYGWIN__
@ -478,7 +485,7 @@ _jit_arg(jit_state_t *_jit)
#endif
{
offset = _jitc->function->self.size;
_jitc->function->self.size += sizeof(jit_word_t);
_jitc->function->self.size += REAL_WORDSIZE;
}
return (jit_new_node_w(jit_code_arg, offset));
}
@ -486,7 +493,7 @@ _jit_arg(jit_state_t *_jit)
jit_bool_t
_jit_arg_reg_p(jit_state_t *_jit, jit_int32_t offset)
{
#if __WORDSIZE == 32
#if __X32
return (0);
#else
# if __CYGWIN__
@ -503,7 +510,7 @@ _jit_arg_f(jit_state_t *_jit)
jit_int32_t offset;
assert(_jitc->function);
#if __WORDSIZE == 64
#if __X64
# if __CYGWIN__
if (jit_arg_reg_p(_jitc->function->self.argi)) {
offset = _jitc->function->self.argi++;
@ -517,11 +524,7 @@ _jit_arg_f(jit_state_t *_jit)
#endif
{
offset = _jitc->function->self.size;
#if __WORDSIZE == 32
_jitc->function->self.size += sizeof(jit_float32_t);
#else
_jitc->function->self.size += sizeof(jit_float64_t);
#endif
_jitc->function->self.size += REAL_WORDSIZE;
}
return (jit_new_node_w(jit_code_arg_f, offset));
}
@ -529,7 +532,7 @@ _jit_arg_f(jit_state_t *_jit)
jit_bool_t
_jit_arg_f_reg_p(jit_state_t *_jit, jit_int32_t offset)
{
#if __WORDSIZE == 32
#if __X32
return (0);
#else
# if __CYGWIN__
@ -546,7 +549,7 @@ _jit_arg_d(jit_state_t *_jit)
jit_int32_t offset;
assert(_jitc->function);
#if __WORDSIZE == 64
#if __X64
# if __CYGWIN__
if (jit_arg_reg_p(_jitc->function->self.argi)) {
offset = _jitc->function->self.argi++;
@ -574,7 +577,7 @@ _jit_arg_d_reg_p(jit_state_t *_jit, jit_int32_t offset)
void
_jit_getarg_c(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
{
#if __WORDSIZE == 64
#if __X64
if (jit_arg_reg_p(v->u.w))
jit_extr_c(u, JIT_RA0 - v->u.w);
else
@ -585,7 +588,7 @@ _jit_getarg_c(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
void
_jit_getarg_uc(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
{
#if __WORDSIZE == 64
#if __X64
if (jit_arg_reg_p(v->u.w))
jit_extr_uc(u, JIT_RA0 - v->u.w);
else
@ -596,7 +599,7 @@ _jit_getarg_uc(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
void
_jit_getarg_s(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
{
#if __WORDSIZE == 64
#if __X64
if (jit_arg_reg_p(v->u.w))
jit_extr_s(u, JIT_RA0 - v->u.w);
else
@ -607,7 +610,7 @@ _jit_getarg_s(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
void
_jit_getarg_us(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
{
#if __WORDSIZE == 64
#if __X64
if (jit_arg_reg_p(v->u.w))
jit_extr_us(u, JIT_RA0 - v->u.w);
else
@ -618,15 +621,20 @@ _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 __WORDSIZE == 64
if (jit_arg_reg_p(v->u.w))
#if __X64
if (jit_arg_reg_p(v->u.w)) {
# if __X64_32
jit_movr(u, JIT_RA0 - v->u.w);
# else
jit_extr_i(u, JIT_RA0 - v->u.w);
# endif
}
else
#endif
jit_ldxi_i(u, _RBP, v->u.w);
}
#if __WORDSIZE == 64
#if __X64 && !__X64_32
void
_jit_getarg_ui(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
{
@ -649,7 +657,7 @@ _jit_getarg_l(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
void
_jit_getarg_f(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
{
#if __WORDSIZE == 64
#if __X64
if (jit_arg_f_reg_p(v->u.w))
jit_movr_f(u, _XMM0 - v->u.w);
else
@ -660,7 +668,7 @@ _jit_getarg_f(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
void
_jit_getarg_d(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
{
#if __WORDSIZE == 64
#if __X64
if (jit_arg_f_reg_p(v->u.w))
jit_movr_d(u, _XMM0 - v->u.w);
else
@ -672,7 +680,7 @@ void
_jit_pushargr(jit_state_t *_jit, jit_int32_t u)
{
assert(_jitc->function);
#if __WORDSIZE == 64
#if __X64
if (jit_arg_reg_p(_jitc->function->call.argi)) {
jit_movr(JIT_RA0 - _jitc->function->call.argi, u);
++_jitc->function->call.argi;
@ -684,7 +692,7 @@ _jit_pushargr(jit_state_t *_jit, jit_int32_t u)
#endif
{
jit_stxi(_jitc->function->call.size, _RSP, u);
_jitc->function->call.size += sizeof(jit_word_t);
_jitc->function->call.size += REAL_WORDSIZE;
}
}
@ -694,7 +702,7 @@ _jit_pushargi(jit_state_t *_jit, jit_word_t u)
jit_int32_t regno;
assert(_jitc->function);
#if __WORDSIZE == 64
#if __X64
if (jit_arg_reg_p(_jitc->function->call.argi)) {
jit_movi(JIT_RA0 - _jitc->function->call.argi, u);
++_jitc->function->call.argi;
@ -708,7 +716,7 @@ _jit_pushargi(jit_state_t *_jit, jit_word_t u)
regno = jit_get_reg(jit_class_gpr);
jit_movi(regno, u);
jit_stxi(_jitc->function->call.size, _RSP, regno);
_jitc->function->call.size += sizeof(jit_word_t);
_jitc->function->call.size += REAL_WORDSIZE;
jit_unget_reg(regno);
}
}
@ -717,7 +725,7 @@ void
_jit_pushargr_f(jit_state_t *_jit, jit_int32_t u)
{
assert(_jitc->function);
#if __WORDSIZE == 64
#if __X64
# if __CYGWIN__
if (jit_arg_reg_p(_jitc->function->call.argi)) {
jit_movr_f(_XMM0 - _jitc->function->call.argi, u);
@ -740,7 +748,7 @@ _jit_pushargr_f(jit_state_t *_jit, jit_int32_t u)
#endif
{
jit_stxi_f(_jitc->function->call.size, _RSP, u);
_jitc->function->call.size += sizeof(jit_word_t);
_jitc->function->call.size += REAL_WORDSIZE;
}
}
@ -750,7 +758,7 @@ _jit_pushargi_f(jit_state_t *_jit, jit_float32_t u)
jit_int32_t regno;
assert(_jitc->function);
#if __WORDSIZE == 64
#if __X64
# if __CYGWIN__
if (jit_arg_reg_p(_jitc->function->call.argi)) {
jit_movi_f(_XMM0 - _jitc->function->call.argi, u);
@ -775,7 +783,7 @@ _jit_pushargi_f(jit_state_t *_jit, jit_float32_t u)
regno = jit_get_reg(jit_class_fpr);
jit_movi_f(regno, u);
jit_stxi_f(_jitc->function->call.size, _RSP, regno);
_jitc->function->call.size += sizeof(jit_word_t);
_jitc->function->call.size += REAL_WORDSIZE;
jit_unget_reg(regno);
}
}
@ -784,7 +792,7 @@ void
_jit_pushargr_d(jit_state_t *_jit, jit_int32_t u)
{
assert(_jitc->function);
#if __WORDSIZE == 64
#if __X64
# if __CYGWIN__
if (jit_arg_reg_p(_jitc->function->call.argi)) {
jit_movr_d(_XMM0 - _jitc->function->call.argi, u);
@ -817,7 +825,7 @@ _jit_pushargi_d(jit_state_t *_jit, jit_float64_t u)
jit_int32_t regno;
assert(_jitc->function);
#if __WORDSIZE == 64
#if __X64
# if __CYGWIN__
if (jit_arg_reg_p(_jitc->function->call.argi)) {
jit_movi_d(_XMM0 - _jitc->function->call.argi, u);
@ -850,7 +858,7 @@ _jit_pushargi_d(jit_state_t *_jit, jit_float64_t u)
jit_bool_t
_jit_regarg_p(jit_state_t *_jit, jit_node_t *node, jit_int32_t regno)
{
#if __WORDSIZE == 64
#if __X64
jit_int32_t spec;
spec = jit_class(_rvs[regno].spec);
@ -880,7 +888,7 @@ _jit_finishr(jit_state_t *_jit, jit_int32_t r0)
assert(_jitc->function);
if (_jitc->function->self.alen < _jitc->function->call.size)
_jitc->function->self.alen = _jitc->function->call.size;
#if __WORDSIZE == 64
#if __X64
# if !__CYGWIN__
if (_jitc->function->call.call & jit_call_varargs) {
if (jit_regno(reg) == _RAX) {
@ -907,7 +915,7 @@ _jit_finishr(jit_state_t *_jit, jit_int32_t r0)
jit_node_t *
_jit_finishi(jit_state_t *_jit, jit_pointer_t i0)
{
#if __WORDSIZE == 64
#if __X64
jit_int32_t reg;
#endif
jit_node_t *node;
@ -915,7 +923,7 @@ _jit_finishi(jit_state_t *_jit, jit_pointer_t i0)
assert(_jitc->function);
if (_jitc->function->self.alen < _jitc->function->call.size)
_jitc->function->self.alen = _jitc->function->call.size;
#if __WORDSIZE == 64
#if __X64
/* FIXME preventing %rax allocation is good enough, but for consistency
* it should automatically detect %rax is dead, in case it has run out
* registers, and not save/restore it, what would be wrong if using the
@ -966,7 +974,7 @@ _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 == 32
#if __X32 || __X64_32
if (r0 != JIT_RET)
jit_movr(r0, JIT_RET);
#else
@ -974,7 +982,7 @@ _jit_retval_i(jit_state_t *_jit, jit_int32_t r0)
#endif
}
#if __WORDSIZE == 64
#if __X64 && !__X64_32
void
_jit_retval_ui(jit_state_t *_jit, jit_int32_t r0)
{
@ -992,7 +1000,7 @@ _jit_retval_l(jit_state_t *_jit, jit_int32_t r0)
void
_jit_retval_f(jit_state_t *_jit, jit_int32_t r0)
{
# if __WORDSIZE == 32
# if __X32
jit_new_node_w(jit_code_x86_retval_f, r0);
# else
if (r0 != JIT_FRET)
@ -1003,7 +1011,7 @@ _jit_retval_f(jit_state_t *_jit, jit_int32_t r0)
void
_jit_retval_d(jit_state_t *_jit, jit_int32_t r0)
{
# if __WORDSIZE == 32
# if __X32
jit_new_node_w(jit_code_x86_retval_d, r0);
# else
if (r0 != JIT_FRET)
@ -1373,13 +1381,13 @@ _emit_code(jit_state_t *_jit)
case_rr(ext, _uc);
case_rr(ext, _s);
case_rr(ext, _us);
#if __WORDSIZE == 64
#if __X64 && !__X64_32
case_rr(ext, _i);
case_rr(ext, _ui);
#endif
case_rf(trunc, _f_i);
case_rf(trunc, _d_i);
#if __WORDSIZE == 64
#if __X64
case_rf(trunc, _f_l);
case_rf(trunc, _d_l);
#endif
@ -1393,7 +1401,7 @@ _emit_code(jit_state_t *_jit)
case_rw(ld, _us);
case_rr(ld, _i);
case_rw(ld, _i);
#if __WORDSIZE == 64
#if __X64 && !__X64_32
case_rr(ld, _ui);
case_rw(ld, _ui);
case_rr(ld, _l);
@ -1409,7 +1417,7 @@ _emit_code(jit_state_t *_jit)
case_rrw(ldx, _us);
case_rrr(ldx, _i);
case_rrw(ldx, _i);
#if __WORDSIZE == 64
#if __X64 && !__X64_32
case_rrr(ldx, _ui);
case_rrw(ldx, _ui);
case_rrr(ldx, _l);
@ -1421,7 +1429,7 @@ _emit_code(jit_state_t *_jit)
case_wr(st, _s);
case_rr(st, _i);
case_wr(st, _i);
#if __WORDSIZE == 64
#if __X64 && !__X64_32
case_rr(st, _l);
case_wr(st, _l);
#endif
@ -1431,7 +1439,7 @@ _emit_code(jit_state_t *_jit)
case_wrr(stx, _s);
case_rrr(stx, _i);
case_wrr(stx, _i);
#if __WORDSIZE == 64
#if __X64 && !__X64_32
case_rrr(stx, _l);
case_wrr(stx, _l);
#endif
@ -1739,7 +1747,7 @@ _emit_code(jit_state_t *_jit)
epilog(node);
_jitc->function = NULL;
break;
#if __WORDSIZE == 32
#if __X32
case jit_code_x86_retval_f:
if (jit_sse_reg_p(node->u.w)) {
fstpr(_ST1_REGNO);

23
size.c
View file

@ -48,7 +48,20 @@ main(int argc, char *argv[])
exit(-1);
#if __X64 || __X32
# if __X64
fprintf(fp, "#if __X64\n");
# if __X64_32
fprintf(fp, "# if __X64_32\n");
# else
fprintf(fp, "# if !__X64_32\n");
# endif
# else
fprintf(fp, "#if __X32\n");
# endif
#else
fprintf(fp, "#if __WORDSIZE == %d\n", __WORDSIZE);
#endif
#if defined(__arm__)
# if defined(__ARM_PCS_VFP)
fprintf(fp, "#if defined(__ARM_PCS_VFP)\n");
@ -82,7 +95,17 @@ main(int argc, char *argv[])
#elif defined(__powerpc__)
fprintf(fp, "#endif /* __powerpc__ */\n");
#endif
#if __X64 || __X32
# if __X64
fprintf(fp, "# endif /* __X64_32 */\n");
fprintf(fp, "#endif /* __X64 */\n");
# else
fprintf(fp, "#if __X32\n");
# endif
#else
fprintf(fp, "#endif /* __WORDSIZE */\n");
#endif
fclose(fp);
return (0);