[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 223/437: Build and pass all tests on big endian Irix mip
From: |
Andy Wingo |
Subject: |
[Guile-commits] 223/437: Build and pass all tests on big endian Irix mips using the n32 abi. |
Date: |
Mon, 2 Jul 2018 05:14:25 -0400 (EDT) |
wingo pushed a commit to branch lightning
in repository guile.
commit d6110f6cf354dec9f0d610ddb427553106541804
Author: pcpa <address@hidden>
Date: Sat Jun 22 19:44:00 2013 -0300
Build and pass all tests on big endian Irix mips using the n32 abi.
* check/lightning.c, configure.ac, include/lightning.h,
lib/lightning.c: Add tests and quirks to build/detect
and/or work on Irix.
* include/lightning/jit_mips.h, lib/jit_mips-cpu.c,
lib/jit_mips-fpu.c, lib/jit_mips.c: Adapt code to run
in big endian mips, using the n32 abi.
---
ChangeLog | 10 ++
check/lightning.c | 21 ++-
configure.ac | 8 +-
include/lightning.h | 14 +-
include/lightning/jit_mips.h | 68 +++++-----
lib/jit_mips-cpu.c | 230 +++++++++++---------------------
lib/jit_mips-fpu.c | 51 ++++---
lib/jit_mips.c | 307 ++++++++++++++++++++++++++++++++++++-------
lib/lightning.c | 34 ++++-
9 files changed, 477 insertions(+), 266 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 15157f8..81fc943 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2013-06-22 Paulo Andrade <address@hidden>
+
+ * check/lightning.c, configure.ac, include/lightning.h,
+ lib/lightning.c: Add tests and quirks to build/detect
+ and/or work on Irix.
+
+ * include/lightning/jit_mips.h, lib/jit_mips-cpu.c,
+ lib/jit_mips-fpu.c, lib/jit_mips.c: Adapt code to run
+ in big endian mips, using the n32 abi.
+
2013-06-18 Paulo Andrade <address@hidden>
* include/lightning.h: Minor extra preprocessor testing
diff --git a/check/lightning.c b/check/lightning.c
index aa29e38..4c18d27 100644
--- a/check/lightning.c
+++ b/check/lightning.c
@@ -40,6 +40,8 @@
#if defined(__hpux)
# define DL_HANDLE RTLD_NEXT
+#elif defined(__sgi)
+static void *DL_HANDLE;
#else
# define DL_HANDLE RTLD_DEFAULT
#endif
@@ -3702,6 +3704,8 @@ get_symbol_by_name(char *name)
{
symbol_t **symbol_pointer;
+ if (symbols == NULL)
+ return (NULL);
symbol_pointer = (symbol_t **)bsearch(name, symbols, symbol_offset,
sizeof(symbol_t *), bcmp_symbols);
@@ -3788,7 +3792,7 @@ rehash(hash_t *hash)
static void
usage(void)
{
-#if HAVE_GETOPT_H
+#if HAVE_GETOPT_LONG_ONLY
fprintf(stderr, "\
Usage: %s [jit assembler options] file [jit program options]\n\
Jit assembler options:\n\
@@ -3823,7 +3827,7 @@ Jit assembler options:\n\
int
main(int argc, char *argv[])
{
-#if HAVE_GETOPT_H
+#if HAVE_GETOPT_LONG_ONLY
static const char *short_options = "v::";
static struct option long_options[] = {
{ "help", 0, 0, 'h' },
@@ -3842,7 +3846,7 @@ main(int argc, char *argv[])
{ 0, 0, 0, 0 }
};
#else
-#endif /* HAVE_GETOPT_H */
+#endif /* HAVE_GETOPT_LONG_ONLY */
int offset;
char *endptr;
int opt_index;
@@ -3853,7 +3857,11 @@ main(int argc, char *argv[])
init_jit(progname);
-#if HAVE_GETOPT_H
+#if defined(__sgi)
+ DL_HANDLE = dlopen(NULL, RTLD_LAZY);
+#endif
+
+#if HAVE_GETOPT_LONG_ONLY
for (;;) {
if ((opt_short = getopt_long_only(argc, argv, short_options,
long_options, &opt_index)) < 0)
@@ -4030,6 +4038,11 @@ main(int argc, char *argv[])
sizeof(cmdline) - opt_short,
" -D_AIX=1");
#endif
+#if defined(__sgi__)
+ opt_short += snprintf(cmdline + opt_short,
+ sizeof(cmdline) - opt_short,
+ " -D__sgi__=1");
+#endif
if ((parser.fp = popen(cmdline, "r")) == NULL)
error("cannot execute %s", cmdline);
diff --git a/configure.ac b/configure.ac
index bf4a2c0..eb750ef 100644
--- a/configure.ac
+++ b/configure.ac
@@ -28,6 +28,12 @@ case "$target_cpu" in
*hpux*) CFLAGS="$CFLAGS -mlp64" ;;
*) ;;
esac ;;
+ *mips*)
+ case "$host_os" in
+ # Extra flags to build with gcc 3.x
+ *irix*) CFLAGS="$CFLAGS -D__c99 -Drestrict=" ;;
+ *) ;;
+ esac ;;
*) ;;
esac
@@ -35,7 +41,7 @@ AC_PROG_CC
AC_PROG_INSTALL
AC_PROG_LIBTOOL
-AC_CHECK_FUNCS(mremap ffsl,,)
+AC_CHECK_FUNCS(mremap ffsl getopt_long_only,,)
AC_CHECK_HEADERS([getopt.h],,,)
diff --git a/include/lightning.h b/include/lightning.h
index e097a4e..8e8e485 100644
--- a/include/lightning.h
+++ b/include/lightning.h
@@ -40,6 +40,12 @@
# define __WORDSIZE 32
# elif defined(_LP64) /* ia64 hp-ux (with cc +DD64) */
# define __WORDSIZE 64
+# elif defined(_MIPS_SZPTR) /* mips irix */
+# if _MIPS_SZPTR == 32
+# define __WORDSIZE 32
+# else
+# define __WORDSIZE 64
+# endif
# else
# error cannot figure __WORDSIZE
# endif
@@ -69,10 +75,12 @@
# define __BYTE_ORDER __BYTE_ORDER__
# elif defined(_BIG_ENDIAN) /* hppa hp-ux */
# define __BYTE_ORDER __BIG_ENDIAN
-# elif defined(__BIG_ENDIAN__ ) /* ia64 hp-ux */
+# elif defined(__BIG_ENDIAN__) /* ia64 hp-ux */
+# define __BYTE_ORDER __BIG_ENDIAN
+# elif defined(__i386__) /* x86 solaris */
+# define __BYTE_ORDER __LITTLE_ENDIAN
+# elif defined(__MIPSEB) /* mips irix */
# define __BYTE_ORDER __BIG_ENDIAN
-# elif defined(__i386__)
-# define __BYTE_ORDER __LITTLE_ENDIAN /* x86 solaris */
# else
# error cannot figure __BYTE_ORDER
# endif
diff --git a/include/lightning/jit_mips.h b/include/lightning/jit_mips.h
index f367f4d..2828675 100644
--- a/include/lightning/jit_mips.h
+++ b/include/lightning/jit_mips.h
@@ -21,14 +21,23 @@
#define JIT_HASH_CONSTS 1
#define JIT_NUM_OPERANDS 3
+#if defined(_ABIN32)
+# define NEW_ABI 1
+#endif
+
/*
* Types
*/
#define JIT_FP _FP
typedef enum {
-#define jit_arg_reg_p(i) ((i) >= 0 && (i) < 4)
#define jit_r(i) (_V0 + (i))
-#define jit_r_num() 12
+#if NEW_ABI
+# define jit_arg_reg_p(i) ((i) >= 0 && (i) < 4)
+# define jit_r_num() 8
+#else
+# define jit_arg_reg_p(i) ((i) >= 0 && (i) < 4)
+# define jit_r_num() 12
+#endif
#define jit_v(i) (_S0 + (i))
#define jit_v_num() 8
#define jit_arg_f_reg_p(i) ((i) >= 0 && (i) < 4)
@@ -37,35 +46,28 @@ typedef enum {
_AT,
#define JIT_R0 _V0
#define JIT_R1 _V1
-#define JIT_R2 _T0
-#define JIT_R3 _T1
-#define JIT_R4 _T2
-#define JIT_R5 _T3
-#define JIT_R6 _T4
-#define JIT_R7 _T5
-#define JIT_R8 _T6
-#define JIT_R9 _T7
-#define JIT_R10 _T8
-#define JIT_R11 _T9 /* must point to PIC function */
- _V0, _V1, _T0, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9,
+#if NEW_ABI
+# define JIT_R2 _T4
+#else
+# define JIT_R2 _T0
+#endif
+ _V0, _V1,
+#if !NEW_ABI
+ _T0, _T1, _T2, _T3,
+#endif
+ _T4, _T5, _T6, _T7, _T8, _T9,
#define JIT_V0 _S0
#define JIT_V1 _S1
#define JIT_V2 _S2
-#define JIT_V3 _S3
-#define JIT_V4 _S4
-#define JIT_V5 _S5
-#define JIT_V6 _S6
-#define JIT_V7 _S7
_S0, _S1, _S2, _S3, _S4, _S5, _S6, _S7,
_ZERO, _K0, _K1, _RA,
- _GP, /* FIXME use to point to jit data */
+ _GP,
_SP, _FP,
-# define JIT_RA0 _A0
-# define JIT_RA1 _A1
-# define JIT_RA2 _A2
-# define JIT_RA3 _A3
+#define JIT_RA0 _A0
+#if NEW_ABI
+ _A7, _A6, _A5, _A4,
+#endif
_A3, _A2, _A1, _A0,
-
#define JIT_F0 _F0
#define JIT_F1 _F2
#define JIT_F2 _F4
@@ -74,18 +76,16 @@ typedef enum {
#define JIT_F5 _F10
_F0, _F2, _F4, _F6, _F8, _F10,
/* callee save float registers */
-#define JIT_FS0 _F16
-#define JIT_FS1 _F18
-#define JIT_FS2 _F20
-#define JIT_FS3 _F22
-#define JIT_FS4 _F24
-#define JIT_FS5 _F26
-#define JIT_FS6 _F28
-#define JIT_FS7 _F30
- _F16, _F18, _F20, _F22, _F24, _F26, _F28, _F30,
+#if !NEW_ABI
+ _F16, _F18,
+#endif
+ _F20, _F22, _F24, _F26, _F28, _F30,
#define JIT_FA0 _F12
-#define JIT_FA1 _F14
+#if NEW_ABI
+ _F19, _F18, _F17, _F16, _F15, _F14, _F13, _F12,
+#else
_F14, _F12,
+#endif
#define JIT_NOREG _NOREG
_NOREG,
} jit_reg_t;
diff --git a/lib/jit_mips-cpu.c b/lib/jit_mips-cpu.c
index 372505e..e41ba6a 100644
--- a/lib/jit_mips-cpu.c
+++ b/lib/jit_mips-cpu.c
@@ -17,6 +17,7 @@
#if PROTO
typedef union {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
struct { jit_uint32_t _:26; jit_uint32_t b : 6; } hc;
struct { jit_uint32_t _:21; jit_uint32_t b : 5; } rs;
struct { jit_uint32_t _:21; jit_uint32_t b : 5; } fm;
@@ -32,12 +33,27 @@ typedef union {
struct { jit_uint32_t b : 11; } cc;
struct { jit_uint32_t b : 16; } is;
struct { jit_uint32_t b : 26; } ii;
- int op;
+#else
+ struct { jit_uint32_t b : 6; } hc;
+ struct { jit_uint32_t _: 6; jit_uint32_t b : 5; } rs;
+ struct { jit_uint32_t _: 6; jit_uint32_t b : 5; } fm;
+ struct { jit_uint32_t _:11; jit_uint32_t b : 5; } rt;
+ struct { jit_uint32_t _:11; jit_uint32_t b : 5; } ft;
+ struct { jit_uint32_t _:16; jit_uint32_t b : 5; } rd;
+ struct { jit_uint32_t _:16; jit_uint32_t b : 5; } fs;
+ struct { jit_uint32_t _:21; jit_uint32_t b : 5; } ic;
+ struct { jit_uint32_t _:21; jit_uint32_t b : 5; } fd;
+ struct { jit_uint32_t _:21; jit_uint32_t b : 10; } tr;
+ struct { jit_uint32_t _:21; jit_uint32_t b : 20; } br;
+ struct { jit_uint32_t _:26; jit_uint32_t b : 6; } tc;
+ struct { jit_uint32_t _:21; jit_uint32_t b : 11; } cc;
+ struct { jit_uint32_t _:16; jit_uint32_t b : 16; } is;
+ struct { jit_uint32_t _: 6; jit_uint32_t b : 26; } ii;
+#endif
+ int op;
} jit_instr_t;
-
/* FIXME */
# define jit_mips2_p() 0
-
# define _ZERO_REGNO 0
# define _T0_REGNO 0x08
# define _T1_REGNO 0x09
@@ -68,9 +84,12 @@ typedef union {
# define _F26_REGNO 26
# define _F28_REGNO 28
# define _F30_REGNO 30
-
# if __WORDSIZE == 32
-# define stack_framesize 104
+# if NEW_ABI
+# define stack_framesize 96
+# else
+# define stack_framesize 112
+# endif
# 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)
@@ -82,7 +101,6 @@ typedef union {
# define sti(u, v) sti_l(u, v)
# define stxi(u, v, w) stxi_l(u, v, w)
# endif
-
# define can_sign_extend_short_p(im) ((im) >= -32678 && (im) <= 32767)
# define can_zero_extend_short_p(im) ((im) >= 0 && (im) <= 65535)
# if __WORDSIZE == 32
@@ -94,7 +112,6 @@ typedef union {
((im) < 0 && (im) >= -0x80000000L))
# define can_zero_extend_int_p(im) ((im) >= 0 && (im) <= 0xffffffff)
# endif
-
# define MIPS_SPECIAL 0x00
# define MIPS_REGIMM 0x01
# define MIPS_J 0x02
@@ -157,7 +174,6 @@ typedef union {
# define MIPS_SWC1 0x39
# define MIPS_SWC2 0x3a
# define MIPS_SD 0x3f
-
# define MIPS_MF 0x00
# define MIPS_DMF 0x01
# define MIPS_CF 0x02
@@ -170,7 +186,6 @@ typedef union {
# define MIPS_WRPGPR 0x0e
# define MIPS_BGZAL 0x11
# define MIPS_MFMC0 0x11
-
# define MIPS_BCF 0x00
# define MIPS_BLTZ 0x00
# define MIPS_BCT 0x01
@@ -190,13 +205,11 @@ typedef union {
# define MIPS_BLTZALL 0x12
# define MIPS_BGEZALL 0x13
# define MIPS_SYNCI 0x1f
-
# define MIPS_WSBH 0x02
# define MIPS_DBSH 0x02
# define MIPS_DSHD 0x05
# define MIPS_SEB 0x10
# define MIPS_SEH 0x18
-
# define MIPS_MADD 0x00
# define MIPS_SLL 0x00
# define MIPS_EXT 0x00
@@ -278,7 +291,6 @@ typedef union {
# define MIPS_DSRA32 0x3f
# define MIPS_SDBPP 0x3f
# define ii(i) *_jit->pc.ui++ = i
-
static void
_hrrrit(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,
jit_int32_t, jit_int32_t);
@@ -309,7 +321,7 @@ static void _nop(jit_state_t*,jit_int32_t);
# define SRLV(rd,rt,rs) rrr_t(rs,rt,rd,MIPS_SRLV)
# define SRL(rd,rt,sa) rrit(rt,rd,sa,MIPS_SRL)
# define ROTR(rd,rt,sa)
hrrrit(MIPS_SPECIAL,1,rt,rd,sa,MIPS_DSRL)
-# define INS(rt,rs,pos,size)
hrriit(MIPS_SPECIAL3,rs,rt,pos,pos+size-1,MIPS_DINS)
+# define INS(rt,rs,pos,size)
hrrrit(MIPS_SPECIAL3,rs,rt,pos,pos+size-1,MIPS_DINS)
# else
# define ADDU(rd,rs,rt) rrr_t(rs,rt,rd,MIPS_DADDU)
# define ADDIU(rt,rs,im) hrri(MIPS_DADDIU,rs,rt,im)
@@ -325,7 +337,7 @@ static void _nop(jit_state_t*,jit_int32_t);
# define SRLV(rd,rt,rs) rrr_t(rs,rt,rd,MIPS_DSRLV)
# define SRL(rd,rt,sa) rrit(rt,rd,sa,MIPS_DSRL)
# define ROTR(rd,rt,sa) hrrrit(MIPS_SPECIAL,1,rt,rd,sa,MIPS_SRL)
-# define INS(rt,rs,pos,size)
hrriit(MIPS_SPECIAL3,rs,rt,pos,pos+size-1,MIPS_INS)
+# define INS(rt,rs,pos,size)
hrrrit(MIPS_SPECIAL3,rs,rt,pos,pos+size-1,MIPS_INS)
# endif
# define MFHI(rd)
rrr_t(_ZERO_REGNO,_ZERO_REGNO,rd,MIPS_MFHI)
# define MFLO(rd)
rrr_t(_ZERO_REGNO,_ZERO_REGNO,rd,MIPS_MFLO)
@@ -514,7 +526,7 @@ static void _sti_i(jit_state_t*,jit_word_t,jit_int32_t);
# if __WORDSIZE == 64
# define str_l(r0, r1) SD(r0, 0, r1)
# define sti_l(i0, r0) _sti_l(_jit, i0, r0)
-static void _sti_l(jit_state_t*,jit_int32_t,jit_word_t);
+static void _sti_l(jit_state_t*,jit_word_t,jit_int32_t);
# endif
# define stxr_c(r0, r1, r2) _stxr_c(_jit, r0, r1, r2)
static void _stxr_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
@@ -1634,7 +1646,7 @@ static void
_extr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
movr(r0, r1);
- INS(r0, _RZERO_REGNO, 32, 32);
+ INS(r0, _ZERO_REGNO, 32, 32);
}
# endif
@@ -2770,166 +2782,74 @@ _calli_p(jit_state_t *_jit, jit_word_t i0)
return (word);
}
+static jit_int32_t fregs[] = {
+ _F30, _F28, _F26, _F24, _F22, _F20,
+#if !NEW_ABI
+ _F18, _F16,
+#endif
+};
+
+static jit_int32_t iregs[] = {
+ _S7, _S6, _S5, _S4, _S3, _S2, _S1, _S0,
+};
+
static void
_prolog(jit_state_t *_jit, jit_node_t *node)
{
+ jit_int32_t index;
+ jit_int32_t offset;
+#if NEW_ABI
+ _jitc->function->stack = ((_jitc->function->self.alen -
+ /* align stack at 16 bytes */
+ _jitc->function->self.aoff) + 15) & -16;
+#else
_jitc->function->stack = ((/* first 16 bytes must be allocated */
(_jitc->function->self.alen > 16 ?
_jitc->function->self.alen : 16) -
/* align stack at 8 bytes */
_jitc->function->self.aoff) + 7) & -8;
+#endif
/* callee save registers */
subi(_SP_REGNO, _SP_REGNO, stack_framesize);
-#if __WORDSIZE == 32
- if (jit_regset_tstbit(&_jitc->function->regset, _F30))
- stxi_d(96, _SP_REGNO, _F30_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _F28))
- stxi_d(88, _SP_REGNO, _F28_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _F26))
- stxi_d(80, _SP_REGNO, _F26_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _F24))
- stxi_d(72, _SP_REGNO, _F24_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _F22))
- stxi_d(64, _SP_REGNO, _F22_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _F20))
- stxi_d(56, _SP_REGNO, _F20_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _F18))
- stxi_d(48, _SP_REGNO, _F18_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _F16))
- stxi_d(40, _SP_REGNO, _F16_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _S7))
- stxi(36, _SP_REGNO, _S7_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _S6))
- stxi(32, _SP_REGNO, _S6_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _S5))
- stxi(28, _SP_REGNO, _S5_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _S4))
- stxi(24, _SP_REGNO, _S4_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _S3))
- stxi(20, _SP_REGNO, _S3_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _S2))
- stxi(16, _SP_REGNO, _S2_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _S1))
- stxi(12, _SP_REGNO, _S1_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _S0))
- stxi( 8, _SP_REGNO, _S0_REGNO);
- stxi( 4, _SP_REGNO, _RA_REGNO);
-#else
- if (jit_regset_tstbit(&_jitc->function->regset, _F30))
- stxi_d(136, _SP_REGNO, _F30_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _F28))
- stxi_d(128, _SP_REGNO, _F28_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _F26))
- stxi_d(120, _SP_REGNO, _F26_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _F24))
- stxi_d(112, _SP_REGNO, _F24_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _F22))
- stxi_d(104, _SP_REGNO, _F22_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _F20))
- stxi_d(96, _SP_REGNO, _F20_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _F18))
- stxi_d(88, _SP_REGNO, _F18_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _F16))
- stxi_d(80, _SP_REGNO, _F16_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _S7))
- stxi(72, _SP_REGNO, _S7_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _S6))
- stxi(64, _SP_REGNO, _S6_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _S5))
- stxi(56, _SP_REGNO, _S5_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _S4))
- stxi(48, _SP_REGNO, _S4_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _S3))
- stxi(40, _SP_REGNO, _S3_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _S2))
- stxi(32, _SP_REGNO, _S2_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _S1))
- stxi(24, _SP_REGNO, _S1_REGNO);
- if (jit_regset_tstbit(&_jitc->function->regset, _S0))
- stxi(16, _SP_REGNO, _S0_REGNO);
- stxi( 8, _SP_REGNO, _RA_REGNO);
-#endif
+ offset = stack_framesize - (sizeof(jit_word_t) << 1);
+ for (index = 0; index < jit_size(fregs); index++, offset -= 8) {
+ if (jit_regset_tstbit(&_jitc->function->regset, fregs[index]))
+ stxi_d(offset, _SP_REGNO, rn(fregs[index]));
+ }
+ for (index = 0; index < jit_size(iregs);
+ index++, offset -= sizeof(jit_word_t)) {
+ if (jit_regset_tstbit(&_jitc->function->regset, iregs[index]))
+ stxi(offset, _SP_REGNO, rn(iregs[index]));
+ }
+ assert(offset >= sizeof(jit_word_t));
+ stxi(offset, _SP_REGNO, _RA_REGNO);
stxi(0, _SP_REGNO, _BP_REGNO);
movr(_BP_REGNO, _SP_REGNO);
/* alloca */
- subi(_SP_REGNO, _SP_REGNO, _jitc->function->stack);
+ if (_jitc->function->stack)
+ subi(_SP_REGNO, _SP_REGNO, _jitc->function->stack);
}
static void
_epilog(jit_state_t *_jit, jit_node_t *node)
{
+ jit_int32_t index;
+ jit_int32_t offset;
/* callee save registers */
movr(_SP_REGNO, _BP_REGNO);
-#if __WORDSIZE == 32
- if (jit_regset_tstbit(&_jitc->function->regset, _F30))
- ldxi_d(_F30_REGNO, _SP_REGNO, 96);
- if (jit_regset_tstbit(&_jitc->function->regset, _F28))
- ldxi_d(_F28_REGNO, _SP_REGNO, 88);
- if (jit_regset_tstbit(&_jitc->function->regset, _F26))
- ldxi_d(_F26_REGNO, _SP_REGNO, 80);
- if (jit_regset_tstbit(&_jitc->function->regset, _F24))
- ldxi_d(_F24_REGNO, _SP_REGNO, 72);
- if (jit_regset_tstbit(&_jitc->function->regset, _F22))
- ldxi_d(_F22_REGNO, _SP_REGNO, 64);
- if (jit_regset_tstbit(&_jitc->function->regset, _F20))
- ldxi_d(_F20_REGNO, _SP_REGNO, 56);
- if (jit_regset_tstbit(&_jitc->function->regset, _F18))
- ldxi_d(_F18_REGNO, _SP_REGNO, 48);
- if (jit_regset_tstbit(&_jitc->function->regset, _F16))
- ldxi_d(_F16_REGNO, _SP_REGNO, 40);
- if (jit_regset_tstbit(&_jitc->function->regset, _S7))
- ldxi(_S7_REGNO, _SP_REGNO, 36);
- if (jit_regset_tstbit(&_jitc->function->regset, _S6))
- ldxi(_S6_REGNO, _SP_REGNO, 32);
- if (jit_regset_tstbit(&_jitc->function->regset, _S5))
- ldxi(_S5_REGNO, _SP_REGNO, 28);
- if (jit_regset_tstbit(&_jitc->function->regset, _S4))
- ldxi(_S4_REGNO, _SP_REGNO, 24);
- if (jit_regset_tstbit(&_jitc->function->regset, _S3))
- ldxi(_S3_REGNO, _SP_REGNO, 20);
- if (jit_regset_tstbit(&_jitc->function->regset, _S2))
- ldxi(_S2_REGNO, _SP_REGNO, 16);
- if (jit_regset_tstbit(&_jitc->function->regset, _S1))
- ldxi(_S1_REGNO, _SP_REGNO, 12);
- if (jit_regset_tstbit(&_jitc->function->regset, _S0))
- ldxi(_S0_REGNO, _SP_REGNO, 8);
- ldxi(_RA_REGNO, _SP_REGNO, 4);
-#else
- if (jit_regset_tstbit(&_jitc->function->regset, _F30))
- ldxi_d(_F30_REGNO, _SP_REGNO, 136);
- if (jit_regset_tstbit(&_jitc->function->regset, _F28))
- ldxi_d(_F28_REGNO, _SP_REGNO, 128);
- if (jit_regset_tstbit(&_jitc->function->regset, _F26))
- ldxi_d(_F26_REGNO, _SP_REGNO, 120);
- if (jit_regset_tstbit(&_jitc->function->regset, _F24))
- ldxi_d(_F24_REGNO, _SP_REGNO, 112);
- if (jit_regset_tstbit(&_jitc->function->regset, _F22))
- ldxi_d(_F22_REGNO, _SP_REGNO, 104);
- if (jit_regset_tstbit(&_jitc->function->regset, _F20))
- ldxi_d(_F20_REGNO, _SP_REGNO, 96);
- if (jit_regset_tstbit(&_jitc->function->regset, _F18))
- ldxi_d(_F18_REGNO, _SP_REGNO, 88);
- if (jit_regset_tstbit(&_jitc->function->regset, _F16))
- ldxi_d(_F16_REGNO, _SP_REGNO, 80);
- if (jit_regset_tstbit(&_jitc->function->regset, _S7))
- ldxi(_S7_REGNO, _SP_REGNO, 72);
- if (jit_regset_tstbit(&_jitc->function->regset, _S6))
- ldxi(_S6_REGNO, _SP_REGNO, 64);
- if (jit_regset_tstbit(&_jitc->function->regset, _S5))
- ldxi(_S5_REGNO, _SP_REGNO, 56);
- if (jit_regset_tstbit(&_jitc->function->regset, _S4))
- ldxi(_S4_REGNO, _SP_REGNO, 48);
- if (jit_regset_tstbit(&_jitc->function->regset, _S3))
- ldxi(_S3_REGNO, _SP_REGNO, 40);
- if (jit_regset_tstbit(&_jitc->function->regset, _S2))
- ldxi(_S2_REGNO, _SP_REGNO, 32);
- if (jit_regset_tstbit(&_jitc->function->regset, _S1))
- ldxi(_S1_REGNO, _SP_REGNO, 24);
- if (jit_regset_tstbit(&_jitc->function->regset, _S0))
- ldxi(_S0_REGNO, _SP_REGNO, 16);
- ldxi(_RA_REGNO, _SP_REGNO, 8);
-#endif
+ offset = stack_framesize - (sizeof(jit_word_t) << 1);
+ for (index = 0; index < jit_size(fregs); index++, offset -= 8) {
+ if (jit_regset_tstbit(&_jitc->function->regset, fregs[index]))
+ ldxi_d(rn(fregs[index]), _SP_REGNO, offset);
+ }
+ for (index = 0; index < jit_size(iregs);
+ index++, offset -= sizeof(jit_word_t)) {
+ if (jit_regset_tstbit(&_jitc->function->regset, iregs[index]))
+ ldxi(rn(iregs[index]), _SP_REGNO, offset);
+ }
+ assert(offset >= sizeof(jit_word_t));
+ ldxi(_RA_REGNO, _SP_REGNO, offset);
ldxi(_BP_REGNO, _SP_REGNO, 0);
JR(_RA_REGNO);
/* delay slot */
diff --git a/lib/jit_mips-fpu.c b/lib/jit_mips-fpu.c
index 9b83804..98e473b 100644
--- a/lib/jit_mips-fpu.c
+++ b/lib/jit_mips-fpu.c
@@ -23,7 +23,6 @@
# define MIPS_fmt_PS 0x16 /* 2 x float32 */
# define MIPS_fmt_S_PU 0x20
# define MIPS_fmt_S_PL 0x26
-
# define MIPS_ADD_fmt 0x00
# define MIPS_LWXC1 0x00
# define MIPS_SUB_fmt 0x01
@@ -69,7 +68,6 @@
# define MIPS_NMSUB_fmt_S (0x38 | MIPS_fmt_S)
# define MIPS_NMSUB_fmt_D (0x38 | MIPS_fmt_D)
# define MIPS_NMSUB_fmt_PS (0x38 | MIPS_fmt_PS)
-
# define MIPS_cond_F 0x30
# define MIPS_cond_UN 0x31
# define MIPS_cond_EQ 0x32
@@ -86,7 +84,6 @@
# define MIPS_cond_NGE 0x3d
# define MIPS_cond_LE 0x3e
# define MIPS_cond_UGT 0x3f
-
# define ADD_S(fd,fs,ft)
hrrrit(MIPS_COP1,MIPS_fmt_S,ft,fs,fd,MIPS_ADD_fmt)
# define ADD_D(fd,fs,ft)
hrrrit(MIPS_COP1,MIPS_fmt_D,ft,fs,fd,MIPS_ADD_fmt)
# define SUB_S(fd,fs,ft)
hrrrit(MIPS_COP1,MIPS_fmt_S,ft,fs,fd,MIPS_SUB_fmt)
@@ -212,7 +209,9 @@ static void
_divi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
# define negr_d(r0,r1) NEG_D(r0,r1)
# define sqrtr_f(r0,r1) SQRT_S(r0,r1)
# define sqrtr_d(r0,r1) SQRT_D(r0,r1)
-# define movr_w_f(r0, r1) MTC1(r1, r0)
+# if !NEW_ABI
+# define movr_w_f(r0, r1) MTC1(r1, r0)
+# endif
# define movr_f_w(r0, r1) MFC1(r1, r0)
# define movi_f_w(r0, i0) _movi_f_w(_jit, r0, i0)
static void _movi_f_w(jit_state_t*,jit_int32_t,jit_float32_t*);
@@ -243,12 +242,18 @@ static void
_stxi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
static void _movr_f(jit_state_t*,jit_int32_t,jit_int32_t);
# define movi_f(r0, i0) _movi_f(_jit, r0, i0)
static void _movi_f(jit_state_t*,jit_int32_t,jit_float32_t*);
-# define movr_ww_d(r0, r1, r2) _movr_ww_d(_jit, r0, r1, r2)
+# if NEW_ABI
+# define movr_d_w(r0, r1) DMFC1(r0, r1)
+# define movi_d_w(r0, i0) _movi_d_w(_jit,r0,i0)
+static void _movi_d_w(jit_state_t*,jit_int32_t,jit_float64_t*);
+# else
+# define movr_ww_d(r0, r1, r2) _movr_ww_d(_jit, r0, r1, r2)
static void _movr_ww_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
-# define movr_d_ww(r0, r1, r2) _movr_d_ww(_jit, r0, r1, r2)
+# define movr_d_ww(r0, r1, r2) _movr_d_ww(_jit, r0, r1, r2)
static void _movr_d_ww(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
-# define movi_d_ww(r0, r1, i0) _movi_d_ww(_jit, r0, r1, i0)
+# define movi_d_ww(r0, r1, i0) _movi_d_ww(_jit, r0, r1, i0)
static void _movi_d_ww(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
+# endif
# define extr_d(r0, r1) _extr_d(_jit, r0, r1)
static void _extr_d(jit_state_t*,jit_int32_t,jit_int32_t);
# define truncr_d_i(r0, r1) _truncr_d_i(_jit, r0, r1)
@@ -619,7 +624,7 @@ _truncr_f_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t
r1)
# if __WORDSIZE == 64
static void
-_truncr_f_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_truncr_f_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
jit_int32_t t0;
t0 = jit_get_reg(jit_class_fpr);
@@ -732,6 +737,21 @@ dopi(sub)
dopi(mul)
dopi(div)
+#if NEW_ABI
+static void
+_movi_d_w(jit_state_t *_jit, jit_int32_t r0, jit_float64_t *i0)
+{
+ jit_word_t w;
+ w = (jit_word_t)i0;
+ if (can_sign_extend_short_p(w))
+ LD(r0, w, _ZERO_REGNO);
+ else {
+ movi(r0, w);
+ LD(r0, 0, r0);
+ }
+}
+
+#else
static void
_movr_ww_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
@@ -761,6 +781,7 @@ _movi_d_ww(jit_state_t *_jit, jit_int32_t r0, jit_int32_t
r1, jit_float64_t *i0)
movi(r0, data.i[0]);
movi(r1, data.i[1]);
}
+#endif
static void
_extr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
@@ -802,7 +823,7 @@ _truncr_d_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t
r1)
static void
_ldr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
-# if __WORDSIZE == 64
+# if __WORDSIZE == 64 || NEW_ABI
LDC1(r0, 0, r1);
# else
LWC1(r0, 0, r1);
@@ -814,7 +835,7 @@ static void
_ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
jit_int32_t reg;
-# if __WORDSIZE == 64
+# if __WORDSIZE == 64 || NEW_ABI
if (can_sign_extend_short_p(i0))
LDC1(r0, i0, _ZERO_REGNO);
else {
@@ -852,7 +873,7 @@ static void
_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
-# if __WORDSIZE == 64
+# if __WORDSIZE == 64 || NEW_ABI
if (can_sign_extend_short_p(i0))
LDC1(r0, i0, r1);
# else
@@ -872,7 +893,7 @@ _ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
jit_word_t i0)
static void
_str_d(jit_state_t *_jit,jit_int32_t r0, jit_int32_t r1)
{
-# if __WORDSIZE == 64
+# if __WORDSIZE == 64 || NEW_ABI
SDC1(r1, 0, r0);
# else
SWC1(r1, 0, r0);
@@ -884,7 +905,7 @@ static void
_sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
{
jit_int32_t reg;
-# if __WORDSIZE == 64
+# if __WORDSIZE == 64 || NEW_ABI
if (can_sign_extend_short_p(i0))
SDC1(r0, i0, _ZERO_REGNO);
# else
@@ -915,7 +936,7 @@ static void
_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
{
jit_int32_t reg;
-# if __WORDSIZE == 64
+# if __WORDSIZE == 64 || NEW_ABI
if (can_sign_extend_int_p(i0))
SDC1(r1, i0, r0);
# else
@@ -949,7 +970,7 @@ _movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t
*i0)
} data;
data.d = *i0;
-# if __WORDSIZE == 64
+# if __WORDSIZE == 64 || NEW_ABI
if (data.l)
ldi_d(r0, (jit_word_t)i0);
else
diff --git a/lib/jit_mips.c b/lib/jit_mips.c
index 815d8bf..1bdf28a 100644
--- a/lib/jit_mips.c
+++ b/lib/jit_mips.c
@@ -22,7 +22,24 @@
#define rc(value) jit_class_##value
#define rn(reg)
(jit_regno(_rvs[jit_regno(reg)].spec))
-/* initial, mipsel 32 bits code only */
+/* FIXME Need to detect (from /proc on Linux?) if a Loongson or Godson,
+ * because n32 and n64 mandate that float registers are 64 bit, and
+ * on the later, registers are 32 bit.
+ */
+#if NEW_ABI
+# define NUM_WORD_ARGS 8
+# define STACK_SLOT 8
+# define STACK_SHIFT 3
+#else
+# define NUM_WORD_ARGS 4
+# define STACK_SLOT 4
+# define STACK_SHIFT 2
+#endif
+#if __BYTE_ORDER == __BIG_ENDIAN && __WORDSIZE == 32
+# define WORD_ADJUST 4
+#else
+# define WORD_ADJUST 0
+#endif
/*
* Prototypes
@@ -42,10 +59,12 @@ jit_register_t _rvs[] = {
{ rc(gpr) | 0x01, "at" },
{ rc(gpr) | 0x02, "v0" },
{ rc(gpr) | 0x03, "v1" },
+#if !NEW_ABI
{ rc(gpr) | 0x08, "t0" },
{ rc(gpr) | 0x09, "t1" },
{ rc(gpr) | 0x0a, "t2" },
{ rc(gpr) | 0x0b, "t3" },
+#endif
{ rc(gpr) | 0x0c, "t4" },
{ rc(gpr) | 0x0d, "t5" },
{ rc(gpr) | 0x0e, "t6" },
@@ -67,6 +86,12 @@ jit_register_t _rvs[] = {
{ rc(sav) | 0x1c, "gp" },
{ rc(sav) | 0x1d, "sp" },
{ rc(sav) | 0x1e, "fp" },
+#if NEW_ABI
+ { rc(gpr) | 0x0b, "a7" },
+ { rc(gpr) | 0x0a, "a6" },
+ { rc(gpr) | 0x09, "a5" },
+ { rc(gpr) | 0x08, "a4" },
+#endif
{ rc(arg) | rc(gpr) | 0x07, "a3" },
{ rc(arg) | rc(gpr) | 0x06, "a2" },
{ rc(arg) | rc(gpr) | 0x05, "a1" },
@@ -77,16 +102,29 @@ jit_register_t _rvs[] = {
{ rc(fpr) | 0x06, "$f6" },
{ rc(fpr) | 0x08, "$f8" },
{ rc(fpr) | 0x0a, "$f10" },
+#if !NEW_ABI
{ rc(sav) | rc(fpr) | 0x10, "$f16" },
{ rc(sav) | rc(fpr) | 0x12, "$f18" },
+#endif
{ rc(sav) | rc(fpr) | 0x14, "$f20" },
{ rc(sav) | rc(fpr) | 0x16, "$f22" },
{ rc(sav) | rc(fpr) | 0x18, "$f24" },
{ rc(sav) | rc(fpr) | 0x1a, "$f26" },
{ rc(sav) | rc(fpr) | 0x1c, "$f28" },
{ rc(sav) | rc(fpr) | 0x1e, "$f30" },
+#if NEW_ABI
+ { rc(arg) | rc(fpr) | 0x13, "$f19" },
+ { rc(arg) | rc(fpr) | 0x12, "$f18" },
+ { rc(arg) | rc(fpr) | 0x11, "$f17" },
+ { rc(arg) | rc(fpr) | 0x10, "$f16" },
+ { rc(arg) | rc(fpr) | 0x0f, "$f15" },
+ { rc(arg) | rc(fpr) | 0x0e, "$f14" },
+ { rc(arg) | rc(fpr) | 0x0d, "$f13" },
+ { rc(arg) | rc(fpr) | 0x0c, "$f12" },
+#else
{ rc(arg) | rc(fpr) | 0x0e, "$f14" },
{ rc(arg) | rc(fpr) | 0x0c, "$f12" },
+#endif
{ _NOREG, "<none>" },
};
@@ -239,28 +277,43 @@ jit_node_t *
_jit_arg(jit_state_t *_jit)
{
jit_int32_t offset;
-
assert(_jitc->function);
+#if NEW_ABI
+ if (_jitc->function->self.argi < NUM_WORD_ARGS)
+ offset = _jitc->function->self.argi++;
+ else {
+ offset = _jitc->function->self.size;
+ _jitc->function->self.size += STACK_SLOT;
+ }
+#else
offset = (_jitc->function->self.size - stack_framesize) >> 2;
_jitc->function->self.argi = 1;
if (offset >= 4)
offset = _jitc->function->self.size;
- _jitc->function->self.size += sizeof(jit_word_t);
+ _jitc->function->self.size += STACK_SLOT;
+#endif
return (jit_new_node_w(jit_code_arg, offset));
}
jit_bool_t
_jit_arg_reg_p(jit_state_t *_jit, jit_int32_t offset)
{
- return (offset >= 0 && offset < 4);
+ return (offset >= 0 && offset < NUM_WORD_ARGS);
}
jit_node_t *
_jit_arg_f(jit_state_t *_jit)
{
jit_int32_t offset;
-
assert(_jitc->function);
+#if NEW_ABI
+ if (_jitc->function->self.argi < NUM_WORD_ARGS)
+ offset = _jitc->function->self.argi++;
+ else {
+ offset = _jitc->function->self.size;
+ _jitc->function->self.size += STACK_SLOT;
+ }
+#else
offset = (_jitc->function->self.size - stack_framesize) >> 2;
if (offset < 4) {
if (!_jitc->function->self.argi) {
@@ -274,8 +327,8 @@ _jit_arg_f(jit_state_t *_jit)
}
else
offset = _jitc->function->self.size;
- _jitc->function->self.size += sizeof(jit_float32_t);
-
+ _jitc->function->self.size += STACK_SLOT;
+#endif
return (jit_new_node_w(jit_code_arg_f, offset));
}
@@ -290,8 +343,15 @@ jit_node_t *
_jit_arg_d(jit_state_t *_jit)
{
jit_int32_t offset;
-
assert(_jitc->function);
+#if NEW_ABI
+ if (_jitc->function->self.argi < NUM_WORD_ARGS)
+ offset = _jitc->function->self.argi++;
+ else {
+ offset = _jitc->function->self.size;
+ _jitc->function->self.size += STACK_SLOT;
+ }
+#else
if (_jitc->function->self.size & 7) {
_jitc->function->self.size += 4;
_jitc->function->self.argi = 1;
@@ -303,7 +363,8 @@ _jit_arg_d(jit_state_t *_jit)
}
else
offset = _jitc->function->self.size;
- _jitc->function->self.size += sizeof(jit_float64_t);
+ _jitc->function->self.size += STACK_SLOT;
+#endif
return (jit_new_node_w(jit_code_arg_d, offset));
}
@@ -316,67 +377,97 @@ _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 (v->u.w < 4)
+ if (v->u.w < NUM_WORD_ARGS)
jit_extr_c(u, _A0 - v->u.w);
- else
+ else {
+#if __BYTE_ORDER == __LITTLE__ENDIAN
jit_ldxi_c(u, _FP, v->u.w);
+#else
+ jit_ldxi_c(u, JIT_FP, v->u.w + STACK_SLOT - sizeof(jit_int8_t));
+ }
+#endif
}
void
_jit_getarg_uc(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
{
- if (v->u.w < 4)
+ if (v->u.w < NUM_WORD_ARGS)
jit_extr_uc(u, _A0 - v->u.w);
- else
+ else {
+#if __BYTE_ORDER == __LITTLE__ENDIAN
jit_ldxi_uc(u, _FP, v->u.w);
+#else
+ jit_ldxi_uc(u, JIT_FP, v->u.w + STACK_SLOT - sizeof(jit_uint8_t));
+ }
+#endif
}
void
_jit_getarg_s(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
{
- if (v->u.w < 4)
+ if (v->u.w < NUM_WORD_ARGS)
jit_extr_s(u, _A0 - v->u.w);
- else
+ else {
+#if __BYTE_ORDER == __LITTLE__ENDIAN
jit_ldxi_s(u, _FP, v->u.w);
+#else
+ jit_ldxi_s(u, JIT_FP, v->u.w + STACK_SLOT - sizeof(jit_int16_t));
+ }
+#endif
}
void
_jit_getarg_us(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
{
- if (v->u.w < 4)
+ if (v->u.w < NUM_WORD_ARGS)
jit_extr_us(u, _A0 - v->u.w);
- else
+ else {
+#if __BYTE_ORDER == __LITTLE__ENDIAN
jit_ldxi_us(u, _FP, v->u.w);
+#else
+ jit_ldxi_us(u, JIT_FP, v->u.w + STACK_SLOT - sizeof(jit_uint16_t));
+ }
+#endif
}
void
_jit_getarg_i(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
{
- if (v->u.w < 4) {
+ if (v->u.w < NUM_WORD_ARGS) {
#if __WORDSIZE == 64
jit_extr_i(u, _A0 - v->u.w);
#else
jit_movr(u, _A0 - v->u.w);
#endif
}
- else
+ else {
+#if __BYTE_ORDER == __LITTLE__ENDIAN
jit_ldxi_i(u, _FP, v->u.w);
+#else
+ jit_ldxi_i(u, JIT_FP, v->u.w + STACK_SLOT - sizeof(jit_int32_t));
+ }
+#endif
}
#if __WORDSIZE == 64
void
_jit_getarg_ui(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
{
- if (v->u.w < 4)
+ if (v->u.w < NUM_WORD_ARGS)
jit_extr_ui(u, _A0 - v->u.w);
- else
+ else {
+# if __BYTE_ORDER == __LITTLE__ENDIAN
jit_ldxi_ui(u, _FP, v->u.w);
+# else
+ jit_ldxi_ui(u, JIT_FP, v->u.w + STACK_SLOT - sizeof(jit_uint32_t));
+ }
+# endif
}
void
_jit_getarg_l(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
{
- if (v->u.w < 4)
+ if (v->u.w < NUM_WORD_ARGS)
jit_movr(u, _A0 - v->u.w);
else
jit_ldxi_l(u, _FP, v->u.w);
@@ -386,10 +477,15 @@ _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 NEW_ABI
+ if (v->u.w < NUM_WORD_ARGS)
+ jit_movr_f(u, _F12 - v->u.w);
+#else
if (v->u.w < 4)
jit_movr_w_f(u, _A0 - v->u.w);
else if (v->u.w < 8)
jit_movr_f(u, _F12 - ((v->u.w - 4) >> 1));
+#endif
else
jit_ldxi_f(u, _FP, v->u.w);
}
@@ -397,10 +493,15 @@ _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 NEW_ABI
+ if (v->u.w < NUM_WORD_ARGS)
+ jit_movr_d(u, _F12 - v->u.w);
+#else
if (v->u.w < 4)
jit_movr_ww_d(u, _A0 - v->u.w, _A0 - (v->u.w + 1));
else if (v->u.w < 8)
jit_movr_d(u, _F12 - ((v->u.w - 4) >> 1));
+#endif
else
jit_ldxi_d(u, _FP, v->u.w);
}
@@ -408,28 +509,53 @@ _jit_getarg_d(jit_state_t *_jit, jit_int32_t u,
jit_node_t *v)
void
_jit_pushargr(jit_state_t *_jit, jit_int32_t u)
{
+#if NEW_ABI
+ assert(_jitc->function);
+ if (_jitc->function->call.argi < NUM_WORD_ARGS) {
+ jit_movr(_A0 - _jitc->function->call.argi, u);
+ ++_jitc->function->call.argi;
+ }
+ else {
+ jit_stxi(_jitc->function->call.size + WORD_ADJUST, JIT_SP, u);
+ _jitc->function->call.size += STACK_SLOT;
+ }
+#else
jit_word_t offset;
-
assert(_jitc->function);
- offset = _jitc->function->call.size >> 2;
+ offset = _jitc->function->call.size >> STACK_SHIFT;
_jitc->function->call.argi = 1;
- if (offset < 4)
+ if (offset < NUM_WORD_ARGS)
jit_movr(_A0 - offset, u);
else
jit_stxi(_jitc->function->call.size, JIT_SP, u);
- _jitc->function->call.size += sizeof(jit_word_t);
+ _jitc->function->call.size += STACK_SLOT;
+#endif
}
void
_jit_pushargi(jit_state_t *_jit, jit_word_t u)
{
+#if NEW_ABI
+ jit_int32_t regno;
+ assert(_jitc->function);
+ if (_jitc->function->call.argi < NUM_WORD_ARGS) {
+ jit_movi(_A0 - _jitc->function->call.argi, u);
+ ++_jitc->function->call.argi;
+ }
+ else {
+ regno = jit_get_reg(jit_class_gpr);
+ jit_movi(regno, u);
+ jit_stxi(_jitc->function->call.size + WORD_ADJUST, JIT_SP, regno);
+ _jitc->function->call.size += STACK_SLOT;
+ jit_unget_reg(regno);
+ }
+#else
jit_int32_t regno;
jit_word_t offset;
-
assert(_jitc->function);
- offset = _jitc->function->call.size >> 2;
+ offset = _jitc->function->call.size >> STACK_SHIFT;
++_jitc->function->call.argi;
- if (offset < 4)
+ if (offset < NUM_WORD_ARGS)
jit_movi(_A0 - offset, u);
else {
regno = jit_get_reg(jit_class_gpr);
@@ -437,16 +563,30 @@ _jit_pushargi(jit_state_t *_jit, jit_word_t u)
jit_stxi(_jitc->function->call.size, JIT_SP, regno);
jit_unget_reg(regno);
}
- _jitc->function->call.size += sizeof(jit_word_t);
+ _jitc->function->call.size += STACK_SLOT;
+#endif
}
void
_jit_pushargr_f(jit_state_t *_jit, jit_int32_t u)
{
+#if NEW_ABI
+ assert(_jitc->function);
+ if (_jitc->function->call.argi < NUM_WORD_ARGS) {
+ if (!(_jitc->function->call.call & jit_call_varargs))
+ jit_movr_f(_F12 - _jitc->function->call.argi, u);
+ else
+ jit_movr_f_w(_A0 - _jitc->function->call.argi, u);
+ ++_jitc->function->call.argi;
+ }
+ else {
+ jit_stxi_f(_jitc->function->call.size, JIT_SP, u);
+ _jitc->function->call.size += STACK_SLOT;
+ }
+#else
jit_word_t offset;
-
assert(_jitc->function);
- offset = _jitc->function->call.size >> 2;
+ offset = _jitc->function->call.size >> STACK_SHIFT;
if (offset < 2 && !_jitc->function->call.argi) {
++_jitc->function->call.argf;
jit_movr_f(_F12 - offset, u);
@@ -457,17 +597,34 @@ _jit_pushargr_f(jit_state_t *_jit, jit_int32_t u)
}
else
jit_stxi_f(_jitc->function->call.size, JIT_SP, u);
- _jitc->function->call.size += sizeof(jit_float32_t);
+ _jitc->function->call.size += STACK_SLOT;
+#endif
}
void
_jit_pushargi_f(jit_state_t *_jit, jit_float32_t u)
{
jit_int32_t regno;
+#if NEW_ABI
+ assert(_jitc->function);
+ if (_jitc->function->call.argi < NUM_WORD_ARGS) {
+ if (!(_jitc->function->call.call & jit_call_varargs))
+ jit_movi_f(_F12 - _jitc->function->call.argi, u);
+ else
+ jit_movi_f_w(_A0 - _jitc->function->call.argi, u);
+ ++_jitc->function->call.argi;
+ }
+ else {
+ regno = jit_get_reg(jit_class_fpr);
+ jit_movi_f(regno, u);
+ jit_stxi_f(_jitc->function->call.size, JIT_SP, regno);
+ _jitc->function->call.size += STACK_SLOT;
+ jit_unget_reg(regno);
+ }
+#else
jit_word_t offset;
-
assert(_jitc->function);
- offset = _jitc->function->call.size >> 2;
+ offset = _jitc->function->call.size >> STACK_SHIFT;
if (offset < 2 && !_jitc->function->call.argi) {
++_jitc->function->call.argf;
jit_movi_f(_F12 - offset, u);
@@ -482,15 +639,29 @@ _jit_pushargi_f(jit_state_t *_jit, jit_float32_t u)
jit_stxi_f(_jitc->function->call.size, JIT_SP, regno);
jit_unget_reg(regno);
}
- _jitc->function->call.size += sizeof(jit_float32_t);
+ _jitc->function->call.size += STACK_SLOT;
+#endif
}
void
_jit_pushargr_d(jit_state_t *_jit, jit_int32_t u)
{
+#if NEW_ABI
+ assert(_jitc->function);
+ if (_jitc->function->call.argi < NUM_WORD_ARGS) {
+ if (!(_jitc->function->call.call & jit_call_varargs))
+ jit_movr_d(_F12 - _jitc->function->call.argi, u);
+ else
+ jit_movr_d_w(_A0 - _jitc->function->call.argi, u);
+ ++_jitc->function->call.argi;
+ }
+ else {
+ jit_stxi_d(_jitc->function->call.size, JIT_SP, u);
+ _jitc->function->call.size += STACK_SLOT;
+ }
+#else
jit_bool_t adjust;
jit_word_t offset;
-
assert(_jitc->function);
adjust = !!_jitc->function->call.argi;
if (_jitc->function->call.size & 7) {
@@ -510,23 +681,40 @@ _jit_pushargr_d(jit_state_t *_jit, jit_int32_t u)
}
else
jit_stxi_d(_jitc->function->call.size, JIT_SP, u);
- _jitc->function->call.size += sizeof(jit_float64_t);
+ _jitc->function->call.size += STACK_SLOT;
+#endif
}
void
_jit_pushargi_d(jit_state_t *_jit, jit_float64_t u)
{
jit_int32_t regno;
+#if NEW_ABI
+ assert(_jitc->function);
+ if (_jitc->function->call.argi < NUM_WORD_ARGS) {
+ if (!(_jitc->function->call.call & jit_call_varargs))
+ jit_movi_d(_F12 - _jitc->function->call.argi, u);
+ else
+ jit_movi_d_w(_A0 - _jitc->function->call.argi, u);
+ ++_jitc->function->call.argi;
+ }
+ else {
+ regno = jit_get_reg(jit_class_fpr);
+ jit_movi_d(regno, u);
+ jit_stxi_d(_jitc->function->call.size, JIT_SP, regno);
+ _jitc->function->call.size += STACK_SLOT;
+ jit_unget_reg(regno);
+ }
+#else
jit_bool_t adjust;
jit_word_t offset;
-
assert(_jitc->function);
adjust = !!_jitc->function->call.argi;
if (_jitc->function->call.size & 7) {
_jitc->function->call.size += 4;
adjust = 1;
}
- offset = _jitc->function->call.size >> 2;
+ offset = _jitc->function->call.size >> STACK_SHIFT;
if (offset < 3) {
if (adjust) {
jit_movi_d_ww(_A0 - offset, _A0 - (offset + 1), u);
@@ -543,7 +731,8 @@ _jit_pushargi_d(jit_state_t *_jit, jit_float64_t u)
jit_stxi_d(_jitc->function->call.size, JIT_SP, regno);
jit_unget_reg(regno);
}
- _jitc->function->call.size += sizeof(jit_float64_t);
+ _jitc->function->call.size += STACK_SLOT;
+#endif
}
jit_bool_t
@@ -579,7 +768,11 @@ _jit_finishr(jit_state_t *_jit, jit_int32_t r0)
jit_movr(_T9, r0);
call = jit_callr(_T9);
call->v.w = _jitc->function->self.argi;
+#if NEW_ABI
+ call->w.w = call->v.w;
+#else
call->w.w = _jitc->function->self.argf;
+#endif
_jitc->function->call.argi = _jitc->function->call.argf =
_jitc->function->call.size = 0;
_jitc->prepare = 0;
@@ -597,7 +790,11 @@ _jit_finishi(jit_state_t *_jit, jit_pointer_t i0)
node = jit_movi(_T9, (jit_word_t)i0);
call = jit_callr(_T9);
call->v.w = _jitc->function->call.argi;
+#if NEW_ABI
+ call->w.w = call->v.w;
+#else
call->w.w = _jitc->function->call.argf;
+#endif
_jitc->function->call.argi = _jitc->function->call.argf =
_jitc->function->call.size = 0;
_jitc->prepare = 0;
@@ -892,6 +1089,10 @@ _emit_code(jit_state_t *_jit)
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) {
@@ -1195,9 +1396,11 @@ _emit_code(jit_state_t *_jit)
epilog(node);
_jitc->function = NULL;
break;
+#if !NEW_ABI
case jit_code_movr_w_f:
movr_w_f(rn(node->u.w), rn(node->v.w));
break;
+#endif
case jit_code_movr_f_w:
movr_f_w(rn(node->u.w), rn(node->v.w));
break;
@@ -1205,6 +1408,15 @@ _emit_code(jit_state_t *_jit)
assert(node->flag & jit_flag_data);
movi_f_w(rn(node->u.w), (jit_float32_t *)node->v.n->u.w);
break;
+#if NEW_ABI
+ case jit_code_movr_d_w:
+ movr_d_w(rn(node->u.w), rn(node->v.w));
+ break;
+ case jit_code_movi_d_w:
+ assert(node->flag & jit_flag_data);
+ movi_d_w(rn(node->u.w), (jit_float64_t *)node->v.n->u.w);
+ break;
+#else
case jit_code_movr_ww_d:
movr_ww_d(rn(node->u.w), rn(node->v.w), rn(node->w.w));
break;
@@ -1216,6 +1428,7 @@ _emit_code(jit_state_t *_jit)
movi_d_ww(rn(node->u.w), rn(node->v.w),
(jit_float64_t *)node->w.n->u.w);
break;
+#endif
case jit_code_live:
case jit_code_arg:
case jit_code_arg_f: case jit_code_arg_d:
@@ -1273,21 +1486,13 @@ _emit_code(jit_state_t *_jit)
void
_emit_ldxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
-#if __WORDSIZE == 32
- ldxi_i(rn(r0), rn(r1), i0);
-#else
- ldxi_l(rn(r0), rn(r1), i0);
-#endif
+ ldxi(rn(r0), rn(r1), i0);
}
void
_emit_stxi(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
{
-#if __WORDSIZE == 32
- stxi_i(i0, rn(r0), rn(r1));
-#else
- stxi_l(i0, rn(r0), rn(r1));
-#endif
+ stxi(i0, rn(r0), rn(r1));
}
void
diff --git a/lib/lightning.c b/lib/lightning.c
index f5ba7a4..8d844e7 100644
--- a/lib/lightning.c
+++ b/lib/lightning.c
@@ -18,9 +18,15 @@
#include <lightning.h>
#include <lightning/jit_private.h>
#include <sys/mman.h>
+#if defined(__sgi)
+# include <fcntl.h>
+#endif
#ifndef MAP_ANON
# define MAP_ANON MAP_ANONYMOUS
+# ifndef MAP_ANONYMOUS
+# define MAP_ANONYMOUS 0
+# endif
#endif
#define jit_regload_reload 0 /* convert to reload */
@@ -159,6 +165,9 @@ _patch_register(jit_state_t *jit, jit_node_t *node,
jit_node_t *link,
* Initialization
*/
const char *jit_progname;
+#if !defined(__sgi)
+#define mmap_fd -1
+#endif
/*
* Implementation
@@ -1375,6 +1384,9 @@ _jit_optimize(jit_state_t *_jit)
jit_node_t *node;
jit_block_t *block;
jit_word_t offset;
+#if defined(__sgi)
+ int mmap_fd;
+#endif
_jitc->function = NULL;
@@ -1491,10 +1503,16 @@ _jit_optimize(jit_state_t *_jit)
_jit->data.length = (_jitc->data.offset +
/* reserve space for annotations */
_jitc->note.size + 4095) & -4096;
+#if defined(__sgi)
+ mmap_fd = open("/dev/zero", O_RDWR);
+#endif
ptr = mmap(NULL, _jit->data.length,
PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANON, -1, 0);
+ MAP_PRIVATE | MAP_ANON, mmap_fd, 0);
assert(ptr != MAP_FAILED);
+#if defined(__sgi)
+ close(mmap_fd);
+#endif
memcpy(ptr, _jit->data.ptr, _jitc->data.offset);
jit_free((jit_pointer_t *)&_jit->data.ptr);
_jit->data.ptr = ptr;
@@ -1648,6 +1666,9 @@ _jit_emit(jit_state_t *_jit)
jit_node_t *node;
size_t length;
int result;
+#if defined(__sgi)
+ int mmap_fd;
+#endif
if (_jitc->function)
jit_epilog();
@@ -1660,9 +1681,12 @@ _jit_emit(jit_state_t *_jit)
_jit->code.length = _jitc->pool.length * 1024 * _jitc->mult;
+#if defined(__sgi)
+ mmap_fd = open("/dev/zero", O_RDWR);
+#endif
_jit->code.ptr = mmap(NULL, _jit->code.length,
PROT_EXEC | PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANON, -1, 0);
+ MAP_PRIVATE | MAP_ANON, mmap_fd, 0);
assert(_jit->code.ptr != MAP_FAILED);
_jitc->code.end = _jit->code.ptr + _jit->code.length - 64;
_jit->pc.uc = _jit->code.ptr;
@@ -1688,7 +1712,7 @@ _jit_emit(jit_state_t *_jit)
#else
_jit->code.ptr = mmap(NULL, length,
PROT_EXEC | PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANON, -1, 0);
+ MAP_PRIVATE | MAP_ANON, mmap_fd, 0);
#endif
assert(_jit->code.ptr != MAP_FAILED);
@@ -1701,6 +1725,10 @@ _jit_emit(jit_state_t *_jit)
break;
}
+#if defined(__sgi)
+ close(mmap_fd);
+#endif
+
_jitc->done = 1;
jit_annotate();
- [Guile-commits] 341/437: Add missing float rsbi strings, (continued)
- [Guile-commits] 341/437: Add missing float rsbi strings, Andy Wingo, 2018/07/02
- [Guile-commits] 296/437: ALPHA: Implement lightning Alpha port., Andy Wingo, 2018/07/02
- [Guile-commits] 207/437: Correct race condition if register is written more than once, Andy Wingo, 2018/07/02
- [Guile-commits] 394/437: Move multiply defined macro to a single header file., Andy Wingo, 2018/07/02
- [Guile-commits] 366/437: Correct inconsistency with jit_regno_patch, Andy Wingo, 2018/07/02
- [Guile-commits] 421/437: Remove documentation from embedded GNU lightning, Andy Wingo, 2018/07/02
- [Guile-commits] 195/437: Minor updates when testing on a prototype, quadcore Loongson mips., Andy Wingo, 2018/07/02
- [Guile-commits] 332/437: Add test case to check possible issues with 2 contexts, Andy Wingo, 2018/07/02
- [Guile-commits] 189/437: Pass all but the (not yet implemented) qmul and qdiv tests in sparc, Andy Wingo, 2018/07/02
- [Guile-commits] 217/437: Adjust lightning to work on ppc AIX., Andy Wingo, 2018/07/02
- [Guile-commits] 223/437: Build and pass all tests on big endian Irix mips using the n32 abi.,
Andy Wingo <=
- [Guile-commits] 205/437: Properly split instruction groups for predicate registers., Andy Wingo, 2018/07/02
- [Guile-commits] 391/437: aarch64: Correct va_list offsets and double load., Andy Wingo, 2018/07/02
- [Guile-commits] 304/437: Correct typo in documentation., Andy Wingo, 2018/07/02
- [Guile-commits] 409/437: Correct binutils version detection, Andy Wingo, 2018/07/02
- [Guile-commits] 310/437: Allow jit_jmpi on an immediate constant address., Andy Wingo, 2018/07/02
- [Guile-commits] 264/437: ARM: Do not use ldrt/strt by default, Andy Wingo, 2018/07/02
- [Guile-commits] 244/437: HPPA: Correct bogus logic when calling function pointers., Andy Wingo, 2018/07/02
- [Guile-commits] 273/437: x86: Ensure the x87 stack is empty when calling a function., Andy Wingo, 2018/07/02
- [Guile-commits] 126/437: Cleanup on preparation for lightning rework., Andy Wingo, 2018/07/02
- [Guile-commits] 364/437: GNU lightning 2.1.0 release, Andy Wingo, 2018/07/02