Commit f484d386226e2f31c9979ddb68f9dcf3a607c2eb
1 parent
07d2c595
converted bit test operations to TCG
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4473 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
53 additions
and
98 deletions
target-i386/ops_template.h
| ... | ... | @@ -203,42 +203,6 @@ void OPPROTO glue(op_setle_T0_sub, SUFFIX)(void) |
| 203 | 203 | /* bit operations */ |
| 204 | 204 | #if DATA_BITS >= 16 |
| 205 | 205 | |
| 206 | -void OPPROTO glue(glue(op_bt, SUFFIX), _T0_T1_cc)(void) | |
| 207 | -{ | |
| 208 | - int count; | |
| 209 | - count = T1 & SHIFT_MASK; | |
| 210 | - CC_SRC = T0 >> count; | |
| 211 | -} | |
| 212 | - | |
| 213 | -void OPPROTO glue(glue(op_bts, SUFFIX), _T0_T1_cc)(void) | |
| 214 | -{ | |
| 215 | - int count; | |
| 216 | - count = T1 & SHIFT_MASK; | |
| 217 | - T1 = T0 >> count; | |
| 218 | - T0 |= (((target_long)1) << count); | |
| 219 | -} | |
| 220 | - | |
| 221 | -void OPPROTO glue(glue(op_btr, SUFFIX), _T0_T1_cc)(void) | |
| 222 | -{ | |
| 223 | - int count; | |
| 224 | - count = T1 & SHIFT_MASK; | |
| 225 | - T1 = T0 >> count; | |
| 226 | - T0 &= ~(((target_long)1) << count); | |
| 227 | -} | |
| 228 | - | |
| 229 | -void OPPROTO glue(glue(op_btc, SUFFIX), _T0_T1_cc)(void) | |
| 230 | -{ | |
| 231 | - int count; | |
| 232 | - count = T1 & SHIFT_MASK; | |
| 233 | - T1 = T0 >> count; | |
| 234 | - T0 ^= (((target_long)1) << count); | |
| 235 | -} | |
| 236 | - | |
| 237 | -void OPPROTO glue(glue(op_add_bit, SUFFIX), _A0_T1)(void) | |
| 238 | -{ | |
| 239 | - A0 += ((DATA_STYPE)T1 >> (3 + SHIFT)) << SHIFT; | |
| 240 | -} | |
| 241 | - | |
| 242 | 206 | void OPPROTO glue(glue(op_bsf, SUFFIX), _T0_cc)(void) |
| 243 | 207 | { |
| 244 | 208 | int count; |
| ... | ... | @@ -281,13 +245,6 @@ void OPPROTO glue(glue(op_bsr, SUFFIX), _T0_cc)(void) |
| 281 | 245 | |
| 282 | 246 | #endif |
| 283 | 247 | |
| 284 | -#if DATA_BITS == 32 | |
| 285 | -void OPPROTO op_update_bt_cc(void) | |
| 286 | -{ | |
| 287 | - CC_SRC = T1; | |
| 288 | -} | |
| 289 | -#endif | |
| 290 | - | |
| 291 | 248 | /* string operations */ |
| 292 | 249 | |
| 293 | 250 | void OPPROTO glue(op_movl_T0_Dshift, SUFFIX)(void) | ... | ... |
target-i386/translate.c
| ... | ... | @@ -498,35 +498,6 @@ static GenOpFunc *gen_op_cmov_reg_T1_T0[NB_OP_SIZES - 1][CPU_NB_REGS] = { |
| 498 | 498 | #endif |
| 499 | 499 | }; |
| 500 | 500 | |
| 501 | -static GenOpFunc *gen_op_btx_T0_T1_cc[3][4] = { | |
| 502 | - [0] = { | |
| 503 | - gen_op_btw_T0_T1_cc, | |
| 504 | - gen_op_btsw_T0_T1_cc, | |
| 505 | - gen_op_btrw_T0_T1_cc, | |
| 506 | - gen_op_btcw_T0_T1_cc, | |
| 507 | - }, | |
| 508 | - [1] = { | |
| 509 | - gen_op_btl_T0_T1_cc, | |
| 510 | - gen_op_btsl_T0_T1_cc, | |
| 511 | - gen_op_btrl_T0_T1_cc, | |
| 512 | - gen_op_btcl_T0_T1_cc, | |
| 513 | - }, | |
| 514 | -#ifdef TARGET_X86_64 | |
| 515 | - [2] = { | |
| 516 | - gen_op_btq_T0_T1_cc, | |
| 517 | - gen_op_btsq_T0_T1_cc, | |
| 518 | - gen_op_btrq_T0_T1_cc, | |
| 519 | - gen_op_btcq_T0_T1_cc, | |
| 520 | - }, | |
| 521 | -#endif | |
| 522 | -}; | |
| 523 | - | |
| 524 | -static GenOpFunc *gen_op_add_bit_A0_T1[3] = { | |
| 525 | - gen_op_add_bitw_A0_T1, | |
| 526 | - gen_op_add_bitl_A0_T1, | |
| 527 | - X86_64_ONLY(gen_op_add_bitq_A0_T1), | |
| 528 | -}; | |
| 529 | - | |
| 530 | 501 | static GenOpFunc *gen_op_bsx_T0_cc[3][2] = { |
| 531 | 502 | [0] = { |
| 532 | 503 | gen_op_bsfw_T0_cc, |
| ... | ... | @@ -1379,6 +1350,23 @@ static void gen_extu(int ot, TCGv reg) |
| 1379 | 1350 | } |
| 1380 | 1351 | } |
| 1381 | 1352 | |
| 1353 | +static void gen_exts(int ot, TCGv reg) | |
| 1354 | +{ | |
| 1355 | + switch(ot) { | |
| 1356 | + case OT_BYTE: | |
| 1357 | + tcg_gen_ext8s_tl(reg, reg); | |
| 1358 | + break; | |
| 1359 | + case OT_WORD: | |
| 1360 | + tcg_gen_ext16s_tl(reg, reg); | |
| 1361 | + break; | |
| 1362 | + case OT_LONG: | |
| 1363 | + tcg_gen_ext32s_tl(reg, reg); | |
| 1364 | + break; | |
| 1365 | + default: | |
| 1366 | + break; | |
| 1367 | + } | |
| 1368 | +} | |
| 1369 | + | |
| 1382 | 1370 | /* XXX: add faster immediate case */ |
| 1383 | 1371 | static void gen_shift_rm_T1(DisasContext *s, int ot, int op1, |
| 1384 | 1372 | int is_right, int is_arith) |
| ... | ... | @@ -1403,19 +1391,7 @@ static void gen_shift_rm_T1(DisasContext *s, int ot, int op1, |
| 1403 | 1391 | |
| 1404 | 1392 | if (is_right) { |
| 1405 | 1393 | if (is_arith) { |
| 1406 | - switch(ot) { | |
| 1407 | - case OT_BYTE: | |
| 1408 | - tcg_gen_ext8s_tl(cpu_T[0], cpu_T[0]); | |
| 1409 | - break; | |
| 1410 | - case OT_WORD: | |
| 1411 | - tcg_gen_ext16s_tl(cpu_T[0], cpu_T[0]); | |
| 1412 | - break; | |
| 1413 | - case OT_LONG: | |
| 1414 | - tcg_gen_ext32s_tl(cpu_T[0], cpu_T[0]); | |
| 1415 | - break; | |
| 1416 | - default: | |
| 1417 | - break; | |
| 1418 | - } | |
| 1394 | + gen_exts(ot, cpu_T[0]); | |
| 1419 | 1395 | tcg_gen_sar_tl(cpu_T3, cpu_T[0], cpu_tmp5); |
| 1420 | 1396 | tcg_gen_sar_tl(cpu_T[0], cpu_T[0], cpu_T[1]); |
| 1421 | 1397 | } else { |
| ... | ... | @@ -5791,16 +5767,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 5791 | 5767 | if (op < 4) |
| 5792 | 5768 | goto illegal_op; |
| 5793 | 5769 | op -= 4; |
| 5794 | - gen_op_btx_T0_T1_cc[ot - OT_WORD][op](); | |
| 5795 | - s->cc_op = CC_OP_SARB + ot; | |
| 5796 | - if (op != 0) { | |
| 5797 | - if (mod != 3) | |
| 5798 | - gen_op_st_T0_A0(ot + s->mem_index); | |
| 5799 | - else | |
| 5800 | - gen_op_mov_reg_T0(ot, rm); | |
| 5801 | - gen_op_update_bt_cc(); | |
| 5802 | - } | |
| 5803 | - break; | |
| 5770 | + goto bt_op; | |
| 5804 | 5771 | case 0x1a3: /* bt Gv, Ev */ |
| 5805 | 5772 | op = 0; |
| 5806 | 5773 | goto do_btx; |
| ... | ... | @@ -5822,19 +5789,50 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 5822 | 5789 | if (mod != 3) { |
| 5823 | 5790 | gen_lea_modrm(s, modrm, ®_addr, &offset_addr); |
| 5824 | 5791 | /* specific case: we need to add a displacement */ |
| 5825 | - gen_op_add_bit_A0_T1[ot - OT_WORD](); | |
| 5792 | + gen_exts(ot, cpu_T[1]); | |
| 5793 | + tcg_gen_sari_tl(cpu_tmp0, cpu_T[1], 3 + ot); | |
| 5794 | + tcg_gen_shli_tl(cpu_tmp0, cpu_tmp0, ot); | |
| 5795 | + tcg_gen_add_tl(cpu_A0, cpu_A0, cpu_tmp0); | |
| 5826 | 5796 | gen_op_ld_T0_A0(ot + s->mem_index); |
| 5827 | 5797 | } else { |
| 5828 | 5798 | gen_op_mov_TN_reg(ot, 0, rm); |
| 5829 | 5799 | } |
| 5830 | - gen_op_btx_T0_T1_cc[ot - OT_WORD][op](); | |
| 5800 | + bt_op: | |
| 5801 | + tcg_gen_andi_tl(cpu_T[1], cpu_T[1], (1 << (3 + ot)) - 1); | |
| 5802 | + switch(op) { | |
| 5803 | + case 0: | |
| 5804 | + tcg_gen_shr_tl(cpu_cc_src, cpu_T[0], cpu_T[1]); | |
| 5805 | + tcg_gen_movi_tl(cpu_cc_dst, 0); | |
| 5806 | + break; | |
| 5807 | + case 1: | |
| 5808 | + tcg_gen_shr_tl(cpu_tmp4, cpu_T[0], cpu_T[1]); | |
| 5809 | + tcg_gen_movi_tl(cpu_tmp0, 1); | |
| 5810 | + tcg_gen_shl_tl(cpu_tmp0, cpu_tmp0, cpu_T[1]); | |
| 5811 | + tcg_gen_or_tl(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 5812 | + break; | |
| 5813 | + case 2: | |
| 5814 | + tcg_gen_shr_tl(cpu_tmp4, cpu_T[0], cpu_T[1]); | |
| 5815 | + tcg_gen_movi_tl(cpu_tmp0, 1); | |
| 5816 | + tcg_gen_shl_tl(cpu_tmp0, cpu_tmp0, cpu_T[1]); | |
| 5817 | + tcg_gen_not_tl(cpu_tmp0, cpu_tmp0); | |
| 5818 | + tcg_gen_and_tl(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 5819 | + break; | |
| 5820 | + default: | |
| 5821 | + case 3: | |
| 5822 | + tcg_gen_shr_tl(cpu_tmp4, cpu_T[0], cpu_T[1]); | |
| 5823 | + tcg_gen_movi_tl(cpu_tmp0, 1); | |
| 5824 | + tcg_gen_shl_tl(cpu_tmp0, cpu_tmp0, cpu_T[1]); | |
| 5825 | + tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 5826 | + break; | |
| 5827 | + } | |
| 5831 | 5828 | s->cc_op = CC_OP_SARB + ot; |
| 5832 | 5829 | if (op != 0) { |
| 5833 | 5830 | if (mod != 3) |
| 5834 | 5831 | gen_op_st_T0_A0(ot + s->mem_index); |
| 5835 | 5832 | else |
| 5836 | 5833 | gen_op_mov_reg_T0(ot, rm); |
| 5837 | - gen_op_update_bt_cc(); | |
| 5834 | + tcg_gen_mov_tl(cpu_cc_src, cpu_tmp4); | |
| 5835 | + tcg_gen_movi_tl(cpu_cc_dst, 0); | |
| 5838 | 5836 | } |
| 5839 | 5837 | break; |
| 5840 | 5838 | case 0x1bc: /* bsf */ | ... | ... |