Skip to content

Commit 2a7b8ab

Browse files
authored
[RISCV] Use add.uw for (or (and X, 0xFFFFFFFF), Y) if Y has zeroes in the lower 32 bits. (#65402)
1 parent 5b7982f commit 2a7b8ab

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoZb.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,9 @@ def : Pat<(i64 (add (and GPR:$rs1, 0xFFFFFFFF), non_imm12:$rs2)),
739739
(ADD_UW GPR:$rs1, GPR:$rs2)>;
740740
def : Pat<(i64 (and GPR:$rs, 0xFFFFFFFF)), (ADD_UW GPR:$rs, (XLenVT X0))>;
741741

742+
def : Pat<(i64 (or_is_add (and GPR:$rs1, 0xFFFFFFFF), non_imm12:$rs2)),
743+
(ADD_UW GPR:$rs1, GPR:$rs2)>;
744+
742745
def : Pat<(i64 (add (shl (and GPR:$rs1, 0xFFFFFFFF), (i64 1)), non_imm12:$rs2)),
743746
(SH1ADD_UW GPR:$rs1, GPR:$rs2)>;
744747
def : Pat<(i64 (add (shl (and GPR:$rs1, 0xFFFFFFFF), (i64 2)), non_imm12:$rs2)),

llvm/test/CodeGen/RISCV/rv64zba.ll

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1782,3 +1782,44 @@ define i64 @shl_31_sh3add(ptr %0, i32 signext %1) {
17821782
%6 = load i64, ptr %5, align 8
17831783
ret i64 %6
17841784
}
1785+
1786+
define i64 @pack_i64(i64 %a, i64 %b) nounwind {
1787+
; RV64I-LABEL: pack_i64:
1788+
; RV64I: # %bb.0:
1789+
; RV64I-NEXT: slli a0, a0, 32
1790+
; RV64I-NEXT: srli a0, a0, 32
1791+
; RV64I-NEXT: slli a1, a1, 32
1792+
; RV64I-NEXT: or a0, a1, a0
1793+
; RV64I-NEXT: ret
1794+
;
1795+
; RV64ZBA-LABEL: pack_i64:
1796+
; RV64ZBA: # %bb.0:
1797+
; RV64ZBA-NEXT: slli a1, a1, 32
1798+
; RV64ZBA-NEXT: add.uw a0, a0, a1
1799+
; RV64ZBA-NEXT: ret
1800+
%shl = and i64 %a, 4294967295
1801+
%shl1 = shl i64 %b, 32
1802+
%or = or i64 %shl1, %shl
1803+
ret i64 %or
1804+
}
1805+
1806+
define i64 @pack_i64_2(i32 signext %a, i32 signext %b) nounwind {
1807+
; RV64I-LABEL: pack_i64_2:
1808+
; RV64I: # %bb.0:
1809+
; RV64I-NEXT: slli a0, a0, 32
1810+
; RV64I-NEXT: srli a0, a0, 32
1811+
; RV64I-NEXT: slli a1, a1, 32
1812+
; RV64I-NEXT: or a0, a1, a0
1813+
; RV64I-NEXT: ret
1814+
;
1815+
; RV64ZBA-LABEL: pack_i64_2:
1816+
; RV64ZBA: # %bb.0:
1817+
; RV64ZBA-NEXT: slli a1, a1, 32
1818+
; RV64ZBA-NEXT: add.uw a0, a0, a1
1819+
; RV64ZBA-NEXT: ret
1820+
%zexta = zext i32 %a to i64
1821+
%zextb = zext i32 %b to i64
1822+
%shl1 = shl i64 %zextb, 32
1823+
%or = or i64 %shl1, %zexta
1824+
ret i64 %or
1825+
}

0 commit comments

Comments
 (0)