Commit d52cf7a64afb766b2b9a88738353bb5ec810b328
1 parent
bb2d5314
sse fix
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1224 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
17 additions
and
3 deletions
target-i386/ops_sse.h
@@ -528,7 +528,7 @@ void OPPROTO glue(op_maskmov, SUFFIX) (void) | @@ -528,7 +528,7 @@ void OPPROTO glue(op_maskmov, SUFFIX) (void) | ||
528 | s = (Reg *)((char *)env + PARAM2); | 528 | s = (Reg *)((char *)env + PARAM2); |
529 | for(i = 0; i < (8 << SHIFT); i++) { | 529 | for(i = 0; i < (8 << SHIFT); i++) { |
530 | if (s->B(i) & 0x80) | 530 | if (s->B(i) & 0x80) |
531 | - stb(A0, d->B(i)); | 531 | + stb(A0 + i, d->B(i)); |
532 | } | 532 | } |
533 | } | 533 | } |
534 | 534 | ||
@@ -565,6 +565,20 @@ void OPPROTO glue(op_pshufw, SUFFIX) (void) | @@ -565,6 +565,20 @@ void OPPROTO glue(op_pshufw, SUFFIX) (void) | ||
565 | *d = r; | 565 | *d = r; |
566 | } | 566 | } |
567 | #else | 567 | #else |
568 | +void OPPROTO op_shufps(void) | ||
569 | +{ | ||
570 | + Reg r, *d, *s; | ||
571 | + int order; | ||
572 | + d = (Reg *)((char *)env + PARAM1); | ||
573 | + s = (Reg *)((char *)env + PARAM2); | ||
574 | + order = PARAM3; | ||
575 | + r.L(0) = d->L(order & 3); | ||
576 | + r.L(1) = d->L((order >> 2) & 3); | ||
577 | + r.L(2) = s->L((order >> 4) & 3); | ||
578 | + r.L(3) = s->L((order >> 6) & 3); | ||
579 | + *d = r; | ||
580 | +} | ||
581 | + | ||
568 | void OPPROTO op_shufpd(void) | 582 | void OPPROTO op_shufpd(void) |
569 | { | 583 | { |
570 | Reg r, *d, *s; | 584 | Reg r, *d, *s; |
@@ -572,7 +586,7 @@ void OPPROTO op_shufpd(void) | @@ -572,7 +586,7 @@ void OPPROTO op_shufpd(void) | ||
572 | d = (Reg *)((char *)env + PARAM1); | 586 | d = (Reg *)((char *)env + PARAM1); |
573 | s = (Reg *)((char *)env + PARAM2); | 587 | s = (Reg *)((char *)env + PARAM2); |
574 | order = PARAM3; | 588 | order = PARAM3; |
575 | - r.Q(0) = s->Q(order & 1); | 589 | + r.Q(0) = d->Q(order & 1); |
576 | r.Q(1) = s->Q((order >> 1) & 1); | 590 | r.Q(1) = s->Q((order >> 1) & 1); |
577 | *d = r; | 591 | *d = r; |
578 | } | 592 | } |
target-i386/translate.c
@@ -2292,7 +2292,7 @@ static GenOpFunc2 *sse_op_table1[256][4] = { | @@ -2292,7 +2292,7 @@ static GenOpFunc2 *sse_op_table1[256][4] = { | ||
2292 | [0x5f] = SSE_FOP(max), | 2292 | [0x5f] = SSE_FOP(max), |
2293 | 2293 | ||
2294 | [0xc2] = SSE_FOP(cmpeq), | 2294 | [0xc2] = SSE_FOP(cmpeq), |
2295 | - [0xc6] = { (GenOpFunc2 *)gen_op_pshufd_xmm, (GenOpFunc2 *)gen_op_shufpd }, | 2295 | + [0xc6] = { (GenOpFunc2 *)gen_op_shufps, (GenOpFunc2 *)gen_op_shufpd }, |
2296 | 2296 | ||
2297 | /* MMX ops and their SSE extensions */ | 2297 | /* MMX ops and their SSE extensions */ |
2298 | [0x60] = MMX_OP2(punpcklbw), | 2298 | [0x60] = MMX_OP2(punpcklbw), |