2011-02-17 19:18:59 +00:00
|
|
|
//===-- X86ShuffleDecode.h - X86 shuffle decode logic -----------*-C++-*---===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// Define several functions to decode x86 specific shuffle semantics into a
|
|
|
|
// generic vector mask.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef X86_SHUFFLE_DECODE_H
|
|
|
|
#define X86_SHUFFLE_DECODE_H
|
|
|
|
|
|
|
|
#include "llvm/ADT/SmallVector.h"
|
2011-02-28 19:06:56 +00:00
|
|
|
#include "llvm/CodeGen/ValueTypes.h"
|
2011-02-17 19:18:59 +00:00
|
|
|
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// Vector Mask Decoding
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
namespace llvm {
|
|
|
|
enum {
|
2012-03-21 13:48:11 +00:00
|
|
|
SM_SentinelZero = -1
|
2011-02-17 19:18:59 +00:00
|
|
|
};
|
|
|
|
|
2012-03-20 06:42:26 +00:00
|
|
|
void DecodeINSERTPSMask(unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
|
2011-02-17 19:18:59 +00:00
|
|
|
|
|
|
|
// <3,1> or <6,7,2,3>
|
2012-03-20 06:42:26 +00:00
|
|
|
void DecodeMOVHLPSMask(unsigned NElts, SmallVectorImpl<int> &ShuffleMask);
|
2011-02-17 19:18:59 +00:00
|
|
|
|
|
|
|
// <0,2> or <0,1,4,5>
|
2012-03-20 06:42:26 +00:00
|
|
|
void DecodeMOVLHPSMask(unsigned NElts, SmallVectorImpl<int> &ShuffleMask);
|
2011-02-17 19:18:59 +00:00
|
|
|
|
2013-01-28 06:48:25 +00:00
|
|
|
void DecodePALIGNRMask(MVT VT, unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
|
2013-01-26 13:31:37 +00:00
|
|
|
|
2012-05-06 19:46:21 +00:00
|
|
|
void DecodePSHUFMask(MVT VT, unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
|
2011-02-17 19:18:59 +00:00
|
|
|
|
2012-05-06 19:46:21 +00:00
|
|
|
void DecodePSHUFHWMask(MVT VT, unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
|
2011-02-17 19:18:59 +00:00
|
|
|
|
2012-05-06 19:46:21 +00:00
|
|
|
void DecodePSHUFLWMask(MVT, unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
|
2011-02-17 19:18:59 +00:00
|
|
|
|
2012-02-06 07:17:51 +00:00
|
|
|
/// DecodeSHUFPMask - This decodes the shuffle masks for shufp*. VT indicates
|
|
|
|
/// the type of the vector allowing it to handle different datatypes and vector
|
|
|
|
/// widths.
|
2012-05-06 19:46:21 +00:00
|
|
|
void DecodeSHUFPMask(MVT VT, unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
|
2011-02-17 19:18:59 +00:00
|
|
|
|
2011-12-06 05:31:16 +00:00
|
|
|
/// DecodeUNPCKHMask - This decodes the shuffle masks for unpckhps/unpckhpd
|
2012-02-06 07:17:51 +00:00
|
|
|
/// and punpckh*. VT indicates the type of the vector allowing it to handle
|
|
|
|
/// different datatypes and vector widths.
|
2012-05-06 19:46:21 +00:00
|
|
|
void DecodeUNPCKHMask(MVT VT, SmallVectorImpl<int> &ShuffleMask);
|
2011-02-17 19:18:59 +00:00
|
|
|
|
2011-12-06 05:31:16 +00:00
|
|
|
/// DecodeUNPCKLMask - This decodes the shuffle masks for unpcklps/unpcklpd
|
2012-02-06 07:17:51 +00:00
|
|
|
/// and punpckl*. VT indicates the type of the vector allowing it to handle
|
|
|
|
/// different datatypes and vector widths.
|
2012-05-06 19:46:21 +00:00
|
|
|
void DecodeUNPCKLMask(MVT VT, SmallVectorImpl<int> &ShuffleMask);
|
2011-02-17 19:18:59 +00:00
|
|
|
|
Add support for 256-bit versions of VPERMIL instruction. This is a new
instruction introduced in AVX, which can operate on 128 and 256-bit vectors.
It considers a 256-bit vector as two independent 128-bit lanes. It can permute
any 32 or 64 elements inside a lane, and restricts the second lane to
have the same permutation of the first one. With the improved splat support
introduced early today, adding codegen for this instruction enable more
efficient 256-bit code:
Instead of:
vextractf128 $0, %ymm0, %xmm0
punpcklbw %xmm0, %xmm0
punpckhbw %xmm0, %xmm0
vinsertf128 $0, %xmm0, %ymm0, %ymm1
vinsertf128 $1, %xmm0, %ymm1, %ymm0
vextractf128 $1, %ymm0, %xmm1
shufps $1, %xmm1, %xmm1
movss %xmm1, 28(%rsp)
movss %xmm1, 24(%rsp)
movss %xmm1, 20(%rsp)
movss %xmm1, 16(%rsp)
vextractf128 $0, %ymm0, %xmm0
shufps $1, %xmm0, %xmm0
movss %xmm0, 12(%rsp)
movss %xmm0, 8(%rsp)
movss %xmm0, 4(%rsp)
movss %xmm0, (%rsp)
vmovaps (%rsp), %ymm0
We get:
vextractf128 $0, %ymm0, %xmm0
punpcklbw %xmm0, %xmm0
punpckhbw %xmm0, %xmm0
vinsertf128 $0, %xmm0, %ymm0, %ymm1
vinsertf128 $1, %xmm0, %ymm1, %ymm0
vpermilps $85, %ymm0, %ymm0
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135662 91177308-0d34-0410-b5e6-96231b3b80d8
2011-07-21 01:55:47 +00:00
|
|
|
|
2012-05-06 19:46:21 +00:00
|
|
|
void DecodeVPERM2X128Mask(MVT VT, unsigned Imm,
|
2012-03-20 06:42:26 +00:00
|
|
|
SmallVectorImpl<int> &ShuffleMask);
|
2011-08-12 21:48:26 +00:00
|
|
|
|
2012-05-06 18:44:02 +00:00
|
|
|
/// DecodeVPERMMask - this decodes the shuffle masks for VPERMQ/VPERMPD.
|
|
|
|
/// No VT provided since it only works on 256-bit, 4 element vectors.
|
|
|
|
void DecodeVPERMMask(unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
|
|
|
|
|
2011-02-17 19:18:59 +00:00
|
|
|
} // llvm namespace
|
|
|
|
|
|
|
|
#endif
|