mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-02 00:16:25 +00:00
Improve the widening of integral binary vector operations
- split WidenVecRes_Binary into WidenVecRes_Binary and WidenVecRes_BinaryCanTrap - WidenVecRes_BinaryCanTrap preserves the original behaviour for operations that can trap - WidenVecRes_Binary simply widens the operation and improves codegen for 3-element vectors by allowing widening and promotion on x86 (matches the behaviour of unary and ternary operation widening) - use WidenVecRes_Binary for operations on integers. Reviewed by: nrotem llvm-svn: 188699
This commit is contained in:
parent
e94cdad560
commit
404ef5af36
@ -631,6 +631,7 @@ private:
|
||||
|
||||
SDValue WidenVecRes_Ternary(SDNode *N);
|
||||
SDValue WidenVecRes_Binary(SDNode *N);
|
||||
SDValue WidenVecRes_BinaryCanTrap(SDNode *N);
|
||||
SDValue WidenVecRes_Convert(SDNode *N);
|
||||
SDValue WidenVecRes_POWI(SDNode *N);
|
||||
SDValue WidenVecRes_Shift(SDNode *N);
|
||||
|
@ -1448,29 +1448,33 @@ void DAGTypeLegalizer::WidenVectorResult(SDNode *N, unsigned ResNo) {
|
||||
case ISD::VECTOR_SHUFFLE:
|
||||
Res = WidenVecRes_VECTOR_SHUFFLE(cast<ShuffleVectorSDNode>(N));
|
||||
break;
|
||||
|
||||
case ISD::ADD:
|
||||
case ISD::AND:
|
||||
case ISD::BSWAP:
|
||||
case ISD::FADD:
|
||||
case ISD::FCOPYSIGN:
|
||||
case ISD::FDIV:
|
||||
case ISD::FMUL:
|
||||
case ISD::FPOW:
|
||||
case ISD::FREM:
|
||||
case ISD::FSUB:
|
||||
case ISD::MUL:
|
||||
case ISD::MULHS:
|
||||
case ISD::MULHU:
|
||||
case ISD::OR:
|
||||
case ISD::SDIV:
|
||||
case ISD::SREM:
|
||||
case ISD::UDIV:
|
||||
case ISD::UREM:
|
||||
case ISD::SUB:
|
||||
case ISD::XOR:
|
||||
Res = WidenVecRes_Binary(N);
|
||||
break;
|
||||
|
||||
case ISD::FADD:
|
||||
case ISD::FCOPYSIGN:
|
||||
case ISD::FMUL:
|
||||
case ISD::FPOW:
|
||||
case ISD::FSUB:
|
||||
case ISD::FDIV:
|
||||
case ISD::FREM:
|
||||
case ISD::SDIV:
|
||||
case ISD::UDIV:
|
||||
case ISD::SREM:
|
||||
case ISD::UREM:
|
||||
Res = WidenVecRes_BinaryCanTrap(N);
|
||||
break;
|
||||
|
||||
case ISD::FPOWI:
|
||||
Res = WidenVecRes_POWI(N);
|
||||
break;
|
||||
@ -1537,6 +1541,15 @@ SDValue DAGTypeLegalizer::WidenVecRes_Ternary(SDNode *N) {
|
||||
|
||||
SDValue DAGTypeLegalizer::WidenVecRes_Binary(SDNode *N) {
|
||||
// Binary op widening.
|
||||
SDLoc dl(N);
|
||||
EVT WidenVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
|
||||
SDValue InOp1 = GetWidenedVector(N->getOperand(0));
|
||||
SDValue InOp2 = GetWidenedVector(N->getOperand(1));
|
||||
return DAG.getNode(N->getOpcode(), dl, WidenVT, InOp1, InOp2);
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::WidenVecRes_BinaryCanTrap(SDNode *N) {
|
||||
// Binary op widening for operations that can trap.
|
||||
unsigned Opcode = N->getOpcode();
|
||||
SDLoc dl(N);
|
||||
EVT WidenVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
|
||||
|
@ -14,7 +14,7 @@ define void @t0(<2 x i64>* %dst, <2 x i64> %src1, <2 x i64> %src2) nounwind read
|
||||
|
||||
define void @t2(<3 x i64>* %dst, <3 x i64> %src1, <3 x i64> %src2) nounwind readonly {
|
||||
; CHECK: t2
|
||||
; CHECK-NOT: pand
|
||||
; CHECK: pand
|
||||
; CHECK: ret
|
||||
%cmp1 = icmp ne <3 x i64> %src1, zeroinitializer
|
||||
%cmp2 = icmp ne <3 x i64> %src2, zeroinitializer
|
||||
|
@ -1,7 +1,5 @@
|
||||
; RUN: llc < %s -mcpu=generic -march=x86 -mattr=+sse42 -post-RA-scheduler=true | FileCheck %s
|
||||
; CHECK: incl
|
||||
; CHECK: incl
|
||||
; CHECK: incl
|
||||
; CHECK: paddd
|
||||
|
||||
; Widen a v3i16 to v8i16 to do a vector add
|
||||
|
||||
|
@ -73,9 +73,7 @@ define void @add12i32(%i32vec12* sret %ret, %i32vec12* %ap, %i32vec12* %bp) {
|
||||
; CHECK: add3i16
|
||||
%i16vec3 = type <3 x i16>
|
||||
define void @add3i16(%i16vec3* nocapture sret %ret, %i16vec3* %ap, %i16vec3* %bp) nounwind {
|
||||
; CHECK: addl
|
||||
; CHECK: addl
|
||||
; CHECK: addl
|
||||
; CHECK: paddd
|
||||
; CHECK: ret
|
||||
%a = load %i16vec3* %ap, align 16
|
||||
%b = load %i16vec3* %bp, align 16
|
||||
@ -135,9 +133,7 @@ define void @add18i16(%i16vec18* nocapture sret %ret, %i16vec18* %ap, %i16vec18*
|
||||
; CHECK: add3i8
|
||||
%i8vec3 = type <3 x i8>
|
||||
define void @add3i8(%i8vec3* nocapture sret %ret, %i8vec3* %ap, %i8vec3* %bp) nounwind {
|
||||
; CHECK: addb
|
||||
; CHECK: addb
|
||||
; CHECK: addb
|
||||
; CHECK: paddd
|
||||
; CHECK: ret
|
||||
%a = load %i8vec3* %ap, align 16
|
||||
%b = load %i8vec3* %bp, align 16
|
||||
|
Loading…
Reference in New Issue
Block a user