Previous 199869 Revisions Next

r33445 Wednesday 19th November, 2014 at 19:01:03 UTC by Olivier Galibert
pentium: This is the kind of problems you find when a bios uses xmm4 as call stack [O. Galibert]
[src/emu/cpu/i386]i386.c i386.h i386dasm.c i386priv.h pentops.inc

trunk/src/emu/cpu/i386/i386.c
r241956r241957
33383338   state_add( X87_ST7,    "ST7", m_debugger_temp ).formatstr("%15s");
33393339}
33403340
3341void 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
33413356void i386_device::state_import(const device_state_entry &entry)
33423357{
33433358   switch (entry.index())
r241956r241957
34113426      case X87_ST7:
34123427         string.printf("%f", fx80_to_double(ST(7)));
34133428         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;
34143453   }
34153454}
34163455
r241956r241957
42454284{
42464285   // 64 dtlb small, 8 dtlb large, 32 itlb small, 2 itlb large
42474286   i386_common_init(96);
4248   register_state_i386_x87();
4287   register_state_i386_x87_xmm();
42494288
42504289   build_x87_opcode_table();
42514290   build_opcode_table(OP_I386 | OP_FPU | OP_I486 | OP_PENTIUM | OP_PPRO | OP_MMX | OP_SSE);
r241956r241957
43144353{
43154354   // 128 dtlb, 64 itlb
43164355   i386_common_init(196);
4317   register_state_i386_x87();
4356   register_state_i386_x87_xmm();
43184357
43194358   build_x87_opcode_table();
43204359   build_opcode_table(OP_I386 | OP_FPU | OP_I486 | OP_PENTIUM | OP_PPRO | OP_MMX | OP_SSE | OP_SSE2);
trunk/src/emu/cpu/i386/i386.h
r241956r241957
271271
272272   void register_state_i386();
273273   void register_state_i386_x87();
274   void register_state_i386_x87_xmm();
274275   inline UINT32 i386_translate(int segment, UINT32 ip, int rwn);
275276   inline vtlb_entry get_permissions(UINT32 pte, int wp);
276277   bool i386_translate_address(int intention, offs_t *address, vtlb_entry *entry);
trunk/src/emu/cpu/i386/i386dasm.c
r241956r241957
741741      "cmpss",            MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },
742742   {"movnti",          MODRM,          PARAM_RM,           PARAM_REG,          0               },
743743   {"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       },
745745   {"shufps\0"
746746      "shufpd\0"
747747      "???\0"
trunk/src/emu/cpu/i386/i386priv.h
r241956r241957
153153   X87_ST4,
154154   X87_ST5,
155155   X87_ST6,
156   X87_ST7
156   X87_ST7,
157
158   SSE_XMM0,
159   SSE_XMM1,
160   SSE_XMM2,
161   SSE_XMM3,
162   SSE_XMM4,
163   SSE_XMM5,
164   SSE_XMM6,
165   SSE_XMM7
157166};
158167
159168enum
trunk/src/emu/cpu/i386/pentops.inc
r241956r241957
12921292            else if(imm8)
12931293            {
12941294               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;
12971297            }
12981298            break;
12991299         case 6: // psllq
r241956r241957
13201320            else if(imm8)
13211321            {
13221322               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;
13251325            }
13261326            break;
13271327         default:
r241956r241957
35703570   if( modrm >= 0xc0 ) {
35713571      UINT8 imm8 = FETCH();
35723572      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;
35743577   } else {
35753578      UINT32 ea = GetEA(modrm, 0);
35763579      UINT8 imm8 = FETCH();
35773580      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;
35793585   }
35803586   CYCLES(1);     // TODO: correct cycle count
35813587}
r241956r241957
35873593   if( modrm >= 0xc0 ) {
35883594      UINT8 imm8 = FETCH();
35893595      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;
35913600   } else {
35923601      UINT32 ea = GetEA(modrm, 0);
35933602      UINT8 imm8 = FETCH();
35943603      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;
35963608   }
35973609   CYCLES(1);     // TODO: correct cycle count
35983610}
r241956r241957
36033615   UINT8 modrm = FETCH();
36043616   if( modrm >= 0xc0 ) {
36053617      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]);
36073622   } else {
36083623      //UINT8 imm8 = FETCH();
36093624      report_invalid_modrm("pextrw_r16_r64_i8", modrm);
r241956r241957
36173632   UINT8 modrm = FETCH();
36183633   if( modrm >= 0xc0 ) {
36193634      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]);
36213639   } else {
36223640      //UINT8 imm8 = FETCH();
36233641      report_invalid_modrm("pextrw_r32_r64_i8", modrm);


Previous 199869 Revisions Next


© 1997-2024 The MAME Team