mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
[ms-inline asm] Move the size directive asm rewrite into the target specific
logic as a QOI cleanup. rdar://13445327 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177413 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7f63f01a4d
commit
023c880220
@ -57,7 +57,6 @@ public:
|
||||
|
||||
/// isMem - Is this a memory operand?
|
||||
virtual bool isMem() const = 0;
|
||||
virtual unsigned getMemSize() const { return 0; }
|
||||
|
||||
/// getStartLoc - Get the location of the first token of this operand.
|
||||
virtual SMLoc getStartLoc() const = 0;
|
||||
@ -82,10 +81,6 @@ public:
|
||||
/// getOffsetOfLoc - Get the location of the offset operator.
|
||||
virtual SMLoc getOffsetOfLoc() const { return SMLoc(); }
|
||||
|
||||
/// needSizeDirective - Do we need to emit a sizing directive for this
|
||||
/// operand? Only valid when parsing MS-style inline assembly.
|
||||
virtual bool needSizeDirective() const { return false; }
|
||||
|
||||
/// print - Print a debug representation of the operand to the given stream.
|
||||
virtual void print(raw_ostream &OS) const = 0;
|
||||
/// dump - Print to the debug stream.
|
||||
|
@ -4131,11 +4131,6 @@ AsmParser::parseMSInlineAsm(void *AsmLoc, std::string &AsmString,
|
||||
continue;
|
||||
|
||||
bool isOutput = (i == 1) && Desc.mayStore();
|
||||
if (Operand->isMem() && Operand->needSizeDirective())
|
||||
AsmStrRewrites.push_back(AsmRewrite(AOK_SizeDirective,
|
||||
Operand->getStartLoc(), /*Len*/0,
|
||||
Operand->getMemSize()));
|
||||
|
||||
if (isOutput) {
|
||||
++InputIdx;
|
||||
OutputDecls.push_back(OpDecl);
|
||||
@ -4192,15 +4187,13 @@ AsmParser::parseMSInlineAsm(void *AsmLoc, std::string &AsmString,
|
||||
E = AsmStrRewrites.end();
|
||||
I != E; ++I) {
|
||||
const char *Loc = (*I).Loc.getPointer();
|
||||
assert(Loc >= Start && "Expected Loc to be after Start!");
|
||||
assert(Loc >= Start && "Expected Loc to be at or after Start!");
|
||||
|
||||
unsigned AdditionalSkip = 0;
|
||||
AsmRewriteKind Kind = (*I).Kind;
|
||||
|
||||
// Emit everything up to the immediate/expression. If the previous rewrite
|
||||
// was a size directive, then this has already been done.
|
||||
if (PrevKind != AOK_SizeDirective)
|
||||
OS << StringRef(Start, Loc - Start);
|
||||
// Emit everything up to the immediate/expression.
|
||||
OS << StringRef(Start, Loc - Start);
|
||||
PrevKind = Kind;
|
||||
|
||||
// Skip the original expression.
|
||||
@ -4254,8 +4247,7 @@ AsmParser::parseMSInlineAsm(void *AsmLoc, std::string &AsmString,
|
||||
}
|
||||
|
||||
// Skip the original expression.
|
||||
if (Kind != AOK_SizeDirective)
|
||||
Start = Loc + (*I).Len + AdditionalSkip;
|
||||
Start = Loc + (*I).Len + AdditionalSkip;
|
||||
}
|
||||
|
||||
// Emit the remainder of the asm string.
|
||||
|
@ -191,7 +191,6 @@ struct X86Operand : public MCParsedAsmOperand {
|
||||
unsigned IndexReg;
|
||||
unsigned Scale;
|
||||
unsigned Size;
|
||||
bool NeedSizeDir;
|
||||
};
|
||||
|
||||
union {
|
||||
@ -337,11 +336,6 @@ struct X86Operand : public MCParsedAsmOperand {
|
||||
return isImmSExti64i32Value(CE->getValue());
|
||||
}
|
||||
|
||||
unsigned getMemSize() const {
|
||||
assert(Kind == Memory && "Invalid access!");
|
||||
return Mem.Size;
|
||||
}
|
||||
|
||||
bool isOffsetOf() const {
|
||||
return OffsetOfLoc.getPointer();
|
||||
}
|
||||
@ -350,11 +344,6 @@ struct X86Operand : public MCParsedAsmOperand {
|
||||
return AddressOf;
|
||||
}
|
||||
|
||||
bool needSizeDirective() const {
|
||||
assert(Kind == Memory && "Invalid access!");
|
||||
return Mem.NeedSizeDir;
|
||||
}
|
||||
|
||||
bool isMem() const { return Kind == Memory; }
|
||||
bool isMem8() const {
|
||||
return Kind == Memory && (!Mem.Size || Mem.Size == 8);
|
||||
@ -500,7 +489,7 @@ struct X86Operand : public MCParsedAsmOperand {
|
||||
|
||||
/// Create an absolute memory operand.
|
||||
static X86Operand *CreateMem(const MCExpr *Disp, SMLoc StartLoc, SMLoc EndLoc,
|
||||
unsigned Size = 0, bool NeedSizeDir = false) {
|
||||
unsigned Size = 0) {
|
||||
X86Operand *Res = new X86Operand(Memory, StartLoc, EndLoc);
|
||||
Res->Mem.SegReg = 0;
|
||||
Res->Mem.Disp = Disp;
|
||||
@ -508,7 +497,6 @@ struct X86Operand : public MCParsedAsmOperand {
|
||||
Res->Mem.IndexReg = 0;
|
||||
Res->Mem.Scale = 1;
|
||||
Res->Mem.Size = Size;
|
||||
Res->Mem.NeedSizeDir = NeedSizeDir;
|
||||
Res->AddressOf = false;
|
||||
return Res;
|
||||
}
|
||||
@ -517,7 +505,7 @@ struct X86Operand : public MCParsedAsmOperand {
|
||||
static X86Operand *CreateMem(unsigned SegReg, const MCExpr *Disp,
|
||||
unsigned BaseReg, unsigned IndexReg,
|
||||
unsigned Scale, SMLoc StartLoc, SMLoc EndLoc,
|
||||
unsigned Size = 0, bool NeedSizeDir = false) {
|
||||
unsigned Size = 0) {
|
||||
// We should never just have a displacement, that should be parsed as an
|
||||
// absolute memory operand.
|
||||
assert((SegReg || BaseReg || IndexReg) && "Invalid memory operand!");
|
||||
@ -532,7 +520,6 @@ struct X86Operand : public MCParsedAsmOperand {
|
||||
Res->Mem.IndexReg = IndexReg;
|
||||
Res->Mem.Scale = Scale;
|
||||
Res->Mem.Size = Size;
|
||||
Res->Mem.NeedSizeDir = NeedSizeDir;
|
||||
Res->AddressOf = false;
|
||||
return Res;
|
||||
}
|
||||
@ -1041,41 +1028,43 @@ X86Operand *X86AsmParser::ParseIntelMemOperand(unsigned SegReg, SMLoc Start) {
|
||||
if (getParser().parseExpression(Disp, End))
|
||||
return 0;
|
||||
|
||||
bool NeedSizeDir = false;
|
||||
bool IsVarDecl = false;
|
||||
if (isParsingInlineAsm()) {
|
||||
if (const MCSymbolRefExpr *SymRef = dyn_cast<MCSymbolRefExpr>(Disp)) {
|
||||
const MCSymbol &Sym = SymRef->getSymbol();
|
||||
// FIXME: The SemaLookup will fail if the name is anything other then an
|
||||
// identifier.
|
||||
// FIXME: Pass a valid SMLoc.
|
||||
unsigned tLength, tSize, tType;
|
||||
SemaCallback->LookupInlineAsmIdentifier(Sym.getName(), NULL, tLength,
|
||||
tSize, tType, IsVarDecl);
|
||||
if (!Size) {
|
||||
Size = tType * 8; // Size is in terms of bits in this context.
|
||||
NeedSizeDir = Size > 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!isParsingInlineAsm())
|
||||
return X86Operand::CreateMem(Disp, Start, End, Size);
|
||||
else {
|
||||
// If this is not a VarDecl then assume it is a FuncDecl or some other label
|
||||
// reference. We need an 'r' constraint here, so we need to create register
|
||||
// operand to ensure proper matching. Just pick a GPR based on the size of
|
||||
// a pointer.
|
||||
if (!IsVarDecl) {
|
||||
unsigned RegNo = is64BitMode() ? X86::RBX : X86::EBX;
|
||||
return X86Operand::CreateReg(RegNo, Start, End, /*AddressOf=*/true);
|
||||
}
|
||||
|
||||
// When parsing inline assembly we set the base register to a non-zero value
|
||||
// as we don't know the actual value at this time. This is necessary to
|
||||
// get the matching correct in some cases.
|
||||
return X86Operand::CreateMem(/*SegReg*/0, Disp, /*BaseReg*/1, /*IndexReg*/0,
|
||||
/*Scale*/1, Start, End, Size, NeedSizeDir);
|
||||
bool NeedSizeDir = false;
|
||||
bool IsVarDecl = false;
|
||||
if (const MCSymbolRefExpr *SymRef = dyn_cast<MCSymbolRefExpr>(Disp)) {
|
||||
const MCSymbol &Sym = SymRef->getSymbol();
|
||||
// FIXME: The SemaLookup will fail if the name is anything other then an
|
||||
// identifier.
|
||||
// FIXME: Pass a valid SMLoc.
|
||||
unsigned tLength, tSize, tType;
|
||||
SemaCallback->LookupInlineAsmIdentifier(Sym.getName(), NULL, tLength,
|
||||
tSize, tType, IsVarDecl);
|
||||
if (!Size) {
|
||||
Size = tType * 8; // Size is in terms of bits in this context.
|
||||
NeedSizeDir = Size > 0;
|
||||
}
|
||||
}
|
||||
|
||||
// If this is not a VarDecl then assume it is a FuncDecl or some other label
|
||||
// reference. We need an 'r' constraint here, so we need to create register
|
||||
// operand to ensure proper matching. Just pick a GPR based on the size of
|
||||
// a pointer.
|
||||
if (!IsVarDecl) {
|
||||
unsigned RegNo = is64BitMode() ? X86::RBX : X86::EBX;
|
||||
return X86Operand::CreateReg(RegNo, Start, End, /*AddressOf=*/true);
|
||||
}
|
||||
|
||||
if (NeedSizeDir)
|
||||
InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_SizeDirective, Start,
|
||||
/*Len*/0, Size));
|
||||
|
||||
// When parsing inline assembly we set the base register to a non-zero value
|
||||
// as we don't know the actual value at this time. This is necessary to
|
||||
// get the matching correct in some cases.
|
||||
return X86Operand::CreateMem(/*SegReg*/0, Disp, /*BaseReg*/1, /*IndexReg*/0,
|
||||
/*Scale*/1, Start, End, Size);
|
||||
}
|
||||
|
||||
/// Parse the '.' operator.
|
||||
|
Loading…
Reference in New Issue
Block a user