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