Add operators for "_lane" variants of some saturating Neon multiply intrinsics

so they can be implemented without separate clang builtins.

llvm-svn: 121299
This commit is contained in:
Bob Wilson 2010-12-08 22:36:08 +00:00
parent 13c16125f1
commit 8c693a934a
2 changed files with 34 additions and 2 deletions

View File

@ -660,6 +660,26 @@ static std::string GenOpString(OpKind op, const std::string &proto,
s += "__a - (" + Extend(typestr, "__b") + " * " +
Extend(typestr, "__c") + ");";
break;
case OpQDMullLane:
s += MangleName("vqdmull", typestr, ClassS) + "(__a, " +
SplatLane(nElts, "__b", "__c") + ");";
break;
case OpQDMlalLane:
s += MangleName("vqdmlal", typestr, ClassS) + "(__a, " +
SplatLane(nElts, "__b", "__c") + ");";
break;
case OpQDMlslLane:
s += MangleName("vqdmlsl", typestr, ClassS) + "(__a, " +
SplatLane(nElts, "__b", "__c") + ");";
break;
case OpQDMulhLane:
s += MangleName("vqdmulh", typestr, ClassS) + "(__a, " +
SplatLane(nElts, "__b", "__c") + ");";
break;
case OpQRDMulhLane:
s += MangleName("vqrdmulh", typestr, ClassS) + "(__a, " +
SplatLane(nElts, "__b", "__c") + ");";
break;
case OpEq:
s += "(" + ts + ")(__a == __b);";
break;
@ -1103,11 +1123,13 @@ void NeonEmitter::run(raw_ostream &OS) {
std::vector<Record*> RV = Records.getAllDerivedDefinitions("Inst");
// Emit vmovl and vabd intrinsics first so they can be used by other
// intrinsics.
// intrinsics. (Some of the saturating multiply instructions are also
// used to implement the corresponding "_lane" variants, but tablegen
// sorts the records into alphabetical order so that the "_lane" variants
// come after the intrinsics they use.)
emitIntrinsic(OS, Records.getDef("VMOVL"));
emitIntrinsic(OS, Records.getDef("VABD"));
// Unique the return+pattern types, and assign them.
for (unsigned i = 0, e = RV.size(); i != e; ++i) {
Record *R = RV[i];
if (R->getName() != "VMOVL" && R->getName() != "VABD")

View File

@ -47,6 +47,11 @@ enum OpKind {
OpMlsLane,
OpMlalLane,
OpMlslLane,
OpQDMullLane,
OpQDMlalLane,
OpQDMlslLane,
OpQDMulhLane,
OpQRDMulhLane,
OpEq,
OpGe,
OpLe,
@ -117,6 +122,11 @@ namespace llvm {
OpMap["OP_MLS_LN"]= OpMlsLane;
OpMap["OP_MLAL_LN"] = OpMlalLane;
OpMap["OP_MLSL_LN"] = OpMlslLane;
OpMap["OP_QDMULL_LN"] = OpQDMullLane;
OpMap["OP_QDMLAL_LN"] = OpQDMlalLane;
OpMap["OP_QDMLSL_LN"] = OpQDMlslLane;
OpMap["OP_QDMULH_LN"] = OpQDMulhLane;
OpMap["OP_QRDMULH_LN"] = OpQRDMulhLane;
OpMap["OP_EQ"] = OpEq;
OpMap["OP_GE"] = OpGe;
OpMap["OP_LE"] = OpLe;