[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);
}
- [Guile-commits] 307/437: x86: Build and pass all tests on 32 bit cygwin, (continued)
- [Guile-commits] 307/437: x86: Build and pass all tests on 32 bit cygwin, Andy Wingo, 2018/07/02
- [Guile-commits] 401/437: Implement a correct generation of Fibonacci numbers., Andy Wingo, 2018/07/02
- [Guile-commits] 318/437: Add label predicates, Andy Wingo, 2018/07/02
- [Guile-commits] 373/437: Update copyright date, Andy Wingo, 2018/07/02
- [Guile-commits] 403/437: Correct wrong movr simplification, Andy Wingo, 2018/07/02
- [Guile-commits] 324/437: misc: Enable silent rules to make warnings stick out, Andy Wingo, 2018/07/02
- [Guile-commits] 175/437: Make JIT_RET, JIT_FRET and JIT_SP private., Andy Wingo, 2018/07/02
- [Guile-commits] 430/437: Remove special cflags for obsolete Lightning targets, Andy Wingo, 2018/07/02
- [Guile-commits] 375/437: Update the correct fp offset and add assertions, Andy Wingo, 2018/07/02
- [Guile-commits] 413/437: Correct logic error with jit_live in jit_retr, Andy Wingo, 2018/07/02
- [Guile-commits] 140/437: Add new test cases to exercise memory load/store.,
Andy Wingo <=
- [Guile-commits] 267/437: GNU lightning 2.0.2 release, Andy Wingo, 2018/07/02
- [Guile-commits] 275/437: GNU lightning 2.0.3 release, Andy Wingo, 2018/07/02
- [Guile-commits] 338/437: Add missing ellipsis mark to align.tst, Andy Wingo, 2018/07/02
- [Guile-commits] 269/437: ARM: Minor changes that should allow building on non gnu-linux/gcc., Andy Wingo, 2018/07/02
- [Guile-commits] 260/437: Correct source of the self test case and a missed check failure., Andy Wingo, 2018/07/02
- [Guile-commits] 216/437: Prepare for the first alpha release of lightning 2.0., Andy Wingo, 2018/07/02
- [Guile-commits] 385/437: ia64: Add initial jit_va_ calls to ia64, Andy Wingo, 2018/07/02
- [Guile-commits] 382/437: mips: Add initial jit_va_ calls to mips, Andy Wingo, 2018/07/02
- [Guile-commits] 353/437: Remove inconsistent, public jit_arg_reg_p macro, Andy Wingo, 2018/07/02
- [Guile-commits] 372/437: Properly correct read of freed memory, Andy Wingo, 2018/07/02