brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.6 KiB · a56e324 Raw
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