| ; RUN: llc < %s -mtriple=bpfel -mcpu=v3 -verify-machineinstrs | FileCheck %s | |
| ; | |
| ; Mismatched alignment (dst 8, src 1): expect plain byte copies, no shifts/ORs | |
| ; and no wide (u64) access. | |
| define void @memcpy_dst8_src1(ptr align 8 %a, ptr align 1 %b) { | |
| ; CHECK-LABEL: memcpy_dst8_src1: | |
| ; CHECK: # %bb.0: # %entry | |
| ; CHECK-NEXT: w3 = *(u8 *)(r2 + 7) | |
| ; CHECK-NEXT: *(u8 *)(r1 + 7) = w3 | |
| ; CHECK-NEXT: w3 = *(u8 *)(r2 + 6) | |
| ; CHECK-NEXT: *(u8 *)(r1 + 6) = w3 | |
| ; CHECK-NEXT: w3 = *(u8 *)(r2 + 5) | |
| ; CHECK-NEXT: *(u8 *)(r1 + 5) = w3 | |
| ; CHECK-NEXT: w3 = *(u8 *)(r2 + 4) | |
| ; CHECK-NEXT: *(u8 *)(r1 + 4) = w3 | |
| ; CHECK-NEXT: w3 = *(u8 *)(r2 + 3) | |
| ; CHECK-NEXT: *(u8 *)(r1 + 3) = w3 | |
| ; CHECK-NEXT: w3 = *(u8 *)(r2 + 2) | |
| ; CHECK-NEXT: *(u8 *)(r1 + 2) = w3 | |
| ; CHECK-NEXT: w3 = *(u8 *)(r2 + 1) | |
| ; CHECK-NEXT: *(u8 *)(r1 + 1) = w3 | |
| ; CHECK-NEXT: w2 = *(u8 *)(r2 + 0) | |
| ; CHECK-NEXT: *(u8 *)(r1 + 0) = w2 | |
| ; CHECK-NEXT: exit | |
| entry: | |
| tail call void @llvm.memcpy.p0.p0.i64(ptr align 8 %a, ptr align 1 %b, i64 8, i1 false) | |
| ret void | |
| } | |
| define void @memmove_dst8_src1(ptr align 8 %a, ptr align 1 %b) { | |
| ; CHECK-LABEL: memmove_dst8_src1: | |
| ; CHECK: # %bb.0: # %entry | |
| ; CHECK-NEXT: w3 = *(u8 *)(r2 + 0) | |
| ; CHECK-NEXT: w4 = *(u8 *)(r2 + 1) | |
| ; CHECK-NEXT: w5 = *(u8 *)(r2 + 2) | |
| ; CHECK-NEXT: w0 = *(u8 *)(r2 + 3) | |
| ; CHECK-NEXT: w6 = *(u8 *)(r2 + 4) | |
| ; CHECK-NEXT: w7 = *(u8 *)(r2 + 5) | |
| ; CHECK-NEXT: w8 = *(u8 *)(r2 + 6) | |
| ; CHECK-NEXT: w2 = *(u8 *)(r2 + 7) | |
| ; CHECK-NEXT: *(u8 *)(r1 + 7) = w2 | |
| ; CHECK-NEXT: *(u8 *)(r1 + 6) = w8 | |
| ; CHECK-NEXT: *(u8 *)(r1 + 5) = w7 | |
| ; CHECK-NEXT: *(u8 *)(r1 + 4) = w6 | |
| ; CHECK-NEXT: *(u8 *)(r1 + 3) = w0 | |
| ; CHECK-NEXT: *(u8 *)(r1 + 2) = w5 | |
| ; CHECK-NEXT: *(u8 *)(r1 + 1) = w4 | |
| ; CHECK-NEXT: *(u8 *)(r1 + 0) = w3 | |
| ; CHECK-NEXT: exit | |
| entry: | |
| tail call void @llvm.memmove.p0.p0.i64(ptr align 8 %a, ptr align 1 %b, i64 8, i1 false) | |
| ret void | |
| } | |
| declare void @llvm.memcpy.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1) | |
| declare void @llvm.memmove.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1) |