mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
X86: Model i64i32imm properly, as a subclass of all immediates.
llvm-svn: 104272
This commit is contained in:
parent
6cbde7d71e
commit
030b1001c0
@ -200,6 +200,20 @@ struct X86Operand : public MCParsedAsmOperand {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool isImmSExt32() const {
|
||||
// Accept immediates which fit in 32 bits when sign extended, and
|
||||
// non-absolute immediates.
|
||||
if (!isImm())
|
||||
return false;
|
||||
|
||||
if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm())) {
|
||||
int64_t Value = CE->getValue();
|
||||
return Value == (int64_t) (int32_t) Value;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool isMem() const { return Kind == Memory; }
|
||||
|
||||
bool isAbsMem() const {
|
||||
@ -237,6 +251,12 @@ struct X86Operand : public MCParsedAsmOperand {
|
||||
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()));
|
||||
|
@ -18,7 +18,9 @@
|
||||
//
|
||||
|
||||
// 64-bits but only 32 bits are significant.
|
||||
def i64i32imm : Operand<i64>;
|
||||
def i64i32imm : Operand<i64> {
|
||||
let ParserMatchClass = ImmSExt32AsmOperand;
|
||||
}
|
||||
|
||||
// 64-bits but only 32 bits are significant, and those bits are treated as being
|
||||
// pc relative.
|
||||
|
@ -270,9 +270,14 @@ def SSECC : Operand<i8> {
|
||||
let PrintMethod = "printSSECC";
|
||||
}
|
||||
|
||||
def ImmSExt32AsmOperand : AsmOperandClass {
|
||||
let Name = "ImmSExt32";
|
||||
let SuperClass = ImmAsmOperand;
|
||||
}
|
||||
|
||||
def ImmSExt8AsmOperand : AsmOperandClass {
|
||||
let Name = "ImmSExt8";
|
||||
let SuperClass = ImmAsmOperand;
|
||||
let SuperClass = ImmSExt32AsmOperand;
|
||||
}
|
||||
|
||||
// A couple of more descriptive operand definitions.
|
||||
|
Loading…
Reference in New Issue
Block a user