diff --git a/ChangeLog b/ChangeLog index b5a7a754b..f73029e94 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2012-12-05 Paulo Andrade + + * check/ldstr.ok, check/ldstr.tst, check/ldsti.ok, + check/ldsti.tst, check/ldstxr.ok, check/ldstxr.tst, + check/ldstxi.ok, check/ldstxi.tst: + New test case files exercising a very large amount of + register combinations to verify load/store implementation. + + * check/Makefile.am: Update for new test cases. + + * lib/jit_x86-cpu.c: Correct wrong argument order when + computing REX prefix for {ld,st}r_T codes; + 2012-12-04 Paulo Andrade * lib/jit_mips-fpu.c, lib/jit_mips.c: Implement missing mips diff --git a/check/Makefile.am b/check/Makefile.am index 450cee948..c380279be 100644 --- a/check/Makefile.am +++ b/check/Makefile.am @@ -32,10 +32,14 @@ EXTRA_DIST = \ divi.tst divi.ok \ fib.tst fib.ok \ rpn.tst rpn.ok \ + ldstr.tst ldstr.ok \ + ldsti.tst ldsti.ok \ + ldstxi.tst ldstxi.ok \ + ldstxr.tst ldstxr.ok \ check.sh run-test \ all.tst -TESTS = 3to2 add allocai bp divi fib rpn +TESTS = 3to2 add allocai bp divi fib rpn ldstr ldsti ldstxi ldstxr CLEANFILES = $(TESTS) diff --git a/check/ldsti.ok b/check/ldsti.ok new file mode 100644 index 000000000..9766475a4 --- /dev/null +++ b/check/ldsti.ok @@ -0,0 +1 @@ +ok diff --git a/check/ldsti.tst b/check/ldsti.tst new file mode 100644 index 000000000..120e16a4a --- /dev/null +++ b/check/ldsti.tst @@ -0,0 +1,241 @@ +#if __WORDSIZE == 64 +# define L0 0x8000000000000001 +# define LL0 L0 +# define LC0 0xffffffffffffff81 +# define LS0 0xffffffffffff8001 +# define LI0 0xffffffff80000001 +# define L1 0x8000000000000000 +# define LL1 L1 +# define LC1 0xffffffffffffff80 +# define LS1 0xffffffffffff8000 +# define LI1 0xffffffff80000000 +# define L2 0x7fffffffffffffff +# define LL2 L2 +# define LC2 0x000000000000007f +# define LS2 0x0000000000007fff +# define LI2 0x000000007fffffff +# define L3 0xffffffffffffffff +# define LL3 L3 +# define LC3 0xffffffffffffffff +# define LS3 0xffffffffffffffff +# define LI3 0xffffffffffffffff +#endif +#define I0 0x80000001 +#define II0 I0 +#define IC0 0xffffff81 +#define IS0 0xffff8001 +#define I1 0x80000000 +#define II1 I1 +#define IC1 0xffffff80 +#define IS1 0xffff8000 +#define I2 0x7fffffff +#define II2 I2 +#define IC2 0x0000007f +#define IS2 0x00007fff +#define I3 0xffffffff +#define II3 I3 +#define IC3 0xffffffff +#define IS3 0xffffffff +#define S0 0x8001 +#define S1 0x8000 +#define S2 0x7fff +#define S3 0xffff +#define C0 0x81 +#define C1 0x80 +#define C2 0x7f +#define C3 0xff +#define F0 0.25 +#define F1 0.75 +#define F2 -0.25 +#define F3 -0.75 +#define D0 0.25 +#define D1 0.75 +#define D2 -0.25 +#define D3 -0.75 + +.data 512 +ok: +.c "ok\n" +t0: +c0: +.c 0 +uc0: +.c 0 +s0: +.s 0 +us0: +.s 0 +.align 4 +i0: +.i 0 +#if __WORDSIZE == 64 +ui0: +.i 0 +.align 8 +l0: +.l 0 +#endif +f0: +.f 0 +.align 8 +d0: +.d 0 + +#if __WORDSIZE == 64 +# define LDSTL(N, R0) \ + sti_i ui0 %R0 \ + movi %R0 L##N \ + sti_l l0 %R0 + +# define SI(C, N, x, X, R0) \ + ldi_##x %R0 x##0 \ + beqi L##x##C %R0 L##X##N \ + calli @abort \ +L##x##C: + +# define LDRL(C, N, R0) \ + UI(C, N, i, I, R0) \ + SI(C, N, l, L, R0) +#else +# define LDSTL(C, R0) +# define SI(C, N, x, X, R0) \ + ldi_##x %R0 x##0 \ + beqi L##x##C %R0 I##X##N \ + calli @abort \ +L##x##C: + +# define LDRL(C, N, R0) + +#endif + +#define UI(C, N, x, X, R0) \ + ldi_u##x %R0 u##x##0 \ + beqi Lu##x##C %R0 X##N \ + calli @abort \ +Lu##x##C: + +#define FF(C, N, x, X, F0) \ + ldi_##x %F0 x##0 \ + beqi_##x L##x##C %F0 X##N \ +L##x##C: + +#define LDST1(X, N, R0, F0) \ + movi %R0 C##N \ + sti_c c0 %R0 \ + sti_c uc0 %R0 \ + movi %R0 S##N \ + sti_s s0 %R0 \ + sti_s us0 %R0 \ + movi %R0 I##N \ + sti_i i0 %R0 \ + LDSTL(N, R0) \ + movi_f %F0 F##N \ + sti_f f0 %F0 \ + movi_d %F0 D##N \ + sti_d d0 %F0 \ + SI(X, N, c, C, R0) \ + UI(X, N, c, C, R0) \ + SI(X, N, s, S, R0) \ + UI(X, N, s, S, R0) \ + SI(X, N, i, I, R0) \ + LDRL(X, N, R0) \ + FF(X, N, f, F, F0) \ + FF(X, N, d, D, F0) + +#define LDST0(R0, F0) \ + LDST1(0_##R0##_##F0, 0, R0, F0) \ + LDST1(1_##R0##_##F0, 1, R0, F0) \ + LDST1(2_##R0##_##F0, 2, R0, F0) \ + LDST1(3_##R0##_##F0, 3, R0, F0) + +#define LDST(V0, V1, V2, R0, R1, R2, F0, F1, F2, F3, F4, F5) \ + LDST0(V0, F0) \ + LDST0(V1, F1) \ + LDST0(V2, F3) \ + LDST0(R0, F4) \ + LDST0(R1, F5) \ + LDST0(R2, F0) + +.code + jmpi main + +main: + prolog + + /* Simple test to simplify validating encodings before + * brute force tests */ + movi %r1 0x81 + sti_c c0 %r1 + sti_c uc0 %r1 + movi %r1 0x8001 + sti_s s0 %r1 + sti_s us0 %r1 + movi %r1 0x80000001 + sti_i i0 %r1 +#if __WORDSIZE == 64 + sti_i ui0 %r1 + movi %r1 0x8000000000000001 + sti_l l0 %r1 +#endif + movi_f %f0 0.5 + sti_f f0 %f0 + movi_d %f0 0.25 + sti_d d0 %f0 + ldi_c %r1 c0 +#if __WORDSIZE == 32 + beqi Lc %r1 0xffffff81 +#else + beqi Lc %r1 0xffffffffffffff81 +#endif + calli @abort +Lc: + ldi_uc %r1 uc0 + beqi Luc %r1 0x81 + calli @abort +Luc: + ldi_s %r1 s0 +#if __WORDSIZE == 32 + beqi Ls %r1 0xffff8001 +#else + beqi Ls %r1 0xffffffffffff8001 +#endif + calli @abort +Ls: + ldi_us %r1 us0 + beqi Lus %r1 0x8001 + calli @abort +Lus: + ldi_i %r1 i0 +#if __WORDSIZE == 32 + beqi Li %r1 0x80000001 +#else + beqi Li %r1 0xffffffff80000001 +#endif + calli @abort +Li: +#if __WORDSIZE == 64 + ldi_ui %r1 ui0 + beqi Lui %r1 0x80000001 + calli @abort +Lui: + ldi_l %r1 l0 + beqi Ll %r1 0x8000000000000001 + calli @abort +Ll: +#endif + ldi_f %f0 f0 + beqi_f Lf %f0 0.5 + calli @abort +Lf: + ldi_d %f0 d0 + beqi_d Ld %f0 0.25 + calli @abort +Ld: + + LDST(v0, v1, v2, r0, r1, r2, f0, f1, f2, f3, f4, f5) + // just to know did not abort + prepare 1 + pushargi ok + finishi @printf + ret + epilog diff --git a/check/ldstr.ok b/check/ldstr.ok new file mode 100644 index 000000000..9766475a4 --- /dev/null +++ b/check/ldstr.ok @@ -0,0 +1 @@ +ok diff --git a/check/ldstr.tst b/check/ldstr.tst new file mode 100644 index 000000000..5ab255d2f --- /dev/null +++ b/check/ldstr.tst @@ -0,0 +1,290 @@ +#if __WORDSIZE == 64 +# define L0 0x8000000000000001 +# define LL0 L0 +# define LC0 0xffffffffffffff81 +# define LS0 0xffffffffffff8001 +# define LI0 0xffffffff80000001 +# define L1 0x8000000000000000 +# define LL1 L1 +# define LC1 0xffffffffffffff80 +# define LS1 0xffffffffffff8000 +# define LI1 0xffffffff80000000 +# define L2 0x7fffffffffffffff +# define LL2 L2 +# define LC2 0x000000000000007f +# define LS2 0x0000000000007fff +# define LI2 0x000000007fffffff +# define L3 0xffffffffffffffff +# define LL3 L3 +# define LC3 0xffffffffffffffff +# define LS3 0xffffffffffffffff +# define LI3 0xffffffffffffffff +#endif +#define I0 0x80000001 +#define II0 I0 +#define IC0 0xffffff81 +#define IS0 0xffff8001 +#define I1 0x80000000 +#define II1 I1 +#define IC1 0xffffff80 +#define IS1 0xffff8000 +#define I2 0x7fffffff +#define II2 I2 +#define IC2 0x0000007f +#define IS2 0x00007fff +#define I3 0xffffffff +#define II3 I3 +#define IC3 0xffffffff +#define IS3 0xffffffff +#define S0 0x8001 +#define S1 0x8000 +#define S2 0x7fff +#define S3 0xffff +#define C0 0x81 +#define C1 0x80 +#define C2 0x7f +#define C3 0xff +#define F0 0.25 +#define F1 0.75 +#define F2 -0.25 +#define F3 -0.75 +#define D0 0.25 +#define D1 0.75 +#define D2 -0.25 +#define D3 -0.75 + +.data 512 +ok: +.c "ok\n" +t0: +c0: +.c 0 +uc0: +.c 0 +s0: +.s 0 +us0: +.s 0 +.align 4 +i0: +.i 0 +#if __WORDSIZE == 64 +ui0: +.i 0 +.align 8 +l0: +.l 0 +#endif +f0: +.f 0 +.align 8 +d0: +.d 0 + +. $($offc = c0 - t0) +. $($offuc = uc0 - t0) +. $($offs = s0 - t0) +. $($offus = us0 - t0) +. $($offi = i0 - t0) +#if __WORDSIZE == 64 +. $($offui = ui0 - t0) +. $($offl = l0 - t0) +#endif +. $($offf = f0 - t0) +. $($offd = d0 - t0) + +#if __WORDSIZE == 64 +# define LDSTL(N, R0, R1) \ + movi %R0 $(t0 + $offui) \ + str_i %R0 %R1 \ + movi %R0 $(t0 + $offl) \ + movi %R1 L##N \ + str_l %R0 %R1 + +# define SI(C, N, x, X, R0, R1) \ + movi %R0 $(t0 + $off##x) \ + ldr_##x %R1 %R0 \ + beqi L##x##C %R1 L##X##N \ + calli @abort \ +L##x##C: + +# define LDRL(C, N, R0, R1) \ + UI(C, N, i, I, R0, R1) \ + SI(C, N, l, L, R0, R1) +#else +# define LDSTL(C, R0, R1) +# define SI(C, N, x, X, R0, R1) \ + movi %R0 $(t0 + $off##x) \ + ldr_##x %R1 %R0 \ + beqi L##x##C %R1 I##X##N \ + calli @abort \ +L##x##C: + +# define LDRL(C, N, R0, R1) + +#endif + +#define UI(C, N, x, X, R0, R1) \ + movi %R0 $(t0 + $offu##x) \ + ldr_u##x %R1 %R0 \ + beqi Lu##x##C %R1 X##N \ + calli @abort \ +Lu##x##C: + +#define FF(C, N, x, X, R0, F0) \ + movi %R0 $(t0 + $off##x) \ + ldr_##x %F0 %R0 \ + beqi_##x L##x##C %F0 X##N \ +L##x##C: + +#define LDST1(X, N, R0, R1, F0) \ + movi %R0 $(t0 + $offc) \ + movi %R1 C##N \ + str_c %R0 %R1 \ + movi %R0 $(t0 + $offuc) \ + str_c %R0 %R1 \ + movi %R0 $(t0 + $offs) \ + movi %R1 S##N \ + str_s %R0 %R1 \ + movi %R0 $(t0 + $offus) \ + str_s %R0 %R1 \ + movi %R0 $(t0 + $offi) \ + movi %R1 I##N \ + str_i %R0 %R1 \ + LDSTL(N, R0, R1) \ + movi %R0 $(t0 + $offf) \ + movi_f %F0 F##N \ + str_f %R0 %F0 \ + movi %R0 $(t0 + $offd) \ + movi_d %F0 D##N \ + str_d %R0 %F0 \ + SI(X, N, c, C, R0, R1) \ + UI(X, N, c, C, R0, R1) \ + SI(X, N, s, S, R0, R1) \ + UI(X, N, s, S, R0, R1) \ + SI(X, N, i, I, R0, R1) \ + LDRL(X, N, R0, R1) \ + FF(X, N, f, F, R0, F0) \ + FF(X, N, d, D, R0, F0) + +#define LDST0(R0, R1, F0) \ + LDST1(0_##R0##_##R1##_##F0, 0, R0, R1, F0) \ + LDST1(1_##R0##_##R1##_##F0, 1, R0, R1, F0) \ + LDST1(2_##R0##_##R1##_##F0, 2, R0, R1, F0) \ + LDST1(3_##R0##_##R1##_##F0, 3, R0, R1, F0) + +#define LDST(V0, V1, V2, R0, R1, R2, F0, F1, F2, F3, F4, F5) \ + LDST0(V0, V1, F0) \ + LDST0(V0, V2, F1) \ + LDST0(V0, R0, F3) \ + LDST0(V0, R1, F4) \ + LDST0(V0, R2, F5) \ + LDST0(V1, V2, F0) \ + LDST0(V1, R0, F1) \ + LDST0(V1, R1, F2) \ + LDST0(V1, R2, F3) \ + LDST0(V2, R0, F4) \ + LDST0(V2, R1, F5) \ + LDST0(V2, R2, F0) + +.code + jmpi main + +main: + prolog + + /* Simple test to simplify validating encodings before + * brute force tests */ + movi %r0 $(t0 + $offc) + movi %r1 0x81 + str_c %r0 %r1 + movi %r0 $(t0 + $offuc) + str_c %r0 %r1 + movi %r0 $(t0 + $offs) + movi %r1 0x8001 + str_s %r0 %r1 + movi %r0 $(t0 + $offus) + str_s %r0 %r1 + movi %r0 $(t0 + $offi) + movi %r1 0x80000001 + str_i %r0 %r1 +#if __WORDSIZE == 64 + movi %r0 $(t0 + $offui) + str_i %r0 %r1 + movi %r0 $(t0 + $offl) + movi %r1 0x8000000000000001 + str_l %r0 %r1 +#endif + movi %r0 $(t0 + $offf) + movi_f %f0 0.5 + str_f %r0 %f0 + movi %r0 $(t0 + $offd) + movi_d %f0 0.25 + str_d %r0 %f0 + movi %r0 $(t0 + $offc) + ldr_c %r1 %r0 +#if __WORDSIZE == 32 + beqi Lc %r1 0xffffff81 +#else + beqi Lc %r1 0xffffffffffffff81 +#endif + calli @abort +Lc: + movi %r0 $(t0 + $offuc) + ldr_uc %r1 %r0 + beqi Luc %r1 0x81 + calli @abort +Luc: + movi %r0 $(t0 + $offs) + ldr_s %r1 %r0 +#if __WORDSIZE == 32 + beqi Ls %r1 0xffff8001 +#else + beqi Ls %r1 0xffffffffffff8001 +#endif + calli @abort +Ls: + movi %r0 $(t0 + $offus) + ldr_us %r1 %r0 + beqi Lus %r1 0x8001 + calli @abort +Lus: + movi %r0 $(t0 + $offi) + ldr_i %r1 %r0 +#if __WORDSIZE == 32 + beqi Li %r1 0x80000001 +#else + beqi Li %r1 0xffffffff80000001 +#endif + calli @abort +Li: +#if __WORDSIZE == 64 + movi %r0 $(t0 + $offui) + ldr_ui %r1 %r0 + beqi Lui %r1 0x80000001 + calli @abort +Lui: + movi %r0 $(t0 + $offl) + ldr_l %r1 %r0 + beqi Ll %r1 0x8000000000000001 + calli @abort +Ll: +#endif + movi %r0 $(t0 + $offf) + ldr_f %f0 %r0 + beqi_f Lf %f0 0.5 + calli @abort +Lf: + movi %r0 $(t0 + $offd) + ldr_d %f0 %r0 + beqi_d Ld %f0 0.25 + calli @abort +Ld: + + LDST(v0, v1, v2, r0, r1, r2, f0, f1, f2, f3, f4, f5) + // just to know did not abort + prepare 1 + pushargi ok + finishi @printf + ret + epilog diff --git a/check/ldstxi.ok b/check/ldstxi.ok new file mode 100644 index 000000000..9766475a4 --- /dev/null +++ b/check/ldstxi.ok @@ -0,0 +1 @@ +ok diff --git a/check/ldstxi.tst b/check/ldstxi.tst new file mode 100644 index 000000000..e981b7ff4 --- /dev/null +++ b/check/ldstxi.tst @@ -0,0 +1,261 @@ +#if __WORDSIZE == 64 +# define L0 0x8000000000000001 +# define LL0 L0 +# define LC0 0xffffffffffffff81 +# define LS0 0xffffffffffff8001 +# define LI0 0xffffffff80000001 +# define L1 0x8000000000000000 +# define LL1 L1 +# define LC1 0xffffffffffffff80 +# define LS1 0xffffffffffff8000 +# define LI1 0xffffffff80000000 +# define L2 0x7fffffffffffffff +# define LL2 L2 +# define LC2 0x000000000000007f +# define LS2 0x0000000000007fff +# define LI2 0x000000007fffffff +# define L3 0xffffffffffffffff +# define LL3 L3 +# define LC3 0xffffffffffffffff +# define LS3 0xffffffffffffffff +# define LI3 0xffffffffffffffff +#endif +#define I0 0x80000001 +#define II0 I0 +#define IC0 0xffffff81 +#define IS0 0xffff8001 +#define I1 0x80000000 +#define II1 I1 +#define IC1 0xffffff80 +#define IS1 0xffff8000 +#define I2 0x7fffffff +#define II2 I2 +#define IC2 0x0000007f +#define IS2 0x00007fff +#define I3 0xffffffff +#define II3 I3 +#define IC3 0xffffffff +#define IS3 0xffffffff +#define S0 0x8001 +#define S1 0x8000 +#define S2 0x7fff +#define S3 0xffff +#define C0 0x81 +#define C1 0x80 +#define C2 0x7f +#define C3 0xff +#define F0 0.25 +#define F1 0.75 +#define F2 -0.25 +#define F3 -0.75 +#define D0 0.25 +#define D1 0.75 +#define D2 -0.25 +#define D3 -0.75 + +.data 512 +ok: +.c "ok\n" +t0: +c0: +.c 0 +uc0: +.c 0 +s0: +.s 0 +us0: +.s 0 +.align 4 +i0: +.i 0 +#if __WORDSIZE == 64 +ui0: +.i 0 +.align 8 +l0: +.l 0 +#endif +f0: +.f 0 +.align 8 +d0: +.d 0 + +. $($offc = c0 - t0) +. $($offuc = uc0 - t0) +. $($offs = s0 - t0) +. $($offus = us0 - t0) +. $($offi = i0 - t0) +#if __WORDSIZE == 64 +. $($offui = ui0 - t0) +. $($offl = l0 - t0) +#endif +. $($offf = f0 - t0) +. $($offd = d0 - t0) + +#if __WORDSIZE == 64 +# define LDSTL(N, R0, R1) \ + stxi_i $offui %R0 %R1 \ + movi %R1 L##N \ + stxi_l $offl %R0 %R1 + +# define SI(C, N, x, X, R0, R1) \ + ldxi_##x %R1 %R0 $off##x \ + beqi L##x##C %R1 L##X##N \ + calli @abort \ +L##x##C: + +# define LDRL(C, N, R0, R1) \ + UI(C, N, i, I, R0, R1) \ + SI(C, N, l, L, R0, R1) +#else +# define LDSTL(C, R0, R1) +# define SI(C, N, x, X, R0, R1) \ + ldxi_##x $off##x %R1 %R0 \ + beqi L##x##C %R1 I##X##N \ + calli @abort \ +L##x##C: + +# define LDRL(C, N, R0, R1) + +#endif + +#define UI(C, N, x, X, R0, R1) \ + ldxi_u##x %R1 %R0 $offu##x \ + beqi Lu##x##C %R1 X##N \ + calli @abort \ +Lu##x##C: + +#define FF(C, N, x, X, R0, F0) \ + ldxi_##x %F0 %R0 $off##x \ + beqi_##x L##x##C %F0 X##N \ +L##x##C: + +#define LDST1(X, N, R0, R1, F0) \ + movi %R0 t0 \ + movi %R1 C##N \ + stxi_c $offc %R0 %R1 \ + stxi_c $offuc %R0 %R1 \ + movi %R1 S##N \ + stxi_s $offs %R0 %R1 \ + stxi_s $offus %R0 %R1 \ + movi %R1 I##N \ + stxi_i $offi %R0 %R1 \ + LDSTL(N, R0, R1) \ + movi_f %F0 F##N \ + stxi_f $offf %R0 %F0 \ + movi_d %F0 D##N \ + stxi_d $offd %R0 %F0 \ + SI(X, N, c, C, R0, R1) \ + UI(X, N, c, C, R0, R1) \ + SI(X, N, s, S, R0, R1) \ + UI(X, N, s, S, R0, R1) \ + SI(X, N, i, I, R0, R1) \ + LDRL(X, N, R0, R1) \ + FF(X, N, f, F, R0, F0) \ + FF(X, N, d, D, R0, F0) + +#define LDST0(R0, R1, F0) \ + LDST1(0_##R0##_##R1##_##F0, 0, R0, R1, F0) \ + LDST1(1_##R0##_##R1##_##F0, 1, R0, R1, F0) \ + LDST1(2_##R0##_##R1##_##F0, 2, R0, R1, F0) \ + LDST1(3_##R0##_##R1##_##F0, 3, R0, R1, F0) + +#define LDST(V0, V1, V2, R0, R1, R2, F0, F1, F2, F3, F4, F5) \ + LDST0(V0, V1, F0) \ + LDST0(V0, V2, F1) \ + LDST0(V0, R0, F3) \ + LDST0(V0, R1, F4) \ + LDST0(V0, R2, F5) \ + LDST0(V1, V2, F0) \ + LDST0(V1, R0, F1) \ + LDST0(V1, R1, F2) \ + LDST0(V1, R2, F3) \ + LDST0(V2, R0, F4) \ + LDST0(V2, R1, F5) \ + LDST0(V2, R2, F0) + +.code + jmpi main + +main: + prolog + + /* Simple test to simplify validating encodings before + * brute force tests */ + movi %r0 t0 + movi %r1 0x81 + stxi_c $offc %r0 %r1 + stxi_c $offuc %r0 %r1 + movi %r1 0x8001 + stxi_s $offs %r0 %r1 + stxi_s $offus %r0 %r1 + movi %r1 0x80000001 + stxi_i $offi %r0 %r1 +#if __WORDSIZE == 64 + stxi_i $offui %r0 %r1 + movi %r1 0x8000000000000001 + stxi_l $offl %r0 %r1 +#endif + movi_f %f0 0.5 + stxi_f $offf %r0 %f0 + movi_d %f0 0.25 + stxi_d $offd %r0 %f0 + ldxi_c %r1 %r0 $offc +#if __WORDSIZE == 32 + beqi Lc %r1 0xffffff81 +#else + beqi Lc %r1 0xffffffffffffff81 +#endif + calli @abort +Lc: + ldxi_uc %r1 %r0 $offuc + beqi Luc %r1 0x81 + calli @abort +Luc: + ldxi_s %r1 %r0 $offs +#if __WORDSIZE == 32 + beqi Ls %r1 0xffff8001 +#else + beqi Ls %r1 0xffffffffffff8001 +#endif + calli @abort +Ls: + ldxi_us %r1 %r0 $offus + beqi Lus %r1 0x8001 + calli @abort +Lus: + ldxi_i %r1 %r0 $offi +#if __WORDSIZE == 32 + beqi Li %r1 0x80000001 +#else + beqi Li %r1 0xffffffff80000001 +#endif + calli @abort +Li: +#if __WORDSIZE == 64 + ldxi_ui %r1 %r0 $offui + beqi Lui %r1 0x80000001 + calli @abort +Lui: + ldxi_l %r1 %r0 $offl + beqi Ll %r1 0x8000000000000001 + calli @abort +Ll: +#endif + ldxi_f %f0 %r0 $offf + beqi_f Lf %f0 0.5 + calli @abort +Lf: + ldxi_d %f0 %r0 $offd + beqi_d Ld %f0 0.25 + calli @abort +Ld: + + LDST(v0, v1, v2, r0, r1, r2, f0, f1, f2, f3, f4, f5) + // just to know did not abort + prepare 1 + pushargi ok + finishi @printf + ret + epilog diff --git a/check/ldstxr.ok b/check/ldstxr.ok new file mode 100644 index 000000000..9766475a4 --- /dev/null +++ b/check/ldstxr.ok @@ -0,0 +1 @@ +ok diff --git a/check/ldstxr.tst b/check/ldstxr.tst new file mode 100644 index 000000000..c989cb686 --- /dev/null +++ b/check/ldstxr.tst @@ -0,0 +1,318 @@ +#if __WORDSIZE == 64 +# define L0 0x8000000000000001 +# define LL0 L0 +# define LC0 0xffffffffffffff81 +# define LS0 0xffffffffffff8001 +# define LI0 0xffffffff80000001 +# define L1 0x8000000000000000 +# define LL1 L1 +# define LC1 0xffffffffffffff80 +# define LS1 0xffffffffffff8000 +# define LI1 0xffffffff80000000 +# define L2 0x7fffffffffffffff +# define LL2 L2 +# define LC2 0x000000000000007f +# define LS2 0x0000000000007fff +# define LI2 0x000000007fffffff +# define L3 0xffffffffffffffff +# define LL3 L3 +# define LC3 0xffffffffffffffff +# define LS3 0xffffffffffffffff +# define LI3 0xffffffffffffffff +#endif +#define I0 0x80000001 +#define II0 I0 +#define IC0 0xffffff81 +#define IS0 0xffff8001 +#define I1 0x80000000 +#define II1 I1 +#define IC1 0xffffff80 +#define IS1 0xffff8000 +#define I2 0x7fffffff +#define II2 I2 +#define IC2 0x0000007f +#define IS2 0x00007fff +#define I3 0xffffffff +#define II3 I3 +#define IC3 0xffffffff +#define IS3 0xffffffff +#define S0 0x8001 +#define S1 0x8000 +#define S2 0x7fff +#define S3 0xffff +#define C0 0x81 +#define C1 0x80 +#define C2 0x7f +#define C3 0xff +#define F0 0.25 +#define F1 0.75 +#define F2 -0.25 +#define F3 -0.75 +#define D0 0.25 +#define D1 0.75 +#define D2 -0.25 +#define D3 -0.75 + +.data 512 +ok: +.c "ok\n" +t0: +c0: +.c 0 +uc0: +.c 0 +s0: +.s 0 +us0: +.s 0 +.align 4 +i0: +.i 0 +#if __WORDSIZE == 64 +ui0: +.i 0 +.align 8 +l0: +.l 0 +#endif +f0: +.f 0 +.align 8 +d0: +.d 0 + +. $($offc = c0 - t0) +. $($offuc = uc0 - t0) +. $($offs = s0 - t0) +. $($offus = us0 - t0) +. $($offi = i0 - t0) +#if __WORDSIZE == 64 +. $($offui = ui0 - t0) +. $($offl = l0 - t0) +#endif +. $($offf = f0 - t0) +. $($offd = d0 - t0) + +#if __WORDSIZE == 64 +# define LDSTL(N, R0, R1, R2) \ + movi %R2 $offui \ + stxr_i %R2 %R0 %R1 \ + movi %R1 L##N \ + movi %R2 $offl \ + stxr_l %R2 %R0 %R1 + +# define SI(C, N, x, X, R0, R1, R2) \ + movi %R2 $off##x \ + ldxr_##x %R1 %R0 %R2 \ + beqi L##x##C %R1 L##X##N \ + calli @abort \ +L##x##C: + +# define LDRL(C, N, R0, R1, R2) \ + UI(C, N, i, I, R0, R1, R2) \ + SI(C, N, l, L, R0, R1, R2) +#else +# define LDSTL(C, R0, R1, R2) +# define SI(C, N, x, X, R0, R1, R2) \ + movi %R2 $off##x \ + ldxr_##x %R2 %R1 %R0 \ + beqi L##x##C %R1 I##X##N \ + calli @abort \ +L##x##C: + +# define LDRL(C, N, R0, R1, R2) + +#endif + +#define UI(C, N, x, X, R0, R1, R2) \ + movi %R2 $offu##x \ + ldxr_u##x %R1 %R0 %R2 \ + beqi Lu##x##C %R1 X##N \ + calli @abort \ +Lu##x##C: + +#define FF(C, N, x, X, R0, R1, F0) \ + movi %R1 $off##x \ + ldxr_##x %F0 %R0 %R1 \ + beqi_##x L##x##C %F0 X##N \ +L##x##C: + +#define LDST1(X, N, R0, R1, R2, F0) \ + movi %R0 t0 \ + movi %R1 C##N \ + movi %R2 $offc \ + stxr_c %R2 %R0 %R1 \ + movi %R2 $offuc \ + stxr_c %R2 %R0 %R1 \ + movi %R1 S##N \ + movi %R2 $offs \ + stxr_s %R2 %R0 %R1 \ + movi %R2 $offus \ + stxr_s %R2 %R0 %R1 \ + movi %R1 I##N \ + movi %R2 $offi \ + stxr_i %R2 %R0 %R1 \ + LDSTL(N, R0, R1, R2) \ + movi_f %F0 F##N \ + movi %R2 $offf \ + stxr_f %R2 %R0 %F0 \ + movi_d %F0 D##N \ + movi %R2 $offd \ + stxr_d %R2 %R0 %F0 \ + SI(X, N, c, C, R0, R1, R2) \ + UI(X, N, c, C, R0, R1, R2) \ + SI(X, N, s, S, R0, R1, R2) \ + UI(X, N, s, S, R0, R1, R2) \ + SI(X, N, i, I, R0, R1, R2) \ + LDRL(X, N, R0, R1, R2) \ + FF(X, N, f, F, R0, R1, F0) \ + FF(X, N, d, D, R0, R1, F0) + +#define LDST0(R0, R1, R2, F0) \ + LDST1(0_##R0##_##R1##_##R2##_##F0, 0, R0, R1, R2, F0) \ + LDST1(1_##R0##_##R1##_##R2##_##F0, 1, R0, R1, R2, F0) \ + LDST1(2_##R0##_##R1##_##R2##_##F0, 2, R0, R1, R2, F0) \ + LDST1(3_##R0##_##R1##_##R2##_##F0, 3, R0, R1, R2, F0) + +#define LDST(V0, V1, V2, R0, R1, R2, F0, F1, F2, F3, F4, F5) \ + LDST0(V0, V1, R0, F0) \ + LDST0(V0, V1, R1, F1) \ + LDST0(V0, V1, R2, F2) \ + LDST0(V0, V2, R0, F3) \ + LDST0(V0, V2, R1, F4) \ + LDST0(V0, V2, R2, F5) \ + LDST0(V0, R0, V1, F0) \ + LDST0(V0, R0, V2, F1) \ + LDST0(V0, R0, R1, F2) \ + LDST0(V0, R0, R2, F3) \ + LDST0(V0, R0, V1, F4) \ + LDST0(V0, R1, V1, F5) \ + LDST0(V0, R1, V2, F0) \ + LDST0(V0, R1, R0, F1) \ + LDST0(V0, R1, R2, F2) \ + LDST0(V0, V1, V2, F3) \ + LDST0(V0, R1, R0, F4) \ + LDST0(V0, R1, R2, F5) \ + LDST0(R0, V1, V0, F0) \ + LDST0(R0, V1, R1, F1) \ + LDST0(R0, V1, R2, F2) \ + LDST0(R0, V2, V0, F3) \ + LDST0(R0, V2, R1, F4) \ + LDST0(R0, V2, R2, F5) \ + LDST0(R0, V0, V1, F0) \ + LDST0(R0, V0, V2, F1) \ + LDST0(R0, V0, R1, F2) \ + LDST0(R0, V0, R2, F3) \ + LDST0(R0, V0, V1, F4) \ + LDST0(R0, R1, V1, F5) \ + LDST0(R0, R1, V2, F0) \ + LDST0(R0, R1, V0, F1) \ + LDST0(R0, R1, R2, F2) \ + LDST0(R0, V1, V2, F3) \ + LDST0(R0, R1, V0, F4) \ + LDST0(R0, R1, R2, F5) + +.code + jmpi main + +main: + prolog + +#if 0 + /* Simple test to simplify validating encodings before + * brute force tests */ + movi %r0 t0 + movi %r1 0x81 + movi %r2 $offc + stxr_c %r2 %r0 %r1 + movi %r2 $offuc + stxr_c %r2 %r0 %r1 + movi %r1 0x8001 + movi %r2 $offs + stxr_s %r2 %r0 %r1 + movi %r2 $offus + stxr_s %r2 %r0 %r1 + movi %r1 0x80000001 + movi %r2 $offi + stxr_i %r2 %r0 %r1 +#if __WORDSIZE == 64 + movi %r2 $offui + stxr_i %r2 %r0 %r1 + movi %r1 0x8000000000000001 + movi %r2 $offl + stxr_l %r2 %r0 %r1 +#endif + movi_f %f0 0.5 + movi %r2 $offf + stxr_f %r2 %r0 %f0 + movi_d %f0 0.25 + movi %r2 $offd + stxr_d %r2 %r0 %f0 + movi %r2 $offc + ldxr_c %r1 %r0 %r2 +#if __WORDSIZE == 32 + beqi Lc %r1 0xffffff81 +#else + beqi Lc %r1 0xffffffffffffff81 +#endif + calli @abort +Lc: + movi %r2 $offuc + ldxr_uc %r1 %r0 %r2 + beqi Luc %r1 0x81 + calli @abort +Luc: + movi %r2 $offs + ldxr_s %r1 %r0 %r2 +#if __WORDSIZE == 32 + beqi Ls %r1 0xffff8001 +#else + beqi Ls %r1 0xffffffffffff8001 +#endif + calli @abort +Ls: + movi %r2 $offus + ldxr_us %r1 %r0 %r2 + beqi Lus %r1 0x8001 + calli @abort +Lus: + movi %r2 $offi + ldxr_i %r1 %r0 %r2 +#if __WORDSIZE == 32 + beqi Li %r1 0x80000001 +#else + beqi Li %r1 0xffffffff80000001 +#endif + calli @abort +Li: +#if __WORDSIZE == 64 + movi %r2 $offui + ldxr_ui %r1 %r0 %r2 + beqi Lui %r1 0x80000001 + calli @abort +Lui: + movi %r2 $offl + ldxr_l %r1 %r0 %r2 + beqi Ll %r1 0x8000000000000001 + calli @abort +Ll: +#endif + movi %r2 $offf + ldxr_f %f0 %r0 %r2 + beqi_f Lf %f0 0.5 + calli @abort +Lf: + movi %r2 $offd + ldxr_d %f0 %r0 %r2 + beqi_d Ld %f0 0.25 + calli @abort +Ld: +#endif + + LDST(v0, v1, v2, r0, r1, r2, f0, f1, f2, f3, f4, f5) + // just to know did not abort + prepare 1 + pushargi ok + finishi @printf + ret + epilog diff --git a/lib/jit_x86-cpu.c b/lib/jit_x86-cpu.c index 44e1706cd..60b57df74 100644 --- a/lib/jit_x86-cpu.c +++ b/lib/jit_x86-cpu.c @@ -1965,7 +1965,7 @@ _ldr_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { rex(0, 1, r0, _NOREG, r1); ic(0x0f); - ic(0xbe); + ic(0xb6); rx(r0, 0, r1, _NOREG, _SCL1); } @@ -2324,7 +2324,7 @@ _str_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { jit_int32_t reg; if (reg8_p(r1)) { - rex(0, 0, r1, r0, _NOREG); + rex(0, 0, r1, _NOREG, r0); ic(0x88); rx(r1, 0, r0, _NOREG, _SCL1); } @@ -2367,7 +2367,7 @@ static void _str_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { ic(0x66); - rex(0, 0, r1, r0, _NOREG); + rex(0, 0, r1, _NOREG, r0); ic(0x89); rx(r1, 0, r0, _NOREG, _SCL1); } @@ -2393,7 +2393,7 @@ _sti_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0) static void _str_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { - rex(0, 0, r1, r0, _NOREG); + rex(0, 0, r1, _NOREG, r0); ic(0x89); rx(r1, 0, r0, _NOREG, _SCL1); } @@ -2419,7 +2419,7 @@ _sti_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0) static void _str_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { - rex(0, 1, r1, r0, _NOREG); + rex(0, 1, r1, _NOREG, r0); ic(0x89); rx(r1, 0, r0, _NOREG, _SCL1); } @@ -2447,7 +2447,7 @@ _stxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { jit_int32_t reg; if (reg8_p(r2)) { - rex(0, 0, r2, r0, r1); + rex(0, 0, r2, r1, r0); ic(0x88); rx(r2, 0, r0, r1, _SCL1); } @@ -2490,7 +2490,7 @@ static void _stxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { ic(0x66); - rex(0, 0, r2, r0, r1); + rex(0, 0, r2, r1, r0); ic(0x89); rx(r2, 0, r0, r1, _SCL1); } @@ -2516,7 +2516,7 @@ _stxi_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1) static void _stxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { - rex(0, 0, r2, r0, r1); + rex(0, 0, r2, r1, r0); ic(0x89); rx(r2, 0, r0, r1, _SCL1); } @@ -2542,7 +2542,7 @@ _stxi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1) static void _stxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { - rex(0, 1, r2, r0, r1); + rex(0, 1, r2, r1, r0); ic(0x89); rx(r2, 0, r0, r1, _SCL1); }