[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:
- [Guile-commits] 431/437: Always enable assertions in embedded lightning, (continued)
- [Guile-commits] 431/437: Always enable assertions in embedded lightning, Andy Wingo, 2018/07/02
- [Guile-commits] 365/437: X86: Correct load and store in the x32 abi, Andy Wingo, 2018/07/02
- [Guile-commits] 190/437: Finish sparc port., Andy Wingo, 2018/07/02
- [Guile-commits] 436/437: Wire JIT availability check into Guile configure, Andy Wingo, 2018/07/02
- [Guile-commits] 350/437: Correct typo., Andy Wingo, 2018/07/02
- [Guile-commits] 424/437: Beginnings of build integration of lightning and guile, Andy Wingo, 2018/07/02
- [Guile-commits] 204/437: Add basic Itanium port infrastructure., Andy Wingo, 2018/07/02
- [Guile-commits] 425/437: Remove lightning pkg-config file., Andy Wingo, 2018/07/02
- [Guile-commits] 411/437: Correct issues with 32 bit big endian mips abis, Andy Wingo, 2018/07/02
- [Guile-commits] 233/437: Correct license to properly advertise LGPLv3 and not GPLv3., Andy Wingo, 2018/07/02
- [Guile-commits] 343/437: Implement new, typed, jit_htonr* interfaces,
Andy Wingo <=
- [Guile-commits] 423/437: Finish removing get-jit-size, Andy Wingo, 2018/07/02
- [Guile-commits] 320/437: Do not fail gratuitously in jit_init_debug, Andy Wingo, 2018/07/02
- [Guile-commits] 288/437: Add note about jit_set_memory_functions call., Andy Wingo, 2018/07/02
- [Guile-commits] 419/437: Merge GNU lightning to libguile/lightning, Andy Wingo, 2018/07/02
- [Guile-commits] 194/437: Rework to better describe what is used only during jit generation., Andy Wingo, 2018/07/02
- [Guile-commits] 386/437: hppa: Add initial jit_va_ calls to hppa, Andy Wingo, 2018/07/02
- [Guile-commits] 25/437: upgrade to autoconf 2.60, Andy Wingo, 2018/07/02
- [Guile-commits] 182/437: Implement the qmul and qdiv instructions., Andy Wingo, 2018/07/02
- [Guile-commits] 321/437: x86: Correct not released temporary register, Andy Wingo, 2018/07/02
- [Guile-commits] 315/437: Add string representation of IR codes to -sz.c files, Andy Wingo, 2018/07/02