/*
* ieee_status.c
*
* Copyright (c) 2015-2018, Arm Limited.
* SPDX-License-Identifier: MIT
*/
#include "math_private.h"
__inline unsigned __ieee_status(unsigned bicmask, unsigned xormask)
{
#if defined __aarch64__ && defined __FP_FENV_EXCEPTIONS
unsigned status_word;
unsigned ret;
#ifdef __FP_FENV_ROUNDING
# define MASK (1<<27)|FE_IEEE_FLUSHZERO|FE_IEEE_MASK_ALL_EXCEPT|FE_IEEE_ALL_EXCEPT|FE_IEEE_ROUND_MASK
#else
# define MASK (1<<27)|FE_IEEE_FLUSHZERO|FE_IEEE_MASK_ALL_EXCEPT|FE_IEEE_ALL_EXCEPT
#endif
/* mask out read-only bits */
bicmask &= MASK;
xormask &= MASK;
/* modify the status word */
__asm__ __volatile__ ("mrs %0, fpsr" : "=r" (status_word));
ret = status_word;
status_word &= ~bicmask;
status_word ^= xormask;
__asm__ __volatile__ ("msr fpsr, %0" : : "r" (status_word));
/* and return what it used to be */
return ret;
#else
return 0;
#endif
}