summaryrefslogtreecommitdiff
path: root/llvm/utils/PerfectShuffle/PerfectShuffle.cpp
AgeCommit message (Collapse)Author
2022-05-17[AArch64] Teach perfect shuffles tables about D-lane movsDavid Green
Similar to D123386, this adds D-Movs to the AArch64 perfect shuffle tables, slightly lowering the costs a little more. This is a rough improvement in general, especially if you ignore mov v0.16b, v2.16b type moves that are often artefacts of the calling convention. The D register movs are encoded as (0x4 | LaneIdx), and to generate a D register move we are required to bitcast into a higher type, but it is otherwise very similar to the S-lane mov's already supported. Differential Revision: https://reviews.llvm.org/D125477
2022-04-19[PerfectShuffle] Remove unused variables from D123386. NFCDavid Green
2022-04-19[AArch64] Add lane moves to PerfectShuffle tablesDavid Green
This teaches the perfect shuffle tables about lane inserts, that can help reduce the cost of many entries. Many of the shuffle masks are one-away from being correct, and a simple lane move can be a lot simpler than trying to use ext/zip/etc. Because they are not exactly like the other masks handled in the perfect shuffle tables, they require special casing to generate them, with a special InsOp Operator. The lane to insert into is encoded as the RHSID, and the move from is grabbed from the original mask. This helps reduce the maximum perfect shuffle entry cost to 3, with many more shuffles being generatable in a single instruction. Differential Revision: https://reviews.llvm.org/D123386
2022-04-19[AArch64] Cost all perfect shuffles entries as cost 1David Green
A brief introduction to perfect shuffles - AArch64 NEON has a number of shuffle operations - dups, zips, exts, movs etc that can in some way shuffle around the lanes of a vector. Given a shuffle of size 4 with 2 inputs, some shuffle masks can be easily codegen'd to a single instruction. A <0,0,1,1> mask for example is a zip LHS, LHS. This is great, but some masks are not so simple, like a <0,0,1,2>. It turns out we can generate that from zip LHS, <0,2,0,2>, having generated <0,2,0,2> from uzp LHS, LHS, producing the result in 2 instructions. It is not obvious from a given mask how to get there though. So we have a simple program (PerfectShuffle.cpp in the util folder) that can scan through all combinations of 4-element vectors and generate the perfect combination of results needed for each shuffle mask (for some definition of perfect). This is run offline to generate a table that is queried for generating shuffle instructions. (Because the table could get quite big, it is limited to 4 element vectors). In the perfect shuffle tables zip, unz and trn shuffles were being cost as 2, which is higher than needed and skews the perfect shuffle tables to create inefficient combinations. This sets them to 1 and regenerates the tables. The codegen will usually be better and the costs should be more precise (but it can get less second-order re-use of values from multiple shuffles, these cases should be fixed up in subsequent patches. Differential Revision: https://reviews.llvm.org/D123379
2022-01-07[llvm] Use true/false instead of 1/0 (NFC)Kazu Hirata
Identified with modernize-use-bool-literals.
2020-03-25revert parts of d7888149aa813f that several bots do not likeNico Weber
2020-03-25Suppress a few -Wunreachable-code warnings.Nico Weber
No behavior change. Also fix a comment to say match reality.
2019-01-19Update the file headers across all of the LLVM projects in the monorepoChandler Carruth
to reflect the new license. We understand that people may be surprised that we're moving the header entirely to discuss the new license. We checked this carefully with the Foundation's lawyer and we believe this is the correct approach. Essentially, all code in the project is now made available by the LLVM project under our new license, so you will see that the license headers include that license only. Some of our contributors have contributed code under our old license, and accordingly, we have retained a copy of our old license notice in the top-level files in each project and repository. llvm-svn: 351636
2015-12-14Reordering fields to reduce padding in LLVM. NFCBen Craig
llvm-svn: 255554
2014-06-08[C++11] Use 'nullptr'.Craig Topper
llvm-svn: 210442
2012-12-04Sort the #include lines for utils/...Chandler Carruth
I've tried to find main moudle headers where possible, but the TableGen stuff may warrant someone else looking at it. llvm-svn: 169251
2011-05-18In r131488 I misunderstood how VREV works. It splits the vector in half and ↵Tanya Lattner
splits each half. Therefore, the real problem was that we were using a VREV64 for a 4xi16, when we should have been using a VREV32. Updated test case and reverted change to the PerfectShuffle Table. llvm-svn: 131529
2011-05-17vrev is incorrectly defined in the perfect shuffle table. The ordering is ↵Tanya Lattner
backwards (should be 0x3210 versus 0x1032) which exposed a bug when doing a shuffle on a 4xi16. I've attached a test case. llvm-svn: 131488
2010-10-14Teach PerfectShuffle to not generate files with embedded tab characters.Jim Grosbach
llvm-svn: 116458
2009-09-25Provide proper masks for neon perfect shuffle table.Anton Korobeynikov
I definitely need to read documentation better :( llvm-svn: 82813
2009-08-21Add lowering of ARM 4-element shuffles to multiple instructios via ↵Anton Korobeynikov
perfectshuffle-generated table. llvm-svn: 79624
2009-08-21Add simple cost model to perfect shuffle. Currently we're doing just greedy ↵Anton Korobeynikov
search for cost instead of (proper) dynamic programming approach. llvm-svn: 79623
2009-08-21Whitespace cleanupAnton Korobeynikov
llvm-svn: 79618
2008-02-20Unbreak build with gcc 4.3: provide missed includes and silence most ↵Anton Korobeynikov
annoying warnings. llvm-svn: 47367
2007-12-29remove attributions from utils.Chris Lattner
llvm-svn: 45419
2006-11-03silence warningChris Lattner
llvm-svn: 31402
2006-11-02For PR786:Reid Spencer
Turn on -Wunused and -Wno-unused-parameter. Clean up most of the resulting fall out by removing unused variables. Remaining warnings have to do with unused functions (I didn't want to delete code without review) and unused variables in generated code. Maintainers should clean up the remaining issues when they see them. All changes pass DejaGnu tests and Olden. llvm-svn: 31380
2006-05-24Patches to make the LLVM sources more -pedantic clean. Patch providedChris Lattner
by Anton Korobeynikov! This is a step towards closing PR786. llvm-svn: 28447
2006-04-18Fix a build failure on Vladimir's tester.Chris Lattner
llvm-svn: 27785
2006-04-17Encode a cost of zero as a cost of 1.Chris Lattner
llvm-svn: 27745
2006-04-17Really, I can count!Chris Lattner
llvm-svn: 27743
2006-04-17assign stable opcodes to the various altivec ops.Chris Lattner
llvm-svn: 27741
2006-04-17Rename BuildShuffleTable -> PerfectShuffleChris Lattner
llvm-svn: 27738
2006-04-17rename the tableChris Lattner
llvm-svn: 27737
2006-04-17Initial checking of a perfect shuffle generation program for 4-elementChris Lattner
Altivec vectors. llvm-svn: 27736