diff options
author | Avi Kivity <avi.kivity@gmail.com> | 2013-01-19 12:51:50 -0500 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2013-01-23 19:15:33 -0500 |
commit | 0bdea06892e33afddbdc5da6df305e9fe9c41365 (patch) | |
tree | 26f836d1cbd906818b4d304bf929140a8eed9586 /arch/x86/kvm/emulate.c | |
parent | 93c05d3ef25275829d421a255271595ac219a518 (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.c | 33 |
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); | |||
3036 | FASTOP2(cmp); | 3050 | FASTOP2(cmp); |
3037 | FASTOP2(test); | 3051 | FASTOP2(test); |
3038 | 3052 | ||
3053 | FASTOP3WCL(shld); | ||
3054 | FASTOP3WCL(shrd); | ||
3055 | |||
3039 | static int em_xchg(struct x86_emulate_ctxt *ctxt) | 3056 | static 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 */ |