Commit 000cacf6f9dce7d71f88aadf7e9b3688eaa3ab69

Authored by balrog
1 parent 9dc63a1e

Fix crc32w decoding, fix a constant width in blendvpd.

Forced the constant's width to long long so that it doesn't overflow,
problem spotted by C. W. Betts.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5417 c046a42c-6fe2-441c-8c8c-71466251a162
target-i386/ops_sse.h
@@ -1481,7 +1481,7 @@ void glue(name, SUFFIX) (Reg *d, Reg *s, uint32_t imm)\ @@ -1481,7 +1481,7 @@ void glue(name, SUFFIX) (Reg *d, Reg *s, uint32_t imm)\
1481 /* SSE4.1 op helpers */ 1481 /* SSE4.1 op helpers */
1482 #define FBLENDVB(d, s, m) (m & 0x80) ? s : d 1482 #define FBLENDVB(d, s, m) (m & 0x80) ? s : d
1483 #define FBLENDVPS(d, s, m) (m & 0x80000000) ? s : d 1483 #define FBLENDVPS(d, s, m) (m & 0x80000000) ? s : d
1484 -#define FBLENDVPD(d, s, m) (m & 0x8000000000000000) ? s : d 1484 +#define FBLENDVPD(d, s, m) (m & 0x8000000000000000LL) ? s : d
1485 SSE_HELPER_V(helper_pblendvb, B, 16, FBLENDVB) 1485 SSE_HELPER_V(helper_pblendvb, B, 16, FBLENDVB)
1486 SSE_HELPER_V(helper_blendvps, L, 4, FBLENDVPS) 1486 SSE_HELPER_V(helper_blendvps, L, 4, FBLENDVPS)
1487 SSE_HELPER_V(helper_blendvpd, Q, 2, FBLENDVPD) 1487 SSE_HELPER_V(helper_blendvpd, Q, 2, FBLENDVPD)
target-i386/translate.c
@@ -3568,17 +3568,16 @@ static void gen_sse(DisasContext *s, int b, target_ulong pc_start, int rex_r) @@ -3568,17 +3568,16 @@ static void gen_sse(DisasContext *s, int b, target_ulong pc_start, int rex_r)
3568 reg = ((modrm >> 3) & 7) | rex_r; 3568 reg = ((modrm >> 3) & 7) | rex_r;
3569 gen_op_mov_reg_T0(OT_LONG, reg); 3569 gen_op_mov_reg_T0(OT_LONG, reg);
3570 break; 3570 break;
3571 - case 0x038:  
3572 case 0x138: 3571 case 0x138:
  3572 + if (s->prefix & PREFIX_REPNZ)
  3573 + goto crc32;
  3574 + case 0x038:
3573 b = modrm; 3575 b = modrm;
3574 modrm = ldub_code(s->pc++); 3576 modrm = ldub_code(s->pc++);
3575 rm = modrm & 7; 3577 rm = modrm & 7;
3576 reg = ((modrm >> 3) & 7) | rex_r; 3578 reg = ((modrm >> 3) & 7) | rex_r;
3577 mod = (modrm >> 6) & 3; 3579 mod = (modrm >> 6) & 3;
3578 3580
3579 - if (s->prefix & PREFIX_REPNZ)  
3580 - goto crc32;  
3581 -  
3582 sse_op2 = sse_op_table6[b].op[b1]; 3581 sse_op2 = sse_op_table6[b].op[b1];
3583 if (!sse_op2) 3582 if (!sse_op2)
3584 goto illegal_op; 3583 goto illegal_op;