Commit e108dd01ce8fd3af84929ce925f791e1086a7a75
1 parent
d1896336
converted sign extension ops to TCG
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4481 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
31 additions
and
76 deletions
target-i386/op.c
| ... | ... | @@ -263,67 +263,6 @@ void OPPROTO op_cmpxchg8b(void) |
| 263 | 263 | |
| 264 | 264 | #endif |
| 265 | 265 | |
| 266 | -/* sign extend */ | |
| 267 | - | |
| 268 | -void OPPROTO op_movsbl_T0_T0(void) | |
| 269 | -{ | |
| 270 | - T0 = (int8_t)T0; | |
| 271 | -} | |
| 272 | - | |
| 273 | -void OPPROTO op_movzbl_T0_T0(void) | |
| 274 | -{ | |
| 275 | - T0 = (uint8_t)T0; | |
| 276 | -} | |
| 277 | - | |
| 278 | -void OPPROTO op_movswl_T0_T0(void) | |
| 279 | -{ | |
| 280 | - T0 = (int16_t)T0; | |
| 281 | -} | |
| 282 | - | |
| 283 | -void OPPROTO op_movzwl_T0_T0(void) | |
| 284 | -{ | |
| 285 | - T0 = (uint16_t)T0; | |
| 286 | -} | |
| 287 | - | |
| 288 | -void OPPROTO op_movswl_EAX_AX(void) | |
| 289 | -{ | |
| 290 | - EAX = (uint32_t)((int16_t)EAX); | |
| 291 | -} | |
| 292 | - | |
| 293 | -#ifdef TARGET_X86_64 | |
| 294 | -void OPPROTO op_movslq_T0_T0(void) | |
| 295 | -{ | |
| 296 | - T0 = (int32_t)T0; | |
| 297 | -} | |
| 298 | - | |
| 299 | -void OPPROTO op_movslq_RAX_EAX(void) | |
| 300 | -{ | |
| 301 | - EAX = (int32_t)EAX; | |
| 302 | -} | |
| 303 | -#endif | |
| 304 | - | |
| 305 | -void OPPROTO op_movsbw_AX_AL(void) | |
| 306 | -{ | |
| 307 | - EAX = (EAX & ~0xffff) | ((int8_t)EAX & 0xffff); | |
| 308 | -} | |
| 309 | - | |
| 310 | -void OPPROTO op_movslq_EDX_EAX(void) | |
| 311 | -{ | |
| 312 | - EDX = (uint32_t)((int32_t)EAX >> 31); | |
| 313 | -} | |
| 314 | - | |
| 315 | -void OPPROTO op_movswl_DX_AX(void) | |
| 316 | -{ | |
| 317 | - EDX = (EDX & ~0xffff) | (((int16_t)EAX >> 15) & 0xffff); | |
| 318 | -} | |
| 319 | - | |
| 320 | -#ifdef TARGET_X86_64 | |
| 321 | -void OPPROTO op_movsqo_RDX_RAX(void) | |
| 322 | -{ | |
| 323 | - EDX = (int64_t)EAX >> 63; | |
| 324 | -} | |
| 325 | -#endif | |
| 326 | - | |
| 327 | 266 | /* string ops helpers */ |
| 328 | 267 | |
| 329 | 268 | void OPPROTO op_addl_ESI_T0(void) | ... | ... |
target-i386/translate.c
| ... | ... | @@ -4109,24 +4109,40 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 4109 | 4109 | case 0x98: /* CWDE/CBW */ |
| 4110 | 4110 | #ifdef TARGET_X86_64 |
| 4111 | 4111 | if (dflag == 2) { |
| 4112 | - gen_op_movslq_RAX_EAX(); | |
| 4112 | + gen_op_mov_TN_reg(OT_LONG, 0, R_EAX); | |
| 4113 | + tcg_gen_ext32s_tl(cpu_T[0], cpu_T[0]); | |
| 4114 | + gen_op_mov_reg_T0(OT_QUAD, R_EAX); | |
| 4113 | 4115 | } else |
| 4114 | 4116 | #endif |
| 4115 | - if (dflag == 1) | |
| 4116 | - gen_op_movswl_EAX_AX(); | |
| 4117 | - else | |
| 4118 | - gen_op_movsbw_AX_AL(); | |
| 4117 | + if (dflag == 1) { | |
| 4118 | + gen_op_mov_TN_reg(OT_WORD, 0, R_EAX); | |
| 4119 | + tcg_gen_ext16s_tl(cpu_T[0], cpu_T[0]); | |
| 4120 | + gen_op_mov_reg_T0(OT_LONG, R_EAX); | |
| 4121 | + } else { | |
| 4122 | + gen_op_mov_TN_reg(OT_BYTE, 0, R_EAX); | |
| 4123 | + tcg_gen_ext8s_tl(cpu_T[0], cpu_T[0]); | |
| 4124 | + gen_op_mov_reg_T0(OT_WORD, R_EAX); | |
| 4125 | + } | |
| 4119 | 4126 | break; |
| 4120 | 4127 | case 0x99: /* CDQ/CWD */ |
| 4121 | 4128 | #ifdef TARGET_X86_64 |
| 4122 | 4129 | if (dflag == 2) { |
| 4123 | - gen_op_movsqo_RDX_RAX(); | |
| 4130 | + gen_op_mov_TN_reg(OT_QUAD, 0, R_EAX); | |
| 4131 | + tcg_gen_sari_tl(cpu_T[0], cpu_T[0], 63); | |
| 4132 | + gen_op_mov_reg_T0(OT_QUAD, R_EDX); | |
| 4124 | 4133 | } else |
| 4125 | 4134 | #endif |
| 4126 | - if (dflag == 1) | |
| 4127 | - gen_op_movslq_EDX_EAX(); | |
| 4128 | - else | |
| 4129 | - gen_op_movswl_DX_AX(); | |
| 4135 | + if (dflag == 1) { | |
| 4136 | + gen_op_mov_TN_reg(OT_LONG, 0, R_EAX); | |
| 4137 | + tcg_gen_ext32s_tl(cpu_T[0], cpu_T[0]); | |
| 4138 | + tcg_gen_sari_tl(cpu_T[0], cpu_T[0], 31); | |
| 4139 | + gen_op_mov_reg_T0(OT_LONG, R_EDX); | |
| 4140 | + } else { | |
| 4141 | + gen_op_mov_TN_reg(OT_WORD, 0, R_EAX); | |
| 4142 | + tcg_gen_ext16s_tl(cpu_T[0], cpu_T[0]); | |
| 4143 | + tcg_gen_sari_tl(cpu_T[0], cpu_T[0], 15); | |
| 4144 | + gen_op_mov_reg_T0(OT_WORD, R_EDX); | |
| 4145 | + } | |
| 4130 | 4146 | break; |
| 4131 | 4147 | case 0x1af: /* imul Gv, Ev */ |
| 4132 | 4148 | case 0x69: /* imul Gv, Ev, I */ |
| ... | ... | @@ -4479,17 +4495,17 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 4479 | 4495 | gen_op_mov_TN_reg(ot, 0, rm); |
| 4480 | 4496 | switch(ot | (b & 8)) { |
| 4481 | 4497 | case OT_BYTE: |
| 4482 | - gen_op_movzbl_T0_T0(); | |
| 4498 | + tcg_gen_ext8u_tl(cpu_T[0], cpu_T[0]); | |
| 4483 | 4499 | break; |
| 4484 | 4500 | case OT_BYTE | 8: |
| 4485 | - gen_op_movsbl_T0_T0(); | |
| 4501 | + tcg_gen_ext8s_tl(cpu_T[0], cpu_T[0]); | |
| 4486 | 4502 | break; |
| 4487 | 4503 | case OT_WORD: |
| 4488 | - gen_op_movzwl_T0_T0(); | |
| 4504 | + tcg_gen_ext16u_tl(cpu_T[0], cpu_T[0]); | |
| 4489 | 4505 | break; |
| 4490 | 4506 | default: |
| 4491 | 4507 | case OT_WORD | 8: |
| 4492 | - gen_op_movswl_T0_T0(); | |
| 4508 | + tcg_gen_ext16s_tl(cpu_T[0], cpu_T[0]); | |
| 4493 | 4509 | break; |
| 4494 | 4510 | } |
| 4495 | 4511 | gen_op_mov_reg_T0(d_ot, reg); |
| ... | ... | @@ -6481,7 +6497,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 6481 | 6497 | gen_op_mov_TN_reg(OT_LONG, 0, rm); |
| 6482 | 6498 | /* sign extend */ |
| 6483 | 6499 | if (d_ot == OT_QUAD) |
| 6484 | - gen_op_movslq_T0_T0(); | |
| 6500 | + tcg_gen_ext32s_tl(cpu_T[0], cpu_T[0]); | |
| 6485 | 6501 | gen_op_mov_reg_T0(d_ot, reg); |
| 6486 | 6502 | } else { |
| 6487 | 6503 | gen_lea_modrm(s, modrm, ®_addr, &offset_addr); | ... | ... |