blob: d1678d57a8f914fc5d7b5fee2b58e547370332ff [file] [log] [blame]
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001//===-- X86ShuffleDecode.h - X86 shuffle decode logic -----------*-C++-*---===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00006//
7//===----------------------------------------------------------------------===//
8//
9// Define several functions to decode x86 specific shuffle semantics into a
10// generic vector mask.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_X86_UTILS_X86SHUFFLEDECODE_H
15#define LLVM_LIB_TARGET_X86_UTILS_X86SHUFFLEDECODE_H
16
Simon Pilgrimf85ee9f2018-10-23 11:33:38 +000017#include "llvm/ADT/APInt.h"
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000018#include "llvm/ADT/SmallVector.h"
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000019
20//===----------------------------------------------------------------------===//
21// Vector Mask Decoding
22//===----------------------------------------------------------------------===//
23
24namespace llvm {
Mehdi Aminib550cb12016-04-18 09:17:29 +000025template <typename T> class ArrayRef;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000026
27enum { SM_SentinelUndef = -1, SM_SentinelZero = -2 };
28
Simon Pilgrim47617032016-04-08 14:17:07 +000029/// Decode a 128-bit INSERTPS instruction as a v4f32 shuffle mask.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000030void DecodeINSERTPSMask(unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
31
Simon Pilgrima3d67442016-02-07 15:39:22 +000032// Insert the bottom Len elements from a second source into a vector starting at
33// element Idx.
Craig Topperacaba3b2018-03-12 16:43:11 +000034void DecodeInsertElementMask(unsigned NumElts, unsigned Idx, unsigned Len,
Simon Pilgrima3d67442016-02-07 15:39:22 +000035 SmallVectorImpl<int> &ShuffleMask);
36
Simon Pilgrim47617032016-04-08 14:17:07 +000037/// Decode a MOVHLPS instruction as a v2f64/v4f32 shuffle mask.
38/// i.e. <3,1> or <6,7,2,3>
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000039void DecodeMOVHLPSMask(unsigned NElts, SmallVectorImpl<int> &ShuffleMask);
40
Simon Pilgrim47617032016-04-08 14:17:07 +000041/// Decode a MOVLHPS instruction as a v2f64/v4f32 shuffle mask.
42/// i.e. <0,2> or <0,1,4,5>
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000043void DecodeMOVLHPSMask(unsigned NElts, SmallVectorImpl<int> &ShuffleMask);
44
Craig Topperacaba3b2018-03-12 16:43:11 +000045void DecodeMOVSLDUPMask(unsigned NumElts, SmallVectorImpl<int> &ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000046
Craig Topperacaba3b2018-03-12 16:43:11 +000047void DecodeMOVSHDUPMask(unsigned NumElts, SmallVectorImpl<int> &ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000048
Craig Topperacaba3b2018-03-12 16:43:11 +000049void DecodeMOVDDUPMask(unsigned NumElts, SmallVectorImpl<int> &ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000050
Craig Topperacaba3b2018-03-12 16:43:11 +000051void DecodePSLLDQMask(unsigned NumElts, unsigned Imm,
52 SmallVectorImpl<int> &ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000053
Craig Topperacaba3b2018-03-12 16:43:11 +000054void DecodePSRLDQMask(unsigned NumElts, unsigned Imm,
55 SmallVectorImpl<int> &ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000056
Craig Topperacaba3b2018-03-12 16:43:11 +000057void DecodePALIGNRMask(unsigned NumElts, unsigned Imm,
58 SmallVectorImpl<int> &ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000059
Craig Topperacaba3b2018-03-12 16:43:11 +000060void DecodeVALIGNMask(unsigned NumElts, unsigned Imm,
61 SmallVectorImpl<int> &ShuffleMask);
Craig Topperb084c902016-10-22 06:51:56 +000062
Simon Pilgrim47617032016-04-08 14:17:07 +000063/// Decodes the shuffle masks for pshufd/pshufw/vpermilpd/vpermilps.
64/// VT indicates the type of the vector allowing it to handle different
65/// datatypes and vector widths.
Craig Topperacaba3b2018-03-12 16:43:11 +000066void DecodePSHUFMask(unsigned NumElts, unsigned ScalarBits, unsigned Imm,
67 SmallVectorImpl<int> &ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000068
Simon Pilgrim47617032016-04-08 14:17:07 +000069/// Decodes the shuffle masks for pshufhw.
70/// VT indicates the type of the vector allowing it to handle different
71/// datatypes and vector widths.
Craig Topperacaba3b2018-03-12 16:43:11 +000072void DecodePSHUFHWMask(unsigned NumElts, unsigned Imm,
73 SmallVectorImpl<int> &ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000074
Simon Pilgrim47617032016-04-08 14:17:07 +000075/// Decodes the shuffle masks for pshuflw.
76/// VT indicates the type of the vector allowing it to handle different
77/// datatypes and vector widths.
Craig Topperacaba3b2018-03-12 16:43:11 +000078void DecodePSHUFLWMask(unsigned NumElts, unsigned Imm,
79 SmallVectorImpl<int> &ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000080
Simon Pilgrim47617032016-04-08 14:17:07 +000081/// Decodes a PSWAPD 3DNow! instruction.
Craig Topperacaba3b2018-03-12 16:43:11 +000082void DecodePSWAPMask(unsigned NumElts, SmallVectorImpl<int> &ShuffleMask);
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +000083
Simon Pilgrimfd4b9b02016-04-16 17:52:07 +000084/// Decodes the shuffle masks for shufp*.
Simon Pilgrim47617032016-04-08 14:17:07 +000085/// VT indicates the type of the vector allowing it to handle different
86/// datatypes and vector widths.
Craig Topperacaba3b2018-03-12 16:43:11 +000087void DecodeSHUFPMask(unsigned NumElts, unsigned ScalarBits, unsigned Imm,
88 SmallVectorImpl<int> &ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000089
Simon Pilgrim47617032016-04-08 14:17:07 +000090/// Decodes the shuffle masks for unpckhps/unpckhpd and punpckh*.
91/// VT indicates the type of the vector allowing it to handle different
92/// datatypes and vector widths.
Craig Topperacaba3b2018-03-12 16:43:11 +000093void DecodeUNPCKHMask(unsigned NumElts, unsigned ScalarBits,
94 SmallVectorImpl<int> &ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000095
Simon Pilgrim47617032016-04-08 14:17:07 +000096/// Decodes the shuffle masks for unpcklps/unpcklpd and punpckl*.
97/// VT indicates the type of the vector allowing it to handle different
98/// datatypes and vector widths.
Craig Topperacaba3b2018-03-12 16:43:11 +000099void DecodeUNPCKLMask(unsigned NumElts, unsigned ScalarBits,
100 SmallVectorImpl<int> &ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000101
Simon Pilgrimc941f6b2016-07-18 17:32:59 +0000102/// Decodes a broadcast of the first element of a vector.
Craig Topperacaba3b2018-03-12 16:43:11 +0000103void DecodeVectorBroadcast(unsigned NumElts, SmallVectorImpl<int> &ShuffleMask);
Simon Pilgrimc941f6b2016-07-18 17:32:59 +0000104
Simon Pilgrima76a8e52016-07-14 12:07:43 +0000105/// Decodes a broadcast of a subvector to a larger vector type.
Craig Topperacaba3b2018-03-12 16:43:11 +0000106void DecodeSubVectorBroadcast(unsigned DstNumElts, unsigned SrcNumElts,
Simon Pilgrima76a8e52016-07-14 12:07:43 +0000107 SmallVectorImpl<int> &ShuffleMask);
108
Simon Pilgrim47617032016-04-08 14:17:07 +0000109/// Decode a PSHUFB mask from a raw array of constants such as from
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000110/// BUILD_VECTOR.
Simon Pilgrimf85ee9f2018-10-23 11:33:38 +0000111void DecodePSHUFBMask(ArrayRef<uint64_t> RawMask, const APInt &UndefElts,
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000112 SmallVectorImpl<int> &ShuffleMask);
113
Simon Pilgrim47617032016-04-08 14:17:07 +0000114/// Decode a BLEND immediate mask into a shuffle mask.
Craig Topperacaba3b2018-03-12 16:43:11 +0000115void DecodeBLENDMask(unsigned NumElts, unsigned Imm,
116 SmallVectorImpl<int> &ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000117
Craig Topperacaba3b2018-03-12 16:43:11 +0000118void DecodeVPERM2X128Mask(unsigned NumElts, unsigned Imm,
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000119 SmallVectorImpl<int> &ShuffleMask);
120
Simon Pilgrim47617032016-04-08 14:17:07 +0000121/// Decode a shuffle packed values at 128-bit granularity
Igor Bregerd7bae452015-10-15 13:29:07 +0000122/// immediate mask into a shuffle mask.
Craig Topperacaba3b2018-03-12 16:43:11 +0000123void decodeVSHUF64x2FamilyMask(unsigned NumElts, unsigned ScalarSize,
124 unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
Igor Bregerd7bae452015-10-15 13:29:07 +0000125
Simon Pilgrim47617032016-04-08 14:17:07 +0000126/// Decodes the shuffle masks for VPERMQ/VPERMPD.
Craig Topperacaba3b2018-03-12 16:43:11 +0000127void DecodeVPERMMask(unsigned NumElts, unsigned Imm,
128 SmallVectorImpl<int> &ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000129
Simon Pilgrimfd4b9b02016-04-16 17:52:07 +0000130/// Decode a VPPERM mask from a raw array of constants such as from
131/// BUILD_VECTOR.
132/// This can only basic masks (permutes + zeros), not any of the other
133/// operations that VPPERM can perform.
Simon Pilgrimf85ee9f2018-10-23 11:33:38 +0000134void DecodeVPPERMMask(ArrayRef<uint64_t> RawMask, const APInt &UndefElts,
Simon Pilgrimfd4b9b02016-04-16 17:52:07 +0000135 SmallVectorImpl<int> &ShuffleMask);
136
Simon Pilgrim47617032016-04-08 14:17:07 +0000137/// Decode a zero extension instruction as a shuffle mask.
Craig Topperacaba3b2018-03-12 16:43:11 +0000138void DecodeZeroExtendMask(unsigned SrcScalarBits, unsigned DstScalarBits,
139 unsigned NumDstElts,
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000140 SmallVectorImpl<int> &ShuffleMask);
141
Simon Pilgrim47617032016-04-08 14:17:07 +0000142/// Decode a move lower and zero upper instruction as a shuffle mask.
Craig Topperacaba3b2018-03-12 16:43:11 +0000143void DecodeZeroMoveLowMask(unsigned NumElts, SmallVectorImpl<int> &ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000144
Simon Pilgrim47617032016-04-08 14:17:07 +0000145/// Decode a scalar float move instruction as a shuffle mask.
Craig Topperacaba3b2018-03-12 16:43:11 +0000146void DecodeScalarMoveMask(unsigned NumElts, bool IsLoad,
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000147 SmallVectorImpl<int> &ShuffleMask);
Simon Pilgrimd85cae32015-07-06 20:46:41 +0000148
Simon Pilgrim9f0a0bd2017-07-04 16:53:12 +0000149/// Decode a SSE4A EXTRQ instruction as a shuffle mask.
Craig Topperacaba3b2018-03-12 16:43:11 +0000150void DecodeEXTRQIMask(unsigned NumElts, unsigned EltSize, int Len, int Idx,
Simon Pilgrimd85cae32015-07-06 20:46:41 +0000151 SmallVectorImpl<int> &ShuffleMask);
152
Simon Pilgrim9f0a0bd2017-07-04 16:53:12 +0000153/// Decode a SSE4A INSERTQ instruction as a shuffle mask.
Craig Topperacaba3b2018-03-12 16:43:11 +0000154void DecodeINSERTQIMask(unsigned NumElts, unsigned EltSize, int Len, int Idx,
Simon Pilgrimd85cae32015-07-06 20:46:41 +0000155 SmallVectorImpl<int> &ShuffleMask);
Elena Demikhovskye88038f2015-09-08 06:38:21 +0000156
Simon Pilgrim47617032016-04-08 14:17:07 +0000157/// Decode a VPERMILPD/VPERMILPS variable mask from a raw array of constants.
Craig Topperacaba3b2018-03-12 16:43:11 +0000158void DecodeVPERMILPMask(unsigned NumElts, unsigned ScalarBits,
Simon Pilgrimf85ee9f2018-10-23 11:33:38 +0000159 ArrayRef<uint64_t> RawMask, const APInt &UndefElts,
Simon Pilgrim40e1a712016-03-05 22:53:31 +0000160 SmallVectorImpl<int> &ShuffleMask);
161
Simon Pilgrim64c6de42016-06-05 15:21:30 +0000162/// Decode a VPERMIL2PD/VPERMIL2PS variable mask from a raw array of constants.
Craig Topperacaba3b2018-03-12 16:43:11 +0000163void DecodeVPERMIL2PMask(unsigned NumElts, unsigned ScalarBits, unsigned M2Z,
Simon Pilgrimf85ee9f2018-10-23 11:33:38 +0000164 ArrayRef<uint64_t> RawMask, const APInt &UndefElts,
Simon Pilgrim64c6de42016-06-05 15:21:30 +0000165 SmallVectorImpl<int> &ShuffleMask);
166
Simon Pilgrim47617032016-04-08 14:17:07 +0000167/// Decode a VPERM W/D/Q/PS/PD mask from a raw array of constants.
Simon Pilgrimf85ee9f2018-10-23 11:33:38 +0000168void DecodeVPERMVMask(ArrayRef<uint64_t> RawMask, const APInt &UndefElts,
Elena Demikhovskye88038f2015-09-08 06:38:21 +0000169 SmallVectorImpl<int> &ShuffleMask);
170
Simon Pilgrim47617032016-04-08 14:17:07 +0000171/// Decode a VPERMT2 W/D/Q/PS/PD mask from a raw array of constants.
Simon Pilgrimf85ee9f2018-10-23 11:33:38 +0000172void DecodeVPERMV3Mask(ArrayRef<uint64_t> RawMask, const APInt &UndefElts,
Elena Demikhovskye88038f2015-09-08 06:38:21 +0000173 SmallVectorImpl<int> &ShuffleMask);
Alexander Kornienkof00654e2015-06-23 09:49:53 +0000174} // llvm namespace
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000175
176#endif