arm: Implement unaligned memory access. - 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_arm-cpu.c
diff options
context:
space:
mode:
authorpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2023年04月05日 12:14:29 -0300
committerpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2023年04月05日 12:14:29 -0300
commit0f3bc3da4760347c67deae0be2f7a1f6bb13ea83 (patch)
tree07a35194b1310b476bc4b15058f8fa58b51644a0 /lib/jit_arm-cpu.c
parentb5f6ef6c473656a954b774de6ffb8172c48e6254 (diff)
downloadlightning-0f3bc3da4760347c67deae0be2f7a1f6bb13ea83.tar.gz
arm: Implement unaligned memory access.
By default all unaligned memory accesses use a fallback to use only aligned instructions. This can be overridden by setting: jit_cpu.unaligned = 0; after calling jit_init(); All Linux kernels should handled unaligned memory access, but for now keep as default the code that does not trap. The jit_cpu.vfp_unaligned must be kept as 1 for safety. Not verified if recent Linux kernels can handle unaligned vfp memory access.
Diffstat (limited to 'lib/jit_arm-cpu.c')
-rw-r--r--lib/jit_arm-cpu.c 73
1 files changed, 73 insertions, 0 deletions
diff --git a/lib/jit_arm-cpu.c b/lib/jit_arm-cpu.c
index d2f1727..080275c 100644
--- a/lib/jit_arm-cpu.c
+++ b/lib/jit_arm-cpu.c
@@ -18,9 +18,14 @@
*/
#if PROTO
+# define jit_unaligned_p() (jit_cpu.unaligned)
+# define jit_vfp_unaligned_p() (jit_cpu.vfp_unaligned)
# define stxi(i0,r0,r1) stxi_i(i0,r0,r1)
# define ldxi(r0,r1,i0) ldxi_i(r0,r1,i0)
# define ldr(r0,r1) ldr_i(r0,r1)
+# define ldi(r0,i0) ldi_i(r0,i0)
+# define str(r0,r1) str_i(r0,r1)
+# define sti(i0,r0) sti_i(i0,r0)
# define _s20P(d) ((d) >= -(int)0x80000 && d <= 0x7ffff)
# define _s24P(d) ((d) >= -(int)0x800000 && d <= 0x7fffff)
# define _u3(v) ((v) & 0x7)
@@ -1174,6 +1179,14 @@ static void _ldi_i(jit_state_t*,jit_int32_t,jit_word_t);
static void _ldxr_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
# define ldxi_i(r0,r1,i0) _ldxi_i(_jit,r0,r1,i0)
static void _ldxi_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
+# define unldr(r0, r1, i0) _unldr(_jit, r0, r1, i0)
+static void _unldr(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+# define unldi(r0, i0, i1) _unldi(_jit, r0, i0, i1)
+static void _unldi(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t);
+# define unldr_u(r0, r1, i0) _unldr_u(_jit, r0, r1, i0)
+static void _unldr_u(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+# define unldi_u(r0, i0, i1) _unldi_u(_jit, r0, i0, i1)
+static void _unldi_u(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t);
# define str_c(r0,r1) _str_c(_jit,r0,r1)
static void _str_c(jit_state_t*,jit_int32_t,jit_int32_t);
# define sti_c(i0,r0) _sti_c(_jit,i0,r0)
@@ -1198,6 +1211,10 @@ static void _sti_i(jit_state_t*,jit_word_t,jit_int32_t);
static void _stxr_i(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
# define stxi_i(r0,r1,i0) _stxi_i(_jit,r0,r1,i0)
static void _stxi_i(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
+#define unstr(r0, r1, i0) _unstr(_jit, r0, r1, i0)
+static void _unstr(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+#define unsti(i0, r0, i1) _unsti(_jit, i0, r0, i1)
+static void _unsti(jit_state_t*, jit_word_t, jit_int32_t, jit_word_t);
# define bswapr_us(r0,r1) _bswapr_us(_jit,r0,r1)
static void _bswapr_us(jit_state_t*,jit_int32_t,jit_int32_t);
# define bswapr_ui(r0,r1) _bswapr_ui(_jit,r0,r1)
@@ -3736,6 +3753,44 @@ _ldxi_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
}
static void
+_unldr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ if (jit_unaligned_p())
+ fallback_unldr(r0, r1, i0);
+ else
+ generic_unldr(r0, r1, i0);
+}
+
+static void
+_unldi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0, jit_word_t i1)
+{
+ jit_int32_t t0, r2;
+ if (jit_unaligned_p())
+ fallback_unldi(r0, i0, i1);
+ else
+ generic_unldi(r0, i0, i1);
+}
+
+static void
+_unldr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ if (jit_unaligned_p())
+ fallback_unldr_u(r0, r1, i0);
+ else
+ generic_unldr_u(r0, r1, i0);
+}
+
+static void
+_unldi_u(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0, jit_word_t i1)
+{
+ jit_int32_t t0, r2;
+ if (jit_unaligned_p())
+ fallback_unldi_u(r0, i0, i1);
+ else
+ generic_unldi_u(r0, i0, i1);
+}
+
+static void
_str_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
if (jit_thumb_p())
@@ -3955,6 +4010,24 @@ _stxi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
}
static void
+_unstr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ if (jit_unaligned_p())
+ fallback_unstr(r0, r1, i0);
+ else
+ generic_unstr(r0, r1, i0);
+}
+
+static void
+_unsti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
+{
+ if (jit_unaligned_p())
+ fallback_unsti(i0, r0, i1);
+ else
+ generic_unsti(i0, r0, i1);
+}
+
+static void
_bswapr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
if (jit_thumb_p()) {
generated by cgit v1.2.3 (git 2.39.1) at 2025年09月15日 23:19:24 +0000

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