[llvm] [ISel] Introduce `llvm.pext` and `llvm.pdep` intrinsics (PR #200570)
Jan Schultke via llvm-commits
llvm-commits at lists.llvm.org
Sun May 31 21:57:10 PDT 2026
https://github.com/eisenwave updated https://github.com/llvm/llvm-project/pull/200570
>From 06a292d18009f793df7df7ee807b0ecef7d4a47d Mon Sep 17 00:00:00 2001
From: Eisenwave <me at eisenwave.net>
Date: Sat, 30 May 2026 14:38:37 +0200
Subject: [PATCH 1/6] [ISel] Introduce llvm.bext and llvm.bdep intrinsics
These are portable forms of the x86_64 pext/pdep or AArch64 bext/bdep instructions.
---
llvm/docs/LangRef.rst | 96 +
llvm/include/llvm/CodeGen/ISDOpcodes.h | 4 +
llvm/include/llvm/CodeGen/TargetLowering.h | 10 +
llvm/include/llvm/IR/Intrinsics.td | 4 +
llvm/include/llvm/Support/KnownBits.h | 6 +
llvm/lib/Analysis/ValueTracking.cpp | 12 +
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 40 +
llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 14 +
.../SelectionDAG/LegalizeIntegerTypes.cpp | 50 +
llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h | 4 +
.../SelectionDAG/LegalizeVectorOps.cpp | 6 +
.../SelectionDAG/LegalizeVectorTypes.cpp | 6 +
.../lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 16 +
.../SelectionDAG/SelectionDAGBuilder.cpp | 12 +
.../SelectionDAG/SelectionDAGDumper.cpp | 2 +
.../CodeGen/SelectionDAG/TargetLowering.cpp | 75 +
llvm/lib/CodeGen/TargetLoweringBase.cpp | 3 +
llvm/lib/Support/KnownBits.cpp | 65 +
.../Target/AArch64/AArch64ISelLowering.cpp | 45 +
llvm/lib/Target/X86/X86ISelLowering.cpp | 20 +
.../ValueTracking/knownbits-bextbdep.ll | 96 +
llvm/test/CodeGen/AArch64/bext-bdep.ll | 4057 ++++++++++++++++
llvm/test/CodeGen/X86/bext-bdep.ll | 4123 +++++++++++++++++
llvm/unittests/Support/KnownBitsTest.cpp | 2 +
24 files changed, 8768 insertions(+)
create mode 100644 llvm/test/Analysis/ValueTracking/knownbits-bextbdep.ll
create mode 100644 llvm/test/CodeGen/AArch64/bext-bdep.ll
create mode 100644 llvm/test/CodeGen/X86/bext-bdep.ll
diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst
index 7ce73cd64c462..7329f02b582c9 100644
--- a/llvm/docs/LangRef.rst
+++ b/llvm/docs/LangRef.rst
@@ -19242,6 +19242,102 @@ Example:
%r = call i4 @llvm.clmul.i4(i4 -4, i4 2) ; %r = -8
%r = call i4 @llvm.clmul.i4(i4 -4, i4 -5) ; %r = 4
+.. _int_bext:
+
+'``llvm.bext.*``' Intrinsic
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Syntax:
+"""""""
+
+This is an overloaded intrinsic. You can use ``llvm.bext`` on any integer
+or integer vector type.
+
+::
+
+ declare i32 @llvm.bext.i32(i32 %val, i32 %mask)
+ declare i64 @llvm.bext.i64(i64 %val, i64 %mask)
+ declare <4 x i32> @llvm.bext.v4i32(<4 x i32> %val, <4 x i32> %mask)
+
+Overview:
+"""""""""
+
+The '``llvm.bext``' family of intrinsic functions extracts the bits from ``val``
+where the ``mask`` has bits set and packs them contiguously in the low bits
+of the result, same as the x86 ``PEXT`` instruction.
+
+Arguments:
+""""""""""
+
+The arguments may be any integer type or vector of integer type. Both
+arguments and result must have the same type.
+
+Semantics:
+""""""""""
+
+The '``llvm.bext``' intrinsic extracts bits from the first argument
+``val`` at the positions indicated by set bits in ``mask``, and packs
+them contiguously into the low bits of the result. The remaining high
+bits of the result are zero.
+
+Equivalently, if the set bit positions in ``mask`` (from LSB to MSB)
+are ``p0, p1, ..., pk``, then the result bit ``i`` equals bit ``pi``
+of ``val``.
+
+.. code-block:: text
+
+ %r = call i8 @llvm.bext.i8(i8 0b10101010, i8 0b11001100) ; %r = 0b00001010
+ %r = call i8 @llvm.bext.i8(i8 0b11111111, i8 0b10101010) ; %r = 0b00001111
+
+.. _int_bdep:
+
+'``llvm.bdep.*``' Intrinsic
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Syntax:
+"""""""
+
+This is an overloaded intrinsic. You can use ``llvm.bdep`` on any integer or
+integer vector type.
+
+::
+
+ declare i32 @llvm.bdep.i32(i32 %val, i32 %mask)
+ declare i64 @llvm.bdep.i64(i64 %val, i64 %mask)
+ declare <4 x i32> @llvm.bdep.v4i32(<4 x i32> %val, <4 x i32> %mask)
+
+Overview:
+"""""""""
+
+The '``llvm.bdep``' family of intrinsic functions deposits the low bits of
+``val`` into the result at the positions where ``mask`` has bits set, same as
+the x86 ``PDEP`` instruction.
+
+Arguments:
+""""""""""
+
+The arguments may be any integer type or vector of integer type. Both
+arguments and result must have the same type.
+
+Semantics:
+""""""""""
+
+The '``llvm.bdep``' intrinsic takes the low bits of the first argument
+``val`` and scatters them to the bit positions in the result indicated by
+set bits in ``mask``. Bits in the result at positions where ``mask`` is
+zero are zero.
+
+Equivalently, if the set bit positions in ``mask`` (from LSB to MSB) are
+``p0, p1, ..., pk``, then result bit ``pi`` equals bit ``i`` of ``val``.
+
+The operations satisfy the round-trip identity:
+``bdep(bext(val, mask), mask) == val & mask``.
+
+.. code-block:: text
+
+ %r = call i8 @llvm.bdep.i8(i8 0b00001010, i8 0b11001100) ; %r = 0b10001000
+ %r = call i8 @llvm.bdep.i8(i8 0b00001111, i8 0b10101010) ; %r = 0b10101010
+
.. _int_overflow:
Arithmetic with Overflow Intrinsics
diff --git a/llvm/include/llvm/CodeGen/ISDOpcodes.h b/llvm/include/llvm/CodeGen/ISDOpcodes.h
index 11099df775e38..ce6423a2e2726 100644
--- a/llvm/include/llvm/CodeGen/ISDOpcodes.h
+++ b/llvm/include/llvm/CodeGen/ISDOpcodes.h
@@ -779,6 +779,10 @@ enum NodeType {
CLMULR,
CLMULH,
+ /// Bit extract (compress) and bit deposit (expand).
+ BEXT,
+ BDEP,
+
/// Byte Swap and Counting operators.
BSWAP,
CTTZ,
diff --git a/llvm/include/llvm/CodeGen/TargetLowering.h b/llvm/include/llvm/CodeGen/TargetLowering.h
index 82c47cce0f522..d40ed5eb35e75 100644
--- a/llvm/include/llvm/CodeGen/TargetLowering.h
+++ b/llvm/include/llvm/CodeGen/TargetLowering.h
@@ -5572,6 +5572,16 @@ class LLVM_ABI TargetLowering : public TargetLoweringBase {
/// \returns The expansion if successful, SDValue() otherwise
SDValue expandCLMUL(SDNode *N, SelectionDAG &DAG) const;
+ /// Expand bit extract (compress).
+ /// \param N Node to expand
+ /// \returns The expansion if successful, SDValue() otherwise
+ SDValue expandBEXT(SDNode *N, SelectionDAG &DAG) const;
+
+ /// Expand bit deposit (expand).
+ /// \param N Node to expand
+ /// \returns The expansion if successful, SDValue() otherwise
+ SDValue expandBDEP(SDNode *N, SelectionDAG &DAG) const;
+
/// Expand rotations.
/// \param N Node to expand
/// \param AllowVectorOps expand vector rotate, this should only be performed
diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td
index 3c4e741574661..5aa34361a0987 100644
--- a/llvm/include/llvm/IR/Intrinsics.td
+++ b/llvm/include/llvm/IR/Intrinsics.td
@@ -1523,6 +1523,10 @@ let IntrProperties = [IntrNoMem, IntrSpeculatable, IntrNoCreateUndefOrPoison] in
[LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>]>;
def int_clmul : DefaultAttrsIntrinsic<[llvm_anyint_ty],
[LLVMMatchType<0>, LLVMMatchType<0>]>;
+ def int_bext : DefaultAttrsIntrinsic<[llvm_anyint_ty],
+ [LLVMMatchType<0>, LLVMMatchType<0>]>;
+ def int_bdep : DefaultAttrsIntrinsic<[llvm_anyint_ty],
+ [LLVMMatchType<0>, LLVMMatchType<0>]>;
}
let IntrProperties = [IntrNoMem, IntrSpeculatable,
diff --git a/llvm/include/llvm/Support/KnownBits.h b/llvm/include/llvm/Support/KnownBits.h
index e47383dc6b2d1..09fea9f1085ec 100644
--- a/llvm/include/llvm/Support/KnownBits.h
+++ b/llvm/include/llvm/Support/KnownBits.h
@@ -479,6 +479,12 @@ struct KnownBits {
/// Compute known bits for clmul(LHS, RHS).
LLVM_ABI static KnownBits clmul(const KnownBits &LHS, const KnownBits &RHS);
+ /// Compute known bits for bext(LHS, RHS).
+ LLVM_ABI static KnownBits bext(const KnownBits &LHS, const KnownBits &RHS);
+
+ /// Compute known bits for bdep(LHS, RHS).
+ LLVM_ABI static KnownBits bdep(const KnownBits &LHS, const KnownBits &RHS);
+
/// Determine if these known bits always give the same ICMP_EQ result.
LLVM_ABI static std::optional<bool> eq(const KnownBits &LHS,
const KnownBits &RHS);
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 3be0db5ad9c7e..5aed74d8914d0 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -2091,6 +2091,18 @@ static void computeKnownBitsFromOperator(const Operator *I,
computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
Known = KnownBits::clmul(Known, Known2);
break;
+ case Intrinsic::bext: {
+ computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
+ computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
+ Known = KnownBits::bext(Known, Known2);
+ break;
+ }
+ case Intrinsic::bdep: {
+ computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
+ computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
+ Known = KnownBits::bdep(Known, Known2);
+ break;
+ }
case Intrinsic::uadd_sat:
computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 0c9820fb64de9..b1367a8be17da 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -474,6 +474,8 @@ namespace {
SDValue visitABS(SDNode *N);
SDValue visitABS_MIN_POISON(SDNode *N);
SDValue visitCLMUL(SDNode *N);
+ SDValue visitBEXT(SDNode *N);
+ SDValue visitBDEP(SDNode *N);
SDValue visitBSWAP(SDNode *N);
SDValue visitBITREVERSE(SDNode *N);
SDValue visitCTLZ(SDNode *N);
@@ -1996,6 +1998,8 @@ SDValue DAGCombiner::visit(SDNode *N) {
case ISD::CLMUL:
case ISD::CLMULR:
case ISD::CLMULH: return visitCLMUL(N);
+ case ISD::BEXT: return visitBEXT(N);
+ case ISD::BDEP: return visitBDEP(N);
case ISD::BSWAP: return visitBSWAP(N);
case ISD::BITREVERSE: return visitBITREVERSE(N);
case ISD::CTLZ: return visitCTLZ(N);
@@ -12227,6 +12231,42 @@ SDValue DAGCombiner::visitCLMUL(SDNode *N) {
return SDValue();
}
+SDValue DAGCombiner::visitBEXT(SDNode *N) {
+ EVT VT = N->getValueType(0);
+ SDValue N0 = N->getOperand(0);
+ SDValue N1 = N->getOperand(1);
+ SDLoc DL(N);
+
+ // bext(x, 0) -> 0
+ if (isNullOrNullSplat(N1))
+ return DAG.getConstant(0, DL, VT);
+ // bext(x, -1) -> x (all bits selected, packed into low positions = x)
+ if (isAllOnesOrAllOnesSplat(N1))
+ return N0;
+ // fold bext(c1, c2) -> compressBits(c1, c2)
+ if (SDValue C = DAG.FoldConstantArithmetic(ISD::BEXT, DL, VT, {N0, N1}))
+ return C;
+ return SDValue();
+}
+
+SDValue DAGCombiner::visitBDEP(SDNode *N) {
+ EVT VT = N->getValueType(0);
+ SDValue N0 = N->getOperand(0);
+ SDValue N1 = N->getOperand(1);
+ SDLoc DL(N);
+
+ // bdep(x, 0) -> 0
+ if (isNullOrNullSplat(N1))
+ return DAG.getConstant(0, DL, VT);
+ // bdep(x, -1) -> x (all positions selected, bits deposited at identity)
+ if (isAllOnesOrAllOnesSplat(N1))
+ return N0;
+ // fold bdep(c1, c2) -> expandBits(c1, c2)
+ if (SDValue C = DAG.FoldConstantArithmetic(ISD::BDEP, DL, VT, {N0, N1}))
+ return C;
+ return SDValue();
+}
+
SDValue DAGCombiner::visitBSWAP(SDNode *N) {
SDValue N0 = N->getOperand(0);
EVT VT = N->getValueType(0);
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
index 3db2b0e8e5d5a..beaea49b0f5d8 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -4196,6 +4196,12 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
if (SDValue Expanded = TLI.expandCLMUL(Node, DAG))
Results.push_back(Expanded);
break;
+ case ISD::BEXT:
+ Results.push_back(TLI.expandBEXT(Node, DAG));
+ break;
+ case ISD::BDEP:
+ Results.push_back(TLI.expandBDEP(Node, DAG));
+ break;
case ISD::SADDSAT:
case ISD::UADDSAT:
case ISD::SSUBSAT:
@@ -5566,6 +5572,14 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, OVT, CTLZResult));
break;
}
+ case ISD::BEXT:
+ case ISD::BDEP: {
+ Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Node->getOperand(0));
+ Tmp2 = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Node->getOperand(1));
+ Tmp1 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2);
+ Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, OVT, Tmp1));
+ break;
+ }
case ISD::BITREVERSE:
case ISD::BSWAP: {
unsigned DiffBits = NVT.getSizeInBits() - OVT.getSizeInBits();
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
index 86617b6dd33de..dd166e2d3e5d2 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
@@ -370,6 +370,14 @@ void DAGTypeLegalizer::PromoteIntegerResult(SDNode *N, unsigned ResNo) {
Res = PromoteIntRes_CLMUL(N);
break;
+ case ISD::BEXT:
+ Res = PromoteIntRes_BEXT(N);
+ break;
+
+ case ISD::BDEP:
+ Res = PromoteIntRes_BDEP(N);
+ break;
+
case ISD::IS_FPCLASS:
Res = PromoteIntRes_IS_FPCLASS(N);
break;
@@ -1763,6 +1771,30 @@ SDValue DAGTypeLegalizer::PromoteIntRes_CLMUL(SDNode *N) {
DAG.getShiftAmountConstant(ShAmt, VT, DL));
}
+SDValue DAGTypeLegalizer::PromoteIntRes_BEXT(SDNode *N) {
+ SDLoc DL(N);
+ EVT VT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
+ if (!TLI.isOperationLegalOrCustomOrPromote(ISD::BEXT, VT)) {
+ if (SDValue Res = TLI.expandBEXT(N, DAG))
+ return DAG.getNode(ISD::ANY_EXTEND, DL, VT, Res);
+ }
+ SDValue X = ZExtPromotedInteger(N->getOperand(0));
+ SDValue Y = ZExtPromotedInteger(N->getOperand(1));
+ return DAG.getNode(ISD::BEXT, DL, VT, X, Y);
+}
+
+SDValue DAGTypeLegalizer::PromoteIntRes_BDEP(SDNode *N) {
+ SDLoc DL(N);
+ EVT VT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
+ if (!TLI.isOperationLegalOrCustomOrPromote(ISD::BDEP, VT)) {
+ if (SDValue Res = TLI.expandBDEP(N, DAG))
+ return DAG.getNode(ISD::ANY_EXTEND, DL, VT, Res);
+ }
+ SDValue X = ZExtPromotedInteger(N->getOperand(0));
+ SDValue Y = ZExtPromotedInteger(N->getOperand(1));
+ return DAG.getNode(ISD::BDEP, DL, VT, X, Y);
+}
+
SDValue DAGTypeLegalizer::PromoteIntRes_TRUNCATE(SDNode *N) {
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
SDValue Res;
@@ -3312,6 +3344,14 @@ void DAGTypeLegalizer::ExpandIntegerResult(SDNode *N, unsigned ResNo) {
ExpandIntRes_CLMUL(N, Lo, Hi);
break;
+ case ISD::BEXT:
+ ExpandIntRes_BEXT(N, Lo, Hi);
+ break;
+
+ case ISD::BDEP:
+ ExpandIntRes_BDEP(N, Lo, Hi);
+ break;
+
case ISD::VSCALE:
ExpandIntRes_VSCALE(N, Lo, Hi);
break;
@@ -5621,6 +5661,16 @@ void DAGTypeLegalizer::ExpandIntRes_CLMUL(SDNode *N, SDValue &Lo, SDValue &Hi) {
Hi = DAG.getNode(ISD::XOR, DL, HalfVT, LoH, HiLoCross);
}
+void DAGTypeLegalizer::ExpandIntRes_BEXT(SDNode *N, SDValue &Lo, SDValue &Hi) {
+ SDValue Res = TLI.expandBEXT(N, DAG);
+ SplitInteger(Res, Lo, Hi);
+}
+
+void DAGTypeLegalizer::ExpandIntRes_BDEP(SDNode *N, SDValue &Lo, SDValue &Hi) {
+ SDValue Res = TLI.expandBDEP(N, DAG);
+ SplitInteger(Res, Lo, Hi);
+}
+
void DAGTypeLegalizer::ExpandIntRes_VSCALE(SDNode *N, SDValue &Lo,
SDValue &Hi) {
EVT VT = N->getValueType(0);
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
index 9c37eb8065ba5..3933f05c306c8 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
@@ -359,6 +359,8 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
SDValue PromoteIntRes_FunnelShift(SDNode *N);
SDValue PromoteIntRes_VPFunnelShift(SDNode *N);
SDValue PromoteIntRes_CLMUL(SDNode *N);
+ SDValue PromoteIntRes_BEXT(SDNode *N);
+ SDValue PromoteIntRes_BDEP(SDNode *N);
SDValue PromoteIntRes_IS_FPCLASS(SDNode *N);
SDValue PromoteIntRes_PATCHPOINT(SDNode *N);
SDValue PromoteIntRes_READ_REGISTER(SDNode *N);
@@ -502,6 +504,8 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
void ExpandIntRes_Rotate (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandIntRes_FunnelShift (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandIntRes_CLMUL(SDNode *N, SDValue &Lo, SDValue &Hi);
+ void ExpandIntRes_BEXT(SDNode *N, SDValue &Lo, SDValue &Hi);
+ void ExpandIntRes_BDEP(SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandIntRes_VSCALE (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandIntRes_READ_REGISTER(SDNode *N, SDValue &Lo, SDValue &Hi);
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
index 0a78cec3062da..0fe9309898459 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
@@ -1200,6 +1200,12 @@ void VectorLegalizer::Expand(SDNode *Node, SmallVectorImpl<SDValue> &Results) {
return;
}
break;
+ case ISD::BEXT:
+ Results.push_back(TLI.expandBEXT(Node, DAG));
+ return;
+ case ISD::BDEP:
+ Results.push_back(TLI.expandBDEP(Node, DAG));
+ return;
case ISD::ROTL:
case ISD::ROTR:
if (SDValue Expanded = TLI.expandROT(Node, false /*AllowVectorOps*/, DAG)) {
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
index 02e25e5855577..d55e921e21774 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
@@ -207,6 +207,8 @@ void DAGTypeLegalizer::ScalarizeVectorResult(SDNode *N, unsigned ResNo) {
case ISD::CLMUL:
case ISD::CLMULR:
case ISD::CLMULH:
+ case ISD::BEXT:
+ case ISD::BDEP:
R = ScalarizeVecRes_BinOp(N);
break;
@@ -1518,6 +1520,8 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode *N, unsigned ResNo) {
case ISD::CLMUL:
case ISD::CLMULR:
case ISD::CLMULH:
+ case ISD::BEXT:
+ case ISD::BDEP:
case ISD::MULHS:
case ISD::MULHU:
case ISD::ABDS:
@@ -5205,6 +5209,8 @@ void DAGTypeLegalizer::WidenVectorResult(SDNode *N, unsigned ResNo) {
case ISD::CLMUL:
case ISD::CLMULR:
case ISD::CLMULH:
+ case ISD::BEXT:
+ case ISD::BDEP:
case ISD::FMINNUM:
case ISD::FMINNUM_IEEE:
case ISD::VP_FMINNUM:
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 75d550801315b..c644206d6232c 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -3958,6 +3958,18 @@ KnownBits SelectionDAG::computeKnownBits(SDValue Op, const APInt &DemandedElts,
Known = KnownBits::clmul(Known, Known2);
break;
}
+ case ISD::BEXT: {
+ Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
+ Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
+ Known = KnownBits::bext(Known, Known2);
+ break;
+ }
+ case ISD::BDEP: {
+ Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
+ Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
+ Known = KnownBits::bdep(Known, Known2);
+ break;
+ }
case ISD::MGATHER:
case ISD::MLOAD: {
ISD::LoadExtType ETy =
@@ -7449,6 +7461,10 @@ static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
return APIntOps::clmulr(C1, C2);
case ISD::CLMULH:
return APIntOps::clmulh(C1, C2);
+ case ISD::BEXT:
+ return APIntOps::compressBits(C1, C2);
+ case ISD::BDEP:
+ return APIntOps::expandBits(C1, C2);
}
return std::nullopt;
}
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index 20b1f9d32ace5..f31c1da3dcb8f 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -7410,6 +7410,18 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
setValue(&I, DAG.getNode(ISD::CLMUL, sdl, X.getValueType(), X, Y));
return;
}
+ case Intrinsic::bext: {
+ SDValue X = getValue(I.getArgOperand(0));
+ SDValue Y = getValue(I.getArgOperand(1));
+ setValue(&I, DAG.getNode(ISD::BEXT, sdl, X.getValueType(), X, Y));
+ return;
+ }
+ case Intrinsic::bdep: {
+ SDValue X = getValue(I.getArgOperand(0));
+ SDValue Y = getValue(I.getArgOperand(1));
+ setValue(&I, DAG.getNode(ISD::BDEP, sdl, X.getValueType(), X, Y));
+ return;
+ }
case Intrinsic::sadd_sat: {
SDValue Op1 = getValue(I.getArgOperand(0));
SDValue Op2 = getValue(I.getArgOperand(1));
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
index 7b500fc863b72..82696812b4bfc 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
@@ -307,6 +307,8 @@ std::string SDNode::getOperationName(const SelectionDAG *G) const {
case ISD::CLMUL: return "clmul";
case ISD::CLMULR: return "clmulr";
case ISD::CLMULH: return "clmulh";
+ case ISD::BEXT: return "bext";
+ case ISD::BDEP: return "bdep";
case ISD::FADD: return "fadd";
case ISD::STRICT_FADD: return "strict_fadd";
case ISD::FSUB: return "fsub";
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 48fe1eed9093f..bcccb2e262c71 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -8962,6 +8962,81 @@ SDValue TargetLowering::expandCLMUL(SDNode *Node, SelectionDAG &DAG) const {
llvm_unreachable("Expected CLMUL, CLMULR, or CLMULH");
}
+SDValue TargetLowering::expandBEXT(SDNode *Node, SelectionDAG &DAG) const {
+ SDLoc DL(Node);
+ EVT VT = Node->getValueType(0);
+ SDValue Val = Node->getOperand(0);
+ SDValue Msk = Node->getOperand(1);
+ unsigned BW = VT.getScalarSizeInBits();
+
+ // Hacker's Delight §7-4: Compress, or Generalized Extract
+ SDValue X = DAG.getNode(ISD::AND, DL, VT, Val, Msk);
+ SDValue M = Msk;
+ SDValue One = DAG.getShiftAmountConstant(1, VT, DL);
+ SDValue Mk = DAG.getNode(ISD::SHL, DL, VT, DAG.getNOT(DL, M, VT), One);
+
+ // Repeatedly compute which bits would shift to the right by an odd amount,
+ // shift all such bits in parallel using a mask, and double the shift amount.
+ for (unsigned I = 1; I < BW; I <<= 1) {
+ // This expands the "parallel prefix" operation to clmul(Mk, ~0).
+ SDValue Mp = DAG.getNode(ISD::CLMUL, DL, VT, Mk,
+ DAG.getAllOnesConstant(DL, VT));
+ SDValue Mv = DAG.getNode(ISD::AND, DL, VT, Mp, M);
+ SDValue ShiftI = DAG.getShiftAmountConstant(I, VT, DL);
+ M = DAG.getNode(ISD::OR, DL, VT, DAG.getNode(ISD::XOR, DL, VT, M, Mv),
+ DAG.getNode(ISD::SRL, DL, VT, Mv, ShiftI));
+ SDValue T = DAG.getNode(ISD::AND, DL, VT, X, Mv);
+ X = DAG.getNode(ISD::OR, DL, VT, DAG.getNode(ISD::XOR, DL, VT, X, T),
+ DAG.getNode(ISD::SRL, DL, VT, T, ShiftI));
+ Mk = DAG.getNode(ISD::AND, DL, VT, Mk, DAG.getNOT(DL, Mp, VT));
+ }
+
+ return X;
+}
+
+SDValue TargetLowering::expandBDEP(SDNode *Node, SelectionDAG &DAG) const {
+ SDLoc DL(Node);
+ EVT VT = Node->getValueType(0);
+ SDValue Val = Node->getOperand(0);
+ SDValue Msk = Node->getOperand(1);
+ unsigned BW = VT.getScalarSizeInBits();
+
+ // Hacker's Delight §7-5: Expand, or Generalized Insert.
+ unsigned LogBW = Log2_32_Ceil(BW);
+ SmallVector<SDValue, 8> MvArray(LogBW);
+ SDValue One = DAG.getShiftAmountConstant(1, VT, DL);
+ SDValue Mc = Msk;
+ SDValue Mk = DAG.getNode(ISD::SHL, DL, VT, DAG.getNOT(DL, Msk, VT), One);
+
+ // First pass: compute move masks for each power of two that a bit moves by.
+ for (unsigned S = 0; S < LogBW; ++S) {
+ unsigned ShiftS = 1u << S;
+ // This expands the "parallel prefix" operation to clmul(Mk, ~0).
+ SDValue Mp = DAG.getNode(ISD::CLMUL, DL, VT, Mk,
+ DAG.getAllOnesConstant(DL, VT));
+ MvArray[S] = DAG.getNode(ISD::AND, DL, VT, Mp, Mc);
+ SDValue ShiftSv = DAG.getShiftAmountConstant(ShiftS, VT, DL);
+ Mc = DAG.getNode(ISD::OR, DL, VT,
+ DAG.getNode(ISD::XOR, DL, VT, Mc, MvArray[S]),
+ DAG.getNode(ISD::SRL, DL, VT, MvArray[S], ShiftSv));
+ Mk = DAG.getNode(ISD::AND, DL, VT, Mk, DAG.getNOT(DL, Mp, VT));
+ }
+
+ // Second pass: move bits by 32, 16, 8, 4, 2, 1, using masks, in parallel.
+ // Each pass handles half the shift amount of the previous pass.
+ SDValue X = Val;
+ for (int S = (int)LogBW - 1; S >= 0; --S) {
+ SDValue ShiftSv = DAG.getShiftAmountConstant(1u << S, VT, DL);
+ SDValue T = DAG.getNode(ISD::SHL, DL, VT, X, ShiftSv);
+ X = DAG.getNode(
+ ISD::OR, DL, VT,
+ DAG.getNode(ISD::AND, DL, VT, X, DAG.getNOT(DL, MvArray[S], VT)),
+ DAG.getNode(ISD::AND, DL, VT, T, MvArray[S]));
+ }
+
+ return DAG.getNode(ISD::AND, DL, VT, X, Msk);
+}
+
void TargetLowering::expandShiftParts(SDNode *Node, SDValue &Lo, SDValue &Hi,
SelectionDAG &DAG) const {
assert(Node->getNumOperands() == 3 && "Not a double-shift!");
diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp
index 1f4842fb3df15..9a25af680b6ee 100644
--- a/llvm/lib/CodeGen/TargetLoweringBase.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp
@@ -1188,6 +1188,9 @@ void TargetLoweringBase::initActions() {
// Carry-less multiply
setOperationAction({ISD::CLMUL, ISD::CLMULR, ISD::CLMULH}, VT, Expand);
+ // Bit extract/deposit (compress/expand)
+ setOperationAction({ISD::BEXT, ISD::BDEP}, VT, Expand);
+
// Saturated trunc
setOperationAction(ISD::TRUNCATE_SSAT_S, VT, Expand);
setOperationAction(ISD::TRUNCATE_SSAT_U, VT, Expand);
diff --git a/llvm/lib/Support/KnownBits.cpp b/llvm/lib/Support/KnownBits.cpp
index b1b985b80cffd..27a379fb49301 100644
--- a/llvm/lib/Support/KnownBits.cpp
+++ b/llvm/lib/Support/KnownBits.cpp
@@ -642,6 +642,71 @@ KnownBits KnownBits::clmul(const KnownBits &LHS, const KnownBits &RHS) {
return Res;
}
+KnownBits KnownBits::bext(const KnownBits &LHS, const KnownBits &RHS) {
+ // For each source position I where mask[I] could be set, the output index j
+ // lies in [M0, M1] where these track the range of possible set-bit counts
+ // seen so far in mask.
+ //
+ // The output bit j
+ // - can be 0 if any candidate LHS[I] could be zero or popcount(mask) could
+ // be <= j, and
+ // - can be 1 only if some candidate LHS[I] could be one and popcount(mask)
+ // is known > j.
+ unsigned BitWidth = LHS.getBitWidth();
+ KnownBits Res(BitWidth);
+ Res.setAllConflict();
+
+ unsigned M0 = 0, M1 = 0;
+ for (unsigned I = 0; I < BitWidth; ++I) {
+ if (!RHS.Zero[I]) {
+ APInt Range = APInt::getBitsSet(BitWidth, M0, M1 + 1);
+ if (!LHS.Zero[I])
+ Res.Zero &= ~Range; // some position in Range could be 1
+ if (!LHS.One[I])
+ Res.One &= ~Range; // some position in Range could be 0
+ }
+ if (RHS.One[I])
+ ++M0, ++M1;
+ else if (!RHS.Zero[I])
+ ++M1;
+ }
+
+ // Output positions j >= M0 may have no source (popcount(mask) <= j), in
+ // which case they default to zero.
+ Res.One &= APInt::getLowBitsSet(BitWidth, M0);
+ return Res;
+}
+
+KnownBits KnownBits::bdep(const KnownBits &LHS, const KnownBits &RHS) {
+ // For each output position I where mask[I] could be set, the source index j
+ // lies in [M0, M1] where these track possible counts of set mask bits < I.
+ //
+ // The output bit
+ // - can be 0 if mask[I] or any candidate LHS[j] could be zero, and
+ // - can be 1 only if both mask[I] and some candidate LHS[j] could be one.
+ unsigned BitWidth = LHS.getBitWidth();
+ KnownBits Res(BitWidth);
+ Res.setAllConflict();
+
+ unsigned M0 = 0, M1 = 0;
+ for (unsigned I = 0; I < BitWidth; ++I) {
+ if (!RHS.One[I])
+ Res.One.clearBit(I); // mask[I] could be 0 -> output[I] could be 0
+ if (!RHS.Zero[I]) {
+ APInt Range = APInt::getBitsSet(BitWidth, M0, M1 + 1);
+ if (!Range.isSubsetOf(LHS.One))
+ Res.One.clearBit(I); // some candidate could be 0
+ if (!Range.isSubsetOf(LHS.Zero))
+ Res.Zero.clearBit(I); // some candidate could be 1
+ }
+ if (RHS.One[I])
+ ++M0, ++M1;
+ else if (!RHS.Zero[I])
+ ++M1;
+ }
+ return Res;
+}
+
std::optional<bool> KnownBits::eq(const KnownBits &LHS, const KnownBits &RHS) {
if (LHS.isConstant() && RHS.isConstant())
return LHS.getConstant() == RHS.getConstant();
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 9b36339e419fb..2974b8aa774e8 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -2108,6 +2108,19 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
}
}
+ // Map generic BEXT/BDEP to SVE2 bitperm BEXT/BDEP instructions.
+ if (Subtarget->hasSVEBitPerm() &&
+ (Subtarget->isSVEAvailable() ||
+ (Subtarget->isSVEorStreamingSVEAvailable() &&
+ Subtarget->hasSSVE_BitPerm()))) {
+ for (auto VT : {MVT::nxv16i8, MVT::nxv8i16, MVT::nxv4i32, MVT::nxv2i64}) {
+ setOperationAction(ISD::BEXT, VT, Custom);
+ setOperationAction(ISD::BDEP, VT, Custom);
+ }
+ setOperationAction({ISD::BEXT, ISD::BDEP}, MVT::i32, Custom);
+ setOperationAction({ISD::BEXT, ISD::BDEP}, MVT::i64, Custom);
+ }
+
if (Subtarget->hasBF16())
setPartialReduceMLAAction(ISD::PARTIAL_REDUCE_FMLA, MVT::nxv4f32,
MVT::nxv8bf16, Legal);
@@ -8629,6 +8642,38 @@ SDValue AArch64TargetLowering::LowerOperation(SDValue Op,
return LowerPARTIAL_REDUCE_MLA(Op, DAG);
case ISD::CLMUL:
return LowerCLMUL(Op, DAG);
+ case ISD::BEXT:
+ case ISD::BDEP: {
+ // Lower generic BEXT/BDEP to SVE2 intrinsics.
+ SDLoc DL(Op);
+ EVT VT = Op.getValueType();
+ unsigned IntrID = Op.getOpcode() == ISD::BEXT
+ ? Intrinsic::aarch64_sve_bext_x
+ : Intrinsic::aarch64_sve_bdep_x;
+
+ if (VT.isScalarInteger()) {
+ assert((VT == MVT::i32 || VT == MVT::i64) && "Unexpected scalar type");
+ EVT NeonVT = VT == MVT::i64 ? MVT::v2i64 : MVT::v4i32;
+ EVT SveVT = VT == MVT::i64 ? MVT::nxv2i64 : MVT::nxv4i32;
+ SDValue Zero = DAG.getVectorIdxConstant(0, DL);
+ auto ToScalable = [&](SDValue X) {
+ SDValue V = DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, NeonVT, X);
+ return DAG.getNode(ISD::INSERT_SUBVECTOR, DL, SveVT,
+ DAG.getUNDEF(SveVT), V, Zero);
+ };
+ SDValue Z0 = ToScalable(Op.getOperand(0));
+ SDValue Z1 = ToScalable(Op.getOperand(1));
+ SDValue R =
+ DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, SveVT,
+ DAG.getTargetConstant(IntrID, DL, MVT::i32), Z0, Z1);
+ SDValue Fixed = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, NeonVT, R, Zero);
+ return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, Fixed, Zero);
+ }
+
+ return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, VT,
+ DAG.getTargetConstant(IntrID, DL, MVT::i32),
+ Op.getOperand(0), Op.getOperand(1));
+ }
case ISD::FCANONICALIZE:
return LowerFCANONICALIZE(Op, DAG);
case ISD::CTTZ_ELTS:
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index b6aee44b4de2e..360db807a95a4 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -480,6 +480,14 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
setOperationAction(ISD::CTPOP , MVT::i64 , Custom);
}
+ if (Subtarget.hasBMI2()) {
+ setOperationAction({ISD::BEXT, ISD::BDEP}, MVT::i8, Promote);
+ setOperationAction({ISD::BEXT, ISD::BDEP}, MVT::i16, Promote);
+ setOperationAction({ISD::BEXT, ISD::BDEP}, MVT::i32, Custom);
+ if (Subtarget.is64Bit())
+ setOperationAction({ISD::BEXT, ISD::BDEP}, MVT::i64, Custom);
+ }
+
setOperationAction(ISD::READCYCLECOUNTER , MVT::i64 , Custom);
if (!Subtarget.hasMOVBE())
@@ -33833,6 +33841,16 @@ static SDValue LowerCLMUL(SDValue Op, const X86Subtarget &Subtarget,
return Result;
}
+static SDValue LowerBEXT(SDValue Op, SelectionDAG &DAG) {
+ return DAG.getNode(X86ISD::PEXT, SDLoc(Op), Op.getValueType(),
+ Op.getOperand(0), Op.getOperand(1));
+}
+
+static SDValue LowerBDEP(SDValue Op, SelectionDAG &DAG) {
+ return DAG.getNode(X86ISD::PDEP, SDLoc(Op), Op.getValueType(),
+ Op.getOperand(0), Op.getOperand(1));
+}
+
static SDValue LowerPARITY(SDValue Op, const X86Subtarget &Subtarget,
SelectionDAG &DAG) {
SDLoc DL(Op);
@@ -34565,6 +34583,8 @@ SDValue X86TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
case ISD::BITREVERSE: return LowerBITREVERSE(Op, Subtarget, DAG);
case ISD::CLMUL:
case ISD::CLMULH: return LowerCLMUL(Op, Subtarget, DAG);
+ case ISD::BEXT: return LowerBEXT(Op, DAG);
+ case ISD::BDEP: return LowerBDEP(Op, DAG);
case ISD::PARITY: return LowerPARITY(Op, Subtarget, DAG);
case ISD::BUILD_VECTOR: return LowerBUILD_VECTOR(Op, DAG);
case ISD::CONCAT_VECTORS: return LowerCONCAT_VECTORS(Op, Subtarget, DAG);
diff --git a/llvm/test/Analysis/ValueTracking/knownbits-bextbdep.ll b/llvm/test/Analysis/ValueTracking/knownbits-bextbdep.ll
new file mode 100644
index 0000000000000..835ddd360f443
--- /dev/null
+++ b/llvm/test/Analysis/ValueTracking/knownbits-bextbdep.ll
@@ -0,0 +1,96 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -passes=instcombine -S < %s | FileCheck %s
+
+; bext(x, 0b00001111) produces a 4-bit result; bit 4 and above are always zero.
+define i1 @bext_high_bits_zero(i8 %x) nounwind {
+; CHECK-LABEL: @bext_high_bits_zero(
+; CHECK-NEXT: ret i1 true
+;
+ %bext = call i8 @llvm.bext.i8(i8 %x, i8 15)
+ %and = and i8 %bext, 240
+ %r = icmp eq i8 %and, 0
+ ret i1 %r
+}
+
+; bext(x, 0b11001100) can produce up to 4 bits; bits 4..7 are zero.
+define i1 @bext_sparse_mask_high_zero(i8 %x) nounwind {
+; CHECK-LABEL: @bext_sparse_mask_high_zero(
+; CHECK-NEXT: ret i1 true
+;
+ %bext = call i8 @llvm.bext.i8(i8 %x, i8 204)
+ %and = and i8 %bext, 240
+ %r = icmp eq i8 %and, 0
+ ret i1 %r
+}
+
+; bext(x, 0) -> all bits zero: the AND with any mask is always zero.
+define i1 @bext_zero_mask_known_zero(i8 %x) nounwind {
+; CHECK-LABEL: @bext_zero_mask_known_zero(
+; CHECK-NEXT: ret i1 true
+;
+ %bext = call i8 @llvm.bext.i8(i8 %x, i8 0)
+ %r = icmp eq i8 %bext, 0
+ ret i1 %r
+}
+
+; Negative: bext(x, 0b11001100) can have bits 0-3 set; can't prove bit 0 is zero.
+define i1 @bext_low_bits_not_known(i8 %x) nounwind {
+; CHECK-LABEL: @bext_low_bits_not_known(
+; CHECK-NEXT: [[BEXT:%.*]] = call i8 @llvm.bext.i8(i8 [[X:%.*]], i8 -52)
+; CHECK-NEXT: [[AND:%.*]] = and i8 [[BEXT]], 1
+; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AND]], 0
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %bext = call i8 @llvm.bext.i8(i8 %x, i8 204)
+ %and = and i8 %bext, 1
+ %r = icmp eq i8 %and, 0
+ ret i1 %r
+}
+
+; bdep(x, 0b11110000): bits 0..3 of result are always zero.
+define i1 @bdep_low_bits_zero(i8 %x) nounwind {
+; CHECK-LABEL: @bdep_low_bits_zero(
+; CHECK-NEXT: ret i1 true
+;
+ %bdep = call i8 @llvm.bdep.i8(i8 %x, i8 240)
+ %and = and i8 %bdep, 15
+ %r = icmp eq i8 %and, 0
+ ret i1 %r
+}
+
+; bdep(x, 0b00001111): bits 4..7 of result are always zero.
+define i1 @bdep_high_bits_zero(i8 %x) nounwind {
+; CHECK-LABEL: @bdep_high_bits_zero(
+; CHECK-NEXT: ret i1 true
+;
+ %bdep = call i8 @llvm.bdep.i8(i8 %x, i8 15)
+ %and = and i8 %bdep, 240
+ %r = icmp eq i8 %and, 0
+ ret i1 %r
+}
+
+; bdep(x, 0) -> all bits zero.
+define i1 @bdep_zero_mask_known_zero(i8 %x) nounwind {
+; CHECK-LABEL: @bdep_zero_mask_known_zero(
+; CHECK-NEXT: ret i1 true
+;
+ %bdep = call i8 @llvm.bdep.i8(i8 %x, i8 0)
+ %r = icmp eq i8 %bdep, 0
+ ret i1 %r
+}
+
+; Negative: bdep(x, 0b11001100) can have bits 2,3,6,7 set.
+define i1 @bdep_mask_bits_not_known(i8 %x) nounwind {
+; CHECK-LABEL: @bdep_mask_bits_not_known(
+; CHECK-NEXT: [[BDEP:%.*]] = call i8 @llvm.bdep.i8(i8 [[X:%.*]], i8 -52)
+; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[BDEP]], -1
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %bdep = call i8 @llvm.bdep.i8(i8 %x, i8 204)
+ %and = and i8 %bdep, 128
+ %r = icmp eq i8 %and, 0
+ ret i1 %r
+}
+
+declare i8 @llvm.bext.i8(i8, i8)
+declare i8 @llvm.bdep.i8(i8, i8)
diff --git a/llvm/test/CodeGen/AArch64/bext-bdep.ll b/llvm/test/CodeGen/AArch64/bext-bdep.ll
new file mode 100644
index 0000000000000..454f6e079cd10
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/bext-bdep.ll
@@ -0,0 +1,4057 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc < %s -mtriple=aarch64 -mattr=+sve2-bitperm | FileCheck %s --check-prefix=BITPERM
+; RUN: llc < %s -mtriple=aarch64 -mattr=+sve2 | FileCheck %s --check-prefix=NOSVE2BITPERM
+
+define i8 @bext_i8(i8 %val, i8 %mask) nounwind {
+; BITPERM-LABEL: bext_i8:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: and w8, w0, #0xff
+; BITPERM-NEXT: and w9, w1, #0xff
+; BITPERM-NEXT: fmov s0, w8
+; BITPERM-NEXT: fmov s1, w9
+; BITPERM-NEXT: bext z0.s, z0.s, z1.s
+; BITPERM-NEXT: fmov w0, s0
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bext_i8:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: mvn w9, w1
+; NOSVE2BITPERM-NEXT: mov w8, #-1 // =0xffffffff
+; NOSVE2BITPERM-NEXT: and w10, w0, w1
+; NOSVE2BITPERM-NEXT: lsl w9, w9, #1
+; NOSVE2BITPERM-NEXT: fmov s0, w8
+; NOSVE2BITPERM-NEXT: fmov s1, w9
+; NOSVE2BITPERM-NEXT: pmul v1.8b, v1.8b, v0.8b
+; NOSVE2BITPERM-NEXT: fmov w8, s1
+; NOSVE2BITPERM-NEXT: bic w9, w9, w8
+; NOSVE2BITPERM-NEXT: and w8, w8, w1
+; NOSVE2BITPERM-NEXT: fmov s1, w9
+; NOSVE2BITPERM-NEXT: and w11, w10, w8
+; NOSVE2BITPERM-NEXT: eor w13, w1, w8
+; NOSVE2BITPERM-NEXT: and w8, w8, #0xfe
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11
+; NOSVE2BITPERM-NEXT: and w11, w11, #0xfe
+; NOSVE2BITPERM-NEXT: orr w8, w13, w8, lsr #1
+; NOSVE2BITPERM-NEXT: pmul v1.8b, v1.8b, v0.8b
+; NOSVE2BITPERM-NEXT: fmov w12, s1
+; NOSVE2BITPERM-NEXT: bic w9, w9, w12
+; NOSVE2BITPERM-NEXT: fmov s1, w9
+; NOSVE2BITPERM-NEXT: orr w9, w10, w11, lsr #1
+; NOSVE2BITPERM-NEXT: and w10, w12, w8
+; NOSVE2BITPERM-NEXT: eor w8, w8, w10
+; NOSVE2BITPERM-NEXT: and w11, w9, w10
+; NOSVE2BITPERM-NEXT: and w10, w10, #0xfc
+; NOSVE2BITPERM-NEXT: pmul v0.8b, v1.8b, v0.8b
+; NOSVE2BITPERM-NEXT: orr w8, w8, w10, lsr #2
+; NOSVE2BITPERM-NEXT: eor w9, w9, w11
+; NOSVE2BITPERM-NEXT: and w11, w11, #0xfc
+; NOSVE2BITPERM-NEXT: orr w9, w9, w11, lsr #2
+; NOSVE2BITPERM-NEXT: fmov w10, s0
+; NOSVE2BITPERM-NEXT: and w8, w10, w8
+; NOSVE2BITPERM-NEXT: and w8, w9, w8
+; NOSVE2BITPERM-NEXT: eor w9, w9, w8
+; NOSVE2BITPERM-NEXT: and w8, w8, #0xf0
+; NOSVE2BITPERM-NEXT: orr w0, w9, w8, lsr #4
+; NOSVE2BITPERM-NEXT: ret
+ %res = call i8 @llvm.bext.i8(i8 %val, i8 %mask)
+ ret i8 %res
+}
+
+define i8 @bdep_i8(i8 %val, i8 %mask) nounwind {
+; BITPERM-LABEL: bdep_i8:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: and w8, w0, #0xff
+; BITPERM-NEXT: and w9, w1, #0xff
+; BITPERM-NEXT: fmov s0, w8
+; BITPERM-NEXT: fmov s1, w9
+; BITPERM-NEXT: bdep z0.s, z0.s, z1.s
+; BITPERM-NEXT: fmov w0, s0
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bdep_i8:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: mvn w9, w1
+; NOSVE2BITPERM-NEXT: mov w8, #-1 // =0xffffffff
+; NOSVE2BITPERM-NEXT: lsl w9, w9, #1
+; NOSVE2BITPERM-NEXT: fmov s0, w8
+; NOSVE2BITPERM-NEXT: fmov s1, w9
+; NOSVE2BITPERM-NEXT: pmul v1.8b, v1.8b, v0.8b
+; NOSVE2BITPERM-NEXT: fmov w8, s1
+; NOSVE2BITPERM-NEXT: bic w9, w9, w8
+; NOSVE2BITPERM-NEXT: and w8, w8, w1
+; NOSVE2BITPERM-NEXT: fmov s1, w9
+; NOSVE2BITPERM-NEXT: eor w11, w1, w8
+; NOSVE2BITPERM-NEXT: and w12, w8, #0xfe
+; NOSVE2BITPERM-NEXT: orr w11, w11, w12, lsr #1
+; NOSVE2BITPERM-NEXT: pmul v1.8b, v1.8b, v0.8b
+; NOSVE2BITPERM-NEXT: fmov w10, s1
+; NOSVE2BITPERM-NEXT: bic w9, w9, w10
+; NOSVE2BITPERM-NEXT: fmov s1, w9
+; NOSVE2BITPERM-NEXT: and w9, w10, w11
+; NOSVE2BITPERM-NEXT: eor w10, w11, w9
+; NOSVE2BITPERM-NEXT: and w11, w9, #0xfc
+; NOSVE2BITPERM-NEXT: orr w10, w10, w11, lsr #2
+; NOSVE2BITPERM-NEXT: pmul v0.8b, v1.8b, v0.8b
+; NOSVE2BITPERM-NEXT: fmov w11, s0
+; NOSVE2BITPERM-NEXT: and w10, w11, w10
+; NOSVE2BITPERM-NEXT: and w11, w10, w0, lsl #4
+; NOSVE2BITPERM-NEXT: bic w10, w0, w10
+; NOSVE2BITPERM-NEXT: orr w10, w10, w11
+; NOSVE2BITPERM-NEXT: and w11, w9, w10, lsl #2
+; NOSVE2BITPERM-NEXT: bic w9, w10, w9
+; NOSVE2BITPERM-NEXT: orr w9, w9, w11
+; NOSVE2BITPERM-NEXT: and w10, w8, w9, lsl #1
+; NOSVE2BITPERM-NEXT: bic w8, w9, w8
+; NOSVE2BITPERM-NEXT: orr w8, w8, w10
+; NOSVE2BITPERM-NEXT: and w0, w8, w1
+; NOSVE2BITPERM-NEXT: ret
+ %res = call i8 @llvm.bdep.i8(i8 %val, i8 %mask)
+ ret i8 %res
+}
+
+define i16 @bext_i16(i16 %val, i16 %mask) nounwind {
+; BITPERM-LABEL: bext_i16:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: and w8, w0, #0xffff
+; BITPERM-NEXT: and w9, w1, #0xffff
+; BITPERM-NEXT: fmov s0, w8
+; BITPERM-NEXT: fmov s1, w9
+; BITPERM-NEXT: bext z0.s, z0.s, z1.s
+; BITPERM-NEXT: fmov w0, s0
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bext_i16:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: mvn w8, w1
+; NOSVE2BITPERM-NEXT: and w14, w0, w1
+; NOSVE2BITPERM-NEXT: lsl w9, w8, #1
+; NOSVE2BITPERM-NEXT: neg w11, w8, lsl #16
+; NOSVE2BITPERM-NEXT: eor w10, w9, w8, lsl #2
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #3
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #4
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #5
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #6
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #7
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #8
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #9
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #10
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #11
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #12
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #13
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #14
+; NOSVE2BITPERM-NEXT: eor w8, w10, w8, lsl #15
+; NOSVE2BITPERM-NEXT: eor w8, w8, w11
+; NOSVE2BITPERM-NEXT: bic w9, w9, w8
+; NOSVE2BITPERM-NEXT: and w8, w8, w1
+; NOSVE2BITPERM-NEXT: eor w10, w9, w9, lsl #1
+; NOSVE2BITPERM-NEXT: neg w11, w9, lsl #15
+; NOSVE2BITPERM-NEXT: eor w13, w1, w8
+; NOSVE2BITPERM-NEXT: and w15, w8, #0xfffe
+; NOSVE2BITPERM-NEXT: and w8, w14, w8
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #2
+; NOSVE2BITPERM-NEXT: orr w13, w13, w15, lsr #1
+; NOSVE2BITPERM-NEXT: eor w14, w14, w8
+; NOSVE2BITPERM-NEXT: and w8, w8, #0xfffe
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #3
+; NOSVE2BITPERM-NEXT: orr w8, w14, w8, lsr #1
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #4
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #5
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #6
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #7
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #8
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #9
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #10
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #11
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #12
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #13
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #14
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11
+; NOSVE2BITPERM-NEXT: bic w9, w9, w10
+; NOSVE2BITPERM-NEXT: and w10, w10, w13
+; NOSVE2BITPERM-NEXT: eor w11, w9, w9, lsl #1
+; NOSVE2BITPERM-NEXT: neg w12, w9, lsl #15
+; NOSVE2BITPERM-NEXT: and w14, w8, w10
+; NOSVE2BITPERM-NEXT: eor w13, w13, w10
+; NOSVE2BITPERM-NEXT: and w10, w10, #0xfffc
+; NOSVE2BITPERM-NEXT: eor w8, w8, w14
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #2
+; NOSVE2BITPERM-NEXT: and w14, w14, #0xfffc
+; NOSVE2BITPERM-NEXT: orr w10, w13, w10, lsr #2
+; NOSVE2BITPERM-NEXT: orr w8, w8, w14, lsr #2
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #3
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #4
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #5
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #6
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #7
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #8
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #9
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #10
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #11
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #12
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #13
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #14
+; NOSVE2BITPERM-NEXT: eor w11, w11, w12
+; NOSVE2BITPERM-NEXT: bic w9, w9, w11
+; NOSVE2BITPERM-NEXT: and w11, w11, w10
+; NOSVE2BITPERM-NEXT: eor w12, w9, w9, lsl #1
+; NOSVE2BITPERM-NEXT: and w13, w8, w11
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11
+; NOSVE2BITPERM-NEXT: eor w8, w8, w13
+; NOSVE2BITPERM-NEXT: and w13, w13, #0xfff0
+; NOSVE2BITPERM-NEXT: and w11, w11, #0xfff0
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #2
+; NOSVE2BITPERM-NEXT: orr w8, w8, w13, lsr #4
+; NOSVE2BITPERM-NEXT: orr w10, w10, w11, lsr #4
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #3
+; NOSVE2BITPERM-NEXT: and w10, w8, w10
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #4
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #5
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #6
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #7
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #8
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #9
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #10
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #11
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #12
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #13
+; NOSVE2BITPERM-NEXT: eor w11, w12, w9, lsl #14
+; NOSVE2BITPERM-NEXT: neg w9, w9, lsl #15
+; NOSVE2BITPERM-NEXT: eor w9, w11, w9
+; NOSVE2BITPERM-NEXT: and w9, w10, w9
+; NOSVE2BITPERM-NEXT: eor w8, w8, w9
+; NOSVE2BITPERM-NEXT: and w9, w9, #0xff00
+; NOSVE2BITPERM-NEXT: orr w0, w8, w9, lsr #8
+; NOSVE2BITPERM-NEXT: ret
+ %res = call i16 @llvm.bext.i16(i16 %val, i16 %mask)
+ ret i16 %res
+}
+
+define i16 @bdep_i16(i16 %val, i16 %mask) nounwind {
+; BITPERM-LABEL: bdep_i16:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: and w8, w0, #0xffff
+; BITPERM-NEXT: and w9, w1, #0xffff
+; BITPERM-NEXT: fmov s0, w8
+; BITPERM-NEXT: fmov s1, w9
+; BITPERM-NEXT: bdep z0.s, z0.s, z1.s
+; BITPERM-NEXT: fmov w0, s0
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bdep_i16:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: mvn w8, w1
+; NOSVE2BITPERM-NEXT: lsl w9, w8, #1
+; NOSVE2BITPERM-NEXT: neg w11, w8, lsl #16
+; NOSVE2BITPERM-NEXT: eor w10, w9, w8, lsl #2
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #3
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #4
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #5
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #6
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #7
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #8
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #9
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #10
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #11
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #12
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #13
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #14
+; NOSVE2BITPERM-NEXT: eor w8, w10, w8, lsl #15
+; NOSVE2BITPERM-NEXT: eor w8, w8, w11
+; NOSVE2BITPERM-NEXT: bic w9, w9, w8
+; NOSVE2BITPERM-NEXT: and w8, w8, w1
+; NOSVE2BITPERM-NEXT: eor w10, w9, w9, lsl #1
+; NOSVE2BITPERM-NEXT: neg w11, w9, lsl #15
+; NOSVE2BITPERM-NEXT: eor w13, w1, w8
+; NOSVE2BITPERM-NEXT: and w14, w8, #0xfffe
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #2
+; NOSVE2BITPERM-NEXT: orr w13, w13, w14, lsr #1
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #3
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #4
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #5
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #6
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #7
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #8
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #9
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #10
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #11
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #12
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #13
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #14
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11
+; NOSVE2BITPERM-NEXT: bic w9, w9, w10
+; NOSVE2BITPERM-NEXT: and w10, w10, w13
+; NOSVE2BITPERM-NEXT: eor w11, w9, w9, lsl #1
+; NOSVE2BITPERM-NEXT: neg w12, w9, lsl #15
+; NOSVE2BITPERM-NEXT: eor w13, w13, w10
+; NOSVE2BITPERM-NEXT: and w14, w10, #0xfffc
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #2
+; NOSVE2BITPERM-NEXT: orr w13, w13, w14, lsr #2
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #3
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #4
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #5
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #6
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #7
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #8
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #9
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #10
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #11
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #12
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #13
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #14
+; NOSVE2BITPERM-NEXT: eor w11, w11, w12
+; NOSVE2BITPERM-NEXT: bic w9, w9, w11
+; NOSVE2BITPERM-NEXT: and w11, w11, w13
+; NOSVE2BITPERM-NEXT: eor w12, w9, w9, lsl #1
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11
+; NOSVE2BITPERM-NEXT: and w14, w11, #0xfff0
+; NOSVE2BITPERM-NEXT: orr w13, w13, w14, lsr #4
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #2
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #3
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #4
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #5
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #6
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #7
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #8
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #9
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #10
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #11
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #12
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #13
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #14
+; NOSVE2BITPERM-NEXT: neg w9, w9, lsl #15
+; NOSVE2BITPERM-NEXT: eor w9, w12, w9
+; NOSVE2BITPERM-NEXT: and w9, w9, w13
+; NOSVE2BITPERM-NEXT: and w12, w9, w0, lsl #8
+; NOSVE2BITPERM-NEXT: bic w9, w0, w9
+; NOSVE2BITPERM-NEXT: orr w9, w9, w12
+; NOSVE2BITPERM-NEXT: and w12, w11, w9, lsl #4
+; NOSVE2BITPERM-NEXT: bic w9, w9, w11
+; NOSVE2BITPERM-NEXT: orr w9, w9, w12
+; NOSVE2BITPERM-NEXT: and w11, w10, w9, lsl #2
+; NOSVE2BITPERM-NEXT: bic w9, w9, w10
+; NOSVE2BITPERM-NEXT: orr w9, w9, w11
+; NOSVE2BITPERM-NEXT: and w10, w8, w9, lsl #1
+; NOSVE2BITPERM-NEXT: bic w8, w9, w8
+; NOSVE2BITPERM-NEXT: orr w8, w8, w10
+; NOSVE2BITPERM-NEXT: and w0, w8, w1
+; NOSVE2BITPERM-NEXT: ret
+ %res = call i16 @llvm.bdep.i16(i16 %val, i16 %mask)
+ ret i16 %res
+}
+
+define i32 @bext_i32(i32 %val, i32 %mask) nounwind {
+; BITPERM-LABEL: bext_i32:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: fmov s0, w0
+; BITPERM-NEXT: fmov s1, w1
+; BITPERM-NEXT: bext z0.s, z0.s, z1.s
+; BITPERM-NEXT: fmov w0, s0
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bext_i32:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: mvn w8, w1
+; NOSVE2BITPERM-NEXT: and w14, w0, w1
+; NOSVE2BITPERM-NEXT: lsl w9, w8, #1
+; NOSVE2BITPERM-NEXT: eor w10, w9, w8, lsl #2
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #3
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #4
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #5
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #6
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #7
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #8
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #9
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #10
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #11
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #12
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #13
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #14
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #15
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #16
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #17
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #18
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #19
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #20
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #21
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #22
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #23
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #24
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #25
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #26
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #27
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #28
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #29
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #30
+; NOSVE2BITPERM-NEXT: eor w8, w10, w8, lsl #31
+; NOSVE2BITPERM-NEXT: bic w10, w9, w8
+; NOSVE2BITPERM-NEXT: and w8, w8, w1
+; NOSVE2BITPERM-NEXT: eor w9, w10, w10, lsl #1
+; NOSVE2BITPERM-NEXT: and w15, w14, w8
+; NOSVE2BITPERM-NEXT: eor w16, w1, w8
+; NOSVE2BITPERM-NEXT: orr w8, w16, w8, lsr #1
+; NOSVE2BITPERM-NEXT: eor w14, w14, w15
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #2
+; NOSVE2BITPERM-NEXT: orr w14, w14, w15, lsr #1
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #3
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #4
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #5
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #6
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #7
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #8
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #9
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #10
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #11
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #12
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #13
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #14
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #15
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #16
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #17
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #18
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #19
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #20
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #21
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #22
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #23
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #24
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #25
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #26
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #27
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #28
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #29
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #30
+; NOSVE2BITPERM-NEXT: bic w11, w10, w9
+; NOSVE2BITPERM-NEXT: and w9, w9, w8
+; NOSVE2BITPERM-NEXT: eor w10, w11, w11, lsl #1
+; NOSVE2BITPERM-NEXT: and w15, w14, w9
+; NOSVE2BITPERM-NEXT: eor w8, w8, w9
+; NOSVE2BITPERM-NEXT: orr w8, w8, w9, lsr #2
+; NOSVE2BITPERM-NEXT: eor w9, w14, w15
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #2
+; NOSVE2BITPERM-NEXT: orr w9, w9, w15, lsr #2
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #3
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #4
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #5
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #6
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #7
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #8
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #9
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #10
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #11
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #12
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #13
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #14
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #15
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #16
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #17
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #18
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #19
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #20
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #21
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #22
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #23
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #24
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #25
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #26
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #27
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #28
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #29
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #30
+; NOSVE2BITPERM-NEXT: bic w11, w11, w10
+; NOSVE2BITPERM-NEXT: and w10, w10, w8
+; NOSVE2BITPERM-NEXT: eor w12, w11, w11, lsl #1
+; NOSVE2BITPERM-NEXT: and w14, w9, w10
+; NOSVE2BITPERM-NEXT: eor w8, w8, w10
+; NOSVE2BITPERM-NEXT: orr w8, w8, w10, lsr #4
+; NOSVE2BITPERM-NEXT: eor w9, w9, w14
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #2
+; NOSVE2BITPERM-NEXT: orr w9, w9, w14, lsr #4
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #3
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #4
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #5
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #6
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #7
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #8
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #9
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #10
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #11
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #12
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #13
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #14
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #15
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #16
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #17
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #18
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #19
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #20
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #21
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #22
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #23
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #24
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #25
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #26
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #27
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #28
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #29
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #30
+; NOSVE2BITPERM-NEXT: bic w11, w11, w12
+; NOSVE2BITPERM-NEXT: and w12, w12, w8
+; NOSVE2BITPERM-NEXT: eor w13, w11, w11, lsl #1
+; NOSVE2BITPERM-NEXT: eor w8, w8, w12
+; NOSVE2BITPERM-NEXT: orr w8, w8, w12, lsr #8
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #2
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #3
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #4
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #5
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #6
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #7
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #8
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #9
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #10
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #11
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #12
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #13
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #14
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #15
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #16
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #17
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #18
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #19
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #20
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #21
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #22
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #23
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #24
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #25
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #26
+; NOSVE2BITPERM-NEXT: eor w10, w13, w11, lsl #27
+; NOSVE2BITPERM-NEXT: and w13, w9, w12
+; NOSVE2BITPERM-NEXT: eor w9, w9, w13
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #28
+; NOSVE2BITPERM-NEXT: orr w9, w9, w13, lsr #8
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #29
+; NOSVE2BITPERM-NEXT: and w8, w9, w8
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #30
+; NOSVE2BITPERM-NEXT: and w8, w8, w10
+; NOSVE2BITPERM-NEXT: eor w9, w9, w8
+; NOSVE2BITPERM-NEXT: orr w0, w9, w8, lsr #16
+; NOSVE2BITPERM-NEXT: ret
+ %res = call i32 @llvm.bext.i32(i32 %val, i32 %mask)
+ ret i32 %res
+}
+
+define i32 @bdep_i32(i32 %val, i32 %mask) nounwind {
+; BITPERM-LABEL: bdep_i32:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: fmov s0, w0
+; BITPERM-NEXT: fmov s1, w1
+; BITPERM-NEXT: bdep z0.s, z0.s, z1.s
+; BITPERM-NEXT: fmov w0, s0
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bdep_i32:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: mvn w8, w1
+; NOSVE2BITPERM-NEXT: lsl w9, w8, #1
+; NOSVE2BITPERM-NEXT: eor w10, w9, w8, lsl #2
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #3
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #4
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #5
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #6
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #7
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #8
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #9
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #10
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #11
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #12
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #13
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #14
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #15
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #16
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #17
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #18
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #19
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #20
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #21
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #22
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #23
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #24
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #25
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #26
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #27
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #28
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #29
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #30
+; NOSVE2BITPERM-NEXT: eor w8, w10, w8, lsl #31
+; NOSVE2BITPERM-NEXT: bic w10, w9, w8
+; NOSVE2BITPERM-NEXT: and w8, w8, w1
+; NOSVE2BITPERM-NEXT: eor w9, w10, w10, lsl #1
+; NOSVE2BITPERM-NEXT: eor w14, w1, w8
+; NOSVE2BITPERM-NEXT: orr w14, w14, w8, lsr #1
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #2
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #3
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #4
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #5
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #6
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #7
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #8
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #9
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #10
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #11
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #12
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #13
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #14
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #15
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #16
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #17
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #18
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #19
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #20
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #21
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #22
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #23
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #24
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #25
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #26
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #27
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #28
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #29
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #30
+; NOSVE2BITPERM-NEXT: bic w11, w10, w9
+; NOSVE2BITPERM-NEXT: and w9, w9, w14
+; NOSVE2BITPERM-NEXT: eor w10, w11, w11, lsl #1
+; NOSVE2BITPERM-NEXT: eor w14, w14, w9
+; NOSVE2BITPERM-NEXT: orr w14, w14, w9, lsr #2
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #2
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #3
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #4
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #5
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #6
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #7
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #8
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #9
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #10
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #11
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #12
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #13
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #14
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #15
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #16
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #17
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #18
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #19
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #20
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #21
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #22
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #23
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #24
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #25
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #26
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #27
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #28
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #29
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #30
+; NOSVE2BITPERM-NEXT: bic w11, w11, w10
+; NOSVE2BITPERM-NEXT: and w10, w10, w14
+; NOSVE2BITPERM-NEXT: eor w12, w11, w11, lsl #1
+; NOSVE2BITPERM-NEXT: eor w14, w14, w10
+; NOSVE2BITPERM-NEXT: orr w14, w14, w10, lsr #4
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #2
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #3
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #4
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #5
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #6
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #7
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #8
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #9
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #10
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #11
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #12
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #13
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #14
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #15
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #16
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #17
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #18
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #19
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #20
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #21
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #22
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #23
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #24
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #25
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #26
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #27
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #28
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #29
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #30
+; NOSVE2BITPERM-NEXT: bic w11, w11, w12
+; NOSVE2BITPERM-NEXT: and w12, w12, w14
+; NOSVE2BITPERM-NEXT: eor w13, w11, w11, lsl #1
+; NOSVE2BITPERM-NEXT: eor w14, w14, w12
+; NOSVE2BITPERM-NEXT: orr w14, w14, w12, lsr #8
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #2
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #3
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #4
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #5
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #6
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #7
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #8
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #9
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #10
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #11
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #12
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #13
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #14
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #15
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #16
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #17
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #18
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #19
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #20
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #21
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #22
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #23
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #24
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #25
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #26
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #27
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #28
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #29
+; NOSVE2BITPERM-NEXT: eor w11, w13, w11, lsl #30
+; NOSVE2BITPERM-NEXT: and w11, w11, w14
+; NOSVE2BITPERM-NEXT: and w13, w11, w0, lsl #16
+; NOSVE2BITPERM-NEXT: bic w11, w0, w11
+; NOSVE2BITPERM-NEXT: orr w11, w11, w13
+; NOSVE2BITPERM-NEXT: and w13, w12, w11, lsl #8
+; NOSVE2BITPERM-NEXT: bic w11, w11, w12
+; NOSVE2BITPERM-NEXT: orr w11, w11, w13
+; NOSVE2BITPERM-NEXT: and w12, w10, w11, lsl #4
+; NOSVE2BITPERM-NEXT: bic w10, w11, w10
+; NOSVE2BITPERM-NEXT: orr w10, w10, w12
+; NOSVE2BITPERM-NEXT: and w11, w9, w10, lsl #2
+; NOSVE2BITPERM-NEXT: bic w9, w10, w9
+; NOSVE2BITPERM-NEXT: orr w9, w9, w11
+; NOSVE2BITPERM-NEXT: and w10, w8, w9, lsl #1
+; NOSVE2BITPERM-NEXT: bic w8, w9, w8
+; NOSVE2BITPERM-NEXT: orr w8, w8, w10
+; NOSVE2BITPERM-NEXT: and w0, w8, w1
+; NOSVE2BITPERM-NEXT: ret
+ %res = call i32 @llvm.bdep.i32(i32 %val, i32 %mask)
+ ret i32 %res
+}
+
+define i64 @bext_i64(i64 %val, i64 %mask) nounwind {
+; BITPERM-LABEL: bext_i64:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: fmov d0, x0
+; BITPERM-NEXT: fmov d1, x1
+; BITPERM-NEXT: bext z0.d, z0.d, z1.d
+; BITPERM-NEXT: fmov x0, d0
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bext_i64:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: mvn x8, x1
+; NOSVE2BITPERM-NEXT: and x15, x0, x1
+; NOSVE2BITPERM-NEXT: lsl x9, x8, #1
+; NOSVE2BITPERM-NEXT: eor x10, x9, x8, lsl #2
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #3
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #4
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #5
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #6
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #7
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #8
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #9
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #10
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #11
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #12
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #13
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #14
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #15
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #16
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #17
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #18
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #19
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #20
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #21
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #22
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #23
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #24
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #25
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #26
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #27
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #28
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #29
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #30
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #31
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #32
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #33
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #34
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #35
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #36
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #37
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #38
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #39
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #40
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #41
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #42
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #43
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #44
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #45
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #46
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #47
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #48
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #49
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #50
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #51
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #52
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #53
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #54
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #55
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #56
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #57
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #58
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #59
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #60
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #61
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #62
+; NOSVE2BITPERM-NEXT: eor x8, x10, x8, lsl #63
+; NOSVE2BITPERM-NEXT: bic x10, x9, x8
+; NOSVE2BITPERM-NEXT: and x8, x8, x1
+; NOSVE2BITPERM-NEXT: eor x9, x10, x10, lsl #1
+; NOSVE2BITPERM-NEXT: and x16, x15, x8
+; NOSVE2BITPERM-NEXT: eor x17, x1, x8
+; NOSVE2BITPERM-NEXT: orr x8, x17, x8, lsr #1
+; NOSVE2BITPERM-NEXT: eor x15, x15, x16
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #2
+; NOSVE2BITPERM-NEXT: orr x15, x15, x16, lsr #1
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #3
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #4
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #5
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #6
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #7
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #8
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #9
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #10
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #11
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #12
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #13
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #14
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #15
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #16
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #17
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #18
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #19
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #20
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #21
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #22
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #23
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #24
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #25
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #26
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #27
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #28
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #29
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #30
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #31
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #32
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #33
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #34
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #35
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #36
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #37
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #38
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #39
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #40
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #41
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #42
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #43
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #44
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #45
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #46
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #47
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #48
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #49
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #50
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #51
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #52
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #53
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #54
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #55
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #56
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #57
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #58
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #59
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #60
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #61
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #62
+; NOSVE2BITPERM-NEXT: bic x11, x10, x9
+; NOSVE2BITPERM-NEXT: and x9, x9, x8
+; NOSVE2BITPERM-NEXT: eor x10, x11, x11, lsl #1
+; NOSVE2BITPERM-NEXT: and x16, x15, x9
+; NOSVE2BITPERM-NEXT: eor x8, x8, x9
+; NOSVE2BITPERM-NEXT: orr x8, x8, x9, lsr #2
+; NOSVE2BITPERM-NEXT: eor x9, x15, x16
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #2
+; NOSVE2BITPERM-NEXT: orr x9, x9, x16, lsr #2
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #3
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #4
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #5
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #6
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #7
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #8
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #9
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #10
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #11
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #12
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #13
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #14
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #15
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #16
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #17
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #18
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #19
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #20
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #21
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #22
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #23
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #24
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #25
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #26
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #27
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #28
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #29
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #30
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #31
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #32
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #33
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #34
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #35
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #36
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #37
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #38
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #39
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #40
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #41
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #42
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #43
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #44
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #45
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #46
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #47
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #48
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #49
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #50
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #51
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #52
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #53
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #54
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #55
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #56
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #57
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #58
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #59
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #60
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #61
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #62
+; NOSVE2BITPERM-NEXT: bic x12, x11, x10
+; NOSVE2BITPERM-NEXT: and x10, x10, x8
+; NOSVE2BITPERM-NEXT: eor x11, x12, x12, lsl #1
+; NOSVE2BITPERM-NEXT: and x15, x9, x10
+; NOSVE2BITPERM-NEXT: eor x8, x8, x10
+; NOSVE2BITPERM-NEXT: orr x8, x8, x10, lsr #4
+; NOSVE2BITPERM-NEXT: eor x9, x9, x15
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #2
+; NOSVE2BITPERM-NEXT: orr x9, x9, x15, lsr #4
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #3
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #4
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #5
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #6
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #7
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #8
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #9
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #10
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #11
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #12
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #13
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #14
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #15
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #16
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #17
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #18
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #19
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #20
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #21
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #22
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #23
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #24
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #25
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #26
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #27
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #28
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #29
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #30
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #31
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #32
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #33
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #34
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #35
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #36
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #37
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #38
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #39
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #40
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #41
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #42
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #43
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #44
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #45
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #46
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #47
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #48
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #49
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #50
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #51
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #52
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #53
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #54
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #55
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #56
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #57
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #58
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #59
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #60
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #61
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #62
+; NOSVE2BITPERM-NEXT: bic x12, x12, x11
+; NOSVE2BITPERM-NEXT: and x11, x11, x8
+; NOSVE2BITPERM-NEXT: eor x13, x12, x12, lsl #1
+; NOSVE2BITPERM-NEXT: eor x8, x8, x11
+; NOSVE2BITPERM-NEXT: orr x8, x8, x11, lsr #8
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #2
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #3
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #4
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #5
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #6
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #7
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #8
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #9
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #10
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #11
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #12
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #13
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #14
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #15
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #16
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #17
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #18
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #19
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #20
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #21
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #22
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #23
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #24
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #25
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #26
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #27
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #28
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #29
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #30
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #31
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #32
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #33
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #34
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #35
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #36
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #37
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #38
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #39
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #40
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #41
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #42
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #43
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #44
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #45
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #46
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #47
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #48
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #49
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #50
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #51
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #52
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #53
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #54
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #55
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #56
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #57
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #58
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #59
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #60
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #61
+; NOSVE2BITPERM-NEXT: eor x13, x13, x12, lsl #62
+; NOSVE2BITPERM-NEXT: bic x12, x12, x13
+; NOSVE2BITPERM-NEXT: eor x14, x12, x12, lsl #1
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #2
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #3
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #4
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #5
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #6
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #7
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #8
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #9
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #10
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #11
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #12
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #13
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #14
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #15
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #16
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #17
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #18
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #19
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #20
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #21
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #22
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #23
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #24
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #25
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #26
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #27
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #28
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #29
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #30
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #31
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #32
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #33
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #34
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #35
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #36
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #37
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #38
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #39
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #40
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #41
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #42
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #43
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #44
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #45
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #46
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #47
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #48
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #49
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #50
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #51
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #52
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #53
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #54
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #55
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #56
+; NOSVE2BITPERM-NEXT: eor x14, x14, x12, lsl #57
+; NOSVE2BITPERM-NEXT: eor x10, x14, x12, lsl #58
+; NOSVE2BITPERM-NEXT: and x14, x9, x11
+; NOSVE2BITPERM-NEXT: and x11, x13, x8
+; NOSVE2BITPERM-NEXT: eor x9, x9, x14
+; NOSVE2BITPERM-NEXT: eor x8, x8, x11
+; NOSVE2BITPERM-NEXT: eor x10, x10, x12, lsl #59
+; NOSVE2BITPERM-NEXT: orr x9, x9, x14, lsr #8
+; NOSVE2BITPERM-NEXT: orr x8, x8, x11, lsr #16
+; NOSVE2BITPERM-NEXT: eor x10, x10, x12, lsl #60
+; NOSVE2BITPERM-NEXT: and x13, x9, x11
+; NOSVE2BITPERM-NEXT: eor x9, x9, x13
+; NOSVE2BITPERM-NEXT: eor x10, x10, x12, lsl #61
+; NOSVE2BITPERM-NEXT: orr x9, x9, x13, lsr #16
+; NOSVE2BITPERM-NEXT: eor x10, x10, x12, lsl #62
+; NOSVE2BITPERM-NEXT: and x8, x9, x8
+; NOSVE2BITPERM-NEXT: eor x10, x10, x12, lsl #63
+; NOSVE2BITPERM-NEXT: and x8, x8, x10
+; NOSVE2BITPERM-NEXT: eor x9, x9, x8
+; NOSVE2BITPERM-NEXT: orr x0, x9, x8, lsr #32
+; NOSVE2BITPERM-NEXT: ret
+ %res = call i64 @llvm.bext.i64(i64 %val, i64 %mask)
+ ret i64 %res
+}
+
+define i64 @bdep_i64(i64 %val, i64 %mask) nounwind {
+; BITPERM-LABEL: bdep_i64:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: fmov d0, x0
+; BITPERM-NEXT: fmov d1, x1
+; BITPERM-NEXT: bdep z0.d, z0.d, z1.d
+; BITPERM-NEXT: fmov x0, d0
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bdep_i64:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: mvn x8, x1
+; NOSVE2BITPERM-NEXT: lsl x9, x8, #1
+; NOSVE2BITPERM-NEXT: eor x10, x9, x8, lsl #2
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #3
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #4
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #5
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #6
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #7
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #8
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #9
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #10
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #11
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #12
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #13
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #14
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #15
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #16
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #17
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #18
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #19
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #20
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #21
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #22
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #23
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #24
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #25
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #26
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #27
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #28
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #29
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #30
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #31
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #32
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #33
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #34
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #35
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #36
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #37
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #38
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #39
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #40
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #41
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #42
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #43
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #44
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #45
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #46
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #47
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #48
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #49
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #50
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #51
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #52
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #53
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #54
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #55
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #56
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #57
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #58
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #59
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #60
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #61
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #62
+; NOSVE2BITPERM-NEXT: eor x8, x10, x8, lsl #63
+; NOSVE2BITPERM-NEXT: bic x10, x9, x8
+; NOSVE2BITPERM-NEXT: and x8, x8, x1
+; NOSVE2BITPERM-NEXT: eor x9, x10, x10, lsl #1
+; NOSVE2BITPERM-NEXT: eor x15, x1, x8
+; NOSVE2BITPERM-NEXT: orr x15, x15, x8, lsr #1
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #2
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #3
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #4
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #5
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #6
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #7
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #8
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #9
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #10
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #11
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #12
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #13
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #14
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #15
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #16
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #17
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #18
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #19
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #20
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #21
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #22
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #23
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #24
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #25
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #26
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #27
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #28
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #29
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #30
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #31
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #32
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #33
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #34
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #35
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #36
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #37
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #38
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #39
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #40
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #41
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #42
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #43
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #44
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #45
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #46
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #47
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #48
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #49
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #50
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #51
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #52
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #53
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #54
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #55
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #56
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #57
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #58
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #59
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #60
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #61
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #62
+; NOSVE2BITPERM-NEXT: bic x11, x10, x9
+; NOSVE2BITPERM-NEXT: and x9, x9, x15
+; NOSVE2BITPERM-NEXT: eor x10, x11, x11, lsl #1
+; NOSVE2BITPERM-NEXT: eor x15, x15, x9
+; NOSVE2BITPERM-NEXT: orr x15, x15, x9, lsr #2
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #2
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #3
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #4
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #5
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #6
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #7
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #8
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #9
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #10
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #11
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #12
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #13
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #14
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #15
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #16
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #17
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #18
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #19
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #20
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #21
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #22
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #23
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #24
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #25
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #26
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #27
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #28
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #29
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #30
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #31
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #32
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #33
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #34
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #35
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #36
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #37
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #38
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #39
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #40
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #41
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #42
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #43
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #44
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #45
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #46
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #47
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #48
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #49
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #50
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #51
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #52
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #53
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #54
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #55
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #56
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #57
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #58
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #59
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #60
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #61
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #62
+; NOSVE2BITPERM-NEXT: bic x12, x11, x10
+; NOSVE2BITPERM-NEXT: and x10, x10, x15
+; NOSVE2BITPERM-NEXT: eor x11, x12, x12, lsl #1
+; NOSVE2BITPERM-NEXT: eor x15, x15, x10
+; NOSVE2BITPERM-NEXT: orr x15, x15, x10, lsr #4
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #2
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #3
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #4
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #5
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #6
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #7
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #8
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #9
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #10
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #11
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #12
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #13
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #14
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #15
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #16
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #17
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #18
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #19
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #20
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #21
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #22
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #23
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #24
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #25
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #26
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #27
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #28
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #29
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #30
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #31
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #32
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #33
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #34
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #35
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #36
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #37
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #38
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #39
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #40
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #41
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #42
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #43
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #44
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #45
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #46
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #47
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #48
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #49
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #50
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #51
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #52
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #53
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #54
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #55
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #56
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #57
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #58
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #59
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #60
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #61
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #62
+; NOSVE2BITPERM-NEXT: bic x13, x12, x11
+; NOSVE2BITPERM-NEXT: and x11, x11, x15
+; NOSVE2BITPERM-NEXT: eor x12, x13, x13, lsl #1
+; NOSVE2BITPERM-NEXT: eor x15, x15, x11
+; NOSVE2BITPERM-NEXT: orr x15, x15, x11, lsr #8
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #2
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #3
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #4
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #5
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #6
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #7
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #8
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #9
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #10
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #11
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #12
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #13
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #14
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #15
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #16
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #17
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #18
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #19
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #20
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #21
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #22
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #23
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #24
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #25
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #26
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #27
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #28
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #29
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #30
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #31
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #32
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #33
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #34
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #35
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #36
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #37
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #38
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #39
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #40
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #41
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #42
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #43
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #44
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #45
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #46
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #47
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #48
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #49
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #50
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #51
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #52
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #53
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #54
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #55
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #56
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #57
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #58
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #59
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #60
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #61
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #62
+; NOSVE2BITPERM-NEXT: bic x13, x13, x12
+; NOSVE2BITPERM-NEXT: and x12, x12, x15
+; NOSVE2BITPERM-NEXT: eor x14, x13, x13, lsl #1
+; NOSVE2BITPERM-NEXT: eor x15, x15, x12
+; NOSVE2BITPERM-NEXT: orr x15, x15, x12, lsr #16
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #2
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #3
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #4
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #5
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #6
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #7
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #8
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #9
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #10
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #11
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #12
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #13
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #14
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #15
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #16
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #17
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #18
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #19
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #20
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #21
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #22
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #23
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #24
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #25
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #26
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #27
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #28
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #29
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #30
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #31
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #32
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #33
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #34
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #35
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #36
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #37
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #38
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #39
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #40
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #41
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #42
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #43
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #44
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #45
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #46
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #47
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #48
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #49
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #50
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #51
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #52
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #53
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #54
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #55
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #56
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #57
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #58
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #59
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #60
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #61
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #62
+; NOSVE2BITPERM-NEXT: eor x13, x14, x13, lsl #63
+; NOSVE2BITPERM-NEXT: and x13, x13, x15
+; NOSVE2BITPERM-NEXT: and x14, x13, x0, lsl #32
+; NOSVE2BITPERM-NEXT: bic x13, x0, x13
+; NOSVE2BITPERM-NEXT: orr x13, x13, x14
+; NOSVE2BITPERM-NEXT: and x14, x12, x13, lsl #16
+; NOSVE2BITPERM-NEXT: bic x12, x13, x12
+; NOSVE2BITPERM-NEXT: orr x12, x12, x14
+; NOSVE2BITPERM-NEXT: and x13, x11, x12, lsl #8
+; NOSVE2BITPERM-NEXT: bic x11, x12, x11
+; NOSVE2BITPERM-NEXT: orr x11, x11, x13
+; NOSVE2BITPERM-NEXT: and x12, x10, x11, lsl #4
+; NOSVE2BITPERM-NEXT: bic x10, x11, x10
+; NOSVE2BITPERM-NEXT: orr x10, x10, x12
+; NOSVE2BITPERM-NEXT: and x11, x9, x10, lsl #2
+; NOSVE2BITPERM-NEXT: bic x9, x10, x9
+; NOSVE2BITPERM-NEXT: orr x9, x9, x11
+; NOSVE2BITPERM-NEXT: and x10, x8, x9, lsl #1
+; NOSVE2BITPERM-NEXT: bic x8, x9, x8
+; NOSVE2BITPERM-NEXT: orr x8, x8, x10
+; NOSVE2BITPERM-NEXT: and x0, x8, x1
+; NOSVE2BITPERM-NEXT: ret
+ %res = call i64 @llvm.bdep.i64(i64 %val, i64 %mask)
+ ret i64 %res
+}
+
+define <vscale x 16 x i8> @bext_nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask) nounwind {
+; BITPERM-LABEL: bext_nxv16i8:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: bext z0.b, z0.b, z1.b
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bext_nxv16i8:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: movprfx z3, z1
+; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
+; NOSVE2BITPERM-NEXT: mov z2.b, #-1 // =0xffffffffffffffff
+; NOSVE2BITPERM-NEXT: and z0.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: lsl z3.b, z3.b, #1
+; NOSVE2BITPERM-NEXT: pmul z4.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: and z5.d, z4.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z4.d
+; NOSVE2BITPERM-NEXT: and z4.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z5.d
+; NOSVE2BITPERM-NEXT: lsr z5.b, z5.b, #1
+; NOSVE2BITPERM-NEXT: pmul z6.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: lsr z4.b, z4.b, #1
+; NOSVE2BITPERM-NEXT: orr z1.d, z1.d, z5.d
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z6.d
+; NOSVE2BITPERM-NEXT: orr z0.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: and z4.d, z6.d, z1.d
+; NOSVE2BITPERM-NEXT: pmul z2.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: and z5.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z4.d
+; NOSVE2BITPERM-NEXT: lsr z4.b, z4.b, #2
+; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: lsr z3.b, z5.b, #2
+; NOSVE2BITPERM-NEXT: orr z1.d, z1.d, z4.d
+; NOSVE2BITPERM-NEXT: orr z0.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: and z1.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: and z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: lsr z1.b, z1.b, #4
+; NOSVE2BITPERM-NEXT: orr z0.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: ret
+ %res = call <vscale x 16 x i8> @llvm.bext.nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask)
+ ret <vscale x 16 x i8> %res
+}
+
+define <vscale x 16 x i8> @bdep_nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask) nounwind {
+; BITPERM-LABEL: bdep_nxv16i8:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: bdep z0.b, z0.b, z1.b
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bdep_nxv16i8:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: movprfx z3, z1
+; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
+; NOSVE2BITPERM-NEXT: mov z2.b, #-1 // =0xffffffffffffffff
+; NOSVE2BITPERM-NEXT: lsl z3.b, z3.b, #1
+; NOSVE2BITPERM-NEXT: pmul z4.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: and z5.d, z4.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z4.d
+; NOSVE2BITPERM-NEXT: eor z4.d, z1.d, z5.d
+; NOSVE2BITPERM-NEXT: lsr z6.b, z5.b, #1
+; NOSVE2BITPERM-NEXT: pmul z7.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: orr z4.d, z4.d, z6.d
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z7.d
+; NOSVE2BITPERM-NEXT: and z6.d, z7.d, z4.d
+; NOSVE2BITPERM-NEXT: pmul z2.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: eor z4.d, z4.d, z6.d
+; NOSVE2BITPERM-NEXT: lsr z7.b, z6.b, #2
+; NOSVE2BITPERM-NEXT: orr z3.d, z4.d, z7.d
+; NOSVE2BITPERM-NEXT: and z2.d, z2.d, z3.d
+; NOSVE2BITPERM-NEXT: lsl z3.b, z0.b, #4
+; NOSVE2BITPERM-NEXT: bsl z3.d, z3.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: lsl z0.b, z3.b, #2
+; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z3.d, z6.d
+; NOSVE2BITPERM-NEXT: lsl z2.b, z0.b, #1
+; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: and z0.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: ret
+ %res = call <vscale x 16 x i8> @llvm.bdep.nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask)
+ ret <vscale x 16 x i8> %res
+}
+
+define <vscale x 8 x i16> @bext_nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask) nounwind {
+; BITPERM-LABEL: bext_nxv8i16:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: bext z0.h, z0.h, z1.h
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bext_nxv8i16:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: movprfx z3, z1
+; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
+; NOSVE2BITPERM-NEXT: mov z2.h, #-1 // =0xffffffffffffffff
+; NOSVE2BITPERM-NEXT: and z0.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: lsl z3.h, z3.h, #1
+; NOSVE2BITPERM-NEXT: trn1 z4.b, z2.b, z3.b
+; NOSVE2BITPERM-NEXT: trn2 z5.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmullb z6.h, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmul z4.b, z5.b, z4.b
+; NOSVE2BITPERM-NEXT: eorbt z4.b, z4.b, z4.b
+; NOSVE2BITPERM-NEXT: eortb z6.b, z6.b, z4.b
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z6.d
+; NOSVE2BITPERM-NEXT: trn1 z4.b, z2.b, z3.b
+; NOSVE2BITPERM-NEXT: trn2 z5.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmullb z7.h, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmul z4.b, z5.b, z4.b
+; NOSVE2BITPERM-NEXT: eorbt z4.b, z4.b, z4.b
+; NOSVE2BITPERM-NEXT: eortb z7.b, z7.b, z4.b
+; NOSVE2BITPERM-NEXT: and z4.d, z6.d, z1.d
+; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z4.d
+; NOSVE2BITPERM-NEXT: lsr z24.h, z4.h, #1
+; NOSVE2BITPERM-NEXT: and z4.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z7.d
+; NOSVE2BITPERM-NEXT: orr z1.d, z1.d, z24.d
+; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: lsr z4.h, z4.h, #1
+; NOSVE2BITPERM-NEXT: trn1 z5.b, z2.b, z3.b
+; NOSVE2BITPERM-NEXT: trn2 z6.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmullb z25.h, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: orr z0.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: pmul z5.b, z6.b, z5.b
+; NOSVE2BITPERM-NEXT: and z6.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: and z4.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z6.d
+; NOSVE2BITPERM-NEXT: lsr z6.h, z6.h, #2
+; NOSVE2BITPERM-NEXT: eorbt z5.b, z5.b, z5.b
+; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: lsr z4.h, z4.h, #2
+; NOSVE2BITPERM-NEXT: orr z1.d, z1.d, z6.d
+; NOSVE2BITPERM-NEXT: eortb z25.b, z25.b, z5.b
+; NOSVE2BITPERM-NEXT: orr z0.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z25.d
+; NOSVE2BITPERM-NEXT: and z4.d, z25.d, z1.d
+; NOSVE2BITPERM-NEXT: trn1 z5.b, z2.b, z3.b
+; NOSVE2BITPERM-NEXT: trn2 z6.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmullb z2.h, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: and z7.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z4.d
+; NOSVE2BITPERM-NEXT: lsr z4.h, z4.h, #4
+; NOSVE2BITPERM-NEXT: pmul z3.b, z6.b, z5.b
+; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: lsr z5.h, z7.h, #4
+; NOSVE2BITPERM-NEXT: orr z1.d, z1.d, z4.d
+; NOSVE2BITPERM-NEXT: eorbt z3.b, z3.b, z3.b
+; NOSVE2BITPERM-NEXT: orr z0.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: and z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eortb z2.b, z2.b, z3.b
+; NOSVE2BITPERM-NEXT: and z1.d, z1.d, z2.d
+; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: lsr z1.h, z1.h, #8
+; NOSVE2BITPERM-NEXT: orr z0.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: ret
+ %res = call <vscale x 8 x i16> @llvm.bext.nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask)
+ ret <vscale x 8 x i16> %res
+}
+
+define <vscale x 8 x i16> @bdep_nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask) nounwind {
+; BITPERM-LABEL: bdep_nxv8i16:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: bdep z0.h, z0.h, z1.h
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bdep_nxv8i16:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: movprfx z3, z1
+; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
+; NOSVE2BITPERM-NEXT: mov z2.h, #-1 // =0xffffffffffffffff
+; NOSVE2BITPERM-NEXT: lsl z3.h, z3.h, #1
+; NOSVE2BITPERM-NEXT: trn1 z4.b, z2.b, z3.b
+; NOSVE2BITPERM-NEXT: trn2 z5.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmullb z6.h, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmul z4.b, z5.b, z4.b
+; NOSVE2BITPERM-NEXT: eorbt z4.b, z4.b, z4.b
+; NOSVE2BITPERM-NEXT: eortb z6.b, z6.b, z4.b
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z6.d
+; NOSVE2BITPERM-NEXT: trn1 z4.b, z2.b, z3.b
+; NOSVE2BITPERM-NEXT: trn2 z5.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmullb z7.h, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmul z4.b, z5.b, z4.b
+; NOSVE2BITPERM-NEXT: eorbt z4.b, z4.b, z4.b
+; NOSVE2BITPERM-NEXT: eortb z7.b, z7.b, z4.b
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z7.d
+; NOSVE2BITPERM-NEXT: trn1 z4.b, z2.b, z3.b
+; NOSVE2BITPERM-NEXT: trn2 z5.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmullb z24.h, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmul z4.b, z5.b, z4.b
+; NOSVE2BITPERM-NEXT: and z5.d, z6.d, z1.d
+; NOSVE2BITPERM-NEXT: eor z6.d, z1.d, z5.d
+; NOSVE2BITPERM-NEXT: lsr z25.h, z5.h, #1
+; NOSVE2BITPERM-NEXT: eorbt z4.b, z4.b, z4.b
+; NOSVE2BITPERM-NEXT: orr z6.d, z6.d, z25.d
+; NOSVE2BITPERM-NEXT: eortb z24.b, z24.b, z4.b
+; NOSVE2BITPERM-NEXT: and z4.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z24.d
+; NOSVE2BITPERM-NEXT: eor z6.d, z6.d, z4.d
+; NOSVE2BITPERM-NEXT: lsr z7.h, z4.h, #2
+; NOSVE2BITPERM-NEXT: trn1 z25.b, z2.b, z3.b
+; NOSVE2BITPERM-NEXT: trn2 z26.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmullb z2.h, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: orr z3.d, z6.d, z7.d
+; NOSVE2BITPERM-NEXT: pmul z6.b, z26.b, z25.b
+; NOSVE2BITPERM-NEXT: and z7.d, z24.d, z3.d
+; NOSVE2BITPERM-NEXT: eorbt z6.b, z6.b, z6.b
+; NOSVE2BITPERM-NEXT: eor z3.d, z3.d, z7.d
+; NOSVE2BITPERM-NEXT: lsr z24.h, z7.h, #4
+; NOSVE2BITPERM-NEXT: orr z3.d, z3.d, z24.d
+; NOSVE2BITPERM-NEXT: eortb z2.b, z2.b, z6.b
+; NOSVE2BITPERM-NEXT: and z2.d, z2.d, z3.d
+; NOSVE2BITPERM-NEXT: lsl z3.h, z0.h, #8
+; NOSVE2BITPERM-NEXT: bsl z3.d, z3.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: lsl z0.h, z3.h, #4
+; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z3.d, z7.d
+; NOSVE2BITPERM-NEXT: lsl z2.h, z0.h, #2
+; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: lsl z0.h, z2.h, #1
+; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z2.d, z5.d
+; NOSVE2BITPERM-NEXT: and z0.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: ret
+ %res = call <vscale x 8 x i16> @llvm.bdep.nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask)
+ ret <vscale x 8 x i16> %res
+}
+
+define <vscale x 4 x i32> @bext_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask) nounwind {
+; BITPERM-LABEL: bext_nxv4i32:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: bext z0.s, z0.s, z1.s
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bext_nxv4i32:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: movprfx z3, z1
+; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
+; NOSVE2BITPERM-NEXT: mov z2.s, #-1 // =0xffffffffffffffff
+; NOSVE2BITPERM-NEXT: and z0.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: lsl z3.s, z3.s, #1
+; NOSVE2BITPERM-NEXT: pmullt z4.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: pmullb z5.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: trn1 z4.s, z5.s, z4.s
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z4.d
+; NOSVE2BITPERM-NEXT: and z4.d, z4.d, z1.d
+; NOSVE2BITPERM-NEXT: pmullt z5.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z4.d
+; NOSVE2BITPERM-NEXT: lsr z24.s, z4.s, #1
+; NOSVE2BITPERM-NEXT: pmullb z6.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: and z4.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: orr z1.d, z1.d, z24.d
+; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: lsr z4.s, z4.s, #1
+; NOSVE2BITPERM-NEXT: orr z0.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: trn1 z5.s, z6.s, z5.s
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z5.d
+; NOSVE2BITPERM-NEXT: and z5.d, z5.d, z1.d
+; NOSVE2BITPERM-NEXT: pmullt z6.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z5.d
+; NOSVE2BITPERM-NEXT: pmullb z7.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: trn1 z4.s, z7.s, z6.s
+; NOSVE2BITPERM-NEXT: lsr z6.s, z5.s, #2
+; NOSVE2BITPERM-NEXT: and z5.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z4.d
+; NOSVE2BITPERM-NEXT: orr z1.d, z1.d, z6.d
+; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: lsr z5.s, z5.s, #2
+; NOSVE2BITPERM-NEXT: pmullt z6.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: and z4.d, z4.d, z1.d
+; NOSVE2BITPERM-NEXT: pmullb z7.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: orr z0.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z4.d
+; NOSVE2BITPERM-NEXT: and z5.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: lsr z4.s, z4.s, #4
+; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: lsr z5.s, z5.s, #4
+; NOSVE2BITPERM-NEXT: orr z1.d, z1.d, z4.d
+; NOSVE2BITPERM-NEXT: trn1 z4.s, z7.s, z6.s
+; NOSVE2BITPERM-NEXT: orr z0.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: and z5.d, z4.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z4.d
+; NOSVE2BITPERM-NEXT: and z4.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: pmullt z6.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z5.d
+; NOSVE2BITPERM-NEXT: pmullb z2.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: lsr z3.s, z4.s, #8
+; NOSVE2BITPERM-NEXT: lsr z4.s, z5.s, #8
+; NOSVE2BITPERM-NEXT: orr z0.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: orr z1.d, z1.d, z4.d
+; NOSVE2BITPERM-NEXT: and z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: trn1 z2.s, z2.s, z6.s
+; NOSVE2BITPERM-NEXT: and z1.d, z1.d, z2.d
+; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: lsr z1.s, z1.s, #16
+; NOSVE2BITPERM-NEXT: orr z0.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: ret
+ %res = call <vscale x 4 x i32> @llvm.bext.nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask)
+ ret <vscale x 4 x i32> %res
+}
+
+define <vscale x 4 x i32> @bdep_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask) nounwind {
+; BITPERM-LABEL: bdep_nxv4i32:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: bdep z0.s, z0.s, z1.s
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bdep_nxv4i32:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: movprfx z3, z1
+; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
+; NOSVE2BITPERM-NEXT: mov z2.s, #-1 // =0xffffffffffffffff
+; NOSVE2BITPERM-NEXT: lsl z3.s, z3.s, #1
+; NOSVE2BITPERM-NEXT: pmullt z4.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: pmullb z5.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: trn1 z4.s, z5.s, z4.s
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z4.d
+; NOSVE2BITPERM-NEXT: and z4.d, z4.d, z1.d
+; NOSVE2BITPERM-NEXT: pmullt z5.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: lsr z24.s, z4.s, #1
+; NOSVE2BITPERM-NEXT: pmullb z6.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: trn1 z5.s, z6.s, z5.s
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z5.d
+; NOSVE2BITPERM-NEXT: pmullt z6.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: pmullb z7.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: trn1 z6.s, z7.s, z6.s
+; NOSVE2BITPERM-NEXT: eor z7.d, z1.d, z4.d
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z6.d
+; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z24.d
+; NOSVE2BITPERM-NEXT: pmullt z24.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: and z5.d, z5.d, z7.d
+; NOSVE2BITPERM-NEXT: pmullb z25.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z5.d
+; NOSVE2BITPERM-NEXT: lsr z26.s, z5.s, #2
+; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z26.d
+; NOSVE2BITPERM-NEXT: and z6.d, z6.d, z7.d
+; NOSVE2BITPERM-NEXT: trn1 z24.s, z25.s, z24.s
+; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: lsr z25.s, z6.s, #4
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z24.d
+; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z25.d
+; NOSVE2BITPERM-NEXT: pmullt z26.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: pmullb z2.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: and z3.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z3.d
+; NOSVE2BITPERM-NEXT: lsr z24.s, z3.s, #8
+; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z24.d
+; NOSVE2BITPERM-NEXT: trn1 z2.s, z2.s, z26.s
+; NOSVE2BITPERM-NEXT: and z2.d, z2.d, z7.d
+; NOSVE2BITPERM-NEXT: lsl z7.s, z0.s, #16
+; NOSVE2BITPERM-NEXT: bsl z7.d, z7.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: lsl z0.s, z7.s, #8
+; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z7.d, z3.d
+; NOSVE2BITPERM-NEXT: lsl z2.s, z0.s, #4
+; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: lsl z0.s, z2.s, #2
+; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z2.d, z5.d
+; NOSVE2BITPERM-NEXT: lsl z2.s, z0.s, #1
+; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: and z0.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: ret
+ %res = call <vscale x 4 x i32> @llvm.bdep.nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask)
+ ret <vscale x 4 x i32> %res
+}
+
+define <vscale x 2 x i64> @bext_nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask) nounwind {
+; BITPERM-LABEL: bext_nxv2i64:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: bext z0.d, z0.d, z1.d
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bext_nxv2i64:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
+; NOSVE2BITPERM-NEXT: addvl sp, sp, #-16
+; NOSVE2BITPERM-NEXT: str z23, [sp] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z22, [sp, #1, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z21, [sp, #2, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z20, [sp, #3, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z19, [sp, #4, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z18, [sp, #5, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z17, [sp, #6, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z16, [sp, #7, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z15, [sp, #8, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z14, [sp, #9, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z13, [sp, #10, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z12, [sp, #11, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z8, [sp, #15, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: addvl sp, sp, #-2
+; NOSVE2BITPERM-NEXT: str z0, [sp, #1, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: movprfx z0, z1
+; NOSVE2BITPERM-NEXT: subr z0.b, z0.b, #255 // =0xff
+; NOSVE2BITPERM-NEXT: mov z5.d, #128 // =0x80
+; NOSVE2BITPERM-NEXT: str z1, [sp] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x20000
+; NOSVE2BITPERM-NEXT: mov z29.d, #0x10000
+; NOSVE2BITPERM-NEXT: mov z30.d, #0x40000
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x2000000
+; NOSVE2BITPERM-NEXT: mov z26.d, #128 // =0x80
+; NOSVE2BITPERM-NEXT: lsl z0.d, z0.d, #1
+; NOSVE2BITPERM-NEXT: mov z31.d, #512 // =0x200
+; NOSVE2BITPERM-NEXT: mov z25.d, #256 // =0x100
+; NOSVE2BITPERM-NEXT: mov z6.d, #2048 // =0x800
+; NOSVE2BITPERM-NEXT: mov z7.d, #1024 // =0x400
+; NOSVE2BITPERM-NEXT: mov z21.d, #16384 // =0x4000
+; NOSVE2BITPERM-NEXT: mov z22.d, #0x20000
+; NOSVE2BITPERM-NEXT: mov z23.d, #0x10000
+; NOSVE2BITPERM-NEXT: mov z8.d, #0x2000000
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #2
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
+; NOSVE2BITPERM-NEXT: movprfx z3, z0
+; NOSVE2BITPERM-NEXT: mul z3.d, z3.d, #8
+; NOSVE2BITPERM-NEXT: movprfx z4, z0
+; NOSVE2BITPERM-NEXT: mul z4.d, z4.d, #4
+; NOSVE2BITPERM-NEXT: mov z9.d, #0x1000000
+; NOSVE2BITPERM-NEXT: mov z10.d, #0x8000000
+; NOSVE2BITPERM-NEXT: mov z11.d, #0x4000000
+; NOSVE2BITPERM-NEXT: mov z13.d, #0x20000000
+; NOSVE2BITPERM-NEXT: mov z14.d, #0x10000000
+; NOSVE2BITPERM-NEXT: mov z16.d, #0x40000000
+; NOSVE2BITPERM-NEXT: mov z12.d, #0x80000000
+; NOSVE2BITPERM-NEXT: mov z15.d, #0x200000000
+; NOSVE2BITPERM-NEXT: eor z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #16
+; NOSVE2BITPERM-NEXT: mov z18.d, #0x100000000
+; NOSVE2BITPERM-NEXT: mov z17.d, #0x800000000
+; NOSVE2BITPERM-NEXT: mov z19.d, #0x20000000000
+; NOSVE2BITPERM-NEXT: mov z20.d, #0x10000000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: movprfx z4, z0
+; NOSVE2BITPERM-NEXT: mul z4.d, z4.d, #64
+; NOSVE2BITPERM-NEXT: mov z5.d, #32768 // =0x8000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #512 // =0x200
+; NOSVE2BITPERM-NEXT: mov z2.d, #256 // =0x100
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #2048 // =0x800
+; NOSVE2BITPERM-NEXT: mov z4.d, #1024 // =0x400
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #8192 // =0x2000
+; NOSVE2BITPERM-NEXT: mov z2.d, #4096 // =0x1000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mov z4.d, #16384 // =0x4000
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x80000
+; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x200000
+; NOSVE2BITPERM-NEXT: mov z29.d, #0x100000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z30.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x800000
+; NOSVE2BITPERM-NEXT: mov z30.d, #0x400000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x1000000
+; NOSVE2BITPERM-NEXT: mov z29.d, #0x4000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z30.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x8000000
+; NOSVE2BITPERM-NEXT: mov z30.d, #0x800000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x20000000
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x10000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x80000000
+; NOSVE2BITPERM-NEXT: mov z29.d, #0x40000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x4000000000
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x200000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x100000000
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x400000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x200000000
+; NOSVE2BITPERM-NEXT: mov z29.d, #0x100000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z1.d, z3.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x800000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x1000000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x2000000000
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x8000000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x80000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x20000000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x10000000000
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x40000000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x800000000000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x200000000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x100000000000
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x400000000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x8000000000000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x4000000000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x2000000000000
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x1000000000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x20000000000000
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x10000000000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x80000000000000
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x40000000000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x800000000000000
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x400000000000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x200000000000000
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x100000000000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x1000000000000000
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x4000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x2000000000000000
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x8000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x40000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: eor3 z24.d, z24.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #2
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
+; NOSVE2BITPERM-NEXT: movprfx z3, z0
+; NOSVE2BITPERM-NEXT: mul z3.d, z3.d, #8
+; NOSVE2BITPERM-NEXT: movprfx z4, z0
+; NOSVE2BITPERM-NEXT: mul z4.d, z4.d, #4
+; NOSVE2BITPERM-NEXT: eor z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #16
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #64
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x80000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z31.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z25.d
+; NOSVE2BITPERM-NEXT: mov z25.d, #32768 // =0x8000
+; NOSVE2BITPERM-NEXT: mov z31.d, #0x400000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #8192 // =0x2000
+; NOSVE2BITPERM-NEXT: mov z7.d, #4096 // =0x1000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z25.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z21.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z22.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z23.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z30.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z31.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z8.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z9.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z10.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z11.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z13.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z14.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z12.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z16.d
+; NOSVE2BITPERM-NEXT: mov z16.d, #0x2000000000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z15.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z18.d
+; NOSVE2BITPERM-NEXT: mov z18.d, #0x8000000000
+; NOSVE2BITPERM-NEXT: mov z15.d, #0x4000000000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z17.d
+; NOSVE2BITPERM-NEXT: mov z17.d, #0x1000000000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z16.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z17.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z18.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z15.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z19.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z20.d
+; NOSVE2BITPERM-NEXT: mov z19.d, #0x80000000000
+; NOSVE2BITPERM-NEXT: mov z20.d, #0x40000000000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z19.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z20.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: movprfx z4, z0
+; NOSVE2BITPERM-NEXT: mul z4.d, z4.d, #2
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
+; NOSVE2BITPERM-NEXT: movprfx z3, z0
+; NOSVE2BITPERM-NEXT: mul z3.d, z3.d, #8
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #4
+; NOSVE2BITPERM-NEXT: eor z4.d, z2.d, z4.d
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #16
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z1.d, z3.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #128 // =0x80
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #64
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #512 // =0x200
+; NOSVE2BITPERM-NEXT: mov z2.d, #256 // =0x100
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #2048 // =0x800
+; NOSVE2BITPERM-NEXT: mov z2.d, #1024 // =0x400
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x8000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z25.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z21.d
+; NOSVE2BITPERM-NEXT: mov z21.d, #0x40000000000
+; NOSVE2BITPERM-NEXT: mov z25.d, #0x4000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z22.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z23.d
+; NOSVE2BITPERM-NEXT: mov z22.d, #0x20000000000
+; NOSVE2BITPERM-NEXT: mov z23.d, #0x10000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x2000000000000000
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x1000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: mov z29.d, #0x80000000000000
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x400000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z30.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z31.d
+; NOSVE2BITPERM-NEXT: mov z31.d, #0x20000000000000
+; NOSVE2BITPERM-NEXT: mov z30.d, #0x40000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z8.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z9.d
+; NOSVE2BITPERM-NEXT: mov z9.d, #0x8000000000000
+; NOSVE2BITPERM-NEXT: mov z8.d, #0x10000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z10.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z11.d
+; NOSVE2BITPERM-NEXT: mov z11.d, #0x2000000000000
+; NOSVE2BITPERM-NEXT: mov z10.d, #0x4000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z13.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z14.d
+; NOSVE2BITPERM-NEXT: mov z13.d, #0x800000000000
+; NOSVE2BITPERM-NEXT: mov z14.d, #0x400000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z12.d
+; NOSVE2BITPERM-NEXT: mov z12.d, #0x1000000000000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z16.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z17.d
+; NOSVE2BITPERM-NEXT: mov z16.d, #0x200000000000
+; NOSVE2BITPERM-NEXT: mov z17.d, #0x100000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z18.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z15.d
+; NOSVE2BITPERM-NEXT: mov z18.d, #0x100000000000
+; NOSVE2BITPERM-NEXT: mov z15.d, #0x200000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z19.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z20.d
+; NOSVE2BITPERM-NEXT: mov z19.d, #0x80000000000
+; NOSVE2BITPERM-NEXT: mov z20.d, #0x800000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: movprfx z3, z0
+; NOSVE2BITPERM-NEXT: mul z3.d, z3.d, #2
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #8
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #4
+; NOSVE2BITPERM-NEXT: eor z3.d, z2.d, z3.d
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #16
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z1.d, z7.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #128 // =0x80
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #64
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #512 // =0x200
+; NOSVE2BITPERM-NEXT: mov z2.d, #256 // =0x100
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #2048 // =0x800
+; NOSVE2BITPERM-NEXT: mov z2.d, #1024 // =0x400
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #8192 // =0x2000
+; NOSVE2BITPERM-NEXT: mov z2.d, #4096 // =0x1000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #32768 // =0x8000
+; NOSVE2BITPERM-NEXT: mov z2.d, #16384 // =0x4000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z22.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z23.d
+; NOSVE2BITPERM-NEXT: mov z23.d, #0x80000000000
+; NOSVE2BITPERM-NEXT: mov z22.d, #0x100000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z19.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z21.d
+; NOSVE2BITPERM-NEXT: mov z21.d, #0x200000000000
+; NOSVE2BITPERM-NEXT: mov z19.d, #0x400000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z16.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z18.d
+; NOSVE2BITPERM-NEXT: mov z18.d, #0x800000000000
+; NOSVE2BITPERM-NEXT: mov z16.d, #0x1000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z13.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z14.d
+; NOSVE2BITPERM-NEXT: mov z13.d, #0x2000000000000
+; NOSVE2BITPERM-NEXT: mov z14.d, #0x200000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z11.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z12.d
+; NOSVE2BITPERM-NEXT: mov z11.d, #0x8000000000000
+; NOSVE2BITPERM-NEXT: mov z12.d, #0x4000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z9.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z10.d
+; NOSVE2BITPERM-NEXT: mov z9.d, #0x20000000000000
+; NOSVE2BITPERM-NEXT: mov z10.d, #0x10000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z31.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z8.d
+; NOSVE2BITPERM-NEXT: mov z31.d, #0x80000000000000
+; NOSVE2BITPERM-NEXT: mov z8.d, #0x40000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z30.d
+; NOSVE2BITPERM-NEXT: mov z29.d, #0x400000000000000
+; NOSVE2BITPERM-NEXT: mov z30.d, #8192 // =0x2000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z15.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z17.d
+; NOSVE2BITPERM-NEXT: mov z17.d, #0x100000000000000
+; NOSVE2BITPERM-NEXT: mov z15.d, #4096 // =0x1000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z20.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mov z20.d, #0x800000000000000
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x2000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x1000000000000000
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x8000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z25.d
+; NOSVE2BITPERM-NEXT: mov z25.d, #0x4000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: movprfx z6, z0
+; NOSVE2BITPERM-NEXT: mul z6.d, z6.d, #2
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #8
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #4
+; NOSVE2BITPERM-NEXT: eor z2.d, z2.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #256 // =0x100
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z1.d, z7.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #16
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #128 // =0x80
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #64
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #512 // =0x200
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #1024 // =0x400
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #2048 // =0x800
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #4096 // =0x1000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #8192 // =0x2000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #16384 // =0x4000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #32768 // =0x8000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x10000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x40000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x100000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x400000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x1000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x4000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x10000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x40000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x100000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x400000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x1000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x4000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x10000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x40000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z23.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z23.d, #0x40000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z21.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z22.d
+; NOSVE2BITPERM-NEXT: mov z21.d, #0x200000000000
+; NOSVE2BITPERM-NEXT: mov z22.d, #0x100000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z18.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z19.d
+; NOSVE2BITPERM-NEXT: mov z18.d, #0x800000000000
+; NOSVE2BITPERM-NEXT: mov z19.d, #0x400000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z13.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z16.d
+; NOSVE2BITPERM-NEXT: mov z13.d, #0x1000000000000
+; NOSVE2BITPERM-NEXT: mov z16.d, #0x8000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z11.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z12.d
+; NOSVE2BITPERM-NEXT: mov z11.d, #0x4000000000000
+; NOSVE2BITPERM-NEXT: mov z12.d, #0x20000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z9.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z10.d
+; NOSVE2BITPERM-NEXT: mov z9.d, #0x10000000000000
+; NOSVE2BITPERM-NEXT: mov z10.d, #0x80000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z31.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z8.d
+; NOSVE2BITPERM-NEXT: mov z31.d, #0x40000000000000
+; NOSVE2BITPERM-NEXT: mov z8.d, #0x200000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z14.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z17.d
+; NOSVE2BITPERM-NEXT: mov z14.d, #0x100000000000000
+; NOSVE2BITPERM-NEXT: mov z17.d, #0x800000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z20.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: mov z29.d, #0x400000000000000
+; NOSVE2BITPERM-NEXT: mov z20.d, #0x1000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x2000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z25.d
+; NOSVE2BITPERM-NEXT: ldr z26, [sp] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #2
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #1
+; NOSVE2BITPERM-NEXT: movprfx z25, z0
+; NOSVE2BITPERM-NEXT: mul z25.d, z25.d, #8
+; NOSVE2BITPERM-NEXT: movprfx z6, z0
+; NOSVE2BITPERM-NEXT: mul z6.d, z6.d, #4
+; NOSVE2BITPERM-NEXT: eor z1.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #16
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z6.d, z25.d
+; NOSVE2BITPERM-NEXT: movprfx z6, z0
+; NOSVE2BITPERM-NEXT: mul z6.d, z6.d, #32
+; NOSVE2BITPERM-NEXT: mov z25.d, #0x10000000000
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #128 // =0x80
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #64
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z25.d
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #512 // =0x200
+; NOSVE2BITPERM-NEXT: mov z7.d, #256 // =0x100
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #2048 // =0x800
+; NOSVE2BITPERM-NEXT: mov z7.d, #1024 // =0x400
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z30.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z15.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #32768 // =0x8000
+; NOSVE2BITPERM-NEXT: mov z7.d, #16384 // =0x4000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x20000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x10000
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x80000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x40000
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x200000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x100000
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x800000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x400000
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x2000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x1000000
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x8000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x4000000
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x20000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x10000000
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x80000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x40000000
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x200000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x100000000
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x800000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x400000000
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x2000000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x1000000000
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x8000000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x4000000000
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: and z7.d, z24.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x20000000000
+; NOSVE2BITPERM-NEXT: ldr z6, [sp, #1, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: eor z27.d, z26.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: and z6.d, z6.d, z26.d
+; NOSVE2BITPERM-NEXT: lsr z26.d, z7.d, #1
+; NOSVE2BITPERM-NEXT: and z7.d, z6.d, z7.d
+; NOSVE2BITPERM-NEXT: orr z26.d, z27.d, z26.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x80000000000
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z23.d
+; NOSVE2BITPERM-NEXT: eor z6.d, z6.d, z7.d
+; NOSVE2BITPERM-NEXT: lsr z7.d, z7.d, #1
+; NOSVE2BITPERM-NEXT: and z5.d, z5.d, z26.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: orr z6.d, z6.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z21.d
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z22.d
+; NOSVE2BITPERM-NEXT: and z7.d, z6.d, z5.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
+; NOSVE2BITPERM-NEXT: eor z24.d, z26.d, z5.d
+; NOSVE2BITPERM-NEXT: lsr z5.d, z5.d, #2
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z18.d
+; NOSVE2BITPERM-NEXT: mul z26.d, z0.d, z19.d
+; NOSVE2BITPERM-NEXT: eor z6.d, z6.d, z7.d
+; NOSVE2BITPERM-NEXT: lsr z7.d, z7.d, #2
+; NOSVE2BITPERM-NEXT: orr z5.d, z24.d, z5.d
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x2000000000000
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z26.d, z25.d
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z13.d
+; NOSVE2BITPERM-NEXT: orr z6.d, z6.d, z7.d
+; NOSVE2BITPERM-NEXT: and z4.d, z4.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z16.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor z5.d, z5.d, z4.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z11.d
+; NOSVE2BITPERM-NEXT: and z25.d, z6.d, z4.d
+; NOSVE2BITPERM-NEXT: lsr z4.d, z4.d, #4
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: orr z4.d, z5.d, z4.d
+; NOSVE2BITPERM-NEXT: eor z5.d, z6.d, z25.d
+; NOSVE2BITPERM-NEXT: lsr z6.d, z25.d, #4
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z12.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z9.d
+; NOSVE2BITPERM-NEXT: and z3.d, z3.d, z4.d
+; NOSVE2BITPERM-NEXT: orr z5.d, z5.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z10.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z31.d
+; NOSVE2BITPERM-NEXT: eor z4.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: and z24.d, z5.d, z3.d
+; NOSVE2BITPERM-NEXT: lsr z3.d, z3.d, #8
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z8.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z14.d
+; NOSVE2BITPERM-NEXT: eor z5.d, z5.d, z24.d
+; NOSVE2BITPERM-NEXT: lsr z24.d, z24.d, #8
+; NOSVE2BITPERM-NEXT: orr z3.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: orr z4.d, z5.d, z24.d
+; NOSVE2BITPERM-NEXT: mul z5.d, z0.d, z17.d
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: and z2.d, z2.d, z3.d
+; NOSVE2BITPERM-NEXT: and z7.d, z4.d, z2.d
+; NOSVE2BITPERM-NEXT: eor z3.d, z3.d, z2.d
+; NOSVE2BITPERM-NEXT: lsr z2.d, z2.d, #16
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z6.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z5.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mul z6.d, z0.d, z20.d
+; NOSVE2BITPERM-NEXT: eor z4.d, z4.d, z7.d
+; NOSVE2BITPERM-NEXT: lsr z7.d, z7.d, #16
+; NOSVE2BITPERM-NEXT: orr z2.d, z3.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z6.d, z5.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x8000000000000000
+; NOSVE2BITPERM-NEXT: mov z6.d, #0x4000000000000000
+; NOSVE2BITPERM-NEXT: orr z4.d, z4.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z5.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z0.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: and z0.d, z4.d, z2.d
+; NOSVE2BITPERM-NEXT: and z0.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor z1.d, z4.d, z0.d
+; NOSVE2BITPERM-NEXT: lsr z0.d, z0.d, #32
+; NOSVE2BITPERM-NEXT: orr z0.d, z1.d, z0.d
+; NOSVE2BITPERM-NEXT: addvl sp, sp, #2
+; NOSVE2BITPERM-NEXT: ldr z23, [sp] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z22, [sp, #1, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z21, [sp, #2, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z20, [sp, #3, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z19, [sp, #4, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z18, [sp, #5, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z17, [sp, #6, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z16, [sp, #7, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z15, [sp, #8, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z14, [sp, #9, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z13, [sp, #10, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z12, [sp, #11, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z8, [sp, #15, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: addvl sp, sp, #16
+; NOSVE2BITPERM-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ret
+ %res = call <vscale x 2 x i64> @llvm.bext.nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask)
+ ret <vscale x 2 x i64> %res
+}
+
+define <vscale x 2 x i64> @bdep_nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask) nounwind {
+; BITPERM-LABEL: bdep_nxv2i64:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: bdep z0.d, z0.d, z1.d
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bdep_nxv2i64:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
+; NOSVE2BITPERM-NEXT: addvl sp, sp, #-16
+; NOSVE2BITPERM-NEXT: str z23, [sp] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z22, [sp, #1, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z21, [sp, #2, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z20, [sp, #3, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z19, [sp, #4, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z18, [sp, #5, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z17, [sp, #6, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z16, [sp, #7, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z15, [sp, #8, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z14, [sp, #9, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z13, [sp, #10, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z12, [sp, #11, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z8, [sp, #15, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: addvl sp, sp, #-2
+; NOSVE2BITPERM-NEXT: str z0, [sp, #1, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: movprfx z0, z1
+; NOSVE2BITPERM-NEXT: subr z0.b, z0.b, #255 // =0xff
+; NOSVE2BITPERM-NEXT: mov z5.d, #128 // =0x80
+; NOSVE2BITPERM-NEXT: str z1, [sp] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x20000
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x10000
+; NOSVE2BITPERM-NEXT: mov z29.d, #0x40000
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x200000
+; NOSVE2BITPERM-NEXT: mov z30.d, #128 // =0x80
+; NOSVE2BITPERM-NEXT: lsl z0.d, z0.d, #1
+; NOSVE2BITPERM-NEXT: mov z31.d, #512 // =0x200
+; NOSVE2BITPERM-NEXT: mov z25.d, #256 // =0x100
+; NOSVE2BITPERM-NEXT: mov z7.d, #2048 // =0x800
+; NOSVE2BITPERM-NEXT: mov z24.d, #1024 // =0x400
+; NOSVE2BITPERM-NEXT: mov z22.d, #8192 // =0x2000
+; NOSVE2BITPERM-NEXT: mov z8.d, #0x100000
+; NOSVE2BITPERM-NEXT: mov z9.d, #0x800000
+; NOSVE2BITPERM-NEXT: mov z10.d, #0x400000
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #2
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
+; NOSVE2BITPERM-NEXT: movprfx z3, z0
+; NOSVE2BITPERM-NEXT: mul z3.d, z3.d, #8
+; NOSVE2BITPERM-NEXT: movprfx z4, z0
+; NOSVE2BITPERM-NEXT: mul z4.d, z4.d, #4
+; NOSVE2BITPERM-NEXT: mov z11.d, #0x2000000
+; NOSVE2BITPERM-NEXT: mov z12.d, #0x1000000
+; NOSVE2BITPERM-NEXT: mov z13.d, #0x8000000
+; NOSVE2BITPERM-NEXT: mov z14.d, #0x4000000
+; NOSVE2BITPERM-NEXT: mov z16.d, #0x20000000
+; NOSVE2BITPERM-NEXT: mov z17.d, #0x10000000
+; NOSVE2BITPERM-NEXT: mov z18.d, #0x40000000
+; NOSVE2BITPERM-NEXT: mov z15.d, #0x80000000
+; NOSVE2BITPERM-NEXT: eor z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #16
+; NOSVE2BITPERM-NEXT: mov z19.d, #0x800000000
+; NOSVE2BITPERM-NEXT: mov z20.d, #0x400000000
+; NOSVE2BITPERM-NEXT: mov z21.d, #0x20000000000
+; NOSVE2BITPERM-NEXT: mov z23.d, #0x200000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: movprfx z4, z0
+; NOSVE2BITPERM-NEXT: mul z4.d, z4.d, #64
+; NOSVE2BITPERM-NEXT: mov z5.d, #32768 // =0x8000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #512 // =0x200
+; NOSVE2BITPERM-NEXT: mov z2.d, #256 // =0x100
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #2048 // =0x800
+; NOSVE2BITPERM-NEXT: mov z4.d, #1024 // =0x400
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #8192 // =0x2000
+; NOSVE2BITPERM-NEXT: mov z2.d, #4096 // =0x1000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mov z4.d, #16384 // =0x4000
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x80000
+; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x100000
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x400000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x800000
+; NOSVE2BITPERM-NEXT: mov z29.d, #0x80000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x2000000
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x1000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x8000000
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x4000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x20000000
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x10000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x80000000
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x40000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x4000000000
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x20000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x100000000
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x400000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x200000000
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x10000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z1.d, z3.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x800000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x1000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x2000000000
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x8000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x10000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x20000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x80000000000
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x40000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x200000000000
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x100000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x800000000000
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x400000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x2000000000000
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x1000000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x8000000000000
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x4000000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x20000000000000
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x10000000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x80000000000000
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x40000000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x200000000000000
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x100000000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x800000000000000
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x400000000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x2000000000000000
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x1000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x8000000000000000
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x4000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z26.d, #16384 // =0x4000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #2
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
+; NOSVE2BITPERM-NEXT: movprfx z3, z0
+; NOSVE2BITPERM-NEXT: mul z3.d, z3.d, #8
+; NOSVE2BITPERM-NEXT: movprfx z4, z0
+; NOSVE2BITPERM-NEXT: mul z4.d, z4.d, #4
+; NOSVE2BITPERM-NEXT: eor z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #16
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z30.d
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #64
+; NOSVE2BITPERM-NEXT: mov z30.d, #0x40000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z31.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z25.d
+; NOSVE2BITPERM-NEXT: mov z25.d, #32768 // =0x8000
+; NOSVE2BITPERM-NEXT: mov z31.d, #0x200000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x10000000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x100000000000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #4096 // =0x1000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z22.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z25.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z30.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z31.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z8.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z9.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z10.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z11.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z12.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z13.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z14.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z16.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z17.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z15.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z18.d
+; NOSVE2BITPERM-NEXT: mov z18.d, #0x8000000000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z19.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z20.d
+; NOSVE2BITPERM-NEXT: mov z19.d, #0x2000000000
+; NOSVE2BITPERM-NEXT: mov z20.d, #0x1000000000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z19.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z20.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z18.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z21.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z21.d, #0x80000000000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z21.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z23.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: mov z23.d, #0x800000000000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z23.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: movprfx z4, z0
+; NOSVE2BITPERM-NEXT: mul z4.d, z4.d, #2
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
+; NOSVE2BITPERM-NEXT: movprfx z3, z0
+; NOSVE2BITPERM-NEXT: mul z3.d, z3.d, #8
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #4
+; NOSVE2BITPERM-NEXT: eor z4.d, z2.d, z4.d
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #16
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z1.d, z3.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #128 // =0x80
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #64
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #512 // =0x200
+; NOSVE2BITPERM-NEXT: mov z2.d, #256 // =0x100
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #2048 // =0x800
+; NOSVE2BITPERM-NEXT: mov z2.d, #1024 // =0x400
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #4096 // =0x1000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z22.d
+; NOSVE2BITPERM-NEXT: mov z22.d, #8192 // =0x2000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z25.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z26.d, #16384 // =0x4000
+; NOSVE2BITPERM-NEXT: mov z25.d, #0x4000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x2000000000000000
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x1000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z30.d
+; NOSVE2BITPERM-NEXT: mov z29.d, #0x800000000000000
+; NOSVE2BITPERM-NEXT: mov z30.d, #0x400000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z31.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z8.d
+; NOSVE2BITPERM-NEXT: mov z31.d, #0x200000000000000
+; NOSVE2BITPERM-NEXT: mov z8.d, #0x100000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z9.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z10.d
+; NOSVE2BITPERM-NEXT: mov z9.d, #0x80000000000000
+; NOSVE2BITPERM-NEXT: mov z10.d, #0x40000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z11.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z12.d
+; NOSVE2BITPERM-NEXT: mov z11.d, #0x20000000000000
+; NOSVE2BITPERM-NEXT: mov z12.d, #0x10000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z13.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z14.d
+; NOSVE2BITPERM-NEXT: mov z13.d, #0x8000000000000
+; NOSVE2BITPERM-NEXT: mov z14.d, #0x4000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z16.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z17.d
+; NOSVE2BITPERM-NEXT: mov z17.d, #0x400000000000
+; NOSVE2BITPERM-NEXT: mov z16.d, #0x1000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z15.d
+; NOSVE2BITPERM-NEXT: mov z15.d, #0x2000000000000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z19.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z20.d
+; NOSVE2BITPERM-NEXT: mov z19.d, #0x2000000000
+; NOSVE2BITPERM-NEXT: mov z20.d, #0x1000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z18.d
+; NOSVE2BITPERM-NEXT: mov z18.d, #0x8000000000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z21.d
+; NOSVE2BITPERM-NEXT: mov z21.d, #0x800000000000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x8000000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z23.d
+; NOSVE2BITPERM-NEXT: mov z23.d, #4096 // =0x1000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: movprfx z3, z0
+; NOSVE2BITPERM-NEXT: mul z3.d, z3.d, #2
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #8
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #4
+; NOSVE2BITPERM-NEXT: eor z3.d, z2.d, z3.d
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #16
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z1.d, z7.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #128 // =0x80
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #64
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #512 // =0x200
+; NOSVE2BITPERM-NEXT: mov z2.d, #256 // =0x100
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #2048 // =0x800
+; NOSVE2BITPERM-NEXT: mov z2.d, #1024 // =0x400
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #4096 // =0x1000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z22.d
+; NOSVE2BITPERM-NEXT: mov z22.d, #8192 // =0x2000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #32768 // =0x8000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z26.d, #8192 // =0x2000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z19.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z20.d
+; NOSVE2BITPERM-NEXT: mov z20.d, #0x400000000000
+; NOSVE2BITPERM-NEXT: mov z19.d, #0x20000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z18.d
+; NOSVE2BITPERM-NEXT: mov z18.d, #0x1000000000000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z21.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z17.d
+; NOSVE2BITPERM-NEXT: mov z21.d, #0x800000000000
+; NOSVE2BITPERM-NEXT: mov z17.d, #0x2000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z15.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z16.d
+; NOSVE2BITPERM-NEXT: mov z16.d, #0x8000000000000
+; NOSVE2BITPERM-NEXT: mov z15.d, #0x4000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z13.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z14.d
+; NOSVE2BITPERM-NEXT: mov z13.d, #0x20000000000000
+; NOSVE2BITPERM-NEXT: mov z14.d, #0x10000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z11.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z12.d
+; NOSVE2BITPERM-NEXT: mov z12.d, #0x80000000000000
+; NOSVE2BITPERM-NEXT: mov z11.d, #0x40000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z9.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z10.d
+; NOSVE2BITPERM-NEXT: mov z9.d, #0x200000000000000
+; NOSVE2BITPERM-NEXT: mov z10.d, #0x100000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z31.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z8.d
+; NOSVE2BITPERM-NEXT: mov z8.d, #0x800000000000000
+; NOSVE2BITPERM-NEXT: mov z31.d, #0x400000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z30.d
+; NOSVE2BITPERM-NEXT: mov z29.d, #0x2000000000000000
+; NOSVE2BITPERM-NEXT: mov z30.d, #0x1000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x8000000000000000
+; NOSVE2BITPERM-NEXT: mov z28.d, #16384 // =0x4000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z25.d
+; NOSVE2BITPERM-NEXT: mov z25.d, #0x4000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: movprfx z24, z0
+; NOSVE2BITPERM-NEXT: mul z24.d, z24.d, #2
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #8
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #4
+; NOSVE2BITPERM-NEXT: eor z2.d, z2.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z1.d, z7.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #16
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #128 // =0x80
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #64
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #512 // =0x200
+; NOSVE2BITPERM-NEXT: mov z7.d, #256 // =0x100
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #2048 // =0x800
+; NOSVE2BITPERM-NEXT: mov z7.d, #1024 // =0x400
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z22.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z23.d
+; NOSVE2BITPERM-NEXT: mov z22.d, #4096 // =0x1000
+; NOSVE2BITPERM-NEXT: mov z23.d, #32768 // =0x8000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #32768 // =0x8000
+; NOSVE2BITPERM-NEXT: mov z7.d, #16384 // =0x4000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x10000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x40000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x100000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x400000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x1000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x4000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x10000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x40000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x100000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x400000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x1000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x4000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x10000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x40000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x100000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z21.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z20.d
+; NOSVE2BITPERM-NEXT: mov z21.d, #0x800000000000
+; NOSVE2BITPERM-NEXT: mov z20.d, #0x400000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z17.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z18.d
+; NOSVE2BITPERM-NEXT: mov z17.d, #0x1000000000000
+; NOSVE2BITPERM-NEXT: mov z18.d, #0x20000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z16.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z15.d
+; NOSVE2BITPERM-NEXT: mov z15.d, #0x4000000000000
+; NOSVE2BITPERM-NEXT: mov z16.d, #0x8000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z13.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z14.d
+; NOSVE2BITPERM-NEXT: mov z13.d, #0x10000000000000
+; NOSVE2BITPERM-NEXT: mov z14.d, #0x200000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z12.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z11.d
+; NOSVE2BITPERM-NEXT: mov z12.d, #0x80000000000000
+; NOSVE2BITPERM-NEXT: mov z11.d, #0x40000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z9.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z10.d
+; NOSVE2BITPERM-NEXT: mov z9.d, #0x100000000000000
+; NOSVE2BITPERM-NEXT: mov z10.d, #0x2000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z8.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z31.d
+; NOSVE2BITPERM-NEXT: mov z8.d, #0x800000000000000
+; NOSVE2BITPERM-NEXT: mov z31.d, #0x400000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z30.d
+; NOSVE2BITPERM-NEXT: mov z29.d, #0x1000000000000000
+; NOSVE2BITPERM-NEXT: mov z30.d, #0x4000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z25.d
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x8000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: movprfx z25, z0
+; NOSVE2BITPERM-NEXT: mul z25.d, z25.d, #2
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #1
+; NOSVE2BITPERM-NEXT: movprfx z24, z0
+; NOSVE2BITPERM-NEXT: mul z24.d, z24.d, #8
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #4
+; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z25.d
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z21.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z24.d
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #32
+; NOSVE2BITPERM-NEXT: movprfx z24, z0
+; NOSVE2BITPERM-NEXT: mul z24.d, z24.d, #16
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #128 // =0x80
+; NOSVE2BITPERM-NEXT: movprfx z24, z0
+; NOSVE2BITPERM-NEXT: mul z24.d, z24.d, #64
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #512 // =0x200
+; NOSVE2BITPERM-NEXT: mov z24.d, #256 // =0x100
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #2048 // =0x800
+; NOSVE2BITPERM-NEXT: mov z24.d, #1024 // =0x400
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z22.d
+; NOSVE2BITPERM-NEXT: ldr z26, [sp] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z23.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: and z6.d, z6.d, z26.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x10000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z19.d
+; NOSVE2BITPERM-NEXT: mul z19.d, z0.d, z20.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x80000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x40000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x200000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x100000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x800000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x400000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x2000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x1000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x8000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x4000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x20000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x10000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x80000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x40000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x200000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x100000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x800000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x400000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x2000000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x1000000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x8000000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x4000000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x20000000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x10000000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x80000000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x40000000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x200000000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x100000000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: eor z7.d, z26.d, z6.d
+; NOSVE2BITPERM-NEXT: lsr z24.d, z6.d, #1
+; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z24.d
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x2000000000000
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z19.d, z25.d
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z17.d
+; NOSVE2BITPERM-NEXT: and z5.d, z5.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z5.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z15.d
+; NOSVE2BITPERM-NEXT: lsr z15.d, z5.d, #2
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z16.d
+; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z15.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z18.d
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z13.d
+; NOSVE2BITPERM-NEXT: and z4.d, z4.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z12.d
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z11.d
+; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z4.d
+; NOSVE2BITPERM-NEXT: lsr z11.d, z4.d, #4
+; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z11.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z14.d
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z9.d
+; NOSVE2BITPERM-NEXT: and z3.d, z3.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z8.d
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z31.d
+; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z3.d
+; NOSVE2BITPERM-NEXT: lsr z31.d, z3.d, #8
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
+; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z31.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z10.d
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: and z2.d, z2.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mul z0.d, z0.d, z30.d
+; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z2.d
+; NOSVE2BITPERM-NEXT: lsr z25.d, z2.d, #16
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: orr z0.d, z7.d, z25.d
+; NOSVE2BITPERM-NEXT: ldr z7, [sp, #1, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: and z0.d, z1.d, z0.d
+; NOSVE2BITPERM-NEXT: lsl z1.d, z7.d, #32
+; NOSVE2BITPERM-NEXT: bsl z1.d, z1.d, z7.d, z0.d
+; NOSVE2BITPERM-NEXT: lsl z0.d, z1.d, #16
+; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z1.d, z2.d
+; NOSVE2BITPERM-NEXT: lsl z1.d, z0.d, #8
+; NOSVE2BITPERM-NEXT: bsl z1.d, z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: lsl z0.d, z1.d, #4
+; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z1.d, z4.d
+; NOSVE2BITPERM-NEXT: lsl z1.d, z0.d, #2
+; NOSVE2BITPERM-NEXT: bsl z1.d, z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: lsl z0.d, z1.d, #1
+; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z1.d, z6.d
+; NOSVE2BITPERM-NEXT: and z0.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: addvl sp, sp, #2
+; NOSVE2BITPERM-NEXT: ldr z23, [sp] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z22, [sp, #1, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z21, [sp, #2, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z20, [sp, #3, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z19, [sp, #4, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z18, [sp, #5, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z17, [sp, #6, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z16, [sp, #7, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z15, [sp, #8, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z14, [sp, #9, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z13, [sp, #10, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z12, [sp, #11, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z8, [sp, #15, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: addvl sp, sp, #16
+; NOSVE2BITPERM-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ret
+ %res = call <vscale x 2 x i64> @llvm.bdep.nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask)
+ ret <vscale x 2 x i64> %res
+}
+
+declare i8 @llvm.bext.i8(i8, i8)
+declare i16 @llvm.bext.i16(i16, i16)
+declare i32 @llvm.bext.i32(i32, i32)
+declare i64 @llvm.bext.i64(i64, i64)
+declare i8 @llvm.bdep.i8(i8, i8)
+declare i16 @llvm.bdep.i16(i16, i16)
+declare i32 @llvm.bdep.i32(i32, i32)
+declare i64 @llvm.bdep.i64(i64, i64)
+declare <vscale x 16 x i8> @llvm.bext.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>)
+declare <vscale x 8 x i16> @llvm.bext.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>)
+declare <vscale x 4 x i32> @llvm.bext.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>)
+declare <vscale x 2 x i64> @llvm.bext.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>)
+declare <vscale x 16 x i8> @llvm.bdep.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>)
+declare <vscale x 8 x i16> @llvm.bdep.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>)
+declare <vscale x 4 x i32> @llvm.bdep.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>)
+declare <vscale x 2 x i64> @llvm.bdep.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>)
diff --git a/llvm/test/CodeGen/X86/bext-bdep.ll b/llvm/test/CodeGen/X86/bext-bdep.ll
new file mode 100644
index 0000000000000..d27094d8423b2
--- /dev/null
+++ b/llvm/test/CodeGen/X86/bext-bdep.ll
@@ -0,0 +1,4123 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+bmi2 | FileCheck %s --check-prefix=BMI2
+; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s --check-prefix=NOBMI2
+
+define i8 @bext_i8(i8 %val, i8 %mask) nounwind {
+; BMI2-LABEL: bext_i8:
+; BMI2: # %bb.0:
+; BMI2-NEXT: movzbl %sil, %eax
+; BMI2-NEXT: movzbl %dil, %ecx
+; BMI2-NEXT: pextl %eax, %ecx, %eax
+; BMI2-NEXT: # kill: def $al killed $al killed $eax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bext_i8:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: movl %esi, %ecx
+; NOBMI2-NEXT: notb %cl
+; NOBMI2-NEXT: leal (,%rcx,4), %edx
+; NOBMI2-NEXT: leal (%rcx,%rcx), %eax
+; NOBMI2-NEXT: xorb %al, %dl
+; NOBMI2-NEXT: leal (,%rcx,8), %r8d
+; NOBMI2-NEXT: movl %ecx, %r9d
+; NOBMI2-NEXT: shlb $4, %r9b
+; NOBMI2-NEXT: xorb %r8b, %r9b
+; NOBMI2-NEXT: xorb %dl, %r9b
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shlb $5, %dl
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shlb $6, %r8b
+; NOBMI2-NEXT: xorb %dl, %r8b
+; NOBMI2-NEXT: shlb $7, %cl
+; NOBMI2-NEXT: xorb %r8b, %cl
+; NOBMI2-NEXT: xorb %r9b, %cl
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: andb %sil, %dl
+; NOBMI2-NEXT: andl %esi, %edi
+; NOBMI2-NEXT: movl %edi, %r8d
+; NOBMI2-NEXT: andb %dl, %r8b
+; NOBMI2-NEXT: xorb %r8b, %dil
+; NOBMI2-NEXT: shrb %r8b
+; NOBMI2-NEXT: orb %dil, %r8b
+; NOBMI2-NEXT: xorb %dl, %sil
+; NOBMI2-NEXT: shrb %dl
+; NOBMI2-NEXT: orb %sil, %dl
+; NOBMI2-NEXT: notb %cl
+; NOBMI2-NEXT: andb %al, %cl
+; NOBMI2-NEXT: leal (%rcx,%rcx), %eax
+; NOBMI2-NEXT: xorb %cl, %al
+; NOBMI2-NEXT: leal (,%rcx,4), %esi
+; NOBMI2-NEXT: leal (,%rcx,8), %edi
+; NOBMI2-NEXT: xorb %sil, %dil
+; NOBMI2-NEXT: xorb %al, %dil
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shlb $4, %al
+; NOBMI2-NEXT: movl %ecx, %r9d
+; NOBMI2-NEXT: shlb $5, %r9b
+; NOBMI2-NEXT: xorb %al, %r9b
+; NOBMI2-NEXT: movl %ecx, %esi
+; NOBMI2-NEXT: shlb $6, %sil
+; NOBMI2-NEXT: xorb %r9b, %sil
+; NOBMI2-NEXT: xorb %dil, %sil
+; NOBMI2-NEXT: movl %esi, %eax
+; NOBMI2-NEXT: andb %dl, %al
+; NOBMI2-NEXT: movl %r8d, %edi
+; NOBMI2-NEXT: andb %al, %dil
+; NOBMI2-NEXT: xorb %dil, %r8b
+; NOBMI2-NEXT: shrb $2, %dil
+; NOBMI2-NEXT: orb %r8b, %dil
+; NOBMI2-NEXT: xorb %al, %dl
+; NOBMI2-NEXT: shrb $2, %al
+; NOBMI2-NEXT: orb %dl, %al
+; NOBMI2-NEXT: notb %sil
+; NOBMI2-NEXT: andb %cl, %sil
+; NOBMI2-NEXT: leal (%rsi,%rsi), %ecx
+; NOBMI2-NEXT: xorb %sil, %cl
+; NOBMI2-NEXT: leal (,%rsi,4), %edx
+; NOBMI2-NEXT: leal (,%rsi,8), %r8d
+; NOBMI2-NEXT: xorb %dl, %r8b
+; NOBMI2-NEXT: xorb %cl, %r8b
+; NOBMI2-NEXT: movl %esi, %ecx
+; NOBMI2-NEXT: shlb $4, %cl
+; NOBMI2-NEXT: movl %esi, %edx
+; NOBMI2-NEXT: shlb $5, %dl
+; NOBMI2-NEXT: xorb %cl, %dl
+; NOBMI2-NEXT: shlb $6, %sil
+; NOBMI2-NEXT: xorb %dl, %sil
+; NOBMI2-NEXT: xorb %r8b, %sil
+; NOBMI2-NEXT: andb %dil, %al
+; NOBMI2-NEXT: andb %sil, %al
+; NOBMI2-NEXT: xorb %al, %dil
+; NOBMI2-NEXT: shrb $4, %al
+; NOBMI2-NEXT: orb %dil, %al
+; NOBMI2-NEXT: retq
+ %res = call i8 @llvm.bext.i8(i8 %val, i8 %mask)
+ ret i8 %res
+}
+
+define i8 @bdep_i8(i8 %val, i8 %mask) nounwind {
+; BMI2-LABEL: bdep_i8:
+; BMI2: # %bb.0:
+; BMI2-NEXT: pdepl %esi, %edi, %eax
+; BMI2-NEXT: # kill: def $al killed $al killed $eax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bdep_i8:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: movl %esi, %eax
+; NOBMI2-NEXT: notb %al
+; NOBMI2-NEXT: leal (,%rax,4), %ecx
+; NOBMI2-NEXT: leal (%rax,%rax), %edx
+; NOBMI2-NEXT: xorb %dl, %cl
+; NOBMI2-NEXT: leal (,%rax,8), %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shlb $4, %r9b
+; NOBMI2-NEXT: xorb %r8b, %r9b
+; NOBMI2-NEXT: xorb %cl, %r9b
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shlb $5, %cl
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shlb $6, %r8b
+; NOBMI2-NEXT: xorb %cl, %r8b
+; NOBMI2-NEXT: shlb $7, %al
+; NOBMI2-NEXT: xorb %r8b, %al
+; NOBMI2-NEXT: xorb %r9b, %al
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: andb %sil, %cl
+; NOBMI2-NEXT: movl %esi, %r8d
+; NOBMI2-NEXT: xorb %cl, %r8b
+; NOBMI2-NEXT: movl %ecx, %r9d
+; NOBMI2-NEXT: shrb %r9b
+; NOBMI2-NEXT: orb %r8b, %r9b
+; NOBMI2-NEXT: notb %al
+; NOBMI2-NEXT: andb %dl, %al
+; NOBMI2-NEXT: leal (%rax,%rax), %edx
+; NOBMI2-NEXT: xorb %al, %dl
+; NOBMI2-NEXT: leal (,%rax,4), %r8d
+; NOBMI2-NEXT: leal (,%rax,8), %r10d
+; NOBMI2-NEXT: xorb %r8b, %r10b
+; NOBMI2-NEXT: xorb %dl, %r10b
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shlb $4, %dl
+; NOBMI2-NEXT: movl %eax, %r11d
+; NOBMI2-NEXT: shlb $5, %r11b
+; NOBMI2-NEXT: xorb %dl, %r11b
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shlb $6, %r8b
+; NOBMI2-NEXT: xorb %r11b, %r8b
+; NOBMI2-NEXT: xorb %r10b, %r8b
+; NOBMI2-NEXT: movl %r8d, %edx
+; NOBMI2-NEXT: andb %r9b, %dl
+; NOBMI2-NEXT: xorb %dl, %r9b
+; NOBMI2-NEXT: movl %edx, %r10d
+; NOBMI2-NEXT: shrb $2, %r10b
+; NOBMI2-NEXT: orb %r9b, %r10b
+; NOBMI2-NEXT: notb %r8b
+; NOBMI2-NEXT: andb %al, %r8b
+; NOBMI2-NEXT: leal (%r8,%r8), %eax
+; NOBMI2-NEXT: xorb %r8b, %al
+; NOBMI2-NEXT: leal (,%r8,4), %r9d
+; NOBMI2-NEXT: leal (,%r8,8), %r11d
+; NOBMI2-NEXT: xorb %r9b, %r11b
+; NOBMI2-NEXT: xorb %al, %r11b
+; NOBMI2-NEXT: movl %r8d, %eax
+; NOBMI2-NEXT: shlb $4, %al
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: shlb $5, %r9b
+; NOBMI2-NEXT: xorb %al, %r9b
+; NOBMI2-NEXT: shlb $6, %r8b
+; NOBMI2-NEXT: xorb %r9b, %r8b
+; NOBMI2-NEXT: xorb %r11b, %r8b
+; NOBMI2-NEXT: movl %edi, %eax
+; NOBMI2-NEXT: shlb $4, %al
+; NOBMI2-NEXT: xorb %dil, %al
+; NOBMI2-NEXT: andb %r10b, %al
+; NOBMI2-NEXT: andb %r8b, %al
+; NOBMI2-NEXT: xorb %dil, %al
+; NOBMI2-NEXT: leal (,%rax,4), %edi
+; NOBMI2-NEXT: xorb %al, %dil
+; NOBMI2-NEXT: andb %dl, %dil
+; NOBMI2-NEXT: xorb %al, %dil
+; NOBMI2-NEXT: leal (%rdi,%rdi), %eax
+; NOBMI2-NEXT: xorb %dil, %al
+; NOBMI2-NEXT: andb %cl, %al
+; NOBMI2-NEXT: xorb %dil, %al
+; NOBMI2-NEXT: andb %sil, %al
+; NOBMI2-NEXT: # kill: def $al killed $al killed $eax
+; NOBMI2-NEXT: retq
+ %res = call i8 @llvm.bdep.i8(i8 %val, i8 %mask)
+ ret i8 %res
+}
+
+define i16 @bext_i16(i16 %val, i16 %mask) nounwind {
+; BMI2-LABEL: bext_i16:
+; BMI2: # %bb.0:
+; BMI2-NEXT: movzwl %si, %eax
+; BMI2-NEXT: movzwl %di, %ecx
+; BMI2-NEXT: pextl %eax, %ecx, %eax
+; BMI2-NEXT: # kill: def $ax killed $ax killed $eax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bext_i16:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: pushq %rbx
+; NOBMI2-NEXT: andl %esi, %edi
+; NOBMI2-NEXT: movl %esi, %eax
+; NOBMI2-NEXT: notl %eax
+; NOBMI2-NEXT: leal (,%rax,4), %edx
+; NOBMI2-NEXT: leal (%rax,%rax), %ecx
+; NOBMI2-NEXT: xorl %ecx, %edx
+; NOBMI2-NEXT: leal (,%rax,8), %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $4, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: xorl %edx, %r9d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $5, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $6, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $7, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: xorl %r9d, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $8, %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $9, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $10, %r8d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $11, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: xorl %edx, %r9d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $12, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $13, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $14, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: shll $15, %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: xorl %r9d, %eax
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: andl %esi, %r8d
+; NOBMI2-NEXT: movl %edi, %edx
+; NOBMI2-NEXT: andl %r8d, %edx
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movzwl %dx, %edx
+; NOBMI2-NEXT: shrl %edx
+; NOBMI2-NEXT: orl %edi, %edx
+; NOBMI2-NEXT: xorl %r8d, %esi
+; NOBMI2-NEXT: movzwl %r8w, %edi
+; NOBMI2-NEXT: shrl %edi
+; NOBMI2-NEXT: orl %esi, %edi
+; NOBMI2-NEXT: notl %eax
+; NOBMI2-NEXT: andl %ecx, %eax
+; NOBMI2-NEXT: leal (%rax,%rax), %ecx
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: leal (,%rax,4), %esi
+; NOBMI2-NEXT: leal (,%rax,8), %r8d
+; NOBMI2-NEXT: xorl %esi, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $4, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $5, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $6, %ecx
+; NOBMI2-NEXT: xorl %esi, %ecx
+; NOBMI2-NEXT: xorl %r8d, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $7, %esi
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $8, %r8d
+; NOBMI2-NEXT: xorl %esi, %r8d
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $9, %esi
+; NOBMI2-NEXT: xorl %r8d, %esi
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $10, %r8d
+; NOBMI2-NEXT: xorl %esi, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $11, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $12, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $13, %r9d
+; NOBMI2-NEXT: xorl %esi, %r9d
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $14, %ecx
+; NOBMI2-NEXT: xorl %r9d, %ecx
+; NOBMI2-NEXT: xorl %r8d, %ecx
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: andl %edi, %r8d
+; NOBMI2-NEXT: movl %edx, %esi
+; NOBMI2-NEXT: andl %r8d, %esi
+; NOBMI2-NEXT: xorl %esi, %edx
+; NOBMI2-NEXT: movzwl %si, %esi
+; NOBMI2-NEXT: shrl $2, %esi
+; NOBMI2-NEXT: orl %edx, %esi
+; NOBMI2-NEXT: xorl %r8d, %edi
+; NOBMI2-NEXT: movzwl %r8w, %edx
+; NOBMI2-NEXT: shrl $2, %edx
+; NOBMI2-NEXT: orl %edi, %edx
+; NOBMI2-NEXT: notl %ecx
+; NOBMI2-NEXT: andl %eax, %ecx
+; NOBMI2-NEXT: leal (%rcx,%rcx), %eax
+; NOBMI2-NEXT: xorl %ecx, %eax
+; NOBMI2-NEXT: leal (,%rcx,4), %edi
+; NOBMI2-NEXT: leal (,%rcx,8), %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: xorl %eax, %r8d
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $4, %eax
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $5, %edi
+; NOBMI2-NEXT: xorl %eax, %edi
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $6, %eax
+; NOBMI2-NEXT: xorl %edi, %eax
+; NOBMI2-NEXT: xorl %r8d, %eax
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $7, %edi
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $8, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $9, %edi
+; NOBMI2-NEXT: xorl %r8d, %edi
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $10, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: xorl %eax, %r8d
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $11, %eax
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $12, %edi
+; NOBMI2-NEXT: xorl %eax, %edi
+; NOBMI2-NEXT: movl %ecx, %r9d
+; NOBMI2-NEXT: shll $13, %r9d
+; NOBMI2-NEXT: xorl %edi, %r9d
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $14, %eax
+; NOBMI2-NEXT: xorl %r9d, %eax
+; NOBMI2-NEXT: xorl %r8d, %eax
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: andl %edx, %r8d
+; NOBMI2-NEXT: movl %esi, %edi
+; NOBMI2-NEXT: andl %r8d, %edi
+; NOBMI2-NEXT: xorl %edi, %esi
+; NOBMI2-NEXT: movzwl %di, %edi
+; NOBMI2-NEXT: shrl $4, %edi
+; NOBMI2-NEXT: orl %esi, %edi
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: movzwl %r8w, %ebx
+; NOBMI2-NEXT: shrl $4, %ebx
+; NOBMI2-NEXT: orl %edx, %ebx
+; NOBMI2-NEXT: notl %eax
+; NOBMI2-NEXT: andl %ecx, %eax
+; NOBMI2-NEXT: leal (%rax,%rax), %ecx
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: leal (,%rax,4), %edx
+; NOBMI2-NEXT: leal (,%rax,8), %esi
+; NOBMI2-NEXT: xorl %edx, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $4, %ecx
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $5, %edx
+; NOBMI2-NEXT: xorl %ecx, %edx
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $6, %ecx
+; NOBMI2-NEXT: xorl %edx, %ecx
+; NOBMI2-NEXT: xorl %esi, %ecx
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $7, %edx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $8, %esi
+; NOBMI2-NEXT: xorl %edx, %esi
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $9, %edx
+; NOBMI2-NEXT: xorl %esi, %edx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $10, %esi
+; NOBMI2-NEXT: xorl %edx, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $11, %ecx
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $12, %edx
+; NOBMI2-NEXT: xorl %ecx, %edx
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $13, %ecx
+; NOBMI2-NEXT: xorl %edx, %ecx
+; NOBMI2-NEXT: shll $14, %eax
+; NOBMI2-NEXT: xorl %ecx, %eax
+; NOBMI2-NEXT: xorl %esi, %eax
+; NOBMI2-NEXT: andl %edi, %ebx
+; NOBMI2-NEXT: andl %eax, %ebx
+; NOBMI2-NEXT: xorl %ebx, %edi
+; NOBMI2-NEXT: movzbl %bh, %eax
+; NOBMI2-NEXT: orl %edi, %eax
+; NOBMI2-NEXT: # kill: def $ax killed $ax killed $eax
+; NOBMI2-NEXT: popq %rbx
+; NOBMI2-NEXT: retq
+ %res = call i16 @llvm.bext.i16(i16 %val, i16 %mask)
+ ret i16 %res
+}
+
+define i16 @bdep_i16(i16 %val, i16 %mask) nounwind {
+; BMI2-LABEL: bdep_i16:
+; BMI2: # %bb.0:
+; BMI2-NEXT: pdepl %esi, %edi, %eax
+; BMI2-NEXT: # kill: def $ax killed $ax killed $eax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bdep_i16:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: pushq %rbx
+; NOBMI2-NEXT: movl %esi, %edx
+; NOBMI2-NEXT: notl %edx
+; NOBMI2-NEXT: leal (,%rdx,4), %ecx
+; NOBMI2-NEXT: leal (%rdx,%rdx), %eax
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: leal (,%rdx,8), %r8d
+; NOBMI2-NEXT: movl %edx, %r9d
+; NOBMI2-NEXT: shll $4, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: xorl %ecx, %r9d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $5, %ecx
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $6, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $7, %ecx
+; NOBMI2-NEXT: xorl %r8d, %ecx
+; NOBMI2-NEXT: xorl %r9d, %ecx
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $8, %r8d
+; NOBMI2-NEXT: movl %edx, %r9d
+; NOBMI2-NEXT: shll $9, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $10, %r8d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: movl %edx, %r9d
+; NOBMI2-NEXT: shll $11, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: xorl %ecx, %r9d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $12, %ecx
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $13, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $14, %ecx
+; NOBMI2-NEXT: xorl %r8d, %ecx
+; NOBMI2-NEXT: shll $15, %edx
+; NOBMI2-NEXT: xorl %ecx, %edx
+; NOBMI2-NEXT: xorl %r9d, %edx
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: andl %esi, %ecx
+; NOBMI2-NEXT: movl %esi, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movzwl %cx, %r9d
+; NOBMI2-NEXT: shrl %r9d
+; NOBMI2-NEXT: orl %r8d, %r9d
+; NOBMI2-NEXT: notl %edx
+; NOBMI2-NEXT: andl %eax, %edx
+; NOBMI2-NEXT: leal (%rdx,%rdx), %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: leal (,%rdx,4), %r8d
+; NOBMI2-NEXT: leal (,%rdx,8), %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: xorl %eax, %r10d
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $4, %eax
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $5, %r8d
+; NOBMI2-NEXT: xorl %eax, %r8d
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $6, %eax
+; NOBMI2-NEXT: xorl %r8d, %eax
+; NOBMI2-NEXT: xorl %r10d, %eax
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $7, %r8d
+; NOBMI2-NEXT: movl %edx, %r10d
+; NOBMI2-NEXT: shll $8, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $9, %r8d
+; NOBMI2-NEXT: xorl %r10d, %r8d
+; NOBMI2-NEXT: movl %edx, %r10d
+; NOBMI2-NEXT: shll $10, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: xorl %eax, %r10d
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $11, %eax
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $12, %r8d
+; NOBMI2-NEXT: xorl %eax, %r8d
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $13, %eax
+; NOBMI2-NEXT: xorl %r8d, %eax
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $14, %r8d
+; NOBMI2-NEXT: xorl %eax, %r8d
+; NOBMI2-NEXT: xorl %r10d, %r8d
+; NOBMI2-NEXT: movl %r8d, %eax
+; NOBMI2-NEXT: andl %r9d, %eax
+; NOBMI2-NEXT: xorl %eax, %r9d
+; NOBMI2-NEXT: movzwl %ax, %r10d
+; NOBMI2-NEXT: shrl $2, %r10d
+; NOBMI2-NEXT: orl %r9d, %r10d
+; NOBMI2-NEXT: notl %r8d
+; NOBMI2-NEXT: andl %edx, %r8d
+; NOBMI2-NEXT: leal (%r8,%r8), %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: leal (,%r8,4), %r9d
+; NOBMI2-NEXT: leal (,%r8,8), %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: xorl %edx, %r11d
+; NOBMI2-NEXT: movl %r8d, %edx
+; NOBMI2-NEXT: shll $4, %edx
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: shll $5, %r9d
+; NOBMI2-NEXT: xorl %edx, %r9d
+; NOBMI2-NEXT: movl %r8d, %edx
+; NOBMI2-NEXT: shll $6, %edx
+; NOBMI2-NEXT: xorl %r9d, %edx
+; NOBMI2-NEXT: xorl %r11d, %edx
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: shll $7, %r9d
+; NOBMI2-NEXT: movl %r8d, %r11d
+; NOBMI2-NEXT: shll $8, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: shll $9, %r9d
+; NOBMI2-NEXT: xorl %r11d, %r9d
+; NOBMI2-NEXT: movl %r8d, %r11d
+; NOBMI2-NEXT: shll $10, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: xorl %edx, %r11d
+; NOBMI2-NEXT: movl %r8d, %edx
+; NOBMI2-NEXT: shll $11, %edx
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: shll $12, %r9d
+; NOBMI2-NEXT: xorl %edx, %r9d
+; NOBMI2-NEXT: movl %r8d, %edx
+; NOBMI2-NEXT: shll $13, %edx
+; NOBMI2-NEXT: xorl %r9d, %edx
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: shll $14, %r9d
+; NOBMI2-NEXT: xorl %edx, %r9d
+; NOBMI2-NEXT: xorl %r11d, %r9d
+; NOBMI2-NEXT: movl %r9d, %edx
+; NOBMI2-NEXT: andl %r10d, %edx
+; NOBMI2-NEXT: xorl %edx, %r10d
+; NOBMI2-NEXT: movzwl %dx, %r11d
+; NOBMI2-NEXT: shrl $4, %r11d
+; NOBMI2-NEXT: orl %r10d, %r11d
+; NOBMI2-NEXT: notl %r9d
+; NOBMI2-NEXT: andl %r8d, %r9d
+; NOBMI2-NEXT: leal (%r9,%r9), %r8d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: leal (,%r9,4), %r10d
+; NOBMI2-NEXT: leal (,%r9,8), %ebx
+; NOBMI2-NEXT: xorl %r10d, %ebx
+; NOBMI2-NEXT: xorl %r8d, %ebx
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $4, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $5, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $6, %r8d
+; NOBMI2-NEXT: xorl %r10d, %r8d
+; NOBMI2-NEXT: xorl %ebx, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $7, %r10d
+; NOBMI2-NEXT: movl %r9d, %ebx
+; NOBMI2-NEXT: shll $8, %ebx
+; NOBMI2-NEXT: xorl %r10d, %ebx
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $9, %r10d
+; NOBMI2-NEXT: xorl %ebx, %r10d
+; NOBMI2-NEXT: movl %r9d, %ebx
+; NOBMI2-NEXT: shll $10, %ebx
+; NOBMI2-NEXT: xorl %r10d, %ebx
+; NOBMI2-NEXT: xorl %r8d, %ebx
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $11, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $12, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $13, %r8d
+; NOBMI2-NEXT: xorl %r10d, %r8d
+; NOBMI2-NEXT: shll $14, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: xorl %ebx, %r9d
+; NOBMI2-NEXT: movl %edi, %r8d
+; NOBMI2-NEXT: shll $8, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: andl %r11d, %r8d
+; NOBMI2-NEXT: andl %r9d, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: movl %r8d, %edi
+; NOBMI2-NEXT: shll $4, %edi
+; NOBMI2-NEXT: xorl %r8d, %edi
+; NOBMI2-NEXT: andl %edx, %edi
+; NOBMI2-NEXT: xorl %r8d, %edi
+; NOBMI2-NEXT: leal (,%rdi,4), %edx
+; NOBMI2-NEXT: xorl %edi, %edx
+; NOBMI2-NEXT: andl %eax, %edx
+; NOBMI2-NEXT: xorl %edi, %edx
+; NOBMI2-NEXT: leal (%rdx,%rdx), %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: andl %ecx, %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: andl %esi, %eax
+; NOBMI2-NEXT: # kill: def $ax killed $ax killed $eax
+; NOBMI2-NEXT: popq %rbx
+; NOBMI2-NEXT: retq
+ %res = call i16 @llvm.bdep.i16(i16 %val, i16 %mask)
+ ret i16 %res
+}
+
+define i32 @bext_i32(i32 %val, i32 %mask) nounwind {
+; BMI2-LABEL: bext_i32:
+; BMI2: # %bb.0:
+; BMI2-NEXT: pextl %esi, %edi, %eax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bext_i32:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: andl %esi, %edi
+; NOBMI2-NEXT: movl %esi, %eax
+; NOBMI2-NEXT: notl %eax
+; NOBMI2-NEXT: leal (,%rax,4), %edx
+; NOBMI2-NEXT: leal (%rax,%rax), %ecx
+; NOBMI2-NEXT: xorl %ecx, %edx
+; NOBMI2-NEXT: leal (,%rax,8), %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $4, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: xorl %edx, %r9d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $5, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $6, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $7, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: xorl %r9d, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $8, %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $9, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $10, %r8d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $11, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: xorl %edx, %r9d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $12, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $13, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $14, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $15, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %eax, %r10d
+; NOBMI2-NEXT: shll $16, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: xorl %r9d, %r10d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $17, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $18, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $19, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $20, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $21, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $22, %edx
+; NOBMI2-NEXT: xorl %r9d, %edx
+; NOBMI2-NEXT: xorl %r10d, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $23, %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $24, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $25, %r8d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $26, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $27, %r8d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $28, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $29, %r8d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $30, %edx
+; NOBMI2-NEXT: shll $31, %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: xorl %r8d, %eax
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: andl %esi, %edx
+; NOBMI2-NEXT: movl %edi, %r8d
+; NOBMI2-NEXT: andl %edx, %r8d
+; NOBMI2-NEXT: xorl %r8d, %edi
+; NOBMI2-NEXT: shrl %r8d
+; NOBMI2-NEXT: orl %edi, %r8d
+; NOBMI2-NEXT: xorl %edx, %esi
+; NOBMI2-NEXT: shrl %edx
+; NOBMI2-NEXT: orl %esi, %edx
+; NOBMI2-NEXT: notl %eax
+; NOBMI2-NEXT: andl %ecx, %eax
+; NOBMI2-NEXT: leal (%rax,%rax), %ecx
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: leal (,%rax,4), %esi
+; NOBMI2-NEXT: leal (,%rax,8), %edi
+; NOBMI2-NEXT: xorl %esi, %edi
+; NOBMI2-NEXT: xorl %ecx, %edi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $4, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $5, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $6, %ecx
+; NOBMI2-NEXT: xorl %esi, %ecx
+; NOBMI2-NEXT: xorl %edi, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $7, %esi
+; NOBMI2-NEXT: movl %eax, %edi
+; NOBMI2-NEXT: shll $8, %edi
+; NOBMI2-NEXT: xorl %esi, %edi
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $9, %esi
+; NOBMI2-NEXT: xorl %edi, %esi
+; NOBMI2-NEXT: movl %eax, %edi
+; NOBMI2-NEXT: shll $10, %edi
+; NOBMI2-NEXT: xorl %esi, %edi
+; NOBMI2-NEXT: xorl %ecx, %edi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $11, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $12, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $13, %ecx
+; NOBMI2-NEXT: xorl %esi, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $14, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $15, %r9d
+; NOBMI2-NEXT: xorl %esi, %r9d
+; NOBMI2-NEXT: xorl %edi, %r9d
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $16, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $17, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $18, %ecx
+; NOBMI2-NEXT: xorl %esi, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $19, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %edi
+; NOBMI2-NEXT: shll $20, %edi
+; NOBMI2-NEXT: xorl %esi, %edi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $21, %ecx
+; NOBMI2-NEXT: xorl %edi, %ecx
+; NOBMI2-NEXT: xorl %r9d, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $22, %esi
+; NOBMI2-NEXT: movl %eax, %edi
+; NOBMI2-NEXT: shll $23, %edi
+; NOBMI2-NEXT: xorl %esi, %edi
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $24, %esi
+; NOBMI2-NEXT: xorl %edi, %esi
+; NOBMI2-NEXT: movl %eax, %edi
+; NOBMI2-NEXT: shll $25, %edi
+; NOBMI2-NEXT: xorl %esi, %edi
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $26, %esi
+; NOBMI2-NEXT: xorl %edi, %esi
+; NOBMI2-NEXT: movl %eax, %edi
+; NOBMI2-NEXT: shll $27, %edi
+; NOBMI2-NEXT: xorl %esi, %edi
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $28, %esi
+; NOBMI2-NEXT: xorl %edi, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %edi
+; NOBMI2-NEXT: shll $29, %edi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $30, %ecx
+; NOBMI2-NEXT: xorl %edi, %ecx
+; NOBMI2-NEXT: xorl %esi, %ecx
+; NOBMI2-NEXT: movl %ecx, %esi
+; NOBMI2-NEXT: andl %edx, %esi
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: andl %esi, %r9d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: shrl $2, %r9d
+; NOBMI2-NEXT: orl %r8d, %r9d
+; NOBMI2-NEXT: xorl %esi, %edx
+; NOBMI2-NEXT: shrl $2, %esi
+; NOBMI2-NEXT: orl %edx, %esi
+; NOBMI2-NEXT: notl %ecx
+; NOBMI2-NEXT: andl %eax, %ecx
+; NOBMI2-NEXT: leal (%rcx,%rcx), %eax
+; NOBMI2-NEXT: xorl %ecx, %eax
+; NOBMI2-NEXT: leal (,%rcx,4), %edx
+; NOBMI2-NEXT: leal (,%rcx,8), %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: xorl %eax, %edi
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $4, %eax
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $5, %edx
+; NOBMI2-NEXT: xorl %eax, %edx
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $6, %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: xorl %edi, %eax
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $7, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $8, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $9, %edx
+; NOBMI2-NEXT: xorl %edi, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $10, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: xorl %eax, %edi
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $11, %eax
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $12, %edx
+; NOBMI2-NEXT: xorl %eax, %edx
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $13, %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $14, %edx
+; NOBMI2-NEXT: xorl %eax, %edx
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $15, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $16, %eax
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $17, %edx
+; NOBMI2-NEXT: xorl %eax, %edx
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $18, %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $19, %edx
+; NOBMI2-NEXT: xorl %eax, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $20, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $21, %eax
+; NOBMI2-NEXT: xorl %edi, %eax
+; NOBMI2-NEXT: xorl %r8d, %eax
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $22, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $23, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $24, %edx
+; NOBMI2-NEXT: xorl %edi, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $25, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $26, %edx
+; NOBMI2-NEXT: xorl %edi, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $27, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $28, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: xorl %eax, %r8d
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $29, %eax
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $30, %edx
+; NOBMI2-NEXT: xorl %eax, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: movl %edx, %edi
+; NOBMI2-NEXT: andl %esi, %edi
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: andl %edi, %r8d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: shrl $4, %r8d
+; NOBMI2-NEXT: orl %r9d, %r8d
+; NOBMI2-NEXT: xorl %edi, %esi
+; NOBMI2-NEXT: shrl $4, %edi
+; NOBMI2-NEXT: orl %esi, %edi
+; NOBMI2-NEXT: notl %edx
+; NOBMI2-NEXT: andl %ecx, %edx
+; NOBMI2-NEXT: leal (%rdx,%rdx), %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: leal (,%rdx,4), %ecx
+; NOBMI2-NEXT: leal (,%rdx,8), %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: xorl %eax, %esi
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $4, %eax
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $5, %ecx
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $6, %eax
+; NOBMI2-NEXT: xorl %ecx, %eax
+; NOBMI2-NEXT: xorl %esi, %eax
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $7, %ecx
+; NOBMI2-NEXT: movl %edx, %esi
+; NOBMI2-NEXT: shll $8, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $9, %ecx
+; NOBMI2-NEXT: xorl %esi, %ecx
+; NOBMI2-NEXT: movl %edx, %esi
+; NOBMI2-NEXT: shll $10, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: xorl %eax, %esi
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $11, %eax
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $12, %ecx
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $13, %eax
+; NOBMI2-NEXT: xorl %ecx, %eax
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $14, %ecx
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: movl %edx, %r9d
+; NOBMI2-NEXT: shll $15, %r9d
+; NOBMI2-NEXT: xorl %ecx, %r9d
+; NOBMI2-NEXT: xorl %esi, %r9d
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $16, %eax
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $17, %ecx
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $18, %eax
+; NOBMI2-NEXT: xorl %ecx, %eax
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $19, %ecx
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: movl %edx, %esi
+; NOBMI2-NEXT: shll $20, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $21, %eax
+; NOBMI2-NEXT: xorl %esi, %eax
+; NOBMI2-NEXT: xorl %r9d, %eax
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $22, %ecx
+; NOBMI2-NEXT: movl %edx, %esi
+; NOBMI2-NEXT: shll $23, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $24, %ecx
+; NOBMI2-NEXT: xorl %esi, %ecx
+; NOBMI2-NEXT: movl %edx, %esi
+; NOBMI2-NEXT: shll $25, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $26, %ecx
+; NOBMI2-NEXT: xorl %esi, %ecx
+; NOBMI2-NEXT: movl %edx, %esi
+; NOBMI2-NEXT: shll $27, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %edx, %r9d
+; NOBMI2-NEXT: shll $28, %r9d
+; NOBMI2-NEXT: xorl %esi, %r9d
+; NOBMI2-NEXT: xorl %eax, %r9d
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $29, %eax
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $30, %ecx
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: xorl %r9d, %ecx
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: andl %edi, %eax
+; NOBMI2-NEXT: movl %r8d, %esi
+; NOBMI2-NEXT: andl %eax, %esi
+; NOBMI2-NEXT: xorl %esi, %r8d
+; NOBMI2-NEXT: shrl $8, %esi
+; NOBMI2-NEXT: orl %r8d, %esi
+; NOBMI2-NEXT: xorl %eax, %edi
+; NOBMI2-NEXT: shrl $8, %eax
+; NOBMI2-NEXT: orl %edi, %eax
+; NOBMI2-NEXT: notl %ecx
+; NOBMI2-NEXT: andl %edx, %ecx
+; NOBMI2-NEXT: leal (%rcx,%rcx), %edx
+; NOBMI2-NEXT: xorl %ecx, %edx
+; NOBMI2-NEXT: leal (,%rcx,4), %edi
+; NOBMI2-NEXT: leal (,%rcx,8), %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $4, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $5, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $6, %edx
+; NOBMI2-NEXT: xorl %edi, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $7, %edi
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $8, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $9, %edi
+; NOBMI2-NEXT: xorl %r8d, %edi
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $10, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $11, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $12, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $13, %edx
+; NOBMI2-NEXT: xorl %edi, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $14, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %r9d
+; NOBMI2-NEXT: shll $15, %r9d
+; NOBMI2-NEXT: xorl %edi, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $16, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $17, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $18, %edx
+; NOBMI2-NEXT: xorl %edi, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $19, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $20, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $21, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: xorl %r9d, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $22, %edi
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $23, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $24, %edi
+; NOBMI2-NEXT: xorl %r8d, %edi
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $25, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $26, %edi
+; NOBMI2-NEXT: xorl %r8d, %edi
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $27, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $28, %edi
+; NOBMI2-NEXT: xorl %r8d, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $29, %edx
+; NOBMI2-NEXT: shll $30, %ecx
+; NOBMI2-NEXT: xorl %edx, %ecx
+; NOBMI2-NEXT: xorl %edi, %ecx
+; NOBMI2-NEXT: andl %esi, %eax
+; NOBMI2-NEXT: andl %ecx, %eax
+; NOBMI2-NEXT: xorl %eax, %esi
+; NOBMI2-NEXT: shrl $16, %eax
+; NOBMI2-NEXT: orl %esi, %eax
+; NOBMI2-NEXT: retq
+ %res = call i32 @llvm.bext.i32(i32 %val, i32 %mask)
+ ret i32 %res
+}
+
+define i32 @bdep_i32(i32 %val, i32 %mask) nounwind {
+; BMI2-LABEL: bdep_i32:
+; BMI2: # %bb.0:
+; BMI2-NEXT: pdepl %esi, %edi, %eax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bdep_i32:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: pushq %rbp
+; NOBMI2-NEXT: pushq %r14
+; NOBMI2-NEXT: pushq %rbx
+; NOBMI2-NEXT: movl %esi, %edx
+; NOBMI2-NEXT: notl %edx
+; NOBMI2-NEXT: leal (,%rdx,4), %ecx
+; NOBMI2-NEXT: leal (%rdx,%rdx), %eax
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: leal (,%rdx,8), %r8d
+; NOBMI2-NEXT: movl %edx, %r9d
+; NOBMI2-NEXT: shll $4, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: xorl %ecx, %r9d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $5, %ecx
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $6, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $7, %ecx
+; NOBMI2-NEXT: xorl %r8d, %ecx
+; NOBMI2-NEXT: xorl %r9d, %ecx
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $8, %r8d
+; NOBMI2-NEXT: movl %edx, %r9d
+; NOBMI2-NEXT: shll $9, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $10, %r8d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: movl %edx, %r9d
+; NOBMI2-NEXT: shll $11, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: xorl %ecx, %r9d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $12, %ecx
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $13, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $14, %ecx
+; NOBMI2-NEXT: xorl %r8d, %ecx
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $15, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %edx, %r10d
+; NOBMI2-NEXT: shll $16, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: xorl %r9d, %r10d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $17, %ecx
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $18, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $19, %ecx
+; NOBMI2-NEXT: xorl %r8d, %ecx
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $20, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %edx, %r9d
+; NOBMI2-NEXT: shll $21, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $22, %ecx
+; NOBMI2-NEXT: xorl %r9d, %ecx
+; NOBMI2-NEXT: xorl %r10d, %ecx
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $23, %r8d
+; NOBMI2-NEXT: movl %edx, %r9d
+; NOBMI2-NEXT: shll $24, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $25, %r8d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: movl %edx, %r9d
+; NOBMI2-NEXT: shll $26, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $27, %r8d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: movl %edx, %r9d
+; NOBMI2-NEXT: shll $28, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $29, %r8d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $30, %ecx
+; NOBMI2-NEXT: shll $31, %edx
+; NOBMI2-NEXT: xorl %ecx, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: andl %esi, %ecx
+; NOBMI2-NEXT: movl %esi, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %ecx, %r9d
+; NOBMI2-NEXT: shrl %r9d
+; NOBMI2-NEXT: orl %r8d, %r9d
+; NOBMI2-NEXT: notl %edx
+; NOBMI2-NEXT: andl %eax, %edx
+; NOBMI2-NEXT: leal (%rdx,%rdx), %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: leal (,%rdx,4), %r8d
+; NOBMI2-NEXT: leal (,%rdx,8), %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: xorl %eax, %r10d
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $4, %eax
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $5, %r8d
+; NOBMI2-NEXT: xorl %eax, %r8d
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $6, %eax
+; NOBMI2-NEXT: xorl %r8d, %eax
+; NOBMI2-NEXT: xorl %r10d, %eax
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $7, %r8d
+; NOBMI2-NEXT: movl %edx, %r10d
+; NOBMI2-NEXT: shll $8, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $9, %r8d
+; NOBMI2-NEXT: xorl %r10d, %r8d
+; NOBMI2-NEXT: movl %edx, %r10d
+; NOBMI2-NEXT: shll $10, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: xorl %eax, %r10d
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $11, %eax
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $12, %r8d
+; NOBMI2-NEXT: xorl %eax, %r8d
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $13, %eax
+; NOBMI2-NEXT: xorl %r8d, %eax
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $14, %r8d
+; NOBMI2-NEXT: xorl %eax, %r8d
+; NOBMI2-NEXT: movl %edx, %r11d
+; NOBMI2-NEXT: shll $15, %r11d
+; NOBMI2-NEXT: xorl %r8d, %r11d
+; NOBMI2-NEXT: xorl %r10d, %r11d
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $16, %eax
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $17, %r8d
+; NOBMI2-NEXT: xorl %eax, %r8d
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $18, %eax
+; NOBMI2-NEXT: xorl %r8d, %eax
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $19, %r8d
+; NOBMI2-NEXT: xorl %eax, %r8d
+; NOBMI2-NEXT: movl %edx, %r10d
+; NOBMI2-NEXT: shll $20, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $21, %eax
+; NOBMI2-NEXT: xorl %r10d, %eax
+; NOBMI2-NEXT: xorl %r11d, %eax
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $22, %r8d
+; NOBMI2-NEXT: movl %edx, %r10d
+; NOBMI2-NEXT: shll $23, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $24, %r8d
+; NOBMI2-NEXT: xorl %r10d, %r8d
+; NOBMI2-NEXT: movl %edx, %r10d
+; NOBMI2-NEXT: shll $25, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $26, %r8d
+; NOBMI2-NEXT: xorl %r10d, %r8d
+; NOBMI2-NEXT: movl %edx, %r10d
+; NOBMI2-NEXT: shll $27, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: movl %edx, %r11d
+; NOBMI2-NEXT: shll $28, %r11d
+; NOBMI2-NEXT: xorl %r10d, %r11d
+; NOBMI2-NEXT: xorl %eax, %r11d
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $29, %eax
+; NOBMI2-NEXT: movl %edx, %r8d
+; NOBMI2-NEXT: shll $30, %r8d
+; NOBMI2-NEXT: xorl %eax, %r8d
+; NOBMI2-NEXT: xorl %r11d, %r8d
+; NOBMI2-NEXT: movl %r8d, %eax
+; NOBMI2-NEXT: andl %r9d, %eax
+; NOBMI2-NEXT: xorl %eax, %r9d
+; NOBMI2-NEXT: movl %eax, %r10d
+; NOBMI2-NEXT: shrl $2, %r10d
+; NOBMI2-NEXT: orl %r9d, %r10d
+; NOBMI2-NEXT: notl %r8d
+; NOBMI2-NEXT: andl %edx, %r8d
+; NOBMI2-NEXT: leal (%r8,%r8), %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: leal (,%r8,4), %r9d
+; NOBMI2-NEXT: leal (,%r8,8), %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: xorl %edx, %r11d
+; NOBMI2-NEXT: movl %r8d, %edx
+; NOBMI2-NEXT: shll $4, %edx
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: shll $5, %r9d
+; NOBMI2-NEXT: xorl %edx, %r9d
+; NOBMI2-NEXT: movl %r8d, %edx
+; NOBMI2-NEXT: shll $6, %edx
+; NOBMI2-NEXT: xorl %r9d, %edx
+; NOBMI2-NEXT: xorl %r11d, %edx
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: shll $7, %r9d
+; NOBMI2-NEXT: movl %r8d, %r11d
+; NOBMI2-NEXT: shll $8, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: shll $9, %r9d
+; NOBMI2-NEXT: xorl %r11d, %r9d
+; NOBMI2-NEXT: movl %r8d, %r11d
+; NOBMI2-NEXT: shll $10, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: xorl %edx, %r11d
+; NOBMI2-NEXT: movl %r8d, %edx
+; NOBMI2-NEXT: shll $11, %edx
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: shll $12, %r9d
+; NOBMI2-NEXT: xorl %edx, %r9d
+; NOBMI2-NEXT: movl %r8d, %edx
+; NOBMI2-NEXT: shll $13, %edx
+; NOBMI2-NEXT: xorl %r9d, %edx
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: shll $14, %r9d
+; NOBMI2-NEXT: xorl %edx, %r9d
+; NOBMI2-NEXT: movl %r8d, %ebx
+; NOBMI2-NEXT: shll $15, %ebx
+; NOBMI2-NEXT: xorl %r9d, %ebx
+; NOBMI2-NEXT: xorl %r11d, %ebx
+; NOBMI2-NEXT: movl %r8d, %edx
+; NOBMI2-NEXT: shll $16, %edx
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: shll $17, %r9d
+; NOBMI2-NEXT: xorl %edx, %r9d
+; NOBMI2-NEXT: movl %r8d, %edx
+; NOBMI2-NEXT: shll $18, %edx
+; NOBMI2-NEXT: xorl %r9d, %edx
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: shll $19, %r9d
+; NOBMI2-NEXT: xorl %edx, %r9d
+; NOBMI2-NEXT: movl %r8d, %r11d
+; NOBMI2-NEXT: shll $20, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: movl %r8d, %edx
+; NOBMI2-NEXT: shll $21, %edx
+; NOBMI2-NEXT: xorl %r11d, %edx
+; NOBMI2-NEXT: xorl %ebx, %edx
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: shll $22, %r9d
+; NOBMI2-NEXT: movl %r8d, %r11d
+; NOBMI2-NEXT: shll $23, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: shll $24, %r9d
+; NOBMI2-NEXT: xorl %r11d, %r9d
+; NOBMI2-NEXT: movl %r8d, %r11d
+; NOBMI2-NEXT: shll $25, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: shll $26, %r9d
+; NOBMI2-NEXT: xorl %r11d, %r9d
+; NOBMI2-NEXT: movl %r8d, %r11d
+; NOBMI2-NEXT: shll $27, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: movl %r8d, %ebx
+; NOBMI2-NEXT: shll $28, %ebx
+; NOBMI2-NEXT: xorl %r11d, %ebx
+; NOBMI2-NEXT: xorl %edx, %ebx
+; NOBMI2-NEXT: movl %r8d, %edx
+; NOBMI2-NEXT: shll $29, %edx
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: shll $30, %r9d
+; NOBMI2-NEXT: xorl %edx, %r9d
+; NOBMI2-NEXT: xorl %ebx, %r9d
+; NOBMI2-NEXT: movl %r9d, %edx
+; NOBMI2-NEXT: andl %r10d, %edx
+; NOBMI2-NEXT: xorl %edx, %r10d
+; NOBMI2-NEXT: movl %edx, %r11d
+; NOBMI2-NEXT: shrl $4, %r11d
+; NOBMI2-NEXT: orl %r10d, %r11d
+; NOBMI2-NEXT: notl %r9d
+; NOBMI2-NEXT: andl %r8d, %r9d
+; NOBMI2-NEXT: leal (%r9,%r9), %r8d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: leal (,%r9,4), %r10d
+; NOBMI2-NEXT: leal (,%r9,8), %ebx
+; NOBMI2-NEXT: xorl %r10d, %ebx
+; NOBMI2-NEXT: xorl %r8d, %ebx
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $4, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $5, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $6, %r8d
+; NOBMI2-NEXT: xorl %r10d, %r8d
+; NOBMI2-NEXT: xorl %ebx, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $7, %r10d
+; NOBMI2-NEXT: movl %r9d, %ebx
+; NOBMI2-NEXT: shll $8, %ebx
+; NOBMI2-NEXT: xorl %r10d, %ebx
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $9, %r10d
+; NOBMI2-NEXT: xorl %ebx, %r10d
+; NOBMI2-NEXT: movl %r9d, %ebx
+; NOBMI2-NEXT: shll $10, %ebx
+; NOBMI2-NEXT: xorl %r10d, %ebx
+; NOBMI2-NEXT: xorl %r8d, %ebx
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $11, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $12, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $13, %r8d
+; NOBMI2-NEXT: xorl %r10d, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $14, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: movl %r9d, %ebp
+; NOBMI2-NEXT: shll $15, %ebp
+; NOBMI2-NEXT: xorl %r10d, %ebp
+; NOBMI2-NEXT: xorl %ebx, %ebp
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $16, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $17, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $18, %r8d
+; NOBMI2-NEXT: xorl %r10d, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $19, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: movl %r9d, %ebx
+; NOBMI2-NEXT: shll $20, %ebx
+; NOBMI2-NEXT: xorl %r10d, %ebx
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $21, %r8d
+; NOBMI2-NEXT: xorl %ebx, %r8d
+; NOBMI2-NEXT: xorl %ebp, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $22, %r10d
+; NOBMI2-NEXT: movl %r9d, %ebx
+; NOBMI2-NEXT: shll $23, %ebx
+; NOBMI2-NEXT: xorl %r10d, %ebx
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $24, %r10d
+; NOBMI2-NEXT: xorl %ebx, %r10d
+; NOBMI2-NEXT: movl %r9d, %ebx
+; NOBMI2-NEXT: shll $25, %ebx
+; NOBMI2-NEXT: xorl %r10d, %ebx
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $26, %r10d
+; NOBMI2-NEXT: xorl %ebx, %r10d
+; NOBMI2-NEXT: movl %r9d, %ebx
+; NOBMI2-NEXT: shll $27, %ebx
+; NOBMI2-NEXT: xorl %r10d, %ebx
+; NOBMI2-NEXT: movl %r9d, %ebp
+; NOBMI2-NEXT: shll $28, %ebp
+; NOBMI2-NEXT: xorl %ebx, %ebp
+; NOBMI2-NEXT: xorl %r8d, %ebp
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $29, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $30, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: xorl %ebp, %r10d
+; NOBMI2-NEXT: movl %r10d, %r8d
+; NOBMI2-NEXT: andl %r11d, %r8d
+; NOBMI2-NEXT: xorl %r8d, %r11d
+; NOBMI2-NEXT: movl %r8d, %ebx
+; NOBMI2-NEXT: shrl $8, %ebx
+; NOBMI2-NEXT: orl %r11d, %ebx
+; NOBMI2-NEXT: notl %r10d
+; NOBMI2-NEXT: andl %r9d, %r10d
+; NOBMI2-NEXT: leal (%r10,%r10), %r9d
+; NOBMI2-NEXT: xorl %r10d, %r9d
+; NOBMI2-NEXT: leal (,%r10,4), %r11d
+; NOBMI2-NEXT: leal (,%r10,8), %ebp
+; NOBMI2-NEXT: xorl %r11d, %ebp
+; NOBMI2-NEXT: xorl %r9d, %ebp
+; NOBMI2-NEXT: movl %r10d, %r9d
+; NOBMI2-NEXT: shll $4, %r9d
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $5, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: movl %r10d, %r9d
+; NOBMI2-NEXT: shll $6, %r9d
+; NOBMI2-NEXT: xorl %r11d, %r9d
+; NOBMI2-NEXT: xorl %ebp, %r9d
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $7, %r11d
+; NOBMI2-NEXT: movl %r10d, %ebp
+; NOBMI2-NEXT: shll $8, %ebp
+; NOBMI2-NEXT: xorl %r11d, %ebp
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $9, %r11d
+; NOBMI2-NEXT: xorl %ebp, %r11d
+; NOBMI2-NEXT: movl %r10d, %ebp
+; NOBMI2-NEXT: shll $10, %ebp
+; NOBMI2-NEXT: xorl %r11d, %ebp
+; NOBMI2-NEXT: xorl %r9d, %ebp
+; NOBMI2-NEXT: movl %r10d, %r9d
+; NOBMI2-NEXT: shll $11, %r9d
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $12, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: movl %r10d, %r9d
+; NOBMI2-NEXT: shll $13, %r9d
+; NOBMI2-NEXT: xorl %r11d, %r9d
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $14, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: movl %r10d, %r14d
+; NOBMI2-NEXT: shll $15, %r14d
+; NOBMI2-NEXT: xorl %r11d, %r14d
+; NOBMI2-NEXT: xorl %ebp, %r14d
+; NOBMI2-NEXT: movl %r10d, %r9d
+; NOBMI2-NEXT: shll $16, %r9d
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $17, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: movl %r10d, %r9d
+; NOBMI2-NEXT: shll $18, %r9d
+; NOBMI2-NEXT: xorl %r11d, %r9d
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $19, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: movl %r10d, %ebp
+; NOBMI2-NEXT: shll $20, %ebp
+; NOBMI2-NEXT: xorl %r11d, %ebp
+; NOBMI2-NEXT: movl %r10d, %r9d
+; NOBMI2-NEXT: shll $21, %r9d
+; NOBMI2-NEXT: xorl %ebp, %r9d
+; NOBMI2-NEXT: xorl %r14d, %r9d
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $22, %r11d
+; NOBMI2-NEXT: movl %r10d, %ebp
+; NOBMI2-NEXT: shll $23, %ebp
+; NOBMI2-NEXT: xorl %r11d, %ebp
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $24, %r11d
+; NOBMI2-NEXT: xorl %ebp, %r11d
+; NOBMI2-NEXT: movl %r10d, %ebp
+; NOBMI2-NEXT: shll $25, %ebp
+; NOBMI2-NEXT: xorl %r11d, %ebp
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $26, %r11d
+; NOBMI2-NEXT: xorl %ebp, %r11d
+; NOBMI2-NEXT: movl %r10d, %ebp
+; NOBMI2-NEXT: shll $27, %ebp
+; NOBMI2-NEXT: xorl %r11d, %ebp
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $28, %r11d
+; NOBMI2-NEXT: xorl %ebp, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: movl %r10d, %r9d
+; NOBMI2-NEXT: shll $29, %r9d
+; NOBMI2-NEXT: shll $30, %r10d
+; NOBMI2-NEXT: xorl %r9d, %r10d
+; NOBMI2-NEXT: xorl %r11d, %r10d
+; NOBMI2-NEXT: movl %edi, %r9d
+; NOBMI2-NEXT: shll $16, %r9d
+; NOBMI2-NEXT: xorl %edi, %r9d
+; NOBMI2-NEXT: andl %ebx, %r9d
+; NOBMI2-NEXT: andl %r10d, %r9d
+; NOBMI2-NEXT: xorl %edi, %r9d
+; NOBMI2-NEXT: movl %r9d, %edi
+; NOBMI2-NEXT: shll $8, %edi
+; NOBMI2-NEXT: xorl %r9d, %edi
+; NOBMI2-NEXT: andl %r8d, %edi
+; NOBMI2-NEXT: xorl %r9d, %edi
+; NOBMI2-NEXT: movl %edi, %r8d
+; NOBMI2-NEXT: shll $4, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: andl %edx, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: leal (,%r8,4), %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: andl %eax, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: leal (%rdx,%rdx), %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: andl %ecx, %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: andl %esi, %eax
+; NOBMI2-NEXT: popq %rbx
+; NOBMI2-NEXT: popq %r14
+; NOBMI2-NEXT: popq %rbp
+; NOBMI2-NEXT: retq
+ %res = call i32 @llvm.bdep.i32(i32 %val, i32 %mask)
+ ret i32 %res
+}
+
+define i64 @bext_i64(i64 %val, i64 %mask) nounwind {
+; BMI2-LABEL: bext_i64:
+; BMI2: # %bb.0:
+; BMI2-NEXT: pextq %rsi, %rdi, %rax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bext_i64:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: andq %rsi, %rdi
+; NOBMI2-NEXT: movq %rsi, %rax
+; NOBMI2-NEXT: notq %rax
+; NOBMI2-NEXT: leaq (,%rax,4), %rdx
+; NOBMI2-NEXT: leaq (%rax,%rax), %rcx
+; NOBMI2-NEXT: xorq %rcx, %rdx
+; NOBMI2-NEXT: leaq (,%rax,8), %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $4, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $5, %rdx
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $6, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $7, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $8, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $9, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $10, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $11, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $12, %rdx
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $13, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $14, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $15, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $16, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $17, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $18, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $19, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $20, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r10
+; NOBMI2-NEXT: shlq $21, %r10
+; NOBMI2-NEXT: xorq %r9, %r10
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $22, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $23, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $24, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $25, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $26, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $27, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $28, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $29, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $30, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $31, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $32, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $33, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $34, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $35, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r10
+; NOBMI2-NEXT: shlq $36, %r10
+; NOBMI2-NEXT: xorq %r9, %r10
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $37, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $38, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $39, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $40, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $41, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $42, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $43, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $44, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $45, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $46, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $47, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $48, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $49, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $50, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $51, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $52, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $53, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $54, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r10
+; NOBMI2-NEXT: shlq $55, %r10
+; NOBMI2-NEXT: xorq %r9, %r10
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $56, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $57, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $58, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $59, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $60, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $61, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $62, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: shlq $63, %rax
+; NOBMI2-NEXT: xorq %r9, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: andq %rsi, %rdx
+; NOBMI2-NEXT: movq %rdi, %r8
+; NOBMI2-NEXT: andq %rdx, %r8
+; NOBMI2-NEXT: xorq %r8, %rdi
+; NOBMI2-NEXT: shrq %r8
+; NOBMI2-NEXT: orq %rdi, %r8
+; NOBMI2-NEXT: xorq %rdx, %rsi
+; NOBMI2-NEXT: shrq %rdx
+; NOBMI2-NEXT: orq %rsi, %rdx
+; NOBMI2-NEXT: notq %rax
+; NOBMI2-NEXT: andq %rcx, %rax
+; NOBMI2-NEXT: leaq (%rax,%rax), %rcx
+; NOBMI2-NEXT: xorq %rax, %rcx
+; NOBMI2-NEXT: leaq (,%rax,4), %rsi
+; NOBMI2-NEXT: leaq (,%rax,8), %rdi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $4, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $5, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $6, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $7, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $8, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $9, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $10, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $11, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $12, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $13, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $14, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $15, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $16, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $17, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $18, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $19, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $20, %r9
+; NOBMI2-NEXT: xorq %rdi, %r9
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $21, %rsi
+; NOBMI2-NEXT: xorq %r9, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $22, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $23, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $24, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $25, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $26, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $27, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $28, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $29, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $30, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $31, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $32, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $33, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $34, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $35, %r9
+; NOBMI2-NEXT: xorq %rdi, %r9
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $36, %rsi
+; NOBMI2-NEXT: xorq %r9, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $37, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $38, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $39, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $40, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $41, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $42, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $43, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $44, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $45, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $46, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $47, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $48, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $49, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $50, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $51, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $52, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $53, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $54, %r9
+; NOBMI2-NEXT: xorq %rdi, %r9
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $55, %rsi
+; NOBMI2-NEXT: xorq %r9, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $56, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $57, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $58, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $59, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $60, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $61, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $62, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rcx, %rsi
+; NOBMI2-NEXT: andq %rdx, %rsi
+; NOBMI2-NEXT: movq %r8, %rdi
+; NOBMI2-NEXT: andq %rsi, %rdi
+; NOBMI2-NEXT: xorq %rdi, %r8
+; NOBMI2-NEXT: shrq $2, %rdi
+; NOBMI2-NEXT: orq %r8, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdx
+; NOBMI2-NEXT: shrq $2, %rsi
+; NOBMI2-NEXT: orq %rdx, %rsi
+; NOBMI2-NEXT: notq %rcx
+; NOBMI2-NEXT: andq %rax, %rcx
+; NOBMI2-NEXT: leaq (%rcx,%rcx), %rax
+; NOBMI2-NEXT: xorq %rcx, %rax
+; NOBMI2-NEXT: leaq (,%rcx,4), %rdx
+; NOBMI2-NEXT: leaq (,%rcx,8), %r8
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $4, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $5, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $6, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $7, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $8, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $9, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $10, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $11, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $12, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $13, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $14, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $15, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $16, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $17, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $18, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $19, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %r9
+; NOBMI2-NEXT: shlq $20, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $21, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $22, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $23, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $24, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $25, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $26, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $27, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $28, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $29, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $30, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $31, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $32, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $33, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $34, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %r9
+; NOBMI2-NEXT: shlq $35, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $36, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $37, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $38, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $39, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $40, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $41, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $42, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $43, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $44, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $45, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $46, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $47, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $48, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $49, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $50, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $51, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $52, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $53, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %r9
+; NOBMI2-NEXT: shlq $54, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $55, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $56, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $57, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $58, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $59, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $60, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $61, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $62, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: andq %rsi, %rdx
+; NOBMI2-NEXT: movq %rdi, %r8
+; NOBMI2-NEXT: andq %rdx, %r8
+; NOBMI2-NEXT: xorq %r8, %rdi
+; NOBMI2-NEXT: shrq $4, %r8
+; NOBMI2-NEXT: orq %rdi, %r8
+; NOBMI2-NEXT: xorq %rdx, %rsi
+; NOBMI2-NEXT: shrq $4, %rdx
+; NOBMI2-NEXT: orq %rsi, %rdx
+; NOBMI2-NEXT: notq %rax
+; NOBMI2-NEXT: andq %rcx, %rax
+; NOBMI2-NEXT: leaq (%rax,%rax), %rcx
+; NOBMI2-NEXT: xorq %rax, %rcx
+; NOBMI2-NEXT: leaq (,%rax,4), %rsi
+; NOBMI2-NEXT: leaq (,%rax,8), %rdi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $4, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $5, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $6, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $7, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $8, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $9, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $10, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $11, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $12, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $13, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $14, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $15, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $16, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $17, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $18, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $19, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $20, %r9
+; NOBMI2-NEXT: xorq %rdi, %r9
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $21, %rsi
+; NOBMI2-NEXT: xorq %r9, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $22, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $23, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $24, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $25, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $26, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $27, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $28, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $29, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $30, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $31, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $32, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $33, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $34, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $35, %r9
+; NOBMI2-NEXT: xorq %rdi, %r9
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $36, %rsi
+; NOBMI2-NEXT: xorq %r9, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $37, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $38, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $39, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $40, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $41, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $42, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $43, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $44, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $45, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $46, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $47, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $48, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $49, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $50, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $51, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $52, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $53, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $54, %r9
+; NOBMI2-NEXT: xorq %rdi, %r9
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $55, %rsi
+; NOBMI2-NEXT: xorq %r9, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $56, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $57, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $58, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $59, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $60, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $61, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $62, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rcx, %rsi
+; NOBMI2-NEXT: andq %rdx, %rsi
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: andq %rsi, %r9
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: shrq $8, %r9
+; NOBMI2-NEXT: orq %r8, %r9
+; NOBMI2-NEXT: xorq %rsi, %rdx
+; NOBMI2-NEXT: shrq $8, %rsi
+; NOBMI2-NEXT: orq %rdx, %rsi
+; NOBMI2-NEXT: notq %rcx
+; NOBMI2-NEXT: andq %rax, %rcx
+; NOBMI2-NEXT: leaq (%rcx,%rcx), %rax
+; NOBMI2-NEXT: xorq %rcx, %rax
+; NOBMI2-NEXT: leaq (,%rcx,4), %rdx
+; NOBMI2-NEXT: leaq (,%rcx,8), %rdi
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $4, %rax
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $5, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $6, %rax
+; NOBMI2-NEXT: xorq %rdi, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $7, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $8, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $9, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $10, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $11, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $12, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $13, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $14, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $15, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: xorq %rdi, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $16, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $17, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $18, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $19, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $20, %r8
+; NOBMI2-NEXT: xorq %rdi, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $21, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $22, %rax
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $23, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $24, %rax
+; NOBMI2-NEXT: xorq %rdi, %rax
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $25, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $26, %rax
+; NOBMI2-NEXT: xorq %rdi, %rax
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $27, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $28, %rax
+; NOBMI2-NEXT: xorq %rdi, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $29, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $30, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $31, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $32, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $33, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $34, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $35, %r8
+; NOBMI2-NEXT: xorq %rdi, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $36, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $37, %rax
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $38, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $39, %rax
+; NOBMI2-NEXT: xorq %rdi, %rax
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $40, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $41, %rax
+; NOBMI2-NEXT: xorq %rdi, %rax
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $42, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $43, %rax
+; NOBMI2-NEXT: xorq %rdi, %rax
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $44, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $45, %rax
+; NOBMI2-NEXT: xorq %rdi, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $46, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $47, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $48, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $49, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $50, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $51, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $52, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $53, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $54, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $55, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $56, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $57, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $58, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $59, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $60, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $61, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $62, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: andq %rsi, %rax
+; NOBMI2-NEXT: movq %r9, %rdi
+; NOBMI2-NEXT: andq %rax, %rdi
+; NOBMI2-NEXT: xorq %rdi, %r9
+; NOBMI2-NEXT: shrq $16, %rdi
+; NOBMI2-NEXT: orq %r9, %rdi
+; NOBMI2-NEXT: xorq %rax, %rsi
+; NOBMI2-NEXT: shrq $16, %rax
+; NOBMI2-NEXT: orq %rsi, %rax
+; NOBMI2-NEXT: notq %rdx
+; NOBMI2-NEXT: andq %rcx, %rdx
+; NOBMI2-NEXT: leaq (%rdx,%rdx), %rcx
+; NOBMI2-NEXT: xorq %rdx, %rcx
+; NOBMI2-NEXT: leaq (,%rdx,4), %rsi
+; NOBMI2-NEXT: leaq (,%rdx,8), %r8
+; NOBMI2-NEXT: xorq %r8, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $4, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $5, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $6, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $7, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $8, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $9, %rsi
+; NOBMI2-NEXT: xorq %r8, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $10, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $11, %rcx
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $12, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $13, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $14, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $15, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $16, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $17, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $18, %rsi
+; NOBMI2-NEXT: xorq %r8, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $19, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $20, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $21, %rsi
+; NOBMI2-NEXT: xorq %r9, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $22, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $23, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $24, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $25, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $26, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $27, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $28, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $29, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $30, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $31, %rsi
+; NOBMI2-NEXT: xorq %r8, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $32, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $33, %rsi
+; NOBMI2-NEXT: xorq %r8, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $34, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $35, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $36, %rsi
+; NOBMI2-NEXT: xorq %r9, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $37, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $38, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $39, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $40, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $41, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $42, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $43, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $44, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $45, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $46, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $47, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $48, %rsi
+; NOBMI2-NEXT: xorq %r8, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $49, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $50, %rsi
+; NOBMI2-NEXT: xorq %r8, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $51, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $52, %rsi
+; NOBMI2-NEXT: xorq %r8, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $53, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $54, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $55, %rsi
+; NOBMI2-NEXT: xorq %r9, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $56, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $57, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $58, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $59, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $60, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $61, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $62, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: shlq $63, %rdx
+; NOBMI2-NEXT: xorq %rcx, %rdx
+; NOBMI2-NEXT: xorq %rsi, %rdx
+; NOBMI2-NEXT: andq %rdi, %rax
+; NOBMI2-NEXT: andq %rdx, %rax
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: shrq $32, %rax
+; NOBMI2-NEXT: orq %rdi, %rax
+; NOBMI2-NEXT: retq
+ %res = call i64 @llvm.bext.i64(i64 %val, i64 %mask)
+ ret i64 %res
+}
+
+define i64 @bdep_i64(i64 %val, i64 %mask) nounwind {
+; BMI2-LABEL: bdep_i64:
+; BMI2: # %bb.0:
+; BMI2-NEXT: pdepq %rsi, %rdi, %rax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bdep_i64:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: pushq %r15
+; NOBMI2-NEXT: pushq %r14
+; NOBMI2-NEXT: pushq %r12
+; NOBMI2-NEXT: pushq %rbx
+; NOBMI2-NEXT: movq %rsi, %rdx
+; NOBMI2-NEXT: notq %rdx
+; NOBMI2-NEXT: leaq (,%rdx,4), %rcx
+; NOBMI2-NEXT: leaq (%rdx,%rdx), %rax
+; NOBMI2-NEXT: xorq %rax, %rcx
+; NOBMI2-NEXT: leaq (,%rdx,8), %r8
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $4, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: xorq %rcx, %r9
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $5, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $6, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $7, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: xorq %r9, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $8, %r8
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $9, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $10, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $11, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: xorq %rcx, %r9
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $12, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $13, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $14, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $15, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $16, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: xorq %r9, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $17, %r8
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $18, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $19, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $20, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $21, %r10
+; NOBMI2-NEXT: xorq %r9, %r10
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $22, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $23, %rcx
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $24, %r9
+; NOBMI2-NEXT: xorq %rcx, %r9
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $25, %rcx
+; NOBMI2-NEXT: xorq %r9, %rcx
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $26, %r9
+; NOBMI2-NEXT: xorq %rcx, %r9
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $27, %rcx
+; NOBMI2-NEXT: xorq %r9, %rcx
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $28, %r9
+; NOBMI2-NEXT: xorq %rcx, %r9
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $29, %rcx
+; NOBMI2-NEXT: xorq %r9, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $30, %r8
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $31, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $32, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $33, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $34, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $35, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $36, %r10
+; NOBMI2-NEXT: xorq %r9, %r10
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $37, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $38, %rcx
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $39, %r9
+; NOBMI2-NEXT: xorq %rcx, %r9
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $40, %rcx
+; NOBMI2-NEXT: xorq %r9, %rcx
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $41, %r9
+; NOBMI2-NEXT: xorq %rcx, %r9
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $42, %rcx
+; NOBMI2-NEXT: xorq %r9, %rcx
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $43, %r9
+; NOBMI2-NEXT: xorq %rcx, %r9
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $44, %rcx
+; NOBMI2-NEXT: xorq %r9, %rcx
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $45, %r9
+; NOBMI2-NEXT: xorq %rcx, %r9
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $46, %rcx
+; NOBMI2-NEXT: xorq %r9, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $47, %r8
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $48, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $49, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $50, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $51, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $52, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $53, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $54, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $55, %r10
+; NOBMI2-NEXT: xorq %r9, %r10
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $56, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $57, %rcx
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $58, %r9
+; NOBMI2-NEXT: xorq %rcx, %r9
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $59, %rcx
+; NOBMI2-NEXT: xorq %r9, %rcx
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $60, %r9
+; NOBMI2-NEXT: xorq %rcx, %r9
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $61, %rcx
+; NOBMI2-NEXT: xorq %r9, %rcx
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $62, %r9
+; NOBMI2-NEXT: xorq %rcx, %r9
+; NOBMI2-NEXT: shlq $63, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: andq %rsi, %rcx
+; NOBMI2-NEXT: movq %rsi, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rcx, %r9
+; NOBMI2-NEXT: shrq %r9
+; NOBMI2-NEXT: orq %r8, %r9
+; NOBMI2-NEXT: notq %rdx
+; NOBMI2-NEXT: andq %rax, %rdx
+; NOBMI2-NEXT: leaq (%rdx,%rdx), %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: leaq (,%rdx,4), %r8
+; NOBMI2-NEXT: leaq (,%rdx,8), %r10
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: shlq $4, %rax
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $5, %r10
+; NOBMI2-NEXT: xorq %rax, %r10
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: shlq $6, %rax
+; NOBMI2-NEXT: xorq %r10, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $7, %r8
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $8, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $9, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $10, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: xorq %rax, %r10
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: shlq $11, %rax
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $12, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: shlq $13, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $14, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: shlq $15, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: xorq %r10, %rax
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $16, %r8
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $17, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $18, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $19, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: movq %rdx, %r11
+; NOBMI2-NEXT: shlq $20, %r11
+; NOBMI2-NEXT: xorq %r10, %r11
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $21, %r8
+; NOBMI2-NEXT: xorq %r11, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: shlq $22, %rax
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $23, %r10
+; NOBMI2-NEXT: xorq %rax, %r10
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: shlq $24, %rax
+; NOBMI2-NEXT: xorq %r10, %rax
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $25, %r10
+; NOBMI2-NEXT: xorq %rax, %r10
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: shlq $26, %rax
+; NOBMI2-NEXT: xorq %r10, %rax
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $27, %r10
+; NOBMI2-NEXT: xorq %rax, %r10
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: shlq $28, %rax
+; NOBMI2-NEXT: xorq %r10, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $29, %r8
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $30, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $31, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $32, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $33, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $34, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: movq %rdx, %r11
+; NOBMI2-NEXT: shlq $35, %r11
+; NOBMI2-NEXT: xorq %r10, %r11
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $36, %r8
+; NOBMI2-NEXT: xorq %r11, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: shlq $37, %rax
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $38, %r10
+; NOBMI2-NEXT: xorq %rax, %r10
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: shlq $39, %rax
+; NOBMI2-NEXT: xorq %r10, %rax
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $40, %r10
+; NOBMI2-NEXT: xorq %rax, %r10
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: shlq $41, %rax
+; NOBMI2-NEXT: xorq %r10, %rax
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $42, %r10
+; NOBMI2-NEXT: xorq %rax, %r10
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: shlq $43, %rax
+; NOBMI2-NEXT: xorq %r10, %rax
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $44, %r10
+; NOBMI2-NEXT: xorq %rax, %r10
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: shlq $45, %rax
+; NOBMI2-NEXT: xorq %r10, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $46, %r8
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $47, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $48, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $49, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $50, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $51, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $52, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $53, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $54, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: movq %rdx, %r10
+; NOBMI2-NEXT: shlq $55, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: xorq %rax, %r10
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: shlq $56, %rax
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $57, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: shlq $58, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $59, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: shlq $60, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rdx, %r11
+; NOBMI2-NEXT: shlq $61, %r11
+; NOBMI2-NEXT: xorq %rax, %r11
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $62, %r8
+; NOBMI2-NEXT: xorq %r11, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: movq %r8, %rax
+; NOBMI2-NEXT: andq %r9, %rax
+; NOBMI2-NEXT: xorq %rax, %r9
+; NOBMI2-NEXT: movq %rax, %r10
+; NOBMI2-NEXT: shrq $2, %r10
+; NOBMI2-NEXT: orq %r9, %r10
+; NOBMI2-NEXT: notq %r8
+; NOBMI2-NEXT: andq %rdx, %r8
+; NOBMI2-NEXT: leaq (%r8,%r8), %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: leaq (,%r8,4), %r9
+; NOBMI2-NEXT: leaq (,%r8,8), %r11
+; NOBMI2-NEXT: xorq %r11, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %r8, %rdx
+; NOBMI2-NEXT: shlq $4, %rdx
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $5, %r11
+; NOBMI2-NEXT: xorq %rdx, %r11
+; NOBMI2-NEXT: movq %r8, %rdx
+; NOBMI2-NEXT: shlq $6, %rdx
+; NOBMI2-NEXT: xorq %r11, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $7, %r9
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $8, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $9, %r9
+; NOBMI2-NEXT: xorq %r11, %r9
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $10, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: xorq %rdx, %r11
+; NOBMI2-NEXT: movq %r8, %rdx
+; NOBMI2-NEXT: shlq $11, %rdx
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $12, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %r8, %rdx
+; NOBMI2-NEXT: shlq $13, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $14, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %r8, %rdx
+; NOBMI2-NEXT: shlq $15, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: xorq %r11, %rdx
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $16, %r9
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $17, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $18, %r9
+; NOBMI2-NEXT: xorq %r11, %r9
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $19, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: movq %r8, %rbx
+; NOBMI2-NEXT: shlq $20, %rbx
+; NOBMI2-NEXT: xorq %r11, %rbx
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $21, %r9
+; NOBMI2-NEXT: xorq %rbx, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %r8, %rdx
+; NOBMI2-NEXT: shlq $22, %rdx
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $23, %r11
+; NOBMI2-NEXT: xorq %rdx, %r11
+; NOBMI2-NEXT: movq %r8, %rdx
+; NOBMI2-NEXT: shlq $24, %rdx
+; NOBMI2-NEXT: xorq %r11, %rdx
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $25, %r11
+; NOBMI2-NEXT: xorq %rdx, %r11
+; NOBMI2-NEXT: movq %r8, %rdx
+; NOBMI2-NEXT: shlq $26, %rdx
+; NOBMI2-NEXT: xorq %r11, %rdx
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $27, %r11
+; NOBMI2-NEXT: xorq %rdx, %r11
+; NOBMI2-NEXT: movq %r8, %rdx
+; NOBMI2-NEXT: shlq $28, %rdx
+; NOBMI2-NEXT: xorq %r11, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $29, %r9
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $30, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $31, %r9
+; NOBMI2-NEXT: xorq %r11, %r9
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $32, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $33, %r9
+; NOBMI2-NEXT: xorq %r11, %r9
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $34, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: movq %r8, %rbx
+; NOBMI2-NEXT: shlq $35, %rbx
+; NOBMI2-NEXT: xorq %r11, %rbx
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $36, %r9
+; NOBMI2-NEXT: xorq %rbx, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %r8, %rdx
+; NOBMI2-NEXT: shlq $37, %rdx
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $38, %r11
+; NOBMI2-NEXT: xorq %rdx, %r11
+; NOBMI2-NEXT: movq %r8, %rdx
+; NOBMI2-NEXT: shlq $39, %rdx
+; NOBMI2-NEXT: xorq %r11, %rdx
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $40, %r11
+; NOBMI2-NEXT: xorq %rdx, %r11
+; NOBMI2-NEXT: movq %r8, %rdx
+; NOBMI2-NEXT: shlq $41, %rdx
+; NOBMI2-NEXT: xorq %r11, %rdx
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $42, %r11
+; NOBMI2-NEXT: xorq %rdx, %r11
+; NOBMI2-NEXT: movq %r8, %rdx
+; NOBMI2-NEXT: shlq $43, %rdx
+; NOBMI2-NEXT: xorq %r11, %rdx
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $44, %r11
+; NOBMI2-NEXT: xorq %rdx, %r11
+; NOBMI2-NEXT: movq %r8, %rdx
+; NOBMI2-NEXT: shlq $45, %rdx
+; NOBMI2-NEXT: xorq %r11, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $46, %r9
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $47, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $48, %r9
+; NOBMI2-NEXT: xorq %r11, %r9
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $49, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $50, %r9
+; NOBMI2-NEXT: xorq %r11, %r9
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $51, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $52, %r9
+; NOBMI2-NEXT: xorq %r11, %r9
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $53, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $54, %r9
+; NOBMI2-NEXT: xorq %r11, %r9
+; NOBMI2-NEXT: movq %r8, %r11
+; NOBMI2-NEXT: shlq $55, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: xorq %rdx, %r11
+; NOBMI2-NEXT: movq %r8, %rdx
+; NOBMI2-NEXT: shlq $56, %rdx
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $57, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %r8, %rdx
+; NOBMI2-NEXT: shlq $58, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $59, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %r8, %rdx
+; NOBMI2-NEXT: shlq $60, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %r8, %rbx
+; NOBMI2-NEXT: shlq $61, %rbx
+; NOBMI2-NEXT: xorq %rdx, %rbx
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: shlq $62, %r9
+; NOBMI2-NEXT: xorq %rbx, %r9
+; NOBMI2-NEXT: xorq %r11, %r9
+; NOBMI2-NEXT: movq %r9, %rdx
+; NOBMI2-NEXT: andq %r10, %rdx
+; NOBMI2-NEXT: xorq %rdx, %r10
+; NOBMI2-NEXT: movq %rdx, %r11
+; NOBMI2-NEXT: shrq $4, %r11
+; NOBMI2-NEXT: orq %r10, %r11
+; NOBMI2-NEXT: notq %r9
+; NOBMI2-NEXT: andq %r8, %r9
+; NOBMI2-NEXT: leaq (%r9,%r9), %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: leaq (,%r9,4), %r10
+; NOBMI2-NEXT: leaq (,%r9,8), %rbx
+; NOBMI2-NEXT: xorq %rbx, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: movq %r9, %r8
+; NOBMI2-NEXT: shlq $4, %r8
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $5, %rbx
+; NOBMI2-NEXT: xorq %r8, %rbx
+; NOBMI2-NEXT: movq %r9, %r8
+; NOBMI2-NEXT: shlq $6, %r8
+; NOBMI2-NEXT: xorq %rbx, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $7, %r10
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $8, %rbx
+; NOBMI2-NEXT: xorq %r10, %rbx
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $9, %r10
+; NOBMI2-NEXT: xorq %rbx, %r10
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $10, %rbx
+; NOBMI2-NEXT: xorq %r10, %rbx
+; NOBMI2-NEXT: xorq %r8, %rbx
+; NOBMI2-NEXT: movq %r9, %r8
+; NOBMI2-NEXT: shlq $11, %r8
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $12, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: movq %r9, %r8
+; NOBMI2-NEXT: shlq $13, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $14, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: movq %r9, %r8
+; NOBMI2-NEXT: shlq $15, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: xorq %rbx, %r8
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $16, %r10
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $17, %rbx
+; NOBMI2-NEXT: xorq %r10, %rbx
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $18, %r10
+; NOBMI2-NEXT: xorq %rbx, %r10
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $19, %rbx
+; NOBMI2-NEXT: xorq %r10, %rbx
+; NOBMI2-NEXT: movq %r9, %r14
+; NOBMI2-NEXT: shlq $20, %r14
+; NOBMI2-NEXT: xorq %rbx, %r14
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $21, %r10
+; NOBMI2-NEXT: xorq %r14, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: movq %r9, %r8
+; NOBMI2-NEXT: shlq $22, %r8
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $23, %rbx
+; NOBMI2-NEXT: xorq %r8, %rbx
+; NOBMI2-NEXT: movq %r9, %r8
+; NOBMI2-NEXT: shlq $24, %r8
+; NOBMI2-NEXT: xorq %rbx, %r8
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $25, %rbx
+; NOBMI2-NEXT: xorq %r8, %rbx
+; NOBMI2-NEXT: movq %r9, %r8
+; NOBMI2-NEXT: shlq $26, %r8
+; NOBMI2-NEXT: xorq %rbx, %r8
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $27, %rbx
+; NOBMI2-NEXT: xorq %r8, %rbx
+; NOBMI2-NEXT: movq %r9, %r8
+; NOBMI2-NEXT: shlq $28, %r8
+; NOBMI2-NEXT: xorq %rbx, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $29, %r10
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $30, %rbx
+; NOBMI2-NEXT: xorq %r10, %rbx
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $31, %r10
+; NOBMI2-NEXT: xorq %rbx, %r10
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $32, %rbx
+; NOBMI2-NEXT: xorq %r10, %rbx
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $33, %r10
+; NOBMI2-NEXT: xorq %rbx, %r10
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $34, %rbx
+; NOBMI2-NEXT: xorq %r10, %rbx
+; NOBMI2-NEXT: movq %r9, %r14
+; NOBMI2-NEXT: shlq $35, %r14
+; NOBMI2-NEXT: xorq %rbx, %r14
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $36, %r10
+; NOBMI2-NEXT: xorq %r14, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: movq %r9, %r8
+; NOBMI2-NEXT: shlq $37, %r8
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $38, %rbx
+; NOBMI2-NEXT: xorq %r8, %rbx
+; NOBMI2-NEXT: movq %r9, %r8
+; NOBMI2-NEXT: shlq $39, %r8
+; NOBMI2-NEXT: xorq %rbx, %r8
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $40, %rbx
+; NOBMI2-NEXT: xorq %r8, %rbx
+; NOBMI2-NEXT: movq %r9, %r8
+; NOBMI2-NEXT: shlq $41, %r8
+; NOBMI2-NEXT: xorq %rbx, %r8
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $42, %rbx
+; NOBMI2-NEXT: xorq %r8, %rbx
+; NOBMI2-NEXT: movq %r9, %r8
+; NOBMI2-NEXT: shlq $43, %r8
+; NOBMI2-NEXT: xorq %rbx, %r8
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $44, %rbx
+; NOBMI2-NEXT: xorq %r8, %rbx
+; NOBMI2-NEXT: movq %r9, %r8
+; NOBMI2-NEXT: shlq $45, %r8
+; NOBMI2-NEXT: xorq %rbx, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $46, %r10
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $47, %rbx
+; NOBMI2-NEXT: xorq %r10, %rbx
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $48, %r10
+; NOBMI2-NEXT: xorq %rbx, %r10
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $49, %rbx
+; NOBMI2-NEXT: xorq %r10, %rbx
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $50, %r10
+; NOBMI2-NEXT: xorq %rbx, %r10
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $51, %rbx
+; NOBMI2-NEXT: xorq %r10, %rbx
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $52, %r10
+; NOBMI2-NEXT: xorq %rbx, %r10
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $53, %rbx
+; NOBMI2-NEXT: xorq %r10, %rbx
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $54, %r10
+; NOBMI2-NEXT: xorq %rbx, %r10
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shlq $55, %rbx
+; NOBMI2-NEXT: xorq %r10, %rbx
+; NOBMI2-NEXT: xorq %r8, %rbx
+; NOBMI2-NEXT: movq %r9, %r8
+; NOBMI2-NEXT: shlq $56, %r8
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $57, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: movq %r9, %r8
+; NOBMI2-NEXT: shlq $58, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $59, %r10
+; NOBMI2-NEXT: xorq %r8, %r10
+; NOBMI2-NEXT: movq %r9, %r8
+; NOBMI2-NEXT: shlq $60, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: movq %r9, %r14
+; NOBMI2-NEXT: shlq $61, %r14
+; NOBMI2-NEXT: xorq %r8, %r14
+; NOBMI2-NEXT: movq %r9, %r10
+; NOBMI2-NEXT: shlq $62, %r10
+; NOBMI2-NEXT: xorq %r14, %r10
+; NOBMI2-NEXT: xorq %rbx, %r10
+; NOBMI2-NEXT: movq %r10, %r8
+; NOBMI2-NEXT: andq %r11, %r8
+; NOBMI2-NEXT: xorq %r8, %r11
+; NOBMI2-NEXT: movq %r8, %r14
+; NOBMI2-NEXT: shrq $8, %r14
+; NOBMI2-NEXT: orq %r11, %r14
+; NOBMI2-NEXT: notq %r10
+; NOBMI2-NEXT: andq %r9, %r10
+; NOBMI2-NEXT: leaq (%r10,%r10), %r9
+; NOBMI2-NEXT: xorq %r10, %r9
+; NOBMI2-NEXT: leaq (,%r10,4), %r11
+; NOBMI2-NEXT: leaq (,%r10,8), %rbx
+; NOBMI2-NEXT: xorq %rbx, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: movq %r10, %r9
+; NOBMI2-NEXT: shlq $4, %r9
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $5, %rbx
+; NOBMI2-NEXT: xorq %r9, %rbx
+; NOBMI2-NEXT: movq %r10, %r9
+; NOBMI2-NEXT: shlq $6, %r9
+; NOBMI2-NEXT: xorq %rbx, %r9
+; NOBMI2-NEXT: xorq %r11, %r9
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $7, %r11
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $8, %rbx
+; NOBMI2-NEXT: xorq %r11, %rbx
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $9, %r11
+; NOBMI2-NEXT: xorq %rbx, %r11
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $10, %rbx
+; NOBMI2-NEXT: xorq %r11, %rbx
+; NOBMI2-NEXT: xorq %r9, %rbx
+; NOBMI2-NEXT: movq %r10, %r9
+; NOBMI2-NEXT: shlq $11, %r9
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $12, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: movq %r10, %r9
+; NOBMI2-NEXT: shlq $13, %r9
+; NOBMI2-NEXT: xorq %r11, %r9
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $14, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: movq %r10, %r9
+; NOBMI2-NEXT: shlq $15, %r9
+; NOBMI2-NEXT: xorq %r11, %r9
+; NOBMI2-NEXT: xorq %rbx, %r9
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $16, %r11
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $17, %rbx
+; NOBMI2-NEXT: xorq %r11, %rbx
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $18, %r11
+; NOBMI2-NEXT: xorq %rbx, %r11
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $19, %rbx
+; NOBMI2-NEXT: xorq %r11, %rbx
+; NOBMI2-NEXT: movq %r10, %r15
+; NOBMI2-NEXT: shlq $20, %r15
+; NOBMI2-NEXT: xorq %rbx, %r15
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $21, %r11
+; NOBMI2-NEXT: xorq %r15, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: movq %r10, %r9
+; NOBMI2-NEXT: shlq $22, %r9
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $23, %rbx
+; NOBMI2-NEXT: xorq %r9, %rbx
+; NOBMI2-NEXT: movq %r10, %r9
+; NOBMI2-NEXT: shlq $24, %r9
+; NOBMI2-NEXT: xorq %rbx, %r9
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $25, %rbx
+; NOBMI2-NEXT: xorq %r9, %rbx
+; NOBMI2-NEXT: movq %r10, %r9
+; NOBMI2-NEXT: shlq $26, %r9
+; NOBMI2-NEXT: xorq %rbx, %r9
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $27, %rbx
+; NOBMI2-NEXT: xorq %r9, %rbx
+; NOBMI2-NEXT: movq %r10, %r9
+; NOBMI2-NEXT: shlq $28, %r9
+; NOBMI2-NEXT: xorq %rbx, %r9
+; NOBMI2-NEXT: xorq %r11, %r9
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $29, %r11
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $30, %rbx
+; NOBMI2-NEXT: xorq %r11, %rbx
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $31, %r11
+; NOBMI2-NEXT: xorq %rbx, %r11
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $32, %rbx
+; NOBMI2-NEXT: xorq %r11, %rbx
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $33, %r11
+; NOBMI2-NEXT: xorq %rbx, %r11
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $34, %rbx
+; NOBMI2-NEXT: xorq %r11, %rbx
+; NOBMI2-NEXT: movq %r10, %r15
+; NOBMI2-NEXT: shlq $35, %r15
+; NOBMI2-NEXT: xorq %rbx, %r15
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $36, %r11
+; NOBMI2-NEXT: xorq %r15, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: movq %r10, %r9
+; NOBMI2-NEXT: shlq $37, %r9
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $38, %rbx
+; NOBMI2-NEXT: xorq %r9, %rbx
+; NOBMI2-NEXT: movq %r10, %r9
+; NOBMI2-NEXT: shlq $39, %r9
+; NOBMI2-NEXT: xorq %rbx, %r9
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $40, %rbx
+; NOBMI2-NEXT: xorq %r9, %rbx
+; NOBMI2-NEXT: movq %r10, %r9
+; NOBMI2-NEXT: shlq $41, %r9
+; NOBMI2-NEXT: xorq %rbx, %r9
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $42, %rbx
+; NOBMI2-NEXT: xorq %r9, %rbx
+; NOBMI2-NEXT: movq %r10, %r9
+; NOBMI2-NEXT: shlq $43, %r9
+; NOBMI2-NEXT: xorq %rbx, %r9
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $44, %rbx
+; NOBMI2-NEXT: xorq %r9, %rbx
+; NOBMI2-NEXT: movq %r10, %r9
+; NOBMI2-NEXT: shlq $45, %r9
+; NOBMI2-NEXT: xorq %rbx, %r9
+; NOBMI2-NEXT: xorq %r11, %r9
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $46, %r11
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $47, %rbx
+; NOBMI2-NEXT: xorq %r11, %rbx
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $48, %r11
+; NOBMI2-NEXT: xorq %rbx, %r11
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $49, %rbx
+; NOBMI2-NEXT: xorq %r11, %rbx
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $50, %r11
+; NOBMI2-NEXT: xorq %rbx, %r11
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $51, %rbx
+; NOBMI2-NEXT: xorq %r11, %rbx
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $52, %r11
+; NOBMI2-NEXT: xorq %rbx, %r11
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $53, %rbx
+; NOBMI2-NEXT: xorq %r11, %rbx
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $54, %r11
+; NOBMI2-NEXT: xorq %rbx, %r11
+; NOBMI2-NEXT: movq %r10, %rbx
+; NOBMI2-NEXT: shlq $55, %rbx
+; NOBMI2-NEXT: xorq %r11, %rbx
+; NOBMI2-NEXT: xorq %r9, %rbx
+; NOBMI2-NEXT: movq %r10, %r9
+; NOBMI2-NEXT: shlq $56, %r9
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $57, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: movq %r10, %r9
+; NOBMI2-NEXT: shlq $58, %r9
+; NOBMI2-NEXT: xorq %r11, %r9
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $59, %r11
+; NOBMI2-NEXT: xorq %r9, %r11
+; NOBMI2-NEXT: movq %r10, %r9
+; NOBMI2-NEXT: shlq $60, %r9
+; NOBMI2-NEXT: xorq %r11, %r9
+; NOBMI2-NEXT: movq %r10, %r15
+; NOBMI2-NEXT: shlq $61, %r15
+; NOBMI2-NEXT: xorq %r9, %r15
+; NOBMI2-NEXT: movq %r10, %r11
+; NOBMI2-NEXT: shlq $62, %r11
+; NOBMI2-NEXT: xorq %r15, %r11
+; NOBMI2-NEXT: xorq %rbx, %r11
+; NOBMI2-NEXT: movq %r11, %r9
+; NOBMI2-NEXT: andq %r14, %r9
+; NOBMI2-NEXT: xorq %r9, %r14
+; NOBMI2-NEXT: movq %r9, %rbx
+; NOBMI2-NEXT: shrq $16, %rbx
+; NOBMI2-NEXT: orq %r14, %rbx
+; NOBMI2-NEXT: notq %r11
+; NOBMI2-NEXT: andq %r10, %r11
+; NOBMI2-NEXT: leaq (%r11,%r11), %r10
+; NOBMI2-NEXT: xorq %r11, %r10
+; NOBMI2-NEXT: leaq (,%r11,4), %r14
+; NOBMI2-NEXT: leaq (,%r11,8), %r15
+; NOBMI2-NEXT: xorq %r15, %r14
+; NOBMI2-NEXT: xorq %r10, %r14
+; NOBMI2-NEXT: movq %r11, %r10
+; NOBMI2-NEXT: shlq $4, %r10
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $5, %r15
+; NOBMI2-NEXT: xorq %r10, %r15
+; NOBMI2-NEXT: movq %r11, %r10
+; NOBMI2-NEXT: shlq $6, %r10
+; NOBMI2-NEXT: xorq %r15, %r10
+; NOBMI2-NEXT: xorq %r14, %r10
+; NOBMI2-NEXT: movq %r11, %r14
+; NOBMI2-NEXT: shlq $7, %r14
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $8, %r15
+; NOBMI2-NEXT: xorq %r14, %r15
+; NOBMI2-NEXT: movq %r11, %r14
+; NOBMI2-NEXT: shlq $9, %r14
+; NOBMI2-NEXT: xorq %r15, %r14
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $10, %r15
+; NOBMI2-NEXT: xorq %r14, %r15
+; NOBMI2-NEXT: xorq %r10, %r15
+; NOBMI2-NEXT: movq %r11, %r10
+; NOBMI2-NEXT: shlq $11, %r10
+; NOBMI2-NEXT: movq %r11, %r14
+; NOBMI2-NEXT: shlq $12, %r14
+; NOBMI2-NEXT: xorq %r10, %r14
+; NOBMI2-NEXT: movq %r11, %r10
+; NOBMI2-NEXT: shlq $13, %r10
+; NOBMI2-NEXT: xorq %r14, %r10
+; NOBMI2-NEXT: movq %r11, %r14
+; NOBMI2-NEXT: shlq $14, %r14
+; NOBMI2-NEXT: xorq %r10, %r14
+; NOBMI2-NEXT: movq %r11, %r10
+; NOBMI2-NEXT: shlq $15, %r10
+; NOBMI2-NEXT: xorq %r14, %r10
+; NOBMI2-NEXT: xorq %r15, %r10
+; NOBMI2-NEXT: movq %r11, %r14
+; NOBMI2-NEXT: shlq $16, %r14
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $17, %r15
+; NOBMI2-NEXT: xorq %r14, %r15
+; NOBMI2-NEXT: movq %r11, %r14
+; NOBMI2-NEXT: shlq $18, %r14
+; NOBMI2-NEXT: xorq %r15, %r14
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $19, %r15
+; NOBMI2-NEXT: xorq %r14, %r15
+; NOBMI2-NEXT: movq %r11, %r12
+; NOBMI2-NEXT: shlq $20, %r12
+; NOBMI2-NEXT: xorq %r15, %r12
+; NOBMI2-NEXT: movq %r11, %r14
+; NOBMI2-NEXT: shlq $21, %r14
+; NOBMI2-NEXT: xorq %r12, %r14
+; NOBMI2-NEXT: xorq %r10, %r14
+; NOBMI2-NEXT: movq %r11, %r10
+; NOBMI2-NEXT: shlq $22, %r10
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $23, %r15
+; NOBMI2-NEXT: xorq %r10, %r15
+; NOBMI2-NEXT: movq %r11, %r10
+; NOBMI2-NEXT: shlq $24, %r10
+; NOBMI2-NEXT: xorq %r15, %r10
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $25, %r15
+; NOBMI2-NEXT: xorq %r10, %r15
+; NOBMI2-NEXT: movq %r11, %r10
+; NOBMI2-NEXT: shlq $26, %r10
+; NOBMI2-NEXT: xorq %r15, %r10
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $27, %r15
+; NOBMI2-NEXT: xorq %r10, %r15
+; NOBMI2-NEXT: movq %r11, %r10
+; NOBMI2-NEXT: shlq $28, %r10
+; NOBMI2-NEXT: xorq %r15, %r10
+; NOBMI2-NEXT: xorq %r14, %r10
+; NOBMI2-NEXT: movq %r11, %r14
+; NOBMI2-NEXT: shlq $29, %r14
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $30, %r15
+; NOBMI2-NEXT: xorq %r14, %r15
+; NOBMI2-NEXT: movq %r11, %r14
+; NOBMI2-NEXT: shlq $31, %r14
+; NOBMI2-NEXT: xorq %r15, %r14
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $32, %r15
+; NOBMI2-NEXT: xorq %r14, %r15
+; NOBMI2-NEXT: movq %r11, %r14
+; NOBMI2-NEXT: shlq $33, %r14
+; NOBMI2-NEXT: xorq %r15, %r14
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $34, %r15
+; NOBMI2-NEXT: xorq %r14, %r15
+; NOBMI2-NEXT: movq %r11, %r12
+; NOBMI2-NEXT: shlq $35, %r12
+; NOBMI2-NEXT: xorq %r15, %r12
+; NOBMI2-NEXT: movq %r11, %r14
+; NOBMI2-NEXT: shlq $36, %r14
+; NOBMI2-NEXT: xorq %r12, %r14
+; NOBMI2-NEXT: xorq %r10, %r14
+; NOBMI2-NEXT: movq %r11, %r10
+; NOBMI2-NEXT: shlq $37, %r10
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $38, %r15
+; NOBMI2-NEXT: xorq %r10, %r15
+; NOBMI2-NEXT: movq %r11, %r10
+; NOBMI2-NEXT: shlq $39, %r10
+; NOBMI2-NEXT: xorq %r15, %r10
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $40, %r15
+; NOBMI2-NEXT: xorq %r10, %r15
+; NOBMI2-NEXT: movq %r11, %r10
+; NOBMI2-NEXT: shlq $41, %r10
+; NOBMI2-NEXT: xorq %r15, %r10
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $42, %r15
+; NOBMI2-NEXT: xorq %r10, %r15
+; NOBMI2-NEXT: movq %r11, %r10
+; NOBMI2-NEXT: shlq $43, %r10
+; NOBMI2-NEXT: xorq %r15, %r10
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $44, %r15
+; NOBMI2-NEXT: xorq %r10, %r15
+; NOBMI2-NEXT: movq %r11, %r10
+; NOBMI2-NEXT: shlq $45, %r10
+; NOBMI2-NEXT: xorq %r15, %r10
+; NOBMI2-NEXT: xorq %r14, %r10
+; NOBMI2-NEXT: movq %r11, %r14
+; NOBMI2-NEXT: shlq $46, %r14
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $47, %r15
+; NOBMI2-NEXT: xorq %r14, %r15
+; NOBMI2-NEXT: movq %r11, %r14
+; NOBMI2-NEXT: shlq $48, %r14
+; NOBMI2-NEXT: xorq %r15, %r14
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $49, %r15
+; NOBMI2-NEXT: xorq %r14, %r15
+; NOBMI2-NEXT: movq %r11, %r14
+; NOBMI2-NEXT: shlq $50, %r14
+; NOBMI2-NEXT: xorq %r15, %r14
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $51, %r15
+; NOBMI2-NEXT: xorq %r14, %r15
+; NOBMI2-NEXT: movq %r11, %r14
+; NOBMI2-NEXT: shlq $52, %r14
+; NOBMI2-NEXT: xorq %r15, %r14
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $53, %r15
+; NOBMI2-NEXT: xorq %r14, %r15
+; NOBMI2-NEXT: movq %r11, %r12
+; NOBMI2-NEXT: shlq $54, %r12
+; NOBMI2-NEXT: xorq %r15, %r12
+; NOBMI2-NEXT: movq %r11, %r14
+; NOBMI2-NEXT: shlq $55, %r14
+; NOBMI2-NEXT: xorq %r12, %r14
+; NOBMI2-NEXT: xorq %r10, %r14
+; NOBMI2-NEXT: movq %r11, %r10
+; NOBMI2-NEXT: shlq $56, %r10
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $57, %r15
+; NOBMI2-NEXT: xorq %r10, %r15
+; NOBMI2-NEXT: movq %r11, %r10
+; NOBMI2-NEXT: shlq $58, %r10
+; NOBMI2-NEXT: xorq %r15, %r10
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $59, %r15
+; NOBMI2-NEXT: xorq %r10, %r15
+; NOBMI2-NEXT: movq %r11, %r10
+; NOBMI2-NEXT: shlq $60, %r10
+; NOBMI2-NEXT: xorq %r15, %r10
+; NOBMI2-NEXT: movq %r11, %r15
+; NOBMI2-NEXT: shlq $61, %r15
+; NOBMI2-NEXT: xorq %r10, %r15
+; NOBMI2-NEXT: movq %r11, %r10
+; NOBMI2-NEXT: shlq $62, %r10
+; NOBMI2-NEXT: xorq %r15, %r10
+; NOBMI2-NEXT: shlq $63, %r11
+; NOBMI2-NEXT: xorq %r10, %r11
+; NOBMI2-NEXT: xorq %r14, %r11
+; NOBMI2-NEXT: movq %rdi, %r10
+; NOBMI2-NEXT: shlq $32, %r10
+; NOBMI2-NEXT: xorq %rdi, %r10
+; NOBMI2-NEXT: andq %rbx, %r10
+; NOBMI2-NEXT: andq %r11, %r10
+; NOBMI2-NEXT: xorq %rdi, %r10
+; NOBMI2-NEXT: movq %r10, %rdi
+; NOBMI2-NEXT: shlq $16, %rdi
+; NOBMI2-NEXT: xorq %r10, %rdi
+; NOBMI2-NEXT: andq %r9, %rdi
+; NOBMI2-NEXT: xorq %r10, %rdi
+; NOBMI2-NEXT: movq %rdi, %r9
+; NOBMI2-NEXT: shlq $8, %r9
+; NOBMI2-NEXT: xorq %rdi, %r9
+; NOBMI2-NEXT: andq %r8, %r9
+; NOBMI2-NEXT: xorq %rdi, %r9
+; NOBMI2-NEXT: movq %r9, %rdi
+; NOBMI2-NEXT: shlq $4, %rdi
+; NOBMI2-NEXT: xorq %r9, %rdi
+; NOBMI2-NEXT: andq %rdx, %rdi
+; NOBMI2-NEXT: xorq %r9, %rdi
+; NOBMI2-NEXT: leaq (,%rdi,4), %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: andq %rax, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: leaq (%rdx,%rdx), %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: andq %rcx, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: andq %rsi, %rax
+; NOBMI2-NEXT: popq %rbx
+; NOBMI2-NEXT: popq %r12
+; NOBMI2-NEXT: popq %r14
+; NOBMI2-NEXT: popq %r15
+; NOBMI2-NEXT: retq
+ %res = call i64 @llvm.bdep.i64(i64 %val, i64 %mask)
+ ret i64 %res
+}
+
+define i32 @bext_mask_zero(i32 %val) nounwind {
+; BMI2-LABEL: bext_mask_zero:
+; BMI2: # %bb.0:
+; BMI2-NEXT: xorl %eax, %eax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bext_mask_zero:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: xorl %eax, %eax
+; NOBMI2-NEXT: retq
+ %res = call i32 @llvm.bext.i32(i32 %val, i32 0)
+ ret i32 %res
+}
+
+define i32 @bext_mask_allones(i32 %val) nounwind {
+; BMI2-LABEL: bext_mask_allones:
+; BMI2: # %bb.0:
+; BMI2-NEXT: movl %edi, %eax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bext_mask_allones:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: movl %edi, %eax
+; NOBMI2-NEXT: retq
+ %res = call i32 @llvm.bext.i32(i32 %val, i32 -1)
+ ret i32 %res
+}
+
+define i32 @bdep_mask_zero(i32 %val) nounwind {
+; BMI2-LABEL: bdep_mask_zero:
+; BMI2: # %bb.0:
+; BMI2-NEXT: xorl %eax, %eax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bdep_mask_zero:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: xorl %eax, %eax
+; NOBMI2-NEXT: retq
+ %res = call i32 @llvm.bdep.i32(i32 %val, i32 0)
+ ret i32 %res
+}
+
+define i32 @bdep_mask_allones(i32 %val) nounwind {
+; BMI2-LABEL: bdep_mask_allones:
+; BMI2: # %bb.0:
+; BMI2-NEXT: movl %edi, %eax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bdep_mask_allones:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: movl %edi, %eax
+; NOBMI2-NEXT: retq
+ %res = call i32 @llvm.bdep.i32(i32 %val, i32 -1)
+ ret i32 %res
+}
+
+define i32 @bext_const_fold() nounwind {
+; BMI2-LABEL: bext_const_fold:
+; BMI2: # %bb.0:
+; BMI2-NEXT: movl $10, %eax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bext_const_fold:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: movl $10, %eax
+; NOBMI2-NEXT: retq
+ %res = call i32 @llvm.bext.i32(i32 170, i32 204)
+ ret i32 %res
+}
+
+define i32 @bdep_const_fold() nounwind {
+; BMI2-LABEL: bdep_const_fold:
+; BMI2: # %bb.0:
+; BMI2-NEXT: movl $136, %eax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bdep_const_fold:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: movl $136, %eax
+; NOBMI2-NEXT: retq
+ %res = call i32 @llvm.bdep.i32(i32 10, i32 204)
+ ret i32 %res
+}
+
+declare i8 @llvm.bext.i8(i8, i8)
+declare i16 @llvm.bext.i16(i16, i16)
+declare i32 @llvm.bext.i32(i32, i32)
+declare i64 @llvm.bext.i64(i64, i64)
+declare i8 @llvm.bdep.i8(i8, i8)
+declare i16 @llvm.bdep.i16(i16, i16)
+declare i32 @llvm.bdep.i32(i32, i32)
+declare i64 @llvm.bdep.i64(i64, i64)
diff --git a/llvm/unittests/Support/KnownBitsTest.cpp b/llvm/unittests/Support/KnownBitsTest.cpp
index 0303b2f121c3b..a314a8b40fbe8 100644
--- a/llvm/unittests/Support/KnownBitsTest.cpp
+++ b/llvm/unittests/Support/KnownBitsTest.cpp
@@ -635,6 +635,8 @@ TEST(KnownBitsTest, BinaryExhaustive) {
testBinaryOpExhaustive("avgCeilS", KnownBits::avgCeilS, APIntOps::avgCeilS);
testBinaryOpExhaustive("clmul", KnownBits::clmul, APIntOps::clmul);
+ testBinaryOpExhaustive("bext", KnownBits::bext, APIntOps::compressBits);
+ testBinaryOpExhaustive("bdep", KnownBits::bdep, APIntOps::expandBits);
}
TEST(KnownBitsTest, UnaryExhaustive) {
>From bdc9f8774df5eda1150cdf8674e95a1271387282 Mon Sep 17 00:00:00 2001
From: Eisenwave <me at eisenwave.net>
Date: Sat, 30 May 2026 17:39:28 +0200
Subject: [PATCH 2/6] Legalize BEXT/BDEP on x86 directly, revert KnownBits
changes, split up tests
---
llvm/include/llvm/Support/KnownBits.h | 6 -
.../include/llvm/Target/TargetSelectionDAG.td | 2 +
llvm/lib/Analysis/ValueTracking.cpp | 12 -
.../lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 12 -
.../CodeGen/SelectionDAG/TargetLowering.cpp | 8 +-
llvm/lib/Support/KnownBits.cpp | 65 -
llvm/lib/Target/X86/X86ISelLowering.cpp | 16 +-
llvm/lib/Target/X86/X86InstrMisc.td | 39 +
.../ValueTracking/knownbits-bextbdep.ll | 96 -
llvm/test/CodeGen/AArch64/bdep.ll | 2001 +++++++++++++
.../CodeGen/AArch64/{bext-bdep.ll => bext.ll} | 2035 +------------
.../CodeGen/X86/{bext-bdep.ll => bdep.ll} | 2638 ++---------------
llvm/test/CodeGen/X86/bext.ll | 2050 +++++++++++++
llvm/unittests/Support/KnownBitsTest.cpp | 2 -
14 files changed, 4403 insertions(+), 4579 deletions(-)
delete mode 100644 llvm/test/Analysis/ValueTracking/knownbits-bextbdep.ll
create mode 100644 llvm/test/CodeGen/AArch64/bdep.ll
rename llvm/test/CodeGen/AArch64/{bext-bdep.ll => bext.ll} (50%)
rename llvm/test/CodeGen/X86/{bext-bdep.ll => bdep.ll} (50%)
create mode 100644 llvm/test/CodeGen/X86/bext.ll
diff --git a/llvm/include/llvm/Support/KnownBits.h b/llvm/include/llvm/Support/KnownBits.h
index 09fea9f1085ec..e47383dc6b2d1 100644
--- a/llvm/include/llvm/Support/KnownBits.h
+++ b/llvm/include/llvm/Support/KnownBits.h
@@ -479,12 +479,6 @@ struct KnownBits {
/// Compute known bits for clmul(LHS, RHS).
LLVM_ABI static KnownBits clmul(const KnownBits &LHS, const KnownBits &RHS);
- /// Compute known bits for bext(LHS, RHS).
- LLVM_ABI static KnownBits bext(const KnownBits &LHS, const KnownBits &RHS);
-
- /// Compute known bits for bdep(LHS, RHS).
- LLVM_ABI static KnownBits bdep(const KnownBits &LHS, const KnownBits &RHS);
-
/// Determine if these known bits always give the same ICMP_EQ result.
LLVM_ABI static std::optional<bool> eq(const KnownBits &LHS,
const KnownBits &RHS);
diff --git a/llvm/include/llvm/Target/TargetSelectionDAG.td b/llvm/include/llvm/Target/TargetSelectionDAG.td
index 52248b9da85fe..70cbf13fcb237 100644
--- a/llvm/include/llvm/Target/TargetSelectionDAG.td
+++ b/llvm/include/llvm/Target/TargetSelectionDAG.td
@@ -480,6 +480,8 @@ def clmul : SDNode<"ISD::CLMUL" , SDTIntBinOp,
[SDNPCommutative, SDNPAssociative]>;
def clmulr : SDNode<"ISD::CLMULR" , SDTIntBinOp, [SDNPCommutative]>;
def clmulh : SDNode<"ISD::CLMULH" , SDTIntBinOp, [SDNPCommutative]>;
+def bext : SDNode<"ISD::BEXT" , SDTIntBinOp>;
+def bdep : SDNode<"ISD::BDEP" , SDTIntBinOp>;
def and : SDNode<"ISD::AND" , SDTIntBinOp,
[SDNPCommutative, SDNPAssociative]>;
def or : SDNode<"ISD::OR" , SDTIntBinOp,
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 5aed74d8914d0..3be0db5ad9c7e 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -2091,18 +2091,6 @@ static void computeKnownBitsFromOperator(const Operator *I,
computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
Known = KnownBits::clmul(Known, Known2);
break;
- case Intrinsic::bext: {
- computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
- computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
- Known = KnownBits::bext(Known, Known2);
- break;
- }
- case Intrinsic::bdep: {
- computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
- computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
- Known = KnownBits::bdep(Known, Known2);
- break;
- }
case Intrinsic::uadd_sat:
computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index c644206d6232c..17f78dc0e0664 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -3958,18 +3958,6 @@ KnownBits SelectionDAG::computeKnownBits(SDValue Op, const APInt &DemandedElts,
Known = KnownBits::clmul(Known, Known2);
break;
}
- case ISD::BEXT: {
- Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
- Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
- Known = KnownBits::bext(Known, Known2);
- break;
- }
- case ISD::BDEP: {
- Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
- Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
- Known = KnownBits::bdep(Known, Known2);
- break;
- }
case ISD::MGATHER:
case ISD::MLOAD: {
ISD::LoadExtType ETy =
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index bcccb2e262c71..7af937dfac001 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -8979,8 +8979,8 @@ SDValue TargetLowering::expandBEXT(SDNode *Node, SelectionDAG &DAG) const {
// shift all such bits in parallel using a mask, and double the shift amount.
for (unsigned I = 1; I < BW; I <<= 1) {
// This expands the "parallel prefix" operation to clmul(Mk, ~0).
- SDValue Mp = DAG.getNode(ISD::CLMUL, DL, VT, Mk,
- DAG.getAllOnesConstant(DL, VT));
+ SDValue Mp =
+ DAG.getNode(ISD::CLMUL, DL, VT, Mk, DAG.getAllOnesConstant(DL, VT));
SDValue Mv = DAG.getNode(ISD::AND, DL, VT, Mp, M);
SDValue ShiftI = DAG.getShiftAmountConstant(I, VT, DL);
M = DAG.getNode(ISD::OR, DL, VT, DAG.getNode(ISD::XOR, DL, VT, M, Mv),
@@ -9012,8 +9012,8 @@ SDValue TargetLowering::expandBDEP(SDNode *Node, SelectionDAG &DAG) const {
for (unsigned S = 0; S < LogBW; ++S) {
unsigned ShiftS = 1u << S;
// This expands the "parallel prefix" operation to clmul(Mk, ~0).
- SDValue Mp = DAG.getNode(ISD::CLMUL, DL, VT, Mk,
- DAG.getAllOnesConstant(DL, VT));
+ SDValue Mp =
+ DAG.getNode(ISD::CLMUL, DL, VT, Mk, DAG.getAllOnesConstant(DL, VT));
MvArray[S] = DAG.getNode(ISD::AND, DL, VT, Mp, Mc);
SDValue ShiftSv = DAG.getShiftAmountConstant(ShiftS, VT, DL);
Mc = DAG.getNode(ISD::OR, DL, VT,
diff --git a/llvm/lib/Support/KnownBits.cpp b/llvm/lib/Support/KnownBits.cpp
index 27a379fb49301..b1b985b80cffd 100644
--- a/llvm/lib/Support/KnownBits.cpp
+++ b/llvm/lib/Support/KnownBits.cpp
@@ -642,71 +642,6 @@ KnownBits KnownBits::clmul(const KnownBits &LHS, const KnownBits &RHS) {
return Res;
}
-KnownBits KnownBits::bext(const KnownBits &LHS, const KnownBits &RHS) {
- // For each source position I where mask[I] could be set, the output index j
- // lies in [M0, M1] where these track the range of possible set-bit counts
- // seen so far in mask.
- //
- // The output bit j
- // - can be 0 if any candidate LHS[I] could be zero or popcount(mask) could
- // be <= j, and
- // - can be 1 only if some candidate LHS[I] could be one and popcount(mask)
- // is known > j.
- unsigned BitWidth = LHS.getBitWidth();
- KnownBits Res(BitWidth);
- Res.setAllConflict();
-
- unsigned M0 = 0, M1 = 0;
- for (unsigned I = 0; I < BitWidth; ++I) {
- if (!RHS.Zero[I]) {
- APInt Range = APInt::getBitsSet(BitWidth, M0, M1 + 1);
- if (!LHS.Zero[I])
- Res.Zero &= ~Range; // some position in Range could be 1
- if (!LHS.One[I])
- Res.One &= ~Range; // some position in Range could be 0
- }
- if (RHS.One[I])
- ++M0, ++M1;
- else if (!RHS.Zero[I])
- ++M1;
- }
-
- // Output positions j >= M0 may have no source (popcount(mask) <= j), in
- // which case they default to zero.
- Res.One &= APInt::getLowBitsSet(BitWidth, M0);
- return Res;
-}
-
-KnownBits KnownBits::bdep(const KnownBits &LHS, const KnownBits &RHS) {
- // For each output position I where mask[I] could be set, the source index j
- // lies in [M0, M1] where these track possible counts of set mask bits < I.
- //
- // The output bit
- // - can be 0 if mask[I] or any candidate LHS[j] could be zero, and
- // - can be 1 only if both mask[I] and some candidate LHS[j] could be one.
- unsigned BitWidth = LHS.getBitWidth();
- KnownBits Res(BitWidth);
- Res.setAllConflict();
-
- unsigned M0 = 0, M1 = 0;
- for (unsigned I = 0; I < BitWidth; ++I) {
- if (!RHS.One[I])
- Res.One.clearBit(I); // mask[I] could be 0 -> output[I] could be 0
- if (!RHS.Zero[I]) {
- APInt Range = APInt::getBitsSet(BitWidth, M0, M1 + 1);
- if (!Range.isSubsetOf(LHS.One))
- Res.One.clearBit(I); // some candidate could be 0
- if (!Range.isSubsetOf(LHS.Zero))
- Res.Zero.clearBit(I); // some candidate could be 1
- }
- if (RHS.One[I])
- ++M0, ++M1;
- else if (!RHS.Zero[I])
- ++M1;
- }
- return Res;
-}
-
std::optional<bool> KnownBits::eq(const KnownBits &LHS, const KnownBits &RHS) {
if (LHS.isConstant() && RHS.isConstant())
return LHS.getConstant() == RHS.getConstant();
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 360db807a95a4..94296801c8a8e 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -483,9 +483,9 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
if (Subtarget.hasBMI2()) {
setOperationAction({ISD::BEXT, ISD::BDEP}, MVT::i8, Promote);
setOperationAction({ISD::BEXT, ISD::BDEP}, MVT::i16, Promote);
- setOperationAction({ISD::BEXT, ISD::BDEP}, MVT::i32, Custom);
+ setOperationAction({ISD::BEXT, ISD::BDEP}, MVT::i32, Legal);
if (Subtarget.is64Bit())
- setOperationAction({ISD::BEXT, ISD::BDEP}, MVT::i64, Custom);
+ setOperationAction({ISD::BEXT, ISD::BDEP}, MVT::i64, Legal);
}
setOperationAction(ISD::READCYCLECOUNTER , MVT::i64 , Custom);
@@ -33841,16 +33841,6 @@ static SDValue LowerCLMUL(SDValue Op, const X86Subtarget &Subtarget,
return Result;
}
-static SDValue LowerBEXT(SDValue Op, SelectionDAG &DAG) {
- return DAG.getNode(X86ISD::PEXT, SDLoc(Op), Op.getValueType(),
- Op.getOperand(0), Op.getOperand(1));
-}
-
-static SDValue LowerBDEP(SDValue Op, SelectionDAG &DAG) {
- return DAG.getNode(X86ISD::PDEP, SDLoc(Op), Op.getValueType(),
- Op.getOperand(0), Op.getOperand(1));
-}
-
static SDValue LowerPARITY(SDValue Op, const X86Subtarget &Subtarget,
SelectionDAG &DAG) {
SDLoc DL(Op);
@@ -34583,8 +34573,6 @@ SDValue X86TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
case ISD::BITREVERSE: return LowerBITREVERSE(Op, Subtarget, DAG);
case ISD::CLMUL:
case ISD::CLMULH: return LowerCLMUL(Op, Subtarget, DAG);
- case ISD::BEXT: return LowerBEXT(Op, DAG);
- case ISD::BDEP: return LowerBDEP(Op, DAG);
case ISD::PARITY: return LowerPARITY(Op, Subtarget, DAG);
case ISD::BUILD_VECTOR: return LowerBUILD_VECTOR(Op, DAG);
case ISD::CONCAT_VECTORS: return LowerCONCAT_VECTORS(Op, Subtarget, DAG);
diff --git a/llvm/lib/Target/X86/X86InstrMisc.td b/llvm/lib/Target/X86/X86InstrMisc.td
index fc6be26338f3d..96c3dbb74b839 100644
--- a/llvm/lib/Target/X86/X86InstrMisc.td
+++ b/llvm/lib/Target/X86/X86InstrMisc.td
@@ -1404,6 +1404,45 @@ let Predicates = [HasBMI2, HasEGPR] in {
defm PEXT64 : PdepPext<"pext", Xi64, X86pext, "_EVEX">, XS, REX_W, EVEX;
}
+// ISD::BEXT / ISD::BDEP are legal on BMI2 and select directly to PEXT / PDEP.
+let Predicates = [HasBMI2, NoEGPR] in {
+ def : Pat<(i32 (bext GR32:$src, GR32:$mask)),
+ (PEXT32rr GR32:$src, GR32:$mask)>;
+ def : Pat<(i32 (bext GR32:$src, (loadi32 addr:$mask))),
+ (PEXT32rm GR32:$src, i32mem:$mask)>;
+ def : Pat<(i64 (bext GR64:$src, GR64:$mask)),
+ (PEXT64rr GR64:$src, GR64:$mask)>;
+ def : Pat<(i64 (bext GR64:$src, (loadi64 addr:$mask))),
+ (PEXT64rm GR64:$src, i64mem:$mask)>;
+ def : Pat<(i32 (bdep GR32:$src, GR32:$mask)),
+ (PDEP32rr GR32:$src, GR32:$mask)>;
+ def : Pat<(i32 (bdep GR32:$src, (loadi32 addr:$mask))),
+ (PDEP32rm GR32:$src, i32mem:$mask)>;
+ def : Pat<(i64 (bdep GR64:$src, GR64:$mask)),
+ (PDEP64rr GR64:$src, GR64:$mask)>;
+ def : Pat<(i64 (bdep GR64:$src, (loadi64 addr:$mask))),
+ (PDEP64rm GR64:$src, i64mem:$mask)>;
+}
+
+let Predicates = [HasBMI2, HasEGPR] in {
+ def : Pat<(i32 (bext GR32:$src, GR32:$mask)),
+ (PEXT32rr_EVEX GR32:$src, GR32:$mask)>;
+ def : Pat<(i32 (bext GR32:$src, (loadi32 addr:$mask))),
+ (PEXT32rm_EVEX GR32:$src, i32mem:$mask)>;
+ def : Pat<(i64 (bext GR64:$src, GR64:$mask)),
+ (PEXT64rr_EVEX GR64:$src, GR64:$mask)>;
+ def : Pat<(i64 (bext GR64:$src, (loadi64 addr:$mask))),
+ (PEXT64rm_EVEX GR64:$src, i64mem:$mask)>;
+ def : Pat<(i32 (bdep GR32:$src, GR32:$mask)),
+ (PDEP32rr_EVEX GR32:$src, GR32:$mask)>;
+ def : Pat<(i32 (bdep GR32:$src, (loadi32 addr:$mask))),
+ (PDEP32rm_EVEX GR32:$src, i32mem:$mask)>;
+ def : Pat<(i64 (bdep GR64:$src, GR64:$mask)),
+ (PDEP64rr_EVEX GR64:$src, GR64:$mask)>;
+ def : Pat<(i64 (bdep GR64:$src, (loadi64 addr:$mask))),
+ (PDEP64rm_EVEX GR64:$src, i64mem:$mask)>;
+}
+
//===----------------------------------------------------------------------===//
// Lightweight Profiling Instructions
diff --git a/llvm/test/Analysis/ValueTracking/knownbits-bextbdep.ll b/llvm/test/Analysis/ValueTracking/knownbits-bextbdep.ll
deleted file mode 100644
index 835ddd360f443..0000000000000
--- a/llvm/test/Analysis/ValueTracking/knownbits-bextbdep.ll
+++ /dev/null
@@ -1,96 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt -passes=instcombine -S < %s | FileCheck %s
-
-; bext(x, 0b00001111) produces a 4-bit result; bit 4 and above are always zero.
-define i1 @bext_high_bits_zero(i8 %x) nounwind {
-; CHECK-LABEL: @bext_high_bits_zero(
-; CHECK-NEXT: ret i1 true
-;
- %bext = call i8 @llvm.bext.i8(i8 %x, i8 15)
- %and = and i8 %bext, 240
- %r = icmp eq i8 %and, 0
- ret i1 %r
-}
-
-; bext(x, 0b11001100) can produce up to 4 bits; bits 4..7 are zero.
-define i1 @bext_sparse_mask_high_zero(i8 %x) nounwind {
-; CHECK-LABEL: @bext_sparse_mask_high_zero(
-; CHECK-NEXT: ret i1 true
-;
- %bext = call i8 @llvm.bext.i8(i8 %x, i8 204)
- %and = and i8 %bext, 240
- %r = icmp eq i8 %and, 0
- ret i1 %r
-}
-
-; bext(x, 0) -> all bits zero: the AND with any mask is always zero.
-define i1 @bext_zero_mask_known_zero(i8 %x) nounwind {
-; CHECK-LABEL: @bext_zero_mask_known_zero(
-; CHECK-NEXT: ret i1 true
-;
- %bext = call i8 @llvm.bext.i8(i8 %x, i8 0)
- %r = icmp eq i8 %bext, 0
- ret i1 %r
-}
-
-; Negative: bext(x, 0b11001100) can have bits 0-3 set; can't prove bit 0 is zero.
-define i1 @bext_low_bits_not_known(i8 %x) nounwind {
-; CHECK-LABEL: @bext_low_bits_not_known(
-; CHECK-NEXT: [[BEXT:%.*]] = call i8 @llvm.bext.i8(i8 [[X:%.*]], i8 -52)
-; CHECK-NEXT: [[AND:%.*]] = and i8 [[BEXT]], 1
-; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AND]], 0
-; CHECK-NEXT: ret i1 [[R]]
-;
- %bext = call i8 @llvm.bext.i8(i8 %x, i8 204)
- %and = and i8 %bext, 1
- %r = icmp eq i8 %and, 0
- ret i1 %r
-}
-
-; bdep(x, 0b11110000): bits 0..3 of result are always zero.
-define i1 @bdep_low_bits_zero(i8 %x) nounwind {
-; CHECK-LABEL: @bdep_low_bits_zero(
-; CHECK-NEXT: ret i1 true
-;
- %bdep = call i8 @llvm.bdep.i8(i8 %x, i8 240)
- %and = and i8 %bdep, 15
- %r = icmp eq i8 %and, 0
- ret i1 %r
-}
-
-; bdep(x, 0b00001111): bits 4..7 of result are always zero.
-define i1 @bdep_high_bits_zero(i8 %x) nounwind {
-; CHECK-LABEL: @bdep_high_bits_zero(
-; CHECK-NEXT: ret i1 true
-;
- %bdep = call i8 @llvm.bdep.i8(i8 %x, i8 15)
- %and = and i8 %bdep, 240
- %r = icmp eq i8 %and, 0
- ret i1 %r
-}
-
-; bdep(x, 0) -> all bits zero.
-define i1 @bdep_zero_mask_known_zero(i8 %x) nounwind {
-; CHECK-LABEL: @bdep_zero_mask_known_zero(
-; CHECK-NEXT: ret i1 true
-;
- %bdep = call i8 @llvm.bdep.i8(i8 %x, i8 0)
- %r = icmp eq i8 %bdep, 0
- ret i1 %r
-}
-
-; Negative: bdep(x, 0b11001100) can have bits 2,3,6,7 set.
-define i1 @bdep_mask_bits_not_known(i8 %x) nounwind {
-; CHECK-LABEL: @bdep_mask_bits_not_known(
-; CHECK-NEXT: [[BDEP:%.*]] = call i8 @llvm.bdep.i8(i8 [[X:%.*]], i8 -52)
-; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[BDEP]], -1
-; CHECK-NEXT: ret i1 [[R]]
-;
- %bdep = call i8 @llvm.bdep.i8(i8 %x, i8 204)
- %and = and i8 %bdep, 128
- %r = icmp eq i8 %and, 0
- ret i1 %r
-}
-
-declare i8 @llvm.bext.i8(i8, i8)
-declare i8 @llvm.bdep.i8(i8, i8)
diff --git a/llvm/test/CodeGen/AArch64/bdep.ll b/llvm/test/CodeGen/AArch64/bdep.ll
new file mode 100644
index 0000000000000..2facdbd8c919a
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/bdep.ll
@@ -0,0 +1,2001 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc < %s -mtriple=aarch64 -mattr=+sve2-bitperm | FileCheck %s --check-prefix=BITPERM
+; RUN: llc < %s -mtriple=aarch64 -mattr=+sve2 | FileCheck %s --check-prefix=NOSVE2BITPERM
+
+define i8 @bdep_i8(i8 %val, i8 %mask) nounwind {
+; BITPERM-LABEL: bdep_i8:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: and w8, w0, #0xff
+; BITPERM-NEXT: and w9, w1, #0xff
+; BITPERM-NEXT: fmov s0, w8
+; BITPERM-NEXT: fmov s1, w9
+; BITPERM-NEXT: bdep z0.s, z0.s, z1.s
+; BITPERM-NEXT: fmov w0, s0
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bdep_i8:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: mvn w9, w1
+; NOSVE2BITPERM-NEXT: mov w8, #-1 // =0xffffffff
+; NOSVE2BITPERM-NEXT: lsl w9, w9, #1
+; NOSVE2BITPERM-NEXT: fmov s0, w8
+; NOSVE2BITPERM-NEXT: fmov s1, w9
+; NOSVE2BITPERM-NEXT: pmul v1.8b, v1.8b, v0.8b
+; NOSVE2BITPERM-NEXT: fmov w8, s1
+; NOSVE2BITPERM-NEXT: bic w9, w9, w8
+; NOSVE2BITPERM-NEXT: and w8, w8, w1
+; NOSVE2BITPERM-NEXT: fmov s1, w9
+; NOSVE2BITPERM-NEXT: eor w11, w1, w8
+; NOSVE2BITPERM-NEXT: and w12, w8, #0xfe
+; NOSVE2BITPERM-NEXT: orr w11, w11, w12, lsr #1
+; NOSVE2BITPERM-NEXT: pmul v1.8b, v1.8b, v0.8b
+; NOSVE2BITPERM-NEXT: fmov w10, s1
+; NOSVE2BITPERM-NEXT: bic w9, w9, w10
+; NOSVE2BITPERM-NEXT: fmov s1, w9
+; NOSVE2BITPERM-NEXT: and w9, w10, w11
+; NOSVE2BITPERM-NEXT: eor w10, w11, w9
+; NOSVE2BITPERM-NEXT: and w11, w9, #0xfc
+; NOSVE2BITPERM-NEXT: orr w10, w10, w11, lsr #2
+; NOSVE2BITPERM-NEXT: pmul v0.8b, v1.8b, v0.8b
+; NOSVE2BITPERM-NEXT: fmov w11, s0
+; NOSVE2BITPERM-NEXT: and w10, w11, w10
+; NOSVE2BITPERM-NEXT: and w11, w10, w0, lsl #4
+; NOSVE2BITPERM-NEXT: bic w10, w0, w10
+; NOSVE2BITPERM-NEXT: orr w10, w10, w11
+; NOSVE2BITPERM-NEXT: and w11, w9, w10, lsl #2
+; NOSVE2BITPERM-NEXT: bic w9, w10, w9
+; NOSVE2BITPERM-NEXT: orr w9, w9, w11
+; NOSVE2BITPERM-NEXT: and w10, w8, w9, lsl #1
+; NOSVE2BITPERM-NEXT: bic w8, w9, w8
+; NOSVE2BITPERM-NEXT: orr w8, w8, w10
+; NOSVE2BITPERM-NEXT: and w0, w8, w1
+; NOSVE2BITPERM-NEXT: ret
+ %res = call i8 @llvm.bdep.i8(i8 %val, i8 %mask)
+ ret i8 %res
+}
+
+define i16 @bdep_i16(i16 %val, i16 %mask) nounwind {
+; BITPERM-LABEL: bdep_i16:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: and w8, w0, #0xffff
+; BITPERM-NEXT: and w9, w1, #0xffff
+; BITPERM-NEXT: fmov s0, w8
+; BITPERM-NEXT: fmov s1, w9
+; BITPERM-NEXT: bdep z0.s, z0.s, z1.s
+; BITPERM-NEXT: fmov w0, s0
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bdep_i16:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: mvn w8, w1
+; NOSVE2BITPERM-NEXT: lsl w9, w8, #1
+; NOSVE2BITPERM-NEXT: neg w11, w8, lsl #16
+; NOSVE2BITPERM-NEXT: eor w10, w9, w8, lsl #2
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #3
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #4
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #5
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #6
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #7
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #8
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #9
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #10
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #11
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #12
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #13
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #14
+; NOSVE2BITPERM-NEXT: eor w8, w10, w8, lsl #15
+; NOSVE2BITPERM-NEXT: eor w8, w8, w11
+; NOSVE2BITPERM-NEXT: bic w9, w9, w8
+; NOSVE2BITPERM-NEXT: and w8, w8, w1
+; NOSVE2BITPERM-NEXT: eor w10, w9, w9, lsl #1
+; NOSVE2BITPERM-NEXT: neg w11, w9, lsl #15
+; NOSVE2BITPERM-NEXT: eor w13, w1, w8
+; NOSVE2BITPERM-NEXT: and w14, w8, #0xfffe
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #2
+; NOSVE2BITPERM-NEXT: orr w13, w13, w14, lsr #1
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #3
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #4
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #5
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #6
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #7
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #8
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #9
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #10
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #11
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #12
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #13
+; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #14
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11
+; NOSVE2BITPERM-NEXT: bic w9, w9, w10
+; NOSVE2BITPERM-NEXT: and w10, w10, w13
+; NOSVE2BITPERM-NEXT: eor w11, w9, w9, lsl #1
+; NOSVE2BITPERM-NEXT: neg w12, w9, lsl #15
+; NOSVE2BITPERM-NEXT: eor w13, w13, w10
+; NOSVE2BITPERM-NEXT: and w14, w10, #0xfffc
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #2
+; NOSVE2BITPERM-NEXT: orr w13, w13, w14, lsr #2
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #3
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #4
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #5
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #6
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #7
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #8
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #9
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #10
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #11
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #12
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #13
+; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #14
+; NOSVE2BITPERM-NEXT: eor w11, w11, w12
+; NOSVE2BITPERM-NEXT: bic w9, w9, w11
+; NOSVE2BITPERM-NEXT: and w11, w11, w13
+; NOSVE2BITPERM-NEXT: eor w12, w9, w9, lsl #1
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11
+; NOSVE2BITPERM-NEXT: and w14, w11, #0xfff0
+; NOSVE2BITPERM-NEXT: orr w13, w13, w14, lsr #4
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #2
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #3
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #4
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #5
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #6
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #7
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #8
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #9
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #10
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #11
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #12
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #13
+; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #14
+; NOSVE2BITPERM-NEXT: neg w9, w9, lsl #15
+; NOSVE2BITPERM-NEXT: eor w9, w12, w9
+; NOSVE2BITPERM-NEXT: and w9, w9, w13
+; NOSVE2BITPERM-NEXT: and w12, w9, w0, lsl #8
+; NOSVE2BITPERM-NEXT: bic w9, w0, w9
+; NOSVE2BITPERM-NEXT: orr w9, w9, w12
+; NOSVE2BITPERM-NEXT: and w12, w11, w9, lsl #4
+; NOSVE2BITPERM-NEXT: bic w9, w9, w11
+; NOSVE2BITPERM-NEXT: orr w9, w9, w12
+; NOSVE2BITPERM-NEXT: and w11, w10, w9, lsl #2
+; NOSVE2BITPERM-NEXT: bic w9, w9, w10
+; NOSVE2BITPERM-NEXT: orr w9, w9, w11
+; NOSVE2BITPERM-NEXT: and w10, w8, w9, lsl #1
+; NOSVE2BITPERM-NEXT: bic w8, w9, w8
+; NOSVE2BITPERM-NEXT: orr w8, w8, w10
+; NOSVE2BITPERM-NEXT: and w0, w8, w1
+; NOSVE2BITPERM-NEXT: ret
+ %res = call i16 @llvm.bdep.i16(i16 %val, i16 %mask)
+ ret i16 %res
+}
+
+define i32 @bdep_i32(i32 %val, i32 %mask) nounwind {
+; BITPERM-LABEL: bdep_i32:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: fmov s0, w0
+; BITPERM-NEXT: fmov s1, w1
+; BITPERM-NEXT: bdep z0.s, z0.s, z1.s
+; BITPERM-NEXT: fmov w0, s0
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bdep_i32:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: mvn w8, w1
+; NOSVE2BITPERM-NEXT: lsl w9, w8, #1
+; NOSVE2BITPERM-NEXT: eor w10, w9, w8, lsl #2
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #3
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #4
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #5
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #6
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #7
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #8
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #9
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #10
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #11
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #12
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #13
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #14
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #15
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #16
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #17
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #18
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #19
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #20
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #21
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #22
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #23
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #24
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #25
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #26
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #27
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #28
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #29
+; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #30
+; NOSVE2BITPERM-NEXT: eor w8, w10, w8, lsl #31
+; NOSVE2BITPERM-NEXT: bic w10, w9, w8
+; NOSVE2BITPERM-NEXT: and w8, w8, w1
+; NOSVE2BITPERM-NEXT: eor w9, w10, w10, lsl #1
+; NOSVE2BITPERM-NEXT: eor w14, w1, w8
+; NOSVE2BITPERM-NEXT: orr w14, w14, w8, lsr #1
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #2
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #3
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #4
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #5
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #6
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #7
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #8
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #9
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #10
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #11
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #12
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #13
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #14
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #15
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #16
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #17
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #18
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #19
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #20
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #21
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #22
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #23
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #24
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #25
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #26
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #27
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #28
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #29
+; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #30
+; NOSVE2BITPERM-NEXT: bic w11, w10, w9
+; NOSVE2BITPERM-NEXT: and w9, w9, w14
+; NOSVE2BITPERM-NEXT: eor w10, w11, w11, lsl #1
+; NOSVE2BITPERM-NEXT: eor w14, w14, w9
+; NOSVE2BITPERM-NEXT: orr w14, w14, w9, lsr #2
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #2
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #3
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #4
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #5
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #6
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #7
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #8
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #9
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #10
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #11
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #12
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #13
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #14
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #15
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #16
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #17
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #18
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #19
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #20
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #21
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #22
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #23
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #24
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #25
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #26
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #27
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #28
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #29
+; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #30
+; NOSVE2BITPERM-NEXT: bic w11, w11, w10
+; NOSVE2BITPERM-NEXT: and w10, w10, w14
+; NOSVE2BITPERM-NEXT: eor w12, w11, w11, lsl #1
+; NOSVE2BITPERM-NEXT: eor w14, w14, w10
+; NOSVE2BITPERM-NEXT: orr w14, w14, w10, lsr #4
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #2
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #3
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #4
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #5
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #6
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #7
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #8
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #9
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #10
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #11
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #12
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #13
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #14
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #15
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #16
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #17
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #18
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #19
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #20
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #21
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #22
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #23
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #24
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #25
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #26
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #27
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #28
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #29
+; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #30
+; NOSVE2BITPERM-NEXT: bic w11, w11, w12
+; NOSVE2BITPERM-NEXT: and w12, w12, w14
+; NOSVE2BITPERM-NEXT: eor w13, w11, w11, lsl #1
+; NOSVE2BITPERM-NEXT: eor w14, w14, w12
+; NOSVE2BITPERM-NEXT: orr w14, w14, w12, lsr #8
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #2
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #3
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #4
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #5
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #6
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #7
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #8
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #9
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #10
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #11
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #12
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #13
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #14
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #15
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #16
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #17
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #18
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #19
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #20
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #21
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #22
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #23
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #24
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #25
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #26
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #27
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #28
+; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #29
+; NOSVE2BITPERM-NEXT: eor w11, w13, w11, lsl #30
+; NOSVE2BITPERM-NEXT: and w11, w11, w14
+; NOSVE2BITPERM-NEXT: and w13, w11, w0, lsl #16
+; NOSVE2BITPERM-NEXT: bic w11, w0, w11
+; NOSVE2BITPERM-NEXT: orr w11, w11, w13
+; NOSVE2BITPERM-NEXT: and w13, w12, w11, lsl #8
+; NOSVE2BITPERM-NEXT: bic w11, w11, w12
+; NOSVE2BITPERM-NEXT: orr w11, w11, w13
+; NOSVE2BITPERM-NEXT: and w12, w10, w11, lsl #4
+; NOSVE2BITPERM-NEXT: bic w10, w11, w10
+; NOSVE2BITPERM-NEXT: orr w10, w10, w12
+; NOSVE2BITPERM-NEXT: and w11, w9, w10, lsl #2
+; NOSVE2BITPERM-NEXT: bic w9, w10, w9
+; NOSVE2BITPERM-NEXT: orr w9, w9, w11
+; NOSVE2BITPERM-NEXT: and w10, w8, w9, lsl #1
+; NOSVE2BITPERM-NEXT: bic w8, w9, w8
+; NOSVE2BITPERM-NEXT: orr w8, w8, w10
+; NOSVE2BITPERM-NEXT: and w0, w8, w1
+; NOSVE2BITPERM-NEXT: ret
+ %res = call i32 @llvm.bdep.i32(i32 %val, i32 %mask)
+ ret i32 %res
+}
+
+define i64 @bdep_i64(i64 %val, i64 %mask) nounwind {
+; BITPERM-LABEL: bdep_i64:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: fmov d0, x0
+; BITPERM-NEXT: fmov d1, x1
+; BITPERM-NEXT: bdep z0.d, z0.d, z1.d
+; BITPERM-NEXT: fmov x0, d0
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bdep_i64:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: mvn x8, x1
+; NOSVE2BITPERM-NEXT: lsl x9, x8, #1
+; NOSVE2BITPERM-NEXT: eor x10, x9, x8, lsl #2
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #3
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #4
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #5
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #6
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #7
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #8
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #9
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #10
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #11
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #12
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #13
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #14
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #15
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #16
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #17
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #18
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #19
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #20
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #21
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #22
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #23
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #24
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #25
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #26
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #27
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #28
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #29
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #30
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #31
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #32
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #33
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #34
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #35
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #36
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #37
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #38
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #39
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #40
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #41
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #42
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #43
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #44
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #45
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #46
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #47
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #48
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #49
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #50
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #51
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #52
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #53
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #54
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #55
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #56
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #57
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #58
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #59
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #60
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #61
+; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #62
+; NOSVE2BITPERM-NEXT: eor x8, x10, x8, lsl #63
+; NOSVE2BITPERM-NEXT: bic x10, x9, x8
+; NOSVE2BITPERM-NEXT: and x8, x8, x1
+; NOSVE2BITPERM-NEXT: eor x9, x10, x10, lsl #1
+; NOSVE2BITPERM-NEXT: eor x15, x1, x8
+; NOSVE2BITPERM-NEXT: orr x15, x15, x8, lsr #1
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #2
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #3
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #4
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #5
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #6
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #7
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #8
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #9
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #10
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #11
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #12
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #13
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #14
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #15
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #16
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #17
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #18
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #19
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #20
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #21
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #22
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #23
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #24
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #25
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #26
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #27
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #28
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #29
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #30
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #31
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #32
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #33
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #34
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #35
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #36
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #37
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #38
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #39
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #40
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #41
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #42
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #43
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #44
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #45
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #46
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #47
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #48
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #49
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #50
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #51
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #52
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #53
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #54
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #55
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #56
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #57
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #58
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #59
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #60
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #61
+; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #62
+; NOSVE2BITPERM-NEXT: bic x11, x10, x9
+; NOSVE2BITPERM-NEXT: and x9, x9, x15
+; NOSVE2BITPERM-NEXT: eor x10, x11, x11, lsl #1
+; NOSVE2BITPERM-NEXT: eor x15, x15, x9
+; NOSVE2BITPERM-NEXT: orr x15, x15, x9, lsr #2
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #2
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #3
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #4
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #5
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #6
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #7
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #8
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #9
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #10
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #11
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #12
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #13
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #14
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #15
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #16
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #17
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #18
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #19
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #20
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #21
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #22
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #23
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #24
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #25
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #26
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #27
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #28
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #29
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #30
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #31
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #32
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #33
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #34
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #35
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #36
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #37
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #38
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #39
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #40
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #41
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #42
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #43
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #44
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #45
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #46
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #47
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #48
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #49
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #50
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #51
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #52
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #53
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #54
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #55
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #56
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #57
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #58
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #59
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #60
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #61
+; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #62
+; NOSVE2BITPERM-NEXT: bic x12, x11, x10
+; NOSVE2BITPERM-NEXT: and x10, x10, x15
+; NOSVE2BITPERM-NEXT: eor x11, x12, x12, lsl #1
+; NOSVE2BITPERM-NEXT: eor x15, x15, x10
+; NOSVE2BITPERM-NEXT: orr x15, x15, x10, lsr #4
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #2
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #3
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #4
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #5
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #6
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #7
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #8
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #9
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #10
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #11
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #12
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #13
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #14
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #15
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #16
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #17
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #18
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #19
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #20
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #21
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #22
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #23
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #24
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #25
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #26
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #27
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #28
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #29
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #30
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #31
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #32
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #33
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #34
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #35
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #36
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #37
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #38
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #39
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #40
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #41
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #42
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #43
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #44
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #45
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #46
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #47
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #48
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #49
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #50
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #51
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #52
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #53
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #54
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #55
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #56
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #57
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #58
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #59
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #60
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #61
+; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #62
+; NOSVE2BITPERM-NEXT: bic x13, x12, x11
+; NOSVE2BITPERM-NEXT: and x11, x11, x15
+; NOSVE2BITPERM-NEXT: eor x12, x13, x13, lsl #1
+; NOSVE2BITPERM-NEXT: eor x15, x15, x11
+; NOSVE2BITPERM-NEXT: orr x15, x15, x11, lsr #8
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #2
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #3
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #4
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #5
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #6
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #7
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #8
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #9
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #10
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #11
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #12
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #13
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #14
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #15
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #16
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #17
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #18
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #19
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #20
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #21
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #22
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #23
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #24
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #25
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #26
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #27
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #28
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #29
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #30
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #31
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #32
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #33
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #34
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #35
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #36
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #37
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #38
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #39
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #40
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #41
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #42
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #43
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #44
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #45
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #46
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #47
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #48
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #49
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #50
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #51
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #52
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #53
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #54
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #55
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #56
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #57
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #58
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #59
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #60
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #61
+; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #62
+; NOSVE2BITPERM-NEXT: bic x13, x13, x12
+; NOSVE2BITPERM-NEXT: and x12, x12, x15
+; NOSVE2BITPERM-NEXT: eor x14, x13, x13, lsl #1
+; NOSVE2BITPERM-NEXT: eor x15, x15, x12
+; NOSVE2BITPERM-NEXT: orr x15, x15, x12, lsr #16
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #2
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #3
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #4
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #5
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #6
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #7
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #8
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #9
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #10
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #11
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #12
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #13
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #14
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #15
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #16
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #17
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #18
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #19
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #20
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #21
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #22
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #23
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #24
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #25
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #26
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #27
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #28
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #29
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #30
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #31
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #32
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #33
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #34
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #35
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #36
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #37
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #38
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #39
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #40
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #41
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #42
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #43
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #44
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #45
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #46
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #47
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #48
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #49
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #50
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #51
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #52
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #53
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #54
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #55
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #56
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #57
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #58
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #59
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #60
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #61
+; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #62
+; NOSVE2BITPERM-NEXT: eor x13, x14, x13, lsl #63
+; NOSVE2BITPERM-NEXT: and x13, x13, x15
+; NOSVE2BITPERM-NEXT: and x14, x13, x0, lsl #32
+; NOSVE2BITPERM-NEXT: bic x13, x0, x13
+; NOSVE2BITPERM-NEXT: orr x13, x13, x14
+; NOSVE2BITPERM-NEXT: and x14, x12, x13, lsl #16
+; NOSVE2BITPERM-NEXT: bic x12, x13, x12
+; NOSVE2BITPERM-NEXT: orr x12, x12, x14
+; NOSVE2BITPERM-NEXT: and x13, x11, x12, lsl #8
+; NOSVE2BITPERM-NEXT: bic x11, x12, x11
+; NOSVE2BITPERM-NEXT: orr x11, x11, x13
+; NOSVE2BITPERM-NEXT: and x12, x10, x11, lsl #4
+; NOSVE2BITPERM-NEXT: bic x10, x11, x10
+; NOSVE2BITPERM-NEXT: orr x10, x10, x12
+; NOSVE2BITPERM-NEXT: and x11, x9, x10, lsl #2
+; NOSVE2BITPERM-NEXT: bic x9, x10, x9
+; NOSVE2BITPERM-NEXT: orr x9, x9, x11
+; NOSVE2BITPERM-NEXT: and x10, x8, x9, lsl #1
+; NOSVE2BITPERM-NEXT: bic x8, x9, x8
+; NOSVE2BITPERM-NEXT: orr x8, x8, x10
+; NOSVE2BITPERM-NEXT: and x0, x8, x1
+; NOSVE2BITPERM-NEXT: ret
+ %res = call i64 @llvm.bdep.i64(i64 %val, i64 %mask)
+ ret i64 %res
+}
+
+define <vscale x 16 x i8> @bdep_nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask) nounwind {
+; BITPERM-LABEL: bdep_nxv16i8:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: bdep z0.b, z0.b, z1.b
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bdep_nxv16i8:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: movprfx z3, z1
+; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
+; NOSVE2BITPERM-NEXT: mov z2.b, #-1 // =0xffffffffffffffff
+; NOSVE2BITPERM-NEXT: lsl z3.b, z3.b, #1
+; NOSVE2BITPERM-NEXT: pmul z4.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: and z5.d, z4.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z4.d
+; NOSVE2BITPERM-NEXT: eor z4.d, z1.d, z5.d
+; NOSVE2BITPERM-NEXT: lsr z6.b, z5.b, #1
+; NOSVE2BITPERM-NEXT: pmul z7.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: orr z4.d, z4.d, z6.d
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z7.d
+; NOSVE2BITPERM-NEXT: and z6.d, z7.d, z4.d
+; NOSVE2BITPERM-NEXT: pmul z2.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: eor z4.d, z4.d, z6.d
+; NOSVE2BITPERM-NEXT: lsr z7.b, z6.b, #2
+; NOSVE2BITPERM-NEXT: orr z3.d, z4.d, z7.d
+; NOSVE2BITPERM-NEXT: and z2.d, z2.d, z3.d
+; NOSVE2BITPERM-NEXT: lsl z3.b, z0.b, #4
+; NOSVE2BITPERM-NEXT: bsl z3.d, z3.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: lsl z0.b, z3.b, #2
+; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z3.d, z6.d
+; NOSVE2BITPERM-NEXT: lsl z2.b, z0.b, #1
+; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: and z0.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: ret
+ %res = call <vscale x 16 x i8> @llvm.bdep.nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask)
+ ret <vscale x 16 x i8> %res
+}
+
+define <vscale x 8 x i16> @bdep_nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask) nounwind {
+; BITPERM-LABEL: bdep_nxv8i16:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: bdep z0.h, z0.h, z1.h
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bdep_nxv8i16:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: movprfx z3, z1
+; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
+; NOSVE2BITPERM-NEXT: mov z2.h, #-1 // =0xffffffffffffffff
+; NOSVE2BITPERM-NEXT: lsl z3.h, z3.h, #1
+; NOSVE2BITPERM-NEXT: trn1 z4.b, z2.b, z3.b
+; NOSVE2BITPERM-NEXT: trn2 z5.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmullb z6.h, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmul z4.b, z5.b, z4.b
+; NOSVE2BITPERM-NEXT: eorbt z4.b, z4.b, z4.b
+; NOSVE2BITPERM-NEXT: eortb z6.b, z6.b, z4.b
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z6.d
+; NOSVE2BITPERM-NEXT: trn1 z4.b, z2.b, z3.b
+; NOSVE2BITPERM-NEXT: trn2 z5.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmullb z7.h, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmul z4.b, z5.b, z4.b
+; NOSVE2BITPERM-NEXT: eorbt z4.b, z4.b, z4.b
+; NOSVE2BITPERM-NEXT: eortb z7.b, z7.b, z4.b
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z7.d
+; NOSVE2BITPERM-NEXT: trn1 z4.b, z2.b, z3.b
+; NOSVE2BITPERM-NEXT: trn2 z5.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmullb z24.h, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmul z4.b, z5.b, z4.b
+; NOSVE2BITPERM-NEXT: and z5.d, z6.d, z1.d
+; NOSVE2BITPERM-NEXT: eor z6.d, z1.d, z5.d
+; NOSVE2BITPERM-NEXT: lsr z25.h, z5.h, #1
+; NOSVE2BITPERM-NEXT: eorbt z4.b, z4.b, z4.b
+; NOSVE2BITPERM-NEXT: orr z6.d, z6.d, z25.d
+; NOSVE2BITPERM-NEXT: eortb z24.b, z24.b, z4.b
+; NOSVE2BITPERM-NEXT: and z4.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z24.d
+; NOSVE2BITPERM-NEXT: eor z6.d, z6.d, z4.d
+; NOSVE2BITPERM-NEXT: lsr z7.h, z4.h, #2
+; NOSVE2BITPERM-NEXT: trn1 z25.b, z2.b, z3.b
+; NOSVE2BITPERM-NEXT: trn2 z26.b, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: pmullb z2.h, z3.b, z2.b
+; NOSVE2BITPERM-NEXT: orr z3.d, z6.d, z7.d
+; NOSVE2BITPERM-NEXT: pmul z6.b, z26.b, z25.b
+; NOSVE2BITPERM-NEXT: and z7.d, z24.d, z3.d
+; NOSVE2BITPERM-NEXT: eorbt z6.b, z6.b, z6.b
+; NOSVE2BITPERM-NEXT: eor z3.d, z3.d, z7.d
+; NOSVE2BITPERM-NEXT: lsr z24.h, z7.h, #4
+; NOSVE2BITPERM-NEXT: orr z3.d, z3.d, z24.d
+; NOSVE2BITPERM-NEXT: eortb z2.b, z2.b, z6.b
+; NOSVE2BITPERM-NEXT: and z2.d, z2.d, z3.d
+; NOSVE2BITPERM-NEXT: lsl z3.h, z0.h, #8
+; NOSVE2BITPERM-NEXT: bsl z3.d, z3.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: lsl z0.h, z3.h, #4
+; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z3.d, z7.d
+; NOSVE2BITPERM-NEXT: lsl z2.h, z0.h, #2
+; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: lsl z0.h, z2.h, #1
+; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z2.d, z5.d
+; NOSVE2BITPERM-NEXT: and z0.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: ret
+ %res = call <vscale x 8 x i16> @llvm.bdep.nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask)
+ ret <vscale x 8 x i16> %res
+}
+
+define <vscale x 4 x i32> @bdep_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask) nounwind {
+; BITPERM-LABEL: bdep_nxv4i32:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: bdep z0.s, z0.s, z1.s
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bdep_nxv4i32:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: movprfx z3, z1
+; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
+; NOSVE2BITPERM-NEXT: mov z2.s, #-1 // =0xffffffffffffffff
+; NOSVE2BITPERM-NEXT: lsl z3.s, z3.s, #1
+; NOSVE2BITPERM-NEXT: pmullt z4.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: pmullb z5.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: trn1 z4.s, z5.s, z4.s
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z4.d
+; NOSVE2BITPERM-NEXT: and z4.d, z4.d, z1.d
+; NOSVE2BITPERM-NEXT: pmullt z5.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: lsr z24.s, z4.s, #1
+; NOSVE2BITPERM-NEXT: pmullb z6.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: trn1 z5.s, z6.s, z5.s
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z5.d
+; NOSVE2BITPERM-NEXT: pmullt z6.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: pmullb z7.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: trn1 z6.s, z7.s, z6.s
+; NOSVE2BITPERM-NEXT: eor z7.d, z1.d, z4.d
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z6.d
+; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z24.d
+; NOSVE2BITPERM-NEXT: pmullt z24.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: and z5.d, z5.d, z7.d
+; NOSVE2BITPERM-NEXT: pmullb z25.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z5.d
+; NOSVE2BITPERM-NEXT: lsr z26.s, z5.s, #2
+; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z26.d
+; NOSVE2BITPERM-NEXT: and z6.d, z6.d, z7.d
+; NOSVE2BITPERM-NEXT: trn1 z24.s, z25.s, z24.s
+; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z6.d
+; NOSVE2BITPERM-NEXT: lsr z25.s, z6.s, #4
+; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z24.d
+; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z25.d
+; NOSVE2BITPERM-NEXT: pmullt z26.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: pmullb z2.d, z3.s, z2.s
+; NOSVE2BITPERM-NEXT: and z3.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z3.d
+; NOSVE2BITPERM-NEXT: lsr z24.s, z3.s, #8
+; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z24.d
+; NOSVE2BITPERM-NEXT: trn1 z2.s, z2.s, z26.s
+; NOSVE2BITPERM-NEXT: and z2.d, z2.d, z7.d
+; NOSVE2BITPERM-NEXT: lsl z7.s, z0.s, #16
+; NOSVE2BITPERM-NEXT: bsl z7.d, z7.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: lsl z0.s, z7.s, #8
+; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z7.d, z3.d
+; NOSVE2BITPERM-NEXT: lsl z2.s, z0.s, #4
+; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: lsl z0.s, z2.s, #2
+; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z2.d, z5.d
+; NOSVE2BITPERM-NEXT: lsl z2.s, z0.s, #1
+; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: and z0.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: ret
+ %res = call <vscale x 4 x i32> @llvm.bdep.nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask)
+ ret <vscale x 4 x i32> %res
+}
+
+define <vscale x 2 x i64> @bdep_nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask) nounwind {
+; BITPERM-LABEL: bdep_nxv2i64:
+; BITPERM: // %bb.0:
+; BITPERM-NEXT: bdep z0.d, z0.d, z1.d
+; BITPERM-NEXT: ret
+;
+; NOSVE2BITPERM-LABEL: bdep_nxv2i64:
+; NOSVE2BITPERM: // %bb.0:
+; NOSVE2BITPERM-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
+; NOSVE2BITPERM-NEXT: addvl sp, sp, #-16
+; NOSVE2BITPERM-NEXT: str z23, [sp] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z22, [sp, #1, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z21, [sp, #2, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z20, [sp, #3, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z19, [sp, #4, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z18, [sp, #5, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z17, [sp, #6, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z16, [sp, #7, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z15, [sp, #8, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z14, [sp, #9, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z13, [sp, #10, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z12, [sp, #11, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: str z8, [sp, #15, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: addvl sp, sp, #-2
+; NOSVE2BITPERM-NEXT: str z0, [sp, #1, mul vl] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: movprfx z0, z1
+; NOSVE2BITPERM-NEXT: subr z0.b, z0.b, #255 // =0xff
+; NOSVE2BITPERM-NEXT: mov z5.d, #128 // =0x80
+; NOSVE2BITPERM-NEXT: str z1, [sp] // 16-byte Folded Spill
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x20000
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x10000
+; NOSVE2BITPERM-NEXT: mov z29.d, #0x40000
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x200000
+; NOSVE2BITPERM-NEXT: mov z30.d, #128 // =0x80
+; NOSVE2BITPERM-NEXT: lsl z0.d, z0.d, #1
+; NOSVE2BITPERM-NEXT: mov z31.d, #512 // =0x200
+; NOSVE2BITPERM-NEXT: mov z25.d, #256 // =0x100
+; NOSVE2BITPERM-NEXT: mov z7.d, #2048 // =0x800
+; NOSVE2BITPERM-NEXT: mov z24.d, #1024 // =0x400
+; NOSVE2BITPERM-NEXT: mov z22.d, #8192 // =0x2000
+; NOSVE2BITPERM-NEXT: mov z8.d, #0x100000
+; NOSVE2BITPERM-NEXT: mov z9.d, #0x800000
+; NOSVE2BITPERM-NEXT: mov z10.d, #0x400000
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #2
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
+; NOSVE2BITPERM-NEXT: movprfx z3, z0
+; NOSVE2BITPERM-NEXT: mul z3.d, z3.d, #8
+; NOSVE2BITPERM-NEXT: movprfx z4, z0
+; NOSVE2BITPERM-NEXT: mul z4.d, z4.d, #4
+; NOSVE2BITPERM-NEXT: mov z11.d, #0x2000000
+; NOSVE2BITPERM-NEXT: mov z12.d, #0x1000000
+; NOSVE2BITPERM-NEXT: mov z13.d, #0x8000000
+; NOSVE2BITPERM-NEXT: mov z14.d, #0x4000000
+; NOSVE2BITPERM-NEXT: mov z16.d, #0x20000000
+; NOSVE2BITPERM-NEXT: mov z17.d, #0x10000000
+; NOSVE2BITPERM-NEXT: mov z18.d, #0x40000000
+; NOSVE2BITPERM-NEXT: mov z15.d, #0x80000000
+; NOSVE2BITPERM-NEXT: eor z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #16
+; NOSVE2BITPERM-NEXT: mov z19.d, #0x800000000
+; NOSVE2BITPERM-NEXT: mov z20.d, #0x400000000
+; NOSVE2BITPERM-NEXT: mov z21.d, #0x20000000000
+; NOSVE2BITPERM-NEXT: mov z23.d, #0x200000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: movprfx z4, z0
+; NOSVE2BITPERM-NEXT: mul z4.d, z4.d, #64
+; NOSVE2BITPERM-NEXT: mov z5.d, #32768 // =0x8000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #512 // =0x200
+; NOSVE2BITPERM-NEXT: mov z2.d, #256 // =0x100
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #2048 // =0x800
+; NOSVE2BITPERM-NEXT: mov z4.d, #1024 // =0x400
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #8192 // =0x2000
+; NOSVE2BITPERM-NEXT: mov z2.d, #4096 // =0x1000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mov z4.d, #16384 // =0x4000
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x80000
+; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x100000
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x400000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x800000
+; NOSVE2BITPERM-NEXT: mov z29.d, #0x80000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x2000000
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x1000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x8000000
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x4000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x20000000
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x10000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x80000000
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x40000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x4000000000
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x20000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x100000000
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x400000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x200000000
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x10000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z1.d, z3.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x800000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x1000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x2000000000
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x8000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x10000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x20000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x80000000000
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x40000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x200000000000
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x100000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x800000000000
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x400000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x2000000000000
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x1000000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x8000000000000
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x4000000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x20000000000000
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x10000000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x80000000000000
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x40000000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x200000000000000
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x100000000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x800000000000000
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x400000000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: mov z3.d, #0x2000000000000000
+; NOSVE2BITPERM-NEXT: mov z4.d, #0x1000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z5.d, #0x8000000000000000
+; NOSVE2BITPERM-NEXT: mov z26.d, #0x4000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z26.d, #16384 // =0x4000
+; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z6.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #2
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
+; NOSVE2BITPERM-NEXT: movprfx z3, z0
+; NOSVE2BITPERM-NEXT: mul z3.d, z3.d, #8
+; NOSVE2BITPERM-NEXT: movprfx z4, z0
+; NOSVE2BITPERM-NEXT: mul z4.d, z4.d, #4
+; NOSVE2BITPERM-NEXT: eor z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #16
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z4.d, z3.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z30.d
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #64
+; NOSVE2BITPERM-NEXT: mov z30.d, #0x40000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z31.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z25.d
+; NOSVE2BITPERM-NEXT: mov z25.d, #32768 // =0x8000
+; NOSVE2BITPERM-NEXT: mov z31.d, #0x200000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x10000000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x100000000000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #4096 // =0x1000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z22.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z25.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z30.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z31.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z8.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z9.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z10.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z11.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z12.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z13.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z14.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z16.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z17.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z15.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z18.d
+; NOSVE2BITPERM-NEXT: mov z18.d, #0x8000000000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z19.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z20.d
+; NOSVE2BITPERM-NEXT: mov z19.d, #0x2000000000
+; NOSVE2BITPERM-NEXT: mov z20.d, #0x1000000000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z19.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z20.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z18.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z21.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z21.d, #0x80000000000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z21.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z23.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: mov z23.d, #0x800000000000
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z23.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: movprfx z4, z0
+; NOSVE2BITPERM-NEXT: mul z4.d, z4.d, #2
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
+; NOSVE2BITPERM-NEXT: movprfx z3, z0
+; NOSVE2BITPERM-NEXT: mul z3.d, z3.d, #8
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #4
+; NOSVE2BITPERM-NEXT: eor z4.d, z2.d, z4.d
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #16
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z1.d, z3.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #128 // =0x80
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #64
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #512 // =0x200
+; NOSVE2BITPERM-NEXT: mov z2.d, #256 // =0x100
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #2048 // =0x800
+; NOSVE2BITPERM-NEXT: mov z2.d, #1024 // =0x400
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #4096 // =0x1000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z22.d
+; NOSVE2BITPERM-NEXT: mov z22.d, #8192 // =0x2000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z25.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z26.d, #16384 // =0x4000
+; NOSVE2BITPERM-NEXT: mov z25.d, #0x4000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x2000000000000000
+; NOSVE2BITPERM-NEXT: mov z28.d, #0x1000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z30.d
+; NOSVE2BITPERM-NEXT: mov z29.d, #0x800000000000000
+; NOSVE2BITPERM-NEXT: mov z30.d, #0x400000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z31.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z8.d
+; NOSVE2BITPERM-NEXT: mov z31.d, #0x200000000000000
+; NOSVE2BITPERM-NEXT: mov z8.d, #0x100000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z9.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z10.d
+; NOSVE2BITPERM-NEXT: mov z9.d, #0x80000000000000
+; NOSVE2BITPERM-NEXT: mov z10.d, #0x40000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z11.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z12.d
+; NOSVE2BITPERM-NEXT: mov z11.d, #0x20000000000000
+; NOSVE2BITPERM-NEXT: mov z12.d, #0x10000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z13.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z14.d
+; NOSVE2BITPERM-NEXT: mov z13.d, #0x8000000000000
+; NOSVE2BITPERM-NEXT: mov z14.d, #0x4000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z16.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z17.d
+; NOSVE2BITPERM-NEXT: mov z17.d, #0x400000000000
+; NOSVE2BITPERM-NEXT: mov z16.d, #0x1000000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z15.d
+; NOSVE2BITPERM-NEXT: mov z15.d, #0x2000000000000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z19.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z20.d
+; NOSVE2BITPERM-NEXT: mov z19.d, #0x2000000000
+; NOSVE2BITPERM-NEXT: mov z20.d, #0x1000000000
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z18.d
+; NOSVE2BITPERM-NEXT: mov z18.d, #0x8000000000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z21.d
+; NOSVE2BITPERM-NEXT: mov z21.d, #0x800000000000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x8000000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z23.d
+; NOSVE2BITPERM-NEXT: mov z23.d, #4096 // =0x1000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z4.d
+; NOSVE2BITPERM-NEXT: movprfx z3, z0
+; NOSVE2BITPERM-NEXT: mul z3.d, z3.d, #2
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #8
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #4
+; NOSVE2BITPERM-NEXT: eor z3.d, z2.d, z3.d
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #16
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z1.d, z7.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #128 // =0x80
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #64
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #512 // =0x200
+; NOSVE2BITPERM-NEXT: mov z2.d, #256 // =0x100
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #2048 // =0x800
+; NOSVE2BITPERM-NEXT: mov z2.d, #1024 // =0x400
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #4096 // =0x1000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z22.d
+; NOSVE2BITPERM-NEXT: mov z22.d, #8192 // =0x2000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #32768 // =0x8000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mov z26.d, #8192 // =0x2000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z19.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z20.d
+; NOSVE2BITPERM-NEXT: mov z20.d, #0x400000000000
+; NOSVE2BITPERM-NEXT: mov z19.d, #0x20000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z18.d
+; NOSVE2BITPERM-NEXT: mov z18.d, #0x1000000000000
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000
+; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z21.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z17.d
+; NOSVE2BITPERM-NEXT: mov z21.d, #0x800000000000
+; NOSVE2BITPERM-NEXT: mov z17.d, #0x2000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z15.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z16.d
+; NOSVE2BITPERM-NEXT: mov z16.d, #0x8000000000000
+; NOSVE2BITPERM-NEXT: mov z15.d, #0x4000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z13.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z14.d
+; NOSVE2BITPERM-NEXT: mov z13.d, #0x20000000000000
+; NOSVE2BITPERM-NEXT: mov z14.d, #0x10000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z11.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z12.d
+; NOSVE2BITPERM-NEXT: mov z12.d, #0x80000000000000
+; NOSVE2BITPERM-NEXT: mov z11.d, #0x40000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z9.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z10.d
+; NOSVE2BITPERM-NEXT: mov z9.d, #0x200000000000000
+; NOSVE2BITPERM-NEXT: mov z10.d, #0x100000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z31.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z8.d
+; NOSVE2BITPERM-NEXT: mov z8.d, #0x800000000000000
+; NOSVE2BITPERM-NEXT: mov z31.d, #0x400000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z30.d
+; NOSVE2BITPERM-NEXT: mov z29.d, #0x2000000000000000
+; NOSVE2BITPERM-NEXT: mov z30.d, #0x1000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x8000000000000000
+; NOSVE2BITPERM-NEXT: mov z28.d, #16384 // =0x4000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z25.d
+; NOSVE2BITPERM-NEXT: mov z25.d, #0x4000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: movprfx z24, z0
+; NOSVE2BITPERM-NEXT: mul z24.d, z24.d, #2
+; NOSVE2BITPERM-NEXT: movprfx z2, z0
+; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #8
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #4
+; NOSVE2BITPERM-NEXT: eor z2.d, z2.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z1.d, z7.d
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #16
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #128 // =0x80
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #64
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #512 // =0x200
+; NOSVE2BITPERM-NEXT: mov z7.d, #256 // =0x100
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #2048 // =0x800
+; NOSVE2BITPERM-NEXT: mov z7.d, #1024 // =0x400
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z22.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z23.d
+; NOSVE2BITPERM-NEXT: mov z22.d, #4096 // =0x1000
+; NOSVE2BITPERM-NEXT: mov z23.d, #32768 // =0x8000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #32768 // =0x8000
+; NOSVE2BITPERM-NEXT: mov z7.d, #16384 // =0x4000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x10000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x40000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x100000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x400000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x1000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x4000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x10000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x40000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x100000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x400000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x1000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x4000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x10000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x40000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x100000000000
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z21.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z20.d
+; NOSVE2BITPERM-NEXT: mov z21.d, #0x800000000000
+; NOSVE2BITPERM-NEXT: mov z20.d, #0x400000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z17.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z18.d
+; NOSVE2BITPERM-NEXT: mov z17.d, #0x1000000000000
+; NOSVE2BITPERM-NEXT: mov z18.d, #0x20000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z16.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z15.d
+; NOSVE2BITPERM-NEXT: mov z15.d, #0x4000000000000
+; NOSVE2BITPERM-NEXT: mov z16.d, #0x8000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z13.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z14.d
+; NOSVE2BITPERM-NEXT: mov z13.d, #0x10000000000000
+; NOSVE2BITPERM-NEXT: mov z14.d, #0x200000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z12.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z11.d
+; NOSVE2BITPERM-NEXT: mov z12.d, #0x80000000000000
+; NOSVE2BITPERM-NEXT: mov z11.d, #0x40000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z9.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z10.d
+; NOSVE2BITPERM-NEXT: mov z9.d, #0x100000000000000
+; NOSVE2BITPERM-NEXT: mov z10.d, #0x2000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z8.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z31.d
+; NOSVE2BITPERM-NEXT: mov z8.d, #0x800000000000000
+; NOSVE2BITPERM-NEXT: mov z31.d, #0x400000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z30.d
+; NOSVE2BITPERM-NEXT: mov z29.d, #0x1000000000000000
+; NOSVE2BITPERM-NEXT: mov z30.d, #0x4000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z25.d
+; NOSVE2BITPERM-NEXT: mov z27.d, #0x8000000000000000
+; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
+; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z2.d
+; NOSVE2BITPERM-NEXT: movprfx z25, z0
+; NOSVE2BITPERM-NEXT: mul z25.d, z25.d, #2
+; NOSVE2BITPERM-NEXT: movprfx z1, z0
+; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #1
+; NOSVE2BITPERM-NEXT: movprfx z24, z0
+; NOSVE2BITPERM-NEXT: mul z24.d, z24.d, #8
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #4
+; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z25.d
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z21.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z24.d
+; NOSVE2BITPERM-NEXT: movprfx z7, z0
+; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #32
+; NOSVE2BITPERM-NEXT: movprfx z24, z0
+; NOSVE2BITPERM-NEXT: mul z24.d, z24.d, #16
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #128 // =0x80
+; NOSVE2BITPERM-NEXT: movprfx z24, z0
+; NOSVE2BITPERM-NEXT: mul z24.d, z24.d, #64
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #512 // =0x200
+; NOSVE2BITPERM-NEXT: mov z24.d, #256 // =0x100
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #2048 // =0x800
+; NOSVE2BITPERM-NEXT: mov z24.d, #1024 // =0x400
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z22.d
+; NOSVE2BITPERM-NEXT: ldr z26, [sp] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z23.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z28.d
+; NOSVE2BITPERM-NEXT: and z6.d, z6.d, z26.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x10000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z19.d
+; NOSVE2BITPERM-NEXT: mul z19.d, z0.d, z20.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x80000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x40000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x200000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x100000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x800000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x400000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x2000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x1000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x8000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x4000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x20000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x10000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x80000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x40000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x200000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x100000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x800000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x400000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x2000000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x1000000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x8000000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x4000000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x20000000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x10000000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x80000000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x40000000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: mov z7.d, #0x200000000000
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x100000000000
+; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
+; NOSVE2BITPERM-NEXT: eor z7.d, z26.d, z6.d
+; NOSVE2BITPERM-NEXT: lsr z24.d, z6.d, #1
+; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z24.d
+; NOSVE2BITPERM-NEXT: mov z24.d, #0x2000000000000
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z19.d, z25.d
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z17.d
+; NOSVE2BITPERM-NEXT: and z5.d, z5.d, z7.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z5.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z15.d
+; NOSVE2BITPERM-NEXT: lsr z15.d, z5.d, #2
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z16.d
+; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z15.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z18.d
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z13.d
+; NOSVE2BITPERM-NEXT: and z4.d, z4.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z12.d
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z11.d
+; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z4.d
+; NOSVE2BITPERM-NEXT: lsr z11.d, z4.d, #4
+; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z11.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z14.d
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z9.d
+; NOSVE2BITPERM-NEXT: and z3.d, z3.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z8.d
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z31.d
+; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z3.d
+; NOSVE2BITPERM-NEXT: lsr z31.d, z3.d, #8
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
+; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z31.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z10.d
+; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z29.d
+; NOSVE2BITPERM-NEXT: and z2.d, z2.d, z7.d
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
+; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z27.d
+; NOSVE2BITPERM-NEXT: mul z0.d, z0.d, z30.d
+; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z2.d
+; NOSVE2BITPERM-NEXT: lsr z25.d, z2.d, #16
+; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z0.d, z24.d
+; NOSVE2BITPERM-NEXT: orr z0.d, z7.d, z25.d
+; NOSVE2BITPERM-NEXT: ldr z7, [sp, #1, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: and z0.d, z1.d, z0.d
+; NOSVE2BITPERM-NEXT: lsl z1.d, z7.d, #32
+; NOSVE2BITPERM-NEXT: bsl z1.d, z1.d, z7.d, z0.d
+; NOSVE2BITPERM-NEXT: lsl z0.d, z1.d, #16
+; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z1.d, z2.d
+; NOSVE2BITPERM-NEXT: lsl z1.d, z0.d, #8
+; NOSVE2BITPERM-NEXT: bsl z1.d, z1.d, z0.d, z3.d
+; NOSVE2BITPERM-NEXT: lsl z0.d, z1.d, #4
+; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z1.d, z4.d
+; NOSVE2BITPERM-NEXT: lsl z1.d, z0.d, #2
+; NOSVE2BITPERM-NEXT: bsl z1.d, z1.d, z0.d, z5.d
+; NOSVE2BITPERM-NEXT: lsl z0.d, z1.d, #1
+; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z1.d, z6.d
+; NOSVE2BITPERM-NEXT: and z0.d, z0.d, z26.d
+; NOSVE2BITPERM-NEXT: addvl sp, sp, #2
+; NOSVE2BITPERM-NEXT: ldr z23, [sp] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z22, [sp, #1, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z21, [sp, #2, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z20, [sp, #3, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z19, [sp, #4, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z18, [sp, #5, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z17, [sp, #6, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z16, [sp, #7, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z15, [sp, #8, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z14, [sp, #9, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z13, [sp, #10, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z12, [sp, #11, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ldr z8, [sp, #15, mul vl] // 16-byte Folded Reload
+; NOSVE2BITPERM-NEXT: addvl sp, sp, #16
+; NOSVE2BITPERM-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
+; NOSVE2BITPERM-NEXT: ret
+ %res = call <vscale x 2 x i64> @llvm.bdep.nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask)
+ ret <vscale x 2 x i64> %res
+}
+
diff --git a/llvm/test/CodeGen/AArch64/bext-bdep.ll b/llvm/test/CodeGen/AArch64/bext.ll
similarity index 50%
rename from llvm/test/CodeGen/AArch64/bext-bdep.ll
rename to llvm/test/CodeGen/AArch64/bext.ll
index 454f6e079cd10..9d844d6c291a5 100644
--- a/llvm/test/CodeGen/AArch64/bext-bdep.ll
+++ b/llvm/test/CodeGen/AArch64/bext.ll
@@ -57,58 +57,6 @@ define i8 @bext_i8(i8 %val, i8 %mask) nounwind {
ret i8 %res
}
-define i8 @bdep_i8(i8 %val, i8 %mask) nounwind {
-; BITPERM-LABEL: bdep_i8:
-; BITPERM: // %bb.0:
-; BITPERM-NEXT: and w8, w0, #0xff
-; BITPERM-NEXT: and w9, w1, #0xff
-; BITPERM-NEXT: fmov s0, w8
-; BITPERM-NEXT: fmov s1, w9
-; BITPERM-NEXT: bdep z0.s, z0.s, z1.s
-; BITPERM-NEXT: fmov w0, s0
-; BITPERM-NEXT: ret
-;
-; NOSVE2BITPERM-LABEL: bdep_i8:
-; NOSVE2BITPERM: // %bb.0:
-; NOSVE2BITPERM-NEXT: mvn w9, w1
-; NOSVE2BITPERM-NEXT: mov w8, #-1 // =0xffffffff
-; NOSVE2BITPERM-NEXT: lsl w9, w9, #1
-; NOSVE2BITPERM-NEXT: fmov s0, w8
-; NOSVE2BITPERM-NEXT: fmov s1, w9
-; NOSVE2BITPERM-NEXT: pmul v1.8b, v1.8b, v0.8b
-; NOSVE2BITPERM-NEXT: fmov w8, s1
-; NOSVE2BITPERM-NEXT: bic w9, w9, w8
-; NOSVE2BITPERM-NEXT: and w8, w8, w1
-; NOSVE2BITPERM-NEXT: fmov s1, w9
-; NOSVE2BITPERM-NEXT: eor w11, w1, w8
-; NOSVE2BITPERM-NEXT: and w12, w8, #0xfe
-; NOSVE2BITPERM-NEXT: orr w11, w11, w12, lsr #1
-; NOSVE2BITPERM-NEXT: pmul v1.8b, v1.8b, v0.8b
-; NOSVE2BITPERM-NEXT: fmov w10, s1
-; NOSVE2BITPERM-NEXT: bic w9, w9, w10
-; NOSVE2BITPERM-NEXT: fmov s1, w9
-; NOSVE2BITPERM-NEXT: and w9, w10, w11
-; NOSVE2BITPERM-NEXT: eor w10, w11, w9
-; NOSVE2BITPERM-NEXT: and w11, w9, #0xfc
-; NOSVE2BITPERM-NEXT: orr w10, w10, w11, lsr #2
-; NOSVE2BITPERM-NEXT: pmul v0.8b, v1.8b, v0.8b
-; NOSVE2BITPERM-NEXT: fmov w11, s0
-; NOSVE2BITPERM-NEXT: and w10, w11, w10
-; NOSVE2BITPERM-NEXT: and w11, w10, w0, lsl #4
-; NOSVE2BITPERM-NEXT: bic w10, w0, w10
-; NOSVE2BITPERM-NEXT: orr w10, w10, w11
-; NOSVE2BITPERM-NEXT: and w11, w9, w10, lsl #2
-; NOSVE2BITPERM-NEXT: bic w9, w10, w9
-; NOSVE2BITPERM-NEXT: orr w9, w9, w11
-; NOSVE2BITPERM-NEXT: and w10, w8, w9, lsl #1
-; NOSVE2BITPERM-NEXT: bic w8, w9, w8
-; NOSVE2BITPERM-NEXT: orr w8, w8, w10
-; NOSVE2BITPERM-NEXT: and w0, w8, w1
-; NOSVE2BITPERM-NEXT: ret
- %res = call i8 @llvm.bdep.i8(i8 %val, i8 %mask)
- ret i8 %res
-}
-
define i16 @bext_i16(i16 %val, i16 %mask) nounwind {
; BITPERM-LABEL: bext_i16:
; BITPERM: // %bb.0:
@@ -226,119 +174,6 @@ define i16 @bext_i16(i16 %val, i16 %mask) nounwind {
ret i16 %res
}
-define i16 @bdep_i16(i16 %val, i16 %mask) nounwind {
-; BITPERM-LABEL: bdep_i16:
-; BITPERM: // %bb.0:
-; BITPERM-NEXT: and w8, w0, #0xffff
-; BITPERM-NEXT: and w9, w1, #0xffff
-; BITPERM-NEXT: fmov s0, w8
-; BITPERM-NEXT: fmov s1, w9
-; BITPERM-NEXT: bdep z0.s, z0.s, z1.s
-; BITPERM-NEXT: fmov w0, s0
-; BITPERM-NEXT: ret
-;
-; NOSVE2BITPERM-LABEL: bdep_i16:
-; NOSVE2BITPERM: // %bb.0:
-; NOSVE2BITPERM-NEXT: mvn w8, w1
-; NOSVE2BITPERM-NEXT: lsl w9, w8, #1
-; NOSVE2BITPERM-NEXT: neg w11, w8, lsl #16
-; NOSVE2BITPERM-NEXT: eor w10, w9, w8, lsl #2
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #3
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #4
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #5
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #6
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #7
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #8
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #9
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #10
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #11
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #12
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #13
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #14
-; NOSVE2BITPERM-NEXT: eor w8, w10, w8, lsl #15
-; NOSVE2BITPERM-NEXT: eor w8, w8, w11
-; NOSVE2BITPERM-NEXT: bic w9, w9, w8
-; NOSVE2BITPERM-NEXT: and w8, w8, w1
-; NOSVE2BITPERM-NEXT: eor w10, w9, w9, lsl #1
-; NOSVE2BITPERM-NEXT: neg w11, w9, lsl #15
-; NOSVE2BITPERM-NEXT: eor w13, w1, w8
-; NOSVE2BITPERM-NEXT: and w14, w8, #0xfffe
-; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #2
-; NOSVE2BITPERM-NEXT: orr w13, w13, w14, lsr #1
-; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #3
-; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #4
-; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #5
-; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #6
-; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #7
-; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #8
-; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #9
-; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #10
-; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #11
-; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #12
-; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #13
-; NOSVE2BITPERM-NEXT: eor w10, w10, w9, lsl #14
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11
-; NOSVE2BITPERM-NEXT: bic w9, w9, w10
-; NOSVE2BITPERM-NEXT: and w10, w10, w13
-; NOSVE2BITPERM-NEXT: eor w11, w9, w9, lsl #1
-; NOSVE2BITPERM-NEXT: neg w12, w9, lsl #15
-; NOSVE2BITPERM-NEXT: eor w13, w13, w10
-; NOSVE2BITPERM-NEXT: and w14, w10, #0xfffc
-; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #2
-; NOSVE2BITPERM-NEXT: orr w13, w13, w14, lsr #2
-; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #3
-; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #4
-; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #5
-; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #6
-; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #7
-; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #8
-; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #9
-; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #10
-; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #11
-; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #12
-; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #13
-; NOSVE2BITPERM-NEXT: eor w11, w11, w9, lsl #14
-; NOSVE2BITPERM-NEXT: eor w11, w11, w12
-; NOSVE2BITPERM-NEXT: bic w9, w9, w11
-; NOSVE2BITPERM-NEXT: and w11, w11, w13
-; NOSVE2BITPERM-NEXT: eor w12, w9, w9, lsl #1
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11
-; NOSVE2BITPERM-NEXT: and w14, w11, #0xfff0
-; NOSVE2BITPERM-NEXT: orr w13, w13, w14, lsr #4
-; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #2
-; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #3
-; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #4
-; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #5
-; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #6
-; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #7
-; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #8
-; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #9
-; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #10
-; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #11
-; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #12
-; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #13
-; NOSVE2BITPERM-NEXT: eor w12, w12, w9, lsl #14
-; NOSVE2BITPERM-NEXT: neg w9, w9, lsl #15
-; NOSVE2BITPERM-NEXT: eor w9, w12, w9
-; NOSVE2BITPERM-NEXT: and w9, w9, w13
-; NOSVE2BITPERM-NEXT: and w12, w9, w0, lsl #8
-; NOSVE2BITPERM-NEXT: bic w9, w0, w9
-; NOSVE2BITPERM-NEXT: orr w9, w9, w12
-; NOSVE2BITPERM-NEXT: and w12, w11, w9, lsl #4
-; NOSVE2BITPERM-NEXT: bic w9, w9, w11
-; NOSVE2BITPERM-NEXT: orr w9, w9, w12
-; NOSVE2BITPERM-NEXT: and w11, w10, w9, lsl #2
-; NOSVE2BITPERM-NEXT: bic w9, w9, w10
-; NOSVE2BITPERM-NEXT: orr w9, w9, w11
-; NOSVE2BITPERM-NEXT: and w10, w8, w9, lsl #1
-; NOSVE2BITPERM-NEXT: bic w8, w9, w8
-; NOSVE2BITPERM-NEXT: orr w8, w8, w10
-; NOSVE2BITPERM-NEXT: and w0, w8, w1
-; NOSVE2BITPERM-NEXT: ret
- %res = call i16 @llvm.bdep.i16(i16 %val, i16 %mask)
- ret i16 %res
-}
-
define i32 @bext_i32(i32 %val, i32 %mask) nounwind {
; BITPERM-LABEL: bext_i32:
; BITPERM: // %bb.0:
@@ -540,217 +375,16 @@ define i32 @bext_i32(i32 %val, i32 %mask) nounwind {
ret i32 %res
}
-define i32 @bdep_i32(i32 %val, i32 %mask) nounwind {
-; BITPERM-LABEL: bdep_i32:
+define i64 @bext_i64(i64 %val, i64 %mask) nounwind {
+; BITPERM-LABEL: bext_i64:
; BITPERM: // %bb.0:
-; BITPERM-NEXT: fmov s0, w0
-; BITPERM-NEXT: fmov s1, w1
-; BITPERM-NEXT: bdep z0.s, z0.s, z1.s
-; BITPERM-NEXT: fmov w0, s0
+; BITPERM-NEXT: fmov d0, x0
+; BITPERM-NEXT: fmov d1, x1
+; BITPERM-NEXT: bext z0.d, z0.d, z1.d
+; BITPERM-NEXT: fmov x0, d0
; BITPERM-NEXT: ret
;
-; NOSVE2BITPERM-LABEL: bdep_i32:
-; NOSVE2BITPERM: // %bb.0:
-; NOSVE2BITPERM-NEXT: mvn w8, w1
-; NOSVE2BITPERM-NEXT: lsl w9, w8, #1
-; NOSVE2BITPERM-NEXT: eor w10, w9, w8, lsl #2
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #3
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #4
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #5
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #6
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #7
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #8
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #9
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #10
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #11
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #12
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #13
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #14
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #15
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #16
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #17
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #18
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #19
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #20
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #21
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #22
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #23
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #24
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #25
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #26
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #27
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #28
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #29
-; NOSVE2BITPERM-NEXT: eor w10, w10, w8, lsl #30
-; NOSVE2BITPERM-NEXT: eor w8, w10, w8, lsl #31
-; NOSVE2BITPERM-NEXT: bic w10, w9, w8
-; NOSVE2BITPERM-NEXT: and w8, w8, w1
-; NOSVE2BITPERM-NEXT: eor w9, w10, w10, lsl #1
-; NOSVE2BITPERM-NEXT: eor w14, w1, w8
-; NOSVE2BITPERM-NEXT: orr w14, w14, w8, lsr #1
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #2
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #3
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #4
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #5
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #6
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #7
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #8
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #9
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #10
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #11
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #12
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #13
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #14
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #15
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #16
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #17
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #18
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #19
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #20
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #21
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #22
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #23
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #24
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #25
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #26
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #27
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #28
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #29
-; NOSVE2BITPERM-NEXT: eor w9, w9, w10, lsl #30
-; NOSVE2BITPERM-NEXT: bic w11, w10, w9
-; NOSVE2BITPERM-NEXT: and w9, w9, w14
-; NOSVE2BITPERM-NEXT: eor w10, w11, w11, lsl #1
-; NOSVE2BITPERM-NEXT: eor w14, w14, w9
-; NOSVE2BITPERM-NEXT: orr w14, w14, w9, lsr #2
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #2
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #3
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #4
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #5
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #6
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #7
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #8
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #9
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #10
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #11
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #12
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #13
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #14
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #15
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #16
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #17
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #18
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #19
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #20
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #21
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #22
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #23
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #24
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #25
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #26
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #27
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #28
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #29
-; NOSVE2BITPERM-NEXT: eor w10, w10, w11, lsl #30
-; NOSVE2BITPERM-NEXT: bic w11, w11, w10
-; NOSVE2BITPERM-NEXT: and w10, w10, w14
-; NOSVE2BITPERM-NEXT: eor w12, w11, w11, lsl #1
-; NOSVE2BITPERM-NEXT: eor w14, w14, w10
-; NOSVE2BITPERM-NEXT: orr w14, w14, w10, lsr #4
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #2
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #3
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #4
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #5
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #6
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #7
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #8
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #9
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #10
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #11
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #12
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #13
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #14
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #15
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #16
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #17
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #18
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #19
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #20
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #21
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #22
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #23
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #24
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #25
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #26
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #27
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #28
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #29
-; NOSVE2BITPERM-NEXT: eor w12, w12, w11, lsl #30
-; NOSVE2BITPERM-NEXT: bic w11, w11, w12
-; NOSVE2BITPERM-NEXT: and w12, w12, w14
-; NOSVE2BITPERM-NEXT: eor w13, w11, w11, lsl #1
-; NOSVE2BITPERM-NEXT: eor w14, w14, w12
-; NOSVE2BITPERM-NEXT: orr w14, w14, w12, lsr #8
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #2
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #3
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #4
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #5
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #6
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #7
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #8
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #9
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #10
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #11
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #12
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #13
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #14
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #15
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #16
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #17
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #18
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #19
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #20
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #21
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #22
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #23
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #24
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #25
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #26
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #27
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #28
-; NOSVE2BITPERM-NEXT: eor w13, w13, w11, lsl #29
-; NOSVE2BITPERM-NEXT: eor w11, w13, w11, lsl #30
-; NOSVE2BITPERM-NEXT: and w11, w11, w14
-; NOSVE2BITPERM-NEXT: and w13, w11, w0, lsl #16
-; NOSVE2BITPERM-NEXT: bic w11, w0, w11
-; NOSVE2BITPERM-NEXT: orr w11, w11, w13
-; NOSVE2BITPERM-NEXT: and w13, w12, w11, lsl #8
-; NOSVE2BITPERM-NEXT: bic w11, w11, w12
-; NOSVE2BITPERM-NEXT: orr w11, w11, w13
-; NOSVE2BITPERM-NEXT: and w12, w10, w11, lsl #4
-; NOSVE2BITPERM-NEXT: bic w10, w11, w10
-; NOSVE2BITPERM-NEXT: orr w10, w10, w12
-; NOSVE2BITPERM-NEXT: and w11, w9, w10, lsl #2
-; NOSVE2BITPERM-NEXT: bic w9, w10, w9
-; NOSVE2BITPERM-NEXT: orr w9, w9, w11
-; NOSVE2BITPERM-NEXT: and w10, w8, w9, lsl #1
-; NOSVE2BITPERM-NEXT: bic w8, w9, w8
-; NOSVE2BITPERM-NEXT: orr w8, w8, w10
-; NOSVE2BITPERM-NEXT: and w0, w8, w1
-; NOSVE2BITPERM-NEXT: ret
- %res = call i32 @llvm.bdep.i32(i32 %val, i32 %mask)
- ret i32 %res
-}
-
-define i64 @bext_i64(i64 %val, i64 %mask) nounwind {
-; BITPERM-LABEL: bext_i64:
-; BITPERM: // %bb.0:
-; BITPERM-NEXT: fmov d0, x0
-; BITPERM-NEXT: fmov d1, x1
-; BITPERM-NEXT: bext z0.d, z0.d, z1.d
-; BITPERM-NEXT: fmov x0, d0
-; BITPERM-NEXT: ret
-;
-; NOSVE2BITPERM-LABEL: bext_i64:
+; NOSVE2BITPERM-LABEL: bext_i64:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: mvn x8, x1
; NOSVE2BITPERM-NEXT: and x15, x0, x1
@@ -1172,444 +806,13 @@ define i64 @bext_i64(i64 %val, i64 %mask) nounwind {
ret i64 %res
}
-define i64 @bdep_i64(i64 %val, i64 %mask) nounwind {
-; BITPERM-LABEL: bdep_i64:
+define <vscale x 16 x i8> @bext_nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask) nounwind {
+; BITPERM-LABEL: bext_nxv16i8:
; BITPERM: // %bb.0:
-; BITPERM-NEXT: fmov d0, x0
-; BITPERM-NEXT: fmov d1, x1
-; BITPERM-NEXT: bdep z0.d, z0.d, z1.d
-; BITPERM-NEXT: fmov x0, d0
+; BITPERM-NEXT: bext z0.b, z0.b, z1.b
; BITPERM-NEXT: ret
;
-; NOSVE2BITPERM-LABEL: bdep_i64:
-; NOSVE2BITPERM: // %bb.0:
-; NOSVE2BITPERM-NEXT: mvn x8, x1
-; NOSVE2BITPERM-NEXT: lsl x9, x8, #1
-; NOSVE2BITPERM-NEXT: eor x10, x9, x8, lsl #2
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #3
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #4
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #5
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #6
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #7
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #8
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #9
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #10
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #11
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #12
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #13
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #14
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #15
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #16
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #17
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #18
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #19
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #20
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #21
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #22
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #23
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #24
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #25
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #26
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #27
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #28
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #29
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #30
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #31
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #32
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #33
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #34
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #35
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #36
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #37
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #38
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #39
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #40
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #41
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #42
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #43
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #44
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #45
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #46
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #47
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #48
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #49
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #50
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #51
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #52
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #53
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #54
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #55
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #56
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #57
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #58
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #59
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #60
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #61
-; NOSVE2BITPERM-NEXT: eor x10, x10, x8, lsl #62
-; NOSVE2BITPERM-NEXT: eor x8, x10, x8, lsl #63
-; NOSVE2BITPERM-NEXT: bic x10, x9, x8
-; NOSVE2BITPERM-NEXT: and x8, x8, x1
-; NOSVE2BITPERM-NEXT: eor x9, x10, x10, lsl #1
-; NOSVE2BITPERM-NEXT: eor x15, x1, x8
-; NOSVE2BITPERM-NEXT: orr x15, x15, x8, lsr #1
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #2
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #3
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #4
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #5
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #6
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #7
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #8
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #9
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #10
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #11
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #12
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #13
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #14
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #15
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #16
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #17
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #18
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #19
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #20
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #21
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #22
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #23
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #24
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #25
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #26
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #27
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #28
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #29
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #30
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #31
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #32
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #33
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #34
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #35
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #36
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #37
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #38
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #39
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #40
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #41
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #42
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #43
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #44
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #45
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #46
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #47
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #48
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #49
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #50
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #51
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #52
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #53
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #54
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #55
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #56
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #57
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #58
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #59
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #60
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #61
-; NOSVE2BITPERM-NEXT: eor x9, x9, x10, lsl #62
-; NOSVE2BITPERM-NEXT: bic x11, x10, x9
-; NOSVE2BITPERM-NEXT: and x9, x9, x15
-; NOSVE2BITPERM-NEXT: eor x10, x11, x11, lsl #1
-; NOSVE2BITPERM-NEXT: eor x15, x15, x9
-; NOSVE2BITPERM-NEXT: orr x15, x15, x9, lsr #2
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #2
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #3
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #4
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #5
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #6
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #7
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #8
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #9
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #10
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #11
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #12
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #13
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #14
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #15
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #16
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #17
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #18
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #19
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #20
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #21
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #22
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #23
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #24
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #25
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #26
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #27
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #28
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #29
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #30
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #31
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #32
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #33
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #34
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #35
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #36
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #37
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #38
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #39
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #40
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #41
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #42
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #43
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #44
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #45
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #46
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #47
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #48
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #49
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #50
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #51
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #52
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #53
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #54
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #55
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #56
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #57
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #58
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #59
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #60
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #61
-; NOSVE2BITPERM-NEXT: eor x10, x10, x11, lsl #62
-; NOSVE2BITPERM-NEXT: bic x12, x11, x10
-; NOSVE2BITPERM-NEXT: and x10, x10, x15
-; NOSVE2BITPERM-NEXT: eor x11, x12, x12, lsl #1
-; NOSVE2BITPERM-NEXT: eor x15, x15, x10
-; NOSVE2BITPERM-NEXT: orr x15, x15, x10, lsr #4
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #2
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #3
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #4
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #5
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #6
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #7
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #8
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #9
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #10
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #11
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #12
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #13
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #14
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #15
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #16
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #17
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #18
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #19
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #20
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #21
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #22
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #23
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #24
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #25
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #26
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #27
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #28
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #29
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #30
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #31
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #32
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #33
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #34
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #35
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #36
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #37
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #38
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #39
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #40
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #41
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #42
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #43
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #44
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #45
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #46
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #47
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #48
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #49
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #50
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #51
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #52
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #53
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #54
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #55
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #56
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #57
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #58
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #59
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #60
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #61
-; NOSVE2BITPERM-NEXT: eor x11, x11, x12, lsl #62
-; NOSVE2BITPERM-NEXT: bic x13, x12, x11
-; NOSVE2BITPERM-NEXT: and x11, x11, x15
-; NOSVE2BITPERM-NEXT: eor x12, x13, x13, lsl #1
-; NOSVE2BITPERM-NEXT: eor x15, x15, x11
-; NOSVE2BITPERM-NEXT: orr x15, x15, x11, lsr #8
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #2
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #3
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #4
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #5
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #6
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #7
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #8
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #9
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #10
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #11
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #12
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #13
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #14
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #15
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #16
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #17
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #18
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #19
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #20
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #21
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #22
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #23
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #24
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #25
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #26
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #27
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #28
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #29
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #30
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #31
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #32
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #33
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #34
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #35
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #36
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #37
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #38
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #39
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #40
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #41
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #42
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #43
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #44
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #45
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #46
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #47
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #48
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #49
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #50
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #51
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #52
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #53
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #54
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #55
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #56
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #57
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #58
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #59
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #60
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #61
-; NOSVE2BITPERM-NEXT: eor x12, x12, x13, lsl #62
-; NOSVE2BITPERM-NEXT: bic x13, x13, x12
-; NOSVE2BITPERM-NEXT: and x12, x12, x15
-; NOSVE2BITPERM-NEXT: eor x14, x13, x13, lsl #1
-; NOSVE2BITPERM-NEXT: eor x15, x15, x12
-; NOSVE2BITPERM-NEXT: orr x15, x15, x12, lsr #16
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #2
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #3
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #4
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #5
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #6
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #7
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #8
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #9
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #10
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #11
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #12
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #13
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #14
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #15
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #16
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #17
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #18
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #19
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #20
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #21
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #22
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #23
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #24
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #25
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #26
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #27
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #28
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #29
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #30
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #31
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #32
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #33
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #34
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #35
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #36
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #37
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #38
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #39
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #40
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #41
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #42
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #43
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #44
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #45
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #46
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #47
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #48
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #49
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #50
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #51
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #52
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #53
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #54
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #55
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #56
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #57
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #58
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #59
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #60
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #61
-; NOSVE2BITPERM-NEXT: eor x14, x14, x13, lsl #62
-; NOSVE2BITPERM-NEXT: eor x13, x14, x13, lsl #63
-; NOSVE2BITPERM-NEXT: and x13, x13, x15
-; NOSVE2BITPERM-NEXT: and x14, x13, x0, lsl #32
-; NOSVE2BITPERM-NEXT: bic x13, x0, x13
-; NOSVE2BITPERM-NEXT: orr x13, x13, x14
-; NOSVE2BITPERM-NEXT: and x14, x12, x13, lsl #16
-; NOSVE2BITPERM-NEXT: bic x12, x13, x12
-; NOSVE2BITPERM-NEXT: orr x12, x12, x14
-; NOSVE2BITPERM-NEXT: and x13, x11, x12, lsl #8
-; NOSVE2BITPERM-NEXT: bic x11, x12, x11
-; NOSVE2BITPERM-NEXT: orr x11, x11, x13
-; NOSVE2BITPERM-NEXT: and x12, x10, x11, lsl #4
-; NOSVE2BITPERM-NEXT: bic x10, x11, x10
-; NOSVE2BITPERM-NEXT: orr x10, x10, x12
-; NOSVE2BITPERM-NEXT: and x11, x9, x10, lsl #2
-; NOSVE2BITPERM-NEXT: bic x9, x10, x9
-; NOSVE2BITPERM-NEXT: orr x9, x9, x11
-; NOSVE2BITPERM-NEXT: and x10, x8, x9, lsl #1
-; NOSVE2BITPERM-NEXT: bic x8, x9, x8
-; NOSVE2BITPERM-NEXT: orr x8, x8, x10
-; NOSVE2BITPERM-NEXT: and x0, x8, x1
-; NOSVE2BITPERM-NEXT: ret
- %res = call i64 @llvm.bdep.i64(i64 %val, i64 %mask)
- ret i64 %res
-}
-
-define <vscale x 16 x i8> @bext_nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask) nounwind {
-; BITPERM-LABEL: bext_nxv16i8:
-; BITPERM: // %bb.0:
-; BITPERM-NEXT: bext z0.b, z0.b, z1.b
-; BITPERM-NEXT: ret
-;
-; NOSVE2BITPERM-LABEL: bext_nxv16i8:
+; NOSVE2BITPERM-LABEL: bext_nxv16i8:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: movprfx z3, z1
; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
@@ -1647,44 +850,6 @@ define <vscale x 16 x i8> @bext_nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x
ret <vscale x 16 x i8> %res
}
-define <vscale x 16 x i8> @bdep_nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask) nounwind {
-; BITPERM-LABEL: bdep_nxv16i8:
-; BITPERM: // %bb.0:
-; BITPERM-NEXT: bdep z0.b, z0.b, z1.b
-; BITPERM-NEXT: ret
-;
-; NOSVE2BITPERM-LABEL: bdep_nxv16i8:
-; NOSVE2BITPERM: // %bb.0:
-; NOSVE2BITPERM-NEXT: movprfx z3, z1
-; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
-; NOSVE2BITPERM-NEXT: mov z2.b, #-1 // =0xffffffffffffffff
-; NOSVE2BITPERM-NEXT: lsl z3.b, z3.b, #1
-; NOSVE2BITPERM-NEXT: pmul z4.b, z3.b, z2.b
-; NOSVE2BITPERM-NEXT: and z5.d, z4.d, z1.d
-; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z4.d
-; NOSVE2BITPERM-NEXT: eor z4.d, z1.d, z5.d
-; NOSVE2BITPERM-NEXT: lsr z6.b, z5.b, #1
-; NOSVE2BITPERM-NEXT: pmul z7.b, z3.b, z2.b
-; NOSVE2BITPERM-NEXT: orr z4.d, z4.d, z6.d
-; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z7.d
-; NOSVE2BITPERM-NEXT: and z6.d, z7.d, z4.d
-; NOSVE2BITPERM-NEXT: pmul z2.b, z3.b, z2.b
-; NOSVE2BITPERM-NEXT: eor z4.d, z4.d, z6.d
-; NOSVE2BITPERM-NEXT: lsr z7.b, z6.b, #2
-; NOSVE2BITPERM-NEXT: orr z3.d, z4.d, z7.d
-; NOSVE2BITPERM-NEXT: and z2.d, z2.d, z3.d
-; NOSVE2BITPERM-NEXT: lsl z3.b, z0.b, #4
-; NOSVE2BITPERM-NEXT: bsl z3.d, z3.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: lsl z0.b, z3.b, #2
-; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z3.d, z6.d
-; NOSVE2BITPERM-NEXT: lsl z2.b, z0.b, #1
-; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z5.d
-; NOSVE2BITPERM-NEXT: and z0.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: ret
- %res = call <vscale x 16 x i8> @llvm.bdep.nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask)
- ret <vscale x 16 x i8> %res
-}
-
define <vscale x 8 x i16> @bext_nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask) nounwind {
; BITPERM-LABEL: bext_nxv8i16:
; BITPERM: // %bb.0:
@@ -1759,72 +924,6 @@ define <vscale x 8 x i16> @bext_nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i
ret <vscale x 8 x i16> %res
}
-define <vscale x 8 x i16> @bdep_nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask) nounwind {
-; BITPERM-LABEL: bdep_nxv8i16:
-; BITPERM: // %bb.0:
-; BITPERM-NEXT: bdep z0.h, z0.h, z1.h
-; BITPERM-NEXT: ret
-;
-; NOSVE2BITPERM-LABEL: bdep_nxv8i16:
-; NOSVE2BITPERM: // %bb.0:
-; NOSVE2BITPERM-NEXT: movprfx z3, z1
-; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
-; NOSVE2BITPERM-NEXT: mov z2.h, #-1 // =0xffffffffffffffff
-; NOSVE2BITPERM-NEXT: lsl z3.h, z3.h, #1
-; NOSVE2BITPERM-NEXT: trn1 z4.b, z2.b, z3.b
-; NOSVE2BITPERM-NEXT: trn2 z5.b, z3.b, z2.b
-; NOSVE2BITPERM-NEXT: pmullb z6.h, z3.b, z2.b
-; NOSVE2BITPERM-NEXT: pmul z4.b, z5.b, z4.b
-; NOSVE2BITPERM-NEXT: eorbt z4.b, z4.b, z4.b
-; NOSVE2BITPERM-NEXT: eortb z6.b, z6.b, z4.b
-; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z6.d
-; NOSVE2BITPERM-NEXT: trn1 z4.b, z2.b, z3.b
-; NOSVE2BITPERM-NEXT: trn2 z5.b, z3.b, z2.b
-; NOSVE2BITPERM-NEXT: pmullb z7.h, z3.b, z2.b
-; NOSVE2BITPERM-NEXT: pmul z4.b, z5.b, z4.b
-; NOSVE2BITPERM-NEXT: eorbt z4.b, z4.b, z4.b
-; NOSVE2BITPERM-NEXT: eortb z7.b, z7.b, z4.b
-; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z7.d
-; NOSVE2BITPERM-NEXT: trn1 z4.b, z2.b, z3.b
-; NOSVE2BITPERM-NEXT: trn2 z5.b, z3.b, z2.b
-; NOSVE2BITPERM-NEXT: pmullb z24.h, z3.b, z2.b
-; NOSVE2BITPERM-NEXT: pmul z4.b, z5.b, z4.b
-; NOSVE2BITPERM-NEXT: and z5.d, z6.d, z1.d
-; NOSVE2BITPERM-NEXT: eor z6.d, z1.d, z5.d
-; NOSVE2BITPERM-NEXT: lsr z25.h, z5.h, #1
-; NOSVE2BITPERM-NEXT: eorbt z4.b, z4.b, z4.b
-; NOSVE2BITPERM-NEXT: orr z6.d, z6.d, z25.d
-; NOSVE2BITPERM-NEXT: eortb z24.b, z24.b, z4.b
-; NOSVE2BITPERM-NEXT: and z4.d, z7.d, z6.d
-; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z24.d
-; NOSVE2BITPERM-NEXT: eor z6.d, z6.d, z4.d
-; NOSVE2BITPERM-NEXT: lsr z7.h, z4.h, #2
-; NOSVE2BITPERM-NEXT: trn1 z25.b, z2.b, z3.b
-; NOSVE2BITPERM-NEXT: trn2 z26.b, z3.b, z2.b
-; NOSVE2BITPERM-NEXT: pmullb z2.h, z3.b, z2.b
-; NOSVE2BITPERM-NEXT: orr z3.d, z6.d, z7.d
-; NOSVE2BITPERM-NEXT: pmul z6.b, z26.b, z25.b
-; NOSVE2BITPERM-NEXT: and z7.d, z24.d, z3.d
-; NOSVE2BITPERM-NEXT: eorbt z6.b, z6.b, z6.b
-; NOSVE2BITPERM-NEXT: eor z3.d, z3.d, z7.d
-; NOSVE2BITPERM-NEXT: lsr z24.h, z7.h, #4
-; NOSVE2BITPERM-NEXT: orr z3.d, z3.d, z24.d
-; NOSVE2BITPERM-NEXT: eortb z2.b, z2.b, z6.b
-; NOSVE2BITPERM-NEXT: and z2.d, z2.d, z3.d
-; NOSVE2BITPERM-NEXT: lsl z3.h, z0.h, #8
-; NOSVE2BITPERM-NEXT: bsl z3.d, z3.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: lsl z0.h, z3.h, #4
-; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z3.d, z7.d
-; NOSVE2BITPERM-NEXT: lsl z2.h, z0.h, #2
-; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z4.d
-; NOSVE2BITPERM-NEXT: lsl z0.h, z2.h, #1
-; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z2.d, z5.d
-; NOSVE2BITPERM-NEXT: and z0.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: ret
- %res = call <vscale x 8 x i16> @llvm.bdep.nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask)
- ret <vscale x 8 x i16> %res
-}
-
define <vscale x 4 x i32> @bext_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask) nounwind {
; BITPERM-LABEL: bext_nxv4i32:
; BITPERM: // %bb.0:
@@ -1899,70 +998,6 @@ define <vscale x 4 x i32> @bext_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i
ret <vscale x 4 x i32> %res
}
-define <vscale x 4 x i32> @bdep_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask) nounwind {
-; BITPERM-LABEL: bdep_nxv4i32:
-; BITPERM: // %bb.0:
-; BITPERM-NEXT: bdep z0.s, z0.s, z1.s
-; BITPERM-NEXT: ret
-;
-; NOSVE2BITPERM-LABEL: bdep_nxv4i32:
-; NOSVE2BITPERM: // %bb.0:
-; NOSVE2BITPERM-NEXT: movprfx z3, z1
-; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
-; NOSVE2BITPERM-NEXT: mov z2.s, #-1 // =0xffffffffffffffff
-; NOSVE2BITPERM-NEXT: lsl z3.s, z3.s, #1
-; NOSVE2BITPERM-NEXT: pmullt z4.d, z3.s, z2.s
-; NOSVE2BITPERM-NEXT: pmullb z5.d, z3.s, z2.s
-; NOSVE2BITPERM-NEXT: trn1 z4.s, z5.s, z4.s
-; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z4.d
-; NOSVE2BITPERM-NEXT: and z4.d, z4.d, z1.d
-; NOSVE2BITPERM-NEXT: pmullt z5.d, z3.s, z2.s
-; NOSVE2BITPERM-NEXT: lsr z24.s, z4.s, #1
-; NOSVE2BITPERM-NEXT: pmullb z6.d, z3.s, z2.s
-; NOSVE2BITPERM-NEXT: trn1 z5.s, z6.s, z5.s
-; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z5.d
-; NOSVE2BITPERM-NEXT: pmullt z6.d, z3.s, z2.s
-; NOSVE2BITPERM-NEXT: pmullb z7.d, z3.s, z2.s
-; NOSVE2BITPERM-NEXT: trn1 z6.s, z7.s, z6.s
-; NOSVE2BITPERM-NEXT: eor z7.d, z1.d, z4.d
-; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z6.d
-; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z24.d
-; NOSVE2BITPERM-NEXT: pmullt z24.d, z3.s, z2.s
-; NOSVE2BITPERM-NEXT: and z5.d, z5.d, z7.d
-; NOSVE2BITPERM-NEXT: pmullb z25.d, z3.s, z2.s
-; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z5.d
-; NOSVE2BITPERM-NEXT: lsr z26.s, z5.s, #2
-; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z26.d
-; NOSVE2BITPERM-NEXT: and z6.d, z6.d, z7.d
-; NOSVE2BITPERM-NEXT: trn1 z24.s, z25.s, z24.s
-; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z6.d
-; NOSVE2BITPERM-NEXT: lsr z25.s, z6.s, #4
-; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z24.d
-; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z25.d
-; NOSVE2BITPERM-NEXT: pmullt z26.d, z3.s, z2.s
-; NOSVE2BITPERM-NEXT: pmullb z2.d, z3.s, z2.s
-; NOSVE2BITPERM-NEXT: and z3.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z3.d
-; NOSVE2BITPERM-NEXT: lsr z24.s, z3.s, #8
-; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z24.d
-; NOSVE2BITPERM-NEXT: trn1 z2.s, z2.s, z26.s
-; NOSVE2BITPERM-NEXT: and z2.d, z2.d, z7.d
-; NOSVE2BITPERM-NEXT: lsl z7.s, z0.s, #16
-; NOSVE2BITPERM-NEXT: bsl z7.d, z7.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: lsl z0.s, z7.s, #8
-; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z7.d, z3.d
-; NOSVE2BITPERM-NEXT: lsl z2.s, z0.s, #4
-; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z6.d
-; NOSVE2BITPERM-NEXT: lsl z0.s, z2.s, #2
-; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z2.d, z5.d
-; NOSVE2BITPERM-NEXT: lsl z2.s, z0.s, #1
-; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z4.d
-; NOSVE2BITPERM-NEXT: and z0.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: ret
- %res = call <vscale x 4 x i32> @llvm.bdep.nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask)
- ret <vscale x 4 x i32> %res
-}
-
define <vscale x 2 x i64> @bext_nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask) nounwind {
; BITPERM-LABEL: bext_nxv2i64:
; BITPERM: // %bb.0:
@@ -3007,1051 +2042,3 @@ define <vscale x 2 x i64> @bext_nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i
ret <vscale x 2 x i64> %res
}
-define <vscale x 2 x i64> @bdep_nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask) nounwind {
-; BITPERM-LABEL: bdep_nxv2i64:
-; BITPERM: // %bb.0:
-; BITPERM-NEXT: bdep z0.d, z0.d, z1.d
-; BITPERM-NEXT: ret
-;
-; NOSVE2BITPERM-LABEL: bdep_nxv2i64:
-; NOSVE2BITPERM: // %bb.0:
-; NOSVE2BITPERM-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
-; NOSVE2BITPERM-NEXT: addvl sp, sp, #-16
-; NOSVE2BITPERM-NEXT: str z23, [sp] // 16-byte Folded Spill
-; NOSVE2BITPERM-NEXT: str z22, [sp, #1, mul vl] // 16-byte Folded Spill
-; NOSVE2BITPERM-NEXT: str z21, [sp, #2, mul vl] // 16-byte Folded Spill
-; NOSVE2BITPERM-NEXT: str z20, [sp, #3, mul vl] // 16-byte Folded Spill
-; NOSVE2BITPERM-NEXT: str z19, [sp, #4, mul vl] // 16-byte Folded Spill
-; NOSVE2BITPERM-NEXT: str z18, [sp, #5, mul vl] // 16-byte Folded Spill
-; NOSVE2BITPERM-NEXT: str z17, [sp, #6, mul vl] // 16-byte Folded Spill
-; NOSVE2BITPERM-NEXT: str z16, [sp, #7, mul vl] // 16-byte Folded Spill
-; NOSVE2BITPERM-NEXT: str z15, [sp, #8, mul vl] // 16-byte Folded Spill
-; NOSVE2BITPERM-NEXT: str z14, [sp, #9, mul vl] // 16-byte Folded Spill
-; NOSVE2BITPERM-NEXT: str z13, [sp, #10, mul vl] // 16-byte Folded Spill
-; NOSVE2BITPERM-NEXT: str z12, [sp, #11, mul vl] // 16-byte Folded Spill
-; NOSVE2BITPERM-NEXT: str z11, [sp, #12, mul vl] // 16-byte Folded Spill
-; NOSVE2BITPERM-NEXT: str z10, [sp, #13, mul vl] // 16-byte Folded Spill
-; NOSVE2BITPERM-NEXT: str z9, [sp, #14, mul vl] // 16-byte Folded Spill
-; NOSVE2BITPERM-NEXT: str z8, [sp, #15, mul vl] // 16-byte Folded Spill
-; NOSVE2BITPERM-NEXT: addvl sp, sp, #-2
-; NOSVE2BITPERM-NEXT: str z0, [sp, #1, mul vl] // 16-byte Folded Spill
-; NOSVE2BITPERM-NEXT: movprfx z0, z1
-; NOSVE2BITPERM-NEXT: subr z0.b, z0.b, #255 // =0xff
-; NOSVE2BITPERM-NEXT: mov z5.d, #128 // =0x80
-; NOSVE2BITPERM-NEXT: str z1, [sp] // 16-byte Folded Spill
-; NOSVE2BITPERM-NEXT: mov z27.d, #0x20000
-; NOSVE2BITPERM-NEXT: mov z28.d, #0x10000
-; NOSVE2BITPERM-NEXT: mov z29.d, #0x40000
-; NOSVE2BITPERM-NEXT: mov z26.d, #0x200000
-; NOSVE2BITPERM-NEXT: mov z30.d, #128 // =0x80
-; NOSVE2BITPERM-NEXT: lsl z0.d, z0.d, #1
-; NOSVE2BITPERM-NEXT: mov z31.d, #512 // =0x200
-; NOSVE2BITPERM-NEXT: mov z25.d, #256 // =0x100
-; NOSVE2BITPERM-NEXT: mov z7.d, #2048 // =0x800
-; NOSVE2BITPERM-NEXT: mov z24.d, #1024 // =0x400
-; NOSVE2BITPERM-NEXT: mov z22.d, #8192 // =0x2000
-; NOSVE2BITPERM-NEXT: mov z8.d, #0x100000
-; NOSVE2BITPERM-NEXT: mov z9.d, #0x800000
-; NOSVE2BITPERM-NEXT: mov z10.d, #0x400000
-; NOSVE2BITPERM-NEXT: movprfx z1, z0
-; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #2
-; NOSVE2BITPERM-NEXT: movprfx z2, z0
-; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
-; NOSVE2BITPERM-NEXT: movprfx z3, z0
-; NOSVE2BITPERM-NEXT: mul z3.d, z3.d, #8
-; NOSVE2BITPERM-NEXT: movprfx z4, z0
-; NOSVE2BITPERM-NEXT: mul z4.d, z4.d, #4
-; NOSVE2BITPERM-NEXT: mov z11.d, #0x2000000
-; NOSVE2BITPERM-NEXT: mov z12.d, #0x1000000
-; NOSVE2BITPERM-NEXT: mov z13.d, #0x8000000
-; NOSVE2BITPERM-NEXT: mov z14.d, #0x4000000
-; NOSVE2BITPERM-NEXT: mov z16.d, #0x20000000
-; NOSVE2BITPERM-NEXT: mov z17.d, #0x10000000
-; NOSVE2BITPERM-NEXT: mov z18.d, #0x40000000
-; NOSVE2BITPERM-NEXT: mov z15.d, #0x80000000
-; NOSVE2BITPERM-NEXT: eor z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: movprfx z1, z0
-; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
-; NOSVE2BITPERM-NEXT: movprfx z2, z0
-; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #16
-; NOSVE2BITPERM-NEXT: mov z19.d, #0x800000000
-; NOSVE2BITPERM-NEXT: mov z20.d, #0x400000000
-; NOSVE2BITPERM-NEXT: mov z21.d, #0x20000000000
-; NOSVE2BITPERM-NEXT: mov z23.d, #0x200000000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
-; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
-; NOSVE2BITPERM-NEXT: movprfx z4, z0
-; NOSVE2BITPERM-NEXT: mul z4.d, z4.d, #64
-; NOSVE2BITPERM-NEXT: mov z5.d, #32768 // =0x8000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #512 // =0x200
-; NOSVE2BITPERM-NEXT: mov z2.d, #256 // =0x100
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
-; NOSVE2BITPERM-NEXT: mov z3.d, #2048 // =0x800
-; NOSVE2BITPERM-NEXT: mov z4.d, #1024 // =0x400
-; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z3.d
-; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z4.d
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #8192 // =0x2000
-; NOSVE2BITPERM-NEXT: mov z2.d, #4096 // =0x1000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
-; NOSVE2BITPERM-NEXT: mov z4.d, #16384 // =0x4000
-; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
-; NOSVE2BITPERM-NEXT: mov z5.d, #0x80000
-; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z4.d
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z27.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z28.d
-; NOSVE2BITPERM-NEXT: mov z27.d, #0x100000
-; NOSVE2BITPERM-NEXT: mov z28.d, #0x400000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
-; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
-; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z29.d
-; NOSVE2BITPERM-NEXT: mov z5.d, #0x800000
-; NOSVE2BITPERM-NEXT: mov z29.d, #0x80000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z26.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
-; NOSVE2BITPERM-NEXT: mov z26.d, #0x2000000
-; NOSVE2BITPERM-NEXT: mov z27.d, #0x1000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
-; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
-; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z28.d
-; NOSVE2BITPERM-NEXT: mov z5.d, #0x8000000
-; NOSVE2BITPERM-NEXT: mov z28.d, #0x4000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z26.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
-; NOSVE2BITPERM-NEXT: mov z26.d, #0x20000000
-; NOSVE2BITPERM-NEXT: mov z27.d, #0x10000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
-; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
-; NOSVE2BITPERM-NEXT: mul z4.d, z0.d, z28.d
-; NOSVE2BITPERM-NEXT: mov z5.d, #0x80000000
-; NOSVE2BITPERM-NEXT: mov z28.d, #0x40000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z26.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z27.d
-; NOSVE2BITPERM-NEXT: mov z26.d, #0x4000000000
-; NOSVE2BITPERM-NEXT: mov z27.d, #0x20000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z4.d, z3.d
-; NOSVE2BITPERM-NEXT: mul z3.d, z0.d, z5.d
-; NOSVE2BITPERM-NEXT: mov z4.d, #0x100000000
-; NOSVE2BITPERM-NEXT: mov z5.d, #0x400000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z28.d
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x200000000
-; NOSVE2BITPERM-NEXT: mov z28.d, #0x10000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z1.d, z3.d
-; NOSVE2BITPERM-NEXT: mov z3.d, #0x800000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
-; NOSVE2BITPERM-NEXT: mov z4.d, #0x1000000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z5.d
-; NOSVE2BITPERM-NEXT: mov z3.d, #0x2000000000
-; NOSVE2BITPERM-NEXT: mov z5.d, #0x8000000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
-; NOSVE2BITPERM-NEXT: mov z4.d, #0x10000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
-; NOSVE2BITPERM-NEXT: mov z3.d, #0x20000000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
-; NOSVE2BITPERM-NEXT: mov z5.d, #0x80000000000
-; NOSVE2BITPERM-NEXT: mov z26.d, #0x40000000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
-; NOSVE2BITPERM-NEXT: mov z3.d, #0x200000000000
-; NOSVE2BITPERM-NEXT: mov z4.d, #0x100000000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
-; NOSVE2BITPERM-NEXT: mov z5.d, #0x800000000000
-; NOSVE2BITPERM-NEXT: mov z26.d, #0x400000000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
-; NOSVE2BITPERM-NEXT: mov z3.d, #0x2000000000000
-; NOSVE2BITPERM-NEXT: mov z4.d, #0x1000000000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
-; NOSVE2BITPERM-NEXT: mov z5.d, #0x8000000000000
-; NOSVE2BITPERM-NEXT: mov z26.d, #0x4000000000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
-; NOSVE2BITPERM-NEXT: mov z3.d, #0x20000000000000
-; NOSVE2BITPERM-NEXT: mov z4.d, #0x10000000000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
-; NOSVE2BITPERM-NEXT: mov z5.d, #0x80000000000000
-; NOSVE2BITPERM-NEXT: mov z26.d, #0x40000000000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
-; NOSVE2BITPERM-NEXT: mov z3.d, #0x200000000000000
-; NOSVE2BITPERM-NEXT: mov z4.d, #0x100000000000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
-; NOSVE2BITPERM-NEXT: mov z5.d, #0x800000000000000
-; NOSVE2BITPERM-NEXT: mov z26.d, #0x400000000000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
-; NOSVE2BITPERM-NEXT: mov z3.d, #0x2000000000000000
-; NOSVE2BITPERM-NEXT: mov z4.d, #0x1000000000000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
-; NOSVE2BITPERM-NEXT: mov z5.d, #0x8000000000000000
-; NOSVE2BITPERM-NEXT: mov z26.d, #0x4000000000000000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z3.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z4.d
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z5.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
-; NOSVE2BITPERM-NEXT: mov z26.d, #16384 // =0x4000
-; NOSVE2BITPERM-NEXT: eor3 z6.d, z6.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z6.d
-; NOSVE2BITPERM-NEXT: movprfx z1, z0
-; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #2
-; NOSVE2BITPERM-NEXT: movprfx z2, z0
-; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
-; NOSVE2BITPERM-NEXT: movprfx z3, z0
-; NOSVE2BITPERM-NEXT: mul z3.d, z3.d, #8
-; NOSVE2BITPERM-NEXT: movprfx z4, z0
-; NOSVE2BITPERM-NEXT: mul z4.d, z4.d, #4
-; NOSVE2BITPERM-NEXT: eor z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: movprfx z1, z0
-; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
-; NOSVE2BITPERM-NEXT: movprfx z2, z0
-; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #16
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z4.d, z3.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z30.d
-; NOSVE2BITPERM-NEXT: movprfx z2, z0
-; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #64
-; NOSVE2BITPERM-NEXT: mov z30.d, #0x40000
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z31.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z25.d
-; NOSVE2BITPERM-NEXT: mov z25.d, #32768 // =0x8000
-; NOSVE2BITPERM-NEXT: mov z31.d, #0x200000
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x10000000000
-; NOSVE2BITPERM-NEXT: mov z24.d, #0x100000000000
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z2.d, #4096 // =0x1000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z22.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z25.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z27.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z28.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z29.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z30.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z31.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z8.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z9.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z10.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z11.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z12.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z13.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z14.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z16.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z17.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z15.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z18.d
-; NOSVE2BITPERM-NEXT: mov z18.d, #0x8000000000
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z19.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z20.d
-; NOSVE2BITPERM-NEXT: mov z19.d, #0x2000000000
-; NOSVE2BITPERM-NEXT: mov z20.d, #0x1000000000
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z19.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z20.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z18.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z21.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z21.d, #0x80000000000
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z21.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z23.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: mov z23.d, #0x800000000000
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z23.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z5.d, z5.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z5.d
-; NOSVE2BITPERM-NEXT: movprfx z4, z0
-; NOSVE2BITPERM-NEXT: mul z4.d, z4.d, #2
-; NOSVE2BITPERM-NEXT: movprfx z2, z0
-; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
-; NOSVE2BITPERM-NEXT: movprfx z3, z0
-; NOSVE2BITPERM-NEXT: mul z3.d, z3.d, #8
-; NOSVE2BITPERM-NEXT: movprfx z1, z0
-; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #4
-; NOSVE2BITPERM-NEXT: eor z4.d, z2.d, z4.d
-; NOSVE2BITPERM-NEXT: movprfx z2, z0
-; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #16
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z1.d, z3.d
-; NOSVE2BITPERM-NEXT: movprfx z1, z0
-; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #128 // =0x80
-; NOSVE2BITPERM-NEXT: movprfx z2, z0
-; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #64
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #512 // =0x200
-; NOSVE2BITPERM-NEXT: mov z2.d, #256 // =0x100
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #2048 // =0x800
-; NOSVE2BITPERM-NEXT: mov z2.d, #1024 // =0x400
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z2.d, #4096 // =0x1000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z22.d
-; NOSVE2BITPERM-NEXT: mov z22.d, #8192 // =0x2000
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z25.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
-; NOSVE2BITPERM-NEXT: mov z26.d, #16384 // =0x4000
-; NOSVE2BITPERM-NEXT: mov z25.d, #0x4000000000000000
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z27.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z28.d
-; NOSVE2BITPERM-NEXT: mov z27.d, #0x2000000000000000
-; NOSVE2BITPERM-NEXT: mov z28.d, #0x1000000000000000
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z29.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z30.d
-; NOSVE2BITPERM-NEXT: mov z29.d, #0x800000000000000
-; NOSVE2BITPERM-NEXT: mov z30.d, #0x400000000000000
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z31.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z8.d
-; NOSVE2BITPERM-NEXT: mov z31.d, #0x200000000000000
-; NOSVE2BITPERM-NEXT: mov z8.d, #0x100000000000000
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z9.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z10.d
-; NOSVE2BITPERM-NEXT: mov z9.d, #0x80000000000000
-; NOSVE2BITPERM-NEXT: mov z10.d, #0x40000000000000
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z11.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z12.d
-; NOSVE2BITPERM-NEXT: mov z11.d, #0x20000000000000
-; NOSVE2BITPERM-NEXT: mov z12.d, #0x10000000000000
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z13.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z14.d
-; NOSVE2BITPERM-NEXT: mov z13.d, #0x8000000000000
-; NOSVE2BITPERM-NEXT: mov z14.d, #0x4000000000000
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z16.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z17.d
-; NOSVE2BITPERM-NEXT: mov z17.d, #0x400000000000
-; NOSVE2BITPERM-NEXT: mov z16.d, #0x1000000000000
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z15.d
-; NOSVE2BITPERM-NEXT: mov z15.d, #0x2000000000000
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z19.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z20.d
-; NOSVE2BITPERM-NEXT: mov z19.d, #0x2000000000
-; NOSVE2BITPERM-NEXT: mov z20.d, #0x1000000000
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z18.d
-; NOSVE2BITPERM-NEXT: mov z18.d, #0x8000000000
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z21.d
-; NOSVE2BITPERM-NEXT: mov z21.d, #0x800000000000
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: mov z24.d, #0x8000000000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z23.d
-; NOSVE2BITPERM-NEXT: mov z23.d, #4096 // =0x1000
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z4.d, z4.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z4.d
-; NOSVE2BITPERM-NEXT: movprfx z3, z0
-; NOSVE2BITPERM-NEXT: mul z3.d, z3.d, #2
-; NOSVE2BITPERM-NEXT: movprfx z2, z0
-; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
-; NOSVE2BITPERM-NEXT: movprfx z7, z0
-; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #8
-; NOSVE2BITPERM-NEXT: movprfx z1, z0
-; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #4
-; NOSVE2BITPERM-NEXT: eor z3.d, z2.d, z3.d
-; NOSVE2BITPERM-NEXT: movprfx z2, z0
-; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #16
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z1.d, z7.d
-; NOSVE2BITPERM-NEXT: movprfx z1, z0
-; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #128 // =0x80
-; NOSVE2BITPERM-NEXT: movprfx z2, z0
-; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #64
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #512 // =0x200
-; NOSVE2BITPERM-NEXT: mov z2.d, #256 // =0x100
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #2048 // =0x800
-; NOSVE2BITPERM-NEXT: mov z2.d, #1024 // =0x400
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z2.d, #4096 // =0x1000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z22.d
-; NOSVE2BITPERM-NEXT: mov z22.d, #8192 // =0x2000
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #32768 // =0x8000
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z26.d
-; NOSVE2BITPERM-NEXT: mov z26.d, #8192 // =0x2000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x1000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x400000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z19.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z20.d
-; NOSVE2BITPERM-NEXT: mov z20.d, #0x400000000000
-; NOSVE2BITPERM-NEXT: mov z19.d, #0x20000
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x4000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z18.d
-; NOSVE2BITPERM-NEXT: mov z18.d, #0x1000000000000
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x10000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x40000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000
-; NOSVE2BITPERM-NEXT: mov z2.d, #0x100000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z21.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z17.d
-; NOSVE2BITPERM-NEXT: mov z21.d, #0x800000000000
-; NOSVE2BITPERM-NEXT: mov z17.d, #0x2000000000000
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z15.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z16.d
-; NOSVE2BITPERM-NEXT: mov z16.d, #0x8000000000000
-; NOSVE2BITPERM-NEXT: mov z15.d, #0x4000000000000
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z13.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z14.d
-; NOSVE2BITPERM-NEXT: mov z13.d, #0x20000000000000
-; NOSVE2BITPERM-NEXT: mov z14.d, #0x10000000000000
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z11.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z12.d
-; NOSVE2BITPERM-NEXT: mov z12.d, #0x80000000000000
-; NOSVE2BITPERM-NEXT: mov z11.d, #0x40000000000000
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z9.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z10.d
-; NOSVE2BITPERM-NEXT: mov z9.d, #0x200000000000000
-; NOSVE2BITPERM-NEXT: mov z10.d, #0x100000000000000
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z31.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z8.d
-; NOSVE2BITPERM-NEXT: mov z8.d, #0x800000000000000
-; NOSVE2BITPERM-NEXT: mov z31.d, #0x400000000000000
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z29.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z30.d
-; NOSVE2BITPERM-NEXT: mov z29.d, #0x2000000000000000
-; NOSVE2BITPERM-NEXT: mov z30.d, #0x1000000000000000
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z27.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z28.d
-; NOSVE2BITPERM-NEXT: mov z27.d, #0x8000000000000000
-; NOSVE2BITPERM-NEXT: mov z28.d, #16384 // =0x4000
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: mul z2.d, z0.d, z25.d
-; NOSVE2BITPERM-NEXT: mov z25.d, #0x4000000000000000
-; NOSVE2BITPERM-NEXT: eor3 z3.d, z3.d, z2.d, z1.d
-; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z3.d
-; NOSVE2BITPERM-NEXT: movprfx z24, z0
-; NOSVE2BITPERM-NEXT: mul z24.d, z24.d, #2
-; NOSVE2BITPERM-NEXT: movprfx z2, z0
-; NOSVE2BITPERM-NEXT: mul z2.d, z2.d, #1
-; NOSVE2BITPERM-NEXT: movprfx z7, z0
-; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #8
-; NOSVE2BITPERM-NEXT: movprfx z1, z0
-; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #4
-; NOSVE2BITPERM-NEXT: eor z2.d, z2.d, z24.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z1.d, z7.d
-; NOSVE2BITPERM-NEXT: movprfx z1, z0
-; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #32
-; NOSVE2BITPERM-NEXT: movprfx z7, z0
-; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #16
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #128 // =0x80
-; NOSVE2BITPERM-NEXT: movprfx z7, z0
-; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #64
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #512 // =0x200
-; NOSVE2BITPERM-NEXT: mov z7.d, #256 // =0x100
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #2048 // =0x800
-; NOSVE2BITPERM-NEXT: mov z7.d, #1024 // =0x400
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z22.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z23.d
-; NOSVE2BITPERM-NEXT: mov z22.d, #4096 // =0x1000
-; NOSVE2BITPERM-NEXT: mov z23.d, #32768 // =0x8000
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #32768 // =0x8000
-; NOSVE2BITPERM-NEXT: mov z7.d, #16384 // =0x4000
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x10000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x40000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x100000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x400000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x1000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x4000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x10000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x40000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x100000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x800000000
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x400000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x2000000000
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x1000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x8000000000
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x4000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x20000000000
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x10000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x80000000000
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x40000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mov z1.d, #0x200000000000
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x100000000000
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z21.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z20.d
-; NOSVE2BITPERM-NEXT: mov z21.d, #0x800000000000
-; NOSVE2BITPERM-NEXT: mov z20.d, #0x400000000000
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z17.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z18.d
-; NOSVE2BITPERM-NEXT: mov z17.d, #0x1000000000000
-; NOSVE2BITPERM-NEXT: mov z18.d, #0x20000000000000
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z16.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z15.d
-; NOSVE2BITPERM-NEXT: mov z15.d, #0x4000000000000
-; NOSVE2BITPERM-NEXT: mov z16.d, #0x8000000000000
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z13.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z14.d
-; NOSVE2BITPERM-NEXT: mov z13.d, #0x10000000000000
-; NOSVE2BITPERM-NEXT: mov z14.d, #0x200000000000000
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z12.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z11.d
-; NOSVE2BITPERM-NEXT: mov z12.d, #0x80000000000000
-; NOSVE2BITPERM-NEXT: mov z11.d, #0x40000000000000
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z9.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z10.d
-; NOSVE2BITPERM-NEXT: mov z9.d, #0x100000000000000
-; NOSVE2BITPERM-NEXT: mov z10.d, #0x2000000000000000
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z8.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z31.d
-; NOSVE2BITPERM-NEXT: mov z8.d, #0x800000000000000
-; NOSVE2BITPERM-NEXT: mov z31.d, #0x400000000000000
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z29.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z30.d
-; NOSVE2BITPERM-NEXT: mov z29.d, #0x1000000000000000
-; NOSVE2BITPERM-NEXT: mov z30.d, #0x4000000000000000
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: mul z1.d, z0.d, z27.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z25.d
-; NOSVE2BITPERM-NEXT: mov z27.d, #0x8000000000000000
-; NOSVE2BITPERM-NEXT: eor3 z2.d, z2.d, z7.d, z1.d
-; NOSVE2BITPERM-NEXT: bic z0.d, z0.d, z2.d
-; NOSVE2BITPERM-NEXT: movprfx z25, z0
-; NOSVE2BITPERM-NEXT: mul z25.d, z25.d, #2
-; NOSVE2BITPERM-NEXT: movprfx z1, z0
-; NOSVE2BITPERM-NEXT: mul z1.d, z1.d, #1
-; NOSVE2BITPERM-NEXT: movprfx z24, z0
-; NOSVE2BITPERM-NEXT: mul z24.d, z24.d, #8
-; NOSVE2BITPERM-NEXT: movprfx z7, z0
-; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #4
-; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z25.d
-; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z21.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z7.d, z24.d
-; NOSVE2BITPERM-NEXT: movprfx z7, z0
-; NOSVE2BITPERM-NEXT: mul z7.d, z7.d, #32
-; NOSVE2BITPERM-NEXT: movprfx z24, z0
-; NOSVE2BITPERM-NEXT: mul z24.d, z24.d, #16
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z7.d, #128 // =0x80
-; NOSVE2BITPERM-NEXT: movprfx z24, z0
-; NOSVE2BITPERM-NEXT: mul z24.d, z24.d, #64
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z7.d, #512 // =0x200
-; NOSVE2BITPERM-NEXT: mov z24.d, #256 // =0x100
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z7.d, #2048 // =0x800
-; NOSVE2BITPERM-NEXT: mov z24.d, #1024 // =0x400
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z26.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z22.d
-; NOSVE2BITPERM-NEXT: ldr z26, [sp] // 16-byte Folded Reload
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z23.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z28.d
-; NOSVE2BITPERM-NEXT: and z6.d, z6.d, z26.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z24.d, #0x10000
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z19.d
-; NOSVE2BITPERM-NEXT: mul z19.d, z0.d, z20.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x80000
-; NOSVE2BITPERM-NEXT: mov z24.d, #0x40000
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x200000
-; NOSVE2BITPERM-NEXT: mov z24.d, #0x100000
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x800000
-; NOSVE2BITPERM-NEXT: mov z24.d, #0x400000
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x2000000
-; NOSVE2BITPERM-NEXT: mov z24.d, #0x1000000
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x8000000
-; NOSVE2BITPERM-NEXT: mov z24.d, #0x4000000
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x20000000
-; NOSVE2BITPERM-NEXT: mov z24.d, #0x10000000
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x80000000
-; NOSVE2BITPERM-NEXT: mov z24.d, #0x40000000
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x200000000
-; NOSVE2BITPERM-NEXT: mov z24.d, #0x100000000
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x800000000
-; NOSVE2BITPERM-NEXT: mov z24.d, #0x400000000
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x2000000000
-; NOSVE2BITPERM-NEXT: mov z24.d, #0x1000000000
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x8000000000
-; NOSVE2BITPERM-NEXT: mov z24.d, #0x4000000000
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x20000000000
-; NOSVE2BITPERM-NEXT: mov z24.d, #0x10000000000
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x80000000000
-; NOSVE2BITPERM-NEXT: mov z24.d, #0x40000000000
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: mov z7.d, #0x200000000000
-; NOSVE2BITPERM-NEXT: mov z24.d, #0x100000000000
-; NOSVE2BITPERM-NEXT: mul z7.d, z0.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z24.d, z7.d
-; NOSVE2BITPERM-NEXT: eor z7.d, z26.d, z6.d
-; NOSVE2BITPERM-NEXT: lsr z24.d, z6.d, #1
-; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z24.d
-; NOSVE2BITPERM-NEXT: mov z24.d, #0x2000000000000
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z19.d, z25.d
-; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z17.d
-; NOSVE2BITPERM-NEXT: and z5.d, z5.d, z7.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z5.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
-; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z15.d
-; NOSVE2BITPERM-NEXT: lsr z15.d, z5.d, #2
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z16.d
-; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z15.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z18.d
-; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z13.d
-; NOSVE2BITPERM-NEXT: and z4.d, z4.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z12.d
-; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z11.d
-; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z4.d
-; NOSVE2BITPERM-NEXT: lsr z11.d, z4.d, #4
-; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z11.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z14.d
-; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z9.d
-; NOSVE2BITPERM-NEXT: and z3.d, z3.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z8.d
-; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z31.d
-; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z3.d
-; NOSVE2BITPERM-NEXT: lsr z31.d, z3.d, #8
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
-; NOSVE2BITPERM-NEXT: orr z7.d, z7.d, z31.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z10.d
-; NOSVE2BITPERM-NEXT: mul z25.d, z0.d, z29.d
-; NOSVE2BITPERM-NEXT: and z2.d, z2.d, z7.d
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z25.d, z24.d
-; NOSVE2BITPERM-NEXT: mul z24.d, z0.d, z27.d
-; NOSVE2BITPERM-NEXT: mul z0.d, z0.d, z30.d
-; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z2.d
-; NOSVE2BITPERM-NEXT: lsr z25.d, z2.d, #16
-; NOSVE2BITPERM-NEXT: eor3 z1.d, z1.d, z0.d, z24.d
-; NOSVE2BITPERM-NEXT: orr z0.d, z7.d, z25.d
-; NOSVE2BITPERM-NEXT: ldr z7, [sp, #1, mul vl] // 16-byte Folded Reload
-; NOSVE2BITPERM-NEXT: and z0.d, z1.d, z0.d
-; NOSVE2BITPERM-NEXT: lsl z1.d, z7.d, #32
-; NOSVE2BITPERM-NEXT: bsl z1.d, z1.d, z7.d, z0.d
-; NOSVE2BITPERM-NEXT: lsl z0.d, z1.d, #16
-; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z1.d, z2.d
-; NOSVE2BITPERM-NEXT: lsl z1.d, z0.d, #8
-; NOSVE2BITPERM-NEXT: bsl z1.d, z1.d, z0.d, z3.d
-; NOSVE2BITPERM-NEXT: lsl z0.d, z1.d, #4
-; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z1.d, z4.d
-; NOSVE2BITPERM-NEXT: lsl z1.d, z0.d, #2
-; NOSVE2BITPERM-NEXT: bsl z1.d, z1.d, z0.d, z5.d
-; NOSVE2BITPERM-NEXT: lsl z0.d, z1.d, #1
-; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z1.d, z6.d
-; NOSVE2BITPERM-NEXT: and z0.d, z0.d, z26.d
-; NOSVE2BITPERM-NEXT: addvl sp, sp, #2
-; NOSVE2BITPERM-NEXT: ldr z23, [sp] // 16-byte Folded Reload
-; NOSVE2BITPERM-NEXT: ldr z22, [sp, #1, mul vl] // 16-byte Folded Reload
-; NOSVE2BITPERM-NEXT: ldr z21, [sp, #2, mul vl] // 16-byte Folded Reload
-; NOSVE2BITPERM-NEXT: ldr z20, [sp, #3, mul vl] // 16-byte Folded Reload
-; NOSVE2BITPERM-NEXT: ldr z19, [sp, #4, mul vl] // 16-byte Folded Reload
-; NOSVE2BITPERM-NEXT: ldr z18, [sp, #5, mul vl] // 16-byte Folded Reload
-; NOSVE2BITPERM-NEXT: ldr z17, [sp, #6, mul vl] // 16-byte Folded Reload
-; NOSVE2BITPERM-NEXT: ldr z16, [sp, #7, mul vl] // 16-byte Folded Reload
-; NOSVE2BITPERM-NEXT: ldr z15, [sp, #8, mul vl] // 16-byte Folded Reload
-; NOSVE2BITPERM-NEXT: ldr z14, [sp, #9, mul vl] // 16-byte Folded Reload
-; NOSVE2BITPERM-NEXT: ldr z13, [sp, #10, mul vl] // 16-byte Folded Reload
-; NOSVE2BITPERM-NEXT: ldr z12, [sp, #11, mul vl] // 16-byte Folded Reload
-; NOSVE2BITPERM-NEXT: ldr z11, [sp, #12, mul vl] // 16-byte Folded Reload
-; NOSVE2BITPERM-NEXT: ldr z10, [sp, #13, mul vl] // 16-byte Folded Reload
-; NOSVE2BITPERM-NEXT: ldr z9, [sp, #14, mul vl] // 16-byte Folded Reload
-; NOSVE2BITPERM-NEXT: ldr z8, [sp, #15, mul vl] // 16-byte Folded Reload
-; NOSVE2BITPERM-NEXT: addvl sp, sp, #16
-; NOSVE2BITPERM-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
-; NOSVE2BITPERM-NEXT: ret
- %res = call <vscale x 2 x i64> @llvm.bdep.nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask)
- ret <vscale x 2 x i64> %res
-}
-
-declare i8 @llvm.bext.i8(i8, i8)
-declare i16 @llvm.bext.i16(i16, i16)
-declare i32 @llvm.bext.i32(i32, i32)
-declare i64 @llvm.bext.i64(i64, i64)
-declare i8 @llvm.bdep.i8(i8, i8)
-declare i16 @llvm.bdep.i16(i16, i16)
-declare i32 @llvm.bdep.i32(i32, i32)
-declare i64 @llvm.bdep.i64(i64, i64)
-declare <vscale x 16 x i8> @llvm.bext.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>)
-declare <vscale x 8 x i16> @llvm.bext.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>)
-declare <vscale x 4 x i32> @llvm.bext.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>)
-declare <vscale x 2 x i64> @llvm.bext.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>)
-declare <vscale x 16 x i8> @llvm.bdep.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>)
-declare <vscale x 8 x i16> @llvm.bdep.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>)
-declare <vscale x 4 x i32> @llvm.bdep.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>)
-declare <vscale x 2 x i64> @llvm.bdep.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>)
diff --git a/llvm/test/CodeGen/X86/bext-bdep.ll b/llvm/test/CodeGen/X86/bdep.ll
similarity index 50%
rename from llvm/test/CodeGen/X86/bext-bdep.ll
rename to llvm/test/CodeGen/X86/bdep.ll
index d27094d8423b2..47ef9348b2d5a 100644
--- a/llvm/test/CodeGen/X86/bext-bdep.ll
+++ b/llvm/test/CodeGen/X86/bdep.ll
@@ -2,103 +2,12 @@
; RUN: llc < %s -mtriple=x86_64-- -mattr=+bmi2 | FileCheck %s --check-prefix=BMI2
; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s --check-prefix=NOBMI2
-define i8 @bext_i8(i8 %val, i8 %mask) nounwind {
-; BMI2-LABEL: bext_i8:
-; BMI2: # %bb.0:
-; BMI2-NEXT: movzbl %sil, %eax
-; BMI2-NEXT: movzbl %dil, %ecx
-; BMI2-NEXT: pextl %eax, %ecx, %eax
-; BMI2-NEXT: # kill: def $al killed $al killed $eax
-; BMI2-NEXT: retq
-;
-; NOBMI2-LABEL: bext_i8:
-; NOBMI2: # %bb.0:
-; NOBMI2-NEXT: movl %esi, %ecx
-; NOBMI2-NEXT: notb %cl
-; NOBMI2-NEXT: leal (,%rcx,4), %edx
-; NOBMI2-NEXT: leal (%rcx,%rcx), %eax
-; NOBMI2-NEXT: xorb %al, %dl
-; NOBMI2-NEXT: leal (,%rcx,8), %r8d
-; NOBMI2-NEXT: movl %ecx, %r9d
-; NOBMI2-NEXT: shlb $4, %r9b
-; NOBMI2-NEXT: xorb %r8b, %r9b
-; NOBMI2-NEXT: xorb %dl, %r9b
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shlb $5, %dl
-; NOBMI2-NEXT: movl %ecx, %r8d
-; NOBMI2-NEXT: shlb $6, %r8b
-; NOBMI2-NEXT: xorb %dl, %r8b
-; NOBMI2-NEXT: shlb $7, %cl
-; NOBMI2-NEXT: xorb %r8b, %cl
-; NOBMI2-NEXT: xorb %r9b, %cl
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: andb %sil, %dl
-; NOBMI2-NEXT: andl %esi, %edi
-; NOBMI2-NEXT: movl %edi, %r8d
-; NOBMI2-NEXT: andb %dl, %r8b
-; NOBMI2-NEXT: xorb %r8b, %dil
-; NOBMI2-NEXT: shrb %r8b
-; NOBMI2-NEXT: orb %dil, %r8b
-; NOBMI2-NEXT: xorb %dl, %sil
-; NOBMI2-NEXT: shrb %dl
-; NOBMI2-NEXT: orb %sil, %dl
-; NOBMI2-NEXT: notb %cl
-; NOBMI2-NEXT: andb %al, %cl
-; NOBMI2-NEXT: leal (%rcx,%rcx), %eax
-; NOBMI2-NEXT: xorb %cl, %al
-; NOBMI2-NEXT: leal (,%rcx,4), %esi
-; NOBMI2-NEXT: leal (,%rcx,8), %edi
-; NOBMI2-NEXT: xorb %sil, %dil
-; NOBMI2-NEXT: xorb %al, %dil
-; NOBMI2-NEXT: movl %ecx, %eax
-; NOBMI2-NEXT: shlb $4, %al
-; NOBMI2-NEXT: movl %ecx, %r9d
-; NOBMI2-NEXT: shlb $5, %r9b
-; NOBMI2-NEXT: xorb %al, %r9b
-; NOBMI2-NEXT: movl %ecx, %esi
-; NOBMI2-NEXT: shlb $6, %sil
-; NOBMI2-NEXT: xorb %r9b, %sil
-; NOBMI2-NEXT: xorb %dil, %sil
-; NOBMI2-NEXT: movl %esi, %eax
-; NOBMI2-NEXT: andb %dl, %al
-; NOBMI2-NEXT: movl %r8d, %edi
-; NOBMI2-NEXT: andb %al, %dil
-; NOBMI2-NEXT: xorb %dil, %r8b
-; NOBMI2-NEXT: shrb $2, %dil
-; NOBMI2-NEXT: orb %r8b, %dil
-; NOBMI2-NEXT: xorb %al, %dl
-; NOBMI2-NEXT: shrb $2, %al
-; NOBMI2-NEXT: orb %dl, %al
-; NOBMI2-NEXT: notb %sil
-; NOBMI2-NEXT: andb %cl, %sil
-; NOBMI2-NEXT: leal (%rsi,%rsi), %ecx
-; NOBMI2-NEXT: xorb %sil, %cl
-; NOBMI2-NEXT: leal (,%rsi,4), %edx
-; NOBMI2-NEXT: leal (,%rsi,8), %r8d
-; NOBMI2-NEXT: xorb %dl, %r8b
-; NOBMI2-NEXT: xorb %cl, %r8b
-; NOBMI2-NEXT: movl %esi, %ecx
-; NOBMI2-NEXT: shlb $4, %cl
-; NOBMI2-NEXT: movl %esi, %edx
-; NOBMI2-NEXT: shlb $5, %dl
-; NOBMI2-NEXT: xorb %cl, %dl
-; NOBMI2-NEXT: shlb $6, %sil
-; NOBMI2-NEXT: xorb %dl, %sil
-; NOBMI2-NEXT: xorb %r8b, %sil
-; NOBMI2-NEXT: andb %dil, %al
-; NOBMI2-NEXT: andb %sil, %al
-; NOBMI2-NEXT: xorb %al, %dil
-; NOBMI2-NEXT: shrb $4, %al
-; NOBMI2-NEXT: orb %dil, %al
-; NOBMI2-NEXT: retq
- %res = call i8 @llvm.bext.i8(i8 %val, i8 %mask)
- ret i8 %res
-}
-
define i8 @bdep_i8(i8 %val, i8 %mask) nounwind {
; BMI2-LABEL: bdep_i8:
; BMI2: # %bb.0:
-; BMI2-NEXT: pdepl %esi, %edi, %eax
+; BMI2-NEXT: movzbl %sil, %eax
+; BMI2-NEXT: movzbl %dil, %ecx
+; BMI2-NEXT: pdepl %eax, %ecx, %eax
; BMI2-NEXT: # kill: def $al killed $al killed $eax
; BMI2-NEXT: retq
;
@@ -189,235 +98,12 @@ define i8 @bdep_i8(i8 %val, i8 %mask) nounwind {
ret i8 %res
}
-define i16 @bext_i16(i16 %val, i16 %mask) nounwind {
-; BMI2-LABEL: bext_i16:
-; BMI2: # %bb.0:
-; BMI2-NEXT: movzwl %si, %eax
-; BMI2-NEXT: movzwl %di, %ecx
-; BMI2-NEXT: pextl %eax, %ecx, %eax
-; BMI2-NEXT: # kill: def $ax killed $ax killed $eax
-; BMI2-NEXT: retq
-;
-; NOBMI2-LABEL: bext_i16:
-; NOBMI2: # %bb.0:
-; NOBMI2-NEXT: pushq %rbx
-; NOBMI2-NEXT: andl %esi, %edi
-; NOBMI2-NEXT: movl %esi, %eax
-; NOBMI2-NEXT: notl %eax
-; NOBMI2-NEXT: leal (,%rax,4), %edx
-; NOBMI2-NEXT: leal (%rax,%rax), %ecx
-; NOBMI2-NEXT: xorl %ecx, %edx
-; NOBMI2-NEXT: leal (,%rax,8), %r8d
-; NOBMI2-NEXT: movl %eax, %r9d
-; NOBMI2-NEXT: shll $4, %r9d
-; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: xorl %edx, %r9d
-; NOBMI2-NEXT: movl %eax, %edx
-; NOBMI2-NEXT: shll $5, %edx
-; NOBMI2-NEXT: movl %eax, %r8d
-; NOBMI2-NEXT: shll $6, %r8d
-; NOBMI2-NEXT: xorl %edx, %r8d
-; NOBMI2-NEXT: movl %eax, %edx
-; NOBMI2-NEXT: shll $7, %edx
-; NOBMI2-NEXT: xorl %r8d, %edx
-; NOBMI2-NEXT: xorl %r9d, %edx
-; NOBMI2-NEXT: movl %eax, %r8d
-; NOBMI2-NEXT: shll $8, %r8d
-; NOBMI2-NEXT: movl %eax, %r9d
-; NOBMI2-NEXT: shll $9, %r9d
-; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: movl %eax, %r8d
-; NOBMI2-NEXT: shll $10, %r8d
-; NOBMI2-NEXT: xorl %r9d, %r8d
-; NOBMI2-NEXT: movl %eax, %r9d
-; NOBMI2-NEXT: shll $11, %r9d
-; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: xorl %edx, %r9d
-; NOBMI2-NEXT: movl %eax, %edx
-; NOBMI2-NEXT: shll $12, %edx
-; NOBMI2-NEXT: movl %eax, %r8d
-; NOBMI2-NEXT: shll $13, %r8d
-; NOBMI2-NEXT: xorl %edx, %r8d
-; NOBMI2-NEXT: movl %eax, %edx
-; NOBMI2-NEXT: shll $14, %edx
-; NOBMI2-NEXT: xorl %r8d, %edx
-; NOBMI2-NEXT: shll $15, %eax
-; NOBMI2-NEXT: xorl %edx, %eax
-; NOBMI2-NEXT: xorl %r9d, %eax
-; NOBMI2-NEXT: movl %eax, %r8d
-; NOBMI2-NEXT: andl %esi, %r8d
-; NOBMI2-NEXT: movl %edi, %edx
-; NOBMI2-NEXT: andl %r8d, %edx
-; NOBMI2-NEXT: xorl %edx, %edi
-; NOBMI2-NEXT: movzwl %dx, %edx
-; NOBMI2-NEXT: shrl %edx
-; NOBMI2-NEXT: orl %edi, %edx
-; NOBMI2-NEXT: xorl %r8d, %esi
-; NOBMI2-NEXT: movzwl %r8w, %edi
-; NOBMI2-NEXT: shrl %edi
-; NOBMI2-NEXT: orl %esi, %edi
-; NOBMI2-NEXT: notl %eax
-; NOBMI2-NEXT: andl %ecx, %eax
-; NOBMI2-NEXT: leal (%rax,%rax), %ecx
-; NOBMI2-NEXT: xorl %eax, %ecx
-; NOBMI2-NEXT: leal (,%rax,4), %esi
-; NOBMI2-NEXT: leal (,%rax,8), %r8d
-; NOBMI2-NEXT: xorl %esi, %r8d
-; NOBMI2-NEXT: xorl %ecx, %r8d
-; NOBMI2-NEXT: movl %eax, %ecx
-; NOBMI2-NEXT: shll $4, %ecx
-; NOBMI2-NEXT: movl %eax, %esi
-; NOBMI2-NEXT: shll $5, %esi
-; NOBMI2-NEXT: xorl %ecx, %esi
-; NOBMI2-NEXT: movl %eax, %ecx
-; NOBMI2-NEXT: shll $6, %ecx
-; NOBMI2-NEXT: xorl %esi, %ecx
-; NOBMI2-NEXT: xorl %r8d, %ecx
-; NOBMI2-NEXT: movl %eax, %esi
-; NOBMI2-NEXT: shll $7, %esi
-; NOBMI2-NEXT: movl %eax, %r8d
-; NOBMI2-NEXT: shll $8, %r8d
-; NOBMI2-NEXT: xorl %esi, %r8d
-; NOBMI2-NEXT: movl %eax, %esi
-; NOBMI2-NEXT: shll $9, %esi
-; NOBMI2-NEXT: xorl %r8d, %esi
-; NOBMI2-NEXT: movl %eax, %r8d
-; NOBMI2-NEXT: shll $10, %r8d
-; NOBMI2-NEXT: xorl %esi, %r8d
-; NOBMI2-NEXT: xorl %ecx, %r8d
-; NOBMI2-NEXT: movl %eax, %ecx
-; NOBMI2-NEXT: shll $11, %ecx
-; NOBMI2-NEXT: movl %eax, %esi
-; NOBMI2-NEXT: shll $12, %esi
-; NOBMI2-NEXT: xorl %ecx, %esi
-; NOBMI2-NEXT: movl %eax, %r9d
-; NOBMI2-NEXT: shll $13, %r9d
-; NOBMI2-NEXT: xorl %esi, %r9d
-; NOBMI2-NEXT: movl %eax, %ecx
-; NOBMI2-NEXT: shll $14, %ecx
-; NOBMI2-NEXT: xorl %r9d, %ecx
-; NOBMI2-NEXT: xorl %r8d, %ecx
-; NOBMI2-NEXT: movl %ecx, %r8d
-; NOBMI2-NEXT: andl %edi, %r8d
-; NOBMI2-NEXT: movl %edx, %esi
-; NOBMI2-NEXT: andl %r8d, %esi
-; NOBMI2-NEXT: xorl %esi, %edx
-; NOBMI2-NEXT: movzwl %si, %esi
-; NOBMI2-NEXT: shrl $2, %esi
-; NOBMI2-NEXT: orl %edx, %esi
-; NOBMI2-NEXT: xorl %r8d, %edi
-; NOBMI2-NEXT: movzwl %r8w, %edx
-; NOBMI2-NEXT: shrl $2, %edx
-; NOBMI2-NEXT: orl %edi, %edx
-; NOBMI2-NEXT: notl %ecx
-; NOBMI2-NEXT: andl %eax, %ecx
-; NOBMI2-NEXT: leal (%rcx,%rcx), %eax
-; NOBMI2-NEXT: xorl %ecx, %eax
-; NOBMI2-NEXT: leal (,%rcx,4), %edi
-; NOBMI2-NEXT: leal (,%rcx,8), %r8d
-; NOBMI2-NEXT: xorl %edi, %r8d
-; NOBMI2-NEXT: xorl %eax, %r8d
-; NOBMI2-NEXT: movl %ecx, %eax
-; NOBMI2-NEXT: shll $4, %eax
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $5, %edi
-; NOBMI2-NEXT: xorl %eax, %edi
-; NOBMI2-NEXT: movl %ecx, %eax
-; NOBMI2-NEXT: shll $6, %eax
-; NOBMI2-NEXT: xorl %edi, %eax
-; NOBMI2-NEXT: xorl %r8d, %eax
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $7, %edi
-; NOBMI2-NEXT: movl %ecx, %r8d
-; NOBMI2-NEXT: shll $8, %r8d
-; NOBMI2-NEXT: xorl %edi, %r8d
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $9, %edi
-; NOBMI2-NEXT: xorl %r8d, %edi
-; NOBMI2-NEXT: movl %ecx, %r8d
-; NOBMI2-NEXT: shll $10, %r8d
-; NOBMI2-NEXT: xorl %edi, %r8d
-; NOBMI2-NEXT: xorl %eax, %r8d
-; NOBMI2-NEXT: movl %ecx, %eax
-; NOBMI2-NEXT: shll $11, %eax
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $12, %edi
-; NOBMI2-NEXT: xorl %eax, %edi
-; NOBMI2-NEXT: movl %ecx, %r9d
-; NOBMI2-NEXT: shll $13, %r9d
-; NOBMI2-NEXT: xorl %edi, %r9d
-; NOBMI2-NEXT: movl %ecx, %eax
-; NOBMI2-NEXT: shll $14, %eax
-; NOBMI2-NEXT: xorl %r9d, %eax
-; NOBMI2-NEXT: xorl %r8d, %eax
-; NOBMI2-NEXT: movl %eax, %r8d
-; NOBMI2-NEXT: andl %edx, %r8d
-; NOBMI2-NEXT: movl %esi, %edi
-; NOBMI2-NEXT: andl %r8d, %edi
-; NOBMI2-NEXT: xorl %edi, %esi
-; NOBMI2-NEXT: movzwl %di, %edi
-; NOBMI2-NEXT: shrl $4, %edi
-; NOBMI2-NEXT: orl %esi, %edi
-; NOBMI2-NEXT: xorl %r8d, %edx
-; NOBMI2-NEXT: movzwl %r8w, %ebx
-; NOBMI2-NEXT: shrl $4, %ebx
-; NOBMI2-NEXT: orl %edx, %ebx
-; NOBMI2-NEXT: notl %eax
-; NOBMI2-NEXT: andl %ecx, %eax
-; NOBMI2-NEXT: leal (%rax,%rax), %ecx
-; NOBMI2-NEXT: xorl %eax, %ecx
-; NOBMI2-NEXT: leal (,%rax,4), %edx
-; NOBMI2-NEXT: leal (,%rax,8), %esi
-; NOBMI2-NEXT: xorl %edx, %esi
-; NOBMI2-NEXT: xorl %ecx, %esi
-; NOBMI2-NEXT: movl %eax, %ecx
-; NOBMI2-NEXT: shll $4, %ecx
-; NOBMI2-NEXT: movl %eax, %edx
-; NOBMI2-NEXT: shll $5, %edx
-; NOBMI2-NEXT: xorl %ecx, %edx
-; NOBMI2-NEXT: movl %eax, %ecx
-; NOBMI2-NEXT: shll $6, %ecx
-; NOBMI2-NEXT: xorl %edx, %ecx
-; NOBMI2-NEXT: xorl %esi, %ecx
-; NOBMI2-NEXT: movl %eax, %edx
-; NOBMI2-NEXT: shll $7, %edx
-; NOBMI2-NEXT: movl %eax, %esi
-; NOBMI2-NEXT: shll $8, %esi
-; NOBMI2-NEXT: xorl %edx, %esi
-; NOBMI2-NEXT: movl %eax, %edx
-; NOBMI2-NEXT: shll $9, %edx
-; NOBMI2-NEXT: xorl %esi, %edx
-; NOBMI2-NEXT: movl %eax, %esi
-; NOBMI2-NEXT: shll $10, %esi
-; NOBMI2-NEXT: xorl %edx, %esi
-; NOBMI2-NEXT: xorl %ecx, %esi
-; NOBMI2-NEXT: movl %eax, %ecx
-; NOBMI2-NEXT: shll $11, %ecx
-; NOBMI2-NEXT: movl %eax, %edx
-; NOBMI2-NEXT: shll $12, %edx
-; NOBMI2-NEXT: xorl %ecx, %edx
-; NOBMI2-NEXT: movl %eax, %ecx
-; NOBMI2-NEXT: shll $13, %ecx
-; NOBMI2-NEXT: xorl %edx, %ecx
-; NOBMI2-NEXT: shll $14, %eax
-; NOBMI2-NEXT: xorl %ecx, %eax
-; NOBMI2-NEXT: xorl %esi, %eax
-; NOBMI2-NEXT: andl %edi, %ebx
-; NOBMI2-NEXT: andl %eax, %ebx
-; NOBMI2-NEXT: xorl %ebx, %edi
-; NOBMI2-NEXT: movzbl %bh, %eax
-; NOBMI2-NEXT: orl %edi, %eax
-; NOBMI2-NEXT: # kill: def $ax killed $ax killed $eax
-; NOBMI2-NEXT: popq %rbx
-; NOBMI2-NEXT: retq
- %res = call i16 @llvm.bext.i16(i16 %val, i16 %mask)
- ret i16 %res
-}
-
define i16 @bdep_i16(i16 %val, i16 %mask) nounwind {
; BMI2-LABEL: bdep_i16:
; BMI2: # %bb.0:
-; BMI2-NEXT: pdepl %esi, %edi, %eax
+; BMI2-NEXT: movzwl %si, %eax
+; BMI2-NEXT: movzwl %di, %ecx
+; BMI2-NEXT: pdepl %eax, %ecx, %eax
; BMI2-NEXT: # kill: def $ax killed $ax killed $eax
; BMI2-NEXT: retq
;
@@ -634,607 +320,103 @@ define i16 @bdep_i16(i16 %val, i16 %mask) nounwind {
ret i16 %res
}
-define i32 @bext_i32(i32 %val, i32 %mask) nounwind {
-; BMI2-LABEL: bext_i32:
+define i32 @bdep_i32(i32 %val, i32 %mask) nounwind {
+; BMI2-LABEL: bdep_i32:
; BMI2: # %bb.0:
-; BMI2-NEXT: pextl %esi, %edi, %eax
+; BMI2-NEXT: pdepl %esi, %edi, %eax
; BMI2-NEXT: retq
;
-; NOBMI2-LABEL: bext_i32:
+; NOBMI2-LABEL: bdep_i32:
; NOBMI2: # %bb.0:
-; NOBMI2-NEXT: andl %esi, %edi
-; NOBMI2-NEXT: movl %esi, %eax
-; NOBMI2-NEXT: notl %eax
-; NOBMI2-NEXT: leal (,%rax,4), %edx
-; NOBMI2-NEXT: leal (%rax,%rax), %ecx
-; NOBMI2-NEXT: xorl %ecx, %edx
-; NOBMI2-NEXT: leal (,%rax,8), %r8d
-; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: pushq %rbp
+; NOBMI2-NEXT: pushq %r14
+; NOBMI2-NEXT: pushq %rbx
+; NOBMI2-NEXT: movl %esi, %edx
+; NOBMI2-NEXT: notl %edx
+; NOBMI2-NEXT: leal (,%rdx,4), %ecx
+; NOBMI2-NEXT: leal (%rdx,%rdx), %eax
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: leal (,%rdx,8), %r8d
+; NOBMI2-NEXT: movl %edx, %r9d
; NOBMI2-NEXT: shll $4, %r9d
; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: xorl %edx, %r9d
-; NOBMI2-NEXT: movl %eax, %edx
-; NOBMI2-NEXT: shll $5, %edx
-; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r9d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $5, %ecx
+; NOBMI2-NEXT: movl %edx, %r8d
; NOBMI2-NEXT: shll $6, %r8d
-; NOBMI2-NEXT: xorl %edx, %r8d
-; NOBMI2-NEXT: movl %eax, %edx
-; NOBMI2-NEXT: shll $7, %edx
-; NOBMI2-NEXT: xorl %r8d, %edx
-; NOBMI2-NEXT: xorl %r9d, %edx
-; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $7, %ecx
+; NOBMI2-NEXT: xorl %r8d, %ecx
+; NOBMI2-NEXT: xorl %r9d, %ecx
+; NOBMI2-NEXT: movl %edx, %r8d
; NOBMI2-NEXT: shll $8, %r8d
-; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: movl %edx, %r9d
; NOBMI2-NEXT: shll $9, %r9d
; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: movl %edx, %r8d
; NOBMI2-NEXT: shll $10, %r8d
; NOBMI2-NEXT: xorl %r9d, %r8d
-; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: movl %edx, %r9d
; NOBMI2-NEXT: shll $11, %r9d
; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: xorl %edx, %r9d
-; NOBMI2-NEXT: movl %eax, %edx
-; NOBMI2-NEXT: shll $12, %edx
-; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r9d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $12, %ecx
+; NOBMI2-NEXT: movl %edx, %r8d
; NOBMI2-NEXT: shll $13, %r8d
-; NOBMI2-NEXT: xorl %edx, %r8d
-; NOBMI2-NEXT: movl %eax, %edx
-; NOBMI2-NEXT: shll $14, %edx
-; NOBMI2-NEXT: xorl %r8d, %edx
-; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $14, %ecx
+; NOBMI2-NEXT: xorl %r8d, %ecx
+; NOBMI2-NEXT: movl %edx, %r8d
; NOBMI2-NEXT: shll $15, %r8d
-; NOBMI2-NEXT: xorl %edx, %r8d
-; NOBMI2-NEXT: movl %eax, %r10d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %edx, %r10d
; NOBMI2-NEXT: shll $16, %r10d
; NOBMI2-NEXT: xorl %r8d, %r10d
; NOBMI2-NEXT: xorl %r9d, %r10d
-; NOBMI2-NEXT: movl %eax, %edx
-; NOBMI2-NEXT: shll $17, %edx
-; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $17, %ecx
+; NOBMI2-NEXT: movl %edx, %r8d
; NOBMI2-NEXT: shll $18, %r8d
-; NOBMI2-NEXT: xorl %edx, %r8d
-; NOBMI2-NEXT: movl %eax, %edx
-; NOBMI2-NEXT: shll $19, %edx
-; NOBMI2-NEXT: xorl %r8d, %edx
-; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $19, %ecx
+; NOBMI2-NEXT: xorl %r8d, %ecx
+; NOBMI2-NEXT: movl %edx, %r8d
; NOBMI2-NEXT: shll $20, %r8d
-; NOBMI2-NEXT: xorl %edx, %r8d
-; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %edx, %r9d
; NOBMI2-NEXT: shll $21, %r9d
; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: movl %eax, %edx
-; NOBMI2-NEXT: shll $22, %edx
-; NOBMI2-NEXT: xorl %r9d, %edx
-; NOBMI2-NEXT: xorl %r10d, %edx
-; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $22, %ecx
+; NOBMI2-NEXT: xorl %r9d, %ecx
+; NOBMI2-NEXT: xorl %r10d, %ecx
+; NOBMI2-NEXT: movl %edx, %r8d
; NOBMI2-NEXT: shll $23, %r8d
-; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: movl %edx, %r9d
; NOBMI2-NEXT: shll $24, %r9d
; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: movl %edx, %r8d
; NOBMI2-NEXT: shll $25, %r8d
; NOBMI2-NEXT: xorl %r9d, %r8d
-; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: movl %edx, %r9d
; NOBMI2-NEXT: shll $26, %r9d
; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: movl %edx, %r8d
; NOBMI2-NEXT: shll $27, %r8d
; NOBMI2-NEXT: xorl %r9d, %r8d
-; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: movl %edx, %r9d
; NOBMI2-NEXT: shll $28, %r9d
; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: movl %edx, %r8d
; NOBMI2-NEXT: shll $29, %r8d
; NOBMI2-NEXT: xorl %r9d, %r8d
-; NOBMI2-NEXT: xorl %edx, %r8d
-; NOBMI2-NEXT: movl %eax, %edx
-; NOBMI2-NEXT: shll $30, %edx
-; NOBMI2-NEXT: shll $31, %eax
-; NOBMI2-NEXT: xorl %edx, %eax
-; NOBMI2-NEXT: xorl %r8d, %eax
-; NOBMI2-NEXT: movl %eax, %edx
-; NOBMI2-NEXT: andl %esi, %edx
-; NOBMI2-NEXT: movl %edi, %r8d
-; NOBMI2-NEXT: andl %edx, %r8d
-; NOBMI2-NEXT: xorl %r8d, %edi
-; NOBMI2-NEXT: shrl %r8d
-; NOBMI2-NEXT: orl %edi, %r8d
-; NOBMI2-NEXT: xorl %edx, %esi
-; NOBMI2-NEXT: shrl %edx
-; NOBMI2-NEXT: orl %esi, %edx
-; NOBMI2-NEXT: notl %eax
-; NOBMI2-NEXT: andl %ecx, %eax
-; NOBMI2-NEXT: leal (%rax,%rax), %ecx
-; NOBMI2-NEXT: xorl %eax, %ecx
-; NOBMI2-NEXT: leal (,%rax,4), %esi
-; NOBMI2-NEXT: leal (,%rax,8), %edi
-; NOBMI2-NEXT: xorl %esi, %edi
-; NOBMI2-NEXT: xorl %ecx, %edi
-; NOBMI2-NEXT: movl %eax, %ecx
-; NOBMI2-NEXT: shll $4, %ecx
-; NOBMI2-NEXT: movl %eax, %esi
-; NOBMI2-NEXT: shll $5, %esi
-; NOBMI2-NEXT: xorl %ecx, %esi
-; NOBMI2-NEXT: movl %eax, %ecx
-; NOBMI2-NEXT: shll $6, %ecx
-; NOBMI2-NEXT: xorl %esi, %ecx
-; NOBMI2-NEXT: xorl %edi, %ecx
-; NOBMI2-NEXT: movl %eax, %esi
-; NOBMI2-NEXT: shll $7, %esi
-; NOBMI2-NEXT: movl %eax, %edi
-; NOBMI2-NEXT: shll $8, %edi
-; NOBMI2-NEXT: xorl %esi, %edi
-; NOBMI2-NEXT: movl %eax, %esi
-; NOBMI2-NEXT: shll $9, %esi
-; NOBMI2-NEXT: xorl %edi, %esi
-; NOBMI2-NEXT: movl %eax, %edi
-; NOBMI2-NEXT: shll $10, %edi
-; NOBMI2-NEXT: xorl %esi, %edi
-; NOBMI2-NEXT: xorl %ecx, %edi
-; NOBMI2-NEXT: movl %eax, %ecx
-; NOBMI2-NEXT: shll $11, %ecx
-; NOBMI2-NEXT: movl %eax, %esi
-; NOBMI2-NEXT: shll $12, %esi
-; NOBMI2-NEXT: xorl %ecx, %esi
-; NOBMI2-NEXT: movl %eax, %ecx
-; NOBMI2-NEXT: shll $13, %ecx
-; NOBMI2-NEXT: xorl %esi, %ecx
-; NOBMI2-NEXT: movl %eax, %esi
-; NOBMI2-NEXT: shll $14, %esi
-; NOBMI2-NEXT: xorl %ecx, %esi
-; NOBMI2-NEXT: movl %eax, %r9d
-; NOBMI2-NEXT: shll $15, %r9d
-; NOBMI2-NEXT: xorl %esi, %r9d
-; NOBMI2-NEXT: xorl %edi, %r9d
-; NOBMI2-NEXT: movl %eax, %ecx
-; NOBMI2-NEXT: shll $16, %ecx
-; NOBMI2-NEXT: movl %eax, %esi
-; NOBMI2-NEXT: shll $17, %esi
-; NOBMI2-NEXT: xorl %ecx, %esi
-; NOBMI2-NEXT: movl %eax, %ecx
-; NOBMI2-NEXT: shll $18, %ecx
-; NOBMI2-NEXT: xorl %esi, %ecx
-; NOBMI2-NEXT: movl %eax, %esi
-; NOBMI2-NEXT: shll $19, %esi
-; NOBMI2-NEXT: xorl %ecx, %esi
-; NOBMI2-NEXT: movl %eax, %edi
-; NOBMI2-NEXT: shll $20, %edi
-; NOBMI2-NEXT: xorl %esi, %edi
-; NOBMI2-NEXT: movl %eax, %ecx
-; NOBMI2-NEXT: shll $21, %ecx
-; NOBMI2-NEXT: xorl %edi, %ecx
-; NOBMI2-NEXT: xorl %r9d, %ecx
-; NOBMI2-NEXT: movl %eax, %esi
-; NOBMI2-NEXT: shll $22, %esi
-; NOBMI2-NEXT: movl %eax, %edi
-; NOBMI2-NEXT: shll $23, %edi
-; NOBMI2-NEXT: xorl %esi, %edi
-; NOBMI2-NEXT: movl %eax, %esi
-; NOBMI2-NEXT: shll $24, %esi
-; NOBMI2-NEXT: xorl %edi, %esi
-; NOBMI2-NEXT: movl %eax, %edi
-; NOBMI2-NEXT: shll $25, %edi
-; NOBMI2-NEXT: xorl %esi, %edi
-; NOBMI2-NEXT: movl %eax, %esi
-; NOBMI2-NEXT: shll $26, %esi
-; NOBMI2-NEXT: xorl %edi, %esi
-; NOBMI2-NEXT: movl %eax, %edi
-; NOBMI2-NEXT: shll $27, %edi
-; NOBMI2-NEXT: xorl %esi, %edi
-; NOBMI2-NEXT: movl %eax, %esi
-; NOBMI2-NEXT: shll $28, %esi
-; NOBMI2-NEXT: xorl %edi, %esi
-; NOBMI2-NEXT: xorl %ecx, %esi
-; NOBMI2-NEXT: movl %eax, %edi
-; NOBMI2-NEXT: shll $29, %edi
-; NOBMI2-NEXT: movl %eax, %ecx
-; NOBMI2-NEXT: shll $30, %ecx
-; NOBMI2-NEXT: xorl %edi, %ecx
-; NOBMI2-NEXT: xorl %esi, %ecx
-; NOBMI2-NEXT: movl %ecx, %esi
-; NOBMI2-NEXT: andl %edx, %esi
-; NOBMI2-NEXT: movl %r8d, %r9d
-; NOBMI2-NEXT: andl %esi, %r9d
-; NOBMI2-NEXT: xorl %r9d, %r8d
-; NOBMI2-NEXT: shrl $2, %r9d
-; NOBMI2-NEXT: orl %r8d, %r9d
-; NOBMI2-NEXT: xorl %esi, %edx
-; NOBMI2-NEXT: shrl $2, %esi
-; NOBMI2-NEXT: orl %edx, %esi
-; NOBMI2-NEXT: notl %ecx
-; NOBMI2-NEXT: andl %eax, %ecx
-; NOBMI2-NEXT: leal (%rcx,%rcx), %eax
-; NOBMI2-NEXT: xorl %ecx, %eax
-; NOBMI2-NEXT: leal (,%rcx,4), %edx
-; NOBMI2-NEXT: leal (,%rcx,8), %edi
-; NOBMI2-NEXT: xorl %edx, %edi
-; NOBMI2-NEXT: xorl %eax, %edi
-; NOBMI2-NEXT: movl %ecx, %eax
-; NOBMI2-NEXT: shll $4, %eax
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $5, %edx
-; NOBMI2-NEXT: xorl %eax, %edx
-; NOBMI2-NEXT: movl %ecx, %eax
-; NOBMI2-NEXT: shll $6, %eax
-; NOBMI2-NEXT: xorl %edx, %eax
-; NOBMI2-NEXT: xorl %edi, %eax
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $7, %edx
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $8, %edi
-; NOBMI2-NEXT: xorl %edx, %edi
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $9, %edx
-; NOBMI2-NEXT: xorl %edi, %edx
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $10, %edi
-; NOBMI2-NEXT: xorl %edx, %edi
-; NOBMI2-NEXT: xorl %eax, %edi
-; NOBMI2-NEXT: movl %ecx, %eax
-; NOBMI2-NEXT: shll $11, %eax
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $12, %edx
-; NOBMI2-NEXT: xorl %eax, %edx
-; NOBMI2-NEXT: movl %ecx, %eax
-; NOBMI2-NEXT: shll $13, %eax
-; NOBMI2-NEXT: xorl %edx, %eax
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $14, %edx
-; NOBMI2-NEXT: xorl %eax, %edx
-; NOBMI2-NEXT: movl %ecx, %r8d
-; NOBMI2-NEXT: shll $15, %r8d
-; NOBMI2-NEXT: xorl %edx, %r8d
-; NOBMI2-NEXT: xorl %edi, %r8d
-; NOBMI2-NEXT: movl %ecx, %eax
-; NOBMI2-NEXT: shll $16, %eax
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $17, %edx
-; NOBMI2-NEXT: xorl %eax, %edx
-; NOBMI2-NEXT: movl %ecx, %eax
-; NOBMI2-NEXT: shll $18, %eax
-; NOBMI2-NEXT: xorl %edx, %eax
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $19, %edx
-; NOBMI2-NEXT: xorl %eax, %edx
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $20, %edi
-; NOBMI2-NEXT: xorl %edx, %edi
-; NOBMI2-NEXT: movl %ecx, %eax
-; NOBMI2-NEXT: shll $21, %eax
-; NOBMI2-NEXT: xorl %edi, %eax
-; NOBMI2-NEXT: xorl %r8d, %eax
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $22, %edx
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $23, %edi
-; NOBMI2-NEXT: xorl %edx, %edi
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $24, %edx
-; NOBMI2-NEXT: xorl %edi, %edx
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $25, %edi
-; NOBMI2-NEXT: xorl %edx, %edi
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $26, %edx
-; NOBMI2-NEXT: xorl %edi, %edx
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $27, %edi
-; NOBMI2-NEXT: xorl %edx, %edi
-; NOBMI2-NEXT: movl %ecx, %r8d
-; NOBMI2-NEXT: shll $28, %r8d
-; NOBMI2-NEXT: xorl %edi, %r8d
-; NOBMI2-NEXT: xorl %eax, %r8d
-; NOBMI2-NEXT: movl %ecx, %eax
-; NOBMI2-NEXT: shll $29, %eax
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $30, %edx
-; NOBMI2-NEXT: xorl %eax, %edx
-; NOBMI2-NEXT: xorl %r8d, %edx
-; NOBMI2-NEXT: movl %edx, %edi
-; NOBMI2-NEXT: andl %esi, %edi
-; NOBMI2-NEXT: movl %r9d, %r8d
-; NOBMI2-NEXT: andl %edi, %r8d
-; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: shrl $4, %r8d
-; NOBMI2-NEXT: orl %r9d, %r8d
-; NOBMI2-NEXT: xorl %edi, %esi
-; NOBMI2-NEXT: shrl $4, %edi
-; NOBMI2-NEXT: orl %esi, %edi
-; NOBMI2-NEXT: notl %edx
-; NOBMI2-NEXT: andl %ecx, %edx
-; NOBMI2-NEXT: leal (%rdx,%rdx), %eax
-; NOBMI2-NEXT: xorl %edx, %eax
-; NOBMI2-NEXT: leal (,%rdx,4), %ecx
-; NOBMI2-NEXT: leal (,%rdx,8), %esi
-; NOBMI2-NEXT: xorl %ecx, %esi
-; NOBMI2-NEXT: xorl %eax, %esi
-; NOBMI2-NEXT: movl %edx, %eax
-; NOBMI2-NEXT: shll $4, %eax
-; NOBMI2-NEXT: movl %edx, %ecx
-; NOBMI2-NEXT: shll $5, %ecx
-; NOBMI2-NEXT: xorl %eax, %ecx
-; NOBMI2-NEXT: movl %edx, %eax
-; NOBMI2-NEXT: shll $6, %eax
-; NOBMI2-NEXT: xorl %ecx, %eax
-; NOBMI2-NEXT: xorl %esi, %eax
-; NOBMI2-NEXT: movl %edx, %ecx
-; NOBMI2-NEXT: shll $7, %ecx
-; NOBMI2-NEXT: movl %edx, %esi
-; NOBMI2-NEXT: shll $8, %esi
-; NOBMI2-NEXT: xorl %ecx, %esi
-; NOBMI2-NEXT: movl %edx, %ecx
-; NOBMI2-NEXT: shll $9, %ecx
-; NOBMI2-NEXT: xorl %esi, %ecx
-; NOBMI2-NEXT: movl %edx, %esi
-; NOBMI2-NEXT: shll $10, %esi
-; NOBMI2-NEXT: xorl %ecx, %esi
-; NOBMI2-NEXT: xorl %eax, %esi
-; NOBMI2-NEXT: movl %edx, %eax
-; NOBMI2-NEXT: shll $11, %eax
-; NOBMI2-NEXT: movl %edx, %ecx
-; NOBMI2-NEXT: shll $12, %ecx
-; NOBMI2-NEXT: xorl %eax, %ecx
-; NOBMI2-NEXT: movl %edx, %eax
-; NOBMI2-NEXT: shll $13, %eax
-; NOBMI2-NEXT: xorl %ecx, %eax
-; NOBMI2-NEXT: movl %edx, %ecx
-; NOBMI2-NEXT: shll $14, %ecx
-; NOBMI2-NEXT: xorl %eax, %ecx
-; NOBMI2-NEXT: movl %edx, %r9d
-; NOBMI2-NEXT: shll $15, %r9d
-; NOBMI2-NEXT: xorl %ecx, %r9d
-; NOBMI2-NEXT: xorl %esi, %r9d
-; NOBMI2-NEXT: movl %edx, %eax
-; NOBMI2-NEXT: shll $16, %eax
-; NOBMI2-NEXT: movl %edx, %ecx
-; NOBMI2-NEXT: shll $17, %ecx
-; NOBMI2-NEXT: xorl %eax, %ecx
-; NOBMI2-NEXT: movl %edx, %eax
-; NOBMI2-NEXT: shll $18, %eax
-; NOBMI2-NEXT: xorl %ecx, %eax
-; NOBMI2-NEXT: movl %edx, %ecx
-; NOBMI2-NEXT: shll $19, %ecx
-; NOBMI2-NEXT: xorl %eax, %ecx
-; NOBMI2-NEXT: movl %edx, %esi
-; NOBMI2-NEXT: shll $20, %esi
-; NOBMI2-NEXT: xorl %ecx, %esi
-; NOBMI2-NEXT: movl %edx, %eax
-; NOBMI2-NEXT: shll $21, %eax
-; NOBMI2-NEXT: xorl %esi, %eax
-; NOBMI2-NEXT: xorl %r9d, %eax
-; NOBMI2-NEXT: movl %edx, %ecx
-; NOBMI2-NEXT: shll $22, %ecx
-; NOBMI2-NEXT: movl %edx, %esi
-; NOBMI2-NEXT: shll $23, %esi
-; NOBMI2-NEXT: xorl %ecx, %esi
-; NOBMI2-NEXT: movl %edx, %ecx
-; NOBMI2-NEXT: shll $24, %ecx
-; NOBMI2-NEXT: xorl %esi, %ecx
-; NOBMI2-NEXT: movl %edx, %esi
-; NOBMI2-NEXT: shll $25, %esi
-; NOBMI2-NEXT: xorl %ecx, %esi
-; NOBMI2-NEXT: movl %edx, %ecx
-; NOBMI2-NEXT: shll $26, %ecx
-; NOBMI2-NEXT: xorl %esi, %ecx
-; NOBMI2-NEXT: movl %edx, %esi
-; NOBMI2-NEXT: shll $27, %esi
-; NOBMI2-NEXT: xorl %ecx, %esi
-; NOBMI2-NEXT: movl %edx, %r9d
-; NOBMI2-NEXT: shll $28, %r9d
-; NOBMI2-NEXT: xorl %esi, %r9d
-; NOBMI2-NEXT: xorl %eax, %r9d
-; NOBMI2-NEXT: movl %edx, %eax
-; NOBMI2-NEXT: shll $29, %eax
-; NOBMI2-NEXT: movl %edx, %ecx
-; NOBMI2-NEXT: shll $30, %ecx
-; NOBMI2-NEXT: xorl %eax, %ecx
-; NOBMI2-NEXT: xorl %r9d, %ecx
-; NOBMI2-NEXT: movl %ecx, %eax
-; NOBMI2-NEXT: andl %edi, %eax
-; NOBMI2-NEXT: movl %r8d, %esi
-; NOBMI2-NEXT: andl %eax, %esi
-; NOBMI2-NEXT: xorl %esi, %r8d
-; NOBMI2-NEXT: shrl $8, %esi
-; NOBMI2-NEXT: orl %r8d, %esi
-; NOBMI2-NEXT: xorl %eax, %edi
-; NOBMI2-NEXT: shrl $8, %eax
-; NOBMI2-NEXT: orl %edi, %eax
-; NOBMI2-NEXT: notl %ecx
-; NOBMI2-NEXT: andl %edx, %ecx
-; NOBMI2-NEXT: leal (%rcx,%rcx), %edx
-; NOBMI2-NEXT: xorl %ecx, %edx
-; NOBMI2-NEXT: leal (,%rcx,4), %edi
-; NOBMI2-NEXT: leal (,%rcx,8), %r8d
-; NOBMI2-NEXT: xorl %edi, %r8d
-; NOBMI2-NEXT: xorl %edx, %r8d
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $4, %edx
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $5, %edi
-; NOBMI2-NEXT: xorl %edx, %edi
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $6, %edx
-; NOBMI2-NEXT: xorl %edi, %edx
-; NOBMI2-NEXT: xorl %r8d, %edx
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $7, %edi
-; NOBMI2-NEXT: movl %ecx, %r8d
-; NOBMI2-NEXT: shll $8, %r8d
-; NOBMI2-NEXT: xorl %edi, %r8d
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $9, %edi
-; NOBMI2-NEXT: xorl %r8d, %edi
-; NOBMI2-NEXT: movl %ecx, %r8d
-; NOBMI2-NEXT: shll $10, %r8d
-; NOBMI2-NEXT: xorl %edi, %r8d
-; NOBMI2-NEXT: xorl %edx, %r8d
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $11, %edx
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $12, %edi
-; NOBMI2-NEXT: xorl %edx, %edi
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $13, %edx
-; NOBMI2-NEXT: xorl %edi, %edx
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $14, %edi
-; NOBMI2-NEXT: xorl %edx, %edi
-; NOBMI2-NEXT: movl %ecx, %r9d
-; NOBMI2-NEXT: shll $15, %r9d
-; NOBMI2-NEXT: xorl %edi, %r9d
-; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $16, %edx
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $17, %edi
-; NOBMI2-NEXT: xorl %edx, %edi
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $18, %edx
-; NOBMI2-NEXT: xorl %edi, %edx
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $19, %edi
-; NOBMI2-NEXT: xorl %edx, %edi
-; NOBMI2-NEXT: movl %ecx, %r8d
-; NOBMI2-NEXT: shll $20, %r8d
-; NOBMI2-NEXT: xorl %edi, %r8d
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $21, %edx
-; NOBMI2-NEXT: xorl %r8d, %edx
-; NOBMI2-NEXT: xorl %r9d, %edx
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $22, %edi
-; NOBMI2-NEXT: movl %ecx, %r8d
-; NOBMI2-NEXT: shll $23, %r8d
-; NOBMI2-NEXT: xorl %edi, %r8d
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $24, %edi
-; NOBMI2-NEXT: xorl %r8d, %edi
-; NOBMI2-NEXT: movl %ecx, %r8d
-; NOBMI2-NEXT: shll $25, %r8d
-; NOBMI2-NEXT: xorl %edi, %r8d
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $26, %edi
-; NOBMI2-NEXT: xorl %r8d, %edi
-; NOBMI2-NEXT: movl %ecx, %r8d
-; NOBMI2-NEXT: shll $27, %r8d
-; NOBMI2-NEXT: xorl %edi, %r8d
-; NOBMI2-NEXT: movl %ecx, %edi
-; NOBMI2-NEXT: shll $28, %edi
-; NOBMI2-NEXT: xorl %r8d, %edi
-; NOBMI2-NEXT: xorl %edx, %edi
-; NOBMI2-NEXT: movl %ecx, %edx
-; NOBMI2-NEXT: shll $29, %edx
-; NOBMI2-NEXT: shll $30, %ecx
-; NOBMI2-NEXT: xorl %edx, %ecx
-; NOBMI2-NEXT: xorl %edi, %ecx
-; NOBMI2-NEXT: andl %esi, %eax
-; NOBMI2-NEXT: andl %ecx, %eax
-; NOBMI2-NEXT: xorl %eax, %esi
-; NOBMI2-NEXT: shrl $16, %eax
-; NOBMI2-NEXT: orl %esi, %eax
-; NOBMI2-NEXT: retq
- %res = call i32 @llvm.bext.i32(i32 %val, i32 %mask)
- ret i32 %res
-}
-
-define i32 @bdep_i32(i32 %val, i32 %mask) nounwind {
-; BMI2-LABEL: bdep_i32:
-; BMI2: # %bb.0:
-; BMI2-NEXT: pdepl %esi, %edi, %eax
-; BMI2-NEXT: retq
-;
-; NOBMI2-LABEL: bdep_i32:
-; NOBMI2: # %bb.0:
-; NOBMI2-NEXT: pushq %rbp
-; NOBMI2-NEXT: pushq %r14
-; NOBMI2-NEXT: pushq %rbx
-; NOBMI2-NEXT: movl %esi, %edx
-; NOBMI2-NEXT: notl %edx
-; NOBMI2-NEXT: leal (,%rdx,4), %ecx
-; NOBMI2-NEXT: leal (%rdx,%rdx), %eax
-; NOBMI2-NEXT: xorl %eax, %ecx
-; NOBMI2-NEXT: leal (,%rdx,8), %r8d
-; NOBMI2-NEXT: movl %edx, %r9d
-; NOBMI2-NEXT: shll $4, %r9d
-; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: xorl %ecx, %r9d
-; NOBMI2-NEXT: movl %edx, %ecx
-; NOBMI2-NEXT: shll $5, %ecx
-; NOBMI2-NEXT: movl %edx, %r8d
-; NOBMI2-NEXT: shll $6, %r8d
-; NOBMI2-NEXT: xorl %ecx, %r8d
-; NOBMI2-NEXT: movl %edx, %ecx
-; NOBMI2-NEXT: shll $7, %ecx
-; NOBMI2-NEXT: xorl %r8d, %ecx
-; NOBMI2-NEXT: xorl %r9d, %ecx
-; NOBMI2-NEXT: movl %edx, %r8d
-; NOBMI2-NEXT: shll $8, %r8d
-; NOBMI2-NEXT: movl %edx, %r9d
-; NOBMI2-NEXT: shll $9, %r9d
-; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: movl %edx, %r8d
-; NOBMI2-NEXT: shll $10, %r8d
-; NOBMI2-NEXT: xorl %r9d, %r8d
-; NOBMI2-NEXT: movl %edx, %r9d
-; NOBMI2-NEXT: shll $11, %r9d
-; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: xorl %ecx, %r9d
-; NOBMI2-NEXT: movl %edx, %ecx
-; NOBMI2-NEXT: shll $12, %ecx
-; NOBMI2-NEXT: movl %edx, %r8d
-; NOBMI2-NEXT: shll $13, %r8d
-; NOBMI2-NEXT: xorl %ecx, %r8d
-; NOBMI2-NEXT: movl %edx, %ecx
-; NOBMI2-NEXT: shll $14, %ecx
-; NOBMI2-NEXT: xorl %r8d, %ecx
-; NOBMI2-NEXT: movl %edx, %r8d
-; NOBMI2-NEXT: shll $15, %r8d
-; NOBMI2-NEXT: xorl %ecx, %r8d
-; NOBMI2-NEXT: movl %edx, %r10d
-; NOBMI2-NEXT: shll $16, %r10d
-; NOBMI2-NEXT: xorl %r8d, %r10d
-; NOBMI2-NEXT: xorl %r9d, %r10d
-; NOBMI2-NEXT: movl %edx, %ecx
-; NOBMI2-NEXT: shll $17, %ecx
-; NOBMI2-NEXT: movl %edx, %r8d
-; NOBMI2-NEXT: shll $18, %r8d
-; NOBMI2-NEXT: xorl %ecx, %r8d
-; NOBMI2-NEXT: movl %edx, %ecx
-; NOBMI2-NEXT: shll $19, %ecx
-; NOBMI2-NEXT: xorl %r8d, %ecx
-; NOBMI2-NEXT: movl %edx, %r8d
-; NOBMI2-NEXT: shll $20, %r8d
-; NOBMI2-NEXT: xorl %ecx, %r8d
-; NOBMI2-NEXT: movl %edx, %r9d
-; NOBMI2-NEXT: shll $21, %r9d
-; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: movl %edx, %ecx
-; NOBMI2-NEXT: shll $22, %ecx
-; NOBMI2-NEXT: xorl %r9d, %ecx
-; NOBMI2-NEXT: xorl %r10d, %ecx
-; NOBMI2-NEXT: movl %edx, %r8d
-; NOBMI2-NEXT: shll $23, %r8d
-; NOBMI2-NEXT: movl %edx, %r9d
-; NOBMI2-NEXT: shll $24, %r9d
-; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: movl %edx, %r8d
-; NOBMI2-NEXT: shll $25, %r8d
-; NOBMI2-NEXT: xorl %r9d, %r8d
-; NOBMI2-NEXT: movl %edx, %r9d
-; NOBMI2-NEXT: shll $26, %r9d
-; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: movl %edx, %r8d
-; NOBMI2-NEXT: shll $27, %r8d
-; NOBMI2-NEXT: xorl %r9d, %r8d
-; NOBMI2-NEXT: movl %edx, %r9d
-; NOBMI2-NEXT: shll $28, %r9d
-; NOBMI2-NEXT: xorl %r8d, %r9d
-; NOBMI2-NEXT: movl %edx, %r8d
-; NOBMI2-NEXT: shll $29, %r8d
-; NOBMI2-NEXT: xorl %r9d, %r8d
-; NOBMI2-NEXT: xorl %ecx, %r8d
-; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %edx, %ecx
; NOBMI2-NEXT: shll $30, %ecx
; NOBMI2-NEXT: shll $31, %edx
; NOBMI2-NEXT: xorl %ecx, %edx
@@ -1422,1416 +604,234 @@ define i32 @bdep_i32(i32 %val, i32 %mask) nounwind {
; NOBMI2-NEXT: xorl %r9d, %r11d
; NOBMI2-NEXT: movl %r8d, %ebx
; NOBMI2-NEXT: shll $28, %ebx
-; NOBMI2-NEXT: xorl %r11d, %ebx
-; NOBMI2-NEXT: xorl %edx, %ebx
-; NOBMI2-NEXT: movl %r8d, %edx
-; NOBMI2-NEXT: shll $29, %edx
-; NOBMI2-NEXT: movl %r8d, %r9d
-; NOBMI2-NEXT: shll $30, %r9d
-; NOBMI2-NEXT: xorl %edx, %r9d
-; NOBMI2-NEXT: xorl %ebx, %r9d
-; NOBMI2-NEXT: movl %r9d, %edx
-; NOBMI2-NEXT: andl %r10d, %edx
-; NOBMI2-NEXT: xorl %edx, %r10d
-; NOBMI2-NEXT: movl %edx, %r11d
-; NOBMI2-NEXT: shrl $4, %r11d
-; NOBMI2-NEXT: orl %r10d, %r11d
-; NOBMI2-NEXT: notl %r9d
-; NOBMI2-NEXT: andl %r8d, %r9d
-; NOBMI2-NEXT: leal (%r9,%r9), %r8d
-; NOBMI2-NEXT: xorl %r9d, %r8d
-; NOBMI2-NEXT: leal (,%r9,4), %r10d
-; NOBMI2-NEXT: leal (,%r9,8), %ebx
-; NOBMI2-NEXT: xorl %r10d, %ebx
-; NOBMI2-NEXT: xorl %r8d, %ebx
-; NOBMI2-NEXT: movl %r9d, %r8d
-; NOBMI2-NEXT: shll $4, %r8d
-; NOBMI2-NEXT: movl %r9d, %r10d
-; NOBMI2-NEXT: shll $5, %r10d
-; NOBMI2-NEXT: xorl %r8d, %r10d
-; NOBMI2-NEXT: movl %r9d, %r8d
-; NOBMI2-NEXT: shll $6, %r8d
-; NOBMI2-NEXT: xorl %r10d, %r8d
-; NOBMI2-NEXT: xorl %ebx, %r8d
-; NOBMI2-NEXT: movl %r9d, %r10d
-; NOBMI2-NEXT: shll $7, %r10d
-; NOBMI2-NEXT: movl %r9d, %ebx
-; NOBMI2-NEXT: shll $8, %ebx
-; NOBMI2-NEXT: xorl %r10d, %ebx
-; NOBMI2-NEXT: movl %r9d, %r10d
-; NOBMI2-NEXT: shll $9, %r10d
-; NOBMI2-NEXT: xorl %ebx, %r10d
-; NOBMI2-NEXT: movl %r9d, %ebx
-; NOBMI2-NEXT: shll $10, %ebx
-; NOBMI2-NEXT: xorl %r10d, %ebx
-; NOBMI2-NEXT: xorl %r8d, %ebx
-; NOBMI2-NEXT: movl %r9d, %r8d
-; NOBMI2-NEXT: shll $11, %r8d
-; NOBMI2-NEXT: movl %r9d, %r10d
-; NOBMI2-NEXT: shll $12, %r10d
-; NOBMI2-NEXT: xorl %r8d, %r10d
-; NOBMI2-NEXT: movl %r9d, %r8d
-; NOBMI2-NEXT: shll $13, %r8d
-; NOBMI2-NEXT: xorl %r10d, %r8d
-; NOBMI2-NEXT: movl %r9d, %r10d
-; NOBMI2-NEXT: shll $14, %r10d
-; NOBMI2-NEXT: xorl %r8d, %r10d
-; NOBMI2-NEXT: movl %r9d, %ebp
-; NOBMI2-NEXT: shll $15, %ebp
-; NOBMI2-NEXT: xorl %r10d, %ebp
-; NOBMI2-NEXT: xorl %ebx, %ebp
-; NOBMI2-NEXT: movl %r9d, %r8d
-; NOBMI2-NEXT: shll $16, %r8d
-; NOBMI2-NEXT: movl %r9d, %r10d
-; NOBMI2-NEXT: shll $17, %r10d
-; NOBMI2-NEXT: xorl %r8d, %r10d
-; NOBMI2-NEXT: movl %r9d, %r8d
-; NOBMI2-NEXT: shll $18, %r8d
-; NOBMI2-NEXT: xorl %r10d, %r8d
-; NOBMI2-NEXT: movl %r9d, %r10d
-; NOBMI2-NEXT: shll $19, %r10d
-; NOBMI2-NEXT: xorl %r8d, %r10d
-; NOBMI2-NEXT: movl %r9d, %ebx
-; NOBMI2-NEXT: shll $20, %ebx
-; NOBMI2-NEXT: xorl %r10d, %ebx
-; NOBMI2-NEXT: movl %r9d, %r8d
-; NOBMI2-NEXT: shll $21, %r8d
-; NOBMI2-NEXT: xorl %ebx, %r8d
-; NOBMI2-NEXT: xorl %ebp, %r8d
-; NOBMI2-NEXT: movl %r9d, %r10d
-; NOBMI2-NEXT: shll $22, %r10d
-; NOBMI2-NEXT: movl %r9d, %ebx
-; NOBMI2-NEXT: shll $23, %ebx
-; NOBMI2-NEXT: xorl %r10d, %ebx
-; NOBMI2-NEXT: movl %r9d, %r10d
-; NOBMI2-NEXT: shll $24, %r10d
-; NOBMI2-NEXT: xorl %ebx, %r10d
-; NOBMI2-NEXT: movl %r9d, %ebx
-; NOBMI2-NEXT: shll $25, %ebx
-; NOBMI2-NEXT: xorl %r10d, %ebx
-; NOBMI2-NEXT: movl %r9d, %r10d
-; NOBMI2-NEXT: shll $26, %r10d
-; NOBMI2-NEXT: xorl %ebx, %r10d
-; NOBMI2-NEXT: movl %r9d, %ebx
-; NOBMI2-NEXT: shll $27, %ebx
-; NOBMI2-NEXT: xorl %r10d, %ebx
-; NOBMI2-NEXT: movl %r9d, %ebp
-; NOBMI2-NEXT: shll $28, %ebp
-; NOBMI2-NEXT: xorl %ebx, %ebp
-; NOBMI2-NEXT: xorl %r8d, %ebp
-; NOBMI2-NEXT: movl %r9d, %r8d
-; NOBMI2-NEXT: shll $29, %r8d
-; NOBMI2-NEXT: movl %r9d, %r10d
-; NOBMI2-NEXT: shll $30, %r10d
-; NOBMI2-NEXT: xorl %r8d, %r10d
-; NOBMI2-NEXT: xorl %ebp, %r10d
-; NOBMI2-NEXT: movl %r10d, %r8d
-; NOBMI2-NEXT: andl %r11d, %r8d
-; NOBMI2-NEXT: xorl %r8d, %r11d
-; NOBMI2-NEXT: movl %r8d, %ebx
-; NOBMI2-NEXT: shrl $8, %ebx
-; NOBMI2-NEXT: orl %r11d, %ebx
-; NOBMI2-NEXT: notl %r10d
-; NOBMI2-NEXT: andl %r9d, %r10d
-; NOBMI2-NEXT: leal (%r10,%r10), %r9d
-; NOBMI2-NEXT: xorl %r10d, %r9d
-; NOBMI2-NEXT: leal (,%r10,4), %r11d
-; NOBMI2-NEXT: leal (,%r10,8), %ebp
-; NOBMI2-NEXT: xorl %r11d, %ebp
-; NOBMI2-NEXT: xorl %r9d, %ebp
-; NOBMI2-NEXT: movl %r10d, %r9d
-; NOBMI2-NEXT: shll $4, %r9d
-; NOBMI2-NEXT: movl %r10d, %r11d
-; NOBMI2-NEXT: shll $5, %r11d
-; NOBMI2-NEXT: xorl %r9d, %r11d
-; NOBMI2-NEXT: movl %r10d, %r9d
-; NOBMI2-NEXT: shll $6, %r9d
-; NOBMI2-NEXT: xorl %r11d, %r9d
-; NOBMI2-NEXT: xorl %ebp, %r9d
-; NOBMI2-NEXT: movl %r10d, %r11d
-; NOBMI2-NEXT: shll $7, %r11d
-; NOBMI2-NEXT: movl %r10d, %ebp
-; NOBMI2-NEXT: shll $8, %ebp
-; NOBMI2-NEXT: xorl %r11d, %ebp
-; NOBMI2-NEXT: movl %r10d, %r11d
-; NOBMI2-NEXT: shll $9, %r11d
-; NOBMI2-NEXT: xorl %ebp, %r11d
-; NOBMI2-NEXT: movl %r10d, %ebp
-; NOBMI2-NEXT: shll $10, %ebp
-; NOBMI2-NEXT: xorl %r11d, %ebp
-; NOBMI2-NEXT: xorl %r9d, %ebp
-; NOBMI2-NEXT: movl %r10d, %r9d
-; NOBMI2-NEXT: shll $11, %r9d
-; NOBMI2-NEXT: movl %r10d, %r11d
-; NOBMI2-NEXT: shll $12, %r11d
-; NOBMI2-NEXT: xorl %r9d, %r11d
-; NOBMI2-NEXT: movl %r10d, %r9d
-; NOBMI2-NEXT: shll $13, %r9d
-; NOBMI2-NEXT: xorl %r11d, %r9d
-; NOBMI2-NEXT: movl %r10d, %r11d
-; NOBMI2-NEXT: shll $14, %r11d
-; NOBMI2-NEXT: xorl %r9d, %r11d
-; NOBMI2-NEXT: movl %r10d, %r14d
-; NOBMI2-NEXT: shll $15, %r14d
-; NOBMI2-NEXT: xorl %r11d, %r14d
-; NOBMI2-NEXT: xorl %ebp, %r14d
-; NOBMI2-NEXT: movl %r10d, %r9d
-; NOBMI2-NEXT: shll $16, %r9d
-; NOBMI2-NEXT: movl %r10d, %r11d
-; NOBMI2-NEXT: shll $17, %r11d
-; NOBMI2-NEXT: xorl %r9d, %r11d
-; NOBMI2-NEXT: movl %r10d, %r9d
-; NOBMI2-NEXT: shll $18, %r9d
-; NOBMI2-NEXT: xorl %r11d, %r9d
-; NOBMI2-NEXT: movl %r10d, %r11d
-; NOBMI2-NEXT: shll $19, %r11d
-; NOBMI2-NEXT: xorl %r9d, %r11d
-; NOBMI2-NEXT: movl %r10d, %ebp
-; NOBMI2-NEXT: shll $20, %ebp
-; NOBMI2-NEXT: xorl %r11d, %ebp
-; NOBMI2-NEXT: movl %r10d, %r9d
-; NOBMI2-NEXT: shll $21, %r9d
-; NOBMI2-NEXT: xorl %ebp, %r9d
-; NOBMI2-NEXT: xorl %r14d, %r9d
-; NOBMI2-NEXT: movl %r10d, %r11d
-; NOBMI2-NEXT: shll $22, %r11d
-; NOBMI2-NEXT: movl %r10d, %ebp
-; NOBMI2-NEXT: shll $23, %ebp
-; NOBMI2-NEXT: xorl %r11d, %ebp
-; NOBMI2-NEXT: movl %r10d, %r11d
-; NOBMI2-NEXT: shll $24, %r11d
-; NOBMI2-NEXT: xorl %ebp, %r11d
-; NOBMI2-NEXT: movl %r10d, %ebp
-; NOBMI2-NEXT: shll $25, %ebp
-; NOBMI2-NEXT: xorl %r11d, %ebp
-; NOBMI2-NEXT: movl %r10d, %r11d
-; NOBMI2-NEXT: shll $26, %r11d
-; NOBMI2-NEXT: xorl %ebp, %r11d
-; NOBMI2-NEXT: movl %r10d, %ebp
-; NOBMI2-NEXT: shll $27, %ebp
-; NOBMI2-NEXT: xorl %r11d, %ebp
-; NOBMI2-NEXT: movl %r10d, %r11d
-; NOBMI2-NEXT: shll $28, %r11d
-; NOBMI2-NEXT: xorl %ebp, %r11d
-; NOBMI2-NEXT: xorl %r9d, %r11d
-; NOBMI2-NEXT: movl %r10d, %r9d
-; NOBMI2-NEXT: shll $29, %r9d
-; NOBMI2-NEXT: shll $30, %r10d
-; NOBMI2-NEXT: xorl %r9d, %r10d
-; NOBMI2-NEXT: xorl %r11d, %r10d
-; NOBMI2-NEXT: movl %edi, %r9d
-; NOBMI2-NEXT: shll $16, %r9d
-; NOBMI2-NEXT: xorl %edi, %r9d
-; NOBMI2-NEXT: andl %ebx, %r9d
-; NOBMI2-NEXT: andl %r10d, %r9d
-; NOBMI2-NEXT: xorl %edi, %r9d
-; NOBMI2-NEXT: movl %r9d, %edi
-; NOBMI2-NEXT: shll $8, %edi
-; NOBMI2-NEXT: xorl %r9d, %edi
-; NOBMI2-NEXT: andl %r8d, %edi
-; NOBMI2-NEXT: xorl %r9d, %edi
-; NOBMI2-NEXT: movl %edi, %r8d
-; NOBMI2-NEXT: shll $4, %r8d
-; NOBMI2-NEXT: xorl %edi, %r8d
-; NOBMI2-NEXT: andl %edx, %r8d
-; NOBMI2-NEXT: xorl %edi, %r8d
-; NOBMI2-NEXT: leal (,%r8,4), %edx
-; NOBMI2-NEXT: xorl %r8d, %edx
-; NOBMI2-NEXT: andl %eax, %edx
-; NOBMI2-NEXT: xorl %r8d, %edx
-; NOBMI2-NEXT: leal (%rdx,%rdx), %eax
-; NOBMI2-NEXT: xorl %edx, %eax
-; NOBMI2-NEXT: andl %ecx, %eax
-; NOBMI2-NEXT: xorl %edx, %eax
-; NOBMI2-NEXT: andl %esi, %eax
-; NOBMI2-NEXT: popq %rbx
-; NOBMI2-NEXT: popq %r14
-; NOBMI2-NEXT: popq %rbp
-; NOBMI2-NEXT: retq
- %res = call i32 @llvm.bdep.i32(i32 %val, i32 %mask)
- ret i32 %res
-}
-
-define i64 @bext_i64(i64 %val, i64 %mask) nounwind {
-; BMI2-LABEL: bext_i64:
-; BMI2: # %bb.0:
-; BMI2-NEXT: pextq %rsi, %rdi, %rax
-; BMI2-NEXT: retq
-;
-; NOBMI2-LABEL: bext_i64:
-; NOBMI2: # %bb.0:
-; NOBMI2-NEXT: andq %rsi, %rdi
-; NOBMI2-NEXT: movq %rsi, %rax
-; NOBMI2-NEXT: notq %rax
-; NOBMI2-NEXT: leaq (,%rax,4), %rdx
-; NOBMI2-NEXT: leaq (%rax,%rax), %rcx
-; NOBMI2-NEXT: xorq %rcx, %rdx
-; NOBMI2-NEXT: leaq (,%rax,8), %r8
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $4, %r9
-; NOBMI2-NEXT: xorq %r8, %r9
-; NOBMI2-NEXT: xorq %rdx, %r9
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: shlq $5, %rdx
-; NOBMI2-NEXT: movq %rax, %r8
-; NOBMI2-NEXT: shlq $6, %r8
-; NOBMI2-NEXT: xorq %rdx, %r8
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: shlq $7, %rdx
-; NOBMI2-NEXT: xorq %r8, %rdx
-; NOBMI2-NEXT: xorq %r9, %rdx
-; NOBMI2-NEXT: movq %rax, %r8
-; NOBMI2-NEXT: shlq $8, %r8
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $9, %r9
-; NOBMI2-NEXT: xorq %r8, %r9
-; NOBMI2-NEXT: movq %rax, %r8
-; NOBMI2-NEXT: shlq $10, %r8
-; NOBMI2-NEXT: xorq %r9, %r8
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $11, %r9
-; NOBMI2-NEXT: xorq %r8, %r9
-; NOBMI2-NEXT: xorq %rdx, %r9
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: shlq $12, %rdx
-; NOBMI2-NEXT: movq %rax, %r8
-; NOBMI2-NEXT: shlq $13, %r8
-; NOBMI2-NEXT: xorq %rdx, %r8
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: shlq $14, %rdx
-; NOBMI2-NEXT: xorq %r8, %rdx
-; NOBMI2-NEXT: movq %rax, %r8
-; NOBMI2-NEXT: shlq $15, %r8
-; NOBMI2-NEXT: xorq %rdx, %r8
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: shlq $16, %rdx
-; NOBMI2-NEXT: xorq %r8, %rdx
-; NOBMI2-NEXT: xorq %r9, %rdx
-; NOBMI2-NEXT: movq %rax, %r8
-; NOBMI2-NEXT: shlq $17, %r8
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $18, %r9
-; NOBMI2-NEXT: xorq %r8, %r9
-; NOBMI2-NEXT: movq %rax, %r8
-; NOBMI2-NEXT: shlq $19, %r8
-; NOBMI2-NEXT: xorq %r9, %r8
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $20, %r9
-; NOBMI2-NEXT: xorq %r8, %r9
-; NOBMI2-NEXT: movq %rax, %r10
-; NOBMI2-NEXT: shlq $21, %r10
-; NOBMI2-NEXT: xorq %r9, %r10
-; NOBMI2-NEXT: movq %rax, %r8
-; NOBMI2-NEXT: shlq $22, %r8
-; NOBMI2-NEXT: xorq %r10, %r8
-; NOBMI2-NEXT: xorq %rdx, %r8
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: shlq $23, %rdx
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $24, %r9
-; NOBMI2-NEXT: xorq %rdx, %r9
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: shlq $25, %rdx
-; NOBMI2-NEXT: xorq %r9, %rdx
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $26, %r9
-; NOBMI2-NEXT: xorq %rdx, %r9
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: shlq $27, %rdx
-; NOBMI2-NEXT: xorq %r9, %rdx
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $28, %r9
-; NOBMI2-NEXT: xorq %rdx, %r9
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: shlq $29, %rdx
-; NOBMI2-NEXT: xorq %r9, %rdx
-; NOBMI2-NEXT: xorq %r8, %rdx
-; NOBMI2-NEXT: movq %rax, %r8
-; NOBMI2-NEXT: shlq $30, %r8
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $31, %r9
-; NOBMI2-NEXT: xorq %r8, %r9
-; NOBMI2-NEXT: movq %rax, %r8
-; NOBMI2-NEXT: shlq $32, %r8
-; NOBMI2-NEXT: xorq %r9, %r8
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $33, %r9
-; NOBMI2-NEXT: xorq %r8, %r9
-; NOBMI2-NEXT: movq %rax, %r8
-; NOBMI2-NEXT: shlq $34, %r8
-; NOBMI2-NEXT: xorq %r9, %r8
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $35, %r9
-; NOBMI2-NEXT: xorq %r8, %r9
-; NOBMI2-NEXT: movq %rax, %r10
-; NOBMI2-NEXT: shlq $36, %r10
-; NOBMI2-NEXT: xorq %r9, %r10
-; NOBMI2-NEXT: movq %rax, %r8
-; NOBMI2-NEXT: shlq $37, %r8
-; NOBMI2-NEXT: xorq %r10, %r8
-; NOBMI2-NEXT: xorq %rdx, %r8
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: shlq $38, %rdx
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $39, %r9
-; NOBMI2-NEXT: xorq %rdx, %r9
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: shlq $40, %rdx
-; NOBMI2-NEXT: xorq %r9, %rdx
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $41, %r9
-; NOBMI2-NEXT: xorq %rdx, %r9
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: shlq $42, %rdx
-; NOBMI2-NEXT: xorq %r9, %rdx
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $43, %r9
-; NOBMI2-NEXT: xorq %rdx, %r9
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: shlq $44, %rdx
-; NOBMI2-NEXT: xorq %r9, %rdx
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $45, %r9
-; NOBMI2-NEXT: xorq %rdx, %r9
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: shlq $46, %rdx
-; NOBMI2-NEXT: xorq %r9, %rdx
-; NOBMI2-NEXT: xorq %r8, %rdx
-; NOBMI2-NEXT: movq %rax, %r8
-; NOBMI2-NEXT: shlq $47, %r8
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $48, %r9
-; NOBMI2-NEXT: xorq %r8, %r9
-; NOBMI2-NEXT: movq %rax, %r8
-; NOBMI2-NEXT: shlq $49, %r8
-; NOBMI2-NEXT: xorq %r9, %r8
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $50, %r9
-; NOBMI2-NEXT: xorq %r8, %r9
-; NOBMI2-NEXT: movq %rax, %r8
-; NOBMI2-NEXT: shlq $51, %r8
-; NOBMI2-NEXT: xorq %r9, %r8
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $52, %r9
-; NOBMI2-NEXT: xorq %r8, %r9
-; NOBMI2-NEXT: movq %rax, %r8
-; NOBMI2-NEXT: shlq $53, %r8
-; NOBMI2-NEXT: xorq %r9, %r8
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $54, %r9
-; NOBMI2-NEXT: xorq %r8, %r9
-; NOBMI2-NEXT: movq %rax, %r10
-; NOBMI2-NEXT: shlq $55, %r10
-; NOBMI2-NEXT: xorq %r9, %r10
-; NOBMI2-NEXT: movq %rax, %r8
-; NOBMI2-NEXT: shlq $56, %r8
-; NOBMI2-NEXT: xorq %r10, %r8
-; NOBMI2-NEXT: xorq %rdx, %r8
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: shlq $57, %rdx
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $58, %r9
-; NOBMI2-NEXT: xorq %rdx, %r9
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: shlq $59, %rdx
-; NOBMI2-NEXT: xorq %r9, %rdx
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $60, %r9
-; NOBMI2-NEXT: xorq %rdx, %r9
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: shlq $61, %rdx
-; NOBMI2-NEXT: xorq %r9, %rdx
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $62, %r9
-; NOBMI2-NEXT: xorq %rdx, %r9
-; NOBMI2-NEXT: shlq $63, %rax
-; NOBMI2-NEXT: xorq %r9, %rax
-; NOBMI2-NEXT: xorq %r8, %rax
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: andq %rsi, %rdx
-; NOBMI2-NEXT: movq %rdi, %r8
-; NOBMI2-NEXT: andq %rdx, %r8
-; NOBMI2-NEXT: xorq %r8, %rdi
-; NOBMI2-NEXT: shrq %r8
-; NOBMI2-NEXT: orq %rdi, %r8
-; NOBMI2-NEXT: xorq %rdx, %rsi
-; NOBMI2-NEXT: shrq %rdx
-; NOBMI2-NEXT: orq %rsi, %rdx
-; NOBMI2-NEXT: notq %rax
-; NOBMI2-NEXT: andq %rcx, %rax
-; NOBMI2-NEXT: leaq (%rax,%rax), %rcx
-; NOBMI2-NEXT: xorq %rax, %rcx
-; NOBMI2-NEXT: leaq (,%rax,4), %rsi
-; NOBMI2-NEXT: leaq (,%rax,8), %rdi
-; NOBMI2-NEXT: xorq %rdi, %rsi
-; NOBMI2-NEXT: xorq %rcx, %rsi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $4, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $5, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $6, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: xorq %rsi, %rcx
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $7, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $8, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $9, %rsi
-; NOBMI2-NEXT: xorq %rdi, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $10, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $11, %rcx
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $12, %rsi
-; NOBMI2-NEXT: xorq %rcx, %rsi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $13, %rcx
-; NOBMI2-NEXT: xorq %rsi, %rcx
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $14, %rsi
-; NOBMI2-NEXT: xorq %rcx, %rsi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $15, %rcx
-; NOBMI2-NEXT: xorq %rsi, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $16, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $17, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $18, %rsi
-; NOBMI2-NEXT: xorq %rdi, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $19, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $20, %r9
-; NOBMI2-NEXT: xorq %rdi, %r9
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $21, %rsi
-; NOBMI2-NEXT: xorq %r9, %rsi
-; NOBMI2-NEXT: xorq %rcx, %rsi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $22, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $23, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $24, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $25, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $26, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $27, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $28, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: xorq %rsi, %rcx
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $29, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $30, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $31, %rsi
-; NOBMI2-NEXT: xorq %rdi, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $32, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $33, %rsi
-; NOBMI2-NEXT: xorq %rdi, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $34, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $35, %r9
-; NOBMI2-NEXT: xorq %rdi, %r9
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $36, %rsi
-; NOBMI2-NEXT: xorq %r9, %rsi
-; NOBMI2-NEXT: xorq %rcx, %rsi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $37, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $38, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $39, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $40, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $41, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $42, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $43, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $44, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $45, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: xorq %rsi, %rcx
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $46, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $47, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $48, %rsi
-; NOBMI2-NEXT: xorq %rdi, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $49, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $50, %rsi
-; NOBMI2-NEXT: xorq %rdi, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $51, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $52, %rsi
-; NOBMI2-NEXT: xorq %rdi, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $53, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $54, %r9
-; NOBMI2-NEXT: xorq %rdi, %r9
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $55, %rsi
-; NOBMI2-NEXT: xorq %r9, %rsi
-; NOBMI2-NEXT: xorq %rcx, %rsi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $56, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $57, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $58, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $59, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $60, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $61, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $62, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: xorq %rsi, %rcx
-; NOBMI2-NEXT: movq %rcx, %rsi
-; NOBMI2-NEXT: andq %rdx, %rsi
-; NOBMI2-NEXT: movq %r8, %rdi
-; NOBMI2-NEXT: andq %rsi, %rdi
-; NOBMI2-NEXT: xorq %rdi, %r8
-; NOBMI2-NEXT: shrq $2, %rdi
-; NOBMI2-NEXT: orq %r8, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdx
-; NOBMI2-NEXT: shrq $2, %rsi
-; NOBMI2-NEXT: orq %rdx, %rsi
-; NOBMI2-NEXT: notq %rcx
-; NOBMI2-NEXT: andq %rax, %rcx
-; NOBMI2-NEXT: leaq (%rcx,%rcx), %rax
-; NOBMI2-NEXT: xorq %rcx, %rax
-; NOBMI2-NEXT: leaq (,%rcx,4), %rdx
-; NOBMI2-NEXT: leaq (,%rcx,8), %r8
-; NOBMI2-NEXT: xorq %r8, %rdx
-; NOBMI2-NEXT: xorq %rax, %rdx
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $4, %rax
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $5, %r8
-; NOBMI2-NEXT: xorq %rax, %r8
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $6, %rax
-; NOBMI2-NEXT: xorq %r8, %rax
-; NOBMI2-NEXT: xorq %rdx, %rax
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $7, %rdx
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $8, %r8
-; NOBMI2-NEXT: xorq %rdx, %r8
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $9, %rdx
-; NOBMI2-NEXT: xorq %r8, %rdx
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $10, %r8
-; NOBMI2-NEXT: xorq %rdx, %r8
-; NOBMI2-NEXT: xorq %rax, %r8
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $11, %rax
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $12, %rdx
-; NOBMI2-NEXT: xorq %rax, %rdx
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $13, %rax
-; NOBMI2-NEXT: xorq %rdx, %rax
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $14, %rdx
-; NOBMI2-NEXT: xorq %rax, %rdx
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $15, %rax
-; NOBMI2-NEXT: xorq %rdx, %rax
-; NOBMI2-NEXT: xorq %r8, %rax
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $16, %rdx
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $17, %r8
-; NOBMI2-NEXT: xorq %rdx, %r8
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $18, %rdx
-; NOBMI2-NEXT: xorq %r8, %rdx
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $19, %r8
-; NOBMI2-NEXT: xorq %rdx, %r8
-; NOBMI2-NEXT: movq %rcx, %r9
-; NOBMI2-NEXT: shlq $20, %r9
-; NOBMI2-NEXT: xorq %r8, %r9
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $21, %rdx
-; NOBMI2-NEXT: xorq %r9, %rdx
-; NOBMI2-NEXT: xorq %rax, %rdx
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $22, %rax
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $23, %r8
-; NOBMI2-NEXT: xorq %rax, %r8
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $24, %rax
-; NOBMI2-NEXT: xorq %r8, %rax
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $25, %r8
-; NOBMI2-NEXT: xorq %rax, %r8
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $26, %rax
-; NOBMI2-NEXT: xorq %r8, %rax
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $27, %r8
-; NOBMI2-NEXT: xorq %rax, %r8
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $28, %rax
-; NOBMI2-NEXT: xorq %r8, %rax
-; NOBMI2-NEXT: xorq %rdx, %rax
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $29, %rdx
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $30, %r8
-; NOBMI2-NEXT: xorq %rdx, %r8
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $31, %rdx
-; NOBMI2-NEXT: xorq %r8, %rdx
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $32, %r8
-; NOBMI2-NEXT: xorq %rdx, %r8
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $33, %rdx
-; NOBMI2-NEXT: xorq %r8, %rdx
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $34, %r8
-; NOBMI2-NEXT: xorq %rdx, %r8
-; NOBMI2-NEXT: movq %rcx, %r9
-; NOBMI2-NEXT: shlq $35, %r9
-; NOBMI2-NEXT: xorq %r8, %r9
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $36, %rdx
-; NOBMI2-NEXT: xorq %r9, %rdx
-; NOBMI2-NEXT: xorq %rax, %rdx
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $37, %rax
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $38, %r8
-; NOBMI2-NEXT: xorq %rax, %r8
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $39, %rax
-; NOBMI2-NEXT: xorq %r8, %rax
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $40, %r8
-; NOBMI2-NEXT: xorq %rax, %r8
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $41, %rax
-; NOBMI2-NEXT: xorq %r8, %rax
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $42, %r8
-; NOBMI2-NEXT: xorq %rax, %r8
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $43, %rax
-; NOBMI2-NEXT: xorq %r8, %rax
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $44, %r8
-; NOBMI2-NEXT: xorq %rax, %r8
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $45, %rax
-; NOBMI2-NEXT: xorq %r8, %rax
-; NOBMI2-NEXT: xorq %rdx, %rax
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $46, %rdx
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $47, %r8
-; NOBMI2-NEXT: xorq %rdx, %r8
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $48, %rdx
-; NOBMI2-NEXT: xorq %r8, %rdx
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $49, %r8
-; NOBMI2-NEXT: xorq %rdx, %r8
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $50, %rdx
-; NOBMI2-NEXT: xorq %r8, %rdx
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $51, %r8
-; NOBMI2-NEXT: xorq %rdx, %r8
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $52, %rdx
-; NOBMI2-NEXT: xorq %r8, %rdx
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $53, %r8
-; NOBMI2-NEXT: xorq %rdx, %r8
-; NOBMI2-NEXT: movq %rcx, %r9
-; NOBMI2-NEXT: shlq $54, %r9
-; NOBMI2-NEXT: xorq %r8, %r9
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $55, %rdx
-; NOBMI2-NEXT: xorq %r9, %rdx
-; NOBMI2-NEXT: xorq %rax, %rdx
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $56, %rax
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $57, %r8
-; NOBMI2-NEXT: xorq %rax, %r8
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $58, %rax
-; NOBMI2-NEXT: xorq %r8, %rax
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $59, %r8
-; NOBMI2-NEXT: xorq %rax, %r8
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $60, %rax
-; NOBMI2-NEXT: xorq %r8, %rax
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $61, %r8
-; NOBMI2-NEXT: xorq %rax, %r8
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $62, %rax
-; NOBMI2-NEXT: xorq %r8, %rax
-; NOBMI2-NEXT: xorq %rdx, %rax
-; NOBMI2-NEXT: movq %rax, %rdx
-; NOBMI2-NEXT: andq %rsi, %rdx
-; NOBMI2-NEXT: movq %rdi, %r8
-; NOBMI2-NEXT: andq %rdx, %r8
-; NOBMI2-NEXT: xorq %r8, %rdi
-; NOBMI2-NEXT: shrq $4, %r8
-; NOBMI2-NEXT: orq %rdi, %r8
-; NOBMI2-NEXT: xorq %rdx, %rsi
-; NOBMI2-NEXT: shrq $4, %rdx
-; NOBMI2-NEXT: orq %rsi, %rdx
-; NOBMI2-NEXT: notq %rax
-; NOBMI2-NEXT: andq %rcx, %rax
-; NOBMI2-NEXT: leaq (%rax,%rax), %rcx
-; NOBMI2-NEXT: xorq %rax, %rcx
-; NOBMI2-NEXT: leaq (,%rax,4), %rsi
-; NOBMI2-NEXT: leaq (,%rax,8), %rdi
-; NOBMI2-NEXT: xorq %rdi, %rsi
-; NOBMI2-NEXT: xorq %rcx, %rsi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $4, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $5, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $6, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: xorq %rsi, %rcx
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $7, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $8, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $9, %rsi
-; NOBMI2-NEXT: xorq %rdi, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $10, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $11, %rcx
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $12, %rsi
-; NOBMI2-NEXT: xorq %rcx, %rsi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $13, %rcx
-; NOBMI2-NEXT: xorq %rsi, %rcx
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $14, %rsi
-; NOBMI2-NEXT: xorq %rcx, %rsi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $15, %rcx
-; NOBMI2-NEXT: xorq %rsi, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $16, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $17, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $18, %rsi
-; NOBMI2-NEXT: xorq %rdi, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $19, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $20, %r9
-; NOBMI2-NEXT: xorq %rdi, %r9
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $21, %rsi
-; NOBMI2-NEXT: xorq %r9, %rsi
-; NOBMI2-NEXT: xorq %rcx, %rsi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $22, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $23, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $24, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $25, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $26, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $27, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $28, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: xorq %rsi, %rcx
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $29, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $30, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $31, %rsi
-; NOBMI2-NEXT: xorq %rdi, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $32, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $33, %rsi
-; NOBMI2-NEXT: xorq %rdi, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $34, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $35, %r9
-; NOBMI2-NEXT: xorq %rdi, %r9
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $36, %rsi
-; NOBMI2-NEXT: xorq %r9, %rsi
-; NOBMI2-NEXT: xorq %rcx, %rsi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $37, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $38, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $39, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $40, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $41, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $42, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $43, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $44, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $45, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: xorq %rsi, %rcx
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $46, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $47, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $48, %rsi
-; NOBMI2-NEXT: xorq %rdi, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $49, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $50, %rsi
-; NOBMI2-NEXT: xorq %rdi, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $51, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $52, %rsi
-; NOBMI2-NEXT: xorq %rdi, %rsi
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $53, %rdi
-; NOBMI2-NEXT: xorq %rsi, %rdi
-; NOBMI2-NEXT: movq %rax, %r9
-; NOBMI2-NEXT: shlq $54, %r9
-; NOBMI2-NEXT: xorq %rdi, %r9
-; NOBMI2-NEXT: movq %rax, %rsi
-; NOBMI2-NEXT: shlq $55, %rsi
-; NOBMI2-NEXT: xorq %r9, %rsi
-; NOBMI2-NEXT: xorq %rcx, %rsi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $56, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $57, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $58, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $59, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $60, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: movq %rax, %rdi
-; NOBMI2-NEXT: shlq $61, %rdi
-; NOBMI2-NEXT: xorq %rcx, %rdi
-; NOBMI2-NEXT: movq %rax, %rcx
-; NOBMI2-NEXT: shlq $62, %rcx
-; NOBMI2-NEXT: xorq %rdi, %rcx
-; NOBMI2-NEXT: xorq %rsi, %rcx
-; NOBMI2-NEXT: movq %rcx, %rsi
-; NOBMI2-NEXT: andq %rdx, %rsi
-; NOBMI2-NEXT: movq %r8, %r9
-; NOBMI2-NEXT: andq %rsi, %r9
-; NOBMI2-NEXT: xorq %r9, %r8
-; NOBMI2-NEXT: shrq $8, %r9
-; NOBMI2-NEXT: orq %r8, %r9
-; NOBMI2-NEXT: xorq %rsi, %rdx
-; NOBMI2-NEXT: shrq $8, %rsi
-; NOBMI2-NEXT: orq %rdx, %rsi
-; NOBMI2-NEXT: notq %rcx
-; NOBMI2-NEXT: andq %rax, %rcx
-; NOBMI2-NEXT: leaq (%rcx,%rcx), %rax
-; NOBMI2-NEXT: xorq %rcx, %rax
-; NOBMI2-NEXT: leaq (,%rcx,4), %rdx
-; NOBMI2-NEXT: leaq (,%rcx,8), %rdi
-; NOBMI2-NEXT: xorq %rdi, %rdx
-; NOBMI2-NEXT: xorq %rax, %rdx
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $4, %rax
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $5, %rdi
-; NOBMI2-NEXT: xorq %rax, %rdi
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $6, %rax
-; NOBMI2-NEXT: xorq %rdi, %rax
-; NOBMI2-NEXT: xorq %rdx, %rax
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $7, %rdx
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $8, %rdi
-; NOBMI2-NEXT: xorq %rdx, %rdi
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $9, %rdx
-; NOBMI2-NEXT: xorq %rdi, %rdx
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $10, %rdi
-; NOBMI2-NEXT: xorq %rdx, %rdi
-; NOBMI2-NEXT: xorq %rax, %rdi
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $11, %rax
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $12, %rdx
-; NOBMI2-NEXT: xorq %rax, %rdx
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $13, %rax
-; NOBMI2-NEXT: xorq %rdx, %rax
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $14, %rdx
-; NOBMI2-NEXT: xorq %rax, %rdx
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $15, %rax
-; NOBMI2-NEXT: xorq %rdx, %rax
-; NOBMI2-NEXT: xorq %rdi, %rax
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $16, %rdx
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $17, %rdi
-; NOBMI2-NEXT: xorq %rdx, %rdi
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $18, %rdx
-; NOBMI2-NEXT: xorq %rdi, %rdx
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $19, %rdi
-; NOBMI2-NEXT: xorq %rdx, %rdi
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $20, %r8
-; NOBMI2-NEXT: xorq %rdi, %r8
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $21, %rdx
-; NOBMI2-NEXT: xorq %r8, %rdx
-; NOBMI2-NEXT: xorq %rax, %rdx
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $22, %rax
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $23, %rdi
-; NOBMI2-NEXT: xorq %rax, %rdi
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $24, %rax
-; NOBMI2-NEXT: xorq %rdi, %rax
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $25, %rdi
-; NOBMI2-NEXT: xorq %rax, %rdi
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $26, %rax
-; NOBMI2-NEXT: xorq %rdi, %rax
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $27, %rdi
-; NOBMI2-NEXT: xorq %rax, %rdi
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $28, %rax
-; NOBMI2-NEXT: xorq %rdi, %rax
-; NOBMI2-NEXT: xorq %rdx, %rax
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $29, %rdx
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $30, %rdi
-; NOBMI2-NEXT: xorq %rdx, %rdi
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $31, %rdx
-; NOBMI2-NEXT: xorq %rdi, %rdx
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $32, %rdi
-; NOBMI2-NEXT: xorq %rdx, %rdi
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $33, %rdx
-; NOBMI2-NEXT: xorq %rdi, %rdx
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $34, %rdi
-; NOBMI2-NEXT: xorq %rdx, %rdi
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $35, %r8
-; NOBMI2-NEXT: xorq %rdi, %r8
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $36, %rdx
-; NOBMI2-NEXT: xorq %r8, %rdx
-; NOBMI2-NEXT: xorq %rax, %rdx
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $37, %rax
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $38, %rdi
-; NOBMI2-NEXT: xorq %rax, %rdi
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $39, %rax
-; NOBMI2-NEXT: xorq %rdi, %rax
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $40, %rdi
-; NOBMI2-NEXT: xorq %rax, %rdi
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $41, %rax
-; NOBMI2-NEXT: xorq %rdi, %rax
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $42, %rdi
-; NOBMI2-NEXT: xorq %rax, %rdi
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $43, %rax
-; NOBMI2-NEXT: xorq %rdi, %rax
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $44, %rdi
-; NOBMI2-NEXT: xorq %rax, %rdi
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $45, %rax
-; NOBMI2-NEXT: xorq %rdi, %rax
-; NOBMI2-NEXT: xorq %rdx, %rax
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $46, %rdx
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $47, %rdi
-; NOBMI2-NEXT: xorq %rdx, %rdi
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $48, %rdx
-; NOBMI2-NEXT: xorq %rdi, %rdx
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $49, %rdi
-; NOBMI2-NEXT: xorq %rdx, %rdi
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $50, %rdx
-; NOBMI2-NEXT: xorq %rdi, %rdx
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $51, %rdi
-; NOBMI2-NEXT: xorq %rdx, %rdi
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $52, %rdx
-; NOBMI2-NEXT: xorq %rdi, %rdx
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $53, %rdi
-; NOBMI2-NEXT: xorq %rdx, %rdi
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $54, %rdx
-; NOBMI2-NEXT: xorq %rdi, %rdx
-; NOBMI2-NEXT: movq %rcx, %rdi
-; NOBMI2-NEXT: shlq $55, %rdi
-; NOBMI2-NEXT: xorq %rdx, %rdi
-; NOBMI2-NEXT: xorq %rax, %rdi
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $56, %rax
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $57, %rdx
-; NOBMI2-NEXT: xorq %rax, %rdx
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $58, %rax
-; NOBMI2-NEXT: xorq %rdx, %rax
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $59, %rdx
-; NOBMI2-NEXT: xorq %rax, %rdx
-; NOBMI2-NEXT: movq %rcx, %rax
-; NOBMI2-NEXT: shlq $60, %rax
-; NOBMI2-NEXT: xorq %rdx, %rax
-; NOBMI2-NEXT: movq %rcx, %r8
-; NOBMI2-NEXT: shlq $61, %r8
-; NOBMI2-NEXT: xorq %rax, %r8
-; NOBMI2-NEXT: movq %rcx, %rdx
-; NOBMI2-NEXT: shlq $62, %rdx
-; NOBMI2-NEXT: xorq %r8, %rdx
-; NOBMI2-NEXT: xorq %rdi, %rdx
-; NOBMI2-NEXT: movq %rdx, %rax
-; NOBMI2-NEXT: andq %rsi, %rax
-; NOBMI2-NEXT: movq %r9, %rdi
-; NOBMI2-NEXT: andq %rax, %rdi
-; NOBMI2-NEXT: xorq %rdi, %r9
-; NOBMI2-NEXT: shrq $16, %rdi
-; NOBMI2-NEXT: orq %r9, %rdi
-; NOBMI2-NEXT: xorq %rax, %rsi
-; NOBMI2-NEXT: shrq $16, %rax
-; NOBMI2-NEXT: orq %rsi, %rax
-; NOBMI2-NEXT: notq %rdx
-; NOBMI2-NEXT: andq %rcx, %rdx
-; NOBMI2-NEXT: leaq (%rdx,%rdx), %rcx
-; NOBMI2-NEXT: xorq %rdx, %rcx
-; NOBMI2-NEXT: leaq (,%rdx,4), %rsi
-; NOBMI2-NEXT: leaq (,%rdx,8), %r8
-; NOBMI2-NEXT: xorq %r8, %rsi
-; NOBMI2-NEXT: xorq %rcx, %rsi
-; NOBMI2-NEXT: movq %rdx, %rcx
-; NOBMI2-NEXT: shlq $4, %rcx
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $5, %r8
-; NOBMI2-NEXT: xorq %rcx, %r8
-; NOBMI2-NEXT: movq %rdx, %rcx
-; NOBMI2-NEXT: shlq $6, %rcx
-; NOBMI2-NEXT: xorq %r8, %rcx
-; NOBMI2-NEXT: xorq %rsi, %rcx
-; NOBMI2-NEXT: movq %rdx, %rsi
-; NOBMI2-NEXT: shlq $7, %rsi
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $8, %r8
-; NOBMI2-NEXT: xorq %rsi, %r8
-; NOBMI2-NEXT: movq %rdx, %rsi
-; NOBMI2-NEXT: shlq $9, %rsi
-; NOBMI2-NEXT: xorq %r8, %rsi
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $10, %r8
-; NOBMI2-NEXT: xorq %rsi, %r8
-; NOBMI2-NEXT: xorq %rcx, %r8
-; NOBMI2-NEXT: movq %rdx, %rcx
-; NOBMI2-NEXT: shlq $11, %rcx
-; NOBMI2-NEXT: movq %rdx, %rsi
-; NOBMI2-NEXT: shlq $12, %rsi
-; NOBMI2-NEXT: xorq %rcx, %rsi
-; NOBMI2-NEXT: movq %rdx, %rcx
-; NOBMI2-NEXT: shlq $13, %rcx
-; NOBMI2-NEXT: xorq %rsi, %rcx
-; NOBMI2-NEXT: movq %rdx, %rsi
-; NOBMI2-NEXT: shlq $14, %rsi
-; NOBMI2-NEXT: xorq %rcx, %rsi
-; NOBMI2-NEXT: movq %rdx, %rcx
-; NOBMI2-NEXT: shlq $15, %rcx
-; NOBMI2-NEXT: xorq %rsi, %rcx
-; NOBMI2-NEXT: xorq %r8, %rcx
-; NOBMI2-NEXT: movq %rdx, %rsi
-; NOBMI2-NEXT: shlq $16, %rsi
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $17, %r8
-; NOBMI2-NEXT: xorq %rsi, %r8
-; NOBMI2-NEXT: movq %rdx, %rsi
-; NOBMI2-NEXT: shlq $18, %rsi
-; NOBMI2-NEXT: xorq %r8, %rsi
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $19, %r8
-; NOBMI2-NEXT: xorq %rsi, %r8
-; NOBMI2-NEXT: movq %rdx, %r9
-; NOBMI2-NEXT: shlq $20, %r9
-; NOBMI2-NEXT: xorq %r8, %r9
-; NOBMI2-NEXT: movq %rdx, %rsi
-; NOBMI2-NEXT: shlq $21, %rsi
-; NOBMI2-NEXT: xorq %r9, %rsi
-; NOBMI2-NEXT: xorq %rcx, %rsi
-; NOBMI2-NEXT: movq %rdx, %rcx
-; NOBMI2-NEXT: shlq $22, %rcx
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $23, %r8
-; NOBMI2-NEXT: xorq %rcx, %r8
-; NOBMI2-NEXT: movq %rdx, %rcx
-; NOBMI2-NEXT: shlq $24, %rcx
-; NOBMI2-NEXT: xorq %r8, %rcx
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $25, %r8
-; NOBMI2-NEXT: xorq %rcx, %r8
-; NOBMI2-NEXT: movq %rdx, %rcx
-; NOBMI2-NEXT: shlq $26, %rcx
-; NOBMI2-NEXT: xorq %r8, %rcx
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $27, %r8
-; NOBMI2-NEXT: xorq %rcx, %r8
-; NOBMI2-NEXT: movq %rdx, %rcx
-; NOBMI2-NEXT: shlq $28, %rcx
-; NOBMI2-NEXT: xorq %r8, %rcx
-; NOBMI2-NEXT: xorq %rsi, %rcx
-; NOBMI2-NEXT: movq %rdx, %rsi
-; NOBMI2-NEXT: shlq $29, %rsi
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $30, %r8
-; NOBMI2-NEXT: xorq %rsi, %r8
-; NOBMI2-NEXT: movq %rdx, %rsi
-; NOBMI2-NEXT: shlq $31, %rsi
-; NOBMI2-NEXT: xorq %r8, %rsi
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $32, %r8
-; NOBMI2-NEXT: xorq %rsi, %r8
-; NOBMI2-NEXT: movq %rdx, %rsi
-; NOBMI2-NEXT: shlq $33, %rsi
-; NOBMI2-NEXT: xorq %r8, %rsi
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $34, %r8
-; NOBMI2-NEXT: xorq %rsi, %r8
-; NOBMI2-NEXT: movq %rdx, %r9
-; NOBMI2-NEXT: shlq $35, %r9
-; NOBMI2-NEXT: xorq %r8, %r9
-; NOBMI2-NEXT: movq %rdx, %rsi
-; NOBMI2-NEXT: shlq $36, %rsi
-; NOBMI2-NEXT: xorq %r9, %rsi
-; NOBMI2-NEXT: xorq %rcx, %rsi
-; NOBMI2-NEXT: movq %rdx, %rcx
-; NOBMI2-NEXT: shlq $37, %rcx
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $38, %r8
-; NOBMI2-NEXT: xorq %rcx, %r8
-; NOBMI2-NEXT: movq %rdx, %rcx
-; NOBMI2-NEXT: shlq $39, %rcx
-; NOBMI2-NEXT: xorq %r8, %rcx
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $40, %r8
-; NOBMI2-NEXT: xorq %rcx, %r8
-; NOBMI2-NEXT: movq %rdx, %rcx
-; NOBMI2-NEXT: shlq $41, %rcx
-; NOBMI2-NEXT: xorq %r8, %rcx
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $42, %r8
-; NOBMI2-NEXT: xorq %rcx, %r8
-; NOBMI2-NEXT: movq %rdx, %rcx
-; NOBMI2-NEXT: shlq $43, %rcx
-; NOBMI2-NEXT: xorq %r8, %rcx
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $44, %r8
-; NOBMI2-NEXT: xorq %rcx, %r8
-; NOBMI2-NEXT: movq %rdx, %rcx
-; NOBMI2-NEXT: shlq $45, %rcx
-; NOBMI2-NEXT: xorq %r8, %rcx
-; NOBMI2-NEXT: xorq %rsi, %rcx
-; NOBMI2-NEXT: movq %rdx, %rsi
-; NOBMI2-NEXT: shlq $46, %rsi
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $47, %r8
-; NOBMI2-NEXT: xorq %rsi, %r8
-; NOBMI2-NEXT: movq %rdx, %rsi
-; NOBMI2-NEXT: shlq $48, %rsi
-; NOBMI2-NEXT: xorq %r8, %rsi
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $49, %r8
-; NOBMI2-NEXT: xorq %rsi, %r8
-; NOBMI2-NEXT: movq %rdx, %rsi
-; NOBMI2-NEXT: shlq $50, %rsi
-; NOBMI2-NEXT: xorq %r8, %rsi
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $51, %r8
-; NOBMI2-NEXT: xorq %rsi, %r8
-; NOBMI2-NEXT: movq %rdx, %rsi
-; NOBMI2-NEXT: shlq $52, %rsi
-; NOBMI2-NEXT: xorq %r8, %rsi
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $53, %r8
-; NOBMI2-NEXT: xorq %rsi, %r8
-; NOBMI2-NEXT: movq %rdx, %r9
-; NOBMI2-NEXT: shlq $54, %r9
-; NOBMI2-NEXT: xorq %r8, %r9
-; NOBMI2-NEXT: movq %rdx, %rsi
-; NOBMI2-NEXT: shlq $55, %rsi
-; NOBMI2-NEXT: xorq %r9, %rsi
-; NOBMI2-NEXT: xorq %rcx, %rsi
-; NOBMI2-NEXT: movq %rdx, %rcx
-; NOBMI2-NEXT: shlq $56, %rcx
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $57, %r8
-; NOBMI2-NEXT: xorq %rcx, %r8
-; NOBMI2-NEXT: movq %rdx, %rcx
-; NOBMI2-NEXT: shlq $58, %rcx
-; NOBMI2-NEXT: xorq %r8, %rcx
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $59, %r8
-; NOBMI2-NEXT: xorq %rcx, %r8
-; NOBMI2-NEXT: movq %rdx, %rcx
-; NOBMI2-NEXT: shlq $60, %rcx
-; NOBMI2-NEXT: xorq %r8, %rcx
-; NOBMI2-NEXT: movq %rdx, %r8
-; NOBMI2-NEXT: shlq $61, %r8
-; NOBMI2-NEXT: xorq %rcx, %r8
-; NOBMI2-NEXT: movq %rdx, %rcx
-; NOBMI2-NEXT: shlq $62, %rcx
-; NOBMI2-NEXT: xorq %r8, %rcx
-; NOBMI2-NEXT: shlq $63, %rdx
-; NOBMI2-NEXT: xorq %rcx, %rdx
-; NOBMI2-NEXT: xorq %rsi, %rdx
-; NOBMI2-NEXT: andq %rdi, %rax
-; NOBMI2-NEXT: andq %rdx, %rax
-; NOBMI2-NEXT: xorq %rax, %rdi
-; NOBMI2-NEXT: shrq $32, %rax
-; NOBMI2-NEXT: orq %rdi, %rax
+; NOBMI2-NEXT: xorl %r11d, %ebx
+; NOBMI2-NEXT: xorl %edx, %ebx
+; NOBMI2-NEXT: movl %r8d, %edx
+; NOBMI2-NEXT: shll $29, %edx
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: shll $30, %r9d
+; NOBMI2-NEXT: xorl %edx, %r9d
+; NOBMI2-NEXT: xorl %ebx, %r9d
+; NOBMI2-NEXT: movl %r9d, %edx
+; NOBMI2-NEXT: andl %r10d, %edx
+; NOBMI2-NEXT: xorl %edx, %r10d
+; NOBMI2-NEXT: movl %edx, %r11d
+; NOBMI2-NEXT: shrl $4, %r11d
+; NOBMI2-NEXT: orl %r10d, %r11d
+; NOBMI2-NEXT: notl %r9d
+; NOBMI2-NEXT: andl %r8d, %r9d
+; NOBMI2-NEXT: leal (%r9,%r9), %r8d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: leal (,%r9,4), %r10d
+; NOBMI2-NEXT: leal (,%r9,8), %ebx
+; NOBMI2-NEXT: xorl %r10d, %ebx
+; NOBMI2-NEXT: xorl %r8d, %ebx
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $4, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $5, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $6, %r8d
+; NOBMI2-NEXT: xorl %r10d, %r8d
+; NOBMI2-NEXT: xorl %ebx, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $7, %r10d
+; NOBMI2-NEXT: movl %r9d, %ebx
+; NOBMI2-NEXT: shll $8, %ebx
+; NOBMI2-NEXT: xorl %r10d, %ebx
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $9, %r10d
+; NOBMI2-NEXT: xorl %ebx, %r10d
+; NOBMI2-NEXT: movl %r9d, %ebx
+; NOBMI2-NEXT: shll $10, %ebx
+; NOBMI2-NEXT: xorl %r10d, %ebx
+; NOBMI2-NEXT: xorl %r8d, %ebx
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $11, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $12, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $13, %r8d
+; NOBMI2-NEXT: xorl %r10d, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $14, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: movl %r9d, %ebp
+; NOBMI2-NEXT: shll $15, %ebp
+; NOBMI2-NEXT: xorl %r10d, %ebp
+; NOBMI2-NEXT: xorl %ebx, %ebp
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $16, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $17, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $18, %r8d
+; NOBMI2-NEXT: xorl %r10d, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $19, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: movl %r9d, %ebx
+; NOBMI2-NEXT: shll $20, %ebx
+; NOBMI2-NEXT: xorl %r10d, %ebx
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $21, %r8d
+; NOBMI2-NEXT: xorl %ebx, %r8d
+; NOBMI2-NEXT: xorl %ebp, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $22, %r10d
+; NOBMI2-NEXT: movl %r9d, %ebx
+; NOBMI2-NEXT: shll $23, %ebx
+; NOBMI2-NEXT: xorl %r10d, %ebx
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $24, %r10d
+; NOBMI2-NEXT: xorl %ebx, %r10d
+; NOBMI2-NEXT: movl %r9d, %ebx
+; NOBMI2-NEXT: shll $25, %ebx
+; NOBMI2-NEXT: xorl %r10d, %ebx
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $26, %r10d
+; NOBMI2-NEXT: xorl %ebx, %r10d
+; NOBMI2-NEXT: movl %r9d, %ebx
+; NOBMI2-NEXT: shll $27, %ebx
+; NOBMI2-NEXT: xorl %r10d, %ebx
+; NOBMI2-NEXT: movl %r9d, %ebp
+; NOBMI2-NEXT: shll $28, %ebp
+; NOBMI2-NEXT: xorl %ebx, %ebp
+; NOBMI2-NEXT: xorl %r8d, %ebp
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: shll $29, %r8d
+; NOBMI2-NEXT: movl %r9d, %r10d
+; NOBMI2-NEXT: shll $30, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: xorl %ebp, %r10d
+; NOBMI2-NEXT: movl %r10d, %r8d
+; NOBMI2-NEXT: andl %r11d, %r8d
+; NOBMI2-NEXT: xorl %r8d, %r11d
+; NOBMI2-NEXT: movl %r8d, %ebx
+; NOBMI2-NEXT: shrl $8, %ebx
+; NOBMI2-NEXT: orl %r11d, %ebx
+; NOBMI2-NEXT: notl %r10d
+; NOBMI2-NEXT: andl %r9d, %r10d
+; NOBMI2-NEXT: leal (%r10,%r10), %r9d
+; NOBMI2-NEXT: xorl %r10d, %r9d
+; NOBMI2-NEXT: leal (,%r10,4), %r11d
+; NOBMI2-NEXT: leal (,%r10,8), %ebp
+; NOBMI2-NEXT: xorl %r11d, %ebp
+; NOBMI2-NEXT: xorl %r9d, %ebp
+; NOBMI2-NEXT: movl %r10d, %r9d
+; NOBMI2-NEXT: shll $4, %r9d
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $5, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: movl %r10d, %r9d
+; NOBMI2-NEXT: shll $6, %r9d
+; NOBMI2-NEXT: xorl %r11d, %r9d
+; NOBMI2-NEXT: xorl %ebp, %r9d
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $7, %r11d
+; NOBMI2-NEXT: movl %r10d, %ebp
+; NOBMI2-NEXT: shll $8, %ebp
+; NOBMI2-NEXT: xorl %r11d, %ebp
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $9, %r11d
+; NOBMI2-NEXT: xorl %ebp, %r11d
+; NOBMI2-NEXT: movl %r10d, %ebp
+; NOBMI2-NEXT: shll $10, %ebp
+; NOBMI2-NEXT: xorl %r11d, %ebp
+; NOBMI2-NEXT: xorl %r9d, %ebp
+; NOBMI2-NEXT: movl %r10d, %r9d
+; NOBMI2-NEXT: shll $11, %r9d
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $12, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: movl %r10d, %r9d
+; NOBMI2-NEXT: shll $13, %r9d
+; NOBMI2-NEXT: xorl %r11d, %r9d
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $14, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: movl %r10d, %r14d
+; NOBMI2-NEXT: shll $15, %r14d
+; NOBMI2-NEXT: xorl %r11d, %r14d
+; NOBMI2-NEXT: xorl %ebp, %r14d
+; NOBMI2-NEXT: movl %r10d, %r9d
+; NOBMI2-NEXT: shll $16, %r9d
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $17, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: movl %r10d, %r9d
+; NOBMI2-NEXT: shll $18, %r9d
+; NOBMI2-NEXT: xorl %r11d, %r9d
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $19, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: movl %r10d, %ebp
+; NOBMI2-NEXT: shll $20, %ebp
+; NOBMI2-NEXT: xorl %r11d, %ebp
+; NOBMI2-NEXT: movl %r10d, %r9d
+; NOBMI2-NEXT: shll $21, %r9d
+; NOBMI2-NEXT: xorl %ebp, %r9d
+; NOBMI2-NEXT: xorl %r14d, %r9d
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $22, %r11d
+; NOBMI2-NEXT: movl %r10d, %ebp
+; NOBMI2-NEXT: shll $23, %ebp
+; NOBMI2-NEXT: xorl %r11d, %ebp
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $24, %r11d
+; NOBMI2-NEXT: xorl %ebp, %r11d
+; NOBMI2-NEXT: movl %r10d, %ebp
+; NOBMI2-NEXT: shll $25, %ebp
+; NOBMI2-NEXT: xorl %r11d, %ebp
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $26, %r11d
+; NOBMI2-NEXT: xorl %ebp, %r11d
+; NOBMI2-NEXT: movl %r10d, %ebp
+; NOBMI2-NEXT: shll $27, %ebp
+; NOBMI2-NEXT: xorl %r11d, %ebp
+; NOBMI2-NEXT: movl %r10d, %r11d
+; NOBMI2-NEXT: shll $28, %r11d
+; NOBMI2-NEXT: xorl %ebp, %r11d
+; NOBMI2-NEXT: xorl %r9d, %r11d
+; NOBMI2-NEXT: movl %r10d, %r9d
+; NOBMI2-NEXT: shll $29, %r9d
+; NOBMI2-NEXT: shll $30, %r10d
+; NOBMI2-NEXT: xorl %r9d, %r10d
+; NOBMI2-NEXT: xorl %r11d, %r10d
+; NOBMI2-NEXT: movl %edi, %r9d
+; NOBMI2-NEXT: shll $16, %r9d
+; NOBMI2-NEXT: xorl %edi, %r9d
+; NOBMI2-NEXT: andl %ebx, %r9d
+; NOBMI2-NEXT: andl %r10d, %r9d
+; NOBMI2-NEXT: xorl %edi, %r9d
+; NOBMI2-NEXT: movl %r9d, %edi
+; NOBMI2-NEXT: shll $8, %edi
+; NOBMI2-NEXT: xorl %r9d, %edi
+; NOBMI2-NEXT: andl %r8d, %edi
+; NOBMI2-NEXT: xorl %r9d, %edi
+; NOBMI2-NEXT: movl %edi, %r8d
+; NOBMI2-NEXT: shll $4, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: andl %edx, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: leal (,%r8,4), %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: andl %eax, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: leal (%rdx,%rdx), %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: andl %ecx, %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: andl %esi, %eax
+; NOBMI2-NEXT: popq %rbx
+; NOBMI2-NEXT: popq %r14
+; NOBMI2-NEXT: popq %rbp
; NOBMI2-NEXT: retq
- %res = call i64 @llvm.bext.i64(i64 %val, i64 %mask)
- ret i64 %res
+ %res = call i32 @llvm.bdep.i32(i32 %val, i32 %mask)
+ ret i32 %res
}
define i64 @bdep_i64(i64 %val, i64 %mask) nounwind {
@@ -4029,34 +2029,6 @@ define i64 @bdep_i64(i64 %val, i64 %mask) nounwind {
ret i64 %res
}
-define i32 @bext_mask_zero(i32 %val) nounwind {
-; BMI2-LABEL: bext_mask_zero:
-; BMI2: # %bb.0:
-; BMI2-NEXT: xorl %eax, %eax
-; BMI2-NEXT: retq
-;
-; NOBMI2-LABEL: bext_mask_zero:
-; NOBMI2: # %bb.0:
-; NOBMI2-NEXT: xorl %eax, %eax
-; NOBMI2-NEXT: retq
- %res = call i32 @llvm.bext.i32(i32 %val, i32 0)
- ret i32 %res
-}
-
-define i32 @bext_mask_allones(i32 %val) nounwind {
-; BMI2-LABEL: bext_mask_allones:
-; BMI2: # %bb.0:
-; BMI2-NEXT: movl %edi, %eax
-; BMI2-NEXT: retq
-;
-; NOBMI2-LABEL: bext_mask_allones:
-; NOBMI2: # %bb.0:
-; NOBMI2-NEXT: movl %edi, %eax
-; NOBMI2-NEXT: retq
- %res = call i32 @llvm.bext.i32(i32 %val, i32 -1)
- ret i32 %res
-}
-
define i32 @bdep_mask_zero(i32 %val) nounwind {
; BMI2-LABEL: bdep_mask_zero:
; BMI2: # %bb.0:
@@ -4085,20 +2057,6 @@ define i32 @bdep_mask_allones(i32 %val) nounwind {
ret i32 %res
}
-define i32 @bext_const_fold() nounwind {
-; BMI2-LABEL: bext_const_fold:
-; BMI2: # %bb.0:
-; BMI2-NEXT: movl $10, %eax
-; BMI2-NEXT: retq
-;
-; NOBMI2-LABEL: bext_const_fold:
-; NOBMI2: # %bb.0:
-; NOBMI2-NEXT: movl $10, %eax
-; NOBMI2-NEXT: retq
- %res = call i32 @llvm.bext.i32(i32 170, i32 204)
- ret i32 %res
-}
-
define i32 @bdep_const_fold() nounwind {
; BMI2-LABEL: bdep_const_fold:
; BMI2: # %bb.0:
@@ -4113,11 +2071,3 @@ define i32 @bdep_const_fold() nounwind {
ret i32 %res
}
-declare i8 @llvm.bext.i8(i8, i8)
-declare i16 @llvm.bext.i16(i16, i16)
-declare i32 @llvm.bext.i32(i32, i32)
-declare i64 @llvm.bext.i64(i64, i64)
-declare i8 @llvm.bdep.i8(i8, i8)
-declare i16 @llvm.bdep.i16(i16, i16)
-declare i32 @llvm.bdep.i32(i32, i32)
-declare i64 @llvm.bdep.i64(i64, i64)
diff --git a/llvm/test/CodeGen/X86/bext.ll b/llvm/test/CodeGen/X86/bext.ll
new file mode 100644
index 0000000000000..39e70485396e3
--- /dev/null
+++ b/llvm/test/CodeGen/X86/bext.ll
@@ -0,0 +1,2050 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+bmi2 | FileCheck %s --check-prefix=BMI2
+; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s --check-prefix=NOBMI2
+
+define i8 @bext_i8(i8 %val, i8 %mask) nounwind {
+; BMI2-LABEL: bext_i8:
+; BMI2: # %bb.0:
+; BMI2-NEXT: movzbl %sil, %eax
+; BMI2-NEXT: movzbl %dil, %ecx
+; BMI2-NEXT: pextl %eax, %ecx, %eax
+; BMI2-NEXT: # kill: def $al killed $al killed $eax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bext_i8:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: movl %esi, %ecx
+; NOBMI2-NEXT: notb %cl
+; NOBMI2-NEXT: leal (,%rcx,4), %edx
+; NOBMI2-NEXT: leal (%rcx,%rcx), %eax
+; NOBMI2-NEXT: xorb %al, %dl
+; NOBMI2-NEXT: leal (,%rcx,8), %r8d
+; NOBMI2-NEXT: movl %ecx, %r9d
+; NOBMI2-NEXT: shlb $4, %r9b
+; NOBMI2-NEXT: xorb %r8b, %r9b
+; NOBMI2-NEXT: xorb %dl, %r9b
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shlb $5, %dl
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shlb $6, %r8b
+; NOBMI2-NEXT: xorb %dl, %r8b
+; NOBMI2-NEXT: shlb $7, %cl
+; NOBMI2-NEXT: xorb %r8b, %cl
+; NOBMI2-NEXT: xorb %r9b, %cl
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: andb %sil, %dl
+; NOBMI2-NEXT: andl %esi, %edi
+; NOBMI2-NEXT: movl %edi, %r8d
+; NOBMI2-NEXT: andb %dl, %r8b
+; NOBMI2-NEXT: xorb %r8b, %dil
+; NOBMI2-NEXT: shrb %r8b
+; NOBMI2-NEXT: orb %dil, %r8b
+; NOBMI2-NEXT: xorb %dl, %sil
+; NOBMI2-NEXT: shrb %dl
+; NOBMI2-NEXT: orb %sil, %dl
+; NOBMI2-NEXT: notb %cl
+; NOBMI2-NEXT: andb %al, %cl
+; NOBMI2-NEXT: leal (%rcx,%rcx), %eax
+; NOBMI2-NEXT: xorb %cl, %al
+; NOBMI2-NEXT: leal (,%rcx,4), %esi
+; NOBMI2-NEXT: leal (,%rcx,8), %edi
+; NOBMI2-NEXT: xorb %sil, %dil
+; NOBMI2-NEXT: xorb %al, %dil
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shlb $4, %al
+; NOBMI2-NEXT: movl %ecx, %r9d
+; NOBMI2-NEXT: shlb $5, %r9b
+; NOBMI2-NEXT: xorb %al, %r9b
+; NOBMI2-NEXT: movl %ecx, %esi
+; NOBMI2-NEXT: shlb $6, %sil
+; NOBMI2-NEXT: xorb %r9b, %sil
+; NOBMI2-NEXT: xorb %dil, %sil
+; NOBMI2-NEXT: movl %esi, %eax
+; NOBMI2-NEXT: andb %dl, %al
+; NOBMI2-NEXT: movl %r8d, %edi
+; NOBMI2-NEXT: andb %al, %dil
+; NOBMI2-NEXT: xorb %dil, %r8b
+; NOBMI2-NEXT: shrb $2, %dil
+; NOBMI2-NEXT: orb %r8b, %dil
+; NOBMI2-NEXT: xorb %al, %dl
+; NOBMI2-NEXT: shrb $2, %al
+; NOBMI2-NEXT: orb %dl, %al
+; NOBMI2-NEXT: notb %sil
+; NOBMI2-NEXT: andb %cl, %sil
+; NOBMI2-NEXT: leal (%rsi,%rsi), %ecx
+; NOBMI2-NEXT: xorb %sil, %cl
+; NOBMI2-NEXT: leal (,%rsi,4), %edx
+; NOBMI2-NEXT: leal (,%rsi,8), %r8d
+; NOBMI2-NEXT: xorb %dl, %r8b
+; NOBMI2-NEXT: xorb %cl, %r8b
+; NOBMI2-NEXT: movl %esi, %ecx
+; NOBMI2-NEXT: shlb $4, %cl
+; NOBMI2-NEXT: movl %esi, %edx
+; NOBMI2-NEXT: shlb $5, %dl
+; NOBMI2-NEXT: xorb %cl, %dl
+; NOBMI2-NEXT: shlb $6, %sil
+; NOBMI2-NEXT: xorb %dl, %sil
+; NOBMI2-NEXT: xorb %r8b, %sil
+; NOBMI2-NEXT: andb %dil, %al
+; NOBMI2-NEXT: andb %sil, %al
+; NOBMI2-NEXT: xorb %al, %dil
+; NOBMI2-NEXT: shrb $4, %al
+; NOBMI2-NEXT: orb %dil, %al
+; NOBMI2-NEXT: retq
+ %res = call i8 @llvm.bext.i8(i8 %val, i8 %mask)
+ ret i8 %res
+}
+
+define i16 @bext_i16(i16 %val, i16 %mask) nounwind {
+; BMI2-LABEL: bext_i16:
+; BMI2: # %bb.0:
+; BMI2-NEXT: movzwl %si, %eax
+; BMI2-NEXT: movzwl %di, %ecx
+; BMI2-NEXT: pextl %eax, %ecx, %eax
+; BMI2-NEXT: # kill: def $ax killed $ax killed $eax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bext_i16:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: pushq %rbx
+; NOBMI2-NEXT: andl %esi, %edi
+; NOBMI2-NEXT: movl %esi, %eax
+; NOBMI2-NEXT: notl %eax
+; NOBMI2-NEXT: leal (,%rax,4), %edx
+; NOBMI2-NEXT: leal (%rax,%rax), %ecx
+; NOBMI2-NEXT: xorl %ecx, %edx
+; NOBMI2-NEXT: leal (,%rax,8), %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $4, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: xorl %edx, %r9d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $5, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $6, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $7, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: xorl %r9d, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $8, %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $9, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $10, %r8d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $11, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: xorl %edx, %r9d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $12, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $13, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $14, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: shll $15, %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: xorl %r9d, %eax
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: andl %esi, %r8d
+; NOBMI2-NEXT: movl %edi, %edx
+; NOBMI2-NEXT: andl %r8d, %edx
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movzwl %dx, %edx
+; NOBMI2-NEXT: shrl %edx
+; NOBMI2-NEXT: orl %edi, %edx
+; NOBMI2-NEXT: xorl %r8d, %esi
+; NOBMI2-NEXT: movzwl %r8w, %edi
+; NOBMI2-NEXT: shrl %edi
+; NOBMI2-NEXT: orl %esi, %edi
+; NOBMI2-NEXT: notl %eax
+; NOBMI2-NEXT: andl %ecx, %eax
+; NOBMI2-NEXT: leal (%rax,%rax), %ecx
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: leal (,%rax,4), %esi
+; NOBMI2-NEXT: leal (,%rax,8), %r8d
+; NOBMI2-NEXT: xorl %esi, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $4, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $5, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $6, %ecx
+; NOBMI2-NEXT: xorl %esi, %ecx
+; NOBMI2-NEXT: xorl %r8d, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $7, %esi
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $8, %r8d
+; NOBMI2-NEXT: xorl %esi, %r8d
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $9, %esi
+; NOBMI2-NEXT: xorl %r8d, %esi
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $10, %r8d
+; NOBMI2-NEXT: xorl %esi, %r8d
+; NOBMI2-NEXT: xorl %ecx, %r8d
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $11, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $12, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $13, %r9d
+; NOBMI2-NEXT: xorl %esi, %r9d
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $14, %ecx
+; NOBMI2-NEXT: xorl %r9d, %ecx
+; NOBMI2-NEXT: xorl %r8d, %ecx
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: andl %edi, %r8d
+; NOBMI2-NEXT: movl %edx, %esi
+; NOBMI2-NEXT: andl %r8d, %esi
+; NOBMI2-NEXT: xorl %esi, %edx
+; NOBMI2-NEXT: movzwl %si, %esi
+; NOBMI2-NEXT: shrl $2, %esi
+; NOBMI2-NEXT: orl %edx, %esi
+; NOBMI2-NEXT: xorl %r8d, %edi
+; NOBMI2-NEXT: movzwl %r8w, %edx
+; NOBMI2-NEXT: shrl $2, %edx
+; NOBMI2-NEXT: orl %edi, %edx
+; NOBMI2-NEXT: notl %ecx
+; NOBMI2-NEXT: andl %eax, %ecx
+; NOBMI2-NEXT: leal (%rcx,%rcx), %eax
+; NOBMI2-NEXT: xorl %ecx, %eax
+; NOBMI2-NEXT: leal (,%rcx,4), %edi
+; NOBMI2-NEXT: leal (,%rcx,8), %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: xorl %eax, %r8d
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $4, %eax
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $5, %edi
+; NOBMI2-NEXT: xorl %eax, %edi
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $6, %eax
+; NOBMI2-NEXT: xorl %edi, %eax
+; NOBMI2-NEXT: xorl %r8d, %eax
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $7, %edi
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $8, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $9, %edi
+; NOBMI2-NEXT: xorl %r8d, %edi
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $10, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: xorl %eax, %r8d
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $11, %eax
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $12, %edi
+; NOBMI2-NEXT: xorl %eax, %edi
+; NOBMI2-NEXT: movl %ecx, %r9d
+; NOBMI2-NEXT: shll $13, %r9d
+; NOBMI2-NEXT: xorl %edi, %r9d
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $14, %eax
+; NOBMI2-NEXT: xorl %r9d, %eax
+; NOBMI2-NEXT: xorl %r8d, %eax
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: andl %edx, %r8d
+; NOBMI2-NEXT: movl %esi, %edi
+; NOBMI2-NEXT: andl %r8d, %edi
+; NOBMI2-NEXT: xorl %edi, %esi
+; NOBMI2-NEXT: movzwl %di, %edi
+; NOBMI2-NEXT: shrl $4, %edi
+; NOBMI2-NEXT: orl %esi, %edi
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: movzwl %r8w, %ebx
+; NOBMI2-NEXT: shrl $4, %ebx
+; NOBMI2-NEXT: orl %edx, %ebx
+; NOBMI2-NEXT: notl %eax
+; NOBMI2-NEXT: andl %ecx, %eax
+; NOBMI2-NEXT: leal (%rax,%rax), %ecx
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: leal (,%rax,4), %edx
+; NOBMI2-NEXT: leal (,%rax,8), %esi
+; NOBMI2-NEXT: xorl %edx, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $4, %ecx
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $5, %edx
+; NOBMI2-NEXT: xorl %ecx, %edx
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $6, %ecx
+; NOBMI2-NEXT: xorl %edx, %ecx
+; NOBMI2-NEXT: xorl %esi, %ecx
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $7, %edx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $8, %esi
+; NOBMI2-NEXT: xorl %edx, %esi
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $9, %edx
+; NOBMI2-NEXT: xorl %esi, %edx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $10, %esi
+; NOBMI2-NEXT: xorl %edx, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $11, %ecx
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $12, %edx
+; NOBMI2-NEXT: xorl %ecx, %edx
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $13, %ecx
+; NOBMI2-NEXT: xorl %edx, %ecx
+; NOBMI2-NEXT: shll $14, %eax
+; NOBMI2-NEXT: xorl %ecx, %eax
+; NOBMI2-NEXT: xorl %esi, %eax
+; NOBMI2-NEXT: andl %edi, %ebx
+; NOBMI2-NEXT: andl %eax, %ebx
+; NOBMI2-NEXT: xorl %ebx, %edi
+; NOBMI2-NEXT: movzbl %bh, %eax
+; NOBMI2-NEXT: orl %edi, %eax
+; NOBMI2-NEXT: # kill: def $ax killed $ax killed $eax
+; NOBMI2-NEXT: popq %rbx
+; NOBMI2-NEXT: retq
+ %res = call i16 @llvm.bext.i16(i16 %val, i16 %mask)
+ ret i16 %res
+}
+
+define i32 @bext_i32(i32 %val, i32 %mask) nounwind {
+; BMI2-LABEL: bext_i32:
+; BMI2: # %bb.0:
+; BMI2-NEXT: pextl %esi, %edi, %eax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bext_i32:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: andl %esi, %edi
+; NOBMI2-NEXT: movl %esi, %eax
+; NOBMI2-NEXT: notl %eax
+; NOBMI2-NEXT: leal (,%rax,4), %edx
+; NOBMI2-NEXT: leal (%rax,%rax), %ecx
+; NOBMI2-NEXT: xorl %ecx, %edx
+; NOBMI2-NEXT: leal (,%rax,8), %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $4, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: xorl %edx, %r9d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $5, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $6, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $7, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: xorl %r9d, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $8, %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $9, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $10, %r8d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $11, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: xorl %edx, %r9d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $12, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $13, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $14, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $15, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %eax, %r10d
+; NOBMI2-NEXT: shll $16, %r10d
+; NOBMI2-NEXT: xorl %r8d, %r10d
+; NOBMI2-NEXT: xorl %r9d, %r10d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $17, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $18, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $19, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $20, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $21, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $22, %edx
+; NOBMI2-NEXT: xorl %r9d, %edx
+; NOBMI2-NEXT: xorl %r10d, %edx
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $23, %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $24, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $25, %r8d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $26, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $27, %r8d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $28, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %eax, %r8d
+; NOBMI2-NEXT: shll $29, %r8d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: shll $30, %edx
+; NOBMI2-NEXT: shll $31, %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: xorl %r8d, %eax
+; NOBMI2-NEXT: movl %eax, %edx
+; NOBMI2-NEXT: andl %esi, %edx
+; NOBMI2-NEXT: movl %edi, %r8d
+; NOBMI2-NEXT: andl %edx, %r8d
+; NOBMI2-NEXT: xorl %r8d, %edi
+; NOBMI2-NEXT: shrl %r8d
+; NOBMI2-NEXT: orl %edi, %r8d
+; NOBMI2-NEXT: xorl %edx, %esi
+; NOBMI2-NEXT: shrl %edx
+; NOBMI2-NEXT: orl %esi, %edx
+; NOBMI2-NEXT: notl %eax
+; NOBMI2-NEXT: andl %ecx, %eax
+; NOBMI2-NEXT: leal (%rax,%rax), %ecx
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: leal (,%rax,4), %esi
+; NOBMI2-NEXT: leal (,%rax,8), %edi
+; NOBMI2-NEXT: xorl %esi, %edi
+; NOBMI2-NEXT: xorl %ecx, %edi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $4, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $5, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $6, %ecx
+; NOBMI2-NEXT: xorl %esi, %ecx
+; NOBMI2-NEXT: xorl %edi, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $7, %esi
+; NOBMI2-NEXT: movl %eax, %edi
+; NOBMI2-NEXT: shll $8, %edi
+; NOBMI2-NEXT: xorl %esi, %edi
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $9, %esi
+; NOBMI2-NEXT: xorl %edi, %esi
+; NOBMI2-NEXT: movl %eax, %edi
+; NOBMI2-NEXT: shll $10, %edi
+; NOBMI2-NEXT: xorl %esi, %edi
+; NOBMI2-NEXT: xorl %ecx, %edi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $11, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $12, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $13, %ecx
+; NOBMI2-NEXT: xorl %esi, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $14, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %r9d
+; NOBMI2-NEXT: shll $15, %r9d
+; NOBMI2-NEXT: xorl %esi, %r9d
+; NOBMI2-NEXT: xorl %edi, %r9d
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $16, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $17, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $18, %ecx
+; NOBMI2-NEXT: xorl %esi, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $19, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %edi
+; NOBMI2-NEXT: shll $20, %edi
+; NOBMI2-NEXT: xorl %esi, %edi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $21, %ecx
+; NOBMI2-NEXT: xorl %edi, %ecx
+; NOBMI2-NEXT: xorl %r9d, %ecx
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $22, %esi
+; NOBMI2-NEXT: movl %eax, %edi
+; NOBMI2-NEXT: shll $23, %edi
+; NOBMI2-NEXT: xorl %esi, %edi
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $24, %esi
+; NOBMI2-NEXT: xorl %edi, %esi
+; NOBMI2-NEXT: movl %eax, %edi
+; NOBMI2-NEXT: shll $25, %edi
+; NOBMI2-NEXT: xorl %esi, %edi
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $26, %esi
+; NOBMI2-NEXT: xorl %edi, %esi
+; NOBMI2-NEXT: movl %eax, %edi
+; NOBMI2-NEXT: shll $27, %edi
+; NOBMI2-NEXT: xorl %esi, %edi
+; NOBMI2-NEXT: movl %eax, %esi
+; NOBMI2-NEXT: shll $28, %esi
+; NOBMI2-NEXT: xorl %edi, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %eax, %edi
+; NOBMI2-NEXT: shll $29, %edi
+; NOBMI2-NEXT: movl %eax, %ecx
+; NOBMI2-NEXT: shll $30, %ecx
+; NOBMI2-NEXT: xorl %edi, %ecx
+; NOBMI2-NEXT: xorl %esi, %ecx
+; NOBMI2-NEXT: movl %ecx, %esi
+; NOBMI2-NEXT: andl %edx, %esi
+; NOBMI2-NEXT: movl %r8d, %r9d
+; NOBMI2-NEXT: andl %esi, %r9d
+; NOBMI2-NEXT: xorl %r9d, %r8d
+; NOBMI2-NEXT: shrl $2, %r9d
+; NOBMI2-NEXT: orl %r8d, %r9d
+; NOBMI2-NEXT: xorl %esi, %edx
+; NOBMI2-NEXT: shrl $2, %esi
+; NOBMI2-NEXT: orl %edx, %esi
+; NOBMI2-NEXT: notl %ecx
+; NOBMI2-NEXT: andl %eax, %ecx
+; NOBMI2-NEXT: leal (%rcx,%rcx), %eax
+; NOBMI2-NEXT: xorl %ecx, %eax
+; NOBMI2-NEXT: leal (,%rcx,4), %edx
+; NOBMI2-NEXT: leal (,%rcx,8), %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: xorl %eax, %edi
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $4, %eax
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $5, %edx
+; NOBMI2-NEXT: xorl %eax, %edx
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $6, %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: xorl %edi, %eax
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $7, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $8, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $9, %edx
+; NOBMI2-NEXT: xorl %edi, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $10, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: xorl %eax, %edi
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $11, %eax
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $12, %edx
+; NOBMI2-NEXT: xorl %eax, %edx
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $13, %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $14, %edx
+; NOBMI2-NEXT: xorl %eax, %edx
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $15, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $16, %eax
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $17, %edx
+; NOBMI2-NEXT: xorl %eax, %edx
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $18, %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $19, %edx
+; NOBMI2-NEXT: xorl %eax, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $20, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $21, %eax
+; NOBMI2-NEXT: xorl %edi, %eax
+; NOBMI2-NEXT: xorl %r8d, %eax
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $22, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $23, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $24, %edx
+; NOBMI2-NEXT: xorl %edi, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $25, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $26, %edx
+; NOBMI2-NEXT: xorl %edi, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $27, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $28, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: xorl %eax, %r8d
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: shll $29, %eax
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $30, %edx
+; NOBMI2-NEXT: xorl %eax, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: movl %edx, %edi
+; NOBMI2-NEXT: andl %esi, %edi
+; NOBMI2-NEXT: movl %r9d, %r8d
+; NOBMI2-NEXT: andl %edi, %r8d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: shrl $4, %r8d
+; NOBMI2-NEXT: orl %r9d, %r8d
+; NOBMI2-NEXT: xorl %edi, %esi
+; NOBMI2-NEXT: shrl $4, %edi
+; NOBMI2-NEXT: orl %esi, %edi
+; NOBMI2-NEXT: notl %edx
+; NOBMI2-NEXT: andl %ecx, %edx
+; NOBMI2-NEXT: leal (%rdx,%rdx), %eax
+; NOBMI2-NEXT: xorl %edx, %eax
+; NOBMI2-NEXT: leal (,%rdx,4), %ecx
+; NOBMI2-NEXT: leal (,%rdx,8), %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: xorl %eax, %esi
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $4, %eax
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $5, %ecx
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $6, %eax
+; NOBMI2-NEXT: xorl %ecx, %eax
+; NOBMI2-NEXT: xorl %esi, %eax
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $7, %ecx
+; NOBMI2-NEXT: movl %edx, %esi
+; NOBMI2-NEXT: shll $8, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $9, %ecx
+; NOBMI2-NEXT: xorl %esi, %ecx
+; NOBMI2-NEXT: movl %edx, %esi
+; NOBMI2-NEXT: shll $10, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: xorl %eax, %esi
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $11, %eax
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $12, %ecx
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $13, %eax
+; NOBMI2-NEXT: xorl %ecx, %eax
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $14, %ecx
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: movl %edx, %r9d
+; NOBMI2-NEXT: shll $15, %r9d
+; NOBMI2-NEXT: xorl %ecx, %r9d
+; NOBMI2-NEXT: xorl %esi, %r9d
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $16, %eax
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $17, %ecx
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $18, %eax
+; NOBMI2-NEXT: xorl %ecx, %eax
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $19, %ecx
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: movl %edx, %esi
+; NOBMI2-NEXT: shll $20, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $21, %eax
+; NOBMI2-NEXT: xorl %esi, %eax
+; NOBMI2-NEXT: xorl %r9d, %eax
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $22, %ecx
+; NOBMI2-NEXT: movl %edx, %esi
+; NOBMI2-NEXT: shll $23, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $24, %ecx
+; NOBMI2-NEXT: xorl %esi, %ecx
+; NOBMI2-NEXT: movl %edx, %esi
+; NOBMI2-NEXT: shll $25, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $26, %ecx
+; NOBMI2-NEXT: xorl %esi, %ecx
+; NOBMI2-NEXT: movl %edx, %esi
+; NOBMI2-NEXT: shll $27, %esi
+; NOBMI2-NEXT: xorl %ecx, %esi
+; NOBMI2-NEXT: movl %edx, %r9d
+; NOBMI2-NEXT: shll $28, %r9d
+; NOBMI2-NEXT: xorl %esi, %r9d
+; NOBMI2-NEXT: xorl %eax, %r9d
+; NOBMI2-NEXT: movl %edx, %eax
+; NOBMI2-NEXT: shll $29, %eax
+; NOBMI2-NEXT: movl %edx, %ecx
+; NOBMI2-NEXT: shll $30, %ecx
+; NOBMI2-NEXT: xorl %eax, %ecx
+; NOBMI2-NEXT: xorl %r9d, %ecx
+; NOBMI2-NEXT: movl %ecx, %eax
+; NOBMI2-NEXT: andl %edi, %eax
+; NOBMI2-NEXT: movl %r8d, %esi
+; NOBMI2-NEXT: andl %eax, %esi
+; NOBMI2-NEXT: xorl %esi, %r8d
+; NOBMI2-NEXT: shrl $8, %esi
+; NOBMI2-NEXT: orl %r8d, %esi
+; NOBMI2-NEXT: xorl %eax, %edi
+; NOBMI2-NEXT: shrl $8, %eax
+; NOBMI2-NEXT: orl %edi, %eax
+; NOBMI2-NEXT: notl %ecx
+; NOBMI2-NEXT: andl %edx, %ecx
+; NOBMI2-NEXT: leal (%rcx,%rcx), %edx
+; NOBMI2-NEXT: xorl %ecx, %edx
+; NOBMI2-NEXT: leal (,%rcx,4), %edi
+; NOBMI2-NEXT: leal (,%rcx,8), %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $4, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $5, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $6, %edx
+; NOBMI2-NEXT: xorl %edi, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $7, %edi
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $8, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $9, %edi
+; NOBMI2-NEXT: xorl %r8d, %edi
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $10, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: xorl %edx, %r8d
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $11, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $12, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $13, %edx
+; NOBMI2-NEXT: xorl %edi, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $14, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %r9d
+; NOBMI2-NEXT: shll $15, %r9d
+; NOBMI2-NEXT: xorl %edi, %r9d
+; NOBMI2-NEXT: xorl %r8d, %r9d
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $16, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $17, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $18, %edx
+; NOBMI2-NEXT: xorl %edi, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $19, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $20, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $21, %edx
+; NOBMI2-NEXT: xorl %r8d, %edx
+; NOBMI2-NEXT: xorl %r9d, %edx
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $22, %edi
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $23, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $24, %edi
+; NOBMI2-NEXT: xorl %r8d, %edi
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $25, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $26, %edi
+; NOBMI2-NEXT: xorl %r8d, %edi
+; NOBMI2-NEXT: movl %ecx, %r8d
+; NOBMI2-NEXT: shll $27, %r8d
+; NOBMI2-NEXT: xorl %edi, %r8d
+; NOBMI2-NEXT: movl %ecx, %edi
+; NOBMI2-NEXT: shll $28, %edi
+; NOBMI2-NEXT: xorl %r8d, %edi
+; NOBMI2-NEXT: xorl %edx, %edi
+; NOBMI2-NEXT: movl %ecx, %edx
+; NOBMI2-NEXT: shll $29, %edx
+; NOBMI2-NEXT: shll $30, %ecx
+; NOBMI2-NEXT: xorl %edx, %ecx
+; NOBMI2-NEXT: xorl %edi, %ecx
+; NOBMI2-NEXT: andl %esi, %eax
+; NOBMI2-NEXT: andl %ecx, %eax
+; NOBMI2-NEXT: xorl %eax, %esi
+; NOBMI2-NEXT: shrl $16, %eax
+; NOBMI2-NEXT: orl %esi, %eax
+; NOBMI2-NEXT: retq
+ %res = call i32 @llvm.bext.i32(i32 %val, i32 %mask)
+ ret i32 %res
+}
+
+define i64 @bext_i64(i64 %val, i64 %mask) nounwind {
+; BMI2-LABEL: bext_i64:
+; BMI2: # %bb.0:
+; BMI2-NEXT: pextq %rsi, %rdi, %rax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bext_i64:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: andq %rsi, %rdi
+; NOBMI2-NEXT: movq %rsi, %rax
+; NOBMI2-NEXT: notq %rax
+; NOBMI2-NEXT: leaq (,%rax,4), %rdx
+; NOBMI2-NEXT: leaq (%rax,%rax), %rcx
+; NOBMI2-NEXT: xorq %rcx, %rdx
+; NOBMI2-NEXT: leaq (,%rax,8), %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $4, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $5, %rdx
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $6, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $7, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $8, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $9, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $10, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $11, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $12, %rdx
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $13, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $14, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $15, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $16, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $17, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $18, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $19, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $20, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r10
+; NOBMI2-NEXT: shlq $21, %r10
+; NOBMI2-NEXT: xorq %r9, %r10
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $22, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $23, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $24, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $25, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $26, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $27, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $28, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $29, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $30, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $31, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $32, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $33, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $34, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $35, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r10
+; NOBMI2-NEXT: shlq $36, %r10
+; NOBMI2-NEXT: xorq %r9, %r10
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $37, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $38, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $39, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $40, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $41, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $42, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $43, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $44, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $45, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $46, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $47, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $48, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $49, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $50, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $51, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $52, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $53, %r8
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $54, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rax, %r10
+; NOBMI2-NEXT: shlq $55, %r10
+; NOBMI2-NEXT: xorq %r9, %r10
+; NOBMI2-NEXT: movq %rax, %r8
+; NOBMI2-NEXT: shlq $56, %r8
+; NOBMI2-NEXT: xorq %r10, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $57, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $58, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $59, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $60, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: shlq $61, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $62, %r9
+; NOBMI2-NEXT: xorq %rdx, %r9
+; NOBMI2-NEXT: shlq $63, %rax
+; NOBMI2-NEXT: xorq %r9, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: andq %rsi, %rdx
+; NOBMI2-NEXT: movq %rdi, %r8
+; NOBMI2-NEXT: andq %rdx, %r8
+; NOBMI2-NEXT: xorq %r8, %rdi
+; NOBMI2-NEXT: shrq %r8
+; NOBMI2-NEXT: orq %rdi, %r8
+; NOBMI2-NEXT: xorq %rdx, %rsi
+; NOBMI2-NEXT: shrq %rdx
+; NOBMI2-NEXT: orq %rsi, %rdx
+; NOBMI2-NEXT: notq %rax
+; NOBMI2-NEXT: andq %rcx, %rax
+; NOBMI2-NEXT: leaq (%rax,%rax), %rcx
+; NOBMI2-NEXT: xorq %rax, %rcx
+; NOBMI2-NEXT: leaq (,%rax,4), %rsi
+; NOBMI2-NEXT: leaq (,%rax,8), %rdi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $4, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $5, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $6, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $7, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $8, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $9, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $10, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $11, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $12, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $13, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $14, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $15, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $16, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $17, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $18, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $19, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $20, %r9
+; NOBMI2-NEXT: xorq %rdi, %r9
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $21, %rsi
+; NOBMI2-NEXT: xorq %r9, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $22, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $23, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $24, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $25, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $26, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $27, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $28, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $29, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $30, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $31, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $32, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $33, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $34, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $35, %r9
+; NOBMI2-NEXT: xorq %rdi, %r9
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $36, %rsi
+; NOBMI2-NEXT: xorq %r9, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $37, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $38, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $39, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $40, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $41, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $42, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $43, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $44, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $45, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $46, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $47, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $48, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $49, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $50, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $51, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $52, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $53, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $54, %r9
+; NOBMI2-NEXT: xorq %rdi, %r9
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $55, %rsi
+; NOBMI2-NEXT: xorq %r9, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $56, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $57, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $58, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $59, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $60, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $61, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $62, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rcx, %rsi
+; NOBMI2-NEXT: andq %rdx, %rsi
+; NOBMI2-NEXT: movq %r8, %rdi
+; NOBMI2-NEXT: andq %rsi, %rdi
+; NOBMI2-NEXT: xorq %rdi, %r8
+; NOBMI2-NEXT: shrq $2, %rdi
+; NOBMI2-NEXT: orq %r8, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdx
+; NOBMI2-NEXT: shrq $2, %rsi
+; NOBMI2-NEXT: orq %rdx, %rsi
+; NOBMI2-NEXT: notq %rcx
+; NOBMI2-NEXT: andq %rax, %rcx
+; NOBMI2-NEXT: leaq (%rcx,%rcx), %rax
+; NOBMI2-NEXT: xorq %rcx, %rax
+; NOBMI2-NEXT: leaq (,%rcx,4), %rdx
+; NOBMI2-NEXT: leaq (,%rcx,8), %r8
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $4, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $5, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $6, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $7, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $8, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $9, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $10, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $11, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $12, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $13, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $14, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $15, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $16, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $17, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $18, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $19, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %r9
+; NOBMI2-NEXT: shlq $20, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $21, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $22, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $23, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $24, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $25, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $26, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $27, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $28, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $29, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $30, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $31, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $32, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $33, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $34, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %r9
+; NOBMI2-NEXT: shlq $35, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $36, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $37, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $38, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $39, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $40, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $41, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $42, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $43, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $44, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $45, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $46, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $47, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $48, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $49, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $50, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $51, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $52, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $53, %r8
+; NOBMI2-NEXT: xorq %rdx, %r8
+; NOBMI2-NEXT: movq %rcx, %r9
+; NOBMI2-NEXT: shlq $54, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $55, %rdx
+; NOBMI2-NEXT: xorq %r9, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $56, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $57, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $58, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $59, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $60, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $61, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $62, %rax
+; NOBMI2-NEXT: xorq %r8, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rax, %rdx
+; NOBMI2-NEXT: andq %rsi, %rdx
+; NOBMI2-NEXT: movq %rdi, %r8
+; NOBMI2-NEXT: andq %rdx, %r8
+; NOBMI2-NEXT: xorq %r8, %rdi
+; NOBMI2-NEXT: shrq $4, %r8
+; NOBMI2-NEXT: orq %rdi, %r8
+; NOBMI2-NEXT: xorq %rdx, %rsi
+; NOBMI2-NEXT: shrq $4, %rdx
+; NOBMI2-NEXT: orq %rsi, %rdx
+; NOBMI2-NEXT: notq %rax
+; NOBMI2-NEXT: andq %rcx, %rax
+; NOBMI2-NEXT: leaq (%rax,%rax), %rcx
+; NOBMI2-NEXT: xorq %rax, %rcx
+; NOBMI2-NEXT: leaq (,%rax,4), %rsi
+; NOBMI2-NEXT: leaq (,%rax,8), %rdi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $4, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $5, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $6, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $7, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $8, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $9, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $10, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $11, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $12, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $13, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $14, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $15, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $16, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $17, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $18, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $19, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $20, %r9
+; NOBMI2-NEXT: xorq %rdi, %r9
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $21, %rsi
+; NOBMI2-NEXT: xorq %r9, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $22, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $23, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $24, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $25, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $26, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $27, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $28, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $29, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $30, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $31, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $32, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $33, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $34, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $35, %r9
+; NOBMI2-NEXT: xorq %rdi, %r9
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $36, %rsi
+; NOBMI2-NEXT: xorq %r9, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $37, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $38, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $39, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $40, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $41, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $42, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $43, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $44, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $45, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $46, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $47, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $48, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $49, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $50, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $51, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $52, %rsi
+; NOBMI2-NEXT: xorq %rdi, %rsi
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $53, %rdi
+; NOBMI2-NEXT: xorq %rsi, %rdi
+; NOBMI2-NEXT: movq %rax, %r9
+; NOBMI2-NEXT: shlq $54, %r9
+; NOBMI2-NEXT: xorq %rdi, %r9
+; NOBMI2-NEXT: movq %rax, %rsi
+; NOBMI2-NEXT: shlq $55, %rsi
+; NOBMI2-NEXT: xorq %r9, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $56, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $57, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $58, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $59, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $60, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: movq %rax, %rdi
+; NOBMI2-NEXT: shlq $61, %rdi
+; NOBMI2-NEXT: xorq %rcx, %rdi
+; NOBMI2-NEXT: movq %rax, %rcx
+; NOBMI2-NEXT: shlq $62, %rcx
+; NOBMI2-NEXT: xorq %rdi, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rcx, %rsi
+; NOBMI2-NEXT: andq %rdx, %rsi
+; NOBMI2-NEXT: movq %r8, %r9
+; NOBMI2-NEXT: andq %rsi, %r9
+; NOBMI2-NEXT: xorq %r9, %r8
+; NOBMI2-NEXT: shrq $8, %r9
+; NOBMI2-NEXT: orq %r8, %r9
+; NOBMI2-NEXT: xorq %rsi, %rdx
+; NOBMI2-NEXT: shrq $8, %rsi
+; NOBMI2-NEXT: orq %rdx, %rsi
+; NOBMI2-NEXT: notq %rcx
+; NOBMI2-NEXT: andq %rax, %rcx
+; NOBMI2-NEXT: leaq (%rcx,%rcx), %rax
+; NOBMI2-NEXT: xorq %rcx, %rax
+; NOBMI2-NEXT: leaq (,%rcx,4), %rdx
+; NOBMI2-NEXT: leaq (,%rcx,8), %rdi
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $4, %rax
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $5, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $6, %rax
+; NOBMI2-NEXT: xorq %rdi, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $7, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $8, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $9, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $10, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $11, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $12, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $13, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $14, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $15, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: xorq %rdi, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $16, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $17, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $18, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $19, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $20, %r8
+; NOBMI2-NEXT: xorq %rdi, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $21, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $22, %rax
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $23, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $24, %rax
+; NOBMI2-NEXT: xorq %rdi, %rax
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $25, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $26, %rax
+; NOBMI2-NEXT: xorq %rdi, %rax
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $27, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $28, %rax
+; NOBMI2-NEXT: xorq %rdi, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $29, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $30, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $31, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $32, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $33, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $34, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $35, %r8
+; NOBMI2-NEXT: xorq %rdi, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $36, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $37, %rax
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $38, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $39, %rax
+; NOBMI2-NEXT: xorq %rdi, %rax
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $40, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $41, %rax
+; NOBMI2-NEXT: xorq %rdi, %rax
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $42, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $43, %rax
+; NOBMI2-NEXT: xorq %rdi, %rax
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $44, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $45, %rax
+; NOBMI2-NEXT: xorq %rdi, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $46, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $47, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $48, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $49, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $50, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $51, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $52, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $53, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $54, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: movq %rcx, %rdi
+; NOBMI2-NEXT: shlq $55, %rdi
+; NOBMI2-NEXT: xorq %rdx, %rdi
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $56, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $57, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $58, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $59, %rdx
+; NOBMI2-NEXT: xorq %rax, %rdx
+; NOBMI2-NEXT: movq %rcx, %rax
+; NOBMI2-NEXT: shlq $60, %rax
+; NOBMI2-NEXT: xorq %rdx, %rax
+; NOBMI2-NEXT: movq %rcx, %r8
+; NOBMI2-NEXT: shlq $61, %r8
+; NOBMI2-NEXT: xorq %rax, %r8
+; NOBMI2-NEXT: movq %rcx, %rdx
+; NOBMI2-NEXT: shlq $62, %rdx
+; NOBMI2-NEXT: xorq %r8, %rdx
+; NOBMI2-NEXT: xorq %rdi, %rdx
+; NOBMI2-NEXT: movq %rdx, %rax
+; NOBMI2-NEXT: andq %rsi, %rax
+; NOBMI2-NEXT: movq %r9, %rdi
+; NOBMI2-NEXT: andq %rax, %rdi
+; NOBMI2-NEXT: xorq %rdi, %r9
+; NOBMI2-NEXT: shrq $16, %rdi
+; NOBMI2-NEXT: orq %r9, %rdi
+; NOBMI2-NEXT: xorq %rax, %rsi
+; NOBMI2-NEXT: shrq $16, %rax
+; NOBMI2-NEXT: orq %rsi, %rax
+; NOBMI2-NEXT: notq %rdx
+; NOBMI2-NEXT: andq %rcx, %rdx
+; NOBMI2-NEXT: leaq (%rdx,%rdx), %rcx
+; NOBMI2-NEXT: xorq %rdx, %rcx
+; NOBMI2-NEXT: leaq (,%rdx,4), %rsi
+; NOBMI2-NEXT: leaq (,%rdx,8), %r8
+; NOBMI2-NEXT: xorq %r8, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $4, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $5, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $6, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $7, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $8, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $9, %rsi
+; NOBMI2-NEXT: xorq %r8, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $10, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $11, %rcx
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $12, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $13, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $14, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $15, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $16, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $17, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $18, %rsi
+; NOBMI2-NEXT: xorq %r8, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $19, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $20, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $21, %rsi
+; NOBMI2-NEXT: xorq %r9, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $22, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $23, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $24, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $25, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $26, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $27, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $28, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $29, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $30, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $31, %rsi
+; NOBMI2-NEXT: xorq %r8, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $32, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $33, %rsi
+; NOBMI2-NEXT: xorq %r8, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $34, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $35, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $36, %rsi
+; NOBMI2-NEXT: xorq %r9, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $37, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $38, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $39, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $40, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $41, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $42, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $43, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $44, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $45, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: xorq %rsi, %rcx
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $46, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $47, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $48, %rsi
+; NOBMI2-NEXT: xorq %r8, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $49, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $50, %rsi
+; NOBMI2-NEXT: xorq %r8, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $51, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $52, %rsi
+; NOBMI2-NEXT: xorq %r8, %rsi
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $53, %r8
+; NOBMI2-NEXT: xorq %rsi, %r8
+; NOBMI2-NEXT: movq %rdx, %r9
+; NOBMI2-NEXT: shlq $54, %r9
+; NOBMI2-NEXT: xorq %r8, %r9
+; NOBMI2-NEXT: movq %rdx, %rsi
+; NOBMI2-NEXT: shlq $55, %rsi
+; NOBMI2-NEXT: xorq %r9, %rsi
+; NOBMI2-NEXT: xorq %rcx, %rsi
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $56, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $57, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $58, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $59, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $60, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: movq %rdx, %r8
+; NOBMI2-NEXT: shlq $61, %r8
+; NOBMI2-NEXT: xorq %rcx, %r8
+; NOBMI2-NEXT: movq %rdx, %rcx
+; NOBMI2-NEXT: shlq $62, %rcx
+; NOBMI2-NEXT: xorq %r8, %rcx
+; NOBMI2-NEXT: shlq $63, %rdx
+; NOBMI2-NEXT: xorq %rcx, %rdx
+; NOBMI2-NEXT: xorq %rsi, %rdx
+; NOBMI2-NEXT: andq %rdi, %rax
+; NOBMI2-NEXT: andq %rdx, %rax
+; NOBMI2-NEXT: xorq %rax, %rdi
+; NOBMI2-NEXT: shrq $32, %rax
+; NOBMI2-NEXT: orq %rdi, %rax
+; NOBMI2-NEXT: retq
+ %res = call i64 @llvm.bext.i64(i64 %val, i64 %mask)
+ ret i64 %res
+}
+
+define i32 @bext_mask_zero(i32 %val) nounwind {
+; BMI2-LABEL: bext_mask_zero:
+; BMI2: # %bb.0:
+; BMI2-NEXT: xorl %eax, %eax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bext_mask_zero:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: xorl %eax, %eax
+; NOBMI2-NEXT: retq
+ %res = call i32 @llvm.bext.i32(i32 %val, i32 0)
+ ret i32 %res
+}
+
+define i32 @bext_mask_allones(i32 %val) nounwind {
+; BMI2-LABEL: bext_mask_allones:
+; BMI2: # %bb.0:
+; BMI2-NEXT: movl %edi, %eax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bext_mask_allones:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: movl %edi, %eax
+; NOBMI2-NEXT: retq
+ %res = call i32 @llvm.bext.i32(i32 %val, i32 -1)
+ ret i32 %res
+}
+
+define i32 @bext_const_fold() nounwind {
+; BMI2-LABEL: bext_const_fold:
+; BMI2: # %bb.0:
+; BMI2-NEXT: movl $10, %eax
+; BMI2-NEXT: retq
+;
+; NOBMI2-LABEL: bext_const_fold:
+; NOBMI2: # %bb.0:
+; NOBMI2-NEXT: movl $10, %eax
+; NOBMI2-NEXT: retq
+ %res = call i32 @llvm.bext.i32(i32 170, i32 204)
+ ret i32 %res
+}
+
diff --git a/llvm/unittests/Support/KnownBitsTest.cpp b/llvm/unittests/Support/KnownBitsTest.cpp
index a314a8b40fbe8..0303b2f121c3b 100644
--- a/llvm/unittests/Support/KnownBitsTest.cpp
+++ b/llvm/unittests/Support/KnownBitsTest.cpp
@@ -635,8 +635,6 @@ TEST(KnownBitsTest, BinaryExhaustive) {
testBinaryOpExhaustive("avgCeilS", KnownBits::avgCeilS, APIntOps::avgCeilS);
testBinaryOpExhaustive("clmul", KnownBits::clmul, APIntOps::clmul);
- testBinaryOpExhaustive("bext", KnownBits::bext, APIntOps::compressBits);
- testBinaryOpExhaustive("bdep", KnownBits::bdep, APIntOps::expandBits);
}
TEST(KnownBitsTest, UnaryExhaustive) {
>From f21515022554609125db9ccadee503e78a16b976 Mon Sep 17 00:00:00 2001
From: Eisenwave <me at eisenwave.net>
Date: Sun, 31 May 2026 06:45:33 +0200
Subject: [PATCH 3/6] Rename BEXT/BDEP to PEXT/PDEP
---
llvm/docs/LangRef.rst | 42 ++++++------
llvm/include/llvm/CodeGen/ISDOpcodes.h | 4 +-
llvm/include/llvm/CodeGen/TargetLowering.h | 4 +-
llvm/include/llvm/IR/Intrinsics.td | 4 +-
.../include/llvm/Target/TargetSelectionDAG.td | 4 +-
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 28 ++++----
llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 12 ++--
.../SelectionDAG/LegalizeIntegerTypes.cpp | 40 ++++++------
llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h | 8 +--
.../SelectionDAG/LegalizeVectorOps.cpp | 8 +--
.../SelectionDAG/LegalizeVectorTypes.cpp | 12 ++--
.../lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 4 +-
.../SelectionDAG/SelectionDAGBuilder.cpp | 8 +--
.../SelectionDAG/SelectionDAGDumper.cpp | 4 +-
.../CodeGen/SelectionDAG/TargetLowering.cpp | 4 +-
llvm/lib/CodeGen/TargetLoweringBase.cpp | 2 +-
.../Target/AArch64/AArch64ISelLowering.cpp | 18 +++---
llvm/lib/Target/X86/X86ISelLowering.cpp | 8 +--
llvm/lib/Target/X86/X86InstrMisc.td | 33 +++++-----
.../test/CodeGen/AArch64/{bdep.ll => pdep.ll} | 64 +++++++++----------
.../test/CodeGen/AArch64/{bext.ll => pext.ll} | 64 +++++++++----------
llvm/test/CodeGen/X86/{bdep.ll => pdep.ll} | 56 ++++++++--------
llvm/test/CodeGen/X86/{bext.ll => pext.ll} | 56 ++++++++--------
23 files changed, 243 insertions(+), 244 deletions(-)
rename llvm/test/CodeGen/AArch64/{bdep.ll => pdep.ll} (98%)
rename llvm/test/CodeGen/AArch64/{bext.ll => pext.ll} (98%)
rename llvm/test/CodeGen/X86/{bdep.ll => pdep.ll} (98%)
rename llvm/test/CodeGen/X86/{bext.ll => pext.ll} (98%)
diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst
index 7329f02b582c9..b77cab2f404ca 100644
--- a/llvm/docs/LangRef.rst
+++ b/llvm/docs/LangRef.rst
@@ -19242,27 +19242,27 @@ Example:
%r = call i4 @llvm.clmul.i4(i4 -4, i4 2) ; %r = -8
%r = call i4 @llvm.clmul.i4(i4 -4, i4 -5) ; %r = 4
-.. _int_bext:
+.. _int_pext:
-'``llvm.bext.*``' Intrinsic
+'``llvm.pext.*``' Intrinsic
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Syntax:
"""""""
-This is an overloaded intrinsic. You can use ``llvm.bext`` on any integer
+This is an overloaded intrinsic. You can use ``llvm.pext`` on any integer
or integer vector type.
::
- declare i32 @llvm.bext.i32(i32 %val, i32 %mask)
- declare i64 @llvm.bext.i64(i64 %val, i64 %mask)
- declare <4 x i32> @llvm.bext.v4i32(<4 x i32> %val, <4 x i32> %mask)
+ declare i32 @llvm.pext.i32(i32 %val, i32 %mask)
+ declare i64 @llvm.pext.i64(i64 %val, i64 %mask)
+ declare <4 x i32> @llvm.pext.v4i32(<4 x i32> %val, <4 x i32> %mask)
Overview:
"""""""""
-The '``llvm.bext``' family of intrinsic functions extracts the bits from ``val``
+The '``llvm.pext``' family of intrinsic functions extracts the bits from ``val``
where the ``mask`` has bits set and packs them contiguously in the low bits
of the result, same as the x86 ``PEXT`` instruction.
@@ -19275,7 +19275,7 @@ arguments and result must have the same type.
Semantics:
""""""""""
-The '``llvm.bext``' intrinsic extracts bits from the first argument
+The '``llvm.pext``' intrinsic extracts bits from the first argument
``val`` at the positions indicated by set bits in ``mask``, and packs
them contiguously into the low bits of the result. The remaining high
bits of the result are zero.
@@ -19286,30 +19286,30 @@ of ``val``.
.. code-block:: text
- %r = call i8 @llvm.bext.i8(i8 0b10101010, i8 0b11001100) ; %r = 0b00001010
- %r = call i8 @llvm.bext.i8(i8 0b11111111, i8 0b10101010) ; %r = 0b00001111
+ %r = call i8 @llvm.pext.i8(i8 0b10101010, i8 0b11001100) ; %r = 0b00001010
+ %r = call i8 @llvm.pext.i8(i8 0b11111111, i8 0b10101010) ; %r = 0b00001111
-.. _int_bdep:
+.. _int_pdep:
-'``llvm.bdep.*``' Intrinsic
+'``llvm.pdep.*``' Intrinsic
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Syntax:
"""""""
-This is an overloaded intrinsic. You can use ``llvm.bdep`` on any integer or
+This is an overloaded intrinsic. You can use ``llvm.pdep`` on any integer or
integer vector type.
::
- declare i32 @llvm.bdep.i32(i32 %val, i32 %mask)
- declare i64 @llvm.bdep.i64(i64 %val, i64 %mask)
- declare <4 x i32> @llvm.bdep.v4i32(<4 x i32> %val, <4 x i32> %mask)
+ declare i32 @llvm.pdep.i32(i32 %val, i32 %mask)
+ declare i64 @llvm.pdep.i64(i64 %val, i64 %mask)
+ declare <4 x i32> @llvm.pdep.v4i32(<4 x i32> %val, <4 x i32> %mask)
Overview:
"""""""""
-The '``llvm.bdep``' family of intrinsic functions deposits the low bits of
+The '``llvm.pdep``' family of intrinsic functions deposits the low bits of
``val`` into the result at the positions where ``mask`` has bits set, same as
the x86 ``PDEP`` instruction.
@@ -19322,7 +19322,7 @@ arguments and result must have the same type.
Semantics:
""""""""""
-The '``llvm.bdep``' intrinsic takes the low bits of the first argument
+The '``llvm.pdep``' intrinsic takes the low bits of the first argument
``val`` and scatters them to the bit positions in the result indicated by
set bits in ``mask``. Bits in the result at positions where ``mask`` is
zero are zero.
@@ -19331,12 +19331,12 @@ Equivalently, if the set bit positions in ``mask`` (from LSB to MSB) are
``p0, p1, ..., pk``, then result bit ``pi`` equals bit ``i`` of ``val``.
The operations satisfy the round-trip identity:
-``bdep(bext(val, mask), mask) == val & mask``.
+``pdep(pext(val, mask), mask) == val & mask``.
.. code-block:: text
- %r = call i8 @llvm.bdep.i8(i8 0b00001010, i8 0b11001100) ; %r = 0b10001000
- %r = call i8 @llvm.bdep.i8(i8 0b00001111, i8 0b10101010) ; %r = 0b10101010
+ %r = call i8 @llvm.pdep.i8(i8 0b00001010, i8 0b11001100) ; %r = 0b10001000
+ %r = call i8 @llvm.pdep.i8(i8 0b00001111, i8 0b10101010) ; %r = 0b10101010
.. _int_overflow:
diff --git a/llvm/include/llvm/CodeGen/ISDOpcodes.h b/llvm/include/llvm/CodeGen/ISDOpcodes.h
index ce6423a2e2726..740f851593e87 100644
--- a/llvm/include/llvm/CodeGen/ISDOpcodes.h
+++ b/llvm/include/llvm/CodeGen/ISDOpcodes.h
@@ -780,8 +780,8 @@ enum NodeType {
CLMULH,
/// Bit extract (compress) and bit deposit (expand).
- BEXT,
- BDEP,
+ PEXT,
+ PDEP,
/// Byte Swap and Counting operators.
BSWAP,
diff --git a/llvm/include/llvm/CodeGen/TargetLowering.h b/llvm/include/llvm/CodeGen/TargetLowering.h
index d40ed5eb35e75..3906a934f1f24 100644
--- a/llvm/include/llvm/CodeGen/TargetLowering.h
+++ b/llvm/include/llvm/CodeGen/TargetLowering.h
@@ -5575,12 +5575,12 @@ class LLVM_ABI TargetLowering : public TargetLoweringBase {
/// Expand bit extract (compress).
/// \param N Node to expand
/// \returns The expansion if successful, SDValue() otherwise
- SDValue expandBEXT(SDNode *N, SelectionDAG &DAG) const;
+ SDValue expandPEXT(SDNode *N, SelectionDAG &DAG) const;
/// Expand bit deposit (expand).
/// \param N Node to expand
/// \returns The expansion if successful, SDValue() otherwise
- SDValue expandBDEP(SDNode *N, SelectionDAG &DAG) const;
+ SDValue expandPDEP(SDNode *N, SelectionDAG &DAG) const;
/// Expand rotations.
/// \param N Node to expand
diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td
index 5aa34361a0987..7b2d798a14ada 100644
--- a/llvm/include/llvm/IR/Intrinsics.td
+++ b/llvm/include/llvm/IR/Intrinsics.td
@@ -1523,9 +1523,9 @@ let IntrProperties = [IntrNoMem, IntrSpeculatable, IntrNoCreateUndefOrPoison] in
[LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>]>;
def int_clmul : DefaultAttrsIntrinsic<[llvm_anyint_ty],
[LLVMMatchType<0>, LLVMMatchType<0>]>;
- def int_bext : DefaultAttrsIntrinsic<[llvm_anyint_ty],
+ def int_pext : DefaultAttrsIntrinsic<[llvm_anyint_ty],
[LLVMMatchType<0>, LLVMMatchType<0>]>;
- def int_bdep : DefaultAttrsIntrinsic<[llvm_anyint_ty],
+ def int_pdep : DefaultAttrsIntrinsic<[llvm_anyint_ty],
[LLVMMatchType<0>, LLVMMatchType<0>]>;
}
diff --git a/llvm/include/llvm/Target/TargetSelectionDAG.td b/llvm/include/llvm/Target/TargetSelectionDAG.td
index 70cbf13fcb237..fd22d4fb6352a 100644
--- a/llvm/include/llvm/Target/TargetSelectionDAG.td
+++ b/llvm/include/llvm/Target/TargetSelectionDAG.td
@@ -480,8 +480,8 @@ def clmul : SDNode<"ISD::CLMUL" , SDTIntBinOp,
[SDNPCommutative, SDNPAssociative]>;
def clmulr : SDNode<"ISD::CLMULR" , SDTIntBinOp, [SDNPCommutative]>;
def clmulh : SDNode<"ISD::CLMULH" , SDTIntBinOp, [SDNPCommutative]>;
-def bext : SDNode<"ISD::BEXT" , SDTIntBinOp>;
-def bdep : SDNode<"ISD::BDEP" , SDTIntBinOp>;
+def pext : SDNode<"ISD::PEXT" , SDTIntBinOp>;
+def pdep : SDNode<"ISD::PDEP" , SDTIntBinOp>;
def and : SDNode<"ISD::AND" , SDTIntBinOp,
[SDNPCommutative, SDNPAssociative]>;
def or : SDNode<"ISD::OR" , SDTIntBinOp,
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index b1367a8be17da..21282d7aafe3d 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -474,8 +474,8 @@ namespace {
SDValue visitABS(SDNode *N);
SDValue visitABS_MIN_POISON(SDNode *N);
SDValue visitCLMUL(SDNode *N);
- SDValue visitBEXT(SDNode *N);
- SDValue visitBDEP(SDNode *N);
+ SDValue visitPEXT(SDNode *N);
+ SDValue visitPDEP(SDNode *N);
SDValue visitBSWAP(SDNode *N);
SDValue visitBITREVERSE(SDNode *N);
SDValue visitCTLZ(SDNode *N);
@@ -1998,8 +1998,8 @@ SDValue DAGCombiner::visit(SDNode *N) {
case ISD::CLMUL:
case ISD::CLMULR:
case ISD::CLMULH: return visitCLMUL(N);
- case ISD::BEXT: return visitBEXT(N);
- case ISD::BDEP: return visitBDEP(N);
+ case ISD::PEXT: return visitPEXT(N);
+ case ISD::PDEP: return visitPDEP(N);
case ISD::BSWAP: return visitBSWAP(N);
case ISD::BITREVERSE: return visitBITREVERSE(N);
case ISD::CTLZ: return visitCTLZ(N);
@@ -12231,38 +12231,38 @@ SDValue DAGCombiner::visitCLMUL(SDNode *N) {
return SDValue();
}
-SDValue DAGCombiner::visitBEXT(SDNode *N) {
+SDValue DAGCombiner::visitPEXT(SDNode *N) {
EVT VT = N->getValueType(0);
SDValue N0 = N->getOperand(0);
SDValue N1 = N->getOperand(1);
SDLoc DL(N);
- // bext(x, 0) -> 0
+ // pext(x, 0) -> 0
if (isNullOrNullSplat(N1))
return DAG.getConstant(0, DL, VT);
- // bext(x, -1) -> x (all bits selected, packed into low positions = x)
+ // pext(x, -1) -> x (all bits selected, packed into low positions = x)
if (isAllOnesOrAllOnesSplat(N1))
return N0;
- // fold bext(c1, c2) -> compressBits(c1, c2)
- if (SDValue C = DAG.FoldConstantArithmetic(ISD::BEXT, DL, VT, {N0, N1}))
+ // fold pext(c1, c2) -> compressBits(c1, c2)
+ if (SDValue C = DAG.FoldConstantArithmetic(ISD::PEXT, DL, VT, {N0, N1}))
return C;
return SDValue();
}
-SDValue DAGCombiner::visitBDEP(SDNode *N) {
+SDValue DAGCombiner::visitPDEP(SDNode *N) {
EVT VT = N->getValueType(0);
SDValue N0 = N->getOperand(0);
SDValue N1 = N->getOperand(1);
SDLoc DL(N);
- // bdep(x, 0) -> 0
+ // pdep(x, 0) -> 0
if (isNullOrNullSplat(N1))
return DAG.getConstant(0, DL, VT);
- // bdep(x, -1) -> x (all positions selected, bits deposited at identity)
+ // pdep(x, -1) -> x (all positions selected, bits deposited at identity)
if (isAllOnesOrAllOnesSplat(N1))
return N0;
- // fold bdep(c1, c2) -> expandBits(c1, c2)
- if (SDValue C = DAG.FoldConstantArithmetic(ISD::BDEP, DL, VT, {N0, N1}))
+ // fold pdep(c1, c2) -> expandBits(c1, c2)
+ if (SDValue C = DAG.FoldConstantArithmetic(ISD::PDEP, DL, VT, {N0, N1}))
return C;
return SDValue();
}
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
index beaea49b0f5d8..90a59d2be7468 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -4196,11 +4196,11 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
if (SDValue Expanded = TLI.expandCLMUL(Node, DAG))
Results.push_back(Expanded);
break;
- case ISD::BEXT:
- Results.push_back(TLI.expandBEXT(Node, DAG));
+ case ISD::PEXT:
+ Results.push_back(TLI.expandPEXT(Node, DAG));
break;
- case ISD::BDEP:
- Results.push_back(TLI.expandBDEP(Node, DAG));
+ case ISD::PDEP:
+ Results.push_back(TLI.expandPDEP(Node, DAG));
break;
case ISD::SADDSAT:
case ISD::UADDSAT:
@@ -5572,8 +5572,8 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, OVT, CTLZResult));
break;
}
- case ISD::BEXT:
- case ISD::BDEP: {
+ case ISD::PEXT:
+ case ISD::PDEP: {
Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Node->getOperand(0));
Tmp2 = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Node->getOperand(1));
Tmp1 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2);
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
index dd166e2d3e5d2..e1ec867312a67 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
@@ -370,12 +370,12 @@ void DAGTypeLegalizer::PromoteIntegerResult(SDNode *N, unsigned ResNo) {
Res = PromoteIntRes_CLMUL(N);
break;
- case ISD::BEXT:
- Res = PromoteIntRes_BEXT(N);
+ case ISD::PEXT:
+ Res = PromoteIntRes_PEXT(N);
break;
- case ISD::BDEP:
- Res = PromoteIntRes_BDEP(N);
+ case ISD::PDEP:
+ Res = PromoteIntRes_PDEP(N);
break;
case ISD::IS_FPCLASS:
@@ -1771,28 +1771,28 @@ SDValue DAGTypeLegalizer::PromoteIntRes_CLMUL(SDNode *N) {
DAG.getShiftAmountConstant(ShAmt, VT, DL));
}
-SDValue DAGTypeLegalizer::PromoteIntRes_BEXT(SDNode *N) {
+SDValue DAGTypeLegalizer::PromoteIntRes_PEXT(SDNode *N) {
SDLoc DL(N);
EVT VT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
- if (!TLI.isOperationLegalOrCustomOrPromote(ISD::BEXT, VT)) {
- if (SDValue Res = TLI.expandBEXT(N, DAG))
+ if (!TLI.isOperationLegalOrCustomOrPromote(ISD::PEXT, VT)) {
+ if (SDValue Res = TLI.expandPEXT(N, DAG))
return DAG.getNode(ISD::ANY_EXTEND, DL, VT, Res);
}
SDValue X = ZExtPromotedInteger(N->getOperand(0));
SDValue Y = ZExtPromotedInteger(N->getOperand(1));
- return DAG.getNode(ISD::BEXT, DL, VT, X, Y);
+ return DAG.getNode(ISD::PEXT, DL, VT, X, Y);
}
-SDValue DAGTypeLegalizer::PromoteIntRes_BDEP(SDNode *N) {
+SDValue DAGTypeLegalizer::PromoteIntRes_PDEP(SDNode *N) {
SDLoc DL(N);
EVT VT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
- if (!TLI.isOperationLegalOrCustomOrPromote(ISD::BDEP, VT)) {
- if (SDValue Res = TLI.expandBDEP(N, DAG))
+ if (!TLI.isOperationLegalOrCustomOrPromote(ISD::PDEP, VT)) {
+ if (SDValue Res = TLI.expandPDEP(N, DAG))
return DAG.getNode(ISD::ANY_EXTEND, DL, VT, Res);
}
SDValue X = ZExtPromotedInteger(N->getOperand(0));
SDValue Y = ZExtPromotedInteger(N->getOperand(1));
- return DAG.getNode(ISD::BDEP, DL, VT, X, Y);
+ return DAG.getNode(ISD::PDEP, DL, VT, X, Y);
}
SDValue DAGTypeLegalizer::PromoteIntRes_TRUNCATE(SDNode *N) {
@@ -3344,12 +3344,12 @@ void DAGTypeLegalizer::ExpandIntegerResult(SDNode *N, unsigned ResNo) {
ExpandIntRes_CLMUL(N, Lo, Hi);
break;
- case ISD::BEXT:
- ExpandIntRes_BEXT(N, Lo, Hi);
+ case ISD::PEXT:
+ ExpandIntRes_PEXT(N, Lo, Hi);
break;
- case ISD::BDEP:
- ExpandIntRes_BDEP(N, Lo, Hi);
+ case ISD::PDEP:
+ ExpandIntRes_PDEP(N, Lo, Hi);
break;
case ISD::VSCALE:
@@ -5661,13 +5661,13 @@ void DAGTypeLegalizer::ExpandIntRes_CLMUL(SDNode *N, SDValue &Lo, SDValue &Hi) {
Hi = DAG.getNode(ISD::XOR, DL, HalfVT, LoH, HiLoCross);
}
-void DAGTypeLegalizer::ExpandIntRes_BEXT(SDNode *N, SDValue &Lo, SDValue &Hi) {
- SDValue Res = TLI.expandBEXT(N, DAG);
+void DAGTypeLegalizer::ExpandIntRes_PEXT(SDNode *N, SDValue &Lo, SDValue &Hi) {
+ SDValue Res = TLI.expandPEXT(N, DAG);
SplitInteger(Res, Lo, Hi);
}
-void DAGTypeLegalizer::ExpandIntRes_BDEP(SDNode *N, SDValue &Lo, SDValue &Hi) {
- SDValue Res = TLI.expandBDEP(N, DAG);
+void DAGTypeLegalizer::ExpandIntRes_PDEP(SDNode *N, SDValue &Lo, SDValue &Hi) {
+ SDValue Res = TLI.expandPDEP(N, DAG);
SplitInteger(Res, Lo, Hi);
}
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
index 3933f05c306c8..de0203f16e94e 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
@@ -359,8 +359,8 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
SDValue PromoteIntRes_FunnelShift(SDNode *N);
SDValue PromoteIntRes_VPFunnelShift(SDNode *N);
SDValue PromoteIntRes_CLMUL(SDNode *N);
- SDValue PromoteIntRes_BEXT(SDNode *N);
- SDValue PromoteIntRes_BDEP(SDNode *N);
+ SDValue PromoteIntRes_PEXT(SDNode *N);
+ SDValue PromoteIntRes_PDEP(SDNode *N);
SDValue PromoteIntRes_IS_FPCLASS(SDNode *N);
SDValue PromoteIntRes_PATCHPOINT(SDNode *N);
SDValue PromoteIntRes_READ_REGISTER(SDNode *N);
@@ -504,8 +504,8 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
void ExpandIntRes_Rotate (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandIntRes_FunnelShift (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandIntRes_CLMUL(SDNode *N, SDValue &Lo, SDValue &Hi);
- void ExpandIntRes_BEXT(SDNode *N, SDValue &Lo, SDValue &Hi);
- void ExpandIntRes_BDEP(SDNode *N, SDValue &Lo, SDValue &Hi);
+ void ExpandIntRes_PEXT(SDNode *N, SDValue &Lo, SDValue &Hi);
+ void ExpandIntRes_PDEP(SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandIntRes_VSCALE (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandIntRes_READ_REGISTER(SDNode *N, SDValue &Lo, SDValue &Hi);
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
index 0fe9309898459..3a0c3a3cab86b 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
@@ -1200,11 +1200,11 @@ void VectorLegalizer::Expand(SDNode *Node, SmallVectorImpl<SDValue> &Results) {
return;
}
break;
- case ISD::BEXT:
- Results.push_back(TLI.expandBEXT(Node, DAG));
+ case ISD::PEXT:
+ Results.push_back(TLI.expandPEXT(Node, DAG));
return;
- case ISD::BDEP:
- Results.push_back(TLI.expandBDEP(Node, DAG));
+ case ISD::PDEP:
+ Results.push_back(TLI.expandPDEP(Node, DAG));
return;
case ISD::ROTL:
case ISD::ROTR:
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
index d55e921e21774..a5a35c948ee29 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
@@ -207,8 +207,8 @@ void DAGTypeLegalizer::ScalarizeVectorResult(SDNode *N, unsigned ResNo) {
case ISD::CLMUL:
case ISD::CLMULR:
case ISD::CLMULH:
- case ISD::BEXT:
- case ISD::BDEP:
+ case ISD::PEXT:
+ case ISD::PDEP:
R = ScalarizeVecRes_BinOp(N);
break;
@@ -1520,8 +1520,8 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode *N, unsigned ResNo) {
case ISD::CLMUL:
case ISD::CLMULR:
case ISD::CLMULH:
- case ISD::BEXT:
- case ISD::BDEP:
+ case ISD::PEXT:
+ case ISD::PDEP:
case ISD::MULHS:
case ISD::MULHU:
case ISD::ABDS:
@@ -5209,8 +5209,8 @@ void DAGTypeLegalizer::WidenVectorResult(SDNode *N, unsigned ResNo) {
case ISD::CLMUL:
case ISD::CLMULR:
case ISD::CLMULH:
- case ISD::BEXT:
- case ISD::BDEP:
+ case ISD::PEXT:
+ case ISD::PDEP:
case ISD::FMINNUM:
case ISD::FMINNUM_IEEE:
case ISD::VP_FMINNUM:
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 17f78dc0e0664..b108c671c7a8d 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -7449,9 +7449,9 @@ static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
return APIntOps::clmulr(C1, C2);
case ISD::CLMULH:
return APIntOps::clmulh(C1, C2);
- case ISD::BEXT:
+ case ISD::PEXT:
return APIntOps::compressBits(C1, C2);
- case ISD::BDEP:
+ case ISD::PDEP:
return APIntOps::expandBits(C1, C2);
}
return std::nullopt;
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index f31c1da3dcb8f..7a0bc9bec12af 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -7410,16 +7410,16 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
setValue(&I, DAG.getNode(ISD::CLMUL, sdl, X.getValueType(), X, Y));
return;
}
- case Intrinsic::bext: {
+ case Intrinsic::pext: {
SDValue X = getValue(I.getArgOperand(0));
SDValue Y = getValue(I.getArgOperand(1));
- setValue(&I, DAG.getNode(ISD::BEXT, sdl, X.getValueType(), X, Y));
+ setValue(&I, DAG.getNode(ISD::PEXT, sdl, X.getValueType(), X, Y));
return;
}
- case Intrinsic::bdep: {
+ case Intrinsic::pdep: {
SDValue X = getValue(I.getArgOperand(0));
SDValue Y = getValue(I.getArgOperand(1));
- setValue(&I, DAG.getNode(ISD::BDEP, sdl, X.getValueType(), X, Y));
+ setValue(&I, DAG.getNode(ISD::PDEP, sdl, X.getValueType(), X, Y));
return;
}
case Intrinsic::sadd_sat: {
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
index 82696812b4bfc..2564ba3e6bdfe 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
@@ -307,8 +307,8 @@ std::string SDNode::getOperationName(const SelectionDAG *G) const {
case ISD::CLMUL: return "clmul";
case ISD::CLMULR: return "clmulr";
case ISD::CLMULH: return "clmulh";
- case ISD::BEXT: return "bext";
- case ISD::BDEP: return "bdep";
+ case ISD::PEXT: return "pext";
+ case ISD::PDEP: return "pdep";
case ISD::FADD: return "fadd";
case ISD::STRICT_FADD: return "strict_fadd";
case ISD::FSUB: return "fsub";
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 7af937dfac001..07798c25f54be 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -8962,7 +8962,7 @@ SDValue TargetLowering::expandCLMUL(SDNode *Node, SelectionDAG &DAG) const {
llvm_unreachable("Expected CLMUL, CLMULR, or CLMULH");
}
-SDValue TargetLowering::expandBEXT(SDNode *Node, SelectionDAG &DAG) const {
+SDValue TargetLowering::expandPEXT(SDNode *Node, SelectionDAG &DAG) const {
SDLoc DL(Node);
EVT VT = Node->getValueType(0);
SDValue Val = Node->getOperand(0);
@@ -8994,7 +8994,7 @@ SDValue TargetLowering::expandBEXT(SDNode *Node, SelectionDAG &DAG) const {
return X;
}
-SDValue TargetLowering::expandBDEP(SDNode *Node, SelectionDAG &DAG) const {
+SDValue TargetLowering::expandPDEP(SDNode *Node, SelectionDAG &DAG) const {
SDLoc DL(Node);
EVT VT = Node->getValueType(0);
SDValue Val = Node->getOperand(0);
diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp
index 9a25af680b6ee..6f01bafa0f771 100644
--- a/llvm/lib/CodeGen/TargetLoweringBase.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp
@@ -1189,7 +1189,7 @@ void TargetLoweringBase::initActions() {
setOperationAction({ISD::CLMUL, ISD::CLMULR, ISD::CLMULH}, VT, Expand);
// Bit extract/deposit (compress/expand)
- setOperationAction({ISD::BEXT, ISD::BDEP}, VT, Expand);
+ setOperationAction({ISD::PEXT, ISD::PDEP}, VT, Expand);
// Saturated trunc
setOperationAction(ISD::TRUNCATE_SSAT_S, VT, Expand);
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 2974b8aa774e8..9fb8d23d11a1d 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -2108,17 +2108,17 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
}
}
- // Map generic BEXT/BDEP to SVE2 bitperm BEXT/BDEP instructions.
+ // Map generic PEXT/PDEP to SVE2 bitperm BEXT/BDEP instructions.
if (Subtarget->hasSVEBitPerm() &&
(Subtarget->isSVEAvailable() ||
(Subtarget->isSVEorStreamingSVEAvailable() &&
Subtarget->hasSSVE_BitPerm()))) {
for (auto VT : {MVT::nxv16i8, MVT::nxv8i16, MVT::nxv4i32, MVT::nxv2i64}) {
- setOperationAction(ISD::BEXT, VT, Custom);
- setOperationAction(ISD::BDEP, VT, Custom);
+ setOperationAction(ISD::PEXT, VT, Custom);
+ setOperationAction(ISD::PDEP, VT, Custom);
}
- setOperationAction({ISD::BEXT, ISD::BDEP}, MVT::i32, Custom);
- setOperationAction({ISD::BEXT, ISD::BDEP}, MVT::i64, Custom);
+ setOperationAction({ISD::PEXT, ISD::PDEP}, MVT::i32, Custom);
+ setOperationAction({ISD::PEXT, ISD::PDEP}, MVT::i64, Custom);
}
if (Subtarget->hasBF16())
@@ -8642,12 +8642,12 @@ SDValue AArch64TargetLowering::LowerOperation(SDValue Op,
return LowerPARTIAL_REDUCE_MLA(Op, DAG);
case ISD::CLMUL:
return LowerCLMUL(Op, DAG);
- case ISD::BEXT:
- case ISD::BDEP: {
- // Lower generic BEXT/BDEP to SVE2 intrinsics.
+ case ISD::PEXT:
+ case ISD::PDEP: {
+ // Lower generic PEXT/PDEP to SVE2 intrinsics.
SDLoc DL(Op);
EVT VT = Op.getValueType();
- unsigned IntrID = Op.getOpcode() == ISD::BEXT
+ unsigned IntrID = Op.getOpcode() == ISD::PEXT
? Intrinsic::aarch64_sve_bext_x
: Intrinsic::aarch64_sve_bdep_x;
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 94296801c8a8e..f7a56d0e2f980 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -481,11 +481,11 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
}
if (Subtarget.hasBMI2()) {
- setOperationAction({ISD::BEXT, ISD::BDEP}, MVT::i8, Promote);
- setOperationAction({ISD::BEXT, ISD::BDEP}, MVT::i16, Promote);
- setOperationAction({ISD::BEXT, ISD::BDEP}, MVT::i32, Legal);
+ setOperationAction({ISD::PEXT, ISD::PDEP}, MVT::i8, Promote);
+ setOperationAction({ISD::PEXT, ISD::PDEP}, MVT::i16, Promote);
+ setOperationAction({ISD::PEXT, ISD::PDEP}, MVT::i32, Legal);
if (Subtarget.is64Bit())
- setOperationAction({ISD::BEXT, ISD::BDEP}, MVT::i64, Legal);
+ setOperationAction({ISD::PEXT, ISD::PDEP}, MVT::i64, Legal);
}
setOperationAction(ISD::READCYCLECOUNTER , MVT::i64 , Custom);
diff --git a/llvm/lib/Target/X86/X86InstrMisc.td b/llvm/lib/Target/X86/X86InstrMisc.td
index 96c3dbb74b839..613a431fe365a 100644
--- a/llvm/lib/Target/X86/X86InstrMisc.td
+++ b/llvm/lib/Target/X86/X86InstrMisc.td
@@ -1404,42 +1404,41 @@ let Predicates = [HasBMI2, HasEGPR] in {
defm PEXT64 : PdepPext<"pext", Xi64, X86pext, "_EVEX">, XS, REX_W, EVEX;
}
-// ISD::BEXT / ISD::BDEP are legal on BMI2 and select directly to PEXT / PDEP.
let Predicates = [HasBMI2, NoEGPR] in {
- def : Pat<(i32 (bext GR32:$src, GR32:$mask)),
+ def : Pat<(i32 (pext GR32:$src, GR32:$mask)),
(PEXT32rr GR32:$src, GR32:$mask)>;
- def : Pat<(i32 (bext GR32:$src, (loadi32 addr:$mask))),
+ def : Pat<(i32 (pext GR32:$src, (loadi32 addr:$mask))),
(PEXT32rm GR32:$src, i32mem:$mask)>;
- def : Pat<(i64 (bext GR64:$src, GR64:$mask)),
+ def : Pat<(i64 (pext GR64:$src, GR64:$mask)),
(PEXT64rr GR64:$src, GR64:$mask)>;
- def : Pat<(i64 (bext GR64:$src, (loadi64 addr:$mask))),
+ def : Pat<(i64 (pext GR64:$src, (loadi64 addr:$mask))),
(PEXT64rm GR64:$src, i64mem:$mask)>;
- def : Pat<(i32 (bdep GR32:$src, GR32:$mask)),
+ def : Pat<(i32 (pdep GR32:$src, GR32:$mask)),
(PDEP32rr GR32:$src, GR32:$mask)>;
- def : Pat<(i32 (bdep GR32:$src, (loadi32 addr:$mask))),
+ def : Pat<(i32 (pdep GR32:$src, (loadi32 addr:$mask))),
(PDEP32rm GR32:$src, i32mem:$mask)>;
- def : Pat<(i64 (bdep GR64:$src, GR64:$mask)),
+ def : Pat<(i64 (pdep GR64:$src, GR64:$mask)),
(PDEP64rr GR64:$src, GR64:$mask)>;
- def : Pat<(i64 (bdep GR64:$src, (loadi64 addr:$mask))),
+ def : Pat<(i64 (pdep GR64:$src, (loadi64 addr:$mask))),
(PDEP64rm GR64:$src, i64mem:$mask)>;
}
let Predicates = [HasBMI2, HasEGPR] in {
- def : Pat<(i32 (bext GR32:$src, GR32:$mask)),
+ def : Pat<(i32 (pext GR32:$src, GR32:$mask)),
(PEXT32rr_EVEX GR32:$src, GR32:$mask)>;
- def : Pat<(i32 (bext GR32:$src, (loadi32 addr:$mask))),
+ def : Pat<(i32 (pext GR32:$src, (loadi32 addr:$mask))),
(PEXT32rm_EVEX GR32:$src, i32mem:$mask)>;
- def : Pat<(i64 (bext GR64:$src, GR64:$mask)),
+ def : Pat<(i64 (pext GR64:$src, GR64:$mask)),
(PEXT64rr_EVEX GR64:$src, GR64:$mask)>;
- def : Pat<(i64 (bext GR64:$src, (loadi64 addr:$mask))),
+ def : Pat<(i64 (pext GR64:$src, (loadi64 addr:$mask))),
(PEXT64rm_EVEX GR64:$src, i64mem:$mask)>;
- def : Pat<(i32 (bdep GR32:$src, GR32:$mask)),
+ def : Pat<(i32 (pdep GR32:$src, GR32:$mask)),
(PDEP32rr_EVEX GR32:$src, GR32:$mask)>;
- def : Pat<(i32 (bdep GR32:$src, (loadi32 addr:$mask))),
+ def : Pat<(i32 (pdep GR32:$src, (loadi32 addr:$mask))),
(PDEP32rm_EVEX GR32:$src, i32mem:$mask)>;
- def : Pat<(i64 (bdep GR64:$src, GR64:$mask)),
+ def : Pat<(i64 (pdep GR64:$src, GR64:$mask)),
(PDEP64rr_EVEX GR64:$src, GR64:$mask)>;
- def : Pat<(i64 (bdep GR64:$src, (loadi64 addr:$mask))),
+ def : Pat<(i64 (pdep GR64:$src, (loadi64 addr:$mask))),
(PDEP64rm_EVEX GR64:$src, i64mem:$mask)>;
}
diff --git a/llvm/test/CodeGen/AArch64/bdep.ll b/llvm/test/CodeGen/AArch64/pdep.ll
similarity index 98%
rename from llvm/test/CodeGen/AArch64/bdep.ll
rename to llvm/test/CodeGen/AArch64/pdep.ll
index 2facdbd8c919a..a6be3da398c60 100644
--- a/llvm/test/CodeGen/AArch64/bdep.ll
+++ b/llvm/test/CodeGen/AArch64/pdep.ll
@@ -2,8 +2,8 @@
; RUN: llc < %s -mtriple=aarch64 -mattr=+sve2-bitperm | FileCheck %s --check-prefix=BITPERM
; RUN: llc < %s -mtriple=aarch64 -mattr=+sve2 | FileCheck %s --check-prefix=NOSVE2BITPERM
-define i8 @bdep_i8(i8 %val, i8 %mask) nounwind {
-; BITPERM-LABEL: bdep_i8:
+define i8 @pdep_i8(i8 %val, i8 %mask) nounwind {
+; BITPERM-LABEL: pdep_i8:
; BITPERM: // %bb.0:
; BITPERM-NEXT: and w8, w0, #0xff
; BITPERM-NEXT: and w9, w1, #0xff
@@ -13,7 +13,7 @@ define i8 @bdep_i8(i8 %val, i8 %mask) nounwind {
; BITPERM-NEXT: fmov w0, s0
; BITPERM-NEXT: ret
;
-; NOSVE2BITPERM-LABEL: bdep_i8:
+; NOSVE2BITPERM-LABEL: pdep_i8:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: mvn w9, w1
; NOSVE2BITPERM-NEXT: mov w8, #-1 // =0xffffffff
@@ -50,12 +50,12 @@ define i8 @bdep_i8(i8 %val, i8 %mask) nounwind {
; NOSVE2BITPERM-NEXT: orr w8, w8, w10
; NOSVE2BITPERM-NEXT: and w0, w8, w1
; NOSVE2BITPERM-NEXT: ret
- %res = call i8 @llvm.bdep.i8(i8 %val, i8 %mask)
+ %res = call i8 @llvm.pdep.i8(i8 %val, i8 %mask)
ret i8 %res
}
-define i16 @bdep_i16(i16 %val, i16 %mask) nounwind {
-; BITPERM-LABEL: bdep_i16:
+define i16 @pdep_i16(i16 %val, i16 %mask) nounwind {
+; BITPERM-LABEL: pdep_i16:
; BITPERM: // %bb.0:
; BITPERM-NEXT: and w8, w0, #0xffff
; BITPERM-NEXT: and w9, w1, #0xffff
@@ -65,7 +65,7 @@ define i16 @bdep_i16(i16 %val, i16 %mask) nounwind {
; BITPERM-NEXT: fmov w0, s0
; BITPERM-NEXT: ret
;
-; NOSVE2BITPERM-LABEL: bdep_i16:
+; NOSVE2BITPERM-LABEL: pdep_i16:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: mvn w8, w1
; NOSVE2BITPERM-NEXT: lsl w9, w8, #1
@@ -163,12 +163,12 @@ define i16 @bdep_i16(i16 %val, i16 %mask) nounwind {
; NOSVE2BITPERM-NEXT: orr w8, w8, w10
; NOSVE2BITPERM-NEXT: and w0, w8, w1
; NOSVE2BITPERM-NEXT: ret
- %res = call i16 @llvm.bdep.i16(i16 %val, i16 %mask)
+ %res = call i16 @llvm.pdep.i16(i16 %val, i16 %mask)
ret i16 %res
}
-define i32 @bdep_i32(i32 %val, i32 %mask) nounwind {
-; BITPERM-LABEL: bdep_i32:
+define i32 @pdep_i32(i32 %val, i32 %mask) nounwind {
+; BITPERM-LABEL: pdep_i32:
; BITPERM: // %bb.0:
; BITPERM-NEXT: fmov s0, w0
; BITPERM-NEXT: fmov s1, w1
@@ -176,7 +176,7 @@ define i32 @bdep_i32(i32 %val, i32 %mask) nounwind {
; BITPERM-NEXT: fmov w0, s0
; BITPERM-NEXT: ret
;
-; NOSVE2BITPERM-LABEL: bdep_i32:
+; NOSVE2BITPERM-LABEL: pdep_i32:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: mvn w8, w1
; NOSVE2BITPERM-NEXT: lsl w9, w8, #1
@@ -364,12 +364,12 @@ define i32 @bdep_i32(i32 %val, i32 %mask) nounwind {
; NOSVE2BITPERM-NEXT: orr w8, w8, w10
; NOSVE2BITPERM-NEXT: and w0, w8, w1
; NOSVE2BITPERM-NEXT: ret
- %res = call i32 @llvm.bdep.i32(i32 %val, i32 %mask)
+ %res = call i32 @llvm.pdep.i32(i32 %val, i32 %mask)
ret i32 %res
}
-define i64 @bdep_i64(i64 %val, i64 %mask) nounwind {
-; BITPERM-LABEL: bdep_i64:
+define i64 @pdep_i64(i64 %val, i64 %mask) nounwind {
+; BITPERM-LABEL: pdep_i64:
; BITPERM: // %bb.0:
; BITPERM-NEXT: fmov d0, x0
; BITPERM-NEXT: fmov d1, x1
@@ -377,7 +377,7 @@ define i64 @bdep_i64(i64 %val, i64 %mask) nounwind {
; BITPERM-NEXT: fmov x0, d0
; BITPERM-NEXT: ret
;
-; NOSVE2BITPERM-LABEL: bdep_i64:
+; NOSVE2BITPERM-LABEL: pdep_i64:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: mvn x8, x1
; NOSVE2BITPERM-NEXT: lsl x9, x8, #1
@@ -795,17 +795,17 @@ define i64 @bdep_i64(i64 %val, i64 %mask) nounwind {
; NOSVE2BITPERM-NEXT: orr x8, x8, x10
; NOSVE2BITPERM-NEXT: and x0, x8, x1
; NOSVE2BITPERM-NEXT: ret
- %res = call i64 @llvm.bdep.i64(i64 %val, i64 %mask)
+ %res = call i64 @llvm.pdep.i64(i64 %val, i64 %mask)
ret i64 %res
}
-define <vscale x 16 x i8> @bdep_nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask) nounwind {
-; BITPERM-LABEL: bdep_nxv16i8:
+define <vscale x 16 x i8> @pdep_nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask) nounwind {
+; BITPERM-LABEL: pdep_nxv16i8:
; BITPERM: // %bb.0:
; BITPERM-NEXT: bdep z0.b, z0.b, z1.b
; BITPERM-NEXT: ret
;
-; NOSVE2BITPERM-LABEL: bdep_nxv16i8:
+; NOSVE2BITPERM-LABEL: pdep_nxv16i8:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: movprfx z3, z1
; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
@@ -833,17 +833,17 @@ define <vscale x 16 x i8> @bdep_nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x
; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z5.d
; NOSVE2BITPERM-NEXT: and z0.d, z2.d, z1.d
; NOSVE2BITPERM-NEXT: ret
- %res = call <vscale x 16 x i8> @llvm.bdep.nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask)
+ %res = call <vscale x 16 x i8> @llvm.pdep.nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask)
ret <vscale x 16 x i8> %res
}
-define <vscale x 8 x i16> @bdep_nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask) nounwind {
-; BITPERM-LABEL: bdep_nxv8i16:
+define <vscale x 8 x i16> @pdep_nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask) nounwind {
+; BITPERM-LABEL: pdep_nxv8i16:
; BITPERM: // %bb.0:
; BITPERM-NEXT: bdep z0.h, z0.h, z1.h
; BITPERM-NEXT: ret
;
-; NOSVE2BITPERM-LABEL: bdep_nxv8i16:
+; NOSVE2BITPERM-LABEL: pdep_nxv8i16:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: movprfx z3, z1
; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
@@ -899,17 +899,17 @@ define <vscale x 8 x i16> @bdep_nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i
; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z2.d, z5.d
; NOSVE2BITPERM-NEXT: and z0.d, z0.d, z1.d
; NOSVE2BITPERM-NEXT: ret
- %res = call <vscale x 8 x i16> @llvm.bdep.nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask)
+ %res = call <vscale x 8 x i16> @llvm.pdep.nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask)
ret <vscale x 8 x i16> %res
}
-define <vscale x 4 x i32> @bdep_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask) nounwind {
-; BITPERM-LABEL: bdep_nxv4i32:
+define <vscale x 4 x i32> @pdep_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask) nounwind {
+; BITPERM-LABEL: pdep_nxv4i32:
; BITPERM: // %bb.0:
; BITPERM-NEXT: bdep z0.s, z0.s, z1.s
; BITPERM-NEXT: ret
;
-; NOSVE2BITPERM-LABEL: bdep_nxv4i32:
+; NOSVE2BITPERM-LABEL: pdep_nxv4i32:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: movprfx z3, z1
; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
@@ -963,17 +963,17 @@ define <vscale x 4 x i32> @bdep_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i
; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z4.d
; NOSVE2BITPERM-NEXT: and z0.d, z2.d, z1.d
; NOSVE2BITPERM-NEXT: ret
- %res = call <vscale x 4 x i32> @llvm.bdep.nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask)
+ %res = call <vscale x 4 x i32> @llvm.pdep.nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask)
ret <vscale x 4 x i32> %res
}
-define <vscale x 2 x i64> @bdep_nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask) nounwind {
-; BITPERM-LABEL: bdep_nxv2i64:
+define <vscale x 2 x i64> @pdep_nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask) nounwind {
+; BITPERM-LABEL: pdep_nxv2i64:
; BITPERM: // %bb.0:
; BITPERM-NEXT: bdep z0.d, z0.d, z1.d
; BITPERM-NEXT: ret
;
-; NOSVE2BITPERM-LABEL: bdep_nxv2i64:
+; NOSVE2BITPERM-LABEL: pdep_nxv2i64:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
; NOSVE2BITPERM-NEXT: addvl sp, sp, #-16
@@ -1995,7 +1995,7 @@ define <vscale x 2 x i64> @bdep_nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i
; NOSVE2BITPERM-NEXT: addvl sp, sp, #16
; NOSVE2BITPERM-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
; NOSVE2BITPERM-NEXT: ret
- %res = call <vscale x 2 x i64> @llvm.bdep.nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask)
+ %res = call <vscale x 2 x i64> @llvm.pdep.nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask)
ret <vscale x 2 x i64> %res
}
diff --git a/llvm/test/CodeGen/AArch64/bext.ll b/llvm/test/CodeGen/AArch64/pext.ll
similarity index 98%
rename from llvm/test/CodeGen/AArch64/bext.ll
rename to llvm/test/CodeGen/AArch64/pext.ll
index 9d844d6c291a5..8da2e232486ec 100644
--- a/llvm/test/CodeGen/AArch64/bext.ll
+++ b/llvm/test/CodeGen/AArch64/pext.ll
@@ -2,8 +2,8 @@
; RUN: llc < %s -mtriple=aarch64 -mattr=+sve2-bitperm | FileCheck %s --check-prefix=BITPERM
; RUN: llc < %s -mtriple=aarch64 -mattr=+sve2 | FileCheck %s --check-prefix=NOSVE2BITPERM
-define i8 @bext_i8(i8 %val, i8 %mask) nounwind {
-; BITPERM-LABEL: bext_i8:
+define i8 @pext_i8(i8 %val, i8 %mask) nounwind {
+; BITPERM-LABEL: pext_i8:
; BITPERM: // %bb.0:
; BITPERM-NEXT: and w8, w0, #0xff
; BITPERM-NEXT: and w9, w1, #0xff
@@ -13,7 +13,7 @@ define i8 @bext_i8(i8 %val, i8 %mask) nounwind {
; BITPERM-NEXT: fmov w0, s0
; BITPERM-NEXT: ret
;
-; NOSVE2BITPERM-LABEL: bext_i8:
+; NOSVE2BITPERM-LABEL: pext_i8:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: mvn w9, w1
; NOSVE2BITPERM-NEXT: mov w8, #-1 // =0xffffffff
@@ -53,12 +53,12 @@ define i8 @bext_i8(i8 %val, i8 %mask) nounwind {
; NOSVE2BITPERM-NEXT: and w8, w8, #0xf0
; NOSVE2BITPERM-NEXT: orr w0, w9, w8, lsr #4
; NOSVE2BITPERM-NEXT: ret
- %res = call i8 @llvm.bext.i8(i8 %val, i8 %mask)
+ %res = call i8 @llvm.pext.i8(i8 %val, i8 %mask)
ret i8 %res
}
-define i16 @bext_i16(i16 %val, i16 %mask) nounwind {
-; BITPERM-LABEL: bext_i16:
+define i16 @pext_i16(i16 %val, i16 %mask) nounwind {
+; BITPERM-LABEL: pext_i16:
; BITPERM: // %bb.0:
; BITPERM-NEXT: and w8, w0, #0xffff
; BITPERM-NEXT: and w9, w1, #0xffff
@@ -68,7 +68,7 @@ define i16 @bext_i16(i16 %val, i16 %mask) nounwind {
; BITPERM-NEXT: fmov w0, s0
; BITPERM-NEXT: ret
;
-; NOSVE2BITPERM-LABEL: bext_i16:
+; NOSVE2BITPERM-LABEL: pext_i16:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: mvn w8, w1
; NOSVE2BITPERM-NEXT: and w14, w0, w1
@@ -170,12 +170,12 @@ define i16 @bext_i16(i16 %val, i16 %mask) nounwind {
; NOSVE2BITPERM-NEXT: and w9, w9, #0xff00
; NOSVE2BITPERM-NEXT: orr w0, w8, w9, lsr #8
; NOSVE2BITPERM-NEXT: ret
- %res = call i16 @llvm.bext.i16(i16 %val, i16 %mask)
+ %res = call i16 @llvm.pext.i16(i16 %val, i16 %mask)
ret i16 %res
}
-define i32 @bext_i32(i32 %val, i32 %mask) nounwind {
-; BITPERM-LABEL: bext_i32:
+define i32 @pext_i32(i32 %val, i32 %mask) nounwind {
+; BITPERM-LABEL: pext_i32:
; BITPERM: // %bb.0:
; BITPERM-NEXT: fmov s0, w0
; BITPERM-NEXT: fmov s1, w1
@@ -183,7 +183,7 @@ define i32 @bext_i32(i32 %val, i32 %mask) nounwind {
; BITPERM-NEXT: fmov w0, s0
; BITPERM-NEXT: ret
;
-; NOSVE2BITPERM-LABEL: bext_i32:
+; NOSVE2BITPERM-LABEL: pext_i32:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: mvn w8, w1
; NOSVE2BITPERM-NEXT: and w14, w0, w1
@@ -371,12 +371,12 @@ define i32 @bext_i32(i32 %val, i32 %mask) nounwind {
; NOSVE2BITPERM-NEXT: eor w9, w9, w8
; NOSVE2BITPERM-NEXT: orr w0, w9, w8, lsr #16
; NOSVE2BITPERM-NEXT: ret
- %res = call i32 @llvm.bext.i32(i32 %val, i32 %mask)
+ %res = call i32 @llvm.pext.i32(i32 %val, i32 %mask)
ret i32 %res
}
-define i64 @bext_i64(i64 %val, i64 %mask) nounwind {
-; BITPERM-LABEL: bext_i64:
+define i64 @pext_i64(i64 %val, i64 %mask) nounwind {
+; BITPERM-LABEL: pext_i64:
; BITPERM: // %bb.0:
; BITPERM-NEXT: fmov d0, x0
; BITPERM-NEXT: fmov d1, x1
@@ -384,7 +384,7 @@ define i64 @bext_i64(i64 %val, i64 %mask) nounwind {
; BITPERM-NEXT: fmov x0, d0
; BITPERM-NEXT: ret
;
-; NOSVE2BITPERM-LABEL: bext_i64:
+; NOSVE2BITPERM-LABEL: pext_i64:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: mvn x8, x1
; NOSVE2BITPERM-NEXT: and x15, x0, x1
@@ -802,17 +802,17 @@ define i64 @bext_i64(i64 %val, i64 %mask) nounwind {
; NOSVE2BITPERM-NEXT: eor x9, x9, x8
; NOSVE2BITPERM-NEXT: orr x0, x9, x8, lsr #32
; NOSVE2BITPERM-NEXT: ret
- %res = call i64 @llvm.bext.i64(i64 %val, i64 %mask)
+ %res = call i64 @llvm.pext.i64(i64 %val, i64 %mask)
ret i64 %res
}
-define <vscale x 16 x i8> @bext_nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask) nounwind {
-; BITPERM-LABEL: bext_nxv16i8:
+define <vscale x 16 x i8> @pext_nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask) nounwind {
+; BITPERM-LABEL: pext_nxv16i8:
; BITPERM: // %bb.0:
; BITPERM-NEXT: bext z0.b, z0.b, z1.b
; BITPERM-NEXT: ret
;
-; NOSVE2BITPERM-LABEL: bext_nxv16i8:
+; NOSVE2BITPERM-LABEL: pext_nxv16i8:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: movprfx z3, z1
; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
@@ -846,17 +846,17 @@ define <vscale x 16 x i8> @bext_nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x
; NOSVE2BITPERM-NEXT: lsr z1.b, z1.b, #4
; NOSVE2BITPERM-NEXT: orr z0.d, z0.d, z1.d
; NOSVE2BITPERM-NEXT: ret
- %res = call <vscale x 16 x i8> @llvm.bext.nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask)
+ %res = call <vscale x 16 x i8> @llvm.pext.nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask)
ret <vscale x 16 x i8> %res
}
-define <vscale x 8 x i16> @bext_nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask) nounwind {
-; BITPERM-LABEL: bext_nxv8i16:
+define <vscale x 8 x i16> @pext_nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask) nounwind {
+; BITPERM-LABEL: pext_nxv8i16:
; BITPERM: // %bb.0:
; BITPERM-NEXT: bext z0.h, z0.h, z1.h
; BITPERM-NEXT: ret
;
-; NOSVE2BITPERM-LABEL: bext_nxv8i16:
+; NOSVE2BITPERM-LABEL: pext_nxv8i16:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: movprfx z3, z1
; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
@@ -920,17 +920,17 @@ define <vscale x 8 x i16> @bext_nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i
; NOSVE2BITPERM-NEXT: lsr z1.h, z1.h, #8
; NOSVE2BITPERM-NEXT: orr z0.d, z0.d, z1.d
; NOSVE2BITPERM-NEXT: ret
- %res = call <vscale x 8 x i16> @llvm.bext.nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask)
+ %res = call <vscale x 8 x i16> @llvm.pext.nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask)
ret <vscale x 8 x i16> %res
}
-define <vscale x 4 x i32> @bext_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask) nounwind {
-; BITPERM-LABEL: bext_nxv4i32:
+define <vscale x 4 x i32> @pext_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask) nounwind {
+; BITPERM-LABEL: pext_nxv4i32:
; BITPERM: // %bb.0:
; BITPERM-NEXT: bext z0.s, z0.s, z1.s
; BITPERM-NEXT: ret
;
-; NOSVE2BITPERM-LABEL: bext_nxv4i32:
+; NOSVE2BITPERM-LABEL: pext_nxv4i32:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: movprfx z3, z1
; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
@@ -994,17 +994,17 @@ define <vscale x 4 x i32> @bext_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i
; NOSVE2BITPERM-NEXT: lsr z1.s, z1.s, #16
; NOSVE2BITPERM-NEXT: orr z0.d, z0.d, z1.d
; NOSVE2BITPERM-NEXT: ret
- %res = call <vscale x 4 x i32> @llvm.bext.nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask)
+ %res = call <vscale x 4 x i32> @llvm.pext.nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask)
ret <vscale x 4 x i32> %res
}
-define <vscale x 2 x i64> @bext_nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask) nounwind {
-; BITPERM-LABEL: bext_nxv2i64:
+define <vscale x 2 x i64> @pext_nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask) nounwind {
+; BITPERM-LABEL: pext_nxv2i64:
; BITPERM: // %bb.0:
; BITPERM-NEXT: bext z0.d, z0.d, z1.d
; BITPERM-NEXT: ret
;
-; NOSVE2BITPERM-LABEL: bext_nxv2i64:
+; NOSVE2BITPERM-LABEL: pext_nxv2i64:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
; NOSVE2BITPERM-NEXT: addvl sp, sp, #-16
@@ -2038,7 +2038,7 @@ define <vscale x 2 x i64> @bext_nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i
; NOSVE2BITPERM-NEXT: addvl sp, sp, #16
; NOSVE2BITPERM-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
; NOSVE2BITPERM-NEXT: ret
- %res = call <vscale x 2 x i64> @llvm.bext.nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask)
+ %res = call <vscale x 2 x i64> @llvm.pext.nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask)
ret <vscale x 2 x i64> %res
}
diff --git a/llvm/test/CodeGen/X86/bdep.ll b/llvm/test/CodeGen/X86/pdep.ll
similarity index 98%
rename from llvm/test/CodeGen/X86/bdep.ll
rename to llvm/test/CodeGen/X86/pdep.ll
index 47ef9348b2d5a..71bd4c6693e82 100644
--- a/llvm/test/CodeGen/X86/bdep.ll
+++ b/llvm/test/CodeGen/X86/pdep.ll
@@ -2,8 +2,8 @@
; RUN: llc < %s -mtriple=x86_64-- -mattr=+bmi2 | FileCheck %s --check-prefix=BMI2
; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s --check-prefix=NOBMI2
-define i8 @bdep_i8(i8 %val, i8 %mask) nounwind {
-; BMI2-LABEL: bdep_i8:
+define i8 @pdep_i8(i8 %val, i8 %mask) nounwind {
+; BMI2-LABEL: pdep_i8:
; BMI2: # %bb.0:
; BMI2-NEXT: movzbl %sil, %eax
; BMI2-NEXT: movzbl %dil, %ecx
@@ -11,7 +11,7 @@ define i8 @bdep_i8(i8 %val, i8 %mask) nounwind {
; BMI2-NEXT: # kill: def $al killed $al killed $eax
; BMI2-NEXT: retq
;
-; NOBMI2-LABEL: bdep_i8:
+; NOBMI2-LABEL: pdep_i8:
; NOBMI2: # %bb.0:
; NOBMI2-NEXT: movl %esi, %eax
; NOBMI2-NEXT: notb %al
@@ -94,12 +94,12 @@ define i8 @bdep_i8(i8 %val, i8 %mask) nounwind {
; NOBMI2-NEXT: andb %sil, %al
; NOBMI2-NEXT: # kill: def $al killed $al killed $eax
; NOBMI2-NEXT: retq
- %res = call i8 @llvm.bdep.i8(i8 %val, i8 %mask)
+ %res = call i8 @llvm.pdep.i8(i8 %val, i8 %mask)
ret i8 %res
}
-define i16 @bdep_i16(i16 %val, i16 %mask) nounwind {
-; BMI2-LABEL: bdep_i16:
+define i16 @pdep_i16(i16 %val, i16 %mask) nounwind {
+; BMI2-LABEL: pdep_i16:
; BMI2: # %bb.0:
; BMI2-NEXT: movzwl %si, %eax
; BMI2-NEXT: movzwl %di, %ecx
@@ -107,7 +107,7 @@ define i16 @bdep_i16(i16 %val, i16 %mask) nounwind {
; BMI2-NEXT: # kill: def $ax killed $ax killed $eax
; BMI2-NEXT: retq
;
-; NOBMI2-LABEL: bdep_i16:
+; NOBMI2-LABEL: pdep_i16:
; NOBMI2: # %bb.0:
; NOBMI2-NEXT: pushq %rbx
; NOBMI2-NEXT: movl %esi, %edx
@@ -316,17 +316,17 @@ define i16 @bdep_i16(i16 %val, i16 %mask) nounwind {
; NOBMI2-NEXT: # kill: def $ax killed $ax killed $eax
; NOBMI2-NEXT: popq %rbx
; NOBMI2-NEXT: retq
- %res = call i16 @llvm.bdep.i16(i16 %val, i16 %mask)
+ %res = call i16 @llvm.pdep.i16(i16 %val, i16 %mask)
ret i16 %res
}
-define i32 @bdep_i32(i32 %val, i32 %mask) nounwind {
-; BMI2-LABEL: bdep_i32:
+define i32 @pdep_i32(i32 %val, i32 %mask) nounwind {
+; BMI2-LABEL: pdep_i32:
; BMI2: # %bb.0:
; BMI2-NEXT: pdepl %esi, %edi, %eax
; BMI2-NEXT: retq
;
-; NOBMI2-LABEL: bdep_i32:
+; NOBMI2-LABEL: pdep_i32:
; NOBMI2: # %bb.0:
; NOBMI2-NEXT: pushq %rbp
; NOBMI2-NEXT: pushq %r14
@@ -830,17 +830,17 @@ define i32 @bdep_i32(i32 %val, i32 %mask) nounwind {
; NOBMI2-NEXT: popq %r14
; NOBMI2-NEXT: popq %rbp
; NOBMI2-NEXT: retq
- %res = call i32 @llvm.bdep.i32(i32 %val, i32 %mask)
+ %res = call i32 @llvm.pdep.i32(i32 %val, i32 %mask)
ret i32 %res
}
-define i64 @bdep_i64(i64 %val, i64 %mask) nounwind {
-; BMI2-LABEL: bdep_i64:
+define i64 @pdep_i64(i64 %val, i64 %mask) nounwind {
+; BMI2-LABEL: pdep_i64:
; BMI2: # %bb.0:
; BMI2-NEXT: pdepq %rsi, %rdi, %rax
; BMI2-NEXT: retq
;
-; NOBMI2-LABEL: bdep_i64:
+; NOBMI2-LABEL: pdep_i64:
; NOBMI2: # %bb.0:
; NOBMI2-NEXT: pushq %r15
; NOBMI2-NEXT: pushq %r14
@@ -2025,49 +2025,49 @@ define i64 @bdep_i64(i64 %val, i64 %mask) nounwind {
; NOBMI2-NEXT: popq %r14
; NOBMI2-NEXT: popq %r15
; NOBMI2-NEXT: retq
- %res = call i64 @llvm.bdep.i64(i64 %val, i64 %mask)
+ %res = call i64 @llvm.pdep.i64(i64 %val, i64 %mask)
ret i64 %res
}
-define i32 @bdep_mask_zero(i32 %val) nounwind {
-; BMI2-LABEL: bdep_mask_zero:
+define i32 @pdep_mask_zero(i32 %val) nounwind {
+; BMI2-LABEL: pdep_mask_zero:
; BMI2: # %bb.0:
; BMI2-NEXT: xorl %eax, %eax
; BMI2-NEXT: retq
;
-; NOBMI2-LABEL: bdep_mask_zero:
+; NOBMI2-LABEL: pdep_mask_zero:
; NOBMI2: # %bb.0:
; NOBMI2-NEXT: xorl %eax, %eax
; NOBMI2-NEXT: retq
- %res = call i32 @llvm.bdep.i32(i32 %val, i32 0)
+ %res = call i32 @llvm.pdep.i32(i32 %val, i32 0)
ret i32 %res
}
-define i32 @bdep_mask_allones(i32 %val) nounwind {
-; BMI2-LABEL: bdep_mask_allones:
+define i32 @pdep_mask_allones(i32 %val) nounwind {
+; BMI2-LABEL: pdep_mask_allones:
; BMI2: # %bb.0:
; BMI2-NEXT: movl %edi, %eax
; BMI2-NEXT: retq
;
-; NOBMI2-LABEL: bdep_mask_allones:
+; NOBMI2-LABEL: pdep_mask_allones:
; NOBMI2: # %bb.0:
; NOBMI2-NEXT: movl %edi, %eax
; NOBMI2-NEXT: retq
- %res = call i32 @llvm.bdep.i32(i32 %val, i32 -1)
+ %res = call i32 @llvm.pdep.i32(i32 %val, i32 -1)
ret i32 %res
}
-define i32 @bdep_const_fold() nounwind {
-; BMI2-LABEL: bdep_const_fold:
+define i32 @pdep_const_fold() nounwind {
+; BMI2-LABEL: pdep_const_fold:
; BMI2: # %bb.0:
; BMI2-NEXT: movl $136, %eax
; BMI2-NEXT: retq
;
-; NOBMI2-LABEL: bdep_const_fold:
+; NOBMI2-LABEL: pdep_const_fold:
; NOBMI2: # %bb.0:
; NOBMI2-NEXT: movl $136, %eax
; NOBMI2-NEXT: retq
- %res = call i32 @llvm.bdep.i32(i32 10, i32 204)
+ %res = call i32 @llvm.pdep.i32(i32 10, i32 204)
ret i32 %res
}
diff --git a/llvm/test/CodeGen/X86/bext.ll b/llvm/test/CodeGen/X86/pext.ll
similarity index 98%
rename from llvm/test/CodeGen/X86/bext.ll
rename to llvm/test/CodeGen/X86/pext.ll
index 39e70485396e3..2839721045e7e 100644
--- a/llvm/test/CodeGen/X86/bext.ll
+++ b/llvm/test/CodeGen/X86/pext.ll
@@ -2,8 +2,8 @@
; RUN: llc < %s -mtriple=x86_64-- -mattr=+bmi2 | FileCheck %s --check-prefix=BMI2
; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s --check-prefix=NOBMI2
-define i8 @bext_i8(i8 %val, i8 %mask) nounwind {
-; BMI2-LABEL: bext_i8:
+define i8 @pext_i8(i8 %val, i8 %mask) nounwind {
+; BMI2-LABEL: pext_i8:
; BMI2: # %bb.0:
; BMI2-NEXT: movzbl %sil, %eax
; BMI2-NEXT: movzbl %dil, %ecx
@@ -11,7 +11,7 @@ define i8 @bext_i8(i8 %val, i8 %mask) nounwind {
; BMI2-NEXT: # kill: def $al killed $al killed $eax
; BMI2-NEXT: retq
;
-; NOBMI2-LABEL: bext_i8:
+; NOBMI2-LABEL: pext_i8:
; NOBMI2: # %bb.0:
; NOBMI2-NEXT: movl %esi, %ecx
; NOBMI2-NEXT: notb %cl
@@ -91,12 +91,12 @@ define i8 @bext_i8(i8 %val, i8 %mask) nounwind {
; NOBMI2-NEXT: shrb $4, %al
; NOBMI2-NEXT: orb %dil, %al
; NOBMI2-NEXT: retq
- %res = call i8 @llvm.bext.i8(i8 %val, i8 %mask)
+ %res = call i8 @llvm.pext.i8(i8 %val, i8 %mask)
ret i8 %res
}
-define i16 @bext_i16(i16 %val, i16 %mask) nounwind {
-; BMI2-LABEL: bext_i16:
+define i16 @pext_i16(i16 %val, i16 %mask) nounwind {
+; BMI2-LABEL: pext_i16:
; BMI2: # %bb.0:
; BMI2-NEXT: movzwl %si, %eax
; BMI2-NEXT: movzwl %di, %ecx
@@ -104,7 +104,7 @@ define i16 @bext_i16(i16 %val, i16 %mask) nounwind {
; BMI2-NEXT: # kill: def $ax killed $ax killed $eax
; BMI2-NEXT: retq
;
-; NOBMI2-LABEL: bext_i16:
+; NOBMI2-LABEL: pext_i16:
; NOBMI2: # %bb.0:
; NOBMI2-NEXT: pushq %rbx
; NOBMI2-NEXT: andl %esi, %edi
@@ -316,17 +316,17 @@ define i16 @bext_i16(i16 %val, i16 %mask) nounwind {
; NOBMI2-NEXT: # kill: def $ax killed $ax killed $eax
; NOBMI2-NEXT: popq %rbx
; NOBMI2-NEXT: retq
- %res = call i16 @llvm.bext.i16(i16 %val, i16 %mask)
+ %res = call i16 @llvm.pext.i16(i16 %val, i16 %mask)
ret i16 %res
}
-define i32 @bext_i32(i32 %val, i32 %mask) nounwind {
-; BMI2-LABEL: bext_i32:
+define i32 @pext_i32(i32 %val, i32 %mask) nounwind {
+; BMI2-LABEL: pext_i32:
; BMI2: # %bb.0:
; BMI2-NEXT: pextl %esi, %edi, %eax
; BMI2-NEXT: retq
;
-; NOBMI2-LABEL: bext_i32:
+; NOBMI2-LABEL: pext_i32:
; NOBMI2: # %bb.0:
; NOBMI2-NEXT: andl %esi, %edi
; NOBMI2-NEXT: movl %esi, %eax
@@ -820,17 +820,17 @@ define i32 @bext_i32(i32 %val, i32 %mask) nounwind {
; NOBMI2-NEXT: shrl $16, %eax
; NOBMI2-NEXT: orl %esi, %eax
; NOBMI2-NEXT: retq
- %res = call i32 @llvm.bext.i32(i32 %val, i32 %mask)
+ %res = call i32 @llvm.pext.i32(i32 %val, i32 %mask)
ret i32 %res
}
-define i64 @bext_i64(i64 %val, i64 %mask) nounwind {
-; BMI2-LABEL: bext_i64:
+define i64 @pext_i64(i64 %val, i64 %mask) nounwind {
+; BMI2-LABEL: pext_i64:
; BMI2: # %bb.0:
; BMI2-NEXT: pextq %rsi, %rdi, %rax
; BMI2-NEXT: retq
;
-; NOBMI2-LABEL: bext_i64:
+; NOBMI2-LABEL: pext_i64:
; NOBMI2: # %bb.0:
; NOBMI2-NEXT: andq %rsi, %rdi
; NOBMI2-NEXT: movq %rsi, %rax
@@ -2002,49 +2002,49 @@ define i64 @bext_i64(i64 %val, i64 %mask) nounwind {
; NOBMI2-NEXT: shrq $32, %rax
; NOBMI2-NEXT: orq %rdi, %rax
; NOBMI2-NEXT: retq
- %res = call i64 @llvm.bext.i64(i64 %val, i64 %mask)
+ %res = call i64 @llvm.pext.i64(i64 %val, i64 %mask)
ret i64 %res
}
-define i32 @bext_mask_zero(i32 %val) nounwind {
-; BMI2-LABEL: bext_mask_zero:
+define i32 @pext_mask_zero(i32 %val) nounwind {
+; BMI2-LABEL: pext_mask_zero:
; BMI2: # %bb.0:
; BMI2-NEXT: xorl %eax, %eax
; BMI2-NEXT: retq
;
-; NOBMI2-LABEL: bext_mask_zero:
+; NOBMI2-LABEL: pext_mask_zero:
; NOBMI2: # %bb.0:
; NOBMI2-NEXT: xorl %eax, %eax
; NOBMI2-NEXT: retq
- %res = call i32 @llvm.bext.i32(i32 %val, i32 0)
+ %res = call i32 @llvm.pext.i32(i32 %val, i32 0)
ret i32 %res
}
-define i32 @bext_mask_allones(i32 %val) nounwind {
-; BMI2-LABEL: bext_mask_allones:
+define i32 @pext_mask_allones(i32 %val) nounwind {
+; BMI2-LABEL: pext_mask_allones:
; BMI2: # %bb.0:
; BMI2-NEXT: movl %edi, %eax
; BMI2-NEXT: retq
;
-; NOBMI2-LABEL: bext_mask_allones:
+; NOBMI2-LABEL: pext_mask_allones:
; NOBMI2: # %bb.0:
; NOBMI2-NEXT: movl %edi, %eax
; NOBMI2-NEXT: retq
- %res = call i32 @llvm.bext.i32(i32 %val, i32 -1)
+ %res = call i32 @llvm.pext.i32(i32 %val, i32 -1)
ret i32 %res
}
-define i32 @bext_const_fold() nounwind {
-; BMI2-LABEL: bext_const_fold:
+define i32 @pext_const_fold() nounwind {
+; BMI2-LABEL: pext_const_fold:
; BMI2: # %bb.0:
; BMI2-NEXT: movl $10, %eax
; BMI2-NEXT: retq
;
-; NOBMI2-LABEL: bext_const_fold:
+; NOBMI2-LABEL: pext_const_fold:
; NOBMI2: # %bb.0:
; NOBMI2-NEXT: movl $10, %eax
; NOBMI2-NEXT: retq
- %res = call i32 @llvm.bext.i32(i32 170, i32 204)
+ %res = call i32 @llvm.pext.i32(i32 170, i32 204)
ret i32 %res
}
>From 1d089069a271d2d42a13fcd6334aab8fd1243ae4 Mon Sep 17 00:00:00 2001
From: Eisenwave <me at eisenwave.net>
Date: Mon, 1 Jun 2026 06:26:45 +0200
Subject: [PATCH 4/6] Remove unnecessary zero extension
---
llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
index e1ec867312a67..23c2b149c79d9 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
@@ -1778,7 +1778,9 @@ SDValue DAGTypeLegalizer::PromoteIntRes_PEXT(SDNode *N) {
if (SDValue Res = TLI.expandPEXT(N, DAG))
return DAG.getNode(ISD::ANY_EXTEND, DL, VT, Res);
}
- SDValue X = ZExtPromotedInteger(N->getOperand(0));
+ // Only the mask operand needs zero-extension because the implicit AND from
+ // masking clears the corresponding bits in X anyway.
+ SDValue X = GetPromotedInteger(N->getOperand(0));
SDValue Y = ZExtPromotedInteger(N->getOperand(1));
return DAG.getNode(ISD::PEXT, DL, VT, X, Y);
}
@@ -1790,7 +1792,9 @@ SDValue DAGTypeLegalizer::PromoteIntRes_PDEP(SDNode *N) {
if (SDValue Res = TLI.expandPDEP(N, DAG))
return DAG.getNode(ISD::ANY_EXTEND, DL, VT, Res);
}
- SDValue X = ZExtPromotedInteger(N->getOperand(0));
+ // Only the mask operand needs zero-extension because the implicit AND from
+ // masking clears the corresponding bits in X anyway.
+ SDValue X = GetPromotedInteger(N->getOperand(0));
SDValue Y = ZExtPromotedInteger(N->getOperand(1));
return DAG.getNode(ISD::PDEP, DL, VT, X, Y);
}
>From 11ff25d08789bd22151b3f46eeffd4e30d2da458 Mon Sep 17 00:00:00 2001
From: Eisenwave <me at eisenwave.net>
Date: Mon, 1 Jun 2026 06:28:42 +0200
Subject: [PATCH 5/6] Add "parallel" to comments
---
llvm/include/llvm/CodeGen/ISDOpcodes.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/include/llvm/CodeGen/ISDOpcodes.h b/llvm/include/llvm/CodeGen/ISDOpcodes.h
index 740f851593e87..b5c517a07fe91 100644
--- a/llvm/include/llvm/CodeGen/ISDOpcodes.h
+++ b/llvm/include/llvm/CodeGen/ISDOpcodes.h
@@ -779,7 +779,7 @@ enum NodeType {
CLMULR,
CLMULH,
- /// Bit extract (compress) and bit deposit (expand).
+ /// Parallel bit extract (compress) and parallel bit deposit (expand).
PEXT,
PDEP,
>From 18217eb8ccc6a5a98bd1c5bcfae544906d5bb65c Mon Sep 17 00:00:00 2001
From: Eisenwave <me at eisenwave.net>
Date: Mon, 1 Jun 2026 06:56:49 +0200
Subject: [PATCH 6/6] Oops, forgot to regenerate AArch64 expectations
---
llvm/test/CodeGen/AArch64/pdep.ll | 14 ++++++--------
llvm/test/CodeGen/AArch64/pext.ll | 14 ++++++--------
2 files changed, 12 insertions(+), 16 deletions(-)
diff --git a/llvm/test/CodeGen/AArch64/pdep.ll b/llvm/test/CodeGen/AArch64/pdep.ll
index a6be3da398c60..32f5f68943aea 100644
--- a/llvm/test/CodeGen/AArch64/pdep.ll
+++ b/llvm/test/CodeGen/AArch64/pdep.ll
@@ -5,11 +5,10 @@
define i8 @pdep_i8(i8 %val, i8 %mask) nounwind {
; BITPERM-LABEL: pdep_i8:
; BITPERM: // %bb.0:
-; BITPERM-NEXT: and w8, w0, #0xff
-; BITPERM-NEXT: and w9, w1, #0xff
+; BITPERM-NEXT: and w8, w1, #0xff
+; BITPERM-NEXT: fmov s1, w0
; BITPERM-NEXT: fmov s0, w8
-; BITPERM-NEXT: fmov s1, w9
-; BITPERM-NEXT: bdep z0.s, z0.s, z1.s
+; BITPERM-NEXT: bdep z0.s, z1.s, z0.s
; BITPERM-NEXT: fmov w0, s0
; BITPERM-NEXT: ret
;
@@ -57,11 +56,10 @@ define i8 @pdep_i8(i8 %val, i8 %mask) nounwind {
define i16 @pdep_i16(i16 %val, i16 %mask) nounwind {
; BITPERM-LABEL: pdep_i16:
; BITPERM: // %bb.0:
-; BITPERM-NEXT: and w8, w0, #0xffff
-; BITPERM-NEXT: and w9, w1, #0xffff
+; BITPERM-NEXT: and w8, w1, #0xffff
+; BITPERM-NEXT: fmov s1, w0
; BITPERM-NEXT: fmov s0, w8
-; BITPERM-NEXT: fmov s1, w9
-; BITPERM-NEXT: bdep z0.s, z0.s, z1.s
+; BITPERM-NEXT: bdep z0.s, z1.s, z0.s
; BITPERM-NEXT: fmov w0, s0
; BITPERM-NEXT: ret
;
diff --git a/llvm/test/CodeGen/AArch64/pext.ll b/llvm/test/CodeGen/AArch64/pext.ll
index 8da2e232486ec..aa18ce699ca6c 100644
--- a/llvm/test/CodeGen/AArch64/pext.ll
+++ b/llvm/test/CodeGen/AArch64/pext.ll
@@ -5,11 +5,10 @@
define i8 @pext_i8(i8 %val, i8 %mask) nounwind {
; BITPERM-LABEL: pext_i8:
; BITPERM: // %bb.0:
-; BITPERM-NEXT: and w8, w0, #0xff
-; BITPERM-NEXT: and w9, w1, #0xff
+; BITPERM-NEXT: and w8, w1, #0xff
+; BITPERM-NEXT: fmov s1, w0
; BITPERM-NEXT: fmov s0, w8
-; BITPERM-NEXT: fmov s1, w9
-; BITPERM-NEXT: bext z0.s, z0.s, z1.s
+; BITPERM-NEXT: bext z0.s, z1.s, z0.s
; BITPERM-NEXT: fmov w0, s0
; BITPERM-NEXT: ret
;
@@ -60,11 +59,10 @@ define i8 @pext_i8(i8 %val, i8 %mask) nounwind {
define i16 @pext_i16(i16 %val, i16 %mask) nounwind {
; BITPERM-LABEL: pext_i16:
; BITPERM: // %bb.0:
-; BITPERM-NEXT: and w8, w0, #0xffff
-; BITPERM-NEXT: and w9, w1, #0xffff
+; BITPERM-NEXT: and w8, w1, #0xffff
+; BITPERM-NEXT: fmov s1, w0
; BITPERM-NEXT: fmov s0, w8
-; BITPERM-NEXT: fmov s1, w9
-; BITPERM-NEXT: bext z0.s, z0.s, z1.s
+; BITPERM-NEXT: bext z0.s, z1.s, z0.s
; BITPERM-NEXT: fmov w0, s0
; BITPERM-NEXT: ret
;
More information about the llvm-commits
mailing list