[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 334/437: ARM: Correct several inconsistencies with ldrd
From: |
Andy Wingo |
Subject: |
[Guile-commits] 334/437: ARM: Correct several inconsistencies with ldrd and strd |
Date: |
Mon, 2 Jul 2018 05:14:49 -0400 (EDT) |
wingo pushed a commit to branch lightning
in repository guile.
commit 3f397228f5f1f27f3a8a264530a11895fbc9fb79
Author: pcpa <address@hidden>
Date: Thu Nov 20 15:05:13 2014 -0200
ARM: Correct several inconsistencies with ldrd and strd
* lib/jit_disasm.c: Change thumb or arm disassemble based on
jit code before disassembly.
* lib/jit_arm-cpu.c: Correct reversed arguments to LDRD and
STRD instructions, and correct checking for support of those.
* lib/jit_arm-swf.c: Correct wrong use of LDRD and STRD and
only use those if the register is even.
* check/check.arm.swf.sh, check/check.arm4.swf.sh: New files
to test LDRD and STRD, as well as the alternate code path
when those are not available, in the .arm4. test case.
* check/Makefile.am: Update for the new test cases.
---
ChangeLog | 17 +++++++++++++++++
check/Makefile.am | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
check/check.arm.swf.sh | 15 +++++++++++++++
check/check.arm4.swf.sh | 15 +++++++++++++++
lib/jit_arm-cpu.c | 8 ++++----
lib/jit_arm-swf.c | 39 ++++++++++++++++++++++-----------------
lib/jit_disasm.c | 18 +++++++++---------
7 files changed, 131 insertions(+), 30 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index fc1670d..3263ef3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2014-11-20 Paulo Andrade <address@hidden>
+
+ * lib/jit_disasm.c: Change thumb or arm disassemble based on
+ jit code before disassembly.
+
+ * lib/jit_arm-cpu.c: Correct reversed arguments to LDRD and
+ STRD instructions, and correct checking for support of those.
+
+ * lib/jit_arm-swf.c: Correct wrong use of LDRD and STRD and
+ only use those if the register is even.
+
+ * check/check.arm.swf.sh, check/check.arm4.swf.sh: New files
+ to test LDRD and STRD, as well as the alternate code path
+ when those are not available, in the .arm4. test case.
+
+ * check/Makefile.am: Update for the new test cases.
+
2014-11-08 Paulo Andrade <address@hidden>
* include/lightning/jit_private.h, lib/jit_aarch64.c,
diff --git a/check/Makefile.am b/check/Makefile.am
index b736f50..ca6afe9 100644
--- a/check/Makefile.am
+++ b/check/Makefile.am
@@ -92,6 +92,8 @@ EXTRA_DIST = \
check.sh \
check.x87.sh \
check.arm.sh check.swf.sh \
+ check.arm.swf.sh \
+ check.arm4.swf.sh \
check.nodata.sh \
check.x87.nodata.sh \
run-test all.tst
@@ -213,6 +215,53 @@ swf_TESTS = \
$(swf_TESTS): check.swf.sh
$(LN_S) $(srcdir)/check.swf.sh $@
TESTS += $(swf_TESTS)
+if test_arm_arm
+#arm_swf_TESTS = $(addsuffix .arm.swf, $(base_TESTS))
+arm_swf_TESTS = \
+ 3to2.arm.swf add.arm.swf allocai.arm.swf \
+ bp.arm.swf divi.arm.swf fib.arm.swf rpn.arm.swf \
+ ldstr.arm.swf ldsti.arm.swf \
+ ldstxr.arm.swf ldstxi.arm.swf \
+ ldstr-c.arm.swf ldstxr-c.arm.swf ldstxi-c.arm.swf \
+ cvt.arm.swf branch.arm.swf \
+ alu_add.arm.swf alux_add.arm.swf \
+ alu_sub.arm.swf alux_sub.arm.swf alu_rsb.arm.swf \
+ alu_mul.arm.swf alu_div.arm.swf alu_rem.arm.swf \
+ alu_and.arm.swf alu_or.arm.swf alu_xor.arm.swf \
+ alu_lsh.arm.swf alu_rsh.arm.swf \
+ alu_com.arm.swf alu_neg.arm.swf \
+ fop_abs.arm.swf fop_sqrt.arm.swf \
+ varargs.arm.swf stack.arm.swf \
+ clobber.arm.swf carry.arm.swf call.arm.swf \
+ float.arm.swf jmpr.arm.swf tramp.arm.swf range.arm.swf
+$(arm_swf_TESTS): check.arm.swf.sh
+ $(LN_S) $(srcdir)/check.arm.swf.sh $@
+TESTS += $(arm_swf_TESTS)
+endif
+if test_arm_arm
+#arm4_swf_TESTS = $(addsuffix .arm4.swf, $(base_TESTS))
+arm4_swf_TESTS = \
+ 3to2.arm4.swf add.arm4.swf allocai.arm4.swf \
+ bp.arm4.swf divi.arm4.swf fib.arm4.swf rpn.arm4.swf \
+ ldstr.arm4.swf ldsti.arm4.swf \
+ ldstxr.arm4.swf ldstxi.arm4.swf \
+ ldstr-c.arm4.swf ldstxr-c.arm4.swf ldstxi-c.arm4.swf \
+ cvt.arm4.swf branch.arm4.swf \
+ alu_add.arm4.swf alux_add.arm4.swf \
+ alu_sub.arm4.swf alux_sub.arm4.swf alu_rsb.arm4.swf \
+ alu_mul.arm4.swf alu_div.arm4.swf alu_rem.arm4.swf \
+ alu_and.arm4.swf alu_or.arm4.swf alu_xor.arm4.swf \
+ alu_lsh.arm4.swf alu_rsh.arm4.swf \
+ alu_com.arm4.swf alu_neg.arm4.swf \
+ fop_abs.arm4.swf fop_sqrt.arm4.swf \
+ varargs.arm4.swf stack.arm4.swf \
+ clobber.arm4.swf carry.arm4.swf call.arm4.swf \
+ float.arm4.swf jmpr.arm4.swf tramp.arm4.swf \
+ range.arm4.swf
+$(arm4_swf_TESTS): check.arm4.swf.sh
+ $(LN_S) $(srcdir)/check.arm4.swf.sh $@
+TESTS += $(arm4_swf_TESTS)
+endif
endif
if test_nodata
diff --git a/check/check.arm.swf.sh b/check/check.arm.swf.sh
new file mode 100755
index 0000000..378b6d7
--- /dev/null
+++ b/check/check.arm.swf.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+test=`basename $0 | sed -e 's|\.arm\.swf$||'`
+./lightning -mthumb=0 -mvfp=0 $srcdir/$test.tst | tr -d \\r > $test.out
+if test $? != 0; then
+ exit $?
+fi
+
+cmp -s $srcdir/$test.ok $test.out
+result=$?
+if test $result != 0; then
+ diff $srcdir/$test.ok $test.out
+ rm $test.out
+ exit 1
+fi
+rm $test.out
diff --git a/check/check.arm4.swf.sh b/check/check.arm4.swf.sh
new file mode 100755
index 0000000..21926b6
--- /dev/null
+++ b/check/check.arm4.swf.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+test=`basename $0 | sed -e 's|\.arm4\.swf$||'`
+./lightning -mcpu=4 -mthumb=0 -mvfp=0 $srcdir/$test.tst | tr -d \\r > $test.out
+if test $? != 0; then
+ exit $?
+fi
+
+cmp -s $srcdir/$test.ok $test.out
+result=$?
+if test $result != 0; then
+ diff $srcdir/$test.ok $test.out
+ rm $test.out
+ exit 1
+fi
+rm $test.out
diff --git a/lib/jit_arm-cpu.c b/lib/jit_arm-cpu.c
index 552bce3..aabccef 100644
--- a/lib/jit_arm-cpu.c
+++ b/lib/jit_arm-cpu.c
@@ -31,7 +31,7 @@
# define jit_thumb_p() jit_cpu.thumb
# define jit_no_set_flags() _jitc->no_set_flags
# define jit_armv5_p() (jit_cpu.version >= 5)
-# define jit_armv5e_p() (jit_cpu.version >= 5 && jit_cpu.extend)
+# define jit_armv5e_p() (jit_cpu.version > 5 ||
(jit_cpu.version == 5 && jit_cpu.extend))
# define jit_armv6_p() (jit_cpu.version >= 6)
# define jit_armv7r_p() 0
# define stack_framesize 48
@@ -709,9 +709,9 @@ static void _torl(jit_state_t*,int,int,int) maybe_unused;
# define LDRD(rt,rn,rm) CC_LDRD(ARM_CC_AL,rt,rn,rm)
# define T2_LDRDI(rt,rt2,rn,im) torrri8(THUMB2_LDRDI|ARM_P,rn,rt,rt2,im)
# define CC_LDRDN(cc,rt,rn,rm) corrr(cc,ARM_LDRD,rn,rt,rm)
-# define LDRDN(rd,rn,rm) CC_LDRDN(ARM_CC_AL,rn,rt,rm)
+# define LDRDN(rd,rn,rm) CC_LDRDN(ARM_CC_AL,rt,rn,rm)
# define CC_LDRDI(cc,rt,rn,im)
corri8(cc,ARM_LDRDI|ARM_P,rn,rt,im)
-# define LDRDI(rt,rn,im) CC_LDRDI(ARM_CC_AL,rn,rt,im)
+# define LDRDI(rt,rn,im) CC_LDRDI(ARM_CC_AL,rt,rn,im)
# define CC_LDRDIN(cc,rt,rn,im) corri8(cc,ARM_LDRDI,rn,rt,im)
# define LDRDIN(rt,rn,im) CC_LDRDIN(ARM_CC_AL,rt,rn,im)
# define T2_LDRDIN(rt,rt2,rn,im) torrri8(THUMB2_LDRDI,rn,rt,rt2,im)
@@ -758,7 +758,7 @@ static void _torl(jit_state_t*,int,int,int) maybe_unused;
# define CC_STRIN(cc,rt,rn,im) corri(cc,ARM_STRI,rn,rt,im)
# define STRIN(rt,rn,im) CC_STRIN(ARM_CC_AL,rt,rn,im)
# define T2_STRIN(rt,rn,im) torri8(THUMB2_STRI,rn,rt,im)
-# define CC_STRD(cc,rt,rn,rm) corrr(cc,ARM_STRD|ARM_P,rt,rn,rm)
+# define CC_STRD(cc,rt,rn,rm) corrr(cc,ARM_STRD|ARM_P,rn,rt,rm)
# define STRD(rt,rn,rm) CC_STRD(ARM_CC_AL,rt,rn,rm)
# define CC_STRDN(cc,rt,rn,rm) corrr(cc,ARM_STRD,rn,rt,rm)
# define STRDN(rt,rn,rm) CC_STRDN(ARM_CC_AL,rt,rn,rm)
diff --git a/lib/jit_arm-swf.c b/lib/jit_arm-swf.c
index 8afd9e5..d4774e9 100644
--- a/lib/jit_arm-swf.c
+++ b/lib/jit_arm-swf.c
@@ -1870,7 +1870,7 @@ _swf_movr_d(jit_state_t *_jit, jit_int32_t r0,
jit_int32_t r1)
}
}
else if (jit_fpr_p(r0)) {
- if (!jit_thumb_p() && jit_armv5e_p())
+ if (!jit_thumb_p() && jit_armv5e_p() && !(r1 & 1))
STRDIN(r1, _FP_REGNO, swf_off(r0) + 8);
else {
swf_strin(r1, _FP_REGNO, swf_off(r0) + 8);
@@ -1967,9 +1967,9 @@ _swf_absr_d(jit_state_t *_jit, jit_int32_t r0,
jit_int32_t r1)
if (jit_fpr_p(r1)) {
if (jit_fpr_p(r0) && !jit_thumb_p() && jit_armv5e_p() &&
r0 != r1 && (reg = jit_get_reg_pair()) != JIT_NOREG) {
- LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 4);
- swf_bici(rn(reg), rn(reg), 0x80000000);
- STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 4);
+ LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 8);
+ swf_bici(rn(reg) + 1, rn(reg) + 1, 0x80000000);
+ STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8);
jit_unget_reg_pair(reg);
}
else {
@@ -2039,9 +2039,9 @@ _swf_negr_d(jit_state_t *_jit, jit_int32_t r0,
jit_int32_t r1)
if (jit_fpr_p(r1)) {
if (jit_fpr_p(r0) && !jit_thumb_p() && jit_armv5e_p() &&
r0 != r1 && (reg = jit_get_reg_pair()) != JIT_NOREG) {
- LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 4);
- EORI(rn(reg), rn(reg), encode_arm_immediate(0x80000000));
- STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 4);
+ LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 8);
+ EORI(rn(reg) + 1, rn(reg) + 1, encode_arm_immediate(0x80000000));
+ STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8);
jit_unget_reg_pair(reg);
}
else {
@@ -2197,7 +2197,7 @@ _swf_ldr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t
r1)
jit_unget_reg(reg);
}
}
- else if (!jit_thumb_p() && jit_armv5e_p())
+ else if (!jit_thumb_p() && jit_armv5e_p() && !(r0 & 1))
LDRDI(r0, r1, 0);
else {
ldxi_i(r0, r1, 0);
@@ -2241,7 +2241,7 @@ _swf_ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t
i0)
swf_strin(rn(rg0), _FP_REGNO, swf_off(r0) + 4);
jit_unget_reg(rg0);
}
- else if (!jit_thumb_p() && jit_armv5e_p())
+ else if (!jit_thumb_p() && jit_armv5e_p() && !(r0 & 1))
LDRDI(r0, rn(rg1), 0);
else {
ldxi_i(r0, rn(rg1), 0);
@@ -2289,7 +2289,7 @@ _swf_ldxr_d(jit_state_t *_jit, jit_int32_t r0,
jit_int32_t r1, jit_int32_t r2)
}
}
else {
- if (!jit_thumb_p() && jit_armv5e_p())
+ if (!jit_thumb_p() && jit_armv5e_p() && !(r0 & 1))
LDRD(r0, r1, r2);
else {
rg1 = jit_get_reg(jit_class_gpr);
@@ -2360,9 +2360,11 @@ _swf_ldxi_d(jit_state_t *_jit, jit_int32_t r0,
jit_int32_t r1, jit_word_t i0)
}
}
else {
- if (!jit_thumb_p() && jit_armv5e_p() && i0 >= 0 && i0 <= 255)
+ if (!jit_thumb_p() && jit_armv5e_p() &&
+ i0 >= 0 && i0 <= 255 && !(r0 & 1))
LDRDI(r0, r1, i0);
- else if (!jit_thumb_p() && jit_armv5e_p() && i0 < 0 && i0 >= -255)
+ else if (!jit_thumb_p() && jit_armv5e_p() &&
+ i0 < 0 && i0 >= -255 && !(r0 & 1))
LDRDIN(r0, r1, -i0);
else if (i0 >= 0 && i0 + 4 <= 4095) {
ldxi_i(r0, r1, i0);
@@ -2417,7 +2419,7 @@ _swf_str_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t
r1)
}
}
else {
- if (!jit_thumb_p() && jit_armv5e_p())
+ if (!jit_thumb_p() && jit_armv5e_p() && !(r1 & 1))
STRDI(r1, r0, 0);
else {
stxi_i(0, r0, r1);
@@ -2469,7 +2471,7 @@ _swf_sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t
r0)
else {
rg1 = jit_get_reg(jit_class_gpr);
movi(rn(rg1), i0);
- if (!jit_thumb_p() && jit_armv5e_p())
+ if (!jit_thumb_p() && jit_armv5e_p() && !(r0 & 1))
STRDI(r0, rn(rg1), 0);
else {
stxi_i(0, rn(rg1), r0);
@@ -2517,7 +2519,7 @@ _swf_stxr_d(jit_state_t *_jit, jit_int32_t r0,
jit_int32_t r1, jit_int32_t r2)
}
}
else {
- if (!jit_thumb_p() && jit_armv5e_p())
+ if (!jit_thumb_p() && jit_armv5e_p() && !(r2 & 1))
STRD(r0, r1, r2);
else {
rg1 = jit_get_reg(jit_class_gpr);
@@ -2556,6 +2558,7 @@ _swf_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t
r0, jit_int32_t r1)
STRDI(rn(rg0), r0, i0);
else
STRDIN(rn(rg0), r0, -i0);
+ jit_unget_reg_pair(rg0);
}
else if (i0 >= 0 && i0 + 4 <= 4095) {
rg0 = jit_get_reg(jit_class_gpr);
@@ -2587,9 +2590,11 @@ _swf_stxi_d(jit_state_t *_jit, jit_word_t i0,
jit_int32_t r0, jit_int32_t r1)
}
}
else {
- if (!jit_thumb_p() && jit_armv5e_p() && i0 >= 0 && i0 <= 255)
+ if (!jit_thumb_p() && jit_armv5e_p() &&
+ i0 >= 0 && i0 <= 255 && !(r1 & 1))
STRDI(r1, r0, i0);
- else if (!jit_thumb_p() && jit_armv5e_p() && i0 < 0 && i0 >= -255)
+ else if (!jit_thumb_p() && jit_armv5e_p() &&
+ i0 < 0 && i0 >= -255 && !(r1 & 1))
STRDIN(r1, r0, -i0);
else if (i0 >= 0 && i0 + 4 <= 4095) {
stxi_i(i0, r0, r1);
diff --git a/lib/jit_disasm.c b/lib/jit_disasm.c
index 6f9227d..51c6784 100644
--- a/lib/jit_disasm.c
+++ b/lib/jit_disasm.c
@@ -84,12 +84,6 @@ jit_init_debug(const char *progname)
disasm_info.mach = bfd_mach_i386_i386;
# endif
# endif
-# if defined(__arm__)
- /* FIXME add mapping for prolog switching to arm and possible jump
- * before first prolog also in arm mode */
- if (jit_cpu.thumb)
- disasm_info.disassembler_options = "force-thumb";
-# endif
# if defined(__powerpc__)
disasm_info.arch = bfd_arch_powerpc;
disasm_info.mach = bfd_mach_ppc64;
@@ -204,8 +198,15 @@ void
_jit_disassemble(jit_state_t *_jit)
{
#if DISASSEMBLER
- if (disasm_bfd)
+ if (disasm_bfd) {
+# if defined(__arm__)
+ /* FIXME add mapping for prolog switching to arm and possible jump
+ * before first prolog also in arm mode */
+ disasm_info.disassembler_options = jit_cpu.thumb ? "force-thumb" : "";
+# endif
+
disassemble(_jit->code.ptr, _jit->pc.uc - _jit->code.ptr);
+ }
#endif
}
@@ -326,8 +327,7 @@ _disassemble(jit_state_t *_jit, jit_pointer_t code,
jit_int32_t length)
again:
if (data_info) {
while (_jitc->data_info.ptr[data_offset].code < pc) {
- data_offset += 2;
- if (data_offset >= _jitc->data_info.length) {
+ if (++data_offset >= _jitc->data_info.length) {
data_info = 0;
goto again;
}
- [Guile-commits] 239/437: Avoid possible problem if built with gcc 4.8 or newer., (continued)
- [Guile-commits] 239/437: Avoid possible problem if built with gcc 4.8 or newer., Andy Wingo, 2018/07/02
- [Guile-commits] 347/437: S390: Add support for 32 bit., Andy Wingo, 2018/07/02
- [Guile-commits] 428/437: Further lightning integration work, Andy Wingo, 2018/07/02
- [Guile-commits] 420/437: Strip "get-jit-size" feature from lightning., Andy Wingo, 2018/07/02
- [Guile-commits] 434/437: Remove unused AM_CONDITIONAL statements from lightning configure, Andy Wingo, 2018/07/02
- [Guile-commits] 390/437: Correct make check for systems without gcc., Andy Wingo, 2018/07/02
- [Guile-commits] 388/437: sparc: Add initial jit_va_ calls to sparc, Andy Wingo, 2018/07/02
- [Guile-commits] 319/437: Properly handle jit_tramp and function descriptors, Andy Wingo, 2018/07/02
- [Guile-commits] 414/437: Always set t12 to address of called function, Andy Wingo, 2018/07/02
- [Guile-commits] 289/437: Remove the global but not advertised jit_progname variable, Andy Wingo, 2018/07/02
- [Guile-commits] 334/437: ARM: Correct several inconsistencies with ldrd and strd,
Andy Wingo <=
- [Guile-commits] 210/437: Correct all ldst test cases., Andy Wingo, 2018/07/02
- [Guile-commits] 252/437: GNU lightning 2.0.1 release, Andy Wingo, 2018/07/02
- [Guile-commits] 327/437: Force creation of the m4 directory on a clean checkout, Andy Wingo, 2018/07/02
- [Guile-commits] 314/437: Add back files missed when reapplying patches, Andy Wingo, 2018/07/02
- [Guile-commits] 354/437: Implement the jit_arg_register_p predicate., Andy Wingo, 2018/07/02
- [Guile-commits] 381/437: Remove wrong comment after cut and paste, Andy Wingo, 2018/07/02
- [Guile-commits] 209/437: Correct float division and LX with stop code generation., Andy Wingo, 2018/07/02
- [Guile-commits] 280/437: Implement the new jit_set_code interface., Andy Wingo, 2018/07/02
- [Guile-commits] 284/437: ARM: Do not emit a nop stack adjust instruction., Andy Wingo, 2018/07/02
- [Guile-commits] 345/437: PPC: Implement and use mcrxr emulation by default, Andy Wingo, 2018/07/02