mirror of
https://github.com/holub/mame
synced 2025-04-26 18:23:08 +03:00
e132xs: Ironed out some 32-bit DRC issues, and address Coverity concerns, nw
This commit is contained in:
parent
14fcd2e34b
commit
a432afe28a
@ -637,6 +637,10 @@ void hyperstone_device::generate_divsu(drcuml_block *block, compiler_state *comp
|
||||
UML_LOAD(block, I0, (void *)m_core->local_regs, I4, SIZE_DWORD, SCALE_x4);
|
||||
}
|
||||
|
||||
#ifndef PTR64
|
||||
UML_DAND(block, I0, I0, 0x00000000ffffffffULL);
|
||||
#endif
|
||||
|
||||
if (DST_GLOBAL)
|
||||
{
|
||||
UML_LOAD(block, I1, (void *)m_core->global_regs, dst_code, SIZE_DWORD, SCALE_x4);
|
||||
@ -653,7 +657,7 @@ void hyperstone_device::generate_divsu(drcuml_block *block, compiler_state *comp
|
||||
}
|
||||
|
||||
#ifndef PTR64
|
||||
UML_DAND(block, I2, I2, 0x00000000ffffffff);
|
||||
UML_DAND(block, I2, I2, 0x00000000ffffffffULL);
|
||||
#endif
|
||||
|
||||
UML_DSHL(block, I1, I1, 32);
|
||||
@ -829,6 +833,8 @@ void hyperstone_device::generate_mask(drcuml_block *block, compiler_state *compi
|
||||
UML_LABEL(block, skip_mask);
|
||||
|
||||
if (DST_GLOBAL)
|
||||
{
|
||||
if (dst_code < 2)
|
||||
{
|
||||
UML_MOV(block, I4, dst_code);
|
||||
UML_MOV(block, I5, I1);
|
||||
@ -837,6 +843,11 @@ void hyperstone_device::generate_mask(drcuml_block *block, compiler_state *compi
|
||||
generate_branch(block, desc->targetpc);
|
||||
}
|
||||
else
|
||||
{
|
||||
UML_STORE(block, (void *)m_core->global_regs, dst_code, I1, SIZE_DWORD, SCALE_x4);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UML_ADD(block, I0, I3, dst_code);
|
||||
UML_AND(block, I0, I0, 0x3f);
|
||||
@ -898,6 +909,8 @@ void hyperstone_device::generate_sum(drcuml_block *block, compiler_state *compil
|
||||
UML_ROLINS(block, DRC_SR, I5, 3, N_MASK);
|
||||
|
||||
if (DST_GLOBAL)
|
||||
{
|
||||
if (dst_code < 2)
|
||||
{
|
||||
UML_MOV(block, I4, dst_code);
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
@ -905,10 +918,15 @@ void hyperstone_device::generate_sum(drcuml_block *block, compiler_state *compil
|
||||
generate_branch(block, desc->targetpc);
|
||||
}
|
||||
else
|
||||
{
|
||||
UML_STORE(block, (void *)m_core->global_regs, dst_code, I5, SIZE_DWORD, SCALE_x4);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UML_ADD(block, I0, I3, dst_code);
|
||||
UML_AND(block, I2, I0, 0x3f);
|
||||
UML_STORE(block, (void *)m_core->local_regs, I2, I5, SIZE_DWORD, SCALE_x4);
|
||||
UML_AND(block, I0, I0, 0x3f);
|
||||
UML_STORE(block, (void *)m_core->local_regs, I0, I5, SIZE_DWORD, SCALE_x4);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1294,6 +1312,8 @@ void hyperstone_device::generate_subc(drcuml_block *block, compiler_state *compi
|
||||
UML_ROLINS(block, DRC_SR, I5, 0, (V_MASK | Z_MASK | N_MASK));
|
||||
|
||||
if (DST_GLOBAL)
|
||||
{
|
||||
if (dst_code < 2)
|
||||
{
|
||||
UML_MOV(block, I4, dst_code);
|
||||
UML_MOV(block, I5, I1);
|
||||
@ -1303,6 +1323,11 @@ void hyperstone_device::generate_subc(drcuml_block *block, compiler_state *compi
|
||||
generate_branch(block, desc->targetpc);
|
||||
}
|
||||
else
|
||||
{
|
||||
UML_STORE(block, (void *)m_core->global_regs, dst_code, I1, SIZE_DWORD, SCALE_x4);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UML_STORE(block, (void *)m_core->local_regs, I4, I1, SIZE_DWORD, SCALE_x4);
|
||||
}
|
||||
@ -2116,13 +2141,6 @@ void hyperstone_device::generate_addi(drcuml_block *block, compiler_state *compi
|
||||
{
|
||||
generate_decode_immediate_s(block, compiler, desc); // I1 <-- imm32
|
||||
}
|
||||
else if (!(op & 0x10f))
|
||||
{
|
||||
UML_ROLAND(block, I3, DRC_SR, 32-Z_SHIFT, 1);
|
||||
UML_AND(block, I4, I0, 1);
|
||||
UML_OR(block, I3, I3, I4);
|
||||
UML_AND(block, I1, DRC_SR, I3);
|
||||
}
|
||||
else
|
||||
{
|
||||
UML_MOV(block, I1, src_code);
|
||||
@ -2142,6 +2160,15 @@ void hyperstone_device::generate_addi(drcuml_block *block, compiler_state *compi
|
||||
UML_LOAD(block, I0, (void *)m_core->local_regs, I2, SIZE_DWORD, SCALE_x4);
|
||||
}
|
||||
|
||||
if (!(op & 0x10f))
|
||||
{
|
||||
UML_ROLAND(block, I3, DRC_SR, 32-Z_SHIFT, 1);
|
||||
UML_XOR(block, I3, I3, 1);
|
||||
UML_AND(block, I4, I0, 1);
|
||||
UML_OR(block, I3, I3, I4);
|
||||
UML_AND(block, I1, DRC_SR, I3);
|
||||
}
|
||||
|
||||
#ifndef PTR64
|
||||
UML_DAND(block, I0, I0, 0x00000000ffffffffULL);
|
||||
UML_DAND(block, I1, I1, 0x00000000ffffffffULL);
|
||||
@ -2667,11 +2694,18 @@ void hyperstone_device::generate_shri(drcuml_block *block, compiler_state *compi
|
||||
UML_OR(block, DRC_SR, I1, I2);
|
||||
|
||||
if (DST_GLOBAL)
|
||||
{
|
||||
if (dst_code < 2)
|
||||
{
|
||||
UML_MOV(block, I4, dst_code);
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
}
|
||||
else
|
||||
{
|
||||
UML_STORE(block, (void *)m_core->global_regs, dst_code, I5, SIZE_DWORD, SCALE_x4);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UML_STORE(block, (void *)m_core->local_regs, I6, I5, SIZE_DWORD, SCALE_x4);
|
||||
}
|
||||
@ -3122,11 +3156,18 @@ void hyperstone_device::generate_shli(drcuml_block *block, compiler_state *compi
|
||||
UML_OR(block, DRC_SR, I1, I2);
|
||||
|
||||
if (DST_GLOBAL)
|
||||
{
|
||||
if (dst_code < 2)
|
||||
{
|
||||
UML_MOV(block, I4, dst_code);
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
}
|
||||
else
|
||||
{
|
||||
UML_STORE(block, (void *)m_core->global_regs, dst_code, I5, SIZE_DWORD, SCALE_x4);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UML_STORE(block, (void *)m_core->local_regs, I6, I5, SIZE_DWORD, SCALE_x4);
|
||||
}
|
||||
@ -3402,8 +3443,6 @@ void hyperstone_device::generate_ldxx1(drcuml_block *block, compiler_state *comp
|
||||
UML_MOV(block, I5, I1);
|
||||
UML_MOV(block, I4, srcf_code);
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
if (srcf_code == PC_REGISTER)
|
||||
generate_branch(block, desc->targetpc);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -3461,8 +3500,6 @@ void hyperstone_device::generate_ldxx1(drcuml_block *block, compiler_state *comp
|
||||
UML_MOV(block, I5, I1);
|
||||
UML_MOV(block, I4, srcf_code);
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
if (srcf_code == PC_REGISTER)
|
||||
generate_branch(block, desc->targetpc);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -4346,13 +4383,22 @@ void hyperstone_device::generate_ldwr(drcuml_block *block, compiler_state *compi
|
||||
UML_CALLH(block, *m_mem_read32);
|
||||
|
||||
if (SRC_GLOBAL)
|
||||
{
|
||||
if (src_code < 2)
|
||||
{
|
||||
UML_MOV(block, I4, src_code);
|
||||
UML_MOV(block, I5, I1);
|
||||
generate_set_global_register(block, compiler, desc);
|
||||
if (src_code == PC_REGISTER)
|
||||
{
|
||||
generate_branch(block, desc->targetpc);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UML_STORE(block, (void *)m_core->global_regs, src_code, I1, SIZE_DWORD, SCALE_x4);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UML_ADD(block, I2, I3, src_code);
|
||||
|
@ -873,7 +873,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
|
||||
desc.regin[0] |= 1 << gdst_code;
|
||||
desc.regout[0] |= 1 << gsrc_code;
|
||||
if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code;
|
||||
if ((imm1 & 0x3000) == 0x3000 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code;
|
||||
|
||||
desc.length = (imm1 & 0x8000) ? 6 : 4;
|
||||
desc.flags |= OPFLAG_READS_MEMORY;
|
||||
@ -892,7 +892,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[0] |= SR_CODE;
|
||||
desc.regin[0] |= 1 << gdst_code;
|
||||
desc.regout[lsrc_group] |= 1 << lsrc_code;
|
||||
if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code;
|
||||
if ((imm1 & 0x3000) == 0x3000 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code;
|
||||
|
||||
desc.length = (imm1 & 0x8000) ? 6 : 4;
|
||||
desc.flags |= OPFLAG_READS_MEMORY;
|
||||
@ -911,7 +911,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[0] |= SR_CODE;
|
||||
desc.regin[ldst_group] |= 1 << ldst_code;
|
||||
desc.regout[0] |= 1 << gsrc_code;
|
||||
if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code;
|
||||
if ((imm1 & 0x3000) == 0x3000 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code;
|
||||
|
||||
desc.length = (imm1 & 0x8000) ? 6 : 4;
|
||||
desc.flags |= OPFLAG_READS_MEMORY;
|
||||
@ -925,7 +925,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[0] |= SR_CODE;
|
||||
desc.regin[ldst_group] |= 1 << ldst_code;
|
||||
desc.regout[lsrc_group] |= 1 << lsrc_code;
|
||||
if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code;
|
||||
if ((imm1 & 0x3000) == 0x3000 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code;
|
||||
|
||||
desc.length = (imm1 & 0x8000) ? 6 : 4;
|
||||
desc.flags |= OPFLAG_READS_MEMORY;
|
||||
@ -939,7 +939,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[0] |= 1 << gdst_code;
|
||||
desc.regout[0] |= 1 << gdst_code;
|
||||
desc.regout[0] |= 1 << gsrc_code;
|
||||
if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code;
|
||||
if ((imm1 & 0x3000) == 0x3000 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code;
|
||||
|
||||
desc.length = (imm1 & 0x8000) ? 6 : 4;
|
||||
desc.flags |= OPFLAG_READS_MEMORY;
|
||||
@ -959,7 +959,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[0] |= 1 << gdst_code;
|
||||
desc.regout[0] |= 1 << gdst_code;
|
||||
desc.regout[lsrc_group] |= 1 << lsrc_code;
|
||||
if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code;
|
||||
if ((imm1 & 0x3000) == 0x3000 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code;
|
||||
|
||||
desc.length = (imm1 & 0x8000) ? 6 : 4;
|
||||
desc.flags |= OPFLAG_READS_MEMORY;
|
||||
@ -979,7 +979,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[ldst_group] |= 1 << ldst_code;
|
||||
desc.regout[ldst_group] |= 1 << ldst_code;
|
||||
desc.regout[0] |= 1 << gsrc_code;
|
||||
if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code;
|
||||
if ((imm1 & 0x3000) == 0x3000 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code;
|
||||
|
||||
desc.length = (imm1 & 0x8000) ? 6 : 4;
|
||||
desc.flags |= OPFLAG_READS_MEMORY;
|
||||
@ -994,7 +994,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[ldst_group] |= 1 << ldst_code;
|
||||
desc.regout[ldst_group] |= 1 << ldst_code;
|
||||
desc.regout[lsrc_group] |= 1 << lsrc_code;
|
||||
if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code;
|
||||
if ((imm1 & 0x3000) == 0x3000 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code;
|
||||
|
||||
desc.length = (imm1 & 0x8000) ? 6 : 4;
|
||||
desc.flags |= OPFLAG_READS_MEMORY;
|
||||
@ -1007,7 +1007,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
|
||||
desc.regin[0] |= 1 << gdst_code;
|
||||
desc.regin[0] |= 1 << gsrc_code;
|
||||
if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code;
|
||||
if ((imm1 & 0x3000) == 0x3000 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code;
|
||||
|
||||
desc.length = (imm1 & 0x8000) ? 6 : 4;
|
||||
desc.flags |= OPFLAG_WRITES_MEMORY;
|
||||
@ -1021,7 +1021,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[0] |= SR_CODE;
|
||||
desc.regin[0] |= 1 << gdst_code;
|
||||
desc.regin[lsrc_group] |= 1 << lsrc_code;
|
||||
if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code;
|
||||
if ((imm1 & 0x3000) == 0x3000 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code;
|
||||
|
||||
desc.length = (imm1 & 0x8000) ? 6 : 4;
|
||||
desc.flags |= OPFLAG_WRITES_MEMORY;
|
||||
@ -1035,7 +1035,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[0] |= SR_CODE;
|
||||
desc.regin[ldst_group] |= 1 << ldst_code;
|
||||
desc.regin[0] |= 1 << gsrc_code;
|
||||
if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code;
|
||||
if ((imm1 & 0x3000) == 0x3000 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code;
|
||||
|
||||
desc.length = (imm1 & 0x8000) ? 6 : 4;
|
||||
desc.flags |= OPFLAG_WRITES_MEMORY;
|
||||
@ -1049,7 +1049,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[0] |= SR_CODE;
|
||||
desc.regin[ldst_group] |= 1 << ldst_code;
|
||||
desc.regin[lsrc_group] |= 1 << lsrc_code;
|
||||
if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code;
|
||||
if ((imm1 & 0x3000) == 0x3000 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code;
|
||||
|
||||
desc.length = (imm1 & 0x8000) ? 6 : 4;
|
||||
desc.flags |= OPFLAG_WRITES_MEMORY;
|
||||
@ -1062,7 +1062,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
|
||||
desc.regin[0] |= 1 << gdst_code;
|
||||
desc.regin[0] |= 1 << gsrc_code;
|
||||
if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code;
|
||||
if ((imm1 & 0x3000) == 0x3000 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code;
|
||||
desc.regout[0] |= 1 << gdst_code;
|
||||
|
||||
desc.length = (imm1 & 0x8000) ? 6 : 4;
|
||||
@ -1077,7 +1077,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[0] |= SR_CODE;
|
||||
desc.regin[0] |= 1 << gdst_code;
|
||||
desc.regin[lsrc_group] |= 1 << lsrc_code;
|
||||
if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code;
|
||||
if ((imm1 & 0x3000) == 0x3000 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code;
|
||||
desc.regout[0] |= 1 << gdst_code;
|
||||
|
||||
desc.length = (imm1 & 0x8000) ? 6 : 4;
|
||||
@ -1092,7 +1092,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[0] |= SR_CODE;
|
||||
desc.regin[ldst_group] |= 1 << ldst_code;
|
||||
desc.regin[0] |= 1 << gsrc_code;
|
||||
if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code;
|
||||
if ((imm1 & 0x3000) == 0x3000 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code;
|
||||
desc.regout[ldst_group] |= 1 << ldst_code;
|
||||
|
||||
desc.length = (imm1 & 0x8000) ? 6 : 4;
|
||||
@ -1107,7 +1107,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
|
||||
desc.regin[0] |= SR_CODE;
|
||||
desc.regin[ldst_group] |= 1 << ldst_code;
|
||||
desc.regin[lsrc_group] |= 1 << lsrc_code;
|
||||
if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code;
|
||||
if ((imm1 & 0x3000) == 0x3000 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code;
|
||||
desc.regout[ldst_group] |= 1 << ldst_code;
|
||||
|
||||
desc.length = (imm1 & 0x8000) ? 6 : 4;
|
||||
|
Loading…
Reference in New Issue
Block a user