1 /* { dg-do run { target { powerpc_fprs && { ilp32 && dfprt } } } } */
2 /* { dg-options "-std=gnu99 -O2 -fno-strict-aliasing" } */
4 /* Testcase to check for ABI compliance of parameter passing
5 for the PowerPC ELF ABI for decimal float values. */
7 extern void abort (void);
10 /* Support compiling the test to report individual failures; default is
11 to abort as soon as a check fails. */
14 #define FAILURE { printf ("failed at line %d\n", __LINE__); failcnt++; }
16 #define FAILURE abort ();
34 /* Testcase could break on future gcc's, if parameter regs
35 are changed before this asm. */
37 #define save_parms(lparms) \
38 asm volatile ("lis 11,gparms@ha\n\t" \
39 "la 11,gparms@l(11)\n\t" \
55 "stfd 8,88(11)\n\t":::"11", "memory"); \
62 unsigned int slot
[200];
65 /* Fill up floating point registers with double arguments, forcing
66 decimal float arguments into the parameter save area. */
67 void __attribute__ ((noinline
))
68 func0 (double a1
, double a2
, double a3
, double a4
, double a5
,
69 double a6
, double a7
, double a8
, _Decimal64 a9
, _Decimal128 a10
)
75 sp
= __builtin_frame_address (0);
78 if (a1
!= lparms
.fprs
[0]) FAILURE
79 if (a2
!= lparms
.fprs
[1]) FAILURE
80 if (a3
!= lparms
.fprs
[2]) FAILURE
81 if (a4
!= lparms
.fprs
[3]) FAILURE
82 if (a5
!= lparms
.fprs
[4]) FAILURE
83 if (a6
!= lparms
.fprs
[5]) FAILURE
84 if (a7
!= lparms
.fprs
[6]) FAILURE
85 if (a8
!= lparms
.fprs
[7]) FAILURE
86 if (a9
!= *(_Decimal64
*)&sp
->slot
[0]) FAILURE
87 if (a10
!= *(_Decimal128
*)&sp
->slot
[2]) FAILURE
90 /* Alternate 64-bit and 128-bit decimal float arguments, checking that
91 _Decimal128 is always passed in even/odd register pairs. */
92 void __attribute__ ((noinline
))
93 func1 (_Decimal64 a1
, _Decimal128 a2
, _Decimal64 a3
, _Decimal128 a4
,
94 _Decimal64 a5
, _Decimal128 a6
, _Decimal64 a7
, _Decimal128 a8
)
100 sp
= __builtin_frame_address (0);
103 if (a1
!= *(_Decimal64
*)&lparms
.fprs
[0]) FAILURE
/* f1 */
104 if (a2
!= *(_Decimal128
*)&lparms
.fprs
[1]) FAILURE
/* f2 & f3 */
105 if (a3
!= *(_Decimal64
*)&lparms
.fprs
[3]) FAILURE
/* f4 */
106 if (a4
!= *(_Decimal128
*)&lparms
.fprs
[5]) FAILURE
/* f6 & f7 */
107 if (a5
!= *(_Decimal64
*)&lparms
.fprs
[7]) FAILURE
/* f8 */
108 if (a6
!= *(_Decimal128
*)&sp
->slot
[0]) FAILURE
109 if (a7
!= *(_Decimal64
*)&sp
->slot
[4]) FAILURE
110 if (a8
!= *(_Decimal128
*)&sp
->slot
[6]) FAILURE
113 void __attribute__ ((noinline
))
114 func2 (_Decimal128 a1
, _Decimal64 a2
, _Decimal128 a3
, _Decimal64 a4
,
115 _Decimal128 a5
, _Decimal64 a6
, _Decimal128 a7
, _Decimal64 a8
)
121 sp
= __builtin_frame_address (0);
124 if (a1
!= *(_Decimal128
*)&lparms
.fprs
[1]) FAILURE
/* f2 & f3 */
125 if (a2
!= *(_Decimal64
*)&lparms
.fprs
[3]) FAILURE
/* f4 */
126 if (a3
!= *(_Decimal128
*)&lparms
.fprs
[5]) FAILURE
/* f6 & f7 */
127 if (a4
!= *(_Decimal64
*)&lparms
.fprs
[7]) FAILURE
/* f8 */
128 if (a5
!= *(_Decimal128
*)&sp
->slot
[0]) FAILURE
129 if (a6
!= *(_Decimal64
*)&sp
->slot
[4]) FAILURE
130 if (a7
!= *(_Decimal128
*)&sp
->slot
[6]) FAILURE
131 if (a8
!= *(_Decimal64
*)&sp
->slot
[10]) FAILURE
134 void __attribute__ ((noinline
))
135 func3 (_Decimal64 a1
, _Decimal128 a2
, _Decimal64 a3
, _Decimal128 a4
,
142 sp
= __builtin_frame_address (0);
145 if (a1
!= *(_Decimal64
*)&lparms
.fprs
[0]) FAILURE
/* f1 */
146 if (a2
!= *(_Decimal128
*)&lparms
.fprs
[1]) FAILURE
/* f2 & f3 */
147 if (a3
!= *(_Decimal64
*)&lparms
.fprs
[3]) FAILURE
/* f4 */
148 if (a4
!= *(_Decimal128
*)&lparms
.fprs
[5]) FAILURE
/* f6 & f7 */
149 if (a5
!= *(_Decimal128
*)&sp
->slot
[0]) FAILURE
152 void __attribute__ ((noinline
))
153 func4 (_Decimal32 a1
, _Decimal32 a2
, _Decimal32 a3
, _Decimal32 a4
,
154 _Decimal32 a5
, _Decimal32 a6
, _Decimal32 a7
, _Decimal32 a8
,
155 _Decimal32 a9
, _Decimal32 a10
, _Decimal32 a11
, _Decimal32 a12
,
156 _Decimal32 a13
, _Decimal32 a14
, _Decimal32 a15
, _Decimal32 a16
)
162 sp
= __builtin_frame_address (0);
165 /* _Decimal32 is passed in the lower half of an FPR, or in parameter slot. */
166 if (a1
!= ((d32parm_t
*)&lparms
.fprs
[0])->d
) FAILURE
/* f1 */
167 if (a2
!= ((d32parm_t
*)&lparms
.fprs
[1])->d
) FAILURE
/* f2 */
168 if (a3
!= ((d32parm_t
*)&lparms
.fprs
[2])->d
) FAILURE
/* f3 */
169 if (a4
!= ((d32parm_t
*)&lparms
.fprs
[3])->d
) FAILURE
/* f4 */
170 if (a5
!= ((d32parm_t
*)&lparms
.fprs
[4])->d
) FAILURE
/* f5 */
171 if (a6
!= ((d32parm_t
*)&lparms
.fprs
[5])->d
) FAILURE
/* f6 */
172 if (a7
!= ((d32parm_t
*)&lparms
.fprs
[6])->d
) FAILURE
/* f7 */
173 if (a8
!= ((d32parm_t
*)&lparms
.fprs
[7])->d
) FAILURE
/* f8 */
174 if (a9
!= *(_Decimal32
*)&sp
->slot
[0]) FAILURE
175 if (a10
!= *(_Decimal32
*)&sp
->slot
[1]) FAILURE
176 if (a11
!= *(_Decimal32
*)&sp
->slot
[2]) FAILURE
177 if (a12
!= *(_Decimal32
*)&sp
->slot
[3]) FAILURE
178 if (a13
!= *(_Decimal32
*)&sp
->slot
[4]) FAILURE
179 if (a14
!= *(_Decimal32
*)&sp
->slot
[5]) FAILURE
180 if (a15
!= *(_Decimal32
*)&sp
->slot
[6]) FAILURE
181 if (a16
!= *(_Decimal32
*)&sp
->slot
[7]) FAILURE
184 void __attribute__ ((noinline
))
185 func5 (_Decimal32 a1
, _Decimal64 a2
, _Decimal128 a3
,
186 _Decimal32 a4
, _Decimal64 a5
, _Decimal128 a6
,
187 _Decimal32 a7
, _Decimal64 a8
, _Decimal128 a9
,
188 _Decimal32 a10
, _Decimal64 a11
, _Decimal128 a12
)
194 sp
= __builtin_frame_address (0);
197 if (a1
!= ((d32parm_t
*)&lparms
.fprs
[0])->d
) FAILURE
/* f1 */
198 if (a2
!= *(_Decimal64
*)&lparms
.fprs
[1]) FAILURE
/* f2 */
199 if (a3
!= *(_Decimal128
*)&lparms
.fprs
[3]) FAILURE
/* f4 & f5 */
200 if (a4
!= ((d32parm_t
*)&lparms
.fprs
[5])->d
) FAILURE
/* f6 */
201 if (a5
!= *(_Decimal64
*)&lparms
.fprs
[6]) FAILURE
/* f7 */
203 if (a6
!= *(_Decimal128
*)&sp
->slot
[0]) FAILURE
204 if (a7
!= *(_Decimal32
*)&sp
->slot
[4]) FAILURE
205 if (a8
!= *(_Decimal64
*)&sp
->slot
[6]) FAILURE
206 if (a9
!= *(_Decimal128
*)&sp
->slot
[8]) FAILURE
207 if (a10
!= *(_Decimal32
*)&sp
->slot
[12]) FAILURE
208 if (a11
!= *(_Decimal64
*)&sp
->slot
[14]) FAILURE
209 if (a12
!= *(_Decimal128
*)&sp
->slot
[16]) FAILURE
215 func0 (1., 2., 3., 4., 5., 6., 7., 8., 9.dd
, 10.dl
);
216 func1 (1.dd
, 2.dl
, 3.dd
, 4.dl
, 5.dd
, 6.dl
, 7.dd
, 8.dl
);
217 func2 (1.dl
, 2.dd
, 3.dl
, 4.dd
, 5.dl
, 6.dd
, 7.dl
, 8.dd
);
218 func3 (1.dd
, 2.dl
, 3.dd
, 4.dl
, 5.dl
);
219 func4 (501.2df
, 502.2df
, 503.2df
, 504.2df
, 505.2df
, 506.2df
, 507.2df
,
220 508.2df
, 509.2df
, 510.2df
, 511.2df
, 512.2df
, 513.2df
, 514.2df
,
222 func5 (601.2df
, 602.2dd
, 603.2dl
, 604.2df
, 605.2dd
, 606.2dl
,
223 607.2df
, 608.2dd
, 609.2dl
, 610.2df
, 611.2dd
, 612.2dl
);