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