diff options
author | Zhan Jun Liau <zhanjunl@ca.ibm.com> | 2016-06-28 21:03:19 +0000 |
---|---|---|
committer | Zhan Jun Liau <zhanjunl@ca.ibm.com> | 2016-06-28 21:03:19 +0000 |
commit | 347db3e18ee7375cf038a8173880466fd0fe6312 (patch) | |
tree | 2e8d8a0d835570af697ceba4ffbe3ccba2ee081e /llvm/lib | |
parent | 0fecee9cd8af1de3b103ca7c6dec054bedbca035 (diff) | |
download | bcm5719-llvm-347db3e18ee7375cf038a8173880466fd0fe6312.tar.gz bcm5719-llvm-347db3e18ee7375cf038a8173880466fd0fe6312.zip |
[SystemZ] Use NILL instruction instead of NILF where possible
Summary: SystemZ shift instructions only use the last 6 bits of the shift
amount. When the result of an AND operation is used as a shift amount, this
means that we can use the NILL instruction (which operates on the last 16 bits)
rather than NILF (which operates on the last 32 bits) for a 16-bit savings in
instruction size.
Reviewers: uweigand
Subscribers: llvm-commits
Author: colpell
Committing on behalf of Elliot.
Differential Revision: http://reviews.llvm.org/D21686
llvm-svn: 274066
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/SystemZ/SystemZInstrInfo.td | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/llvm/lib/Target/SystemZ/SystemZInstrInfo.td b/llvm/lib/Target/SystemZ/SystemZInstrInfo.td index 7a7a3e30863..012d170552f 100644 --- a/llvm/lib/Target/SystemZ/SystemZInstrInfo.td +++ b/llvm/lib/Target/SystemZ/SystemZInstrInfo.td @@ -1022,7 +1022,7 @@ let Defs = [CC] in { // ANDs of memory. let CCValues = 0xC, CompareZeroCCMask = 0x8 in { defm N : BinaryRXPair<"n", 0x54, 0xE354, and, GR32, load, 4>; - def NG : BinaryRXY<"ng", 0xE380, and, GR64, load, 8>; + def NG : BinaryRXY<"ng", 0xE380, and, GR64, load, 8>; } // AND to memory @@ -1685,6 +1685,37 @@ def : Pat<(sra (shl (i64 (anyext (i32 (z_select_ccmask 1, 0, imm32zx4:$valid, def : Pat<(and (xor GR64:$x, (i64 -1)), GR64:$y), (XGR GR64:$y, (NGR GR64:$y, GR64:$x))>; +// Shift/rotate instructions only use the last 6 bits of the second operand +// register, so we can safely use NILL (16 fewer bits than NILF) to only AND the +// last 16 bits. +// Complexity is added so that we match this before we match NILF on the AND +// operation alone. +let AddedComplexity = 4 in { + def : Pat<(shl GR32:$val, (and GR32:$shift, uimm32:$imm)), + (SLL GR32:$val, (NILL GR32:$shift, uimm32:$imm), 0)>; + + def : Pat<(sra GR32:$val, (and GR32:$shift, uimm32:$imm)), + (SRA GR32:$val, (NILL GR32:$shift, uimm32:$imm), 0)>; + + def : Pat<(srl GR32:$val, (and GR32:$shift, uimm32:$imm)), + (SRL GR32:$val, (NILL GR32:$shift, uimm32:$imm), 0)>; + + def : Pat<(shl GR64:$val, (and GR32:$shift, uimm32:$imm)), + (SLLG GR64:$val, (NILL GR32:$shift, uimm32:$imm), 0)>; + + def : Pat<(sra GR64:$val, (and GR32:$shift, uimm32:$imm)), + (SRAG GR64:$val, (NILL GR32:$shift, uimm32:$imm), 0)>; + + def : Pat<(srl GR64:$val, (and GR32:$shift, uimm32:$imm)), + (SRLG GR64:$val, (NILL GR32:$shift, uimm32:$imm), 0)>; + + def : Pat<(rotl GR32:$val, (and GR32:$shift, uimm32:$imm)), + (RLL GR32:$val, (NILL GR32:$shift, uimm32:$imm), 0)>; + + def : Pat<(rotl GR64:$val, (and GR32:$shift, uimm32:$imm)), + (RLLG GR64:$val, (NILL GR32:$shift, uimm32:$imm), 0)>; +} + // Peepholes for turning scalar operations into block operations. defm : BlockLoadStore<anyextloadi8, i32, MVCSequence, NCSequence, OCSequence, XCSequence, 1>; |