105 lines · plain
1; Test sign extensions from an i32 to an i64.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5; Test register extension, starting with an i32.6define i64 @f1(i32 %a) {7; CHECK-LABEL: f1:8; CHECK: lgfr %r2, %r29; CHECK: br %r1410 %ext = sext i32 %a to i6411 ret i64 %ext12}13 14; ...and again with an i64.15define i64 @f2(i64 %a) {16; CHECK-LABEL: f2:17; CHECK: lgfr %r2, %r218; CHECK: br %r1419 %word = trunc i64 %a to i3220 %ext = sext i32 %word to i6421 ret i64 %ext22}23 24; Check LGF with no displacement.25define i64 @f3(ptr %src) {26; CHECK-LABEL: f3:27; CHECK: lgf %r2, 0(%r2)28; CHECK: br %r1429 %word = load i32, ptr %src30 %ext = sext i32 %word to i6431 ret i64 %ext32}33 34; Check the high end of the LGF range.35define i64 @f4(ptr %src) {36; CHECK-LABEL: f4:37; CHECK: lgf %r2, 524284(%r2)38; CHECK: br %r1439 %ptr = getelementptr i32, ptr %src, i64 13107140 %word = load i32, ptr %ptr41 %ext = sext i32 %word to i6442 ret i64 %ext43}44 45; Check the next word up, which needs separate address logic.46; Other sequences besides this one would be OK.47define i64 @f5(ptr %src) {48; CHECK-LABEL: f5:49; CHECK: agfi %r2, 52428850; CHECK: lgf %r2, 0(%r2)51; CHECK: br %r1452 %ptr = getelementptr i32, ptr %src, i64 13107253 %word = load i32, ptr %ptr54 %ext = sext i32 %word to i6455 ret i64 %ext56}57 58; Check the high end of the negative LGF range.59define i64 @f6(ptr %src) {60; CHECK-LABEL: f6:61; CHECK: lgf %r2, -4(%r2)62; CHECK: br %r1463 %ptr = getelementptr i32, ptr %src, i64 -164 %word = load i32, ptr %ptr65 %ext = sext i32 %word to i6466 ret i64 %ext67}68 69; Check the low end of the LGF range.70define i64 @f7(ptr %src) {71; CHECK-LABEL: f7:72; CHECK: lgf %r2, -524288(%r2)73; CHECK: br %r1474 %ptr = getelementptr i32, ptr %src, i64 -13107275 %word = load i32, ptr %ptr76 %ext = sext i32 %word to i6477 ret i64 %ext78}79 80; Check the next word down, which needs separate address logic.81; Other sequences besides this one would be OK.82define i64 @f8(ptr %src) {83; CHECK-LABEL: f8:84; CHECK: agfi %r2, -52429285; CHECK: lgf %r2, 0(%r2)86; CHECK: br %r1487 %ptr = getelementptr i32, ptr %src, i64 -13107388 %word = load i32, ptr %ptr89 %ext = sext i32 %word to i6490 ret i64 %ext91}92 93; Check that LGF allows an index.94define i64 @f9(i64 %src, i64 %index) {95; CHECK-LABEL: f9:96; CHECK: lgf %r2, 524287(%r3,%r2)97; CHECK: br %r1498 %add1 = add i64 %src, %index99 %add2 = add i64 %add1, 524287100 %ptr = inttoptr i64 %add2 to ptr101 %word = load i32, ptr %ptr102 %ext = sext i32 %word to i64103 ret i64 %ext104}105