symbian-qemu-0.9.1-12/qemu-symbian-svp/tests/test-i386.h
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 
       
     2 #define exec_op glue(exec_, OP)
       
     3 #define exec_opq glue(glue(exec_, OP), q)
       
     4 #define exec_opl glue(glue(exec_, OP), l)
       
     5 #define exec_opw glue(glue(exec_, OP), w)
       
     6 #define exec_opb glue(glue(exec_, OP), b)
       
     7 
       
     8 #define EXECOP2(size, rsize, res, s1, flags) \
       
     9     asm ("push %4\n\t"\
       
    10          "popf\n\t"\
       
    11          stringify(OP) size " %" rsize "2, %" rsize "0\n\t" \
       
    12          "pushf\n\t"\
       
    13          "pop %1\n\t"\
       
    14          : "=q" (res), "=g" (flags)\
       
    15          : "q" (s1), "0" (res), "1" (flags)); \
       
    16     printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", \
       
    17            stringify(OP) size, s0, s1, res, iflags, flags & CC_MASK);
       
    18 
       
    19 #define EXECOP1(size, rsize, res, flags) \
       
    20     asm ("push %3\n\t"\
       
    21          "popf\n\t"\
       
    22          stringify(OP) size " %" rsize "0\n\t" \
       
    23          "pushf\n\t"\
       
    24          "pop %1\n\t"\
       
    25          : "=q" (res), "=g" (flags)\
       
    26          : "0" (res), "1" (flags)); \
       
    27     printf("%-10s A=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", \
       
    28            stringify(OP) size, s0, res, iflags, flags & CC_MASK);
       
    29 
       
    30 #ifdef OP1
       
    31 #if defined(__x86_64__)
       
    32 void exec_opq(long s0, long s1, long iflags)
       
    33 {
       
    34     long res, flags;
       
    35     res = s0;
       
    36     flags = iflags;
       
    37     EXECOP1("q", "", res, flags);
       
    38 }
       
    39 #endif
       
    40 
       
    41 void exec_opl(long s0, long s1, long iflags)
       
    42 {
       
    43     long res, flags;
       
    44     res = s0;
       
    45     flags = iflags;
       
    46     EXECOP1("l", "k", res, flags);
       
    47 }
       
    48 
       
    49 void exec_opw(long s0, long s1, long iflags)
       
    50 {
       
    51     long res, flags;
       
    52     res = s0;
       
    53     flags = iflags;
       
    54     EXECOP1("w", "w", res, flags);
       
    55 }
       
    56 
       
    57 void exec_opb(long s0, long s1, long iflags)
       
    58 {
       
    59     long res, flags;
       
    60     res = s0;
       
    61     flags = iflags;
       
    62     EXECOP1("b", "b", res, flags);
       
    63 }
       
    64 #else
       
    65 #if defined(__x86_64__)
       
    66 void exec_opq(long s0, long s1, long iflags)
       
    67 {
       
    68     long res, flags;
       
    69     res = s0;
       
    70     flags = iflags;
       
    71     EXECOP2("q", "", res, s1, flags);
       
    72 }
       
    73 #endif
       
    74 
       
    75 void exec_opl(long s0, long s1, long iflags)
       
    76 {
       
    77     long res, flags;
       
    78     res = s0;
       
    79     flags = iflags;
       
    80     EXECOP2("l", "k", res, s1, flags);
       
    81 }
       
    82 
       
    83 void exec_opw(long s0, long s1, long iflags)
       
    84 {
       
    85     long res, flags;
       
    86     res = s0;
       
    87     flags = iflags;
       
    88     EXECOP2("w", "w", res, s1, flags);
       
    89 }
       
    90 
       
    91 void exec_opb(long s0, long s1, long iflags)
       
    92 {
       
    93     long res, flags;
       
    94     res = s0;
       
    95     flags = iflags;
       
    96     EXECOP2("b", "b", res, s1, flags);
       
    97 }
       
    98 #endif
       
    99 
       
   100 void exec_op(long s0, long s1)
       
   101 {
       
   102     s0 = i2l(s0);
       
   103     s1 = i2l(s1);
       
   104 #if defined(__x86_64__)
       
   105     exec_opq(s0, s1, 0);
       
   106 #endif
       
   107     exec_opl(s0, s1, 0);
       
   108     exec_opw(s0, s1, 0);
       
   109     exec_opb(s0, s1, 0);
       
   110 #ifdef OP_CC
       
   111 #if defined(__x86_64__)
       
   112     exec_opq(s0, s1, CC_C);
       
   113 #endif
       
   114     exec_opl(s0, s1, CC_C);
       
   115     exec_opw(s0, s1, CC_C);
       
   116     exec_opb(s0, s1, CC_C);
       
   117 #endif
       
   118 }
       
   119 
       
   120 void glue(test_, OP)(void)
       
   121 {
       
   122     exec_op(0x12345678, 0x812FADA);
       
   123     exec_op(0x12341, 0x12341);
       
   124     exec_op(0x12341, -0x12341);
       
   125     exec_op(0xffffffff, 0);
       
   126     exec_op(0xffffffff, -1);
       
   127     exec_op(0xffffffff, 1);
       
   128     exec_op(0xffffffff, 2);
       
   129     exec_op(0x7fffffff, 0);
       
   130     exec_op(0x7fffffff, 1);
       
   131     exec_op(0x7fffffff, -1);
       
   132     exec_op(0x80000000, -1);
       
   133     exec_op(0x80000000, 1);
       
   134     exec_op(0x80000000, -2);
       
   135     exec_op(0x12347fff, 0);
       
   136     exec_op(0x12347fff, 1);
       
   137     exec_op(0x12347fff, -1);
       
   138     exec_op(0x12348000, -1);
       
   139     exec_op(0x12348000, 1);
       
   140     exec_op(0x12348000, -2);
       
   141     exec_op(0x12347f7f, 0);
       
   142     exec_op(0x12347f7f, 1);
       
   143     exec_op(0x12347f7f, -1);
       
   144     exec_op(0x12348080, -1);
       
   145     exec_op(0x12348080, 1);
       
   146     exec_op(0x12348080, -2);
       
   147 }
       
   148 
       
   149 void *glue(_test_, OP) __init_call = glue(test_, OP);
       
   150 
       
   151 #undef OP
       
   152 #undef OP_CC