112 lines · plain
1; Test moves of integers to 2-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: mvhhi 0(%r2), 09; CHECK: br %r1410 store i16 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: mvhhi 0(%r2), 3276718; CHECK: br %r1419 store i16 32767, ptr %ptr20 ret void21}22 23; Check the next value up.24define void @f3(ptr %ptr) {25; CHECK-LABEL: f3:26; CHECK: mvhhi 0(%r2), -3276827; CHECK: br %r1428 store i16 -32768, 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: mvhhi 0(%r2), -136; CHECK: br %r1437 store i16 65535, ptr %ptr38 ret void39}40 41; Check -1.42define void @f5(ptr %ptr) {43; CHECK-LABEL: f5:44; CHECK: mvhhi 0(%r2), -145; CHECK: br %r1446 store i16 -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: mvhhi 0(%r2), -3276854; CHECK: br %r1455 store i16 -32768, ptr %ptr56 ret void57}58 59; Check the next value down.60define void @f7(ptr %ptr) {61; CHECK-LABEL: f7:62; CHECK: mvhhi 0(%r2), 3276763; CHECK: br %r1464 store i16 -32769, ptr %ptr65 ret void66}67 68; Check the high end of the MVHHI range.69define void @f8(ptr %a) {70; CHECK-LABEL: f8:71; CHECK: mvhhi 4094(%r2), 4272; CHECK: br %r1473 %ptr = getelementptr i16, ptr %a, i64 204774 store i16 42, ptr %ptr75 ret void76}77 78; Check the next halfword up, which is out of range. We prefer STHY79; in that case.80define void @f9(ptr %a) {81; CHECK-LABEL: f9:82; CHECK: lhi [[TMP:%r[0-5]]], 4283; CHECK: sthy [[TMP]], 4096(%r2)84; CHECK: br %r1485 %ptr = getelementptr i16, ptr %a, i64 204886 store i16 42, ptr %ptr87 ret void88}89 90; Check negative displacements, for which we again prefer STHY.91define void @f10(ptr %a) {92; CHECK-LABEL: f10:93; CHECK: lhi [[TMP:%r[0-5]]], 4294; CHECK: sthy [[TMP]], -2(%r2)95; CHECK: br %r1496 %ptr = getelementptr i16, ptr %a, i64 -197 store i16 42, ptr %ptr98 ret void99}100 101; Check that MVHHI does not allow an index.102define void @f11(i64 %src, i64 %index) {103; CHECK-LABEL: f11:104; CHECK: lhi [[TMP:%r[0-5]]], 42105; CHECK: sth [[TMP]], 0({{%r2,%r3|%r3,%r2}})106; CHECK: br %r14107 %add = add i64 %src, %index108 %ptr = inttoptr i64 %add to ptr109 store i16 42, ptr %ptr110 ret void111}112