lightning
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Lightning] [RFC PATCH] Add bswap_us, bswap_ui, and bswap_ul API fun


From: Paul Cercueil
Subject: Re: [Lightning] [RFC PATCH] Add bswap_us, bswap_ui, and bswap_ul API functions
Date: Sat, 14 Sep 2019 09:57:10 +0200

Hi,

Any feedback about that patch? :)

Thanks,
-Paul



Le lun. 2 sept. 2019 à 13:38, Paul Cercueil <address@hidden> a écrit :
The difference between bswap and htonr/ntohr, is that the operation
performed by bswap does not depend on the endianness of the host CPU.

Unfortunately this breaks HPPA as it didn't have any existing htonr
implementation.

Signed-off-by: Paul Cercueil <address@hidden>
---
 doc/body.texi          |  8 ++++++++
 include/lightning.h.in | 12 ++++++++++++
 lib/jit_aarch64-cpu.c  | 26 +++++++++-----------------
 lib/jit_aarch64-sz.c   |  3 +++
 lib/jit_alpha-cpu.c    | 24 +++++++++---------------
 lib/jit_alpha-sz.c     |  3 +++
 lib/jit_arm-cpu.c      | 19 ++++++-------------
 lib/jit_arm-sz.c       |  6 ++++++
 lib/jit_hppa-cpu.c     |  7 +------
 lib/jit_hppa-sz.c      |  3 +++
 lib/jit_ia64-cpu.c     | 22 +++++++---------------
 lib/jit_ia64-sz.c      |  3 +++
 lib/jit_mips-cpu.c     | 36 ++++++++++++------------------------
 lib/jit_mips-sz.c      | 13 +++++++++++--
 lib/jit_names.c        |  2 ++
 lib/jit_ppc-cpu.c      | 38 +++++++++++++-------------------------
 lib/jit_ppc-sz.c       | 12 ++++++++++++
 lib/jit_riscv-cpu.c    | 22 +++++++++++-----------
 lib/jit_riscv-sz.c     |  3 +++
 lib/jit_s390-cpu.c     |  7 -------
 lib/jit_s390-sz.c      |  6 ++++++
 lib/jit_sparc-cpu.c    |  7 +------
 lib/jit_sparc-sz.c     |  6 ++++++
 lib/jit_x86-cpu.c      | 18 +++++++++---------
 lib/jit_x86-sz.c       | 12 ++++++++++++
 lib/lightning.c        | 17 +++++++++++++++++
 26 files changed, 185 insertions(+), 150 deletions(-)

diff --git a/doc/body.texi b/doc/body.texi
index 60f5692..9cc4cd4 100644
--- a/doc/body.texi
+++ b/doc/body.texi
@@ -365,6 +365,14 @@ htonr _us _ui _ul @r{Host-to-network (big endian) order}
 ntohr    _us _ui _ul @r{Network-to-host order }
 @end example

+@code{bswap} can be used to unconditionally byte-swap an operand.
+On little-endian architectures, @code{htonr} and @code{ntohr} resolve
+to this.
+The @code{_ul} variant is only available in 64-bit architectures.
+@example
+bswap    _us _ui _ul  01 = bswap(02)
+@end example
+
 @item Load operations
 @code{ld} accepts two operands while @code{ldx} accepts three;
 in both cases, the last can be either a register or an immediate
diff --git a/include/lightning.h.in b/include/lightning.h.in
index a78ca17..b2bd36b 100644
--- a/include/lightning.h.in
+++ b/include/lightning.h.in
@@ -873,6 +873,18 @@ typedef enum {
 #define jit_retval_d(u)                _jit_retval_d(_jit,u)
     jit_code_retval_d,

+#define jit_bswap_us(u,v)      jit_new_node_ww(jit_code_bswap_us,u,v)
+    jit_code_bswap_us,
+#define jit_bswap_ui(u,v)      jit_new_node_ww(jit_code_bswap_ui,u,v)
+    jit_code_bswap_ui,
+#define jit_bswap_ul(u,v)      jit_new_node_ww(jit_code_bswap_ul,u,v)
+    jit_code_bswap_ul,
+#if __WORDSIZE == 32
+#define jit_bswap(u,v)         jit_new_node_ww(jit_code_bswap_ui,u,v)
+#else
+#define jit_bswap(u,v)         jit_new_node_ww(jit_code_bswap_ul,u,v)
+#endif
+
     /* Special internal backend specific codes */
     jit_code_movr_w_f,         jit_code_movr_ww_d,     /* w* -> f|d */
 #define jit_movr_w_f(u, v)     jit_new_node_ww(jit_code_movr_w_f, u, v)
diff --git a/lib/jit_aarch64-cpu.c b/lib/jit_aarch64-cpu.c
index 07b0edb..de74fe2 100644
--- a/lib/jit_aarch64-cpu.c
+++ b/lib/jit_aarch64-cpu.c
@@ -657,17 +657,11 @@ static void _stxi_i(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
 #  define stxr_l(r0,r1,r2)             STR(r2,r1,r0)
 #  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);
-#  if __BYTE_ORDER == __LITTLE_ENDIAN
-#  define htonr_us(r0,r1)              _htonr_us(_jit,r0,r1)
-static void _htonr_us(jit_state_t*,jit_int32_t,jit_int32_t);
-#  define htonr_ui(r0,r1)              _htonr_ui(_jit,r0,r1)
-static void _htonr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
-#    define htonr_ul(r0,r1)            REV(r0,r1)
-#  else
-#    define htonr_us(r0,r1)            extr_us(r0,r1)
-#    define htonr_ui(r0,r1)            extr_ui(r0,r1)
-#    define htonr_ul(r0,r1)            movr(r0,r1)
-#  endif
+#  define bswap_us(r0,r1)              _bswap_us(_jit,r0,r1)
+static void _bswap_us(jit_state_t*,jit_int32_t,jit_int32_t);
+#  define bswap_ui(r0,r1)              _bswap_ui(_jit,r0,r1)
+static void _bswap_ui(jit_state_t*,jit_int32_t,jit_int32_t);
+#  define bswap_ul(r0,r1)              REV(r0,r1)
 #  define extr_c(r0,r1)                        SXTB(r0,r1)
 #  define extr_uc(r0,r1)               UXTB(r0,r1)
 #  define extr_s(r0,r1)                        SXTH(r0,r1)
@@ -1441,21 +1435,19 @@ _xori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
     }
 }

-#if __BYTE_ORDER == __LITTLE_ENDIAN
 static void
-_htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
-    htonr_ul(r0, r1);
+    bswap_ul(r0, r1);
     rshi_u(r0, r0, 48);
 }

 static void
-_htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
-    htonr_ul(r0, r1);
+    bswap_ul(r0, r1);
     rshi_u(r0, r0, 32);
 }
-#endif

 static void
 _ldi_c(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
diff --git a/lib/jit_aarch64-sz.c b/lib/jit_aarch64-sz.c
index 7e22e0e..0d74988 100644
--- a/lib/jit_aarch64-sz.c
+++ b/lib/jit_aarch64-sz.c
@@ -390,6 +390,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    8, /* bswap_us */
+    8, /* bswap_ui */
+    4, /* bswap_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/jit_alpha-cpu.c b/lib/jit_alpha-cpu.c
index a590290..4c7cefa 100644
--- a/lib/jit_alpha-cpu.c
+++ b/lib/jit_alpha-cpu.c
@@ -622,18 +622,12 @@ static void _extr_us(jit_state_t*,jit_int32_t,jit_int32_t);
 static void _extr_i(jit_state_t*,jit_int32_t,jit_int32_t);
 #  define extr_ui(r0,r1)               _extr_ui(_jit,r0,r1)
 static void _extr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
-#  if __BYTE_ORDER == __LITTLE_ENDIAN
-#    define htonr_us(r0,r1)            _htonr_us(_jit,r0,r1)
-static void _htonr_us(jit_state_t*,jit_int32_t,jit_int32_t);
-#    define htonr_ui(r0,r1)            _htonr_ui(_jit,r0,r1)
-static void _htonr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
-#    define htonr_ul(r0,r1)            _htonr_ul(_jit,r0,r1)
-static void _htonr_ul(jit_state_t*,jit_int32_t,jit_int32_t);
-#  else
-#    define htonr_us(r0,r1)            extr_us(r0,r1)
-#    define htonr_ui(r0,r1)            extr_ui(r0,r1)
-#    define htonr_ul(r0,r1)            movr(r0,r1)
-#  endif
+#  define bswap_us(r0,r1)              _bswap_us(_jit,r0,r1)
+static void _bswap_us(jit_state_t*,jit_int32_t,jit_int32_t);
+#  define bswap_ui(r0,r1)              _bswap_ui(_jit,r0,r1)
+static void _bswap_ui(jit_state_t*,jit_int32_t,jit_int32_t);
+#  define bswap_ul(r0,r1)              _bswap_ul(_jit,r0,r1)
+static void _bswap_ul(jit_state_t*,jit_int32_t,jit_int32_t);
 #  define jmpr(r0)                     JMP(_R31_REGNO,r0,0)
 #  define jmpi(i0)                     _jmpi(_jit,i0)
 static void _jmpi(jit_state_t*, jit_word_t);
@@ -2453,7 +2447,7 @@ _extr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 }

 static void
-_htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                t0;
     t0 = jit_get_reg(jit_class_gpr);
@@ -2465,7 +2459,7 @@ _htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 }

 static void
-_htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                t0;
     jit_int32_t                t1;
@@ -2491,7 +2485,7 @@ _htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 }

 static void
-_htonr_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                t0;
     jit_int32_t                t1;
diff --git a/lib/jit_alpha-sz.c b/lib/jit_alpha-sz.c
index e1a572a..1bbfaef 100644
--- a/lib/jit_alpha-sz.c
+++ b/lib/jit_alpha-sz.c
@@ -390,6 +390,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    16,        /* bswap_us */
+    36,        /* bswap_ui */
+    36,        /* bswap_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/jit_arm-cpu.c b/lib/jit_arm-cpu.c
index 6f06965..6dabd48 100644
--- a/lib/jit_arm-cpu.c
+++ b/lib/jit_arm-cpu.c
@@ -1091,15 +1091,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);
-#  if __BYTE_ORDER == __LITTLE_ENDIAN
-#  define htonr_us(r0,r1)              _htonr_us(_jit,r0,r1)
-static void _htonr_us(jit_state_t*,jit_int32_t,jit_int32_t);
-#  define htonr_ui(r0,r1)              _htonr_ui(_jit,r0,r1)
-static void _htonr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
-#  else
-#    define htonr_us(r0,r1)            extr_us(r0,r1)
-#    define htonr(r0,r1)               movr(r0,r1)
-#  endif
+#  define bswap_us(r0,r1)              _bswap_us(_jit,r0,r1)
+static void _bswap_us(jit_state_t*,jit_int32_t,jit_int32_t);
+#  define bswap_ui(r0,r1)              _bswap_ui(_jit,r0,r1)
+static void _bswap_ui(jit_state_t*,jit_int32_t,jit_int32_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)
@@ -3576,9 +3571,8 @@ _stxi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
     }
 }

-#  if __BYTE_ORDER == __LITTLE_ENDIAN
 static void
-_htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                t0;
     if (jit_thumb_p()) {
@@ -3607,7 +3601,7 @@ _htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)

 /* inline glibc htonl (without register clobber) */
 static void
-_htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                reg;
     if (jit_thumb_p()) {
@@ -3629,7 +3623,6 @@ _htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
        }
     }
 }
-#endif

 static void
 _extr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
diff --git a/lib/jit_arm-sz.c b/lib/jit_arm-sz.c
index 9f0d012..b70c3ea 100644
--- a/lib/jit_arm-sz.c
+++ b/lib/jit_arm-sz.c
@@ -391,6 +391,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    8, /* bswap_us */
+    4, /* bswap_ui */
+    0, /* bswap_ul */
     0, /* movr_w_f */
     4, /* movr_ww_d */
     0, /* movr_w_d */
@@ -795,6 +798,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    20,        /* bswap_us */
+    16,        /* bswap_ui */
+    0, /* bswap_ul */
     4, /* movr_w_f */
     8, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/jit_hppa-cpu.c b/lib/jit_hppa-cpu.c
index fab5742..b76dc34 100644
--- a/lib/jit_hppa-cpu.c
+++ b/lib/jit_hppa-cpu.c
@@ -654,12 +654,7 @@ static jit_word_t _movi_p(jit_state_t*,jit_int32_t,jit_word_t);
 #define extr_uc(r0,r1)         EXTRWR_U(r1,31,8,r0)
 #define extr_s(r0,r1)          EXTRWR(r1,31,16,r0)
 #define extr_us(r0,r1)         EXTRWR_U(r1,31,16,r0)
-#if __BYTE_ORDER == __BIG_ENDIAN
-#  define htonr_us(r0,r1)      extr_us(r0,r1)
-#  define htonr_ui(r0,r1)      movr(r0,r1)
-#else
-#  error need htonr implementation
-#endif
+#error need bswap implementation
 #define addr(r0,r1,r2)         ADD(r1,r2,r0)
 #define addi(r0,r1,i0)         _addi(_jit,r0,r1,i0)
 static void _addi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
diff --git a/lib/jit_hppa-sz.c b/lib/jit_hppa-sz.c
index 3c04f63..85f3da9 100644
--- a/lib/jit_hppa-sz.c
+++ b/lib/jit_hppa-sz.c
@@ -390,6 +390,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    4, /* bswap_us */
+    4, /* bswap_ui */
+    0, /* bswap_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/jit_ia64-cpu.c b/lib/jit_ia64-cpu.c
index 8372b24..e2763c1 100644
--- a/lib/jit_ia64-cpu.c
+++ b/lib/jit_ia64-cpu.c
@@ -1307,17 +1307,11 @@ static void _movr(jit_state_t*,jit_int32_t,jit_int32_t);
 static void _movi(jit_state_t*,jit_int32_t,jit_word_t);
 #define movi_p(r0,i0)                  _movi_p(_jit,r0,i0)
 static jit_word_t _movi_p(jit_state_t*,jit_int32_t,jit_word_t);
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-#  define htonr_us(r0,r1)              _htonr_us(_jit,r0,r1)
-static void _htonr_us(jit_state_t*,jit_int32_t,jit_int32_t);
-#  define htonr_ui(r0,r1)              _htonr_ui(_jit,r0,r1)
-static void _htonr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
-#  define htonr_ul(r0,r1)              MUX1(r0,r1,MUX_REV)
-#else
-#  define htonr_us(r0,r1)              extr_us(r0,r1)
-#  define htonr_ui(r0,r1)              extr_ui(r0,r1)
-#  define htonr_ul(r0,r1)              movr(r0,r1)
-#endif
+#  define bswap_us(r0,r1)              _bswap_us(_jit,r0,r1)
+static void _bswap_us(jit_state_t*,jit_int32_t,jit_int32_t);
+#  define bswap_ui(r0,r1)              _bswap_ui(_jit,r0,r1)
+static void _bswap_ui(jit_state_t*,jit_int32_t,jit_int32_t);
+#  define bswap_ul(r0,r1)              MUX1(r0,r1,MUX_REV)
 #define extr_c(r0,r1)                  SXT1(r0,r1)
 #define extr_uc(r0,r1)                 ZXT1(r0,r1)
 #define extr_s(r0,r1)                  SXT2(r0,r1)
@@ -3949,9 +3943,8 @@ _xori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
     }
 }

-#if __BYTE_ORDER == __LITTLE_ENDIAN
 static void
-_htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                t0;
     t0 = jit_get_reg(jit_class_gpr);
@@ -3964,7 +3957,7 @@ _htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 }

 static void
-_htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                t0;
     jit_int32_t                t1;
@@ -3989,7 +3982,6 @@ _htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
     jit_unget_reg(t1);
     jit_unget_reg(t0);
 }
-#endif

 static void
_lshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
diff --git a/lib/jit_ia64-sz.c b/lib/jit_ia64-sz.c
index 59826d9..18fe0b7 100644
--- a/lib/jit_ia64-sz.c
+++ b/lib/jit_ia64-sz.c
@@ -390,6 +390,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    64,        /* bswap_us */
+    160,       /* bswap_ui */
+    16,        /* bswap_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/jit_mips-cpu.c b/lib/jit_mips-cpu.c
index 2b529f2..86c3d7c 100644
--- a/lib/jit_mips-cpu.c
+++ b/lib/jit_mips-cpu.c
@@ -584,23 +584,13 @@ 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
-#  if __BYTE_ORDER == __LITTLE_ENDIAN
-#    define htonr_us(r0,r1)            _htonr_us(_jit,r0,r1)
-static void _htonr_us(jit_state_t*,jit_int32_t,jit_int32_t);
-#    define htonr_ui(r0,r1)            _htonr_ui(_jit,r0,r1)
-static void _htonr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
-#    if __WORDSIZE == 64
-#      define htonr_ul(r0,r1)          _htonr_ul(_jit,r0,r1)
-static void _htonr_ul(jit_state_t*,jit_int32_t,jit_int32_t);
-#    endif
-#  else
-#    define htonr_us(r0,r1)            extr_us(r0,r1)
-#    if __WORDSIZE == 32
-#      define htonr_ui(r0,r1)          movr(r0,r1)
-#    else
-#      define htonr_ui(r0,r1)          extr_ui(r0,r1)
-#      define htonr_ul(r0,r1)          movr(r0,r1)
-#    endif
+#  define bswap_us(r0,r1)              _bswap_us(_jit,r0,r1)
+static void _bswap_us(jit_state_t*,jit_int32_t,jit_int32_t);
+#  define bswap_ui(r0,r1)              _bswap_ui(_jit,r0,r1)
+static void _bswap_ui(jit_state_t*,jit_int32_t,jit_int32_t);
+#  if __WORDSIZE == 64
+#    define bswap_ul(r0,r1)            _bswap_ul(_jit,r0,r1)
+static void _bswap_ul(jit_state_t*,jit_int32_t,jit_int32_t);
 #  endif
 #  define extr_c(r0,r1)                        _extr_c(_jit,r0,r1)
 static void _extr_c(jit_state_t*,jit_int32_t,jit_int32_t);
@@ -1678,9 +1668,8 @@ _stxi_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
 }
 #endif

-#  if __BYTE_ORDER == __LITTLE_ENDIAN
 static void
-_htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                t0;
     t0 = jit_get_reg(jit_class_gpr);
@@ -1693,7 +1682,7 @@ _htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 }

 static void
-_htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                t0;
     jit_int32_t                t1;
@@ -1720,18 +1709,17 @@ _htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 }

 static void
-_htonr_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                reg;
     reg = jit_get_reg(jit_class_gpr);
     rshi_u(rn(reg), r1, 32);
-    htonr_ui(r0, r1);
-    htonr_ui(rn(reg), rn(reg));
+    bswap_ui(r0, r1);
+    bswap_ui(rn(reg), rn(reg));
     lshi(r0, r0, 32);
     orr(r0, r0, rn(reg));
     jit_unget_reg(reg);
 }
-#  endif

 static void
 _extr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
diff --git a/lib/jit_mips-sz.c b/lib/jit_mips-sz.c
index 613aa00..be1998c 100644
--- a/lib/jit_mips-sz.c
+++ b/lib/jit_mips-sz.c
@@ -1,7 +1,7 @@

 #if __WORDSIZE == 32
 #if NEW_ABI
-#define JIT_INSTR_MAX 44
+#define JIT_INSTR_MAX 52
     0, /* data */
     0, /* live */
     0, /* align */
@@ -391,6 +391,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    20,        /* bswap_us */
+    52,        /* bswap_ui */
+    0, /* bswap_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
@@ -795,6 +798,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    20,        /* bswap_us */
+    52,        /* bswap_ui */
+    0, /* bswap_ul */
     4, /* movr_w_f */
     8, /* movr_ww_d */
     0, /* movr_w_d */
@@ -808,7 +814,7 @@
 #endif /* __WORDSIZE */

 #if __WORDSIZE == 64
-#define JIT_INSTR_MAX 44
+#define JIT_INSTR_MAX 116
     0, /* data */
     0, /* live */
     4, /* align */
@@ -1198,6 +1204,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    20,        /* bswap_us */
+    52,        /* bswap_ui */
+    116,       /* bswap_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/jit_names.c b/lib/jit_names.c
index ba09a6a..31df23a 100644
--- a/lib/jit_names.c
+++ b/lib/jit_names.c
@@ -222,6 +222,8 @@ static char *code_name[] = {
     "pushargr_d",    "pushargi_d",
     "retr_d",                "reti_d",
     "retval_d",
+    "bswap_us",
+    "bswap_ui",              "bswap_ul",
     "movr_w_f",              "movr_ww_d",
     "movr_w_d",
     "movr_f_w",              "movi_f_w",
diff --git a/lib/jit_ppc-cpu.c b/lib/jit_ppc-cpu.c
index 0fb6959..cf8df81 100644
--- a/lib/jit_ppc-cpu.c
+++ b/lib/jit_ppc-cpu.c
@@ -509,23 +509,13 @@ static jit_word_t _movi_p(jit_state_t*,jit_int32_t,jit_word_t);
 #    define extr_i(r0,r1)              EXTSW(r0,r1)
 #    define extr_ui(r0,r1)             CLRLDI(r0,r1,32)
 #  endif
-#  if __BYTE_ORDER == __BIG_ENDIAN
-#    define htonr_us(r0,r1)            extr_us(r0,r1)
-#    if __WORDSIZE == 32
-#      define htonr_ui(r0,r1)          movr(r0,r1)
-#    else
-#      define htonr_ui(r0,r1)          extr_ui(r0,r1)
-#      define htonr_ul(r0,r1)          movr(r0,r1)
-#    endif
-#  else
-#    define htonr_us(r0,r1)            _htonr_us(_jit,r0,r1)
-static void _htonr_us(jit_state_t*,jit_int32_t,jit_int32_t);
-#    define htonr_ui(r0,r1)            _htonr_ui(_jit,r0,r1)
-static void _htonr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
-#    if __WORDSIZE == 64
-#      define htonr_ul(r0,r1)          _htonr_ul(_jit,r0,r1)
-static void _htonr_ul(jit_state_t*,jit_int32_t,jit_int32_t);
-#    endif
+#  define bswap_us(r0,r1)              _bswap_us(_jit,r0,r1)
+static void _bswap_us(jit_state_t*,jit_int32_t,jit_int32_t);
+#  define bswap_ui(r0,r1)              _bswap_ui(_jit,r0,r1)
+static void _bswap_ui(jit_state_t*,jit_int32_t,jit_int32_t);
+#  if __WORDSIZE == 64
+#    define bswap_ul(r0,r1)            _bswap_ul(_jit,r0,r1)
+static void _bswap_ul(jit_state_t*,jit_int32_t,jit_int32_t);
 #  endif
 #  define addr(r0,r1,r2)               ADD(r0,r1,r2)
 #  define addi(r0,r1,i0)               _addi(_jit,r0,r1,i0)
@@ -1119,9 +1109,8 @@ _movi_p(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
     return (word);
 }

-#  if __BYTE_ORDER == __LITTLE_ENDIAN
 static void
-_htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                t0;
     t0 = jit_get_reg(jit_class_gpr);
@@ -1134,7 +1123,7 @@ _htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 }

 static void
-_htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                reg;
     reg = jit_get_reg(jit_class_gpr);
@@ -1145,20 +1134,19 @@ _htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
     jit_unget_reg(reg);
 }

-#    if __WORDSIZE == 64
+#  if __WORDSIZE == 64
 static void
-_htonr_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                reg;
     reg = jit_get_reg(jit_class_gpr);
     rshi_u(rn(reg), r1, 32);
-    htonr_ui(r0, r1);
-    htonr_ui(rn(reg), rn(reg));
+    bswap_ui(r0, r1);
+    bswap_ui(rn(reg), rn(reg));
     lshi(r0, r0, 32);
     orr(r0, r0, rn(reg));
     jit_unget_reg(reg);
 }
-#    endif
 #  endif

 static void
diff --git a/lib/jit_ppc-sz.c b/lib/jit_ppc-sz.c
index 22a6e25..c298569 100644
--- a/lib/jit_ppc-sz.c
+++ b/lib/jit_ppc-sz.c
@@ -391,6 +391,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    20,        /* bswap_us */
+    16,        /* bswap_ui */
+    0, /* bswap_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
@@ -796,6 +799,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    20,        /* bswap_us */
+    16,        /* bswap_ui */
+    0, /* bswap_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
@@ -1202,6 +1208,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    20,        /* bswap_us */
+    16,        /* bswap_ui */
+    44,        /* bswap_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
@@ -1608,6 +1617,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    20,        /* bswap_us */
+    16,        /* bswap_ui */
+    44,        /* bswap_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/jit_riscv-cpu.c b/lib/jit_riscv-cpu.c
index 388489f..5959f55 100644
--- a/lib/jit_riscv-cpu.c
+++ b/lib/jit_riscv-cpu.c
@@ -434,12 +434,12 @@ static void _stxi_i(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t); 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);
-#  define htonr_us(r0, r1)             _htonr_us(_jit, r0, r1)
-static void _htonr_us(jit_state_t*,jit_int32_t,jit_int32_t);
-#  define htonr_ui(r0, r1)             _htonr_ui(_jit, r0, r1)
-static void _htonr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
-#  define htonr_ul(r0, r1)             _htonr_ul(_jit, r0, r1)
-static void _htonr_ul(jit_state_t*,jit_int32_t,jit_int32_t);
+#  define bswap_us(r0, r1)             _bswap_us(_jit, r0, r1)
+static void _bswap_us(jit_state_t*,jit_int32_t,jit_int32_t);
+#  define bswap_ui(r0, r1)             _bswap_ui(_jit, r0, r1)
+static void _bswap_ui(jit_state_t*,jit_int32_t,jit_int32_t);
+#  define bswap_ul(r0, r1)             _bswap_ul(_jit, r0, r1)
+static void _bswap_ul(jit_state_t*,jit_int32_t,jit_int32_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)              andi(r0, r1, 0xff)
@@ -1244,7 +1244,7 @@ DEFST(i, W)
 DEFST(l, D)

 static void
-_htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                t0;
     t0 = jit_get_reg(jit_class_gpr);
@@ -1257,7 +1257,7 @@ _htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 }

 static void
-_htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                t0;
     jit_int32_t                t1;
@@ -1284,13 +1284,13 @@ _htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 }

 static void
-_htonr_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                t0;
     t0 = jit_get_reg(jit_class_gpr);
     rshi_u(rn(t0), r1, 32);
-    htonr_ui(r0, r1);
-    htonr_ui(rn(t0), rn(t0));
+    bswap_ui(r0, r1);
+    bswap_ui(rn(t0), rn(t0));
     lshi(r0, r0, 32);
     orr(r0, r0, rn(t0));
     jit_unget_reg(t0);
diff --git a/lib/jit_riscv-sz.c b/lib/jit_riscv-sz.c
index 2f1d725..049f1ed 100644
--- a/lib/jit_riscv-sz.c
+++ b/lib/jit_riscv-sz.c
@@ -389,6 +389,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    20,        /* bswap_us */
+    52,        /* bswap_ui */
+    116,       /* bswap_ul */
     4, /* movr_w_f */
     0, /* movr_ww_d */
     4, /* movr_w_d */
diff --git a/lib/jit_s390-cpu.c b/lib/jit_s390-cpu.c
index 824a2c6..f8342e2 100644
--- a/lib/jit_s390-cpu.c
+++ b/lib/jit_s390-cpu.c
@@ -1079,13 +1079,6 @@ static void _ori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
 static void _xorr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
 #  define xori(r0,r1,i0)               _xori(_jit,r0,r1,i0)
 static void _xori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
-#  define htonr_us(r0,r1)              extr_us(r0,r1)
-#  if __WORDSIZE == 32
-#    define htonr_ui(r0,r1)            movr(r0,r1)
-#  else
-#    define htonr_ui(r0,r1)            extr_ui(r0,r1)
-#    define htonr_ul(r0,r1)            movr(r0,r1)
-#  endif
 #  define extr_c(r0,r1)                        LGBR(r0,r1)
 #  define extr_uc(r0,r1)               LLGCR(r0,r1)
 #  define extr_s(r0,r1)                        LGHR(r0,r1)
diff --git a/lib/jit_s390-sz.c b/lib/jit_s390-sz.c
index bb8b2dc..e552427 100644
--- a/lib/jit_s390-sz.c
+++ b/lib/jit_s390-sz.c
@@ -390,6 +390,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    4, /* bswap_us */
+    4, /* bswap_ui */
+    4, /* bswap_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
@@ -792,6 +795,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    4, /* bswap_us */
+    4, /* bswap_ui */
+    4, /* bswap_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/jit_sparc-cpu.c b/lib/jit_sparc-cpu.c
index a4d88d1..d2ed309 100644
--- a/lib/jit_sparc-cpu.c
+++ b/lib/jit_sparc-cpu.c
@@ -669,7 +669,6 @@ static void _xori(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
 #    define rshr_u(r0, r1, r2)         SRLX(r1, r2, r0)
 #    define rshi_u(r0, r1, i0)         SRLXI(r1, i0, r0)
 #  endif
-#  define htonr_us(r0,r1)              extr_us(r0,r1)
 #  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)               andi(r0, r1, 0xff)
@@ -677,11 +676,7 @@ static void _extr_c(jit_state_t*,jit_int32_t,jit_int32_t);
 static void _extr_s(jit_state_t*,jit_int32_t,jit_int32_t);
 #  define extr_us(r0,r1)               _extr_us(_jit,r0,r1)
 static void _extr_us(jit_state_t*,jit_int32_t,jit_int32_t);
-#  if __WORDSIZE == 32
-#    define htonr_ui(r0,r1)            movr(r0,r1)
-#  else
-#    define htonr_ui(r0,r1)            extr_ui(r0,r1)
-#    define htonr_ul(r0,r1)            movr(r0,r1)
+#  if __WORDSIZE == 64
 #    define extr_i(r0,r1)              _extr_i(_jit,r0,r1)
 static void _extr_i(jit_state_t*,jit_int32_t,jit_int32_t);
 #    define extr_ui(r0,r1)             _extr_ui(_jit,r0,r1)
diff --git a/lib/jit_sparc-sz.c b/lib/jit_sparc-sz.c
index ac683b6..1164baa 100644
--- a/lib/jit_sparc-sz.c
+++ b/lib/jit_sparc-sz.c
@@ -389,6 +389,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    8, /* bswap_us */
+    4, /* bswap_ui */
+    0, /* bswap_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
@@ -791,6 +794,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    8, /* bswap_us */
+    8, /* bswap_ui */
+    4, /* bswap_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/jit_x86-cpu.c b/lib/jit_x86-cpu.c
index 18ace1f..e481b89 100644
--- a/lib/jit_x86-cpu.c
+++ b/lib/jit_x86-cpu.c
@@ -375,13 +375,13 @@ static void _movir(jit_state_t*,jit_int32_t,jit_int32_t);
 #    define movir_u(r0, r1)            _movir_u(_jit, r0, r1)
 static void _movir_u(jit_state_t*,jit_int32_t,jit_int32_t);
 #  endif
-#  define htonr_us(r0, r1)             _htonr_us(_jit, r0, r1)
-static void _htonr_us(jit_state_t*,jit_int32_t,jit_int32_t);
-#  define htonr_ui(r0, r1)             _htonr_ui(_jit, r0, r1)
-static void _htonr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
+#  define bswap_us(r0, r1)             _bswap_us(_jit, r0, r1)
+static void _bswap_us(jit_state_t*,jit_int32_t,jit_int32_t);
+#  define bswap_ui(r0, r1)             _bswap_ui(_jit, r0, r1)
+static void _bswap_ui(jit_state_t*,jit_int32_t,jit_int32_t);
 #  if __X64 && !__X64_32
-#define htonr_ul(r0, r1)               _htonr_ul(_jit, r0, r1)
-static void _htonr_ul(jit_state_t*,jit_int32_t,jit_int32_t);
+#define bswap_ul(r0, r1)               _bswap_ul(_jit, r0, r1)
+static void _bswap_ul(jit_state_t*,jit_int32_t,jit_int32_t);
 #endif
 #  define extr_c(r0, r1)               _extr_c(_jit, r0, r1)
 static void _extr_c(jit_state_t*,jit_int32_t,jit_int32_t);
@@ -2220,7 +2220,7 @@ _movir_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 #endif

 static void
-_htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     extr_us(r0, r1);
     ic(0x66);
@@ -2231,7 +2231,7 @@ _htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 }

 static void
-_htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     movr(r0, r1);
     rex(0, 0, _NOREG, _NOREG, r0);
@@ -2241,7 +2241,7 @@ _htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)

 #if __X64 && !__X64_32
 static void
-_htonr_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswap_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     movr(r0, r1);
     rex(0, 1, _NOREG, _NOREG, r0);
diff --git a/lib/jit_x86-sz.c b/lib/jit_x86-sz.c
index 7183e6d..73727b5 100644
--- a/lib/jit_x86-sz.c
+++ b/lib/jit_x86-sz.c
@@ -390,6 +390,9 @@
     0, /* retr_d */
     0, /* reti_d */
     10,        /* retval_d */
+    7, /* bswap_us */
+    4, /* bswap_ui */
+    0, /* bswap_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
@@ -793,6 +796,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    9, /* bswap_us */
+    6, /* bswap_ui */
+    6, /* bswap_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
@@ -1195,6 +1201,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    9, /* bswap_us */
+    6, /* bswap_ui */
+    0, /* bswap_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
@@ -1596,6 +1605,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    9, /* bswap_us */
+    6, /* bswap_ui */
+    6, /* bswap_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/lightning.c b/lib/lightning.c
index ad0fc15..18c10e0 100644
--- a/lib/lightning.c
+++ b/lib/lightning.c
@@ -1376,6 +1376,7 @@ _jit_classify(jit_state_t *_jit, jit_code_t code)
        case jit_code_truncr_f_i:                       case 
jit_code_truncr_f_l:
        case jit_code_truncr_d_i:                       case 
jit_code_truncr_d_l:
case jit_code_htonr_us: case jit_code_htonr_ui: case jit_code_htonr_ul: + case jit_code_bswap_us: case jit_code_bswap_ui: case jit_code_bswap_ul:
        case jit_code_ldr_c:    case jit_code_ldr_uc:
        case jit_code_ldr_s:    case jit_code_ldr_us:   case jit_code_ldr_i:
        case jit_code_ldr_ui:   case jit_code_ldr_l:    case jit_code_negr_f:
@@ -3435,6 +3436,22 @@ _patch_register(jit_state_t *_jit, jit_node_t *node, jit_node_t *link,
     }
 }

+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#  define htonr_us(r0,r1)              bswap_us(r0,r1)
+#  define htonr_ui(r0,r1)              bswap_ui(r0,r1)
+#  if __WORDSIZE == 64
+#    define htonr_ul(r0,r1)            bswap_ul(r0,r1)
+#  endif
+#else
+#  define htonr_us(r0,r1)              extr_us(r0,r1)
+#  if __WORDSIZE == 32
+#    define htonr_ui(r0,r1)            movr(r0,r1)
+#  else
+#    define htonr_ui(r0,r1)            extr_ui(r0,r1)
+#    define htonr_ul(r0,r1)            movr(r0,r1)
+#  endif
+#endif
+
 #if defined(__i386__) || defined(__x86_64__)
 #  include "jit_x86.c"
 #elif defined(__mips__)
--
2.23.0.rc1


_______________________________________________
Lightning mailing list
address@hidden
https://lists.gnu.org/mailman/listinfo/lightning





reply via email to

[Prev in Thread] Current Thread [Next in Thread]