1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- #include <fenv.h>
- #include <fpu_control.h>
- #include <float.h>
- #include <stdint.h>
- int
- feraiseexcept (int excepts)
- {
- uint64_t fpsr;
- const float fp_zero = 0.0;
- const float fp_one = 1.0;
- const float fp_max = FLT_MAX;
- const float fp_min = FLT_MIN;
- const float fp_1e32 = 1.0e32f;
- const float fp_two = 2.0;
- const float fp_three = 3.0;
-
- if (FE_INVALID & excepts)
- __asm__ __volatile__ (
- "ldr s0, %1\n\t"
- "fdiv s0, s0, s0\n\t"
- "mrs %0, fpsr" : "=r" (fpsr)
- : "m" (fp_zero)
- : "d0");
- if (FE_DIVBYZERO & excepts)
- __asm__ __volatile__ (
- "ldr s0, %1\n\t"
- "ldr s1, %2\n\t"
- "fdiv s0, s0, s1\n\t"
- "mrs %0, fpsr" : "=r" (fpsr)
- : "m" (fp_one), "m" (fp_zero)
- : "d0", "d1");
- if (FE_OVERFLOW & excepts)
-
- __asm__ __volatile__ (
- "ldr s0, %1\n\t"
- "ldr s1, %2\n\t"
- "fadd s0, s0, s1\n\t"
- "mrs %0, fpsr" : "=r" (fpsr)
- : "m" (fp_max), "m" (fp_1e32)
- : "d0", "d1");
- if (FE_UNDERFLOW & excepts)
- __asm__ __volatile__ (
- "ldr s0, %1\n\t"
- "ldr s1, %2\n\t"
- "fdiv s0, s0, s1\n\t"
- "mrs %0, fpsr" : "=r" (fpsr)
- : "m" (fp_min), "m" (fp_three)
- : "d0", "d1");
- if (FE_INEXACT & excepts)
- __asm__ __volatile__ (
- "ldr s0, %1\n\t"
- "ldr s1, %2\n\t"
- "fdiv s0, s0, s1\n\t"
- "mrs %0, fpsr" : "=r" (fpsr)
- : "m" (fp_two), "m" (fp_three)
- : "d0", "d1");
- return 0;
- }
|