mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-09-30 04:56:49 +00:00
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:
parent
70f85730b1
commit
067a16c974
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user