mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-27 13:54:19 +08:00
libgcc: Use may_alias attribute in bitint handlers
As discussed on IRC, the following patch uses may_alias attribute, so that on targets like aarch64 where abi_limb_mode != limb_mode the library accesses the limbs (half limbs of the ABI) in the arrays with conservative alias set. 2024-01-12 Jakub Jelinek <jakub@redhat.com> * libgcc2.h (UBILtype): New typedef with may_alias attribute. (__mulbitint3, __divmodbitint4): Use UBILtype * instead of UWtype * and const UBILtype * instead of const UWtype *. * libgcc2.c (bitint_reduce_prec, bitint_mul_1, bitint_addmul_1, __mulbitint3, bitint_negate, bitint_submul_1, __divmodbitint4): Likewise. * soft-fp/bitint.h (UBILtype): Change define into a typedef with may_alias attribute.
This commit is contained in:
parent
160799b366
commit
6dece9913f
@ -1309,7 +1309,7 @@ __udivdi3 (UDWtype n, UDWtype d)
|
||||
some narrower _BitInt value, reduce precision. */
|
||||
|
||||
static inline __attribute__((__always_inline__)) SItype
|
||||
bitint_reduce_prec (const UWtype **p, SItype prec)
|
||||
bitint_reduce_prec (const UBILtype **p, SItype prec)
|
||||
{
|
||||
UWtype mslimb;
|
||||
SItype i;
|
||||
@ -1421,7 +1421,7 @@ bitint_reduce_prec (const UWtype **p, SItype prec)
|
||||
/* D = S * L. */
|
||||
|
||||
static UWtype
|
||||
bitint_mul_1 (UWtype *d, const UWtype *s, UWtype l, SItype n)
|
||||
bitint_mul_1 (UBILtype *d, const UBILtype *s, UWtype l, SItype n)
|
||||
{
|
||||
UWtype sv, hi, lo, c = 0;
|
||||
do
|
||||
@ -1440,7 +1440,7 @@ bitint_mul_1 (UWtype *d, const UWtype *s, UWtype l, SItype n)
|
||||
/* D += S * L. */
|
||||
|
||||
static UWtype
|
||||
bitint_addmul_1 (UWtype *d, const UWtype *s, UWtype l, SItype n)
|
||||
bitint_addmul_1 (UBILtype *d, const UBILtype *s, UWtype l, SItype n)
|
||||
{
|
||||
UWtype sv, hi, lo, c = 0;
|
||||
do
|
||||
@ -1465,9 +1465,9 @@ bitint_addmul_1 (UWtype *d, const UWtype *s, UWtype l, SItype n)
|
||||
positive. */
|
||||
|
||||
void
|
||||
__mulbitint3 (UWtype *ret, SItype retprec,
|
||||
const UWtype *u, SItype uprec,
|
||||
const UWtype *v, SItype vprec)
|
||||
__mulbitint3 (UBILtype *ret, SItype retprec,
|
||||
const UBILtype *u, SItype uprec,
|
||||
const UBILtype *v, SItype vprec)
|
||||
{
|
||||
uprec = bitint_reduce_prec (&u, uprec);
|
||||
vprec = bitint_reduce_prec (&v, vprec);
|
||||
@ -1480,7 +1480,7 @@ __mulbitint3 (UWtype *ret, SItype retprec,
|
||||
|| (avprec > auprec && !(uprec >= 0 && vprec < 0)))
|
||||
{
|
||||
SItype p;
|
||||
const UWtype *t;
|
||||
const UBILtype *t;
|
||||
p = uprec; uprec = vprec; vprec = p;
|
||||
p = auprec; auprec = avprec; avprec = p;
|
||||
t = u; u = v; v = t;
|
||||
@ -1643,7 +1643,7 @@ __mulbitint3 (UWtype *ret, SItype retprec,
|
||||
/* D = -S. */
|
||||
|
||||
static void
|
||||
bitint_negate (UWtype *d, const UWtype *s, SItype n)
|
||||
bitint_negate (UBILtype *d, const UBILtype *s, SItype n)
|
||||
{
|
||||
UWtype c = 1;
|
||||
do
|
||||
@ -1660,7 +1660,7 @@ bitint_negate (UWtype *d, const UWtype *s, SItype n)
|
||||
/* D -= S * L. */
|
||||
|
||||
static UWtype
|
||||
bitint_submul_1 (UWtype *d, const UWtype *s, UWtype l, SItype n)
|
||||
bitint_submul_1 (UBILtype *d, const UBILtype *s, UWtype l, SItype n)
|
||||
{
|
||||
UWtype sv, hi, lo, c = 0;
|
||||
do
|
||||
@ -1687,10 +1687,10 @@ bitint_submul_1 (UWtype *d, const UWtype *s, UWtype l, SItype n)
|
||||
should be 0. */
|
||||
|
||||
void
|
||||
__divmodbitint4 (UWtype *q, SItype qprec,
|
||||
UWtype *r, SItype rprec,
|
||||
const UWtype *u, SItype uprec,
|
||||
const UWtype *v, SItype vprec)
|
||||
__divmodbitint4 (UBILtype *q, SItype qprec,
|
||||
UBILtype *r, SItype rprec,
|
||||
const UBILtype *u, SItype uprec,
|
||||
const UBILtype *v, SItype vprec)
|
||||
{
|
||||
uprec = bitint_reduce_prec (&u, uprec);
|
||||
vprec = bitint_reduce_prec (&v, vprec);
|
||||
@ -1747,7 +1747,7 @@ __divmodbitint4 (UWtype *q, SItype qprec,
|
||||
if (qn >= qn2)
|
||||
qn2 = 0;
|
||||
USItype sz = un + 1 + vn + qn2;
|
||||
UWtype *buf = __builtin_alloca (sz * sizeof (UWtype));
|
||||
UBILtype *buf = __builtin_alloca (sz * sizeof (UWtype));
|
||||
USItype uidx, vidx;
|
||||
#if __LIBGCC_BITINT_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||
uidx = un - 1;
|
||||
@ -1768,9 +1768,9 @@ __divmodbitint4 (UWtype *q, SItype qprec,
|
||||
__builtin_memcpy (buf + un + 1, v, vn * sizeof (UWtype));
|
||||
if (vp)
|
||||
buf[un + 1 + BITINT_END (0, vn - 1)] &= (((UWtype) 1 << vp) - 1);
|
||||
UWtype *u2 = buf;
|
||||
UWtype *v2 = u2 + un + 1;
|
||||
UWtype *q2 = v2 + vn;
|
||||
UBILtype *u2 = buf;
|
||||
UBILtype *v2 = u2 + un + 1;
|
||||
UBILtype *q2 = v2 + vn;
|
||||
if (!qn2)
|
||||
q2 = q + BITINT_END (qn - (un - vn + 1), 0);
|
||||
|
||||
|
@ -402,10 +402,12 @@ extern UDWtype __udivmoddi4 (UDWtype, UDWtype, UDWtype *);
|
||||
#if (defined(__BITINT_MAXWIDTH__) \
|
||||
&& (defined(L_mulbitint3) || defined(L_divmodbitint4)))
|
||||
/* _BitInt support. */
|
||||
extern void __mulbitint3 (UWtype *, SItype, const UWtype *, SItype,
|
||||
const UWtype *, SItype);
|
||||
extern void __divmodbitint4 (UWtype *, SItype, UWtype *, SItype,
|
||||
const UWtype *, SItype, const UWtype *, SItype);
|
||||
typedef UWtype __attribute__((__may_alias__)) UBILtype;
|
||||
extern void __mulbitint3 (UBILtype *, SItype, const UBILtype *, SItype,
|
||||
const UBILtype *, SItype);
|
||||
extern void __divmodbitint4 (UBILtype *, SItype, UBILtype *, SItype,
|
||||
const UBILtype *, SItype, const UBILtype *,
|
||||
SItype);
|
||||
#endif
|
||||
|
||||
/* __negdi2 is static inline when building other libgcc2 portions. */
|
||||
|
@ -33,19 +33,19 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
#if BIL_UNITS_PER_WORD == 8
|
||||
#define BIL_TYPE_SIZE (8 * __CHAR_BIT__)
|
||||
#define BILtype DItype
|
||||
#define UBILtype UDItype
|
||||
typedef UDItype __attribute__ ((__may_alias__)) UBILtype;
|
||||
#elif BIL_UNITS_PER_WORD == 4
|
||||
#define BIL_TYPE_SIZE (4 * __CHAR_BIT__)
|
||||
#define BILtype SItype
|
||||
#define UBILtype USItype
|
||||
typedef USItype __attribute__ ((__may_alias__)) UBILtype;
|
||||
#elif BIL_UNITS_PER_WORD == 2
|
||||
#define BIL_TYPE_SIZE (2 * __CHAR_BIT__)
|
||||
#define BILtype HItype
|
||||
#define UBILtype UHItype
|
||||
typedef UHItype __attribute__ ((__may_alias__)) UBILtype;
|
||||
#else
|
||||
#define BIL_TYPE_SIZE __CHAR_BIT__
|
||||
#define BILtype QItype
|
||||
#define UBILtype UQItype
|
||||
typedef UQItype __attribute__ ((__may_alias__)) UBILtype;
|
||||
#endif
|
||||
|
||||
/* If *P is zero or sign extended (the latter only for PREC < 0) from
|
||||
|
Loading…
Reference in New Issue
Block a user