|
|
1.1 ! root 1: /* ! 2: * linux/kernel/math/compare.c ! 3: * ! 4: * (C) 1991 Linus Torvalds ! 5: */ ! 6: ! 7: /* ! 8: * temporary real comparison routines ! 9: */ ! 10: ! 11: #include <linux/math_emu.h> ! 12: ! 13: #define clear_Cx() (I387.swd &= ~0x4500) ! 14: ! 15: static void normalize(temp_real * a) ! 16: { ! 17: int i = a->exponent & 0x7fff; ! 18: int sign = a->exponent & 0x8000; ! 19: ! 20: if (!(a->a || a->b)) { ! 21: a->exponent = 0; ! 22: return; ! 23: } ! 24: while (i && a->b >= 0) { ! 25: i--; ! 26: __asm__("addl %0,%0 ; adcl %1,%1" ! 27: :"=r" (a->a),"=r" (a->b) ! 28: :"0" (a->a),"1" (a->b)); ! 29: } ! 30: a->exponent = i | sign; ! 31: } ! 32: ! 33: void ftst(const temp_real * a) ! 34: { ! 35: temp_real b; ! 36: ! 37: clear_Cx(); ! 38: b = *a; ! 39: normalize(&b); ! 40: if (b.a || b.b || b.exponent) { ! 41: if (b.exponent < 0) ! 42: set_C0(); ! 43: } else ! 44: set_C3(); ! 45: } ! 46: ! 47: void fcom(const temp_real * src1, const temp_real * src2) ! 48: { ! 49: temp_real a; ! 50: ! 51: a = *src1; ! 52: a.exponent ^= 0x8000; ! 53: fadd(&a,src2,&a); ! 54: ftst(&a); ! 55: } ! 56: ! 57: void fucom(const temp_real * src1, const temp_real * src2) ! 58: { ! 59: fcom(src1,src2); ! 60: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.