e132xs: Ironed out some 32-bit DRC issues, and address Coverity concerns, nw

This commit is contained in:
mooglyguy 2017-12-31 12:48:15 +01:00
parent 14fcd2e34b
commit a432afe28a
2 changed files with 99 additions and 53 deletions

View File

@ -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);

View File

@ -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;