xref: /qemu/tests/tcg/hppa/stby.c (revision b5a3d8bc9146ba22a25116cb748c97341bf99737)
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