| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
| ; RUN: llc -mcpu=z17 < %s -mtriple=s390x-linux-gnu -verify-machineinstrs \ | |
| ; RUN: | FileCheck %s | |
| ; | |
| ; Test non-volatile memmoves of small constant lengths in both aligned and | |
| ; unaligned cases. Also test memmoves with i32 length operands. | |
| declare void @llvm.memmove.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind | |
| declare void @llvm.memmove.p0.p0.i32(ptr nocapture, ptr nocapture, i32, i1) nounwind | |
| define void @fun1(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun1: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lb %r0, 0(%r3) | |
| ; CHECK-NEXT: stc %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 1, i1 false) | |
| ret void | |
| } | |
| define void @fun1_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun1_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lb %r0, 0(%r3) | |
| ; CHECK-NEXT: stc %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 1, i1 false) | |
| ret void | |
| } | |
| define void @fun2(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun2: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lh %r0, 0(%r3) | |
| ; CHECK-NEXT: sth %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 2, i1 false) | |
| ret void | |
| } | |
| define void @fun2_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun2_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lh %r0, 0(%r3) | |
| ; CHECK-NEXT: sth %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 2, i1 false) | |
| ret void | |
| } | |
| define void @fun3(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun3: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lh %r0, 0(%r3) | |
| ; CHECK-NEXT: lb %r1, 2(%r3) | |
| ; CHECK-NEXT: stc %r1, 2(%r2) | |
| ; CHECK-NEXT: sth %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 3, i1 false) | |
| ret void | |
| } | |
| define void @fun3_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun3_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lh %r0, 0(%r3) | |
| ; CHECK-NEXT: lb %r1, 2(%r3) | |
| ; CHECK-NEXT: stc %r1, 2(%r2) | |
| ; CHECK-NEXT: sth %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 3, i1 false) | |
| ret void | |
| } | |
| define void @fun4(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun4: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: l %r0, 0(%r3) | |
| ; CHECK-NEXT: st %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 4, i1 false) | |
| ret void | |
| } | |
| define void @fun4_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun4_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: l %r0, 0(%r3) | |
| ; CHECK-NEXT: st %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 4, i1 false) | |
| ret void | |
| } | |
| define void @fun5(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun5: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lb %r0, 4(%r3) | |
| ; CHECK-NEXT: l %r1, 0(%r3) | |
| ; CHECK-NEXT: stc %r0, 4(%r2) | |
| ; CHECK-NEXT: st %r1, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 5, i1 false) | |
| ret void | |
| } | |
| define void @fun5_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun5_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lb %r0, 4(%r3) | |
| ; CHECK-NEXT: l %r1, 0(%r3) | |
| ; CHECK-NEXT: stc %r0, 4(%r2) | |
| ; CHECK-NEXT: st %r1, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 5, i1 false) | |
| ret void | |
| } | |
| define void @fun6(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun6: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lh %r0, 4(%r3) | |
| ; CHECK-NEXT: l %r1, 0(%r3) | |
| ; CHECK-NEXT: sth %r0, 4(%r2) | |
| ; CHECK-NEXT: st %r1, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 6, i1 false) | |
| ret void | |
| } | |
| define void @fun6_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun6_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lh %r0, 4(%r3) | |
| ; CHECK-NEXT: l %r1, 0(%r3) | |
| ; CHECK-NEXT: sth %r0, 4(%r2) | |
| ; CHECK-NEXT: st %r1, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 6, i1 false) | |
| ret void | |
| } | |
| define void @fun7(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun7: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: l %r0, 0(%r3) | |
| ; CHECK-NEXT: l %r1, 3(%r3) | |
| ; CHECK-NEXT: st %r1, 3(%r2) | |
| ; CHECK-NEXT: st %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 7, i1 false) | |
| ret void | |
| } | |
| define void @fun7_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun7_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: l %r0, 0(%r3) | |
| ; CHECK-NEXT: l %r1, 3(%r3) | |
| ; CHECK-NEXT: st %r1, 3(%r2) | |
| ; CHECK-NEXT: st %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 7, i1 false) | |
| ret void | |
| } | |
| define void @fun8(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun8: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lg %r0, 0(%r3) | |
| ; CHECK-NEXT: stg %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 8, i1 false) | |
| ret void | |
| } | |
| define void @fun8_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun8_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lg %r0, 0(%r3) | |
| ; CHECK-NEXT: stg %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 8, i1 false) | |
| ret void | |
| } | |
| define void @fun9(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun9: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lb %r0, 8(%r3) | |
| ; CHECK-NEXT: lg %r1, 0(%r3) | |
| ; CHECK-NEXT: stc %r0, 8(%r2) | |
| ; CHECK-NEXT: stg %r1, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 9, i1 false) | |
| ret void | |
| } | |
| define void @fun9_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun9_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lb %r0, 8(%r3) | |
| ; CHECK-NEXT: lg %r1, 0(%r3) | |
| ; CHECK-NEXT: stc %r0, 8(%r2) | |
| ; CHECK-NEXT: stg %r1, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 9, i1 false) | |
| ret void | |
| } | |
| define void @fun10(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun10: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lh %r0, 8(%r3) | |
| ; CHECK-NEXT: lg %r1, 0(%r3) | |
| ; CHECK-NEXT: sth %r0, 8(%r2) | |
| ; CHECK-NEXT: stg %r1, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 10, i1 false) | |
| ret void | |
| } | |
| define void @fun10_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun10_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lh %r0, 8(%r3) | |
| ; CHECK-NEXT: lg %r1, 0(%r3) | |
| ; CHECK-NEXT: sth %r0, 8(%r2) | |
| ; CHECK-NEXT: stg %r1, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 10, i1 false) | |
| ret void | |
| } | |
| define void @fun11(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun11: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lg %r0, 0(%r3) | |
| ; CHECK-NEXT: l %r1, 7(%r3) | |
| ; CHECK-NEXT: st %r1, 7(%r2) | |
| ; CHECK-NEXT: stg %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 11, i1 false) | |
| ret void | |
| } | |
| define void @fun11_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun11_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lg %r0, 0(%r3) | |
| ; CHECK-NEXT: l %r1, 7(%r3) | |
| ; CHECK-NEXT: st %r1, 7(%r2) | |
| ; CHECK-NEXT: stg %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 11, i1 false) | |
| ret void | |
| } | |
| define void @fun12(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun12: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lg %r0, 0(%r3) | |
| ; CHECK-NEXT: l %r1, 8(%r3) | |
| ; CHECK-NEXT: st %r1, 8(%r2) | |
| ; CHECK-NEXT: stg %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 12, i1 false) | |
| ret void | |
| } | |
| define void @fun12_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun12_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lg %r0, 0(%r3) | |
| ; CHECK-NEXT: l %r1, 8(%r3) | |
| ; CHECK-NEXT: st %r1, 8(%r2) | |
| ; CHECK-NEXT: stg %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 12, i1 false) | |
| ret void | |
| } | |
| define void @fun13(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun13: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lg %r0, 0(%r3) | |
| ; CHECK-NEXT: lg %r1, 5(%r3) | |
| ; CHECK-NEXT: stg %r1, 5(%r2) | |
| ; CHECK-NEXT: stg %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 13, i1 false) | |
| ret void | |
| } | |
| define void @fun13_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun13_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lg %r0, 0(%r3) | |
| ; CHECK-NEXT: lg %r1, 5(%r3) | |
| ; CHECK-NEXT: stg %r1, 5(%r2) | |
| ; CHECK-NEXT: stg %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 13, i1 false) | |
| ret void | |
| } | |
| define void @fun14(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun14: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lg %r0, 0(%r3) | |
| ; CHECK-NEXT: lg %r1, 6(%r3) | |
| ; CHECK-NEXT: stg %r1, 6(%r2) | |
| ; CHECK-NEXT: stg %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 14, i1 false) | |
| ret void | |
| } | |
| define void @fun14_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun14_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lg %r0, 0(%r3) | |
| ; CHECK-NEXT: lg %r1, 6(%r3) | |
| ; CHECK-NEXT: stg %r1, 6(%r2) | |
| ; CHECK-NEXT: stg %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 14, i1 false) | |
| ret void | |
| } | |
| define void @fun15(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun15: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lg %r0, 0(%r3) | |
| ; CHECK-NEXT: lg %r1, 7(%r3) | |
| ; CHECK-NEXT: stg %r1, 7(%r2) | |
| ; CHECK-NEXT: stg %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 15, i1 false) | |
| ret void | |
| } | |
| define void @fun15_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun15_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lg %r0, 0(%r3) | |
| ; CHECK-NEXT: lg %r1, 7(%r3) | |
| ; CHECK-NEXT: stg %r1, 7(%r2) | |
| ; CHECK-NEXT: stg %r0, 0(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 15, i1 false) | |
| ret void | |
| } | |
| define void @fun16(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun16: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: vl %v0, 0(%r3), 3 | |
| ; CHECK-NEXT: vst %v0, 0(%r2), 3 | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 16, i1 false) | |
| ret void | |
| } | |
| define void @fun16_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun16_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB31_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(16,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB31_2: | |
| ; CHECK-NEXT: lhi %r0, 15 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 16, i1 false) | |
| ret void | |
| } | |
| define void @fun17(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun17: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lb %r0, 16(%r3) | |
| ; CHECK-NEXT: vl %v0, 0(%r3), 3 | |
| ; CHECK-NEXT: stc %r0, 16(%r2) | |
| ; CHECK-NEXT: vst %v0, 0(%r2), 3 | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 17, i1 false) | |
| ret void | |
| } | |
| define void @fun17_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun17_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB33_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(17,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB33_2: | |
| ; CHECK-NEXT: lhi %r0, 16 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 17, i1 false) | |
| ret void | |
| } | |
| define void @fun17_unalignedSrc(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun17_unalignedSrc: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB34_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(17,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB34_2: | |
| ; CHECK-NEXT: lhi %r0, 16 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 16 %Dst, ptr align 4 %Src, i64 17, i1 false) | |
| ret void | |
| } | |
| define void @fun18(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun18: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lh %r0, 16(%r3) | |
| ; CHECK-NEXT: vl %v0, 0(%r3), 3 | |
| ; CHECK-NEXT: sth %r0, 16(%r2) | |
| ; CHECK-NEXT: vst %v0, 0(%r2), 3 | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 18, i1 false) | |
| ret void | |
| } | |
| define void @fun18_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun18_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB36_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(18,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB36_2: | |
| ; CHECK-NEXT: lhi %r0, 17 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 18, i1 false) | |
| ret void | |
| } | |
| define void @fun18_unalignedDst(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun18_unalignedDst: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB37_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(18,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB37_2: | |
| ; CHECK-NEXT: lhi %r0, 17 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 2 %Dst, ptr align 16 %Src, i64 18, i1 false) | |
| ret void | |
| } | |
| define void @fun19(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun19: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: vl %v0, 0(%r3), 3 | |
| ; CHECK-NEXT: l %r0, 15(%r3) | |
| ; CHECK-NEXT: st %r0, 15(%r2) | |
| ; CHECK-NEXT: vst %v0, 0(%r2), 3 | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 19, i1 false) | |
| ret void | |
| } | |
| define void @fun19_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun19_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB39_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(19,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB39_2: | |
| ; CHECK-NEXT: lhi %r0, 18 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 19, i1 false) | |
| ret void | |
| } | |
| define void @fun20(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun20: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: vl %v0, 0(%r3), 3 | |
| ; CHECK-NEXT: l %r0, 16(%r3) | |
| ; CHECK-NEXT: st %r0, 16(%r2) | |
| ; CHECK-NEXT: vst %v0, 0(%r2), 3 | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 20, i1 false) | |
| ret void | |
| } | |
| define void @fun20_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun20_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB41_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(20,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB41_2: | |
| ; CHECK-NEXT: lhi %r0, 19 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 20, i1 false) | |
| ret void | |
| } | |
| define void @fun20_local() { | |
| ; CHECK-LABEL: fun20_local: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: aghi %r15, -200 | |
| ; CHECK-NEXT: .cfi_def_cfa_offset 360 | |
| ; CHECK-NEXT: vl %v0, 160(%r15), 4 | |
| ; CHECK-NEXT: vst %v0, 180(%r15), 4 | |
| ; CHECK-NEXT: mvc 196(4,%r15), 176(%r15) | |
| ; CHECK-NEXT: aghi %r15, 200 | |
| ; CHECK-NEXT: br %r14 | |
| %Dst = alloca [20 x i8] | |
| %Src = alloca [20 x i8] | |
| call void @llvm.memmove.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 20, i1 false) | |
| ret void | |
| } | |
| define void @fun21(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun21: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: vl %v0, 0(%r3), 3 | |
| ; CHECK-NEXT: lg %r0, 13(%r3) | |
| ; CHECK-NEXT: stg %r0, 13(%r2) | |
| ; CHECK-NEXT: vst %v0, 0(%r2), 3 | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 21, i1 false) | |
| ret void | |
| } | |
| define void @fun21_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun21_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB44_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(21,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB44_2: | |
| ; CHECK-NEXT: lhi %r0, 20 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 21, i1 false) | |
| ret void | |
| } | |
| define void @fun22(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun22: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: vl %v0, 0(%r3), 3 | |
| ; CHECK-NEXT: lg %r0, 14(%r3) | |
| ; CHECK-NEXT: stg %r0, 14(%r2) | |
| ; CHECK-NEXT: vst %v0, 0(%r2), 3 | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 22, i1 false) | |
| ret void | |
| } | |
| define void @fun22_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun22_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB46_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(22,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB46_2: | |
| ; CHECK-NEXT: lhi %r0, 21 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 22, i1 false) | |
| ret void | |
| } | |
| define void @fun23(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun23: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: vl %v0, 0(%r3), 3 | |
| ; CHECK-NEXT: lg %r0, 15(%r3) | |
| ; CHECK-NEXT: stg %r0, 15(%r2) | |
| ; CHECK-NEXT: vst %v0, 0(%r2), 3 | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 23, i1 false) | |
| ret void | |
| } | |
| define void @fun23_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun23_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB48_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(23,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB48_2: | |
| ; CHECK-NEXT: lhi %r0, 22 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 23, i1 false) | |
| ret void | |
| } | |
| define void @fun24(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun24: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: vl %v0, 0(%r3), 3 | |
| ; CHECK-NEXT: lg %r0, 16(%r3) | |
| ; CHECK-NEXT: stg %r0, 16(%r2) | |
| ; CHECK-NEXT: vst %v0, 0(%r2), 3 | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 24, i1 false) | |
| ret void | |
| } | |
| define void @fun24_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun24_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB50_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(24,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB50_2: | |
| ; CHECK-NEXT: lhi %r0, 23 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 24, i1 false) | |
| ret void | |
| } | |
| define void @fun25(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun25: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB51_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(25,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB51_2: | |
| ; CHECK-NEXT: lhi %r0, 24 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 25, i1 false) | |
| ret void | |
| } | |
| define void @fun25_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun25_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB52_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(25,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB52_2: | |
| ; CHECK-NEXT: lhi %r0, 24 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 25, i1 false) | |
| ret void | |
| } | |
| define void @fun26(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun26: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB53_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(26,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB53_2: | |
| ; CHECK-NEXT: lhi %r0, 25 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 26, i1 false) | |
| ret void | |
| } | |
| define void @fun26_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun26_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB54_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(26,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB54_2: | |
| ; CHECK-NEXT: lhi %r0, 25 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 26, i1 false) | |
| ret void | |
| } | |
| define void @fun27(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun27: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB55_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(27,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB55_2: | |
| ; CHECK-NEXT: lhi %r0, 26 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 27, i1 false) | |
| ret void | |
| } | |
| define void @fun27_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun27_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB56_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(27,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB56_2: | |
| ; CHECK-NEXT: lhi %r0, 26 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 27, i1 false) | |
| ret void | |
| } | |
| define void @fun28(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun28: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB57_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(28,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB57_2: | |
| ; CHECK-NEXT: lhi %r0, 27 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 28, i1 false) | |
| ret void | |
| } | |
| define void @fun28_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun28_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB58_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(28,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB58_2: | |
| ; CHECK-NEXT: lhi %r0, 27 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 28, i1 false) | |
| ret void | |
| } | |
| define void @fun29(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun29: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB59_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(29,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB59_2: | |
| ; CHECK-NEXT: lhi %r0, 28 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 29, i1 false) | |
| ret void | |
| } | |
| define void @fun29_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun29_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB60_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(29,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB60_2: | |
| ; CHECK-NEXT: lhi %r0, 28 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 29, i1 false) | |
| ret void | |
| } | |
| define void @fun30(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun30: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB61_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(30,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB61_2: | |
| ; CHECK-NEXT: lhi %r0, 29 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 30, i1 false) | |
| ret void | |
| } | |
| define void @fun30_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun30_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB62_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(30,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB62_2: | |
| ; CHECK-NEXT: lhi %r0, 29 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 30, i1 false) | |
| ret void | |
| } | |
| define void @fun31(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun31: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB63_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(31,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB63_2: | |
| ; CHECK-NEXT: lhi %r0, 30 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 31, i1 false) | |
| ret void | |
| } | |
| define void @fun31_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun31_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB64_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(31,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB64_2: | |
| ; CHECK-NEXT: lhi %r0, 30 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 31, i1 false) | |
| ret void | |
| } | |
| define void @fun32(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun32: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: vl %v0, 0(%r3), 3 | |
| ; CHECK-NEXT: vl %v1, 16(%r3), 3 | |
| ; CHECK-NEXT: vst %v1, 16(%r2), 3 | |
| ; CHECK-NEXT: vst %v0, 0(%r2), 3 | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 32, i1 false) | |
| ret void | |
| } | |
| define void @fun32_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun32_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB66_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(32,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB66_2: | |
| ; CHECK-NEXT: lhi %r0, 31 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 32, i1 false) | |
| ret void | |
| } | |
| define void @fun33(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun33: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB67_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(33,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB67_2: | |
| ; CHECK-NEXT: lhi %r0, 32 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 33, i1 false) | |
| ret void | |
| } | |
| define void @fun33_unaligned(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun33_unaligned: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB68_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(33,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB68_2: | |
| ; CHECK-NEXT: lhi %r0, 32 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 33, i1 false) | |
| ret void | |
| } | |
| ; Try the longest length. | |
| define void @fun256(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun256: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: clgrjl %r3, %r2, .LBB69_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: mvc 0(256,%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| ; CHECK-NEXT: .LBB69_2: | |
| ; CHECK-NEXT: lhi %r0, 255 | |
| ; CHECK-NEXT: mvcrl 0(%r2), 0(%r3) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 256, i1 false) | |
| ret void | |
| } | |
| ; And the next past it. | |
| define void @fun257(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun257: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: stmg %r14, %r15, 112(%r15) | |
| ; CHECK-NEXT: .cfi_offset %r14, -48 | |
| ; CHECK-NEXT: .cfi_offset %r15, -40 | |
| ; CHECK-NEXT: aghi %r15, -160 | |
| ; CHECK-NEXT: .cfi_def_cfa_offset 320 | |
| ; CHECK-NEXT: lghi %r4, 257 | |
| ; CHECK-NEXT: brasl %r14, memmove@PLT | |
| ; CHECK-NEXT: lmg %r14, %r15, 272(%r15) | |
| ; CHECK-NEXT: br %r14 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 257, i1 false) | |
| ret void | |
| } | |
| ; Large displacements. | |
| define void @displ0(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: displ0: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lh %r0, 4095(%r3) | |
| ; CHECK-NEXT: lb %r1, 4097(%r3) | |
| ; CHECK-NEXT: stc %r1, 50(%r2) | |
| ; CHECK-NEXT: sth %r0, 48(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| %Dst.fld = getelementptr inbounds nuw i8, ptr %Dst, i64 48 | |
| %Src.fld = getelementptr inbounds nuw i8, ptr %Src, i64 4095 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst.fld, ptr align 8 %Src.fld, i64 3, | |
| i1 false) | |
| ret void | |
| } | |
| define void @displ1(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: displ1: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lhy %r0, 4096(%r3) | |
| ; CHECK-NEXT: lb %r1, 4098(%r3) | |
| ; CHECK-NEXT: stc %r1, 50(%r2) | |
| ; CHECK-NEXT: sth %r0, 48(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| %Dst.fld = getelementptr inbounds nuw i8, ptr %Dst, i64 48 | |
| %Src.fld = getelementptr inbounds nuw i8, ptr %Src, i64 4096 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst.fld, ptr align 8 %Src.fld, i64 3, | |
| i1 false) | |
| ret void | |
| } | |
| define void @displ2(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: displ2: | |
| ; CHECK: # %bb.0: | |
| ; CHECK-NEXT: lhy %r0, 4096(%r3) | |
| ; CHECK-NEXT: lb %r1, 4098(%r3) | |
| ; CHECK-NEXT: stcy %r1, 5002(%r2) | |
| ; CHECK-NEXT: sthy %r0, 5000(%r2) | |
| ; CHECK-NEXT: br %r14 | |
| %Dst.fld = getelementptr inbounds nuw i8, ptr %Dst, i64 5000 | |
| %Src.fld = getelementptr inbounds nuw i8, ptr %Src, i64 4096 | |
| call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst.fld, ptr align 8 %Src.fld, i64 3, | |
| i1 false) | |
| ret void | |
| } | |
| ; Test memmoves with i32 length operand (must not crash). | |
| define void @fun_i32len_40(ptr %Dst, ptr %Src) { | |
| ; CHECK-LABEL: fun_i32len_40: | |
| ; CHECK-NOT: memmove | |
| call void @llvm.memmove.p0.p0.i32(ptr %Dst, ptr %Src, i32 40, i1 false) | |
| ret void | |
| } |