| 1 | #include <unistd.h> |
| 2 | |
| 3 | #ifdef TEST_CMOV |
| 4 | |
| 5 | #define TEST_COND(N) \ |
| 6 | int test_##N (long a) \ |
| 7 | { \ |
| 8 | int res = 1; \ |
| 9 | \ |
| 10 | asm ("cmov"#N" %1,$31,%0" \ |
| 11 | : "+r" (res) : "r" (a)); \ |
| 12 | return !res; \ |
| 13 | } |
| 14 | |
| 15 | #else |
| 16 | |
| 17 | #define TEST_COND(N) \ |
| 18 | int test_##N (long a) \ |
| 19 | { \ |
| 20 | int res = 1; \ |
| 21 | \ |
| 22 | asm ("b"#N" %1,1f\n\t" \ |
| 23 | "addq $31,$31,%0\n\t" \ |
| 24 | "1: unop\n" \ |
| 25 | : "+r" (res) : "r" (a)); \ |
| 26 | return res; \ |
| 27 | } |
| 28 | |
| 29 | #endif |
| 30 | |
| 31 | TEST_COND(eq) |
| 32 | TEST_COND(ne) |
| 33 | TEST_COND(ge) |
| 34 | TEST_COND(gt) |
| 35 | TEST_COND(lbc) |
| 36 | TEST_COND(lbs) |
| 37 | TEST_COND(le) |
| 38 | TEST_COND(lt) |
| 39 | |
| 40 | static struct { |
| 41 | int (*func)(long); |
| 42 | long v; |
| 43 | int r; |
| 44 | } vectors[] = |
| 45 | { |
| 46 | {test_eq, 0, 1}, |
| 47 | {test_eq, 1, 0}, |
| 48 | |
| 49 | {test_ne, 0, 0}, |
| 50 | {test_ne, 1, 1}, |
| 51 | |
| 52 | {test_ge, 0, 1}, |
| 53 | {test_ge, 1, 1}, |
| 54 | {test_ge, -1, 0}, |
| 55 | |
| 56 | {test_gt, 0, 0}, |
| 57 | {test_gt, 1, 1}, |
| 58 | {test_gt, -1, 0}, |
| 59 | |
| 60 | {test_lbc, 0, 1}, |
| 61 | {test_lbc, 1, 0}, |
| 62 | {test_lbc, -1, 0}, |
| 63 | |
| 64 | {test_lbs, 0, 0}, |
| 65 | {test_lbs, 1, 1}, |
| 66 | {test_lbs, -1, 1}, |
| 67 | |
| 68 | {test_le, 0, 1}, |
| 69 | {test_le, 1, 0}, |
| 70 | {test_le, -1, 1}, |
| 71 | |
| 72 | {test_lt, 0, 0}, |
| 73 | {test_lt, 1, 0}, |
| 74 | {test_lt, -1, 1}, |
| 75 | }; |
| 76 | |
| 77 | int main (void) |
| 78 | { |
| 79 | int i; |
| 80 | |
| 81 | for (i = 0; i < sizeof (vectors)/sizeof(vectors[0]); i++) |
| 82 | if ((*vectors[i].func)(vectors[i].v) != vectors[i].r) { |
| 83 | write(1, "Failed\n", 7); |
| 84 | return 1; |
| 85 | } |
| 86 | write(1, "OK\n", 3); |
| 87 | return 0; |
| 88 | } |