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-cpu.c
diff options
context:
space:
mode:
authorpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2024年01月31日 18:24:36 -0300
committerpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2024年01月31日 18:24:36 -0300
commita03782b2df5835e1735472c8a142baa6cb32ef02 (patch)
tree07f61bfcf1fe1dd8355406ab92a1423f81f26b9f /lib/jit_x86-cpu.c
parent6045d67ff68fe8238a9bb7017eeef6abeeeaaa2c (diff)
downloadlightning-a03782b2df5835e1735472c8a142baa6cb32ef02.tar.gz
x86: Implement optimized post increment load/store
It is only available for a few register combinations and assumes DF is using default/standard value of 0. A new check/cldstxba.c test has been added to validate all valid combinations for x86*, as these cannot be achieved easily with the check/lightning test driver.
Diffstat (limited to 'lib/jit_x86-cpu.c')
-rw-r--r--lib/jit_x86-cpu.c 218
1 files changed, 216 insertions, 2 deletions
diff --git a/lib/jit_x86-cpu.c b/lib/jit_x86-cpu.c
index 126fca6..6957adf 100644
--- a/lib/jit_x86-cpu.c
+++ b/lib/jit_x86-cpu.c
@@ -570,6 +570,45 @@ static void _ldxr_l(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
static void _ldxi_l(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
# endif
# endif
+# define ldxbr_c(r0, r1, r2) generic_ldxbr_c(r0, r1, r2)
+# define ldxbi_c(r0, r1, i0) generic_ldxbi_c(r0, r1, i0)
+# define ldxbr_uc(r0, r1, r2) generic_ldxbr_uc(r0, r1, r2)
+# define ldxbi_uc(r0, r1, i0) generic_ldxbi_uc(r0, r1, i0)
+# define ldxbr_s(r0, r1, r2) generic_ldxbr_s(r0, r1, r2)
+# define ldxbi_s(r0, r1, i0) generic_ldxbi_s(r0, r1, i0)
+# define ldxbr_us(r0, r1, r2) generic_ldxbr_us(r0, r1, r2)
+# define ldxbi_us(r0, r1, i0) generic_ldxbi_us(r0, r1, i0)
+# define ldxbr_i(r0, r1, r2) generic_ldxbr_i(r0, r1, r2)
+# define ldxbi_i(r0, r1, i0) generic_ldxbi_i(r0, r1, i0)
+# if __X64 && !__X64_32
+# define ldxbr_ui(r0, r1, i0) generic_ldxbr_ui(r0, r1, i0)
+# define ldxbi_ui(r0, r1, i0) generic_ldxbi_ui(r0, r1, i0)
+# define ldxbr_l(r0, r1, r2) generic_ldxbr_l(r0, r1, r2)
+# define ldxbi_l(r0, r1, i0) generic_ldxbi_l(r0, r1, i0)
+# endif
+# 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);
+# if __X64 && !__X64_32
+# define ldxar_ui(r0, r1, i0) generic_ldxar_ui(r0, r1, i0)
+# define ldxai_ui(r0, r1, i0) _ldxai_ui(_jit, r0, r1, i0)
+static void _ldxai_ui(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+# define ldxar_l(r0, r1, r2) generic_ldxar_l(r0, r1, r2)
+# define ldxai_l(r0, r1, i0) _ldxai_l(_jit, r0, r1, i0)
+static void _ldxai_l(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+# endif
# define unldr(r0, r1, i0) generic_unldr(r0, r1, i0)
# define unldi(r0, i0, i1) generic_unldi(r0, i0, i1)
# define unldr_u(r0, r1, i0) generic_unldr_u(r0, r1, i0)
@@ -610,8 +649,34 @@ static void _stxr_l(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
# define stxi_l(i0, r0, r1) _stxi_l(_jit, i0, r0, r1)
static void _stxi_l(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
# endif
-#define unstr(r0, r1, i0) generic_unstr(r0, r1, i0)
-#define unsti(i0, r0, i1) generic_unsti(i0, r0, i1)
+# define stxbr_c(r0, r1, r2) generic_stxbr_c(r0, r1, r2)
+# define stxbi_c(i0, r0, r1) generic_stxbi_c(i0, r0, r1)
+# define stxbr_s(r0, r1, r2) generic_stxbr_s(r0, r1, r2)
+# define stxbi_s(i0, r0, r1) generic_stxbi_s(i0, r0, r1)
+# define stxbr_i(r0, r1, r2) generic_stxbr_i(r0, r1, r2)
+# define stxbi_i(i0, r0, r1) generic_stxbi_i(i0, r0, r1)
+# if __X64 && !__X64_32
+# define stxbr_l(r0, r1, r2) generic_stxbr_l(r0, r1, r2)
+# define stxbi_l(i0, r0, r1) generic_stxbi_l(i0, r0, r1)
+# endif
+
+# 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);
+# if __X64 && !__X64_32
+# define stxar_l(r0, r1, r2) generic_stxar_l(r0, r1, r2)
+# define stxai_l(i0, r0, r1) _stxai_l(_jit, i0, r0, r1)
+static void _stxai_l(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
+# endif
+
+# define unstr(r0, r1, i0) generic_unstr(r0, r1, i0)
+# define unsti(i0, r0, i1) generic_unsti(i0, r0, i1)
# define jcc(code, i0) _jcc(_jit, code, i0)
# define jo(i0) jcc(X86_CC_O, i0)
# define jno(i0) jcc(X86_CC_NO, i0)
@@ -3730,6 +3795,104 @@ _ldxi_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
#endif
static void
+_ldxai_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ /* Assume DF = 0 */
+ if (r0 == _RAX_REGNO && r1 == _RSI_REGNO && i0 == 1) {
+ /* lods %rsi, %al */
+ ic(0xac);
+ extr_c(r0, r0);
+ }
+ else
+ generic_ldxai_uc(r0, r1, i0);
+}
+
+static void
+_ldxai_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ /* Assume DF = 0 */
+ if (r0 == _RAX_REGNO && r1 == _RSI_REGNO && i0 == 1) {
+ /* lods %rsi, %al */
+ ic(0xac);
+ extr_uc(r0, r0);
+ }
+ 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)
+{
+ /* Assume DF = 0 */
+ if (r0 == _RAX_REGNO && r1 == _RSI_REGNO && i0 == 2) {
+ /* lods %rsi, %ax */
+ ic(0x66);
+ ic(0xad);
+ extr_s(r0, r0);
+ }
+ else
+ generic_ldxai_us(r0, r1, i0);
+}
+
+static void
+_ldxai_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ /* Assume DF = 0 */
+ if (r0 == _RAX_REGNO && r1 == _RSI_REGNO && i0 == 2) {
+ /* lods %rsi, %ax */
+ ic(0x66);
+ ic(0xad);
+ extr_us(r0, r0);
+ }
+ 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)
+{
+ /* Assume DF = 0 */
+ if (r0 == _RAX_REGNO && r1 == _RSI_REGNO && i0 == 4) {
+ /* lods %rsi, %eax */
+ ic(0xad);
+# if __X64 && !__X64_32
+ extr_i(r0, r0);
+# endif
+ }
+ else
+ generic_ldxai_i(r0, r1, i0);
+}
+
+# if __X64 && !__X64_32
+static void
+_ldxai_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ /* Assume DF = 0 */
+ if (r0 == _RAX_REGNO && r1 == _RSI_REGNO && i0 == 4) {
+ /* lods %rsi, %eax */
+ ic(0xad);
+ extr_ui(r0, r0);
+ }
+ else
+ generic_ldxai_ui(r0, r1, i0);
+}
+
+
+static void
+_ldxai_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+ /* Assume DF = 0 */
+ if (r0 == _RAX_REGNO && r1 == _RSI_REGNO && i0 == 8) {
+ /* lods %rsi, %rax */
+ ic(0x48); /* rex.w */
+ ic(0xad);
+ }
+ else
+ generic_ldxai_l(r0, r1, i0);
+}
+# endif
+
+static void
_str_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
jit_int32_t reg;
@@ -4053,6 +4216,57 @@ _stxi_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
}
#endif
+static void
+_stxai_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
+{
+ /* Assume DF = 0 */
+ if (r0 == _RDI_REGNO && r1 == _RAX_REGNO && i0 == 1)
+ /* stos %al, %rdi */
+ ic(0xaa);
+ 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)
+{
+ /* Assume DF = 0 */
+ if (r0 == _RDI_REGNO && r1 == _RAX_REGNO && i0 == 2) {
+ /* stos %ax, %rdi */
+ ic(0x66);
+ ic(0xab);
+ }
+ 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)
+{
+ /* Assume DF = 0 */
+ if (r0 == _RDI_REGNO && r1 == _RAX_REGNO && i0 == 4)
+ /* stos %eax, %rdi */
+ ic(0xab);
+ else
+ generic_stxai_i(i0, r0, r1);
+}
+
+#if __X64 && !__X64_32
+static void
+_stxai_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
+{
+ /* Assume DF = 0 */
+ if (r0 == _RDI_REGNO && r1 == _RAX_REGNO && i0 == 8) {
+ /* rex.w */
+ ic(0x48);
+ /* stos %rax, %rdi */
+ ic(0xab);
+ }
+ else
+ generic_stxai_l(i0, r0, r1);
+}
+#endif
+
static jit_word_t
_jccs(jit_state_t *_jit, jit_int32_t code, jit_word_t i0)
{
generated by cgit v1.2.3 (git 2.25.1) at 2025年09月18日 19:23:35 +0000

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