813 |
else |
else |
814 |
gen_addsi_a0_seg_base (info->override); |
gen_addsi_a0_seg_base (info->override); |
815 |
if (!is_write) |
if (!is_write) |
816 |
ldu_mem_t0_a0[mode] (); |
ldu_mem_t0_a0[arg] (); |
817 |
else |
else |
818 |
st_mem_a0_t0[mode] (); |
st_mem_a0_t0[arg] (); |
819 |
} |
} |
820 |
|
|
821 |
static void |
static void |
2136 |
case 0xa0: case 0xa1: /* EAX, Ov */ |
case 0xa0: case 0xa1: /* EAX, Ov */ |
2137 |
case 0xa2: case 0xa3: /* Ov, EAX */ |
case 0xa2: case 0xa3: /* Ov, EAX */ |
2138 |
{ |
{ |
2139 |
int size_mode = (info.sizeflags & AFLAG ? l_mode : w_mode); |
int size_mode = ((info.sizeflags & AFLAG) ? l_mode : w_mode); |
2140 |
mode = (opcode % 2) ? (info.sizeflags & DFLAG ? l_mode : w_mode) |
|
2141 |
: b_mode; |
if (opcode == 0xa0 || opcode == 0xa2) |
2142 |
|
mode = b_mode; |
2143 |
commit_volatile (&info, 1); |
commit_volatile (&info, 1); |
2144 |
|
|
2145 |
switch (opcode) |
switch (opcode) |
2146 |
{ |
{ |
2147 |
case 0xa0: case 0xa1: |
case 0xa0: case 0xa1: |
2148 |
OP_O (&info, 0, size_mode, 0, 0); |
OP_O (&info, 0, size_mode, 0, mode); |
2149 |
OP_REG (&info, 1, mode, 0, eax_regno); |
OP_REG (&info, 1, mode, 0, eax_regno); |
2150 |
break; |
break; |
2151 |
case 0xa2: case 0xa3: |
case 0xa2: case 0xa3: |
2152 |
OP_REG (&info, 0, mode, 0, eax_regno); |
OP_REG (&info, 0, mode, 0, eax_regno); |
2153 |
OP_O (&info, 1, size_mode, 0, 0); |
OP_O (&info, 1, size_mode, 0, mode); |
2154 |
break; |
break; |
2155 |
} |
} |
2156 |
break; |
break; |
2410 |
} |
} |
2411 |
break; |
break; |
2412 |
} |
} |
2413 |
|
case 0x07: /* invlpg */ |
2414 |
|
{ |
2415 |
|
/* FIXME if cpl != 0, take GP */ |
2416 |
|
OP_E (&info, 0, l_mode, 0, /*no read*/ 1); |
2417 |
|
gen_addsi_a0_seg_base (info.segno); |
2418 |
|
gen_invlpg_a0 (); |
2419 |
|
break; |
2420 |
|
} |
2421 |
default: |
default: |
2422 |
|
printf ("info.reg == %d\n", info.reg); |
2423 |
goto illegal_op; |
goto illegal_op; |
2424 |
} |
} |
2425 |
break; |
break; |
2429 |
gen_cpuid (); |
gen_cpuid (); |
2430 |
break; |
break; |
2431 |
} |
} |
2432 |
|
case 0x131: /* rdts */ |
2433 |
|
{ |
2434 |
|
gen_rdts (); |
2435 |
|
break; |
2436 |
|
} |
2437 |
case 0x106: /* clts */ |
case 0x106: /* clts */ |
2438 |
{ |
{ |
2439 |
if (0 /* cpl != 0 */) |
if (0 /* cpl != 0 */) |
2897 |
goto illegal_op; |
goto illegal_op; |
2898 |
|
|
2899 |
/* No-operation. */ |
/* No-operation. */ |
2900 |
case 0x90: |
case 0x90: |
2901 |
break; |
{ |
2902 |
|
if (info.prefixes) |
2903 |
|
{ |
2904 |
|
/* L4Ka uses "lock nop" for it's syscall interface. |
2905 |
|
I can't find anything about this generating an exception. */ |
2906 |
|
commit_volatile (&info, 1); |
2907 |
|
gen_take_exception (EXC_UD, 0); |
2908 |
|
is_done = DONE_BRANCH; |
2909 |
|
} |
2910 |
|
break; |
2911 |
|
} |
2912 |
|
|
2913 |
case 0x1af: /* imul Gv, Ev */ |
case 0x1af: /* imul Gv, Ev */ |
2914 |
case 0x69: /* imul Gv, Ev, Iv */ |
case 0x69: /* imul Gv, Ev, Iv */ |