trunk/src/emu/cpu/i386/pentops.inc
| r243112 | r243113 | |
| 2249 | 2249 | MMXPROLOG(); |
| 2250 | 2250 | UINT8 modrm = FETCH(); |
| 2251 | 2251 | if( modrm >= 0xc0 ) { |
| 2252 | MMX_REG ds, sd; |
| 2252 | 2253 | int s,d; |
| 2253 | 2254 | s=modrm & 0x7; |
| 2254 | 2255 | d=(modrm >> 3) & 0x7; |
| 2255 | | MMX(d).b[0]=SaturatedSignedWordToUnsignedByte(MMX(d).s[0]); |
| 2256 | | MMX(d).b[1]=SaturatedSignedWordToUnsignedByte(MMX(d).s[1]); |
| 2257 | | MMX(d).b[2]=SaturatedSignedWordToUnsignedByte(MMX(d).s[2]); |
| 2258 | | MMX(d).b[3]=SaturatedSignedWordToUnsignedByte(MMX(d).s[3]); |
| 2259 | | MMX(d).b[4]=SaturatedSignedWordToUnsignedByte(MMX(s).s[0]); |
| 2260 | | MMX(d).b[5]=SaturatedSignedWordToUnsignedByte(MMX(s).s[1]); |
| 2261 | | MMX(d).b[6]=SaturatedSignedWordToUnsignedByte(MMX(s).s[2]); |
| 2262 | | MMX(d).b[7]=SaturatedSignedWordToUnsignedByte(MMX(s).s[3]); |
| 2256 | ds.q = MMX(d).q; |
| 2257 | sd.q = MMX(s).q; |
| 2258 | MMX(d).b[0]=SaturatedSignedWordToUnsignedByte(ds.s[0]); |
| 2259 | MMX(d).b[1]=SaturatedSignedWordToUnsignedByte(ds.s[1]); |
| 2260 | MMX(d).b[2]=SaturatedSignedWordToUnsignedByte(ds.s[2]); |
| 2261 | MMX(d).b[3]=SaturatedSignedWordToUnsignedByte(ds.s[3]); |
| 2262 | MMX(d).b[4]=SaturatedSignedWordToUnsignedByte(sd.s[0]); |
| 2263 | MMX(d).b[5]=SaturatedSignedWordToUnsignedByte(sd.s[1]); |
| 2264 | MMX(d).b[6]=SaturatedSignedWordToUnsignedByte(sd.s[2]); |
| 2265 | MMX(d).b[7]=SaturatedSignedWordToUnsignedByte(sd.s[3]); |
| 2263 | 2266 | } else { |
| 2264 | | MMX_REG s; |
| 2267 | MMX_REG s,t; |
| 2265 | 2268 | int d=(modrm >> 3) & 0x7; |
| 2266 | 2269 | UINT32 ea = GetEA(modrm, 0); |
| 2267 | 2270 | READMMX(ea, s); |
| 2268 | | MMX(d).b[0]=SaturatedSignedWordToUnsignedByte(MMX(d).s[0]); |
| 2269 | | MMX(d).b[1]=SaturatedSignedWordToUnsignedByte(MMX(d).s[1]); |
| 2270 | | MMX(d).b[2]=SaturatedSignedWordToUnsignedByte(MMX(d).s[2]); |
| 2271 | | MMX(d).b[3]=SaturatedSignedWordToUnsignedByte(MMX(d).s[3]); |
| 2271 | t.q = MMX(d).q; |
| 2272 | MMX(d).b[0]=SaturatedSignedWordToUnsignedByte(t.s[0]); |
| 2273 | MMX(d).b[1]=SaturatedSignedWordToUnsignedByte(t.s[1]); |
| 2274 | MMX(d).b[2]=SaturatedSignedWordToUnsignedByte(t.s[2]); |
| 2275 | MMX(d).b[3]=SaturatedSignedWordToUnsignedByte(t.s[3]); |
| 2272 | 2276 | MMX(d).b[4]=SaturatedSignedWordToUnsignedByte(s.s[0]); |
| 2273 | 2277 | MMX(d).b[5]=SaturatedSignedWordToUnsignedByte(s.s[1]); |
| 2274 | 2278 | MMX(d).b[6]=SaturatedSignedWordToUnsignedByte(s.s[2]); |
| r243112 | r243113 | |
| 2362 | 2366 | UINT8 modrm = FETCH(); |
| 2363 | 2367 | if( modrm >= 0xc0 ) { |
| 2364 | 2368 | int s,d; |
| 2369 | INT32 t1, t2, t3, t4; |
| 2365 | 2370 | s=modrm & 0x7; |
| 2366 | 2371 | d=(modrm >> 3) & 0x7; |
| 2367 | | MMX(d).s[0]=SaturatedSignedDwordToSignedWord(MMX(d).i[0]); |
| 2368 | | MMX(d).s[1]=SaturatedSignedDwordToSignedWord(MMX(d).i[1]); |
| 2369 | | MMX(d).s[2]=SaturatedSignedDwordToSignedWord(MMX(s).i[0]); |
| 2370 | | MMX(d).s[3]=SaturatedSignedDwordToSignedWord(MMX(s).i[1]); |
| 2371 | | } else { |
| 2372 | t1 = MMX(d).i[0]; |
| 2373 | t2 = MMX(d).i[1]; |
| 2374 | t3 = MMX(s).i[0]; |
| 2375 | t4 = MMX(s).i[1]; |
| 2376 | MMX(d).s[0] = SaturatedSignedDwordToSignedWord(t1); |
| 2377 | MMX(d).s[1] = SaturatedSignedDwordToSignedWord(t2); |
| 2378 | MMX(d).s[2] = SaturatedSignedDwordToSignedWord(t3); |
| 2379 | MMX(d).s[3] = SaturatedSignedDwordToSignedWord(t4); |
| 2380 | } |
| 2381 | else { |
| 2372 | 2382 | MMX_REG s; |
| 2383 | INT32 t1, t2; |
| 2373 | 2384 | int d=(modrm >> 3) & 0x7; |
| 2374 | 2385 | UINT32 ea = GetEA(modrm, 0); |
| 2375 | 2386 | READMMX(ea, s); |
| 2376 | | MMX(d).s[0]=SaturatedSignedDwordToSignedWord(MMX(d).i[0]); |
| 2377 | | MMX(d).s[1]=SaturatedSignedDwordToSignedWord(MMX(d).i[1]); |
| 2378 | | MMX(d).s[2]=SaturatedSignedDwordToSignedWord(s.i[0]); |
| 2379 | | MMX(d).s[3]=SaturatedSignedDwordToSignedWord(s.i[1]); |
| 2387 | t1 = MMX(d).i[0]; |
| 2388 | t2 = MMX(d).i[1]; |
| 2389 | MMX(d).s[0] = SaturatedSignedDwordToSignedWord(t1); |
| 2390 | MMX(d).s[1] = SaturatedSignedDwordToSignedWord(t2); |
| 2391 | MMX(d).s[2] = SaturatedSignedDwordToSignedWord(s.i[0]); |
| 2392 | MMX(d).s[3] = SaturatedSignedDwordToSignedWord(s.i[1]); |
| 2380 | 2393 | } |
| 2381 | 2394 | CYCLES(1); // TODO: correct cycle count |
| 2382 | 2395 | } |
| r243112 | r243113 | |
| 2711 | 2724 | { |
| 2712 | 2725 | UINT8 modrm = FETCH(); |
| 2713 | 2726 | if( modrm >= 0xc0 ) { |
| 2714 | | // unsupported by cpu |
| 2727 | // MOVHLPS opcode |
| 2728 | XMM((modrm >> 3) & 0x7).q[0] = XMM(modrm & 0x7).q[1]; |
| 2715 | 2729 | CYCLES(1); // TODO: correct cycle count |
| 2716 | 2730 | } else { |
| 2731 | // MOVLPS opcode |
| 2717 | 2732 | UINT32 ea = GetEA(modrm, 0); |
| 2718 | 2733 | READXMM_LO64(ea, XMM((modrm >> 3) & 0x7)); |
| 2719 | 2734 | CYCLES(1); // TODO: correct cycle count |
| r243112 | r243113 | |
| 2737 | 2752 | { |
| 2738 | 2753 | UINT8 modrm = FETCH(); |
| 2739 | 2754 | if( modrm >= 0xc0 ) { |
| 2740 | | // unsupported by cpu |
| 2755 | // MOVLHPS opcode |
| 2756 | XMM((modrm >> 3) & 0x7).q[1] = XMM(modrm & 0x7).q[0]; |
| 2741 | 2757 | CYCLES(1); // TODO: correct cycle count |
| 2742 | 2758 | } else { |
| 2759 | // MOVHPS opcode |
| 2743 | 2760 | UINT32 ea = GetEA(modrm, 0); |
| 2744 | 2761 | READXMM_HI64(ea, XMM((modrm >> 3) & 0x7)); |
| 2745 | 2762 | CYCLES(1); // TODO: correct cycle count |
| r243112 | r243113 | |
| 3367 | 3384 | CYCLES(1); // TODO: correct cycle count |
| 3368 | 3385 | } |
| 3369 | 3386 | |
| 3370 | | void i386_device::sse_shufps() // Opcode 0f 67 |
| 3387 | void i386_device::sse_shufps() // Opcode 0f c6 |
| 3371 | 3388 | { |
| 3372 | 3389 | UINT8 modrm = FETCH(); |
| 3373 | 3390 | UINT8 sel = FETCH(); |
| r243112 | r243113 | |
| 3380 | 3397 | s=modrm & 0x7; |
| 3381 | 3398 | d=(modrm >> 3) & 0x7; |
| 3382 | 3399 | if( modrm >= 0xc0 ) { |
| 3383 | | UINT32 t; |
| 3384 | | t=XMM(d).d[m1]; |
| 3385 | | XMM(d).d[1]=XMM(d).d[m2]; |
| 3386 | | XMM(d).d[0]=t; |
| 3387 | | XMM(d).d[2]=XMM(s).d[m3]; |
| 3388 | | XMM(d).d[3]=XMM(s).d[m4]; |
| 3400 | UINT32 t1,t2,t3,t4; |
| 3401 | t1=XMM(d).d[m1]; |
| 3402 | t2=XMM(d).d[m2]; |
| 3403 | t3=XMM(s).d[m3]; |
| 3404 | t4=XMM(s).d[m4]; |
| 3405 | XMM(d).d[0]=t1; |
| 3406 | XMM(d).d[1]=t2; |
| 3407 | XMM(d).d[2]=t3; |
| 3408 | XMM(d).d[3]=t4; |
| 3389 | 3409 | } else { |
| 3390 | | UINT32 t; |
| 3410 | UINT32 t1,t2; |
| 3391 | 3411 | XMM_REG src; |
| 3392 | 3412 | UINT32 ea = GetEA(modrm, 0); |
| 3393 | 3413 | READXMM(ea, src); |
| 3394 | | t=XMM(d).d[m1]; |
| 3395 | | XMM(d).d[1]=XMM(d).d[m2]; |
| 3396 | | XMM(d).d[0]=t; |
| 3414 | t1=XMM(d).d[m1]; |
| 3415 | t2=XMM(d).d[m2]; |
| 3416 | XMM(d).d[0]=t1; |
| 3417 | XMM(d).d[1]=t2; |
| 3397 | 3418 | XMM(d).d[2]=src.d[m3]; |
| 3398 | 3419 | XMM(d).d[3]=src.d[m4]; |
| 3399 | 3420 | } |
| r243112 | r243113 | |
| 3404 | 3425 | { |
| 3405 | 3426 | UINT8 modrm = FETCH(); |
| 3406 | 3427 | int s,d; |
| 3428 | UINT32 t1, t2, t3, t4; |
| 3407 | 3429 | s=modrm & 0x7; |
| 3408 | 3430 | d=(modrm >> 3) & 0x7; |
| 3409 | 3431 | if( modrm >= 0xc0 ) { |
| 3410 | | XMM(d).d[3]=XMM(s).d[1]; |
| 3411 | | XMM(d).d[2]=XMM(d).d[1]; |
| 3412 | | XMM(d).d[1]=XMM(s).d[0]; |
| 3413 | | //XMM(d).d[0]=XMM(d).d[0]; |
| 3432 | t1 = XMM(s).d[1]; |
| 3433 | t2 = XMM(d).d[1]; |
| 3434 | t3 = XMM(s).d[0]; |
| 3435 | t4 = XMM(d).d[0]; |
| 3436 | XMM(d).d[3]=t1; |
| 3437 | XMM(d).d[2]=t2; |
| 3438 | XMM(d).d[1]=t3; |
| 3439 | XMM(d).d[0]=t4; |
| 3414 | 3440 | } else { |
| 3415 | 3441 | XMM_REG src; |
| 3416 | 3442 | UINT32 ea = GetEA(modrm, 0); |
| 3417 | 3443 | READXMM(ea, src); |
| 3444 | t2 = XMM(d).d[1]; |
| 3418 | 3445 | XMM(d).d[3]=src.d[1]; |
| 3419 | | XMM(d).d[2]=XMM(d).d[1]; |
| 3446 | XMM(d).d[2]=t2; |
| 3420 | 3447 | XMM(d).d[1]=src.d[0]; |
| 3421 | 3448 | } |
| 3422 | 3449 | CYCLES(1); // TODO: correct cycle count |
| r243112 | r243113 | |
| 3426 | 3453 | { |
| 3427 | 3454 | UINT8 modrm = FETCH(); |
| 3428 | 3455 | int s,d; |
| 3456 | UINT32 t1, t2, t3, t4; |
| 3429 | 3457 | s=modrm & 0x7; |
| 3430 | 3458 | d=(modrm >> 3) & 0x7; |
| 3431 | 3459 | if( modrm >= 0xc0 ) { |
| 3432 | | XMM(d).d[0]=XMM(d).d[2]; |
| 3433 | | XMM(d).d[1]=XMM(s).d[2]; |
| 3434 | | XMM(d).d[2]=XMM(d).d[3]; |
| 3435 | | XMM(d).d[3]=XMM(s).d[3]; |
| 3460 | t1 = XMM(d).d[2]; |
| 3461 | t2 = XMM(s).d[2]; |
| 3462 | t3 = XMM(d).d[3]; |
| 3463 | t4 = XMM(s).d[3]; |
| 3464 | XMM(d).d[0]=t1; |
| 3465 | XMM(d).d[1]=t2; |
| 3466 | XMM(d).d[2]=t3; |
| 3467 | XMM(d).d[3]=t4; |
| 3436 | 3468 | } else { |
| 3437 | 3469 | XMM_REG src; |
| 3438 | 3470 | UINT32 ea = GetEA(modrm, 0); |
| 3439 | 3471 | READXMM(ea, src); |
| 3440 | | XMM(d).d[0]=XMM(d).d[2]; |
| 3472 | t1 = XMM(d).d[2]; |
| 3473 | t3 = XMM(d).d[3]; |
| 3474 | XMM(d).d[0]=t1; |
| 3441 | 3475 | XMM(d).d[1]=src.d[2]; |
| 3442 | | XMM(d).d[2]=XMM(d).d[3]; |
| 3476 | XMM(d).d[2]=t3; |
| 3443 | 3477 | XMM(d).d[3]=src.d[3]; |
| 3444 | 3478 | } |
| 3445 | 3479 | CYCLES(1); // TODO: correct cycle count |