1; Test memset in cases where the set value is a constant other than 0 and -1. 2; 3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4 5declare void @llvm.memset.p0.i32(ptr nocapture, i8, i32, i1) nounwind 6declare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i1) nounwind 7 8; No bytes, i32 version. 9define void @f1(ptr %dest) { 10; CHECK-LABEL: f1: 11; CHECK-NOT: %r2 12; CHECK: br %r14 13 call void @llvm.memset.p0.i32(ptr %dest, i8 128, i32 0, i1 false) 14 ret void 15} 16 17; No bytes, i64 version. 18define void @f2(ptr %dest) { 19; CHECK-LABEL: f2: 20; CHECK-NOT: %r2 21; CHECK: br %r14 22 call void @llvm.memset.p0.i64(ptr %dest, i8 128, i64 0, i1 false) 23 ret void 24} 25 26; 1 byte, i32 version. 27define void @f3(ptr %dest) { 28; CHECK-LABEL: f3: 29; CHECK: mvi 0(%r2), 128 30; CHECK: br %r14 31 call void @llvm.memset.p0.i32(ptr %dest, i8 128, i32 1, i1 false) 32 ret void 33} 34 35; 1 byte, i64 version. 36define void @f4(ptr %dest) { 37; CHECK-LABEL: f4: 38; CHECK: mvi 0(%r2), 128 39; CHECK: br %r14 40 call void @llvm.memset.p0.i64(ptr %dest, i8 128, i64 1, i1 false) 41 ret void 42} 43 44; 2 bytes, i32 version. 45define void @f5(ptr %dest) { 46; CHECK-LABEL: f5: 47; CHECK: mvhhi 0(%r2), -32640 48; CHECK: br %r14 49 call void @llvm.memset.p0.i32(ptr %dest, i8 128, i32 2, i1 false) 50 ret void 51} 52 53; 2 bytes, i64 version. 54define void @f6(ptr %dest) { 55; CHECK-LABEL: f6: 56; CHECK: mvhhi 0(%r2), -32640 57; CHECK: br %r14 58 call void @llvm.memset.p0.i64(ptr %dest, i8 128, i64 2, i1 false) 59 ret void 60} 61 62; 3 bytes, i32 version. 63define void @f7(ptr %dest) { 64; CHECK-LABEL: f7: 65; CHECK-DAG: mvhhi 0(%r2), -32640 66; CHECK-DAG: mvi 2(%r2), 128 67; CHECK: br %r14 68 call void @llvm.memset.p0.i32(ptr %dest, i8 128, i32 3, i1 false) 69 ret void 70} 71 72; 3 bytes, i64 version. 73define void @f8(ptr %dest) { 74; CHECK-LABEL: f8: 75; CHECK-DAG: mvhhi 0(%r2), -32640 76; CHECK-DAG: mvi 2(%r2), 128 77; CHECK: br %r14 78 call void @llvm.memset.p0.i64(ptr %dest, i8 128, i64 3, i1 false) 79 ret void 80} 81 82; 4 bytes, i32 version. 83define void @f9(ptr %dest) { 84; CHECK-LABEL: f9: 85; CHECK: iilf [[REG:%r[0-5]]], 2155905152 86; CHECK: st [[REG]], 0(%r2) 87; CHECK: br %r14 88 call void @llvm.memset.p0.i32(ptr %dest, i8 128, i32 4, i1 false) 89 ret void 90} 91 92; 4 bytes, i64 version. 93define void @f10(ptr %dest) { 94; CHECK-LABEL: f10: 95; CHECK: iilf [[REG:%r[0-5]]], 2155905152 96; CHECK: st [[REG]], 0(%r2) 97; CHECK: br %r14 98 call void @llvm.memset.p0.i64(ptr %dest, i8 128, i64 4, i1 false) 99 ret void 100} 101 102; 5 bytes, i32 version. 103define void @f11(ptr %dest) { 104; CHECK-LABEL: f11: 105; CHECK: mvi 0(%r2), 128 106; CHECK: mvc 1(4,%r2), 0(%r2) 107; CHECK: br %r14 108 call void @llvm.memset.p0.i32(ptr %dest, i8 128, i32 5, i1 false) 109 ret void 110} 111 112; 5 bytes, i64 version. 113define void @f12(ptr %dest) { 114; CHECK-LABEL: f12: 115; CHECK: mvi 0(%r2), 128 116; CHECK: mvc 1(4,%r2), 0(%r2) 117; CHECK: br %r14 118 call void @llvm.memset.p0.i64(ptr %dest, i8 128, i64 5, i1 false) 119 ret void 120} 121 122; 257 bytes, i32 version. 123define void @f13(ptr %dest) { 124; CHECK-LABEL: f13: 125; CHECK: mvi 0(%r2), 128 126; CHECK: mvc 1(255,%r2), 0(%r2) 127; CHECK: mvi 256(%r2), 128 128; CHECK: br %r14 129 call void @llvm.memset.p0.i32(ptr %dest, i8 128, i32 257, i1 false) 130 ret void 131} 132 133; 257 bytes, i64 version. 134define void @f14(ptr %dest) { 135; CHECK-LABEL: f14: 136; CHECK: mvi 0(%r2), 128 137; CHECK: mvc 1(255,%r2), 0(%r2) 138; CHECK: mvi 256(%r2), 128 139; CHECK: br %r14 140 call void @llvm.memset.p0.i64(ptr %dest, i8 128, i64 257, i1 false) 141 ret void 142} 143 144; 258 bytes, i32 version. We need two MVCs. 145define void @f15(ptr %dest) { 146; CHECK-LABEL: f15: 147; CHECK: mvi 0(%r2), 128 148; CHECK: mvc 1(255,%r2), 0(%r2) 149; CHECK: mvi 256(%r2), 128 150; CHECK: mvc 257(1,%r2), 256(%r2) 151; CHECK: br %r14 152 call void @llvm.memset.p0.i32(ptr %dest, i8 128, i32 258, i1 false) 153 ret void 154} 155 156; 258 bytes, i64 version. 157define void @f16(ptr %dest) { 158; CHECK-LABEL: f16: 159; CHECK: mvi 0(%r2), 128 160; CHECK: mvc 1(255,%r2), 0(%r2) 161; CHECK: mvi 256(%r2), 128 162; CHECK: mvc 257(1,%r2), 256(%r2) 163; CHECK: br %r14 164 call void @llvm.memset.p0.i64(ptr %dest, i8 128, i64 258, i1 false) 165 ret void 166} 167