167 lines · plain
1; Test moves of integers to byte memory locations.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5; Check the low end of the unsigned range.6define void @f1(ptr %ptr) {7; CHECK-LABEL: f1:8; CHECK: mvi 0(%r2), 09; CHECK: br %r1410 store i8 0, ptr %ptr11 ret void12}13 14; Check the high end of the signed range.15define void @f2(ptr %ptr) {16; CHECK-LABEL: f2:17; CHECK: mvi 0(%r2), 12718; CHECK: br %r1419 store i8 127, ptr %ptr20 ret void21}22 23; Check the next value up.24define void @f3(ptr %ptr) {25; CHECK-LABEL: f3:26; CHECK: mvi 0(%r2), 12827; CHECK: br %r1428 store i8 -128, ptr %ptr29 ret void30}31 32; Check the high end of the unsigned range.33define void @f4(ptr %ptr) {34; CHECK-LABEL: f4:35; CHECK: mvi 0(%r2), 25536; CHECK: br %r1437 store i8 255, ptr %ptr38 ret void39}40 41; Check -1.42define void @f5(ptr %ptr) {43; CHECK-LABEL: f5:44; CHECK: mvi 0(%r2), 25545; CHECK: br %r1446 store i8 -1, ptr %ptr47 ret void48}49 50; Check the low end of the signed range.51define void @f6(ptr %ptr) {52; CHECK-LABEL: f6:53; CHECK: mvi 0(%r2), 12854; CHECK: br %r1455 store i8 -128, ptr %ptr56 ret void57}58 59; Check the next value down.60define void @f7(ptr %ptr) {61; CHECK-LABEL: f7:62; CHECK: mvi 0(%r2), 12763; CHECK: br %r1464 store i8 -129, ptr %ptr65 ret void66}67 68; Check the high end of the MVI range.69define void @f8(ptr %src) {70; CHECK-LABEL: f8:71; CHECK: mvi 4095(%r2), 4272; CHECK: br %r1473 %ptr = getelementptr i8, ptr %src, i64 409574 store i8 42, ptr %ptr75 ret void76}77 78; Check the next byte up, which should use MVIY instead of MVI.79define void @f9(ptr %src) {80; CHECK-LABEL: f9:81; CHECK: mviy 4096(%r2), 4282; CHECK: br %r1483 %ptr = getelementptr i8, ptr %src, i64 409684 store i8 42, ptr %ptr85 ret void86}87 88; Check the high end of the MVIY range.89define void @f10(ptr %src) {90; CHECK-LABEL: f10:91; CHECK: mviy 524287(%r2), 4292; CHECK: br %r1493 %ptr = getelementptr i8, ptr %src, i64 52428794 store i8 42, ptr %ptr95 ret void96}97 98; Check the next byte up, which needs separate address logic.99; Other sequences besides this one would be OK.100define void @f11(ptr %src) {101; CHECK-LABEL: f11:102; CHECK: agfi %r2, 524288103; CHECK: mvi 0(%r2), 42104; CHECK: br %r14105 %ptr = getelementptr i8, ptr %src, i64 524288106 store i8 42, ptr %ptr107 ret void108}109 110; Check the high end of the negative MVIY range.111define void @f12(ptr %src) {112; CHECK-LABEL: f12:113; CHECK: mviy -1(%r2), 42114; CHECK: br %r14115 %ptr = getelementptr i8, ptr %src, i64 -1116 store i8 42, ptr %ptr117 ret void118}119 120; Check the low end of the MVIY range.121define void @f13(ptr %src) {122; CHECK-LABEL: f13:123; CHECK: mviy -524288(%r2), 42124; CHECK: br %r14125 %ptr = getelementptr i8, ptr %src, i64 -524288126 store i8 42, ptr %ptr127 ret void128}129 130; Check the next byte down, which needs separate address logic.131; Other sequences besides this one would be OK.132define void @f14(ptr %src) {133; CHECK-LABEL: f14:134; CHECK: agfi %r2, -524289135; CHECK: mvi 0(%r2), 42136; CHECK: br %r14137 %ptr = getelementptr i8, ptr %src, i64 -524289138 store i8 42, ptr %ptr139 ret void140}141 142; Check that MVI does not allow an index. We prefer STC in that case.143define void @f15(i64 %src, i64 %index) {144; CHECK-LABEL: f15:145; CHECK: lhi [[TMP:%r[0-5]]], 42146; CHECK: stc [[TMP]], 4095({{%r2,%r3|%r3,%r2}}147; CHECK: br %r14148 %add1 = add i64 %src, %index149 %add2 = add i64 %add1, 4095150 %ptr = inttoptr i64 %add2 to ptr151 store i8 42, ptr %ptr152 ret void153}154 155; Check that MVIY does not allow an index. We prefer STCY in that case.156define void @f16(i64 %src, i64 %index) {157; CHECK-LABEL: f16:158; CHECK: lhi [[TMP:%r[0-5]]], 42159; CHECK: stcy [[TMP]], 4096({{%r2,%r3|%r3,%r2}}160; CHECK: br %r14161 %add1 = add i64 %src, %index162 %add2 = add i64 %add1, 4096163 %ptr = inttoptr i64 %add2 to ptr164 store i8 42, ptr %ptr165 ret void166}167