Implement AArch64 Neon instruction set Perm.
llvm-svn: 194124
This commit is contained in:
parent
f4226f1d7b
commit
c628af66c7
|
@ -59,6 +59,12 @@ def OP_QDMULH_LN : Op;
|
|||
def OP_QRDMULH_LN : Op;
|
||||
def OP_FMS_LN : Op;
|
||||
def OP_FMS_LNQ : Op;
|
||||
def OP_TRN1 : Op;
|
||||
def OP_ZIP1 : Op;
|
||||
def OP_UZP1 : Op;
|
||||
def OP_TRN2 : Op;
|
||||
def OP_ZIP2 : Op;
|
||||
def OP_UZP2 : Op;
|
||||
def OP_EQ : Op;
|
||||
def OP_GE : Op;
|
||||
def OP_LE : Op;
|
||||
|
@ -792,6 +798,21 @@ def SHA256H : SInst<"vsha256h", "dddd", "QUi">;
|
|||
def SHA256H2 : SInst<"vsha256h2", "dddd", "QUi">;
|
||||
def SHA256SU1 : SInst<"vsha256su1", "dddd", "QUi">;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Permutation
|
||||
def VTRN1 : SOpInst<"vtrn1", "ddd",
|
||||
"csiUcUsUifPcPsQcQsQiQlQUcQUsQUiQUlQfQdQPcQPs", OP_TRN1>;
|
||||
def VZIP1 : SOpInst<"vzip1", "ddd",
|
||||
"csiUcUsUifPcPsQcQsQiQlQUcQUsQUiQUlQfQdQPcQPs", OP_ZIP1>;
|
||||
def VUZP1 : SOpInst<"vuzp1", "ddd",
|
||||
"csiUcUsUifPcPsQcQsQiQlQUcQUsQUiQUlQfQdQPcQPs", OP_UZP1>;
|
||||
def VTRN2 : SOpInst<"vtrn2", "ddd",
|
||||
"csiUcUsUifPcPsQcQsQiQlQUcQUsQUiQUlQfQdQPcQPs", OP_TRN2>;
|
||||
def VZIP2 : SOpInst<"vzip2", "ddd",
|
||||
"csiUcUsUifPcPsQcQsQiQlQUcQUsQUiQUlQfQdQPcQPs", OP_ZIP2>;
|
||||
def VUZP2 : SOpInst<"vuzp2", "ddd",
|
||||
"csiUcUsUifPcPsQcQsQiQlQUcQUsQUiQUlQfQdQPcQPs", OP_UZP2>;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Scalar Arithmetic
|
||||
|
||||
|
|
|
@ -2497,6 +2497,18 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
|
|||
// AArch64 builtins mapping to legacy ARM v7 builtins.
|
||||
// FIXME: the mapped builtins listed correspond to what has been tested
|
||||
// in aarch64-neon-intrinsics.c so far.
|
||||
case AArch64::BI__builtin_neon_vuzp_v:
|
||||
return EmitARMBuiltinExpr(ARM::BI__builtin_neon_vuzp_v, E);
|
||||
case AArch64::BI__builtin_neon_vuzpq_v:
|
||||
return EmitARMBuiltinExpr(ARM::BI__builtin_neon_vuzpq_v, E);
|
||||
case AArch64::BI__builtin_neon_vzip_v:
|
||||
return EmitARMBuiltinExpr(ARM::BI__builtin_neon_vzip_v, E);
|
||||
case AArch64::BI__builtin_neon_vzipq_v:
|
||||
return EmitARMBuiltinExpr(ARM::BI__builtin_neon_vzipq_v, E);
|
||||
case AArch64::BI__builtin_neon_vtrn_v:
|
||||
return EmitARMBuiltinExpr(ARM::BI__builtin_neon_vtrn_v, E);
|
||||
case AArch64::BI__builtin_neon_vtrnq_v:
|
||||
return EmitARMBuiltinExpr(ARM::BI__builtin_neon_vtrnq_v, E);
|
||||
case AArch64::BI__builtin_neon_vext_v:
|
||||
return EmitARMBuiltinExpr(ARM::BI__builtin_neon_vext_v, E);
|
||||
case AArch64::BI__builtin_neon_vextq_v:
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -81,6 +81,12 @@ enum OpKind {
|
|||
OpQRDMulhLane,
|
||||
OpFMSLane,
|
||||
OpFMSLaneQ,
|
||||
OpTrn1,
|
||||
OpZip1,
|
||||
OpUzp1,
|
||||
OpTrn2,
|
||||
OpZip2,
|
||||
OpUzp2,
|
||||
OpEq,
|
||||
OpGe,
|
||||
OpLe,
|
||||
|
@ -228,6 +234,12 @@ public:
|
|||
OpMap["OP_QRDMULH_LN"] = OpQRDMulhLane;
|
||||
OpMap["OP_FMS_LN"] = OpFMSLane;
|
||||
OpMap["OP_FMS_LNQ"] = OpFMSLaneQ;
|
||||
OpMap["OP_TRN1"] = OpTrn1;
|
||||
OpMap["OP_ZIP1"] = OpZip1;
|
||||
OpMap["OP_UZP1"] = OpUzp1;
|
||||
OpMap["OP_TRN2"] = OpTrn2;
|
||||
OpMap["OP_ZIP2"] = OpZip2;
|
||||
OpMap["OP_UZP2"] = OpUzp2;
|
||||
OpMap["OP_EQ"] = OpEq;
|
||||
OpMap["OP_GE"] = OpGe;
|
||||
OpMap["OP_LE"] = OpLe;
|
||||
|
@ -1776,6 +1788,42 @@ static std::string GenOpString(const std::string &name, OpKind op,
|
|||
s += ");";
|
||||
break;
|
||||
}
|
||||
case OpUzp1:
|
||||
s += "__builtin_shufflevector(__a, __b";
|
||||
for (unsigned i = 0; i < nElts; i++)
|
||||
s += ", " + utostr(2*i);
|
||||
s += ");";
|
||||
break;
|
||||
case OpUzp2:
|
||||
s += "__builtin_shufflevector(__a, __b";
|
||||
for (unsigned i = 0; i < nElts; i++)
|
||||
s += ", " + utostr(2*i+1);
|
||||
s += ");";
|
||||
break;
|
||||
case OpZip1:
|
||||
s += "__builtin_shufflevector(__a, __b";
|
||||
for (unsigned i = 0; i < (nElts/2); i++)
|
||||
s += ", " + utostr(i) + ", " + utostr(i+nElts);
|
||||
s += ");";
|
||||
break;
|
||||
case OpZip2:
|
||||
s += "__builtin_shufflevector(__a, __b";
|
||||
for (unsigned i = nElts/2; i < nElts; i++)
|
||||
s += ", " + utostr(i) + ", " + utostr(i+nElts);
|
||||
s += ");";
|
||||
break;
|
||||
case OpTrn1:
|
||||
s += "__builtin_shufflevector(__a, __b";
|
||||
for (unsigned i = 0; i < (nElts/2); i++)
|
||||
s += ", " + utostr(2*i) + ", " + utostr(2*i+nElts);
|
||||
s += ");";
|
||||
break;
|
||||
case OpTrn2:
|
||||
s += "__builtin_shufflevector(__a, __b";
|
||||
for (unsigned i = 0; i < (nElts/2); i++)
|
||||
s += ", " + utostr(2*i+1) + ", " + utostr(2*i+1+nElts);
|
||||
s += ");";
|
||||
break;
|
||||
case OpAbdl: {
|
||||
std::string abd = MangleName("vabd", typestr, ClassS) + "(__a, __b)";
|
||||
if (typestr[0] != 'U') {
|
||||
|
|
Loading…
Reference in New Issue