From 88aa2fcad24b3abdc5d192bd83e5a2a441295655 Mon Sep 17 00:00:00 2001 From: pcpa Date: Thu, 25 Dec 2014 23:06:24 -0200 Subject: [PATCH] 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 | 63 +++++++++++----- 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, 630 insertions(+), 112 deletions(-) create mode 100644 check/hton.ok create mode 100644 check/hton.tst diff --git a/ChangeLog b/ChangeLog index 5a5c9479d..13c1363a7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +2014-12-25 Paulo Andrade + + * 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 * include/lightning/jit_private.h, include/lightning/jit_x86.h, diff --git a/check/Makefile.am b/check/Makefile.am index ca6afe90c..653742be6 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 000000000..9766475a4 --- /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 000000000..fcaf147b4 --- /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 5f179fbed..e33008e5d 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); @@ -621,6 +626,11 @@ static instr_t instr_vector[] = { entry(extr_s), entry(extr_us), #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), @@ -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 461661aa2..a2eac5772 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 93eca42ec..f49ee16ea 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 bfb096045..bf7812bd1 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 77e25b3b5..17b2fbe0f 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 03513fcd7..a550630f9 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 5bcd24ed1..ef8f71b37 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 07b13c5f8..d266a7066 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 aabccef8b..6f4ae6f67 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 5d4502893..493a6732e 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 3393f8590..a9a60f235 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 59008cbe1..efe6220f6 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 663162b88..0741f7b07 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 92d7001aa..54d3bddb8 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 9baeafab7..7a9a97491 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 8059d8cbe..1b384b2f4 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 46ff5dabc..6949355f3 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 1f48ecf08..38141ae17 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) @@ -1657,40 +1669,57 @@ _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) +{ + 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 517bedc28..c7dfbb10b 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 e871d4748..19170df6b 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 a5e50db94..bd9d185a6 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 c314813d4..81e586783 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); - orr(r0, r0, rn(reg)); - movr(r0, rn(top)); - jit_unget_reg(top); -# endif 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)); + jit_unget_reg(reg); +} +# endif # endif static void diff --git a/lib/jit_ppc-sz.c b/lib/jit_ppc-sz.c index ba7881306..1de3b9bd4 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 c2055ab6f..4549c99e8 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 167840c5d..ef5d844d2 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 a933e1553..397a59bfa 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 28abe40c6..d79e96313 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 96150d3f9..2a9e2a219 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 6acfd0989..95ac33a40 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 80e67859d..47da7cc99 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 23bda6bb6..50ab0e30f 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,14 +2208,36 @@ _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 26aa991a5..99aecbb33 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 cb8836d4c..d06d560ed 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 5894db2f1..5422b77c3 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: