brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.9 KiB · 69fd75f Raw
152 lines · plain
1; Test 128-bit floating-point stores.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5; Check stores with no offset.6define void @f1(i64 %src, double %val) {7; CHECK-LABEL: f1:8; CHECK: std %f0, 0(%r2)9; CHECK: std %f2, 8(%r2)10; CHECK: br %r1411  %ptr = inttoptr i64 %src to ptr12  %ext = fpext double %val to fp12813  store fp128 %ext, ptr %ptr14  ret void15}16 17; Check the highest aligned offset that allows STD for both halves.18define void @f2(i64 %src, double %val) {19; CHECK-LABEL: f2:20; CHECK: std %f0, 4080(%r2)21; CHECK: std %f2, 4088(%r2)22; CHECK: br %r1423  %add = add i64 %src, 408024  %ptr = inttoptr i64 %add to ptr25  %ext = fpext double %val to fp12826  store fp128 %ext, ptr %ptr27  ret void28}29 30; Check the next doubleword up, which requires a mixture of STD and STDY.31define void @f3(i64 %src, double %val) {32; CHECK-LABEL: f3:33; CHECK: std %f0, 4088(%r2)34; CHECK: stdy %f2, 4096(%r2)35; CHECK: br %r1436  %add = add i64 %src, 408837  %ptr = inttoptr i64 %add to ptr38  %ext = fpext double %val to fp12839  store fp128 %ext, ptr %ptr40  ret void41}42 43; Check the next doubleword after that, which requires STDY for both halves.44define void @f4(i64 %src, double %val) {45; CHECK-LABEL: f4:46; CHECK: stdy %f0, 4096(%r2)47; CHECK: stdy %f2, 4104(%r2)48; CHECK: br %r1449  %add = add i64 %src, 409650  %ptr = inttoptr i64 %add to ptr51  %ext = fpext double %val to fp12852  store fp128 %ext, ptr %ptr53  ret void54}55 56; Check the highest aligned offset that allows STDY for both halves.57define void @f5(i64 %src, double %val) {58; CHECK-LABEL: f5:59; CHECK: stdy %f0, 524272(%r2)60; CHECK: stdy %f2, 524280(%r2)61; CHECK: br %r1462  %add = add i64 %src, 52427263  %ptr = inttoptr i64 %add to ptr64  %ext = fpext double %val to fp12865  store fp128 %ext, ptr %ptr66  ret void67}68 69; Check the next doubleword up, which requires separate address logic.70; Other sequences besides this one would be OK.71define void @f6(i64 %src, double %val) {72; CHECK-LABEL: f6:73; CHECK: lay %r1, 524280(%r2)74; CHECK: std %f0, 0(%r1)75; CHECK: std %f2, 8(%r1)76; CHECK: br %r1477  %add = add i64 %src, 52428078  %ptr = inttoptr i64 %add to ptr79  %ext = fpext double %val to fp12880  store fp128 %ext, ptr %ptr81  ret void82}83 84; Check the highest aligned negative offset, which needs a combination of85; STDY and STD.86define void @f7(i64 %src, double %val) {87; CHECK-LABEL: f7:88; CHECK: stdy %f0, -8(%r2)89; CHECK: std %f2, 0(%r2)90; CHECK: br %r1491  %add = add i64 %src, -892  %ptr = inttoptr i64 %add to ptr93  %ext = fpext double %val to fp12894  store fp128 %ext, ptr %ptr95  ret void96}97 98; Check the next doubleword down, which requires STDY for both halves.99define void @f8(i64 %src, double %val) {100; CHECK-LABEL: f8:101; CHECK: stdy %f0, -16(%r2)102; CHECK: stdy %f2, -8(%r2)103; CHECK: br %r14104  %add = add i64 %src, -16105  %ptr = inttoptr i64 %add to ptr106  %ext = fpext double %val to fp128107  store fp128 %ext, ptr %ptr108  ret void109}110 111; Check the lowest offset that allows STDY for both halves.112define void @f9(i64 %src, double %val) {113; CHECK-LABEL: f9:114; CHECK: stdy %f0, -524288(%r2)115; CHECK: stdy %f2, -524280(%r2)116; CHECK: br %r14117  %add = add i64 %src, -524288118  %ptr = inttoptr i64 %add to ptr119  %ext = fpext double %val to fp128120  store fp128 %ext, ptr %ptr121  ret void122}123 124; Check the next doubleword down, which requires separate address logic.125; Other sequences besides this one would be OK.126define void @f10(i64 %src, double %val) {127; CHECK-LABEL: f10:128; CHECK: agfi %r2, -524296129; CHECK: std %f0, 0(%r2)130; CHECK: std %f2, 8(%r2)131; CHECK: br %r14132  %add = add i64 %src, -524296133  %ptr = inttoptr i64 %add to ptr134  %ext = fpext double %val to fp128135  store fp128 %ext, ptr %ptr136  ret void137}138 139; Check that indices are allowed.140define void @f11(i64 %src, i64 %index, double %val) {141; CHECK-LABEL: f11:142; CHECK: std %f0, 4088({{%r2,%r3|%r3,%r2}})143; CHECK: stdy %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  %ext = fpext double %val to fp128149  store fp128 %ext, ptr %ptr150  ret void151}152