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

ARM: Do not use ldrt/strt by default

* include/lightning/jit_arm.h, lib/jit_arm-cpu.c: Do not use
	by default load/store instructions that map to ldrt/strt.
	There is already the long displacement version for positive
	offsets, and when using a (shorter) negative offset it does
	not map to ldrt/strt. At least on qemu strt may cause
	reproducible, but unexpected SIGILL.
This commit is contained in:
pcpa 2013-10-08 12:26:52 -03:00
parent 72f3e65a6d
commit 2d4bac43a9
3 changed files with 23 additions and 8 deletions

View file

@ -1,3 +1,12 @@
2013-10-08 Paulo Andrade <pcpa@gnu.org>
* include/lightning/jit_arm.h, lib/jit_arm-cpu.c: Do not use
by default load/store instructions that map to ldrt/strt.
There is already the long displacement version for positive
offsets, and when using a (shorter) negative offset it does
not map to ldrt/strt. At least on qemu strt may cause
reproducible, but unexpected SIGILL.
2013-10-08 Paulo Andrade <pcpa@gnu.org> 2013-10-08 Paulo Andrade <pcpa@gnu.org>
* lib/jit_arm-vfp.c: Correct wrong load/store offset * lib/jit_arm-vfp.c: Correct wrong load/store offset

View file

@ -28,6 +28,7 @@
*/ */
#define jit_swf_p() (jit_cpu.vfp == 0) #define jit_swf_p() (jit_cpu.vfp == 0)
#define jit_hardfp_p() jit_cpu.abi #define jit_hardfp_p() jit_cpu.abi
#define jit_ldrt_strt_p() jit_cpu.ldrt_strt
#define JIT_FP _R11 #define JIT_FP _R11
typedef enum { typedef enum {
@ -115,6 +116,11 @@ typedef struct {
jit_uint32_t vfp : 3; jit_uint32_t vfp : 3;
jit_uint32_t neon : 1; jit_uint32_t neon : 1;
jit_uint32_t abi : 2; jit_uint32_t abi : 2;
/* use strt+offset instead of str.w?
* on special cases it causes a SIGILL at least on qemu, probably
* due to some memory ordering constraint not being respected, so,
* disable by default */
jit_uint32_t ldrt_strt : 1;
} jit_cpu_t; } jit_cpu_t;
typedef jit_int64_t jit_regset_t; typedef jit_int64_t jit_regset_t;

View file

@ -2953,7 +2953,7 @@ _ldxi_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{ {
jit_int32_t reg; jit_int32_t reg;
if (jit_thumb_p()) { if (jit_thumb_p()) {
if (i0 >= 0 && i0 <= 255) if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255)
T2_LDRSBI(r0, r1, i0); T2_LDRSBI(r0, r1, i0);
else if (i0 < 0 && i0 >= -255) else if (i0 < 0 && i0 >= -255)
T2_LDRSBIN(r0, r1, -i0); T2_LDRSBIN(r0, r1, -i0);
@ -3036,7 +3036,7 @@ _ldxi_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
if (jit_thumb_p()) { if (jit_thumb_p()) {
if ((r0|r1) < 8 && i0 >= 0 && i0 < 0x20) if ((r0|r1) < 8 && i0 >= 0 && i0 < 0x20)
T1_LDRBI(r0, r1, i0); T1_LDRBI(r0, r1, i0);
else if (i0 >= 0 && i0 <= 255) else if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255)
T2_LDRBI(r0, r1, i0); T2_LDRBI(r0, r1, i0);
else if (i0 < 0 && i0 >= -255) else if (i0 < 0 && i0 >= -255)
T2_LDRBIN(r0, r1, -i0); T2_LDRBIN(r0, r1, -i0);
@ -3117,7 +3117,7 @@ _ldxi_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{ {
jit_int32_t reg; jit_int32_t reg;
if (jit_thumb_p()) { if (jit_thumb_p()) {
if (i0 >= 0 && i0 <= 255) if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255)
T2_LDRSHI(r0, r1, i0); T2_LDRSHI(r0, r1, i0);
else if (i0 < 0 && i0 >= -255) else if (i0 < 0 && i0 >= -255)
T2_LDRSHIN(r0, r1, -i0); T2_LDRSHIN(r0, r1, -i0);
@ -3200,7 +3200,7 @@ _ldxi_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
if (jit_thumb_p()) { if (jit_thumb_p()) {
if ((r0|r1) < 8 && i0 >= 0 && !(i0 & 1) && (i0 >> 1) < 0x20) if ((r0|r1) < 8 && i0 >= 0 && !(i0 & 1) && (i0 >> 1) < 0x20)
T1_LDRHI(r0, r1, i0 >> 1); T1_LDRHI(r0, r1, i0 >> 1);
else if (i0 >= 0 && i0 <= 255) else if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255)
T2_LDRHI(r0, r1, i0); T2_LDRHI(r0, r1, i0);
else if (i0 < 0 && i0 >= -255) else if (i0 < 0 && i0 >= -255)
T2_LDRHIN(r0, r1, -i0); T2_LDRHIN(r0, r1, -i0);
@ -3286,7 +3286,7 @@ _ldxi_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
else if (r1 == _R13_REGNO && r0 < 8 && else if (r1 == _R13_REGNO && r0 < 8 &&
i0 >= 0 && !(i0 & 3) && (i0 >> 2) <= 255) i0 >= 0 && !(i0 & 3) && (i0 >> 2) <= 255)
T1_LDRISP(r0, i0 >> 2); T1_LDRISP(r0, i0 >> 2);
else if (i0 >= 0 && i0 <= 255) else if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255)
T2_LDRI(r0, r1, i0); T2_LDRI(r0, r1, i0);
else if (i0 < 0 && i0 > -255) else if (i0 < 0 && i0 > -255)
T2_LDRIN(r0, r1, -i0); T2_LDRIN(r0, r1, -i0);
@ -3369,7 +3369,7 @@ _stxi_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
if (jit_thumb_p()) { if (jit_thumb_p()) {
if ((r0|r1) < 8 && i0 >= 0 && i0 < 0x20) if ((r0|r1) < 8 && i0 >= 0 && i0 < 0x20)
T1_STRBI(r1, r0, i0); T1_STRBI(r1, r0, i0);
else if (i0 >= 0 && i0 <= 255) else if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255)
T2_STRBI(r1, r0, i0); T2_STRBI(r1, r0, i0);
else if (i0 < 0 && i0 >= -255) else if (i0 < 0 && i0 >= -255)
T2_STRBIN(r1, r0, -i0); T2_STRBIN(r1, r0, -i0);
@ -3441,7 +3441,7 @@ _stxi_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
if (jit_thumb_p()) { if (jit_thumb_p()) {
if ((r0|r1) < 8 && i0 >= 0 && !(i0 & 1) && (i0 >> 1) < 0x20) if ((r0|r1) < 8 && i0 >= 0 && !(i0 & 1) && (i0 >> 1) < 0x20)
T1_STRHI(r1, r0, i0 >> 1); T1_STRHI(r1, r0, i0 >> 1);
else if (i0 >= 0 && i0 <= 255) else if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255)
T2_STRHI(r1, r0, i0); T2_STRHI(r1, r0, i0);
else if (i0 < 0 && i0 >= -255) else if (i0 < 0 && i0 >= -255)
T2_STRHIN(r1, r0, -i0); T2_STRHIN(r1, r0, -i0);
@ -3516,7 +3516,7 @@ _stxi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
else if (r0 == _R13_REGNO && r1 < 8 && else if (r0 == _R13_REGNO && r1 < 8 &&
i0 >= 0 && !(i0 & 3) && (i0 >> 2) <= 255) i0 >= 0 && !(i0 & 3) && (i0 >> 2) <= 255)
T1_STRISP(r1, i0 >> 2); T1_STRISP(r1, i0 >> 2);
else if (i0 >= 0 && i0 <= 255) else if (jit_ldrt_strt_p() && i0 >= 0 && i0 <= 255)
T2_STRI(r1, r0, i0); T2_STRI(r1, r0, i0);
else if (i0 < 0 && i0 >= -255) else if (i0 < 0 && i0 >= -255)
T2_STRIN(r1, r0, -i0); T2_STRIN(r1, r0, -i0);