From 2cfdbb27165ee24b28a84f1a7cd3196b7afd2a5e Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 17 Dec 2005 21:05:49 +0000 Subject: [PATCH] add andn/orn/xorn patterns. This allows us to compile this: long %test(ubyte, short, long %X, long %Y) { %A = xor long %X, -1 %B = and long %Y, %A ret long %B } to this: test: save -96, %sp, %sp andn %i4, %i2, %i0 andn %i5, %i3, %i1 restore %g0, %g0, %g0 retl nop instead of this: test: save -96, %sp, %sp xor %i2, -1, %l0 xor %i3, -1, %l1 and %i4, %l0, %i0 and %i5, %l1, %i1 restore %g0, %g0, %g0 retl nop The simpleisel emits: :( test: save -96, %sp, %sp or %g0, -1, %l0 or %g0, -1, %l0 or %g0, -1, %l0 or %g0, -1, %l1 xor %i2, %l0, %l0 xor %i3, %l1, %l1 and %i4, %l0, %i0 and %i5, %l1, %i1 restore %g0, %g0, %g0 retl nop git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24793 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Sparc/SparcInstrInfo.td | 9 ++++++--- lib/Target/SparcV8/SparcV8InstrInfo.td | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/Target/Sparc/SparcInstrInfo.td b/lib/Target/Sparc/SparcInstrInfo.td index efe40531c69..b1ecdde733c 100644 --- a/lib/Target/Sparc/SparcInstrInfo.td +++ b/lib/Target/Sparc/SparcInstrInfo.td @@ -250,7 +250,8 @@ def ANDCCri : F3_2<2, 0b010001, "andcc $b, $c, $dst", []>; def ANDNrr : F3_1<2, 0b000101, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), - "andn $b, $c, $dst", []>; + "andn $b, $c, $dst", + [(set IntRegs:$dst, (and IntRegs:$b, (not IntRegs:$c)))]>; def ANDNri : F3_2<2, 0b000101, (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "andn $b, $c, $dst", []>; @@ -276,7 +277,8 @@ def ORCCri : F3_2<2, 0b010010, "orcc $b, $c, $dst", []>; def ORNrr : F3_1<2, 0b000110, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), - "orn $b, $c, $dst", []>; + "orn $b, $c, $dst", + [(set IntRegs:$dst, (or IntRegs:$b, (not IntRegs:$c)))]>; def ORNri : F3_2<2, 0b000110, (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "orn $b, $c, $dst", []>; @@ -302,7 +304,8 @@ def XORCCri : F3_2<2, 0b010011, "xorcc $b, $c, $dst", []>; def XNORrr : F3_1<2, 0b000111, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), - "xnor $b, $c, $dst", []>; + "xnor $b, $c, $dst", + [(set IntRegs:$dst, (xor IntRegs:$b, (not IntRegs:$c)))]>; def XNORri : F3_2<2, 0b000111, (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "xnor $b, $c, $dst", []>; diff --git a/lib/Target/SparcV8/SparcV8InstrInfo.td b/lib/Target/SparcV8/SparcV8InstrInfo.td index efe40531c69..b1ecdde733c 100644 --- a/lib/Target/SparcV8/SparcV8InstrInfo.td +++ b/lib/Target/SparcV8/SparcV8InstrInfo.td @@ -250,7 +250,8 @@ def ANDCCri : F3_2<2, 0b010001, "andcc $b, $c, $dst", []>; def ANDNrr : F3_1<2, 0b000101, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), - "andn $b, $c, $dst", []>; + "andn $b, $c, $dst", + [(set IntRegs:$dst, (and IntRegs:$b, (not IntRegs:$c)))]>; def ANDNri : F3_2<2, 0b000101, (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "andn $b, $c, $dst", []>; @@ -276,7 +277,8 @@ def ORCCri : F3_2<2, 0b010010, "orcc $b, $c, $dst", []>; def ORNrr : F3_1<2, 0b000110, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), - "orn $b, $c, $dst", []>; + "orn $b, $c, $dst", + [(set IntRegs:$dst, (or IntRegs:$b, (not IntRegs:$c)))]>; def ORNri : F3_2<2, 0b000110, (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "orn $b, $c, $dst", []>; @@ -302,7 +304,8 @@ def XORCCri : F3_2<2, 0b010011, "xorcc $b, $c, $dst", []>; def XNORrr : F3_1<2, 0b000111, (ops IntRegs:$dst, IntRegs:$b, IntRegs:$c), - "xnor $b, $c, $dst", []>; + "xnor $b, $c, $dst", + [(set IntRegs:$dst, (xor IntRegs:$b, (not IntRegs:$c)))]>; def XNORri : F3_2<2, 0b000111, (ops IntRegs:$dst, IntRegs:$b, i32imm:$c), "xnor $b, $c, $dst", []>;