1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-06 12:10:28 +02:00

ARM: Correct wrong offset for load/store of floats.

* lib/jit_arm-vfp.c: Correct wrong load/store offset
	calculation when the displacement is constant but too
	large to use an instruction with an immediate offset.
This commit is contained in:
pcpa 2013-10-08 01:20:19 -03:00
parent 0e94048174
commit 72f3e65a6d
2 changed files with 22 additions and 24 deletions

View file

@ -1,3 +1,9 @@
2013-10-08 Paulo Andrade <pcpa@gnu.org>
* lib/jit_arm-vfp.c: Correct wrong load/store offset
calculation when the displacement is constant but too
large to use an instruction with an immediate offset.
2013-10-07 Paulo Andrade <pcpa@gnu.org> 2013-10-07 Paulo Andrade <pcpa@gnu.org>
* check/self.c: Extend tests to validate jit_callee_save_p * check/self.c: Extend tests to validate jit_callee_save_p

View file

@ -2096,9 +2096,8 @@ _vfp_ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
if (jit_fpr_p(r0)) { if (jit_fpr_p(r0)) {
if (i0 >= 0) { if (i0 >= 0) {
assert(!(i0 & 3)); assert(!(i0 & 3));
i0 >>= 2; if (i0 < 1024)
if (i0 < 256) VLDR_F32(r0, r1, i0 >> 2);
VLDR_F32(r0, r1, i0);
else { else {
reg = jit_get_reg(jit_class_gpr); reg = jit_get_reg(jit_class_gpr);
addi(rn(reg), r1, i0); addi(rn(reg), r1, i0);
@ -2109,9 +2108,8 @@ _vfp_ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
else { else {
i0 = -i0; i0 = -i0;
assert(!(i0 & 3)); assert(!(i0 & 3));
i0 >>= 2; if (i0 < 1024)
if (i0 < 256) VLDRN_F32(r0, r1, i0 >> 2);
VLDRN_F32(r0, r1, i0);
else { else {
reg = jit_get_reg(jit_class_gpr); reg = jit_get_reg(jit_class_gpr);
subi(rn(reg), r1, i0); subi(rn(reg), r1, i0);
@ -2131,9 +2129,8 @@ _vfp_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
if (jit_fpr_p(r0)) { if (jit_fpr_p(r0)) {
if (i0 >= 0) { if (i0 >= 0) {
assert(!(i0 & 3)); assert(!(i0 & 3));
i0 >>= 2; if (i0 < 1024)
if (i0 < 256) VLDR_F64(r0, r1, i0 >> 2);
VLDR_F64(r0, r1, i0);
else { else {
reg = jit_get_reg(jit_class_gpr); reg = jit_get_reg(jit_class_gpr);
addi(rn(reg), r1, i0); addi(rn(reg), r1, i0);
@ -2144,9 +2141,8 @@ _vfp_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
else { else {
i0 = -i0; i0 = -i0;
assert(!(i0 & 3)); assert(!(i0 & 3));
i0 >>= 2; if (i0 < 1024)
if (i0 < 256) VLDRN_F64(r0, r1, i0 >> 2);
VLDRN_F64(r0, r1, i0);
else { else {
reg = jit_get_reg(jit_class_gpr); reg = jit_get_reg(jit_class_gpr);
subi(rn(reg), r1, i0); subi(rn(reg), r1, i0);
@ -2229,9 +2225,8 @@ _vfp_stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
if (jit_fpr_p(r1)) { if (jit_fpr_p(r1)) {
if (i0 >= 0) { if (i0 >= 0) {
assert(!(i0 & 3)); assert(!(i0 & 3));
i0 >>= 2; if (i0 < 1024)
if (i0 < 256) VSTR_F32(r1, r0, i0 >> 2);
VSTR_F32(r1, r0, i0);
else { else {
reg = jit_get_reg(jit_class_gpr); reg = jit_get_reg(jit_class_gpr);
addi(rn(reg), r0, i0); addi(rn(reg), r0, i0);
@ -2242,9 +2237,8 @@ _vfp_stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
else { else {
i0 = -i0; i0 = -i0;
assert(!(i0 & 3)); assert(!(i0 & 3));
i0 >>= 2; if (i0 < 1024)
if (i0 < 256) VSTRN_F32(r1, r0, i0 >> 2);
VSTRN_F32(r1, r0, i0);
else { else {
reg = jit_get_reg(jit_class_gpr); reg = jit_get_reg(jit_class_gpr);
subi(rn(reg), r0, i0); subi(rn(reg), r0, i0);
@ -2264,9 +2258,8 @@ _vfp_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
if (jit_fpr_p(r1)) { if (jit_fpr_p(r1)) {
if (i0 >= 0) { if (i0 >= 0) {
assert(!(i0 & 3)); assert(!(i0 & 3));
i0 >>= 2; if (i0 < 0124)
if (i0 < 256) VSTR_F64(r1, r0, i0 >> 2);
VSTR_F64(r1, r0, i0);
else { else {
reg = jit_get_reg(jit_class_gpr); reg = jit_get_reg(jit_class_gpr);
addi(rn(reg), r0, i0); addi(rn(reg), r0, i0);
@ -2277,9 +2270,8 @@ _vfp_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
else { else {
i0 = -i0; i0 = -i0;
assert(!(i0 & 3)); assert(!(i0 & 3));
i0 >>= 2; if (i0 < 1024)
if (i0 < 256) VSTRN_F64(r1, r0, i0 >> 2);
VSTRN_F64(r1, r0, i0);
else { else {
reg = jit_get_reg(jit_class_gpr); reg = jit_get_reg(jit_class_gpr);
subi(rn(reg), r0, i0); subi(rn(reg), r0, i0);