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