Skip to content

Commit 59c3fe6

Browse files
tonykuttaiTony Varghese
andauthored
[PowerPC] Exploit xxeval instruction for ternary patterns - ternary(A, X, and(B,C)) (#141733)
## Description <!--- Title/Description will be Subject/Body of commit message. --> <!--- Please be concise and limit the subject line to 50 characters, --> <!--- and wrap the Description at 72 characters. --> <!--- Describe why this is required, what problem it solves. --> Adds support for ternary equivalent operations of the form `ternary(A, X, and(B,C))` where `X=[xor(B,C)| nor(B,C)| eqv(B,C)| not(B)| not(C)]`. List of `xxeval` equivalent ternary operations added and the corresponding `imm` value required: Ternary Operator| Imm Value --|-- ternary(A, xor(B,C), and(B,C)) | 22 ternary(A, nor(B,C), and(B,C)) | 24 ternary(A, eqv(B,C), and(B,C)) | 25 ternary(A, not(C), and(B,C)) | 26 ternary(A, not(B), and(B,C)) | 28 eg. `xxeval XT,XA,XB,XC,22` - performs `XA ? xor(XB, XC) : and(XB,XC)`and places the result in `XT`. Co-authored-by: Tony Varghese <[email protected]>
1 parent bc605f4 commit 59c3fe6

File tree

2 files changed

+135
-63
lines changed

2 files changed

+135
-63
lines changed

llvm/lib/Target/PowerPC/PPCInstrP10.td

Lines changed: 114 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2159,8 +2159,115 @@ let AddedComplexity = 400, Predicates = [IsISA3_1, HasVSX] in {
21592159
(COPY_TO_REGCLASS $VRB, VSRC), 2)))>;
21602160
}
21612161

2162-
class XXEvalPattern <dag pattern, bits<8> imm> :
2163-
Pat<(v4i32 pattern), (XXEVAL $vA, $vB, $vC, imm)> {}
2162+
// =============================================================================
2163+
// XXEVAL Instruction Pattern Definitions
2164+
// =============================================================================
2165+
//
2166+
// XXEVAL instruction performs 256 different logical operations on three vector
2167+
// operands using an 8-bit immediate value to select the operation.
2168+
// Format: xxeval XT, XA, XB, XC, IMM
2169+
// For example:
2170+
// Equivalent function A?xor(B,C):and(B,C) is performed by
2171+
// xxeval XT, XA, XB, XC, 22
2172+
//
2173+
// REGISTER CLASS CONSTRAINTS:
2174+
// - XXEVAL natively supports: VSRC register class [v4i32, v4f32, v2f64, v2i64]
2175+
// - Other vector types [v16i8, v8i16] require COPY_TO_REGCLASS to/from VRRC
2176+
// =============================================================================
2177+
2178+
class XXEvalPattern<dag pattern, bits<8> imm>
2179+
: Pat<(v4i32 pattern), (XXEVAL $vA, $vB, $vC, imm)> {}
2180+
2181+
class XXEvalPatterns<ValueType Vt, dag InputPattern, bits<8> Imm>
2182+
: Pat<(Vt InputPattern),
2183+
!if(!or(!eq(Vt, v4i32), !eq(Vt, v2i64)),
2184+
// VSRC path: direct XXEVAL for v4i32 and v2i64
2185+
(XXEVAL $vA, $vB, $vC, Imm),
2186+
// VRRC path: wrap with COPY_TO_REGCLASS for other types
2187+
(COPY_TO_REGCLASS(XXEVAL(COPY_TO_REGCLASS Vt:$vA, VSRC),
2188+
(COPY_TO_REGCLASS Vt:$vB, VSRC),
2189+
(COPY_TO_REGCLASS Vt:$vC, VSRC), Imm),
2190+
VRRC))> {}
2191+
2192+
// =============================================================================
2193+
// PatFrags for Bitcast-Aware Vector bitwise Operations
2194+
//
2195+
// Each PatFrags defines TWO alternatives for pattern matcher to choose:
2196+
// - Direct operation (for v4i32)
2197+
// - Bitcast operation (for other types: v2i64, v16i8, v8i16)
2198+
// =============================================================================
2199+
2200+
// Basic Binary Operations
2201+
def VAnd
2202+
: PatFrags<(ops node:$a, node:$b), [(and node:$a, node:$b),
2203+
(bitconvert(and
2204+
(v4i32(bitconvert node:$a)),
2205+
(v4i32(bitconvert node:$b))))]>;
2206+
2207+
def VXor
2208+
: PatFrags<(ops node:$a, node:$b), [(xor node:$a, node:$b),
2209+
(bitconvert(xor
2210+
(v4i32(bitconvert node:$a)),
2211+
(v4i32(bitconvert node:$b))))]>;
2212+
2213+
def VOr : PatFrags<(ops node:$a, node:$b), [(or node:$a, node:$b),
2214+
(bitconvert(or
2215+
(v4i32(bitconvert node:$a)),
2216+
(v4i32(bitconvert node:$b))))]>;
2217+
2218+
def VNot
2219+
: PatFrags<(ops node:$a), [(vnot node:$a),
2220+
(bitconvert(vnot(v4i32(bitconvert node:$a))))]>;
2221+
2222+
// Derived bitwise operations
2223+
// Vector NOR operation (not(or))
2224+
def VNor
2225+
: PatFrags<(ops node:$a, node:$b), [(vnot(or node:$a, node:$b)),
2226+
(bitconvert(vnot(or
2227+
(v4i32(bitconvert node:$a)),
2228+
(v4i32(bitconvert node:$b)))))]>;
2229+
2230+
// Vector EQV operation (not(xor))
2231+
def VEqv
2232+
: PatFrags<(ops node:$a, node:$b), [(vnot(xor node:$a, node:$b)),
2233+
(bitconvert(vnot(xor
2234+
(v4i32(bitconvert node:$a)),
2235+
(v4i32(bitconvert node:$b)))))]>;
2236+
2237+
// =============================================================================
2238+
// XXEVAL Ternary Pattern Multiclass: XXEvalTernarySelectAnd
2239+
// This class matches the equivalent Ternary Operation: A ? f(B,C) : AND(B,C)
2240+
// and emit the corresponding xxeval instruction with the imm value.
2241+
//
2242+
// The patterns implement xxeval vector select operations where:
2243+
// - A is the selector vector
2244+
// - f(B,C) is the "true" case op on vectors B and C (XOR, NOR, EQV, or NOT)
2245+
// - AND(B,C) is the "false" case op on vectors B and C
2246+
// =============================================================================
2247+
multiclass XXEvalTernarySelectAnd<ValueType Vt> {
2248+
// Pattern: A ? XOR(B,C) : AND(B,C) XXEVAL immediate value: 22
2249+
def : XXEvalPatterns<
2250+
Vt, (vselect Vt:$vA, (VXor Vt:$vB, Vt:$vC), (VAnd Vt:$vB, Vt:$vC)),
2251+
22>;
2252+
2253+
// Pattern: A ? NOR(B,C) : AND(B,C) XXEVAL immediate value: 24
2254+
def : XXEvalPatterns<
2255+
Vt, (vselect Vt:$vA, (VNor Vt:$vB, Vt:$vC), (VAnd Vt:$vB, Vt:$vC)),
2256+
24>;
2257+
2258+
// Pattern: A ? EQV(B,C) : AND(B,C) XXEVAL immediate value: 25
2259+
def : XXEvalPatterns<
2260+
Vt, (vselect Vt:$vA, (VEqv Vt:$vB, Vt:$vC), (VAnd Vt:$vB, Vt:$vC)),
2261+
25>;
2262+
2263+
// Pattern: A ? NOT(C) : AND(B,C) XXEVAL immediate value: 26
2264+
def : XXEvalPatterns<
2265+
Vt, (vselect Vt:$vA, (VNot Vt:$vC), (VAnd Vt:$vB, Vt:$vC)), 26>;
2266+
2267+
// Pattern: A ? NOT(B) : AND(B,C) XXEVAL immediate value: 28
2268+
def : XXEvalPatterns<
2269+
Vt, (vselect Vt:$vA, (VNot Vt:$vB), (VAnd Vt:$vB, Vt:$vC)), 28>;
2270+
}
21642271

21652272
let Predicates = [PrefixInstrs, HasP10Vector] in {
21662273
let AddedComplexity = 400 in {
@@ -2270,6 +2377,11 @@ let Predicates = [PrefixInstrs, HasP10Vector] in {
22702377
// (xor A, (or B, C))
22712378
def : XXEvalPattern<(xor v4i32:$vA, (or v4i32:$vB, v4i32:$vC)), 120>;
22722379

2380+
// XXEval Patterns for ternary Operations.
2381+
foreach Ty = [v4i32, v2i64, v8i16, v16i8] in {
2382+
defm : XXEvalTernarySelectAnd<Ty>;
2383+
}
2384+
22732385
// Anonymous patterns to select prefixed VSX loads and stores.
22742386
// Load / Store f128
22752387
def : Pat<(f128 (load PDForm:$src)),

0 commit comments

Comments
 (0)