1*379ca80dSbellard 2*379ca80dSbellard #define exec_op glue(exec_, OP) 3*379ca80dSbellard #define exec_opl glue(glue(exec_, OP), l) 4*379ca80dSbellard #define exec_opw glue(glue(exec_, OP), w) 5*379ca80dSbellard #define exec_opb glue(glue(exec_, OP), b) 6*379ca80dSbellard 7*379ca80dSbellard #define EXECSHIFT(size, res, s1, flags) \ 8*379ca80dSbellard asm ("push %4\n\t"\ 9*379ca80dSbellard "popf\n\t"\ 10*379ca80dSbellard stringify(OP) size " %%cl, %" size "0\n\t" \ 11*379ca80dSbellard "pushf\n\t"\ 12*379ca80dSbellard "popl %1\n\t"\ 13*379ca80dSbellard : "=q" (res), "=g" (flags)\ 14*379ca80dSbellard : "c" (s1), "0" (res), "1" (flags)); 15*379ca80dSbellard 16*379ca80dSbellard void exec_opl(int s0, int s1, int iflags) 17*379ca80dSbellard { 18*379ca80dSbellard int res, flags; 19*379ca80dSbellard res = s0; 20*379ca80dSbellard flags = iflags; 21*379ca80dSbellard EXECSHIFT("", res, s1, flags); 22*379ca80dSbellard /* overflow is undefined if count != 1 */ 23*379ca80dSbellard if (s1 != 1) 24*379ca80dSbellard flags &= ~CC_O; 25*379ca80dSbellard printf("%-10s A=%08x B=%08x R=%08x CCIN=%04x CC=%04x\n", 26*379ca80dSbellard stringify(OP) "l", s0, s1, res, iflags, flags & CC_MASK); 27*379ca80dSbellard } 28*379ca80dSbellard 29*379ca80dSbellard void exec_opw(int s0, int s1, int iflags) 30*379ca80dSbellard { 31*379ca80dSbellard int res, flags; 32*379ca80dSbellard res = s0; 33*379ca80dSbellard flags = iflags; 34*379ca80dSbellard EXECSHIFT("w", res, s1, flags); 35*379ca80dSbellard /* overflow is undefined if count != 1 */ 36*379ca80dSbellard if (s1 != 1) 37*379ca80dSbellard flags &= ~CC_O; 38*379ca80dSbellard printf("%-10s A=%08x B=%08x R=%08x CCIN=%04x CC=%04x\n", 39*379ca80dSbellard stringify(OP) "w", s0, s1, res, iflags, flags & CC_MASK); 40*379ca80dSbellard } 41*379ca80dSbellard 42*379ca80dSbellard void exec_opb(int s0, int s1, int iflags) 43*379ca80dSbellard { 44*379ca80dSbellard int res, flags; 45*379ca80dSbellard res = s0; 46*379ca80dSbellard flags = iflags; 47*379ca80dSbellard EXECSHIFT("b", res, s1, flags); 48*379ca80dSbellard /* overflow is undefined if count != 1 */ 49*379ca80dSbellard if (s1 != 1) 50*379ca80dSbellard flags &= ~CC_O; 51*379ca80dSbellard printf("%-10s A=%08x B=%08x R=%08x CCIN=%04x CC=%04x\n", 52*379ca80dSbellard stringify(OP) "b", s0, s1, res, iflags, flags & CC_MASK); 53*379ca80dSbellard } 54*379ca80dSbellard 55*379ca80dSbellard void exec_op(int s0, int s1) 56*379ca80dSbellard { 57*379ca80dSbellard exec_opl(s0, s1, 0); 58*379ca80dSbellard exec_opw(s0, s1, 0); 59*379ca80dSbellard exec_opb(s0, s1, 0); 60*379ca80dSbellard #ifdef OP_CC 61*379ca80dSbellard exec_opl(s0, s1, CC_C); 62*379ca80dSbellard exec_opw(s0, s1, CC_C); 63*379ca80dSbellard exec_opb(s0, s1, CC_C); 64*379ca80dSbellard #endif 65*379ca80dSbellard } 66*379ca80dSbellard 67*379ca80dSbellard void glue(test_, OP)(void) 68*379ca80dSbellard { 69*379ca80dSbellard int i; 70*379ca80dSbellard for(i = 0; i < 32; i++) 71*379ca80dSbellard exec_op(0x12345678, i); 72*379ca80dSbellard for(i = 0; i < 32; i++) 73*379ca80dSbellard exec_op(0x82345678, i); 74*379ca80dSbellard } 75*379ca80dSbellard 76*379ca80dSbellard void *glue(_test_, OP) __init_call = glue(test_, OP); 77*379ca80dSbellard 78*379ca80dSbellard #undef OP 79*379ca80dSbellard #undef OP_CC 80