[llvm-branch-commits] [llvm] [LoongArch] Support memcmp expansion for vectors and combine for i128/i256 setcc (PR #167828)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Oct 14 19:48:23 PDT 2026
https://github.com/zhaoqi5 updated https://github.com/llvm/llvm-project/pull/167828
>From 995bf183449becec8c1e25026b2ff019d4fd266b Mon Sep 17 00:00:00 2001
From: Qi Zhao <zhaoqi01 at loongson.cn>
Date: Thu, 13 Nov 2025 11:37:27 +0800
Subject: [PATCH 1/2] [LoongArch] Support memcmp expansion for vectors and
combine for i128/i256 setcc
This commit enables memcmp expansion for lsx/lasx. After doing
this, i128 and i256 loads which are illegal types on LoongArch
will be generated. Without process, they will be splited to
legal scalar type.
So this commit also enable combination for `setcc` to bitcast
i128/i256 types to vector types before type legalization and
generate vector instructions.
Inspired by x86 and riscv.
---
.../LoongArch/LoongArchISelLowering.cpp | 132 ++++++++++++++++--
.../LoongArchTargetTransformInfo.cpp | 11 +-
2 files changed, 127 insertions(+), 16 deletions(-)
diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
index 1d01e76a5ebd2d..ec1acf13417e33 100644
--- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
+++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
@@ -7211,16 +7211,8 @@ static SDValue foldVMskZeroTest(SDValue LHS, SDValue RHS, ISD::CondCode CC,
// +-------------+
// | CMP |
// +-------------+
-static SDValue performSETCCCombine(SDNode *N, SelectionDAG &DAG,
- TargetLowering::DAGCombinerInfo &DCI,
- const LoongArchSubtarget &Subtarget) {
- ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();
-
- if (N->getValueType(0) == Subtarget.getGRLenVT())
- if (SDValue V = foldVMskZeroTest(N->getOperand(0), N->getOperand(1), CC,
- SDLoc(N), DAG, Subtarget))
- return V;
-
+static SDValue combineTruncZExtAndSetcc(SDNode *N, SelectionDAG &DAG, EVT VT,
+ ISD::CondCode CC, const SDLoc &DL) {
SDNode *AndNode = N->getOperand(0).getNode();
if (AndNode->getOpcode() != ISD::AND)
return SDValue();
@@ -7276,14 +7268,128 @@ static SDValue performSETCCCombine(SDNode *N, SelectionDAG &DAG,
return SDValue();
// These truncation and zero-extension nodes are not necessary, remove them.
- SDValue NewAnd = DAG.getNode(ISD::AND, SDLoc(N), AndNode->getValueType(0),
+ SDValue NewAnd = DAG.getNode(ISD::AND, DL, AndNode->getValueType(0),
TruncInputValue1, TruncInputValue2);
- SDValue NewSetCC =
- DAG.getSetCC(SDLoc(N), N->getValueType(0), NewAnd, TruncInputValue2, CC);
+ SDValue NewSetCC = DAG.getSetCC(DL, VT, NewAnd, TruncInputValue2, CC);
DAG.ReplaceAllUsesWith(N, NewSetCC.getNode());
return SDValue(N, 0);
}
+/// Recursive helper for combineVectorSizedSetCCEquality() to see if we have a
+/// recognizable memcmp expansion.
+static bool isOrXorXorTree(SDValue X, bool Root = true) {
+ if (X.getOpcode() == ISD::OR)
+ return isOrXorXorTree(X.getOperand(0), false) &&
+ isOrXorXorTree(X.getOperand(1), false);
+ if (Root)
+ return false;
+ return X.getOpcode() == ISD::XOR;
+}
+
+/// Recursive helper for combineVectorSizedSetCCEquality() to emit the memcmp
+/// expansion.
+static SDValue emitOrXorXorTree(SDValue X, const SDLoc &DL, SelectionDAG &DAG,
+ EVT VecVT) {
+ SDValue Op0 = X.getOperand(0);
+ SDValue Op1 = X.getOperand(1);
+ if (X.getOpcode() == ISD::OR) {
+ SDValue A = emitOrXorXorTree(Op0, DL, DAG, VecVT);
+ SDValue B = emitOrXorXorTree(Op1, DL, DAG, VecVT);
+ return DAG.getNode(ISD::OR, DL, VecVT, A, B);
+ }
+ if (X.getOpcode() == ISD::XOR) {
+ SDValue A = DAG.getBitcast(VecVT, Op0);
+ SDValue B = DAG.getBitcast(VecVT, Op1);
+ return DAG.getNode(ISD::XOR, DL, VecVT, A, B);
+ }
+ llvm_unreachable("Impossible");
+}
+
+/// Try to map a 128-bit or 256-bit integer comparison to vector instructions
+/// before type legalization splits it up into chunks.
+static SDValue
+combineVectorSizedSetCCEquality(EVT VT, SDValue X, SDValue Y, ISD::CondCode CC,
+ const SDLoc &DL, SelectionDAG &DAG,
+ const LoongArchSubtarget &Subtarget) {
+ assert(isIntEqualitySetCC(CC) && "Bad comparison predicate");
+
+ EVT OpVT = X.getValueType();
+ unsigned OpSize = OpVT.getSizeInBits();
+ MVT GRLenVT = Subtarget.getGRLenVT();
+
+ // We're looking for an oversized integer equality comparison.
+ if (!OpVT.isScalarInteger())
+ return SDValue();
+
+ if (!(OpSize == 128 && Subtarget.hasExtLSX()) &&
+ !(OpSize == 256 && Subtarget.hasExtLASX()))
+ return SDValue();
+
+ if (DAG.getMachineFunction().getFunction().hasFnAttribute(
+ Attribute::NoImplicitFloat))
+ return SDValue();
+
+ // Check if this is a bitwise-combined equality comparison of 2 pairs of
+ // vectors:
+ // setcc i128 (or (xor A, B), (xor C, D)), 0, eq|ne
+ bool IsOrXorXorTreeCCZero = isNullConstant(Y) && isOrXorXorTree(X);
+
+ // Don't perform this combine if constructing the vector will be expensive.
+ auto IsVectorBitCastCheap = [](SDValue X) {
+ X = peekThroughBitcasts(X);
+ return isa<ConstantSDNode>(X) || X.getValueType().isVector() ||
+ X.getOpcode() == ISD::LOAD;
+ };
+
+ if ((!IsVectorBitCastCheap(X) || !IsVectorBitCastCheap(Y)) &&
+ !IsOrXorXorTreeCCZero)
+ return SDValue();
+
+ // Treat as v2i64/v4i64 on LA64 and v4i32/v8i32 on LA32.
+ unsigned VecSize = OpSize / (Subtarget.is64Bit() ? 64 : 32);
+ EVT VecVT =
+ MVT::getVectorVT(Subtarget.is64Bit() ? MVT::i64 : MVT::i32, VecSize);
+
+ SDValue Cmp;
+ if (IsOrXorXorTreeCCZero) {
+ Cmp = emitOrXorXorTree(X, DL, DAG, VecVT);
+ } else {
+ SDValue VecX = DAG.getBitcast(VecVT, X);
+ SDValue VecY = DAG.getBitcast(VecVT, Y);
+ Cmp = DAG.getNode(ISD::XOR, DL, VecVT, VecX, VecY);
+ }
+
+ return DAG.getSetCC(DL, VT, DAG.getNode(ISD::VECREDUCE_OR, DL, GRLenVT, Cmp),
+ DAG.getConstant(0, DL, GRLenVT), CC);
+}
+
+static SDValue performSETCCCombine(SDNode *N, SelectionDAG &DAG,
+ TargetLowering::DAGCombinerInfo &DCI,
+ const LoongArchSubtarget &Subtarget) {
+ SDLoc DL(N);
+ EVT VT = N->getValueType(0);
+ SDValue N0 = N->getOperand(0);
+ SDValue N1 = N->getOperand(1);
+ ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();
+
+ if (N->getValueType(0) == Subtarget.getGRLenVT())
+ if (SDValue V = foldVMskZeroTest(N->getOperand(0), N->getOperand(1), CC,
+ SDLoc(N), DAG, Subtarget))
+ return V;
+
+ if (SDValue V = combineTruncZExtAndSetcc(N, DAG, VT, CC, DL))
+ return V;
+
+ if (!isIntEqualitySetCC(CC))
+ return SDValue();
+
+ if (SDValue V =
+ combineVectorSizedSetCCEquality(VT, N0, N1, CC, DL, DAG, Subtarget))
+ return V;
+
+ return SDValue();
+}
+
// Strip a single outer ISD::SIGN_EXTEND_INREG from \p V, if present, and
// return the inner value together with the narrow VT it was extending
// from. If no such node is present, returns \p V unchanged and an invalid
diff --git a/llvm/lib/Target/LoongArch/LoongArchTargetTransformInfo.cpp b/llvm/lib/Target/LoongArch/LoongArchTargetTransformInfo.cpp
index 6646841b93215f..f4c74db772faf9 100644
--- a/llvm/lib/Target/LoongArch/LoongArchTargetTransformInfo.cpp
+++ b/llvm/lib/Target/LoongArch/LoongArchTargetTransformInfo.cpp
@@ -124,12 +124,17 @@ LoongArchTTIImpl::enableMemCmpExpansion(bool OptSize, bool IsZeroCmp) const {
Options.NumLoadsPerBlock = IsZeroCmp ? Options.MaxNumLoads : 1;
Options.AllowOverlappingLoads = true;
- // TODO: Support for vectors.
+ if (IsZeroCmp && ST->hasExtLSX()) {
+ if (ST->hasExtLASX())
+ Options.LoadSizes.push_back(32);
+ Options.LoadSizes.push_back(16);
+ }
+
if (ST->is64Bit()) {
- Options.LoadSizes = {8, 4, 2, 1};
+ Options.LoadSizes.append({8, 4, 2, 1});
Options.AllowedTailExpansions = {3, 5, 6};
} else {
- Options.LoadSizes = {4, 2, 1};
+ Options.LoadSizes.append({4, 2, 1});
Options.AllowedTailExpansions = {3};
}
>From e94aeadb5d37b3742329797ff8092b55f81fc28d Mon Sep 17 00:00:00 2001
From: Qi Zhao <zhaoqi01 at loongson.cn>
Date: Thu, 13 Nov 2025 11:54:29 +0800
Subject: [PATCH 2/2] update tests
---
.../CodeGen/LoongArch/expandmemcmp-optsize.ll | 767 +++++++++++---
llvm/test/CodeGen/LoongArch/expandmemcmp.ll | 969 ++++++++++++------
2 files changed, 1283 insertions(+), 453 deletions(-)
diff --git a/llvm/test/CodeGen/LoongArch/expandmemcmp-optsize.ll b/llvm/test/CodeGen/LoongArch/expandmemcmp-optsize.ll
index e0b5ea2478a44f..add9907ebfd379 100644
--- a/llvm/test/CodeGen/LoongArch/expandmemcmp-optsize.ll
+++ b/llvm/test/CodeGen/LoongArch/expandmemcmp-optsize.ll
@@ -498,33 +498,25 @@ define signext i32 @bcmp_size_16(ptr %s1, ptr %s2) nounwind optsize {
;
; LA32-UAL-V-LABEL: bcmp_size_16:
; LA32-UAL-V: # %bb.0: # %entry
-; LA32-UAL-V-NEXT: ld.w $a2, $a0, 0
-; LA32-UAL-V-NEXT: ld.w $a3, $a1, 0
-; LA32-UAL-V-NEXT: ld.w $a4, $a0, 4
-; LA32-UAL-V-NEXT: ld.w $a5, $a1, 4
-; LA32-UAL-V-NEXT: ld.w $a6, $a0, 8
-; LA32-UAL-V-NEXT: ld.w $a7, $a1, 8
-; LA32-UAL-V-NEXT: ld.w $a0, $a0, 12
-; LA32-UAL-V-NEXT: ld.w $a1, $a1, 12
-; LA32-UAL-V-NEXT: xor $a2, $a2, $a3
-; LA32-UAL-V-NEXT: xor $a3, $a4, $a5
-; LA32-UAL-V-NEXT: xor $a4, $a6, $a7
-; LA32-UAL-V-NEXT: xor $a0, $a0, $a1
-; LA32-UAL-V-NEXT: or $a1, $a2, $a3
-; LA32-UAL-V-NEXT: or $a0, $a4, $a0
-; LA32-UAL-V-NEXT: or $a0, $a1, $a0
+; LA32-UAL-V-NEXT: vld $vr0, $a0, 0
+; LA32-UAL-V-NEXT: vld $vr1, $a1, 0
+; LA32-UAL-V-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA32-UAL-V-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-V-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-V-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-V-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-V-NEXT: vpickve2gr.w $a0, $vr0, 0
; LA32-UAL-V-NEXT: sltu $a0, $zero, $a0
; LA32-UAL-V-NEXT: ret
;
; LA64-UAL-V-LABEL: bcmp_size_16:
; LA64-UAL-V: # %bb.0: # %entry
-; LA64-UAL-V-NEXT: ld.d $a2, $a0, 0
-; LA64-UAL-V-NEXT: ld.d $a3, $a1, 0
-; LA64-UAL-V-NEXT: ld.d $a0, $a0, 8
-; LA64-UAL-V-NEXT: ld.d $a1, $a1, 8
-; LA64-UAL-V-NEXT: xor $a2, $a2, $a3
-; LA64-UAL-V-NEXT: xor $a0, $a0, $a1
-; LA64-UAL-V-NEXT: or $a0, $a2, $a0
+; LA64-UAL-V-NEXT: vld $vr0, $a0, 0
+; LA64-UAL-V-NEXT: vld $vr1, $a1, 0
+; LA64-UAL-V-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA64-UAL-V-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-V-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-V-NEXT: vpickve2gr.d $a0, $vr0, 0
; LA64-UAL-V-NEXT: sltu $a0, $zero, $a0
; LA64-UAL-V-NEXT: ret
;
@@ -554,15 +546,15 @@ entry:
}
define signext i32 @bcmp_size_31(ptr %s1, ptr %s2) nounwind optsize {
-; LA32-LABEL: bcmp_size_31:
-; LA32: # %bb.0: # %entry
-; LA32-NEXT: addi.w $sp, $sp, -16
-; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
-; LA32-NEXT: ori $a2, $zero, 31
-; LA32-NEXT: bl bcmp
-; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
-; LA32-NEXT: addi.w $sp, $sp, 16
-; LA32-NEXT: ret
+; LA32-UAL-LABEL: bcmp_size_31:
+; LA32-UAL: # %bb.0: # %entry
+; LA32-UAL-NEXT: addi.w $sp, $sp, -16
+; LA32-UAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-UAL-NEXT: ori $a2, $zero, 31
+; LA32-UAL-NEXT: bl bcmp
+; LA32-UAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-UAL-NEXT: addi.w $sp, $sp, 16
+; LA32-UAL-NEXT: ret
;
; LA64-UAL-LABEL: bcmp_size_31:
; LA64-UAL: # %bb.0: # %entry
@@ -584,26 +576,48 @@ define signext i32 @bcmp_size_31(ptr %s1, ptr %s2) nounwind optsize {
; LA64-UAL-NEXT: sltu $a0, $zero, $a0
; LA64-UAL-NEXT: ret
;
+; LA32-UAL-V-LABEL: bcmp_size_31:
+; LA32-UAL-V: # %bb.0: # %entry
+; LA32-UAL-V-NEXT: vld $vr0, $a0, 0
+; LA32-UAL-V-NEXT: vld $vr1, $a0, 15
+; LA32-UAL-V-NEXT: vld $vr2, $a1, 15
+; LA32-UAL-V-NEXT: vld $vr3, $a1, 0
+; LA32-UAL-V-NEXT: vxor.v $vr1, $vr1, $vr2
+; LA32-UAL-V-NEXT: vxor.v $vr0, $vr0, $vr3
+; LA32-UAL-V-NEXT: vor.v $vr0, $vr0, $vr1
+; LA32-UAL-V-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-V-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-V-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-V-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-V-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-V-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-V-NEXT: ret
+;
; LA64-UAL-V-LABEL: bcmp_size_31:
; LA64-UAL-V: # %bb.0: # %entry
-; LA64-UAL-V-NEXT: ld.d $a2, $a0, 0
-; LA64-UAL-V-NEXT: ld.d $a3, $a1, 0
-; LA64-UAL-V-NEXT: ld.d $a4, $a0, 8
-; LA64-UAL-V-NEXT: ld.d $a5, $a1, 8
-; LA64-UAL-V-NEXT: ld.d $a6, $a0, 16
-; LA64-UAL-V-NEXT: ld.d $a7, $a1, 16
-; LA64-UAL-V-NEXT: ld.d $a0, $a0, 23
-; LA64-UAL-V-NEXT: ld.d $a1, $a1, 23
-; LA64-UAL-V-NEXT: xor $a2, $a2, $a3
-; LA64-UAL-V-NEXT: xor $a3, $a4, $a5
-; LA64-UAL-V-NEXT: xor $a4, $a6, $a7
-; LA64-UAL-V-NEXT: xor $a0, $a0, $a1
-; LA64-UAL-V-NEXT: or $a1, $a2, $a3
-; LA64-UAL-V-NEXT: or $a0, $a4, $a0
-; LA64-UAL-V-NEXT: or $a0, $a1, $a0
+; LA64-UAL-V-NEXT: vld $vr0, $a0, 0
+; LA64-UAL-V-NEXT: vld $vr1, $a0, 15
+; LA64-UAL-V-NEXT: vld $vr2, $a1, 15
+; LA64-UAL-V-NEXT: vld $vr3, $a1, 0
+; LA64-UAL-V-NEXT: vxor.v $vr1, $vr1, $vr2
+; LA64-UAL-V-NEXT: vxor.v $vr0, $vr0, $vr3
+; LA64-UAL-V-NEXT: vor.v $vr0, $vr0, $vr1
+; LA64-UAL-V-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-V-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-V-NEXT: vpickve2gr.d $a0, $vr0, 0
; LA64-UAL-V-NEXT: sltu $a0, $zero, $a0
; LA64-UAL-V-NEXT: ret
;
+; LA32-NUAL-LABEL: bcmp_size_31:
+; LA32-NUAL: # %bb.0: # %entry
+; LA32-NUAL-NEXT: addi.w $sp, $sp, -16
+; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-NUAL-NEXT: ori $a2, $zero, 31
+; LA32-NUAL-NEXT: bl bcmp
+; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-NUAL-NEXT: addi.w $sp, $sp, 16
+; LA32-NUAL-NEXT: ret
+;
; LA64-NUAL-LABEL: bcmp_size_31:
; LA64-NUAL: # %bb.0: # %entry
; LA64-NUAL-NEXT: addi.d $sp, $sp, -16
@@ -620,15 +634,15 @@ entry:
}
define signext i32 @bcmp_size_32(ptr %s1, ptr %s2) nounwind optsize {
-; LA32-LABEL: bcmp_size_32:
-; LA32: # %bb.0: # %entry
-; LA32-NEXT: addi.w $sp, $sp, -16
-; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
-; LA32-NEXT: ori $a2, $zero, 32
-; LA32-NEXT: bl bcmp
-; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
-; LA32-NEXT: addi.w $sp, $sp, 16
-; LA32-NEXT: ret
+; LA32-UAL-LABEL: bcmp_size_32:
+; LA32-UAL: # %bb.0: # %entry
+; LA32-UAL-NEXT: addi.w $sp, $sp, -16
+; LA32-UAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-UAL-NEXT: ori $a2, $zero, 32
+; LA32-UAL-NEXT: bl bcmp
+; LA32-UAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-UAL-NEXT: addi.w $sp, $sp, 16
+; LA32-UAL-NEXT: ret
;
; LA64-UAL-LABEL: bcmp_size_32:
; LA64-UAL: # %bb.0: # %entry
@@ -650,25 +664,75 @@ define signext i32 @bcmp_size_32(ptr %s1, ptr %s2) nounwind optsize {
; LA64-UAL-NEXT: sltu $a0, $zero, $a0
; LA64-UAL-NEXT: ret
;
-; LA64-UAL-V-LABEL: bcmp_size_32:
-; LA64-UAL-V: # %bb.0: # %entry
-; LA64-UAL-V-NEXT: ld.d $a2, $a0, 0
-; LA64-UAL-V-NEXT: ld.d $a3, $a1, 0
-; LA64-UAL-V-NEXT: ld.d $a4, $a0, 8
-; LA64-UAL-V-NEXT: ld.d $a5, $a1, 8
-; LA64-UAL-V-NEXT: ld.d $a6, $a0, 16
-; LA64-UAL-V-NEXT: ld.d $a7, $a1, 16
-; LA64-UAL-V-NEXT: ld.d $a0, $a0, 24
-; LA64-UAL-V-NEXT: ld.d $a1, $a1, 24
-; LA64-UAL-V-NEXT: xor $a2, $a2, $a3
-; LA64-UAL-V-NEXT: xor $a3, $a4, $a5
-; LA64-UAL-V-NEXT: xor $a4, $a6, $a7
-; LA64-UAL-V-NEXT: xor $a0, $a0, $a1
-; LA64-UAL-V-NEXT: or $a1, $a2, $a3
-; LA64-UAL-V-NEXT: or $a0, $a4, $a0
-; LA64-UAL-V-NEXT: or $a0, $a1, $a0
-; LA64-UAL-V-NEXT: sltu $a0, $zero, $a0
-; LA64-UAL-V-NEXT: ret
+; LA32-UAL-LSX-LABEL: bcmp_size_32:
+; LA32-UAL-LSX: # %bb.0: # %entry
+; LA32-UAL-LSX-NEXT: vld $vr0, $a0, 0
+; LA32-UAL-LSX-NEXT: vld $vr1, $a0, 16
+; LA32-UAL-LSX-NEXT: vld $vr2, $a1, 16
+; LA32-UAL-LSX-NEXT: vld $vr3, $a1, 0
+; LA32-UAL-LSX-NEXT: vxor.v $vr1, $vr1, $vr2
+; LA32-UAL-LSX-NEXT: vxor.v $vr0, $vr0, $vr3
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA32-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LSX-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-LSX-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-LSX-NEXT: ret
+;
+; LA64-UAL-LSX-LABEL: bcmp_size_32:
+; LA64-UAL-LSX: # %bb.0: # %entry
+; LA64-UAL-LSX-NEXT: vld $vr0, $a0, 0
+; LA64-UAL-LSX-NEXT: vld $vr1, $a0, 16
+; LA64-UAL-LSX-NEXT: vld $vr2, $a1, 16
+; LA64-UAL-LSX-NEXT: vld $vr3, $a1, 0
+; LA64-UAL-LSX-NEXT: vxor.v $vr1, $vr1, $vr2
+; LA64-UAL-LSX-NEXT: vxor.v $vr0, $vr0, $vr3
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA64-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-LSX-NEXT: vpickve2gr.d $a0, $vr0, 0
+; LA64-UAL-LSX-NEXT: sltu $a0, $zero, $a0
+; LA64-UAL-LSX-NEXT: ret
+;
+; LA32-UAL-LASX-LABEL: bcmp_size_32:
+; LA32-UAL-LASX: # %bb.0: # %entry
+; LA32-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA32-UAL-LASX-NEXT: xvld $xr1, $a1, 0
+; LA32-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr1
+; LA32-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-LASX-NEXT: ret
+;
+; LA64-UAL-LASX-LABEL: bcmp_size_32:
+; LA64-UAL-LASX: # %bb.0: # %entry
+; LA64-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA64-UAL-LASX-NEXT: xvld $xr1, $a1, 0
+; LA64-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr1
+; LA64-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA64-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-LASX-NEXT: vpickve2gr.d $a0, $vr0, 0
+; LA64-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA64-UAL-LASX-NEXT: ret
+;
+; LA32-NUAL-LABEL: bcmp_size_32:
+; LA32-NUAL: # %bb.0: # %entry
+; LA32-NUAL-NEXT: addi.w $sp, $sp, -16
+; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-NUAL-NEXT: ori $a2, $zero, 32
+; LA32-NUAL-NEXT: bl bcmp
+; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-NUAL-NEXT: addi.w $sp, $sp, 16
+; LA32-NUAL-NEXT: ret
;
; LA64-NUAL-LABEL: bcmp_size_32:
; LA64-NUAL: # %bb.0: # %entry
@@ -686,104 +750,502 @@ entry:
}
define signext i32 @bcmp_size_63(ptr %s1, ptr %s2) nounwind optsize {
-; LA32-LABEL: bcmp_size_63:
-; LA32: # %bb.0: # %entry
-; LA32-NEXT: addi.w $sp, $sp, -16
-; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
-; LA32-NEXT: ori $a2, $zero, 63
-; LA32-NEXT: bl bcmp
-; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
-; LA32-NEXT: addi.w $sp, $sp, 16
-; LA32-NEXT: ret
+; LA32-UAL-LABEL: bcmp_size_63:
+; LA32-UAL: # %bb.0: # %entry
+; LA32-UAL-NEXT: addi.w $sp, $sp, -16
+; LA32-UAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-UAL-NEXT: ori $a2, $zero, 63
+; LA32-UAL-NEXT: bl bcmp
+; LA32-UAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-UAL-NEXT: addi.w $sp, $sp, 16
+; LA32-UAL-NEXT: ret
;
-; LA64-LABEL: bcmp_size_63:
-; LA64: # %bb.0: # %entry
-; LA64-NEXT: addi.d $sp, $sp, -16
-; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
-; LA64-NEXT: ori $a2, $zero, 63
-; LA64-NEXT: pcaddu18i $ra, %call36(bcmp)
-; LA64-NEXT: jirl $ra, $ra, 0
-; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
-; LA64-NEXT: addi.d $sp, $sp, 16
-; LA64-NEXT: ret
+; LA64-UAL-LABEL: bcmp_size_63:
+; LA64-UAL: # %bb.0: # %entry
+; LA64-UAL-NEXT: addi.d $sp, $sp, -16
+; LA64-UAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64-UAL-NEXT: ori $a2, $zero, 63
+; LA64-UAL-NEXT: pcaddu18i $ra, %call36(bcmp)
+; LA64-UAL-NEXT: jirl $ra, $ra, 0
+; LA64-UAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64-UAL-NEXT: addi.d $sp, $sp, 16
+; LA64-UAL-NEXT: ret
+;
+; LA32-UAL-LSX-LABEL: bcmp_size_63:
+; LA32-UAL-LSX: # %bb.0: # %entry
+; LA32-UAL-LSX-NEXT: vld $vr0, $a0, 0
+; LA32-UAL-LSX-NEXT: vld $vr1, $a1, 0
+; LA32-UAL-LSX-NEXT: vld $vr2, $a0, 32
+; LA32-UAL-LSX-NEXT: vld $vr3, $a0, 47
+; LA32-UAL-LSX-NEXT: vld $vr4, $a1, 47
+; LA32-UAL-LSX-NEXT: vld $vr5, $a1, 32
+; LA32-UAL-LSX-NEXT: vld $vr6, $a0, 16
+; LA32-UAL-LSX-NEXT: vld $vr7, $a1, 16
+; LA32-UAL-LSX-NEXT: vxor.v $vr3, $vr3, $vr4
+; LA32-UAL-LSX-NEXT: vxor.v $vr2, $vr2, $vr5
+; LA32-UAL-LSX-NEXT: vor.v $vr2, $vr2, $vr3
+; LA32-UAL-LSX-NEXT: vxor.v $vr3, $vr6, $vr7
+; LA32-UAL-LSX-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr3
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr2
+; LA32-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LSX-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-LSX-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-LSX-NEXT: ret
+;
+; LA64-UAL-LSX-LABEL: bcmp_size_63:
+; LA64-UAL-LSX: # %bb.0: # %entry
+; LA64-UAL-LSX-NEXT: vld $vr0, $a0, 0
+; LA64-UAL-LSX-NEXT: vld $vr1, $a1, 0
+; LA64-UAL-LSX-NEXT: vld $vr2, $a0, 32
+; LA64-UAL-LSX-NEXT: vld $vr3, $a0, 47
+; LA64-UAL-LSX-NEXT: vld $vr4, $a1, 47
+; LA64-UAL-LSX-NEXT: vld $vr5, $a1, 32
+; LA64-UAL-LSX-NEXT: vld $vr6, $a0, 16
+; LA64-UAL-LSX-NEXT: vld $vr7, $a1, 16
+; LA64-UAL-LSX-NEXT: vxor.v $vr3, $vr3, $vr4
+; LA64-UAL-LSX-NEXT: vxor.v $vr2, $vr2, $vr5
+; LA64-UAL-LSX-NEXT: vor.v $vr2, $vr2, $vr3
+; LA64-UAL-LSX-NEXT: vxor.v $vr3, $vr6, $vr7
+; LA64-UAL-LSX-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr3
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr2
+; LA64-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-LSX-NEXT: vpickve2gr.d $a0, $vr0, 0
+; LA64-UAL-LSX-NEXT: sltu $a0, $zero, $a0
+; LA64-UAL-LSX-NEXT: ret
+;
+; LA32-UAL-LASX-LABEL: bcmp_size_63:
+; LA32-UAL-LASX: # %bb.0: # %entry
+; LA32-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA32-UAL-LASX-NEXT: xvld $xr1, $a0, 31
+; LA32-UAL-LASX-NEXT: xvld $xr2, $a1, 31
+; LA32-UAL-LASX-NEXT: xvld $xr3, $a1, 0
+; LA32-UAL-LASX-NEXT: xvxor.v $xr1, $xr1, $xr2
+; LA32-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr3
+; LA32-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr1
+; LA32-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-LASX-NEXT: ret
+;
+; LA64-UAL-LASX-LABEL: bcmp_size_63:
+; LA64-UAL-LASX: # %bb.0: # %entry
+; LA64-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA64-UAL-LASX-NEXT: xvld $xr1, $a0, 31
+; LA64-UAL-LASX-NEXT: xvld $xr2, $a1, 31
+; LA64-UAL-LASX-NEXT: xvld $xr3, $a1, 0
+; LA64-UAL-LASX-NEXT: xvxor.v $xr1, $xr1, $xr2
+; LA64-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr3
+; LA64-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr1
+; LA64-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA64-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-LASX-NEXT: vpickve2gr.d $a0, $vr0, 0
+; LA64-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA64-UAL-LASX-NEXT: ret
+;
+; LA32-NUAL-LABEL: bcmp_size_63:
+; LA32-NUAL: # %bb.0: # %entry
+; LA32-NUAL-NEXT: addi.w $sp, $sp, -16
+; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-NUAL-NEXT: ori $a2, $zero, 63
+; LA32-NUAL-NEXT: bl bcmp
+; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-NUAL-NEXT: addi.w $sp, $sp, 16
+; LA32-NUAL-NEXT: ret
+;
+; LA64-NUAL-LABEL: bcmp_size_63:
+; LA64-NUAL: # %bb.0: # %entry
+; LA64-NUAL-NEXT: addi.d $sp, $sp, -16
+; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64-NUAL-NEXT: ori $a2, $zero, 63
+; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp)
+; LA64-NUAL-NEXT: jirl $ra, $ra, 0
+; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64-NUAL-NEXT: addi.d $sp, $sp, 16
+; LA64-NUAL-NEXT: ret
entry:
%bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 63)
ret i32 %bcmp
}
define signext i32 @bcmp_size_64(ptr %s1, ptr %s2) nounwind optsize {
-; LA32-LABEL: bcmp_size_64:
-; LA32: # %bb.0: # %entry
-; LA32-NEXT: addi.w $sp, $sp, -16
-; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
-; LA32-NEXT: ori $a2, $zero, 64
-; LA32-NEXT: bl bcmp
-; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
-; LA32-NEXT: addi.w $sp, $sp, 16
-; LA32-NEXT: ret
+; LA32-UAL-LABEL: bcmp_size_64:
+; LA32-UAL: # %bb.0: # %entry
+; LA32-UAL-NEXT: addi.w $sp, $sp, -16
+; LA32-UAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-UAL-NEXT: ori $a2, $zero, 64
+; LA32-UAL-NEXT: bl bcmp
+; LA32-UAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-UAL-NEXT: addi.w $sp, $sp, 16
+; LA32-UAL-NEXT: ret
;
-; LA64-LABEL: bcmp_size_64:
-; LA64: # %bb.0: # %entry
-; LA64-NEXT: addi.d $sp, $sp, -16
-; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
-; LA64-NEXT: ori $a2, $zero, 64
-; LA64-NEXT: pcaddu18i $ra, %call36(bcmp)
-; LA64-NEXT: jirl $ra, $ra, 0
-; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
-; LA64-NEXT: addi.d $sp, $sp, 16
-; LA64-NEXT: ret
+; LA64-UAL-LABEL: bcmp_size_64:
+; LA64-UAL: # %bb.0: # %entry
+; LA64-UAL-NEXT: addi.d $sp, $sp, -16
+; LA64-UAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64-UAL-NEXT: ori $a2, $zero, 64
+; LA64-UAL-NEXT: pcaddu18i $ra, %call36(bcmp)
+; LA64-UAL-NEXT: jirl $ra, $ra, 0
+; LA64-UAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64-UAL-NEXT: addi.d $sp, $sp, 16
+; LA64-UAL-NEXT: ret
+;
+; LA32-UAL-LSX-LABEL: bcmp_size_64:
+; LA32-UAL-LSX: # %bb.0: # %entry
+; LA32-UAL-LSX-NEXT: vld $vr0, $a0, 0
+; LA32-UAL-LSX-NEXT: vld $vr1, $a1, 0
+; LA32-UAL-LSX-NEXT: vld $vr2, $a0, 32
+; LA32-UAL-LSX-NEXT: vld $vr3, $a0, 48
+; LA32-UAL-LSX-NEXT: vld $vr4, $a1, 48
+; LA32-UAL-LSX-NEXT: vld $vr5, $a1, 32
+; LA32-UAL-LSX-NEXT: vld $vr6, $a0, 16
+; LA32-UAL-LSX-NEXT: vld $vr7, $a1, 16
+; LA32-UAL-LSX-NEXT: vxor.v $vr3, $vr3, $vr4
+; LA32-UAL-LSX-NEXT: vxor.v $vr2, $vr2, $vr5
+; LA32-UAL-LSX-NEXT: vor.v $vr2, $vr2, $vr3
+; LA32-UAL-LSX-NEXT: vxor.v $vr3, $vr6, $vr7
+; LA32-UAL-LSX-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr3
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr2
+; LA32-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LSX-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-LSX-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-LSX-NEXT: ret
+;
+; LA64-UAL-LSX-LABEL: bcmp_size_64:
+; LA64-UAL-LSX: # %bb.0: # %entry
+; LA64-UAL-LSX-NEXT: vld $vr0, $a0, 0
+; LA64-UAL-LSX-NEXT: vld $vr1, $a1, 0
+; LA64-UAL-LSX-NEXT: vld $vr2, $a0, 32
+; LA64-UAL-LSX-NEXT: vld $vr3, $a0, 48
+; LA64-UAL-LSX-NEXT: vld $vr4, $a1, 48
+; LA64-UAL-LSX-NEXT: vld $vr5, $a1, 32
+; LA64-UAL-LSX-NEXT: vld $vr6, $a0, 16
+; LA64-UAL-LSX-NEXT: vld $vr7, $a1, 16
+; LA64-UAL-LSX-NEXT: vxor.v $vr3, $vr3, $vr4
+; LA64-UAL-LSX-NEXT: vxor.v $vr2, $vr2, $vr5
+; LA64-UAL-LSX-NEXT: vor.v $vr2, $vr2, $vr3
+; LA64-UAL-LSX-NEXT: vxor.v $vr3, $vr6, $vr7
+; LA64-UAL-LSX-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr3
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr2
+; LA64-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-LSX-NEXT: vpickve2gr.d $a0, $vr0, 0
+; LA64-UAL-LSX-NEXT: sltu $a0, $zero, $a0
+; LA64-UAL-LSX-NEXT: ret
+;
+; LA32-UAL-LASX-LABEL: bcmp_size_64:
+; LA32-UAL-LASX: # %bb.0: # %entry
+; LA32-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA32-UAL-LASX-NEXT: xvld $xr1, $a0, 32
+; LA32-UAL-LASX-NEXT: xvld $xr2, $a1, 32
+; LA32-UAL-LASX-NEXT: xvld $xr3, $a1, 0
+; LA32-UAL-LASX-NEXT: xvxor.v $xr1, $xr1, $xr2
+; LA32-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr3
+; LA32-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr1
+; LA32-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-LASX-NEXT: ret
+;
+; LA64-UAL-LASX-LABEL: bcmp_size_64:
+; LA64-UAL-LASX: # %bb.0: # %entry
+; LA64-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA64-UAL-LASX-NEXT: xvld $xr1, $a0, 32
+; LA64-UAL-LASX-NEXT: xvld $xr2, $a1, 32
+; LA64-UAL-LASX-NEXT: xvld $xr3, $a1, 0
+; LA64-UAL-LASX-NEXT: xvxor.v $xr1, $xr1, $xr2
+; LA64-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr3
+; LA64-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr1
+; LA64-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA64-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-LASX-NEXT: vpickve2gr.d $a0, $vr0, 0
+; LA64-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA64-UAL-LASX-NEXT: ret
+;
+; LA32-NUAL-LABEL: bcmp_size_64:
+; LA32-NUAL: # %bb.0: # %entry
+; LA32-NUAL-NEXT: addi.w $sp, $sp, -16
+; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-NUAL-NEXT: ori $a2, $zero, 64
+; LA32-NUAL-NEXT: bl bcmp
+; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-NUAL-NEXT: addi.w $sp, $sp, 16
+; LA32-NUAL-NEXT: ret
+;
+; LA64-NUAL-LABEL: bcmp_size_64:
+; LA64-NUAL: # %bb.0: # %entry
+; LA64-NUAL-NEXT: addi.d $sp, $sp, -16
+; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64-NUAL-NEXT: ori $a2, $zero, 64
+; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp)
+; LA64-NUAL-NEXT: jirl $ra, $ra, 0
+; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64-NUAL-NEXT: addi.d $sp, $sp, 16
+; LA64-NUAL-NEXT: ret
entry:
%bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 64)
ret i32 %bcmp
}
define signext i32 @bcmp_size_127(ptr %s1, ptr %s2) nounwind optsize {
-; LA32-LABEL: bcmp_size_127:
-; LA32: # %bb.0: # %entry
-; LA32-NEXT: addi.w $sp, $sp, -16
-; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
-; LA32-NEXT: ori $a2, $zero, 127
-; LA32-NEXT: bl bcmp
-; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
-; LA32-NEXT: addi.w $sp, $sp, 16
-; LA32-NEXT: ret
+; LA32-UAL-LABEL: bcmp_size_127:
+; LA32-UAL: # %bb.0: # %entry
+; LA32-UAL-NEXT: addi.w $sp, $sp, -16
+; LA32-UAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-UAL-NEXT: ori $a2, $zero, 127
+; LA32-UAL-NEXT: bl bcmp
+; LA32-UAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-UAL-NEXT: addi.w $sp, $sp, 16
+; LA32-UAL-NEXT: ret
;
-; LA64-LABEL: bcmp_size_127:
-; LA64: # %bb.0: # %entry
-; LA64-NEXT: addi.d $sp, $sp, -16
-; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
-; LA64-NEXT: ori $a2, $zero, 127
-; LA64-NEXT: pcaddu18i $ra, %call36(bcmp)
-; LA64-NEXT: jirl $ra, $ra, 0
-; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
-; LA64-NEXT: addi.d $sp, $sp, 16
-; LA64-NEXT: ret
+; LA64-UAL-LABEL: bcmp_size_127:
+; LA64-UAL: # %bb.0: # %entry
+; LA64-UAL-NEXT: addi.d $sp, $sp, -16
+; LA64-UAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64-UAL-NEXT: ori $a2, $zero, 127
+; LA64-UAL-NEXT: pcaddu18i $ra, %call36(bcmp)
+; LA64-UAL-NEXT: jirl $ra, $ra, 0
+; LA64-UAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64-UAL-NEXT: addi.d $sp, $sp, 16
+; LA64-UAL-NEXT: ret
+;
+; LA32-UAL-LSX-LABEL: bcmp_size_127:
+; LA32-UAL-LSX: # %bb.0: # %entry
+; LA32-UAL-LSX-NEXT: addi.w $sp, $sp, -16
+; LA32-UAL-LSX-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-UAL-LSX-NEXT: ori $a2, $zero, 127
+; LA32-UAL-LSX-NEXT: bl bcmp
+; LA32-UAL-LSX-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-UAL-LSX-NEXT: addi.w $sp, $sp, 16
+; LA32-UAL-LSX-NEXT: ret
+;
+; LA64-UAL-LSX-LABEL: bcmp_size_127:
+; LA64-UAL-LSX: # %bb.0: # %entry
+; LA64-UAL-LSX-NEXT: addi.d $sp, $sp, -16
+; LA64-UAL-LSX-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64-UAL-LSX-NEXT: ori $a2, $zero, 127
+; LA64-UAL-LSX-NEXT: pcaddu18i $ra, %call36(bcmp)
+; LA64-UAL-LSX-NEXT: jirl $ra, $ra, 0
+; LA64-UAL-LSX-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64-UAL-LSX-NEXT: addi.d $sp, $sp, 16
+; LA64-UAL-LSX-NEXT: ret
+;
+; LA32-UAL-LASX-LABEL: bcmp_size_127:
+; LA32-UAL-LASX: # %bb.0: # %entry
+; LA32-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA32-UAL-LASX-NEXT: xvld $xr1, $a1, 0
+; LA32-UAL-LASX-NEXT: xvld $xr2, $a0, 64
+; LA32-UAL-LASX-NEXT: xvld $xr3, $a0, 95
+; LA32-UAL-LASX-NEXT: xvld $xr4, $a1, 95
+; LA32-UAL-LASX-NEXT: xvld $xr5, $a1, 64
+; LA32-UAL-LASX-NEXT: xvld $xr6, $a0, 32
+; LA32-UAL-LASX-NEXT: xvld $xr7, $a1, 32
+; LA32-UAL-LASX-NEXT: xvxor.v $xr3, $xr3, $xr4
+; LA32-UAL-LASX-NEXT: xvxor.v $xr2, $xr2, $xr5
+; LA32-UAL-LASX-NEXT: xvor.v $xr2, $xr2, $xr3
+; LA32-UAL-LASX-NEXT: xvxor.v $xr3, $xr6, $xr7
+; LA32-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr1
+; LA32-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr3
+; LA32-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr2
+; LA32-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-LASX-NEXT: ret
+;
+; LA64-UAL-LASX-LABEL: bcmp_size_127:
+; LA64-UAL-LASX: # %bb.0: # %entry
+; LA64-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA64-UAL-LASX-NEXT: xvld $xr1, $a1, 0
+; LA64-UAL-LASX-NEXT: xvld $xr2, $a0, 64
+; LA64-UAL-LASX-NEXT: xvld $xr3, $a0, 95
+; LA64-UAL-LASX-NEXT: xvld $xr4, $a1, 95
+; LA64-UAL-LASX-NEXT: xvld $xr5, $a1, 64
+; LA64-UAL-LASX-NEXT: xvld $xr6, $a0, 32
+; LA64-UAL-LASX-NEXT: xvld $xr7, $a1, 32
+; LA64-UAL-LASX-NEXT: xvxor.v $xr3, $xr3, $xr4
+; LA64-UAL-LASX-NEXT: xvxor.v $xr2, $xr2, $xr5
+; LA64-UAL-LASX-NEXT: xvor.v $xr2, $xr2, $xr3
+; LA64-UAL-LASX-NEXT: xvxor.v $xr3, $xr6, $xr7
+; LA64-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr1
+; LA64-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr3
+; LA64-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr2
+; LA64-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA64-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-LASX-NEXT: vpickve2gr.d $a0, $vr0, 0
+; LA64-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA64-UAL-LASX-NEXT: ret
+;
+; LA32-NUAL-LABEL: bcmp_size_127:
+; LA32-NUAL: # %bb.0: # %entry
+; LA32-NUAL-NEXT: addi.w $sp, $sp, -16
+; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-NUAL-NEXT: ori $a2, $zero, 127
+; LA32-NUAL-NEXT: bl bcmp
+; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-NUAL-NEXT: addi.w $sp, $sp, 16
+; LA32-NUAL-NEXT: ret
+;
+; LA64-NUAL-LABEL: bcmp_size_127:
+; LA64-NUAL: # %bb.0: # %entry
+; LA64-NUAL-NEXT: addi.d $sp, $sp, -16
+; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64-NUAL-NEXT: ori $a2, $zero, 127
+; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp)
+; LA64-NUAL-NEXT: jirl $ra, $ra, 0
+; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64-NUAL-NEXT: addi.d $sp, $sp, 16
+; LA64-NUAL-NEXT: ret
entry:
%bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 127)
ret i32 %bcmp
}
define signext i32 @bcmp_size_128(ptr %s1, ptr %s2) nounwind optsize {
-; LA32-LABEL: bcmp_size_128:
-; LA32: # %bb.0: # %entry
-; LA32-NEXT: addi.w $sp, $sp, -16
-; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
-; LA32-NEXT: ori $a2, $zero, 128
-; LA32-NEXT: bl bcmp
-; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
-; LA32-NEXT: addi.w $sp, $sp, 16
-; LA32-NEXT: ret
+; LA32-UAL-LABEL: bcmp_size_128:
+; LA32-UAL: # %bb.0: # %entry
+; LA32-UAL-NEXT: addi.w $sp, $sp, -16
+; LA32-UAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-UAL-NEXT: ori $a2, $zero, 128
+; LA32-UAL-NEXT: bl bcmp
+; LA32-UAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-UAL-NEXT: addi.w $sp, $sp, 16
+; LA32-UAL-NEXT: ret
;
-; LA64-LABEL: bcmp_size_128:
-; LA64: # %bb.0: # %entry
-; LA64-NEXT: addi.d $sp, $sp, -16
-; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
-; LA64-NEXT: ori $a2, $zero, 128
-; LA64-NEXT: pcaddu18i $ra, %call36(bcmp)
-; LA64-NEXT: jirl $ra, $ra, 0
-; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
-; LA64-NEXT: addi.d $sp, $sp, 16
-; LA64-NEXT: ret
+; LA64-UAL-LABEL: bcmp_size_128:
+; LA64-UAL: # %bb.0: # %entry
+; LA64-UAL-NEXT: addi.d $sp, $sp, -16
+; LA64-UAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64-UAL-NEXT: ori $a2, $zero, 128
+; LA64-UAL-NEXT: pcaddu18i $ra, %call36(bcmp)
+; LA64-UAL-NEXT: jirl $ra, $ra, 0
+; LA64-UAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64-UAL-NEXT: addi.d $sp, $sp, 16
+; LA64-UAL-NEXT: ret
+;
+; LA32-UAL-LSX-LABEL: bcmp_size_128:
+; LA32-UAL-LSX: # %bb.0: # %entry
+; LA32-UAL-LSX-NEXT: addi.w $sp, $sp, -16
+; LA32-UAL-LSX-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-UAL-LSX-NEXT: ori $a2, $zero, 128
+; LA32-UAL-LSX-NEXT: bl bcmp
+; LA32-UAL-LSX-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-UAL-LSX-NEXT: addi.w $sp, $sp, 16
+; LA32-UAL-LSX-NEXT: ret
+;
+; LA64-UAL-LSX-LABEL: bcmp_size_128:
+; LA64-UAL-LSX: # %bb.0: # %entry
+; LA64-UAL-LSX-NEXT: addi.d $sp, $sp, -16
+; LA64-UAL-LSX-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64-UAL-LSX-NEXT: ori $a2, $zero, 128
+; LA64-UAL-LSX-NEXT: pcaddu18i $ra, %call36(bcmp)
+; LA64-UAL-LSX-NEXT: jirl $ra, $ra, 0
+; LA64-UAL-LSX-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64-UAL-LSX-NEXT: addi.d $sp, $sp, 16
+; LA64-UAL-LSX-NEXT: ret
+;
+; LA32-UAL-LASX-LABEL: bcmp_size_128:
+; LA32-UAL-LASX: # %bb.0: # %entry
+; LA32-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA32-UAL-LASX-NEXT: xvld $xr1, $a1, 0
+; LA32-UAL-LASX-NEXT: xvld $xr2, $a0, 64
+; LA32-UAL-LASX-NEXT: xvld $xr3, $a0, 96
+; LA32-UAL-LASX-NEXT: xvld $xr4, $a1, 96
+; LA32-UAL-LASX-NEXT: xvld $xr5, $a1, 64
+; LA32-UAL-LASX-NEXT: xvld $xr6, $a0, 32
+; LA32-UAL-LASX-NEXT: xvld $xr7, $a1, 32
+; LA32-UAL-LASX-NEXT: xvxor.v $xr3, $xr3, $xr4
+; LA32-UAL-LASX-NEXT: xvxor.v $xr2, $xr2, $xr5
+; LA32-UAL-LASX-NEXT: xvor.v $xr2, $xr2, $xr3
+; LA32-UAL-LASX-NEXT: xvxor.v $xr3, $xr6, $xr7
+; LA32-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr1
+; LA32-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr3
+; LA32-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr2
+; LA32-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-LASX-NEXT: ret
+;
+; LA64-UAL-LASX-LABEL: bcmp_size_128:
+; LA64-UAL-LASX: # %bb.0: # %entry
+; LA64-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA64-UAL-LASX-NEXT: xvld $xr1, $a1, 0
+; LA64-UAL-LASX-NEXT: xvld $xr2, $a0, 64
+; LA64-UAL-LASX-NEXT: xvld $xr3, $a0, 96
+; LA64-UAL-LASX-NEXT: xvld $xr4, $a1, 96
+; LA64-UAL-LASX-NEXT: xvld $xr5, $a1, 64
+; LA64-UAL-LASX-NEXT: xvld $xr6, $a0, 32
+; LA64-UAL-LASX-NEXT: xvld $xr7, $a1, 32
+; LA64-UAL-LASX-NEXT: xvxor.v $xr3, $xr3, $xr4
+; LA64-UAL-LASX-NEXT: xvxor.v $xr2, $xr2, $xr5
+; LA64-UAL-LASX-NEXT: xvor.v $xr2, $xr2, $xr3
+; LA64-UAL-LASX-NEXT: xvxor.v $xr3, $xr6, $xr7
+; LA64-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr1
+; LA64-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr3
+; LA64-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr2
+; LA64-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA64-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-LASX-NEXT: vpickve2gr.d $a0, $vr0, 0
+; LA64-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA64-UAL-LASX-NEXT: ret
+;
+; LA32-NUAL-LABEL: bcmp_size_128:
+; LA32-NUAL: # %bb.0: # %entry
+; LA32-NUAL-NEXT: addi.w $sp, $sp, -16
+; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-NUAL-NEXT: ori $a2, $zero, 128
+; LA32-NUAL-NEXT: bl bcmp
+; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-NUAL-NEXT: addi.w $sp, $sp, 16
+; LA32-NUAL-NEXT: ret
+;
+; LA64-NUAL-LABEL: bcmp_size_128:
+; LA64-NUAL: # %bb.0: # %entry
+; LA64-NUAL-NEXT: addi.d $sp, $sp, -16
+; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64-NUAL-NEXT: ori $a2, $zero, 128
+; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp)
+; LA64-NUAL-NEXT: jirl $ra, $ra, 0
+; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64-NUAL-NEXT: addi.d $sp, $sp, 16
+; LA64-NUAL-NEXT: ret
entry:
%bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 128)
ret i32 %bcmp
@@ -3058,8 +3520,3 @@ entry:
%ret = icmp sgt i32 %memcmp, 0
ret i1 %ret
}
-;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
-; LA32-UAL-LASX: {{.*}}
-; LA32-UAL-LSX: {{.*}}
-; LA64-UAL-LASX: {{.*}}
-; LA64-UAL-LSX: {{.*}}
diff --git a/llvm/test/CodeGen/LoongArch/expandmemcmp.ll b/llvm/test/CodeGen/LoongArch/expandmemcmp.ll
index aaccbde1e49009..4011f8a7efa3f1 100644
--- a/llvm/test/CodeGen/LoongArch/expandmemcmp.ll
+++ b/llvm/test/CodeGen/LoongArch/expandmemcmp.ll
@@ -498,33 +498,25 @@ define signext i32 @bcmp_size_16(ptr %s1, ptr %s2) nounwind {
;
; LA32-UAL-V-LABEL: bcmp_size_16:
; LA32-UAL-V: # %bb.0: # %entry
-; LA32-UAL-V-NEXT: ld.w $a2, $a0, 0
-; LA32-UAL-V-NEXT: ld.w $a3, $a1, 0
-; LA32-UAL-V-NEXT: ld.w $a4, $a0, 4
-; LA32-UAL-V-NEXT: ld.w $a5, $a1, 4
-; LA32-UAL-V-NEXT: ld.w $a6, $a0, 8
-; LA32-UAL-V-NEXT: ld.w $a7, $a1, 8
-; LA32-UAL-V-NEXT: ld.w $a0, $a0, 12
-; LA32-UAL-V-NEXT: ld.w $a1, $a1, 12
-; LA32-UAL-V-NEXT: xor $a2, $a2, $a3
-; LA32-UAL-V-NEXT: xor $a3, $a4, $a5
-; LA32-UAL-V-NEXT: xor $a4, $a6, $a7
-; LA32-UAL-V-NEXT: xor $a0, $a0, $a1
-; LA32-UAL-V-NEXT: or $a1, $a2, $a3
-; LA32-UAL-V-NEXT: or $a0, $a4, $a0
-; LA32-UAL-V-NEXT: or $a0, $a1, $a0
+; LA32-UAL-V-NEXT: vld $vr0, $a0, 0
+; LA32-UAL-V-NEXT: vld $vr1, $a1, 0
+; LA32-UAL-V-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA32-UAL-V-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-V-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-V-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-V-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-V-NEXT: vpickve2gr.w $a0, $vr0, 0
; LA32-UAL-V-NEXT: sltu $a0, $zero, $a0
; LA32-UAL-V-NEXT: ret
;
; LA64-UAL-V-LABEL: bcmp_size_16:
; LA64-UAL-V: # %bb.0: # %entry
-; LA64-UAL-V-NEXT: ld.d $a2, $a0, 0
-; LA64-UAL-V-NEXT: ld.d $a3, $a1, 0
-; LA64-UAL-V-NEXT: ld.d $a0, $a0, 8
-; LA64-UAL-V-NEXT: ld.d $a1, $a1, 8
-; LA64-UAL-V-NEXT: xor $a2, $a2, $a3
-; LA64-UAL-V-NEXT: xor $a0, $a0, $a1
-; LA64-UAL-V-NEXT: or $a0, $a2, $a0
+; LA64-UAL-V-NEXT: vld $vr0, $a0, 0
+; LA64-UAL-V-NEXT: vld $vr1, $a1, 0
+; LA64-UAL-V-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA64-UAL-V-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-V-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-V-NEXT: vpickve2gr.d $a0, $vr0, 0
; LA64-UAL-V-NEXT: sltu $a0, $zero, $a0
; LA64-UAL-V-NEXT: ret
;
@@ -612,57 +604,33 @@ define signext i32 @bcmp_size_31(ptr %s1, ptr %s2) nounwind {
;
; LA32-UAL-V-LABEL: bcmp_size_31:
; LA32-UAL-V: # %bb.0: # %entry
-; LA32-UAL-V-NEXT: ld.w $a2, $a0, 0
-; LA32-UAL-V-NEXT: ld.w $a3, $a1, 0
-; LA32-UAL-V-NEXT: ld.w $a4, $a0, 4
-; LA32-UAL-V-NEXT: ld.w $a5, $a1, 4
-; LA32-UAL-V-NEXT: ld.w $a6, $a0, 8
-; LA32-UAL-V-NEXT: ld.w $a7, $a1, 8
-; LA32-UAL-V-NEXT: ld.w $t0, $a0, 12
-; LA32-UAL-V-NEXT: ld.w $t1, $a1, 12
-; LA32-UAL-V-NEXT: xor $a2, $a2, $a3
-; LA32-UAL-V-NEXT: xor $a3, $a4, $a5
-; LA32-UAL-V-NEXT: xor $a4, $a6, $a7
-; LA32-UAL-V-NEXT: xor $a5, $t0, $t1
-; LA32-UAL-V-NEXT: ld.w $a6, $a0, 16
-; LA32-UAL-V-NEXT: ld.w $a7, $a1, 16
-; LA32-UAL-V-NEXT: ld.w $t0, $a0, 20
-; LA32-UAL-V-NEXT: ld.w $t1, $a1, 20
-; LA32-UAL-V-NEXT: ld.w $t2, $a0, 24
-; LA32-UAL-V-NEXT: ld.w $t3, $a1, 24
-; LA32-UAL-V-NEXT: ld.w $a0, $a0, 27
-; LA32-UAL-V-NEXT: ld.w $a1, $a1, 27
-; LA32-UAL-V-NEXT: xor $a6, $a6, $a7
-; LA32-UAL-V-NEXT: xor $a7, $t0, $t1
-; LA32-UAL-V-NEXT: xor $t0, $t2, $t3
-; LA32-UAL-V-NEXT: xor $a0, $a0, $a1
-; LA32-UAL-V-NEXT: or $a1, $a2, $a3
-; LA32-UAL-V-NEXT: or $a2, $a4, $a5
-; LA32-UAL-V-NEXT: or $a3, $a6, $a7
-; LA32-UAL-V-NEXT: or $a0, $t0, $a0
-; LA32-UAL-V-NEXT: or $a1, $a1, $a2
-; LA32-UAL-V-NEXT: or $a0, $a3, $a0
-; LA32-UAL-V-NEXT: or $a0, $a1, $a0
+; LA32-UAL-V-NEXT: vld $vr0, $a0, 0
+; LA32-UAL-V-NEXT: vld $vr1, $a0, 15
+; LA32-UAL-V-NEXT: vld $vr2, $a1, 15
+; LA32-UAL-V-NEXT: vld $vr3, $a1, 0
+; LA32-UAL-V-NEXT: vxor.v $vr1, $vr1, $vr2
+; LA32-UAL-V-NEXT: vxor.v $vr0, $vr0, $vr3
+; LA32-UAL-V-NEXT: vor.v $vr0, $vr0, $vr1
+; LA32-UAL-V-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-V-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-V-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-V-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-V-NEXT: vpickve2gr.w $a0, $vr0, 0
; LA32-UAL-V-NEXT: sltu $a0, $zero, $a0
; LA32-UAL-V-NEXT: ret
;
; LA64-UAL-V-LABEL: bcmp_size_31:
; LA64-UAL-V: # %bb.0: # %entry
-; LA64-UAL-V-NEXT: ld.d $a2, $a0, 0
-; LA64-UAL-V-NEXT: ld.d $a3, $a1, 0
-; LA64-UAL-V-NEXT: ld.d $a4, $a0, 8
-; LA64-UAL-V-NEXT: ld.d $a5, $a1, 8
-; LA64-UAL-V-NEXT: ld.d $a6, $a0, 16
-; LA64-UAL-V-NEXT: ld.d $a7, $a1, 16
-; LA64-UAL-V-NEXT: ld.d $a0, $a0, 23
-; LA64-UAL-V-NEXT: ld.d $a1, $a1, 23
-; LA64-UAL-V-NEXT: xor $a2, $a2, $a3
-; LA64-UAL-V-NEXT: xor $a3, $a4, $a5
-; LA64-UAL-V-NEXT: xor $a4, $a6, $a7
-; LA64-UAL-V-NEXT: xor $a0, $a0, $a1
-; LA64-UAL-V-NEXT: or $a1, $a2, $a3
-; LA64-UAL-V-NEXT: or $a0, $a4, $a0
-; LA64-UAL-V-NEXT: or $a0, $a1, $a0
+; LA64-UAL-V-NEXT: vld $vr0, $a0, 0
+; LA64-UAL-V-NEXT: vld $vr1, $a0, 15
+; LA64-UAL-V-NEXT: vld $vr2, $a1, 15
+; LA64-UAL-V-NEXT: vld $vr3, $a1, 0
+; LA64-UAL-V-NEXT: vxor.v $vr1, $vr1, $vr2
+; LA64-UAL-V-NEXT: vxor.v $vr0, $vr0, $vr3
+; LA64-UAL-V-NEXT: vor.v $vr0, $vr0, $vr1
+; LA64-UAL-V-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-V-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-V-NEXT: vpickve2gr.d $a0, $vr0, 0
; LA64-UAL-V-NEXT: sltu $a0, $zero, $a0
; LA64-UAL-V-NEXT: ret
;
@@ -748,61 +716,65 @@ define signext i32 @bcmp_size_32(ptr %s1, ptr %s2) nounwind {
; LA64-UAL-NEXT: sltu $a0, $zero, $a0
; LA64-UAL-NEXT: ret
;
-; LA32-UAL-V-LABEL: bcmp_size_32:
-; LA32-UAL-V: # %bb.0: # %entry
-; LA32-UAL-V-NEXT: ld.w $a2, $a0, 0
-; LA32-UAL-V-NEXT: ld.w $a3, $a1, 0
-; LA32-UAL-V-NEXT: ld.w $a4, $a0, 4
-; LA32-UAL-V-NEXT: ld.w $a5, $a1, 4
-; LA32-UAL-V-NEXT: ld.w $a6, $a0, 8
-; LA32-UAL-V-NEXT: ld.w $a7, $a1, 8
-; LA32-UAL-V-NEXT: ld.w $t0, $a0, 12
-; LA32-UAL-V-NEXT: ld.w $t1, $a1, 12
-; LA32-UAL-V-NEXT: xor $a2, $a2, $a3
-; LA32-UAL-V-NEXT: xor $a3, $a4, $a5
-; LA32-UAL-V-NEXT: xor $a4, $a6, $a7
-; LA32-UAL-V-NEXT: xor $a5, $t0, $t1
-; LA32-UAL-V-NEXT: ld.w $a6, $a0, 16
-; LA32-UAL-V-NEXT: ld.w $a7, $a1, 16
-; LA32-UAL-V-NEXT: ld.w $t0, $a0, 20
-; LA32-UAL-V-NEXT: ld.w $t1, $a1, 20
-; LA32-UAL-V-NEXT: ld.w $t2, $a0, 24
-; LA32-UAL-V-NEXT: ld.w $t3, $a1, 24
-; LA32-UAL-V-NEXT: ld.w $a0, $a0, 28
-; LA32-UAL-V-NEXT: ld.w $a1, $a1, 28
-; LA32-UAL-V-NEXT: xor $a6, $a6, $a7
-; LA32-UAL-V-NEXT: xor $a7, $t0, $t1
-; LA32-UAL-V-NEXT: xor $t0, $t2, $t3
-; LA32-UAL-V-NEXT: xor $a0, $a0, $a1
-; LA32-UAL-V-NEXT: or $a1, $a2, $a3
-; LA32-UAL-V-NEXT: or $a2, $a4, $a5
-; LA32-UAL-V-NEXT: or $a3, $a6, $a7
-; LA32-UAL-V-NEXT: or $a0, $t0, $a0
-; LA32-UAL-V-NEXT: or $a1, $a1, $a2
-; LA32-UAL-V-NEXT: or $a0, $a3, $a0
-; LA32-UAL-V-NEXT: or $a0, $a1, $a0
-; LA32-UAL-V-NEXT: sltu $a0, $zero, $a0
-; LA32-UAL-V-NEXT: ret
-;
-; LA64-UAL-V-LABEL: bcmp_size_32:
-; LA64-UAL-V: # %bb.0: # %entry
-; LA64-UAL-V-NEXT: ld.d $a2, $a0, 0
-; LA64-UAL-V-NEXT: ld.d $a3, $a1, 0
-; LA64-UAL-V-NEXT: ld.d $a4, $a0, 8
-; LA64-UAL-V-NEXT: ld.d $a5, $a1, 8
-; LA64-UAL-V-NEXT: ld.d $a6, $a0, 16
-; LA64-UAL-V-NEXT: ld.d $a7, $a1, 16
-; LA64-UAL-V-NEXT: ld.d $a0, $a0, 24
-; LA64-UAL-V-NEXT: ld.d $a1, $a1, 24
-; LA64-UAL-V-NEXT: xor $a2, $a2, $a3
-; LA64-UAL-V-NEXT: xor $a3, $a4, $a5
-; LA64-UAL-V-NEXT: xor $a4, $a6, $a7
-; LA64-UAL-V-NEXT: xor $a0, $a0, $a1
-; LA64-UAL-V-NEXT: or $a1, $a2, $a3
-; LA64-UAL-V-NEXT: or $a0, $a4, $a0
-; LA64-UAL-V-NEXT: or $a0, $a1, $a0
-; LA64-UAL-V-NEXT: sltu $a0, $zero, $a0
-; LA64-UAL-V-NEXT: ret
+; LA32-UAL-LSX-LABEL: bcmp_size_32:
+; LA32-UAL-LSX: # %bb.0: # %entry
+; LA32-UAL-LSX-NEXT: vld $vr0, $a0, 0
+; LA32-UAL-LSX-NEXT: vld $vr1, $a0, 16
+; LA32-UAL-LSX-NEXT: vld $vr2, $a1, 16
+; LA32-UAL-LSX-NEXT: vld $vr3, $a1, 0
+; LA32-UAL-LSX-NEXT: vxor.v $vr1, $vr1, $vr2
+; LA32-UAL-LSX-NEXT: vxor.v $vr0, $vr0, $vr3
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA32-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LSX-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-LSX-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-LSX-NEXT: ret
+;
+; LA64-UAL-LSX-LABEL: bcmp_size_32:
+; LA64-UAL-LSX: # %bb.0: # %entry
+; LA64-UAL-LSX-NEXT: vld $vr0, $a0, 0
+; LA64-UAL-LSX-NEXT: vld $vr1, $a0, 16
+; LA64-UAL-LSX-NEXT: vld $vr2, $a1, 16
+; LA64-UAL-LSX-NEXT: vld $vr3, $a1, 0
+; LA64-UAL-LSX-NEXT: vxor.v $vr1, $vr1, $vr2
+; LA64-UAL-LSX-NEXT: vxor.v $vr0, $vr0, $vr3
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA64-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-LSX-NEXT: vpickve2gr.d $a0, $vr0, 0
+; LA64-UAL-LSX-NEXT: sltu $a0, $zero, $a0
+; LA64-UAL-LSX-NEXT: ret
+;
+; LA32-UAL-LASX-LABEL: bcmp_size_32:
+; LA32-UAL-LASX: # %bb.0: # %entry
+; LA32-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA32-UAL-LASX-NEXT: xvld $xr1, $a1, 0
+; LA32-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr1
+; LA32-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-LASX-NEXT: ret
+;
+; LA64-UAL-LASX-LABEL: bcmp_size_32:
+; LA64-UAL-LASX: # %bb.0: # %entry
+; LA64-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA64-UAL-LASX-NEXT: xvld $xr1, $a1, 0
+; LA64-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr1
+; LA64-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA64-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-LASX-NEXT: vpickve2gr.d $a0, $vr0, 0
+; LA64-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA64-UAL-LASX-NEXT: ret
;
; LA32-NUAL-LABEL: bcmp_size_32:
; LA32-NUAL: # %bb.0: # %entry
@@ -830,15 +802,15 @@ entry:
}
define signext i32 @bcmp_size_63(ptr %s1, ptr %s2) nounwind {
-; LA32-LABEL: bcmp_size_63:
-; LA32: # %bb.0: # %entry
-; LA32-NEXT: addi.w $sp, $sp, -16
-; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
-; LA32-NEXT: ori $a2, $zero, 63
-; LA32-NEXT: bl bcmp
-; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
-; LA32-NEXT: addi.w $sp, $sp, 16
-; LA32-NEXT: ret
+; LA32-UAL-LABEL: bcmp_size_63:
+; LA32-UAL: # %bb.0: # %entry
+; LA32-UAL-NEXT: addi.w $sp, $sp, -16
+; LA32-UAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-UAL-NEXT: ori $a2, $zero, 63
+; LA32-UAL-NEXT: bl bcmp
+; LA32-UAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-UAL-NEXT: addi.w $sp, $sp, 16
+; LA32-UAL-NEXT: ret
;
; LA64-UAL-LABEL: bcmp_size_63:
; LA64-UAL: # %bb.0: # %entry
@@ -876,41 +848,99 @@ define signext i32 @bcmp_size_63(ptr %s1, ptr %s2) nounwind {
; LA64-UAL-NEXT: sltu $a0, $zero, $a0
; LA64-UAL-NEXT: ret
;
-; LA64-UAL-V-LABEL: bcmp_size_63:
-; LA64-UAL-V: # %bb.0: # %entry
-; LA64-UAL-V-NEXT: ld.d $a2, $a0, 0
-; LA64-UAL-V-NEXT: ld.d $a3, $a1, 0
-; LA64-UAL-V-NEXT: ld.d $a4, $a0, 8
-; LA64-UAL-V-NEXT: ld.d $a5, $a1, 8
-; LA64-UAL-V-NEXT: ld.d $a6, $a0, 16
-; LA64-UAL-V-NEXT: ld.d $a7, $a1, 16
-; LA64-UAL-V-NEXT: ld.d $t0, $a0, 24
-; LA64-UAL-V-NEXT: ld.d $t1, $a1, 24
-; LA64-UAL-V-NEXT: xor $a2, $a2, $a3
-; LA64-UAL-V-NEXT: xor $a3, $a4, $a5
-; LA64-UAL-V-NEXT: xor $a4, $a6, $a7
-; LA64-UAL-V-NEXT: xor $a5, $t0, $t1
-; LA64-UAL-V-NEXT: ld.d $a6, $a0, 32
-; LA64-UAL-V-NEXT: ld.d $a7, $a1, 32
-; LA64-UAL-V-NEXT: ld.d $t0, $a0, 40
-; LA64-UAL-V-NEXT: ld.d $t1, $a1, 40
-; LA64-UAL-V-NEXT: ld.d $t2, $a0, 48
-; LA64-UAL-V-NEXT: ld.d $t3, $a1, 48
-; LA64-UAL-V-NEXT: ld.d $a0, $a0, 55
-; LA64-UAL-V-NEXT: ld.d $a1, $a1, 55
-; LA64-UAL-V-NEXT: xor $a6, $a6, $a7
-; LA64-UAL-V-NEXT: xor $a7, $t0, $t1
-; LA64-UAL-V-NEXT: xor $t0, $t2, $t3
-; LA64-UAL-V-NEXT: xor $a0, $a0, $a1
-; LA64-UAL-V-NEXT: or $a1, $a2, $a3
-; LA64-UAL-V-NEXT: or $a2, $a4, $a5
-; LA64-UAL-V-NEXT: or $a3, $a6, $a7
-; LA64-UAL-V-NEXT: or $a0, $t0, $a0
-; LA64-UAL-V-NEXT: or $a1, $a1, $a2
-; LA64-UAL-V-NEXT: or $a0, $a3, $a0
-; LA64-UAL-V-NEXT: or $a0, $a1, $a0
-; LA64-UAL-V-NEXT: sltu $a0, $zero, $a0
-; LA64-UAL-V-NEXT: ret
+; LA32-UAL-LSX-LABEL: bcmp_size_63:
+; LA32-UAL-LSX: # %bb.0: # %entry
+; LA32-UAL-LSX-NEXT: vld $vr0, $a0, 0
+; LA32-UAL-LSX-NEXT: vld $vr1, $a1, 0
+; LA32-UAL-LSX-NEXT: vld $vr2, $a0, 32
+; LA32-UAL-LSX-NEXT: vld $vr3, $a0, 47
+; LA32-UAL-LSX-NEXT: vld $vr4, $a1, 47
+; LA32-UAL-LSX-NEXT: vld $vr5, $a1, 32
+; LA32-UAL-LSX-NEXT: vld $vr6, $a0, 16
+; LA32-UAL-LSX-NEXT: vld $vr7, $a1, 16
+; LA32-UAL-LSX-NEXT: vxor.v $vr3, $vr3, $vr4
+; LA32-UAL-LSX-NEXT: vxor.v $vr2, $vr2, $vr5
+; LA32-UAL-LSX-NEXT: vor.v $vr2, $vr2, $vr3
+; LA32-UAL-LSX-NEXT: vxor.v $vr3, $vr6, $vr7
+; LA32-UAL-LSX-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr3
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr2
+; LA32-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LSX-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-LSX-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-LSX-NEXT: ret
+;
+; LA64-UAL-LSX-LABEL: bcmp_size_63:
+; LA64-UAL-LSX: # %bb.0: # %entry
+; LA64-UAL-LSX-NEXT: vld $vr0, $a0, 0
+; LA64-UAL-LSX-NEXT: vld $vr1, $a1, 0
+; LA64-UAL-LSX-NEXT: vld $vr2, $a0, 32
+; LA64-UAL-LSX-NEXT: vld $vr3, $a0, 47
+; LA64-UAL-LSX-NEXT: vld $vr4, $a1, 47
+; LA64-UAL-LSX-NEXT: vld $vr5, $a1, 32
+; LA64-UAL-LSX-NEXT: vld $vr6, $a0, 16
+; LA64-UAL-LSX-NEXT: vld $vr7, $a1, 16
+; LA64-UAL-LSX-NEXT: vxor.v $vr3, $vr3, $vr4
+; LA64-UAL-LSX-NEXT: vxor.v $vr2, $vr2, $vr5
+; LA64-UAL-LSX-NEXT: vor.v $vr2, $vr2, $vr3
+; LA64-UAL-LSX-NEXT: vxor.v $vr3, $vr6, $vr7
+; LA64-UAL-LSX-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr3
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr2
+; LA64-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-LSX-NEXT: vpickve2gr.d $a0, $vr0, 0
+; LA64-UAL-LSX-NEXT: sltu $a0, $zero, $a0
+; LA64-UAL-LSX-NEXT: ret
+;
+; LA32-UAL-LASX-LABEL: bcmp_size_63:
+; LA32-UAL-LASX: # %bb.0: # %entry
+; LA32-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA32-UAL-LASX-NEXT: xvld $xr1, $a0, 31
+; LA32-UAL-LASX-NEXT: xvld $xr2, $a1, 31
+; LA32-UAL-LASX-NEXT: xvld $xr3, $a1, 0
+; LA32-UAL-LASX-NEXT: xvxor.v $xr1, $xr1, $xr2
+; LA32-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr3
+; LA32-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr1
+; LA32-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-LASX-NEXT: ret
+;
+; LA64-UAL-LASX-LABEL: bcmp_size_63:
+; LA64-UAL-LASX: # %bb.0: # %entry
+; LA64-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA64-UAL-LASX-NEXT: xvld $xr1, $a0, 31
+; LA64-UAL-LASX-NEXT: xvld $xr2, $a1, 31
+; LA64-UAL-LASX-NEXT: xvld $xr3, $a1, 0
+; LA64-UAL-LASX-NEXT: xvxor.v $xr1, $xr1, $xr2
+; LA64-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr3
+; LA64-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr1
+; LA64-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA64-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-LASX-NEXT: vpickve2gr.d $a0, $vr0, 0
+; LA64-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA64-UAL-LASX-NEXT: ret
+;
+; LA32-NUAL-LABEL: bcmp_size_63:
+; LA32-NUAL: # %bb.0: # %entry
+; LA32-NUAL-NEXT: addi.w $sp, $sp, -16
+; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-NUAL-NEXT: ori $a2, $zero, 63
+; LA32-NUAL-NEXT: bl bcmp
+; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-NUAL-NEXT: addi.w $sp, $sp, 16
+; LA32-NUAL-NEXT: ret
;
; LA64-NUAL-LABEL: bcmp_size_63:
; LA64-NUAL: # %bb.0: # %entry
@@ -928,15 +958,15 @@ entry:
}
define signext i32 @bcmp_size_64(ptr %s1, ptr %s2) nounwind {
-; LA32-LABEL: bcmp_size_64:
-; LA32: # %bb.0: # %entry
-; LA32-NEXT: addi.w $sp, $sp, -16
-; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
-; LA32-NEXT: ori $a2, $zero, 64
-; LA32-NEXT: bl bcmp
-; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
-; LA32-NEXT: addi.w $sp, $sp, 16
-; LA32-NEXT: ret
+; LA32-UAL-LABEL: bcmp_size_64:
+; LA32-UAL: # %bb.0: # %entry
+; LA32-UAL-NEXT: addi.w $sp, $sp, -16
+; LA32-UAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-UAL-NEXT: ori $a2, $zero, 64
+; LA32-UAL-NEXT: bl bcmp
+; LA32-UAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-UAL-NEXT: addi.w $sp, $sp, 16
+; LA32-UAL-NEXT: ret
;
; LA64-UAL-LABEL: bcmp_size_64:
; LA64-UAL: # %bb.0: # %entry
@@ -974,41 +1004,99 @@ define signext i32 @bcmp_size_64(ptr %s1, ptr %s2) nounwind {
; LA64-UAL-NEXT: sltu $a0, $zero, $a0
; LA64-UAL-NEXT: ret
;
-; LA64-UAL-V-LABEL: bcmp_size_64:
-; LA64-UAL-V: # %bb.0: # %entry
-; LA64-UAL-V-NEXT: ld.d $a2, $a0, 0
-; LA64-UAL-V-NEXT: ld.d $a3, $a1, 0
-; LA64-UAL-V-NEXT: ld.d $a4, $a0, 8
-; LA64-UAL-V-NEXT: ld.d $a5, $a1, 8
-; LA64-UAL-V-NEXT: ld.d $a6, $a0, 16
-; LA64-UAL-V-NEXT: ld.d $a7, $a1, 16
-; LA64-UAL-V-NEXT: ld.d $t0, $a0, 24
-; LA64-UAL-V-NEXT: ld.d $t1, $a1, 24
-; LA64-UAL-V-NEXT: xor $a2, $a2, $a3
-; LA64-UAL-V-NEXT: xor $a3, $a4, $a5
-; LA64-UAL-V-NEXT: xor $a4, $a6, $a7
-; LA64-UAL-V-NEXT: xor $a5, $t0, $t1
-; LA64-UAL-V-NEXT: ld.d $a6, $a0, 32
-; LA64-UAL-V-NEXT: ld.d $a7, $a1, 32
-; LA64-UAL-V-NEXT: ld.d $t0, $a0, 40
-; LA64-UAL-V-NEXT: ld.d $t1, $a1, 40
-; LA64-UAL-V-NEXT: ld.d $t2, $a0, 48
-; LA64-UAL-V-NEXT: ld.d $t3, $a1, 48
-; LA64-UAL-V-NEXT: ld.d $a0, $a0, 56
-; LA64-UAL-V-NEXT: ld.d $a1, $a1, 56
-; LA64-UAL-V-NEXT: xor $a6, $a6, $a7
-; LA64-UAL-V-NEXT: xor $a7, $t0, $t1
-; LA64-UAL-V-NEXT: xor $t0, $t2, $t3
-; LA64-UAL-V-NEXT: xor $a0, $a0, $a1
-; LA64-UAL-V-NEXT: or $a1, $a2, $a3
-; LA64-UAL-V-NEXT: or $a2, $a4, $a5
-; LA64-UAL-V-NEXT: or $a3, $a6, $a7
-; LA64-UAL-V-NEXT: or $a0, $t0, $a0
-; LA64-UAL-V-NEXT: or $a1, $a1, $a2
-; LA64-UAL-V-NEXT: or $a0, $a3, $a0
-; LA64-UAL-V-NEXT: or $a0, $a1, $a0
-; LA64-UAL-V-NEXT: sltu $a0, $zero, $a0
-; LA64-UAL-V-NEXT: ret
+; LA32-UAL-LSX-LABEL: bcmp_size_64:
+; LA32-UAL-LSX: # %bb.0: # %entry
+; LA32-UAL-LSX-NEXT: vld $vr0, $a0, 0
+; LA32-UAL-LSX-NEXT: vld $vr1, $a1, 0
+; LA32-UAL-LSX-NEXT: vld $vr2, $a0, 32
+; LA32-UAL-LSX-NEXT: vld $vr3, $a0, 48
+; LA32-UAL-LSX-NEXT: vld $vr4, $a1, 48
+; LA32-UAL-LSX-NEXT: vld $vr5, $a1, 32
+; LA32-UAL-LSX-NEXT: vld $vr6, $a0, 16
+; LA32-UAL-LSX-NEXT: vld $vr7, $a1, 16
+; LA32-UAL-LSX-NEXT: vxor.v $vr3, $vr3, $vr4
+; LA32-UAL-LSX-NEXT: vxor.v $vr2, $vr2, $vr5
+; LA32-UAL-LSX-NEXT: vor.v $vr2, $vr2, $vr3
+; LA32-UAL-LSX-NEXT: vxor.v $vr3, $vr6, $vr7
+; LA32-UAL-LSX-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr3
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr2
+; LA32-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LSX-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-LSX-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-LSX-NEXT: ret
+;
+; LA64-UAL-LSX-LABEL: bcmp_size_64:
+; LA64-UAL-LSX: # %bb.0: # %entry
+; LA64-UAL-LSX-NEXT: vld $vr0, $a0, 0
+; LA64-UAL-LSX-NEXT: vld $vr1, $a1, 0
+; LA64-UAL-LSX-NEXT: vld $vr2, $a0, 32
+; LA64-UAL-LSX-NEXT: vld $vr3, $a0, 48
+; LA64-UAL-LSX-NEXT: vld $vr4, $a1, 48
+; LA64-UAL-LSX-NEXT: vld $vr5, $a1, 32
+; LA64-UAL-LSX-NEXT: vld $vr6, $a0, 16
+; LA64-UAL-LSX-NEXT: vld $vr7, $a1, 16
+; LA64-UAL-LSX-NEXT: vxor.v $vr3, $vr3, $vr4
+; LA64-UAL-LSX-NEXT: vxor.v $vr2, $vr2, $vr5
+; LA64-UAL-LSX-NEXT: vor.v $vr2, $vr2, $vr3
+; LA64-UAL-LSX-NEXT: vxor.v $vr3, $vr6, $vr7
+; LA64-UAL-LSX-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr3
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr2
+; LA64-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-LSX-NEXT: vpickve2gr.d $a0, $vr0, 0
+; LA64-UAL-LSX-NEXT: sltu $a0, $zero, $a0
+; LA64-UAL-LSX-NEXT: ret
+;
+; LA32-UAL-LASX-LABEL: bcmp_size_64:
+; LA32-UAL-LASX: # %bb.0: # %entry
+; LA32-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA32-UAL-LASX-NEXT: xvld $xr1, $a0, 32
+; LA32-UAL-LASX-NEXT: xvld $xr2, $a1, 32
+; LA32-UAL-LASX-NEXT: xvld $xr3, $a1, 0
+; LA32-UAL-LASX-NEXT: xvxor.v $xr1, $xr1, $xr2
+; LA32-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr3
+; LA32-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr1
+; LA32-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-LASX-NEXT: ret
+;
+; LA64-UAL-LASX-LABEL: bcmp_size_64:
+; LA64-UAL-LASX: # %bb.0: # %entry
+; LA64-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA64-UAL-LASX-NEXT: xvld $xr1, $a0, 32
+; LA64-UAL-LASX-NEXT: xvld $xr2, $a1, 32
+; LA64-UAL-LASX-NEXT: xvld $xr3, $a1, 0
+; LA64-UAL-LASX-NEXT: xvxor.v $xr1, $xr1, $xr2
+; LA64-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr3
+; LA64-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr1
+; LA64-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA64-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-LASX-NEXT: vpickve2gr.d $a0, $vr0, 0
+; LA64-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA64-UAL-LASX-NEXT: ret
+;
+; LA32-NUAL-LABEL: bcmp_size_64:
+; LA32-NUAL: # %bb.0: # %entry
+; LA32-NUAL-NEXT: addi.w $sp, $sp, -16
+; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-NUAL-NEXT: ori $a2, $zero, 64
+; LA32-NUAL-NEXT: bl bcmp
+; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-NUAL-NEXT: addi.w $sp, $sp, 16
+; LA32-NUAL-NEXT: ret
;
; LA64-NUAL-LABEL: bcmp_size_64:
; LA64-NUAL: # %bb.0: # %entry
@@ -1026,52 +1114,358 @@ entry:
}
define signext i32 @bcmp_size_127(ptr %s1, ptr %s2) nounwind {
-; LA32-LABEL: bcmp_size_127:
-; LA32: # %bb.0: # %entry
-; LA32-NEXT: addi.w $sp, $sp, -16
-; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
-; LA32-NEXT: ori $a2, $zero, 127
-; LA32-NEXT: bl bcmp
-; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
-; LA32-NEXT: addi.w $sp, $sp, 16
-; LA32-NEXT: ret
+; LA32-UAL-LABEL: bcmp_size_127:
+; LA32-UAL: # %bb.0: # %entry
+; LA32-UAL-NEXT: addi.w $sp, $sp, -16
+; LA32-UAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-UAL-NEXT: ori $a2, $zero, 127
+; LA32-UAL-NEXT: bl bcmp
+; LA32-UAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-UAL-NEXT: addi.w $sp, $sp, 16
+; LA32-UAL-NEXT: ret
;
-; LA64-LABEL: bcmp_size_127:
-; LA64: # %bb.0: # %entry
-; LA64-NEXT: addi.d $sp, $sp, -16
-; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
-; LA64-NEXT: ori $a2, $zero, 127
-; LA64-NEXT: pcaddu18i $ra, %call36(bcmp)
-; LA64-NEXT: jirl $ra, $ra, 0
-; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
-; LA64-NEXT: addi.d $sp, $sp, 16
-; LA64-NEXT: ret
+; LA64-UAL-LABEL: bcmp_size_127:
+; LA64-UAL: # %bb.0: # %entry
+; LA64-UAL-NEXT: addi.d $sp, $sp, -16
+; LA64-UAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64-UAL-NEXT: ori $a2, $zero, 127
+; LA64-UAL-NEXT: pcaddu18i $ra, %call36(bcmp)
+; LA64-UAL-NEXT: jirl $ra, $ra, 0
+; LA64-UAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64-UAL-NEXT: addi.d $sp, $sp, 16
+; LA64-UAL-NEXT: ret
+;
+; LA32-UAL-LSX-LABEL: bcmp_size_127:
+; LA32-UAL-LSX: # %bb.0: # %entry
+; LA32-UAL-LSX-NEXT: vld $vr0, $a0, 0
+; LA32-UAL-LSX-NEXT: vld $vr1, $a1, 0
+; LA32-UAL-LSX-NEXT: vld $vr2, $a0, 16
+; LA32-UAL-LSX-NEXT: vld $vr3, $a1, 16
+; LA32-UAL-LSX-NEXT: vld $vr4, $a0, 32
+; LA32-UAL-LSX-NEXT: vld $vr5, $a1, 32
+; LA32-UAL-LSX-NEXT: vld $vr6, $a0, 48
+; LA32-UAL-LSX-NEXT: vld $vr7, $a1, 48
+; LA32-UAL-LSX-NEXT: vld $vr8, $a0, 64
+; LA32-UAL-LSX-NEXT: vld $vr9, $a1, 64
+; LA32-UAL-LSX-NEXT: vld $vr10, $a0, 96
+; LA32-UAL-LSX-NEXT: vld $vr11, $a0, 111
+; LA32-UAL-LSX-NEXT: vld $vr12, $a1, 111
+; LA32-UAL-LSX-NEXT: vld $vr13, $a1, 96
+; LA32-UAL-LSX-NEXT: vld $vr14, $a0, 80
+; LA32-UAL-LSX-NEXT: vld $vr15, $a1, 80
+; LA32-UAL-LSX-NEXT: vxor.v $vr11, $vr11, $vr12
+; LA32-UAL-LSX-NEXT: vxor.v $vr10, $vr10, $vr13
+; LA32-UAL-LSX-NEXT: vor.v $vr10, $vr10, $vr11
+; LA32-UAL-LSX-NEXT: vxor.v $vr11, $vr14, $vr15
+; LA32-UAL-LSX-NEXT: vxor.v $vr8, $vr8, $vr9
+; LA32-UAL-LSX-NEXT: vor.v $vr8, $vr8, $vr11
+; LA32-UAL-LSX-NEXT: vor.v $vr8, $vr8, $vr10
+; LA32-UAL-LSX-NEXT: vxor.v $vr6, $vr6, $vr7
+; LA32-UAL-LSX-NEXT: vxor.v $vr4, $vr4, $vr5
+; LA32-UAL-LSX-NEXT: vor.v $vr4, $vr4, $vr6
+; LA32-UAL-LSX-NEXT: vxor.v $vr2, $vr2, $vr3
+; LA32-UAL-LSX-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr2
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr4
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr8
+; LA32-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LSX-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-LSX-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-LSX-NEXT: ret
+;
+; LA64-UAL-LSX-LABEL: bcmp_size_127:
+; LA64-UAL-LSX: # %bb.0: # %entry
+; LA64-UAL-LSX-NEXT: vld $vr0, $a0, 0
+; LA64-UAL-LSX-NEXT: vld $vr1, $a1, 0
+; LA64-UAL-LSX-NEXT: vld $vr2, $a0, 16
+; LA64-UAL-LSX-NEXT: vld $vr3, $a1, 16
+; LA64-UAL-LSX-NEXT: vld $vr4, $a0, 32
+; LA64-UAL-LSX-NEXT: vld $vr5, $a1, 32
+; LA64-UAL-LSX-NEXT: vld $vr6, $a0, 48
+; LA64-UAL-LSX-NEXT: vld $vr7, $a1, 48
+; LA64-UAL-LSX-NEXT: vld $vr8, $a0, 64
+; LA64-UAL-LSX-NEXT: vld $vr9, $a1, 64
+; LA64-UAL-LSX-NEXT: vld $vr10, $a0, 96
+; LA64-UAL-LSX-NEXT: vld $vr11, $a0, 111
+; LA64-UAL-LSX-NEXT: vld $vr12, $a1, 111
+; LA64-UAL-LSX-NEXT: vld $vr13, $a1, 96
+; LA64-UAL-LSX-NEXT: vld $vr14, $a0, 80
+; LA64-UAL-LSX-NEXT: vld $vr15, $a1, 80
+; LA64-UAL-LSX-NEXT: vxor.v $vr11, $vr11, $vr12
+; LA64-UAL-LSX-NEXT: vxor.v $vr10, $vr10, $vr13
+; LA64-UAL-LSX-NEXT: vor.v $vr10, $vr10, $vr11
+; LA64-UAL-LSX-NEXT: vxor.v $vr11, $vr14, $vr15
+; LA64-UAL-LSX-NEXT: vxor.v $vr8, $vr8, $vr9
+; LA64-UAL-LSX-NEXT: vor.v $vr8, $vr8, $vr11
+; LA64-UAL-LSX-NEXT: vor.v $vr8, $vr8, $vr10
+; LA64-UAL-LSX-NEXT: vxor.v $vr6, $vr6, $vr7
+; LA64-UAL-LSX-NEXT: vxor.v $vr4, $vr4, $vr5
+; LA64-UAL-LSX-NEXT: vor.v $vr4, $vr4, $vr6
+; LA64-UAL-LSX-NEXT: vxor.v $vr2, $vr2, $vr3
+; LA64-UAL-LSX-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr2
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr4
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr8
+; LA64-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-LSX-NEXT: vpickve2gr.d $a0, $vr0, 0
+; LA64-UAL-LSX-NEXT: sltu $a0, $zero, $a0
+; LA64-UAL-LSX-NEXT: ret
+;
+; LA32-UAL-LASX-LABEL: bcmp_size_127:
+; LA32-UAL-LASX: # %bb.0: # %entry
+; LA32-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA32-UAL-LASX-NEXT: xvld $xr1, $a1, 0
+; LA32-UAL-LASX-NEXT: xvld $xr2, $a0, 64
+; LA32-UAL-LASX-NEXT: xvld $xr3, $a0, 95
+; LA32-UAL-LASX-NEXT: xvld $xr4, $a1, 95
+; LA32-UAL-LASX-NEXT: xvld $xr5, $a1, 64
+; LA32-UAL-LASX-NEXT: xvld $xr6, $a0, 32
+; LA32-UAL-LASX-NEXT: xvld $xr7, $a1, 32
+; LA32-UAL-LASX-NEXT: xvxor.v $xr3, $xr3, $xr4
+; LA32-UAL-LASX-NEXT: xvxor.v $xr2, $xr2, $xr5
+; LA32-UAL-LASX-NEXT: xvor.v $xr2, $xr2, $xr3
+; LA32-UAL-LASX-NEXT: xvxor.v $xr3, $xr6, $xr7
+; LA32-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr1
+; LA32-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr3
+; LA32-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr2
+; LA32-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-LASX-NEXT: ret
+;
+; LA64-UAL-LASX-LABEL: bcmp_size_127:
+; LA64-UAL-LASX: # %bb.0: # %entry
+; LA64-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA64-UAL-LASX-NEXT: xvld $xr1, $a1, 0
+; LA64-UAL-LASX-NEXT: xvld $xr2, $a0, 64
+; LA64-UAL-LASX-NEXT: xvld $xr3, $a0, 95
+; LA64-UAL-LASX-NEXT: xvld $xr4, $a1, 95
+; LA64-UAL-LASX-NEXT: xvld $xr5, $a1, 64
+; LA64-UAL-LASX-NEXT: xvld $xr6, $a0, 32
+; LA64-UAL-LASX-NEXT: xvld $xr7, $a1, 32
+; LA64-UAL-LASX-NEXT: xvxor.v $xr3, $xr3, $xr4
+; LA64-UAL-LASX-NEXT: xvxor.v $xr2, $xr2, $xr5
+; LA64-UAL-LASX-NEXT: xvor.v $xr2, $xr2, $xr3
+; LA64-UAL-LASX-NEXT: xvxor.v $xr3, $xr6, $xr7
+; LA64-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr1
+; LA64-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr3
+; LA64-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr2
+; LA64-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA64-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-LASX-NEXT: vpickve2gr.d $a0, $vr0, 0
+; LA64-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA64-UAL-LASX-NEXT: ret
+;
+; LA32-NUAL-LABEL: bcmp_size_127:
+; LA32-NUAL: # %bb.0: # %entry
+; LA32-NUAL-NEXT: addi.w $sp, $sp, -16
+; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-NUAL-NEXT: ori $a2, $zero, 127
+; LA32-NUAL-NEXT: bl bcmp
+; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-NUAL-NEXT: addi.w $sp, $sp, 16
+; LA32-NUAL-NEXT: ret
+;
+; LA64-NUAL-LABEL: bcmp_size_127:
+; LA64-NUAL: # %bb.0: # %entry
+; LA64-NUAL-NEXT: addi.d $sp, $sp, -16
+; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64-NUAL-NEXT: ori $a2, $zero, 127
+; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp)
+; LA64-NUAL-NEXT: jirl $ra, $ra, 0
+; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64-NUAL-NEXT: addi.d $sp, $sp, 16
+; LA64-NUAL-NEXT: ret
entry:
%bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 127)
ret i32 %bcmp
}
define signext i32 @bcmp_size_128(ptr %s1, ptr %s2) nounwind {
-; LA32-LABEL: bcmp_size_128:
-; LA32: # %bb.0: # %entry
-; LA32-NEXT: addi.w $sp, $sp, -16
-; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
-; LA32-NEXT: ori $a2, $zero, 128
-; LA32-NEXT: bl bcmp
-; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
-; LA32-NEXT: addi.w $sp, $sp, 16
-; LA32-NEXT: ret
+; LA32-UAL-LABEL: bcmp_size_128:
+; LA32-UAL: # %bb.0: # %entry
+; LA32-UAL-NEXT: addi.w $sp, $sp, -16
+; LA32-UAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-UAL-NEXT: ori $a2, $zero, 128
+; LA32-UAL-NEXT: bl bcmp
+; LA32-UAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-UAL-NEXT: addi.w $sp, $sp, 16
+; LA32-UAL-NEXT: ret
;
-; LA64-LABEL: bcmp_size_128:
-; LA64: # %bb.0: # %entry
-; LA64-NEXT: addi.d $sp, $sp, -16
-; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
-; LA64-NEXT: ori $a2, $zero, 128
-; LA64-NEXT: pcaddu18i $ra, %call36(bcmp)
-; LA64-NEXT: jirl $ra, $ra, 0
-; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
-; LA64-NEXT: addi.d $sp, $sp, 16
-; LA64-NEXT: ret
+; LA64-UAL-LABEL: bcmp_size_128:
+; LA64-UAL: # %bb.0: # %entry
+; LA64-UAL-NEXT: addi.d $sp, $sp, -16
+; LA64-UAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64-UAL-NEXT: ori $a2, $zero, 128
+; LA64-UAL-NEXT: pcaddu18i $ra, %call36(bcmp)
+; LA64-UAL-NEXT: jirl $ra, $ra, 0
+; LA64-UAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64-UAL-NEXT: addi.d $sp, $sp, 16
+; LA64-UAL-NEXT: ret
+;
+; LA32-UAL-LSX-LABEL: bcmp_size_128:
+; LA32-UAL-LSX: # %bb.0: # %entry
+; LA32-UAL-LSX-NEXT: vld $vr0, $a0, 0
+; LA32-UAL-LSX-NEXT: vld $vr1, $a1, 0
+; LA32-UAL-LSX-NEXT: vld $vr2, $a0, 16
+; LA32-UAL-LSX-NEXT: vld $vr3, $a1, 16
+; LA32-UAL-LSX-NEXT: vld $vr4, $a0, 32
+; LA32-UAL-LSX-NEXT: vld $vr5, $a1, 32
+; LA32-UAL-LSX-NEXT: vld $vr6, $a0, 48
+; LA32-UAL-LSX-NEXT: vld $vr7, $a1, 48
+; LA32-UAL-LSX-NEXT: vld $vr8, $a0, 64
+; LA32-UAL-LSX-NEXT: vld $vr9, $a1, 64
+; LA32-UAL-LSX-NEXT: vld $vr10, $a0, 96
+; LA32-UAL-LSX-NEXT: vld $vr11, $a0, 112
+; LA32-UAL-LSX-NEXT: vld $vr12, $a1, 112
+; LA32-UAL-LSX-NEXT: vld $vr13, $a1, 96
+; LA32-UAL-LSX-NEXT: vld $vr14, $a0, 80
+; LA32-UAL-LSX-NEXT: vld $vr15, $a1, 80
+; LA32-UAL-LSX-NEXT: vxor.v $vr11, $vr11, $vr12
+; LA32-UAL-LSX-NEXT: vxor.v $vr10, $vr10, $vr13
+; LA32-UAL-LSX-NEXT: vor.v $vr10, $vr10, $vr11
+; LA32-UAL-LSX-NEXT: vxor.v $vr11, $vr14, $vr15
+; LA32-UAL-LSX-NEXT: vxor.v $vr8, $vr8, $vr9
+; LA32-UAL-LSX-NEXT: vor.v $vr8, $vr8, $vr11
+; LA32-UAL-LSX-NEXT: vor.v $vr8, $vr8, $vr10
+; LA32-UAL-LSX-NEXT: vxor.v $vr6, $vr6, $vr7
+; LA32-UAL-LSX-NEXT: vxor.v $vr4, $vr4, $vr5
+; LA32-UAL-LSX-NEXT: vor.v $vr4, $vr4, $vr6
+; LA32-UAL-LSX-NEXT: vxor.v $vr2, $vr2, $vr3
+; LA32-UAL-LSX-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr2
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr4
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr8
+; LA32-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LSX-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-LSX-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-LSX-NEXT: ret
+;
+; LA64-UAL-LSX-LABEL: bcmp_size_128:
+; LA64-UAL-LSX: # %bb.0: # %entry
+; LA64-UAL-LSX-NEXT: vld $vr0, $a0, 0
+; LA64-UAL-LSX-NEXT: vld $vr1, $a1, 0
+; LA64-UAL-LSX-NEXT: vld $vr2, $a0, 16
+; LA64-UAL-LSX-NEXT: vld $vr3, $a1, 16
+; LA64-UAL-LSX-NEXT: vld $vr4, $a0, 32
+; LA64-UAL-LSX-NEXT: vld $vr5, $a1, 32
+; LA64-UAL-LSX-NEXT: vld $vr6, $a0, 48
+; LA64-UAL-LSX-NEXT: vld $vr7, $a1, 48
+; LA64-UAL-LSX-NEXT: vld $vr8, $a0, 64
+; LA64-UAL-LSX-NEXT: vld $vr9, $a1, 64
+; LA64-UAL-LSX-NEXT: vld $vr10, $a0, 96
+; LA64-UAL-LSX-NEXT: vld $vr11, $a0, 112
+; LA64-UAL-LSX-NEXT: vld $vr12, $a1, 112
+; LA64-UAL-LSX-NEXT: vld $vr13, $a1, 96
+; LA64-UAL-LSX-NEXT: vld $vr14, $a0, 80
+; LA64-UAL-LSX-NEXT: vld $vr15, $a1, 80
+; LA64-UAL-LSX-NEXT: vxor.v $vr11, $vr11, $vr12
+; LA64-UAL-LSX-NEXT: vxor.v $vr10, $vr10, $vr13
+; LA64-UAL-LSX-NEXT: vor.v $vr10, $vr10, $vr11
+; LA64-UAL-LSX-NEXT: vxor.v $vr11, $vr14, $vr15
+; LA64-UAL-LSX-NEXT: vxor.v $vr8, $vr8, $vr9
+; LA64-UAL-LSX-NEXT: vor.v $vr8, $vr8, $vr11
+; LA64-UAL-LSX-NEXT: vor.v $vr8, $vr8, $vr10
+; LA64-UAL-LSX-NEXT: vxor.v $vr6, $vr6, $vr7
+; LA64-UAL-LSX-NEXT: vxor.v $vr4, $vr4, $vr5
+; LA64-UAL-LSX-NEXT: vor.v $vr4, $vr4, $vr6
+; LA64-UAL-LSX-NEXT: vxor.v $vr2, $vr2, $vr3
+; LA64-UAL-LSX-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr2
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr4
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr0, $vr8
+; LA64-UAL-LSX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-LSX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-LSX-NEXT: vpickve2gr.d $a0, $vr0, 0
+; LA64-UAL-LSX-NEXT: sltu $a0, $zero, $a0
+; LA64-UAL-LSX-NEXT: ret
+;
+; LA32-UAL-LASX-LABEL: bcmp_size_128:
+; LA32-UAL-LASX: # %bb.0: # %entry
+; LA32-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA32-UAL-LASX-NEXT: xvld $xr1, $a1, 0
+; LA32-UAL-LASX-NEXT: xvld $xr2, $a0, 64
+; LA32-UAL-LASX-NEXT: xvld $xr3, $a0, 96
+; LA32-UAL-LASX-NEXT: xvld $xr4, $a1, 96
+; LA32-UAL-LASX-NEXT: xvld $xr5, $a1, 64
+; LA32-UAL-LASX-NEXT: xvld $xr6, $a0, 32
+; LA32-UAL-LASX-NEXT: xvld $xr7, $a1, 32
+; LA32-UAL-LASX-NEXT: xvxor.v $xr3, $xr3, $xr4
+; LA32-UAL-LASX-NEXT: xvxor.v $xr2, $xr2, $xr5
+; LA32-UAL-LASX-NEXT: xvor.v $xr2, $xr2, $xr3
+; LA32-UAL-LASX-NEXT: xvxor.v $xr3, $xr6, $xr7
+; LA32-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr1
+; LA32-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr3
+; LA32-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr2
+; LA32-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-LASX-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA32-UAL-LASX-NEXT: ret
+;
+; LA64-UAL-LASX-LABEL: bcmp_size_128:
+; LA64-UAL-LASX: # %bb.0: # %entry
+; LA64-UAL-LASX-NEXT: xvld $xr0, $a0, 0
+; LA64-UAL-LASX-NEXT: xvld $xr1, $a1, 0
+; LA64-UAL-LASX-NEXT: xvld $xr2, $a0, 64
+; LA64-UAL-LASX-NEXT: xvld $xr3, $a0, 96
+; LA64-UAL-LASX-NEXT: xvld $xr4, $a1, 96
+; LA64-UAL-LASX-NEXT: xvld $xr5, $a1, 64
+; LA64-UAL-LASX-NEXT: xvld $xr6, $a0, 32
+; LA64-UAL-LASX-NEXT: xvld $xr7, $a1, 32
+; LA64-UAL-LASX-NEXT: xvxor.v $xr3, $xr3, $xr4
+; LA64-UAL-LASX-NEXT: xvxor.v $xr2, $xr2, $xr5
+; LA64-UAL-LASX-NEXT: xvor.v $xr2, $xr2, $xr3
+; LA64-UAL-LASX-NEXT: xvxor.v $xr3, $xr6, $xr7
+; LA64-UAL-LASX-NEXT: xvxor.v $xr0, $xr0, $xr1
+; LA64-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr3
+; LA64-UAL-LASX-NEXT: xvor.v $xr0, $xr0, $xr2
+; LA64-UAL-LASX-NEXT: xvpermi.q $xr1, $xr0, 1
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr0, $vr1
+; LA64-UAL-LASX-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-LASX-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-LASX-NEXT: vpickve2gr.d $a0, $vr0, 0
+; LA64-UAL-LASX-NEXT: sltu $a0, $zero, $a0
+; LA64-UAL-LASX-NEXT: ret
+;
+; LA32-NUAL-LABEL: bcmp_size_128:
+; LA32-NUAL: # %bb.0: # %entry
+; LA32-NUAL-NEXT: addi.w $sp, $sp, -16
+; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-NUAL-NEXT: ori $a2, $zero, 128
+; LA32-NUAL-NEXT: bl bcmp
+; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-NUAL-NEXT: addi.w $sp, $sp, 16
+; LA32-NUAL-NEXT: ret
+;
+; LA64-NUAL-LABEL: bcmp_size_128:
+; LA64-NUAL: # %bb.0: # %entry
+; LA64-NUAL-NEXT: addi.d $sp, $sp, -16
+; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64-NUAL-NEXT: ori $a2, $zero, 128
+; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp)
+; LA64-NUAL-NEXT: jirl $ra, $ra, 0
+; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64-NUAL-NEXT: addi.d $sp, $sp, 16
+; LA64-NUAL-NEXT: ret
entry:
%bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 128)
ret i32 %bcmp
@@ -1136,33 +1530,25 @@ define i1 @bcmp_eq_zero(ptr %s1, ptr %s2) nounwind {
;
; LA32-UAL-V-LABEL: bcmp_eq_zero:
; LA32-UAL-V: # %bb.0: # %entry
-; LA32-UAL-V-NEXT: ld.w $a2, $a0, 0
-; LA32-UAL-V-NEXT: ld.w $a3, $a1, 0
-; LA32-UAL-V-NEXT: ld.w $a4, $a0, 4
-; LA32-UAL-V-NEXT: ld.w $a5, $a1, 4
-; LA32-UAL-V-NEXT: ld.w $a6, $a0, 8
-; LA32-UAL-V-NEXT: ld.w $a7, $a1, 8
-; LA32-UAL-V-NEXT: ld.w $a0, $a0, 12
-; LA32-UAL-V-NEXT: ld.w $a1, $a1, 12
-; LA32-UAL-V-NEXT: xor $a2, $a2, $a3
-; LA32-UAL-V-NEXT: xor $a3, $a4, $a5
-; LA32-UAL-V-NEXT: xor $a4, $a6, $a7
-; LA32-UAL-V-NEXT: xor $a0, $a0, $a1
-; LA32-UAL-V-NEXT: or $a1, $a2, $a3
-; LA32-UAL-V-NEXT: or $a0, $a4, $a0
-; LA32-UAL-V-NEXT: or $a0, $a1, $a0
+; LA32-UAL-V-NEXT: vld $vr0, $a0, 0
+; LA32-UAL-V-NEXT: vld $vr1, $a1, 0
+; LA32-UAL-V-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA32-UAL-V-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-V-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-V-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-V-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-V-NEXT: vpickve2gr.w $a0, $vr0, 0
; LA32-UAL-V-NEXT: sltui $a0, $a0, 1
; LA32-UAL-V-NEXT: ret
;
; LA64-UAL-V-LABEL: bcmp_eq_zero:
; LA64-UAL-V: # %bb.0: # %entry
-; LA64-UAL-V-NEXT: ld.d $a2, $a0, 0
-; LA64-UAL-V-NEXT: ld.d $a3, $a1, 0
-; LA64-UAL-V-NEXT: ld.d $a0, $a0, 8
-; LA64-UAL-V-NEXT: ld.d $a1, $a1, 8
-; LA64-UAL-V-NEXT: xor $a2, $a2, $a3
-; LA64-UAL-V-NEXT: xor $a0, $a0, $a1
-; LA64-UAL-V-NEXT: or $a0, $a2, $a0
+; LA64-UAL-V-NEXT: vld $vr0, $a0, 0
+; LA64-UAL-V-NEXT: vld $vr1, $a1, 0
+; LA64-UAL-V-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA64-UAL-V-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-V-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-V-NEXT: vpickve2gr.d $a0, $vr0, 0
; LA64-UAL-V-NEXT: sltui $a0, $a0, 1
; LA64-UAL-V-NEXT: ret
;
@@ -4220,33 +4606,25 @@ define i1 @memcmp_eq_zero(ptr %s1, ptr %s2) nounwind {
;
; LA32-UAL-V-LABEL: memcmp_eq_zero:
; LA32-UAL-V: # %bb.0: # %entry
-; LA32-UAL-V-NEXT: ld.w $a2, $a0, 0
-; LA32-UAL-V-NEXT: ld.w $a3, $a1, 0
-; LA32-UAL-V-NEXT: ld.w $a4, $a0, 4
-; LA32-UAL-V-NEXT: ld.w $a5, $a1, 4
-; LA32-UAL-V-NEXT: ld.w $a6, $a0, 8
-; LA32-UAL-V-NEXT: ld.w $a7, $a1, 8
-; LA32-UAL-V-NEXT: ld.w $a0, $a0, 12
-; LA32-UAL-V-NEXT: ld.w $a1, $a1, 12
-; LA32-UAL-V-NEXT: xor $a2, $a2, $a3
-; LA32-UAL-V-NEXT: xor $a3, $a4, $a5
-; LA32-UAL-V-NEXT: xor $a4, $a6, $a7
-; LA32-UAL-V-NEXT: xor $a0, $a0, $a1
-; LA32-UAL-V-NEXT: or $a1, $a2, $a3
-; LA32-UAL-V-NEXT: or $a0, $a4, $a0
-; LA32-UAL-V-NEXT: or $a0, $a1, $a0
+; LA32-UAL-V-NEXT: vld $vr0, $a0, 0
+; LA32-UAL-V-NEXT: vld $vr1, $a1, 0
+; LA32-UAL-V-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA32-UAL-V-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA32-UAL-V-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-V-NEXT: vbsrl.v $vr1, $vr0, 4
+; LA32-UAL-V-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-UAL-V-NEXT: vpickve2gr.w $a0, $vr0, 0
; LA32-UAL-V-NEXT: sltui $a0, $a0, 1
; LA32-UAL-V-NEXT: ret
;
; LA64-UAL-V-LABEL: memcmp_eq_zero:
; LA64-UAL-V: # %bb.0: # %entry
-; LA64-UAL-V-NEXT: ld.d $a2, $a0, 0
-; LA64-UAL-V-NEXT: ld.d $a3, $a1, 0
-; LA64-UAL-V-NEXT: ld.d $a0, $a0, 8
-; LA64-UAL-V-NEXT: ld.d $a1, $a1, 8
-; LA64-UAL-V-NEXT: xor $a2, $a2, $a3
-; LA64-UAL-V-NEXT: xor $a0, $a0, $a1
-; LA64-UAL-V-NEXT: or $a0, $a2, $a0
+; LA64-UAL-V-NEXT: vld $vr0, $a0, 0
+; LA64-UAL-V-NEXT: vld $vr1, $a1, 0
+; LA64-UAL-V-NEXT: vxor.v $vr0, $vr0, $vr1
+; LA64-UAL-V-NEXT: vbsrl.v $vr1, $vr0, 8
+; LA64-UAL-V-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-UAL-V-NEXT: vpickve2gr.d $a0, $vr0, 0
; LA64-UAL-V-NEXT: sltui $a0, $a0, 1
; LA64-UAL-V-NEXT: ret
;
@@ -4707,8 +5085,3 @@ entry:
%ret = icmp sgt i32 %memcmp, -1
ret i1 %ret
}
-;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
-; LA32-UAL-LASX: {{.*}}
-; LA32-UAL-LSX: {{.*}}
-; LA64-UAL-LASX: {{.*}}
-; LA64-UAL-LSX: {{.*}}
More information about the llvm-branch-commits
mailing list