This source file includes following definitions.
- fchs
 
- fabs
 
- ftst_
 
- fxam
 
- fp_etc
 
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 #include "fpu_system.h"
  14 #include "exception.h"
  15 #include "fpu_emu.h"
  16 #include "status_w.h"
  17 #include "reg_constant.h"
  18 
  19 
  20 static void fchs(FPU_REG *st0_ptr)
     
  21 {
  22   if ( st0_ptr->tag ^ TW_Empty )
  23     {
  24       st0_ptr->sign ^= SIGN_POS^SIGN_NEG;
  25       clear_C1();
  26     }
  27   else
  28     stack_underflow();
  29 }
  30 
  31 static void fabs(FPU_REG *st0_ptr)
     
  32 {
  33   if ( st0_ptr->tag ^ TW_Empty )
  34     {
  35       st0_ptr->sign = SIGN_POS;
  36       clear_C1();
  37     }
  38   else
  39     stack_underflow();
  40 }
  41 
  42 
  43 static void ftst_(FPU_REG *st0_ptr)
     
  44 {
  45   switch (st0_ptr->tag)
  46     {
  47     case TW_Zero:
  48       setcc(SW_C3);
  49       break;
  50     case TW_Valid:
  51       if (st0_ptr->sign == SIGN_POS)
  52         setcc(0);
  53       else
  54         setcc(SW_C0);
  55 
  56 #ifdef DENORM_OPERAND
  57       if ( (st0_ptr->exp <= EXP_UNDER) && (denormal_operand()) )
  58         {
  59 #ifdef PECULIAR_486
  60           
  61           if (st0_ptr->sign == SIGN_POS)
  62             setcc(SW_C3);
  63 #endif PECULIAR_486
  64           return;
  65         }
  66 #endif DENORM_OPERAND
  67 
  68       break;
  69     case TW_NaN:
  70       setcc(SW_C0|SW_C2|SW_C3);    
  71       EXCEPTION(EX_Invalid);
  72       break;
  73     case TW_Infinity:
  74       if (st0_ptr->sign == SIGN_POS)
  75         setcc(0);
  76       else
  77         setcc(SW_C0);
  78       break;
  79     case TW_Empty:
  80       setcc(SW_C0|SW_C2|SW_C3);
  81       EXCEPTION(EX_StackUnder);
  82       break;
  83     default:
  84       setcc(SW_C0|SW_C2|SW_C3);    
  85       EXCEPTION(EX_INTERNAL|0x14);
  86       break;
  87     }
  88 }
  89 
  90 static void fxam(FPU_REG *st0_ptr)
     
  91 {
  92   int c=0;
  93   switch (st0_ptr->tag)
  94     {
  95     case TW_Empty:
  96       c = SW_C3|SW_C0;
  97       break;
  98     case TW_Zero:
  99       c = SW_C3;
 100       break;
 101     case TW_Valid:
 102       
 103       if ( st0_ptr->exp <= EXP_UNDER )
 104         c = SW_C2|SW_C3;  
 105       else
 106         c = SW_C2;
 107       break;
 108     case TW_NaN:
 109       c = SW_C0;
 110       break;
 111     case TW_Infinity:
 112       c = SW_C2|SW_C0;
 113       break;
 114     }
 115   if (st0_ptr->sign == SIGN_NEG)
 116     c |= SW_C1;
 117   setcc(c);
 118 }
 119 
 120 
 121 static FUNC_ST0 const fp_etc_table[] = {
 122   fchs, fabs, (FUNC_ST0)FPU_illegal, (FUNC_ST0)FPU_illegal,
 123   ftst_, fxam, (FUNC_ST0)FPU_illegal, (FUNC_ST0)FPU_illegal
 124 };
 125 
 126 void fp_etc()
     
 127 {
 128   (fp_etc_table[FPU_rm])(&st(0));
 129 }