blob: 36378c0239f2ba3d569c9018c44b2ca309c035cd (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#ifndef _MATH_PRIVATE_H_
#error "Never use <math_ldbl.h> directly; include <math_private.h> instead."
#endif
/* GCC does not optimize the default ldbl_pack code to not spill register
in the stack. The following optimization tells gcc that pack/unpack
is really a nop. We use fr1/fr2 because those are the regs used to
pass/return a single long double arg. */
static inline long double
ldbl_pack_ppc (double a, double aa)
{
register long double x __asm__ ("fr1");
register double xh __asm__ ("fr1");
register double xl __asm__ ("fr2");
xh = a;
xl = aa;
__asm__ ("" : "=f" (x) : "f" (xh), "f" (xl));
return x;
}
static inline void
ldbl_unpack_ppc (long double l, double *a, double *aa)
{
register long double x __asm__ ("fr1");
register double xh __asm__ ("fr1");
register double xl __asm__ ("fr2");
x = l;
__asm__ ("" : "=f" (xh), "=f" (xl) : "f" (x));
*a = xh;
*aa = xl;
}
#define ldbl_pack ldbl_pack_ppc
#define ldbl_unpack ldbl_unpack_ppc
#include <sysdeps/ieee754/ldbl-128ibm/math_ldbl.h>
|