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