lightning
[Top][All Lists]
Advanced

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

[Lightning] [PATCH 2/3] Add bswapr_us, bswapr_ui, and bswapr_ul API func


From: Paul Cercueil
Subject: [Lightning] [PATCH 2/3] Add bswapr_us, bswapr_ui, and bswapr_ul API functions
Date: Tue, 17 Sep 2019 14:30:16 +0200

The difference between bswapr 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_aarch64.c      |  3 +++
 lib/jit_alpha-cpu.c    | 24 +++++++++---------------
 lib/jit_alpha-sz.c     |  3 +++
 lib/jit_alpha.c        |  3 +++
 lib/jit_arm-cpu.c      | 19 ++++++-------------
 lib/jit_arm-sz.c       |  6 ++++++
 lib/jit_arm.c          |  2 ++
 lib/jit_hppa-cpu.c     |  7 +------
 lib/jit_hppa-sz.c      |  3 +++
 lib/jit_hppa.c         |  2 ++
 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_mips.c         |  5 +++++
 lib/jit_names.c        |  2 ++
 lib/jit_ppc-cpu.c      | 38 +++++++++++++-------------------------
 lib/jit_ppc-sz.c       | 12 ++++++++++++
 lib/jit_ppc.c          |  5 +++++
 lib/jit_riscv-cpu.c    | 22 +++++++++++-----------
 lib/jit_riscv-sz.c     |  3 +++
 lib/jit_riscv.c        |  3 +++
 lib/jit_s390-cpu.c     |  7 -------
 lib/jit_s390-sz.c      |  6 ++++++
 lib/jit_s390.c         |  5 +++++
 lib/jit_sparc-cpu.c    |  7 +------
 lib/jit_sparc-sz.c     |  6 ++++++
 lib/jit_sparc.c        |  5 +++++
 lib/jit_x86-cpu.c      | 18 +++++++++---------
 lib/jit_x86-sz.c       | 12 ++++++++++++
 lib/jit_x86.c          |  5 +++++
 lib/lightning.c        | 17 +++++++++++++++++
 36 files changed, 223 insertions(+), 150 deletions(-)

diff --git a/doc/body.texi b/doc/body.texi
index 60f5692..c24b162 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{bswapr} 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
+bswapr   _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 97ab503..9652843 100644
--- a/include/lightning.h.in
+++ b/include/lightning.h.in
@@ -868,6 +868,18 @@ typedef enum {
 #define jit_retval_d(u)                _jit_retval_d(_jit,u)
     jit_code_retval_d,
 
+#define jit_bswapr_us(u,v)     jit_new_node_ww(jit_code_bswapr_us,u,v)
+    jit_code_bswapr_us,
+#define jit_bswapr_ui(u,v)     jit_new_node_ww(jit_code_bswapr_ui,u,v)
+    jit_code_bswapr_ui,
+#define jit_bswapr_ul(u,v)     jit_new_node_ww(jit_code_bswapr_ul,u,v)
+    jit_code_bswapr_ul,
+#if __WORDSIZE == 32
+#define jit_bswapr(u,v)                jit_new_node_ww(jit_code_bswapr_ui,u,v)
+#else
+#define jit_bswapr(u,v)                jit_new_node_ww(jit_code_bswapr_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..bac2d71 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 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)
+static void _bswapr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
+#  define bswapr_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)
+_bswapr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
-    htonr_ul(r0, r1);
+    bswapr_ul(r0, r1);
     rshi_u(r0, r0, 48);
 }
 
 static void
-_htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_bswapr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
-    htonr_ul(r0, r1);
+    bswapr_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..ec08088 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, /* bswapr_us */
+    8, /* bswapr_ui */
+    4, /* bswapr_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/jit_aarch64.c b/lib/jit_aarch64.c
index 2d0f2b4..90f079f 100644
--- a/lib/jit_aarch64.c
+++ b/lib/jit_aarch64.c
@@ -1128,6 +1128,9 @@ _emit_code(jit_state_t *_jit)
                case_rr(hton, _us);
                case_rr(hton, _ui);
                case_rr(hton, _ul);
+               case_rr(bswap, _us);
+               case_rr(bswap, _ui);
+               case_rr(bswap, _ul);
                case_rr(ext, _c);
                case_rr(ext, _uc);
                case_rr(ext, _s);
diff --git a/lib/jit_alpha-cpu.c b/lib/jit_alpha-cpu.c
index 0e7551f..ae3e961 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 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)
+static void _bswapr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
+#  define bswapr_ul(r0,r1)             _bswapr_ul(_jit,r0,r1)
+static void _bswapr_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)
+_bswapr_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)
+_bswapr_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)
+_bswapr_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..6f479fe 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,        /* bswapr_us */
+    36,        /* bswapr_ui */
+    36,        /* bswapr_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/jit_alpha.c b/lib/jit_alpha.c
index e7b1e61..2dfccb8 100644
--- a/lib/jit_alpha.c
+++ b/lib/jit_alpha.c
@@ -1086,6 +1086,9 @@ _emit_code(jit_state_t *_jit)
                case_rr(hton, _us);
                case_rr(hton, _ui);
                case_rr(hton, _ul);
+               case_rr(bswap, _us);
+               case_rr(bswap, _ui);
+               case_rr(bswap, _ul);
                case_rr(ext, _c);
                case_rr(ext, _uc);
                case_rr(ext, _s);
diff --git a/lib/jit_arm-cpu.c b/lib/jit_arm-cpu.c
index 6f06965..0fb2d27 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 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)
+static void _bswapr_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)
+_bswapr_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)
+_bswapr_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..88457f4 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, /* bswapr_us */
+    4, /* bswapr_ui */
+    0, /* bswapr_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,        /* bswapr_us */
+    16,        /* bswapr_ui */
+    0, /* bswapr_ul */
     4, /* movr_w_f */
     8, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/jit_arm.c b/lib/jit_arm.c
index 7578865..83669f1 100644
--- a/lib/jit_arm.c
+++ b/lib/jit_arm.c
@@ -1498,6 +1498,8 @@ _emit_code(jit_state_t *_jit)
                case_wrr(stx, _i);
                case_rr(hton, _us);
                case_rr(hton, _ui);
+               case_rr(bswap, _us);
+               case_rr(bswap, _ui);
                case_rr(ext, _c);
                case_rr(ext, _uc);
                case_rr(ext, _s);
diff --git a/lib/jit_hppa-cpu.c b/lib/jit_hppa-cpu.c
index fab5742..d804a50 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 bswapr 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..52ff0b3 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, /* bswapr_us */
+    4, /* bswapr_ui */
+    0, /* bswapr_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/jit_hppa.c b/lib/jit_hppa.c
index 558524b..45004d1 100644
--- a/lib/jit_hppa.c
+++ b/lib/jit_hppa.c
@@ -1052,6 +1052,8 @@ _emit_code(jit_state_t *_jit)
                case_rr(ext, _us);
                case_rr(hton, _us);
                case_rr(hton, _ui);
+               case_rr(bswap, _us);
+               case_rr(bswap, _ui);
                case_rrr(lt,);
                case_rrw(lt,);
                case_rrr(lt, _u);
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..9c52a41 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 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)
+static void _bswapr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
+#  if __WORDSIZE == 64
+#    define bswapr_ul(r0,r1)           _bswapr_ul(_jit,r0,r1)
+static void _bswapr_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)
+_bswapr_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)
+_bswapr_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)
+_bswapr_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));
+    bswapr_ui(r0, r1);
+    bswapr_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..917512b 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,        /* bswapr_us */
+    52,        /* bswapr_ui */
+    0, /* bswapr_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,        /* bswapr_us */
+    52,        /* bswapr_ui */
+    0, /* bswapr_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,        /* bswapr_us */
+    52,        /* bswapr_ui */
+    116,       /* bswapr_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/jit_mips.c b/lib/jit_mips.c
index 5825f33..856a6b8 100644
--- a/lib/jit_mips.c
+++ b/lib/jit_mips.c
@@ -1419,6 +1419,11 @@ _emit_code(jit_state_t *_jit)
                case_rr(hton, _ui);
 #if __WORDSIZE == 64
                case_rr(hton, _ul);
+#endif
+               case_rr(bswap, _us);
+               case_rr(bswap, _ui);
+#if __WORDSIZE == 64
+               case_rr(bswap, _ul);
 #endif
                case_rr(ext, _c);
                case_rr(ext, _uc);
diff --git a/lib/jit_names.c b/lib/jit_names.c
index ba09a6a..bb6284b 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",
+    "bswapr_us",
+    "bswapr_ui",       "bswapr_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 78eadb2..62ab1da 100644
--- a/lib/jit_ppc-cpu.c
+++ b/lib/jit_ppc-cpu.c
@@ -517,23 +517,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 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)
+static void _bswapr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
+#  if __WORDSIZE == 64
+#    define bswapr_ul(r0,r1)           _bswapr_ul(_jit,r0,r1)
+static void _bswapr_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)
@@ -1138,9 +1128,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)
+_bswapr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                t0;
     t0 = jit_get_reg(jit_class_gpr);
@@ -1153,7 +1142,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)
+_bswapr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                reg;
     reg = jit_get_reg(jit_class_gpr);
@@ -1168,20 +1157,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)
+_bswapr_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));
+    bswapr_ui(r0, r1);
+    bswapr_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 788ac45..f022e45 100644
--- a/lib/jit_ppc-sz.c
+++ b/lib/jit_ppc-sz.c
@@ -392,6 +392,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    20,        /* bswapr_us */
+    16,        /* bswapr_ui */
+    0, /* bswapr_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
@@ -800,6 +803,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    20,        /* bswapr_us */
+    16,        /* bswapr_ui */
+    0, /* bswapr_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
@@ -1207,6 +1213,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    20,        /* bswapr_us */
+    16,        /* bswapr_ui */
+    44,        /* bswapr_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
@@ -1613,6 +1622,9 @@
     0, /* retr_d */
     0, /* reti_d */
     0, /* retval_d */
+    20,        /* bswapr_us */
+    16,        /* bswapr_ui */
+    44,        /* bswapr_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/jit_ppc.c b/lib/jit_ppc.c
index 93c36fb..66ad1fb 100644
--- a/lib/jit_ppc.c
+++ b/lib/jit_ppc.c
@@ -1355,6 +1355,11 @@ _emit_code(jit_state_t *_jit)
                case_rr(hton, _ui);
 #  if __WORDSIZE == 64
                case_rr(hton, _ul);
+#  endif
+               case_rr(bswap, _us);
+               case_rr(bswap, _ui);
+#  if __WORDSIZE == 64
+               case_rr(bswap, _ul);
 #  endif
                case_rr(neg,);
                case_rr(com,);
diff --git a/lib/jit_riscv-cpu.c b/lib/jit_riscv-cpu.c
index 388489f..ef0504e 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 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)
+static void _bswapr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
+#  define bswapr_ul(r0, r1)            _bswapr_ul(_jit, r0, r1)
+static void _bswapr_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)
+_bswapr_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)
+_bswapr_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)
+_bswapr_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));
+    bswapr_ui(r0, r1);
+    bswapr_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..ba7ebad 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,        /* bswapr_us */
+    52,        /* bswapr_ui */
+    116,       /* bswapr_ul */
     4, /* movr_w_f */
     0, /* movr_ww_d */
     4, /* movr_w_d */
diff --git a/lib/jit_riscv.c b/lib/jit_riscv.c
index 55b2391..9d2ca6a 100644
--- a/lib/jit_riscv.c
+++ b/lib/jit_riscv.c
@@ -1125,6 +1125,9 @@ _emit_code(jit_state_t *_jit)
                case_rr(hton, _us);
                case_rr(hton, _ui);
                case_rr(hton, _ul);
+               case_rr(bswap, _us);
+               case_rr(bswap, _ui);
+               case_rr(bswap, _ul);
                case_rr(ext, _c);
                case_rr(ext, _uc);
                case_rr(ext, _s);
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..7c69780 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, /* bswapr_us */
+    4, /* bswapr_ui */
+    4, /* bswapr_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, /* bswapr_us */
+    4, /* bswapr_ui */
+    4, /* bswapr_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/jit_s390.c b/lib/jit_s390.c
index 27e8871..3685fa1 100644
--- a/lib/jit_s390.c
+++ b/lib/jit_s390.c
@@ -1151,6 +1151,11 @@ _emit_code(jit_state_t *_jit)
                case_rr(hton, _ui);
 #if __WORDSIZE == 64
                case_rr(hton, _ul);
+#endif
+               case_rr(bswap, _us);
+               case_rr(bswap, _ui);
+#if __WORDSIZE == 64
+               case_rr(bswap, _ul);
 #endif
                case_rr(ext, _c);
                case_rr(ext, _uc);
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..748d1ea 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, /* bswapr_us */
+    4, /* bswapr_ui */
+    0, /* bswapr_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, /* bswapr_us */
+    8, /* bswapr_ui */
+    4, /* bswapr_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/jit_sparc.c b/lib/jit_sparc.c
index 7ac4ae4..a9dbfa8 100644
--- a/lib/jit_sparc.c
+++ b/lib/jit_sparc.c
@@ -1463,6 +1463,11 @@ _emit_code(jit_state_t *_jit)
                case_rr(hton, _ui);
 #if __WORDSIZE == 64
                case_rr(hton, _ul);
+#endif
+               case_rr(bswap, _us);
+               case_rr(bswap, _ui);
+#if __WORDSIZE == 64
+               case_rr(bswap, _ul);
 #endif
                case_rr(ext, _c);
                case_rr(ext, _uc);
diff --git a/lib/jit_x86-cpu.c b/lib/jit_x86-cpu.c
index 18ace1f..ba75386 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 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)
+static void _bswapr_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 bswapr_ul(r0, r1)              _bswapr_ul(_jit, r0, r1)
+static void _bswapr_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)
+_bswapr_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)
+_bswapr_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)
+_bswapr_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..87370ab 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, /* bswapr_us */
+    4, /* bswapr_ui */
+    0, /* bswapr_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, /* bswapr_us */
+    6, /* bswapr_ui */
+    6, /* bswapr_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, /* bswapr_us */
+    6, /* bswapr_ui */
+    0, /* bswapr_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, /* bswapr_us */
+    6, /* bswapr_ui */
+    6, /* bswapr_ul */
     0, /* movr_w_f */
     0, /* movr_ww_d */
     0, /* movr_w_d */
diff --git a/lib/jit_x86.c b/lib/jit_x86.c
index d5cdcd0..cc2641d 100644
--- a/lib/jit_x86.c
+++ b/lib/jit_x86.c
@@ -1696,6 +1696,11 @@ _emit_code(jit_state_t *_jit)
                case_rr(hton, _ui);
 #if __X64 && !__X64_32
                case_rr(hton, _ul);
+#endif
+               case_rr(bswap, _us);
+               case_rr(bswap, _ui);
+#if __X64 && !__X64_32
+               case_rr(bswap, _ul);
 #endif
                case_rr(ext, _c);
                case_rr(ext, _uc);
diff --git a/lib/lightning.c b/lib/lightning.c
index 90f97e2..96eca37 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_bswapr_us:        case jit_code_bswapr_ui:        case 
jit_code_bswapr_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:
@@ -3444,6 +3445,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)              bswapr_us(r0,r1)
+#  define htonr_ui(r0,r1)              bswapr_ui(r0,r1)
+#  if __WORDSIZE == 64
+#    define htonr_ul(r0,r1)            bswapr_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




reply via email to

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