00001 00002 #define exec_op glue(exec_, OP) 00003 #define exec_opq glue(glue(exec_, OP), q) 00004 #define exec_opl glue(glue(exec_, OP), l) 00005 #define exec_opw glue(glue(exec_, OP), w) 00006 #define exec_opb glue(glue(exec_, OP), b) 00007 00008 #define EXECOP2(size, rsize, res, s1, flags) \ 00009 asm ("push %4\n\t"\ 00010 "popf\n\t"\ 00011 stringify(OP) size " %" rsize "2, %" rsize "0\n\t" \ 00012 "pushf\n\t"\ 00013 "pop %1\n\t"\ 00014 : "=q" (res), "=g" (flags)\ 00015 : "q" (s1), "0" (res), "1" (flags)); \ 00016 printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", \ 00017 stringify(OP) size, s0, s1, res, iflags, flags & CC_MASK); 00018 00019 #define EXECOP1(size, rsize, res, flags) \ 00020 asm ("push %3\n\t"\ 00021 "popf\n\t"\ 00022 stringify(OP) size " %" rsize "0\n\t" \ 00023 "pushf\n\t"\ 00024 "pop %1\n\t"\ 00025 : "=q" (res), "=g" (flags)\ 00026 : "0" (res), "1" (flags)); \ 00027 printf("%-10s A=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", \ 00028 stringify(OP) size, s0, res, iflags, flags & CC_MASK); 00029 00030 #ifdef OP1 00031 #if defined(__x86_64__) 00032 void exec_opq(long s0, long s1, long iflags) 00033 { 00034 long res, flags; 00035 res = s0; 00036 flags = iflags; 00037 EXECOP1("q", "", res, flags); 00038 } 00039 #endif 00040 00041 void exec_opl(long s0, long s1, long iflags) 00042 { 00043 long res, flags; 00044 res = s0; 00045 flags = iflags; 00046 EXECOP1("l", "k", res, flags); 00047 } 00048 00049 void exec_opw(long s0, long s1, long iflags) 00050 { 00051 long res, flags; 00052 res = s0; 00053 flags = iflags; 00054 EXECOP1("w", "w", res, flags); 00055 } 00056 00057 void exec_opb(long s0, long s1, long iflags) 00058 { 00059 long res, flags; 00060 res = s0; 00061 flags = iflags; 00062 EXECOP1("b", "b", res, flags); 00063 } 00064 #else 00065 #if defined(__x86_64__) 00066 void exec_opq(long s0, long s1, long iflags) 00067 { 00068 long res, flags; 00069 res = s0; 00070 flags = iflags; 00071 EXECOP2("q", "", res, s1, flags); 00072 } 00073 #endif 00074 00075 void exec_opl(long s0, long s1, long iflags) 00076 { 00077 long res, flags; 00078 res = s0; 00079 flags = iflags; 00080 EXECOP2("l", "k", res, s1, flags); 00081 } 00082 00083 void exec_opw(long s0, long s1, long iflags) 00084 { 00085 long res, flags; 00086 res = s0; 00087 flags = iflags; 00088 EXECOP2("w", "w", res, s1, flags); 00089 } 00090 00091 void exec_opb(long s0, long s1, long iflags) 00092 { 00093 long res, flags; 00094 res = s0; 00095 flags = iflags; 00096 EXECOP2("b", "b", res, s1, flags); 00097 } 00098 #endif 00099 00100 void exec_op(long s0, long s1) 00101 { 00102 s0 = i2l(s0); 00103 s1 = i2l(s1); 00104 #if defined(__x86_64__) 00105 exec_opq(s0, s1, 0); 00106 #endif 00107 exec_opl(s0, s1, 0); 00108 exec_opw(s0, s1, 0); 00109 exec_opb(s0, s1, 0); 00110 #ifdef OP_CC 00111 #if defined(__x86_64__) 00112 exec_opq(s0, s1, CC_C); 00113 #endif 00114 exec_opl(s0, s1, CC_C); 00115 exec_opw(s0, s1, CC_C); 00116 exec_opb(s0, s1, CC_C); 00117 #endif 00118 } 00119 00120 void glue(test_, OP)(void) 00121 { 00122 exec_op(0x12345678, 0x812FADA); 00123 exec_op(0x12341, 0x12341); 00124 exec_op(0x12341, -0x12341); 00125 exec_op(0xffffffff, 0); 00126 exec_op(0xffffffff, -1); 00127 exec_op(0xffffffff, 1); 00128 exec_op(0xffffffff, 2); 00129 exec_op(0x7fffffff, 0); 00130 exec_op(0x7fffffff, 1); 00131 exec_op(0x7fffffff, -1); 00132 exec_op(0x80000000, -1); 00133 exec_op(0x80000000, 1); 00134 exec_op(0x80000000, -2); 00135 exec_op(0x12347fff, 0); 00136 exec_op(0x12347fff, 1); 00137 exec_op(0x12347fff, -1); 00138 exec_op(0x12348000, -1); 00139 exec_op(0x12348000, 1); 00140 exec_op(0x12348000, -2); 00141 exec_op(0x12347f7f, 0); 00142 exec_op(0x12347f7f, 1); 00143 exec_op(0x12347f7f, -1); 00144 exec_op(0x12348080, -1); 00145 exec_op(0x12348080, 1); 00146 exec_op(0x12348080, -2); 00147 } 00148 00149 void *glue(_test_, OP) __init_call = glue(test_, OP); 00150 00151 #undef OP 00152 #undef OP_CC