1*9880d681SAndroid Build Coastguard Worker; Test memset in cases where the set value is variable. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memset.p0i8.i32(i8 *nocapture, i8, i32, i32, i1) nounwind 6*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memset.p0i8.i64(i8 *nocapture, i8, i64, i32, i1) nounwind 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; No bytes, i32 version. 9*9880d681SAndroid Build Coastguard Workerdefine void @f1(i8 *%dest, i8 %val) { 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 11*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %r2 12*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %r3 13*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 14*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8 *%dest, i8 %val, i32 0, i32 1, i1 false) 15*9880d681SAndroid Build Coastguard Worker ret void 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; No bytes, i64 version. 19*9880d681SAndroid Build Coastguard Workerdefine void @f2(i8 *%dest, i8 %val) { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 21*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %r2 22*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %r3 23*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 24*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i64(i8 *%dest, i8 %val, i64 0, i32 1, i1 false) 25*9880d681SAndroid Build Coastguard Worker ret void 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; 1 byte, i32 version. 29*9880d681SAndroid Build Coastguard Workerdefine void @f3(i8 *%dest, i8 %val) { 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 31*9880d681SAndroid Build Coastguard Worker; CHECK: stc %r3, 0(%r2) 32*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 33*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8 *%dest, i8 %val, i32 1, i32 1, i1 false) 34*9880d681SAndroid Build Coastguard Worker ret void 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; 1 byte, i64 version. 38*9880d681SAndroid Build Coastguard Workerdefine void @f4(i8 *%dest, i8 %val) { 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 40*9880d681SAndroid Build Coastguard Worker; CHECK: stc %r3, 0(%r2) 41*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 42*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i64(i8 *%dest, i8 %val, i64 1, i32 1, i1 false) 43*9880d681SAndroid Build Coastguard Worker ret void 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker; 2 bytes, i32 version. 47*9880d681SAndroid Build Coastguard Workerdefine void @f5(i8 *%dest, i8 %val) { 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 49*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stc %r3, 0(%r2) 50*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stc %r3, 1(%r2) 51*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 52*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8 *%dest, i8 %val, i32 2, i32 1, i1 false) 53*9880d681SAndroid Build Coastguard Worker ret void 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker; 2 bytes, i64 version. 57*9880d681SAndroid Build Coastguard Workerdefine void @f6(i8 *%dest, i8 %val) { 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 59*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stc %r3, 0(%r2) 60*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stc %r3, 1(%r2) 61*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 62*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i64(i8 *%dest, i8 %val, i64 2, i32 1, i1 false) 63*9880d681SAndroid Build Coastguard Worker ret void 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker; 3 bytes, i32 version. 67*9880d681SAndroid Build Coastguard Workerdefine void @f7(i8 *%dest, i8 %val) { 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 69*9880d681SAndroid Build Coastguard Worker; CHECK: stc %r3, 0(%r2) 70*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(2,%r2), 0(%r2) 71*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 72*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8 *%dest, i8 %val, i32 3, i32 1, i1 false) 73*9880d681SAndroid Build Coastguard Worker ret void 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker; 3 bytes, i64 version. 77*9880d681SAndroid Build Coastguard Workerdefine void @f8(i8 *%dest, i8 %val) { 78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 79*9880d681SAndroid Build Coastguard Worker; CHECK: stc %r3, 0(%r2) 80*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(2,%r2), 0(%r2) 81*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 82*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i64(i8 *%dest, i8 %val, i64 3, i32 1, i1 false) 83*9880d681SAndroid Build Coastguard Worker ret void 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker; 257 bytes, i32 version. 87*9880d681SAndroid Build Coastguard Workerdefine void @f9(i8 *%dest, i8 %val) { 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 89*9880d681SAndroid Build Coastguard Worker; CHECK: stc %r3, 0(%r2) 90*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(256,%r2), 0(%r2) 91*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 92*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8 *%dest, i8 %val, i32 257, i32 1, i1 false) 93*9880d681SAndroid Build Coastguard Worker ret void 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker; 257 bytes, i64 version. 97*9880d681SAndroid Build Coastguard Workerdefine void @f10(i8 *%dest, i8 %val) { 98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 99*9880d681SAndroid Build Coastguard Worker; CHECK: stc %r3, 0(%r2) 100*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(256,%r2), 0(%r2) 101*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 102*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i64(i8 *%dest, i8 %val, i64 257, i32 1, i1 false) 103*9880d681SAndroid Build Coastguard Worker ret void 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker; 258 bytes, i32 version. We need two MVCs. 107*9880d681SAndroid Build Coastguard Workerdefine void @f11(i8 *%dest, i8 %val) { 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11: 109*9880d681SAndroid Build Coastguard Worker; CHECK: stc %r3, 0(%r2) 110*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(256,%r2), 0(%r2) 111*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 257(1,%r2), 256(%r2) 112*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 113*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8 *%dest, i8 %val, i32 258, i32 1, i1 false) 114*9880d681SAndroid Build Coastguard Worker ret void 115*9880d681SAndroid Build Coastguard Worker} 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker; 258 bytes, i64 version. 118*9880d681SAndroid Build Coastguard Workerdefine void @f12(i8 *%dest, i8 %val) { 119*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12: 120*9880d681SAndroid Build Coastguard Worker; CHECK: stc %r3, 0(%r2) 121*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(256,%r2), 0(%r2) 122*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 257(1,%r2), 256(%r2) 123*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 124*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i64(i8 *%dest, i8 %val, i64 258, i32 1, i1 false) 125*9880d681SAndroid Build Coastguard Worker ret void 126*9880d681SAndroid Build Coastguard Worker} 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker; Test the largest case for which straight-line code is used. 129*9880d681SAndroid Build Coastguard Workerdefine void @f13(i8 *%dest, i8 %val) { 130*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13: 131*9880d681SAndroid Build Coastguard Worker; CHECK: stc %r3, 0(%r2) 132*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(256,%r2), 0(%r2) 133*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 257(256,%r2), 256(%r2) 134*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 513(256,%r2), 512(%r2) 135*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 769(256,%r2), 768(%r2) 136*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1025(256,%r2), 1024(%r2) 137*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1281(256,%r2), 1280(%r2) 138*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 139*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i64(i8 *%dest, i8 %val, i64 1537, i32 1, 140*9880d681SAndroid Build Coastguard Worker i1 false) 141*9880d681SAndroid Build Coastguard Worker ret void 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker; Test the next size up, which uses a loop. We leave the other corner 145*9880d681SAndroid Build Coastguard Worker; cases to memcpy-01.ll. 146*9880d681SAndroid Build Coastguard Workerdefine void @f14(i8 *%dest, i8 %val) { 147*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14: 148*9880d681SAndroid Build Coastguard Worker; CHECK: stc %r3, 0(%r2) 149*9880d681SAndroid Build Coastguard Worker; CHECK: lghi [[COUNT:%r[0-5]]], 6 150*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL:\.L[^:]*]]: 151*9880d681SAndroid Build Coastguard Worker; CHECK: pfd 2, 769(%r2) 152*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(256,%r2), 0(%r2) 153*9880d681SAndroid Build Coastguard Worker; CHECK: la %r2, 256(%r2) 154*9880d681SAndroid Build Coastguard Worker; CHECK: brctg [[COUNT]], [[LABEL]] 155*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(1,%r2), 0(%r2) 156*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 157*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i64(i8 *%dest, i8 %val, i64 1538, i32 1, 158*9880d681SAndroid Build Coastguard Worker i1 false) 159*9880d681SAndroid Build Coastguard Worker ret void 160*9880d681SAndroid Build Coastguard Worker} 161