aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/emulate.c
diff options
context:
space:
mode:
authorAvi Kivity <avi.kivity@gmail.com>2013-01-04 09:18:54 -0500
committerMarcelo Tosatti <mtosatti@redhat.com>2013-01-09 14:39:30 -0500
commitfb864fbc72fd4e2175fb64072fe9134d3a3ab89a (patch)
treecf233407df0c7b36b076461218fa5d71a7a633b0 /arch/x86/kvm/emulate.c
parentf7857f35dbf8e7ca36ebff3f43888fd3fb0f0e70 (diff)
KVM: x86 emulator: convert basic ALU ops to fastop
Opcodes: TEST CMP ADD ADC SUB SBB XOR OR AND Acked-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.c112
1 files changed, 34 insertions, 78 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 3b5d4dd6750a..619a33d0ee0a 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -3026,59 +3026,15 @@ static int em_ret_near_imm(struct x86_emulate_ctxt *ctxt)
3026 return X86EMUL_CONTINUE; 3026 return X86EMUL_CONTINUE;
3027} 3027}
3028 3028
3029static int em_add(struct x86_emulate_ctxt *ctxt) 3029FASTOP2(add);
3030{ 3030FASTOP2(or);
3031 emulate_2op_SrcV(ctxt, "add"); 3031FASTOP2(adc);
3032 return X86EMUL_CONTINUE; 3032FASTOP2(sbb);
3033} 3033FASTOP2(and);
3034 3034FASTOP2(sub);
3035static int em_or(struct x86_emulate_ctxt *ctxt) 3035FASTOP2(xor);
3036{ 3036FASTOP2(cmp);
3037 emulate_2op_SrcV(ctxt, "or"); 3037FASTOP2(test);
3038 return X86EMUL_CONTINUE;
3039}
3040
3041static int em_adc(struct x86_emulate_ctxt *ctxt)
3042{
3043 emulate_2op_SrcV(ctxt, "adc");
3044 return X86EMUL_CONTINUE;
3045}
3046
3047static int em_sbb(struct x86_emulate_ctxt *ctxt)
3048{
3049 emulate_2op_SrcV(ctxt, "sbb");
3050 return X86EMUL_CONTINUE;
3051}
3052
3053static int em_and(struct x86_emulate_ctxt *ctxt)
3054{
3055 emulate_2op_SrcV(ctxt, "and");
3056 return X86EMUL_CONTINUE;
3057}
3058
3059static int em_sub(struct x86_emulate_ctxt *ctxt)
3060{
3061 emulate_2op_SrcV(ctxt, "sub");
3062 return X86EMUL_CONTINUE;
3063}
3064
3065static int em_xor(struct x86_emulate_ctxt *ctxt)
3066{
3067 emulate_2op_SrcV(ctxt, "xor");
3068 return X86EMUL_CONTINUE;
3069}
3070
3071static int em_cmp(struct x86_emulate_ctxt *ctxt)
3072{
3073 emulate_2op_SrcV(ctxt, "cmp");
3074 return X86EMUL_CONTINUE;
3075}
3076
3077static int em_test(struct x86_emulate_ctxt *ctxt)
3078{
3079 emulate_2op_SrcV(ctxt, "test");
3080 return X86EMUL_CONTINUE;
3081}
3082 3038
3083static int em_xchg(struct x86_emulate_ctxt *ctxt) 3039static int em_xchg(struct x86_emulate_ctxt *ctxt)
3084{ 3040{
@@ -3711,9 +3667,9 @@ static int check_perm_out(struct x86_emulate_ctxt *ctxt)
3711#define I2bvIP(_f, _e, _i, _p) \ 3667#define I2bvIP(_f, _e, _i, _p) \
3712 IIP((_f) | ByteOp, _e, _i, _p), IIP(_f, _e, _i, _p) 3668 IIP((_f) | ByteOp, _e, _i, _p), IIP(_f, _e, _i, _p)
3713 3669
3714#define I6ALU(_f, _e) I2bv((_f) | DstMem | SrcReg | ModRM, _e), \ 3670#define F6ALU(_f, _e) F2bv((_f) | DstMem | SrcReg | ModRM, _e), \
3715 I2bv(((_f) | DstReg | SrcMem | ModRM) & ~Lock, _e), \ 3671 F2bv(((_f) | DstReg | SrcMem | ModRM) & ~Lock, _e), \
3716 I2bv(((_f) & ~Lock) | DstAcc | SrcImm, _e) 3672 F2bv(((_f) & ~Lock) | DstAcc | SrcImm, _e)
3717 3673
3718static const struct opcode group7_rm1[] = { 3674static const struct opcode group7_rm1[] = {
3719 DI(SrcNone | Priv, monitor), 3675 DI(SrcNone | Priv, monitor),
@@ -3739,14 +3695,14 @@ static const struct opcode group7_rm7[] = {
3739}; 3695};
3740 3696
3741static const struct opcode group1[] = { 3697static const struct opcode group1[] = {
3742 I(Lock, em_add), 3698 F(Lock, em_add),
3743 I(Lock | PageTable, em_or), 3699 F(Lock | PageTable, em_or),
3744 I(Lock, em_adc), 3700 F(Lock, em_adc),
3745 I(Lock, em_sbb), 3701 F(Lock, em_sbb),
3746 I(Lock | PageTable, em_and), 3702 F(Lock | PageTable, em_and),
3747 I(Lock, em_sub), 3703 F(Lock, em_sub),
3748 I(Lock, em_xor), 3704 F(Lock, em_xor),
3749 I(NoWrite, em_cmp), 3705 F(NoWrite, em_cmp),
3750}; 3706};
3751 3707
3752static const struct opcode group1A[] = { 3708static const struct opcode group1A[] = {
@@ -3754,8 +3710,8 @@ static const struct opcode group1A[] = {
3754}; 3710};
3755 3711
3756static const struct opcode group3[] = { 3712static const struct opcode group3[] = {
3757 I(DstMem | SrcImm | NoWrite, em_test), 3713 F(DstMem | SrcImm | NoWrite, em_test),
3758 I(DstMem | SrcImm | NoWrite, em_test), 3714 F(DstMem | SrcImm | NoWrite, em_test),
3759 F(DstMem | SrcNone | Lock, em_not), 3715 F(DstMem | SrcNone | Lock, em_not),
3760 F(DstMem | SrcNone | Lock, em_neg), 3716 F(DstMem | SrcNone | Lock, em_neg),
3761 I(SrcMem, em_mul_ex), 3717 I(SrcMem, em_mul_ex),
@@ -3897,29 +3853,29 @@ static const struct escape escape_dd = { {
3897 3853
3898static const struct opcode opcode_table[256] = { 3854static const struct opcode opcode_table[256] = {
3899 /* 0x00 - 0x07 */ 3855 /* 0x00 - 0x07 */
3900 I6ALU(Lock, em_add), 3856 F6ALU(Lock, em_add),
3901 I(ImplicitOps | Stack | No64 | Src2ES, em_push_sreg), 3857 I(ImplicitOps | Stack | No64 | Src2ES, em_push_sreg),
3902 I(ImplicitOps | Stack | No64 | Src2ES, em_pop_sreg), 3858 I(ImplicitOps | Stack | No64 | Src2ES, em_pop_sreg),
3903 /* 0x08 - 0x0F */ 3859 /* 0x08 - 0x0F */
3904 I6ALU(Lock | PageTable, em_or), 3860 F6ALU(Lock | PageTable, em_or),
3905 I(ImplicitOps | Stack | No64 | Src2CS, em_push_sreg), 3861 I(ImplicitOps | Stack | No64 | Src2CS, em_push_sreg),
3906 N, 3862 N,
3907 /* 0x10 - 0x17 */ 3863 /* 0x10 - 0x17 */
3908 I6ALU(Lock, em_adc), 3864 F6ALU(Lock, em_adc),
3909 I(ImplicitOps | Stack | No64 | Src2SS, em_push_sreg), 3865 I(ImplicitOps | Stack | No64 | Src2SS, em_push_sreg),
3910 I(ImplicitOps | Stack | No64 | Src2SS, em_pop_sreg), 3866 I(ImplicitOps | Stack | No64 | Src2SS, em_pop_sreg),
3911 /* 0x18 - 0x1F */ 3867 /* 0x18 - 0x1F */
3912 I6ALU(Lock, em_sbb), 3868 F6ALU(Lock, em_sbb),
3913 I(ImplicitOps | Stack | No64 | Src2DS, em_push_sreg), 3869 I(ImplicitOps | Stack | No64 | Src2DS, em_push_sreg),
3914 I(ImplicitOps | Stack | No64 | Src2DS, em_pop_sreg), 3870 I(ImplicitOps | Stack | No64 | Src2DS, em_pop_sreg),
3915 /* 0x20 - 0x27 */ 3871 /* 0x20 - 0x27 */
3916 I6ALU(Lock | PageTable, em_and), N, N, 3872 F6ALU(Lock | PageTable, em_and), N, N,
3917 /* 0x28 - 0x2F */ 3873 /* 0x28 - 0x2F */
3918 I6ALU(Lock, em_sub), N, I(ByteOp | DstAcc | No64, em_das), 3874 F6ALU(Lock, em_sub), N, I(ByteOp | DstAcc | No64, em_das),
3919 /* 0x30 - 0x37 */ 3875 /* 0x30 - 0x37 */
3920 I6ALU(Lock, em_xor), N, N, 3876 F6ALU(Lock, em_xor), N, N,
3921 /* 0x38 - 0x3F */ 3877 /* 0x38 - 0x3F */
3922 I6ALU(NoWrite, em_cmp), N, N, 3878 F6ALU(NoWrite, em_cmp), N, N,
3923 /* 0x40 - 0x4F */ 3879 /* 0x40 - 0x4F */
3924 X16(D(DstReg)), 3880 X16(D(DstReg)),
3925 /* 0x50 - 0x57 */ 3881 /* 0x50 - 0x57 */
@@ -3945,7 +3901,7 @@ static const struct opcode opcode_table[256] = {
3945 G(DstMem | SrcImm, group1), 3901 G(DstMem | SrcImm, group1),
3946 G(ByteOp | DstMem | SrcImm | No64, group1), 3902 G(ByteOp | DstMem | SrcImm | No64, group1),
3947 G(DstMem | SrcImmByte, group1), 3903 G(DstMem | SrcImmByte, group1),
3948 I2bv(DstMem | SrcReg | ModRM | NoWrite, em_test), 3904 F2bv(DstMem | SrcReg | ModRM | NoWrite, em_test),
3949 I2bv(DstMem | SrcReg | ModRM | Lock | PageTable, em_xchg), 3905 I2bv(DstMem | SrcReg | ModRM | Lock | PageTable, em_xchg),
3950 /* 0x88 - 0x8F */ 3906 /* 0x88 - 0x8F */
3951 I2bv(DstMem | SrcReg | ModRM | Mov | PageTable, em_mov), 3907 I2bv(DstMem | SrcReg | ModRM | Mov | PageTable, em_mov),
@@ -3965,12 +3921,12 @@ static const struct opcode opcode_table[256] = {
3965 I2bv(DstAcc | SrcMem | Mov | MemAbs, em_mov), 3921 I2bv(DstAcc | SrcMem | Mov | MemAbs, em_mov),
3966 I2bv(DstMem | SrcAcc | Mov | MemAbs | PageTable, em_mov), 3922 I2bv(DstMem | SrcAcc | Mov | MemAbs | PageTable, em_mov),
3967 I2bv(SrcSI | DstDI | Mov | String, em_mov), 3923 I2bv(SrcSI | DstDI | Mov | String, em_mov),
3968 I2bv(SrcSI | DstDI | String | NoWrite, em_cmp), 3924 F2bv(SrcSI | DstDI | String | NoWrite, em_cmp),
3969 /* 0xA8 - 0xAF */ 3925 /* 0xA8 - 0xAF */
3970 I2bv(DstAcc | SrcImm | NoWrite, em_test), 3926 F2bv(DstAcc | SrcImm | NoWrite, em_test),
3971 I2bv(SrcAcc | DstDI | Mov | String, em_mov), 3927 I2bv(SrcAcc | DstDI | Mov | String, em_mov),
3972 I2bv(SrcSI | DstAcc | Mov | String, em_mov), 3928 I2bv(SrcSI | DstAcc | Mov | String, em_mov),
3973 I2bv(SrcAcc | DstDI | String | NoWrite, em_cmp), 3929 F2bv(SrcAcc | DstDI | String | NoWrite, em_cmp),
3974 /* 0xB0 - 0xB7 */ 3930 /* 0xB0 - 0xB7 */
3975 X8(I(ByteOp | DstReg | SrcImm | Mov, em_mov)), 3931 X8(I(ByteOp | DstReg | SrcImm | Mov, em_mov)),
3976 /* 0xB8 - 0xBF */ 3932 /* 0xB8 - 0xBF */