mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 12:19:53 +00:00
[PowerPC] Fix value type on XVCMPEQDP for v2f64 comparisons
XVCMPEQDP is used for VSX v2f64 equality comparisons, but the value type needs to be v2i64 (as that's the corresponding SETCC type). Fixes PR24225. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245535 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c2b62e02e8
commit
d51dd69e79
@ -2305,14 +2305,15 @@ SDNode *PPCDAGToDAGISel::SelectSETCC(SDNode *N) {
|
||||
if (Swap)
|
||||
std::swap(LHS, RHS);
|
||||
|
||||
EVT ResVT = VecVT.changeVectorElementTypeToInteger();
|
||||
if (Negate) {
|
||||
SDValue VCmp(CurDAG->getMachineNode(VCmpInst, dl, VecVT, LHS, RHS), 0);
|
||||
SDValue VCmp(CurDAG->getMachineNode(VCmpInst, dl, ResVT, LHS, RHS), 0);
|
||||
return CurDAG->SelectNodeTo(N, PPCSubTarget->hasVSX() ? PPC::XXLNOR :
|
||||
PPC::VNOR,
|
||||
VecVT, VCmp, VCmp);
|
||||
ResVT, VCmp, VCmp);
|
||||
}
|
||||
|
||||
return CurDAG->SelectNodeTo(N, VCmpInst, VecVT, LHS, RHS);
|
||||
return CurDAG->SelectNodeTo(N, VCmpInst, ResVT, LHS, RHS);
|
||||
}
|
||||
|
||||
if (PPCSubTarget->useCRBits())
|
||||
|
38
test/CodeGen/PowerPC/xvcmpeqdp-v2f64.ll
Normal file
38
test/CodeGen/PowerPC/xvcmpeqdp-v2f64.ll
Normal file
@ -0,0 +1,38 @@
|
||||
; RUN: llc < %s | FileCheck %s
|
||||
target datalayout = "e-m:e-i64:64-n32:64"
|
||||
target triple = "powerpc64le-unknown-linux-gnu"
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define void @__fmax_double3_3D_exec() #0 {
|
||||
entry:
|
||||
br i1 undef, label %if.then.i, label %fmax_double3.exit
|
||||
|
||||
if.then.i: ; preds = %entry
|
||||
%cmp24.i.i = fcmp ord <3 x double> undef, zeroinitializer
|
||||
%sext25.i.i = sext <3 x i1> %cmp24.i.i to <3 x i64>
|
||||
%neg.i.i = xor <3 x i64> %sext25.i.i, <i64 -1, i64 -1, i64 -1>
|
||||
%or.i.i = or <3 x i64> undef, %neg.i.i
|
||||
%neg.i.i.i = select <3 x i1> undef, <3 x i64> zeroinitializer, <3 x i64> %sext25.i.i
|
||||
%and.i.i.i = and <3 x i64> undef, %neg.i.i.i
|
||||
%and26.i.i.i = and <3 x i64> undef, %or.i.i
|
||||
%or.i.i.i = or <3 x i64> %and.i.i.i, %and26.i.i.i
|
||||
%astype32.i.i.i = bitcast <3 x i64> %or.i.i.i to <3 x double>
|
||||
%extractVec33.i.i.i = shufflevector <3 x double> %astype32.i.i.i, <3 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 undef>
|
||||
store <4 x double> %extractVec33.i.i.i, <4 x double>* undef, align 32
|
||||
br label %fmax_double3.exit
|
||||
|
||||
; CHECK-LABEL: @__fmax_double3_3D_exec
|
||||
; CHECK: xvcmpeqdp
|
||||
|
||||
fmax_double3.exit: ; preds = %if.then.i, %entry
|
||||
br i1 undef, label %if.then, label %do.end
|
||||
|
||||
if.then: ; preds = %fmax_double3.exit
|
||||
unreachable
|
||||
|
||||
do.end: ; preds = %fmax_double3.exit
|
||||
ret void
|
||||
}
|
||||
|
||||
attributes #0 = { nounwind }
|
||||
|
Loading…
Reference in New Issue
Block a user