Previous 199869 Revisions Next

r33308 Sunday 9th November, 2014 at 19:35:42 UTC by Olivier Galibert
pentium: Some stuff to make lindbergh go further [O. Galibert]
[src/emu/cpu/i386]i386.c i386.h i386ops.inc i386priv.h pentops.inc

trunk/src/emu/cpu/i386/i386.c
r241819r241820
31483148
31493149   zero_state();
31503150
3151   save_item(NAME( m_reg.d));
3151   save_item(NAME(m_reg.d));
31523152   save_item(NAME(m_sreg[ES].selector));
31533153   save_item(NAME(m_sreg[ES].base));
31543154   save_item(NAME(m_sreg[ES].limit));
r241819r241820
31903190   save_item(NAME(m_AF));
31913191   save_item(NAME(m_IF));
31923192   save_item(NAME(m_TF));
3193   save_item(NAME( m_cr));
3194   save_item(NAME( m_dr));
3195   save_item(NAME( m_tr));
3193   save_item(NAME(m_cr));
3194   save_item(NAME(m_dr));
3195   save_item(NAME(m_tr));
31963196   save_item(NAME(m_idtr.base));
31973197   save_item(NAME(m_idtr.limit));
31983198   save_item(NAME(m_gdtr.base));
r241819r241820
35123512   m_ext = 0;
35133513   m_halted = 0;
35143514   m_operand_size = 0;
3515   m_xmm_operand_size = 0;
35153516   m_address_size = 0;
35163517   m_operand_prefix = 0;
35173518   m_address_prefix = 0;
r241819r241820
37653766   {
37663767      i386_check_irq_line();
37673768      m_operand_size = m_sreg[CS].d;
3769      m_xmm_operand_size = 0;
37683770      m_address_size = m_sreg[CS].d;
37693771      m_operand_prefix = 0;
37703772      m_address_prefix = 0;
trunk/src/emu/cpu/i386/i386.h
r241819r241820
187187   int m_halted;
188188
189189   int m_operand_size;
190   int m_xmm_operand_size;
190191   int m_address_size;
191192   int m_operand_prefix;
192193   int m_address_prefix;
r241819r241820
331332   void pentium_msr_write(UINT32 offset, UINT64 data, UINT8 *valid_msr);
332333   UINT64 p6_msr_read(UINT32 offset,UINT8 *valid_msr);
333334   void p6_msr_write(UINT32 offset, UINT64 data, UINT8 *valid_msr);
335   UINT64 piv_msr_read(UINT32 offset,UINT8 *valid_msr);
336   void piv_msr_write(UINT32 offset, UINT64 data, UINT8 *valid_msr);
334337   inline UINT64 MSR_READ(UINT32 offset,UINT8 *valid_msr);
335338   inline void MSR_WRITE(UINT32 offset, UINT64 data, UINT8 *valid_msr);
336339   UINT32 i386_load_protected_mode_segment(I386_SREG *seg, UINT64 *desc );
trunk/src/emu/cpu/i386/i386ops.inc
r241819r241820
11341134      break;
11351135      case 0x66:
11361136      m_operand_size ^= 1;
1137      m_xmm_operand_size ^= 1;
11371138      break;
11381139      case 0x67:
11391140      m_address_size ^= 1;
r241819r241820
22862287   if(m_operand_prefix == 0)
22872288   {
22882289      m_operand_size ^= 1;
2290      m_xmm_operand_size ^= 1;
22892291      m_operand_prefix = 1;
22902292   }
22912293   m_opcode = FETCH();
trunk/src/emu/cpu/i386/i386priv.h
r241819r241820
13281328   }
13291329}
13301330
1331
1332// PIV (Pentium 4+)
1333UINT64 i386_device::piv_msr_read(UINT32 offset,UINT8 *valid_msr)
1334{
1335   switch(offset)
1336   {
1337   default:
1338      logerror("RDMSR: unimplemented register called %08x at %08x\n",offset,m_pc-2);
1339      *valid_msr = 1;
1340      return 0;
1341   }
1342   return -1;
1343}
1344
1345void i386_device::piv_msr_write(UINT32 offset, UINT64 data, UINT8 *valid_msr)
1346{
1347   switch(offset)
1348   {
1349   default:
1350      logerror("WRMSR: unimplemented register called %08x (%08x%08x) at %08x\n",offset,(UINT32)(data >> 32),(UINT32)data,m_pc-2);
1351      *valid_msr = 1;
1352      break;
1353   }
1354}
1355
13311356UINT64 i386_device::MSR_READ(UINT32 offset,UINT8 *valid_msr)
13321357{
13331358   UINT64 res;
r241819r241820
13431368   case 6:  // Pentium Pro, Pentium II, Pentium III
13441369      res = p6_msr_read(offset,valid_msr);
13451370      break;
1371   case 15:  // Pentium 4+
1372      res = piv_msr_read(offset,valid_msr);
1373      break;
13461374   default:
13471375      res = 0;
13481376      break;
r241819r241820
13641392   case 6:  // Pentium Pro, Pentium II, Pentium III
13651393      p6_msr_write(offset,data,valid_msr);
13661394      break;
1395   case 15:  // Pentium 4+
1396      piv_msr_write(offset,data,valid_msr);
1397      break;
13671398   }
13681399}
13691400
trunk/src/emu/cpu/i386/pentops.inc
r241819r241820
12691269      switch ( (modm & 0x38) >> 3 )
12701270      {
12711271         case 2: // psrlq
1272            MMX(modm & 7).q=MMX(modm & 7).q >> imm8;
1272            if (m_xmm_operand_size)
1273            {
1274               XMM(modm & 7).q[0] = imm8 > 63 ? 0 : XMM(modm & 7).q[0] >> imm8;
1275               XMM(modm & 7).q[1] = imm8 > 63 ? 0 : XMM(modm & 7).q[1] >> imm8;
1276            }
1277            else
1278               MMX(modm & 7).q = imm8 > 63 ? 0 : MMX(modm & 7).q >> imm8;
12731279            break;
1280         case 3: // psrldq
1281            if (imm8 >= 16)
1282            {
1283               XMM(modm & 7).q[0] = 0;
1284               XMM(modm & 7).q[1] = 0;
1285            }
1286            else if(imm8 >= 8)
1287            {
1288               imm8 = (imm8 & 7) << 3;
1289               XMM(modm & 7).q[0] = XMM(modm & 7).q[1] >> imm8;
1290               XMM(modm & 7).q[1] = 0;
1291            }
1292            else if(imm8)
1293            {
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;
1297            }
1298            break;
12741299         case 6: // psllq
1275            MMX(modm & 7).q=MMX(modm & 7).q << imm8;
1300            if (m_xmm_operand_size)
1301            {
1302               XMM(modm & 7).q[0] = imm8 > 63 ? 0 : XMM(modm & 7).q[0] << imm8;
1303               XMM(modm & 7).q[1] = imm8 > 63 ? 0 : XMM(modm & 7).q[1] << imm8;
1304            }
1305            else
1306               MMX(modm & 7).q = imm8 > 63 ? 0 : MMX(modm & 7).q << imm8;
12761307            break;
1308         case 7: // pslldq
1309            if (imm8 >= 16)
1310            {
1311               XMM(modm & 7).q[0] = 0;
1312               XMM(modm & 7).q[1] = 0;
1313            }
1314            else if(imm8 >= 8)
1315            {
1316               imm8 = (imm8 & 7) << 3;
1317               XMM(modm & 7).q[1] = XMM(modm & 7).q[0] << imm8;
1318               XMM(modm & 7).q[0] = 0;
1319            }
1320            else if(imm8)
1321            {
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;
1325            }
1326            break;
12771327         default:
12781328            report_invalid_modrm("mmx_group0f73", modm);
12791329      }


Previous 199869 Revisions Next


© 1997-2024 The MAME Team