fixed logical shifts, removed unneeded int32_t casts

This commit is contained in:
Patrick Mackinlay 2017-01-11 19:01:50 +07:00
parent 20114c432e
commit b31e3f8c13

View File

@ -433,53 +433,53 @@ int clipper_device::execute_instruction (uint16_t insn)
case 0x30: case 0x30:
// shaw: shift arithmetic word // shaw: shift arithmetic word
if ((int32_t)m_r[m_ssw.fields.u][R1] > 0) if (m_r[m_ssw.fields.u][R1] > 0)
m_r[m_ssw.fields.u][R2] = (int32_t)m_r[m_ssw.fields.u][R2] << m_r[m_ssw.fields.u][R1]; m_r[m_ssw.fields.u][R2] <<= m_r[m_ssw.fields.u][R1];
else else
m_r[m_ssw.fields.u][R2] = (int32_t)m_r[m_ssw.fields.u][R2] >> -(int32_t)m_r[m_ssw.fields.u][R1]; m_r[m_ssw.fields.u][R2] >>= -m_r[m_ssw.fields.u][R1];
// FLAGS: 0VZN // FLAGS: 0VZN
break; break;
case 0x31: case 0x31:
// shal: shift arithmetic longword // shal: shift arithmetic longword
if ((int32_t)m_r[m_ssw.fields.u][R1] > 0) if (m_r[m_ssw.fields.u][R1] > 0)
((int64_t *)m_r[m_ssw.fields.u])[R2 >> 1] <<= m_r[m_ssw.fields.u][R1]; ((int64_t *)m_r[m_ssw.fields.u])[R2 >> 1] <<= m_r[m_ssw.fields.u][R1];
else else
((int64_t *)m_r[m_ssw.fields.u])[R2 >> 1] >>= -(int32_t)m_r[m_ssw.fields.u][R1]; ((int64_t *)m_r[m_ssw.fields.u])[R2 >> 1] >>= -m_r[m_ssw.fields.u][R1];
// FLAGS: 0VZN // FLAGS: 0VZN
break; break;
case 0x32: case 0x32:
// shlw: shift logical word // shlw: shift logical word
if ((int32_t)m_r[m_ssw.fields.u][R1] > 0) if (m_r[m_ssw.fields.u][R1] > 0)
m_r[m_ssw.fields.u][R2] <<= m_r[m_ssw.fields.u][R1]; m_r[m_ssw.fields.u][R2] <<= m_r[m_ssw.fields.u][R1];
else else
m_r[m_ssw.fields.u][R2] >>= -(int32_t)m_r[m_ssw.fields.u][R1]; ((uint32_t *)m_r[m_ssw.fields.u])[R2] >>= -m_r[m_ssw.fields.u][R1];
// FLAGS: 00ZN // FLAGS: 00ZN
FLAGS(0, 0, m_r[m_ssw.fields.u][R2] == 0, BIT(m_r[m_ssw.fields.u][R2], 31)); FLAGS(0, 0, m_r[m_ssw.fields.u][R2] == 0, BIT(m_r[m_ssw.fields.u][R2], 31));
break; break;
case 0x33: case 0x33:
// shll: shift logical longword // shll: shift logical longword
if ((int32_t)m_r[m_ssw.fields.u][R1] > 0) if (m_r[m_ssw.fields.u][R1] > 0)
((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1] <<= m_r[m_ssw.fields.u][R1]; ((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1] <<= m_r[m_ssw.fields.u][R1];
else else
((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1] >>= -(int32_t)m_r[m_ssw.fields.u][R1]; ((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1] >>= -m_r[m_ssw.fields.u][R1];
// FLAGS: 00ZN // FLAGS: 00ZN
FLAGS(0, 0, ((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1] == 0, BIT(((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1], 63)); FLAGS(0, 0, ((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1] == 0, BIT(((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1], 63));
break; break;
case 0x34: case 0x34:
// rotw: rotate word // rotw: rotate word
if ((int32_t)m_r[m_ssw.fields.u][R1] > 0) if (m_r[m_ssw.fields.u][R1] > 0)
m_r[m_ssw.fields.u][R2] = _rotl(m_r[m_ssw.fields.u][R2], m_r[m_ssw.fields.u][R1]); m_r[m_ssw.fields.u][R2] = _rotl(m_r[m_ssw.fields.u][R2], m_r[m_ssw.fields.u][R1]);
else else
m_r[m_ssw.fields.u][R2] = _rotr(m_r[m_ssw.fields.u][R2], -(int32_t)m_r[m_ssw.fields.u][R1]); m_r[m_ssw.fields.u][R2] = _rotr(m_r[m_ssw.fields.u][R2], -m_r[m_ssw.fields.u][R1]);
// FLAGS: 00ZN // FLAGS: 00ZN
FLAGS(0, 0, m_r[m_ssw.fields.u][R2] == 0, BIT(m_r[m_ssw.fields.u][R2], 31)); FLAGS(0, 0, m_r[m_ssw.fields.u][R2] == 0, BIT(m_r[m_ssw.fields.u][R2], 31));
break; break;
case 0x35: case 0x35:
// rotl: rotate longword // rotl: rotate longword
if ((int32_t)m_r[m_ssw.fields.u][R1] > 0) if (m_r[m_ssw.fields.u][R1] > 0)
((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1] = _rotl64(((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1], m_r[m_ssw.fields.u][R1]); ((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1] = _rotl64(((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1], m_r[m_ssw.fields.u][R1]);
else else
((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1] = _rotr64(((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1], -(int32_t)m_r[m_ssw.fields.u][R1]); ((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1] = _rotr64(((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1], -m_r[m_ssw.fields.u][R1]);
// FLAGS: 00ZN // FLAGS: 00ZN
FLAGS(0, 0, ((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1] == 0, BIT(((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1], 63)); FLAGS(0, 0, ((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1] == 0, BIT(((uint64_t *)m_r[m_ssw.fields.u])[R2 >> 1], 63));
break; break;
@ -487,9 +487,9 @@ int clipper_device::execute_instruction (uint16_t insn)
case 0x38: case 0x38:
// shai: shift arithmetic immediate // shai: shift arithmetic immediate
if (m_info.op.imm > 0) if (m_info.op.imm > 0)
m_r[m_ssw.fields.u][R2] = (int32_t)m_r[m_ssw.fields.u][R2] << m_info.op.imm; m_r[m_ssw.fields.u][R2] <<= m_info.op.imm;
else else
m_r[m_ssw.fields.u][R2] = (int32_t)m_r[m_ssw.fields.u][R2] >> -m_info.op.imm; m_r[m_ssw.fields.u][R2] >>= -m_info.op.imm;
// FLAGS: 0VZN // FLAGS: 0VZN
// TRAPS: I // TRAPS: I
break; break;
@ -507,7 +507,7 @@ int clipper_device::execute_instruction (uint16_t insn)
if (m_info.op.imm > 0) if (m_info.op.imm > 0)
m_r[m_ssw.fields.u][R2] <<= m_info.op.imm; m_r[m_ssw.fields.u][R2] <<= m_info.op.imm;
else else
m_r[m_ssw.fields.u][R2] >>= -m_info.op.imm; ((uint32_t *)m_r[m_ssw.fields.u])[R2] >>= -m_info.op.imm;
// FLAGS: 00ZN // FLAGS: 00ZN
FLAGS(0, 0, m_r[m_ssw.fields.u][R2] == 0, BIT(m_r[m_ssw.fields.u][R2], 31)); FLAGS(0, 0, m_r[m_ssw.fields.u][R2] == 0, BIT(m_r[m_ssw.fields.u][R2], 31));
// TRAPS: I // TRAPS: I
@ -821,13 +821,13 @@ int clipper_device::execute_instruction (uint16_t insn)
case 0x93: case 0x93:
// negw: negate word // negw: negate word
m_r[m_ssw.fields.u][R2] = -(int32_t)m_r[m_ssw.fields.u][R1]; m_r[m_ssw.fields.u][R2] = -m_r[m_ssw.fields.u][R1];
// FLAGS: CVZN // FLAGS: CVZN
break; break;
case 0x98: case 0x98:
// mulw: multiply word // mulw: multiply word
m_r[m_ssw.fields.u][R2] = (int32_t)m_r[m_ssw.fields.u][R2] * (int32_t)m_r[m_ssw.fields.u][R1]; m_r[m_ssw.fields.u][R2] = m_r[m_ssw.fields.u][R2] * m_r[m_ssw.fields.u][R1];
// FLAGS: 0V00 // FLAGS: 0V00
break; break;
case 0x99: case 0x99:
@ -847,19 +847,19 @@ int clipper_device::execute_instruction (uint16_t insn)
break; break;
case 0x9c: case 0x9c:
// divw: divide word // divw: divide word
if ((int32_t)m_r[m_ssw.fields.u][R1] == 0) if (m_r[m_ssw.fields.u][R1] == 0)
next_pc = intrap(EXCEPTION_INTEGER_DIVIDE_BY_ZERO, next_pc, CTS_DIVIDE_BY_ZERO); next_pc = intrap(EXCEPTION_INTEGER_DIVIDE_BY_ZERO, next_pc, CTS_DIVIDE_BY_ZERO);
else else
m_r[m_ssw.fields.u][R2] = (int32_t)m_r[m_ssw.fields.u][R2] / (int32_t)m_r[m_ssw.fields.u][R1]; m_r[m_ssw.fields.u][R2] = m_r[m_ssw.fields.u][R2] / m_r[m_ssw.fields.u][R1];
// FLAGS: 0V00 // FLAGS: 0V00
// TRAPS: D // TRAPS: D
break; break;
case 0x9d: case 0x9d:
// modw: modulus word // modw: modulus word
if ((int32_t)m_r[m_ssw.fields.u][R1] == 0) if (m_r[m_ssw.fields.u][R1] == 0)
next_pc = intrap(EXCEPTION_INTEGER_DIVIDE_BY_ZERO, next_pc, CTS_DIVIDE_BY_ZERO); next_pc = intrap(EXCEPTION_INTEGER_DIVIDE_BY_ZERO, next_pc, CTS_DIVIDE_BY_ZERO);
else else
m_r[m_ssw.fields.u][R2] = (int32_t)m_r[m_ssw.fields.u][R2] % (int32_t)m_r[m_ssw.fields.u][R1]; m_r[m_ssw.fields.u][R2] = m_r[m_ssw.fields.u][R2] % m_r[m_ssw.fields.u][R1];
// FLAGS: 0V00 // FLAGS: 0V00
// TRAPS: D // TRAPS: D
break; break;