1; Test memset in cases where a loop is used. 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; Constant length: 6 iterations and 2 bytes remainder. 9define void @f1(ptr %dest, i8 %val) { 10; CHECK-LABEL: f1: 11; CHECK: lghi [[COUNT:%r[0-5]]], 6 12; CHECK: [[LABEL:\.L[^:]*]]: 13; CHECK: pfd 2, 768(%r2) 14; CHECK: stc %r3, 0(%r2) 15; CHECK: mvc 1(255,%r2), 0(%r2) 16; CHECK: la %r2, 256(%r2) 17; CHECK: brctg [[COUNT]], [[LABEL]] 18; CHECK: stc %r3, 0(%r2) 19; CHECK-NEXT: mvc 1(1,%r2), 0(%r2) 20; CHECK-NEXT: br %r14 21 call void @llvm.memset.p0.i64(ptr %dest, i8 %val, i64 1538, i1 false) 22 ret void 23} 24 25; Constant length: 6 iterations and 255 bytes remainder. 26define void @f2(ptr %dest) { 27; CHECK-LABEL: f2: 28; CHECK: lghi [[COUNT:%r[0-5]]], 6 29; CHECK: [[LABEL:\.L[^:]*]]: 30; CHECK: pfd 2, 768(%r2) 31; CHECK: mvi 0(%r2), 1 32; CHECK: mvc 1(255,%r2), 0(%r2) 33; CHECK: la %r2, 256(%r2) 34; CHECK: brctg [[COUNT]], [[LABEL]] 35; CHECK: mvi 0(%r2), 1 36; CHECK-NEXT: mvc 1(254,%r2), 0(%r2) 37; CHECK-NEXT: br %r14 38 call void @llvm.memset.p0.i32(ptr %dest, i8 1, i32 1791, i1 false) 39 ret void 40} 41 42; Variable length, byte in register. 43define void @f3(ptr %dest, i8 %val, i64 %Len) { 44; CHECK-LABEL: f3: 45; CHECK: # %bb.0: 46; CHECK-NEXT: aghi %r4, -2 47; CHECK-NEXT: cgibe %r4, -2, 0(%r14) 48; CHECK-NEXT: .LBB2_1: 49; CHECK-NEXT: cgije %r4, -1, .LBB2_5 50; CHECK-NEXT:# %bb.2: 51; CHECK-NEXT: srlg %r0, %r4, 8 52; CHECK-NEXT: cgije %r0, 0, .LBB2_4 53; CHECK-NEXT:.LBB2_3: # =>This Inner Loop Header: Depth=1 54; CHECK-NEXT: pfd 2, 768(%r2) 55; CHECK-NEXT: stc %r3, 0(%r2) 56; CHECK-NEXT: mvc 1(255,%r2), 0(%r2) 57; CHECK-NEXT: la %r2, 256(%r2) 58; CHECK-NEXT: brctg %r0, .LBB2_3 59; CHECK-NEXT:.LBB2_4: 60; CHECK-NEXT: stc %r3, 0(%r2) 61; CHECK-NEXT: exrl %r4, .Ltmp0 62; CHECK-NEXT: br %r14 63; CHECK-NEXT:.LBB2_5: 64; CHECK-NEXT: stc %r3, 0(%r2) 65; CHECK-NEXT: br %r14 66 call void @llvm.memset.p0.i64(ptr %dest, i8 %val, i64 %Len, i1 false) 67 ret void 68} 69 70; Variable length, immediate byte. 71define void @f4(ptr %dest, i32 %Len) { 72; CHECK-LABEL: f4: 73; CHECK: # %bb.0: 74; CHECK-NEXT: llgfr %r1, %r3 75; CHECK-NEXT: aghi %r1, -2 76; CHECK-NEXT: cgibe %r1, -2, 0(%r14) 77; CHECK-NEXT:.LBB3_1: 78; CHECK-NEXT: cgije %r1, -1, .LBB3_5 79; CHECK-NEXT:# %bb.2: 80; CHECK-NEXT: srlg %r0, %r1, 8 81; CHECK-NEXT: cgije %r0, 0, .LBB3_4 82; CHECK-NEXT:.LBB3_3: # =>This Inner Loop Header: Depth=1 83; CHECK-NEXT: pfd 2, 768(%r2) 84; CHECK-NEXT: mvi 0(%r2), 1 85; CHECK-NEXT: mvc 1(255,%r2), 0(%r2) 86; CHECK-NEXT: la %r2, 256(%r2) 87; CHECK-NEXT: brctg %r0, .LBB3_3 88; CHECK-NEXT:.LBB3_4: 89; CHECK-NEXT: mvi 0(%r2), 1 90; CHECK-NEXT: exrl %r1, .Ltmp0 91; CHECK-NEXT: br %r14 92; CHECK-NEXT:.LBB3_5: 93; CHECK-NEXT: mvi 0(%r2), 1 94; CHECK-NEXT: br %r14 95 call void @llvm.memset.p0.i32(ptr %dest, i8 1, i32 %Len, i1 false) 96 ret void 97} 98 99; CHECK: .Ltmp0: 100; CHECK-NEXT: mvc 1(1,%r2), 0(%r2) 101