亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? reg_ld_str.c

?? 內核是系統的心臟
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*---------------------------------------------------------------------------+
 |  reg_ld_str.c                                                             |
 |                                                                           |
 | All of the functions which transfer data between user memory and FPU_REGs.|
 |                                                                           |
 | Copyright (C) 1992,1993,1994                                              |
 |                       W. Metzenthen, 22 Parker St, Ormond, Vic 3163,      |
 |                       Australia.  E-mail   billm@vaxc.cc.monash.edu.au    |
 |                                                                           |
 |                                                                           |
 +---------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------+
 | Note:                                                                     |
 |    The file contains code which accesses user memory.                     |
 |    Emulator static data may change when user memory is accessed, due to   |
 |    other processes using the emulator while swapping is in progress.      |
 +---------------------------------------------------------------------------*/

#include <asm/segment.h>

#include "fpu_system.h"
#include "exception.h"
#include "reg_constant.h"
#include "fpu_emu.h"
#include "control_w.h"
#include "status_w.h"


#define EXTENDED_Ebias 0x3fff
#define EXTENDED_Emin (-0x3ffe)  /* smallest valid exponent */

#define DOUBLE_Emax 1023         /* largest valid exponent */
#define DOUBLE_Ebias 1023
#define DOUBLE_Emin (-1022)      /* smallest valid exponent */

#define SINGLE_Emax 127          /* largest valid exponent */
#define SINGLE_Ebias 127
#define SINGLE_Emin (-126)       /* smallest valid exponent */

static void write_to_extended(FPU_REG *rp, char *d);

FPU_REG FPU_loaded_data;


/* Get a long double from user memory */
int reg_load_extended(void)
{
  long double *s = (long double *)FPU_data_address;
  unsigned long sigl, sigh, exp;

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_READ, s, 10);
  /* Use temporary variables here because FPU_loaded data is
     static and hence re-entrancy problems can arise */
  sigl = get_fs_long((unsigned long *) s);
  sigh = get_fs_long(1 + (unsigned long *) s);
  exp = get_fs_word(4 + (unsigned short *) s);
  RE_ENTRANT_CHECK_ON;

  FPU_loaded_data.tag = TW_Valid;   /* Default */
  FPU_loaded_data.sigl = sigl;
  FPU_loaded_data.sigh = sigh;
  if (exp & 0x8000)
    FPU_loaded_data.sign = SIGN_NEG;
  else
    FPU_loaded_data.sign = SIGN_POS;
  exp &= 0x7fff;
  FPU_loaded_data.exp = exp - EXTENDED_Ebias + EXP_BIAS;

  /* Assume that optimisation can keep sigl, sigh, and exp in
     registers, otherwise it would be more efficient to work
     with FPU_loaded_data (which is static) here. */
  if ( exp == 0 )
    {
      if ( !(sigh | sigl) )
	{
	  FPU_loaded_data.tag = TW_Zero;
	  return 0;
	}
      /* The number is a de-normal or pseudodenormal. */
      if (sigh & 0x80000000)
	{
	  /* Is a pseudodenormal. */
	  /* Convert it for internal use. */
	  /* This is non-80486 behaviour because the number
	     loses its 'denormal' identity. */
	  FPU_loaded_data.exp++;
	  return 1;
	}
      else
	{
	  /* Is a denormal. */
	  /* Convert it for internal use. */
	  FPU_loaded_data.exp++;
	  normalize_nuo(&FPU_loaded_data);
	  return 0;
	}
    }
  else if ( exp == 0x7fff )
    {
      if ( !((sigh ^ 0x80000000) | sigl) )
	{
	  /* Matches the bit pattern for Infinity. */
	  FPU_loaded_data.exp = EXP_Infinity;
	  FPU_loaded_data.tag = TW_Infinity;
	  return 0;
	}

      FPU_loaded_data.exp = EXP_NaN;
      FPU_loaded_data.tag = TW_NaN;
      if ( !(sigh & 0x80000000) )
	{
	  /* NaNs have the ms bit set to 1. */
	  /* This is therefore an Unsupported NaN data type. */
	  /* This is non 80486 behaviour */
	  /* This should generate an Invalid Operand exception
	     later, so we convert it to a SNaN */
	  FPU_loaded_data.sigh = 0x80000000;
	  FPU_loaded_data.sigl = 0x00000001;
	  FPU_loaded_data.sign = SIGN_NEG;
	  return 1;
	}
      return 0;
    }

  if ( !(sigh & 0x80000000) )
    {
      /* Unsupported data type. */
      /* Valid numbers have the ms bit set to 1. */
      /* Unnormal. */
      /* Convert it for internal use. */
      /* This is non-80486 behaviour */
      /* This should generate an Invalid Operand exception
	 later, so we convert it to a SNaN */
      FPU_loaded_data.sigh = 0x80000000;
      FPU_loaded_data.sigl = 0x00000001;
      FPU_loaded_data.sign = SIGN_NEG;
      FPU_loaded_data.exp = EXP_NaN;
      FPU_loaded_data.tag = TW_NaN;
      return 1;
    }
  return 0;
}


/* Get a double from user memory */
int reg_load_double(void)
{
  double *dfloat = (double *)FPU_data_address;
  int exp;
  unsigned m64, l64;

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_READ, dfloat, 8);
  m64 = get_fs_long(1 + (unsigned long *) dfloat);
  l64 = get_fs_long((unsigned long *) dfloat);
  RE_ENTRANT_CHECK_ON;

  if (m64 & 0x80000000)
    FPU_loaded_data.sign = SIGN_NEG;
  else
    FPU_loaded_data.sign = SIGN_POS;
  exp = ((m64 & 0x7ff00000) >> 20) - DOUBLE_Ebias;
  m64 &= 0xfffff;
  if (exp > DOUBLE_Emax)
    {
      /* Infinity or NaN */
      if ((m64 == 0) && (l64 == 0))
	{
	  /* +- infinity */
	  FPU_loaded_data.sigh = 0x80000000;
	  FPU_loaded_data.sigl = 0x00000000;
	  FPU_loaded_data.exp = EXP_Infinity;
	  FPU_loaded_data.tag = TW_Infinity;
	  return 0;
	}
      else
	{
	  /* Must be a signaling or quiet NaN */
	  FPU_loaded_data.exp = EXP_NaN;
	  FPU_loaded_data.tag = TW_NaN;
	  FPU_loaded_data.sigh = (m64 << 11) | 0x80000000;
	  FPU_loaded_data.sigh |= l64 >> 21;
	  FPU_loaded_data.sigl = l64 << 11;
	  return 0; /* The calling function must look for NaNs */
	}
    }
  else if ( exp < DOUBLE_Emin )
    {
      /* Zero or de-normal */
      if ((m64 == 0) && (l64 == 0))
	{
	  /* Zero */
	  int c = FPU_loaded_data.sign;
	  reg_move(&CONST_Z, &FPU_loaded_data);
	  FPU_loaded_data.sign = c;
	  return 0;
	}
      else
	{
	  /* De-normal */
	  FPU_loaded_data.exp = DOUBLE_Emin + EXP_BIAS;
	  FPU_loaded_data.tag = TW_Valid;
	  FPU_loaded_data.sigh = m64 << 11;
	  FPU_loaded_data.sigh |= l64 >> 21;
	  FPU_loaded_data.sigl = l64 << 11;
	  normalize_nuo(&FPU_loaded_data);
	  return denormal_operand();
	}
    }
  else
    {
      FPU_loaded_data.exp = exp + EXP_BIAS;
      FPU_loaded_data.tag = TW_Valid;
      FPU_loaded_data.sigh = (m64 << 11) | 0x80000000;
      FPU_loaded_data.sigh |= l64 >> 21;
      FPU_loaded_data.sigl = l64 << 11;

      return 0;
    }
}


/* Get a float from user memory */
int reg_load_single(void)
{
  float *single = (float *)FPU_data_address;
  unsigned m32;
  int exp;

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_READ, single, 4);
  m32 = get_fs_long((unsigned long *) single);
  RE_ENTRANT_CHECK_ON;

  if (m32 & 0x80000000)
    FPU_loaded_data.sign = SIGN_NEG;
  else
    FPU_loaded_data.sign = SIGN_POS;
  if (!(m32 & 0x7fffffff))
    {
      /* Zero */
      int c = FPU_loaded_data.sign;
      reg_move(&CONST_Z, &FPU_loaded_data);
      FPU_loaded_data.sign = c;
      return 0;
    }
  exp = ((m32 & 0x7f800000) >> 23) - SINGLE_Ebias;
  m32 = (m32 & 0x7fffff) << 8;
  if ( exp < SINGLE_Emin )
    {
      /* De-normals */
      FPU_loaded_data.exp = SINGLE_Emin + EXP_BIAS;
      FPU_loaded_data.tag = TW_Valid;
      FPU_loaded_data.sigh = m32;
      FPU_loaded_data.sigl = 0;
      normalize_nuo(&FPU_loaded_data);
      return denormal_operand();
    }
  else if ( exp > SINGLE_Emax )
    {
    /* Infinity or NaN */
      if ( m32 == 0 )
	{
	  /* +- infinity */
	  FPU_loaded_data.sigh = 0x80000000;
	  FPU_loaded_data.sigl = 0x00000000;
	  FPU_loaded_data.exp = EXP_Infinity;
	  FPU_loaded_data.tag = TW_Infinity;
	  return 0;
	}
      else
	{
	  /* Must be a signaling or quiet NaN */
	  FPU_loaded_data.exp = EXP_NaN;
	  FPU_loaded_data.tag = TW_NaN;
	  FPU_loaded_data.sigh = m32 | 0x80000000;
	  FPU_loaded_data.sigl = 0;
	  return 0; /* The calling function must look for NaNs */
	}
    }
  else
    {
      FPU_loaded_data.exp = exp + EXP_BIAS;
      FPU_loaded_data.sigh = m32 | 0x80000000;
      FPU_loaded_data.sigl = 0;
      FPU_loaded_data.tag = TW_Valid;
      return 0;
    }
}


/* Get a long long from user memory */
void reg_load_int64(void)
{
  long long *_s = (long long *)FPU_data_address;
  int e;
  long long s;

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_READ, _s, 8);
  ((unsigned long *)&s)[0] = get_fs_long((unsigned long *) _s);
  ((unsigned long *)&s)[1] = get_fs_long(1 + (unsigned long *) _s);
  RE_ENTRANT_CHECK_ON;

  if (s == 0)
    { reg_move(&CONST_Z, &FPU_loaded_data); return; }

  if (s > 0)
    FPU_loaded_data.sign = SIGN_POS;
  else
  {
    s = -s;
    FPU_loaded_data.sign = SIGN_NEG;
  }

  e = EXP_BIAS + 63;
  significand(&FPU_loaded_data) = s;
  FPU_loaded_data.exp = e;
  FPU_loaded_data.tag = TW_Valid;
  normalize_nuo(&FPU_loaded_data);
}


/* Get a long from user memory */
void reg_load_int32(void)
{
  long *_s = (long *)FPU_data_address;
  long s;
  int e;

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_READ, _s, 4);
  s = (long)get_fs_long((unsigned long *) _s);
  RE_ENTRANT_CHECK_ON;

  if (s == 0)
    { reg_move(&CONST_Z, &FPU_loaded_data); return; }

  if (s > 0)
    FPU_loaded_data.sign = SIGN_POS;
  else
  {
    s = -s;
    FPU_loaded_data.sign = SIGN_NEG;
  }

  e = EXP_BIAS + 31;
  FPU_loaded_data.sigh = s;
  FPU_loaded_data.sigl = 0;
  FPU_loaded_data.exp = e;
  FPU_loaded_data.tag = TW_Valid;
  normalize_nuo(&FPU_loaded_data);
}


/* Get a short from user memory */
void reg_load_int16(void)
{
  short *_s = (short *)FPU_data_address;
  int s, e;

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_READ, _s, 2);
  /* Cast as short to get the sign extended. */
  s = (short)get_fs_word((unsigned short *) _s);
  RE_ENTRANT_CHECK_ON;

  if (s == 0)
    { reg_move(&CONST_Z, &FPU_loaded_data); return; }

  if (s > 0)
    FPU_loaded_data.sign = SIGN_POS;
  else
  {
    s = -s;
    FPU_loaded_data.sign = SIGN_NEG;
  }

  e = EXP_BIAS + 15;
  FPU_loaded_data.sigh = s << 16;

  FPU_loaded_data.sigl = 0;
  FPU_loaded_data.exp = e;
  FPU_loaded_data.tag = TW_Valid;
  normalize_nuo(&FPU_loaded_data);
}


/* Get a packed bcd array from user memory */
void reg_load_bcd(void)
{
  char *s = (char *)FPU_data_address;
  int pos;
  unsigned char bcd;
  long long l=0;

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_READ, s, 10);
  RE_ENTRANT_CHECK_ON;
  for ( pos = 8; pos >= 0; pos--)
    {
      l *= 10;
      RE_ENTRANT_CHECK_OFF;
      bcd = (unsigned char)get_fs_byte((unsigned char *) s+pos);
      RE_ENTRANT_CHECK_ON;
      l += bcd >> 4;
      l *= 10;
      l += bcd & 0x0f;
    }
  
  /* Finish all access to user memory before putting stuff into
     the static FPU_loaded_data */
  RE_ENTRANT_CHECK_OFF;
  FPU_loaded_data.sign =
    ((unsigned char)get_fs_byte((unsigned char *) s+9)) & 0x80 ?
      SIGN_NEG : SIGN_POS;
  RE_ENTRANT_CHECK_ON;

  if (l == 0)
    {
      char sign = FPU_loaded_data.sign;
      reg_move(&CONST_Z, &FPU_loaded_data);
      FPU_loaded_data.sign = sign;
    }
  else
    {
      significand(&FPU_loaded_data) = l;
      FPU_loaded_data.exp = EXP_BIAS + 63;
      FPU_loaded_data.tag = TW_Valid;
      normalize_nuo(&FPU_loaded_data);
    }
}

/*===========================================================================*/

/* Put a long double into user memory */
int reg_store_extended(void)
{
  /*
    The only exception raised by an attempt to store to an
    extended format is the Invalid Stack exception, i.e.
    attempting to store from an empty register.
   */
  long double *d = (long double *)FPU_data_address;

  if ( FPU_st0_tag != TW_Empty )
    {
      RE_ENTRANT_CHECK_OFF;
      FPU_verify_area(VERIFY_WRITE, d, 10);
      RE_ENTRANT_CHECK_ON;
      write_to_extended(FPU_st0_ptr, (char *) FPU_data_address);
      return 1;
    }

  /* Empty register (stack underflow) */
  EXCEPTION(EX_StackUnder);
  if ( control_word & CW_Invalid )
    {
      /* The masked response */
      /* Put out the QNaN indefinite */
      RE_ENTRANT_CHECK_OFF;
      FPU_verify_area(VERIFY_WRITE,d,10);
      put_fs_long(0, (unsigned long *) d);
      put_fs_long(0xc0000000, 1 + (unsigned long *) d);
      put_fs_word(0xffff, 4 + (short *) d);
      RE_ENTRANT_CHECK_ON;
      return 1;
    }
  else
    return 0;

}


/* Put a double into user memory */
int reg_store_double(void)
{
  double *dfloat = (double *)FPU_data_address;
  unsigned long l[2];
  unsigned long increment = 0;	/* avoid gcc warnings */

  if (FPU_st0_tag == TW_Valid)
    {
      int exp;
      FPU_REG tmp;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天堂影院一区二区| 欧美日韩一区二区三区不卡| 一本到不卡免费一区二区| 制服丝袜成人动漫| 国产精品水嫩水嫩| 蜜桃在线一区二区三区| 色吊一区二区三区| 国产欧美精品区一区二区三区| 99久久精品国产导航| 日韩av中文字幕一区二区三区| 国产69精品一区二区亚洲孕妇| 欧美亚一区二区| 国产日本亚洲高清| 视频一区二区国产| 色国产综合视频| 国产精品五月天| 国产一区在线看| 777色狠狠一区二区三区| 一区二区欧美在线观看| 丰满岳乱妇一区二区三区| 日韩精品一区在线| 水蜜桃久久夜色精品一区的特点| 一本一本大道香蕉久在线精品| 欧美激情一区二区三区全黄| 国产一区二区在线观看视频| 91精品黄色片免费大全| 亚洲国产精品久久艾草纯爱| 91国偷自产一区二区使用方法| 国产精品久久久久久久久免费相片| 精品亚洲成a人| 欧美一区二区三区在线观看视频| 亚洲福利视频一区| 欧美日韩国产三级| 亚洲午夜精品久久久久久久久| 日本高清无吗v一区| 自拍视频在线观看一区二区| 不卡视频一二三四| 成人欧美一区二区三区视频网页| www.日本不卡| 1区2区3区欧美| 色屁屁一区二区| 亚洲一区二区免费视频| 欧美日韩国产系列| 蜜臀av性久久久久蜜臀aⅴ流畅 | 麻豆精品一区二区av白丝在线| 欧美日韩一区 二区 三区 久久精品 | 欧美专区日韩专区| 亚洲成人免费影院| 制服丝袜一区二区三区| 麻豆91精品91久久久的内涵| 2023国产精品视频| 国产成人高清视频| 亚洲欧美日韩国产综合| 欧美中文字幕一二三区视频| 日本免费新一区视频| 欧美成人精品高清在线播放| 国产成人在线视频网站| 亚洲视频一区二区在线| 欧美午夜不卡在线观看免费| 麻豆91在线播放免费| 亚洲国产电影在线观看| 欧美三级日韩在线| 国产精品一线二线三线精华| 亚洲四区在线观看| 在线不卡中文字幕播放| 国产美女在线精品| 亚洲欧洲av在线| 日韩三级.com| www.日韩精品| 麻豆91小视频| 亚洲欧美另类在线| 欧美成人国产一区二区| 99re视频这里只有精品| 蜜臀久久99精品久久久画质超高清| 久久久久久久久久久99999| 色婷婷av一区二区三区gif | 亚洲一区在线观看视频| 精品国产一二三区| 欧美伊人久久久久久久久影院| 另类调教123区 | 国产三级一区二区| 欧美色精品在线视频| 丁香婷婷综合网| 同产精品九九九| 中文字幕在线不卡国产视频| 欧美成人r级一区二区三区| 91在线观看美女| 国产一区二区电影| 天天操天天色综合| 亚洲精品中文在线| 国产精品久久一级| 久久综合狠狠综合| 日韩一区二区影院| 欧美日韩在线播放三区四区| 成人免费av在线| 精品一区二区免费在线观看| 亚洲一线二线三线视频| 国产精品久久777777| 久久九九影视网| 精品粉嫩aⅴ一区二区三区四区 | 亚洲18影院在线观看| 中文字幕巨乱亚洲| 久久精品日韩一区二区三区| 9191成人精品久久| 欧美日韩国产高清一区二区 | 国产精品美日韩| 久久久久国产精品麻豆| 精品日韩一区二区三区| 欧美一区二区三区免费在线看| 欧美影片第一页| 欧美视频中文字幕| 在线影视一区二区三区| 99久久精品99国产精品| 99久久精品情趣| 成人99免费视频| 北条麻妃国产九九精品视频| 成人黄页在线观看| av资源站一区| 91丨九色丨蝌蚪丨老版| 99re6这里只有精品视频在线观看| 懂色av中文一区二区三区| 国产成人免费高清| 高清shemale亚洲人妖| 高潮精品一区videoshd| voyeur盗摄精品| www.欧美日韩| 色婷婷av一区二区三区之一色屋| 95精品视频在线| 日本一区二区三区久久久久久久久不 | 狠狠色伊人亚洲综合成人| 日韩影院精彩在线| 奇米色一区二区| 国产高清久久久| 免费不卡在线观看| 激情伊人五月天久久综合| 91福利视频网站| 中文在线一区二区 | 欧美日韩电影在线| 欧美高清在线视频| 欧美aaaaa成人免费观看视频| 波多野结衣亚洲| 欧美精品一区二区三区久久久| 亚洲一区视频在线| 9i在线看片成人免费| 2024国产精品视频| 偷拍一区二区三区四区| 日本精品视频一区二区三区| 国产日韩欧美精品一区| 天堂av在线一区| 91首页免费视频| 国产亚洲综合性久久久影院| 蜜臀久久99精品久久久画质超高清| 欧美体内she精高潮| 最新国产の精品合集bt伙计| 国产成人av电影在线| xf在线a精品一区二区视频网站| 性做久久久久久免费观看欧美| 91成人国产精品| 综合色中文字幕| 波波电影院一区二区三区| 国产欧美精品一区二区色综合| 国产剧情在线观看一区二区| 精品成人在线观看| 精品一区二区日韩| 欧美精品一区二区三区很污很色的 | 东方欧美亚洲色图在线| 国产网红主播福利一区二区| 韩国午夜理伦三级不卡影院| 日韩欧美亚洲国产精品字幕久久久| 日韩专区一卡二卡| 欧美肥胖老妇做爰| 日韩成人免费看| 精品久久久久一区二区国产| 国产在线观看免费一区| xfplay精品久久| 国产不卡在线视频| 中文字幕一区二区三| 91视视频在线观看入口直接观看www | 成人性生交大片免费看在线播放 | a级精品国产片在线观看| 国产精品亲子伦对白| www.爱久久.com| 一区二区三区成人在线视频| 欧美视频在线不卡| 视频在线在亚洲| 精品福利av导航| 成人深夜福利app| 亚洲精品国产无套在线观| 欧美另类久久久品| 蜜臀av一区二区| 亚洲国产激情av| 在线看不卡av| 看片的网站亚洲| 中文字幕第一区| 91福利在线看| 韩日精品视频一区| 亚洲日本va午夜在线电影| 欧美手机在线视频| 国产麻豆9l精品三级站| 亚洲美女精品一区|