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