1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mcpu=z15 %s -mtriple=s390x-linux-gnu -o - | FileCheck %s 3; 4; Test memsets of small constant lengths, that should not be done with MVC. 5 6declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) 7 8define void @reg17(ptr %Dst, i8 %val) { 9; CHECK-LABEL: reg17: 10; CHECK: # %bb.0: 11; CHECK-NEXT: stc %r3, 0(%r2) 12; CHECK-NEXT: mvc 1(16,%r2), 0(%r2) 13; CHECK-NEXT: br %r14 14 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 17, i1 false) 15 ret void 16} 17 18define void @reg18(ptr %Dst, i8 %val) { 19; CHECK-LABEL: reg18: 20; CHECK: # %bb.0: 21; CHECK-NEXT: vlvgp %v0, %r3, %r3 22; CHECK-NEXT: vrepb %v0, %v0, 7 23; CHECK-NEXT: vst %v0, 0(%r2), 4 24; CHECK-NEXT: vsteh %v0, 16(%r2), 0 25; CHECK-NEXT: br %r14 26 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 18, i1 false) 27 ret void 28} 29 30define void @reg19(ptr %Dst, i8 %val) { 31; CHECK-LABEL: reg19: 32; CHECK: # %bb.0: 33; CHECK-NEXT: vlvgp %v0, %r3, %r3 34; CHECK-NEXT: vrepb %v0, %v0, 7 35; CHECK-NEXT: vstef %v0, 15(%r2), 0 36; CHECK-NEXT: vst %v0, 0(%r2), 4 37; CHECK-NEXT: br %r14 38 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 19, i1 false) 39 ret void 40} 41 42define void @reg20(ptr %Dst, i8 %val) { 43; CHECK-LABEL: reg20: 44; CHECK: # %bb.0: 45; CHECK-NEXT: vlvgp %v0, %r3, %r3 46; CHECK-NEXT: vrepb %v0, %v0, 7 47; CHECK-NEXT: vstef %v0, 16(%r2), 0 48; CHECK-NEXT: vst %v0, 0(%r2), 4 49; CHECK-NEXT: br %r14 50 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 20, i1 false) 51 ret void 52} 53 54define void @reg21(ptr %Dst, i8 %val) { 55; CHECK-LABEL: reg21: 56; CHECK: # %bb.0: 57; CHECK-NEXT: vlvgp %v0, %r3, %r3 58; CHECK-NEXT: vrepb %v0, %v0, 7 59; CHECK-NEXT: vsteg %v0, 13(%r2), 0 60; CHECK-NEXT: vst %v0, 0(%r2), 4 61; CHECK-NEXT: br %r14 62 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 21, i1 false) 63 ret void 64} 65 66define void @reg22(ptr %Dst, i8 %val) { 67; CHECK-LABEL: reg22: 68; CHECK: # %bb.0: 69; CHECK-NEXT: vlvgp %v0, %r3, %r3 70; CHECK-NEXT: vrepb %v0, %v0, 7 71; CHECK-NEXT: vsteg %v0, 14(%r2), 0 72; CHECK-NEXT: vst %v0, 0(%r2), 4 73; CHECK-NEXT: br %r14 74 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 22, i1 false) 75 ret void 76} 77 78define void @reg23(ptr %Dst, i8 %val) { 79; CHECK-LABEL: reg23: 80; CHECK: # %bb.0: 81; CHECK-NEXT: vlvgp %v0, %r3, %r3 82; CHECK-NEXT: vrepb %v0, %v0, 7 83; CHECK-NEXT: vsteg %v0, 15(%r2), 0 84; CHECK-NEXT: vst %v0, 0(%r2), 4 85; CHECK-NEXT: br %r14 86 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 23, i1 false) 87 ret void 88} 89 90define void @reg24(ptr %Dst, i8 %val) { 91; CHECK-LABEL: reg24: 92; CHECK: # %bb.0: 93; CHECK-NEXT: vlvgp %v0, %r3, %r3 94; CHECK-NEXT: vrepb %v0, %v0, 7 95; CHECK-NEXT: vsteg %v0, 16(%r2), 0 96; CHECK-NEXT: vst %v0, 0(%r2), 4 97; CHECK-NEXT: br %r14 98 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 24, i1 false) 99 ret void 100} 101 102define void @reg25(ptr %Dst, i8 %val) { 103; CHECK-LABEL: reg25: 104; CHECK: # %bb.0: 105; CHECK-NEXT: vlvgp %v0, %r3, %r3 106; CHECK-NEXT: vrepb %v0, %v0, 7 107; CHECK-NEXT: vst %v0, 9(%r2) 108; CHECK-NEXT: vst %v0, 0(%r2), 4 109; CHECK-NEXT: br %r14 110 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 25, i1 false) 111 ret void 112} 113 114define void @reg26(ptr %Dst, i8 %val) { 115; CHECK-LABEL: reg26: 116; CHECK: # %bb.0: 117; CHECK-NEXT: vlvgp %v0, %r3, %r3 118; CHECK-NEXT: vrepb %v0, %v0, 7 119; CHECK-NEXT: vst %v0, 10(%r2) 120; CHECK-NEXT: vst %v0, 0(%r2), 4 121; CHECK-NEXT: br %r14 122 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 26, i1 false) 123 ret void 124} 125 126define void @reg27(ptr %Dst, i8 %val) { 127; CHECK-LABEL: reg27: 128; CHECK: # %bb.0: 129; CHECK-NEXT: vlvgp %v0, %r3, %r3 130; CHECK-NEXT: vrepb %v0, %v0, 7 131; CHECK-NEXT: vst %v0, 11(%r2) 132; CHECK-NEXT: vst %v0, 0(%r2), 4 133; CHECK-NEXT: br %r14 134 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 27, i1 false) 135 ret void 136} 137 138define void @reg28(ptr %Dst, i8 %val) { 139; CHECK-LABEL: reg28: 140; CHECK: # %bb.0: 141; CHECK-NEXT: vlvgp %v0, %r3, %r3 142; CHECK-NEXT: vrepb %v0, %v0, 7 143; CHECK-NEXT: vst %v0, 12(%r2) 144; CHECK-NEXT: vst %v0, 0(%r2), 4 145; CHECK-NEXT: br %r14 146 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 28, i1 false) 147 ret void 148} 149 150define void @reg29(ptr %Dst, i8 %val) { 151; CHECK-LABEL: reg29: 152; CHECK: # %bb.0: 153; CHECK-NEXT: vlvgp %v0, %r3, %r3 154; CHECK-NEXT: vrepb %v0, %v0, 7 155; CHECK-NEXT: vst %v0, 13(%r2) 156; CHECK-NEXT: vst %v0, 0(%r2), 4 157; CHECK-NEXT: br %r14 158 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 29, i1 false) 159 ret void 160} 161 162define void @reg30(ptr %Dst, i8 %val) { 163; CHECK-LABEL: reg30: 164; CHECK: # %bb.0: 165; CHECK-NEXT: vlvgp %v0, %r3, %r3 166; CHECK-NEXT: vrepb %v0, %v0, 7 167; CHECK-NEXT: vst %v0, 14(%r2) 168; CHECK-NEXT: vst %v0, 0(%r2), 4 169; CHECK-NEXT: br %r14 170 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 30, i1 false) 171 ret void 172} 173 174define void @reg31(ptr %Dst, i8 %val) { 175; CHECK-LABEL: reg31: 176; CHECK: # %bb.0: 177; CHECK-NEXT: vlvgp %v0, %r3, %r3 178; CHECK-NEXT: vrepb %v0, %v0, 7 179; CHECK-NEXT: vst %v0, 15(%r2) 180; CHECK-NEXT: vst %v0, 0(%r2), 4 181; CHECK-NEXT: br %r14 182 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 31, i1 false) 183 ret void 184} 185 186define void @reg32(ptr %Dst, i8 %val) { 187; CHECK-LABEL: reg32: 188; CHECK: # %bb.0: 189; CHECK-NEXT: vlvgp %v0, %r3, %r3 190; CHECK-NEXT: vrepb %v0, %v0, 7 191; CHECK-NEXT: vst %v0, 16(%r2), 4 192; CHECK-NEXT: vst %v0, 0(%r2), 4 193; CHECK-NEXT: br %r14 194 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 32, i1 false) 195 ret void 196} 197 198define void @reg33(ptr %Dst, i8 %val) { 199; CHECK-LABEL: reg33: 200; CHECK: # %bb.0: 201; CHECK-NEXT: stc %r3, 0(%r2) 202; CHECK-NEXT: mvc 1(32,%r2), 0(%r2) 203; CHECK-NEXT: br %r14 204 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 33, i1 false) 205 ret void 206} 207 208;; Immediate value 209 210define void @imm17(ptr %Dst) { 211; CHECK-LABEL: imm17: 212; CHECK: # %bb.0: 213; CHECK-NEXT: mvi 0(%r2), 1 214; CHECK-NEXT: mvc 1(16,%r2), 0(%r2) 215; CHECK-NEXT: br %r14 216 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 17, i1 false) 217 ret void 218} 219 220define void @imm18(ptr %Dst) { 221; CHECK-LABEL: imm18: 222; CHECK: # %bb.0: 223; CHECK-NEXT: vgbm %v0, 65535 224; CHECK-NEXT: vst %v0, 0(%r2), 4 225; CHECK-NEXT: mvhhi 16(%r2), -1 226; CHECK-NEXT: br %r14 227 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 18, i1 false) 228 ret void 229} 230 231define void @zero18(ptr %Dst) { 232; CHECK-LABEL: zero18: 233; CHECK: # %bb.0: 234; CHECK-NEXT: xc 0(18,%r2), 0(%r2) 235; CHECK-NEXT: br %r14 236 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 0, i64 18, i1 false) 237 ret void 238} 239 240define void @imm19(ptr %Dst) { 241; CHECK-LABEL: imm19: 242; CHECK: # %bb.0: 243; CHECK-NEXT: vrepib %v0, 1 244; CHECK-NEXT: vstef %v0, 15(%r2), 0 245; CHECK-NEXT: vst %v0, 0(%r2), 4 246; CHECK-NEXT: br %r14 247 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 19, i1 false) 248 ret void 249} 250 251define void @imm20(ptr %Dst) { 252; CHECK-LABEL: imm20: 253; CHECK: # %bb.0: 254; CHECK-NEXT: vgbm %v0, 65535 255; CHECK-NEXT: vst %v0, 0(%r2), 4 256; CHECK-NEXT: mvhi 16(%r2), -1 257; CHECK-NEXT: br %r14 258 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 20, i1 false) 259 ret void 260} 261 262define void @imm21(ptr %Dst) { 263; CHECK-LABEL: imm21: 264; CHECK: # %bb.0: 265; CHECK-NEXT: vrepib %v0, 1 266; CHECK-NEXT: vsteg %v0, 13(%r2), 0 267; CHECK-NEXT: vst %v0, 0(%r2), 4 268; CHECK-NEXT: br %r14 269 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 21, i1 false) 270 ret void 271} 272 273define void @imm22(ptr %Dst) { 274; CHECK-LABEL: imm22: 275; CHECK: # %bb.0: 276; CHECK-NEXT: vgbm %v0, 65535 277; CHECK-NEXT: vst %v0, 0(%r2), 4 278; CHECK-NEXT: mvghi 14(%r2), -1 279; CHECK-NEXT: br %r14 280 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 22, i1 false) 281 ret void 282} 283 284define void @imm23(ptr %Dst) { 285; CHECK-LABEL: imm23: 286; CHECK: # %bb.0: 287; CHECK-NEXT: vrepib %v0, 1 288; CHECK-NEXT: vsteg %v0, 15(%r2), 0 289; CHECK-NEXT: vst %v0, 0(%r2), 4 290; CHECK-NEXT: br %r14 291 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 23, i1 false) 292 ret void 293} 294 295define void @imm24(ptr %Dst) { 296; CHECK-LABEL: imm24: 297; CHECK: # %bb.0: 298; CHECK-NEXT: vgbm %v0, 65535 299; CHECK-NEXT: vst %v0, 0(%r2), 4 300; CHECK-NEXT: mvghi 16(%r2), -1 301; CHECK-NEXT: br %r14 302 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 24, i1 false) 303 ret void 304} 305 306define void @imm25(ptr %Dst) { 307; CHECK-LABEL: imm25: 308; CHECK: # %bb.0: 309; CHECK-NEXT: vrepib %v0, 1 310; CHECK-NEXT: vst %v0, 9(%r2) 311; CHECK-NEXT: vst %v0, 0(%r2), 4 312; CHECK-NEXT: br %r14 313 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 25, i1 false) 314 ret void 315} 316 317define void @imm26(ptr %Dst) { 318; CHECK-LABEL: imm26: 319; CHECK: # %bb.0: 320; CHECK-NEXT: vgbm %v0, 65535 321; CHECK-NEXT: vst %v0, 10(%r2) 322; CHECK-NEXT: vst %v0, 0(%r2), 4 323; CHECK-NEXT: br %r14 324 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 26, i1 false) 325 ret void 326} 327 328define void @zero26(ptr %Dst) { 329; CHECK-LABEL: zero26: 330; CHECK: # %bb.0: 331; CHECK-NEXT: xc 0(26,%r2), 0(%r2) 332; CHECK-NEXT: br %r14 333 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 0, i64 26, i1 false) 334 ret void 335} 336 337define void @imm27(ptr %Dst) { 338; CHECK-LABEL: imm27: 339; CHECK: # %bb.0: 340; CHECK-NEXT: vrepib %v0, 1 341; CHECK-NEXT: vst %v0, 11(%r2) 342; CHECK-NEXT: vst %v0, 0(%r2), 4 343; CHECK-NEXT: br %r14 344 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 27, i1 false) 345 ret void 346} 347 348define void @imm28(ptr %Dst) { 349; CHECK-LABEL: imm28: 350; CHECK: # %bb.0: 351; CHECK-NEXT: vgbm %v0, 65535 352; CHECK-NEXT: vst %v0, 12(%r2) 353; CHECK-NEXT: vst %v0, 0(%r2), 4 354; CHECK-NEXT: br %r14 355 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 28, i1 false) 356 ret void 357} 358 359define void @imm29(ptr %Dst) { 360; CHECK-LABEL: imm29: 361; CHECK: # %bb.0: 362; CHECK-NEXT: vrepib %v0, 1 363; CHECK-NEXT: vst %v0, 13(%r2) 364; CHECK-NEXT: vst %v0, 0(%r2), 4 365; CHECK-NEXT: br %r14 366 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 29, i1 false) 367 ret void 368} 369 370define void @imm30(ptr %Dst) { 371; CHECK-LABEL: imm30: 372; CHECK: # %bb.0: 373; CHECK-NEXT: vgbm %v0, 65535 374; CHECK-NEXT: vst %v0, 14(%r2) 375; CHECK-NEXT: vst %v0, 0(%r2), 4 376; CHECK-NEXT: br %r14 377 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 30, i1 false) 378 ret void 379} 380 381define void @imm31(ptr %Dst) { 382; CHECK-LABEL: imm31: 383; CHECK: # %bb.0: 384; CHECK-NEXT: vrepib %v0, 1 385; CHECK-NEXT: vst %v0, 15(%r2) 386; CHECK-NEXT: vst %v0, 0(%r2), 4 387; CHECK-NEXT: br %r14 388 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 31, i1 false) 389 ret void 390} 391 392define void @imm32(ptr %Dst) { 393; CHECK-LABEL: imm32: 394; CHECK: # %bb.0: 395; CHECK-NEXT: vgbm %v0, 65535 396; CHECK-NEXT: vst %v0, 16(%r2), 4 397; CHECK-NEXT: vst %v0, 0(%r2), 4 398; CHECK-NEXT: br %r14 399 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 32, i1 false) 400 ret void 401} 402 403define void @zero32(ptr %Dst) { 404; CHECK-LABEL: zero32: 405; CHECK: # %bb.0: 406; CHECK-NEXT: xc 0(32,%r2), 0(%r2) 407; CHECK-NEXT: br %r14 408 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 0, i64 32, i1 false) 409 ret void 410} 411 412define void @imm33(ptr %Dst) { 413; CHECK-LABEL: imm33: 414; CHECK: # %bb.0: 415; CHECK-NEXT: mvi 0(%r2), 1 416; CHECK-NEXT: mvc 1(32,%r2), 0(%r2) 417; CHECK-NEXT: br %r14 418 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 33, i1 false) 419 ret void 420} 421