@@ -1417,38 +1417,62 @@ define <vscale x 2 x i32> @vwaddu_vv_disjoint_or_add(<vscale x 2 x i8> %x.i8, <v
1417
1417
ret <vscale x 2 x i32 > %add
1418
1418
}
1419
1419
1420
- ; TODO: We could select vwaddu.vv, but when both arms of the or are the same
1421
- ; DAGCombiner::hoistLogicOpWithSameOpcodeHands moves the zext above the or.
1422
1420
define <vscale x 2 x i32 > @vwaddu_vv_disjoint_or (<vscale x 2 x i16 > %x.i16 , <vscale x 2 x i16 > %y.i16 ) {
1423
1421
; CHECK-LABEL: vwaddu_vv_disjoint_or:
1424
1422
; CHECK: # %bb.0:
1425
1423
; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
1426
- ; CHECK-NEXT: vor.vv v9, v8, v9
1427
- ; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma
1428
- ; CHECK-NEXT: vzext.vf2 v8, v9
1424
+ ; CHECK-NEXT: vwaddu.vv v10, v8, v9
1425
+ ; CHECK-NEXT: vmv1r.v v8, v10
1429
1426
; CHECK-NEXT: ret
1430
1427
%x.i32 = zext <vscale x 2 x i16 > %x.i16 to <vscale x 2 x i32 >
1431
1428
%y.i32 = zext <vscale x 2 x i16 > %y.i16 to <vscale x 2 x i32 >
1432
1429
%or = or disjoint <vscale x 2 x i32 > %x.i32 , %y.i32
1433
1430
ret <vscale x 2 x i32 > %or
1434
1431
}
1435
1432
1436
- ; TODO: We could select vwadd.vv, but when both arms of the or are the same
1437
- ; DAGCombiner::hoistLogicOpWithSameOpcodeHands moves the zext above the or.
1438
1433
define <vscale x 2 x i32 > @vwadd_vv_disjoint_or (<vscale x 2 x i16 > %x.i16 , <vscale x 2 x i16 > %y.i16 ) {
1439
1434
; CHECK-LABEL: vwadd_vv_disjoint_or:
1440
1435
; CHECK: # %bb.0:
1441
1436
; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
1442
- ; CHECK-NEXT: vor.vv v9, v8, v9
1443
- ; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma
1444
- ; CHECK-NEXT: vsext.vf2 v8, v9
1437
+ ; CHECK-NEXT: vwadd.vv v10, v8, v9
1438
+ ; CHECK-NEXT: vmv1r.v v8, v10
1445
1439
; CHECK-NEXT: ret
1446
1440
%x.i32 = sext <vscale x 2 x i16 > %x.i16 to <vscale x 2 x i32 >
1447
1441
%y.i32 = sext <vscale x 2 x i16 > %y.i16 to <vscale x 2 x i32 >
1448
1442
%or = or disjoint <vscale x 2 x i32 > %x.i32 , %y.i32
1449
1443
ret <vscale x 2 x i32 > %or
1450
1444
}
1451
1445
1446
+ define <vscale x 2 x i32 > @vwaddu_vx_disjoint_or (<vscale x 2 x i16 > %x.i16 , i16 %y.i16 ) {
1447
+ ; CHECK-LABEL: vwaddu_vx_disjoint_or:
1448
+ ; CHECK: # %bb.0:
1449
+ ; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma
1450
+ ; CHECK-NEXT: vwaddu.vx v9, v8, a0
1451
+ ; CHECK-NEXT: vmv1r.v v8, v9
1452
+ ; CHECK-NEXT: ret
1453
+ %x.i32 = zext <vscale x 2 x i16 > %x.i16 to <vscale x 2 x i32 >
1454
+ %y.head = insertelement <vscale x 2 x i16 > poison, i16 %y.i16 , i32 0
1455
+ %y.splat = shufflevector <vscale x 2 x i16 > %y.head , <vscale x 2 x i16 > poison, <vscale x 2 x i32 > zeroinitializer
1456
+ %y.i32 = zext <vscale x 2 x i16 > %y.splat to <vscale x 2 x i32 >
1457
+ %or = or disjoint <vscale x 2 x i32 > %x.i32 , %y.i32
1458
+ ret <vscale x 2 x i32 > %or
1459
+ }
1460
+
1461
+ define <vscale x 2 x i32 > @vwadd_vx_disjoint_or (<vscale x 2 x i16 > %x.i16 , i16 %y.i16 ) {
1462
+ ; CHECK-LABEL: vwadd_vx_disjoint_or:
1463
+ ; CHECK: # %bb.0:
1464
+ ; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma
1465
+ ; CHECK-NEXT: vwadd.vx v9, v8, a0
1466
+ ; CHECK-NEXT: vmv1r.v v8, v9
1467
+ ; CHECK-NEXT: ret
1468
+ %x.i32 = sext <vscale x 2 x i16 > %x.i16 to <vscale x 2 x i32 >
1469
+ %y.head = insertelement <vscale x 2 x i16 > poison, i16 %y.i16 , i32 0
1470
+ %y.splat = shufflevector <vscale x 2 x i16 > %y.head , <vscale x 2 x i16 > poison, <vscale x 2 x i32 > zeroinitializer
1471
+ %y.i32 = sext <vscale x 2 x i16 > %y.splat to <vscale x 2 x i32 >
1472
+ %or = or disjoint <vscale x 2 x i32 > %x.i32 , %y.i32
1473
+ ret <vscale x 2 x i32 > %or
1474
+ }
1475
+
1452
1476
define <vscale x 2 x i32 > @vwaddu_wv_disjoint_or (<vscale x 2 x i32 > %x.i32 , <vscale x 2 x i16 > %y.i16 ) {
1453
1477
; CHECK-LABEL: vwaddu_wv_disjoint_or:
1454
1478
; CHECK: # %bb.0:
0 commit comments