root/kernel/math/compare.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. normalize
  2. ftst
  3. fcom
  4. fucom

   1 /*
   2  * linux/kernel/math/compare.c
   3  *
   4  * Copyright (C) 1991, 1992 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)
     /* [previous][next][first][last][top][bottom][index][help] */
  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)
     /* [previous][next][first][last][top][bottom][index][help] */
  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)
     /* [previous][next][first][last][top][bottom][index][help] */
  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)
     /* [previous][next][first][last][top][bottom][index][help] */
  58 {
  59         fcom(src1,src2);
  60 }

/* [previous][next][first][last][top][bottom][index][help] */