summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author mooglyguy <therealmogminer@gmail.com>2017-11-01 20:03:37 +0100
committer mooglyguy <therealmogminer@gmail.com>2017-11-02 22:23:34 +0100
commit40b9220aec2663e6696994f220b3554e61aef15b (patch)
treedacc3c4cf0acdf05785f9901783637bce70eeb9e
parent91b7edb6c447cc8509e55f99e4f78dab20660bcc (diff)
-e132xs: Some minor optimization, elfin benches roughly 11% faster. [Ryan Holtz]
-rw-r--r--src/devices/cpu/e132xs/e132xs.cpp312
1 files changed, 287 insertions, 25 deletions
diff --git a/src/devices/cpu/e132xs/e132xs.cpp b/src/devices/cpu/e132xs/e132xs.cpp
index bfd8de0fc9a..246093ba309 100644
--- a/src/devices/cpu/e132xs/e132xs.cpp
+++ b/src/devices/cpu/e132xs/e132xs.cpp
@@ -612,7 +612,7 @@ void hyperstone_device::hyperstone_set_trap_entry(int which)
#define SET_T(val) (SR = (SR & ~0x00010000) | ((val) << 16))
#define SET_P(val) (SR = (SR & ~0x00020000) | ((val) << 17))
#define SET_S(val) (SR = (SR & ~0x00040000) | ((val) << 18))
-#define SET_ILC(val) (SR = (SR & ~0x00180000) | ((val) << 19))
+#define SET_ILC(val) (SR = (SR & 0xffe7ffff) | (val))
#define SET_FL(val) (SR = (SR & ~0x01e00000) | ((val) << 21))
#define SET_FP(val) (SR = (SR & ~0xfe000000) | ((val) << 25))
@@ -1055,19 +1055,19 @@ do
break; \
\
case 1: \
- m_instruction_length = 3; \
+ m_instruction_length = (3<<19); \
EXTRA_U = (READ_OP(PC) << 16) | READ_OP(PC + 2); \
PC += 4; \
break; \
\
case 2: \
- m_instruction_length = 2; \
+ m_instruction_length = (2<<19); \
EXTRA_U = READ_OP(PC); \
PC += 2; \
break; \
\
case 3: \
- m_instruction_length = 2; \
+ m_instruction_length = (2<<19); \
EXTRA_U = 0xffff0000 | READ_OP(PC); \
PC += 2; \
break; \
@@ -1077,17 +1077,17 @@ do
#define decode_const(decode) \
do \
{ \
- uint16_t imm_1 = READ_OP(PC); \
+ uint16_t imm_1 = READ_OP(PC); \
\
PC += 2; \
- m_instruction_length = 2; \
+ m_instruction_length = (2<<19); \
\
if( E_BIT(imm_1) ) \
{ \
- uint16_t imm_2 = READ_OP(PC); \
+ uint16_t imm_2 = READ_OP(PC); \
\
PC += 2; \
- m_instruction_length = 3; \
+ m_instruction_length = (3<<19); \
\
EXTRA_S = imm_2; \
EXTRA_S |= ((imm_1 & 0x3fff) << 16); \
@@ -1113,10 +1113,10 @@ do
{ \
if( OP & 0x80 ) \
{ \
- uint16_t next = READ_OP(PC); \
+ uint16_t next = READ_OP(PC); \
\
PC += 2; \
- m_instruction_length = 2; \
+ m_instruction_length = (2<<19); \
\
EXTRA_S = (OP & 0x7f) << 16; \
EXTRA_S |= (next & 0xfffe); \
@@ -1136,19 +1136,19 @@ do
#define decode_dis(decode) \
do \
{ \
- uint16_t next_1 = READ_OP(PC); \
+ uint16_t next_1 = READ_OP(PC); \
\
PC += 2; \
- m_instruction_length = 2; \
+ m_instruction_length = (2<<19); \
\
(decode)->sub_type = DD(next_1); \
\
if( E_BIT(next_1) ) \
{ \
- uint16_t next_2 = READ_OP(PC); \
+ uint16_t next_2 = READ_OP(PC); \
\
PC += 2; \
- m_instruction_length = 3; \
+ m_instruction_length = (3<<19); \
\
EXTRA_S = next_2; \
EXTRA_S |= ((next_1 & 0xfff) << 16); \
@@ -1172,9 +1172,9 @@ do
#define decode_lim(decode) \
do \
{ \
- uint32_t next = READ_OP(PC); \
+ uint32_t next = READ_OP(PC); \
PC += 2; \
- m_instruction_length = 2; \
+ m_instruction_length = (2<<19); \
\
(decode)->sub_type = X_CODE(next); \
\
@@ -1182,7 +1182,7 @@ do
{ \
EXTRA_U = ((next & 0xfff) << 16) | READ_OP(PC); \
PC += 2; \
- m_instruction_length = 3; \
+ m_instruction_length = (3<<19); \
} \
else \
{ \
@@ -1279,7 +1279,7 @@ do
#define LLextdecode(decode) \
do \
{ \
- m_instruction_length = 2; \
+ m_instruction_length = (2<<19); \
EXTRA_U = READ_OP(PC); \
PC += 2; \
check_delay_PC(); \
@@ -1344,7 +1344,7 @@ void hyperstone_device::execute_trap(uint32_t addr)
uint32_t oldSR;
reg = GET_FP + GET_FL;
- SET_ILC(m_instruction_length & 3);
+ SET_ILC(m_instruction_length);
oldSR = SR;
@@ -1372,7 +1372,7 @@ void hyperstone_device::execute_int(uint32_t addr)
uint32_t oldSR;
reg = GET_FP + GET_FL;
- SET_ILC(m_instruction_length & 3);
+ SET_ILC(m_instruction_length);
oldSR = SR;
@@ -1401,7 +1401,7 @@ void hyperstone_device::execute_exception(uint32_t addr)
uint32_t oldSR;
reg = GET_FP + GET_FL;
- SET_ILC(m_instruction_length & 3);
+ SET_ILC(m_instruction_length);
oldSR = SR;
@@ -1430,7 +1430,7 @@ void hyperstone_device::execute_software(struct hyperstone_device::regs_decode *
uint32_t addr;
uint32_t stack_of_dst;
- SET_ILC(1);
+ SET_ILC(1<<19);
addr = get_emu_code_addr((OP & 0xff00) >> 8);
reg = GET_FP + GET_FL;
@@ -4710,7 +4710,7 @@ void hyperstone_device::hyperstone_call(struct hyperstone_device::regs_decode *d
EXTRA_S = (EXTRA_S & ~1) + SREG;
- SET_ILC(m_instruction_length & 3);
+ SET_ILC(m_instruction_length);
SET_DREG((PC & 0xfffffffe) | GET_S);
SET_DREGF(SR);
@@ -4990,15 +4990,277 @@ void hyperstone_device::execute_run()
OP = READ_OP(PC);
PC += 2;
- m_instruction_length = 1;
+ m_instruction_length = (1<<19);
+#if 1
/* execute opcode */
+ switch ((OP >> 8) & 0x00ff)
+ {
+ case 0x00: op00(); break;
+ case 0x01: op01(); break;
+ case 0x02: op02(); break;
+ case 0x03: op03(); break;
+ case 0x04: op04(); break;
+ case 0x05: op05(); break;
+ case 0x06: op06(); break;
+ case 0x07: op07(); break;
+ case 0x08: op08(); break;
+ case 0x09: op09(); break;
+ case 0x0a: op0a(); break;
+ case 0x0b: op0b(); break;
+ case 0x0c: op0c(); break;
+ case 0x0d: op0d(); break;
+ case 0x0e: op0e(); break;
+ case 0x0f: op0f(); break;
+ case 0x10: op10(); break;
+ case 0x11: op11(); break;
+ case 0x12: op12(); break;
+ case 0x13: op13(); break;
+ case 0x14: op14(); break;
+ case 0x15: op15(); break;
+ case 0x16: op16(); break;
+ case 0x17: op17(); break;
+ case 0x18: op18(); break;
+ case 0x19: op19(); break;
+ case 0x1a: op1a(); break;
+ case 0x1b: op1b(); break;
+ case 0x1c: op1c(); break;
+ case 0x1d: op1d(); break;
+ case 0x1e: op1e(); break;
+ case 0x1f: op1f(); break;
+ case 0x20: op20(); break;
+ case 0x21: op21(); break;
+ case 0x22: op22(); break;
+ case 0x23: op23(); break;
+ case 0x24: op24(); break;
+ case 0x25: op25(); break;
+ case 0x26: op26(); break;
+ case 0x27: op27(); break;
+ case 0x28: op28(); break;
+ case 0x29: op29(); break;
+ case 0x2a: op2a(); break;
+ case 0x2b: op2b(); break;
+ case 0x2c: op2c(); break;
+ case 0x2d: op2d(); break;
+ case 0x2e: op2e(); break;
+ case 0x2f: op2f(); break;
+ case 0x30: op30(); break;
+ case 0x31: op31(); break;
+ case 0x32: op32(); break;
+ case 0x33: op33(); break;
+ case 0x34: op34(); break;
+ case 0x35: op35(); break;
+ case 0x36: op36(); break;
+ case 0x37: op37(); break;
+ case 0x38: op38(); break;
+ case 0x39: op39(); break;
+ case 0x3a: op3a(); break;
+ case 0x3b: op3b(); break;
+ case 0x3c: op3c(); break;
+ case 0x3d: op3d(); break;
+ case 0x3e: op3e(); break;
+ case 0x3f: op3f(); break;
+ case 0x40: op40(); break;
+ case 0x41: op41(); break;
+ case 0x42: op42(); break;
+ case 0x43: op43(); break;
+ case 0x44: op44(); break;
+ case 0x45: op45(); break;
+ case 0x46: op46(); break;
+ case 0x47: op47(); break;
+ case 0x48: op48(); break;
+ case 0x49: op49(); break;
+ case 0x4a: op4a(); break;
+ case 0x4b: op4b(); break;
+ case 0x4c: op4c(); break;
+ case 0x4d: op4d(); break;
+ case 0x4e: op4e(); break;
+ case 0x4f: op4f(); break;
+ case 0x50: op50(); break;
+ case 0x51: op51(); break;
+ case 0x52: op52(); break;
+ case 0x53: op53(); break;
+ case 0x54: op54(); break;
+ case 0x55: op55(); break;
+ case 0x56: op56(); break;
+ case 0x57: op57(); break;
+ case 0x58: op58(); break;
+ case 0x59: op59(); break;
+ case 0x5a: op5a(); break;
+ case 0x5b: op5b(); break;
+ case 0x5c: op5c(); break;
+ case 0x5d: op5d(); break;
+ case 0x5e: op5e(); break;
+ case 0x5f: op5f(); break;
+ case 0x60: op60(); break;
+ case 0x61: op61(); break;
+ case 0x62: op62(); break;
+ case 0x63: op63(); break;
+ case 0x64: op64(); break;
+ case 0x65: op65(); break;
+ case 0x66: op66(); break;
+ case 0x67: op67(); break;
+ case 0x68: op68(); break;
+ case 0x69: op69(); break;
+ case 0x6a: op6a(); break;
+ case 0x6b: op6b(); break;
+ case 0x6c: op6c(); break;
+ case 0x6d: op6d(); break;
+ case 0x6e: op6e(); break;
+ case 0x6f: op6f(); break;
+ case 0x70: op70(); break;
+ case 0x71: op71(); break;
+ case 0x72: op72(); break;
+ case 0x73: op73(); break;
+ case 0x74: op74(); break;
+ case 0x75: op75(); break;
+ case 0x76: op76(); break;
+ case 0x77: op77(); break;
+ case 0x78: op78(); break;
+ case 0x79: op79(); break;
+ case 0x7a: op7a(); break;
+ case 0x7b: op7b(); break;
+ case 0x7c: op7c(); break;
+ case 0x7d: op7d(); break;
+ case 0x7e: op7e(); break;
+ case 0x7f: op7f(); break;
+ case 0x80: op80(); break;
+ case 0x81: op81(); break;
+ case 0x82: op82(); break;
+ case 0x83: op83(); break;
+ case 0x84: op84(); break;
+ case 0x85: op85(); break;
+ case 0x86: op86(); break;
+ case 0x87: op87(); break;
+ case 0x88: op88(); break;
+ case 0x89: op89(); break;
+ case 0x8a: op8a(); break;
+ case 0x8b: op8b(); break;
+ case 0x8c: op8c(); break;
+ case 0x8d: op8d(); break;
+ case 0x8e: op8e(); break;
+ case 0x8f: op8f(); break;
+ case 0x90: op90(); break;
+ case 0x91: op91(); break;
+ case 0x92: op92(); break;
+ case 0x93: op93(); break;
+ case 0x94: op94(); break;
+ case 0x95: op95(); break;
+ case 0x96: op96(); break;
+ case 0x97: op97(); break;
+ case 0x98: op98(); break;
+ case 0x99: op99(); break;
+ case 0x9a: op9a(); break;
+ case 0x9b: op9b(); break;
+ case 0x9c: op9c(); break;
+ case 0x9d: op9d(); break;
+ case 0x9e: op9e(); break;
+ case 0x9f: op9f(); break;
+ case 0xa0: opa0(); break;
+ case 0xa1: opa1(); break;
+ case 0xa2: opa2(); break;
+ case 0xa3: opa3(); break;
+ case 0xa4: opa4(); break;
+ case 0xa5: opa5(); break;
+ case 0xa6: opa6(); break;
+ case 0xa7: opa7(); break;
+ case 0xa8: opa8(); break;
+ case 0xa9: opa9(); break;
+ case 0xaa: opaa(); break;
+ case 0xab: opab(); break;
+ case 0xac: opac(); break;
+ case 0xad: opad(); break;
+ case 0xae: opae(); break;
+ case 0xaf: opaf(); break;
+ case 0xb0: opb0(); break;
+ case 0xb1: opb1(); break;
+ case 0xb2: opb2(); break;
+ case 0xb3: opb3(); break;
+ case 0xb4: opb4(); break;
+ case 0xb5: opb5(); break;
+ case 0xb6: opb6(); break;
+ case 0xb7: opb7(); break;
+ case 0xb8: opb8(); break;
+ case 0xb9: opb9(); break;
+ case 0xba: opba(); break;
+ case 0xbb: opbb(); break;
+ case 0xbc: opbc(); break;
+ case 0xbd: opbd(); break;
+ case 0xbe: opbe(); break;
+ case 0xbf: opbf(); break;
+ case 0xc0: opc0(); break;
+ case 0xc1: opc1(); break;
+ case 0xc2: opc2(); break;
+ case 0xc3: opc3(); break;
+ case 0xc4: opc4(); break;
+ case 0xc5: opc5(); break;
+ case 0xc6: opc6(); break;
+ case 0xc7: opc7(); break;
+ case 0xc8: opc8(); break;
+ case 0xc9: opc9(); break;
+ case 0xca: opca(); break;
+ case 0xcb: opcb(); break;
+ case 0xcc: opcc(); break;
+ case 0xcd: opcd(); break;
+ case 0xce: opce(); break;
+ case 0xcf: opcf(); break;
+ case 0xd0: opd0(); break;
+ case 0xd1: opd1(); break;
+ case 0xd2: opd2(); break;
+ case 0xd3: opd3(); break;
+ case 0xd4: opd4(); break;
+ case 0xd5: opd5(); break;
+ case 0xd6: opd6(); break;
+ case 0xd7: opd7(); break;
+ case 0xd8: opd8(); break;
+ case 0xd9: opd9(); break;
+ case 0xda: opda(); break;
+ case 0xdb: opdb(); break;
+ case 0xdc: opdc(); break;
+ case 0xdd: opdd(); break;
+ case 0xde: opde(); break;
+ case 0xdf: opdf(); break;
+ case 0xe0: ope0(); break;
+ case 0xe1: ope1(); break;
+ case 0xe2: ope2(); break;
+ case 0xe3: ope3(); break;
+ case 0xe4: ope4(); break;
+ case 0xe5: ope5(); break;
+ case 0xe6: ope6(); break;
+ case 0xe7: ope7(); break;
+ case 0xe8: ope8(); break;
+ case 0xe9: ope9(); break;
+ case 0xea: opea(); break;
+ case 0xeb: opeb(); break;
+ case 0xec: opec(); break;
+ case 0xed: oped(); break;
+ case 0xee: opee(); break;
+ case 0xef: opef(); break;
+ case 0xf0: opf0(); break;
+ case 0xf1: opf1(); break;
+ case 0xf2: opf2(); break;
+ case 0xf3: opf3(); break;
+ case 0xf4: opf4(); break;
+ case 0xf5: opf5(); break;
+ case 0xf6: opf6(); break;
+ case 0xf7: opf7(); break;
+ case 0xf8: opf8(); break;
+ case 0xf9: opf9(); break;
+ case 0xfa: opfa(); break;
+ case 0xfb: opfb(); break;
+ case 0xfc: opfc(); break;
+ case 0xfd: opfd(); break;
+ case 0xfe: opfe(); break;
+ case 0xff: opff(); break;
+ }
+#else
(this->*m_opcode[(OP & 0xff00) >> 8])();
+#endif
/* clear the H state if it was previously set */
SR ^= oldh;
- SET_ILC(m_instruction_length & 3);
+ SET_ILC(m_instruction_length);
if( GET_T && GET_P && m_delay.delay_cmd == NO_DELAY ) /* Not in a Delayed Branch instructions */
{