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 5 declare void @llvm.memset.p0i8.i32(i8 *nocapture, i8, i32, i32, i1) nounwind 6 declare void @llvm.memset.p0i8.i64(i8 *nocapture, i8, i64, i32, i1) nounwind 7 8 ; No bytes, i32 version. 9 define void @f1(i8 *%dest) { 10 ; CHECK-LABEL: f1: 11 ; CHECK-NOT: %r2 12 ; CHECK: br %r14 13 call void @llvm.memset.p0i8.i32(i8 *%dest, i8 128, i32 0, i32 1, i1 false) 14 ret void 15 } 16 17 ; No bytes, i64 version. 18 define void @f2(i8 *%dest) { 19 ; CHECK-LABEL: f2: 20 ; CHECK-NOT: %r2 21 ; CHECK: br %r14 22 call void @llvm.memset.p0i8.i64(i8 *%dest, i8 128, i64 0, i32 1, i1 false) 23 ret void 24 } 25 26 ; 1 byte, i32 version. 27 define void @f3(i8 *%dest) { 28 ; CHECK-LABEL: f3: 29 ; CHECK: mvi 0(%r2), 128 30 ; CHECK: br %r14 31 call void @llvm.memset.p0i8.i32(i8 *%dest, i8 128, i32 1, i32 1, i1 false) 32 ret void 33 } 34 35 ; 1 byte, i64 version. 36 define void @f4(i8 *%dest) { 37 ; CHECK-LABEL: f4: 38 ; CHECK: mvi 0(%r2), 128 39 ; CHECK: br %r14 40 call void @llvm.memset.p0i8.i64(i8 *%dest, i8 128, i64 1, i32 1, i1 false) 41 ret void 42 } 43 44 ; 2 bytes, i32 version. 45 define void @f5(i8 *%dest) { 46 ; CHECK-LABEL: f5: 47 ; CHECK: mvhhi 0(%r2), -32640 48 ; CHECK: br %r14 49 call void @llvm.memset.p0i8.i32(i8 *%dest, i8 128, i32 2, i32 1, i1 false) 50 ret void 51 } 52 53 ; 2 bytes, i64 version. 54 define void @f6(i8 *%dest) { 55 ; CHECK-LABEL: f6: 56 ; CHECK: mvhhi 0(%r2), -32640 57 ; CHECK: br %r14 58 call void @llvm.memset.p0i8.i64(i8 *%dest, i8 128, i64 2, i32 1, i1 false) 59 ret void 60 } 61 62 ; 3 bytes, i32 version. 63 define void @f7(i8 *%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.p0i8.i32(i8 *%dest, i8 128, i32 3, i32 1, i1 false) 69 ret void 70 } 71 72 ; 3 bytes, i64 version. 73 define void @f8(i8 *%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.p0i8.i64(i8 *%dest, i8 128, i64 3, i32 1, i1 false) 79 ret void 80 } 81 82 ; 4 bytes, i32 version. 83 define void @f9(i8 *%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.p0i8.i32(i8 *%dest, i8 128, i32 4, i32 1, i1 false) 89 ret void 90 } 91 92 ; 4 bytes, i64 version. 93 define void @f10(i8 *%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.p0i8.i64(i8 *%dest, i8 128, i64 4, i32 1, i1 false) 99 ret void 100 } 101 102 ; 5 bytes, i32 version. 103 define void @f11(i8 *%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.p0i8.i32(i8 *%dest, i8 128, i32 5, i32 1, i1 false) 109 ret void 110 } 111 112 ; 5 bytes, i64 version. 113 define void @f12(i8 *%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.p0i8.i64(i8 *%dest, i8 128, i64 5, i32 1, i1 false) 119 ret void 120 } 121 122 ; 257 bytes, i32 version. 123 define void @f13(i8 *%dest) { 124 ; CHECK-LABEL: f13: 125 ; CHECK: mvi 0(%r2), 128 126 ; CHECK: mvc 1(256,%r2), 0(%r2) 127 ; CHECK: br %r14 128 call void @llvm.memset.p0i8.i32(i8 *%dest, i8 128, i32 257, i32 1, i1 false) 129 ret void 130 } 131 132 ; 257 bytes, i64 version. 133 define void @f14(i8 *%dest) { 134 ; CHECK-LABEL: f14: 135 ; CHECK: mvi 0(%r2), 128 136 ; CHECK: mvc 1(256,%r2), 0(%r2) 137 ; CHECK: br %r14 138 call void @llvm.memset.p0i8.i64(i8 *%dest, i8 128, i64 257, i32 1, i1 false) 139 ret void 140 } 141 142 ; 258 bytes, i32 version. We need two MVCs. 143 define void @f15(i8 *%dest) { 144 ; CHECK-LABEL: f15: 145 ; CHECK: mvi 0(%r2), 128 146 ; CHECK: mvc 1(256,%r2), 0(%r2) 147 ; CHECK: mvc 257(1,%r2), 256(%r2) 148 ; CHECK: br %r14 149 call void @llvm.memset.p0i8.i32(i8 *%dest, i8 128, i32 258, i32 1, i1 false) 150 ret void 151 } 152 153 ; 258 bytes, i64 version. 154 define void @f16(i8 *%dest) { 155 ; CHECK-LABEL: f16: 156 ; CHECK: mvi 0(%r2), 128 157 ; CHECK: mvc 1(256,%r2), 0(%r2) 158 ; CHECK: mvc 257(1,%r2), 256(%r2) 159 ; CHECK: br %r14 160 call void @llvm.memset.p0i8.i64(i8 *%dest, i8 128, i64 258, i32 1, i1 false) 161 ret void 162 } 163