xref: /llvm-project/llvm/test/CodeGen/RISCV/memcpy-inline.ll (revision 9067070d91e9d8cdd8509ffa56a076f08a3d7281)
160450f91SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
260450f91SCraig Topper; RUN: llc < %s -mtriple=riscv32 \
3eb3f2fe4SPhilip Reames; RUN:   | FileCheck %s --check-prefixes=RV32-BOTH,RV32
460450f91SCraig Topper; RUN: llc < %s -mtriple=riscv64 \
5eb3f2fe4SPhilip Reames; RUN:   | FileCheck %s --check-prefixes=RV64-BOTH,RV64
6*9067070dSCraig Topper; RUN: llc < %s -mtriple=riscv32 -mattr=+unaligned-scalar-mem \
7eb3f2fe4SPhilip Reames; RUN:   | FileCheck %s --check-prefixes=RV32-BOTH,RV32-FAST
8*9067070dSCraig Topper; RUN: llc < %s -mtriple=riscv64 -mattr=+unaligned-scalar-mem \
9eb3f2fe4SPhilip Reames; RUN:   | FileCheck %s --check-prefixes=RV64-BOTH,RV64-FAST
1060450f91SCraig Topper
114f4f4913SPhilip Reames; ----------------------------------------------------------------------
124f4f4913SPhilip Reames; Fully unaligned cases
1360450f91SCraig Topper
144f4f4913SPhilip Reamesdefine void @unaligned_memcpy0(ptr nocapture %dest, ptr %src) nounwind {
154f4f4913SPhilip Reames; RV32-BOTH-LABEL: unaligned_memcpy0:
16eb3f2fe4SPhilip Reames; RV32-BOTH:       # %bb.0: # %entry
174f4f4913SPhilip Reames; RV32-BOTH-NEXT:    ret
1860450f91SCraig Topper;
194f4f4913SPhilip Reames; RV64-BOTH-LABEL: unaligned_memcpy0:
204f4f4913SPhilip Reames; RV64-BOTH:       # %bb.0: # %entry
214f4f4913SPhilip Reames; RV64-BOTH-NEXT:    ret
2260450f91SCraig Topperentry:
234f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 0, i1 false)
2460450f91SCraig Topper  ret void
2560450f91SCraig Topper}
2660450f91SCraig Topper
274f4f4913SPhilip Reamesdefine void @unaligned_memcpy1(ptr nocapture %dest, ptr %src) nounwind {
284f4f4913SPhilip Reames; RV32-BOTH-LABEL: unaligned_memcpy1:
294f4f4913SPhilip Reames; RV32-BOTH:       # %bb.0: # %entry
304f4f4913SPhilip Reames; RV32-BOTH-NEXT:    lbu a1, 0(a1)
314f4f4913SPhilip Reames; RV32-BOTH-NEXT:    sb a1, 0(a0)
324f4f4913SPhilip Reames; RV32-BOTH-NEXT:    ret
3360450f91SCraig Topper;
344f4f4913SPhilip Reames; RV64-BOTH-LABEL: unaligned_memcpy1:
354f4f4913SPhilip Reames; RV64-BOTH:       # %bb.0: # %entry
364f4f4913SPhilip Reames; RV64-BOTH-NEXT:    lbu a1, 0(a1)
374f4f4913SPhilip Reames; RV64-BOTH-NEXT:    sb a1, 0(a0)
384f4f4913SPhilip Reames; RV64-BOTH-NEXT:    ret
3960450f91SCraig Topperentry:
404f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 1, i1 false)
4160450f91SCraig Topper  ret void
4260450f91SCraig Topper}
4360450f91SCraig Topper
444f4f4913SPhilip Reamesdefine void @unaligned_memcpy2(ptr nocapture %dest, ptr %src) nounwind {
454f4f4913SPhilip Reames; RV32-LABEL: unaligned_memcpy2:
46eb3f2fe4SPhilip Reames; RV32:       # %bb.0: # %entry
474f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 1(a1)
484f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 1(a0)
494f4f4913SPhilip Reames; RV32-NEXT:    lbu a1, 0(a1)
50eb3f2fe4SPhilip Reames; RV32-NEXT:    sb a1, 0(a0)
51eb3f2fe4SPhilip Reames; RV32-NEXT:    ret
5260450f91SCraig Topper;
534f4f4913SPhilip Reames; RV64-LABEL: unaligned_memcpy2:
54eb3f2fe4SPhilip Reames; RV64:       # %bb.0: # %entry
554f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 1(a1)
564f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 1(a0)
574f4f4913SPhilip Reames; RV64-NEXT:    lbu a1, 0(a1)
58eb3f2fe4SPhilip Reames; RV64-NEXT:    sb a1, 0(a0)
59eb3f2fe4SPhilip Reames; RV64-NEXT:    ret
6060450f91SCraig Topper;
614f4f4913SPhilip Reames; RV32-FAST-LABEL: unaligned_memcpy2:
62eb3f2fe4SPhilip Reames; RV32-FAST:       # %bb.0: # %entry
634f4f4913SPhilip Reames; RV32-FAST-NEXT:    lh a1, 0(a1)
644f4f4913SPhilip Reames; RV32-FAST-NEXT:    sh a1, 0(a0)
654f4f4913SPhilip Reames; RV32-FAST-NEXT:    ret
664f4f4913SPhilip Reames;
674f4f4913SPhilip Reames; RV64-FAST-LABEL: unaligned_memcpy2:
684f4f4913SPhilip Reames; RV64-FAST:       # %bb.0: # %entry
694f4f4913SPhilip Reames; RV64-FAST-NEXT:    lh a1, 0(a1)
704f4f4913SPhilip Reames; RV64-FAST-NEXT:    sh a1, 0(a0)
714f4f4913SPhilip Reames; RV64-FAST-NEXT:    ret
724f4f4913SPhilip Reamesentry:
734f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 2, i1 false)
744f4f4913SPhilip Reames  ret void
754f4f4913SPhilip Reames}
764f4f4913SPhilip Reames
774f4f4913SPhilip Reamesdefine void @unaligned_memcpy3(ptr nocapture %dest, ptr %src) nounwind {
784f4f4913SPhilip Reames; RV32-LABEL: unaligned_memcpy3:
794f4f4913SPhilip Reames; RV32:       # %bb.0: # %entry
804f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 2(a1)
814f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 2(a0)
824f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 1(a1)
834f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 1(a0)
844f4f4913SPhilip Reames; RV32-NEXT:    lbu a1, 0(a1)
854f4f4913SPhilip Reames; RV32-NEXT:    sb a1, 0(a0)
864f4f4913SPhilip Reames; RV32-NEXT:    ret
874f4f4913SPhilip Reames;
884f4f4913SPhilip Reames; RV64-LABEL: unaligned_memcpy3:
894f4f4913SPhilip Reames; RV64:       # %bb.0: # %entry
904f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 2(a1)
914f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 2(a0)
924f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 1(a1)
934f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 1(a0)
944f4f4913SPhilip Reames; RV64-NEXT:    lbu a1, 0(a1)
954f4f4913SPhilip Reames; RV64-NEXT:    sb a1, 0(a0)
964f4f4913SPhilip Reames; RV64-NEXT:    ret
974f4f4913SPhilip Reames;
984f4f4913SPhilip Reames; RV32-FAST-LABEL: unaligned_memcpy3:
994f4f4913SPhilip Reames; RV32-FAST:       # %bb.0: # %entry
1004f4f4913SPhilip Reames; RV32-FAST-NEXT:    lbu a2, 2(a1)
1014f4f4913SPhilip Reames; RV32-FAST-NEXT:    sb a2, 2(a0)
1024f4f4913SPhilip Reames; RV32-FAST-NEXT:    lh a1, 0(a1)
1034f4f4913SPhilip Reames; RV32-FAST-NEXT:    sh a1, 0(a0)
1044f4f4913SPhilip Reames; RV32-FAST-NEXT:    ret
1054f4f4913SPhilip Reames;
1064f4f4913SPhilip Reames; RV64-FAST-LABEL: unaligned_memcpy3:
1074f4f4913SPhilip Reames; RV64-FAST:       # %bb.0: # %entry
1084f4f4913SPhilip Reames; RV64-FAST-NEXT:    lbu a2, 2(a1)
1094f4f4913SPhilip Reames; RV64-FAST-NEXT:    sb a2, 2(a0)
1104f4f4913SPhilip Reames; RV64-FAST-NEXT:    lh a1, 0(a1)
1114f4f4913SPhilip Reames; RV64-FAST-NEXT:    sh a1, 0(a0)
1124f4f4913SPhilip Reames; RV64-FAST-NEXT:    ret
1134f4f4913SPhilip Reamesentry:
1144f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 3, i1 false)
1154f4f4913SPhilip Reames  ret void
1164f4f4913SPhilip Reames}
1174f4f4913SPhilip Reames
1184f4f4913SPhilip Reamesdefine void @unaligned_memcpy4(ptr nocapture %dest, ptr %src) nounwind {
1194f4f4913SPhilip Reames; RV32-LABEL: unaligned_memcpy4:
1204f4f4913SPhilip Reames; RV32:       # %bb.0: # %entry
1214f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 3(a1)
1224f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 3(a0)
1234f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 2(a1)
1244f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 2(a0)
1254f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 1(a1)
1264f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 1(a0)
1274f4f4913SPhilip Reames; RV32-NEXT:    lbu a1, 0(a1)
1284f4f4913SPhilip Reames; RV32-NEXT:    sb a1, 0(a0)
1294f4f4913SPhilip Reames; RV32-NEXT:    ret
1304f4f4913SPhilip Reames;
1314f4f4913SPhilip Reames; RV64-LABEL: unaligned_memcpy4:
1324f4f4913SPhilip Reames; RV64:       # %bb.0: # %entry
1334f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 3(a1)
1344f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 3(a0)
1354f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 2(a1)
1364f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 2(a0)
1374f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 1(a1)
1384f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 1(a0)
1394f4f4913SPhilip Reames; RV64-NEXT:    lbu a1, 0(a1)
1404f4f4913SPhilip Reames; RV64-NEXT:    sb a1, 0(a0)
1414f4f4913SPhilip Reames; RV64-NEXT:    ret
1424f4f4913SPhilip Reames;
1434f4f4913SPhilip Reames; RV32-FAST-LABEL: unaligned_memcpy4:
1444f4f4913SPhilip Reames; RV32-FAST:       # %bb.0: # %entry
1454f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a1, 0(a1)
146eb3f2fe4SPhilip Reames; RV32-FAST-NEXT:    sw a1, 0(a0)
147eb3f2fe4SPhilip Reames; RV32-FAST-NEXT:    ret
14860450f91SCraig Topper;
1494f4f4913SPhilip Reames; RV64-FAST-LABEL: unaligned_memcpy4:
150eb3f2fe4SPhilip Reames; RV64-FAST:       # %bb.0: # %entry
1514f4f4913SPhilip Reames; RV64-FAST-NEXT:    lw a1, 0(a1)
152eb3f2fe4SPhilip Reames; RV64-FAST-NEXT:    sw a1, 0(a0)
153eb3f2fe4SPhilip Reames; RV64-FAST-NEXT:    ret
15460450f91SCraig Topperentry:
1554f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 4, i1 false)
15660450f91SCraig Topper  ret void
15760450f91SCraig Topper}
15860450f91SCraig Topper
1594f4f4913SPhilip Reamesdefine void @unaligned_memcpy7(ptr nocapture %dest, ptr %src) nounwind {
1604f4f4913SPhilip Reames; RV32-LABEL: unaligned_memcpy7:
161eb3f2fe4SPhilip Reames; RV32:       # %bb.0: # %entry
1624f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 6(a1)
1634f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 6(a0)
1644f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 5(a1)
1654f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 5(a0)
1664f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 4(a1)
1674f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 4(a0)
1684f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 3(a1)
1694f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 3(a0)
1704f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 2(a1)
1714f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 2(a0)
1724f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 1(a1)
1734f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 1(a0)
1744f4f4913SPhilip Reames; RV32-NEXT:    lbu a1, 0(a1)
1754f4f4913SPhilip Reames; RV32-NEXT:    sb a1, 0(a0)
176eb3f2fe4SPhilip Reames; RV32-NEXT:    ret
17760450f91SCraig Topper;
1784f4f4913SPhilip Reames; RV64-LABEL: unaligned_memcpy7:
179eb3f2fe4SPhilip Reames; RV64:       # %bb.0: # %entry
1804f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 6(a1)
1814f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 6(a0)
1824f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 5(a1)
1834f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 5(a0)
1844f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 4(a1)
1854f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 4(a0)
1864f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 3(a1)
1874f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 3(a0)
1884f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 2(a1)
1894f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 2(a0)
1904f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 1(a1)
1914f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 1(a0)
1924f4f4913SPhilip Reames; RV64-NEXT:    lbu a1, 0(a1)
1934f4f4913SPhilip Reames; RV64-NEXT:    sb a1, 0(a0)
194eb3f2fe4SPhilip Reames; RV64-NEXT:    ret
19560450f91SCraig Topper;
1964f4f4913SPhilip Reames; RV32-FAST-LABEL: unaligned_memcpy7:
197eb3f2fe4SPhilip Reames; RV32-FAST:       # %bb.0: # %entry
1984f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 3(a1)
1994f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 3(a0)
2004f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a1, 0(a1)
2014f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a1, 0(a0)
202eb3f2fe4SPhilip Reames; RV32-FAST-NEXT:    ret
20308533f8bSJake Egan;
2044f4f4913SPhilip Reames; RV64-FAST-LABEL: unaligned_memcpy7:
205eb3f2fe4SPhilip Reames; RV64-FAST:       # %bb.0: # %entry
2064f4f4913SPhilip Reames; RV64-FAST-NEXT:    lw a2, 3(a1)
2074f4f4913SPhilip Reames; RV64-FAST-NEXT:    sw a2, 3(a0)
2084f4f4913SPhilip Reames; RV64-FAST-NEXT:    lw a1, 0(a1)
2094f4f4913SPhilip Reames; RV64-FAST-NEXT:    sw a1, 0(a0)
210eb3f2fe4SPhilip Reames; RV64-FAST-NEXT:    ret
21160450f91SCraig Topperentry:
2124f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 7, i1 false)
21360450f91SCraig Topper  ret void
21460450f91SCraig Topper}
21560450f91SCraig Topper
2164f4f4913SPhilip Reamesdefine void @unaligned_memcpy8(ptr nocapture %dest, ptr %src) nounwind {
2174f4f4913SPhilip Reames; RV32-LABEL: unaligned_memcpy8:
2184f4f4913SPhilip Reames; RV32:       # %bb.0: # %entry
2194f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 7(a1)
2204f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 7(a0)
2214f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 6(a1)
2224f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 6(a0)
2234f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 5(a1)
2244f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 5(a0)
2254f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 4(a1)
2264f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 4(a0)
2274f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 3(a1)
2284f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 3(a0)
2294f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 2(a1)
2304f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 2(a0)
2314f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 1(a1)
2324f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 1(a0)
2334f4f4913SPhilip Reames; RV32-NEXT:    lbu a1, 0(a1)
2344f4f4913SPhilip Reames; RV32-NEXT:    sb a1, 0(a0)
2354f4f4913SPhilip Reames; RV32-NEXT:    ret
2364f4f4913SPhilip Reames;
2374f4f4913SPhilip Reames; RV64-LABEL: unaligned_memcpy8:
2384f4f4913SPhilip Reames; RV64:       # %bb.0: # %entry
2394f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 7(a1)
2404f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 7(a0)
2414f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 6(a1)
2424f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 6(a0)
2434f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 5(a1)
2444f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 5(a0)
2454f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 4(a1)
2464f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 4(a0)
2474f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 3(a1)
2484f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 3(a0)
2494f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 2(a1)
2504f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 2(a0)
2514f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 1(a1)
2524f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 1(a0)
2534f4f4913SPhilip Reames; RV64-NEXT:    lbu a1, 0(a1)
2544f4f4913SPhilip Reames; RV64-NEXT:    sb a1, 0(a0)
2554f4f4913SPhilip Reames; RV64-NEXT:    ret
2564f4f4913SPhilip Reames;
2574f4f4913SPhilip Reames; RV32-FAST-LABEL: unaligned_memcpy8:
2584f4f4913SPhilip Reames; RV32-FAST:       # %bb.0: # %entry
2594f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 4(a1)
2604f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 4(a0)
2614f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a1, 0(a1)
2624f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a1, 0(a0)
2634f4f4913SPhilip Reames; RV32-FAST-NEXT:    ret
2644f4f4913SPhilip Reames;
2654f4f4913SPhilip Reames; RV64-FAST-LABEL: unaligned_memcpy8:
2664f4f4913SPhilip Reames; RV64-FAST:       # %bb.0: # %entry
2674f4f4913SPhilip Reames; RV64-FAST-NEXT:    ld a1, 0(a1)
2684f4f4913SPhilip Reames; RV64-FAST-NEXT:    sd a1, 0(a0)
2694f4f4913SPhilip Reames; RV64-FAST-NEXT:    ret
2704f4f4913SPhilip Reamesentry:
2714f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 8, i1 false)
2724f4f4913SPhilip Reames  ret void
2734f4f4913SPhilip Reames}
27460450f91SCraig Topper
2754f4f4913SPhilip Reamesdefine void @unaligned_memcpy15(ptr nocapture %dest, ptr %src) nounwind {
2764f4f4913SPhilip Reames; RV32-LABEL: unaligned_memcpy15:
2774f4f4913SPhilip Reames; RV32:       # %bb.0: # %entry
2784f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 14(a1)
2794f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 14(a0)
2804f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 13(a1)
2814f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 13(a0)
2824f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 12(a1)
2834f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 12(a0)
2844f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 11(a1)
2854f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 11(a0)
2864f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 10(a1)
2874f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 10(a0)
2884f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 9(a1)
2894f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 9(a0)
2904f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 8(a1)
2914f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 8(a0)
2924f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 7(a1)
2934f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 7(a0)
2944f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 6(a1)
2954f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 6(a0)
2964f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 5(a1)
2974f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 5(a0)
2984f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 4(a1)
2994f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 4(a0)
3004f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 3(a1)
3014f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 3(a0)
3024f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 2(a1)
3034f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 2(a0)
3044f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 1(a1)
3054f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 1(a0)
3064f4f4913SPhilip Reames; RV32-NEXT:    lbu a1, 0(a1)
3074f4f4913SPhilip Reames; RV32-NEXT:    sb a1, 0(a0)
3084f4f4913SPhilip Reames; RV32-NEXT:    ret
3094f4f4913SPhilip Reames;
3104f4f4913SPhilip Reames; RV64-LABEL: unaligned_memcpy15:
3114f4f4913SPhilip Reames; RV64:       # %bb.0: # %entry
3124f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 14(a1)
3134f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 14(a0)
3144f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 13(a1)
3154f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 13(a0)
3164f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 12(a1)
3174f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 12(a0)
3184f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 11(a1)
3194f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 11(a0)
3204f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 10(a1)
3214f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 10(a0)
3224f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 9(a1)
3234f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 9(a0)
3244f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 8(a1)
3254f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 8(a0)
3264f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 7(a1)
3274f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 7(a0)
3284f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 6(a1)
3294f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 6(a0)
3304f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 5(a1)
3314f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 5(a0)
3324f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 4(a1)
3334f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 4(a0)
3344f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 3(a1)
3354f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 3(a0)
3364f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 2(a1)
3374f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 2(a0)
3384f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 1(a1)
3394f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 1(a0)
3404f4f4913SPhilip Reames; RV64-NEXT:    lbu a1, 0(a1)
3414f4f4913SPhilip Reames; RV64-NEXT:    sb a1, 0(a0)
3424f4f4913SPhilip Reames; RV64-NEXT:    ret
3434f4f4913SPhilip Reames;
3444f4f4913SPhilip Reames; RV32-FAST-LABEL: unaligned_memcpy15:
3454f4f4913SPhilip Reames; RV32-FAST:       # %bb.0: # %entry
3464f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 11(a1)
3474f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 11(a0)
3484f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 8(a1)
3494f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 8(a0)
3504f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 4(a1)
3514f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 4(a0)
3524f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a1, 0(a1)
3534f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a1, 0(a0)
3544f4f4913SPhilip Reames; RV32-FAST-NEXT:    ret
3554f4f4913SPhilip Reames;
3564f4f4913SPhilip Reames; RV64-FAST-LABEL: unaligned_memcpy15:
3574f4f4913SPhilip Reames; RV64-FAST:       # %bb.0: # %entry
3584f4f4913SPhilip Reames; RV64-FAST-NEXT:    ld a2, 7(a1)
3594f4f4913SPhilip Reames; RV64-FAST-NEXT:    sd a2, 7(a0)
3604f4f4913SPhilip Reames; RV64-FAST-NEXT:    ld a1, 0(a1)
3614f4f4913SPhilip Reames; RV64-FAST-NEXT:    sd a1, 0(a0)
3624f4f4913SPhilip Reames; RV64-FAST-NEXT:    ret
3634f4f4913SPhilip Reamesentry:
3644f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 15, i1 false)
3654f4f4913SPhilip Reames  ret void
3664f4f4913SPhilip Reames}
3674f4f4913SPhilip Reames
3684f4f4913SPhilip Reamesdefine void @unaligned_memcpy16(ptr nocapture %dest, ptr %src) nounwind {
3694f4f4913SPhilip Reames; RV32-LABEL: unaligned_memcpy16:
3704f4f4913SPhilip Reames; RV32:       # %bb.0: # %entry
3714f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 15(a1)
3724f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 15(a0)
3734f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 14(a1)
3744f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 14(a0)
3754f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 13(a1)
3764f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 13(a0)
3774f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 12(a1)
3784f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 12(a0)
3794f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 11(a1)
3804f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 11(a0)
3814f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 10(a1)
3824f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 10(a0)
3834f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 9(a1)
3844f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 9(a0)
3854f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 8(a1)
3864f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 8(a0)
3874f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 7(a1)
3884f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 7(a0)
3894f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 6(a1)
3904f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 6(a0)
3914f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 5(a1)
3924f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 5(a0)
3934f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 4(a1)
3944f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 4(a0)
3954f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 3(a1)
3964f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 3(a0)
3974f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 2(a1)
3984f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 2(a0)
3994f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 1(a1)
4004f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 1(a0)
4014f4f4913SPhilip Reames; RV32-NEXT:    lbu a1, 0(a1)
4024f4f4913SPhilip Reames; RV32-NEXT:    sb a1, 0(a0)
4034f4f4913SPhilip Reames; RV32-NEXT:    ret
4044f4f4913SPhilip Reames;
4054f4f4913SPhilip Reames; RV64-LABEL: unaligned_memcpy16:
4064f4f4913SPhilip Reames; RV64:       # %bb.0: # %entry
4074f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 15(a1)
4084f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 15(a0)
4094f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 14(a1)
4104f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 14(a0)
4114f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 13(a1)
4124f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 13(a0)
4134f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 12(a1)
4144f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 12(a0)
4154f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 11(a1)
4164f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 11(a0)
4174f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 10(a1)
4184f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 10(a0)
4194f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 9(a1)
4204f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 9(a0)
4214f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 8(a1)
4224f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 8(a0)
4234f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 7(a1)
4244f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 7(a0)
4254f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 6(a1)
4264f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 6(a0)
4274f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 5(a1)
4284f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 5(a0)
4294f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 4(a1)
4304f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 4(a0)
4314f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 3(a1)
4324f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 3(a0)
4334f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 2(a1)
4344f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 2(a0)
4354f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 1(a1)
4364f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 1(a0)
4374f4f4913SPhilip Reames; RV64-NEXT:    lbu a1, 0(a1)
4384f4f4913SPhilip Reames; RV64-NEXT:    sb a1, 0(a0)
4394f4f4913SPhilip Reames; RV64-NEXT:    ret
4404f4f4913SPhilip Reames;
4414f4f4913SPhilip Reames; RV32-FAST-LABEL: unaligned_memcpy16:
4424f4f4913SPhilip Reames; RV32-FAST:       # %bb.0: # %entry
4434f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 12(a1)
4444f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 12(a0)
4454f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 8(a1)
4464f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 8(a0)
4474f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 4(a1)
4484f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 4(a0)
4494f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a1, 0(a1)
4504f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a1, 0(a0)
4514f4f4913SPhilip Reames; RV32-FAST-NEXT:    ret
4524f4f4913SPhilip Reames;
4534f4f4913SPhilip Reames; RV64-FAST-LABEL: unaligned_memcpy16:
4544f4f4913SPhilip Reames; RV64-FAST:       # %bb.0: # %entry
4554f4f4913SPhilip Reames; RV64-FAST-NEXT:    ld a2, 8(a1)
4564f4f4913SPhilip Reames; RV64-FAST-NEXT:    sd a2, 8(a0)
4574f4f4913SPhilip Reames; RV64-FAST-NEXT:    ld a1, 0(a1)
4584f4f4913SPhilip Reames; RV64-FAST-NEXT:    sd a1, 0(a0)
4594f4f4913SPhilip Reames; RV64-FAST-NEXT:    ret
4604f4f4913SPhilip Reamesentry:
4614f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 16, i1 false)
4624f4f4913SPhilip Reames  ret void
4634f4f4913SPhilip Reames}
4644f4f4913SPhilip Reames
4654f4f4913SPhilip Reamesdefine void @unaligned_memcpy31(ptr nocapture %dest, ptr %src) nounwind {
4664f4f4913SPhilip Reames; RV32-LABEL: unaligned_memcpy31:
4674f4f4913SPhilip Reames; RV32:       # %bb.0: # %entry
4684f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 30(a1)
4694f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 30(a0)
4704f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 29(a1)
4714f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 29(a0)
4724f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 28(a1)
4734f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 28(a0)
4744f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 27(a1)
4754f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 27(a0)
4764f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 26(a1)
4774f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 26(a0)
4784f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 25(a1)
4794f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 25(a0)
4804f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 24(a1)
4814f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 24(a0)
4824f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 23(a1)
4834f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 23(a0)
4844f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 22(a1)
4854f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 22(a0)
4864f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 21(a1)
4874f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 21(a0)
4884f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 20(a1)
4894f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 20(a0)
4904f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 19(a1)
4914f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 19(a0)
4924f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 18(a1)
4934f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 18(a0)
4944f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 17(a1)
4954f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 17(a0)
4964f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 16(a1)
4974f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 16(a0)
4984f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 15(a1)
4994f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 15(a0)
5004f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 14(a1)
5014f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 14(a0)
5024f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 13(a1)
5034f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 13(a0)
5044f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 12(a1)
5054f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 12(a0)
5064f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 11(a1)
5074f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 11(a0)
5084f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 10(a1)
5094f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 10(a0)
5104f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 9(a1)
5114f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 9(a0)
5124f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 8(a1)
5134f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 8(a0)
5144f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 7(a1)
5154f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 7(a0)
5164f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 6(a1)
5174f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 6(a0)
5184f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 5(a1)
5194f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 5(a0)
5204f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 4(a1)
5214f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 4(a0)
5224f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 3(a1)
5234f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 3(a0)
5244f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 2(a1)
5254f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 2(a0)
5264f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 1(a1)
5274f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 1(a0)
5284f4f4913SPhilip Reames; RV32-NEXT:    lbu a1, 0(a1)
5294f4f4913SPhilip Reames; RV32-NEXT:    sb a1, 0(a0)
5304f4f4913SPhilip Reames; RV32-NEXT:    ret
5314f4f4913SPhilip Reames;
5324f4f4913SPhilip Reames; RV64-LABEL: unaligned_memcpy31:
5334f4f4913SPhilip Reames; RV64:       # %bb.0: # %entry
5344f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 30(a1)
5354f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 30(a0)
5364f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 29(a1)
5374f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 29(a0)
5384f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 28(a1)
5394f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 28(a0)
5404f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 27(a1)
5414f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 27(a0)
5424f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 26(a1)
5434f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 26(a0)
5444f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 25(a1)
5454f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 25(a0)
5464f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 24(a1)
5474f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 24(a0)
5484f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 23(a1)
5494f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 23(a0)
5504f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 22(a1)
5514f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 22(a0)
5524f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 21(a1)
5534f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 21(a0)
5544f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 20(a1)
5554f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 20(a0)
5564f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 19(a1)
5574f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 19(a0)
5584f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 18(a1)
5594f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 18(a0)
5604f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 17(a1)
5614f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 17(a0)
5624f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 16(a1)
5634f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 16(a0)
5644f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 15(a1)
5654f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 15(a0)
5664f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 14(a1)
5674f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 14(a0)
5684f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 13(a1)
5694f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 13(a0)
5704f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 12(a1)
5714f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 12(a0)
5724f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 11(a1)
5734f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 11(a0)
5744f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 10(a1)
5754f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 10(a0)
5764f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 9(a1)
5774f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 9(a0)
5784f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 8(a1)
5794f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 8(a0)
5804f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 7(a1)
5814f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 7(a0)
5824f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 6(a1)
5834f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 6(a0)
5844f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 5(a1)
5854f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 5(a0)
5864f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 4(a1)
5874f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 4(a0)
5884f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 3(a1)
5894f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 3(a0)
5904f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 2(a1)
5914f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 2(a0)
5924f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 1(a1)
5934f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 1(a0)
5944f4f4913SPhilip Reames; RV64-NEXT:    lbu a1, 0(a1)
5954f4f4913SPhilip Reames; RV64-NEXT:    sb a1, 0(a0)
5964f4f4913SPhilip Reames; RV64-NEXT:    ret
5974f4f4913SPhilip Reames;
5984f4f4913SPhilip Reames; RV32-FAST-LABEL: unaligned_memcpy31:
5994f4f4913SPhilip Reames; RV32-FAST:       # %bb.0: # %entry
6004f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 27(a1)
6014f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 27(a0)
6024f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 24(a1)
6034f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 24(a0)
6044f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 20(a1)
6054f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 20(a0)
6064f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 16(a1)
6074f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 16(a0)
6084f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 12(a1)
6094f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 12(a0)
6104f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 8(a1)
6114f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 8(a0)
6124f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 4(a1)
6134f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 4(a0)
6144f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a1, 0(a1)
6154f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a1, 0(a0)
6164f4f4913SPhilip Reames; RV32-FAST-NEXT:    ret
6174f4f4913SPhilip Reames;
6184f4f4913SPhilip Reames; RV64-FAST-LABEL: unaligned_memcpy31:
6194f4f4913SPhilip Reames; RV64-FAST:       # %bb.0: # %entry
6204f4f4913SPhilip Reames; RV64-FAST-NEXT:    ld a2, 23(a1)
6214f4f4913SPhilip Reames; RV64-FAST-NEXT:    sd a2, 23(a0)
6224f4f4913SPhilip Reames; RV64-FAST-NEXT:    ld a2, 16(a1)
6234f4f4913SPhilip Reames; RV64-FAST-NEXT:    sd a2, 16(a0)
6244f4f4913SPhilip Reames; RV64-FAST-NEXT:    ld a2, 8(a1)
6254f4f4913SPhilip Reames; RV64-FAST-NEXT:    sd a2, 8(a0)
6264f4f4913SPhilip Reames; RV64-FAST-NEXT:    ld a1, 0(a1)
6274f4f4913SPhilip Reames; RV64-FAST-NEXT:    sd a1, 0(a0)
6284f4f4913SPhilip Reames; RV64-FAST-NEXT:    ret
6294f4f4913SPhilip Reamesentry:
6304f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 31, i1 false)
6314f4f4913SPhilip Reames  ret void
6324f4f4913SPhilip Reames}
6334f4f4913SPhilip Reames
6344f4f4913SPhilip Reames; ----------------------------------------------------------------------
6354f4f4913SPhilip Reames; Fully aligned cases
6364f4f4913SPhilip Reames
6374f4f4913SPhilip Reamesdefine void @aligned_memcpy0(ptr nocapture %dest, ptr %src) nounwind {
6384f4f4913SPhilip Reames; RV32-BOTH-LABEL: aligned_memcpy0:
6394f4f4913SPhilip Reames; RV32-BOTH:       # %bb.0: # %entry
6404f4f4913SPhilip Reames; RV32-BOTH-NEXT:    ret
6414f4f4913SPhilip Reames;
6424f4f4913SPhilip Reames; RV64-BOTH-LABEL: aligned_memcpy0:
6434f4f4913SPhilip Reames; RV64-BOTH:       # %bb.0: # %entry
6444f4f4913SPhilip Reames; RV64-BOTH-NEXT:    ret
6454f4f4913SPhilip Reamesentry:
6464f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 0, i1 false)
6474f4f4913SPhilip Reames  ret void
6484f4f4913SPhilip Reames}
6494f4f4913SPhilip Reames
6504f4f4913SPhilip Reamesdefine void @aligned_memcpy1(ptr nocapture %dest, ptr %src) nounwind {
6514f4f4913SPhilip Reames; RV32-BOTH-LABEL: aligned_memcpy1:
6524f4f4913SPhilip Reames; RV32-BOTH:       # %bb.0: # %entry
6534f4f4913SPhilip Reames; RV32-BOTH-NEXT:    lbu a1, 0(a1)
6544f4f4913SPhilip Reames; RV32-BOTH-NEXT:    sb a1, 0(a0)
6554f4f4913SPhilip Reames; RV32-BOTH-NEXT:    ret
6564f4f4913SPhilip Reames;
6574f4f4913SPhilip Reames; RV64-BOTH-LABEL: aligned_memcpy1:
6584f4f4913SPhilip Reames; RV64-BOTH:       # %bb.0: # %entry
6594f4f4913SPhilip Reames; RV64-BOTH-NEXT:    lbu a1, 0(a1)
6604f4f4913SPhilip Reames; RV64-BOTH-NEXT:    sb a1, 0(a0)
6614f4f4913SPhilip Reames; RV64-BOTH-NEXT:    ret
6624f4f4913SPhilip Reamesentry:
6634f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 1, i1 false)
6644f4f4913SPhilip Reames  ret void
6654f4f4913SPhilip Reames}
6664f4f4913SPhilip Reames
6674f4f4913SPhilip Reamesdefine void @aligned_memcpy2(ptr nocapture %dest, ptr %src) nounwind {
6684f4f4913SPhilip Reames; RV32-BOTH-LABEL: aligned_memcpy2:
6694f4f4913SPhilip Reames; RV32-BOTH:       # %bb.0: # %entry
6704f4f4913SPhilip Reames; RV32-BOTH-NEXT:    lh a1, 0(a1)
6714f4f4913SPhilip Reames; RV32-BOTH-NEXT:    sh a1, 0(a0)
6724f4f4913SPhilip Reames; RV32-BOTH-NEXT:    ret
6734f4f4913SPhilip Reames;
6744f4f4913SPhilip Reames; RV64-BOTH-LABEL: aligned_memcpy2:
6754f4f4913SPhilip Reames; RV64-BOTH:       # %bb.0: # %entry
6764f4f4913SPhilip Reames; RV64-BOTH-NEXT:    lh a1, 0(a1)
6774f4f4913SPhilip Reames; RV64-BOTH-NEXT:    sh a1, 0(a0)
6784f4f4913SPhilip Reames; RV64-BOTH-NEXT:    ret
6794f4f4913SPhilip Reamesentry:
6804f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 2, i1 false)
6814f4f4913SPhilip Reames  ret void
6824f4f4913SPhilip Reames}
6834f4f4913SPhilip Reames
6844f4f4913SPhilip Reamesdefine void @aligned_memcpy3(ptr nocapture %dest, ptr %src) nounwind {
6854f4f4913SPhilip Reames; RV32-BOTH-LABEL: aligned_memcpy3:
6864f4f4913SPhilip Reames; RV32-BOTH:       # %bb.0: # %entry
6874f4f4913SPhilip Reames; RV32-BOTH-NEXT:    lbu a2, 2(a1)
6884f4f4913SPhilip Reames; RV32-BOTH-NEXT:    sb a2, 2(a0)
6894f4f4913SPhilip Reames; RV32-BOTH-NEXT:    lh a1, 0(a1)
6904f4f4913SPhilip Reames; RV32-BOTH-NEXT:    sh a1, 0(a0)
6914f4f4913SPhilip Reames; RV32-BOTH-NEXT:    ret
6924f4f4913SPhilip Reames;
6934f4f4913SPhilip Reames; RV64-BOTH-LABEL: aligned_memcpy3:
6944f4f4913SPhilip Reames; RV64-BOTH:       # %bb.0: # %entry
6954f4f4913SPhilip Reames; RV64-BOTH-NEXT:    lbu a2, 2(a1)
6964f4f4913SPhilip Reames; RV64-BOTH-NEXT:    sb a2, 2(a0)
6974f4f4913SPhilip Reames; RV64-BOTH-NEXT:    lh a1, 0(a1)
6984f4f4913SPhilip Reames; RV64-BOTH-NEXT:    sh a1, 0(a0)
6994f4f4913SPhilip Reames; RV64-BOTH-NEXT:    ret
7004f4f4913SPhilip Reamesentry:
7014f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 3, i1 false)
7024f4f4913SPhilip Reames  ret void
7034f4f4913SPhilip Reames}
7044f4f4913SPhilip Reames
7054f4f4913SPhilip Reamesdefine void @aligned_memcpy4(ptr nocapture %dest, ptr %src) nounwind {
7064f4f4913SPhilip Reames; RV32-BOTH-LABEL: aligned_memcpy4:
7074f4f4913SPhilip Reames; RV32-BOTH:       # %bb.0: # %entry
7084f4f4913SPhilip Reames; RV32-BOTH-NEXT:    lw a1, 0(a1)
7094f4f4913SPhilip Reames; RV32-BOTH-NEXT:    sw a1, 0(a0)
7104f4f4913SPhilip Reames; RV32-BOTH-NEXT:    ret
7114f4f4913SPhilip Reames;
7124f4f4913SPhilip Reames; RV64-BOTH-LABEL: aligned_memcpy4:
7134f4f4913SPhilip Reames; RV64-BOTH:       # %bb.0: # %entry
7144f4f4913SPhilip Reames; RV64-BOTH-NEXT:    lw a1, 0(a1)
7154f4f4913SPhilip Reames; RV64-BOTH-NEXT:    sw a1, 0(a0)
7164f4f4913SPhilip Reames; RV64-BOTH-NEXT:    ret
7174f4f4913SPhilip Reamesentry:
7184f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 4, i1 false)
7194f4f4913SPhilip Reames  ret void
7204f4f4913SPhilip Reames}
7214f4f4913SPhilip Reames
7224f4f4913SPhilip Reamesdefine void @aligned_memcpy7(ptr nocapture %dest, ptr %src) nounwind {
7234f4f4913SPhilip Reames; RV32-LABEL: aligned_memcpy7:
7244f4f4913SPhilip Reames; RV32:       # %bb.0: # %entry
7254f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 6(a1)
7264f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 6(a0)
7274f4f4913SPhilip Reames; RV32-NEXT:    lh a2, 4(a1)
7284f4f4913SPhilip Reames; RV32-NEXT:    sh a2, 4(a0)
7294f4f4913SPhilip Reames; RV32-NEXT:    lw a1, 0(a1)
7304f4f4913SPhilip Reames; RV32-NEXT:    sw a1, 0(a0)
7314f4f4913SPhilip Reames; RV32-NEXT:    ret
7324f4f4913SPhilip Reames;
7334f4f4913SPhilip Reames; RV64-LABEL: aligned_memcpy7:
7344f4f4913SPhilip Reames; RV64:       # %bb.0: # %entry
7354f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 6(a1)
7364f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 6(a0)
7374f4f4913SPhilip Reames; RV64-NEXT:    lh a2, 4(a1)
7384f4f4913SPhilip Reames; RV64-NEXT:    sh a2, 4(a0)
7394f4f4913SPhilip Reames; RV64-NEXT:    lw a1, 0(a1)
7404f4f4913SPhilip Reames; RV64-NEXT:    sw a1, 0(a0)
7414f4f4913SPhilip Reames; RV64-NEXT:    ret
7424f4f4913SPhilip Reames;
7434f4f4913SPhilip Reames; RV32-FAST-LABEL: aligned_memcpy7:
7444f4f4913SPhilip Reames; RV32-FAST:       # %bb.0: # %entry
7454f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 3(a1)
7464f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 3(a0)
7474f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a1, 0(a1)
7484f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a1, 0(a0)
7494f4f4913SPhilip Reames; RV32-FAST-NEXT:    ret
7504f4f4913SPhilip Reames;
7514f4f4913SPhilip Reames; RV64-FAST-LABEL: aligned_memcpy7:
7524f4f4913SPhilip Reames; RV64-FAST:       # %bb.0: # %entry
7534f4f4913SPhilip Reames; RV64-FAST-NEXT:    lw a2, 3(a1)
7544f4f4913SPhilip Reames; RV64-FAST-NEXT:    sw a2, 3(a0)
7554f4f4913SPhilip Reames; RV64-FAST-NEXT:    lw a1, 0(a1)
7564f4f4913SPhilip Reames; RV64-FAST-NEXT:    sw a1, 0(a0)
7574f4f4913SPhilip Reames; RV64-FAST-NEXT:    ret
7584f4f4913SPhilip Reamesentry:
7594f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 7, i1 false)
7604f4f4913SPhilip Reames  ret void
7614f4f4913SPhilip Reames}
7624f4f4913SPhilip Reames
7634f4f4913SPhilip Reamesdefine void @aligned_memcpy8(ptr nocapture %dest, ptr %src) nounwind {
7644f4f4913SPhilip Reames; RV32-BOTH-LABEL: aligned_memcpy8:
7654f4f4913SPhilip Reames; RV32-BOTH:       # %bb.0: # %entry
7664f4f4913SPhilip Reames; RV32-BOTH-NEXT:    lw a2, 4(a1)
7674f4f4913SPhilip Reames; RV32-BOTH-NEXT:    sw a2, 4(a0)
7684f4f4913SPhilip Reames; RV32-BOTH-NEXT:    lw a1, 0(a1)
7694f4f4913SPhilip Reames; RV32-BOTH-NEXT:    sw a1, 0(a0)
7704f4f4913SPhilip Reames; RV32-BOTH-NEXT:    ret
7714f4f4913SPhilip Reames;
7724f4f4913SPhilip Reames; RV64-BOTH-LABEL: aligned_memcpy8:
7734f4f4913SPhilip Reames; RV64-BOTH:       # %bb.0: # %entry
7744f4f4913SPhilip Reames; RV64-BOTH-NEXT:    ld a1, 0(a1)
7754f4f4913SPhilip Reames; RV64-BOTH-NEXT:    sd a1, 0(a0)
7764f4f4913SPhilip Reames; RV64-BOTH-NEXT:    ret
7774f4f4913SPhilip Reamesentry:
7784f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 8, i1 false)
7794f4f4913SPhilip Reames  ret void
7804f4f4913SPhilip Reames}
7814f4f4913SPhilip Reames
7824f4f4913SPhilip Reamesdefine void @aligned_memcpy15(ptr nocapture %dest, ptr %src) nounwind {
7834f4f4913SPhilip Reames; RV32-LABEL: aligned_memcpy15:
7844f4f4913SPhilip Reames; RV32:       # %bb.0: # %entry
7854f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 14(a1)
7864f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 14(a0)
7874f4f4913SPhilip Reames; RV32-NEXT:    lh a2, 12(a1)
7884f4f4913SPhilip Reames; RV32-NEXT:    sh a2, 12(a0)
7894f4f4913SPhilip Reames; RV32-NEXT:    lw a2, 8(a1)
7904f4f4913SPhilip Reames; RV32-NEXT:    sw a2, 8(a0)
7914f4f4913SPhilip Reames; RV32-NEXT:    lw a2, 4(a1)
7924f4f4913SPhilip Reames; RV32-NEXT:    sw a2, 4(a0)
7934f4f4913SPhilip Reames; RV32-NEXT:    lw a1, 0(a1)
7944f4f4913SPhilip Reames; RV32-NEXT:    sw a1, 0(a0)
7954f4f4913SPhilip Reames; RV32-NEXT:    ret
7964f4f4913SPhilip Reames;
7974f4f4913SPhilip Reames; RV64-LABEL: aligned_memcpy15:
7984f4f4913SPhilip Reames; RV64:       # %bb.0: # %entry
7994f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 14(a1)
8004f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 14(a0)
8014f4f4913SPhilip Reames; RV64-NEXT:    lh a2, 12(a1)
8024f4f4913SPhilip Reames; RV64-NEXT:    sh a2, 12(a0)
8034f4f4913SPhilip Reames; RV64-NEXT:    lw a2, 8(a1)
8044f4f4913SPhilip Reames; RV64-NEXT:    sw a2, 8(a0)
8054f4f4913SPhilip Reames; RV64-NEXT:    ld a1, 0(a1)
8064f4f4913SPhilip Reames; RV64-NEXT:    sd a1, 0(a0)
8074f4f4913SPhilip Reames; RV64-NEXT:    ret
8084f4f4913SPhilip Reames;
8094f4f4913SPhilip Reames; RV32-FAST-LABEL: aligned_memcpy15:
8104f4f4913SPhilip Reames; RV32-FAST:       # %bb.0: # %entry
8114f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 11(a1)
8124f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 11(a0)
8134f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 8(a1)
8144f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 8(a0)
8154f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 4(a1)
8164f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 4(a0)
8174f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a1, 0(a1)
8184f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a1, 0(a0)
8194f4f4913SPhilip Reames; RV32-FAST-NEXT:    ret
8204f4f4913SPhilip Reames;
8214f4f4913SPhilip Reames; RV64-FAST-LABEL: aligned_memcpy15:
8224f4f4913SPhilip Reames; RV64-FAST:       # %bb.0: # %entry
8234f4f4913SPhilip Reames; RV64-FAST-NEXT:    ld a2, 7(a1)
8244f4f4913SPhilip Reames; RV64-FAST-NEXT:    sd a2, 7(a0)
8254f4f4913SPhilip Reames; RV64-FAST-NEXT:    ld a1, 0(a1)
8264f4f4913SPhilip Reames; RV64-FAST-NEXT:    sd a1, 0(a0)
8274f4f4913SPhilip Reames; RV64-FAST-NEXT:    ret
8284f4f4913SPhilip Reamesentry:
8294f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 15, i1 false)
8304f4f4913SPhilip Reames  ret void
8314f4f4913SPhilip Reames}
8324f4f4913SPhilip Reames
8334f4f4913SPhilip Reamesdefine void @aligned_memcpy16(ptr nocapture %dest, ptr %src) nounwind {
8344f4f4913SPhilip Reames; RV32-BOTH-LABEL: aligned_memcpy16:
835eb3f2fe4SPhilip Reames; RV32-BOTH:       # %bb.0: # %entry
836eb3f2fe4SPhilip Reames; RV32-BOTH-NEXT:    lw a2, 12(a1)
837eb3f2fe4SPhilip Reames; RV32-BOTH-NEXT:    sw a2, 12(a0)
838eb3f2fe4SPhilip Reames; RV32-BOTH-NEXT:    lw a2, 8(a1)
839eb3f2fe4SPhilip Reames; RV32-BOTH-NEXT:    sw a2, 8(a0)
840eb3f2fe4SPhilip Reames; RV32-BOTH-NEXT:    lw a2, 4(a1)
841eb3f2fe4SPhilip Reames; RV32-BOTH-NEXT:    sw a2, 4(a0)
842eb3f2fe4SPhilip Reames; RV32-BOTH-NEXT:    lw a1, 0(a1)
843eb3f2fe4SPhilip Reames; RV32-BOTH-NEXT:    sw a1, 0(a0)
844eb3f2fe4SPhilip Reames; RV32-BOTH-NEXT:    ret
84560450f91SCraig Topper;
8464f4f4913SPhilip Reames; RV64-BOTH-LABEL: aligned_memcpy16:
8474f4f4913SPhilip Reames; RV64-BOTH:       # %bb.0: # %entry
8484f4f4913SPhilip Reames; RV64-BOTH-NEXT:    ld a2, 8(a1)
8494f4f4913SPhilip Reames; RV64-BOTH-NEXT:    sd a2, 8(a0)
8504f4f4913SPhilip Reames; RV64-BOTH-NEXT:    ld a1, 0(a1)
8514f4f4913SPhilip Reames; RV64-BOTH-NEXT:    sd a1, 0(a0)
8524f4f4913SPhilip Reames; RV64-BOTH-NEXT:    ret
8534f4f4913SPhilip Reamesentry:
8544f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 16, i1 false)
8554f4f4913SPhilip Reames  ret void
8564f4f4913SPhilip Reames}
8574f4f4913SPhilip Reames
8584f4f4913SPhilip Reamesdefine void @aligned_memcpy31(ptr nocapture %dest, ptr %src) nounwind {
8594f4f4913SPhilip Reames; RV32-LABEL: aligned_memcpy31:
8604f4f4913SPhilip Reames; RV32:       # %bb.0: # %entry
8614f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 30(a1)
8624f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 30(a0)
8634f4f4913SPhilip Reames; RV32-NEXT:    lh a2, 28(a1)
8644f4f4913SPhilip Reames; RV32-NEXT:    sh a2, 28(a0)
8654f4f4913SPhilip Reames; RV32-NEXT:    lw a2, 24(a1)
8664f4f4913SPhilip Reames; RV32-NEXT:    sw a2, 24(a0)
8674f4f4913SPhilip Reames; RV32-NEXT:    lw a2, 20(a1)
8684f4f4913SPhilip Reames; RV32-NEXT:    sw a2, 20(a0)
8694f4f4913SPhilip Reames; RV32-NEXT:    lw a2, 16(a1)
8704f4f4913SPhilip Reames; RV32-NEXT:    sw a2, 16(a0)
8714f4f4913SPhilip Reames; RV32-NEXT:    lw a2, 12(a1)
8724f4f4913SPhilip Reames; RV32-NEXT:    sw a2, 12(a0)
8734f4f4913SPhilip Reames; RV32-NEXT:    lw a2, 8(a1)
8744f4f4913SPhilip Reames; RV32-NEXT:    sw a2, 8(a0)
8754f4f4913SPhilip Reames; RV32-NEXT:    lw a2, 4(a1)
8764f4f4913SPhilip Reames; RV32-NEXT:    sw a2, 4(a0)
8774f4f4913SPhilip Reames; RV32-NEXT:    lw a1, 0(a1)
8784f4f4913SPhilip Reames; RV32-NEXT:    sw a1, 0(a0)
8794f4f4913SPhilip Reames; RV32-NEXT:    ret
8804f4f4913SPhilip Reames;
8814f4f4913SPhilip Reames; RV64-LABEL: aligned_memcpy31:
8824f4f4913SPhilip Reames; RV64:       # %bb.0: # %entry
8834f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 30(a1)
8844f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 30(a0)
8854f4f4913SPhilip Reames; RV64-NEXT:    lh a2, 28(a1)
8864f4f4913SPhilip Reames; RV64-NEXT:    sh a2, 28(a0)
8874f4f4913SPhilip Reames; RV64-NEXT:    lw a2, 24(a1)
8884f4f4913SPhilip Reames; RV64-NEXT:    sw a2, 24(a0)
8894f4f4913SPhilip Reames; RV64-NEXT:    ld a2, 16(a1)
8904f4f4913SPhilip Reames; RV64-NEXT:    sd a2, 16(a0)
8914f4f4913SPhilip Reames; RV64-NEXT:    ld a2, 8(a1)
8924f4f4913SPhilip Reames; RV64-NEXT:    sd a2, 8(a0)
8934f4f4913SPhilip Reames; RV64-NEXT:    ld a1, 0(a1)
8944f4f4913SPhilip Reames; RV64-NEXT:    sd a1, 0(a0)
8954f4f4913SPhilip Reames; RV64-NEXT:    ret
8964f4f4913SPhilip Reames;
8974f4f4913SPhilip Reames; RV32-FAST-LABEL: aligned_memcpy31:
8984f4f4913SPhilip Reames; RV32-FAST:       # %bb.0: # %entry
8994f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 27(a1)
9004f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 27(a0)
9014f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 24(a1)
9024f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 24(a0)
9034f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 20(a1)
9044f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 20(a0)
9054f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 16(a1)
9064f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 16(a0)
9074f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 12(a1)
9084f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 12(a0)
9094f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 8(a1)
9104f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 8(a0)
9114f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 4(a1)
9124f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 4(a0)
9134f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a1, 0(a1)
9144f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a1, 0(a0)
9154f4f4913SPhilip Reames; RV32-FAST-NEXT:    ret
9164f4f4913SPhilip Reames;
9174f4f4913SPhilip Reames; RV64-FAST-LABEL: aligned_memcpy31:
9184f4f4913SPhilip Reames; RV64-FAST:       # %bb.0: # %entry
9194f4f4913SPhilip Reames; RV64-FAST-NEXT:    ld a2, 23(a1)
9204f4f4913SPhilip Reames; RV64-FAST-NEXT:    sd a2, 23(a0)
9214f4f4913SPhilip Reames; RV64-FAST-NEXT:    ld a2, 16(a1)
9224f4f4913SPhilip Reames; RV64-FAST-NEXT:    sd a2, 16(a0)
9234f4f4913SPhilip Reames; RV64-FAST-NEXT:    ld a2, 8(a1)
9244f4f4913SPhilip Reames; RV64-FAST-NEXT:    sd a2, 8(a0)
9254f4f4913SPhilip Reames; RV64-FAST-NEXT:    ld a1, 0(a1)
9264f4f4913SPhilip Reames; RV64-FAST-NEXT:    sd a1, 0(a0)
9274f4f4913SPhilip Reames; RV64-FAST-NEXT:    ret
9284f4f4913SPhilip Reamesentry:
9294f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 31, i1 false)
9304f4f4913SPhilip Reames  ret void
9314f4f4913SPhilip Reames}
9324f4f4913SPhilip Reames
9334f4f4913SPhilip Reames; ------------------------------------------------------------------------
9344f4f4913SPhilip Reames; A few partially aligned cases
9354f4f4913SPhilip Reames
9364f4f4913SPhilip Reames
9374f4f4913SPhilip Reamesdefine void @memcpy16_align4(ptr nocapture %dest, ptr nocapture %src) nounwind {
9384f4f4913SPhilip Reames; RV32-BOTH-LABEL: memcpy16_align4:
9394f4f4913SPhilip Reames; RV32-BOTH:       # %bb.0: # %entry
9404f4f4913SPhilip Reames; RV32-BOTH-NEXT:    lw a2, 12(a1)
9414f4f4913SPhilip Reames; RV32-BOTH-NEXT:    sw a2, 12(a0)
9424f4f4913SPhilip Reames; RV32-BOTH-NEXT:    lw a2, 8(a1)
9434f4f4913SPhilip Reames; RV32-BOTH-NEXT:    sw a2, 8(a0)
9444f4f4913SPhilip Reames; RV32-BOTH-NEXT:    lw a2, 4(a1)
9454f4f4913SPhilip Reames; RV32-BOTH-NEXT:    sw a2, 4(a0)
9464f4f4913SPhilip Reames; RV32-BOTH-NEXT:    lw a1, 0(a1)
9474f4f4913SPhilip Reames; RV32-BOTH-NEXT:    sw a1, 0(a0)
9484f4f4913SPhilip Reames; RV32-BOTH-NEXT:    ret
9494f4f4913SPhilip Reames;
9504f4f4913SPhilip Reames; RV64-LABEL: memcpy16_align4:
951eb3f2fe4SPhilip Reames; RV64:       # %bb.0: # %entry
952eb3f2fe4SPhilip Reames; RV64-NEXT:    lw a2, 12(a1)
953eb3f2fe4SPhilip Reames; RV64-NEXT:    sw a2, 12(a0)
954eb3f2fe4SPhilip Reames; RV64-NEXT:    lw a2, 8(a1)
955eb3f2fe4SPhilip Reames; RV64-NEXT:    sw a2, 8(a0)
956eb3f2fe4SPhilip Reames; RV64-NEXT:    lw a2, 4(a1)
957eb3f2fe4SPhilip Reames; RV64-NEXT:    sw a2, 4(a0)
958eb3f2fe4SPhilip Reames; RV64-NEXT:    lw a1, 0(a1)
959eb3f2fe4SPhilip Reames; RV64-NEXT:    sw a1, 0(a0)
960eb3f2fe4SPhilip Reames; RV64-NEXT:    ret
96160450f91SCraig Topper;
9624f4f4913SPhilip Reames; RV64-FAST-LABEL: memcpy16_align4:
963eb3f2fe4SPhilip Reames; RV64-FAST:       # %bb.0: # %entry
964eb3f2fe4SPhilip Reames; RV64-FAST-NEXT:    ld a2, 8(a1)
965eb3f2fe4SPhilip Reames; RV64-FAST-NEXT:    sd a2, 8(a0)
966eb3f2fe4SPhilip Reames; RV64-FAST-NEXT:    ld a1, 0(a1)
967eb3f2fe4SPhilip Reames; RV64-FAST-NEXT:    sd a1, 0(a0)
968eb3f2fe4SPhilip Reames; RV64-FAST-NEXT:    ret
96960450f91SCraig Topperentry:
9704f4f4913SPhilip Reames  tail call void @llvm.memcpy.inline.p0.p0.i32(ptr align 4 %dest, ptr align 4 %src, i32 16, i1 false)
97160450f91SCraig Topper  ret void
97260450f91SCraig Topper}
97360450f91SCraig Topper
9744f4f4913SPhilip Reamesdefine i32 @memcpy11_align8(ptr nocapture %dest, ptr %src) {
9754f4f4913SPhilip Reames; RV32-LABEL: memcpy11_align8:
9764f4f4913SPhilip Reames; RV32:       # %bb.0: # %entry
9774f4f4913SPhilip Reames; RV32-NEXT:    lbu a2, 10(a1)
9784f4f4913SPhilip Reames; RV32-NEXT:    sb a2, 10(a0)
9794f4f4913SPhilip Reames; RV32-NEXT:    lh a2, 8(a1)
9804f4f4913SPhilip Reames; RV32-NEXT:    sh a2, 8(a0)
9814f4f4913SPhilip Reames; RV32-NEXT:    lw a2, 4(a1)
9824f4f4913SPhilip Reames; RV32-NEXT:    sw a2, 4(a0)
9834f4f4913SPhilip Reames; RV32-NEXT:    lw a1, 0(a1)
9844f4f4913SPhilip Reames; RV32-NEXT:    sw a1, 0(a0)
9854f4f4913SPhilip Reames; RV32-NEXT:    li a0, 0
9864f4f4913SPhilip Reames; RV32-NEXT:    ret
9874f4f4913SPhilip Reames;
9884f4f4913SPhilip Reames; RV64-LABEL: memcpy11_align8:
9894f4f4913SPhilip Reames; RV64:       # %bb.0: # %entry
9904f4f4913SPhilip Reames; RV64-NEXT:    lbu a2, 10(a1)
9914f4f4913SPhilip Reames; RV64-NEXT:    sb a2, 10(a0)
9924f4f4913SPhilip Reames; RV64-NEXT:    lh a2, 8(a1)
9934f4f4913SPhilip Reames; RV64-NEXT:    sh a2, 8(a0)
9944f4f4913SPhilip Reames; RV64-NEXT:    ld a1, 0(a1)
9954f4f4913SPhilip Reames; RV64-NEXT:    sd a1, 0(a0)
9964f4f4913SPhilip Reames; RV64-NEXT:    li a0, 0
9974f4f4913SPhilip Reames; RV64-NEXT:    ret
9984f4f4913SPhilip Reames;
9994f4f4913SPhilip Reames; RV32-FAST-LABEL: memcpy11_align8:
10004f4f4913SPhilip Reames; RV32-FAST:       # %bb.0: # %entry
10014f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 7(a1)
10024f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 7(a0)
10034f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a2, 4(a1)
10044f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a2, 4(a0)
10054f4f4913SPhilip Reames; RV32-FAST-NEXT:    lw a1, 0(a1)
10064f4f4913SPhilip Reames; RV32-FAST-NEXT:    sw a1, 0(a0)
10074f4f4913SPhilip Reames; RV32-FAST-NEXT:    li a0, 0
10084f4f4913SPhilip Reames; RV32-FAST-NEXT:    ret
10094f4f4913SPhilip Reames;
10104f4f4913SPhilip Reames; RV64-FAST-LABEL: memcpy11_align8:
10114f4f4913SPhilip Reames; RV64-FAST:       # %bb.0: # %entry
10124f4f4913SPhilip Reames; RV64-FAST-NEXT:    lw a2, 7(a1)
10134f4f4913SPhilip Reames; RV64-FAST-NEXT:    sw a2, 7(a0)
10144f4f4913SPhilip Reames; RV64-FAST-NEXT:    ld a1, 0(a1)
10154f4f4913SPhilip Reames; RV64-FAST-NEXT:    sd a1, 0(a0)
10164f4f4913SPhilip Reames; RV64-FAST-NEXT:    li a0, 0
10174f4f4913SPhilip Reames; RV64-FAST-NEXT:    ret
10184f4f4913SPhilip Reamesentry:
10194f4f4913SPhilip Reames  call void @llvm.memcpy.inline.p0.p0.i32(ptr align 8 %dest, ptr align 8 %src, i32 11, i1 false)
10204f4f4913SPhilip Reames  ret i32 0
10214f4f4913SPhilip Reames}
10224f4f4913SPhilip Reames
10234f4f4913SPhilip Reames
10244f4f4913SPhilip Reamesdeclare void @llvm.memcpy.inline.p0.p0.i32(ptr nocapture, ptr nocapture, i32, i1) nounwind
10254f4f4913SPhilip Reamesdeclare void @llvm.memcpy.inline.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind
1026