&& ((am0 == ADISP) && (a0reg == a1reg) && (a0exattr & DEFINED))
&& ((a0exval > 0) && (a0exval <= 8)))
{
- inst = B16(01010000, 01001000) | ((a0exval & 7) << 9) | (a0reg);
+ inst = B16(01010000, 01001000) | (((uint16_t)a0exval & 7) << 9) | (a0reg);
D_word(inst);
warn("lea size(An),An converted to addq #size,An");
return OK;
int m_dbra(WORD inst, WORD siz)
{
- uint32_t v;
-
siz = siz;
inst |= a0reg;
D_word(inst);
if ((a1exattr & TDB) != cursect)
return error(rel_error);
- v = a1exval - sloc;
+ uint32_t v = a1exval - sloc;
if (v + 0x8000 > 0x10000)
return error(range_error);
int siz = (int)size;
// Try to optimize to MOVEQ
+ // N.B.: We can get away with casting the uint64_t to a 32-bit value
+ // because it checks for a SIZL (i.e., a 32-bit value).
if (CHECK_OPTS(OPT_MOVEL_MOVEQ)
&& (siz == SIZL) && (am0 == IMMED) && (am1 == DREG)
&& ((a0exattr & (TDB | DEFINED)) == DEFINED)
- && (a0exval + 0x80 < 0x100))
+ && ((uint32_t)a0exval + 0x80 < 0x100))
{
m_moveq((WORD)0x7000, (WORD)0);
AddFixup(FU_BYTE | FU_SEXT, sloc + 1, a0expr);
a0exval = 0;
}
- else if (a0exval + 0x100 >= 0x200)
+ else if ((uint32_t)a0exval + 0x100 >= 0x200)
return error(range_error);
inst |= reg_9[a1reg] | (a0exval & 0xFF);
//
int m_br(WORD inst, WORD siz)
{
- uint32_t v;
-
if (a0exattr & DEFINED)
{
if ((a0exattr & TDB) != cursect)
return error(rel_error);
//}
- v = a0exval - (sloc + 2);
+ uint32_t v = (uint32_t)a0exval - (sloc + 2);
// Optimize branch instr. size
if (siz == SIZN)
//
int m_movem(WORD inst, WORD siz)
{
- uint32_t eval;
+ uint64_t eval;
WORD i;
WORD w;
WORD rmask;
if ((a0exattr & TDB) != cursect)
return error(rel_error);
- uint32_t v = a0exval - (sloc + 2);
+ uint32_t v = (uint32_t)a0exval - (sloc + 2);
D_word(inst);
D_long(v);
if (a0exval > 255)
return error(range_error);
- inst = a0exval;
+ inst = (uint16_t)a0exval;
D_word(inst);
}
else
if ((a0exattr & TDB) != cursect)
return error(rel_error);
- uint32_t v = a0exval - (sloc + 2);
+ uint32_t v = (uint32_t)a0exval - (sloc + 2);
// Optimize branch instr. size
if (siz == SIZL)
if ((a1exattr & TDB) != cursect)
return error(rel_error);
- v = a1exval - sloc;
+ v = (uint32_t)a1exval - sloc;
if (v + 0x8000 > 0x10000)
return error(range_error);
{
//move16 (ax)+,(xxx).L
inst |= 0 << 3;
- v = a1exval;
+ v = (int)a1exval;
}
}
else if (am0 == ABSL)
{
//move16 (xxx).L,(ax)+
inst |= 1 << 3;
- v = a0exval;
+ v = (int)a0exval;
}
else //APOSTINC
{
//move16 (xxx).L,(ax)
inst |= 3 << 3;
- v = a0exval;
+ v = (int)a0exval;
}
}
else if (am0 == AIND)
{
//move16 (ax),(xxx).L
inst |= 2 << 3;
- v = a1exval;
+ v = (int)a1exval;
}
D_word(inst);
return error("function code immediate should be defined");
if (a0exval > 7 && a0exval < 0)
return error("function code out of range (0-7)");
- fc = a0exval;
+ fc = (uint16_t)a0exval;
break;
case KW_D0:
case KW_D1:
return error("mask immediate value should be defined");
if (a0exval > 7 && a0exval < 0)
return error("function code out of range (0-7)");
- mask = a0exval << 5;
+ mask = (uint16_t)a0exval << 5;
if (*tok == EOL)
{
case IMMED:
if ((a0exattr & DEFINED) == 0)
return error("constant value must be defined");
- inst = (2 << 3) | a0exval;
+ inst = (2 << 3) | (uint16_t)a0exval;
break;
}
return m_pmove(inst | (1 << 8), siz);
}
-
//
// ptrapcc (68851)
//
if ((a1exattr & TDB) != cursect)
return error(rel_error);
- uint32_t v = a1exval - sloc;
+ uint32_t v = (uint32_t)a1exval - sloc;
if ((v + 0x8000) > 0x10000)
return error(range_error);