guile-commits
[Top][All Lists]
Advanced

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

[Guile-commits] 140/437: Add new test cases to exercise memory load/stor


From: Andy Wingo
Subject: [Guile-commits] 140/437: Add new test cases to exercise memory load/store.
Date: Mon, 2 Jul 2018 05:14:04 -0400 (EDT)

wingo pushed a commit to branch lightning
in repository guile.

commit f59fceb75d13f7d60bb002a0f8cd783491011124
Author: pcpa <address@hidden>
Date:   Wed Dec 5 15:57:33 2012 -0200

    Add new test cases to exercise memory load/store.
    
        * 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;
---
 ChangeLog         |  13 +++
 check/Makefile.am |   6 +-
 check/ldsti.ok    |   1 +
 check/ldsti.tst   | 241 +++++++++++++++++++++++++++++++++++++++++
 check/ldstr.ok    |   1 +
 check/ldstr.tst   | 290 +++++++++++++++++++++++++++++++++++++++++++++++++
 check/ldstxi.ok   |   1 +
 check/ldstxi.tst  | 261 ++++++++++++++++++++++++++++++++++++++++++++
 check/ldstxr.ok   |   1 +
 check/ldstxr.tst  | 318 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/jit_x86-cpu.c |  18 ++--
 11 files changed, 1141 insertions(+), 10 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index b5a7a75..f73029e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2012-12-05 Paulo Andrade <address@hidden>
+
+       * 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 <address@hidden>
 
        * lib/jit_mips-fpu.c, lib/jit_mips.c: Implement missing mips
diff --git a/check/Makefile.am b/check/Makefile.am
index 450cee9..c380279 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 0000000..9766475
--- /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 0000000..120e16a
--- /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 0000000..9766475
--- /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 0000000..5ab255d
--- /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 0000000..9766475
--- /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 0000000..e981b7f
--- /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 0000000..9766475
--- /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 0000000..c989cb6
--- /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 44e1706..60b57df 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);
 }



reply via email to

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