421 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mcpu=z15 %s -mtriple=s390x-linux-gnu -o - | FileCheck %s3;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 %r1414 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 17, i1 false)15 ret void16}17 18define void @reg18(ptr %Dst, i8 %val) {19; CHECK-LABEL: reg18:20; CHECK: # %bb.0:21; CHECK-NEXT: vlvgp %v0, %r3, %r322; CHECK-NEXT: vrepb %v0, %v0, 723; CHECK-NEXT: vst %v0, 0(%r2), 424; CHECK-NEXT: vsteh %v0, 16(%r2), 025; CHECK-NEXT: br %r1426 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 18, i1 false)27 ret void28}29 30define void @reg19(ptr %Dst, i8 %val) {31; CHECK-LABEL: reg19:32; CHECK: # %bb.0:33; CHECK-NEXT: vlvgp %v0, %r3, %r334; CHECK-NEXT: vrepb %v0, %v0, 735; CHECK-NEXT: vstef %v0, 15(%r2), 036; CHECK-NEXT: vst %v0, 0(%r2), 437; CHECK-NEXT: br %r1438 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 19, i1 false)39 ret void40}41 42define void @reg20(ptr %Dst, i8 %val) {43; CHECK-LABEL: reg20:44; CHECK: # %bb.0:45; CHECK-NEXT: vlvgp %v0, %r3, %r346; CHECK-NEXT: vrepb %v0, %v0, 747; CHECK-NEXT: vstef %v0, 16(%r2), 048; CHECK-NEXT: vst %v0, 0(%r2), 449; CHECK-NEXT: br %r1450 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 20, i1 false)51 ret void52}53 54define void @reg21(ptr %Dst, i8 %val) {55; CHECK-LABEL: reg21:56; CHECK: # %bb.0:57; CHECK-NEXT: vlvgp %v0, %r3, %r358; CHECK-NEXT: vrepb %v0, %v0, 759; CHECK-NEXT: vsteg %v0, 13(%r2), 060; CHECK-NEXT: vst %v0, 0(%r2), 461; CHECK-NEXT: br %r1462 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 21, i1 false)63 ret void64}65 66define void @reg22(ptr %Dst, i8 %val) {67; CHECK-LABEL: reg22:68; CHECK: # %bb.0:69; CHECK-NEXT: vlvgp %v0, %r3, %r370; CHECK-NEXT: vrepb %v0, %v0, 771; CHECK-NEXT: vsteg %v0, 14(%r2), 072; CHECK-NEXT: vst %v0, 0(%r2), 473; CHECK-NEXT: br %r1474 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 22, i1 false)75 ret void76}77 78define void @reg23(ptr %Dst, i8 %val) {79; CHECK-LABEL: reg23:80; CHECK: # %bb.0:81; CHECK-NEXT: vlvgp %v0, %r3, %r382; CHECK-NEXT: vrepb %v0, %v0, 783; CHECK-NEXT: vsteg %v0, 15(%r2), 084; CHECK-NEXT: vst %v0, 0(%r2), 485; CHECK-NEXT: br %r1486 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 23, i1 false)87 ret void88}89 90define void @reg24(ptr %Dst, i8 %val) {91; CHECK-LABEL: reg24:92; CHECK: # %bb.0:93; CHECK-NEXT: vlvgp %v0, %r3, %r394; CHECK-NEXT: vrepb %v0, %v0, 795; CHECK-NEXT: vsteg %v0, 16(%r2), 096; CHECK-NEXT: vst %v0, 0(%r2), 497; CHECK-NEXT: br %r1498 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 24, i1 false)99 ret void100}101 102define void @reg25(ptr %Dst, i8 %val) {103; CHECK-LABEL: reg25:104; CHECK: # %bb.0:105; CHECK-NEXT: vlvgp %v0, %r3, %r3106; CHECK-NEXT: vrepb %v0, %v0, 7107; CHECK-NEXT: vst %v0, 9(%r2)108; CHECK-NEXT: vst %v0, 0(%r2), 4109; CHECK-NEXT: br %r14110 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 25, i1 false)111 ret void112}113 114define void @reg26(ptr %Dst, i8 %val) {115; CHECK-LABEL: reg26:116; CHECK: # %bb.0:117; CHECK-NEXT: vlvgp %v0, %r3, %r3118; CHECK-NEXT: vrepb %v0, %v0, 7119; CHECK-NEXT: vst %v0, 10(%r2)120; CHECK-NEXT: vst %v0, 0(%r2), 4121; CHECK-NEXT: br %r14122 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 26, i1 false)123 ret void124}125 126define void @reg27(ptr %Dst, i8 %val) {127; CHECK-LABEL: reg27:128; CHECK: # %bb.0:129; CHECK-NEXT: vlvgp %v0, %r3, %r3130; CHECK-NEXT: vrepb %v0, %v0, 7131; CHECK-NEXT: vst %v0, 11(%r2)132; CHECK-NEXT: vst %v0, 0(%r2), 4133; CHECK-NEXT: br %r14134 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 27, i1 false)135 ret void136}137 138define void @reg28(ptr %Dst, i8 %val) {139; CHECK-LABEL: reg28:140; CHECK: # %bb.0:141; CHECK-NEXT: vlvgp %v0, %r3, %r3142; CHECK-NEXT: vrepb %v0, %v0, 7143; CHECK-NEXT: vst %v0, 12(%r2)144; CHECK-NEXT: vst %v0, 0(%r2), 4145; CHECK-NEXT: br %r14146 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 28, i1 false)147 ret void148}149 150define void @reg29(ptr %Dst, i8 %val) {151; CHECK-LABEL: reg29:152; CHECK: # %bb.0:153; CHECK-NEXT: vlvgp %v0, %r3, %r3154; CHECK-NEXT: vrepb %v0, %v0, 7155; CHECK-NEXT: vst %v0, 13(%r2)156; CHECK-NEXT: vst %v0, 0(%r2), 4157; CHECK-NEXT: br %r14158 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 29, i1 false)159 ret void160}161 162define void @reg30(ptr %Dst, i8 %val) {163; CHECK-LABEL: reg30:164; CHECK: # %bb.0:165; CHECK-NEXT: vlvgp %v0, %r3, %r3166; CHECK-NEXT: vrepb %v0, %v0, 7167; CHECK-NEXT: vst %v0, 14(%r2)168; CHECK-NEXT: vst %v0, 0(%r2), 4169; CHECK-NEXT: br %r14170 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 30, i1 false)171 ret void172}173 174define void @reg31(ptr %Dst, i8 %val) {175; CHECK-LABEL: reg31:176; CHECK: # %bb.0:177; CHECK-NEXT: vlvgp %v0, %r3, %r3178; CHECK-NEXT: vrepb %v0, %v0, 7179; CHECK-NEXT: vst %v0, 15(%r2)180; CHECK-NEXT: vst %v0, 0(%r2), 4181; CHECK-NEXT: br %r14182 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 31, i1 false)183 ret void184}185 186define void @reg32(ptr %Dst, i8 %val) {187; CHECK-LABEL: reg32:188; CHECK: # %bb.0:189; CHECK-NEXT: vlvgp %v0, %r3, %r3190; CHECK-NEXT: vrepb %v0, %v0, 7191; CHECK-NEXT: vst %v0, 16(%r2), 4192; CHECK-NEXT: vst %v0, 0(%r2), 4193; CHECK-NEXT: br %r14194 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 32, i1 false)195 ret void196}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 %r14204 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 33, i1 false)205 ret void206}207 208;; Immediate value209 210define void @imm17(ptr %Dst) {211; CHECK-LABEL: imm17:212; CHECK: # %bb.0:213; CHECK-NEXT: mvi 0(%r2), 1214; CHECK-NEXT: mvc 1(16,%r2), 0(%r2)215; CHECK-NEXT: br %r14216 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 17, i1 false)217 ret void218}219 220define void @imm18(ptr %Dst) {221; CHECK-LABEL: imm18:222; CHECK: # %bb.0:223; CHECK-NEXT: vgbm %v0, 65535224; CHECK-NEXT: vst %v0, 0(%r2), 4225; CHECK-NEXT: mvhhi 16(%r2), -1226; CHECK-NEXT: br %r14227 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 18, i1 false)228 ret void229}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 %r14236 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 0, i64 18, i1 false)237 ret void238}239 240define void @imm19(ptr %Dst) {241; CHECK-LABEL: imm19:242; CHECK: # %bb.0:243; CHECK-NEXT: vrepib %v0, 1244; CHECK-NEXT: vstef %v0, 15(%r2), 0245; CHECK-NEXT: vst %v0, 0(%r2), 4246; CHECK-NEXT: br %r14247 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 19, i1 false)248 ret void249}250 251define void @imm20(ptr %Dst) {252; CHECK-LABEL: imm20:253; CHECK: # %bb.0:254; CHECK-NEXT: vgbm %v0, 65535255; CHECK-NEXT: vst %v0, 0(%r2), 4256; CHECK-NEXT: mvhi 16(%r2), -1257; CHECK-NEXT: br %r14258 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 20, i1 false)259 ret void260}261 262define void @imm21(ptr %Dst) {263; CHECK-LABEL: imm21:264; CHECK: # %bb.0:265; CHECK-NEXT: vrepib %v0, 1266; CHECK-NEXT: vsteg %v0, 13(%r2), 0267; CHECK-NEXT: vst %v0, 0(%r2), 4268; CHECK-NEXT: br %r14269 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 21, i1 false)270 ret void271}272 273define void @imm22(ptr %Dst) {274; CHECK-LABEL: imm22:275; CHECK: # %bb.0:276; CHECK-NEXT: vgbm %v0, 65535277; CHECK-NEXT: vst %v0, 0(%r2), 4278; CHECK-NEXT: mvghi 14(%r2), -1279; CHECK-NEXT: br %r14280 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 22, i1 false)281 ret void282}283 284define void @imm23(ptr %Dst) {285; CHECK-LABEL: imm23:286; CHECK: # %bb.0:287; CHECK-NEXT: vrepib %v0, 1288; CHECK-NEXT: vsteg %v0, 15(%r2), 0289; CHECK-NEXT: vst %v0, 0(%r2), 4290; CHECK-NEXT: br %r14291 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 23, i1 false)292 ret void293}294 295define void @imm24(ptr %Dst) {296; CHECK-LABEL: imm24:297; CHECK: # %bb.0:298; CHECK-NEXT: vgbm %v0, 65535299; CHECK-NEXT: vst %v0, 0(%r2), 4300; CHECK-NEXT: mvghi 16(%r2), -1301; CHECK-NEXT: br %r14302 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 24, i1 false)303 ret void304}305 306define void @imm25(ptr %Dst) {307; CHECK-LABEL: imm25:308; CHECK: # %bb.0:309; CHECK-NEXT: vrepib %v0, 1310; CHECK-NEXT: vst %v0, 9(%r2)311; CHECK-NEXT: vst %v0, 0(%r2), 4312; CHECK-NEXT: br %r14313 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 25, i1 false)314 ret void315}316 317define void @imm26(ptr %Dst) {318; CHECK-LABEL: imm26:319; CHECK: # %bb.0:320; CHECK-NEXT: vgbm %v0, 65535321; CHECK-NEXT: vst %v0, 10(%r2)322; CHECK-NEXT: vst %v0, 0(%r2), 4323; CHECK-NEXT: br %r14324 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 26, i1 false)325 ret void326}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 %r14333 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 0, i64 26, i1 false)334 ret void335}336 337define void @imm27(ptr %Dst) {338; CHECK-LABEL: imm27:339; CHECK: # %bb.0:340; CHECK-NEXT: vrepib %v0, 1341; CHECK-NEXT: vst %v0, 11(%r2)342; CHECK-NEXT: vst %v0, 0(%r2), 4343; CHECK-NEXT: br %r14344 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 27, i1 false)345 ret void346}347 348define void @imm28(ptr %Dst) {349; CHECK-LABEL: imm28:350; CHECK: # %bb.0:351; CHECK-NEXT: vgbm %v0, 65535352; CHECK-NEXT: vst %v0, 12(%r2)353; CHECK-NEXT: vst %v0, 0(%r2), 4354; CHECK-NEXT: br %r14355 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 28, i1 false)356 ret void357}358 359define void @imm29(ptr %Dst) {360; CHECK-LABEL: imm29:361; CHECK: # %bb.0:362; CHECK-NEXT: vrepib %v0, 1363; CHECK-NEXT: vst %v0, 13(%r2)364; CHECK-NEXT: vst %v0, 0(%r2), 4365; CHECK-NEXT: br %r14366 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 29, i1 false)367 ret void368}369 370define void @imm30(ptr %Dst) {371; CHECK-LABEL: imm30:372; CHECK: # %bb.0:373; CHECK-NEXT: vgbm %v0, 65535374; CHECK-NEXT: vst %v0, 14(%r2)375; CHECK-NEXT: vst %v0, 0(%r2), 4376; CHECK-NEXT: br %r14377 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 30, i1 false)378 ret void379}380 381define void @imm31(ptr %Dst) {382; CHECK-LABEL: imm31:383; CHECK: # %bb.0:384; CHECK-NEXT: vrepib %v0, 1385; CHECK-NEXT: vst %v0, 15(%r2)386; CHECK-NEXT: vst %v0, 0(%r2), 4387; CHECK-NEXT: br %r14388 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 31, i1 false)389 ret void390}391 392define void @imm32(ptr %Dst) {393; CHECK-LABEL: imm32:394; CHECK: # %bb.0:395; CHECK-NEXT: vgbm %v0, 65535396; CHECK-NEXT: vst %v0, 16(%r2), 4397; CHECK-NEXT: vst %v0, 0(%r2), 4398; CHECK-NEXT: br %r14399 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 32, i1 false)400 ret void401}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 %r14408 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 0, i64 32, i1 false)409 ret void410}411 412define void @imm33(ptr %Dst) {413; CHECK-LABEL: imm33:414; CHECK: # %bb.0:415; CHECK-NEXT: mvi 0(%r2), 1416; CHECK-NEXT: mvc 1(32,%r2), 0(%r2)417; CHECK-NEXT: br %r14418 call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 33, i1 false)419 ret void420}421