mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-21 03:05:26 -04:00
[X86] Add a DAG combine to turn v16i16->v16i8 VTRUNCUS+store into a saturating truncating store.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374509 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -40448,6 +40448,19 @@ static SDValue combineStore(SDNode *N, SelectionDAG &DAG,
|
||||
MVT::v16i8, St->getMemOperand());
|
||||
}
|
||||
|
||||
// Try to fold a vpmovuswb 256->128 into a truncating store.
|
||||
// FIXME: Generalize this to other types.
|
||||
// FIXME: Do the same for signed saturation.
|
||||
if (!St->isTruncatingStore() && VT == MVT::v16i8 &&
|
||||
St->getValue().getOpcode() == X86ISD::VTRUNCUS &&
|
||||
St->getValue().getOperand(0).getValueType() == MVT::v16i16 &&
|
||||
TLI.isTruncStoreLegal(MVT::v16i16, MVT::v16i8) &&
|
||||
St->getValue().hasOneUse()) {
|
||||
return EmitTruncSStore(false /* Unsigned saturation */, St->getChain(),
|
||||
dl, St->getValue().getOperand(0), St->getBasePtr(),
|
||||
MVT::v16i8, St->getMemOperand(), DAG);
|
||||
}
|
||||
|
||||
// Optimize trunc store (of multiple scalars) to shuffle and store.
|
||||
// First, pack all of the elements in one place. Next, store to memory
|
||||
// in fewer chunks.
|
||||
|
||||
@@ -1104,8 +1104,7 @@ define void @trunc_packus_v16i32_v16i8_store(<16 x i32>* %p, <16 x i8>* %q) "min
|
||||
; CHECK-NEXT: vmovdqa (%rdi), %ymm0
|
||||
; CHECK-NEXT: vpackusdw 32(%rdi), %ymm0, %ymm0
|
||||
; CHECK-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
|
||||
; CHECK-NEXT: vpmovuswb %ymm0, %xmm0
|
||||
; CHECK-NEXT: vmovdqa %xmm0, (%rsi)
|
||||
; CHECK-NEXT: vpmovuswb %ymm0, (%rsi)
|
||||
; CHECK-NEXT: vzeroupper
|
||||
; CHECK-NEXT: retq
|
||||
%a = load <16 x i32>, <16 x i32>* %p
|
||||
|
||||
Reference in New Issue
Block a user