mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-04 14:20:26 +02:00
ARM: Do not limit to 24 bit displacement jump to unknown address
* lib/jit_arm-cpu.c, lib/jit_arm.c: Only limit to 24 bit displacement non conditional jump in the same jit_state_t.
This commit is contained in:
parent
894a02412c
commit
6db38b75e9
3 changed files with 46 additions and 28 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2015-01-31 Paulo Andrade <pcpa@gnu.org>
|
||||||
|
|
||||||
|
* lib/jit_arm-cpu.c, lib/jit_arm.c: Only limit to 24 bit
|
||||||
|
displacement non conditional jump in the same jit_state_t.
|
||||||
|
|
||||||
2015-01-19 Paulo Andrade <pcpa@gnu.org>
|
2015-01-19 Paulo Andrade <pcpa@gnu.org>
|
||||||
|
|
||||||
* doc/body.texi: Reorder documentation, making jit_frame
|
* doc/body.texi: Reorder documentation, making jit_frame
|
||||||
|
|
|
@ -966,8 +966,8 @@ static void _nei(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
|
||||||
static void _jmpr(jit_state_t*,jit_int32_t);
|
static void _jmpr(jit_state_t*,jit_int32_t);
|
||||||
# define jmpi(i0) _jmpi(_jit,i0)
|
# define jmpi(i0) _jmpi(_jit,i0)
|
||||||
static void _jmpi(jit_state_t*,jit_word_t);
|
static void _jmpi(jit_state_t*,jit_word_t);
|
||||||
# define jmpi_p(i0) _jmpi_p(_jit,i0)
|
# define jmpi_p(i0, i1) _jmpi_p(_jit,i0, i1)
|
||||||
static jit_word_t _jmpi_p(jit_state_t*,jit_word_t);
|
static jit_word_t _jmpi_p(jit_state_t*,jit_word_t,jit_bool_t);
|
||||||
# define bccr(cc,i0,r0,r1) _bccr(_jit,cc,i0,r0,r1)
|
# define bccr(cc,i0,r0,r1) _bccr(_jit,cc,i0,r0,r1)
|
||||||
static jit_word_t _bccr(jit_state_t*,int,jit_word_t,jit_int32_t,jit_int32_t);
|
static jit_word_t _bccr(jit_state_t*,int,jit_word_t,jit_int32_t,jit_int32_t);
|
||||||
# define bcci(cc,i0,r0,i1) _bcci(_jit,cc,i0,r0,i1)
|
# define bcci(cc,i0,r0,i1) _bcci(_jit,cc,i0,r0,i1)
|
||||||
|
@ -2570,38 +2570,43 @@ _jmpi(jit_state_t *_jit, jit_word_t i0)
|
||||||
{
|
{
|
||||||
jit_word_t w;
|
jit_word_t w;
|
||||||
jit_word_t d;
|
jit_word_t d;
|
||||||
|
jit_int32_t reg;
|
||||||
w = _jit->pc.w;
|
w = _jit->pc.w;
|
||||||
/* if thumb and in thumb mode */
|
/* if thumb and in thumb mode */
|
||||||
if (jit_thumb_p() && _jitc->thumb) {
|
if (jit_thumb_p() && _jitc->thumb) {
|
||||||
d = ((i0 - w) >> 1) - 2;
|
d = ((i0 - w) >> 1) - 2;
|
||||||
if (d >= -1024 && d <= 1023)
|
if (d >= -1024 && d <= 1023)
|
||||||
T1_B(d & 0x7ff);
|
T1_B(d & 0x7ff);
|
||||||
else {
|
else if (_s24P(d))
|
||||||
assert(_s24P(d));
|
|
||||||
T2_B(encode_thumb_jump(d));
|
T2_B(encode_thumb_jump(d));
|
||||||
|
else {
|
||||||
|
reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
|
||||||
|
movi(rn(reg), i0);
|
||||||
|
jmpr(rn(reg));
|
||||||
|
jit_unget_reg(reg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
d = ((i0 - w) >> 2) - 2;
|
d = ((i0 - w) >> 2) - 2;
|
||||||
assert(_s24P(d));
|
if (_s24P(d))
|
||||||
B(d & 0x00ffffff);
|
B(d & 0x00ffffff);
|
||||||
|
else {
|
||||||
|
reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
|
||||||
|
movi(rn(reg), i0);
|
||||||
|
jmpr(rn(reg));
|
||||||
|
jit_unget_reg(reg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static jit_word_t
|
static jit_word_t
|
||||||
_jmpi_p(jit_state_t *_jit, jit_word_t i0)
|
_jmpi_p(jit_state_t *_jit, jit_word_t i0, jit_bool_t i1)
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
jit_word_t w;
|
|
||||||
jit_int32_t reg;
|
|
||||||
reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
|
|
||||||
w = movi_p(rn(reg), i0);
|
|
||||||
jmpr(rn(reg));
|
|
||||||
jit_unget_reg(reg);
|
|
||||||
return (w);
|
|
||||||
#else
|
|
||||||
jit_word_t w;
|
jit_word_t w;
|
||||||
jit_word_t d;
|
jit_word_t d;
|
||||||
|
jit_int32_t reg;
|
||||||
|
if (i1) {
|
||||||
|
/* Assume jump is not longer than 23 bits if inside jit */
|
||||||
w = _jit->pc.w;
|
w = _jit->pc.w;
|
||||||
/* if thumb and in thumb mode */
|
/* if thumb and in thumb mode */
|
||||||
if (jit_thumb_p() && _jitc->thumb) {
|
if (jit_thumb_p() && _jitc->thumb) {
|
||||||
|
@ -2614,8 +2619,14 @@ _jmpi_p(jit_state_t *_jit, jit_word_t i0)
|
||||||
assert(_s24P(d));
|
assert(_s24P(d));
|
||||||
B(d & 0x00ffffff);
|
B(d & 0x00ffffff);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
|
||||||
|
w = movi_p(rn(reg), i0);
|
||||||
|
jmpr(rn(reg));
|
||||||
|
jit_unget_reg(reg);
|
||||||
|
}
|
||||||
return (w);
|
return (w);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static jit_word_t
|
static jit_word_t
|
||||||
|
|
|
@ -1555,7 +1555,8 @@ _emit_code(jit_state_t *_jit)
|
||||||
if (temp->flag & jit_flag_patch)
|
if (temp->flag & jit_flag_patch)
|
||||||
jmpi(temp->u.w);
|
jmpi(temp->u.w);
|
||||||
else {
|
else {
|
||||||
word = jmpi_p(_jit->pc.w);
|
word = jmpi_p(_jit->pc.w,
|
||||||
|
!!(node->flag & jit_flag_node));
|
||||||
patch(word, node);
|
patch(word, node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2002,7 +2003,8 @@ _patch(jit_state_t *_jit, jit_word_t instr, jit_node_t *node)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
flag = node->u.n->flag;
|
flag = node->u.n->flag;
|
||||||
if (node->code == jit_code_calli)
|
if (node->code == jit_code_calli ||
|
||||||
|
(node->code == jit_code_jmpi && !(node->flag & jit_flag_node)))
|
||||||
kind = arm_patch_word;
|
kind = arm_patch_word;
|
||||||
else
|
else
|
||||||
kind = arm_patch_jump;
|
kind = arm_patch_jump;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue