lightning.git - Portable just-in-time compiler library

index : lightning.git
Portable just-in-time compiler library
summary refs log tree commit diff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/jit_arm-swf.c 36
-rw-r--r--lib/jit_arm.c 4
-rw-r--r--lib/jit_mips.c 140
-rw-r--r--lib/jit_ppc.c 16
4 files changed, 116 insertions, 80 deletions
diff --git a/lib/jit_arm-swf.c b/lib/jit_arm-swf.c
index ad0d12d..1315693 100644
--- a/lib/jit_arm-swf.c
+++ b/lib/jit_arm-swf.c
@@ -1740,25 +1740,25 @@ _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) + 8);
+ LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 4);
swf_bici(rn(reg), rn(reg), 0x80000000);
- STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8);
+ STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 4);
jit_unget_reg_pair(reg);
}
else {
reg = jit_get_reg(jit_class_gpr);
- swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
+ swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
swf_bici(rn(reg), rn(reg), 0x80000000);
if (jit_fpr_p(r0)) {
- swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
+ swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
if (r0 != r1) {
- swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
- swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
+ swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
+ swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
}
}
else {
movr(r0, rn(reg));
- swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
+ swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
movr(r0 + 1, rn(reg));
}
jit_unget_reg(reg);
@@ -1768,9 +1768,9 @@ _swf_absr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
reg = jit_get_reg(jit_class_gpr);
movr(rn(reg), r1);
swf_bici(rn(reg), rn(reg), 0x80000000);
- swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
- movr(rn(reg), r1 + 1);
swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
+ movr(rn(reg), r1 + 1);
+ swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
jit_unget_reg(reg);
}
else {
@@ -1812,25 +1812,25 @@ _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) + 8);
+ 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) + 8);
+ STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 4);
jit_unget_reg_pair(reg);
}
else {
reg = jit_get_reg(jit_class_gpr);
- swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
+ swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
xori(rn(reg), rn(reg), 0x80000000);
if (jit_fpr_p(r0)) {
- swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
+ swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
if (r0 != r1) {
- swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
- swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
+ swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
+ swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
}
}
else {
movr(r0, rn(reg));
- swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4);
+ swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8);
movr(r0 + 1, rn(reg));
}
jit_unget_reg(reg);
@@ -1840,9 +1840,9 @@ _swf_negr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
reg = jit_get_reg(jit_class_gpr);
movr(rn(reg), r1);
xori(rn(reg), rn(reg), 0x80000000);
- swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
- movr(rn(reg), r1 + 1);
swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4);
+ movr(rn(reg), r1 + 1);
+ swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8);
jit_unget_reg(reg);
}
else {
diff --git a/lib/jit_arm.c b/lib/jit_arm.c
index adafcb2..e4af92e 100644
--- a/lib/jit_arm.c
+++ b/lib/jit_arm.c
@@ -563,7 +563,7 @@ _jit_pushargi_f(jit_state_t *_jit, jit_float32_t u)
return;
}
}
- regno = jit_get_reg(jit_class_gpr);
+ regno = jit_get_reg(jit_class_fpr);
jit_movi_f(regno, u);
jit_stxi_f(_jit->function->call.size, JIT_SP, regno);
jit_unget_reg(regno);
@@ -624,7 +624,7 @@ _jit_pushargi_d(jit_state_t *_jit, jit_float64_t u)
}
if (_jit->function->call.size & 7)
_jit->function->call.size += 4;
- regno = jit_get_reg(jit_class_gpr);
+ regno = jit_get_reg(jit_class_fpr);
jit_movi_d(regno, u);
jit_stxi_d(_jit->function->call.size, JIT_SP, regno);
jit_unget_reg(regno);
diff --git a/lib/jit_mips.c b/lib/jit_mips.c
index 7b6f99d..bfca206 100644
--- a/lib/jit_mips.c
+++ b/lib/jit_mips.c
@@ -421,58 +421,69 @@ _jit_getarg_d(jit_state_t *_jit, jit_int32_t u, jit_int32_t v)
void
_jit_pushargr(jit_state_t *_jit, jit_int32_t u)
{
+ jit_word_t offset;
+
assert(_jit->function);
- if (_jit->function->call.argf) {
- _jit->function->call.argi = _jit->function->call.argf;
+ offset = _jit->function->call.size >> 2;
+ if (_jit->function->call.argf)
_jit->function->call.argf = 0;
- }
- if (_jit->function->call.argi < 4) {
- jit_movr(_A0 - _jit->function->call.argi, u);
- ++_jit->function->call.argi;
- }
+ if (offset < 4)
+ jit_movr(_A0 - offset, u);
else
jit_stxi(_jit->function->call.size, JIT_SP, u);
+ _jit->function->call.argi = offset + 1;
_jit->function->call.size += sizeof(jit_word_t);
}
void
_jit_pushargi(jit_state_t *_jit, jit_word_t u)
{
- jit_int32_t regno;
+ jit_int32_t regno;
+ jit_word_t offset;
assert(_jit->function);
- if (_jit->function->call.argf) {
- _jit->function->call.argi = _jit->function->call.argf;
+ offset = _jit->function->call.size >> 2;
+ if (_jit->function->call.argf)
_jit->function->call.argf = 0;
- }
- if (_jit->function->call.argi < 4) {
- jit_movi(_A0 - _jit->function->call.argi, u);
- ++_jit->function->call.argi;
- }
+ if (offset < 4)
+ jit_movi(_A0 - offset, u);
else {
regno = jit_get_reg(jit_class_gpr);
jit_movi(regno, u);
jit_stxi(_jit->function->call.size, JIT_SP, regno);
jit_unget_reg(regno);
}
+ _jit->function->call.argi = offset + 1;
_jit->function->call.size += sizeof(jit_word_t);
}
void
_jit_pushargr_f(jit_state_t *_jit, jit_int32_t u)
{
+ jit_word_t offset;
+
assert(_jit->function);
- if (_jit->function->call.argi) {
- jit_new_node_ww(jit_code_pushargr_f,
- _A0 - _jit->function->call.argi, u);
- _jit->function->call.argi += 2;
- }
- else if (_jit->function->call.argf < 4) {
- jit_movr_f(_F12 - (_jit->function->call.argf >> 1), u);
- _jit->function->call.argf += 2;
+ offset = _jit->function->call.size >> 2;
+ if (offset < 3) {
+ if (offset & 1) {
+ ++offset;
+ _jit->function->call.size += 4;
+ }
+ if (_jit->function->call.argi)
+ jit_new_node_ww(jit_code_pushargr_f, _A0 - offset, u);
+ else
+ jit_movr_f(_F12 - (offset >> 1), u);
}
else
jit_stxi_f(_jit->function->call.size, JIT_SP, u);
+ if (offset < 3) {
+ if (!_jit->function->call.argi)
+ _jit->function->call.argf = offset + 2;
+ else
+ _jit->function->call.argi = offset + 2;
+ }
+ else
+ _jit->function->call.argi = offset + 1;
_jit->function->call.size += sizeof(jit_float32_t);
}
@@ -480,17 +491,19 @@ void
_jit_pushargi_f(jit_state_t *_jit, jit_float32_t u)
{
jit_int32_t regno;
+ jit_word_t offset;
- if (_jit->function->call.argi) {
- if (_jit->function->call.argi & 1)
- ++_jit->function->call.argi;
- jit_new_node_wf(jit_code_pushargi_f,
- _A0 - _jit->function->call.argi, u);
- _jit->function->call.argi += 2;
- }
- else if (_jit->function->call.argf < 4) {
- jit_movi_f(_F12 - (_jit->function->call.argf >> 1), u);
- _jit->function->call.argf += 2;
+ assert(_jit->function);
+ offset = _jit->function->call.size >> 2;
+ if (offset < 3) {
+ if (offset & 1) {
+ ++offset;
+ _jit->function->call.size += 4;
+ }
+ if (_jit->function->call.argi)
+ jit_new_node_ww(jit_code_pushargi_f, _A0 - offset, u);
+ else
+ jit_movi_f(_F12 - (offset >> 1), u);
}
else {
assert(_jit->function);
@@ -499,26 +512,38 @@ _jit_pushargi_f(jit_state_t *_jit, jit_float32_t u)
jit_stxi_f(_jit->function->call.size, JIT_SP, regno);
jit_unget_reg(regno);
}
+ if (offset < 3) {
+ if (!_jit->function->call.argi)
+ _jit->function->call.argf = offset + 2;
+ else
+ _jit->function->call.argi = offset + 2;
+ }
+ else
+ _jit->function->call.argi = offset + 1;
_jit->function->call.size += sizeof(jit_float32_t);
}
void
_jit_pushargr_d(jit_state_t *_jit, jit_int32_t u)
{
+ jit_word_t offset;
+
assert(_jit->function);
- if (_jit->function->call.argi) {
- if (_jit->function->call.argi & 1)
- ++_jit->function->call.argi;
- jit_new_node_ww(jit_code_pushargr_d,
- _A0 - _jit->function->call.argi, u);
- _jit->function->call.argi += 2;
- }
- else if (_jit->function->call.argf < 4) {
- jit_movr_d(_F12 - (_jit->function->call.argf >> 1), u);
- _jit->function->call.argf += 2;
+ if (_jit->function->call.size & 7)
+ _jit->function->call.size += 4;
+ offset = _jit->function->call.size >> 2;
+ if (offset < 3) {
+ if (_jit->function->call.argi)
+ jit_new_node_ww(jit_code_pushargr_d, _A0 - offset, u);
+ else
+ jit_movr_d(_F12 - (offset >> 1), u);
}
else
jit_stxi_d(_jit->function->call.size, JIT_SP, u);
+ if (offset < 3 && !_jit->function->call.argi)
+ _jit->function->call.argf = offset + 2;
+ else
+ _jit->function->call.argi = offset + 2;
_jit->function->call.size += sizeof(jit_float64_t);
}
@@ -526,25 +551,28 @@ void
_jit_pushargi_d(jit_state_t *_jit, jit_float64_t u)
{
jit_int32_t regno;
+ jit_word_t offset;
- if (_jit->function->call.argi) {
- if (_jit->function->call.argi & 1)
- ++_jit->function->call.argi;
- jit_new_node_wd(jit_code_pushargi_d,
- _A0 - _jit->function->call.argi, u);
- _jit->function->call.argi += 2;
- }
- else if (_jit->function->call.argf < 4) {
- jit_movi_d(_F12 - (_jit->function->call.argf >> 1), u);
- _jit->function->call.argf += 2;
+ assert(_jit->function);
+ if (_jit->function->call.size & 7)
+ _jit->function->call.size += 4;
+ offset = _jit->function->call.size >> 2;
+ if (offset < 3) {
+ if (_jit->function->call.argi)
+ jit_new_node_ww(jit_code_pushargi_d, _A0 - offset, u);
+ else
+ jit_movi_d(_F12 - (offset >> 1), u);
}
else {
- assert(_jit->function);
regno = jit_get_reg(jit_class_fpr);
- jit_movi_f(regno, u);
- jit_stxi_f(_jit->function->call.size, JIT_SP, regno);
+ jit_movi_d(regno, u);
+ jit_stxi_d(_jit->function->call.size, JIT_SP, regno);
jit_unget_reg(regno);
}
+ if (offset < 3 && !_jit->function->call.argi)
+ _jit->function->call.argf = offset + 2;
+ else
+ _jit->function->call.argi = offset + 2;
_jit->function->call.size += sizeof(jit_float64_t);
}
diff --git a/lib/jit_ppc.c b/lib/jit_ppc.c
index 618adef..6e5da81 100644
--- a/lib/jit_ppc.c
+++ b/lib/jit_ppc.c
@@ -379,6 +379,8 @@ _jit_pushargr(jit_state_t *_jit, jit_int32_t u)
++_jit->function->call.argi;
}
else {
+ if (!_jit->function->call.size)
+ _jit->function->call.size = 56;
jit_stxi(_jit->function->call.size, JIT_SP, u);
_jit->function->call.size += sizeof(jit_word_t);
}
@@ -394,6 +396,8 @@ _jit_pushargi(jit_state_t *_jit, jit_word_t u)
++_jit->function->call.argi;
}
else {
+ if (!_jit->function->call.size)
+ _jit->function->call.size = 56;
regno = jit_get_reg(jit_class_gpr);
jit_movi(regno, u);
jit_stxi(_jit->function->call.size, JIT_SP, regno);
@@ -424,7 +428,7 @@ _jit_pushargr_d(jit_state_t *_jit, jit_int32_t u)
if (!(_jit->function->call.kind & jit_call_varargs))
return;
}
- if (_jit->function->call.argi < 6) {
+ if (_jit->function->call.argi < 8) {
jit_stxi_d(-8, JIT_FP, u);
jit_ldxi(JIT_RA0 - _jit->function->call.argi, JIT_FP, -8);
_jit->function->call.argi++;
@@ -432,8 +436,10 @@ _jit_pushargr_d(jit_state_t *_jit, jit_int32_t u)
_jit->function->call.argi++;
}
else {
+ if (!_jit->function->call.size)
+ _jit->function->call.size = 56;
jit_stxi_d(_jit->function->call.size, JIT_SP, u);
- _jit->function->call.size += (sizeof(jit_float64_t) + 8) & -8;
+ _jit->function->call.size += sizeof(jit_float64_t);
}
}
@@ -451,7 +457,7 @@ _jit_pushargi_d(jit_state_t *_jit, jit_float64_t u)
}
regno = jit_get_reg(jit_class_fpr);
jit_movi_d(regno, u);
- if (_jit->function->call.argi < 6) {
+ if (_jit->function->call.argi < 8) {
jit_stxi_d(-8, JIT_FP, regno);
jit_ldxi(JIT_RA0 - _jit->function->call.argi, JIT_FP, -8);
_jit->function->call.argi++;
@@ -459,8 +465,10 @@ _jit_pushargi_d(jit_state_t *_jit, jit_float64_t u)
_jit->function->call.argi++;
}
else {
+ if (!_jit->function->call.size)
+ _jit->function->call.size = 56;
jit_stxi_d(_jit->function->call.size, JIT_SP, regno);
- _jit->function->call.size += (sizeof(jit_float64_t) + 8) & -8;
+ _jit->function->call.size += sizeof(jit_float64_t);
}
jit_unget_reg(regno);
}
generated by cgit v1.2.3 (git 2.39.1) at 2025年09月25日 02:51:51 +0000

AltStyle によって変換されたページ (->オリジナル) /