mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 16:33:28 +00:00
Cleanup PALIGNR handling and remove the old palign pattern fragment.
Also make PALIGNR masks to don't match 256-bits, which isn't supported It's also a step to solve PR10489 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136448 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
741bf790b8
commit
9065d4b65f
@ -3076,6 +3076,8 @@ bool X86::isPSHUFLWMask(ShuffleVectorSDNode *N) {
|
||||
static bool isPALIGNRMask(const SmallVectorImpl<int> &Mask, EVT VT,
|
||||
bool hasSSSE3) {
|
||||
int i, e = VT.getVectorNumElements();
|
||||
if (VT.getSizeInBits() != 128 && VT.getSizeInBits() != 64)
|
||||
return false;
|
||||
|
||||
// Do not handle v2i64 / v2f64 shuffles with palignr.
|
||||
if (e < 4 || !hasSSSE3)
|
||||
@ -3104,12 +3106,6 @@ static bool isPALIGNRMask(const SmallVectorImpl<int> &Mask, EVT VT,
|
||||
return true;
|
||||
}
|
||||
|
||||
bool X86::isPALIGNRMask(ShuffleVectorSDNode *N) {
|
||||
SmallVector<int, 8> M;
|
||||
N->getMask(M);
|
||||
return ::isPALIGNRMask(M, N->getValueType(0), true);
|
||||
}
|
||||
|
||||
/// isSHUFPMask - Return true if the specified VECTOR_SHUFFLE operand
|
||||
/// specifies a shuffle of elements that is suitable for input to SHUFP*.
|
||||
static bool isSHUFPMask(const SmallVectorImpl<int> &Mask, EVT VT) {
|
||||
|
@ -421,10 +421,6 @@ namespace llvm {
|
||||
/// specifies a shuffle of elements that is suitable for input to MOVDDUP.
|
||||
bool isMOVDDUPMask(ShuffleVectorSDNode *N);
|
||||
|
||||
/// isPALIGNRMask - Return true if the specified VECTOR_SHUFFLE operand
|
||||
/// specifies a shuffle of elements that is suitable for input to PALIGNR.
|
||||
bool isPALIGNRMask(ShuffleVectorSDNode *N);
|
||||
|
||||
/// isVEXTRACTF128Index - Return true if the specified
|
||||
/// EXTRACT_SUBVECTOR operand specifies a vector extract that is
|
||||
/// suitable for input to VEXTRACTF128.
|
||||
|
@ -436,11 +436,6 @@ def pshuflw : PatFrag<(ops node:$lhs, node:$rhs),
|
||||
return X86::isPSHUFLWMask(cast<ShuffleVectorSDNode>(N));
|
||||
}], SHUFFLE_get_pshuflw_imm>;
|
||||
|
||||
def palign : PatFrag<(ops node:$lhs, node:$rhs),
|
||||
(vector_shuffle node:$lhs, node:$rhs), [{
|
||||
return X86::isPALIGNRMask(cast<ShuffleVectorSDNode>(N));
|
||||
}], SHUFFLE_get_palign_imm>;
|
||||
|
||||
def vextractf128_extract : PatFrag<(ops node:$bigvec, node:$index),
|
||||
(extract_subvector node:$bigvec,
|
||||
node:$index), [{
|
||||
|
@ -3641,26 +3641,29 @@ multiclass ssse3_palign<string asm, bit Is2Addr = 1> {
|
||||
|
||||
let Predicates = [HasAVX] in
|
||||
defm VPALIGN : ssse3_palign<"vpalignr", 0>, VEX_4V;
|
||||
let Constraints = "$src1 = $dst" in
|
||||
let Constraints = "$src1 = $dst", Predicates = [HasSSSE3] in
|
||||
defm PALIGN : ssse3_palign<"palignr">;
|
||||
|
||||
let AddedComplexity = 5 in {
|
||||
def : Pat<(v4i32 (palign:$src3 VR128:$src1, VR128:$src2)),
|
||||
(PALIGNR128rr VR128:$src2, VR128:$src1,
|
||||
(SHUFFLE_get_palign_imm VR128:$src3))>,
|
||||
Requires<[HasSSSE3]>;
|
||||
def : Pat<(v4f32 (palign:$src3 VR128:$src1, VR128:$src2)),
|
||||
(PALIGNR128rr VR128:$src2, VR128:$src1,
|
||||
(SHUFFLE_get_palign_imm VR128:$src3))>,
|
||||
Requires<[HasSSSE3]>;
|
||||
def : Pat<(v8i16 (palign:$src3 VR128:$src1, VR128:$src2)),
|
||||
(PALIGNR128rr VR128:$src2, VR128:$src1,
|
||||
(SHUFFLE_get_palign_imm VR128:$src3))>,
|
||||
Requires<[HasSSSE3]>;
|
||||
def : Pat<(v16i8 (palign:$src3 VR128:$src1, VR128:$src2)),
|
||||
(PALIGNR128rr VR128:$src2, VR128:$src1,
|
||||
(SHUFFLE_get_palign_imm VR128:$src3))>,
|
||||
Requires<[HasSSSE3]>;
|
||||
let Predicates = [HasSSSE3] in {
|
||||
def : Pat<(v4i32 (X86PAlign VR128:$src1, VR128:$src2, (i8 imm:$imm))),
|
||||
(PALIGNR128rr VR128:$src2, VR128:$src1, imm:$imm)>;
|
||||
def : Pat<(v4f32 (X86PAlign VR128:$src1, VR128:$src2, (i8 imm:$imm))),
|
||||
(PALIGNR128rr VR128:$src2, VR128:$src1, imm:$imm)>;
|
||||
def : Pat<(v8i16 (X86PAlign VR128:$src1, VR128:$src2, (i8 imm:$imm))),
|
||||
(PALIGNR128rr VR128:$src2, VR128:$src1, imm:$imm)>;
|
||||
def : Pat<(v16i8 (X86PAlign VR128:$src1, VR128:$src2, (i8 imm:$imm))),
|
||||
(PALIGNR128rr VR128:$src2, VR128:$src1, imm:$imm)>;
|
||||
}
|
||||
|
||||
let Predicates = [HasAVX] in {
|
||||
def : Pat<(v4i32 (X86PAlign VR128:$src1, VR128:$src2, (i8 imm:$imm))),
|
||||
(VPALIGNR128rr VR128:$src2, VR128:$src1, imm:$imm)>;
|
||||
def : Pat<(v4f32 (X86PAlign VR128:$src1, VR128:$src2, (i8 imm:$imm))),
|
||||
(VPALIGNR128rr VR128:$src2, VR128:$src1, imm:$imm)>;
|
||||
def : Pat<(v8i16 (X86PAlign VR128:$src1, VR128:$src2, (i8 imm:$imm))),
|
||||
(VPALIGNR128rr VR128:$src2, VR128:$src1, imm:$imm)>;
|
||||
def : Pat<(v16i8 (X86PAlign VR128:$src1, VR128:$src2, (i8 imm:$imm))),
|
||||
(VPALIGNR128rr VR128:$src2, VR128:$src1, imm:$imm)>;
|
||||
}
|
||||
|
||||
//===---------------------------------------------------------------------===//
|
||||
@ -5845,16 +5848,6 @@ def : Pat<(v8i16 (X86PShuflw VR128:$src, (i8 imm:$imm))),
|
||||
def : Pat<(v8i16 (X86PShuflw (bc_v8i16 (memopv2i64 addr:$src)), (i8 imm:$imm))),
|
||||
(PSHUFLWmi addr:$src, imm:$imm)>;
|
||||
|
||||
// Shuffle with PALIGN
|
||||
def : Pat<(v4i32 (X86PAlign VR128:$src1, VR128:$src2, (i8 imm:$imm))),
|
||||
(PALIGNR128rr VR128:$src2, VR128:$src1, imm:$imm)>;
|
||||
def : Pat<(v4f32 (X86PAlign VR128:$src1, VR128:$src2, (i8 imm:$imm))),
|
||||
(PALIGNR128rr VR128:$src2, VR128:$src1, imm:$imm)>;
|
||||
def : Pat<(v8i16 (X86PAlign VR128:$src1, VR128:$src2, (i8 imm:$imm))),
|
||||
(PALIGNR128rr VR128:$src2, VR128:$src1, imm:$imm)>;
|
||||
def : Pat<(v16i8 (X86PAlign VR128:$src1, VR128:$src2, (i8 imm:$imm))),
|
||||
(PALIGNR128rr VR128:$src2, VR128:$src1, imm:$imm)>;
|
||||
|
||||
// Shuffle with MOVLPS
|
||||
def : Pat<(v4f32 (X86Movlps VR128:$src1, (load addr:$src2))),
|
||||
(MOVLPSrm VR128:$src1, addr:$src2)>;
|
||||
|
Loading…
x
Reference in New Issue
Block a user