forked from OSchip/llvm-project
[AVX] Recorganize X86ShuffleDecode into its own library
(LLVMX86Utils.a) to break cyclic library dependencies between LLVMX86CodeGen.a and LLVMX86AsmParser.a. Previously this code was in a header file and marked static but AVX requires some additional functionality here that won't be used by all clients. Since including unused static functions causes a gcc compiler warning, keeping it as a header would break builds that use -Werror. Putting this in its own library solves both problems at once. llvm-svn: 125765
This commit is contained in:
parent
93c8736abb
commit
3a2b508e8f
|
@ -16,7 +16,7 @@
|
|||
#include "X86GenInstrNames.inc"
|
||||
#include "llvm/MC/MCInst.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "../X86ShuffleDecode.h"
|
||||
#include "../Utils/X86ShuffleDecode.h"
|
||||
using namespace llvm;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -20,6 +20,6 @@ BUILT_SOURCES = X86GenRegisterInfo.h.inc X86GenRegisterNames.inc \
|
|||
X86GenCallingConv.inc X86GenSubtarget.inc \
|
||||
X86GenEDInfo.inc
|
||||
|
||||
DIRS = InstPrinter AsmParser Disassembler TargetInfo
|
||||
DIRS = InstPrinter AsmParser Disassembler TargetInfo Utils
|
||||
|
||||
include $(LEVEL)/Makefile.common
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
include_directories( ${CMAKE_CURRENT_BINARY_DIR}/.. ${CMAKE_CURRENT_SOURCE_DIR}/.. )
|
||||
|
||||
add_llvm_library(LLVMX86Utils
|
||||
X86ShuffleDecode.cpp
|
||||
)
|
||||
add_dependencies(LLVMX86Utils X86CodeGenTable_gen)
|
|
@ -0,0 +1,15 @@
|
|||
##===- lib/Target/X86/Utils/Makefile -----------------------*- Makefile -*-===##
|
||||
#
|
||||
# The LLVM Compiler Infrastructure
|
||||
#
|
||||
# This file is distributed under the University of Illinois Open Source
|
||||
# License. See LICENSE.TXT for details.
|
||||
#
|
||||
##===----------------------------------------------------------------------===##
|
||||
LEVEL = ../../../..
|
||||
LIBRARYNAME = LLVMX86Utils
|
||||
|
||||
# Hack: we need to include 'main' x86 target directory to grab private headers
|
||||
CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
|
||||
|
||||
include $(LEVEL)/Makefile.common
|
|
@ -12,21 +12,14 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef X86_SHUFFLE_DECODE_H
|
||||
#define X86_SHUFFLE_DECODE_H
|
||||
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
using namespace llvm;
|
||||
#include "X86ShuffleDecode.h"
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Vector Mask Decoding
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
enum {
|
||||
SM_SentinelZero = ~0U
|
||||
};
|
||||
namespace llvm {
|
||||
|
||||
static inline
|
||||
void DecodeINSERTPSMask(unsigned Imm, SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
// Defaults the copying the dest value.
|
||||
ShuffleMask.push_back(0);
|
||||
|
@ -51,8 +44,8 @@ void DecodeINSERTPSMask(unsigned Imm, SmallVectorImpl<unsigned> &ShuffleMask) {
|
|||
}
|
||||
|
||||
// <3,1> or <6,7,2,3>
|
||||
static void DecodeMOVHLPSMask(unsigned NElts,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
void DecodeMOVHLPSMask(unsigned NElts,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
for (unsigned i = NElts/2; i != NElts; ++i)
|
||||
ShuffleMask.push_back(NElts+i);
|
||||
|
||||
|
@ -61,8 +54,8 @@ static void DecodeMOVHLPSMask(unsigned NElts,
|
|||
}
|
||||
|
||||
// <0,2> or <0,1,4,5>
|
||||
static void DecodeMOVLHPSMask(unsigned NElts,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
void DecodeMOVLHPSMask(unsigned NElts,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
for (unsigned i = 0; i != NElts/2; ++i)
|
||||
ShuffleMask.push_back(i);
|
||||
|
||||
|
@ -70,16 +63,16 @@ static void DecodeMOVLHPSMask(unsigned NElts,
|
|||
ShuffleMask.push_back(NElts+i);
|
||||
}
|
||||
|
||||
static void DecodePSHUFMask(unsigned NElts, unsigned Imm,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
void DecodePSHUFMask(unsigned NElts, unsigned Imm,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
for (unsigned i = 0; i != NElts; ++i) {
|
||||
ShuffleMask.push_back(Imm % NElts);
|
||||
Imm /= NElts;
|
||||
}
|
||||
}
|
||||
|
||||
static void DecodePSHUFHWMask(unsigned Imm,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
void DecodePSHUFHWMask(unsigned Imm,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
ShuffleMask.push_back(0);
|
||||
ShuffleMask.push_back(1);
|
||||
ShuffleMask.push_back(2);
|
||||
|
@ -90,8 +83,8 @@ static void DecodePSHUFHWMask(unsigned Imm,
|
|||
}
|
||||
}
|
||||
|
||||
static void DecodePSHUFLWMask(unsigned Imm,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
void DecodePSHUFLWMask(unsigned Imm,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
for (unsigned i = 0; i != 4; ++i) {
|
||||
ShuffleMask.push_back((Imm & 3));
|
||||
Imm >>= 2;
|
||||
|
@ -102,24 +95,24 @@ static void DecodePSHUFLWMask(unsigned Imm,
|
|||
ShuffleMask.push_back(7);
|
||||
}
|
||||
|
||||
static void DecodePUNPCKLMask(unsigned NElts,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
void DecodePUNPCKLMask(unsigned NElts,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
for (unsigned i = 0; i != NElts/2; ++i) {
|
||||
ShuffleMask.push_back(i);
|
||||
ShuffleMask.push_back(i+NElts);
|
||||
}
|
||||
}
|
||||
|
||||
static void DecodePUNPCKHMask(unsigned NElts,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
void DecodePUNPCKHMask(unsigned NElts,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
for (unsigned i = 0; i != NElts/2; ++i) {
|
||||
ShuffleMask.push_back(i+NElts/2);
|
||||
ShuffleMask.push_back(i+NElts+NElts/2);
|
||||
}
|
||||
}
|
||||
|
||||
static void DecodeSHUFPSMask(unsigned NElts, unsigned Imm,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
void DecodeSHUFPSMask(unsigned NElts, unsigned Imm,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
// Part that reads from dest.
|
||||
for (unsigned i = 0; i != NElts/2; ++i) {
|
||||
ShuffleMask.push_back(Imm % NElts);
|
||||
|
@ -132,8 +125,8 @@ static void DecodeSHUFPSMask(unsigned NElts, unsigned Imm,
|
|||
}
|
||||
}
|
||||
|
||||
static void DecodeUNPCKHPMask(unsigned NElts,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
void DecodeUNPCKHPMask(unsigned NElts,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
for (unsigned i = 0; i != NElts/2; ++i) {
|
||||
ShuffleMask.push_back(i+NElts/2); // Reads from dest
|
||||
ShuffleMask.push_back(i+NElts+NElts/2); // Reads from src
|
||||
|
@ -144,12 +137,12 @@ static void DecodeUNPCKHPMask(unsigned NElts,
|
|||
/// DecodeUNPCKLPMask - This decodes the shuffle masks for unpcklps/unpcklpd
|
||||
/// etc. NElts indicates the number of elements in the vector allowing it to
|
||||
/// handle different datatypes and vector widths.
|
||||
static void DecodeUNPCKLPMask(unsigned NElts,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
void DecodeUNPCKLPMask(unsigned NElts,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask) {
|
||||
for (unsigned i = 0; i != NElts/2; ++i) {
|
||||
ShuffleMask.push_back(i); // Reads from dest
|
||||
ShuffleMask.push_back(i+NElts); // Reads from src
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
} // llvm namespace
|
|
@ -0,0 +1,69 @@
|
|||
//===-- 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"
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Vector Mask Decoding
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
namespace llvm {
|
||||
enum {
|
||||
SM_SentinelZero = ~0U
|
||||
};
|
||||
|
||||
void DecodeINSERTPSMask(unsigned Imm, SmallVectorImpl<unsigned> &ShuffleMask);
|
||||
|
||||
// <3,1> or <6,7,2,3>
|
||||
void DecodeMOVHLPSMask(unsigned NElts,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask);
|
||||
|
||||
// <0,2> or <0,1,4,5>
|
||||
void DecodeMOVLHPSMask(unsigned NElts,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask);
|
||||
|
||||
void DecodePSHUFMask(unsigned NElts, unsigned Imm,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask);
|
||||
|
||||
void DecodePSHUFHWMask(unsigned Imm,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask);
|
||||
|
||||
void DecodePSHUFLWMask(unsigned Imm,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask);
|
||||
|
||||
void DecodePUNPCKLMask(unsigned NElts,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask);
|
||||
|
||||
void DecodePUNPCKHMask(unsigned NElts,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask);
|
||||
|
||||
void DecodeSHUFPSMask(unsigned NElts, unsigned Imm,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask);
|
||||
|
||||
void DecodeUNPCKHPMask(unsigned NElts,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask);
|
||||
|
||||
|
||||
/// DecodeUNPCKLPMask - This decodes the shuffle masks for unpcklps/unpcklpd
|
||||
/// etc. NElts indicates the number of elements in the vector allowing it to
|
||||
/// handle different datatypes and vector widths.
|
||||
void DecodeUNPCKLPMask(unsigned NElts,
|
||||
SmallVectorImpl<unsigned> &ShuffleMask);
|
||||
|
||||
} // llvm namespace
|
||||
|
||||
#endif
|
|
@ -16,9 +16,9 @@
|
|||
#include "X86.h"
|
||||
#include "X86InstrBuilder.h"
|
||||
#include "X86ISelLowering.h"
|
||||
#include "X86ShuffleDecode.h"
|
||||
#include "X86TargetMachine.h"
|
||||
#include "X86TargetObjectFile.h"
|
||||
#include "Utils/X86ShuffleDecode.h"
|
||||
#include "llvm/CallingConv.h"
|
||||
#include "llvm/Constants.h"
|
||||
#include "llvm/DerivedTypes.h"
|
||||
|
|
Loading…
Reference in New Issue