1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define exec_op glue(exec_, OP) 3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define exec_opl glue(glue(exec_, OP), l) 4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define exec_opw glue(glue(exec_, OP), w) 5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define exec_opb glue(glue(exec_, OP), b) 6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef OP_SHIFTD 8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifdef OP_NOBYTE 10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define EXECSHIFT(size, res, s1, s2, flags) \ 11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov asm ("push %4\n\t"\ 12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "popf\n\t"\ 13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stringify(OP) size " %" size "2, %" size "0\n\t" \ 14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "pushf\n\t"\ 15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "popl %1\n\t"\ 16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "=g" (res), "=g" (flags)\ 17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "r" (s1), "0" (res), "1" (flags)); 18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else 19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define EXECSHIFT(size, res, s1, s2, flags) \ 20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov asm ("push %4\n\t"\ 21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "popf\n\t"\ 22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stringify(OP) size " %%cl, %" size "0\n\t" \ 23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "pushf\n\t"\ 24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "popl %1\n\t"\ 25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "=q" (res), "=g" (flags)\ 26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "c" (s1), "0" (res), "1" (flags)); 27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif 28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid exec_opl(int s2, int s0, int s1, int iflags) 30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int res, flags; 32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov res = s0; 33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov flags = iflags; 34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov EXECSHIFT("", res, s1, s2, flags); 35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* overflow is undefined if count != 1 */ 36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (s1 != 1) 37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov flags &= ~CC_O; 38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("%-10s A=%08x B=%08x R=%08x CCIN=%04x CC=%04x\n", 39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stringify(OP) "l", s0, s1, res, iflags, flags & CC_MASK); 40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid exec_opw(int s2, int s0, int s1, int iflags) 43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int res, flags; 45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov res = s0; 46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov flags = iflags; 47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov EXECSHIFT("w", res, s1, s2, flags); 48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* overflow is undefined if count != 1 */ 49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (s1 != 1) 50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov flags &= ~CC_O; 51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("%-10s A=%08x B=%08x R=%08x CCIN=%04x CC=%04x\n", 52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stringify(OP) "w", s0, s1, res, iflags, flags & CC_MASK); 53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else 56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define EXECSHIFT(size, res, s1, s2, flags) \ 57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov asm ("push %4\n\t"\ 58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "popf\n\t"\ 59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stringify(OP) size " %%cl, %" size "5, %" size "0\n\t" \ 60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "pushf\n\t"\ 61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "popl %1\n\t"\ 62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "=g" (res), "=g" (flags)\ 63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "c" (s1), "0" (res), "1" (flags), "r" (s2)); 64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid exec_opl(int s2, int s0, int s1, int iflags) 66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int res, flags; 68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov res = s0; 69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov flags = iflags; 70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov EXECSHIFT("", res, s1, s2, flags); 71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* overflow is undefined if count != 1 */ 72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (s1 != 1) 73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov flags &= ~CC_O; 74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("%-10s A=%08x B=%08x C=%08x R=%08x CCIN=%04x CC=%04x\n", 75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stringify(OP) "l", s0, s2, s1, res, iflags, flags & CC_MASK); 76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid exec_opw(int s2, int s0, int s1, int iflags) 79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int res, flags; 81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov res = s0; 82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov flags = iflags; 83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov EXECSHIFT("w", res, s1, s2, flags); 84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* overflow is undefined if count != 1 */ 85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (s1 != 1) 86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov flags &= ~CC_O; 87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("%-10s A=%08x B=%08x C=%08x R=%08x CCIN=%04x CC=%04x\n", 88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stringify(OP) "w", s0, s2, s1, res, iflags, flags & CC_MASK); 89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif 92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef OP_NOBYTE 94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid exec_opb(int s0, int s1, int iflags) 95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int res, flags; 97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov res = s0; 98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov flags = iflags; 99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov EXECSHIFT("b", res, s1, 0, flags); 100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* overflow is undefined if count != 1 */ 101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (s1 != 1) 102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov flags &= ~CC_O; 103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("%-10s A=%08x B=%08x R=%08x CCIN=%04x CC=%04x\n", 104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stringify(OP) "b", s0, s1, res, iflags, flags & CC_MASK); 105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif 107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid exec_op(int s2, int s0, int s1) 109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int o,s,z,a,c,p,flags_in; 111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for (o = 0; o < 2; o++) { 112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for (s = 0; s < 2; s++) { 113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for (z = 0; z < 2; z++) { 114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for (a = 0; a < 2; a++) { 115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for (c = 0; c < 2; c++) { 116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for (p = 0; p < 2; p++) { 117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov flags_in = (o ? CC_O : 0) 119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | (s ? CC_S : 0) 120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | (z ? CC_Z : 0) 121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | (a ? CC_A : 0) 122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | (c ? CC_C : 0) 123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | (p ? CC_P : 0); 124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov exec_opl(s2, s0, s1, flags_in); 126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifdef OP_SHIFTD 127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (s1 <= 15) 128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov exec_opw(s2, s0, s1, flags_in); 129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else 130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov exec_opw(s2, s0, s1, flags_in); 131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif 132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef OP_NOBYTE 133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov exec_opb(s0, s1, flags_in); 134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif 135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifdef OP_CC 136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov exec_opl(s2, s0, s1, flags_in); 137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov exec_opw(s2, s0, s1, flags_in); 138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov exec_opb(s0, s1, flags_in); 139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif 140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov }}}}}} 142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid glue(test_, OP)(void) 146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int i; 148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for(i = 0; i < 32; i++) 149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov exec_op(0x21ad3d34, 0x12345678, i); 150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for(i = 0; i < 32; i++) 151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov exec_op(0x813f3421, 0x82345678, i); 152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid *glue(_test_, OP) __init_call = glue(test_, OP); 155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#undef OP 157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#undef OP_CC 158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#undef OP_SHIFTD 159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#undef OP_NOBYTE 160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#undef EXECSHIFT 161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 162