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);
@ -830,11 +834,18 @@ void hyperstone_device::generate_mask(drcuml_block *block, compiler_state *compi
if (DST_GLOBAL)
{
UML_MOV(block, I4, dst_code);
UML_MOV(block, I5, I1);
generate_set_global_register(block, compiler, desc);
if (dst_code == PC_REGISTER)
generate_branch(block, desc->targetpc);
if (dst_code < 2)
{
UML_MOV(block, I4, dst_code);
UML_MOV(block, I5, I1);
generate_set_global_register(block, compiler, desc);
if (dst_code == PC_REGISTER)
generate_branch(block, desc->targetpc);
}
else
{
UML_STORE(block, (void *)m_core->global_regs, dst_code, I1, SIZE_DWORD, SCALE_x4);
}
}
else
{
@ -899,16 +910,23 @@ void hyperstone_device::generate_sum(drcuml_block *block, compiler_state *compil
if (DST_GLOBAL)
{
UML_MOV(block, I4, dst_code);
generate_set_global_register(block, compiler, desc);
if (dst_code == PC_REGISTER)
generate_branch(block, desc->targetpc);
if (dst_code < 2)
{
UML_MOV(block, I4, dst_code);
generate_set_global_register(block, compiler, desc);
if (dst_code == PC_REGISTER)
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);
}
}
@ -1295,12 +1313,19 @@ void hyperstone_device::generate_subc(drcuml_block *block, compiler_state *compi
if (DST_GLOBAL)
{
UML_MOV(block, I4, dst_code);
UML_MOV(block, I5, I1);
generate_set_global_register(block, compiler, desc);
if (dst_code < 2)
{
UML_MOV(block, I4, dst_code);
UML_MOV(block, I5, I1);
generate_set_global_register(block, compiler, desc);
if (dst_code == PC_REGISTER)
generate_branch(block, desc->targetpc);
if (dst_code == PC_REGISTER)
generate_branch(block, desc->targetpc);
}
else
{
UML_STORE(block, (void *)m_core->global_regs, dst_code, I1, SIZE_DWORD, SCALE_x4);
}
}
else
{
@ -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);
@ -2668,8 +2695,15 @@ void hyperstone_device::generate_shri(drcuml_block *block, compiler_state *compi
if (DST_GLOBAL)
{
UML_MOV(block, I4, dst_code);
generate_set_global_register(block, compiler, desc);
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
{
@ -3123,8 +3157,15 @@ void hyperstone_device::generate_shli(drcuml_block *block, compiler_state *compi
if (DST_GLOBAL)
{
UML_MOV(block, I4, dst_code);
generate_set_global_register(block, compiler, desc);
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
{
@ -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
{
@ -4347,11 +4384,20 @@ void hyperstone_device::generate_ldwr(drcuml_block *block, compiler_state *compi
if (SRC_GLOBAL)
{
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);
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
{

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;