X86ShuffleDecode.h revision 239462
1//===-- X86ShuffleDecode.h - X86 shuffle decode logic -----------*-C++-*---===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Define several functions to decode x86 specific shuffle semantics into a
11// generic vector mask.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef X86_SHUFFLE_DECODE_H
16#define X86_SHUFFLE_DECODE_H
17
18#include "llvm/ADT/SmallVector.h"
19#include "llvm/CodeGen/ValueTypes.h"
20
21//===----------------------------------------------------------------------===//
22//  Vector Mask Decoding
23//===----------------------------------------------------------------------===//
24
25namespace llvm {
26enum {
27  SM_SentinelZero = -1
28};
29
30void DecodeINSERTPSMask(unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
31
32// <3,1> or <6,7,2,3>
33void DecodeMOVHLPSMask(unsigned NElts, SmallVectorImpl<int> &ShuffleMask);
34
35// <0,2> or <0,1,4,5>
36void DecodeMOVLHPSMask(unsigned NElts, SmallVectorImpl<int> &ShuffleMask);
37
38void DecodePSHUFMask(MVT VT, unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
39
40void DecodePSHUFHWMask(MVT VT, unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
41
42void DecodePSHUFLWMask(MVT, unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
43
44/// DecodeSHUFPMask - This decodes the shuffle masks for shufp*. VT indicates
45/// the type of the vector allowing it to handle different datatypes and vector
46/// widths.
47void DecodeSHUFPMask(MVT VT, unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
48
49/// DecodeUNPCKHMask - This decodes the shuffle masks for unpckhps/unpckhpd
50/// and punpckh*. VT indicates the type of the vector allowing it to handle
51/// different datatypes and vector widths.
52void DecodeUNPCKHMask(MVT VT, SmallVectorImpl<int> &ShuffleMask);
53
54/// DecodeUNPCKLMask - This decodes the shuffle masks for unpcklps/unpcklpd
55/// and punpckl*. VT indicates the type of the vector allowing it to handle
56/// different datatypes and vector widths.
57void DecodeUNPCKLMask(MVT VT, SmallVectorImpl<int> &ShuffleMask);
58
59
60void DecodeVPERM2X128Mask(MVT VT, unsigned Imm,
61                          SmallVectorImpl<int> &ShuffleMask);
62
63/// DecodeVPERMMask - this decodes the shuffle masks for VPERMQ/VPERMPD.
64/// No VT provided since it only works on 256-bit, 4 element vectors.
65void DecodeVPERMMask(unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
66
67} // llvm namespace
68
69#endif
70