[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/4] Add bswapr_us, bswapr_ui, and bswapr_ul API functions
From: |
Paul Cercueil |
Subject: |
[PATCH 2/4] Add bswapr_us, bswapr_ui, and bswapr_ul API functions |
Date: |
Wed, 28 Apr 2021 18:18:10 +0100 |
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 <paul@crapouillou.net>
---
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 c14f635..824956d 100644
--- a/doc/body.texi
+++ b/doc/body.texi
@@ -366,6 +366,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 e1d8a0a..dd6402b 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_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 8e8a9a0..e036c79 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 5b2ff49..d47184e 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 8bfef9c..7ad31ed 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 9a067aa..b363614 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 b6ee260..6c2aa48 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 783fa90..57c76a5 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 db5a36a..6e8ed2f 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 21fe20c..98ef505 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 dec1465..cd5e5a3 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 8fb7fa1..c0f044a 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 dafade8..77bf293 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 475bc96..0c892af 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 9e99771..8e17327 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 0826f4e..5584c86 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 02cac60..53b2d0d 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 7cd1d7f..83987de 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 051647a..3baf7a0 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 158c09d..8b36f53 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 1db522a..94dd4c1 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);
@@ -2232,7 +2232,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);
@@ -2243,7 +2243,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);
@@ -2253,7 +2253,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 663b840..d87abc8 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 7dd900e..b506577 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 22eca0c..fe03a4f 100644
--- a/lib/lightning.c
+++ b/lib/lightning.c
@@ -1380,6 +1380,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:
@@ -3488,6 +3489,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.30.2