|
1 | 1 | ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
2 |
| -; RUN: llc -mtriple=riscv64 -mattr=+c -verify-machineinstrs < %s \ |
| 2 | +; RUN: llc -mtriple=riscv64 -mattr=+c,+zbb -verify-machineinstrs < %s \ |
3 | 3 | ; RUN: | FileCheck -check-prefix=NOSFB %s
|
4 |
| -; RUN: llc -mtriple=riscv64 -mcpu=sifive-u74 -verify-machineinstrs < %s \ |
| 4 | +; RUN: llc -mtriple=riscv64 -mcpu=sifive-u74 -mattr=+zbb -verify-machineinstrs < %s \ |
5 | 5 | ; RUN: | FileCheck -check-prefixes=SFB,NOZICOND,RV64SFB %s
|
6 |
| -; RUN: llc -mtriple=riscv64 -mcpu=sifive-u74 -mattr=+experimental-zicond \ |
| 6 | +; RUN: llc -mtriple=riscv64 -mcpu=sifive-u74 -mattr=+experimental-zicond,+zbb \ |
7 | 7 | ; RUN: -verify-machineinstrs < %s | FileCheck -check-prefixes=SFB,ZICOND %s
|
8 |
| -; RUN: llc -mtriple=riscv32 -mcpu=sifive-e76 -verify-machineinstrs < %s \ |
| 8 | +; RUN: llc -mtriple=riscv32 -mcpu=sifive-e76 -mattr=+zbb -verify-machineinstrs < %s \ |
9 | 9 | ; RUN: | FileCheck -check-prefixes=SFB,NOZICOND,RV32SFB %s
|
10 | 10 |
|
11 | 11 | ; The sifive-7-series can predicate a mv.
|
@@ -1462,9 +1462,8 @@ entry:
|
1462 | 1462 | define signext i32 @abs_i32(i32 signext %x) {
|
1463 | 1463 | ; NOSFB-LABEL: abs_i32:
|
1464 | 1464 | ; NOSFB: # %bb.0:
|
1465 |
| -; NOSFB-NEXT: sraiw a1, a0, 31 |
1466 |
| -; NOSFB-NEXT: xor a0, a0, a1 |
1467 |
| -; NOSFB-NEXT: subw a0, a0, a1 |
| 1465 | +; NOSFB-NEXT: negw a1, a0 |
| 1466 | +; NOSFB-NEXT: max a0, a0, a1 |
1468 | 1467 | ; NOSFB-NEXT: ret
|
1469 | 1468 | ;
|
1470 | 1469 | ; RV64SFB-LABEL: abs_i32:
|
@@ -1498,9 +1497,8 @@ declare i32 @llvm.abs.i32(i32, i1)
|
1498 | 1497 | define i64 @abs_i64(i64 %x) {
|
1499 | 1498 | ; NOSFB-LABEL: abs_i64:
|
1500 | 1499 | ; NOSFB: # %bb.0:
|
1501 |
| -; NOSFB-NEXT: srai a1, a0, 63 |
1502 |
| -; NOSFB-NEXT: xor a0, a0, a1 |
1503 |
| -; NOSFB-NEXT: sub a0, a0, a1 |
| 1500 | +; NOSFB-NEXT: neg a1, a0 |
| 1501 | +; NOSFB-NEXT: max a0, a0, a1 |
1504 | 1502 | ; NOSFB-NEXT: ret
|
1505 | 1503 | ;
|
1506 | 1504 | ; RV64SFB-LABEL: abs_i64:
|
@@ -1536,3 +1534,147 @@ define i64 @abs_i64(i64 %x) {
|
1536 | 1534 | ret i64 %a
|
1537 | 1535 | }
|
1538 | 1536 | declare i64 @llvm.abs.i64(i64, i1)
|
| 1537 | + |
| 1538 | +define i64 @select_andn(i64 %A, i64 %B, i64 %C, i1 zeroext %cond) { |
| 1539 | +; NOSFB-LABEL: select_andn: |
| 1540 | +; NOSFB: # %bb.0: # %entry |
| 1541 | +; NOSFB-NEXT: bnez a3, .LBB36_2 |
| 1542 | +; NOSFB-NEXT: # %bb.1: # %entry |
| 1543 | +; NOSFB-NEXT: andn a2, a0, a1 |
| 1544 | +; NOSFB-NEXT: .LBB36_2: # %entry |
| 1545 | +; NOSFB-NEXT: mv a0, a2 |
| 1546 | +; NOSFB-NEXT: ret |
| 1547 | +; |
| 1548 | +; RV64SFB-LABEL: select_andn: |
| 1549 | +; RV64SFB: # %bb.0: # %entry |
| 1550 | +; RV64SFB-NEXT: bnez a3, .LBB36_2 |
| 1551 | +; RV64SFB-NEXT: # %bb.1: # %entry |
| 1552 | +; RV64SFB-NEXT: andn a2, a0, a1 |
| 1553 | +; RV64SFB-NEXT: .LBB36_2: # %entry |
| 1554 | +; RV64SFB-NEXT: mv a0, a2 |
| 1555 | +; RV64SFB-NEXT: ret |
| 1556 | +; |
| 1557 | +; ZICOND-LABEL: select_andn: |
| 1558 | +; ZICOND: # %bb.0: # %entry |
| 1559 | +; ZICOND-NEXT: bnez a3, .LBB36_2 |
| 1560 | +; ZICOND-NEXT: # %bb.1: # %entry |
| 1561 | +; ZICOND-NEXT: andn a2, a0, a1 |
| 1562 | +; ZICOND-NEXT: .LBB36_2: # %entry |
| 1563 | +; ZICOND-NEXT: mv a0, a2 |
| 1564 | +; ZICOND-NEXT: ret |
| 1565 | +; |
| 1566 | +; RV32SFB-LABEL: select_andn: |
| 1567 | +; RV32SFB: # %bb.0: # %entry |
| 1568 | +; RV32SFB-NEXT: bnez a6, .LBB36_2 |
| 1569 | +; RV32SFB-NEXT: # %bb.1: # %entry |
| 1570 | +; RV32SFB-NEXT: andn a4, a0, a2 |
| 1571 | +; RV32SFB-NEXT: .LBB36_2: # %entry |
| 1572 | +; RV32SFB-NEXT: bnez a6, .LBB36_4 |
| 1573 | +; RV32SFB-NEXT: # %bb.3: # %entry |
| 1574 | +; RV32SFB-NEXT: andn a5, a1, a3 |
| 1575 | +; RV32SFB-NEXT: .LBB36_4: # %entry |
| 1576 | +; RV32SFB-NEXT: mv a0, a4 |
| 1577 | +; RV32SFB-NEXT: mv a1, a5 |
| 1578 | +; RV32SFB-NEXT: ret |
| 1579 | +entry: |
| 1580 | + %0 = xor i64 %B, -1 |
| 1581 | + %1 = and i64 %A, %0 |
| 1582 | + %2 = select i1 %cond, i64 %C, i64 %1 |
| 1583 | + ret i64 %2 |
| 1584 | +} |
| 1585 | + |
| 1586 | +define i64 @select_orn(i64 %A, i64 %B, i64 %C, i1 zeroext %cond) { |
| 1587 | +; NOSFB-LABEL: select_orn: |
| 1588 | +; NOSFB: # %bb.0: # %entry |
| 1589 | +; NOSFB-NEXT: bnez a3, .LBB37_2 |
| 1590 | +; NOSFB-NEXT: # %bb.1: # %entry |
| 1591 | +; NOSFB-NEXT: orn a2, a0, a1 |
| 1592 | +; NOSFB-NEXT: .LBB37_2: # %entry |
| 1593 | +; NOSFB-NEXT: mv a0, a2 |
| 1594 | +; NOSFB-NEXT: ret |
| 1595 | +; |
| 1596 | +; RV64SFB-LABEL: select_orn: |
| 1597 | +; RV64SFB: # %bb.0: # %entry |
| 1598 | +; RV64SFB-NEXT: bnez a3, .LBB37_2 |
| 1599 | +; RV64SFB-NEXT: # %bb.1: # %entry |
| 1600 | +; RV64SFB-NEXT: orn a2, a0, a1 |
| 1601 | +; RV64SFB-NEXT: .LBB37_2: # %entry |
| 1602 | +; RV64SFB-NEXT: mv a0, a2 |
| 1603 | +; RV64SFB-NEXT: ret |
| 1604 | +; |
| 1605 | +; ZICOND-LABEL: select_orn: |
| 1606 | +; ZICOND: # %bb.0: # %entry |
| 1607 | +; ZICOND-NEXT: bnez a3, .LBB37_2 |
| 1608 | +; ZICOND-NEXT: # %bb.1: # %entry |
| 1609 | +; ZICOND-NEXT: orn a2, a0, a1 |
| 1610 | +; ZICOND-NEXT: .LBB37_2: # %entry |
| 1611 | +; ZICOND-NEXT: mv a0, a2 |
| 1612 | +; ZICOND-NEXT: ret |
| 1613 | +; |
| 1614 | +; RV32SFB-LABEL: select_orn: |
| 1615 | +; RV32SFB: # %bb.0: # %entry |
| 1616 | +; RV32SFB-NEXT: bnez a6, .LBB37_2 |
| 1617 | +; RV32SFB-NEXT: # %bb.1: # %entry |
| 1618 | +; RV32SFB-NEXT: orn a4, a0, a2 |
| 1619 | +; RV32SFB-NEXT: .LBB37_2: # %entry |
| 1620 | +; RV32SFB-NEXT: bnez a6, .LBB37_4 |
| 1621 | +; RV32SFB-NEXT: # %bb.3: # %entry |
| 1622 | +; RV32SFB-NEXT: orn a5, a1, a3 |
| 1623 | +; RV32SFB-NEXT: .LBB37_4: # %entry |
| 1624 | +; RV32SFB-NEXT: mv a0, a4 |
| 1625 | +; RV32SFB-NEXT: mv a1, a5 |
| 1626 | +; RV32SFB-NEXT: ret |
| 1627 | +entry: |
| 1628 | + %0 = xor i64 %B, -1 |
| 1629 | + %1 = or i64 %A, %0 |
| 1630 | + %2 = select i1 %cond, i64 %C, i64 %1 |
| 1631 | + ret i64 %2 |
| 1632 | +} |
| 1633 | + |
| 1634 | +define i64 @select_xnor(i64 %A, i64 %B, i64 %C, i1 zeroext %cond) { |
| 1635 | +; NOSFB-LABEL: select_xnor: |
| 1636 | +; NOSFB: # %bb.0: # %entry |
| 1637 | +; NOSFB-NEXT: bnez a3, .LBB38_2 |
| 1638 | +; NOSFB-NEXT: # %bb.1: # %entry |
| 1639 | +; NOSFB-NEXT: xnor a2, a0, a1 |
| 1640 | +; NOSFB-NEXT: .LBB38_2: # %entry |
| 1641 | +; NOSFB-NEXT: mv a0, a2 |
| 1642 | +; NOSFB-NEXT: ret |
| 1643 | +; |
| 1644 | +; RV64SFB-LABEL: select_xnor: |
| 1645 | +; RV64SFB: # %bb.0: # %entry |
| 1646 | +; RV64SFB-NEXT: bnez a3, .LBB38_2 |
| 1647 | +; RV64SFB-NEXT: # %bb.1: # %entry |
| 1648 | +; RV64SFB-NEXT: xnor a2, a0, a1 |
| 1649 | +; RV64SFB-NEXT: .LBB38_2: # %entry |
| 1650 | +; RV64SFB-NEXT: mv a0, a2 |
| 1651 | +; RV64SFB-NEXT: ret |
| 1652 | +; |
| 1653 | +; ZICOND-LABEL: select_xnor: |
| 1654 | +; ZICOND: # %bb.0: # %entry |
| 1655 | +; ZICOND-NEXT: bnez a3, .LBB38_2 |
| 1656 | +; ZICOND-NEXT: # %bb.1: # %entry |
| 1657 | +; ZICOND-NEXT: xnor a2, a0, a1 |
| 1658 | +; ZICOND-NEXT: .LBB38_2: # %entry |
| 1659 | +; ZICOND-NEXT: mv a0, a2 |
| 1660 | +; ZICOND-NEXT: ret |
| 1661 | +; |
| 1662 | +; RV32SFB-LABEL: select_xnor: |
| 1663 | +; RV32SFB: # %bb.0: # %entry |
| 1664 | +; RV32SFB-NEXT: bnez a6, .LBB38_2 |
| 1665 | +; RV32SFB-NEXT: # %bb.1: # %entry |
| 1666 | +; RV32SFB-NEXT: xnor a4, a0, a2 |
| 1667 | +; RV32SFB-NEXT: .LBB38_2: # %entry |
| 1668 | +; RV32SFB-NEXT: bnez a6, .LBB38_4 |
| 1669 | +; RV32SFB-NEXT: # %bb.3: # %entry |
| 1670 | +; RV32SFB-NEXT: xnor a5, a1, a3 |
| 1671 | +; RV32SFB-NEXT: .LBB38_4: # %entry |
| 1672 | +; RV32SFB-NEXT: mv a0, a4 |
| 1673 | +; RV32SFB-NEXT: mv a1, a5 |
| 1674 | +; RV32SFB-NEXT: ret |
| 1675 | +entry: |
| 1676 | + %0 = xor i64 %A, %B |
| 1677 | + %1 = xor i64 %0, -1 |
| 1678 | + %2 = select i1 %cond, i64 %C, i64 %1 |
| 1679 | + ret i64 %2 |
| 1680 | +} |
0 commit comments