mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-21 03:00:19 +02:00
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.
This commit is contained in:
parent
fdf41c1fa4
commit
88aa2fcad2
38 changed files with 630 additions and 112 deletions
22
ChangeLog
22
ChangeLog
|
@ -1,3 +1,25 @@
|
|||
2014-12-25 Paulo Andrade <pcpa@gnu.org>
|
||||
|
||||
* 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 <pcpa@gnu.org>
|
||||
|
||||
* include/lightning/jit_private.h, include/lightning/jit_x86.h,
|
||||
|
|
|
@ -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 \
|
||||
|
|
1
check/hton.ok
Normal file
1
check/hton.ok
Normal file
|
@ -0,0 +1 @@
|
|||
ok
|
169
check/hton.tst
Normal file
169
check/hton.tst
Normal file
|
@ -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
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
@ -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
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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(r0,r1) _htonr(_jit,r0,r1)
|
||||
static void _htonr(jit_state_t*,jit_int32_t,jit_int32_t);
|
||||
# define htonr_ui(r0,r1) extr_ui(r0,r1)
|
||||
# define htonr_ul(r0,r1) movr(r0,r1)
|
||||
# endif
|
||||
# else
|
||||
# define htonr_us(r0,r1) _htonr_us(_jit,r0,r1)
|
||||
static void _htonr_us(jit_state_t*,jit_int32_t,jit_int32_t);
|
||||
# define htonr_ui(r0,r1) _htonr_ui(_jit,r0,r1)
|
||||
static void _htonr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
|
||||
# if __WORDSIZE == 64
|
||||
# define htonr_ul(r0,r1) _htonr_ul(_jit,r0,r1)
|
||||
static void _htonr_ul(jit_state_t*,jit_int32_t,jit_int32_t);
|
||||
# endif
|
||||
# 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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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,);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue