lightning.git - Portable just-in-time compiler library

index : lightning.git
Portable just-in-time compiler library
summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat
-rw-r--r--ChangeLog 27
-rw-r--r--check/self.c 67
-rw-r--r--configure.ac 2
-rw-r--r--include/lightning.h 4
-rw-r--r--include/lightning/jit_arm.h 2
-rw-r--r--include/lightning/jit_ia64.h 2
-rw-r--r--include/lightning/jit_ppc.h 6
-rw-r--r--lib/jit_x86-x87.c 57
-rw-r--r--lib/jit_x86.c 4
9 files changed, 156 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index f6fb8c4..c81dd88 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,30 @@
+2013年10月07日 Paulo Andrade <pcpa@gnu.org>
+
+ * check/self.c: Extend tests to validate jit_callee_save_p
+ does not cause an assertion on valid arguments, and test
+ extra registers defined on some backends.
+
+ * configure.ac: Do not ignore environment CFLAGS when
+ checking if need to test runtime configurable options,
+ like use x87 when sse2 is available, arm instruction set
+ instead of thumb, etc.
+
+ * include/lightning/jit_arm.h: Correct wrong jit_f macro
+ definition.
+
+ * include/lightning/jit_ia64.h, include/lightning/jit_ppc.h:
+ Correct wrong jit_r macro definition.
+
+ * lib/jit_x86-x87.c, lib/jit_x86.c: Actually use the
+ reserved stack space for integer to/from float conversion.
+ The stack space was also changed to ensure it is 8 bytes
+ aligned. Also, for Solaris x86 in 32 bit mode, an alternate
+ truncr_d was implemented because for some reason it is
+ failing with SIGILL if using the "fisttpl" instructions,
+ that must be available on p6 or newer, but for the sake of
+ making all tests pass, implement a 486 or newer sequence
+ if "sun" is defined.
+
2013年10月03日 Paulo Andrade <pcpa@gnu.org>
* include/lightning/jit_mips.h, lib/jit_mips-cpu.c,
diff --git a/check/self.c b/check/self.c
index 4275825..7cfbb94 100644
--- a/check/self.c
+++ b/check/self.c
@@ -5,44 +5,93 @@
int
main(int argc, char *argv[])
{
+ jit_state_t *_jit;
+
/* Same JIT_XY are not constants */
init_jit(argv[0]);
+ _jit = jit_new_state();
assert(JIT_R0 == jit_r(0));
+ (void)jit_callee_save_p(JIT_R0);
assert(JIT_R1 == jit_r(1));
+ (void)jit_callee_save_p(JIT_R1);
assert(JIT_R2 == jit_r(2));
+ (void)jit_callee_save_p(JIT_R2);
#if defined(JIT_R3)
assert(JIT_R3 == jit_r(3));
+ (void)jit_callee_save_p(JIT_R3);
# if defined(JIT_R4)
assert(JIT_R4 == jit_r(4));
+ (void)jit_callee_save_p(JIT_R4);
# if defined(JIT_R5)
assert(JIT_R5 == jit_r(5));
+ (void)jit_callee_save_p(JIT_R5);
# if defined(JIT_R6)
assert(JIT_R6 == jit_r(6));
+ (void)jit_callee_save_p(JIT_R6);
# if defined(JIT_R7)
assert(JIT_R7 == jit_r(7));
+ (void)jit_callee_save_p(JIT_R7);
# endif
# endif
# endif
# endif
#endif
assert(JIT_V0 == jit_v(0));
+ assert(jit_callee_save_p(JIT_V0));
assert(JIT_V1 == jit_v(1));
+ assert(jit_callee_save_p(JIT_V1));
assert(JIT_V2 == jit_v(2));
+ assert(jit_callee_save_p(JIT_V2));
#if defined(JIT_V3)
assert(JIT_V3 == jit_v(3));
+ assert(jit_callee_save_p(JIT_V3));
# if defined(JIT_V4)
assert(JIT_V4 == jit_v(4));
+ assert(jit_callee_save_p(JIT_V4));
# if defined(JIT_V5)
assert(JIT_V5 == jit_v(5));
+ assert(jit_callee_save_p(JIT_V5));
# if defined(JIT_V6)
assert(JIT_V6 == jit_v(6));
+ assert(jit_callee_save_p(JIT_V6));
# if defined(JIT_V7)
assert(JIT_V7 == jit_v(7));
+ assert(jit_callee_save_p(JIT_V7));
# if defined(JIT_V8)
assert(JIT_V8 == jit_v(8));
+ assert(jit_callee_save_p(JIT_V8));
# if defined(JIT_V9)
assert(JIT_V9 == jit_v(9));
+ assert(jit_callee_save_p(JIT_V9));
+# if defined(JIT_V10)
+ assert(JIT_V10 == jit_v(10));
+ assert(jit_callee_save_p(JIT_V10));
+# if defined(JIT_V11)
+ assert(JIT_V11 == jit_v(11));
+ assert(jit_callee_save_p(JIT_V11));
+# if defined(JIT_V12)
+ assert(JIT_V12 == jit_v(12));
+ assert(jit_callee_save_p(JIT_V12));
+# if defined(JIT_V13)
+ assert(JIT_V13 == jit_v(13));
+ assert(jit_callee_save_p(JIT_V13));
+# if defined(JIT_V14)
+ assert(JIT_V14 == jit_v(14));
+ assert(jit_callee_save_p(JIT_V14));
+# if defined(JIT_V15)
+ assert(JIT_V15 == jit_v(15));
+ assert(jit_callee_save_p(JIT_V15));
+# if defined(JIT_V16)
+ assert(JIT_V16 == jit_v(16));
+ assert(jit_callee_save_p(JIT_V16));
+# endif
+# endif
+# endif
+# endif
+# endif
+# endif
+# endif
# endif
# endif
# endif
@@ -51,18 +100,36 @@ main(int argc, char *argv[])
# endif
#endif
assert(JIT_F0 == jit_f(0));
+ (void)jit_callee_save_p(JIT_F0);
assert(JIT_F1 == jit_f(1));
+ (void)jit_callee_save_p(JIT_F1);
assert(JIT_F2 == jit_f(2));
+ (void)jit_callee_save_p(JIT_F2);
assert(JIT_F3 == jit_f(3));
+ (void)jit_callee_save_p(JIT_F3);
assert(JIT_F4 == jit_f(4));
+ (void)jit_callee_save_p(JIT_F4);
assert(JIT_F5 == jit_f(5));
+ (void)jit_callee_save_p(JIT_F5);
#if defined(JIT_F6)
assert(JIT_F6 == jit_f(6));
+ (void)jit_callee_save_p(JIT_F6);
# if defined(JIT_F7)
assert(JIT_F7 == jit_f(7));
+ (void)jit_callee_save_p(JIT_F7);
+# if defined(JIT_F8)
+ assert(JIT_F8 == jit_f(8));
+ (void)jit_callee_save_p(JIT_F8);
+# if defined(JIT_F9)
+ assert(JIT_F9 == jit_f(9));
+ (void)jit_callee_save_p(JIT_F9);
+# endif
+# endif
# endif
#endif
+ jit_clear_state();
+ jit_destroy_state();
finish_jit();
return (0);
diff --git a/configure.ac b/configure.ac
index 11b0063..6b9e7a7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -137,7 +137,7 @@ ac_cv_test_arm_arm=
ac_cv_test_arm_swf=
save_CFLAGS=$CFLAGS
-CFLAGS="-I$PWD/include -D_GNU_SOURCE"
+CFLAGS="$CFLAGS -I$PWD/include -D_GNU_SOURCE"
if test x$cpu = x; then
AC_MSG_ERROR([cpu $target_cpu not supported])
elif test $cpu = x86; then
diff --git a/include/lightning.h b/include/lightning.h
index 561c559..9fab138 100644
--- a/include/lightning.h
+++ b/include/lightning.h
@@ -84,7 +84,9 @@
# define __BYTE_ORDER __BIG_ENDIAN
# elif defined(__BIG_ENDIAN__) /* ia64 hp-ux */
# define __BYTE_ORDER __BIG_ENDIAN
-# elif defined(__i386__) /* x86 solaris */
+# elif defined(__i386__) /* 32 bit x86 solaris */
+# define __BYTE_ORDER __LITTLE_ENDIAN
+# elif defined(__x86_64__) /* 64 bit x86 solaris */
# define __BYTE_ORDER __LITTLE_ENDIAN
# elif defined(__MIPSEB) /* mips irix */
# define __BYTE_ORDER __BIG_ENDIAN
diff --git a/include/lightning/jit_arm.h b/include/lightning/jit_arm.h
index d217a4b..6c8ede8 100644
--- a/include/lightning/jit_arm.h
+++ b/include/lightning/jit_arm.h
@@ -37,7 +37,7 @@ typedef enum {
#define jit_v(i) (_R7 + (i))
#define jit_v_num() 3
#define jit_arg_f_reg_p(i) ((i) >= 0 && (i) < 4)
-#define jit_f(i) (jit_cpu.abi ? _D8 + (i) : _D7 + (i))
+#define jit_f(i) (jit_cpu.abi ? _D8 + ((i)<<1) : _D0 - ((i)<<1))
#define jit_f_num() 8
_R12, /* ip - temporary */
#define JIT_R0 _R4
diff --git a/include/lightning/jit_ia64.h b/include/lightning/jit_ia64.h
index 0539749..29f4189 100644
--- a/include/lightning/jit_ia64.h
+++ b/include/lightning/jit_ia64.h
@@ -37,7 +37,7 @@ typedef enum {
#define JIT_V2 _R46
#define JIT_V3 _R47
#define jit_r_num() 4
-#define jit_r(n) (_R40 - (n))
+#define jit_r(n) (_R40 + (n))
#define jit_v_num() 4
#define jit_v(n) (_R44 + (n))
_R0, /* constant - Always 0 */
diff --git a/include/lightning/jit_ppc.h b/include/lightning/jit_ppc.h
index 9976b09..4daf9de 100644
--- a/include/lightning/jit_ppc.h
+++ b/include/lightning/jit_ppc.h
@@ -28,7 +28,11 @@
*/
typedef enum {
#define jit_arg_reg_p(i) ((i) >= 0 && (i) < 8)
-#define jit_r(i) (_R11 + (i))
+#if __ppc__
+# define jit_r(i) (_R11 + (i))
+#else
+# define jit_r(i) (_R28 + (i))
+#endif
#define jit_r_num() 3
#if __ppc__
# define jit_v(i) (_R30 - (i))
diff --git a/lib/jit_x86-x87.c b/lib/jit_x86-x87.c
index 6935593..63043c8 100644
--- a/lib/jit_x86-x87.c
+++ b/lib/jit_x86-x87.c
@@ -18,6 +18,11 @@
*/
#if PROTO
+# if __WORDSIZE == 32
+# define CVT_OFFSET -12
+# else
+# define CVT_OFFSET -8
+# endif
# define _ST0_REGNO 0
# define _ST1_REGNO 1
# define _ST2_REGNO 2
@@ -27,11 +32,16 @@
# define _ST6_REGNO 6
# define _ST7_REGNO 7
# define x87rx(code, md, rb, ri, ms) _x87rx(_jit, code, md, rb, ri, ms)
+# define fldcwm(md, rb, ri, ms) x87rx(015, md, rb, ri, ms)
+# define fstcwm(md, rb, ri, ms) _fstcwm(_jit, md, rb, ri, ms)
+static void
+_fstcwm(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
# define fldsm(md, rb, ri, ms) x87rx(010, md, rb, ri, ms)
# define fstsm(md, rb, ri, ms) x87rx(012, md, rb, ri, ms)
# define fldlm(md, rb, ri, ms) x87rx(050, md, rb, ri, ms)
# define fstlm(md, rb, ri, ms) x87rx(052, md, rb, ri, ms)
# define fisttplm(md, rb, ri, ms) x87rx(031, md, rb, ri, ms)
+# define fistlm(md, rb, ri, ms) x87rx(032, md, rb, ri, ms)
# define fisttpqm(md, rb, ri, ms) x87rx(071, md, rb, ri, ms)
# define fildlm(md, rb, ri, ms) x87rx(030, md, rb,ri, ms)
# define fildqm(md, rb, ri, ms) x87rx(075, md, rb,ri, ms)
@@ -403,6 +413,15 @@ _x87_b##name##i_##type(jit_state_t *_jit, \
# define dbopi(name) fpr_bopi(name, d, 64)
static void
+_fstcwm(jit_state_t *_jit, jit_int32_t md,
+ jit_int32_t rb, jit_int32_t ri, jit_int32_t ms)
+{
+ ic(0x9b);
+ rex(0, 1, rb, ri, _NOREG);
+ x87rx(017, md, rb, ri, ms);
+}
+
+static void
_x87rx(jit_state_t *_jit, jit_int32_t code, jit_int32_t md,
jit_int32_t rb, jit_int32_t ri, jit_int32_t ms)
{
@@ -630,34 +649,52 @@ _x87_sqrtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
static void
_x87_truncr_d_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
- pushr(_RAX_REGNO);
+#if defined(sun)
+ /* for the sake of passing test cases in x87 mode, otherwise only sse
+ * is supported */
+ fstcwm(-4, _RBP_REGNO, _NOREG, _SCL1);
+ ldxi_s(r0, _RBP_REGNO, -4);
+ extr_uc(r0, r0);
+# define FPCW_CHOP 0xc00
+ ori(r0, r0, FPCW_CHOP);
+ stxi_s(-8, _RBP_REGNO, r0);
+ fldcwm(-8, _RBP_REGNO, _NOREG, _SCL1);
+ if (r1 == _ST0_REGNO)
+ fistlm(CVT_OFFSET, _RBP_REGNO, _NOREG, _SCL1);
+ else {
+ fxchr(r1);
+ fistlm(CVT_OFFSET, _RBP_REGNO, _NOREG, _SCL1);
+ fxchr(r1);
+ }
+ fldcwm(-4, _RBP_REGNO, _NOREG, _SCL1);
+ ldxi(r0, _RBP_REGNO, CVT_OFFSET);
+#else
fldr(r1);
- fisttplm(0, _RSP_REGNO, _NOREG, _SCL1);
- popr(r0);
+ fisttplm(CVT_OFFSET, _RBP_REGNO, _NOREG, _SCL1);
+ ldxi_i(r0, _RBP_REGNO, CVT_OFFSET);
+#endif
}
# if __WORDSIZE == 64
static void
_x87_truncr_d_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
- pushr(_RAX_REGNO);
fldr(r1);
- fisttpqm(0, _RSP_REGNO, _NOREG, _SCL1);
- popr(r0);
+ fisttpqm(CVT_OFFSET, _RBP_REGNO, _NOREG, _SCL1);
+ ldxi(r0, _RBP_REGNO, CVT_OFFSET);
}
# endif
static void
_x87_extr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
- pushr(r1);
+ stxi(CVT_OFFSET, _RBP_REGNO, r1);
# if __WORDSIZE == 32
- fildlm(0, _RSP_REGNO, _NOREG, _SCL1);
+ fildlm(CVT_OFFSET, _RBP_REGNO, _NOREG, _SCL1);
# else
- fildqm(0, _RSP_REGNO, _NOREG, _SCL1);
+ fildqm(CVT_OFFSET, _RBP_REGNO, _NOREG, _SCL1);
# endif
fstpr(r0 + 1);
- popr(r1);
}
static void
diff --git a/lib/jit_x86.c b/lib/jit_x86.c
index b2c1b40..28b6166 100644
--- a/lib/jit_x86.c
+++ b/lib/jit_x86.c
@@ -310,7 +310,11 @@ _jit_prolog(jit_state_t *_jit)
_jitc->function->self.argi = _jitc->function->self.argf =
_jitc->function->self.aoff = _jitc->function->self.alen = 0;
/* sse/x87 conversion */
+#if __WORDSIZE == 32
+ _jitc->function->self.aoff = -12;
+#else
_jitc->function->self.aoff = -8;
+#endif
_jitc->function->self.call = jit_call_default;
jit_alloc((jit_pointer_t *)&_jitc->function->regoff,
_jitc->reglen * sizeof(jit_int32_t));
generated by cgit v1.2.3 (git 2.39.1) at 2025年09月15日 19:03:58 +0000

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