linux/arch/x86/math-emu/reg_convert.c
<<
>>
Prefs
   1/*---------------------------------------------------------------------------+
   2 |  reg_convert.c                                                            |
   3 |                                                                           |
   4 |  Convert register representation.                                         |
   5 |                                                                           |
   6 | Copyright (C) 1992,1993,1994,1996,1997                                    |
   7 |                  W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia |
   8 |                  E-mail   billm@suburbia.net                              |
   9 |                                                                           |
  10 |                                                                           |
  11 +---------------------------------------------------------------------------*/
  12
  13#include "exception.h"
  14#include "fpu_emu.h"
  15
  16int FPU_to_exp16(FPU_REG const *a, FPU_REG *x)
  17{
  18        int sign = getsign(a);
  19
  20        *(long long *)&(x->sigl) = *(const long long *)&(a->sigl);
  21
  22        /* Set up the exponent as a 16 bit quantity. */
  23        setexponent16(x, exponent(a));
  24
  25        if (exponent16(x) == EXP_UNDER) {
  26                /* The number is a de-normal or pseudodenormal. */
  27                /* We only deal with the significand and exponent. */
  28
  29                if (x->sigh & 0x80000000) {
  30                        /* Is a pseudodenormal. */
  31                        /* This is non-80486 behaviour because the number
  32                           loses its 'denormal' identity. */
  33                        addexponent(x, 1);
  34                } else {
  35                        /* Is a denormal. */
  36                        addexponent(x, 1);
  37                        FPU_normalize_nuo(x);
  38                }
  39        }
  40
  41        if (!(x->sigh & 0x80000000)) {
  42                EXCEPTION(EX_INTERNAL | 0x180);
  43        }
  44
  45        return sign;
  46}
  47