TargetInfo.cpp revision 961f0708fb66375acf47f9e9bc1aecfb3f992aea
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- TargetInfo.cpp - Information about Target machine ----------------===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  This file implements the TargetInfo and TargetInfoImpl interfaces.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h"
15525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner#include "llvm/ADT/APFloat.h"
166fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson#include "llvm/ADT/STLExtras.h"
175483bdf386ae000ca9c0761481850b005077f4cdChris Lattner#include <cstdlib>
185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
20cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner// TargetInfo Constructor.
21cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris LattnerTargetInfo::TargetInfo(const std::string &T) : Triple(T) {
2261538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  // Set defaults.  Defaults are set for a 32-bit RISC platform,
2361538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  // like PPC or SPARC.
2461538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  // These should be overridden by concrete targets as needed.
25b030f0272500c6c5602f587ac029ee0dc0e5a05cEli Friedman  TLSSupported = true;
26927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  PointerWidth = PointerAlign = 32;
27cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner  WCharWidth = WCharAlign = 32;
28f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  Char16Width = Char16Align = 16;
29f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  Char32Width = Char32Align = 32;
302621fd1d6d3c5eadcae246859f62738645df7540Chris Lattner  IntWidth = IntAlign = 32;
31ec10f5886526124ba733fbd0ef8665d576285daaChris Lattner  LongWidth = LongAlign = 32;
32ec10f5886526124ba733fbd0ef8665d576285daaChris Lattner  LongLongWidth = LongLongAlign = 64;
3361538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  FloatWidth = 32;
3461538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  FloatAlign = 32;
353d292065d80fd81c327ad8452625cb4e5785913cNate Begeman  DoubleWidth = 64;
3661538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  DoubleAlign = 64;
3761538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  LongDoubleWidth = 64;
3861538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  LongDoubleAlign = 64;
3922b9d5a1fd9067785b62d9237bae6ee2a9b40afcNate Begeman  IntMaxTWidth = 64;
406a3615c90e654fce94e9cf635fb4021d5c40743eAnders Carlsson  SizeType = UnsignedLong;
41f509d73ecf2c996e257f1a4e23c1282396b0a847Eli Friedman  PtrDiffType = SignedLong;
4231fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  IntMaxType = SignedLongLong;
4331fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  UIntMaxType = UnsignedLongLong;
446ad474f82f0cf32e13128d89fa5ad3a37ae73530Chris Lattner  IntPtrType = SignedLong;
45f509d73ecf2c996e257f1a4e23c1282396b0a847Eli Friedman  WCharType = SignedInt;
46e64ef80363c84f4f431e26b61db554c89beeddb6Chris Lattner  WIntType = SignedInt;
47f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  Char16Type = UnsignedShort;
48f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  Char32Type = UnsignedInt;
493c7b6e46c5f9bdbe0676c52d80df98b68b02be99Eli Friedman  Int64Type = SignedLongLong;
50cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner  FloatFormat = &llvm::APFloat::IEEEsingle;
51cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner  DoubleFormat = &llvm::APFloat::IEEEdouble;
52cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner  LongDoubleFormat = &llvm::APFloat::IEEEdouble;
53ed855cbbdfa53215c23b49064bb79579a1840fe1Eli Friedman  DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
54ed855cbbdfa53215c23b49064bb79579a1840fe1Eli Friedman                      "i64:64:64-f32:32:32-f64:64:64";
553fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner  UserLabelPrefix = "_";
56525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner}
57525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner
58cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner// Out of line virtual dtor for TargetInfo.
59cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris LattnerTargetInfo::~TargetInfo() {}
60525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner
612b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner/// getTypeName - Return the user string for the specified integer type enum.
622b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner/// For example, SignedShort -> "short".
632b5abf515f9696912452f431c7738691cf97f4f1Chris Lattnerconst char *TargetInfo::getTypeName(IntType T) {
642b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  switch (T) {
652b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  default: assert(0 && "not an integer!");
662b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  case SignedShort:      return "short";
672b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  case UnsignedShort:    return "unsigned short";
682b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  case SignedInt:        return "int";
692b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  case UnsignedInt:      return "unsigned int";
702b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  case SignedLong:       return "long int";
712b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  case UnsignedLong:     return "long unsigned int";
722b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  case SignedLongLong:   return "long long int";
732b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  case UnsignedLongLong: return "long long unsigned int";
742b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  }
752b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner}
762b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner
77b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner/// getTypeConstantSuffix - Return the constant suffix for the specified
78b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner/// integer type enum. For example, SignedLong -> "L".
79b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattnerconst char *TargetInfo::getTypeConstantSuffix(IntType T) {
80b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  switch (T) {
81b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  default: assert(0 && "not an integer!");
82b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case SignedShort:
83b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case SignedInt:        return "";
84b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case SignedLong:       return "L";
85b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case SignedLongLong:   return "LL";
86b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case UnsignedShort:
87b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case UnsignedInt:      return "U";
88b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case UnsignedLong:     return "UL";
89b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case UnsignedLongLong: return "ULL";
90b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  }
91b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner}
92b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner
93b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner/// getTypeWidth - Return the width (in bits) of the specified integer type
94b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner/// enum. For example, SignedInt -> getIntWidth().
95b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattnerunsigned TargetInfo::getTypeWidth(IntType T) const {
96b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  switch (T) {
97b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  default: assert(0 && "not an integer!");
98b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case SignedShort:      return getShortWidth();
99b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case UnsignedShort:    return getShortWidth();
100b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case SignedInt:        return getIntWidth();
101b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case UnsignedInt:      return getIntWidth();
102b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case SignedLong:       return getLongWidth();
103b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case UnsignedLong:     return getLongWidth();
104b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case SignedLongLong:   return getLongLongWidth();
105b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case UnsignedLongLong: return getLongLongWidth();
106b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  };
107b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner}
108b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner
109961f0708fb66375acf47f9e9bc1aecfb3f992aeaChris Lattner/// isTypeSigned - Return whether an integer types is signed. Returns true if
110b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner/// the type is signed; false otherwise.
111961f0708fb66375acf47f9e9bc1aecfb3f992aeaChris Lattnerbool TargetInfo::isTypeSigned(IntType T) const {
112b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  switch (T) {
113b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  default: assert(0 && "not an integer!");
114b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case SignedShort:
115b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case SignedInt:
116b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case SignedLong:
117b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case SignedLongLong:
118b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner    return true;
119b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case UnsignedShort:
120b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case UnsignedInt:
121b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case UnsignedLong:
122b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  case UnsignedLongLong:
123b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner    return false;
124b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner  };
125b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner}
126b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner
127b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner
128525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner//===----------------------------------------------------------------------===//
129525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner
1305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
13142e6737f2efb113563140ad794c21c7709250402Chris Lattnerstatic void removeGCCRegisterPrefix(const char *&Name) {
132ea041758d49215167e473a515b8d46e77b170ccfAnders Carlsson  if (Name[0] == '%' || Name[0] == '#')
133ea041758d49215167e473a515b8d46e77b170ccfAnders Carlsson    Name++;
134ea041758d49215167e473a515b8d46e77b170ccfAnders Carlsson}
135ea041758d49215167e473a515b8d46e77b170ccfAnders Carlsson
1363346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson/// isValidGCCRegisterName - Returns whether the passed in string
1373346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson/// is a valid register name according to GCC. This is used by Sema for
1383346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson/// inline asm statements.
1393346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlssonbool TargetInfo::isValidGCCRegisterName(const char *Name) const {
1406fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson  const char * const *Names;
1416fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson  unsigned NumNames;
1421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1436fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson  // Get rid of any register prefix.
144ea041758d49215167e473a515b8d46e77b170ccfAnders Carlsson  removeGCCRegisterPrefix(Name);
145ea041758d49215167e473a515b8d46e77b170ccfAnders Carlsson
1461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1476fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson  if (strcmp(Name, "memory") == 0 ||
1486fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson      strcmp(Name, "cc") == 0)
1496fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson    return true;
1501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1510eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  getGCCRegNames(Names, NumNames);
1521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1536fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson  // If we have a number it maps to an entry in the register name array.
1546fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson  if (isdigit(Name[0])) {
1556fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson    char *End;
1566fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson    int n = (int)strtol(Name, &End, 0);
1576fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson    if (*End == 0)
1586fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson      return n >= 0 && (unsigned)n < NumNames;
1596fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson  }
1606fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson
1616fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson  // Check register names.
1626fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson  for (unsigned i = 0; i < NumNames; i++) {
1636fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson    if (strcmp(Name, Names[i]) == 0)
1646fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson      return true;
1656fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson  }
1661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1676fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson  // Now check aliases.
1680eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  const GCCRegAlias *Aliases;
1696fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson  unsigned NumAliases;
1701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1710eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  getGCCRegAliases(Aliases, NumAliases);
1726fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson  for (unsigned i = 0; i < NumAliases; i++) {
1736fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson    for (unsigned j = 0 ; j < llvm::array_lengthof(Aliases[i].Aliases); j++) {
1746fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson      if (!Aliases[i].Aliases[j])
1756fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson        break;
1766fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson      if (strcmp(Aliases[i].Aliases[j], Name) == 0)
1776fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson        return true;
1786fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson    }
1796fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson  }
1801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1813346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  return false;
1823346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson}
183d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
1840eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattnerconst char *TargetInfo::getNormalizedGCCRegisterName(const char *Name) const {
185d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  assert(isValidGCCRegisterName(Name) && "Invalid register passed in");
1861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
187ea041758d49215167e473a515b8d46e77b170ccfAnders Carlsson  removeGCCRegisterPrefix(Name);
1881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
189d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  const char * const *Names;
190d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  unsigned NumNames;
191d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
1920eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  getGCCRegNames(Names, NumNames);
193d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
194d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // First, check if we have a number.
195d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  if (isdigit(Name[0])) {
196d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    char *End;
197d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    int n = (int)strtol(Name, &End, 0);
198d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    if (*End == 0) {
1991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      assert(n >= 0 && (unsigned)n < NumNames &&
200d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson             "Out of bounds register number!");
201d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson      return Names[n];
202d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    }
203d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  }
2041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
205d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // Now check aliases.
2060eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  const GCCRegAlias *Aliases;
207d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  unsigned NumAliases;
2081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2090eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  getGCCRegAliases(Aliases, NumAliases);
210d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  for (unsigned i = 0; i < NumAliases; i++) {
211d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    for (unsigned j = 0 ; j < llvm::array_lengthof(Aliases[i].Aliases); j++) {
212d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson      if (!Aliases[i].Aliases[j])
213d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson        break;
214d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson      if (strcmp(Aliases[i].Aliases[j], Name) == 0)
215d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson        return Aliases[i].Register;
216d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    }
217d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  }
2181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
219d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  return Name;
220d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson}
221d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
222432c86969eced2ce658b3f3f2aa7407c8864f21bChris Lattnerbool TargetInfo::validateOutputConstraint(ConstraintInfo &Info) const {
223432c86969eced2ce658b3f3f2aa7407c8864f21bChris Lattner  const char *Name = Info.getConstraintStr().c_str();
224d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // An output constraint must start with '=' or '+'
225d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  if (*Name != '=' && *Name != '+')
226d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    return false;
227d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
228d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  if (*Name == '+')
22944def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner    Info.setIsReadWrite();
230d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
231d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  Name++;
232d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  while (*Name) {
233d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    switch (*Name) {
234d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    default:
23544def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner      if (!validateAsmConstraint(Name, Info)) {
2365ab201a324b2153ce151904d397c05fab798e0bcTed Kremenek        // FIXME: We temporarily return false
237d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson        // so we can add more constraints as we hit it.
238d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson        // Eventually, an unknown constraint should just be treated as 'g'.
2395ab201a324b2153ce151904d397c05fab798e0bcTed Kremenek        return false;
240d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson      }
241d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    case '&': // early clobber.
242d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson      break;
2434053983963cb94a6129da47bca8cce637c8b7bffChris Lattner    case '%': // commutative.
2444053983963cb94a6129da47bca8cce637c8b7bffChris Lattner      // FIXME: Check that there is a another register after this one.
2454053983963cb94a6129da47bca8cce637c8b7bffChris Lattner      break;
246d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    case 'r': // general register.
24744def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner      Info.setAllowsRegister();
248d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson      break;
249d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    case 'm': // memory operand.
25044def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner      Info.setAllowsMemory();
251d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson      break;
252d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    case 'g': // general register, memory operand or immediate integer.
253775841fd76a7aead92c10cec4acb5e8a199f53b1Anders Carlsson    case 'X': // any operand.
25444def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner      Info.setAllowsRegister();
25544def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner      Info.setAllowsMemory();
256d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson      break;
257d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    }
2581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
259d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    Name++;
260d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  }
2611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
262d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  return true;
263d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson}
264d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
26542e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlssonbool TargetInfo::resolveSymbolicName(const char *&Name,
2662819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner                                     ConstraintInfo *OutputConstraints,
2672819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner                                     unsigned NumOutputs,
26844def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner                                     unsigned &Index) const {
26942e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson  assert(*Name == '[' && "Symbolic name did not start with '['");
27042e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson  Name++;
27142e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson  const char *Start = Name;
27242e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson  while (*Name && *Name != ']')
27342e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson    Name++;
2741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27542e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson  if (!*Name) {
27642e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson    // Missing ']'
27742e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson    return false;
27842e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson  }
2791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28042e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson  std::string SymbolicName(Start, Name - Start);
2811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2822819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner  for (Index = 0; Index != NumOutputs; ++Index)
2832819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner    if (SymbolicName == OutputConstraints[Index].getName())
28442e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson      return true;
28542e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson
28642e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson  return false;
28742e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson}
28842e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson
2892819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattnerbool TargetInfo::validateInputConstraint(ConstraintInfo *OutputConstraints,
2902819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner                                         unsigned NumOutputs,
29144def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner                                         ConstraintInfo &Info) const {
292432c86969eced2ce658b3f3f2aa7407c8864f21bChris Lattner  const char *Name = Info.ConstraintStr.c_str();
293432c86969eced2ce658b3f3f2aa7407c8864f21bChris Lattner
294d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  while (*Name) {
295d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    switch (*Name) {
296d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    default:
297d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson      // Check if we have a matching constraint
298d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson      if (*Name >= '0' && *Name <= '9') {
299d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson        unsigned i = *Name - '0';
3001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
301d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson        // Check if matching constraint is out of bounds.
302d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson        if (i >= NumOutputs)
303d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson          return false;
3041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        // The constraint should have the same info as the respective
30603eb543cf7ebee463b33b5802b83ac92c21770cfAnders Carlsson        // output constraint.
307d68876176a0d2c19e3864e7d38f6036c4f72f0a3Chris Lattner        Info.setTiedOperand(i, OutputConstraints[i]);
30844def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner      } else if (!validateAsmConstraint(Name, Info)) {
309302684c5e2242c350efb3a638cd0ed1de21705e1Daniel Dunbar        // FIXME: This error return is in place temporarily so we can
310302684c5e2242c350efb3a638cd0ed1de21705e1Daniel Dunbar        // add more constraints as we hit it.  Eventually, an unknown
311302684c5e2242c350efb3a638cd0ed1de21705e1Daniel Dunbar        // constraint should just be treated as 'g'.
312302684c5e2242c350efb3a638cd0ed1de21705e1Daniel Dunbar        return false;
31342e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson      }
31442e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson      break;
31542e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson    case '[': {
31642e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson      unsigned Index = 0;
3172819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner      if (!resolveSymbolicName(Name, OutputConstraints, NumOutputs, Index))
31842e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson        return false;
3191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32042e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson      break;
3211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
32244fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson    case '%': // commutative
32344fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson      // FIXME: Fail if % is used with the last operand.
32444fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson      break;
325d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    case 'i': // immediate integer.
326efdfa77fecdfc400d18263213f569e0526fea9dcAnders Carlsson    case 'n': // immediate integer with a known value.
327d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson      break;
3281d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner    case 'I':  // Various constant constraints with target-specific meanings.
3291d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner    case 'J':
3301d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner    case 'K':
3311d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner    case 'L':
3321d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner    case 'M':
3331d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner    case 'N':
3341d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner    case 'O':
3351d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner    case 'P':
3361d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner      break;
337d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    case 'r': // general register.
33844def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner      Info.setAllowsRegister();
339d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson      break;
340d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    case 'm': // memory operand.
34144def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner      Info.setAllowsMemory();
342d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson      break;
343d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    case 'g': // general register, memory operand or immediate integer.
344775841fd76a7aead92c10cec4acb5e8a199f53b1Anders Carlsson    case 'X': // any operand.
34544def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner      Info.setAllowsRegister();
34644def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner      Info.setAllowsMemory();
347d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson      break;
348d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    }
3491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
350d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    Name++;
351d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  }
3521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
353d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  return true;
354d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson}
355