Skip to content

Commit 2ae755a

Browse files
author
Tony Varghese
committed
[PowerPC] Exploit xxeval instruction for operations of the form ternary(A, X, NOR(B,C)), ternary(A, X, EQV(B,C)), ternary(A, X, NAND(B,C)), ternary(A, X, NOT(B)) and ternary(A, X, NOT(C))
1 parent 6438d01 commit 2ae755a

File tree

6 files changed

+293
-291
lines changed

6 files changed

+293
-291
lines changed

llvm/lib/Target/PowerPC/PPCInstrP10.td

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2411,6 +2411,190 @@ multiclass XXEvalTernarySelectOr<ValueType Vt> {
24112411
126>;
24122412
}
24132413

2414+
// =============================================================================
2415+
// XXEVAL Ternary Pattern Multiclass: XXEvalTernarySelectNor
2416+
// This class matches the equivalent Ternary Operation: A ? f(B,C) : NOR(B,C)
2417+
// and emit the corresponding xxeval instruction with the imm value.
2418+
//
2419+
// The patterns implement xxeval vector select operations where:
2420+
// - A is the selector vector
2421+
// - f(B,C) is the "true" case op in set {B, C, AND(B,C), XOR(B,C), NOT(C),
2422+
// NOT(B), NAND(B,C)}
2423+
// - C is the "false" case op NOR(B,C)
2424+
// =============================================================================
2425+
multiclass XXEvalTernarySelectNor<ValueType Vt>{
2426+
// Pattern: (A ? AND(B,C) : NOR(B,C)) XXEVAL immediate value: 129
2427+
def : XXEvalPattern<
2428+
Vt, (vselect Vt:$vA, (VAnd Vt:$vB, Vt:$vC), (VNor Vt:$vB, Vt:$vC)),
2429+
129>;
2430+
2431+
// Pattern: (A ? B : NOR(B,C)) XXEVAL immediate value: 131
2432+
def : XXEvalPattern<Vt, (vselect Vt:$vA, Vt:$vB, (VNor Vt:$vB, Vt:$vC)),131>;
2433+
2434+
// Pattern: (A ? C : NOR(B,C)) XXEVAL immediate value: 133
2435+
def : XXEvalPattern<
2436+
Vt, (vselect Vt:$vA, Vt:$vC, (VNor Vt:$vB, Vt:$vC)),
2437+
133>;
2438+
2439+
// Pattern: (A ? XOR(B,C) : NOR(B,C)) XXEVAL immediate value: 134
2440+
def : XXEvalPattern<
2441+
Vt, (vselect Vt:$vA, (VXor Vt:$vB, Vt:$vC), (VNor Vt:$vB, Vt:$vC)),
2442+
134>;
2443+
2444+
// Pattern: (A ? NOT(C) : NOR(B,C)) XXEVAL immediate value: 138
2445+
def : XXEvalPattern<
2446+
Vt, (vselect Vt:$vA, (VNot Vt:$vC), (VNor Vt:$vB, Vt:$vC)),
2447+
138>;
2448+
2449+
// Pattern: (A ? NOT(B) : NOR(B,C)) XXEVAL immediate value: 140
2450+
def : XXEvalPattern<
2451+
Vt, (vselect Vt:$vA, (VNot Vt:$vB), (VNor Vt:$vB, Vt:$vC)),
2452+
140>;
2453+
2454+
// Pattern: (A ? NAND(B,C) : NOR(B,C)) XXEVAL immediate value: 142
2455+
def : XXEvalPattern<
2456+
Vt, (vselect Vt:$vA, (VNand Vt:$vB, Vt:$vC), (VNor Vt:$vB, Vt:$vC)),
2457+
142>;
2458+
}
2459+
2460+
// =============================================================================
2461+
// XXEVAL Ternary Pattern Multiclass: XXEvalTernarySelectEqv
2462+
// This class matches the equivalent Ternary Operation: A ? f(B,C) : EQV(B,C)
2463+
// and emit the corresponding xxeval instruction with the imm value.
2464+
//
2465+
// The patterns implement xxeval vector select operations where:
2466+
// - A is the selector vector
2467+
// - f(B,C) is the "true" case op in set {OR(B,C), NOR(B,C), NAND(B,C), NOT(B),
2468+
// NOT(C)}
2469+
// - C is the "false" case op EQV(B,C)
2470+
// =============================================================================
2471+
multiclass XXEvalTernarySelectEqv<ValueType Vt>{
2472+
// Pattern: (A ? OR(B,C) : EQV(B,C)) XXEVAL immediate value: 151
2473+
def : XXEvalPattern<
2474+
Vt, (vselect Vt:$vA, (VOr Vt:$vB, Vt:$vC), (VEqv Vt:$vB, Vt:$vC)),
2475+
151>;
2476+
2477+
// Pattern: (A ? NOR(B,C) : EQV(B,C)) XXEVAL immediate value: 152
2478+
def : XXEvalPattern<
2479+
Vt, (vselect Vt:$vA, (VNor Vt:$vB, Vt:$vC), (VEqv Vt:$vB, Vt:$vC)),
2480+
152>;
2481+
2482+
// Pattern: (A ? NOT(C) : EQV(B,C)) XXEVAL immediate value: 154
2483+
def : XXEvalPattern<
2484+
Vt, (vselect Vt:$vA, (VNot Vt:$vC), (VEqv Vt:$vB, Vt:$vC)),
2485+
154>;
2486+
2487+
// Pattern: (A ? NAND(B,C) : EQV(B,C)) XXEVAL immediate value: 158
2488+
def : XXEvalPattern<
2489+
Vt, (vselect Vt:$vA, (VNand Vt:$vB, Vt:$vC), (VEqv Vt:$vB, Vt:$vC)),
2490+
158>;
2491+
}
2492+
2493+
// =============================================================================
2494+
// XXEVAL Ternary Pattern Multiclass: XXEvalTernarySelectNotC
2495+
// This class matches the equivalent Ternary Operation: A ? f(B,C) : NOT(C)
2496+
// and emit the corresponding xxeval instruction with the imm value.
2497+
//
2498+
// The patterns implement xxeval vector select operations where:
2499+
// - A is the selector vector
2500+
// - f(B,C) is the "true" case op in set {AND(B,C), OR(B,C), XOR(B,C), NAND(B,C),
2501+
// B, NOT(B)}
2502+
// - C is the "false" case op NOT(C)
2503+
// =============================================================================
2504+
multiclass XXEvalTernarySelectNotC<ValueType Vt>{
2505+
// Pattern: (A ? AND(B,C) : NOT(C)) XXEVAL immediate value: 161
2506+
def : XXEvalPattern<
2507+
Vt, (vselect Vt:$vA, (VAnd Vt:$vB, Vt:$vC), (VNot Vt:$vC)), 161>;
2508+
2509+
// Pattern: (A ? B : NOT(C)) XXEVAL immediate value: 163
2510+
def : XXEvalPattern<Vt, (vselect Vt:$vA, Vt:$vB, (VNot Vt:$vC)), 163>;
2511+
2512+
// Pattern: (A ? XOR(B,C) : NOT(C)) XXEVAL immediate value: 166
2513+
def : XXEvalPattern<
2514+
Vt, (vselect Vt:$vA, (VXor Vt:$vB, Vt:$vC), (VNot Vt:$vC)), 166>;
2515+
2516+
// Pattern: (A ? OR(B,C) : NOT(C)) XXEVAL immediate value: 167
2517+
def : XXEvalPattern<
2518+
Vt, (vselect Vt:$vA, (VOr Vt:$vB, Vt:$vC), (VNot Vt:$vC)), 167>;
2519+
2520+
// Pattern: (A ? NOT(B) : NOT(C)) XXEVAL immediate value: 172
2521+
def : XXEvalPattern<Vt, (vselect Vt:$vA, (VNot Vt:$vB), (VNot Vt:$vC)), 172>;
2522+
2523+
// Pattern: (A ? NAND(B,C) : NOT(C)) XXEVAL immediate value: 174
2524+
def : XXEvalPattern<
2525+
Vt, (vselect Vt:$vA, (VNand Vt:$vB, Vt:$vC), (VNot Vt:$vC)), 174>;
2526+
}
2527+
2528+
// =============================================================================
2529+
// XXEVAL Ternary Pattern Multiclass: XXEvalTernarySelectNotB
2530+
// This class matches the equivalent Ternary Operation: A ? f(B,C) : NOT(B)
2531+
// and emit the corresponding xxeval instruction with the imm value.
2532+
//
2533+
// The patterns implement xxeval vector select operations where:
2534+
// - A is the selector vector
2535+
// - f(B,C) is the "true" case op in set {AND(B,C), OR(B,C), XOR(B,C), NAND(B,C),
2536+
// C, NOT(B)}
2537+
// - C is the "false" case op NOT(B)
2538+
// =============================================================================
2539+
multiclass XXEvalTernarySelectNotB<ValueType Vt>{
2540+
// Pattern: (A ? AND(B,C) : NOT(B)) XXEVAL immediate value: 193
2541+
def : XXEvalPattern<
2542+
Vt, (vselect Vt:$vA, (VAnd Vt:$vB, Vt:$vC), (VNot Vt:$vB)), 193>;
2543+
2544+
// Pattern: (A ? C : NOT(B)) XXEVAL immediate value: 197
2545+
def : XXEvalPattern<Vt, (vselect Vt:$vA, Vt:$vC, (VNot Vt:$vB)), 197>;
2546+
2547+
// Pattern: (A ? XOR(B,C) : NOT(B)) XXEVAL immediate value: 198
2548+
def : XXEvalPattern<
2549+
Vt, (vselect Vt:$vA, (VXor Vt:$vB, Vt:$vC), (VNot Vt:$vB)), 198>;
2550+
2551+
// Pattern: (A ? OR(B,C) : NOT(B)) XXEVAL immediate value: 199
2552+
def : XXEvalPattern<
2553+
Vt, (vselect Vt:$vA, (VOr Vt:$vB, Vt:$vC), (VNot Vt:$vB)), 199>;
2554+
2555+
// Pattern: (A ? NOT(C) : NOT(B)) XXEVAL immediate value: 202
2556+
def : XXEvalPattern<Vt, (vselect Vt:$vA, (VNot Vt:$vC), (VNot Vt:$vB)), 202>;
2557+
2558+
// Pattern: (A ? NAND(B,C) : NOT(B)) XXEVAL immediate value: 206
2559+
def : XXEvalPattern<
2560+
Vt, (vselect Vt:$vA, (VNand Vt:$vB, Vt:$vC), (VNot Vt:$vB)), 206>;
2561+
}
2562+
2563+
// =============================================================================
2564+
// XXEVAL Ternary Pattern Multiclass: XXEvalTernarySelectNand
2565+
// This class matches the equivalent Ternary Operation: A ? f(B,C) : NAND(B,C)
2566+
// and emit the corresponding xxeval instruction with the imm value.
2567+
//
2568+
// The patterns implement xxeval vector select operations where:
2569+
// - A is the selector vector
2570+
// - f(B,C) is the "true" case op in set {B, C, XOR(B,C), OR(B,C), EQV(B,C)}
2571+
// - C is the "false" case op NAND(B,C)
2572+
// =============================================================================
2573+
multiclass XXEvalTernarySelectNand<ValueType Vt>{
2574+
// Pattern: (A ? B : NAND(B,C)) XXEVAL immediate value: 227
2575+
def : XXEvalPattern<
2576+
Vt, (vselect Vt:$vA, Vt:$vB, (VNand Vt:$vB, Vt:$vC)), 227>;
2577+
2578+
// Pattern: (A ? C : NAND(B,C)) XXEVAL immediate value: 229
2579+
def : XXEvalPattern<
2580+
Vt, (vselect Vt:$vA, Vt:$vC, (VNand Vt:$vB, Vt:$vC)), 229>;
2581+
2582+
// Pattern: (A ? XOR(B,C) : NAND(B,C)) XXEVAL immediate value: 230
2583+
def : XXEvalPattern<
2584+
Vt, (vselect Vt:$vA, (VXor Vt:$vB, Vt:$vC), (VNand Vt:$vB, Vt:$vC)),
2585+
230>;
2586+
2587+
// Pattern: (A ? OR(B,C) : NAND(B,C)) XXEVAL immediate value: 231
2588+
def : XXEvalPattern<
2589+
Vt, (vselect Vt:$vA, (VOr Vt:$vB, Vt:$vC), (VNand Vt:$vB, Vt:$vC)),
2590+
231>;
2591+
2592+
// Pattern: (A ? EQV(B,C) : NAND(B,C)) XXEVAL immediate value: 233
2593+
def : XXEvalPattern<
2594+
Vt, (vselect Vt:$vA, (VEqv Vt:$vB, Vt:$vC), (VNand Vt:$vB, Vt:$vC)),
2595+
233>;
2596+
}
2597+
24142598
let Predicates = [PrefixInstrs, HasP10Vector] in {
24152599
let AddedComplexity = 400 in {
24162600
def : Pat<(v4i32 (build_vector i32immNonAllOneNonZero:$A,
@@ -2526,6 +2710,11 @@ let Predicates = [PrefixInstrs, HasP10Vector] in {
25262710
defm : XXEvalTernarySelectC<Ty>;
25272711
defm : XXEvalTernarySelectXor<Ty>;
25282712
defm : XXEvalTernarySelectOr<Ty>;
2713+
defm : XXEvalTernarySelectNor<Ty>;
2714+
defm : XXEvalTernarySelectEqv<Ty>;
2715+
defm : XXEvalTernarySelectNotC<Ty>;
2716+
defm : XXEvalTernarySelectNotB<Ty>;
2717+
defm : XXEvalTernarySelectNand<Ty>;
25292718
}
25302719

25312720
// Anonymous patterns to select prefixed VSX loads and stores.

0 commit comments

Comments
 (0)