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

index : lightning.git
Portable just-in-time compiler library
summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat
-rw-r--r--lib/jit_aarch64-cpu.c 1
-rw-r--r--lib/jit_aarch64-fpu.c 319
-rw-r--r--lib/jit_aarch64-sz.c 186
3 files changed, 413 insertions, 93 deletions
diff --git a/lib/jit_aarch64-cpu.c b/lib/jit_aarch64-cpu.c
index 267c34e..6a5805f 100644
--- a/lib/jit_aarch64-cpu.c
+++ b/lib/jit_aarch64-cpu.c
@@ -211,6 +211,7 @@ typedef union {
# undef ui
} instr_t;
# define s9_p(d) ((d) >= -256 && (d) <= 255)
+# define u12_p(d) ((d) >= 0 && (d) <= 4095)
# define s26_p(d) ((d) >= -33554432 && (d) <= 33554431)
# define ii(i) *_jit->pc.ui++ = i
# define ldr(r0,r1) ldr_l(r0,r1)
diff --git a/lib/jit_aarch64-fpu.c b/lib/jit_aarch64-fpu.c
index 93481de..9e8c9ca 100644
--- a/lib/jit_aarch64-fpu.c
+++ b/lib/jit_aarch64-fpu.c
@@ -41,6 +41,61 @@
# define A64_FDIV 0x1e201800
# define A64_FADD 0x1e202800
# define A64_FSUB 0x1e203800
+# define A64_FLDSTR 0x3c206800
+# define A64_FLDSTU 0x3d000000
+# define A64_FLDST 0x3c000000
+# define A64_FLDST_A 0x3c000400
+# define A64_FLDST_B 0x3c000c00
+# define FLDRB(Rt,Rn,Rm) vldstr(0,A64_FLDSTR,1,Rm,Rn,Rt)
+# define FLDRH(Rt,Rn,Rm) vldstr(1,A64_FLDSTR,1,Rm,Rn,Rt)
+# define FLDRS(Rt,Rn,Rm) vldstr(2,A64_FLDSTR,1,Rm,Rn,Rt)
+# define FLDRD(Rt,Rn,Rm) vldstr(3,A64_FLDSTR,1,Rm,Rn,Rt)
+# define FLDRQ(Rt,Rn,Rm) vldstr(0,A64_FLDSTR,3,Rm,Rn,Rt)
+# define FSTRB(Rt,Rn,Rm) vldstr(0,A64_FLDSTR,0,Rm,Rn,Rt)
+# define FSTRH(Rt,Rn,Rm) vldstr(1,A64_FLDSTR,0,Rm,Rn,Rt)
+# define FSTRS(Rt,Rn,Rm) vldstr(2,A64_FLDSTR,0,Rm,Rn,Rt)
+# define FSTRD(Rt,Rn,Rm) vldstr(3,A64_FLDSTR,0,Rm,Rn,Rt)
+# define FSTRQ(Rt,Rn,Rm) vldstr(0,A64_FLDSTR,2,Rm,Rn,Rt)
+# define FLDRBI(Rt,Rn,Imm9) vldst(0,A64_FLDST,1,Imm9,Rn,Rt)
+# define FLDRHI(Rt,Rn,Imm9) vldst(1,A64_FLDST,1,Imm9,Rn,Rt)
+# define FLDRSI(Rt,Rn,Imm9) vldst(2,A64_FLDST,1,Imm9,Rn,Rt)
+# define FLDRDI(Rt,Rn,Imm9) vldst(3,A64_FLDST,1,Imm9,Rn,Rt)
+# define FLDRQI(Rt,Rn,Imm9) vldst(0,A64_FLDST,3,Imm9,Rn,Rt)
+# define FLDRB_B(Rt,Rn,Imm9) vldst(0,A64_FLDST_B,1,Imm9,Rn,Rt)
+# define FLDRH_B(Rt,Rn,Imm9) vldst(1,A64_FLDST_B,1,Imm9,Rn,Rt)
+# define FLDRS_B(Rt,Rn,Imm9) vldst(2,A64_FLDST_B,1,Imm9,Rn,Rt)
+# define FLDRD_B(Rt,Rn,Imm9) vldst(3,A64_FLDST_B,1,Imm9,Rn,Rt)
+# define FLDRQ_B(Rt,Rn,Imm9) vldst(0,A64_FLDST_B,3,Imm9,Rn,Rt)
+# define FLDRB_A(Rt,Rn,Imm9) vldst(0,A64_FLDST_A,1,Imm9,Rn,Rt)
+# define FLDRH_A(Rt,Rn,Imm9) vldst(1,A64_FLDST_A,1,Imm9,Rn,Rt)
+# define FLDRS_A(Rt,Rn,Imm9) vldst(2,A64_FLDST_A,1,Imm9,Rn,Rt)
+# define FLDRD_A(Rt,Rn,Imm9) vldst(3,A64_FLDST_A,1,Imm9,Rn,Rt)
+# define FLDRQ_A(Rt,Rn,Imm9) vldst(0,A64_FLDST_A,3,Imm9,Rn,Rt)
+# define FSTRBI(Rt,Rn,Imm9) vldst(0,A64_FLDST,0,Imm9,Rn,Rt)
+# define FSTRHI(Rt,Rn,Imm9) vldst(1,A64_FLDST,0,Imm9,Rn,Rt)
+# define FSTRSI(Rt,Rn,Imm9) vldst(2,A64_FLDST,0,Imm9,Rn,Rt)
+# define FSTRDI(Rt,Rn,Imm9) vldst(3,A64_FLDST,0,Imm9,Rn,Rt)
+# define FSTRQI(Rt,Rn,Imm9) vldst(0,A64_FLDST,2,Imm9,Rn,Rt)
+# define FSTRB_B(Rt,Rn,Imm9) vldst(0,A64_FLDST_B,0,Imm9,Rn,Rt)
+# define FSTRH_B(Rt,Rn,Imm9) vldst(1,A64_FLDST_B,0,Imm9,Rn,Rt)
+# define FSTRS_B(Rt,Rn,Imm9) vldst(2,A64_FLDST_B,0,Imm9,Rn,Rt)
+# define FSTRD_B(Rt,Rn,Imm9) vldst(3,A64_FLDST_B,0,Imm9,Rn,Rt)
+# define FSTRQ_B(Rt,Rn,Imm9) vldst(0,A64_FLDST_B,2,Imm9,Rn,Rt)
+# define FSTRB_A(Rt,Rn,Imm9) vldst(0,A64_FLDST_A,0,Imm9,Rn,Rt)
+# define FSTRH_A(Rt,Rn,Imm9) vldst(1,A64_FLDST_A,0,Imm9,Rn,Rt)
+# define FSTRS_A(Rt,Rn,Imm9) vldst(2,A64_FLDST_A,0,Imm9,Rn,Rt)
+# define FSTRD_A(Rt,Rn,Imm9) vldst(3,A64_FLDST_A,0,Imm9,Rn,Rt)
+# define FSTRQ_A(Rt,Rn,Imm9) vldst(0,A64_FLDST_A,2,Imm9,Rn,Rt)
+# define FLDRBU(Rt,Rn,Imm12) vldstu(0,A64_FLDSTU,1,Imm12,Rn,Rt)
+# define FLDRHU(Rt,Rn,Imm12) vldstu(1,A64_FLDSTU,1,Imm12,Rn,Rt)
+# define FLDRSU(Rt,Rn,Imm12) vldstu(2,A64_FLDSTU,1,Imm12,Rn,Rt)
+# define FLDRDU(Rt,Rn,Imm12) vldstu(3,A64_FLDSTU,1,Imm12,Rn,Rt)
+# define FLDRQU(Rt,Rn,Imm12) vldstu(0,A64_FLDSTU,3,Imm12,Rn,Rt)
+# define FSTRBU(Rt,Rn,Imm12) vldstu(0,A64_FLDSTU,0,Imm12,Rn,Rt)
+# define FSTRHU(Rt,Rn,Imm12) vldstu(1,A64_FLDSTU,0,Imm12,Rn,Rt)
+# define FSTRSU(Rt,Rn,Imm12) vldstu(2,A64_FLDSTU,0,Imm12,Rn,Rt)
+# define FSTRDU(Rt,Rn,Imm12) vldstu(3,A64_FLDSTU,0,Imm12,Rn,Rt)
+# define FSTRQU(Rt,Rn,Imm12) vldstu(0,A64_FLDSTU,2,Imm12,Rn,Rt)
# define CNT(Rd,Rn) vqo_vv(0,A64_CNT,Rn,Rd)
# define ADDV(Rd,Rn) vqo_vv(0,A64_ADDV,Rn,Rd)
# define FCMPES(Rn,Rm) os_vv(A64_FCMPE,0,Rn,Rm)
@@ -101,6 +156,15 @@ static void _os_vv(jit_state_t*,jit_int32_t,
# define vqo_vv(Q,Op,Rn,Rd) _vqo_vv(_jit,Q,Op,Rn,Rd)
static void _vqo_vv(jit_state_t*,jit_int32_t,
jit_int32_t,jit_int32_t,jit_int32_t);
+# define vldstr(size,Op,opc,Rm,Rn,Rt) _vldstr(_jit,size,Op,opc,Rm,Rn,Rt)
+static void _vldstr(jit_state_t*,jit_int32_t,jit_int32_t,
+ jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
+# define vldst(size,Op,opc,Imm9,Rn,Rt) _vldst(_jit,size,Op,opc,Imm9,Rn,Rt)
+static void _vldst(jit_state_t*,jit_int32_t,jit_int32_t,
+ jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
+# define vldstu(size,Op,opc,Imm12,Rn,Rt) _vldstu(_jit,size,Op,opc,Imm12,Rn,Rt)
+static void _vldstu(jit_state_t*,jit_int32_t,jit_int32_t,
+ jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
# define popcntr(r0,r1) _popcntr(_jit,r0,r1);
static void _popcntr(jit_state_t*,jit_int32_t,jit_int32_t);
# define truncr_f_i(r0,r1) _truncr_f_i(_jit,r0,r1)
@@ -474,6 +538,69 @@ _vqo_vv(jit_state_t *_jit, jit_int32_t Q,
ii(i.w);
}
+static void
+_vldstr(jit_state_t *_jit, jit_int32_t ldst_size,
+ jit_int32_t Op, jit_int32_t opc, jit_int32_t Rm,
+ jit_int32_t Rn, jit_int32_t Rt)
+{
+ instr_t i;
+ assert(!(Rm & ~0x1f));
+ assert(!(Rn & ~0x1f));
+ assert(!(Rt & ~0x1f));
+ assert(!(opc & ~0x3));
+ assert(!(ldst_size & ~0x3));
+ assert(!(Op & ~0x3f20fc00));
+ i.w = Op;
+ i.ldst_size.b = ldst_size;
+ i.opc.b = opc;
+ i.Rm.b = Rm;
+ i.Rn.b = Rn;
+ i.Rt.b = Rt;
+ ii(i.w);
+}
+
+static void
+_vldst(jit_state_t *_jit, jit_int32_t ldst_size,
+ jit_int32_t Op, jit_int32_t opc, jit_int32_t Imm9,
+ jit_int32_t Rn, jit_int32_t Rt)
+{
+ instr_t i;
+ assert(!(Rn & ~0x1f));
+ assert(!(Rt & ~0x1f));
+ assert(!(opc & ~0x3));
+ assert(s9_p(Imm9));
+ assert(!(ldst_size & ~0x3));
+ assert(!(Op & ~0x3f200c00));
+ i.w = Op;
+ i.ldst_size.b = ldst_size;
+ i.opc.b = opc;
+ i.imm9.b = Imm9;
+ i.Rn.b = Rn;
+ i.Rt.b = Rt;
+ ii(i.w);
+}
+
+static void
+_vldstu(jit_state_t *_jit, jit_int32_t ldst_size,
+ jit_int32_t Op, jit_int32_t opc, jit_int32_t Imm12,
+ jit_int32_t Rn, jit_int32_t Rt)
+{
+ instr_t i;
+ assert(!(Rn & ~0x1f));
+ assert(!(Rt & ~0x1f));
+ assert(!(opc & ~0x3));
+ assert(u12_p(Imm12));
+ assert(!(ldst_size & ~0x3));
+ assert(!(Op & ~0x3f000000));
+ i.w = Op;
+ i.ldst_size.b = ldst_size;
+ i.opc.b = opc;
+ i.imm12.b = Imm12;
+ i.Rn.b = Rn;
+ i.Rt.b = Rt;
+ ii(i.w);
+}
+
#define fopi(name) \
static void \
_##name##i_f(jit_state_t *_jit, \
@@ -556,11 +683,15 @@ fopi(div)
static void
_ldr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
+#if 1
+ FLDRSU(r0, r1, 0);
+#else
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
ldr_i(rn(reg), r1);
FMOVSW(r0, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
@@ -568,59 +699,107 @@ _ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
+#if 1
+ movi(rn(reg), i0);
+ ldr_f(r0, rn(reg));
+#else
ldi_i(rn(reg), i0);
FMOVSW(r0, rn(reg));
+#endif
jit_unget_reg(reg);
}
static void
_ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
+#if 1
+ FLDRS(r0, r1, r2);
+#else
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
ldxr_i(rn(reg), r1, r2);
FMOVSW(r0, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
_ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
+#if 1
+ if (s9_p(i0))
+ FLDRSI(r0, r1, i0);
+ else if (u12_p(i0))
+ FLDRSU(r0, r1, i0);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ ldxr_f(r0, r1, rn(reg));
+ jit_unget_reg(reg);
+ }
+#else
reg = jit_get_reg(jit_class_gpr);
ldxi_i(rn(reg), r1, i0);
FMOVSW(r0, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
_ldxbi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
+#if 1
+ if (s9_p(i0))
+ FLDRS_B(r0, r1, i0);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ ldxbr_f(r0, r1, rn(reg));
+ jit_unget_reg(reg);
+ }
+#else
reg = jit_get_reg(jit_class_gpr);
ldxbi_i(rn(reg), r1, i0);
FMOVSW(r0, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
_ldxai_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
+#if 1
+ if (s9_p(i0))
+ FLDRS_A(r0, r1, i0);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ ldxar_f(r0, r1, rn(reg));
+ jit_unget_reg(reg);
+ }
+#else
reg = jit_get_reg(jit_class_gpr);
ldxai_i(rn(reg), r1, i0);
FMOVSW(r0, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
_str_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
+#if 1
+ FSTRSU(r1, r0, 0);
+#else
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
FMOVWS(rn(reg), r1);
str_i(r0, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
@@ -628,49 +807,93 @@ _sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
{
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
+#if 1
+ movi(rn(reg), i0);
+ str_f(rn(reg), r0);
+#else
FMOVWS(rn(reg), r0);
sti_i(i0, rn(reg));
+#endif
jit_unget_reg(reg);
}
static void
_stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
+#if 1
+ FSTRS(r2, r1, r0);
+#else
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
FMOVWS(rn(reg), r2);
stxr_i(r0, r1, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
_stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
{
jit_int32_t reg;
+#if 1
+ if (s9_p(i0))
+ FSTRSI(r1, r0, i0);
+ else if (u12_p(i0))
+ FSTRSU(r1, r0, i0);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ stxr_f(rn(reg), r0, r1);
+ jit_unget_reg(reg);
+ }
+#else
reg = jit_get_reg(jit_class_gpr);
FMOVWS(rn(reg), r1);
stxi_i(i0, r0, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
_stxbi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
{
jit_int32_t reg;
+#if 1
+ if (s9_p(i0))
+ FSTRS_B(r1, r0, i0);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ stxbr_f(rn(reg), r0, r1);
+ jit_unget_reg(reg);
+ }
+#else
reg = jit_get_reg(jit_class_gpr);
FMOVWS(rn(reg), r1);
stxbi_i(i0, r0, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
_stxai_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
{
jit_int32_t reg;
+#if 1
+ if (s9_p(i0))
+ FSTRS_A(r1, r0, i0);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ stxar_f(rn(reg), r0, r1);
+ jit_unget_reg(reg);
+ }
+#else
reg = jit_get_reg(jit_class_gpr);
FMOVWS(rn(reg), r1);
stxai_i(i0, r0, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
@@ -823,11 +1046,15 @@ dopi(div)
static void
_ldr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
+#if 1
+ FLDRDU(r0, r1, 0);
+#else
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
ldr_l(rn(reg), r1);
FMOVDX(r0, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
@@ -835,59 +1062,107 @@ _ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
+#if 1
+ movi(rn(reg), i0);
+ ldr_d(r0, rn(reg));
+#else
ldi_l(rn(reg), i0);
FMOVDX(r0, rn(reg));
+#endif
jit_unget_reg(reg);
}
static void
_ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
+#if 1
+ FLDRD(r0, r1, r2);
+#else
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
ldxr_l(rn(reg), r1, r2);
FMOVDX(r0, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
+#if 1
+ if (s9_p(i0))
+ FLDRDI(r0, r1, i0);
+ else if (u12_p(i0))
+ FLDRDU(r0, r1, i0);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ ldxr_d(r0, r1, rn(reg));
+ jit_unget_reg(reg);
+ }
+#else
reg = jit_get_reg(jit_class_gpr);
ldxi_l(rn(reg), r1, i0);
FMOVDX(r0, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
_ldxbi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
+#if 1
+ if (s9_p(i0))
+ FLDRD_B(r0, r1, i0);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ ldxbr_d(r0, r1, rn(reg));
+ jit_unget_reg(reg);
+ }
+#else
reg = jit_get_reg(jit_class_gpr);
ldxbi_l(rn(reg), r1, i0);
FMOVDX(r0, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
_ldxai_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
+#if 1
+ if (s9_p(i0))
+ FLDRD_A(r0, r1, i0);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ ldxar_d(r0, r1, rn(reg));
+ jit_unget_reg(reg);
+ }
+#else
reg = jit_get_reg(jit_class_gpr);
ldxai_l(rn(reg), r1, i0);
FMOVDX(r0, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
_str_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
+#if 1
+ FSTRDU(r1, r0, 0);
+#else
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
FMOVXD(rn(reg), r1);
str_l(r0, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
@@ -895,49 +1170,93 @@ _sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
{
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
+#if 1
+ movi(rn(reg), i0);
+ str_d(rn(reg), r0);
+#else
FMOVXD(rn(reg), r0);
sti_l(i0, rn(reg));
+#endif
jit_unget_reg(reg);
}
static void
_stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
+#if 1
+ FSTRD(r2, r1, r0);
+#else
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
FMOVXD(rn(reg), r2);
stxr_l(r0, r1, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
{
jit_int32_t reg;
+#if 1
+ if (s9_p(i0))
+ FSTRDI(r1, r0, i0);
+ else if (u12_p(i0))
+ FSTRDU(r1, r0, i0);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ stxr_d(rn(reg), r0, r1);
+ jit_unget_reg(reg);
+ }
+#else
reg = jit_get_reg(jit_class_gpr);
FMOVXD(rn(reg), r1);
stxi_l(i0, r0, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
_stxbi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
{
jit_int32_t reg;
+#if 1
+ if (s9_p(i0))
+ FSTRD_B(r1, r0, i0);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ stxbr_d(rn(reg), r0, r1);
+ jit_unget_reg(reg);
+ }
+#else
reg = jit_get_reg(jit_class_gpr);
FMOVXD(rn(reg), r1);
stxbi_l(i0, r0, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
_stxai_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
{
jit_int32_t reg;
+#if 1
+ if (s9_p(i0))
+ FSTRD_A(r1, r0, i0);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ stxar_d(rn(reg), r0, r1);
+ jit_unget_reg(reg);
+ }
+#else
reg = jit_get_reg(jit_class_gpr);
FMOVXD(rn(reg), r1);
stxai_l(i0, r0, rn(reg));
jit_unget_reg(reg);
+#endif
}
static void
diff --git a/lib/jit_aarch64-sz.c b/lib/jit_aarch64-sz.c
index b71eb85..9047702 100644
--- a/lib/jit_aarch64-sz.c
+++ b/lib/jit_aarch64-sz.c
@@ -1,7 +1,7 @@
#if __WORDSIZE == 64
# if PACKED_STACK
-#define JIT_INSTR_MAX 96
+#define JIT_INSTR_MAX 64
0, /* data */
0, /* live */
4, /* align */
@@ -11,7 +11,7 @@
0, /* #name */
0, /* #note */
0, /* label */
- 96, /* prolog */
+ 64, /* prolog */
0, /* ellipsis */
0, /* va_push */
0, /* allocai */
@@ -43,7 +43,7 @@
0, /* putargi_l */
4, /* va_start */
8, /* va_arg */
- 12, /* va_arg_d */
+ 8, /* va_arg_d */
0, /* va_end */
4, /* addr */
20, /* addi */
@@ -117,7 +117,7 @@
8, /* movnr */
8, /* movzr */
28, /* casr */
- 36, /* casi */
+ 40, /* casi */
4, /* extr_c */
4, /* exti_c */
4, /* extr_uc */
@@ -156,8 +156,8 @@
16, /* ldi_ui */
4, /* ldr_l */
16, /* ldi_l */
- 8, /* ldxr_c */
- 20, /* ldxi_c */
+ 4, /* ldxr_c */
+ 16, /* ldxi_c */
4, /* ldxr_uc */
20, /* ldxi_uc */
4, /* ldxr_s */
@@ -269,7 +269,7 @@
0, /* retval_i */
0, /* retval_ui */
0, /* retval_l */
- 96, /* epilog */
+ 64, /* epilog */
0, /* arg_f */
0, /* getarg_f */
0, /* putargr_f */
@@ -323,14 +323,14 @@
4, /* extr_d_f */
4, /* movr_f */
8, /* movi_f */
- 8, /* ldr_f */
- 20, /* ldi_f */
- 8, /* ldxr_f */
- 24, /* ldxi_f */
- 8, /* str_f */
- 20, /* sti_f */
- 8, /* stxr_f */
- 24, /* stxi_f */
+ 4, /* ldr_f */
+ 16, /* ldi_f */
+ 4, /* ldxr_f */
+ 16, /* ldxi_f */
+ 4, /* str_f */
+ 16, /* sti_f */
+ 4, /* stxr_f */
+ 16, /* stxi_f */
8, /* bltr_f */
16, /* blti_f */
8, /* bler_f */
@@ -416,21 +416,21 @@
4, /* extr_d */
4, /* extr_f_d */
4, /* movr_d */
- 12, /* movi_d */
- 8, /* ldr_d */
- 20, /* ldi_d */
- 8, /* ldxr_d */
- 24, /* ldxi_d */
- 8, /* str_d */
- 20, /* sti_d */
- 8, /* stxr_d */
- 24, /* stxi_d */
+ 16, /* movi_d */
+ 4, /* ldr_d */
+ 16, /* ldi_d */
+ 4, /* ldxr_d */
+ 16, /* ldxi_d */
+ 4, /* str_d */
+ 16, /* sti_d */
+ 4, /* stxr_d */
+ 16, /* stxi_d */
8, /* bltr_d */
16, /* blti_d */
8, /* bler_d */
16, /* blei_d */
8, /* beqr_d */
- 20, /* beqi_d */
+ 24, /* beqi_d */
8, /* bger_d */
16, /* bgei_d */
8, /* bgtr_d */
@@ -496,9 +496,9 @@
8, /* qlshi */
52, /* qlshr_u */
8, /* qlshi_u */
- 52, /* qrshr */
+ 44, /* qrshr */
8, /* qrshi */
- 52, /* qrshr_u */
+ 48, /* qrshr_u */
8, /* qrshi_u */
24, /* unldr */
44, /* unldi */
@@ -506,10 +506,10 @@
44, /* unldi_u */
20, /* unstr */
56, /* unsti */
- 8, /* unldr_x */
- 20, /* unldi_x */
- 8, /* unstr_x */
- 20, /* unsti_x */
+ 4, /* unldr_x */
+ 16, /* unldi_x */
+ 4, /* unstr_x */
+ 16, /* unsti_x */
4, /* fmar_f */
0, /* fmai_f */
4, /* fmsr_f */
@@ -558,14 +558,14 @@
4, /* ldxbi_l */
8, /* ldxar_l */
4, /* ldxai_l */
- 12, /* ldxbr_f */
- 8, /* ldxbi_f */
- 12, /* ldxar_f */
- 8, /* ldxai_f */
- 12, /* ldxbr_d */
- 8, /* ldxbi_d */
- 12, /* ldxar_d */
- 8, /* ldxai_d */
+ 8, /* ldxbr_f */
+ 4, /* ldxbi_f */
+ 8, /* ldxar_f */
+ 4, /* ldxai_f */
+ 8, /* ldxbr_d */
+ 4, /* ldxbi_d */
+ 8, /* ldxar_d */
+ 4, /* ldxai_d */
8, /* stxbr_c */
4, /* stxbi_c */
8, /* stxar_c */
@@ -582,17 +582,17 @@
4, /* stxbi_l */
8, /* stxar_l */
4, /* stxai_l */
- 12, /* stxbr_f */
- 8, /* stxbi_f */
- 12, /* stxar_f */
- 8, /* stxai_f */
- 12, /* stxbr_d */
- 8, /* stxbi_d */
- 12, /* stxar_d */
- 8, /* stxai_d */
+ 8, /* stxbr_f */
+ 4, /* stxbi_f */
+ 8, /* stxar_f */
+ 4, /* stxai_f */
+ 8, /* stxbr_d */
+ 4, /* stxbi_d */
+ 8, /* stxar_d */
+ 4, /* stxai_d */
# else /* PACKED_STACK */
-#define JIT_INSTR_MAX 120
+#define JIT_INSTR_MAX 84
0, /* data */
0, /* live */
12, /* align */
@@ -602,7 +602,7 @@
0, /* #name */
0, /* #note */
0, /* label */
- 120, /* prolog */
+ 84, /* prolog */
0, /* ellipsis */
0, /* va_push */
0, /* allocai */
@@ -634,7 +634,7 @@
0, /* putargi_l */
44, /* va_start */
48, /* va_arg */
- 56, /* va_arg_d */
+ 48, /* va_arg_d */
0, /* va_end */
4, /* addr */
20, /* addi */
@@ -747,8 +747,8 @@
16, /* ldi_ui */
4, /* ldr_l */
16, /* ldi_l */
- 8, /* ldxr_c */
- 20, /* ldxi_c */
+ 4, /* ldxr_c */
+ 16, /* ldxi_c */
4, /* ldxr_uc */
20, /* ldxi_uc */
4, /* ldxr_s */
@@ -860,7 +860,7 @@
0, /* retval_i */
0, /* retval_ui */
0, /* retval_l */
- 96, /* epilog */
+ 64, /* epilog */
0, /* arg_f */
0, /* getarg_f */
0, /* putargr_f */
@@ -914,14 +914,14 @@
4, /* extr_d_f */
4, /* movr_f */
8, /* movi_f */
- 8, /* ldr_f */
- 20, /* ldi_f */
- 8, /* ldxr_f */
- 24, /* ldxi_f */
- 8, /* str_f */
- 20, /* sti_f */
- 8, /* stxr_f */
- 24, /* stxi_f */
+ 4, /* ldr_f */
+ 16, /* ldi_f */
+ 4, /* ldxr_f */
+ 16, /* ldxi_f */
+ 4, /* str_f */
+ 16, /* sti_f */
+ 4, /* stxr_f */
+ 16, /* stxi_f */
8, /* bltr_f */
16, /* blti_f */
8, /* bler_f */
@@ -1007,21 +1007,21 @@
4, /* extr_d */
4, /* extr_f_d */
4, /* movr_d */
- 12, /* movi_d */
- 8, /* ldr_d */
- 20, /* ldi_d */
- 8, /* ldxr_d */
- 24, /* ldxi_d */
- 8, /* str_d */
- 20, /* sti_d */
- 8, /* stxr_d */
- 24, /* stxi_d */
+ 16, /* movi_d */
+ 4, /* ldr_d */
+ 16, /* ldi_d */
+ 4, /* ldxr_d */
+ 16, /* ldxi_d */
+ 4, /* str_d */
+ 16, /* sti_d */
+ 4, /* stxr_d */
+ 16, /* stxi_d */
8, /* bltr_d */
16, /* blti_d */
8, /* bler_d */
16, /* blei_d */
8, /* beqr_d */
- 20, /* beqi_d */
+ 24, /* beqi_d */
8, /* bger_d */
16, /* bgei_d */
8, /* bgtr_d */
@@ -1087,9 +1087,9 @@
8, /* qlshi */
52, /* qlshr_u */
8, /* qlshi_u */
- 52, /* qrshr */
+ 44, /* qrshr */
8, /* qrshi */
- 52, /* qrshr_u */
+ 48, /* qrshr_u */
8, /* qrshi_u */
24, /* unldr */
44, /* unldi */
@@ -1097,10 +1097,10 @@
44, /* unldi_u */
20, /* unstr */
56, /* unsti */
- 8, /* unldr_x */
- 20, /* unldi_x */
- 8, /* unstr_x */
- 20, /* unsti_x */
+ 4, /* unldr_x */
+ 16, /* unldi_x */
+ 4, /* unstr_x */
+ 16, /* unsti_x */
4, /* fmar_f */
0, /* fmai_f */
4, /* fmsr_f */
@@ -1149,14 +1149,14 @@
4, /* ldxbi_l */
8, /* ldxar_l */
4, /* ldxai_l */
- 12, /* ldxbr_f */
- 8, /* ldxbi_f */
- 12, /* ldxar_f */
- 8, /* ldxai_f */
- 12, /* ldxbr_d */
- 8, /* ldxbi_d */
- 12, /* ldxar_d */
- 8, /* ldxai_d */
+ 8, /* ldxbr_f */
+ 4, /* ldxbi_f */
+ 8, /* ldxar_f */
+ 4, /* ldxai_f */
+ 8, /* ldxbr_d */
+ 4, /* ldxbi_d */
+ 8, /* ldxar_d */
+ 4, /* ldxai_d */
8, /* stxbr_c */
4, /* stxbi_c */
8, /* stxar_c */
@@ -1173,13 +1173,13 @@
4, /* stxbi_l */
8, /* stxar_l */
4, /* stxai_l */
- 12, /* stxbr_f */
- 8, /* stxbi_f */
- 12, /* stxar_f */
- 8, /* stxai_f */
- 12, /* stxbr_d */
- 8, /* stxbi_d */
- 12, /* stxar_d */
- 8, /* stxai_d */
+ 8, /* stxbr_f */
+ 4, /* stxbi_f */
+ 8, /* stxar_f */
+ 4, /* stxai_f */
+ 8, /* stxbr_d */
+ 4, /* stxbi_d */
+ 8, /* stxar_d */
+ 4, /* stxai_d */
# endif
#endif /* __WORDSIZE */
generated by cgit v1.2.3 (git 2.39.1) at 2025年10月01日 06:47:54 +0000

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