diff --git a/clang/utils/TableGen/NeonEmitter.cpp b/clang/utils/TableGen/NeonEmitter.cpp --- a/clang/utils/TableGen/NeonEmitter.cpp +++ b/clang/utils/TableGen/NeonEmitter.cpp @@ -332,6 +332,17 @@ NeonEmitter &Emitter; std::stringstream OS; + bool isBigEndianSafe() const { + if (BigEndianSafe) + return true; + + for (const auto &T : Types){ + if (T.isVector() && T.getNumElements() > 1) + return false; + } + return true; + } + public: Intrinsic(Record *R, StringRef Name, StringRef Proto, TypeSpec OutTS, TypeSpec InTS, ClassKind CK, ListInit *Body, NeonEmitter &Emitter, @@ -1293,7 +1304,7 @@ } void Intrinsic::emitArgumentReversal() { - if (BigEndianSafe) + if (isBigEndianSafe()) return; // Reverse all vector arguments. @@ -1314,7 +1325,7 @@ } void Intrinsic::emitReturnReversal() { - if (BigEndianSafe) + if (isBigEndianSafe()) return; if (!getReturnType().isVector() || getReturnType().isVoid() || getReturnType().getNumElements() == 1) @@ -1578,7 +1589,10 @@ Intr.Dependencies.insert(&Callee); // Now create the call itself. - std::string S = CallPrefix.str() + Callee.getMangledName(true) + "("; + std::string S = ""; + if (!Callee.isBigEndianSafe()) + S += CallPrefix.str(); + S += Callee.getMangledName(true) + "("; for (unsigned I = 0; I < DI->getNumArgs() - 1; ++I) { if (I != 0) S += ", "; @@ -1889,6 +1903,11 @@ } std::string Intrinsic::generate() { + // Avoid duplicated code for big and little endian + if (isBigEndianSafe()) { + generateImpl(false, "", ""); + return OS.str(); + } // Little endian intrinsics are simple and don't require any argument // swapping. OS << "#ifdef __LITTLE_ENDIAN__\n";