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/jit_x86-x87.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/jit_x86-x87.c')
-rw-r--r--lib/jit_x86-x87.c 48
1 files changed, 48 insertions, 0 deletions
diff --git a/lib/jit_x86-x87.c b/lib/jit_x86-x87.c
index 75bde5c..5b45c26 100644
--- a/lib/jit_x86-x87.c
+++ b/lib/jit_x86-x87.c
@@ -887,8 +887,15 @@ _x87_ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
static void
_x87_ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
+#if __X64_32
+ jit_int32_t reg;
+ reg = jit_get_reg(jit_class_gpr);
+ addr(rn(reg), r1, r2);
+ x87_ldr_f(r0, rn(reg));
+#else
fldsm(0, r1, r2, _SCL1);
fstpr(r0 + 1);
+#endif
}
static void
@@ -901,8 +908,13 @@ _x87_ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
}
else {
reg = jit_get_reg(jit_class_gpr);
+#if __X64_32
+ addi(rn(reg), r1, i0);
+ x87_ldr_f(r0, rn(reg));
+#else
movi(rn(reg), i0);
x87_ldxr_f(r0, r1, rn(reg));
+#endif
jit_unget_reg(reg);
}
}
@@ -941,6 +953,12 @@ _x87_sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
static void
_x87_stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
+#if __X64_32
+ jit_int32_t reg;
+ reg = jit_get_reg(jit_class_gpr);
+ addr(rn(reg), r0, r1);
+ x87_str_f(rn(reg), r2);
+#else
if (r2 == _ST0_REGNO)
fstsm(0, r0, r1, _SCL1);
else {
@@ -948,6 +966,7 @@ _x87_stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
fstsm(0, r0, r1, _SCL1);
fxchr(r2);
}
+#endif
}
static void
@@ -956,8 +975,13 @@ _x87_stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
jit_int32_t reg;
if (!can_sign_extend_int_p(i0)) {
reg = jit_get_reg(jit_class_gpr);
+#if __X64_32
+ addi(rn(reg), r0, i0);
+ x87_str_f(rn(reg), r1);
+#else
movi(rn(reg), i0);
x87_stxr_f(rn(reg), r0, r1);
+#endif
jit_unget_reg(reg);
}
else if (r1 == _ST0_REGNO)
@@ -1144,8 +1168,15 @@ _x87_ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
static void
_x87_ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
+#if __X64_32
+ jit_int32_t reg;
+ reg = jit_get_reg(jit_class_gpr);
+ addr(rn(reg), r1, r2);
+ x87_ldr_d(r0, rn(reg));
+#else
fldlm(0, r1, r2, _SCL1);
fstpr(r0 + 1);
+#endif
}
static void
@@ -1158,8 +1189,13 @@ _x87_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
}
else {
reg = jit_get_reg(jit_class_gpr);
+#if __X64_32
+ addi(rn(reg), r1, i0);
+ x87_ldr_d(r0, rn(reg));
+#else
movi(rn(reg), i0);
x87_ldxr_d(r0, r1, rn(reg));
+#endif
jit_unget_reg(reg);
}
}
@@ -1198,6 +1234,12 @@ _x87_sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
static void
_x87_stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
+#if __X64_32
+ jit_int32_t reg;
+ reg = jit_get_reg(jit_class_gpr);
+ addr(rn(reg), r0, r1);
+ x87_str_d(rn(reg), r2);
+#else
if (r2 == _ST0_REGNO)
fstlm(0, r0, r1, _SCL1);
else {
@@ -1205,6 +1247,7 @@ _x87_stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
fstlm(0, r0, r1, _SCL1);
fxchr(r2);
}
+#endif
}
static void
@@ -1213,8 +1256,13 @@ _x87_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
jit_int32_t reg;
if (!can_sign_extend_int_p(i0)) {
reg = jit_get_reg(jit_class_gpr);
+#if __X64_32
+ addi(rn(reg), r0, i0);
+ x87_str_d(rn(reg), r1);
+#else
movi(rn(reg), i0);
x87_stxr_d(rn(reg), r0, r1);
+#endif
jit_unget_reg(reg);
}
else if (r1 == _ST0_REGNO)
generated by cgit v1.2.3 (git 2.46.0) at 2025年10月02日 02:03:10 +0000

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