mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-05 13:26:55 +00:00
MC/X86: Subdivide immediates a bit more, so that we properly recognize immediates based on the width of the target instruction. For example:
addw $0xFFFF, %ax should match the same as addw $-1, %ax but we used to match it to the longer encoding. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@104453 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -186,32 +186,71 @@ struct X86Operand : public MCParsedAsmOperand {
|
||||
|
||||
bool isImm() const { return Kind == Immediate; }
|
||||
|
||||
bool isImmSExt8() const {
|
||||
// Accept immediates which fit in 8 bits when sign extended, and
|
||||
// non-absolute immediates.
|
||||
bool isImmSExti16i8() const {
|
||||
if (!isImm())
|
||||
return false;
|
||||
|
||||
if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm())) {
|
||||
int64_t Value = CE->getValue();
|
||||
return Value == (int64_t) (int8_t) Value;
|
||||
}
|
||||
// If this isn't a constant expr, just assume it fits and let relaxation
|
||||
// handle it.
|
||||
const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
|
||||
if (!CE)
|
||||
return true;
|
||||
|
||||
return true;
|
||||
// Otherwise, check the value is in a range that makes sense for this
|
||||
// extension.
|
||||
uint64_t Value = CE->getValue();
|
||||
return (( Value <= 0x000000000000007FULL)||
|
||||
(0x000000000000FF80ULL <= Value && Value <= 0x000000000000FFFFULL)||
|
||||
(0xFFFFFFFFFFFFFF80ULL <= Value && Value <= 0xFFFFFFFFFFFFFFFFULL));
|
||||
}
|
||||
|
||||
bool isImmSExt32() const {
|
||||
// Accept immediates which fit in 32 bits when sign extended, and
|
||||
// non-absolute immediates.
|
||||
bool isImmSExti32i8() const {
|
||||
if (!isImm())
|
||||
return false;
|
||||
|
||||
if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm())) {
|
||||
int64_t Value = CE->getValue();
|
||||
return Value == (int64_t) (int32_t) Value;
|
||||
}
|
||||
// If this isn't a constant expr, just assume it fits and let relaxation
|
||||
// handle it.
|
||||
const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
|
||||
if (!CE)
|
||||
return true;
|
||||
|
||||
return true;
|
||||
// Otherwise, check the value is in a range that makes sense for this
|
||||
// extension.
|
||||
uint64_t Value = CE->getValue();
|
||||
return (( Value <= 0x000000000000007FULL)||
|
||||
(0x00000000FFFFFF80ULL <= Value && Value <= 0x00000000FFFFFFFFULL)||
|
||||
(0xFFFFFFFFFFFFFF80ULL <= Value && Value <= 0xFFFFFFFFFFFFFFFFULL));
|
||||
}
|
||||
bool isImmSExti64i8() const {
|
||||
if (!isImm())
|
||||
return false;
|
||||
|
||||
// If this isn't a constant expr, just assume it fits and let relaxation
|
||||
// handle it.
|
||||
const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
|
||||
if (!CE)
|
||||
return true;
|
||||
|
||||
// Otherwise, check the value is in a range that makes sense for this
|
||||
// extension.
|
||||
uint64_t Value = CE->getValue();
|
||||
return (( Value <= 0x000000000000007FULL)||
|
||||
(0xFFFFFFFFFFFFFF80ULL <= Value && Value <= 0xFFFFFFFFFFFFFFFFULL));
|
||||
}
|
||||
bool isImmSExti64i32() const {
|
||||
if (!isImm())
|
||||
return false;
|
||||
|
||||
// If this isn't a constant expr, just assume it fits and let relaxation
|
||||
// handle it.
|
||||
const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
|
||||
if (!CE)
|
||||
return true;
|
||||
|
||||
// Otherwise, check the value is in a range that makes sense for this
|
||||
// extension.
|
||||
uint64_t Value = CE->getValue();
|
||||
return (( Value <= 0x000000007FFFFFFFULL)||
|
||||
(0xFFFFFFFF80000000ULL <= Value && Value <= 0xFFFFFFFFFFFFFFFFULL));
|
||||
}
|
||||
|
||||
bool isMem() const { return Kind == Memory; }
|
||||
@@ -245,18 +284,6 @@ struct X86Operand : public MCParsedAsmOperand {
|
||||
addExpr(Inst, getImm());
|
||||
}
|
||||
|
||||
void addImmSExt8Operands(MCInst &Inst, unsigned N) const {
|
||||
// FIXME: Support user customization of the render method.
|
||||
assert(N == 1 && "Invalid number of operands!");
|
||||
addExpr(Inst, getImm());
|
||||
}
|
||||
|
||||
void addImmSExt32Operands(MCInst &Inst, unsigned N) const {
|
||||
// FIXME: Support user customization of the render method.
|
||||
assert(N == 1 && "Invalid number of operands!");
|
||||
addExpr(Inst, getImm());
|
||||
}
|
||||
|
||||
void addMemOperands(MCInst &Inst, unsigned N) const {
|
||||
assert((N == 5) && "Invalid number of operands!");
|
||||
Inst.addOperand(MCOperand::CreateReg(getMemBaseReg()));
|
||||
|
Reference in New Issue
Block a user