arm: Implement optimized post increment load/store - 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>2024年02月06日 14:43:19 -0300
committerpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2024年02月06日 14:43:19 -0300
commit9454b634a3afe04ce5f8b7a50b825b87abd7d6c8 (patch)
tree5bff6aca0e055f000963cd933bfd75bc0aba7d17 /lib/jit_arm-cpu.c
parent79634e02a42984381314628a2d7a4e6efe4e589c (diff)
downloadlightning-9454b634a3afe04ce5f8b7a50b825b87abd7d6c8.tar.gz
arm: Implement optimized post increment load/store
Post increment needs to be verified in actual hardware. In qemu it appears post-increment is incorrect, as it works the same way as pre-increment. Based on documentation, a few encodings are valid for vfp registers, but not implemented in this commit. Also based on documentation, there are valid encodings in arm mode (not thumb mode) for load/store with a pre/post increment and a register, not an immediate, increment argument. Also not implemented in this commit.
Diffstat (limited to 'lib/jit_arm-cpu.c')
-rw-r--r--lib/jit_arm-cpu.c 520
1 files changed, 503 insertions, 17 deletions
diff --git a/lib/jit_arm-cpu.c b/lib/jit_arm-cpu.c
index 813b01e..6fc3fea 100644
--- a/lib/jit_arm-cpu.c
+++ b/lib/jit_arm-cpu.c
@@ -270,6 +270,8 @@ extern unsigned __aeabi_uidivmod(unsigned, unsigned);
# define THUMB2_BLI 0xf000d000
/* ldr/str */
# define ARM_U 0x00800000 /* positive offset */
+# define ARM_P 0x01000000 /* index */
+# define ARM_W 0x00200000 /* writeback */
# define THUMB2_P 0x00000400
# define THUMB2_U 0x00000200
# define THUMB2_W 0x00000100
@@ -338,9 +340,9 @@ extern unsigned __aeabi_uidivmod(unsigned, unsigned);
/* ldm/stm */
# define ARM_M 0x08000000
# define ARM_M_L 0x00100000 /* load; store if not set */
-# define ARM_M_I 0x00800000 /* inc; dec if not set */
-# define ARM_M_B 0x01000000 /* before; after if not set */
-# define ARM_M_U 0x00200000 /* update Rn */
+# define ARM_M_U 0x00800000 /* inc; dec if not set */
+# define ARM_M_P 0x01000000 /* before; after if not set */
+# define ARM_M_W 0x00200000 /* update Rn */
# define THUMB2_LDM_W 0x00200000
# define THUMB2_LDM_P 0x00008000
# define THUMB2_LDM_M 0x00004000
@@ -723,69 +725,134 @@ static void _corrlw(jit_state_t*,int,int,int,int,int,int);
# define T2_LDRSB(rt,rn,rm) torxr(THUMB2_LDRSB,rn,rt,rm)
# define CC_LDRSBN(cc,rt,rn,rm) corrr(cc,ARM_LDRSB,rn,rt,rm)
# define LDRSBN(rt,rn,rm) CC_LDRSBN(ARM_CC_AL,rt,rn,rm)
+
# define CC_LDRSBI(cc,rt,rn,im) corri8(cc,ARM_LDRSBI|ARM_U,rn,rt,im)
# define LDRSBI(rt,rn,im) CC_LDRSBI(ARM_CC_AL,rt,rn,im)
+# define LDRSBI_B(rt,rn,im) corri8(ARM_CC_AL,ARM_LDRSBI|ARM_P|ARM_U|ARM_W,rn,rt,im)
+# define LDRSBI_A(rt,rn,im) corri8(ARM_CC_AL,ARM_LDRSBI|ARM_U|ARM_W,rn,rt,im)
+
# define T2_LDRSBI(rt,rn,im) torri8(THUMB2_LDRSBI|THUMB2_U,rn,rt,im)
# define T2_LDRSBWI(rt,rn,im) torri12(THUMB2_LDRSBWI,rn,rt,im)
+# define T2_LDRSBI_B(rt,rn,im) torri8(THUMB2_LDRSBI|THUMB2_P|THUMB2_U|THUMB2_W,rn,rt,im)
+# define T2_LDRSBI_A(rt,rn,im) torri8(THUMB2_LDRSBI|THUMB2_U|THUMB2_W,rn,rt,im)
+
# define CC_LDRSBIN(cc,rt,rn,im) corri8(cc,ARM_LDRSBI,rn,rt,im)
# define LDRSBIN(rt,rn,im) CC_LDRSBIN(ARM_CC_AL,rt,rn,im)
+# define LDRSBIN_B(rt,rn,im) corri8(ARM_CC_AL,ARM_LDRSBI|ARM_P|ARM_W,rn,rt,im)
+# define LDRSBIN_A(rt,rn,im) corri8(ARM_CC_AL,ARM_LDRSBI|ARM_W,rn,rt,im)
+
# define T2_LDRSBIN(rt,rn,im) torri8(THUMB2_LDRSBI,rn,rt,im)
+# define T2_LDRSBIN_B(rt,rn,im) torri8(THUMB2_LDRSBI|THUMB2_P|THUMB2_W,rn,rt,im)
+# define T2_LDRSBIN_A(rt,rn,im) torri8(THUMB2_LDRSBI|THUMB2_W,rn,rt,im)
+
# define CC_LDRB(cc,rt,rn,rm) corrr(cc,ARM_LDRB|ARM_U,rn,rt,rm)
# define LDRB(rt,rn,rm) CC_LDRB(ARM_CC_AL,rt,rn,rm)
# define T1_LDRB(rt,rn,rm) is(THUMB_LDRB|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt))
# define T2_LDRB(rt,rn,rm) torxr(THUMB2_LDRB,rn,rt,rm)
# define CC_LDRBN(cc,rt,rn,rm) corrr(cc,ARM_LDRB,rn,rt,rm)
# define LDRBN(rt,rn,rm) CC_LDRBN(ARM_CC_AL,rt,rn,rm)
+
# define CC_LDRBI(cc,rt,rn,im) corri(cc,ARM_LDRBI|ARM_U,rn,rt,im)
# define LDRBI(rt,rn,im) CC_LDRBI(ARM_CC_AL,rt,rn,im)
+# define LDRBI_B(rt,rn,im) corri(ARM_CC_AL,ARM_LDRBI|ARM_P|ARM_U|ARM_W,rn,rt,im)
+# define LDRBI_A(rt,rn,im) corri(ARM_CC_AL,ARM_LDRBI|ARM_U|ARM_W,rn,rt,im)
+
# define T1_LDRBI(rt,rn,im) is(THUMB_LDRBI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt))
# define T2_LDRBI(rt,rn,im) torri8(THUMB2_LDRBI|THUMB2_U,rn,rt,im)
# define T2_LDRBWI(rt,rn,im) torri12(THUMB2_LDRBWI,rn,rt,im)
+# define T2_LDRBI_B(rt,rn,im) torri8(THUMB2_LDRBI|THUMB2_P|THUMB2_U|THUMB2_W,rn,rt,im)
+# define T2_LDRBI_A(rt,rn,im) torri8(THUMB2_LDRBI|THUMB2_U|THUMB2_W,rn,rt,im)
+
# define CC_LDRBIN(cc,rt,rn,im) corri(cc,ARM_LDRBI,rn,rt,im)
# define LDRBIN(rt,rn,im) CC_LDRBIN(ARM_CC_AL,rt,rn,im)
+# define LDRBIN_B(rt,rn,im) corri(ARM_CC_AL,ARM_LDRBI|ARM_P|ARM_W,rn,rt,im)
+# define LDRBIN_A(rt,rn,im) corri(ARM_CC_AL,ARM_LDRBI|ARM_W,rn,rt,im)
+
# define T2_LDRBIN(rt,rn,im) torri8(THUMB2_LDRBI,rn,rt,im)
+# define T2_LDRBIN_B(rt,rn,im) torri8(THUMB2_LDRBI|THUMB2_P|THUMB2_W,rn,rt,im)
+# define T2_LDRBIN_A(rt,rn,im) torri8(THUMB2_LDRBI|THUMB2_W,rn,rt,im)
+
# define CC_LDRSH(cc,rt,rn,rm) corrr(cc,ARM_LDRSH|ARM_U,rn,rt,rm)
# define LDRSH(rt,rn,rm) CC_LDRSH(ARM_CC_AL,rt,rn,rm)
# define T1_LDRSH(rt,rn,rm) is(THUMB_LDRSH|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt))
# define T2_LDRSH(rt,rn,rm) torxr(THUMB2_LDRSH,rn,rt,rm)
# define CC_LDRSHN(cc,rt,rn,rm) corrr(cc,ARM_LDRSH,rn,rt,rm)
# define LDRSHN(rt,rn,rm) CC_LDRSHN(ARM_CC_AL,rt,rn,rm)
+
# define CC_LDRSHI(cc,rt,rn,im) corri8(cc,ARM_LDRSHI|ARM_U,rn,rt,im)
# define LDRSHI(rt,rn,im) CC_LDRSHI(ARM_CC_AL,rt,rn,im)
+# define LDRSHI_B(rt,rn,im) corri8(ARM_CC_AL,ARM_LDRSHI|ARM_P|ARM_U|ARM_W,rn,rt,im)
+# define LDRSHI_A(rt,rn,im) corri8(ARM_CC_AL,ARM_LDRSHI|ARM_U|ARM_W,rn,rt,im)
+
# define T2_LDRSHI(rt,rn,im) torri8(THUMB2_LDRSHI|THUMB2_U,rn,rt,im)
# define T2_LDRSHWI(rt,rn,im) torri12(THUMB2_LDRSHWI,rn,rt,im)
+# define T2_LDRSHI_B(rt,rn,im) torri8(THUMB2_LDRSBI|THUMB2_P|THUMB2_U|THUMB2_W,rn,rt,im)
+# define T2_LDRSHI_A(rt,rn,im) torri8(THUMB2_LDRSBI|THUMB2_U|THUMB2_W,rn,rt,im)
+
# define CC_LDRSHIN(cc,rt,rn,im) corri8(cc,ARM_LDRSHI,rn,rt,im)
# define LDRSHIN(rt,rn,im) CC_LDRSHIN(ARM_CC_AL,rt,rn,im)
+# define LDRSHIN_B(rt,rn,im) corri8(ARM_CC_AL,ARM_LDRSHI|ARM_P|ARM_W,rn,rt,im)
+# define LDRSHIN_A(rt,rn,im) corri8(ARM_CC_AL,ARM_LDRSHI|ARM_W,rn,rt,im)
+
# define T2_LDRSHIN(rt,rn,im) torri8(THUMB2_LDRSHI,rn,rt,im)
+# define T2_LDRSHIN_B(rt,rn,im) torri8(THUMB2_LDRSHI|THUMB2_P|THUMB2_W,rn,rt,im)
+# define T2_LDRSHIN_A(rt,rn,im) torri8(THUMB2_LDRSHI|THUMB2_W,rn,rt,im)
+
# define CC_LDRH(cc,rt,rn,rm) corrr(cc,ARM_LDRH|ARM_U,rn,rt,rm)
# define LDRH(rt,rn,rm) CC_LDRH(ARM_CC_AL,rt,rn,rm)
# define T1_LDRH(rt,rn,rm) is(THUMB_LDRH|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt))
# define T2_LDRH(rt,rn,rm) torxr(THUMB2_LDRH,rn,rt,rm)
# define CC_LDRHN(cc,rt,rn,rm) corrr(cc,ARM_LDRH,rn,rt,rm)
# define LDRHN(rt,rn,rm) CC_LDRHN(ARM_CC_AL,rt,rn,rm)
+
# define CC_LDRHI(cc,rt,rn,im) corri8(cc,ARM_LDRHI|ARM_U,rn,rt,im)
# define LDRHI(rt,rn,im) CC_LDRHI(ARM_CC_AL,rt,rn,im)
+# define LDRHI_B(rt,rn,im) corri8(ARM_CC_AL,ARM_LDRHI|ARM_P|ARM_U|ARM_W,rn,rt,im)
+# define LDRHI_A(rt,rn,im) corri8(ARM_CC_AL,ARM_LDRHI|ARM_U|ARM_W,rn,rt,im)
+
# define T1_LDRHI(rt,rn,im) is(THUMB_LDRHI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt))
# define T2_LDRHI(rt,rn,im) torri8(THUMB2_LDRHI|THUMB2_U,rn,rt,im)
# define T2_LDRHWI(rt,rn,im) torri12(THUMB2_LDRHWI,rn,rt,im)
+# define T2_LDRHI_B(rt,rn,im) torri8(THUMB2_LDRHI|THUMB2_P|THUMB2_U|THUMB2_W,rn,rt,im)
+# define T2_LDRHI_A(rt,rn,im) torri8(THUMB2_LDRHI|THUMB2_U|THUMB2_W,rn,rt,im)
+
# define CC_LDRHIN(cc,rt,rn,im) corri8(cc,ARM_LDRHI,rn,rt,im)
# define LDRHIN(rt,rn,im) CC_LDRHIN(ARM_CC_AL,rt,rn,im)
+# define LDRHIN_B(rt,rn,im) corri8(ARM_CC_AL,ARM_LDRHI|ARM_P|ARM_W,rn,rt,im)
+# define LDRHIN_A(rt,rn,im) corri8(ARM_CC_AL,ARM_LDRHI|ARM_W,rn,rt,im)
+
# define T2_LDRHIN(rt,rn,im) torri8(THUMB2_LDRHI,rn,rt,im)
+# define T2_LDRHIN_B(rt,rn,im) torri8(THUMB2_LDRHI|THUMB2_P|THUMB2_W,rn,rt,im)
+# define T2_LDRHIN_A(rt,rn,im) torri8(THUMB2_LDRHI|THUMB2_W,rn,rt,im)
+
# define CC_LDR(cc,rt,rn,rm) corrr(cc,ARM_LDR|ARM_U,rn,rt,rm)
# define LDR(rt,rn,rm) CC_LDR(ARM_CC_AL,rt,rn,rm)
# define T1_LDR(rt,rn,rm) is(THUMB_LDR|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt))
# define T2_LDR(rt,rn,rm) torxr(THUMB2_LDR,rn,rt,rm)
# define CC_LDRN(cc,rt,rn,rm) corrr(cc,ARM_LDR,rn,rt,rm)
# define LDRN(rt,rn,rm) CC_LDRN(ARM_CC_AL,rt,rn,rm)
+
# define CC_LDRI(cc,rt,rn,im) corri(cc,ARM_LDRI|ARM_U,rn,rt,im)
# define LDRI(rt,rn,im) CC_LDRI(ARM_CC_AL,rt,rn,im)
+# define LDRI_B(rt,rn,im) corri(ARM_CC_AL,ARM_LDRI|ARM_P|ARM_U|ARM_W,rn,rt,im)
+# define LDRI_A(rt,rn,im) corri(ARM_CC_AL,ARM_LDRI|ARM_U|ARM_W,rn,rt,im)
+
# define T1_LDRI(rt,rn,im) is(THUMB_LDRI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt))
# define T1_LDRISP(rt,im) is(THUMB_LDRISP|(_u3(rt)<<8)|_u8(im))
# define T2_LDRI(rt,rn,im) torri8(THUMB2_LDRI|THUMB2_U,rn,rt,im)
# define T2_LDRWI(rt,rn,im) torri12(THUMB2_LDRWI,rn,rt,im)
+# define T2_LDRI_B(rt,rn,im) torri8(THUMB2_LDRI|THUMB2_P|THUMB2_U|THUMB2_W,rn,rt,im)
+# define T2_LDRI_A(rt,rn,im) torri8(THUMB2_LDRI|THUMB2_U|THUMB2_W,rn,rt,im)
+
# define CC_LDRIN(cc,rt,rn,im) corri(cc,ARM_LDRI,rn,rt,im)
# define LDRIN(rt,rn,im) CC_LDRIN(ARM_CC_AL,rt,rn,im)
+# define LDRIN_B(rt,rn,im) corri(ARM_CC_AL,ARM_LDRI|ARM_P|ARM_W,rn,rt,im)
+# define LDRIN_A(rt,rn,im) corri(ARM_CC_AL,ARM_LDRI|ARM_W,rn,rt,im)
+
# define T2_LDRIN(rt,rn,im) torri8(THUMB2_LDRI,rn,rt,im)
+# define T2_LDRIN_B(rt,rn,im) torri8(THUMB2_LDRI|THUMB2_P|THUMB2_W,rn,rt,im)
+# define T2_LDRIN_A(rt,rn,im) torri8(THUMB2_LDRI|THUMB2_W,rn,rt,im)
+
# define CC_LDRD(cc,rt,rn,rm) corrr(cc,ARM_LDRD|ARM_U,rn,rt,rm)
# define LDRD(rt,rn,rm) CC_LDRD(ARM_CC_AL,rt,rn,rm)
# define T2_LDRDI(rt,rt2,rn,im) torrri8(THUMB2_LDRDI|ARM_U,rn,rt,rt2,im)
@@ -805,43 +872,84 @@ static void _corrlw(jit_state_t*,int,int,int,int,int,int);
# define T2_STRB(rt,rn,rm) torxr(THUMB2_STRB,rn,rt,rm)
# define CC_STRBN(cc,rt,rn,rm) corrr(cc,ARM_STRB,rn,rt,rm)
# define STRBN(rt,rn,rm) CC_STRBN(ARM_CC_AL,rt,rn,rm)
+
# define CC_STRBI(cc,rt,rn,im) corri(cc,ARM_STRBI|ARM_U,rn,rt,im)
# define STRBI(rt,rn,im) CC_STRBI(ARM_CC_AL,rt,rn,im)
+# define STRBI_B(rt,rn,im) corri(ARM_CC_AL,ARM_STRBI|ARM_P|ARM_U|ARM_W,rn,rt,im)
+# define STRBI_A(rt,rn,im) corri(ARM_CC_AL,ARM_STRBI|ARM_U|ARM_W,rn,rt,im)
+
# define T1_STRBI(rt,rn,im) is(THUMB_STRBI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt))
# define T2_STRBI(rt,rn,im) torri8(THUMB2_STRBI|THUMB2_U,rn,rt,im)
# define T2_STRBWI(rt,rn,im) torri12(THUMB2_STRBWI,rn,rt,im)
+# define T2_STRBI_B(rt,rn,im) torri8(THUMB2_STRBI|THUMB2_U|THUMB2_P|THUMB2_W,rn,rt,im)
+# define T2_STRBI_A(rt,rn,im) torri8(THUMB2_STRBI|THUMB2_U|THUMB2_W,rn,rt,im)
+
# define CC_STRBIN(cc,rt,rn,im) corri(cc,ARM_STRBI,rn,rt,im)
# define STRBIN(rt,rn,im) CC_STRBIN(ARM_CC_AL,rt,rn,im)
+# define STRBIN_B(rt,rn,im) corri(ARM_CC_AL,ARM_STRBI|ARM_P|ARM_W,rn,rt,im)
+# define STRBIN_A(rt,rn,im) corri(ARM_CC_AL,ARM_STRBI|ARM_W,rn,rt,im)
+
# define T2_STRBIN(rt,rn,im) torri8(THUMB2_STRBI,rn,rt,im)
+# define T2_STRBIN_B(rt,rn,im) torri8(THUMB2_STRBI|THUMB2_P|THUMB2_W,rn,rt,im)
+# define T2_STRBIN_A(rt,rn,im) torri8(THUMB2_STRBI|THUMB2_W,rn,rt,im)
+
# define CC_STRH(cc,rt,rn,rm) corrr(cc,ARM_STRH|ARM_U,rn,rt,rm)
# define STRH(rt,rn,rm) CC_STRH(ARM_CC_AL,rt,rn,rm)
+# define STRBI_B(rt,rn,im) corri(ARM_CC_AL,ARM_STRBI|ARM_P|ARM_U|ARM_W,rn,rt,im)
+# define STRBI_A(rt,rn,im) corri(ARM_CC_AL,ARM_STRBI|ARM_U|ARM_W,rn,rt,im)
# define T1_STRH(rt,rn,rm) is(THUMB_STRH|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt))
# define T2_STRH(rt,rn,rm) torxr(THUMB2_STRH,rn,rt,rm)
# define CC_STRHN(cc,rt,rn,rm) corrr(cc,ARM_STRH,rn,rt,rm)
# define STRHN(rt,rn,rm) CC_STRHN(ARM_CC_AL,rt,rn,rm)
+
# define CC_STRHI(cc,rt,rn,im) corri8(cc,ARM_STRHI|ARM_U,rn,rt,im)
# define STRHI(rt,rn,im) CC_STRHI(ARM_CC_AL,rt,rn,im)
+# define STRHI_B(rt,rn,im) corri(ARM_CC_AL,ARM_STRHI|ARM_P|ARM_U|ARM_W,rn,rt,im)
+# define STRHI_A(rt,rn,im) corri(ARM_CC_AL,ARM_STRHI|ARM_U|ARM_W,rn,rt,im)
+
# define T1_STRHI(rt,rn,im) is(THUMB_STRHI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt))
# define T2_STRHI(rt,rn,im) torri8(THUMB2_STRHI|THUMB2_U,rn,rt,im)
# define T2_STRHWI(rt,rn,im) torri12(THUMB2_STRHWI,rn,rt,im)
+# define T2_STRHI_B(rt,rn,im) torri8(THUMB2_STRHI|THUMB2_U|THUMB2_P|THUMB2_W,rn,rt,im)
+# define T2_STRHI_A(rt,rn,im) torri8(THUMB2_STRHI|THUMB2_U|THUMB2_W,rn,rt,im)
+
# define CC_STRHIN(cc,rt,rn,im) corri8(cc,ARM_STRHI,rn,rt,im)
# define STRHIN(rt,rn,im) CC_STRHIN(ARM_CC_AL,rt,rn,im)
+# define STRHIN_B(rt,rn,im) corri8(ARM_CC_AL,ARM_STRHI|ARM_P|ARM_W,rn,rt,im)
+# define STRHIN_A(rt,rn,im) corri8(ARM_CC_AL,ARM_STRHI|ARM_W,rn,rt,im)
+
# define T2_STRHIN(rt,rn,im) torri8(THUMB2_STRHI,rn,rt,im)
+# define T2_STRHIN_B(rt,rn,im) torri8(THUMB2_STRHI|THUMB2_P|THUMB2_W,rn,rt,im)
+# define T2_STRHIN_A(rt,rn,im) torri8(THUMB2_STRHI|THUMB2_W,rn,rt,im)
+
# define CC_STR(cc,rt,rn,rm) corrr(cc,ARM_STR|ARM_U,rn,rt,rm)
# define STR(rt,rn,rm) CC_STR(ARM_CC_AL,rt,rn,rm)
# define T1_STR(rt,rn,rm) is(THUMB_STR|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt))
# define T2_STR(rt,rn,rm) torxr(THUMB2_STR,rn,rt,rm)
# define CC_STRN(cc,rt,rn,rm) corrr(cc,ARM_STR,rn,rt,rm)
# define STRN(rt,rn,rm) CC_STRN(ARM_CC_AL,rt,rn,rm)
+
# define CC_STRI(cc,rt,rn,im) corri(cc,ARM_STRI|ARM_U,rn,rt,im)
# define STRI(rt,rn,im) CC_STRI(ARM_CC_AL,rt,rn,im)
+# define STRI_B(rt,rn,im) corri(ARM_CC_AL,ARM_STRI|ARM_P|ARM_U|ARM_W,rn,rt,im)
+# define STRI_A(rt,rn,im) corri(ARM_CC_AL,ARM_STRI|ARM_U|ARM_W,rn,rt,im)
+
# define T1_STRI(rt,rn,im) is(THUMB_STRI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt))
# define T1_STRISP(rt,im) is(THUMB_STRISP|(_u3(rt)<<8)|(_u8(im)))
# define T2_STRI(rt,rn,im) torri8(THUMB2_STRI|THUMB2_U,rn,rt,im)
# define T2_STRWI(rt,rn,im) torri12(THUMB2_STRWI,rn,rt,im)
+# define T2_STRI_B(rt,rn,im) torri8(THUMB2_STRI|THUMB2_U|THUMB2_P|THUMB2_W,rn,rt,im)
+# define T2_STRI_A(rt,rn,im) torri8(THUMB2_STRI|THUMB2_U|THUMB2_W,rn,rt,im)
+
# define CC_STRIN(cc,rt,rn,im) corri(cc,ARM_STRI,rn,rt,im)
# define STRIN(rt,rn,im) CC_STRIN(ARM_CC_AL,rt,rn,im)
+# define STRIN_B(rt,rn,im) corri(ARM_CC_AL,ARM_STRI|ARM_P|ARM_W,rn,rt,im)
+# define STRIN_A(rt,rn,im) corri(ARM_CC_AL,ARM_STRI|ARM_W,rn,rt,im)
+
# define T2_STRIN(rt,rn,im) torri8(THUMB2_STRI,rn,rt,im)
+# define T2_STRIN_B(rt,rn,im) torri8(THUMB2_STRI|THUMB2_P|THUMB2_W,rn,rt,im)
+# define T2_STRIN_A(rt,rn,im) torri8(THUMB2_STRI|THUMB2_W,rn,rt,im)
+
# define CC_STRD(cc,rt,rn,rm) corrr(cc,ARM_STRD|ARM_U,rn,rt,rm)
# define STRD(rt,rn,rm) CC_STRD(ARM_CC_AL,rt,rn,rm)
# define CC_STRDN(cc,rt,rn,rm) corrr(cc,ARM_STRD,rn,rt,rm)
@@ -855,47 +963,47 @@ static void _corrlw(jit_state_t*,int,int,int,int,int,int);
# define CC_STREX(cc,rd,rt,rn) corrrr(cc,ARM_STREX,rn,rd,0xf,rt)
# define STREX(rd,rt,rn) CC_STREX(ARM_CC_AL,rd,rt,rn)
# define T2_STREX(rd,rt,rn,im) torrri8(THUMB2_STREX,rn,rt,rd,im)
-# define CC_LDMIA(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_I,rn,im)
+# define CC_LDMIA(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_U,rn,im)
# define LDMIA(rn,im) CC_LDMIA(ARM_CC_AL,rn,im)
# define CC_LDM(cc,rn,im) CC_LDMIA(cc,rn,im)
# define LDM(rn,im) LDMIA(rn,im)
# define T1_LDMIA(rn,im) is(THUMB_LDMIA|(_u3(rn)<<8)|im)
# define T2_LDMIA(rn,im) torl(THUMB2_LDMIA,rn,im)
-# define CC_LDMIA_U(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_I|ARM_M_U,rn,im)
+# define CC_LDMIA_U(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_U|ARM_M_W,rn,im)
# define LDMIA_U(rn,im) CC_LDMIA_U(ARM_CC_AL,rn,im)
# define LDM_U(r0,i0) LDMIA_U(r0,i0)
-# define CC_LDMIB(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_I|ARM_M_B,rn,im)
+# define CC_LDMIB(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_U|ARM_M_P,rn,im)
# define LDMIB(rn,im) CC_LDMIB(ARM_CC_AL,rn,im)
-# define CC_LDMIB_U(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_I|ARM_M_B|ARM_M_U,rn,im)
+# define CC_LDMIB_U(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_U|ARM_M_P|ARM_M_W,rn,im)
# define LDMIB_U(rn,im) CC_LDMIB_U(ARM_CC_AL,rn,im)
# define CC_LDMDA(cc,rn,im) corl(cc,ARM_M|ARM_M_L,rn,im)
# define LDMDA(rn,im) CC_LDMDA(ARM_CC_AL,rn,im)
-# define CC_LDMDA_U(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_U,rn,im)
+# define CC_LDMDA_U(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_W,rn,im)
# define LDMDA_U(rn,im) CC_LDMDA_U(ARM_CC_AL,rn,im)
-# define CC_LDMDB(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_B,rn,im)
+# define CC_LDMDB(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_P,rn,im)
# define LDMDB(rn,im) CC_LDMDB(ARM_CC_AL,rn,im)
# define T2_LDMDB(rn,im) torl(THUMB2_LDMDB,rn,im)
-# define CC_LDMDB_U(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_B|ARM_M_U,rn,im)
+# define CC_LDMDB_U(cc,rn,im) corl(cc,ARM_M|ARM_M_L|ARM_M_P|ARM_M_W,rn,im)
# define LDMDB_U(rn,im) CC_LDMDB_U(ARM_CC_AL,rn,im)
-# define CC_STMIA(cc,rn,im) corl(cc,ARM_M|ARM_M_I,rn,im)
+# define CC_STMIA(cc,rn,im) corl(cc,ARM_M|ARM_M_U,rn,im)
# define STMIA(rn,im) CC_STMIA(ARM_CC_AL,rn,im)
# define CC_STM(cc,rn,im) CC_STMIA(cc,rn,im)
# define STM(rn,im) STMIA(rn,im)
-# define CC_STMIA_U(cc,rn,im) corl(cc,ARM_M|ARM_M_I|ARM_M_U,rn,im)
+# define CC_STMIA_U(cc,rn,im) corl(cc,ARM_M|ARM_M_U|ARM_M_W,rn,im)
# define STMIA_U(rn,im) CC_STMIA_U(ARM_CC_AL,rn,im)
# define CC_STM_U(cc,rn,im) CC_STMIA_U(cc,rn,im)
# define STM_U(rn,im) STMIA_U(rn,im)
-# define CC_STMIB(cc,rn,im) corl(cc,ARM_M|ARM_M_I|ARM_M_B,rn,im)
+# define CC_STMIB(cc,rn,im) corl(cc,ARM_M|ARM_M_U|ARM_M_P,rn,im)
# define STMIB(rn,im) CC_STMIB(ARM_CC_AL,rn,im)
-# define CC_STMIB_U(cc,rn,im) corl(cc,ARM_M|ARM_M_I|ARM_M_B|ARM_M_U,rn,im)
+# define CC_STMIB_U(cc,rn,im) corl(cc,ARM_M|ARM_M_U|ARM_M_P|ARM_M_W,rn,im)
# define STMIB_U(rn,im) CC_STMIB_U(ARM_CC_AL,rn,im)
# define CC_STMDA(cc,rn,im) corl(cc,ARM_M,rn,im)
# define STMDA(rn,im) CC_STMDA(ARM_CC_AL,rn,im)
-# define CC_STMDA_U(cc,rn,im) corl(cc,ARM_M|ARM_M_U,rn,im)
+# define CC_STMDA_U(cc,rn,im) corl(cc,ARM_M|ARM_M_W,rn,im)
# define STMDA_U(rn,im) CC_STMDA_U(ARM_CC_AL,rn,im)
-# define CC_STMDB(cc,rn,im) corl(cc,ARM_M|ARM_M_B,rn,im)
+# define CC_STMDB(cc,rn,im) corl(cc,ARM_M|ARM_M_P,rn,im)
# define STMDB(rn,im) CC_STMDB(ARM_CC_AL,rn,im)
-# define CC_STMDB_U(cc,rn,im) corl(cc,ARM_M|ARM_M_B|ARM_M_U,rn,im)
+# define CC_STMDB_U(cc,rn,im) corl(cc,ARM_M|ARM_M_P|ARM_M_W,rn,im)
# define STMDB_U(rn,im) CC_STMDB_U(ARM_CC_AL,rn,im)
# define CC_PUSH(cc,im) CC_STMDB_U(cc,_SP_REGNO,im)
# define PUSH(im) STMDB_U(_SP_REGNO,im)
@@ -1199,6 +1307,36 @@ static void _unldi(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t);
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 ldxbr_c(r0, r1, r2) generic_ldxbr_c(r0, r1, r2)
+# define ldxbi_c(r0, r1, i0) _ldxbi_c(_jit, r0, r1, i0)
+static void _ldxbi_c(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+# define ldxbr_uc(r0, r1, r2) generic_ldxbr_uc(r0, r1, r2)
+# define ldxbi_uc(r0, r1, i0) _ldxbi_uc(_jit, r0, r1, i0)
+static void _ldxbi_uc(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+# define ldxbr_s(r0, r1, r2) generic_ldxbr_s(r0, r1, r2)
+# define ldxbi_s(r0, r1, i0) _ldxbi_s(_jit, r0, r1, i0)
+static void _ldxbi_s(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+# define ldxbr_us(r0, r1, r2) generic_ldxbr_us(r0, r1, r2)
+# define ldxbi_us(r0, r1, i0) _ldxbi_us(_jit, r0, r1, i0)
+static void _ldxbi_us(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+# define ldxbr_i(r0, r1, r2) generic_ldxbr_i(r0, r1, r2)
+# define ldxbi_i(r0, r1, i0) _ldxbi_i(_jit, r0, r1, i0)
+static void _ldxbi_i(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+# define ldxar_c(r0, r1, r2) generic_ldxar_c(r0, r1, r2)
+# define ldxai_c(r0, r1, i0) _ldxai_c(_jit, r0, r1, i0)
+static void _ldxai_c(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+# define ldxar_uc(r0, r1, r2) generic_ldxar_uc(r0, r1, r2)
+# define ldxai_uc(r0, r1, i0) _ldxai_uc(_jit, r0, r1, i0)
+static void _ldxai_uc(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+# define ldxar_s(r0, r1, r2) generic_ldxar_s(r0, r1, r2)
+# define ldxai_s(r0, r1, i0) _ldxai_s(_jit, r0, r1, i0)
+static void _ldxai_s(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+# define ldxar_us(r0, r1, r2) generic_ldxar_us(r0, r1, r2)
+# define ldxai_us(r0, r1, i0) _ldxai_us(_jit, r0, r1, i0)
+static void _ldxai_us(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+# define ldxar_i(r0, r1, r2) generic_ldxar_i(r0, r1, r2)
+# define ldxai_i(r0, r1, i0) _ldxai_i(_jit, r0, r1, i0)
+static void _ldxai_i(jit_state_t*, jit_int32_t, jit_int32_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)
@@ -1227,6 +1365,24 @@ static void _stxi_i(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
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 stxbr_c(r0, r1, r2) generic_stxbr_c(r0, r1, r2)
+# define stxbi_c(i0, r0, r1) _stxbi_c(_jit, i0, r0, r1)
+static void _stxbi_c(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
+# define stxbr_s(r0, r1, r2) generic_stxbr_s(r0, r1, r2)
+# define stxbi_s(i0, r0, r1) _stxbi_s(_jit, i0, r0, r1)
+static void _stxbi_s(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
+# define stxbr_i(r0, r1, r2) generic_stxbr_i(r0, r1, r2)
+# define stxbi_i(i0, r0, r1) _stxbi_i(_jit, i0, r0, r1)
+static void _stxbi_i(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
+# define stxar_c(r0, r1, r2) generic_stxar_c(r0, r1, r2)
+# define stxai_c(i0, r0, r1) _stxai_c(_jit, i0, r0, r1)
+static void _stxai_c(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
+# define stxar_s(r0, r1, r2) generic_stxar_s(r0, r1, r2)
+# define stxai_s(i0, r0, r1) _stxai_s(_jit, i0, r0, r1)
+static void _stxai_s(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
+# define stxar_i(r0, r1, r2) generic_stxar_i(r0, r1, r2)
+# define stxai_i(i0, r0, r1) _stxai_i(_jit, i0, r0, r1)
+static void _stxai_i(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_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)
@@ -3826,6 +3982,214 @@ _unldi_u(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0, jit_word_t i1)
}
static void
+_ldxbi_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ if (i0 >= -255 && i0 <= 255) {
+ if (jit_thumb_p()) {
+ if (i0 >= 0)
+ T2_LDRSBI_B(r0, r1, i0);
+ else
+ T2_LDRSBIN_B(r0, r1, -i0);
+ }
+ else {
+ if (i0 >= 0)
+ LDRSBI_B(r0, r1, i0);
+ else
+ LDRSBIN_B(r0, r1, -i0);
+ }
+ }
+ else
+ generic_ldxbi_c(r0, r1, i0);
+}
+
+static void
+_ldxbi_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ if (jit_thumb_p() && i0 >= -255 && i0 <= 255) {
+ if (i0 >= 0)
+ T2_LDRBI_B(r0, r1, i0);
+ else
+ T2_LDRBIN_B(r0, r1, -i0);
+ }
+ else if (!jit_thumb_p() && i0 >= -4095 && i0 <= 4095) {
+ if (i0 >= 0)
+ LDRBI_B(r0, r1, i0);
+ else
+ LDRBIN_B(r0, r1, -i0);
+ }
+ else
+ generic_ldxbi_uc(r0, r1, i0);
+}
+
+static void
+_ldxbi_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ if (i0 >= -255 && i0 <= 255) {
+ if (jit_thumb_p()) {
+ if (i0 >= 0)
+ T2_LDRSHI_B(r0, r1, i0);
+ else
+ T2_LDRSHIN_B(r0, r1, -i0);
+ }
+ else {
+ if (i0 >= 0)
+ LDRSHI_B(r0, r1, i0);
+ else
+ LDRSHIN_B(r0, r1, -i0);
+ }
+ }
+ else
+ generic_ldxbi_s(r0, r1, i0);
+}
+
+static void
+_ldxbi_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ if (i0 >= -255 && i0 <= 255) {
+ if (jit_thumb_p()) {
+ if (i0 >= 0)
+ T2_LDRHI_B(r0, r1, i0);
+ else
+ T2_LDRHIN_B(r0, r1, -i0);
+ }
+ else {
+ if (i0 >= 0)
+ LDRHI_B(r0, r1, i0);
+ else
+ LDRHIN_B(r0, r1, -i0);
+ }
+ }
+ else
+ generic_ldxbi_us(r0, r1, i0);
+}
+
+static void
+_ldxbi_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ if (jit_thumb_p() && i0 >= -255 && i0 <= 255) {
+ if (i0 >= 0)
+ T2_LDRI_B(r0, r1, i0);
+ else
+ T2_LDRIN_B(r0, r1, -i0);
+ }
+ else if (!jit_thumb_p() && i0 >= -4095 && i0 <= 4095) {
+ if (i0 >= 0)
+ LDRI_B(r0, r1, i0);
+ else
+ LDRIN_B(r0, r1, -i0);
+ }
+ else
+ generic_ldxbi_i(r0, r1, i0);
+}
+
+static void
+_ldxai_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ if (jit_post_index_p() && i0 >= -255 && i0 <= 255) {
+ if (jit_thumb_p()) {
+ if (i0 >= 0)
+ T2_LDRSBI_A(r0, r1, i0);
+ else
+ T2_LDRSBIN_A(r0, r1, -i0);
+ }
+ else {
+ if (i0 >= 0)
+ LDRSBI_A(r0, r1, i0);
+ else
+ LDRSBIN_A(r0, r1, -i0);
+ }
+ }
+ else
+ generic_ldxai_c(r0, r1, i0);
+}
+
+static void
+_ldxai_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ if (jit_post_index_p() &&
+ jit_thumb_p() && i0 >= -255 && i0 <= 255) {
+ if (jit_thumb_p()) {
+ if (i0 >= 0)
+ T2_LDRBI_A(r0, r1, i0);
+ else
+ T2_LDRBIN_A(r0, r1, -i0);
+ }
+ }
+ else if (jit_post_index_p() &&
+ !jit_thumb_p() && i0 >= -4095 && i0 <= 4095) {
+ if (i0 >= 0)
+ LDRBI_A(r0, r1, i0);
+ else
+ LDRBIN_A(r0, r1, -i0);
+ }
+ else
+ generic_ldxai_uc(r0, r1, i0);
+}
+
+static void
+_ldxai_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ if (jit_post_index_p() && i0 >= -255 && i0 <= 255) {
+ if (jit_thumb_p()) {
+ if (i0 >= 0)
+ T2_LDRSHI_A(r0, r1, i0);
+ else
+ T2_LDRSHIN_A(r0, r1, -i0);
+ }
+ else {
+ if (i0 >= 0)
+ LDRSHI_A(r0, r1, i0);
+ else
+ LDRSHIN_A(r0, r1, -i0);
+ }
+ }
+ else
+ generic_ldxai_s(r0, r1, i0);
+}
+
+static void
+_ldxai_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ if (jit_post_index_p() && i0 >= -255 && i0 <= 255) {
+ if (jit_thumb_p()) {
+ if (i0 >= 0)
+ T2_LDRHI_A(r0, r1, i0);
+ else
+ T2_LDRHIN_A(r0, r1, -i0);
+ }
+ else {
+ if (i0 >= 0)
+ LDRHI_A(r0, r1, i0);
+ else
+ LDRHIN_A(r0, r1, -i0);
+ }
+ }
+ else
+ generic_ldxai_us(r0, r1, i0);
+}
+
+static void
+_ldxai_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ if (jit_post_index_p() &&
+ jit_thumb_p() && i0 >= -255 && i0 <= 255) {
+ if (i0 >= 0)
+ T2_LDRI_A(r0, r1, i0);
+ else
+ T2_LDRIN_A(r0, r1, -i0);
+ }
+ else if (jit_post_index_p() &&
+ !jit_thumb_p() && i0 >= -4095 && i0 <= 4095) {
+ if (i0 >= 0)
+ LDRI_A(r0, r1, i0);
+ else
+ LDRIN_A(r0, r1, -i0);
+ }
+ else
+ generic_ldxai_i(r0, r1, i0);
+}
+
+static void
_str_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
if (jit_thumb_p())
@@ -4063,6 +4427,128 @@ _unsti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
}
static void
+_stxbi_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
+{
+ if (jit_thumb_p() && i0 >= -255 && i0 <= 255) {
+ if (i0 >= 0)
+ T2_STRBI_B(r1, r0, i0);
+ else
+ T2_STRBIN_B(r1, r0, -i0);
+ }
+ else if (!jit_thumb_p() && i0 >= -4095 && i0 <= 4095) {
+ if (i0 >= 0)
+ STRBI_B(r1, r0, i0);
+ else
+ STRBIN_B(r1, r0, -i0);
+ }
+ else
+ generic_stxbi_c(i0, r0, r1);
+}
+
+static void
+_stxbi_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
+{
+ if (i0 >= -255 && i0 <= 255) {
+ if (jit_thumb_p()) {
+ if (i0 >= 0)
+ T2_STRHI_B(r1, r0, i0);
+ else
+ T2_STRHIN_B(r1, r0, -i0);
+ }
+ else {
+ if (i0 >= 0)
+ STRHI_B(r1, r0, i0);
+ else
+ STRHIN_B(r1, r0, -i0);
+ }
+ }
+ else
+ generic_stxbi_s(i0, r0, r1);
+}
+
+static void
+_stxbi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
+{
+ if (jit_thumb_p() && i0 >= -255 && i0 <= 255) {
+ if (i0 >= 0)
+ T2_STRI_B(r1, r0, i0);
+ else
+ T2_STRIN_B(r1, r0, -i0);
+ }
+ else if (!jit_thumb_p() && i0 >= -4095 && i0 <= 4095) {
+ if (i0 >= 0)
+ STRI_B(r1, r0, i0);
+ else
+ STRIN_B(r1, r0, -i0);
+ }
+ else
+ generic_stxbi_i(i0, r0, r1);
+}
+
+static void
+_stxai_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
+{
+ if (jit_post_index_p() &&
+ jit_thumb_p() && i0 >= -255 && i0 <= 255) {
+ if (i0 >= 0)
+ T2_STRBI_A(r1, r0, i0);
+ else
+ T2_STRBIN_A(r1, r0, -i0);
+ }
+ else if (jit_post_index_p() &&
+ !jit_thumb_p() && i0 >= -4095 && i0 <= 4095) {
+ if (i0 >= 0)
+ STRBI_A(r1, r0, i0);
+ else
+ STRBIN_A(r1, r0, -i0);
+ }
+ else
+ generic_stxai_c(i0, r0, r1);
+}
+
+static void
+_stxai_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
+{
+ if (jit_post_index_p() &&
+ jit_thumb_p() && i0 >= -255 && i0 <= 255) {
+ if (i0 >= 0)
+ T2_STRHI_A(r1, r0, i0);
+ else
+ T2_STRHIN_A(r1, r0, -i0);
+ }
+ else if (jit_post_index_p() &&
+ !jit_thumb_p() && i0 >= -4095 && i0 <= 4095) {
+ if (i0 >= 0)
+ STRHI_A(r1, r0, i0);
+ else
+ STRHIN_A(r1, r0, -i0);
+ }
+ else
+ generic_stxai_s(i0, r0, r1);
+}
+
+static void
+_stxai_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
+{
+ if (jit_post_index_p() &&
+ jit_thumb_p() && i0 >= -255 && i0 <= 255) {
+ if (i0 >= 0)
+ T2_STRI_A(r1, r0, i0);
+ else
+ T2_STRIN_A(r1, r0, -i0);
+ }
+ else if (jit_post_index_p() &&
+ !jit_thumb_p() && i0 >= -4095 && i0 <= 4095) {
+ if (i0 >= 0)
+ STRI_A(r1, r0, i0);
+ else
+ STRIN_A(r1, r0, -i0);
+ }
+ else
+ generic_stxai_i(i0, r0, r1);
+}
+
+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日 04:39:30 +0000

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