Index: utils/TableGen/NeonEmitter.cpp =================================================================== --- utils/TableGen/NeonEmitter.cpp +++ 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) @@ -1889,6 +1900,11 @@ } std::string Intrinsic::generate() { + // Avoid duplicated code for big and small endians + if (isBigEndianSafe()) { + generateImpl(false, "", ""); + return OS.str(); + } // Little endian intrinsics are simple and don't require any argument // swapping. OS << "#ifdef __LITTLE_ENDIAN__\n";