152 lines · plain
1; Test 128-bit floating-point loads.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu -verify-machineinstrs | FileCheck %s4 5; Check loads with no offset.6define double @f1(i64 %src) {7; CHECK-LABEL: f1:8; CHECK: ld %f0, 0(%r2)9; CHECK: ld %f2, 8(%r2)10; CHECK: br %r1411 %ptr = inttoptr i64 %src to ptr12 %val = load fp128, ptr %ptr13 %trunc = fptrunc fp128 %val to double14 ret double %trunc15}16 17; Check the highest aligned offset that allows LD for both halves.18define double @f2(i64 %src) {19; CHECK-LABEL: f2:20; CHECK: ld %f0, 4080(%r2)21; CHECK: ld %f2, 4088(%r2)22; CHECK: br %r1423 %add = add i64 %src, 408024 %ptr = inttoptr i64 %add to ptr25 %val = load fp128, ptr %ptr26 %trunc = fptrunc fp128 %val to double27 ret double %trunc28}29 30; Check the next doubleword up, which requires a mixture of LD and LDY.31define double @f3(i64 %src) {32; CHECK-LABEL: f3:33; CHECK: ld %f0, 4088(%r2)34; CHECK: ldy %f2, 4096(%r2)35; CHECK: br %r1436 %add = add i64 %src, 408837 %ptr = inttoptr i64 %add to ptr38 %val = load fp128, ptr %ptr39 %trunc = fptrunc fp128 %val to double40 ret double %trunc41}42 43; Check the next doubleword after that, which requires LDY for both halves.44define double @f4(i64 %src) {45; CHECK-LABEL: f4:46; CHECK: ldy %f0, 4096(%r2)47; CHECK: ldy %f2, 4104(%r2)48; CHECK: br %r1449 %add = add i64 %src, 409650 %ptr = inttoptr i64 %add to ptr51 %val = load fp128, ptr %ptr52 %trunc = fptrunc fp128 %val to double53 ret double %trunc54}55 56; Check the highest aligned offset that allows LDY for both halves.57define double @f5(i64 %src) {58; CHECK-LABEL: f5:59; CHECK: ldy %f0, 524272(%r2)60; CHECK: ldy %f2, 524280(%r2)61; CHECK: br %r1462 %add = add i64 %src, 52427263 %ptr = inttoptr i64 %add to ptr64 %val = load fp128, ptr %ptr65 %trunc = fptrunc fp128 %val to double66 ret double %trunc67}68 69; Check the next doubleword up, which requires separate address logic.70; Other sequences besides this one would be OK.71define double @f6(i64 %src) {72; CHECK-LABEL: f6:73; CHECK: lay %r1, 524280(%r2)74; CHECK: ld %f0, 0(%r1)75; CHECK: ld %f2, 8(%r1)76; CHECK: br %r1477 %add = add i64 %src, 52428078 %ptr = inttoptr i64 %add to ptr79 %val = load fp128, ptr %ptr80 %trunc = fptrunc fp128 %val to double81 ret double %trunc82}83 84; Check the highest aligned negative offset, which needs a combination of85; LDY and LD.86define double @f7(i64 %src) {87; CHECK-LABEL: f7:88; CHECK: ldy %f0, -8(%r2)89; CHECK: ld %f2, 0(%r2)90; CHECK: br %r1491 %add = add i64 %src, -892 %ptr = inttoptr i64 %add to ptr93 %val = load fp128, ptr %ptr94 %trunc = fptrunc fp128 %val to double95 ret double %trunc96}97 98; Check the next doubleword down, which requires LDY for both halves.99define double @f8(i64 %src) {100; CHECK-LABEL: f8:101; CHECK: ldy %f0, -16(%r2)102; CHECK: ldy %f2, -8(%r2)103; CHECK: br %r14104 %add = add i64 %src, -16105 %ptr = inttoptr i64 %add to ptr106 %val = load fp128, ptr %ptr107 %trunc = fptrunc fp128 %val to double108 ret double %trunc109}110 111; Check the lowest offset that allows LDY for both halves.112define double @f9(i64 %src) {113; CHECK-LABEL: f9:114; CHECK: ldy %f0, -524288(%r2)115; CHECK: ldy %f2, -524280(%r2)116; CHECK: br %r14117 %add = add i64 %src, -524288118 %ptr = inttoptr i64 %add to ptr119 %val = load fp128, ptr %ptr120 %trunc = fptrunc fp128 %val to double121 ret double %trunc122}123 124; Check the next doubleword down, which requires separate address logic.125; Other sequences besides this one would be OK.126define double @f10(i64 %src) {127; CHECK-LABEL: f10:128; CHECK: agfi %r2, -524296129; CHECK: ld %f0, 0(%r2)130; CHECK: ld %f2, 8(%r2)131; CHECK: br %r14132 %add = add i64 %src, -524296133 %ptr = inttoptr i64 %add to ptr134 %val = load fp128, ptr %ptr135 %trunc = fptrunc fp128 %val to double136 ret double %trunc137}138 139; Check that indices are allowed.140define double @f11(i64 %src, i64 %index) {141; CHECK-LABEL: f11:142; CHECK: ld %f0, 4088({{%r2,%r3|%r3,%r2}})143; CHECK: ldy %f2, 4096({{%r2,%r3|%r3,%r2}})144; CHECK: br %r14145 %add1 = add i64 %src, %index146 %add2 = add i64 %add1, 4088147 %ptr = inttoptr i64 %add2 to ptr148 %val = load fp128, ptr %ptr149 %trunc = fptrunc fp128 %val to double150 ret double %trunc151}152