ARM & AArch64: share the BI__builtin_neon enum defs.

llvm-svn: 200470
This commit is contained in:
Tim Northover 2014-01-30 14:47:51 +00:00
parent a88f80a1be
commit c322f838bc
6 changed files with 1140 additions and 1156 deletions

View File

@ -16,10 +16,5 @@
// In libgcc
BUILTIN(__clear_cache, "vv*v*", "i")
// NEON
#define GET_NEON_AARCH64_BUILTINS
#include "clang/Basic/arm_neon.inc"
#undef GET_NEON_AARCH64_BUILTINS
#undef GET_NEON_BUILTINS
#undef BUILTIN

View File

@ -65,9 +65,4 @@ BUILTIN(__builtin_arm_sevl, "v", "")
BUILTIN(__builtin_arm_dmb, "vUi", "nc")
BUILTIN(__builtin_arm_dsb, "vUi", "nc")
// NEON
#define GET_NEON_BUILTINS
#include "clang/Basic/arm_neon.inc"
#undef GET_NEON_BUILTINS
#undef BUILTIN

View File

@ -21,10 +21,22 @@
namespace clang {
namespace NEON {
enum {
LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
#define GET_NEON_BUILTINS
#include "clang/Basic/arm_neon.inc"
#undef GET_NEON_BUILTINS
FirstTSBuiltin
};
}
/// \brief AArch64 builtins
namespace AArch64 {
enum {
LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
#include "clang/Basic/BuiltinsAArch64.def"
LastTSBuiltin
@ -34,6 +46,7 @@ namespace clang {
namespace ARM {
enum {
LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
#include "clang/Basic/BuiltinsARM.def"
LastTSBuiltin

View File

@ -3572,6 +3572,13 @@ void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
}
const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
ALL_LANGUAGES },
#define GET_NEON_BUILTINS
#include "clang/Basic/arm_neon.inc"
#undef GET_NEON_BUILTINS
#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
ALL_LANGUAGES },
@ -4213,6 +4220,13 @@ void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
}
const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
ALL_LANGUAGES },
#define GET_NEON_BUILTINS
#include "clang/Basic/arm_neon.inc"
#undef GET_NEON_BUILTINS
#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
ALL_LANGUAGES },

File diff suppressed because it is too large Load Diff

View File

@ -374,8 +374,7 @@ public:
private:
void emitIntrinsic(raw_ostream &OS, Record *R,
StringMap<ClassKind> &EmittedMap);
void genBuiltinsDef(raw_ostream &OS, StringMap<ClassKind> &A64IntrinsicMap,
bool isA64GenBuiltinDef);
void genBuiltinsDef(raw_ostream &OS);
void genOverloadTypeCheckCode(raw_ostream &OS,
StringMap<ClassKind> &A64IntrinsicMap,
bool isA64TypeCheck);
@ -3040,10 +3039,7 @@ NeonEmitter::genIntrinsicRangeCheckCode(raw_ostream &OS,
break;
}
}
if (isA64RangeCheck)
OS << "case AArch64::BI__builtin_neon_";
else
OS << "case ARM::BI__builtin_neon_";
OS << "case NEON::BI__builtin_neon_";
OS << MangleName(name, TypeVec[ti], ck) << ": i = " << immidx << "; "
<< rangestr << "; break;\n";
}
@ -3154,10 +3150,7 @@ NeonEmitter::genOverloadTypeCheckCode(raw_ostream &OS,
}
if (mask) {
if (isA64TypeCheck)
OS << "case AArch64::BI__builtin_neon_";
else
OS << "case ARM::BI__builtin_neon_";
OS << "case NEON::BI__builtin_neon_";
OS << MangleName(name, TypeVec[si], ClassB) << ": mask = "
<< "0x" << utohexstr(mask) << "ULL";
if (PtrArgNum >= 0)
@ -3167,10 +3160,7 @@ NeonEmitter::genOverloadTypeCheckCode(raw_ostream &OS,
OS << "; break;\n";
}
if (qmask) {
if (isA64TypeCheck)
OS << "case AArch64::BI__builtin_neon_";
else
OS << "case ARM::BI__builtin_neon_";
OS << "case NEON::BI__builtin_neon_";
OS << MangleName(name, TypeVec[qi], ClassB) << ": mask = "
<< "0x" << utohexstr(qmask) << "ULL";
if (PtrArgNum >= 0)
@ -3185,16 +3175,11 @@ NeonEmitter::genOverloadTypeCheckCode(raw_ostream &OS,
/// genBuiltinsDef: Generate the BuiltinsARM.def and BuiltinsAArch64.def
/// declaration of builtins, checking for unique builtin declarations.
void NeonEmitter::genBuiltinsDef(raw_ostream &OS,
StringMap<ClassKind> &A64IntrinsicMap,
bool isA64GenBuiltinDef) {
void NeonEmitter::genBuiltinsDef(raw_ostream &OS) {
std::vector<Record *> RV = Records.getAllDerivedDefinitions("Inst");
StringMap<OpKind> EmittedMap;
// Generate BuiltinsARM.def and BuiltinsAArch64.def
if (isA64GenBuiltinDef)
OS << "#ifdef GET_NEON_AARCH64_BUILTINS\n";
else
// Generate BuiltinsNEON.
OS << "#ifdef GET_NEON_BUILTINS\n";
for (unsigned i = 0, e = RV.size(); i != e; ++i) {
@ -3221,21 +3206,6 @@ void NeonEmitter::genBuiltinsDef(raw_ostream &OS,
ClassKind ck = ClassMap[R->getSuperClasses()[1]];
// Do not include AArch64 BUILTIN() macros if not generating
// code for AArch64
bool isA64 = R->getValueAsBit("isA64");
if (!isA64GenBuiltinDef && isA64)
continue;
// Include ARM BUILTIN() macros in AArch64 but only if ARM intrinsics
// are not redefined in AArch64 to handle new types, e.g. "vabd" is a SIntr
// redefined in AArch64 to handle an additional 2 x f64 type.
if (isA64GenBuiltinDef && !isA64 && A64IntrinsicMap.count(Rename)) {
ClassKind &A64CK = A64IntrinsicMap[Rename];
if (A64CK == ck && ck != ClassNone)
continue;
}
for (unsigned ti = 0, te = TypeVec.size(); ti != te; ++ti) {
// Generate the declaration for this builtin, ensuring
// that each unique BUILTIN() macro appears only once in the output
@ -3279,11 +3249,8 @@ void NeonEmitter::runHeader(raw_ostream &OS) {
A64IntrinsicMap[Rename] = CK;
}
// Generate BuiltinsARM.def for ARM
genBuiltinsDef(OS, A64IntrinsicMap, false);
// Generate BuiltinsAArch64.def for AArch64
genBuiltinsDef(OS, A64IntrinsicMap, true);
// Generate shared BuiltinsXXX.def
genBuiltinsDef(OS);
// Generate ARM overloaded type checking code for SemaChecking.cpp
genOverloadTypeCheckCode(OS, A64IntrinsicMap, false);