llvm-6502/include/llvm
Chandler Carruth ce184e95f9 [x86] Add a ZERO_EXTEND_VECTOR_INREG DAG node and use it when widening
vector types to be legal and a ZERO_EXTEND node is encountered.

When we use widening to legalize vector types, extend nodes are a real
challenge. Either the input or output is likely to be legal, but in many
cases not both. As a consequence, we don't really have any way to
represent this situation and the prior code in the widening legalization
framework would just scalarize the extend operation completely.

This patch introduces a new DAG node to represent doing a zero extend of
a vector "in register". The core of the idea is to allow legal but
different vector types in the input and output. The output vector must
have fewer lanes but wider elements. The operation is defined to zero
extend the low elements of the input to the size of the output elements,
and drop all of the high elements which don't have a corresponding lane
in the output vector.

It also includes generic expansion of this node in terms of blending
a zero vector into the high elements of the vector and bitcasting
across. This in turn yields extremely nice code for x86 SSE2 when we use
the new widening legalization logic in conjunction with the new shuffle
lowering logic.

There is still more to do here. We need to support sign extension, any
extension, and potentially int-to-float conversions. My current plan is
to continue using similar synthetic nodes to model each of these
transitions with generic lowering code for each one.

However, with this patch LLVM already reaches performance parity with
GCC for the core C loops of the x264 code (assuming you disable the
hand-written assembly versions) when compiling for SSE2 and SSE3
architectures and enabling the new widening and lowering logic for
vectors.

Differential Revision: http://reviews.llvm.org/D4405

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@212610 91177308-0d34-0410-b5e6-96231b3b80d8
2014-07-09 10:58:18 +00:00
..
ADT Revert "Refactor ARM subarchitecture parsing" 2014-07-08 10:06:16 +00:00
Analysis Improve BasicAA CS-CS queries 2014-07-08 23:16:49 +00:00
AsmParser
Bitcode Revert "Convert a few std::strings to StringRef." 2014-07-04 20:02:42 +00:00
CodeGen [x86] Add a ZERO_EXTEND_VECTOR_INREG DAG node and use it when widening 2014-07-09 10:58:18 +00:00
Config config.h: remove clang-specific macro definitions 2014-06-06 04:50:41 +00:00
DebugInfo [DWARF parser] Teach DIContext to fetch short (non-linkage) function names for a given address. 2014-05-17 00:07:48 +00:00
ExecutionEngine [RuntimeDyld] Add a framework for testing relocation logic in RuntimeDyld. 2014-06-27 20:20:57 +00:00
IR ARM: mark matching ARM intrinsics as MSBuiltin 2014-07-05 20:09:24 +00:00
IRReader Make a helper function static. No functionality change. 2014-07-05 00:39:08 +00:00
LineEditor [C++11] Replace OwningPtr with std::unique_ptr in places where it doesn't break the API. 2014-04-21 09:34:48 +00:00
Linker IR: Add COMDATs to the IR 2014-06-27 18:19:56 +00:00
LTO Implement LTOModule on top of IRObjectFile. 2014-07-04 18:40:36 +00:00
MC Add ability to emit internal instruction representation to CodeGen assembly output. 2014-07-09 10:07:36 +00:00
Object Fix the MSVC build following r212382 2014-07-06 10:54:41 +00:00
Option ArgList: use MakeArgList overloads in subclasses and clean up some calls. 2014-06-20 04:36:29 +00:00
ProfileData ProfileData: Fix copy-paste type in RawInstrProfReader 2014-06-18 18:20:44 +00:00
Support SourceMgr: consistently use 'unsigned' for the memory buffer ID type 2014-07-09 08:30:15 +00:00
TableGen Revert "Introduce a string_ostream string builder facilty" 2014-06-26 22:52:05 +00:00
Target Fix ppcf128 component access on little-endian systems 2014-07-03 15:06:47 +00:00
Transforms [ASan] Completely remove sanitizer blacklist file from instrumentation pass. 2014-07-08 00:50:49 +00:00
CMakeLists.txt [modules] Add module maps for LLVM. These are not quite ready for prime-time 2014-05-21 02:46:14 +00:00
InitializePasses.h Add a new attribute called 'jumptable' that creates jump-instruction tables for functions marked with this attribute. 2014-06-05 19:29:43 +00:00
LinkAllIR.h
LinkAllPasses.h Add a new attribute called 'jumptable' that creates jump-instruction tables for functions marked with this attribute. 2014-06-05 19:29:43 +00:00
module.modulemap [modules] Add module maps for LLVM. These are not quite ready for prime-time 2014-05-21 02:46:14 +00:00
module.modulemap.build [modules] Add module maps for LLVM. These are not quite ready for prime-time 2014-05-21 02:46:14 +00:00
Pass.h Revert "[PM] Add pass run listeners to the pass manager." 2014-05-15 17:49:20 +00:00
PassAnalysisSupport.h [C++11] More 'nullptr' conversion. In some cases just using a boolean check instead of comparing to nullptr. 2014-04-14 00:51:57 +00:00
PassInfo.h Remove pimpl class from PassRegistry. 2014-06-12 16:06:51 +00:00
PassManager.h
PassRegistry.h Remove pimpl class from PassRegistry. 2014-06-12 16:06:51 +00:00
PassSupport.h Move GlobalMerge from Transform to CodeGen. 2014-06-13 22:57:59 +00:00