Commit d1e42c5c1e312320460509c5ab1e94fb17cb7515
1 parent
4bb3973f
x86_64 mmx/sse fix
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1969 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
11 additions
and
1 deletions
target-i386/translate.c
... | ... | @@ -2905,6 +2905,7 @@ static void gen_sse(DisasContext *s, int b, target_ulong pc_start, int rex_r) |
2905 | 2905 | break; |
2906 | 2906 | case 0xc4: /* pinsrw */ |
2907 | 2907 | case 0x1c4: |
2908 | + s->rip_offset = 1; | |
2908 | 2909 | gen_ldst_modrm(s, modrm, OT_WORD, OR_TMP0, 0); |
2909 | 2910 | val = ldub_code(s->pc++); |
2910 | 2911 | if (b1) { |
... | ... | @@ -2975,7 +2976,8 @@ static void gen_sse(DisasContext *s, int b, target_ulong pc_start, int rex_r) |
2975 | 2976 | } |
2976 | 2977 | } else { |
2977 | 2978 | /* generic MMX or SSE operation */ |
2978 | - if (b == 0xf7) { | |
2979 | + switch(b) { | |
2980 | + case 0xf7: | |
2979 | 2981 | /* maskmov : we must prepare A0 */ |
2980 | 2982 | if (mod != 3) |
2981 | 2983 | goto illegal_op; |
... | ... | @@ -2990,6 +2992,14 @@ static void gen_sse(DisasContext *s, int b, target_ulong pc_start, int rex_r) |
2990 | 2992 | gen_op_andl_A0_ffff(); |
2991 | 2993 | } |
2992 | 2994 | gen_add_A0_ds_seg(s); |
2995 | + break; | |
2996 | + case 0x70: /* pshufx insn */ | |
2997 | + case 0xc6: /* pshufx insn */ | |
2998 | + case 0xc2: /* compare insns */ | |
2999 | + s->rip_offset = 1; | |
3000 | + break; | |
3001 | + default: | |
3002 | + break; | |
2993 | 3003 | } |
2994 | 3004 | if (is_xmm) { |
2995 | 3005 | op1_offset = offsetof(CPUX86State,xmm_regs[reg]); | ... | ... |