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