Skip to content

Commit 6d2e516

Browse files
committed
Merging r246400:
------------------------------------------------------------------------ r246400 | hfinkel | 2015-08-30 18:12:50 -0400 (Sun, 30 Aug 2015) | 20 lines [PowerPC] Fixup SELECT_CC (and SETCC) patterns with i1 comparison operands There were really two problems here. The first was that we had the truth tables for signed i1 comparisons backward. I imagine these are not very common, but if you have: setcc i1 x, y, LT this has the '0 1' and the '1 0' results flipped compared to: setcc i1 x, y, ULT because, in the signed case, '1 0' is really '-1 0', and the answer is not the same as in the unsigned case. The second problem was that we did not have patterns (at all) for the unsigned comparisons select_cc nodes for i1 comparison operands. This was the specific cause of PR24552. These had to be added (and a missing Altivec promotion added as well) to make sure these function for all types. I've added a bunch more test cases for these patterns, and there are a few FIXMEs in the test case regarding code-quality. Fixes PR24552. ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_37@252478 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 51a59a4 commit 6d2e516

File tree

5 files changed

+1853
-5
lines changed

5 files changed

+1853
-5
lines changed

lib/Target/PowerPC/PPCISelLowering.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,8 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
431431
AddPromotedToType (ISD::LOAD , VT, MVT::v4i32);
432432
setOperationAction(ISD::SELECT, VT, Promote);
433433
AddPromotedToType (ISD::SELECT, VT, MVT::v4i32);
434+
setOperationAction(ISD::SELECT_CC, VT, Promote);
435+
AddPromotedToType (ISD::SELECT_CC, VT, MVT::v4i32);
434436
setOperationAction(ISD::STORE, VT, Promote);
435437
AddPromotedToType (ISD::STORE, VT, MVT::v4i32);
436438

lib/Target/PowerPC/PPCInstrInfo.td

Lines changed: 116 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2835,24 +2835,84 @@ def : Pat<(i64 (anyext i1:$in)),
28352835
(SELECT_I8 $in, (LI8 1), (LI8 0))>;
28362836

28372837
// match setcc on i1 variables.
2838+
// CRANDC is:
2839+
// 1 1 : F
2840+
// 1 0 : T
2841+
// 0 1 : F
2842+
// 0 0 : F
2843+
//
2844+
// LT is:
2845+
// -1 -1 : F
2846+
// -1 0 : T
2847+
// 0 -1 : F
2848+
// 0 0 : F
2849+
//
2850+
// ULT is:
2851+
// 1 1 : F
2852+
// 1 0 : F
2853+
// 0 1 : T
2854+
// 0 0 : F
28382855
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETLT)),
2839-
(CRANDC $s2, $s1)>;
2856+
(CRANDC $s1, $s2)>;
28402857
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETULT)),
28412858
(CRANDC $s2, $s1)>;
2859+
// CRORC is:
2860+
// 1 1 : T
2861+
// 1 0 : T
2862+
// 0 1 : F
2863+
// 0 0 : T
2864+
//
2865+
// LE is:
2866+
// -1 -1 : T
2867+
// -1 0 : T
2868+
// 0 -1 : F
2869+
// 0 0 : T
2870+
//
2871+
// ULE is:
2872+
// 1 1 : T
2873+
// 1 0 : F
2874+
// 0 1 : T
2875+
// 0 0 : T
28422876
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETLE)),
2843-
(CRORC $s2, $s1)>;
2877+
(CRORC $s1, $s2)>;
28442878
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETULE)),
28452879
(CRORC $s2, $s1)>;
2880+
28462881
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETEQ)),
28472882
(CREQV $s1, $s2)>;
2883+
2884+
// GE is:
2885+
// -1 -1 : T
2886+
// -1 0 : F
2887+
// 0 -1 : T
2888+
// 0 0 : T
2889+
//
2890+
// UGE is:
2891+
// 1 1 : T
2892+
// 1 0 : T
2893+
// 0 1 : F
2894+
// 0 0 : T
28482895
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETGE)),
2849-
(CRORC $s1, $s2)>;
2896+
(CRORC $s2, $s1)>;
28502897
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETUGE)),
28512898
(CRORC $s1, $s2)>;
2899+
2900+
// GT is:
2901+
// -1 -1 : F
2902+
// -1 0 : F
2903+
// 0 -1 : T
2904+
// 0 0 : F
2905+
//
2906+
// UGT is:
2907+
// 1 1 : F
2908+
// 1 0 : T
2909+
// 0 1 : F
2910+
// 0 0 : F
28522911
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETGT)),
2853-
(CRANDC $s1, $s2)>;
2912+
(CRANDC $s2, $s1)>;
28542913
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETUGT)),
28552914
(CRANDC $s1, $s2)>;
2915+
28562916
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETNE)),
28572917
(CRXOR $s1, $s2)>;
28582918

@@ -3203,18 +3263,30 @@ def : Pat<(i1 (select i1:$cond, i1:$tval, i1:$fval)),
32033263
// select (lhs == rhs), tval, fval is:
32043264
// ((lhs == rhs) & tval) | (!(lhs == rhs) & fval)
32053265
def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETLT)),
3266+
(CROR (CRAND (CRANDC $lhs, $rhs), $tval),
3267+
(CRAND (CRORC $rhs, $lhs), $fval))>;
3268+
def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETULT)),
32063269
(CROR (CRAND (CRANDC $rhs, $lhs), $tval),
32073270
(CRAND (CRORC $lhs, $rhs), $fval))>;
32083271
def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETLE)),
3272+
(CROR (CRAND (CRORC $lhs, $rhs), $tval),
3273+
(CRAND (CRANDC $rhs, $lhs), $fval))>;
3274+
def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETULE)),
32093275
(CROR (CRAND (CRORC $rhs, $lhs), $tval),
32103276
(CRAND (CRANDC $lhs, $rhs), $fval))>;
32113277
def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETEQ)),
32123278
(CROR (CRAND (CREQV $lhs, $rhs), $tval),
32133279
(CRAND (CRXOR $lhs, $rhs), $fval))>;
32143280
def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETGE)),
3281+
(CROR (CRAND (CRORC $rhs, $lhs), $tval),
3282+
(CRAND (CRANDC $lhs, $rhs), $fval))>;
3283+
def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETUGE)),
32153284
(CROR (CRAND (CRORC $lhs, $rhs), $tval),
32163285
(CRAND (CRANDC $rhs, $lhs), $fval))>;
32173286
def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETGT)),
3287+
(CROR (CRAND (CRANDC $rhs, $lhs), $tval),
3288+
(CRAND (CRORC $lhs, $rhs), $fval))>;
3289+
def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETUGT)),
32183290
(CROR (CRAND (CRANDC $lhs, $rhs), $tval),
32193291
(CRAND (CRORC $rhs, $lhs), $fval))>;
32203292
def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETNE)),
@@ -3223,66 +3295,106 @@ def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETNE)),
32233295

32243296
// match selectcc on i1 variables with non-i1 output.
32253297
def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETLT)),
3298+
(SELECT_I4 (CRANDC $lhs, $rhs), $tval, $fval)>;
3299+
def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETULT)),
32263300
(SELECT_I4 (CRANDC $rhs, $lhs), $tval, $fval)>;
32273301
def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETLE)),
3302+
(SELECT_I4 (CRORC $lhs, $rhs), $tval, $fval)>;
3303+
def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETULE)),
32283304
(SELECT_I4 (CRORC $rhs, $lhs), $tval, $fval)>;
32293305
def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETEQ)),
32303306
(SELECT_I4 (CREQV $lhs, $rhs), $tval, $fval)>;
32313307
def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETGE)),
3308+
(SELECT_I4 (CRORC $rhs, $lhs), $tval, $fval)>;
3309+
def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETUGE)),
32323310
(SELECT_I4 (CRORC $lhs, $rhs), $tval, $fval)>;
32333311
def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETGT)),
3312+
(SELECT_I4 (CRANDC $rhs, $lhs), $tval, $fval)>;
3313+
def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETUGT)),
32343314
(SELECT_I4 (CRANDC $lhs, $rhs), $tval, $fval)>;
32353315
def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETNE)),
32363316
(SELECT_I4 (CRXOR $lhs, $rhs), $tval, $fval)>;
32373317

32383318
def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETLT)),
3319+
(SELECT_I8 (CRANDC $lhs, $rhs), $tval, $fval)>;
3320+
def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETULT)),
32393321
(SELECT_I8 (CRANDC $rhs, $lhs), $tval, $fval)>;
32403322
def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETLE)),
3323+
(SELECT_I8 (CRORC $lhs, $rhs), $tval, $fval)>;
3324+
def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETULE)),
32413325
(SELECT_I8 (CRORC $rhs, $lhs), $tval, $fval)>;
32423326
def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETEQ)),
32433327
(SELECT_I8 (CREQV $lhs, $rhs), $tval, $fval)>;
32443328
def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETGE)),
3329+
(SELECT_I8 (CRORC $rhs, $lhs), $tval, $fval)>;
3330+
def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETUGE)),
32453331
(SELECT_I8 (CRORC $lhs, $rhs), $tval, $fval)>;
32463332
def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETGT)),
3333+
(SELECT_I8 (CRANDC $rhs, $lhs), $tval, $fval)>;
3334+
def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETUGT)),
32473335
(SELECT_I8 (CRANDC $lhs, $rhs), $tval, $fval)>;
32483336
def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETNE)),
32493337
(SELECT_I8 (CRXOR $lhs, $rhs), $tval, $fval)>;
32503338

32513339
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLT)),
3340+
(SELECT_F4 (CRANDC $lhs, $rhs), $tval, $fval)>;
3341+
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULT)),
32523342
(SELECT_F4 (CRANDC $rhs, $lhs), $tval, $fval)>;
32533343
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLE)),
3344+
(SELECT_F4 (CRORC $lhs, $rhs), $tval, $fval)>;
3345+
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULE)),
32543346
(SELECT_F4 (CRORC $rhs, $lhs), $tval, $fval)>;
32553347
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETEQ)),
32563348
(SELECT_F4 (CREQV $lhs, $rhs), $tval, $fval)>;
32573349
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGE)),
3350+
(SELECT_F4 (CRORC $rhs, $lhs), $tval, $fval)>;
3351+
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGE)),
32583352
(SELECT_F4 (CRORC $lhs, $rhs), $tval, $fval)>;
32593353
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGT)),
3354+
(SELECT_F4 (CRANDC $rhs, $lhs), $tval, $fval)>;
3355+
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGT)),
32603356
(SELECT_F4 (CRANDC $lhs, $rhs), $tval, $fval)>;
32613357
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETNE)),
32623358
(SELECT_F4 (CRXOR $lhs, $rhs), $tval, $fval)>;
32633359

32643360
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)),
3361+
(SELECT_F8 (CRANDC $lhs, $rhs), $tval, $fval)>;
3362+
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULT)),
32653363
(SELECT_F8 (CRANDC $rhs, $lhs), $tval, $fval)>;
32663364
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)),
3365+
(SELECT_F8 (CRORC $lhs, $rhs), $tval, $fval)>;
3366+
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULE)),
32673367
(SELECT_F8 (CRORC $rhs, $lhs), $tval, $fval)>;
32683368
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
32693369
(SELECT_F8 (CREQV $lhs, $rhs), $tval, $fval)>;
32703370
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)),
3371+
(SELECT_F8 (CRORC $rhs, $lhs), $tval, $fval)>;
3372+
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGE)),
32713373
(SELECT_F8 (CRORC $lhs, $rhs), $tval, $fval)>;
32723374
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)),
3375+
(SELECT_F8 (CRANDC $rhs, $lhs), $tval, $fval)>;
3376+
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGT)),
32733377
(SELECT_F8 (CRANDC $lhs, $rhs), $tval, $fval)>;
32743378
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
32753379
(SELECT_F8 (CRXOR $lhs, $rhs), $tval, $fval)>;
32763380

32773381
def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETLT)),
3382+
(SELECT_VRRC (CRANDC $lhs, $rhs), $tval, $fval)>;
3383+
def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETULT)),
32783384
(SELECT_VRRC (CRANDC $rhs, $lhs), $tval, $fval)>;
32793385
def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETLE)),
3386+
(SELECT_VRRC (CRORC $lhs, $rhs), $tval, $fval)>;
3387+
def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETULE)),
32803388
(SELECT_VRRC (CRORC $rhs, $lhs), $tval, $fval)>;
32813389
def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETEQ)),
32823390
(SELECT_VRRC (CREQV $lhs, $rhs), $tval, $fval)>;
32833391
def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETGE)),
3392+
(SELECT_VRRC (CRORC $rhs, $lhs), $tval, $fval)>;
3393+
def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETUGE)),
32843394
(SELECT_VRRC (CRORC $lhs, $rhs), $tval, $fval)>;
32853395
def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETGT)),
3396+
(SELECT_VRRC (CRANDC $rhs, $lhs), $tval, $fval)>;
3397+
def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETUGT)),
32863398
(SELECT_VRRC (CRANDC $lhs, $rhs), $tval, $fval)>;
32873399
def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETNE)),
32883400
(SELECT_VRRC (CRXOR $lhs, $rhs), $tval, $fval)>;

lib/Target/PowerPC/PPCInstrQPX.td

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,40 +1115,64 @@ def : Pat<(v4f64 (PPCqbflt v4i1:$src)),
11151115
(COPY_TO_REGCLASS $src, QFRC)>;
11161116

11171117
def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETLT)),
1118+
(SELECT_QFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1119+
def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETULT)),
11181120
(SELECT_QFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
11191121
def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETLE)),
1122+
(SELECT_QFRC (CRORC $lhs, $rhs), $tval, $fval)>;
1123+
def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETULE)),
11201124
(SELECT_QFRC (CRORC $rhs, $lhs), $tval, $fval)>;
11211125
def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETEQ)),
11221126
(SELECT_QFRC (CREQV $lhs, $rhs), $tval, $fval)>;
11231127
def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETGE)),
1128+
(SELECT_QFRC (CRORC $rhs, $lhs), $tval, $fval)>;
1129+
def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETUGE)),
11241130
(SELECT_QFRC (CRORC $lhs, $rhs), $tval, $fval)>;
11251131
def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETGT)),
1132+
(SELECT_QFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1133+
def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETUGT)),
11261134
(SELECT_QFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
11271135
def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETNE)),
11281136
(SELECT_QFRC (CRXOR $lhs, $rhs), $tval, $fval)>;
11291137

11301138
def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETLT)),
1139+
(SELECT_QSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1140+
def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETULT)),
11311141
(SELECT_QSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
11321142
def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETLE)),
1143+
(SELECT_QSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1144+
def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETULE)),
11331145
(SELECT_QSRC (CRORC $rhs, $lhs), $tval, $fval)>;
11341146
def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETEQ)),
11351147
(SELECT_QSRC (CREQV $lhs, $rhs), $tval, $fval)>;
11361148
def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETGE)),
1149+
(SELECT_QSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1150+
def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETUGE)),
11371151
(SELECT_QSRC (CRORC $lhs, $rhs), $tval, $fval)>;
11381152
def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETGT)),
1153+
(SELECT_QSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1154+
def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETUGT)),
11391155
(SELECT_QSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
11401156
def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETNE)),
11411157
(SELECT_QSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
11421158

11431159
def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETLT)),
1160+
(SELECT_QBRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1161+
def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETULT)),
11441162
(SELECT_QBRC (CRANDC $rhs, $lhs), $tval, $fval)>;
11451163
def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETLE)),
1164+
(SELECT_QBRC (CRORC $lhs, $rhs), $tval, $fval)>;
1165+
def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETULE)),
11461166
(SELECT_QBRC (CRORC $rhs, $lhs), $tval, $fval)>;
11471167
def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETEQ)),
11481168
(SELECT_QBRC (CREQV $lhs, $rhs), $tval, $fval)>;
11491169
def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETGE)),
1170+
(SELECT_QBRC (CRORC $rhs, $lhs), $tval, $fval)>;
1171+
def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETUGE)),
11501172
(SELECT_QBRC (CRORC $lhs, $rhs), $tval, $fval)>;
11511173
def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETGT)),
1174+
(SELECT_QBRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1175+
def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETUGT)),
11521176
(SELECT_QBRC (CRANDC $lhs, $rhs), $tval, $fval)>;
11531177
def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETNE)),
11541178
(SELECT_QBRC (CRXOR $lhs, $rhs), $tval, $fval)>;

lib/Target/PowerPC/PPCInstrVSX.td

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -958,27 +958,43 @@ def : Pat<(v4i32 (PPCxxswapd v4i32:$src)), (XXPERMDI $src, $src, 2)>;
958958

959959
// Selects.
960960
def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLT)),
961+
(SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
962+
def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULT)),
961963
(SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
962964
def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLE)),
965+
(SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
966+
def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULE)),
963967
(SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
964968
def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETEQ)),
965969
(SELECT_VSRC (CREQV $lhs, $rhs), $tval, $fval)>;
966970
def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGE)),
971+
(SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
972+
def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGE)),
967973
(SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
968974
def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGT)),
975+
(SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
976+
def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGT)),
969977
(SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
970978
def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETNE)),
971979
(SELECT_VSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
972980

973981
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)),
982+
(SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
983+
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULT)),
974984
(SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
975985
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)),
986+
(SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
987+
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULE)),
976988
(SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
977989
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
978990
(SELECT_VSFRC (CREQV $lhs, $rhs), $tval, $fval)>;
979991
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)),
992+
(SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
993+
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGE)),
980994
(SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
981995
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)),
996+
(SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
997+
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGT)),
982998
(SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
983999
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
9841000
(SELECT_VSFRC (CRXOR $lhs, $rhs), $tval, $fval)>;
@@ -1060,18 +1076,27 @@ let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
10601076
(COPY_TO_REGCLASS (LXSSPX xoaddr:$src), VSFRC)>;
10611077
def : Pat<(f64 (fextend f32:$src)),
10621078
(COPY_TO_REGCLASS $src, VSFRC)>;
1079+
10631080
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLT)),
1081+
(SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1082+
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULT)),
10641083
(SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
10651084
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLE)),
1085+
(SELECT_VSSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1086+
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULE)),
10661087
(SELECT_VSSRC (CRORC $rhs, $lhs), $tval, $fval)>;
10671088
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETEQ)),
10681089
(SELECT_VSSRC (CREQV $lhs, $rhs), $tval, $fval)>;
10691090
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGE)),
1091+
(SELECT_VSSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1092+
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGE)),
10701093
(SELECT_VSSRC (CRORC $lhs, $rhs), $tval, $fval)>;
10711094
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGT)),
1095+
(SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1096+
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGT)),
10721097
(SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
10731098
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETNE)),
1074-
(SELECT_VSSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
1099+
(SELECT_VSSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
10751100

10761101
// VSX Elementary Scalar FP arithmetic (SP)
10771102
let isCommutable = 1 in {

0 commit comments

Comments
 (0)