mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	undef in the shuffle mask. This shows up when we're printing comments during lowering and we still have an IR-level constant hanging around that models undef. A nice consequence of this is *much* prettier test cases where the undef lanes actually show up as undef rather than as a particular set of values. This also allows us to print shuffle comments in cases that use undef such as the recently added variable VPERMILPS lowering. Now those test cases have nice shuffle comments attached with their details. The shuffle lowering for PSHUFB has been augmented to use undef, and the shuffle combining has been augmented to comprehend it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218301 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			90 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//===-- 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 LLVM_LIB_TARGET_X86_UTILS_X86SHUFFLEDECODE_H
 | 
						|
#define LLVM_LIB_TARGET_X86_UTILS_X86SHUFFLEDECODE_H
 | 
						|
 | 
						|
#include "llvm/ADT/SmallVector.h"
 | 
						|
#include "llvm/ADT/ArrayRef.h"
 | 
						|
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
//  Vector Mask Decoding
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
namespace llvm {
 | 
						|
class Constant;
 | 
						|
class MVT;
 | 
						|
 | 
						|
enum { SM_SentinelZero = -1, SM_SentinelUndef = -2 };
 | 
						|
 | 
						|
void DecodeINSERTPSMask(unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
 | 
						|
 | 
						|
// <3,1> or <6,7,2,3>
 | 
						|
void DecodeMOVHLPSMask(unsigned NElts, SmallVectorImpl<int> &ShuffleMask);
 | 
						|
 | 
						|
// <0,2> or <0,1,4,5>
 | 
						|
void DecodeMOVLHPSMask(unsigned NElts, SmallVectorImpl<int> &ShuffleMask);
 | 
						|
 | 
						|
void DecodeMOVSLDUPMask(MVT VT, SmallVectorImpl<int> &ShuffleMask);
 | 
						|
 | 
						|
void DecodeMOVSHDUPMask(MVT VT, SmallVectorImpl<int> &ShuffleMask);
 | 
						|
 | 
						|
void DecodePALIGNRMask(MVT VT, unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
 | 
						|
 | 
						|
void DecodePSHUFMask(MVT VT, unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
 | 
						|
 | 
						|
void DecodePSHUFHWMask(MVT VT, unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
 | 
						|
 | 
						|
void DecodePSHUFLWMask(MVT, unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
 | 
						|
 | 
						|
/// DecodeSHUFPMask - This decodes the shuffle masks for shufp*. VT indicates
 | 
						|
/// the type of the vector allowing it to handle different datatypes and vector
 | 
						|
/// widths.
 | 
						|
void DecodeSHUFPMask(MVT VT, unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
 | 
						|
 | 
						|
/// DecodeUNPCKHMask - This decodes the shuffle masks for unpckhps/unpckhpd
 | 
						|
/// and punpckh*. VT indicates the type of the vector allowing it to handle
 | 
						|
/// different datatypes and vector widths.
 | 
						|
void DecodeUNPCKHMask(MVT VT, SmallVectorImpl<int> &ShuffleMask);
 | 
						|
 | 
						|
/// DecodeUNPCKLMask - This decodes the shuffle masks for unpcklps/unpcklpd
 | 
						|
/// and punpckl*. VT indicates the type of the vector allowing it to handle
 | 
						|
/// different datatypes and vector widths.
 | 
						|
void DecodeUNPCKLMask(MVT VT, SmallVectorImpl<int> &ShuffleMask);
 | 
						|
 | 
						|
/// \brief Decode a PSHUFB mask from an IR-level vector constant.
 | 
						|
void DecodePSHUFBMask(const Constant *C, SmallVectorImpl<int> &ShuffleMask);
 | 
						|
 | 
						|
/// \brief Decode a PSHUFB mask from a raw array of constants such as from
 | 
						|
/// BUILD_VECTOR.
 | 
						|
void DecodePSHUFBMask(ArrayRef<uint64_t> RawMask,
 | 
						|
                      SmallVectorImpl<int> &ShuffleMask);
 | 
						|
 | 
						|
/// \brief Decode a BLEND immediate mask into a shuffle mask.
 | 
						|
void DecodeBLENDMask(MVT VT, unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
 | 
						|
 | 
						|
void DecodeVPERM2X128Mask(MVT VT, unsigned Imm,
 | 
						|
                          SmallVectorImpl<int> &ShuffleMask);
 | 
						|
 | 
						|
/// 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);
 | 
						|
 | 
						|
/// \brief Decode a VPERMILP variable mask from an IR-level vector constant.
 | 
						|
void DecodeVPERMILPMask(const Constant *C, SmallVectorImpl<int> &ShuffleMask);
 | 
						|
 | 
						|
} // llvm namespace
 | 
						|
 | 
						|
#endif
 |