@@ -2835,24 +2835,84 @@ def : Pat<(i64 (anyext i1:$in)),
2835
2835
(SELECT_I8 $in, (LI8 1), (LI8 0))>;
2836
2836
2837
2837
// 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
2838
2855
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETLT)),
2839
- (CRANDC $s2 , $s1 )>;
2856
+ (CRANDC $s1 , $s2 )>;
2840
2857
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETULT)),
2841
2858
(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
2842
2876
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETLE)),
2843
- (CRORC $s2 , $s1 )>;
2877
+ (CRORC $s1 , $s2 )>;
2844
2878
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETULE)),
2845
2879
(CRORC $s2, $s1)>;
2880
+
2846
2881
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETEQ)),
2847
2882
(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
2848
2895
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETGE)),
2849
- (CRORC $s1 , $s2 )>;
2896
+ (CRORC $s2 , $s1 )>;
2850
2897
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETUGE)),
2851
2898
(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
2852
2911
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETGT)),
2853
- (CRANDC $s1 , $s2 )>;
2912
+ (CRANDC $s2 , $s1 )>;
2854
2913
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETUGT)),
2855
2914
(CRANDC $s1, $s2)>;
2915
+
2856
2916
def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETNE)),
2857
2917
(CRXOR $s1, $s2)>;
2858
2918
@@ -3203,18 +3263,30 @@ def : Pat<(i1 (select i1:$cond, i1:$tval, i1:$fval)),
3203
3263
// select (lhs == rhs), tval, fval is:
3204
3264
// ((lhs == rhs) & tval) | (!(lhs == rhs) & fval)
3205
3265
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)),
3206
3269
(CROR (CRAND (CRANDC $rhs, $lhs), $tval),
3207
3270
(CRAND (CRORC $lhs, $rhs), $fval))>;
3208
3271
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)),
3209
3275
(CROR (CRAND (CRORC $rhs, $lhs), $tval),
3210
3276
(CRAND (CRANDC $lhs, $rhs), $fval))>;
3211
3277
def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETEQ)),
3212
3278
(CROR (CRAND (CREQV $lhs, $rhs), $tval),
3213
3279
(CRAND (CRXOR $lhs, $rhs), $fval))>;
3214
3280
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)),
3215
3284
(CROR (CRAND (CRORC $lhs, $rhs), $tval),
3216
3285
(CRAND (CRANDC $rhs, $lhs), $fval))>;
3217
3286
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)),
3218
3290
(CROR (CRAND (CRANDC $lhs, $rhs), $tval),
3219
3291
(CRAND (CRORC $rhs, $lhs), $fval))>;
3220
3292
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)),
3223
3295
3224
3296
// match selectcc on i1 variables with non-i1 output.
3225
3297
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)),
3226
3300
(SELECT_I4 (CRANDC $rhs, $lhs), $tval, $fval)>;
3227
3301
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)),
3228
3304
(SELECT_I4 (CRORC $rhs, $lhs), $tval, $fval)>;
3229
3305
def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETEQ)),
3230
3306
(SELECT_I4 (CREQV $lhs, $rhs), $tval, $fval)>;
3231
3307
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)),
3232
3310
(SELECT_I4 (CRORC $lhs, $rhs), $tval, $fval)>;
3233
3311
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)),
3234
3314
(SELECT_I4 (CRANDC $lhs, $rhs), $tval, $fval)>;
3235
3315
def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETNE)),
3236
3316
(SELECT_I4 (CRXOR $lhs, $rhs), $tval, $fval)>;
3237
3317
3238
3318
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)),
3239
3321
(SELECT_I8 (CRANDC $rhs, $lhs), $tval, $fval)>;
3240
3322
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)),
3241
3325
(SELECT_I8 (CRORC $rhs, $lhs), $tval, $fval)>;
3242
3326
def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETEQ)),
3243
3327
(SELECT_I8 (CREQV $lhs, $rhs), $tval, $fval)>;
3244
3328
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)),
3245
3331
(SELECT_I8 (CRORC $lhs, $rhs), $tval, $fval)>;
3246
3332
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)),
3247
3335
(SELECT_I8 (CRANDC $lhs, $rhs), $tval, $fval)>;
3248
3336
def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETNE)),
3249
3337
(SELECT_I8 (CRXOR $lhs, $rhs), $tval, $fval)>;
3250
3338
3251
3339
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)),
3252
3342
(SELECT_F4 (CRANDC $rhs, $lhs), $tval, $fval)>;
3253
3343
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)),
3254
3346
(SELECT_F4 (CRORC $rhs, $lhs), $tval, $fval)>;
3255
3347
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETEQ)),
3256
3348
(SELECT_F4 (CREQV $lhs, $rhs), $tval, $fval)>;
3257
3349
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)),
3258
3352
(SELECT_F4 (CRORC $lhs, $rhs), $tval, $fval)>;
3259
3353
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)),
3260
3356
(SELECT_F4 (CRANDC $lhs, $rhs), $tval, $fval)>;
3261
3357
def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETNE)),
3262
3358
(SELECT_F4 (CRXOR $lhs, $rhs), $tval, $fval)>;
3263
3359
3264
3360
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)),
3265
3363
(SELECT_F8 (CRANDC $rhs, $lhs), $tval, $fval)>;
3266
3364
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)),
3267
3367
(SELECT_F8 (CRORC $rhs, $lhs), $tval, $fval)>;
3268
3368
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
3269
3369
(SELECT_F8 (CREQV $lhs, $rhs), $tval, $fval)>;
3270
3370
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)),
3271
3373
(SELECT_F8 (CRORC $lhs, $rhs), $tval, $fval)>;
3272
3374
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)),
3273
3377
(SELECT_F8 (CRANDC $lhs, $rhs), $tval, $fval)>;
3274
3378
def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
3275
3379
(SELECT_F8 (CRXOR $lhs, $rhs), $tval, $fval)>;
3276
3380
3277
3381
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)),
3278
3384
(SELECT_VRRC (CRANDC $rhs, $lhs), $tval, $fval)>;
3279
3385
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)),
3280
3388
(SELECT_VRRC (CRORC $rhs, $lhs), $tval, $fval)>;
3281
3389
def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETEQ)),
3282
3390
(SELECT_VRRC (CREQV $lhs, $rhs), $tval, $fval)>;
3283
3391
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)),
3284
3394
(SELECT_VRRC (CRORC $lhs, $rhs), $tval, $fval)>;
3285
3395
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)),
3286
3398
(SELECT_VRRC (CRANDC $lhs, $rhs), $tval, $fval)>;
3287
3399
def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETNE)),
3288
3400
(SELECT_VRRC (CRXOR $lhs, $rhs), $tval, $fval)>;
0 commit comments