guile-commits
[Top][All Lists]
Advanced

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

[Guile-commits] 343/437: Implement new, typed, jit_htonr* interfaces


From: Andy Wingo
Subject: [Guile-commits] 343/437: Implement new, typed, jit_htonr* interfaces
Date: Mon, 2 Jul 2018 05:14:51 -0400 (EDT)

wingo pushed a commit to branch lightning
in repository guile.

commit 88aa2fcad24b3abdc5d192bd83e5a2a441295655
Author: pcpa <address@hidden>
Date:   Thu Dec 25 23:06:24 2014 -0200

    Implement new, typed, jit_htonr* interfaces
    
        * include/lightning.h: Split jit_htonr in the new 3 interfaces
        jit_htonr_us, jit_htonr_ui and jit_htonr_ul, the later only
        available on 64 bit. The plain/untyped jit_htonr macro call
        maps to the wordsize one.
        * lib/jit_aarch64-cpu.c,  lib/jit_aarch64-sz.c, lib/jit_aarch64.c,
        lib/jit_alpha-cpu.c, lib/jit_alpha-sz.c, lib/jit_alpha.c,
        lib/jit_arm-cpu.c, lib/jit_arm-sz.c, lib/jit_arm.c,
        lib/jit_hppa-cpu.c, lib/jit_hppa-sz.c, lib/jit_hppa.c,
        lib/jit_ia64-cpu.c, lib/jit_ia64-sz.c, lib/jit_ia64.c,
        lib/jit_mips-cpu.c, lib/jit_mips-sz.c, lib/jit_mips.c,
        lib/jit_ppc-cpu.c, lib/jit_ppc-sz.c, lib/jit_ppc.c,
        lib/jit_s390x-cpu.c, lib/jit_s390x-sz.c, lib/jit_s390x.c,
        lib/jit_sparc-cpu.c, lib/jit_sparc-sz.c, lib/jit_sparc.c,
        lib/jit_x86-cpu.c, lib/jit_x86-sz.c, lib/jit_x86.c:
        Update backends for the new jit_htonr*.
        * check/lightning.c, lib/jit_names.c, lib/lightning.c:
        Update for the new jit_htonr* interfaces.
        * check/Makefile.am: Update for new test cases.
        * check/hton.ok, check/hton.tst: New test cases.
---
 ChangeLog             |  22 +++++++
 check/Makefile.am     |  11 ++--
 check/hton.ok         |   1 +
 check/hton.tst        | 169 ++++++++++++++++++++++++++++++++++++++++++++++++++
 check/lightning.c     |  15 +++++
 include/lightning.h   |  19 +++++-
 lib/jit_aarch64-cpu.c |  26 +++++++-
 lib/jit_aarch64-sz.c  |   4 +-
 lib/jit_aarch64.c     |   4 +-
 lib/jit_alpha-cpu.c   |  52 ++++++++++++++--
 lib/jit_alpha-sz.c    |   4 +-
 lib/jit_alpha.c       |   4 +-
 lib/jit_arm-cpu.c     |  37 ++++++++++-
 lib/jit_arm-sz.c      |   8 ++-
 lib/jit_arm.c         |   3 +-
 lib/jit_hppa-cpu.c    |   3 +-
 lib/jit_hppa-sz.c     |   4 +-
 lib/jit_hppa.c        |   3 +-
 lib/jit_ia64-cpu.c    |  52 +++++++++++++++-
 lib/jit_ia64-sz.c     |   4 +-
 lib/jit_ia64.c        |   4 +-
 lib/jit_mips-cpu.c    | 101 +++++++++++++++++++-----------
 lib/jit_mips-sz.c     |  12 +++-
 lib/jit_mips.c        |   6 +-
 lib/jit_names.c       |   3 +-
 lib/jit_ppc-cpu.c     |  61 ++++++++++++------
 lib/jit_ppc-sz.c      |  18 +++++-
 lib/jit_ppc.c         |   6 +-
 lib/jit_s390x-cpu.c   |   4 +-
 lib/jit_s390x-sz.c    |   4 +-
 lib/jit_s390x.c       |   4 +-
 lib/jit_sparc-cpu.c   |   3 +-
 lib/jit_sparc-sz.c    |   4 +-
 lib/jit_sparc.c       |   3 +-
 lib/jit_x86-cpu.c     |  37 +++++++++--
 lib/jit_x86-sz.c      |  16 +++--
 lib/jit_x86.c         |   6 +-
 lib/lightning.c       |   3 +-
 38 files changed, 629 insertions(+), 111 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 5a5c947..13c1363 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2014-12-25 Paulo Andrade <address@hidden>
+
+       * include/lightning.h: Split jit_htonr in the new 3 interfaces
+       jit_htonr_us, jit_htonr_ui and jit_htonr_ul, the later only
+       available on 64 bit. The plain/untyped jit_htonr macro call
+       maps to the wordsize one.
+       * lib/jit_aarch64-cpu.c,  lib/jit_aarch64-sz.c, lib/jit_aarch64.c,
+       lib/jit_alpha-cpu.c, lib/jit_alpha-sz.c, lib/jit_alpha.c,
+       lib/jit_arm-cpu.c, lib/jit_arm-sz.c, lib/jit_arm.c,
+       lib/jit_hppa-cpu.c, lib/jit_hppa-sz.c, lib/jit_hppa.c,
+       lib/jit_ia64-cpu.c, lib/jit_ia64-sz.c, lib/jit_ia64.c,
+       lib/jit_mips-cpu.c, lib/jit_mips-sz.c, lib/jit_mips.c,
+       lib/jit_ppc-cpu.c, lib/jit_ppc-sz.c, lib/jit_ppc.c,
+       lib/jit_s390x-cpu.c, lib/jit_s390x-sz.c, lib/jit_s390x.c,
+       lib/jit_sparc-cpu.c, lib/jit_sparc-sz.c, lib/jit_sparc.c,
+       lib/jit_x86-cpu.c, lib/jit_x86-sz.c, lib/jit_x86.c:
+       Update backends for the new jit_htonr*.
+       * check/lightning.c, lib/jit_names.c, lib/lightning.c:
+       Update for the new jit_htonr* interfaces.
+       * check/Makefile.am: Update for new test cases.
+       * check/hton.ok, check/hton.tst: New test cases.
+
 2014-12-24 Paulo Andrade <address@hidden>
 
        * include/lightning/jit_private.h, include/lightning/jit_x86.h,
diff --git a/check/Makefile.am b/check/Makefile.am
index ca6afe9..653742b 100644
--- a/check/Makefile.am
+++ b/check/Makefile.am
@@ -57,6 +57,7 @@ EXTRA_DIST =                          \
        ldstxr-c.tst    ldstxr-c.ok     \
        ldstxi-c.tst    ldstxi-c.ok     \
        cvt.tst         cvt.ok          \
+       hton.tst        hton.ok         \
        branch.tst      branch.ok       \
        alu.inc                         \
        alu_add.tst     alu_add.ok      \
@@ -104,7 +105,7 @@ base_TESTS =                                \
        ldstr ldsti                     \
        ldstxr ldstxi                   \
        ldstr-c ldstxr-c ldstxi-c       \
-       cvt branch                      \
+       cvt hton branch                 \
        alu_add alux_add                \
        alu_sub alux_sub alu_rsb        \
        alu_mul alu_div alu_rem         \
@@ -177,7 +178,7 @@ arm_TESTS =                                 \
        ldstr.arm ldsti.arm                     \
        ldstxr.arm ldstxi.arm                   \
        ldstr-c.arm ldstxr-c.arm ldstxi-c.arm   \
-       cvt.arm branch.arm                      \
+       cvt.arm hton.arm branch.arm             \
        alu_add.arm alux_add.arm                \
        alu_sub.arm alux_sub.arm alu_rsb.arm    \
        alu_mul.arm alu_div.arm alu_rem.arm     \
@@ -201,7 +202,7 @@ swf_TESTS =                                 \
        ldstr.swf ldsti.swf                     \
        ldstxr.swf ldstxi.swf                   \
        ldstr-c.swf ldstxr-c.swf ldstxi-c.swf   \
-       cvt.swf branch.swf                      \
+       cvt.swf hton.swf branch.swf             \
        alu_add.swf alux_add.swf                \
        alu_sub.swf alux_sub.swf alu_rsb.swf    \
        alu_mul.swf alu_div.swf alu_rem.swf     \
@@ -223,7 +224,7 @@ arm_swf_TESTS =                                             
        \
        ldstr.arm.swf ldsti.arm.swf                             \
        ldstxr.arm.swf ldstxi.arm.swf                           \
        ldstr-c.arm.swf ldstxr-c.arm.swf ldstxi-c.arm.swf       \
-       cvt.arm.swf branch.arm.swf                              \
+       cvt.arm.swf hton.arm.swf branch.arm.swf                 \
        alu_add.arm.swf alux_add.arm.swf                        \
        alu_sub.arm.swf alux_sub.arm.swf alu_rsb.arm.swf        \
        alu_mul.arm.swf alu_div.arm.swf alu_rem.arm.swf         \
@@ -246,7 +247,7 @@ arm4_swf_TESTS =                                            
\
        ldstr.arm4.swf ldsti.arm4.swf                           \
        ldstxr.arm4.swf ldstxi.arm4.swf                         \
        ldstr-c.arm4.swf ldstxr-c.arm4.swf ldstxi-c.arm4.swf    \
-       cvt.arm4.swf branch.arm4.swf                            \
+       cvt.arm4.swf hton.arm4.swf branch.arm4.swf              \
        alu_add.arm4.swf alux_add.arm4.swf                      \
        alu_sub.arm4.swf alux_sub.arm4.swf alu_rsb.arm4.swf     \
        alu_mul.arm4.swf alu_div.arm4.swf alu_rem.arm4.swf      \
diff --git a/check/hton.ok b/check/hton.ok
new file mode 100644
index 0000000..9766475
--- /dev/null
+++ b/check/hton.ok
@@ -0,0 +1 @@
+ok
diff --git a/check/hton.tst b/check/hton.tst
new file mode 100644
index 0000000..fcaf147
--- /dev/null
+++ b/check/hton.tst
@@ -0,0 +1,169 @@
+.data  16
+ok:
+.c     "ok\n"
+
+#define us12_i         0x1234
+#define us7f_i         0x7ff7
+#define us80_i         0x8008
+#define usff_i         0xffff
+#define ui12_i         0x01234567
+#define ui7f_i         0x7f7ff7f7
+#define ui80_i         0x80800808
+#define uiff_i         0xffffffff
+#define ul12_i         0x0123456789abcdef
+#define ul7f_i         0x7f7f7f7ff7f7f7f7
+#define ul80_i         0x8080808008080808
+#define ulff_i         0xffffffffffffffff
+
+#if __WORDSIZE == 32
+#  define xus12_i      0xffff1234
+#  define xus7f_i      0x10107ff7
+#  define xus80_i      0x81188008
+#  define xusff_i      0xeaaeffff
+#else
+#  define xus12_i      0xffffffffffff1234
+#  define xus7f_i      0x1010100101017ff7
+#  define xus80_i      0x8181811818818008
+#  define xusff_i      0xeaeaeaaeaeaeffff
+#  define xui12_i      0xffffffff01234567
+#  define xui7f_i      0x101001017f7ff7f7
+#  define xui80_i      0x8181181880800808
+#  define xuiff_i      0xeaeaaeaeffffffff
+#endif
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#  define us12_o       0x3412
+#  define us7f_o       0xf77f
+#  define us80_o       0x0880
+#  define usff_o       0xffff
+#  define ui12_o       0x67452301
+#  define ui7f_o       0xf7f77f7f
+#  define ui80_o       0x08088080
+#  define uiff_o       0xffffffff
+#  define ul12_o       0xefcdab8967452301
+#  define ul7f_o       0xf7f7f7f77f7f7f7f
+#  define ul80_o       0x0808080880808080
+#  define ulff_o       0xffffffffffffffff
+#else
+#  define us12_o       us12_i
+#  define us7f_o       us7f_i
+#  define us80_o       us80_i
+#  define usff_o       usff_i
+#  define ui12_o       ui12_i
+#  define ui7f_o       ui7f_i
+#  define ui80_o       ui80_i
+#  define uiff_o       uiff_i
+#  define ul12_o       ul12_i
+#  define ul7f_o       ul7f_i
+#  define ul80_o       ul80_i
+#  define ulff_o       ulff_i
+#endif
+
+#define HTON4(I, O, T, R0, R1)                         \
+       movi %R0 I                                      \
+       htonr_##T %R1 %R0                               \
+       beqi T##R0##R1##I %R1 O                         \
+       calli @abort                                    \
+T##R0##R1##I:
+
+#define HTON3(T, R0, R1)                               \
+       HTON4(T##12_i, T##12_o, T, R0, R1)              \
+       HTON4(x##T##12_i, T##12_o, T, R0, R1)           \
+       HTON4(T##7f_i, T##7f_o, T, R0, R1)              \
+       HTON4(x##T##7f_i, T##7f_o, T, R0, R1)           \
+       HTON4(T##80_i, T##80_o, T, R0, R1)              \
+       HTON4(x##T##80_i, T##80_o, T, R0, R1)           \
+       HTON4(T##ff_i, T##ff_o, T, R0, R1)              \
+       HTON4(x##T##ff_i, T##ff_o, T, R0, R1)
+
+#define HTON3x(T, R0, R1)                              \
+       HTON4(T##12_i, T##12_o, T, R0, R1)              \
+       HTON4(T##7f_i, T##7f_o, T, R0, R1)              \
+       HTON4(T##80_i, T##80_o, T, R0, R1)              \
+       HTON4(T##ff_i, T##ff_o, T, R0, R1)
+
+#define HTON2(T, V0, V1, V2, R0, R1, R2)               \
+       HTON3(T, V0, V0)                                \
+       HTON3(T, V0, V1)                                \
+       HTON3(T, V0, V2)                                \
+       HTON3(T, V0, R0)                                \
+       HTON3(T, V0, R1)                                \
+       HTON3(T, V0, R2)                                \
+
+#define HTON2x(T, V0, V1, V2, R0, R1, R2)              \
+       HTON3x(T, V0, V0)                               \
+       HTON3x(T, V0, V1)                               \
+       HTON3x(T, V0, V2)                               \
+       HTON3x(T, V0, R0)                               \
+       HTON3x(T, V0, R1)                               \
+       HTON3x(T, V0, R2)                               \
+
+#define HTON1(T, V0, V1, V2, R0, R1, R2)               \
+       HTON2(T, V0, V1, V2, R0, R1, R2)                \
+       HTON2(T, V1, V2, R0, R1, R2, V0)                \
+       HTON2(T, V2, R0, R1, R2, V0, V1)                \
+       HTON2(T, R0, R1, R2, V0, V1, V2)                \
+       HTON2(T, R1, R2, V0, V1, V2, R0)                \
+       HTON2(T, R2, V0, V1, V2, R0, R1)
+
+#define HTON1x(T, V0, V1, V2, R0, R1, R2)              \
+       HTON2x(T, V0, V1, V2, R0, R1, R2)               \
+       HTON2x(T, V1, V2, R0, R1, R2, V0)               \
+       HTON2x(T, V2, R0, R1, R2, V0, V1)               \
+       HTON2x(T, R0, R1, R2, V0, V1, V2)               \
+       HTON2x(T, R1, R2, V0, V1, V2, R0)               \
+       HTON2x(T, R2, V0, V1, V2, R0, R1)
+
+#if __WORDSIZE == 32
+#  define HTON(V0, V1, V2, R0, R1, R2)                 \
+       HTON1(us, V0, V1, V2, R0, R1, R2)               \
+       HTON1x(ui, V0, V1, V2, R0, R1, R2)
+#else
+#  define HTON(V0, V1, V2, R0, R1, R2)                 \
+       HTON1(us, V0, V1, V2, R0, R1, R2)               \
+       HTON1(ui, V0, V1, V2, R0, R1, R2)               \
+       HTON1x(ul, V0, V1, V2, R0, R1, R2)
+#endif
+
+.code
+       prolog
+       /* simple sequence for easier disassembly reading and encoding check */
+       movi %r0 us12_i
+       htonr_us %r1 %r0
+       beqi us %r1 us12_o
+       calli @abort
+us:
+
+       movi %r0 xus12_i
+       htonr_us %r1 %r0
+       beqi xus %r1 us12_o
+       calli @abort
+xus:
+       movi %r0 ui12_i
+       htonr_ui %r1 %r0
+       beqi ui %r1 ui12_o
+       calli @abort
+ui:
+#if __WORDSIZE == 64
+       movi %r0 xui12_i
+       htonr_ui %r1 %r0
+       beqi xui %r1 ui12_o
+       calli @abort
+xui:
+       movi %r0 ul12_i
+       htonr_ul %r1 %r0
+       beqi ul %r1 ul12_o
+       calli @abort
+ul:
+#endif
+
+       HTON(v0, v1, v2, r0, r1, r2)
+
+       // just to know did not abort
+       prepare
+               pushargi ok
+               ellipsis
+       finishi @printf
+
+       ret
+       epilog
diff --git a/check/lightning.c b/check/lightning.c
index 5f179fb..e33008e 100644
--- a/check/lightning.c
+++ b/check/lightning.c
@@ -319,6 +319,11 @@ static void extr_s(void);  static void extr_us(void);
 #if __WORDSIZE == 64
 static void extr_i(void);      static void extr_ui(void);
 #endif
+static void htonr_us(void);    static void ntohr_us(void);
+static void htonr_ui(void);    static void ntohr_ui(void);
+#if __WORDSIZE == 64
+static void htonr_ul(void);    static void ntohr_ul(void);
+#endif
 static void htonr(void);       static void ntohr(void);
 static void ldr_c(void);       static void ldi_c(void);
 static void ldr_uc(void);      static void ldi_uc(void);
@@ -622,6 +627,11 @@ static instr_t               instr_vector[] = {
 #if __WORDSIZE == 64
     entry(extr_i),     entry(extr_ui),
 #endif
+    entry(htonr_us),   entry(ntohr_us),
+    entry(htonr_ui),   entry(ntohr_ui),
+#if __WORDSIZE == 64
+    entry(htonr_ul),   entry(ntohr_ul),
+#endif
     entry(htonr),      entry(ntohr),
     entry(ldr_c),      entry(ldi_c),
     entry(ldr_uc),     entry(ldi_uc),
@@ -1437,6 +1447,11 @@ entry_ir_ir(extr_s)              entry_ir_ir(extr_us)
 #if __WORDSIZE == 64
 entry_ir_ir(extr_i)            entry_ir_ir(extr_ui)
 #endif
+entry_ir_ir(htonr_us)          entry_ir_ir(ntohr_us)
+entry_ir_ir(htonr_ui)          entry_ir_ir(ntohr_ui)
+#if __WORDSIZE == 64
+entry_ir_ir(htonr_ul)          entry_ir_ir(ntohr_ul)
+#endif
 entry_ir_ir(htonr)             entry_ir_ir(ntohr)
 entry_ir_ir(ldr_c)             entry_ir_pm(ldi_c)
 entry_ir_ir(ldr_uc)            entry_ir_pm(ldi_uc)
diff --git a/include/lightning.h b/include/lightning.h
index 461661a..a2eac57 100644
--- a/include/lightning.h
+++ b/include/lightning.h
@@ -327,9 +327,22 @@ typedef enum {
 #  define jit_extr_ui(u,v)     jit_new_node_ww(jit_code_extr_ui,u,v)
 #endif
     jit_code_extr_i,           jit_code_extr_ui,
-#define jit_htonr(u,v)         jit_new_node_ww(jit_code_htonr,u,v)
-#define jit_ntohr(u,v)         jit_new_node_ww(jit_code_htonr,u,v)
-    jit_code_htonr,
+
+#define jit_htonr_us(u,v)      jit_new_node_ww(jit_code_htonr_us,u,v)
+#define jit_ntohr_us(u,v)      jit_new_node_ww(jit_code_htonr_us,u,v)
+    jit_code_htonr_us,
+#define jit_htonr_ui(u,v)      jit_new_node_ww(jit_code_htonr_ui,u,v)
+#define jit_ntohr_ui(u,v)      jit_new_node_ww(jit_code_htonr_ui,u,v)
+#if __WORDSIZE == 32
+#  define jit_htonr(u,v)       jit_new_node_ww(jit_code_htonr_ui,u,v)
+#  define jit_ntohr(u,v)       jit_new_node_ww(jit_code_htonr_ui,u,v)
+#else
+#define jit_htonr_ul(u,v)      jit_new_node_ww(jit_code_htonr_ul,u,v)
+#define jit_ntohr_ul(u,v)      jit_new_node_ww(jit_code_htonr_ul,u,v)
+#  define jit_htonr(u,v)       jit_new_node_ww(jit_code_htonr_ul,u,v)
+#  define jit_ntohr(u,v)       jit_new_node_ww(jit_code_htonr_ul,u,v)
+#endif
+    jit_code_htonr_ui,         jit_code_htonr_ul,
 
 #define jit_ldr_c(u,v)         jit_new_node_ww(jit_code_ldr_c,u,v)
 #define jit_ldi_c(u,v)         jit_new_node_wp(jit_code_ldi_c,u,v)
diff --git a/lib/jit_aarch64-cpu.c b/lib/jit_aarch64-cpu.c
index 93eca42..f49ee16 100644
--- a/lib/jit_aarch64-cpu.c
+++ b/lib/jit_aarch64-cpu.c
@@ -656,9 +656,15 @@ static void 
_stxi_i(jit_state_t*,jit_word_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);
 #  if __BYTE_ORDER == __LITTLE_ENDIAN
-#    define htonr(r0,r1)               REV(r0,r1)
+#  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(r0,r1)               movr(r0,r1)
+#    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 extr_c(r0,r1)                        SXTB(r0,r1)
 #  define extr_uc(r0,r1)               UXTB(r0,r1)
@@ -1429,6 +1435,22 @@ _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)
+{
+    htonr_ul(r0, r1);
+    rshi_u(r0, r0, 48);
+}
+
+static void
+_htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+{
+    htonr_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 bfb0960..bf7812b 100644
--- a/lib/jit_aarch64-sz.c
+++ b/lib/jit_aarch64-sz.c
@@ -84,7 +84,9 @@
     4, /* extr_us */
     4, /* extr_i */
     4, /* extr_ui */
-    4, /* htonr */
+    8, /* htonr_us */
+    8, /* htonr_ui */
+    4, /* htonr_ul */
     4, /* ldr_c */
     12,        /* ldi_c */
     4, /* ldr_uc */
diff --git a/lib/jit_aarch64.c b/lib/jit_aarch64.c
index 77e25b3..17b2fbe 100644
--- a/lib/jit_aarch64.c
+++ b/lib/jit_aarch64.c
@@ -825,7 +825,9 @@ _emit_code(jit_state_t *_jit)
                case_wrr(stx, _i);
                case_rrr(stx, _l);
                case_wrr(stx, _l);
-               case_rr(hton,);
+               case_rr(hton, _us);
+               case_rr(hton, _ui);
+               case_rr(hton, _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 03513fc..a550630 100644
--- a/lib/jit_alpha-cpu.c
+++ b/lib/jit_alpha-cpu.c
@@ -622,10 +622,16 @@ 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(r0,r1)               _htonr(_jit,r0,r1)
-static void _htonr(jit_state_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);
 #  else
-#    define htonr(r0,r1)               movr(r0,r1)
+#    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 jmpr(r0)                     JMP(_R31_REGNO,r0,0)
 #  define jmpi(i0)                     _jmpi(_jit,i0)
@@ -2442,7 +2448,45 @@ _extr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t 
r1)
 }
 
 static void
-_htonr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+{
+    jit_int32_t                t0;
+    t0 = jit_get_reg(jit_class_gpr);
+    EXTBLi(r1, 0, rn(t0));
+    EXTBLi(r1, 1, r0);
+    SLLi(rn(t0), 8, rn(t0));
+    OR(r0, rn(t0), r0);
+    jit_unget_reg(t0);
+}
+
+static void
+_htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+{
+    jit_int32_t                t0;
+    jit_int32_t                t1;
+    jit_int32_t                t2;
+    jit_int32_t                t3;
+    t0 = jit_get_reg(jit_class_gpr);
+    t1 = jit_get_reg(jit_class_gpr);
+    t2 = jit_get_reg(jit_class_gpr);
+    t3 = jit_get_reg(jit_class_gpr);
+    EXTBLi(r1, 3, rn(t0));
+    INSBLi(r1, 3, rn(t1));
+    SLLi(r1, 8, rn(t2));
+    ZAPNOTi(rn(t2), 4, rn(t2));
+    SRLi(r1, 8, rn(t3));
+    OR(rn(t0), rn(t1), r0);
+    OR(rn(t2), r0, r0);
+    ZAPNOTi(rn(t3), 2, rn(t3));
+    OR(rn(t3), r0, r0);
+    jit_unget_reg(t3);
+    jit_unget_reg(t2);
+    jit_unget_reg(t1);
+    jit_unget_reg(t0);
+}
+
+static void
+_htonr_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 5bcd24e..ef8f71b 100644
--- a/lib/jit_alpha-sz.c
+++ b/lib/jit_alpha-sz.c
@@ -84,7 +84,9 @@
     8, /* extr_us */
     8, /* extr_i */
     8, /* extr_ui */
-    36,        /* htonr */
+    16,        /* htonr_us */
+    36,        /* htonr_ui */
+    36,        /* htonr_ul */
     12,        /* ldr_c */
     40,        /* ldi_c */
     4, /* ldr_uc */
diff --git a/lib/jit_alpha.c b/lib/jit_alpha.c
index 07b13c5..d266a70 100644
--- a/lib/jit_alpha.c
+++ b/lib/jit_alpha.c
@@ -850,7 +850,9 @@ _emit_code(jit_state_t *_jit)
                case_wrr(stx, _i);
                case_rrr(stx, _l);
                case_wrr(stx, _l);
-               case_rr(hton,);
+               case_rr(hton, _us);
+               case_rr(hton, _ui);
+               case_rr(hton, _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 aabccef..6f4ae6f 100644
--- a/lib/jit_arm-cpu.c
+++ b/lib/jit_arm-cpu.c
@@ -1089,9 +1089,12 @@ 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(r0,r1)                 _htonr(_jit,r0,r1)
-static void _htonr(jit_state_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);
 #  else
+#    define htonr_us(r0,r1)            extr_us(r0,r1)
 #    define htonr(r0,r1)               movr(r0,r1)
 #  endif
 #  define extr_c(r0,r1)                        _extr_c(_jit,r0,r1)
@@ -3556,9 +3559,37 @@ _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)
+{
+    jit_int32_t                t0;
+    if (jit_thumb_p()) {
+       if ((r0|r1) < 8)
+           T1_REV(r0, r1);
+       else
+           T2_REV(r0, r1);
+       rshi_u(r0, r0, 16);
+    }
+    else {
+       if (jit_armv6_p()) {
+           REV(r0, r1);
+           rshi_u(r0, r0, 16);
+       }
+       else {
+           t0 = jit_get_reg(jit_class_gpr);
+           rshi(rn(t0), r1, 8);
+           andi(r0, r1, 0xff);
+           andi(rn(t0), rn(t0), 0xff);
+           lshi(r0, r0, 8);
+           orr(r0, r0, rn(t0));
+           jit_unget_reg(t0);
+       }
+    }
+}
+
 /* inline glibc htonl (without register clobber) */
 static void
-_htonr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                reg;
     if (jit_thumb_p()) {
diff --git a/lib/jit_arm-sz.c b/lib/jit_arm-sz.c
index 5d45028..493a673 100644
--- a/lib/jit_arm-sz.c
+++ b/lib/jit_arm-sz.c
@@ -85,7 +85,9 @@
     4, /* extr_us */
     0, /* extr_i */
     0, /* extr_ui */
-    4, /* htonr */
+    8, /* htonr_us */
+    4, /* htonr_ui */
+    0, /* htonr_ul */
     4, /* ldr_c */
     12,        /* ldi_c */
     4, /* ldr_uc */
@@ -441,7 +443,9 @@
     4, /* extr_us */
     0, /* extr_i */
     0, /* extr_ui */
-    4, /* htonr */
+    20,        /* htonr_us */
+    16,        /* htonr_ui */
+    0, /* htonr_ul */
     4, /* ldr_c */
     12,        /* ldi_c */
     4, /* ldr_uc */
diff --git a/lib/jit_arm.c b/lib/jit_arm.c
index 3393f85..a9a60f2 100644
--- a/lib/jit_arm.c
+++ b/lib/jit_arm.c
@@ -1141,7 +1141,8 @@ _emit_code(jit_state_t *_jit)
                case_wrr(stx, _s);
                case_rrr(stx, _i);
                case_wrr(stx, _i);
-               case_rr(hton,);
+               case_rr(hton, _us);
+               case_rr(hton, _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 59008cb..efe6220 100644
--- a/lib/jit_hppa-cpu.c
+++ b/lib/jit_hppa-cpu.c
@@ -655,7 +655,8 @@ static jit_word_t 
_movi_p(jit_state_t*,jit_int32_t,jit_word_t);
 #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(r0,r1)         movr(r0,r1)
+#  define htonr_us(r0,r1)      extr_us(r0,r1)
+#  define htonr_ui(r0,r1)      movr(r0,r1)
 #else
 #  error need htonr implementation
 #endif
diff --git a/lib/jit_hppa-sz.c b/lib/jit_hppa-sz.c
index 663162b..0741f7b 100644
--- a/lib/jit_hppa-sz.c
+++ b/lib/jit_hppa-sz.c
@@ -84,7 +84,9 @@
     4, /* extr_us */
     0, /* extr_i */
     0, /* extr_ui */
-    4, /* htonr */
+    4, /* htonr_us */
+    4, /* htonr_ui */
+    0, /* htonr_l */
     8, /* ldr_c */
     12,        /* ldi_c */
     4, /* ldr_uc */
diff --git a/lib/jit_hppa.c b/lib/jit_hppa.c
index 92d7001..54d3bdd 100644
--- a/lib/jit_hppa.c
+++ b/lib/jit_hppa.c
@@ -804,7 +804,8 @@ _emit_code(jit_state_t *_jit)
                case_rr(ext, _uc);
                case_rr(ext, _s);
                case_rr(ext, _us);
-               case_rr(hton,);
+               case_rr(hton, _us);
+               case_rr(hton, _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 9baeafa..7a9a974 100644
--- a/lib/jit_ia64-cpu.c
+++ b/lib/jit_ia64-cpu.c
@@ -1308,9 +1308,15 @@ 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(r0,r1)                 MUX1(r0,r1,MUX_REV)
+#  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(r0,r1)                 movr(r0,r1)
+#  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 extr_c(r0,r1)                  SXT1(r0,r1)
 #define extr_uc(r0,r1)                 ZXT1(r0,r1)
@@ -3939,6 +3945,48 @@ _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)
+{
+    jit_int32_t                t0;
+    t0 = jit_get_reg(jit_class_gpr);
+    rshi(rn(t0), r1, 8);
+    andi(r0, r1, 0xff);
+    andi(rn(t0), rn(t0), 0xff);
+    lshi(r0, r0, 8);
+    orr(r0, r0, rn(t0));
+    jit_unget_reg(t0);
+}
+
+static void
+_htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+{
+    jit_int32_t                t0;
+    jit_int32_t                t1;
+    jit_int32_t                t2;
+    t0 = jit_get_reg(jit_class_gpr);
+    t1 = jit_get_reg(jit_class_gpr);
+    t2 = jit_get_reg(jit_class_gpr);
+    rshi(rn(t0), r1, 24);
+    rshi(rn(t1), r1, 16);
+    rshi(rn(t2), r1,  8);
+    andi(rn(t0), rn(t0), 0xff);
+    andi(rn(t1), rn(t1), 0xff);
+    andi(rn(t2), rn(t2), 0xff);
+    andi(r0, r1, 0xff);
+    lshi(r0, r0, 24);
+    lshi(rn(t1), rn(t1), 8);
+    orr(r0, r0, rn(t0));
+    lshi(rn(t2), rn(t2), 16);
+    orr(r0, r0, rn(t1));
+    orr(r0, r0, rn(t2));
+    jit_unget_reg(t2);
+    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 8059d8c..1b384b2 100644
--- a/lib/jit_ia64-sz.c
+++ b/lib/jit_ia64-sz.c
@@ -84,7 +84,9 @@
     16,        /* extr_us */
     16,        /* extr_i */
     16,        /* extr_ui */
-    0, /* htonr */
+    16,        /* htonr_us */
+    16,        /* htonr_ui */
+    16,        /* htonr_ul */
     16,        /* ldr_c */
     32,        /* ldi_c */
     0, /* ldr_uc */
diff --git a/lib/jit_ia64.c b/lib/jit_ia64.c
index 46ff5da..6949355 100644
--- a/lib/jit_ia64.c
+++ b/lib/jit_ia64.c
@@ -945,7 +945,9 @@ _emit_code(jit_state_t *_jit)
                else
                    movi(rn(node->u.w), node->v.w);
                break;
-               case_rr(hton,);
+               case_rr(hton, _us);
+               case_rr(hton, _ui);
+               case_rr(hton, _ul);
                case_rr(ext, _c);
                case_rr(ext, _uc);
                case_rr(ext, _s);
diff --git a/lib/jit_mips-cpu.c b/lib/jit_mips-cpu.c
index 1f48ecf..38141ae 100644
--- a/lib/jit_mips-cpu.c
+++ b/lib/jit_mips-cpu.c
@@ -579,10 +579,22 @@ static void 
_stxr_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
 static void _stxi_l(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
 #  endif
 #  if __BYTE_ORDER == __LITTLE_ENDIAN
-#  define htonr(r0,r1)                 _htonr(_jit,r0,r1)
-static void _htonr(jit_state_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);
+#    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(r0,r1)               movr(r0,r1)
+#    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
 #  define extr_c(r0,r1)                        _extr_c(_jit,r0,r1)
 static void _extr_c(jit_state_t*,jit_int32_t,jit_int32_t);
@@ -591,8 +603,8 @@ 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)               ANDI(r0,r1,0xffff)
 #  if __WORDSIZE == 64
-#  define extr_i(r0,r1)                        SLL(r0,r1,0)
-#  define extr_ui(r0,r1)               _extr_ui(_jit,r0,r1)
+#    define extr_i(r0,r1)              SLL(r0,r1,0)
+#    define extr_ui(r0,r1)             _extr_ui(_jit,r0,r1)
 static void _extr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
 #  endif
 #  define ltr(r0,r1,r2)                        SLT(r0,r1,r2)
@@ -1658,39 +1670,56 @@ _stxi_l(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)
+{
+    jit_int32_t                t0;
+    t0 = jit_get_reg(jit_class_gpr);
+    rshi(rn(t0), r1, 8);
+    andi(r0, r1, 0xff);
+    andi(rn(t0), rn(t0), 0xff);
+    lshi(r0, r0, 8);
+    orr(r0, r0, rn(t0));
+    jit_unget_reg(t0);
+}
+
+static void
+_htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+{
+    jit_int32_t                t0;
+    jit_int32_t                t1;
+    jit_int32_t                t2;
+    t0 = jit_get_reg(jit_class_gpr);
+    t1 = jit_get_reg(jit_class_gpr);
+    t2 = jit_get_reg(jit_class_gpr);
+    rshi(rn(t0), r1, 24);
+    rshi(rn(t1), r1, 16);
+    rshi(rn(t2), r1,  8);
+    andi(rn(t0), rn(t0), 0xff);
+    andi(rn(t1), rn(t1), 0xff);
+    andi(rn(t2), rn(t2), 0xff);
+    andi(r0, r1, 0xff);
+    lshi(r0, r0, 24);
+    lshi(rn(t1), rn(t1), 8);
+    orr(r0, r0, rn(t0));
+    lshi(rn(t2), rn(t2), 16);
+    orr(r0, r0, rn(t1));
+    orr(r0, r0, rn(t2));
+    jit_unget_reg(t2);
+    jit_unget_reg(t1);
+    jit_unget_reg(t0);
+}
+
+static void
 _htonr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
-    jit_int32_t                rg0;
-    jit_int32_t                rg1;
-    if (jit_mips2_p()) {
-       WSBH(r0, r1);
-       ROTR(r0, r0, 16);
-    }
-    else {
-       /* FIXME rewrite in a more sane way, but unlikely to be used
-        * in near time... */
-#  if __WORDSIZE == 64
-#    error htonr only implemented for 64 bit
-#  endif
-       rg0 = jit_get_reg(jit_class_gpr);
-       rg1 = jit_get_reg(jit_class_gpr);
-       LUI(rn(rg0), 0xff00);
-       ORI(rn(rg0), rn(rg0), 0xff00);
-       AND(rn(rg1), r1, rn(rg0));
-       SRL(rn(rg0), rn(rg0), 8);
-       AND(rn(rg0), r1, rn(rg0));
-       SRL(rn(rg1), rn(rg1), 8);
-       SLL(rn(rg0), rn(rg0), 8);
-       OR(r0, rn(rg0), rn(rg1));
-       ANDI(rn(rg1), r0, 0xffff);
-       LUI(rn(rg0), 0xffff);
-       AND(rn(rg0), r0, rn(rg0));
-       SLL(rn(rg1), rn(rg1), 16);
-       SRL(rn(rg0), rn(rg0), 16);
-       OR(r0, rn(rg0), rn(rg1));
-       jit_unget_reg(rg0);
-       jit_unget_reg(rg1);
-    }
+    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));
+    lshi(r0, r0, 32);
+    orr(r0, r0, rn(reg));
+    jit_unget_reg(reg);
 }
 #  endif
 
diff --git a/lib/jit_mips-sz.c b/lib/jit_mips-sz.c
index 517bedc..c7dfbb1 100644
--- a/lib/jit_mips-sz.c
+++ b/lib/jit_mips-sz.c
@@ -85,7 +85,9 @@
     4, /* extr_us */
     0, /* extr_i */
     0, /* extr_ui */
-    4, /* htonr */
+    4, /* htonr_us */
+    4, /* htonr_ui */
+    0, /* htonr_ul */
     4, /* ldr_c */
     12,        /* ldi_c */
     4, /* ldr_uc */
@@ -441,7 +443,9 @@
     4, /* extr_us */
     0, /* extr_i */
     0, /* extr_ui */
-    56,        /* htonr */
+    20,        /* htonr_us */
+    52,        /* htonr_ui */
+    0, /* htonr_ul */
     4, /* ldr_c */
     12,        /* ldi_c */
     4, /* ldr_uc */
@@ -796,7 +800,9 @@
     4, /* extr_us */
     4, /* extr_i */
     8, /* extr_ui */
-    4, /* htonr */
+    4, /* htonr_us */
+    4, /* htonr_ui */
+    4, /* htonr_ul */
     4, /* ldr_c */
     12,        /* ldi_c */
     4, /* ldr_uc */
diff --git a/lib/jit_mips.c b/lib/jit_mips.c
index e871d47..19170df 100644
--- a/lib/jit_mips.c
+++ b/lib/jit_mips.c
@@ -1094,7 +1094,11 @@ _emit_code(jit_state_t *_jit)
                case_rrr(stx, _l);
                case_wrr(stx, _l);
 #endif
-               case_rr(hton,);
+               case_rr(hton, _us);
+               case_rr(hton, _ui);
+#if __WORDSIZE == 64
+               case_rr(hton, _ul);
+#endif
                case_rr(ext, _c);
                case_rr(ext, _uc);
                case_rr(ext, _s);
diff --git a/lib/jit_names.c b/lib/jit_names.c
index a5e50db..bd9d185 100644
--- a/lib/jit_names.c
+++ b/lib/jit_names.c
@@ -62,7 +62,8 @@ static char *code_name[] = {
     "extr_c",          "extr_uc",
     "extr_s",          "extr_us",
     "extr_i",          "extr_ui",
-    "htonr",
+    "htonr_us",
+    "htonr_ui",                "htonr_ul",
     "ldr_c",           "ldi_c",
     "ldr_uc",          "ldi_uc",
     "ldr_s",           "ldi_s",
diff --git a/lib/jit_ppc-cpu.c b/lib/jit_ppc-cpu.c
index c314813..81e5867 100644
--- a/lib/jit_ppc-cpu.c
+++ b/lib/jit_ppc-cpu.c
@@ -471,10 +471,22 @@ static jit_word_t 
_movi_p(jit_state_t*,jit_int32_t,jit_word_t);
 #    define extr_ui(r0,r1)             CLRLDI(r0,r1,32)
 #  endif
 #  if __BYTE_ORDER == __BIG_ENDIAN
-#    define htonr(r0,r1)               movr(r0,r1)
+#    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(r0,r1)               _htonr(_jit,r0,r1)
-static void _htonr(jit_state_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);
+#    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
 #  endif
 #  define addr(r0,r1,r2)               ADD(r0,r1,r2)
 #  define addi(r0,r1,i0)               _addi(_jit,r0,r1,i0)
@@ -1048,31 +1060,44 @@ _movi_p(jit_state_t *_jit, jit_int32_t r0, jit_word_t 
i0)
 
 #  if __BYTE_ORDER == __LITTLE_ENDIAN
 static void
-_htonr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+{
+    jit_int32_t                t0;
+    t0 = jit_get_reg(jit_class_gpr);
+    rshi(rn(t0), r1, 8);
+    andi(r0, r1, 0xff);
+    andi(rn(t0), rn(t0), 0xff);
+    lshi(r0, r0, 8);
+    orr(r0, r0, rn(t0));
+    jit_unget_reg(t0);
+}
+
+static void
+_htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                reg;
-#    if __WORDSIZE == 64
-    jit_int32_t                top;
-    top = jit_get_reg(jit_class_gpr);
-    rshi_u(rn(top), r1, 32);
-#    endif
     reg = jit_get_reg(jit_class_gpr);
     ROTLWI(rn(reg), r1, 8);
     RLWIMI(rn(reg), r1, 24, 0, 7);
     RLWIMI(rn(reg), r1, 24, 16, 23);
-#    if __WORDSIZE == 32
     CLRLDI(r0, rn(reg), 32);
-#    else
-    lshi(r0, rn(reg), 32);
-    ROTLWI(rn(reg), rn(top), 8);
-    RLWIMI(rn(reg), rn(top), 24, 0, 7);
-    RLWIMI(rn(reg), rn(top), 24, 16, 23);
+    jit_unget_reg(reg);
+}
+
+#    if __WORDSIZE == 64
+static void
+_htonr_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));
+    lshi(r0, r0, 32);
     orr(r0, r0, rn(reg));
-    movr(r0, rn(top));
-    jit_unget_reg(top);
-#    endif
     jit_unget_reg(reg);
 }
+#    endif
 #  endif
 
 static void
diff --git a/lib/jit_ppc-sz.c b/lib/jit_ppc-sz.c
index ba78813..1de3b9b 100644
--- a/lib/jit_ppc-sz.c
+++ b/lib/jit_ppc-sz.c
@@ -85,7 +85,9 @@
     4, /* extr_us */
     0, /* extr_i */
     0, /* extr_ui */
-    4, /* htonr */
+    4, /* htonr_us */
+    4, /* htonr_ui */
+    0, /* htonr_ul */
     8, /* ldr_c */
     12,        /* ldi_c */
     4, /* ldr_uc */
@@ -441,7 +443,9 @@
     4, /* extr_us */
     0, /* extr_i */
     0, /* extr_ui */
-    4, /* htonr */
+    4, /* htonr_us */
+    4, /* htonr_ui */
+    0, /* htonr_ul */
     8, /* ldr_c */
     12,        /* ldi_c */
     4, /* ldr_uc */
@@ -797,7 +801,15 @@
     4, /* extr_us */
     4, /* extr_i */
     4, /* extr_ui */
-    4, /* htonr */
+#  if __BYTE_ORDER == __BIG_ENDIAN
+    4, /* htonr_us */
+    4, /* htonr_ui */
+    4, /* htonr_ul */
+#else
+    20,        /* htonr_us */
+    16,        /* htonr_ui */
+    44,        /* htonr_ul */
+#endif
     8, /* ldr_c */
     28,        /* ldi_c */
     4, /* ldr_uc */
diff --git a/lib/jit_ppc.c b/lib/jit_ppc.c
index c2055ab..4549c99 100644
--- a/lib/jit_ppc.c
+++ b/lib/jit_ppc.c
@@ -949,7 +949,11 @@ _emit_code(jit_state_t *_jit)
                case_rr(ext, _i);
                case_rr(ext, _ui);
 #  endif
-               case_rr(hton,);
+               case_rr(hton, _us);
+               case_rr(hton, _ui);
+#  if __WORDSIZE == 64
+               case_rr(hton, _ul);
+#  endif
                case_rr(neg,);
                case_rr(com,);
                case_rr(mov,);
diff --git a/lib/jit_s390x-cpu.c b/lib/jit_s390x-cpu.c
index 167840c..ef5d844 100644
--- a/lib/jit_s390x-cpu.c
+++ b/lib/jit_s390x-cpu.c
@@ -1004,7 +1004,9 @@ 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(r0,r1)                 movr(r0,r1)
+#  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)
 #  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_s390x-sz.c b/lib/jit_s390x-sz.c
index a933e15..397a59b 100644
--- a/lib/jit_s390x-sz.c
+++ b/lib/jit_s390x-sz.c
@@ -84,7 +84,9 @@
     4, /* extr_us */
     4, /* extr_i */
     4, /* extr_ui */
-    4, /* htonr */
+    4, /* htonr_us */
+    4, /* htonr_ui */
+    4, /* htonr_ul */
     6, /* ldr_c */
     18,        /* ldi_c */
     6, /* ldr_uc */
diff --git a/lib/jit_s390x.c b/lib/jit_s390x.c
index 28abe40..d79e963 100644
--- a/lib/jit_s390x.c
+++ b/lib/jit_s390x.c
@@ -808,7 +808,9 @@ _emit_code(jit_state_t *_jit)
                case_wrr(stx, _i);
                case_rrr(stx, _l);
                case_wrr(stx, _l);
-               case_rr(hton,);
+               case_rr(hton, _us);
+               case_rr(hton, _ui);
+               case_rr(hton, _ul);
                case_rr(ext, _c);
                case_rr(ext, _uc);
                case_rr(ext, _s);
diff --git a/lib/jit_sparc-cpu.c b/lib/jit_sparc-cpu.c
index 96150d3..2a9e2a2 100644
--- a/lib/jit_sparc-cpu.c
+++ b/lib/jit_sparc-cpu.c
@@ -508,7 +508,8 @@ static void _xori(jit_state_t*, jit_int32_t, jit_int32_t, 
jit_word_t);
 #  define rshi(r0, r1, i0)             SRAI(r1, i0, r0)
 #  define rshr_u(r0, r1, r2)           SRL(r1, r2, r0)
 #  define rshi_u(r0, r1, i0)           SRLI(r1, i0, r0)
-#  define htonr(r0,r1)                 movr(r0,r1)
+#  define htonr_us(r0,r1)              extr_us(r0,r1)
+#  define htonr_ui(r0,r1)              movr(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)
diff --git a/lib/jit_sparc-sz.c b/lib/jit_sparc-sz.c
index 6acfd09..95ac33a 100644
--- a/lib/jit_sparc-sz.c
+++ b/lib/jit_sparc-sz.c
@@ -84,7 +84,9 @@
     8, /* extr_us */
     0, /* extr_i */
     0, /* extr_ui */
-    4, /* htonr */
+    4, /* htonr_us */
+    4, /* htonr_ui */
+    0, /* htonr_ul */
     4, /* ldr_c */
     12,        /* ldi_c */
     4, /* ldr_uc */
diff --git a/lib/jit_sparc.c b/lib/jit_sparc.c
index 80e6785..47da7cc 100644
--- a/lib/jit_sparc.c
+++ b/lib/jit_sparc.c
@@ -830,7 +830,8 @@ _emit_code(jit_state_t *_jit)
                case_wrr(stx, _s);
                case_rrr(stx, _i);
                case_wrr(stx, _i);
-               case_rr(hton,);
+               case_rr(hton, _us);
+               case_rr(hton, _ui);
                case_rr(ext, _c);
                case_rr(ext, _uc);
                case_rr(ext, _s);
diff --git a/lib/jit_x86-cpu.c b/lib/jit_x86-cpu.c
index 23bda6b..50ab0e3 100644
--- a/lib/jit_x86-cpu.c
+++ b/lib/jit_x86-cpu.c
@@ -371,8 +371,14 @@ 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(r0, r1)                  _htonr(_jit, r0, r1)
-static void _htonr(jit_state_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);
+#  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);
+#endif
 #  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)
@@ -438,7 +444,6 @@ static void _ldxi_s(jit_state_t*, jit_int32_t, jit_int32_t, 
jit_word_t);
 static void _ldxr_us(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
 #  define ldxi_us(r0, r1, i0)          _ldxi_us(_jit, r0, r1, i0)
 static void _ldxi_us(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
-
 #  if __X32 || !__X64_32
 #    define ldxr_i(r0, r1, r2)         _ldxr_i(_jit, r0, r1, r2)
 static void _ldxr_i(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
@@ -2203,13 +2208,35 @@ _movir_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t 
r1)
 #endif
 
 static void
-_htonr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+_htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+{
+    extr_us(r0, r1);
+    ic(0x66);
+    rex(0, 0, _NOREG, _NOREG, r0);
+    ic(0xc1);
+    mrm(0x03, X86_ROR, r7(r0));
+    ic(8);
+}
+
+static void
+_htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
     movr(r0, r1);
-    rex(0, WIDE, _NOREG, _NOREG, r0);
+    rex(0, 0, _NOREG, _NOREG, r0);
+    ic(0x0f);
+    ic(0xc8 | r7(r0));
+}
+
+#if __X64 && !__X64_32
+static void
+_htonr_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+{
+    movr(r0, r1);
+    rex(0, 1, _NOREG, _NOREG, r0);
     ic(0x0f);
     ic(0xc8 | r7(r0));
 }
+#endif
 
 static void
 _extr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
diff --git a/lib/jit_x86-sz.c b/lib/jit_x86-sz.c
index 26aa991..99aecbb 100644
--- a/lib/jit_x86-sz.c
+++ b/lib/jit_x86-sz.c
@@ -84,7 +84,9 @@
     3, /* extr_us */
     0, /* extr_i */
     0, /* extr_ui */
-    4, /* htonr */
+    4, /* htonr_us */
+    4, /* htonr_ui */
+    0, /* htonr_ul */
     3, /* ldr_c */
     7, /* ldi_c */
     3, /* ldr_uc */
@@ -439,7 +441,9 @@
     4, /* extr_us */
     3, /* extr_i */
     3, /* extr_ui */
-    6, /* htonr */
+    9, /* htonr_us */
+    6, /* htonr_ui */
+    6, /* htonr_ul */
     4, /* ldr_c */
     15,        /* ldi_c */
     4, /* ldr_uc */
@@ -793,7 +797,9 @@
     4, /* extr_us */
     0, /* extr_i */
     0, /* extr_ui */
-    6, /* htonr */
+    9, /* htonr_us */
+    6, /* htonr_ui */
+    0, /* htonr_ul */
     5, /* ldr_c */
     9, /* ldi_c */
     5, /* ldr_uc */
@@ -1146,7 +1152,9 @@
     4, /* extr_us */
     3, /* extr_i */
     3, /* extr_ui */
-    6, /* htonr */
+    9, /* htonr_us */
+    6, /* htonr_ui */
+    6, /* htonr_ul */
     5, /* ldr_c */
     9, /* ldi_c */
     5, /* ldr_uc */
diff --git a/lib/jit_x86.c b/lib/jit_x86.c
index cb8836d..d06d560 100644
--- a/lib/jit_x86.c
+++ b/lib/jit_x86.c
@@ -1376,7 +1376,11 @@ _emit_code(jit_state_t *_jit)
                else
                    movi(rn(node->u.w), node->v.w);
                break;
-               case_rr(hton,);
+               case_rr(hton, _us);
+               case_rr(hton, _ui);
+#if __X64 && !__X64_32
+               case_rr(hton, _ul);
+#endif
                case_rr(ext, _c);
                case_rr(ext, _uc);
                case_rr(ext, _s);
diff --git a/lib/lightning.c b/lib/lightning.c
index 5894db2..5422b77 100644
--- a/lib/lightning.c
+++ b/lib/lightning.c
@@ -1237,7 +1237,8 @@ _jit_classify(jit_state_t *_jit, jit_code_t code)
        case jit_code_extr_us:  case jit_code_extr_i:   case jit_code_extr_ui:
        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:    case jit_code_ldr_c:    case jit_code_ldr_uc:
+       case jit_code_htonr_us: case jit_code_htonr_ui: case jit_code_htonr_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:
        case jit_code_absr_f:   case jit_code_sqrtr_f:  case jit_code_movr_f:



reply via email to

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