@@ -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+
24142598let 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