From: Bob Wilson Date: Thu, 31 Mar 2011 00:09:35 +0000 (+0000) Subject: Use intrinsics for Neon vmull operations. Radar 9208957. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=bbe7c653904a8a62e1549e76708491553188a97a;p=oota-llvm.git Use intrinsics for Neon vmull operations. Radar 9208957. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128591 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/utils/TableGen/NeonEmitter.cpp b/utils/TableGen/NeonEmitter.cpp index 64224d9e51d..d522c7967ae 100644 --- a/utils/TableGen/NeonEmitter.cpp +++ b/utils/TableGen/NeonEmitter.cpp @@ -608,16 +608,9 @@ static std::string GenOpString(OpKind op, const std::string &proto, case OpMul: s += "__a * __b;"; break; - case OpMullN: - s += Extend(typestr, "__a") + " * " + - Extend(typestr, Duplicate(nElts << (int)quad, typestr, "__b")) + ";"; - break; case OpMullLane: - s += Extend(typestr, "__a") + " * " + - Extend(typestr, SplatLane(nElts, "__b", "__c")) + ";"; - break; - case OpMull: - s += Extend(typestr, "__a") + " * " + Extend(typestr, "__b") + ";"; + s += MangleName("vmull", typestr, ClassS) + "(__a, " + + SplatLane(nElts, "__b", "__c") + ");"; break; case OpMlaN: s += "__a + (__b * " + Duplicate(nElts, typestr, "__c") + ");"; @@ -629,16 +622,15 @@ static std::string GenOpString(OpKind op, const std::string &proto, s += "__a + (__b * __c);"; break; case OpMlalN: - s += "__a + (" + Extend(typestr, "__b") + " * " + - Extend(typestr, Duplicate(nElts, typestr, "__c")) + ");"; + s += "__a + " + MangleName("vmull", typestr, ClassS) + "(__b, " + + Duplicate(nElts, typestr, "__c") + ");"; break; case OpMlalLane: - s += "__a + (" + Extend(typestr, "__b") + " * " + - Extend(typestr, SplatLane(nElts, "__c", "__d")) + ");"; + s += "__a + " + MangleName("vmull", typestr, ClassS) + "(__b, " + + SplatLane(nElts, "__c", "__d") + ");"; break; case OpMlal: - s += "__a + (" + Extend(typestr, "__b") + " * " + - Extend(typestr, "__c") + ");"; + s += "__a + " + MangleName("vmull", typestr, ClassS) + "(__b, __c);"; break; case OpMlsN: s += "__a - (__b * " + Duplicate(nElts, typestr, "__c") + ");"; @@ -650,16 +642,15 @@ static std::string GenOpString(OpKind op, const std::string &proto, s += "__a - (__b * __c);"; break; case OpMlslN: - s += "__a - (" + Extend(typestr, "__b") + " * " + - Extend(typestr, Duplicate(nElts, typestr, "__c")) + ");"; + s += "__a - " + MangleName("vmull", typestr, ClassS) + "(__b, " + + Duplicate(nElts, typestr, "__c") + ");"; break; case OpMlslLane: - s += "__a - (" + Extend(typestr, "__b") + " * " + - Extend(typestr, SplatLane(nElts, "__c", "__d")) + ");"; + s += "__a - " + MangleName("vmull", typestr, ClassS) + "(__b, " + + SplatLane(nElts, "__c", "__d") + ");"; break; case OpMlsl: - s += "__a - (" + Extend(typestr, "__b") + " * " + - Extend(typestr, "__c") + ");"; + s += "__a - " + MangleName("vmull", typestr, ClassS) + "(__b, __c);"; break; case OpQDMullLane: s += MangleName("vqdmull", typestr, ClassS) + "(__a, " + @@ -1148,17 +1139,20 @@ void NeonEmitter::run(raw_ostream &OS) { std::vector RV = Records.getAllDerivedDefinitions("Inst"); - // Emit vmovl and vabd intrinsics first so they can be used by other + // Emit vmovl, vmull and vabd intrinsics first so they can be used by other // 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("VMULL")); emitIntrinsic(OS, Records.getDef("VABD")); for (unsigned i = 0, e = RV.size(); i != e; ++i) { Record *R = RV[i]; - if (R->getName() != "VMOVL" && R->getName() != "VABD") + if (R->getName() != "VMOVL" && + R->getName() != "VMULL" && + R->getName() != "VABD") emitIntrinsic(OS, R); } diff --git a/utils/TableGen/NeonEmitter.h b/utils/TableGen/NeonEmitter.h index 1e6fcbf555d..12e4e867990 100644 --- a/utils/TableGen/NeonEmitter.h +++ b/utils/TableGen/NeonEmitter.h @@ -30,13 +30,11 @@ enum OpKind { OpSubl, OpSubw, OpMul, - OpMull, OpMla, OpMlal, OpMls, OpMlsl, OpMulN, - OpMullN, OpMlaN, OpMlsN, OpMlalN, @@ -105,13 +103,11 @@ namespace llvm { OpMap["OP_SUBL"] = OpSubl; OpMap["OP_SUBW"] = OpSubw; OpMap["OP_MUL"] = OpMul; - OpMap["OP_MULL"] = OpMull; OpMap["OP_MLA"] = OpMla; OpMap["OP_MLAL"] = OpMlal; OpMap["OP_MLS"] = OpMls; OpMap["OP_MLSL"] = OpMlsl; OpMap["OP_MUL_N"] = OpMulN; - OpMap["OP_MULL_N"]= OpMullN; OpMap["OP_MLA_N"] = OpMlaN; OpMap["OP_MLS_N"] = OpMlsN; OpMap["OP_MLAL_N"] = OpMlalN;