1*9f54dc1cSRichard Henderson /* Test STBY */
2*9f54dc1cSRichard Henderson
3*9f54dc1cSRichard Henderson #include <pthread.h>
4*9f54dc1cSRichard Henderson #include <stdio.h>
5*9f54dc1cSRichard Henderson #include <stdlib.h>
6*9f54dc1cSRichard Henderson #include <string.h>
7*9f54dc1cSRichard Henderson
8*9f54dc1cSRichard Henderson
9*9f54dc1cSRichard Henderson struct S {
10*9f54dc1cSRichard Henderson unsigned a;
11*9f54dc1cSRichard Henderson unsigned b;
12*9f54dc1cSRichard Henderson unsigned c;
13*9f54dc1cSRichard Henderson };
14*9f54dc1cSRichard Henderson
check(const struct S * s,unsigned e,const char * which,const char * insn,int ofs)15*9f54dc1cSRichard Henderson static void check(const struct S *s, unsigned e,
16*9f54dc1cSRichard Henderson const char *which, const char *insn, int ofs)
17*9f54dc1cSRichard Henderson {
18*9f54dc1cSRichard Henderson int err = 0;
19*9f54dc1cSRichard Henderson
20*9f54dc1cSRichard Henderson if (s->a != 0) {
21*9f54dc1cSRichard Henderson fprintf(stderr, "%s %s %d: garbage before word 0x%08x\n",
22*9f54dc1cSRichard Henderson which, insn, ofs, s->a);
23*9f54dc1cSRichard Henderson err = 1;
24*9f54dc1cSRichard Henderson }
25*9f54dc1cSRichard Henderson if (s->c != 0) {
26*9f54dc1cSRichard Henderson fprintf(stderr, "%s %s %d: garbage after word 0x%08x\n",
27*9f54dc1cSRichard Henderson which, insn, ofs, s->c);
28*9f54dc1cSRichard Henderson err = 1;
29*9f54dc1cSRichard Henderson }
30*9f54dc1cSRichard Henderson if (s->b != e) {
31*9f54dc1cSRichard Henderson fprintf(stderr, "%s %s %d: 0x%08x != 0x%08x\n",
32*9f54dc1cSRichard Henderson which, insn, ofs, s->b, e);
33*9f54dc1cSRichard Henderson err = 1;
34*9f54dc1cSRichard Henderson }
35*9f54dc1cSRichard Henderson
36*9f54dc1cSRichard Henderson if (err) {
37*9f54dc1cSRichard Henderson exit(1);
38*9f54dc1cSRichard Henderson }
39*9f54dc1cSRichard Henderson }
40*9f54dc1cSRichard Henderson
41*9f54dc1cSRichard Henderson #define TEST(INSN, OFS, E) \
42*9f54dc1cSRichard Henderson do { \
43*9f54dc1cSRichard Henderson s.b = 0; \
44*9f54dc1cSRichard Henderson asm volatile(INSN " %1, " #OFS "(%0)" \
45*9f54dc1cSRichard Henderson : : "r"(&s.b), "r" (0x11223344) : "memory"); \
46*9f54dc1cSRichard Henderson check(&s, E, which, INSN, OFS); \
47*9f54dc1cSRichard Henderson } while (0)
48*9f54dc1cSRichard Henderson
test(const char * which)49*9f54dc1cSRichard Henderson static void test(const char *which)
50*9f54dc1cSRichard Henderson {
51*9f54dc1cSRichard Henderson struct S s = { };
52*9f54dc1cSRichard Henderson
53*9f54dc1cSRichard Henderson TEST("stby,b", 0, 0x11223344);
54*9f54dc1cSRichard Henderson TEST("stby,b", 1, 0x00223344);
55*9f54dc1cSRichard Henderson TEST("stby,b", 2, 0x00003344);
56*9f54dc1cSRichard Henderson TEST("stby,b", 3, 0x00000044);
57*9f54dc1cSRichard Henderson
58*9f54dc1cSRichard Henderson TEST("stby,e", 0, 0x00000000);
59*9f54dc1cSRichard Henderson TEST("stby,e", 1, 0x11000000);
60*9f54dc1cSRichard Henderson TEST("stby,e", 2, 0x11220000);
61*9f54dc1cSRichard Henderson TEST("stby,e", 3, 0x11223300);
62*9f54dc1cSRichard Henderson }
63*9f54dc1cSRichard Henderson
child(void * x)64*9f54dc1cSRichard Henderson static void *child(void *x)
65*9f54dc1cSRichard Henderson {
66*9f54dc1cSRichard Henderson return NULL;
67*9f54dc1cSRichard Henderson }
68*9f54dc1cSRichard Henderson
main()69*9f54dc1cSRichard Henderson int main()
70*9f54dc1cSRichard Henderson {
71*9f54dc1cSRichard Henderson int err;
72*9f54dc1cSRichard Henderson pthread_t thr;
73*9f54dc1cSRichard Henderson
74*9f54dc1cSRichard Henderson /* Run test in serial mode */
75*9f54dc1cSRichard Henderson test("serial");
76*9f54dc1cSRichard Henderson
77*9f54dc1cSRichard Henderson /* Create a dummy thread to start parallel mode. */
78*9f54dc1cSRichard Henderson err = pthread_create(&thr, NULL, child, NULL);
79*9f54dc1cSRichard Henderson if (err != 0) {
80*9f54dc1cSRichard Henderson fprintf(stderr, "pthread_create: %s\n", strerror(err));
81*9f54dc1cSRichard Henderson return 2;
82*9f54dc1cSRichard Henderson }
83*9f54dc1cSRichard Henderson
84*9f54dc1cSRichard Henderson /* Run test in parallel mode */
85*9f54dc1cSRichard Henderson test("parallel");
86*9f54dc1cSRichard Henderson return 0;
87*9f54dc1cSRichard Henderson }
88