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