trunk/src/emu/cpu/i386/i386.c
| r241956 | r241957 | |
| 3338 | 3338 | state_add( X87_ST7, "ST7", m_debugger_temp ).formatstr("%15s"); |
| 3339 | 3339 | } |
| 3340 | 3340 | |
| 3341 | void i386_device::register_state_i386_x87_xmm() |
| 3342 | { |
| 3343 | register_state_i386_x87(); |
| 3344 | |
| 3345 | state_add( SSE_XMM0, "XMM0", m_debugger_temp ).formatstr("%32s"); |
| 3346 | state_add( SSE_XMM1, "XMM1", m_debugger_temp ).formatstr("%32s"); |
| 3347 | state_add( SSE_XMM2, "XMM2", m_debugger_temp ).formatstr("%32s"); |
| 3348 | state_add( SSE_XMM3, "XMM3", m_debugger_temp ).formatstr("%32s"); |
| 3349 | state_add( SSE_XMM4, "XMM4", m_debugger_temp ).formatstr("%32s"); |
| 3350 | state_add( SSE_XMM5, "XMM5", m_debugger_temp ).formatstr("%32s"); |
| 3351 | state_add( SSE_XMM6, "XMM6", m_debugger_temp ).formatstr("%32s"); |
| 3352 | state_add( SSE_XMM7, "XMM7", m_debugger_temp ).formatstr("%32s"); |
| 3353 | |
| 3354 | } |
| 3355 | |
| 3341 | 3356 | void i386_device::state_import(const device_state_entry &entry) |
| 3342 | 3357 | { |
| 3343 | 3358 | switch (entry.index()) |
| r241956 | r241957 | |
| 3411 | 3426 | case X87_ST7: |
| 3412 | 3427 | string.printf("%f", fx80_to_double(ST(7))); |
| 3413 | 3428 | break; |
| 3429 | case SSE_XMM0: |
| 3430 | string.printf("%08x%08x%08x%08x", XMM(0).d[3], XMM(0).d[2], XMM(0).d[1], XMM(0).d[0]); |
| 3431 | break; |
| 3432 | case SSE_XMM1: |
| 3433 | string.printf("%08x%08x%08x%08x", XMM(1).d[3], XMM(1).d[2], XMM(1).d[1], XMM(1).d[0]); |
| 3434 | break; |
| 3435 | case SSE_XMM2: |
| 3436 | string.printf("%08x%08x%08x%08x", XMM(2).d[3], XMM(2).d[2], XMM(2).d[1], XMM(2).d[0]); |
| 3437 | break; |
| 3438 | case SSE_XMM3: |
| 3439 | string.printf("%08x%08x%08x%08x", XMM(3).d[3], XMM(3).d[2], XMM(3).d[1], XMM(3).d[0]); |
| 3440 | break; |
| 3441 | case SSE_XMM4: |
| 3442 | string.printf("%08x%08x%08x%08x", XMM(4).d[3], XMM(4).d[2], XMM(4).d[1], XMM(4).d[0]); |
| 3443 | break; |
| 3444 | case SSE_XMM5: |
| 3445 | string.printf("%08x%08x%08x%08x", XMM(5).d[3], XMM(5).d[2], XMM(5).d[1], XMM(5).d[0]); |
| 3446 | break; |
| 3447 | case SSE_XMM6: |
| 3448 | string.printf("%08x%08x%08x%08x", XMM(6).d[3], XMM(6).d[2], XMM(6).d[1], XMM(6).d[0]); |
| 3449 | break; |
| 3450 | case SSE_XMM7: |
| 3451 | string.printf("%08x%08x%08x%08x", XMM(7).d[3], XMM(7).d[2], XMM(7).d[1], XMM(7).d[0]); |
| 3452 | break; |
| 3414 | 3453 | } |
| 3415 | 3454 | } |
| 3416 | 3455 | |
| r241956 | r241957 | |
| 4245 | 4284 | { |
| 4246 | 4285 | // 64 dtlb small, 8 dtlb large, 32 itlb small, 2 itlb large |
| 4247 | 4286 | i386_common_init(96); |
| 4248 | | register_state_i386_x87(); |
| 4287 | register_state_i386_x87_xmm(); |
| 4249 | 4288 | |
| 4250 | 4289 | build_x87_opcode_table(); |
| 4251 | 4290 | build_opcode_table(OP_I386 | OP_FPU | OP_I486 | OP_PENTIUM | OP_PPRO | OP_MMX | OP_SSE); |
| r241956 | r241957 | |
| 4314 | 4353 | { |
| 4315 | 4354 | // 128 dtlb, 64 itlb |
| 4316 | 4355 | i386_common_init(196); |
| 4317 | | register_state_i386_x87(); |
| 4356 | register_state_i386_x87_xmm(); |
| 4318 | 4357 | |
| 4319 | 4358 | build_x87_opcode_table(); |
| 4320 | 4359 | build_opcode_table(OP_I386 | OP_FPU | OP_I486 | OP_PENTIUM | OP_PPRO | OP_MMX | OP_SSE | OP_SSE2); |
trunk/src/emu/cpu/i386/i386dasm.c
| r241956 | r241957 | |
| 741 | 741 | "cmpss", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, |
| 742 | 742 | {"movnti", MODRM, PARAM_RM, PARAM_REG, 0 }, |
| 743 | 743 | {"pinsrw", MODRM, PARAM_MMX, PARAM_RM, PARAM_UI8 }, |
| 744 | | {"pextrw", MODRM, PARAM_MMX, PARAM_MMXM, PARAM_UI8 }, |
| 744 | {"pextrw", MODRM, PARAM_MMX, PARAM_RM, PARAM_UI8 }, |
| 745 | 745 | {"shufps\0" |
| 746 | 746 | "shufpd\0" |
| 747 | 747 | "???\0" |
trunk/src/emu/cpu/i386/pentops.inc
| r241956 | r241957 | |
| 1292 | 1292 | else if(imm8) |
| 1293 | 1293 | { |
| 1294 | 1294 | imm8 = imm8 << 3; |
| 1295 | | XMM(modm & 7).q[1] = (XMM(modm & 7).q[0] << (64 - imm8)) | (XMM(modm & 7).q[1] >> imm8); |
| 1296 | | XMM(modm & 7).q[0] = XMM(modm & 7).q[0] >> imm8; |
| 1295 | XMM(modm & 7).q[0] = (XMM(modm & 7).q[1] << (64 - imm8)) | (XMM(modm & 7).q[0] >> imm8); |
| 1296 | XMM(modm & 7).q[1] = XMM(modm & 7).q[0] >> imm8; |
| 1297 | 1297 | } |
| 1298 | 1298 | break; |
| 1299 | 1299 | case 6: // psllq |
| r241956 | r241957 | |
| 1320 | 1320 | else if(imm8) |
| 1321 | 1321 | { |
| 1322 | 1322 | imm8 = imm8 << 3; |
| 1323 | | XMM(modm & 7).q[0] = (XMM(modm & 7).q[1] << (64 - imm8)) | (XMM(modm & 7).q[0] >> imm8); |
| 1324 | | XMM(modm & 7).q[1] = XMM(modm & 7).q[1] << imm8; |
| 1323 | XMM(modm & 7).q[1] = (XMM(modm & 7).q[0] >> (64 - imm8)) | (XMM(modm & 7).q[1] << imm8); |
| 1324 | XMM(modm & 7).q[0] = XMM(modm & 7).q[0] << imm8; |
| 1325 | 1325 | } |
| 1326 | 1326 | break; |
| 1327 | 1327 | default: |
| r241956 | r241957 | |
| 3570 | 3570 | if( modrm >= 0xc0 ) { |
| 3571 | 3571 | UINT8 imm8 = FETCH(); |
| 3572 | 3572 | UINT16 v = LOAD_RM16(modrm); |
| 3573 | | MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v; |
| 3573 | if (m_xmm_operand_size) |
| 3574 | XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v; |
| 3575 | else |
| 3576 | MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v; |
| 3574 | 3577 | } else { |
| 3575 | 3578 | UINT32 ea = GetEA(modrm, 0); |
| 3576 | 3579 | UINT8 imm8 = FETCH(); |
| 3577 | 3580 | UINT16 v = READ16(ea); |
| 3578 | | MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v; |
| 3581 | if (m_xmm_operand_size) |
| 3582 | XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v; |
| 3583 | else |
| 3584 | MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v; |
| 3579 | 3585 | } |
| 3580 | 3586 | CYCLES(1); // TODO: correct cycle count |
| 3581 | 3587 | } |
| r241956 | r241957 | |
| 3587 | 3593 | if( modrm >= 0xc0 ) { |
| 3588 | 3594 | UINT8 imm8 = FETCH(); |
| 3589 | 3595 | UINT16 v = (UINT16)LOAD_RM32(modrm); |
| 3590 | | MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v; |
| 3596 | if (m_xmm_operand_size) |
| 3597 | XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v; |
| 3598 | else |
| 3599 | MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v; |
| 3591 | 3600 | } else { |
| 3592 | 3601 | UINT32 ea = GetEA(modrm, 0); |
| 3593 | 3602 | UINT8 imm8 = FETCH(); |
| 3594 | 3603 | UINT16 v = READ16(ea); |
| 3595 | | MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v; |
| 3604 | if (m_xmm_operand_size) |
| 3605 | XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v; |
| 3606 | else |
| 3607 | MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v; |
| 3596 | 3608 | } |
| 3597 | 3609 | CYCLES(1); // TODO: correct cycle count |
| 3598 | 3610 | } |
| r241956 | r241957 | |
| 3603 | 3615 | UINT8 modrm = FETCH(); |
| 3604 | 3616 | if( modrm >= 0xc0 ) { |
| 3605 | 3617 | UINT8 imm8 = FETCH(); |
| 3606 | | STORE_REG16(modrm, MMX(modrm & 0x7).w[imm8 & 3]); |
| 3618 | if (m_xmm_operand_size) |
| 3619 | STORE_REG16(modrm, XMM(modrm & 0x7).w[imm8 & 7]); |
| 3620 | else |
| 3621 | STORE_REG16(modrm, MMX(modrm & 0x7).w[imm8 & 3]); |
| 3607 | 3622 | } else { |
| 3608 | 3623 | //UINT8 imm8 = FETCH(); |
| 3609 | 3624 | report_invalid_modrm("pextrw_r16_r64_i8", modrm); |
| r241956 | r241957 | |
| 3617 | 3632 | UINT8 modrm = FETCH(); |
| 3618 | 3633 | if( modrm >= 0xc0 ) { |
| 3619 | 3634 | UINT8 imm8 = FETCH(); |
| 3620 | | STORE_REG32(modrm, MMX(modrm & 0x7).w[imm8 & 3]); |
| 3635 | if (m_xmm_operand_size) |
| 3636 | STORE_REG32(modrm, XMM(modrm & 0x7).w[imm8 & 7]); |
| 3637 | else |
| 3638 | STORE_REG32(modrm, MMX(modrm & 0x7).w[imm8 & 3]); |
| 3621 | 3639 | } else { |
| 3622 | 3640 | //UINT8 imm8 = FETCH(); |
| 3623 | 3641 | report_invalid_modrm("pextrw_r32_r64_i8", modrm); |