mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-01 18:33:56 +00:00
[ms-inline asm] Propagate the asm dialect into the MachineInstr representation.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@163243 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a759eb3bb9
commit
576cd11ab8
@ -25,6 +25,7 @@
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/ADT/DenseMapInfo.h"
|
||||
#include "llvm/InlineAsm.h"
|
||||
#include "llvm/Support/DebugLoc.h"
|
||||
#include <vector>
|
||||
|
||||
@ -610,6 +611,7 @@ public:
|
||||
bool isImplicitDef() const { return getOpcode()==TargetOpcode::IMPLICIT_DEF; }
|
||||
bool isInlineAsm() const { return getOpcode() == TargetOpcode::INLINEASM; }
|
||||
bool isStackAligningInlineAsm() const;
|
||||
InlineAsm::AsmDialect getInlineAsmDialect() const;
|
||||
bool isInsertSubreg() const {
|
||||
return getOpcode() == TargetOpcode::INSERT_SUBREG;
|
||||
}
|
||||
|
@ -203,17 +203,19 @@ public:
|
||||
Op_InputChain = 0,
|
||||
Op_AsmString = 1,
|
||||
Op_MDNode = 2,
|
||||
Op_ExtraInfo = 3, // HasSideEffects, IsAlignStack
|
||||
Op_ExtraInfo = 3, // HasSideEffects, IsAlignStack, AsmDialect.
|
||||
Op_FirstOperand = 4,
|
||||
|
||||
// Fixed operands on an INLINEASM MachineInstr.
|
||||
MIOp_AsmString = 0,
|
||||
MIOp_ExtraInfo = 1, // HasSideEffects, IsAlignStack
|
||||
MIOp_ExtraInfo = 1, // HasSideEffects, IsAlignStack, AsmDialect.
|
||||
MIOp_FirstOperand = 2,
|
||||
|
||||
// Interpretation of the MIOp_ExtraInfo bit field.
|
||||
Extra_HasSideEffects = 1,
|
||||
Extra_IsAlignStack = 2,
|
||||
Extra_ATTDialect = 3, // AT&T AsmDialect.
|
||||
Extra_IntelDialect = 4, // Intel AsmDialect.
|
||||
|
||||
// Inline asm operands map to multiple SDNode / MachineInstr operands.
|
||||
// The first operand is an immediate describing the asm operand, the low
|
||||
|
@ -967,6 +967,16 @@ bool MachineInstr::isStackAligningInlineAsm() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
InlineAsm::AsmDialect MachineInstr::getInlineAsmDialect() const {
|
||||
assert(isInlineAsm() && "getInlineAsmDialect() only works for inline asms!");
|
||||
unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm();
|
||||
if (ExtraInfo & InlineAsm::Extra_IntelDialect)
|
||||
return InlineAsm::AD_Intel;
|
||||
|
||||
assert((ExtraInfo & InlineAsm::Extra_ATTDialect) && "Expected AT&T dialect!");
|
||||
return InlineAsm::AD_ATT; // The default.
|
||||
}
|
||||
|
||||
int MachineInstr::findInlineAsmFlagIdx(unsigned OpIdx,
|
||||
unsigned *GroupNo) const {
|
||||
assert(isInlineAsm() && "Expected an inline asm instruction");
|
||||
@ -1569,6 +1579,10 @@ void MachineInstr::print(raw_ostream &OS, const TargetMachine *TM) const {
|
||||
OS << " [sideeffect]";
|
||||
if (ExtraInfo & InlineAsm::Extra_IsAlignStack)
|
||||
OS << " [alignstack]";
|
||||
if (ExtraInfo & InlineAsm::Extra_ATTDialect)
|
||||
OS << " [attdialect]";
|
||||
if (ExtraInfo & InlineAsm::Extra_IntelDialect)
|
||||
OS << " [inteldialect]";
|
||||
|
||||
StartOp = AsmDescOp = InlineAsm::MIOp_FirstOperand;
|
||||
FirstOp = false;
|
||||
|
@ -6078,12 +6078,16 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
const MDNode *SrcLoc = CS.getInstruction()->getMetadata("srcloc");
|
||||
AsmNodeOperands.push_back(DAG.getMDNode(SrcLoc));
|
||||
|
||||
// Remember the HasSideEffect and AlignStack bits as operand 3.
|
||||
// Remember the HasSideEffect, AlignStack and AsmDialect bits as operand 3.
|
||||
unsigned ExtraInfo = 0;
|
||||
if (IA->hasSideEffects())
|
||||
ExtraInfo |= InlineAsm::Extra_HasSideEffects;
|
||||
if (IA->isAlignStack())
|
||||
ExtraInfo |= InlineAsm::Extra_IsAlignStack;
|
||||
if (IA->getDialect() == InlineAsm::Extra_ATTDialect)
|
||||
ExtraInfo |= InlineAsm::Extra_ATTDialect;
|
||||
if (IA->getDialect() == InlineAsm::Extra_IntelDialect)
|
||||
ExtraInfo |= InlineAsm::Extra_IntelDialect;
|
||||
AsmNodeOperands.push_back(DAG.getTargetConstant(ExtraInfo,
|
||||
TLI.getPointerTy()));
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user