A few inline asm cleanups:

- Make targetlowering.h fit in 80 cols.
  - Make LowerAsmOperandForConstraint const.
  - Make lowerXConstraint -> LowerXConstraint
  - Make LowerXConstraint return a const char* instead of taking a string byref.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50312 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2008-04-26 23:02:14 +00:00
parent 2ba1c06d48
commit 5e764233f3
6 changed files with 40 additions and 39 deletions

View File

@ -1100,16 +1100,19 @@ public:
std::string *Current = &Codes[0]; std::string *Current = &Codes[0];
TargetLowering::ConstraintType CurType = TLI.getConstraintType(*Current); TargetLowering::ConstraintType CurType = TLI.getConstraintType(*Current);
if (Codes.size() == 1) { // Single-letter constraints ('r') are very common. // Single-letter constraints ('r') are very common.
if (Codes.size() == 1) {
ConstraintCode = *Current; ConstraintCode = *Current;
ConstraintType = CurType; ConstraintType = CurType;
} else { } else {
unsigned CurGenerality = getConstraintGenerality(CurType); unsigned CurGenerality = getConstraintGenerality(CurType);
// If we have multiple constraints, try to pick the most general one ahead // If we have multiple constraints, try to pick the most general one
// of time. This isn't a wonderful solution, but handles common cases. // ahead of time. This isn't a wonderful solution, but handles common
// cases.
for (unsigned j = 1, e = Codes.size(); j != e; ++j) { for (unsigned j = 1, e = Codes.size(); j != e; ++j) {
TargetLowering::ConstraintType ThisType = TLI.getConstraintType(Codes[j]); TargetLowering::ConstraintType ThisType =
TLI.getConstraintType(Codes[j]);
unsigned ThisGenerality = getConstraintGenerality(ThisType); unsigned ThisGenerality = getConstraintGenerality(ThisType);
if (ThisGenerality > CurGenerality) { if (ThisGenerality > CurGenerality) {
// This constraint letter is more general than the previous one, // This constraint letter is more general than the previous one,
@ -1124,17 +1127,17 @@ public:
ConstraintType = CurType; ConstraintType = CurType;
} }
// 'X' matches anything.
if (ConstraintCode == "X" && CallOperandVal) { if (ConstraintCode == "X" && CallOperandVal) {
// Labels and constants are handled elsewhere ('X' is the only thing
// that matches labels).
if (isa<BasicBlock>(CallOperandVal) || isa<ConstantInt>(CallOperandVal)) if (isa<BasicBlock>(CallOperandVal) || isa<ConstantInt>(CallOperandVal))
return; return;
// This matches anything. Labels and constants we handle elsewhere
// ('X' is the only thing that matches labels). Otherwise, try to // Otherwise, try to resolve it to something we know about by looking at
// resolve it to something we know about by looking at the actual // the actual operand type.
// operand type. if (const char *Repl = TLI.LowerXConstraint(ConstraintVT)) {
std::string s = ""; ConstraintCode = Repl;
TLI.lowerXConstraint(ConstraintVT, s);
if (s!="") {
ConstraintCode = s;
ConstraintType = TLI.getConstraintType(ConstraintCode); ConstraintType = TLI.getConstraintType(ConstraintCode);
} }
} }
@ -1168,15 +1171,15 @@ public:
/// LowerXConstraint - try to replace an X constraint, which matches anything, /// LowerXConstraint - try to replace an X constraint, which matches anything,
/// with another that has more specific requirements based on the type of the /// with another that has more specific requirements based on the type of the
/// corresponding operand. /// corresponding operand. This returns null if there is no replacement to
virtual void lowerXConstraint(MVT::ValueType ConstraintVT, /// make.
std::string&) const; virtual const char *LowerXConstraint(MVT::ValueType ConstraintVT) const;
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
/// vector. If it is invalid, don't add anything to Ops. /// vector. If it is invalid, don't add anything to Ops.
virtual void LowerAsmOperandForConstraint(SDOperand Op, char ConstraintLetter, virtual void LowerAsmOperandForConstraint(SDOperand Op, char ConstraintLetter,
std::vector<SDOperand> &Ops, std::vector<SDOperand> &Ops,
SelectionDAG &DAG); SelectionDAG &DAG) const;
//===--------------------------------------------------------------------===// //===--------------------------------------------------------------------===//
// Scheduler hooks // Scheduler hooks

View File

@ -1534,14 +1534,12 @@ TargetLowering::getConstraintType(const std::string &Constraint) const {
/// LowerXConstraint - try to replace an X constraint, which matches anything, /// LowerXConstraint - try to replace an X constraint, which matches anything,
/// with another that has more specific requirements based on the type of the /// with another that has more specific requirements based on the type of the
/// corresponding operand. /// corresponding operand.
void TargetLowering::lowerXConstraint(MVT::ValueType ConstraintVT, const char *TargetLowering::LowerXConstraint(MVT::ValueType ConstraintVT) const{
std::string& s) const {
if (MVT::isInteger(ConstraintVT)) if (MVT::isInteger(ConstraintVT))
s = "r"; return "r";
else if (MVT::isFloatingPoint(ConstraintVT)) if (MVT::isFloatingPoint(ConstraintVT))
s = "f"; // works for many targets return "f"; // works for many targets
else return 0;
s = "";
} }
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
@ -1549,7 +1547,7 @@ void TargetLowering::lowerXConstraint(MVT::ValueType ConstraintVT,
void TargetLowering::LowerAsmOperandForConstraint(SDOperand Op, void TargetLowering::LowerAsmOperandForConstraint(SDOperand Op,
char ConstraintLetter, char ConstraintLetter,
std::vector<SDOperand> &Ops, std::vector<SDOperand> &Ops,
SelectionDAG &DAG) { SelectionDAG &DAG) const {
switch (ConstraintLetter) { switch (ConstraintLetter) {
default: break; default: break;
case 'X': // Allows any operand; labels (basic block) use this. case 'X': // Allows any operand; labels (basic block) use this.

View File

@ -3984,7 +3984,7 @@ PPCTargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
/// vector. If it is invalid, don't add anything to Ops. /// vector. If it is invalid, don't add anything to Ops.
void PPCTargetLowering::LowerAsmOperandForConstraint(SDOperand Op, char Letter, void PPCTargetLowering::LowerAsmOperandForConstraint(SDOperand Op, char Letter,
std::vector<SDOperand>&Ops, std::vector<SDOperand>&Ops,
SelectionDAG &DAG) { SelectionDAG &DAG) const {
SDOperand Result(0,0); SDOperand Result(0,0);
switch (Letter) { switch (Letter) {
default: break; default: break;

View File

@ -293,7 +293,7 @@ namespace llvm {
virtual void LowerAsmOperandForConstraint(SDOperand Op, virtual void LowerAsmOperandForConstraint(SDOperand Op,
char ConstraintLetter, char ConstraintLetter,
std::vector<SDOperand> &Ops, std::vector<SDOperand> &Ops,
SelectionDAG &DAG); SelectionDAG &DAG) const;
/// isLegalAddressingMode - Return true if the addressing mode represented /// isLegalAddressingMode - Return true if the addressing mode represented
/// by AM is legal for this target, for a load/store of the specified type. /// by AM is legal for this target, for a load/store of the specified type.

View File

@ -6280,17 +6280,18 @@ X86TargetLowering::getConstraintType(const std::string &Constraint) const {
/// LowerXConstraint - try to replace an X constraint, which matches anything, /// LowerXConstraint - try to replace an X constraint, which matches anything,
/// with another that has more specific requirements based on the type of the /// with another that has more specific requirements based on the type of the
/// corresponding operand. /// corresponding operand.
void X86TargetLowering::lowerXConstraint(MVT::ValueType ConstraintVT, const char *X86TargetLowering::
std::string& s) const { LowerXConstraint(MVT::ValueType ConstraintVT) const {
// FP X constraints get lowered to SSE1/2 registers if available, otherwise
// 'f' like normal targets.
if (MVT::isFloatingPoint(ConstraintVT)) { if (MVT::isFloatingPoint(ConstraintVT)) {
if (Subtarget->hasSSE2()) if (Subtarget->hasSSE2())
s = "Y"; return "Y";
else if (Subtarget->hasSSE1()) if (Subtarget->hasSSE1())
s = "x"; return "x";
else }
s = "f";
} else return TargetLowering::LowerXConstraint(ConstraintVT);
return TargetLowering::lowerXConstraint(ConstraintVT, s);
} }
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
@ -6298,7 +6299,7 @@ void X86TargetLowering::lowerXConstraint(MVT::ValueType ConstraintVT,
void X86TargetLowering::LowerAsmOperandForConstraint(SDOperand Op, void X86TargetLowering::LowerAsmOperandForConstraint(SDOperand Op,
char Constraint, char Constraint,
std::vector<SDOperand>&Ops, std::vector<SDOperand>&Ops,
SelectionDAG &DAG) { SelectionDAG &DAG) const {
SDOperand Result(0, 0); SDOperand Result(0, 0);
switch (Constraint) { switch (Constraint) {

View File

@ -371,15 +371,14 @@ namespace llvm {
getRegClassForInlineAsmConstraint(const std::string &Constraint, getRegClassForInlineAsmConstraint(const std::string &Constraint,
MVT::ValueType VT) const; MVT::ValueType VT) const;
virtual void lowerXConstraint(MVT::ValueType ConstraintVT, virtual const char *LowerXConstraint(MVT::ValueType ConstraintVT) const;
std::string&) const;
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
/// vector. If it is invalid, don't add anything to Ops. /// vector. If it is invalid, don't add anything to Ops.
virtual void LowerAsmOperandForConstraint(SDOperand Op, virtual void LowerAsmOperandForConstraint(SDOperand Op,
char ConstraintLetter, char ConstraintLetter,
std::vector<SDOperand> &Ops, std::vector<SDOperand> &Ops,
SelectionDAG &DAG); SelectionDAG &DAG) const;
/// getRegForInlineAsmConstraint - Given a physical register constraint /// getRegForInlineAsmConstraint - Given a physical register constraint
/// (e.g. {edx}), return the register number and the register class for the /// (e.g. {edx}), return the register number and the register class for the