forked from OSchip/llvm-project
[X86] Support v64i8 mulhu/mulhs
Implemented by splitting into two v32i8 mulhu/mulhs and concatenating the results. Differential Revision: https://reviews.llvm.org/D38307 llvm-svn: 314584
This commit is contained in:
parent
e13eabe7d3
commit
d92ade96f4
|
@ -1438,6 +1438,8 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
|
|||
setOperationAction(ISD::MUL, MVT::v64i8, Custom);
|
||||
setOperationAction(ISD::MULHS, MVT::v32i16, Legal);
|
||||
setOperationAction(ISD::MULHU, MVT::v32i16, Legal);
|
||||
setOperationAction(ISD::MULHS, MVT::v64i8, Custom);
|
||||
setOperationAction(ISD::MULHU, MVT::v64i8, Custom);
|
||||
setOperationAction(ISD::CONCAT_VECTORS, MVT::v32i1, Custom);
|
||||
setOperationAction(ISD::CONCAT_VECTORS, MVT::v64i1, Custom);
|
||||
setOperationAction(ISD::CONCAT_VECTORS, MVT::v32i16, Custom);
|
||||
|
@ -21604,7 +21606,8 @@ static SDValue LowerMULH(SDValue Op, const X86Subtarget &Subtarget,
|
|||
return Lower256IntArith(Op, DAG);
|
||||
|
||||
// Only i8 vectors should need custom lowering after this.
|
||||
assert((VT == MVT::v16i8 || (VT == MVT::v32i8 && Subtarget.hasInt256())) &&
|
||||
assert((VT == MVT::v16i8 || (VT == MVT::v32i8 && Subtarget.hasInt256()) ||
|
||||
(VT == MVT::v64i8 && Subtarget.hasBWI())) &&
|
||||
"Unsupported vector type");
|
||||
|
||||
// Lower v16i8/v32i8 as extension to v8i16/v16i16 vector pairs, multiply,
|
||||
|
@ -21618,6 +21621,11 @@ static SDValue LowerMULH(SDValue Op, const X86Subtarget &Subtarget,
|
|||
unsigned ExShift = (ISD::MULHU == Opcode ? ISD::SRL : ISD::SRA);
|
||||
unsigned ExAVX = (ISD::MULHU == Opcode ? ISD::ZERO_EXTEND : ISD::SIGN_EXTEND);
|
||||
|
||||
// For 512-bit vectors, split into 256-bit vectors to allow the
|
||||
// sign-extension to occur.
|
||||
if (VT == MVT::v64i8)
|
||||
return Lower512IntArith(Op, DAG);
|
||||
|
||||
// AVX2 implementations - extend xmm subvectors to ymm.
|
||||
if (Subtarget.hasInt256()) {
|
||||
unsigned NumElems = VT.getVectorNumElements();
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue