diff options
author | Craig Topper <craig.topper@gmail.com> | 2013-08-25 22:23:38 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@gmail.com> | 2013-08-25 22:23:38 +0000 |
commit | a4959f3f6eb9b6ab3cbbe085a2797208682e96c6 (patch) | |
tree | 0bb606cb8e2250fe925ca7af32b9b8ab1ad1a9ac /lib/Target/X86/AsmParser | |
parent | f27c35347aa9fdd36c4ed6268380e2574ccfc87f (diff) | |
download | external_llvm-a4959f3f6eb9b6ab3cbbe085a2797208682e96c6.zip external_llvm-a4959f3f6eb9b6ab3cbbe085a2797208682e96c6.tar.gz external_llvm-a4959f3f6eb9b6ab3cbbe085a2797208682e96c6.tar.bz2 |
First round of fixes for the x86 fixes for the x86 move accumulator from/to memory offset instructions.
-Assembly parser now properly check the size of the memory operation specified in intel syntax. So 'mov word ptr [5], al' is no longer accepted.
-x86-32 disassembly of these instructions no longer sign extends the 32-bit address immediate based on size.
-Intel syntax printing prints the ptr size and places brackets around the address immediate.
Known remaining issues with these instructions:
-Segment override prefix is not supported. PR16962 and PR16961.
-Immediate size should be changed by address size prefix.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@189201 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/AsmParser')
-rw-r--r-- | lib/Target/X86/AsmParser/X86AsmParser.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/lib/Target/X86/AsmParser/X86AsmParser.cpp b/lib/Target/X86/AsmParser/X86AsmParser.cpp index ced12fc..a090b33 100644 --- a/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -849,6 +849,23 @@ struct X86Operand : public MCParsedAsmOperand { !getMemIndexReg() && getMemScale() == 1; } + bool isMemOffs8() const { + return Kind == Memory && !getMemSegReg() && !getMemBaseReg() && + !getMemIndexReg() && getMemScale() == 1 && (!Mem.Size || Mem.Size == 8); + } + bool isMemOffs16() const { + return Kind == Memory && !getMemSegReg() && !getMemBaseReg() && + !getMemIndexReg() && getMemScale() == 1 && (!Mem.Size || Mem.Size == 16); + } + bool isMemOffs32() const { + return Kind == Memory && !getMemSegReg() && !getMemBaseReg() && + !getMemIndexReg() && getMemScale() == 1 && (!Mem.Size || Mem.Size == 32); + } + bool isMemOffs64() const { + return Kind == Memory && !getMemSegReg() && !getMemBaseReg() && + !getMemIndexReg() && getMemScale() == 1 && (!Mem.Size || Mem.Size == 64); + } + bool isReg() const { return Kind == Register; } void addExpr(MCInst &Inst, const MCExpr *Expr) const { @@ -931,6 +948,28 @@ struct X86Operand : public MCParsedAsmOperand { Inst.addOperand(MCOperand::CreateExpr(getMemDisp())); } + void addMemOffs8Operands(MCInst &Inst, unsigned N) const { + addMemOffsOperands(Inst, N); + } + void addMemOffs16Operands(MCInst &Inst, unsigned N) const { + addMemOffsOperands(Inst, N); + } + void addMemOffs32Operands(MCInst &Inst, unsigned N) const { + addMemOffsOperands(Inst, N); + } + void addMemOffs64Operands(MCInst &Inst, unsigned N) const { + addMemOffsOperands(Inst, N); + } + + void addMemOffsOperands(MCInst &Inst, unsigned N) const { + assert((N == 1) && "Invalid number of operands!"); + // Add as immediates when possible. + if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getMemDisp())) + Inst.addOperand(MCOperand::CreateImm(CE->getValue())); + else + Inst.addOperand(MCOperand::CreateExpr(getMemDisp())); + } + static X86Operand *CreateToken(StringRef Str, SMLoc Loc) { SMLoc EndLoc = SMLoc::getFromPointer(Loc.getPointer() + Str.size()); X86Operand *Res = new X86Operand(Token, Loc, EndLoc); |