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

index : lightning.git
Portable just-in-time compiler library
summary refs log tree commit diff
path: root/lib
diff options
context:
space:
mode:
authorPaulo Andrade <pcpa@gnu.org>2018年08月30日 16:54:49 -0300
committerPaulo Andrade <pcpa@gnu.org>2018年08月30日 16:54:49 -0300
commit13536344bfe50e4346c4441fb226073e540bf7b4 (patch)
treea77f3384caae737bbe910765f401b2d8b8851b5d /lib
parent94a188844dd90e4155fbb72782f75dcf5b330442 (diff)
downloadlightning-13536344bfe50e4346c4441fb226073e540bf7b4.tar.gz
Build and pass check with one exception.
The exception appears to be a bug in a 6ish months old qemu-hppa. It fails to detect a signed overflow for the pattern 0x7fffffff+1, and fails in this jit pseudo code: movi r0 0x7fffffff movi r1 1 boaddr L1 r0 r1 calli abort L1: The generated assembly should be correct: movi r4 0x7fffffff 0xf8ef5018 ldil L%7ffff800,r4 0xf8ef501c ldo 7ff(r4),r4 movi r5 0x1 0xf8ef5020 ldi 1,r5 boaddr L1 r4 r5 0xf8ef5024 addb,sv,n r5,r4,0xf8ef5044 :a.tst:291 0xf8ef5028 nop calli 0xf8eeb68a [...] L1: * lib/jit_disasm.c: Add hints to select hppa disassembler. * lib/jit_hppa-cpu.c: Correct address of vastart when all argument registers were used as non vararg arguments. * lib/jit_hppa-fpu.c: Disable load/store of rv,ix,rb where rv is the value, ix is an register or integer offset and rb is a base register. These should be better tested, as they do not work on all environments (fail on qemu-hppa).
Diffstat (limited to 'lib')
-rw-r--r--lib/jit_disasm.c 4
-rw-r--r--lib/jit_hppa-cpu.c 5
-rw-r--r--lib/jit_hppa-fpu.c 47
3 files changed, 47 insertions, 9 deletions
diff --git a/lib/jit_disasm.c b/lib/jit_disasm.c
index 89cc289..f7f60b9 100644
--- a/lib/jit_disasm.c
+++ b/lib/jit_disasm.c
@@ -120,6 +120,10 @@ jit_init_debug(const char *progname)
disasm_info.arch = bfd_arch_alpha;
disasm_info.mach = bfd_mach_alpha_ev6;
# endif
+# if defined(__hppa__)
+ disasm_info.arch = bfd_arch_hppa;
+ disasm_info.mach = bfd_mach_hppa10;
+# endif
disasm_info.print_address_func = disasm_print_address;
# if BINUTILS_2_29
diff --git a/lib/jit_hppa-cpu.c b/lib/jit_hppa-cpu.c
index 4318f06..fab5742 100644
--- a/lib/jit_hppa-cpu.c
+++ b/lib/jit_hppa-cpu.c
@@ -2738,7 +2738,10 @@ static void
_vastart(jit_state_t *_jit, jit_int32_t r0)
{
/* Initialize stack pointer to the first stack argument. */
- addi(r0, _FP_REGNO, params_offset - _jitc->function->vagp * 4);
+ if (jit_arg_reg_p(_jitc->function->vagp))
+ addi(r0, _FP_REGNO, params_offset - _jitc->function->vagp * 4);
+ else
+ addi(r0, _FP_REGNO, _jitc->function->self.size);
}
static void
diff --git a/lib/jit_hppa-fpu.c b/lib/jit_hppa-fpu.c
index c0e85ba..c60c7f4 100644
--- a/lib/jit_hppa-fpu.c
+++ b/lib/jit_hppa-fpu.c
@@ -20,11 +20,13 @@
#if PROTO
/* FIXME should actually be hw model/version/etc or other constraint
- * that causes a SIGSEGV if using these instructions */
-#if defined(__hpux)
+ * that causes a SIGSEGV/SIGILL if using these instructions */
+#if 1 //defined(__hpux)
# define FSTXR 0
+# define FLDXR 0
#else
# define FSTXR 1
+# define FLDXR 1
#endif
#define f39(o,b,x,t) _f39(_jit,o,b,x,t)
@@ -391,13 +393,20 @@ static void _cmpi_d(jit_state_t*,jit_word_t,
#define ldr_f(r0,r1) FLDWI(0,r1,r0)
#define ldi_f(r0,i0) _ldi_f(_jit,r0,i0)
static void _ldi_f(jit_state_t*,jit_int32_t,jit_word_t);
-#define ldxr_f(r0,r1,r2) FLDW(r2,r1,r0)
+#if FLDXR
+# define ldxr_f(r0,r1,r2) FLDW(r2,r1,r0)
+# define ldxr_d(r0,r1,r2) FLDD(r2,r1,r0)
+#else
+#define ldxr_f(r0,r1,r2) _ldxr_f(_jit,r0,r1,r2)
+static void _ldxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
+#define ldxr_d(r0,r1,r2) _ldxr_d(_jit,r0,r1,r2)
+static void _ldxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
+#endif
#define ldxi_f(r0,r1,i0) _ldxi_f(_jit,r0,r1,i0)
static void _ldxi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
#define ldr_d(r0,r1) FLDDI(0,r1,r0)
#define ldi_d(r0,i0) _ldi_d(_jit,r0,i0)
static void _ldi_d(jit_state_t*,jit_int32_t,jit_word_t);
-#define ldxr_d(r0,r1,r2) FLDD(r2,r1,r0)
#define ldxi_d(r0,r1,i0) _ldxi_d(_jit,r0,r1,i0)
static void _ldxi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
#define str_f(r0,r1) FSTWI(r1,0,r0)
@@ -812,6 +821,28 @@ _ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
}
}
+#if !FLDXR
+static void
+_ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
+{
+ jit_int32_t reg;
+ reg = jit_get_reg(jit_class_gpr);
+ addr(rn(reg), r1, r2);
+ ldr_f(r0, rn(reg));
+ jit_unget_reg(reg);
+}
+
+static void
+_ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
+{
+ jit_int32_t reg;
+ reg = jit_get_reg(jit_class_gpr);
+ addr(rn(reg), r1, r2);
+ ldr_d(r0, rn(reg));
+ jit_unget_reg(reg);
+}
+#endif
+
static void
_ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
@@ -819,7 +850,7 @@ _ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
if (i0 >= -16 && i0 <= 15)
FLDWI(i0, r1, r0);
/* |im11a|0|t|i| */
- else if (i0 >= -8192 && i0 <= 8191 && !(re_assemble_16(i0) & 6))
+ else if (FLDXR && i0 >= -8192 && i0 <= 8191 && !(re_assemble_16(i0) & 6))
FLDWL(i0, r1, r0);
else {
reg = jit_get_reg(jit_class_gpr);
@@ -851,7 +882,7 @@ _ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
if (i0 >= -16 && i0 <= 15)
FLDDI(i0, r1, r0);
/* |im10a|m|a|1|i| */
- else if (i0 >= -8192 && i0 <= 8191 && !(re_assemble_16(i0) & 14))
+ else if (FLDXR && i0 >= -8192 && i0 <= 8191 && !(re_assemble_16(i0) & 14))
FLDDL(i0, r1, r0);
else {
reg = jit_get_reg(jit_class_gpr);
@@ -905,7 +936,7 @@ _stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
if (i0 >= -16 && i0 <= 15)
FSTWI(r1, i0, r0);
/* |im11a|0|t|i| */
- else if (i0 >= -8192 && i0 <= 8191 && !(re_assemble_16(i0) & 6))
+ else if (FSTXR && i0 >= -8192 && i0 <= 8191 && !(re_assemble_16(i0) & 6))
FSTWL(r1, i0, r0);
else {
reg = jit_get_reg(jit_class_gpr);
@@ -942,7 +973,7 @@ _stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
if (i0 >= -16 && i0 <= 15)
FSTDI(r1, i0, r0);
/* |im10a|m|a|1|i| */
- else if (i0 >= -8192 && i0 <= 8191 && !(re_assemble_16(i0) & 14))
+ else if (FSTXR && i0 >= -8192 && i0 <= 8191 && !(re_assemble_16(i0) & 14))
FSTDL(r1, i0, r0);
else {
reg = jit_get_reg(jit_class_gpr);
generated by cgit v1.2.3 (git 2.25.1) at 2025年10月05日 17:04:33 +0000

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