@@ -1466,3 +1466,165 @@ define <vscale x 2 x i32> @vwadd_wv_disjoint_or(<vscale x 2 x i32> %x.i32, <vsca
1466
1466
%or = or disjoint <vscale x 2 x i32 > %x.i32 , %y.i32
1467
1467
ret <vscale x 2 x i32 > %or
1468
1468
}
1469
+
1470
+ define <vscale x 8 x i64 > @vwadd_vx_splat_zext (<vscale x 8 x i32 > %va , i32 %b ) {
1471
+ ; RV32-LABEL: vwadd_vx_splat_zext:
1472
+ ; RV32: # %bb.0:
1473
+ ; RV32-NEXT: addi sp, sp, -16
1474
+ ; RV32-NEXT: .cfi_def_cfa_offset 16
1475
+ ; RV32-NEXT: sw zero, 12(sp)
1476
+ ; RV32-NEXT: sw a0, 8(sp)
1477
+ ; RV32-NEXT: addi a0, sp, 8
1478
+ ; RV32-NEXT: vsetvli a1, zero, e32, m4, ta, ma
1479
+ ; RV32-NEXT: vlse64.v v16, (a0), zero
1480
+ ; RV32-NEXT: vwaddu.wv v16, v16, v8
1481
+ ; RV32-NEXT: vmv8r.v v8, v16
1482
+ ; RV32-NEXT: addi sp, sp, 16
1483
+ ; RV32-NEXT: ret
1484
+ ;
1485
+ ; RV64-LABEL: vwadd_vx_splat_zext:
1486
+ ; RV64: # %bb.0:
1487
+ ; RV64-NEXT: slli a0, a0, 32
1488
+ ; RV64-NEXT: srli a0, a0, 32
1489
+ ; RV64-NEXT: vsetvli a1, zero, e64, m8, ta, ma
1490
+ ; RV64-NEXT: vmv.v.x v16, a0
1491
+ ; RV64-NEXT: vsetvli zero, zero, e32, m4, ta, ma
1492
+ ; RV64-NEXT: vwaddu.wv v16, v16, v8
1493
+ ; RV64-NEXT: vmv8r.v v8, v16
1494
+ ; RV64-NEXT: ret
1495
+ %zb = zext i32 %b to i64
1496
+ %head = insertelement <vscale x 8 x i64 > poison, i64 %zb , i32 0
1497
+ %splat = shufflevector <vscale x 8 x i64 > %head , <vscale x 8 x i64 > poison, <vscale x 8 x i32 > zeroinitializer
1498
+ %vc = zext <vscale x 8 x i32 > %va to <vscale x 8 x i64 >
1499
+ %ve = add <vscale x 8 x i64 > %vc , %splat
1500
+ ret <vscale x 8 x i64 > %ve
1501
+ }
1502
+
1503
+ define <vscale x 8 x i32 > @vwadd_vx_splat_zext_i1 (<vscale x 8 x i1 > %va , i16 %b ) {
1504
+ ; RV32-LABEL: vwadd_vx_splat_zext_i1:
1505
+ ; RV32: # %bb.0:
1506
+ ; RV32-NEXT: slli a0, a0, 16
1507
+ ; RV32-NEXT: srli a0, a0, 16
1508
+ ; RV32-NEXT: vsetvli a1, zero, e32, m4, ta, mu
1509
+ ; RV32-NEXT: vmv.v.x v8, a0
1510
+ ; RV32-NEXT: vadd.vi v8, v8, 1, v0.t
1511
+ ; RV32-NEXT: ret
1512
+ ;
1513
+ ; RV64-LABEL: vwadd_vx_splat_zext_i1:
1514
+ ; RV64: # %bb.0:
1515
+ ; RV64-NEXT: slli a0, a0, 48
1516
+ ; RV64-NEXT: srli a0, a0, 48
1517
+ ; RV64-NEXT: vsetvli a1, zero, e32, m4, ta, mu
1518
+ ; RV64-NEXT: vmv.v.x v8, a0
1519
+ ; RV64-NEXT: vadd.vi v8, v8, 1, v0.t
1520
+ ; RV64-NEXT: ret
1521
+ %zb = zext i16 %b to i32
1522
+ %head = insertelement <vscale x 8 x i32 > poison, i32 %zb , i32 0
1523
+ %splat = shufflevector <vscale x 8 x i32 > %head , <vscale x 8 x i32 > poison, <vscale x 8 x i32 > zeroinitializer
1524
+ %vc = zext <vscale x 8 x i1 > %va to <vscale x 8 x i32 >
1525
+ %ve = add <vscale x 8 x i32 > %vc , %splat
1526
+ ret <vscale x 8 x i32 > %ve
1527
+ }
1528
+
1529
+ define <vscale x 8 x i64 > @vwadd_wx_splat_zext (<vscale x 8 x i64 > %va , i32 %b ) {
1530
+ ; RV32-LABEL: vwadd_wx_splat_zext:
1531
+ ; RV32: # %bb.0:
1532
+ ; RV32-NEXT: addi sp, sp, -16
1533
+ ; RV32-NEXT: .cfi_def_cfa_offset 16
1534
+ ; RV32-NEXT: sw zero, 12(sp)
1535
+ ; RV32-NEXT: sw a0, 8(sp)
1536
+ ; RV32-NEXT: addi a0, sp, 8
1537
+ ; RV32-NEXT: vsetvli a1, zero, e64, m8, ta, ma
1538
+ ; RV32-NEXT: vlse64.v v16, (a0), zero
1539
+ ; RV32-NEXT: vadd.vv v8, v8, v16
1540
+ ; RV32-NEXT: addi sp, sp, 16
1541
+ ; RV32-NEXT: ret
1542
+ ;
1543
+ ; RV64-LABEL: vwadd_wx_splat_zext:
1544
+ ; RV64: # %bb.0:
1545
+ ; RV64-NEXT: slli a0, a0, 32
1546
+ ; RV64-NEXT: srli a0, a0, 32
1547
+ ; RV64-NEXT: vsetvli a1, zero, e64, m8, ta, ma
1548
+ ; RV64-NEXT: vadd.vx v8, v8, a0
1549
+ ; RV64-NEXT: ret
1550
+ %zb = zext i32 %b to i64
1551
+ %head = insertelement <vscale x 8 x i64 > poison, i64 %zb , i32 0
1552
+ %splat = shufflevector <vscale x 8 x i64 > %head , <vscale x 8 x i64 > poison, <vscale x 8 x i32 > zeroinitializer
1553
+ %ve = add <vscale x 8 x i64 > %va , %splat
1554
+ ret <vscale x 8 x i64 > %ve
1555
+ }
1556
+
1557
+ define <vscale x 8 x i64 > @vwadd_vx_splat_sext (<vscale x 8 x i32 > %va , i32 %b ) {
1558
+ ; RV32-LABEL: vwadd_vx_splat_sext:
1559
+ ; RV32: # %bb.0:
1560
+ ; RV32-NEXT: vsetvli a1, zero, e64, m8, ta, ma
1561
+ ; RV32-NEXT: vmv.v.x v16, a0
1562
+ ; RV32-NEXT: vsetvli zero, zero, e32, m4, ta, ma
1563
+ ; RV32-NEXT: vwadd.wv v16, v16, v8
1564
+ ; RV32-NEXT: vmv8r.v v8, v16
1565
+ ; RV32-NEXT: ret
1566
+ ;
1567
+ ; RV64-LABEL: vwadd_vx_splat_sext:
1568
+ ; RV64: # %bb.0:
1569
+ ; RV64-NEXT: sext.w a0, a0
1570
+ ; RV64-NEXT: vsetvli a1, zero, e64, m8, ta, ma
1571
+ ; RV64-NEXT: vmv.v.x v16, a0
1572
+ ; RV64-NEXT: vsetvli zero, zero, e32, m4, ta, ma
1573
+ ; RV64-NEXT: vwadd.wv v16, v16, v8
1574
+ ; RV64-NEXT: vmv8r.v v8, v16
1575
+ ; RV64-NEXT: ret
1576
+ %sb = sext i32 %b to i64
1577
+ %head = insertelement <vscale x 8 x i64 > poison, i64 %sb , i32 0
1578
+ %splat = shufflevector <vscale x 8 x i64 > %head , <vscale x 8 x i64 > poison, <vscale x 8 x i32 > zeroinitializer
1579
+ %vc = sext <vscale x 8 x i32 > %va to <vscale x 8 x i64 >
1580
+ %ve = add <vscale x 8 x i64 > %vc , %splat
1581
+ ret <vscale x 8 x i64 > %ve
1582
+ }
1583
+
1584
+ define <vscale x 8 x i32 > @vwadd_vx_splat_sext_i1 (<vscale x 8 x i1 > %va , i16 %b ) {
1585
+ ; RV32-LABEL: vwadd_vx_splat_sext_i1:
1586
+ ; RV32: # %bb.0:
1587
+ ; RV32-NEXT: slli a0, a0, 16
1588
+ ; RV32-NEXT: srai a0, a0, 16
1589
+ ; RV32-NEXT: vsetvli a1, zero, e32, m4, ta, mu
1590
+ ; RV32-NEXT: vmv.v.x v8, a0
1591
+ ; RV32-NEXT: li a0, 1
1592
+ ; RV32-NEXT: vsub.vx v8, v8, a0, v0.t
1593
+ ; RV32-NEXT: ret
1594
+ ;
1595
+ ; RV64-LABEL: vwadd_vx_splat_sext_i1:
1596
+ ; RV64: # %bb.0:
1597
+ ; RV64-NEXT: slli a0, a0, 48
1598
+ ; RV64-NEXT: srai a0, a0, 48
1599
+ ; RV64-NEXT: vsetvli a1, zero, e32, m4, ta, mu
1600
+ ; RV64-NEXT: vmv.v.x v8, a0
1601
+ ; RV64-NEXT: li a0, 1
1602
+ ; RV64-NEXT: vsub.vx v8, v8, a0, v0.t
1603
+ ; RV64-NEXT: ret
1604
+ %sb = sext i16 %b to i32
1605
+ %head = insertelement <vscale x 8 x i32 > poison, i32 %sb , i32 0
1606
+ %splat = shufflevector <vscale x 8 x i32 > %head , <vscale x 8 x i32 > poison, <vscale x 8 x i32 > zeroinitializer
1607
+ %vc = sext <vscale x 8 x i1 > %va to <vscale x 8 x i32 >
1608
+ %ve = add <vscale x 8 x i32 > %vc , %splat
1609
+ ret <vscale x 8 x i32 > %ve
1610
+ }
1611
+
1612
+ define <vscale x 8 x i64 > @vwadd_wx_splat_sext (<vscale x 8 x i64 > %va , i32 %b ) {
1613
+ ; RV32-LABEL: vwadd_wx_splat_sext:
1614
+ ; RV32: # %bb.0:
1615
+ ; RV32-NEXT: vsetvli a1, zero, e64, m8, ta, ma
1616
+ ; RV32-NEXT: vadd.vx v8, v8, a0
1617
+ ; RV32-NEXT: ret
1618
+ ;
1619
+ ; RV64-LABEL: vwadd_wx_splat_sext:
1620
+ ; RV64: # %bb.0:
1621
+ ; RV64-NEXT: sext.w a0, a0
1622
+ ; RV64-NEXT: vsetvli a1, zero, e64, m8, ta, ma
1623
+ ; RV64-NEXT: vadd.vx v8, v8, a0
1624
+ ; RV64-NEXT: ret
1625
+ %sb = sext i32 %b to i64
1626
+ %head = insertelement <vscale x 8 x i64 > poison, i64 %sb , i32 0
1627
+ %splat = shufflevector <vscale x 8 x i64 > %head , <vscale x 8 x i64 > poison, <vscale x 8 x i32 > zeroinitializer
1628
+ %ve = add <vscale x 8 x i64 > %va , %splat
1629
+ ret <vscale x 8 x i64 > %ve
1630
+ }
0 commit comments