@@ -1829,3 +1829,71 @@ define i64 @shl_31_sh3add(ptr %0, i32 signext %1) {
18291829 %6 = load i64 , ptr %5 , align 8
18301830 ret i64 %6
18311831}
1832+
1833+ define i64 @pack_i64 (i64 %a , i64 %b ) nounwind {
1834+ ; RV64I-LABEL: pack_i64:
1835+ ; RV64I: # %bb.0:
1836+ ; RV64I-NEXT: slli a0, a0, 32
1837+ ; RV64I-NEXT: srli a0, a0, 32
1838+ ; RV64I-NEXT: slli a1, a1, 32
1839+ ; RV64I-NEXT: or a0, a1, a0
1840+ ; RV64I-NEXT: ret
1841+ ;
1842+ ; RV64ZBA-LABEL: pack_i64:
1843+ ; RV64ZBA: # %bb.0:
1844+ ; RV64ZBA-NEXT: slli a1, a1, 32
1845+ ; RV64ZBA-NEXT: add.uw a0, a0, a1
1846+ ; RV64ZBA-NEXT: ret
1847+ %shl = and i64 %a , 4294967295
1848+ %shl1 = shl i64 %b , 32
1849+ %or = or i64 %shl1 , %shl
1850+ ret i64 %or
1851+ }
1852+
1853+ define i64 @pack_i64_2 (i32 signext %a , i32 signext %b ) nounwind {
1854+ ; RV64I-LABEL: pack_i64_2:
1855+ ; RV64I: # %bb.0:
1856+ ; RV64I-NEXT: slli a0, a0, 32
1857+ ; RV64I-NEXT: srli a0, a0, 32
1858+ ; RV64I-NEXT: slli a1, a1, 32
1859+ ; RV64I-NEXT: or a0, a1, a0
1860+ ; RV64I-NEXT: ret
1861+ ;
1862+ ; RV64ZBA-LABEL: pack_i64_2:
1863+ ; RV64ZBA: # %bb.0:
1864+ ; RV64ZBA-NEXT: slli a1, a1, 32
1865+ ; RV64ZBA-NEXT: add.uw a0, a0, a1
1866+ ; RV64ZBA-NEXT: ret
1867+ %zexta = zext i32 %a to i64
1868+ %zextb = zext i32 %b to i64
1869+ %shl1 = shl i64 %zextb , 32
1870+ %or = or i64 %shl1 , %zexta
1871+ ret i64 %or
1872+ }
1873+
1874+ define i64 @pack_i64_3 (i32 signext %a , i32 signext %b ) nounwind {
1875+ ; RV64I-LABEL: pack_i64_3:
1876+ ; RV64I: # %bb.0:
1877+ ; RV64I-NEXT: addi a0, a0, 1
1878+ ; RV64I-NEXT: addi a1, a1, 1
1879+ ; RV64I-NEXT: slli a0, a0, 32
1880+ ; RV64I-NEXT: srli a0, a0, 32
1881+ ; RV64I-NEXT: slli a1, a1, 32
1882+ ; RV64I-NEXT: or a0, a1, a0
1883+ ; RV64I-NEXT: ret
1884+ ;
1885+ ; RV64ZBA-LABEL: pack_i64_3:
1886+ ; RV64ZBA: # %bb.0:
1887+ ; RV64ZBA-NEXT: addi a0, a0, 1
1888+ ; RV64ZBA-NEXT: addi a1, a1, 1
1889+ ; RV64ZBA-NEXT: slli a1, a1, 32
1890+ ; RV64ZBA-NEXT: add.uw a0, a0, a1
1891+ ; RV64ZBA-NEXT: ret
1892+ %adda = add i32 %a , 1
1893+ %addb = add i32 %b , 1
1894+ %zexta = zext i32 %adda to i64
1895+ %zextb = zext i32 %addb to i64
1896+ %shl1 = shl i64 %zextb , 32
1897+ %or = or i64 %shl1 , %zexta
1898+ ret i64 %or
1899+ }
0 commit comments