45a46
> #include <cmath>
103a105,124
> template <class fpType>
> static inline void
> vfpFlushToZero(uint32_t &_fpscr, fpType &op)
> {
> FPSCR fpscr = _fpscr;
> if (fpscr.fz == 1 && (std::fpclassify(op) == FP_SUBNORMAL)) {
> fpscr.idc = 1;
> op = 0;
> }
> _fpscr = fpscr;
> }
>
> template <class fpType>
> static inline void
> vfpFlushToZero(uint32_t &fpscr, fpType &op1, fpType &op2)
> {
> vfpFlushToZero(fpscr, op1);
> vfpFlushToZero(fpscr, op2);
> }
>
110a132,144
> __asm__ __volatile__("" : "=m" (val) : "m" (val));
> float origVal = val;
> val = rintf(val);
> int fpType = std::fpclassify(val);
> if (fpType == FP_SUBNORMAL || fpType == FP_NAN) {
> if (fpType == FP_NAN) {
> feraiseexcept(FeInvalid);
> }
> val = 0.0;
> } else if (origVal != val) {
> feraiseexcept(FeInexact);
> }
>
114a149
> feclearexcept(FeInexact);
118a154
> feclearexcept(FeInexact);
124a161
> feclearexcept(FeInexact);
128a166
> feclearexcept(FeInexact);
136a175
> feclearexcept(FeInexact);
140a180
> feclearexcept(FeInexact);
146a187
> feclearexcept(FeInexact);
150a192
> feclearexcept(FeInexact);
164c206,210
< return val / powf(2.0, imm);
---
> float scale = powf(2.0, imm);
> __asm__ __volatile__("" : "=m" (scale) : "m" (scale));
> feclearexcept(FeAllExceptions);
> __asm__ __volatile__("" : "=m" (scale) : "m" (scale));
> return val / scale;
173c219,223
< return val / powf(2.0, imm);
---
> float scale = powf(2.0, imm);
> __asm__ __volatile__("" : "=m" (scale) : "m" (scale));
> feclearexcept(FeAllExceptions);
> __asm__ __volatile__("" : "=m" (scale) : "m" (scale));
> return val / scale;
179c229
< fesetround(FeRoundZero);
---
> fesetround(FeRoundNearest);
181a232
> fesetround(FeRoundZero);
182a234,245
> __asm__ __volatile__("" : "=m" (val) : "m" (val));
> double origVal = val;
> val = rint(val);
> int fpType = std::fpclassify(val);
> if (fpType == FP_SUBNORMAL || fpType == FP_NAN) {
> if (fpType == FP_NAN) {
> feraiseexcept(FeInvalid);
> }
> val = 0.0;
> } else if (origVal != val) {
> feraiseexcept(FeInexact);
> }
186a250
> feclearexcept(FeInexact);
190a255
> feclearexcept(FeInexact);
196a262
> feclearexcept(FeInexact);
200a267
> feclearexcept(FeInexact);
208a276
> feclearexcept(FeInexact);
212a281
> feclearexcept(FeInexact);
218a288
> feclearexcept(FeInexact);
222a293
> feclearexcept(FeInexact);
236c307,311
< return val / pow(2.0, imm);
---
> double scale = pow(2.0, imm);
> __asm__ __volatile__("" : "=m" (scale) : "m" (scale));
> feclearexcept(FeAllExceptions);
> __asm__ __volatile__("" : "=m" (scale) : "m" (scale));
> return val / scale;
245c320,324
< return val / pow(2.0, imm);
---
> double scale = pow(2.0, imm);
> __asm__ __volatile__("" : "=m" (scale) : "m" (scale));
> feclearexcept(FeAllExceptions);
> __asm__ __volatile__("" : "=m" (scale) : "m" (scale));
> return val / scale;