diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2007-04-01 07:20:02 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2007-04-01 07:20:02 +0000 |
commit | e67d0c226d0dca727f82425580d60df596e006eb (patch) | |
tree | 748bd012f91d14cf1f46410dc453e016f6a87ffa /llvm/utils/TableGen/CodeGenTarget.cpp | |
parent | 51455e00dc93f3e84226ac4737a6d37fe267ea3c (diff) | |
download | bcm5719-llvm-e67d0c226d0dca727f82425580d60df596e006eb.tar.gz bcm5719-llvm-e67d0c226d0dca727f82425580d60df596e006eb.zip |
For PR1297:
Implement code generation for overloaded intrinsic functions. The basic
difference is that "actual" argument types must be provided when
constructing intrinsic names and types. Also, for recognition, only the
prefix is examined. If it matches, the suffix is assumed to match. The
suffix is checked by the Verifier, however.
llvm-svn: 35539
Diffstat (limited to 'llvm/utils/TableGen/CodeGenTarget.cpp')
-rw-r--r-- | llvm/utils/TableGen/CodeGenTarget.cpp | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/llvm/utils/TableGen/CodeGenTarget.cpp b/llvm/utils/TableGen/CodeGenTarget.cpp index 7cf80b02abe..151295fc95e 100644 --- a/llvm/utils/TableGen/CodeGenTarget.cpp +++ b/llvm/utils/TableGen/CodeGenTarget.cpp @@ -43,6 +43,7 @@ std::string llvm::getName(MVT::ValueType T) { case MVT::i32: return "MVT::i32"; case MVT::i64: return "MVT::i64"; case MVT::i128: return "MVT::i128"; + case MVT::iAny: return "MVT::iAny"; case MVT::f32: return "MVT::f32"; case MVT::f64: return "MVT::f64"; case MVT::f80: return "MVT::f80"; @@ -74,6 +75,7 @@ std::string llvm::getEnumName(MVT::ValueType T) { case MVT::i32: return "MVT::i32"; case MVT::i64: return "MVT::i64"; case MVT::i128: return "MVT::i128"; + case MVT::iAny: return "MVT::iAny"; case MVT::f32: return "MVT::f32"; case MVT::f64: return "MVT::f64"; case MVT::f80: return "MVT::f80"; @@ -570,6 +572,7 @@ CodeGenIntrinsic::CodeGenIntrinsic(Record *R, CodeGenTarget *CGT) { TheDef = R; std::string DefName = R->getName(); ModRef = WriteMem; + isOverloaded = false; if (DefName.size() <= 4 || std::string(DefName.begin(), DefName.begin()+4) != "int_") @@ -610,13 +613,14 @@ CodeGenIntrinsic::CodeGenIntrinsic(Record *R, CodeGenTarget *CGT) { Record *TyEl = TypeList->getElementAsRecord(i); assert(TyEl->isSubClassOf("LLVMType") && "Expected a type!"); ArgTypes.push_back(TyEl->getValueAsString("TypeVal")); - - if (CGT) - ArgVTs.push_back(getValueType(TyEl->getValueAsDef("VT"), CGT)); + MVT::ValueType VT = getValueType(TyEl->getValueAsDef("VT"), CGT); + isOverloaded |= VT == MVT::iAny; + ArgVTs.push_back(VT); ArgTypeDefs.push_back(TyEl); } if (ArgTypes.size() == 0) throw "Intrinsic '"+DefName+"' needs at least a type for the ret value!"; + // Parse the intrinsic properties. ListInit *PropList = R->getValueAsListInit("Properties"); |