1; RUN: llc -verify-machineinstrs -O2 -mtriple=powerpc64-unknown-linux-gnu -fast-isel=false < %s | FileCheck %s 2 3; This verifies that single-precision floating point values that can't 4; be passed in registers are stored in the rightmost word of the parameter 5; save area slot. There are 13 architected floating-point registers, so 6; the 14th is passed in storage. The address of the 14th argument is 7; 48 (fixed size of the linkage area) + 13 * 8 (first 13 args) + 4 8; (offset to second word) = 156. 9 10define float @bar(float %a, float %b, float %c, float %d, float %e, float %f, float %g, float %h, float %i, float %j, float %k, float %l, float %m, float %n) nounwind { 11entry: 12 %a.addr = alloca float, align 4 13 %b.addr = alloca float, align 4 14 %c.addr = alloca float, align 4 15 %d.addr = alloca float, align 4 16 %e.addr = alloca float, align 4 17 %f.addr = alloca float, align 4 18 %g.addr = alloca float, align 4 19 %h.addr = alloca float, align 4 20 %i.addr = alloca float, align 4 21 %j.addr = alloca float, align 4 22 %k.addr = alloca float, align 4 23 %l.addr = alloca float, align 4 24 %m.addr = alloca float, align 4 25 %n.addr = alloca float, align 4 26 store float %a, ptr %a.addr, align 4 27 store float %b, ptr %b.addr, align 4 28 store float %c, ptr %c.addr, align 4 29 store float %d, ptr %d.addr, align 4 30 store float %e, ptr %e.addr, align 4 31 store float %f, ptr %f.addr, align 4 32 store float %g, ptr %g.addr, align 4 33 store float %h, ptr %h.addr, align 4 34 store float %i, ptr %i.addr, align 4 35 store float %j, ptr %j.addr, align 4 36 store float %k, ptr %k.addr, align 4 37 store float %l, ptr %l.addr, align 4 38 store float %m, ptr %m.addr, align 4 39 store float %n, ptr %n.addr, align 4 40 %0 = load float, ptr %n.addr, align 4 41 ret float %0 42} 43 44; CHECK: lfs {{[0-9]+}}, 156(1) 45 46define float @foo() nounwind { 47entry: 48 %a = alloca float, align 4 49 %b = alloca float, align 4 50 %c = alloca float, align 4 51 %d = alloca float, align 4 52 %e = alloca float, align 4 53 %f = alloca float, align 4 54 %g = alloca float, align 4 55 %h = alloca float, align 4 56 %i = alloca float, align 4 57 %j = alloca float, align 4 58 %k = alloca float, align 4 59 %l = alloca float, align 4 60 %m = alloca float, align 4 61 %n = alloca float, align 4 62 store float 1.000000e+00, ptr %a, align 4 63 store float 2.000000e+00, ptr %b, align 4 64 store float 3.000000e+00, ptr %c, align 4 65 store float 4.000000e+00, ptr %d, align 4 66 store float 5.000000e+00, ptr %e, align 4 67 store float 6.000000e+00, ptr %f, align 4 68 store float 7.000000e+00, ptr %g, align 4 69 store float 8.000000e+00, ptr %h, align 4 70 store float 9.000000e+00, ptr %i, align 4 71 store float 1.000000e+01, ptr %j, align 4 72 store float 1.100000e+01, ptr %k, align 4 73 store float 1.200000e+01, ptr %l, align 4 74 store float 1.300000e+01, ptr %m, align 4 75 store float 1.400000e+01, ptr %n, align 4 76 %0 = load float, ptr %a, align 4 77 %1 = load float, ptr %b, align 4 78 %2 = load float, ptr %c, align 4 79 %3 = load float, ptr %d, align 4 80 %4 = load float, ptr %e, align 4 81 %5 = load float, ptr %f, align 4 82 %6 = load float, ptr %g, align 4 83 %7 = load float, ptr %h, align 4 84 %8 = load float, ptr %i, align 4 85 %9 = load float, ptr %j, align 4 86 %10 = load float, ptr %k, align 4 87 %11 = load float, ptr %l, align 4 88 %12 = load float, ptr %m, align 4 89 %13 = load float, ptr %n, align 4 90 %call = call float @bar(float %0, float %1, float %2, float %3, float %4, float %5, float %6, float %7, float %8, float %9, float %10, float %11, float %12, float %13) 91 ret float %call 92} 93 94; Note that stw is used instead of stfs because the value is a simple 95; constant that can be created with a load-immediate in a GPR. 96; CHECK: stw {{[0-9]+}}, 156(1) 97 98