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:
authorpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2023年03月17日 16:57:57 -0300
committerpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2023年03月17日 16:57:57 -0300
commit5712cf9b0f72cc5199dbaed6c15d160b491aa450 (patch)
treeca912a4f9907ae3a2ca630021644e39aeb99ffdd /lib
parent06cffe9fc81b90ce316745b78ddac5317508962e (diff)
downloadlightning-5712cf9b0f72cc5199dbaed6c15d160b491aa450.tar.gz
arm: Implement ext, ext_u and dep.
Diffstat (limited to 'lib')
-rw-r--r--lib/jit_arm-cpu.c 97
-rw-r--r--lib/jit_arm-sz.c 12
-rw-r--r--lib/jit_arm.c 9
3 files changed, 115 insertions, 3 deletions
diff --git a/lib/jit_arm-cpu.c b/lib/jit_arm-cpu.c
index 3051da9..dbc9b5a 100644
--- a/lib/jit_arm-cpu.c
+++ b/lib/jit_arm-cpu.c
@@ -192,6 +192,12 @@ extern unsigned __aeabi_uidivmod(unsigned, unsigned);
# define THUMB2_CLZ 0xfab0f080
# define THUMB2_RBIT 0xfa90f0a0
# define ARM_RBIT 0x06f00030
+# define THUMB2_SBFX 0xf3400000
+# define ARM_SBFX 0x07a00050
+# define THUMB2_UBFX 0xf3c00000
+# define ARM_UBFX 0x07e00050
+# define THUMB2_BFI 0xf3600000
+# define ARM_BFI 0x07c00010
/* << ARMv6t2 */
# define ARM_CLZ 0x01600010
/* >> ARMv7 */
@@ -459,6 +465,19 @@ static void _tdmb(jit_state_t *_jit, int im);
# define NOT(rd,rm) CC_NOT(ARM_CC_AL,rd,rm)
# define T1_NOT(rd,rm) T1_MVN(rd,rm)
# define T2_NOT(rd,rm) T2_MVN(rd,rm)
+# define torrlw(o,rd,rn,lsb,wm1) _torrlw(_jit,o,rd,rn,lsb,wm1)
+static void _torrlw(jit_state_t*,int,int,int,int,int);
+# define corrlw(cc,o,rd,rn,lsb,wm1) _corrlw(_jit,cc,o,rd,rn,lsb,wm1)
+static void _corrlw(jit_state_t*,int,int,int,int,int,int);
+# define T2_SBFX(rd,rn,lsb,wm1) torrlw(THUMB2_SBFX,rd,rn,lsb,wm1)
+# define CC_SBFX(cc,o,rd,rn,lsb,wm1) corrlw(cc,o,rd,rn,lsb,wm1)
+# define SBFX(rd,rn,lsb,wm1) CC_SBFX(ARM_CC_AL,ARM_SBFX,rd,rn,lsb,wm1)
+# define T2_UBFX(rd,rn,lsb,wm1) torrlw(THUMB2_UBFX,rd,rn,lsb,wm1)
+# define CC_UBFX(cc,rd,rn,lsb,wm1) corrlw(cc,o,rd,rn,lsb,wm1)
+# define UBFX(rd,rn,lsb,wm1) CC_SBFX(ARM_CC_AL,ARM_UBFX,rd,rn,lsb,wm1)
+# define T2_BFI(rd,rn,lsb,wm1) torrlw(THUMB2_BFI,rd,rn,lsb,wm1)
+# define CC_BFI(cc,rd,rn,lsb,wm1) corrlw(cc,o,rd,rn,lsb,wm1)
+# define BFI(rd,rn,lsb,wm1) CC_SBFX(ARM_CC_AL,ARM_BFI,rd,rn,lsb,wm1)
# define T2_CLZ(rd,rm) torrr(THUMB2_CLZ,rm,rd,rm)
# define CC_CLZ(cc,rd,rm) corrrr(cc,ARM_CLZ,_R15_REGNO,rd,_R15_REGNO,rm)
# define CLZ(rd,rm) CC_CLZ(ARM_CC_AL,rd,rm)
@@ -1183,6 +1202,12 @@ static void _stxi_i(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
static void _bswapr_us(jit_state_t*,jit_int32_t,jit_int32_t);
# define bswapr_ui(r0,r1) _bswapr_ui(_jit,r0,r1)
static void _bswapr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
+# define ext(r0,r1,i0,i1) _ext(_jit,r0,r1,i0,i1)
+static void _ext(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t,jit_word_t);
+# define ext_u(r0,r1,i0,i1) _ext_u(_jit,r0,r1,i0,i1)
+static void _ext_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t,jit_word_t);
+# define dep(r0,r1,i0,i1) _dep(_jit,r0,r1,i0,i1)
+static void _dep(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t,jit_word_t);
# define extr_c(r0,r1) _extr_c(_jit,r0,r1)
static void _extr_c(jit_state_t*,jit_int32_t,jit_int32_t);
# define extr_uc(r0,r1) _extr_uc(_jit,r0,r1)
@@ -1611,6 +1636,27 @@ _tdmb(jit_state_t *_jit, int im)
}
static void
+_torrlw(jit_state_t *_jit, int o, int rd, int rn, int lsb, int wm1)
+{
+ jit_thumb_t thumb;
+ assert(!(o & 0x000f0fdf));
+ assert(!(lsb & 0xffffffe0));
+ assert(!(wm1 & 0xffffffe0));
+ thumb.i = o|(_u4(rn)<<16)|((lsb&28)<<10)|(_u4(rd)<<8)|((lsb&3)<<6)|_u5(wm1);
+ iss(thumb.s[0], thumb.s[1]);
+}
+
+static void
+_corrlw(jit_state_t *_jit, int cc, int o, int rd, int rn, int lsb, int wm1)
+{
+ assert(!(cc & 0x0fffffff));
+ assert(!(o & 0xf000f00f));
+ assert(!(lsb & 0xffffffe0));
+ assert(!(wm1 & 0xffffffe0));
+ ii(cc|o|(_u5(wm1)<<16)|(_u4(rd)<<12)|(_u5(lsb)<<7)|_u4(rn));
+}
+
+static void
_nop(jit_state_t *_jit, jit_int32_t i0)
{
if (jit_thumb_p()) {
@@ -3955,6 +4001,57 @@ _bswapr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
}
static void
+_ext(jit_state_t *_jit,
+ jit_int32_t r0, jit_int32_t r1,jit_word_t i0, jit_word_t i1)
+{
+ if (jit_armv7_p()) { /* armv6t2 actually */
+# if __BYTE_ORDER == __BIG_ENDIAN
+ i0 = __WORDSIZE - (i0 + i1);
+# endif
+ if (jit_thumb_p())
+ T2_SBFX(r0, r1, i0, i1 - 1);
+ else
+ SBFX(r0, r1, i0, i1 - 1);
+ }
+ else
+ fallback_ext(r0, r1, i0, i1);
+}
+
+static void
+_ext_u(jit_state_t *_jit,
+ jit_int32_t r0, jit_int32_t r1,jit_word_t i0, jit_word_t i1)
+{
+ if (jit_armv7_p()) { /* armv6t2 actually */
+# if __BYTE_ORDER == __BIG_ENDIAN
+ i0 = __WORDSIZE - (i0 + i1);
+# endif
+ if (jit_thumb_p())
+ T2_UBFX(r0, r1, i0, i1 - 1);
+ else
+ UBFX(r0, r1, i0, i1 - 1);
+ }
+ else
+ fallback_ext_u(r0, r1, i0, i1);
+}
+
+static void
+_dep(jit_state_t *_jit,
+ jit_int32_t r0, jit_int32_t r1,jit_word_t i0, jit_word_t i1)
+{
+ if (jit_armv7_p()) { /* armv6t2 actually */
+# if __BYTE_ORDER == __BIG_ENDIAN
+ i0 = __WORDSIZE - (i0 + i1);
+# endif
+ if (jit_thumb_p())
+ T2_BFI(r0, r1, i0, i0 + i1 - 1);
+ else
+ BFI(r0, r1, i0, i0 + i1 - 1);
+ }
+ else
+ fallback_dep(r0, r1, i0, i1);
+}
+
+static void
_extr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
if (jit_thumb_p()) {
diff --git a/lib/jit_arm-sz.c b/lib/jit_arm-sz.c
index bca512f..4e1d5f6 100644
--- a/lib/jit_arm-sz.c
+++ b/lib/jit_arm-sz.c
@@ -4,7 +4,7 @@
#define JIT_INSTR_MAX 50
0, /* data */
0, /* live */
- 14, /* align */
+ 20, /* align */
0, /* save */
0, /* load */
4, /* skip */
@@ -255,7 +255,7 @@
0, /* retval_i */
0, /* retval_ui */
0, /* retval_l */
- 24, /* epilog */
+ 16, /* epilog */
0, /* arg_f */
0, /* getarg_f */
0, /* putargr_f */
@@ -457,6 +457,9 @@
4, /* lroti */
4, /* rrotr */
4, /* rroti */
+ 4, /* ext */
+ 4, /* ext_u */
+ 4, /* dep */
#endif /* __ARM_PCS_VFP */
#endif /* __WORDSIZE */
@@ -465,7 +468,7 @@
#define JIT_INSTR_MAX 76
0, /* data */
0, /* live */
- 18, /* align */
+ 20, /* align */
0, /* save */
0, /* load */
4, /* skip */
@@ -918,5 +921,8 @@
4, /* lroti */
4, /* rrotr */
4, /* rroti */
+ 8, /* ext */
+ 12, /* ext_u */
+ 24, /* dep */
#endif /* __ARM_PCS_VFP */
#endif /* __WORDSIZE */
diff --git a/lib/jit_arm.c b/lib/jit_arm.c
index 953298f..38f4ec4 100644
--- a/lib/jit_arm.c
+++ b/lib/jit_arm.c
@@ -1636,6 +1636,15 @@ _emit_code(jit_state_t *_jit)
case_rr(hton, _ui);
case_rr(bswap, _us);
case_rr(bswap, _ui);
+ case jit_code_ext:
+ ext(rn(node->u.w), rn(node->v.w), node->w.q.l, node->w.q.h);
+ break;
+ case jit_code_ext_u:
+ ext_u(rn(node->u.w), rn(node->v.w), node->w.q.l, node->w.q.h);
+ break;
+ case jit_code_dep:
+ dep(rn(node->u.w), rn(node->v.w), node->w.q.l, node->w.q.h);
+ break;
case_rr(ext, _c);
case_rr(ext, _uc);
case_rr(ext, _s);
generated by cgit v1.2.3 (git 2.25.1) at 2025年09月17日 19:30:00 +0000

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