Revision 61382a50 target-i386/translate.c
b/target-i386/translate.c | ||
---|---|---|
570 | 570 |
}; |
571 | 571 |
|
572 | 572 |
static GenOpFunc *gen_op_lds_T0_A0[3 * 3] = { |
573 |
gen_op_ldsb_T0_A0, |
|
574 |
gen_op_ldsw_T0_A0, |
|
573 |
gen_op_ldsb_raw_T0_A0,
|
|
574 |
gen_op_ldsw_raw_T0_A0,
|
|
575 | 575 |
NULL, |
576 |
|
|
576 |
#ifndef CONFIG_USER_ONLY |
|
577 | 577 |
gen_op_ldsb_kernel_T0_A0, |
578 | 578 |
gen_op_ldsw_kernel_T0_A0, |
579 | 579 |
NULL, |
... | ... | |
581 | 581 |
gen_op_ldsb_user_T0_A0, |
582 | 582 |
gen_op_ldsw_user_T0_A0, |
583 | 583 |
NULL, |
584 |
#endif |
|
584 | 585 |
}; |
585 | 586 |
|
586 | 587 |
static GenOpFunc *gen_op_ldu_T0_A0[3 * 3] = { |
587 |
gen_op_ldub_T0_A0, |
|
588 |
gen_op_lduw_T0_A0, |
|
588 |
gen_op_ldub_raw_T0_A0,
|
|
589 |
gen_op_lduw_raw_T0_A0,
|
|
589 | 590 |
NULL, |
590 | 591 |
|
592 |
#ifndef CONFIG_USER_ONLY |
|
591 | 593 |
gen_op_ldub_kernel_T0_A0, |
592 | 594 |
gen_op_lduw_kernel_T0_A0, |
593 | 595 |
NULL, |
... | ... | |
595 | 597 |
gen_op_ldub_user_T0_A0, |
596 | 598 |
gen_op_lduw_user_T0_A0, |
597 | 599 |
NULL, |
600 |
#endif |
|
598 | 601 |
}; |
599 | 602 |
|
600 | 603 |
/* sign does not matter, except for lidt/lgdt call (TODO: fix it) */ |
601 | 604 |
static GenOpFunc *gen_op_ld_T0_A0[3 * 3] = { |
602 |
gen_op_ldub_T0_A0, |
|
603 |
gen_op_lduw_T0_A0, |
|
604 |
gen_op_ldl_T0_A0, |
|
605 |
gen_op_ldub_raw_T0_A0,
|
|
606 |
gen_op_lduw_raw_T0_A0,
|
|
607 |
gen_op_ldl_raw_T0_A0,
|
|
605 | 608 |
|
609 |
#ifndef CONFIG_USER_ONLY |
|
606 | 610 |
gen_op_ldub_kernel_T0_A0, |
607 | 611 |
gen_op_lduw_kernel_T0_A0, |
608 | 612 |
gen_op_ldl_kernel_T0_A0, |
... | ... | |
610 | 614 |
gen_op_ldub_user_T0_A0, |
611 | 615 |
gen_op_lduw_user_T0_A0, |
612 | 616 |
gen_op_ldl_user_T0_A0, |
617 |
#endif |
|
613 | 618 |
}; |
614 | 619 |
|
615 | 620 |
static GenOpFunc *gen_op_ld_T1_A0[3 * 3] = { |
616 |
gen_op_ldub_T1_A0, |
|
617 |
gen_op_lduw_T1_A0, |
|
618 |
gen_op_ldl_T1_A0, |
|
621 |
gen_op_ldub_raw_T1_A0,
|
|
622 |
gen_op_lduw_raw_T1_A0,
|
|
623 |
gen_op_ldl_raw_T1_A0,
|
|
619 | 624 |
|
625 |
#ifndef CONFIG_USER_ONLY |
|
620 | 626 |
gen_op_ldub_kernel_T1_A0, |
621 | 627 |
gen_op_lduw_kernel_T1_A0, |
622 | 628 |
gen_op_ldl_kernel_T1_A0, |
... | ... | |
624 | 630 |
gen_op_ldub_user_T1_A0, |
625 | 631 |
gen_op_lduw_user_T1_A0, |
626 | 632 |
gen_op_ldl_user_T1_A0, |
633 |
#endif |
|
627 | 634 |
}; |
628 | 635 |
|
629 | 636 |
static GenOpFunc *gen_op_st_T0_A0[3 * 3] = { |
630 |
gen_op_stb_T0_A0, |
|
631 |
gen_op_stw_T0_A0, |
|
632 |
gen_op_stl_T0_A0, |
|
637 |
gen_op_stb_raw_T0_A0,
|
|
638 |
gen_op_stw_raw_T0_A0,
|
|
639 |
gen_op_stl_raw_T0_A0,
|
|
633 | 640 |
|
641 |
#ifndef CONFIG_USER_ONLY |
|
634 | 642 |
gen_op_stb_kernel_T0_A0, |
635 | 643 |
gen_op_stw_kernel_T0_A0, |
636 | 644 |
gen_op_stl_kernel_T0_A0, |
... | ... | |
638 | 646 |
gen_op_stb_user_T0_A0, |
639 | 647 |
gen_op_stw_user_T0_A0, |
640 | 648 |
gen_op_stl_user_T0_A0, |
649 |
#endif |
|
641 | 650 |
}; |
642 | 651 |
|
643 | 652 |
static inline void gen_string_movl_A0_ESI(DisasContext *s) |
... | ... | |
1176 | 1185 |
|
1177 | 1186 |
if (base == 4) { |
1178 | 1187 |
havesib = 1; |
1179 |
code = ldub(s->pc++); |
|
1188 |
code = ldub_code(s->pc++);
|
|
1180 | 1189 |
scale = (code >> 6) & 3; |
1181 | 1190 |
index = (code >> 3) & 7; |
1182 | 1191 |
base = code & 7; |
... | ... | |
1186 | 1195 |
case 0: |
1187 | 1196 |
if (base == 5) { |
1188 | 1197 |
base = -1; |
1189 |
disp = ldl(s->pc); |
|
1198 |
disp = ldl_code(s->pc);
|
|
1190 | 1199 |
s->pc += 4; |
1191 | 1200 |
} else { |
1192 | 1201 |
disp = 0; |
1193 | 1202 |
} |
1194 | 1203 |
break; |
1195 | 1204 |
case 1: |
1196 |
disp = (int8_t)ldub(s->pc++); |
|
1205 |
disp = (int8_t)ldub_code(s->pc++);
|
|
1197 | 1206 |
break; |
1198 | 1207 |
default: |
1199 | 1208 |
case 2: |
1200 |
disp = ldl(s->pc); |
|
1209 |
disp = ldl_code(s->pc);
|
|
1201 | 1210 |
s->pc += 4; |
1202 | 1211 |
break; |
1203 | 1212 |
} |
... | ... | |
1229 | 1238 |
switch (mod) { |
1230 | 1239 |
case 0: |
1231 | 1240 |
if (rm == 6) { |
1232 |
disp = lduw(s->pc); |
|
1241 |
disp = lduw_code(s->pc);
|
|
1233 | 1242 |
s->pc += 2; |
1234 | 1243 |
gen_op_movl_A0_im(disp); |
1235 | 1244 |
rm = 0; /* avoid SS override */ |
... | ... | |
1239 | 1248 |
} |
1240 | 1249 |
break; |
1241 | 1250 |
case 1: |
1242 |
disp = (int8_t)ldub(s->pc++); |
|
1251 |
disp = (int8_t)ldub_code(s->pc++);
|
|
1243 | 1252 |
break; |
1244 | 1253 |
default: |
1245 | 1254 |
case 2: |
1246 |
disp = lduw(s->pc); |
|
1255 |
disp = lduw_code(s->pc);
|
|
1247 | 1256 |
s->pc += 2; |
1248 | 1257 |
break; |
1249 | 1258 |
} |
... | ... | |
1337 | 1346 |
|
1338 | 1347 |
switch(ot) { |
1339 | 1348 |
case OT_BYTE: |
1340 |
ret = ldub(s->pc); |
|
1349 |
ret = ldub_code(s->pc);
|
|
1341 | 1350 |
s->pc++; |
1342 | 1351 |
break; |
1343 | 1352 |
case OT_WORD: |
1344 |
ret = lduw(s->pc); |
|
1353 |
ret = lduw_code(s->pc);
|
|
1345 | 1354 |
s->pc += 2; |
1346 | 1355 |
break; |
1347 | 1356 |
default: |
1348 | 1357 |
case OT_LONG: |
1349 |
ret = ldl(s->pc); |
|
1358 |
ret = ldl_code(s->pc);
|
|
1350 | 1359 |
s->pc += 4; |
1351 | 1360 |
break; |
1352 | 1361 |
} |
... | ... | |
1756 | 1765 |
dflag = s->code32; |
1757 | 1766 |
s->override = -1; |
1758 | 1767 |
next_byte: |
1759 |
b = ldub(s->pc); |
|
1768 |
b = ldub_code(s->pc);
|
|
1760 | 1769 |
s->pc++; |
1761 | 1770 |
/* check prefixes */ |
1762 | 1771 |
switch (b) { |
... | ... | |
1814 | 1823 |
case 0x0f: |
1815 | 1824 |
/**************************/ |
1816 | 1825 |
/* extended op code */ |
1817 |
b = ldub(s->pc++) | 0x100; |
|
1826 |
b = ldub_code(s->pc++) | 0x100;
|
|
1818 | 1827 |
goto reswitch; |
1819 | 1828 |
|
1820 | 1829 |
/**************************/ |
... | ... | |
1839 | 1848 |
|
1840 | 1849 |
switch(f) { |
1841 | 1850 |
case 0: /* OP Ev, Gv */ |
1842 |
modrm = ldub(s->pc++); |
|
1851 |
modrm = ldub_code(s->pc++);
|
|
1843 | 1852 |
reg = ((modrm >> 3) & 7); |
1844 | 1853 |
mod = (modrm >> 6) & 3; |
1845 | 1854 |
rm = modrm & 7; |
... | ... | |
1861 | 1870 |
gen_op(s, op, ot, opreg); |
1862 | 1871 |
break; |
1863 | 1872 |
case 1: /* OP Gv, Ev */ |
1864 |
modrm = ldub(s->pc++); |
|
1873 |
modrm = ldub_code(s->pc++);
|
|
1865 | 1874 |
mod = (modrm >> 6) & 3; |
1866 | 1875 |
reg = ((modrm >> 3) & 7); |
1867 | 1876 |
rm = modrm & 7; |
... | ... | |
1895 | 1904 |
else |
1896 | 1905 |
ot = dflag ? OT_LONG : OT_WORD; |
1897 | 1906 |
|
1898 |
modrm = ldub(s->pc++); |
|
1907 |
modrm = ldub_code(s->pc++);
|
|
1899 | 1908 |
mod = (modrm >> 6) & 3; |
1900 | 1909 |
rm = modrm & 7; |
1901 | 1910 |
op = (modrm >> 3) & 7; |
... | ... | |
1939 | 1948 |
else |
1940 | 1949 |
ot = dflag ? OT_LONG : OT_WORD; |
1941 | 1950 |
|
1942 |
modrm = ldub(s->pc++); |
|
1951 |
modrm = ldub_code(s->pc++);
|
|
1943 | 1952 |
mod = (modrm >> 6) & 3; |
1944 | 1953 |
rm = modrm & 7; |
1945 | 1954 |
op = (modrm >> 3) & 7; |
... | ... | |
2045 | 2054 |
else |
2046 | 2055 |
ot = dflag ? OT_LONG : OT_WORD; |
2047 | 2056 |
|
2048 |
modrm = ldub(s->pc++); |
|
2057 |
modrm = ldub_code(s->pc++);
|
|
2049 | 2058 |
mod = (modrm >> 6) & 3; |
2050 | 2059 |
rm = modrm & 7; |
2051 | 2060 |
op = (modrm >> 3) & 7; |
... | ... | |
2085 | 2094 |
gen_push_T0(s); |
2086 | 2095 |
gen_eob(s); |
2087 | 2096 |
break; |
2088 |
case 3: /*< lcall Ev */
|
|
2097 |
case 3: /* lcall Ev */ |
|
2089 | 2098 |
gen_op_ld_T1_A0[ot + s->mem_index](); |
2090 | 2099 |
gen_op_addl_A0_im(1 << (ot - OT_WORD + 1)); |
2091 |
gen_op_ld_T0_A0[OT_WORD + s->mem_index](); |
|
2100 |
gen_op_ldu_T0_A0[OT_WORD + s->mem_index]();
|
|
2092 | 2101 |
do_lcall: |
2093 | 2102 |
if (s->pe && !s->vm86) { |
2094 | 2103 |
if (s->cc_op != CC_OP_DYNAMIC) |
... | ... | |
2109 | 2118 |
case 5: /* ljmp Ev */ |
2110 | 2119 |
gen_op_ld_T1_A0[ot + s->mem_index](); |
2111 | 2120 |
gen_op_addl_A0_im(1 << (ot - OT_WORD + 1)); |
2112 |
gen_op_lduw_T0_A0();
|
|
2121 |
gen_op_ldu_T0_A0[OT_WORD + s->mem_index]();
|
|
2113 | 2122 |
do_ljmp: |
2114 | 2123 |
if (s->pe && !s->vm86) { |
2115 | 2124 |
if (s->cc_op != CC_OP_DYNAMIC) |
... | ... | |
2138 | 2147 |
else |
2139 | 2148 |
ot = dflag ? OT_LONG : OT_WORD; |
2140 | 2149 |
|
2141 |
modrm = ldub(s->pc++); |
|
2150 |
modrm = ldub_code(s->pc++);
|
|
2142 | 2151 |
mod = (modrm >> 6) & 3; |
2143 | 2152 |
rm = modrm & 7; |
2144 | 2153 |
reg = (modrm >> 3) & 7; |
... | ... | |
2179 | 2188 |
case 0x69: /* imul Gv, Ev, I */ |
2180 | 2189 |
case 0x6b: |
2181 | 2190 |
ot = dflag ? OT_LONG : OT_WORD; |
2182 |
modrm = ldub(s->pc++); |
|
2191 |
modrm = ldub_code(s->pc++);
|
|
2183 | 2192 |
reg = ((modrm >> 3) & 7) + OR_EAX; |
2184 | 2193 |
gen_ldst_modrm(s, modrm, ot, OR_TMP0, 0); |
2185 | 2194 |
if (b == 0x69) { |
... | ... | |
2206 | 2215 |
ot = OT_BYTE; |
2207 | 2216 |
else |
2208 | 2217 |
ot = dflag ? OT_LONG : OT_WORD; |
2209 |
modrm = ldub(s->pc++); |
|
2218 |
modrm = ldub_code(s->pc++);
|
|
2210 | 2219 |
reg = (modrm >> 3) & 7; |
2211 | 2220 |
mod = (modrm >> 6) & 3; |
2212 | 2221 |
if (mod == 3) { |
... | ... | |
2233 | 2242 |
ot = OT_BYTE; |
2234 | 2243 |
else |
2235 | 2244 |
ot = dflag ? OT_LONG : OT_WORD; |
2236 |
modrm = ldub(s->pc++); |
|
2245 |
modrm = ldub_code(s->pc++);
|
|
2237 | 2246 |
reg = (modrm >> 3) & 7; |
2238 | 2247 |
mod = (modrm >> 6) & 3; |
2239 | 2248 |
gen_op_mov_TN_reg[ot][1][reg](); |
... | ... | |
2250 | 2259 |
s->cc_op = CC_OP_SUBB + ot; |
2251 | 2260 |
break; |
2252 | 2261 |
case 0x1c7: /* cmpxchg8b */ |
2253 |
modrm = ldub(s->pc++); |
|
2262 |
modrm = ldub_code(s->pc++);
|
|
2254 | 2263 |
mod = (modrm >> 6) & 3; |
2255 | 2264 |
if (mod == 3) |
2256 | 2265 |
goto illegal_op; |
... | ... | |
2291 | 2300 |
break; |
2292 | 2301 |
case 0x8f: /* pop Ev */ |
2293 | 2302 |
ot = dflag ? OT_LONG : OT_WORD; |
2294 |
modrm = ldub(s->pc++); |
|
2303 |
modrm = ldub_code(s->pc++);
|
|
2295 | 2304 |
gen_pop_T0(s); |
2296 | 2305 |
s->popl_esp_hack = 2 << dflag; |
2297 | 2306 |
gen_ldst_modrm(s, modrm, ot, OR_TMP0, 1); |
... | ... | |
2301 | 2310 |
case 0xc8: /* enter */ |
2302 | 2311 |
{ |
2303 | 2312 |
int level; |
2304 |
val = lduw(s->pc); |
|
2313 |
val = lduw_code(s->pc);
|
|
2305 | 2314 |
s->pc += 2; |
2306 |
level = ldub(s->pc++); |
|
2315 |
level = ldub_code(s->pc++);
|
|
2307 | 2316 |
gen_enter(s, val, level); |
2308 | 2317 |
} |
2309 | 2318 |
break; |
... | ... | |
2369 | 2378 |
ot = OT_BYTE; |
2370 | 2379 |
else |
2371 | 2380 |
ot = dflag ? OT_LONG : OT_WORD; |
2372 |
modrm = ldub(s->pc++); |
|
2381 |
modrm = ldub_code(s->pc++);
|
|
2373 | 2382 |
reg = (modrm >> 3) & 7; |
2374 | 2383 |
|
2375 | 2384 |
/* generate a generic store */ |
... | ... | |
2381 | 2390 |
ot = OT_BYTE; |
2382 | 2391 |
else |
2383 | 2392 |
ot = dflag ? OT_LONG : OT_WORD; |
2384 |
modrm = ldub(s->pc++); |
|
2393 |
modrm = ldub_code(s->pc++);
|
|
2385 | 2394 |
mod = (modrm >> 6) & 3; |
2386 | 2395 |
if (mod != 3) |
2387 | 2396 |
gen_lea_modrm(s, modrm, ®_addr, &offset_addr); |
... | ... | |
2398 | 2407 |
ot = OT_BYTE; |
2399 | 2408 |
else |
2400 | 2409 |
ot = dflag ? OT_LONG : OT_WORD; |
2401 |
modrm = ldub(s->pc++); |
|
2410 |
modrm = ldub_code(s->pc++);
|
|
2402 | 2411 |
reg = (modrm >> 3) & 7; |
2403 | 2412 |
|
2404 | 2413 |
gen_ldst_modrm(s, modrm, ot, OR_TMP0, 0); |
2405 | 2414 |
gen_op_mov_reg_T0[ot][reg](); |
2406 | 2415 |
break; |
2407 | 2416 |
case 0x8e: /* mov seg, Gv */ |
2408 |
modrm = ldub(s->pc++); |
|
2417 |
modrm = ldub_code(s->pc++);
|
|
2409 | 2418 |
reg = (modrm >> 3) & 7; |
2410 | 2419 |
if (reg >= 6 || reg == R_CS) |
2411 | 2420 |
goto illegal_op; |
... | ... | |
2422 | 2431 |
} |
2423 | 2432 |
break; |
2424 | 2433 |
case 0x8c: /* mov Gv, seg */ |
2425 |
modrm = ldub(s->pc++); |
|
2434 |
modrm = ldub_code(s->pc++);
|
|
2426 | 2435 |
reg = (modrm >> 3) & 7; |
2427 | 2436 |
mod = (modrm >> 6) & 3; |
2428 | 2437 |
if (reg >= 6) |
... | ... | |
2444 | 2453 |
d_ot = dflag + OT_WORD; |
2445 | 2454 |
/* ot is the size of source */ |
2446 | 2455 |
ot = (b & 1) + OT_BYTE; |
2447 |
modrm = ldub(s->pc++); |
|
2456 |
modrm = ldub_code(s->pc++);
|
|
2448 | 2457 |
reg = ((modrm >> 3) & 7) + OR_EAX; |
2449 | 2458 |
mod = (modrm >> 6) & 3; |
2450 | 2459 |
rm = modrm & 7; |
... | ... | |
2481 | 2490 |
|
2482 | 2491 |
case 0x8d: /* lea */ |
2483 | 2492 |
ot = dflag ? OT_LONG : OT_WORD; |
2484 |
modrm = ldub(s->pc++); |
|
2493 |
modrm = ldub_code(s->pc++);
|
|
2485 | 2494 |
reg = (modrm >> 3) & 7; |
2486 | 2495 |
/* we must ensure that no segment is added */ |
2487 | 2496 |
s->override = -1; |
... | ... | |
2574 | 2583 |
ot = OT_BYTE; |
2575 | 2584 |
else |
2576 | 2585 |
ot = dflag ? OT_LONG : OT_WORD; |
2577 |
modrm = ldub(s->pc++); |
|
2586 |
modrm = ldub_code(s->pc++);
|
|
2578 | 2587 |
reg = (modrm >> 3) & 7; |
2579 | 2588 |
mod = (modrm >> 6) & 3; |
2580 | 2589 |
if (mod == 3) { |
... | ... | |
2613 | 2622 |
op = R_GS; |
2614 | 2623 |
do_lxx: |
2615 | 2624 |
ot = dflag ? OT_LONG : OT_WORD; |
2616 |
modrm = ldub(s->pc++); |
|
2625 |
modrm = ldub_code(s->pc++);
|
|
2617 | 2626 |
reg = (modrm >> 3) & 7; |
2618 | 2627 |
mod = (modrm >> 6) & 3; |
2619 | 2628 |
if (mod == 3) |
... | ... | |
2622 | 2631 |
gen_op_ld_T1_A0[ot + s->mem_index](); |
2623 | 2632 |
gen_op_addl_A0_im(1 << (ot - OT_WORD + 1)); |
2624 | 2633 |
/* load the segment first to handle exceptions properly */ |
2625 |
gen_op_lduw_T0_A0();
|
|
2634 |
gen_op_ldu_T0_A0[OT_WORD + s->mem_index]();
|
|
2626 | 2635 |
gen_movl_seg_T0(s, op, pc_start - s->cs_base); |
2627 | 2636 |
/* then put the data */ |
2628 | 2637 |
gen_op_mov_reg_T1[ot][reg](); |
... | ... | |
2645 | 2654 |
else |
2646 | 2655 |
ot = dflag ? OT_LONG : OT_WORD; |
2647 | 2656 |
|
2648 |
modrm = ldub(s->pc++); |
|
2657 |
modrm = ldub_code(s->pc++);
|
|
2649 | 2658 |
mod = (modrm >> 6) & 3; |
2650 | 2659 |
rm = modrm & 7; |
2651 | 2660 |
op = (modrm >> 3) & 7; |
... | ... | |
2662 | 2671 |
gen_shift(s, op, ot, opreg, OR_ECX); |
2663 | 2672 |
} else { |
2664 | 2673 |
if (shift == 2) { |
2665 |
shift = ldub(s->pc++); |
|
2674 |
shift = ldub_code(s->pc++);
|
|
2666 | 2675 |
} |
2667 | 2676 |
gen_shifti(s, op, ot, opreg, shift); |
2668 | 2677 |
} |
... | ... | |
2696 | 2705 |
shift = 0; |
2697 | 2706 |
do_shiftd: |
2698 | 2707 |
ot = dflag ? OT_LONG : OT_WORD; |
2699 |
modrm = ldub(s->pc++); |
|
2708 |
modrm = ldub_code(s->pc++);
|
|
2700 | 2709 |
mod = (modrm >> 6) & 3; |
2701 | 2710 |
rm = modrm & 7; |
2702 | 2711 |
reg = (modrm >> 3) & 7; |
... | ... | |
2710 | 2719 |
gen_op_mov_TN_reg[ot][1][reg](); |
2711 | 2720 |
|
2712 | 2721 |
if (shift) { |
2713 |
val = ldub(s->pc++); |
|
2722 |
val = ldub_code(s->pc++);
|
|
2714 | 2723 |
val &= 0x1f; |
2715 | 2724 |
if (val) { |
2716 | 2725 |
if (mod == 3) |
... | ... | |
2739 | 2748 |
/************************/ |
2740 | 2749 |
/* floats */ |
2741 | 2750 |
case 0xd8 ... 0xdf: |
2742 |
modrm = ldub(s->pc++); |
|
2751 |
modrm = ldub_code(s->pc++);
|
|
2743 | 2752 |
mod = (modrm >> 6) & 3; |
2744 | 2753 |
rm = modrm & 7; |
2745 | 2754 |
op = ((b & 7) << 3) | ((modrm >> 3) & 7); |
... | ... | |
3256 | 3265 |
ot = OT_BYTE; |
3257 | 3266 |
else |
3258 | 3267 |
ot = dflag ? OT_LONG : OT_WORD; |
3259 |
val = ldub(s->pc++); |
|
3268 |
val = ldub_code(s->pc++);
|
|
3260 | 3269 |
gen_op_movl_T0_im(val); |
3261 | 3270 |
gen_op_in[ot](); |
3262 | 3271 |
gen_op_mov_reg_T1[ot][R_EAX](); |
... | ... | |
3271 | 3280 |
ot = OT_BYTE; |
3272 | 3281 |
else |
3273 | 3282 |
ot = dflag ? OT_LONG : OT_WORD; |
3274 |
val = ldub(s->pc++); |
|
3283 |
val = ldub_code(s->pc++);
|
|
3275 | 3284 |
gen_op_movl_T0_im(val); |
3276 | 3285 |
gen_op_mov_TN_reg[ot][1][R_EAX](); |
3277 | 3286 |
gen_op_out[ot](); |
... | ... | |
3309 | 3318 |
/************************/ |
3310 | 3319 |
/* control */ |
3311 | 3320 |
case 0xc2: /* ret im */ |
3312 |
val = ldsw(s->pc); |
|
3321 |
val = ldsw_code(s->pc);
|
|
3313 | 3322 |
s->pc += 2; |
3314 | 3323 |
gen_pop_T0(s); |
3315 | 3324 |
gen_stack_update(s, val + (2 << s->dflag)); |
... | ... | |
3327 | 3336 |
gen_eob(s); |
3328 | 3337 |
break; |
3329 | 3338 |
case 0xca: /* lret im */ |
3330 |
val = ldsw(s->pc); |
|
3339 |
val = ldsw_code(s->pc);
|
|
3331 | 3340 |
s->pc += 2; |
3332 | 3341 |
do_lret: |
3333 | 3342 |
if (s->pe && !s->vm86) { |
... | ... | |
3443 | 3452 |
break; |
3444 | 3453 |
|
3445 | 3454 |
case 0x190 ... 0x19f: /* setcc Gv */ |
3446 |
modrm = ldub(s->pc++); |
|
3455 |
modrm = ldub_code(s->pc++);
|
|
3447 | 3456 |
gen_setcc(s, b); |
3448 | 3457 |
gen_ldst_modrm(s, modrm, OT_BYTE, OR_TMP0, 1); |
3449 | 3458 |
break; |
3450 | 3459 |
case 0x140 ... 0x14f: /* cmov Gv, Ev */ |
3451 | 3460 |
ot = dflag ? OT_LONG : OT_WORD; |
3452 |
modrm = ldub(s->pc++); |
|
3461 |
modrm = ldub_code(s->pc++);
|
|
3453 | 3462 |
reg = (modrm >> 3) & 7; |
3454 | 3463 |
mod = (modrm >> 6) & 3; |
3455 | 3464 |
gen_setcc(s, b); |
... | ... | |
3542 | 3551 |
/* bit operations */ |
3543 | 3552 |
case 0x1ba: /* bt/bts/btr/btc Gv, im */ |
3544 | 3553 |
ot = dflag ? OT_LONG : OT_WORD; |
3545 |
modrm = ldub(s->pc++); |
|
3554 |
modrm = ldub_code(s->pc++);
|
|
3546 | 3555 |
op = (modrm >> 3) & 7; |
3547 | 3556 |
mod = (modrm >> 6) & 3; |
3548 | 3557 |
rm = modrm & 7; |
... | ... | |
3553 | 3562 |
gen_op_mov_TN_reg[ot][0][rm](); |
3554 | 3563 |
} |
3555 | 3564 |
/* load shift */ |
3556 |
val = ldub(s->pc++); |
|
3565 |
val = ldub_code(s->pc++);
|
|
3557 | 3566 |
gen_op_movl_T1_im(val); |
3558 | 3567 |
if (op < 4) |
3559 | 3568 |
goto illegal_op; |
... | ... | |
3581 | 3590 |
op = 3; |
3582 | 3591 |
do_btx: |
3583 | 3592 |
ot = dflag ? OT_LONG : OT_WORD; |
3584 |
modrm = ldub(s->pc++); |
|
3593 |
modrm = ldub_code(s->pc++);
|
|
3585 | 3594 |
reg = (modrm >> 3) & 7; |
3586 | 3595 |
mod = (modrm >> 6) & 3; |
3587 | 3596 |
rm = modrm & 7; |
... | ... | |
3610 | 3619 |
case 0x1bc: /* bsf */ |
3611 | 3620 |
case 0x1bd: /* bsr */ |
3612 | 3621 |
ot = dflag ? OT_LONG : OT_WORD; |
3613 |
modrm = ldub(s->pc++); |
|
3622 |
modrm = ldub_code(s->pc++);
|
|
3614 | 3623 |
reg = (modrm >> 3) & 7; |
3615 | 3624 |
gen_ldst_modrm(s, modrm, ot, OR_TMP0, 0); |
3616 | 3625 |
gen_op_bsx_T0_cc[ot - OT_WORD][b & 1](); |
... | ... | |
3646 | 3655 |
s->cc_op = CC_OP_EFLAGS; |
3647 | 3656 |
break; |
3648 | 3657 |
case 0xd4: /* aam */ |
3649 |
val = ldub(s->pc++); |
|
3658 |
val = ldub_code(s->pc++);
|
|
3650 | 3659 |
gen_op_aam(val); |
3651 | 3660 |
s->cc_op = CC_OP_LOGICB; |
3652 | 3661 |
break; |
3653 | 3662 |
case 0xd5: /* aad */ |
3654 |
val = ldub(s->pc++); |
|
3663 |
val = ldub_code(s->pc++);
|
|
3655 | 3664 |
gen_op_aad(val); |
3656 | 3665 |
s->cc_op = CC_OP_LOGICB; |
3657 | 3666 |
break; |
... | ... | |
3665 | 3674 |
gen_interrupt(s, EXCP03_INT3, pc_start - s->cs_base, s->pc - s->cs_base); |
3666 | 3675 |
break; |
3667 | 3676 |
case 0xcd: /* int N */ |
3668 |
val = ldub(s->pc++); |
|
3677 |
val = ldub_code(s->pc++);
|
|
3669 | 3678 |
/* XXX: add error code for vm86 GPF */ |
3670 | 3679 |
if (!s->vm86) |
3671 | 3680 |
gen_interrupt(s, val, pc_start - s->cs_base, s->pc - s->cs_base); |
... | ... | |
3718 | 3727 |
break; |
3719 | 3728 |
case 0x62: /* bound */ |
3720 | 3729 |
ot = dflag ? OT_LONG : OT_WORD; |
3721 |
modrm = ldub(s->pc++); |
|
3730 |
modrm = ldub_code(s->pc++);
|
|
3722 | 3731 |
reg = (modrm >> 3) & 7; |
3723 | 3732 |
mod = (modrm >> 6) & 3; |
3724 | 3733 |
if (mod == 3) |
... | ... | |
3785 | 3794 |
} |
3786 | 3795 |
break; |
3787 | 3796 |
case 0x100: |
3788 |
modrm = ldub(s->pc++); |
|
3797 |
modrm = ldub_code(s->pc++);
|
|
3789 | 3798 |
mod = (modrm >> 6) & 3; |
3790 | 3799 |
op = (modrm >> 3) & 7; |
3791 | 3800 |
switch(op) { |
... | ... | |
3828 | 3837 |
} |
3829 | 3838 |
break; |
3830 | 3839 |
case 0x101: |
3831 |
modrm = ldub(s->pc++); |
|
3840 |
modrm = ldub_code(s->pc++);
|
|
3832 | 3841 |
mod = (modrm >> 6) & 3; |
3833 | 3842 |
op = (modrm >> 3) & 7; |
3834 | 3843 |
switch(op) { |
... | ... | |
3904 | 3913 |
if (!s->pe || s->vm86) |
3905 | 3914 |
goto illegal_op; |
3906 | 3915 |
ot = dflag ? OT_LONG : OT_WORD; |
3907 |
modrm = ldub(s->pc++); |
|
3916 |
modrm = ldub_code(s->pc++);
|
|
3908 | 3917 |
reg = (modrm >> 3) & 7; |
3909 | 3918 |
gen_ldst_modrm(s, modrm, ot, OR_TMP0, 0); |
3910 | 3919 |
gen_op_mov_TN_reg[ot][1][reg](); |
... | ... | |
3918 | 3927 |
gen_op_mov_reg_T1[ot][reg](); |
3919 | 3928 |
break; |
3920 | 3929 |
case 0x118: |
3921 |
modrm = ldub(s->pc++); |
|
3930 |
modrm = ldub_code(s->pc++);
|
|
3922 | 3931 |
mod = (modrm >> 6) & 3; |
3923 | 3932 |
op = (modrm >> 3) & 7; |
3924 | 3933 |
switch(op) { |
... | ... | |
3940 | 3949 |
if (s->cpl != 0) { |
3941 | 3950 |
gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); |
3942 | 3951 |
} else { |
3943 |
modrm = ldub(s->pc++); |
|
3952 |
modrm = ldub_code(s->pc++);
|
|
3944 | 3953 |
if ((modrm & 0xc0) != 0xc0) |
3945 | 3954 |
goto illegal_op; |
3946 | 3955 |
rm = modrm & 7; |
... | ... | |
3970 | 3979 |
if (s->cpl != 0) { |
3971 | 3980 |
gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); |
3972 | 3981 |
} else { |
3973 |
modrm = ldub(s->pc++); |
|
3982 |
modrm = ldub_code(s->pc++);
|
|
3974 | 3983 |
if ((modrm & 0xc0) != 0xc0) |
3975 | 3984 |
goto illegal_op; |
3976 | 3985 |
rm = modrm & 7; |
Also available in: Unified diff