summaryrefslogtreecommitdiffstats
path: root/llvm/utils/TableGen/NeonEmitter.cpp
diff options
context:
space:
mode:
authorBob Wilson <bob.wilson@apple.com>2011-01-07 23:40:49 +0000
committerBob Wilson <bob.wilson@apple.com>2011-01-07 23:40:49 +0000
commit006089b761d0b92c2ce5a5f14ebe2b34a053b8b4 (patch)
tree8bba37a3f472050ebd01b2a1dfef140720b6290a /llvm/utils/TableGen/NeonEmitter.cpp
parent3fa9c064c2b7235136456750812aabfc52a595c6 (diff)
downloadbcm5719-llvm-006089b761d0b92c2ce5a5f14ebe2b34a053b8b4.tar.gz
bcm5719-llvm-006089b761d0b92c2ce5a5f14ebe2b34a053b8b4.zip
Use __builtin_shufflevector to implement vget_low and vget_high intrinsics.
This was suggested by Edmund Grimley Evans in pr8411. llvm-svn: 123043
Diffstat (limited to 'llvm/utils/TableGen/NeonEmitter.cpp')
-rw-r--r--llvm/utils/TableGen/NeonEmitter.cpp20
1 files changed, 5 insertions, 15 deletions
diff --git a/llvm/utils/TableGen/NeonEmitter.cpp b/llvm/utils/TableGen/NeonEmitter.cpp
index d019f1cada3..64224d9e51d 100644
--- a/llvm/utils/TableGen/NeonEmitter.cpp
+++ b/llvm/utils/TableGen/NeonEmitter.cpp
@@ -576,9 +576,7 @@ static std::string GenOpString(OpKind op, const std::string &proto,
std::string ts = TypeString(proto[0], typestr);
std::string s;
- if (op == OpHi || op == OpLo) {
- s = "union { " + ts + " r; double d; } u; u.d = ";
- } else if (!define) {
+ if (!define) {
s = "return ";
}
@@ -727,10 +725,12 @@ static std::string GenOpString(OpKind op, const std::string &proto,
s += ", (int64x1_t)__b, 0, 1);";
break;
case OpHi:
- s += "(((float64x2_t)__a)[1]);";
+ s += "(" + ts +
+ ")__builtin_shufflevector((int64x2_t)__a, (int64x2_t)__a, 1);";
break;
case OpLo:
- s += "(((float64x2_t)__a)[0]);";
+ s += "(" + ts +
+ ")__builtin_shufflevector((int64x2_t)__a, (int64x2_t)__a, 0);";
break;
case OpDup:
s += Duplicate(nElts, typestr, "__a") + ";";
@@ -804,11 +804,6 @@ static std::string GenOpString(OpKind op, const std::string &proto,
throw "unknown OpKind!";
break;
}
- if (op == OpHi || op == OpLo) {
- if (!define)
- s += " return";
- s += " u.r;";
- }
return s;
}
@@ -1135,11 +1130,6 @@ void NeonEmitter::run(raw_ostream &OS) {
OS << " " << TypeString('d', TDTypeVec[i]) << ";\n";
}
OS << "\n";
- OS << "typedef __attribute__((__vector_size__(8))) "
- "double float64x1_t;\n";
- OS << "typedef __attribute__((__vector_size__(16))) "
- "double float64x2_t;\n";
- OS << "\n";
// Emit struct typedefs.
for (unsigned vi = 2; vi != 5; ++vi) {
OpenPOWER on IntegriCloud