Use __builtin_shufflevector to implement vget_low and vget_high intrinsics.

This was suggested by Edmund Grimley Evans in pr8411.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@123043 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bob Wilson 2011-01-07 23:40:49 +00:00
parent 70f85730b1
commit 067a16c974

View File

@ -576,9 +576,7 @@ static std::string GenOpString(OpKind op, const std::string &proto,
std::string ts = TypeString(proto[0], typestr); std::string ts = TypeString(proto[0], typestr);
std::string s; std::string s;
if (op == OpHi || op == OpLo) { if (!define) {
s = "union { " + ts + " r; double d; } u; u.d = ";
} else if (!define) {
s = "return "; s = "return ";
} }
@ -727,10 +725,12 @@ static std::string GenOpString(OpKind op, const std::string &proto,
s += ", (int64x1_t)__b, 0, 1);"; s += ", (int64x1_t)__b, 0, 1);";
break; break;
case OpHi: case OpHi:
s += "(((float64x2_t)__a)[1]);"; s += "(" + ts +
")__builtin_shufflevector((int64x2_t)__a, (int64x2_t)__a, 1);";
break; break;
case OpLo: case OpLo:
s += "(((float64x2_t)__a)[0]);"; s += "(" + ts +
")__builtin_shufflevector((int64x2_t)__a, (int64x2_t)__a, 0);";
break; break;
case OpDup: case OpDup:
s += Duplicate(nElts, typestr, "__a") + ";"; s += Duplicate(nElts, typestr, "__a") + ";";
@ -804,11 +804,6 @@ static std::string GenOpString(OpKind op, const std::string &proto,
throw "unknown OpKind!"; throw "unknown OpKind!";
break; break;
} }
if (op == OpHi || op == OpLo) {
if (!define)
s += " return";
s += " u.r;";
}
return s; return s;
} }
@ -1135,11 +1130,6 @@ void NeonEmitter::run(raw_ostream &OS) {
OS << " " << TypeString('d', TDTypeVec[i]) << ";\n"; OS << " " << TypeString('d', TDTypeVec[i]) << ";\n";
} }
OS << "\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. // Emit struct typedefs.
for (unsigned vi = 2; vi != 5; ++vi) { for (unsigned vi = 2; vi != 5; ++vi) {