brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.0 KiB · 1ed8902 Raw
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