mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-12 06:41:13 +02:00
Correct regression with float arguments in arm hardp
* lib/jit_arm.c: Correct jit_pushargi_f in the arm hardfp abi. Most of the logic uses even numbered register numbers, so that a float and a double can be used in the same register, but the abi requires packing the float arguments, so jit_pushargi_f needs to allocate a temporary register to modify only the proper register argument (or be very smart to push two immediate arguments if applicable).
This commit is contained in:
parent
8f020fe044
commit
12c35b7e83
2 changed files with 25 additions and 9 deletions
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
|||
2013-02-11 Paulo Andrade <pcpa@gnu.org>
|
||||
|
||||
* lib/jit_arm.c: Correct jit_pushargi_f in the arm hardfp abi.
|
||||
Most of the logic uses even numbered register numbers, so that
|
||||
a float and a double can be used in the same register, but
|
||||
the abi requires packing the float arguments, so jit_pushargi_f
|
||||
needs to allocate a temporary register to modify only the
|
||||
proper register argument (or be very smart to push two
|
||||
immediate arguments if applicable).
|
||||
|
||||
2013-02-11 Paulo Andrade <pcpa@gnu.org>
|
||||
|
||||
* include/lightning.h, lib/lightning.c: Implement the new
|
||||
|
|
|
@ -386,21 +386,20 @@ _jit_arg_f(jit_state_t *_jit)
|
|||
|
||||
assert(_jit->function);
|
||||
if (jit_cpu.abi && !(_jit->function->self.call & jit_call_varargs)) {
|
||||
if (_jit->function->self.argf < 16)
|
||||
if (_jit->function->self.argf < 16) {
|
||||
offset = _jit->function->self.argf++;
|
||||
else {
|
||||
offset = _jit->function->self.size;
|
||||
_jit->function->self.size += sizeof(jit_word_t);
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (_jit->function->self.argi < 4)
|
||||
if (_jit->function->self.argi < 4) {
|
||||
offset = _jit->function->self.argi++;
|
||||
else {
|
||||
offset = _jit->function->self.size;
|
||||
_jit->function->self.size += sizeof(jit_float32_t);
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
offset = _jit->function->self.size;
|
||||
_jit->function->self.size += sizeof(jit_float32_t);
|
||||
done:
|
||||
return (jit_new_node_w(jit_code_arg_f, offset));
|
||||
}
|
||||
|
||||
|
@ -604,7 +603,14 @@ _jit_pushargi_f(jit_state_t *_jit, jit_float32_t u)
|
|||
assert(_jit->function);
|
||||
if (jit_cpu.abi && !(_jit->function->call.call & jit_call_varargs)) {
|
||||
if (_jit->function->call.argf < 16) {
|
||||
jit_movi_f(JIT_FA0 - _jit->function->call.argf, u);
|
||||
/* cannot jit_movi_f in the argument register because
|
||||
* float arguments are packed, and that would cause
|
||||
* either an assertion in debug mode, or overwritting
|
||||
* two registers */
|
||||
regno = jit_get_reg(jit_class_fpr);
|
||||
jit_movi_f(regno, u);
|
||||
jit_movr_f(JIT_FA0 - _jit->function->call.argf, regno);
|
||||
jit_unget_reg(regno);
|
||||
++_jit->function->call.argf;
|
||||
return;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue