aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/emulate.c
diff options
context:
space:
mode:
authorAvi Kivity <avi.kivity@gmail.com>2013-01-19 12:51:50 -0500
committerMarcelo Tosatti <mtosatti@redhat.com>2013-01-23 19:15:33 -0500
commit0bdea06892e33afddbdc5da6df305e9fe9c41365 (patch)
tree26f836d1cbd906818b4d304bf929140a8eed9586 /arch/x86/kvm/emulate.c
parent93c05d3ef25275829d421a255271595ac219a518 (diff)
KVM: x86 emulator: Convert SHLD, SHRD to fastop
Reviewed-by: Gleb Natapov <gleb@redhat.com> Signed-off-by: Avi Kivity <avi.kivity@gmail.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch/x86/kvm/emulate.c')
-rw-r--r--arch/x86/kvm/emulate.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 619a33d0ee0a..a21773f22107 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -454,6 +454,8 @@ static void invalidate_registers(struct x86_emulate_ctxt *ctxt)
454#define FOP_END \ 454#define FOP_END \
455 ".popsection") 455 ".popsection")
456 456
457#define FOPNOP() FOP_ALIGN FOP_RET
458
457#define FOP1E(op, dst) \ 459#define FOP1E(op, dst) \
458 FOP_ALIGN #op " %" #dst " \n\t" FOP_RET 460 FOP_ALIGN #op " %" #dst " \n\t" FOP_RET
459 461
@@ -476,6 +478,18 @@ static void invalidate_registers(struct x86_emulate_ctxt *ctxt)
476 ON64(FOP2E(op##q, rax, rbx)) \ 478 ON64(FOP2E(op##q, rax, rbx)) \
477 FOP_END 479 FOP_END
478 480
481#define FOP3E(op, dst, src, src2) \
482 FOP_ALIGN #op " %" #src2 ", %" #src ", %" #dst " \n\t" FOP_RET
483
484/* 3-operand, word-only, src2=cl */
485#define FASTOP3WCL(op) \
486 FOP_START(op) \
487 FOPNOP() \
488 FOP3E(op##w, ax, bx, cl) \
489 FOP3E(op##l, eax, ebx, cl) \
490 ON64(FOP3E(op##q, rax, rbx, cl)) \
491 FOP_END
492
479#define __emulate_1op_rax_rdx(ctxt, _op, _suffix, _ex) \ 493#define __emulate_1op_rax_rdx(ctxt, _op, _suffix, _ex) \
480 do { \ 494 do { \
481 unsigned long _tmp; \ 495 unsigned long _tmp; \
@@ -3036,6 +3050,9 @@ FASTOP2(xor);
3036FASTOP2(cmp); 3050FASTOP2(cmp);
3037FASTOP2(test); 3051FASTOP2(test);
3038 3052
3053FASTOP3WCL(shld);
3054FASTOP3WCL(shrd);
3055
3039static int em_xchg(struct x86_emulate_ctxt *ctxt) 3056static int em_xchg(struct x86_emulate_ctxt *ctxt)
3040{ 3057{
3041 /* Write back the register source. */ 3058 /* Write back the register source. */
@@ -4015,14 +4032,14 @@ static const struct opcode twobyte_table[256] = {
4015 /* 0xA0 - 0xA7 */ 4032 /* 0xA0 - 0xA7 */
4016 I(Stack | Src2FS, em_push_sreg), I(Stack | Src2FS, em_pop_sreg), 4033 I(Stack | Src2FS, em_push_sreg), I(Stack | Src2FS, em_pop_sreg),
4017 II(ImplicitOps, em_cpuid, cpuid), I(DstMem | SrcReg | ModRM | BitOp, em_bt), 4034 II(ImplicitOps, em_cpuid, cpuid), I(DstMem | SrcReg | ModRM | BitOp, em_bt),
4018 D(DstMem | SrcReg | Src2ImmByte | ModRM), 4035 F(DstMem | SrcReg | Src2ImmByte | ModRM, em_shld),
4019 D(DstMem | SrcReg | Src2CL | ModRM), N, N, 4036 F(DstMem | SrcReg | Src2CL | ModRM, em_shld), N, N,
4020 /* 0xA8 - 0xAF */ 4037 /* 0xA8 - 0xAF */
4021 I(Stack | Src2GS, em_push_sreg), I(Stack | Src2GS, em_pop_sreg), 4038 I(Stack | Src2GS, em_push_sreg), I(Stack | Src2GS, em_pop_sreg),
4022 DI(ImplicitOps, rsm), 4039 DI(ImplicitOps, rsm),
4023 I(DstMem | SrcReg | ModRM | BitOp | Lock | PageTable, em_bts), 4040 I(DstMem | SrcReg | ModRM | BitOp | Lock | PageTable, em_bts),
4024 D(DstMem | SrcReg | Src2ImmByte | ModRM), 4041 F(DstMem | SrcReg | Src2ImmByte | ModRM, em_shrd),
4025 D(DstMem | SrcReg | Src2CL | ModRM), 4042 F(DstMem | SrcReg | Src2CL | ModRM, em_shrd),
4026 D(ModRM), I(DstReg | SrcMem | ModRM, em_imul), 4043 D(ModRM), I(DstReg | SrcMem | ModRM, em_imul),
4027 /* 0xB0 - 0xB7 */ 4044 /* 0xB0 - 0xB7 */
4028 I2bv(DstMem | SrcReg | ModRM | Lock | PageTable, em_cmpxchg), 4045 I2bv(DstMem | SrcReg | ModRM | Lock | PageTable, em_cmpxchg),
@@ -4834,14 +4851,6 @@ twobyte_insn:
4834 case 0x90 ... 0x9f: /* setcc r/m8 */ 4851 case 0x90 ... 0x9f: /* setcc r/m8 */
4835 ctxt->dst.val = test_cc(ctxt->b, ctxt->eflags); 4852 ctxt->dst.val = test_cc(ctxt->b, ctxt->eflags);
4836 break; 4853 break;
4837 case 0xa4: /* shld imm8, r, r/m */
4838 case 0xa5: /* shld cl, r, r/m */
4839 emulate_2op_cl(ctxt, "shld");
4840 break;
4841 case 0xac: /* shrd imm8, r, r/m */
4842 case 0xad: /* shrd cl, r, r/m */
4843 emulate_2op_cl(ctxt, "shrd");
4844 break;
4845 case 0xae: /* clflush */ 4854 case 0xae: /* clflush */
4846 break; 4855 break;
4847 case 0xb6 ... 0xb7: /* movzx */ 4856 case 0xb6 ... 0xb7: /* movzx */