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 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 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 64*9f54dc1cSRichard Henderson static void *child(void *x) 65*9f54dc1cSRichard Henderson { 66*9f54dc1cSRichard Henderson return NULL; 67*9f54dc1cSRichard Henderson } 68*9f54dc1cSRichard Henderson 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