Skip to content

Commit f13007f

Browse files
committed
[RISCV] Select and/or/xor with some constants to Zbb ANDN/ORN/XNOR
(and X, (C<<12|0xfff)) -> (ANDN X, ~C<<12) (or X, (C<<12|0xfff)) -> (ORN X, ~C<<12) (xor X, (C<<12|0xfff)) -> (XNOR X, ~C<<12) Saves an `ADDI HI, -1` instruction.
1 parent 8387cbd commit f13007f

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoZb.td

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,25 @@ def : Pat<(XLenVT (or GPR:$rs1, (not GPR:$rs2))), (ORN GPR:$rs1, GPR:$rs2)>;
481481
def : Pat<(XLenVT (xor GPR:$rs1, (not GPR:$rs2))), (XNOR GPR:$rs1, GPR:$rs2)>;
482482
} // Predicates = [HasStdExtZbbOrZbkb]
483483

484+
// A 32-bit signed immediate with all 12 low bits set, but not -1
485+
def simm32fff : ImmLeaf<XLenVT, [{
486+
return isInt<32>(Imm) && (Imm & 0xfff) == 0xfff && Imm != -1;}]>;
487+
488+
def NotImm : SDNodeXForm<imm, [{
489+
return CurDAG->getTargetConstant(~N->getSExtValue(), SDLoc(N),
490+
N->getValueType(0));
491+
}]>;
492+
493+
class PatGprSimm32fff<SDPatternOperator OpNode, RVInst Inst>
494+
: Pat<(XLenVT (OpNode (vt GPR:$rs1), simm32fff:$imm)),
495+
(Inst GPR:$rs1, (NotImm simm32fff:$imm))>;
496+
497+
let Predicates = [HasStdExtZbbOrZbkb] in {
498+
// TODO: and, except for (srli (slli X, C), C)
499+
def : PatGprSimm32fff<or, ORN>;
500+
//def : PatGprSimm32fff<xor, XNOR>;
501+
} // Predicates = [HasStdExtZbbOrZbkb]
502+
484503
let Predicates = [HasStdExtZbbOrZbkb] in {
485504
def : PatGprGpr<shiftop<rotl>, ROL>;
486505
def : PatGprGpr<shiftop<rotr>, ROR>;

0 commit comments

Comments
 (0)