1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mcpu=z15 < %s -mtriple=s390x-linux-gnu | FileCheck %s 3; 4; Test memcpys of small constant lengths that should not be done with MVC. 5 6declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind 7 8define void @fun16(ptr %Src, ptr %Dst, i8 %val) { 9; CHECK-LABEL: fun16: 10; CHECK: # %bb.0: 11; CHECK-NEXT: mvc 0(16,%r3), 0(%r2) 12; CHECK-NEXT: br %r14 13 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 16, i1 false) 14 ret void 15} 16 17define void @fun17(ptr %Src, ptr %Dst, i8 %val) { 18; CHECK-LABEL: fun17: 19; CHECK: # %bb.0: 20; CHECK-NEXT: lb %r0, 16(%r2) 21; CHECK-NEXT: stc %r0, 16(%r3) 22; CHECK-NEXT: vl %v0, 0(%r2), 4 23; CHECK-NEXT: vst %v0, 0(%r3), 4 24; CHECK-NEXT: br %r14 25 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 17, i1 false) 26 ret void 27} 28 29define void @fun18(ptr %Src, ptr %Dst, i8 %val) { 30; CHECK-LABEL: fun18: 31; CHECK: # %bb.0: 32; CHECK-NEXT: lh %r0, 16(%r2) 33; CHECK-NEXT: sth %r0, 16(%r3) 34; CHECK-NEXT: vl %v0, 0(%r2), 4 35; CHECK-NEXT: vst %v0, 0(%r3), 4 36; CHECK-NEXT: br %r14 37 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 18, i1 false) 38 ret void 39} 40 41define void @fun19(ptr %Src, ptr %Dst, i8 %val) { 42; CHECK-LABEL: fun19: 43; CHECK: # %bb.0: 44; CHECK-NEXT: l %r0, 15(%r2) 45; CHECK-NEXT: st %r0, 15(%r3) 46; CHECK-NEXT: vl %v0, 0(%r2), 4 47; CHECK-NEXT: vst %v0, 0(%r3), 4 48; CHECK-NEXT: br %r14 49 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 19, i1 false) 50 ret void 51} 52 53define void @fun20(ptr %Src, ptr %Dst, i8 %val) { 54; CHECK-LABEL: fun20: 55; CHECK: # %bb.0: 56; CHECK-NEXT: l %r0, 16(%r2) 57; CHECK-NEXT: st %r0, 16(%r3) 58; CHECK-NEXT: vl %v0, 0(%r2), 4 59; CHECK-NEXT: vst %v0, 0(%r3), 4 60; CHECK-NEXT: br %r14 61 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 20, i1 false) 62 ret void 63} 64 65define void @fun21(ptr %Src, ptr %Dst, i8 %val) { 66; CHECK-LABEL: fun21: 67; CHECK: # %bb.0: 68; CHECK-NEXT: lg %r0, 13(%r2) 69; CHECK-NEXT: stg %r0, 13(%r3) 70; CHECK-NEXT: vl %v0, 0(%r2), 4 71; CHECK-NEXT: vst %v0, 0(%r3), 4 72; CHECK-NEXT: br %r14 73 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 21, i1 false) 74 ret void 75} 76 77define void @fun22(ptr %Src, ptr %Dst, i8 %val) { 78; CHECK-LABEL: fun22: 79; CHECK: # %bb.0: 80; CHECK-NEXT: lg %r0, 14(%r2) 81; CHECK-NEXT: stg %r0, 14(%r3) 82; CHECK-NEXT: vl %v0, 0(%r2), 4 83; CHECK-NEXT: vst %v0, 0(%r3), 4 84; CHECK-NEXT: br %r14 85 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 22, i1 false) 86 ret void 87} 88 89define void @fun23(ptr %Src, ptr %Dst, i8 %val) { 90; CHECK-LABEL: fun23: 91; CHECK: # %bb.0: 92; CHECK-NEXT: lg %r0, 15(%r2) 93; CHECK-NEXT: stg %r0, 15(%r3) 94; CHECK-NEXT: vl %v0, 0(%r2), 4 95; CHECK-NEXT: vst %v0, 0(%r3), 4 96; CHECK-NEXT: br %r14 97 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 23, i1 false) 98 ret void 99} 100 101define void @fun24(ptr %Src, ptr %Dst, i8 %val) { 102; CHECK-LABEL: fun24: 103; CHECK: # %bb.0: 104; CHECK-NEXT: lg %r0, 16(%r2) 105; CHECK-NEXT: stg %r0, 16(%r3) 106; CHECK-NEXT: vl %v0, 0(%r2), 4 107; CHECK-NEXT: vst %v0, 0(%r3), 4 108; CHECK-NEXT: br %r14 109 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 24, i1 false) 110 ret void 111} 112 113define void @fun25(ptr %Src, ptr %Dst, i8 %val) { 114; CHECK-LABEL: fun25: 115; CHECK: # %bb.0: 116; CHECK-NEXT: vl %v0, 9(%r2) 117; CHECK-NEXT: vst %v0, 9(%r3) 118; CHECK-NEXT: vl %v0, 0(%r2), 4 119; CHECK-NEXT: vst %v0, 0(%r3), 4 120; CHECK-NEXT: br %r14 121 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 25, i1 false) 122 ret void 123} 124 125define void @fun26(ptr %Src, ptr %Dst, i8 %val) { 126; CHECK-LABEL: fun26: 127; CHECK: # %bb.0: 128; CHECK-NEXT: vl %v0, 10(%r2) 129; CHECK-NEXT: vst %v0, 10(%r3) 130; CHECK-NEXT: vl %v0, 0(%r2), 4 131; CHECK-NEXT: vst %v0, 0(%r3), 4 132; CHECK-NEXT: br %r14 133 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 26, i1 false) 134 ret void 135} 136 137define void @fun27(ptr %Src, ptr %Dst, i8 %val) { 138; CHECK-LABEL: fun27: 139; CHECK: # %bb.0: 140; CHECK-NEXT: vl %v0, 11(%r2) 141; CHECK-NEXT: vst %v0, 11(%r3) 142; CHECK-NEXT: vl %v0, 0(%r2), 4 143; CHECK-NEXT: vst %v0, 0(%r3), 4 144; CHECK-NEXT: br %r14 145 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 27, i1 false) 146 ret void 147} 148 149define void @fun28(ptr %Src, ptr %Dst, i8 %val) { 150; CHECK-LABEL: fun28: 151; CHECK: # %bb.0: 152; CHECK-NEXT: vl %v0, 12(%r2) 153; CHECK-NEXT: vst %v0, 12(%r3) 154; CHECK-NEXT: vl %v0, 0(%r2), 4 155; CHECK-NEXT: vst %v0, 0(%r3), 4 156; CHECK-NEXT: br %r14 157 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 28, i1 false) 158 ret void 159} 160 161define void @fun29(ptr %Src, ptr %Dst, i8 %val) { 162; CHECK-LABEL: fun29: 163; CHECK: # %bb.0: 164; CHECK-NEXT: vl %v0, 13(%r2) 165; CHECK-NEXT: vst %v0, 13(%r3) 166; CHECK-NEXT: vl %v0, 0(%r2), 4 167; CHECK-NEXT: vst %v0, 0(%r3), 4 168; CHECK-NEXT: br %r14 169 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 29, i1 false) 170 ret void 171} 172 173define void @fun30(ptr %Src, ptr %Dst, i8 %val) { 174; CHECK-LABEL: fun30: 175; CHECK: # %bb.0: 176; CHECK-NEXT: vl %v0, 14(%r2) 177; CHECK-NEXT: vst %v0, 14(%r3) 178; CHECK-NEXT: vl %v0, 0(%r2), 4 179; CHECK-NEXT: vst %v0, 0(%r3), 4 180; CHECK-NEXT: br %r14 181 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 30, i1 false) 182 ret void 183} 184 185define void @fun31(ptr %Src, ptr %Dst, i8 %val) { 186; CHECK-LABEL: fun31: 187; CHECK: # %bb.0: 188; CHECK-NEXT: vl %v0, 15(%r2) 189; CHECK-NEXT: vst %v0, 15(%r3) 190; CHECK-NEXT: vl %v0, 0(%r2), 4 191; CHECK-NEXT: vst %v0, 0(%r3), 4 192; CHECK-NEXT: br %r14 193 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 31, i1 false) 194 ret void 195} 196 197define void @fun32(ptr %Src, ptr %Dst, i8 %val) { 198; CHECK-LABEL: fun32: 199; CHECK: # %bb.0: 200; CHECK-NEXT: vl %v0, 16(%r2), 4 201; CHECK-NEXT: vst %v0, 16(%r3), 4 202; CHECK-NEXT: vl %v0, 0(%r2), 4 203; CHECK-NEXT: vst %v0, 0(%r3), 4 204; CHECK-NEXT: br %r14 205 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 32, i1 false) 206 ret void 207} 208 209define void @fun33(ptr %Src, ptr %Dst, i8 %val) { 210; CHECK-LABEL: fun33: 211; CHECK: # %bb.0: 212; CHECK-NEXT: mvc 0(33,%r3), 0(%r2) 213; CHECK-NEXT: br %r14 214 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 33, i1 false) 215 ret void 216} 217 218