home *** CD-ROM | disk | FTP | other *** search
/ PC Extra Super CD 1998 January / PCPLUS131.iso / DJGPP / V2MISC / WMEMU2S.ZIP / LINUX / DRIVERS / FPU-EMU / FPU_EMU.H < prev    next >
Encoding:
C/C++ Source or Header  |  1994-03-28  |  5.7 KB  |  178 lines

  1. /*---------------------------------------------------------------------------+
  2.  |  fpu_emu.h                                                                |
  3.  |                                                                           |
  4.  | Copyright (C) 1992,1993,1994                                              |
  5.  |                       W. Metzenthen, 22 Parker St, Ormond, Vic 3163,      |
  6.  |                       Australia.  E-mail   billm@vaxc.cc.monash.edu.au    |
  7.  |                                                                           |
  8.  +---------------------------------------------------------------------------*/
  9.  
  10.  
  11. #ifndef _FPU_EMU_H_
  12. #define _FPU_EMU_H_
  13.  
  14. /*
  15.  * Define DENORM_OPERAND to make the emulator detect denormals
  16.  * and use the denormal flag of the status word. Note: this only
  17.  * affects the flag and corresponding interrupt, the emulator
  18.  * will always generate denormals and operate upon them as required.
  19.  */
  20. #define DENORM_OPERAND
  21.  
  22. /*
  23.  * Define PECULIAR_486 to get a closer approximation to 80486 behaviour,
  24.  * rather than behaviour which appears to be cleaner.
  25.  * This is a matter of opinion: for all I know, the 80486 may simply
  26.  * be complying with the IEEE spec. Maybe one day I'll get to see the
  27.  * spec...
  28.  */
  29. #define PECULIAR_486
  30.  
  31. #ifdef __ASSEMBLER__
  32. #include "fpu_asm.h"
  33. #define    Const(x)    $##x
  34. #else
  35. #define    Const(x)    x
  36. #endif
  37.  
  38. #define EXP_BIAS    Const(0)
  39. #define EXP_OVER    Const(0x4000)    /* smallest invalid large exponent */
  40. #define    EXP_UNDER    Const(-0x3fff)   /* largest invalid small exponent */
  41. #define EXP_Infinity    EXP_OVER
  42. #define EXP_NaN         EXP_OVER
  43.  
  44. #define SIGN_POS    Const(0)
  45. #define SIGN_NEG    Const(1)
  46.  
  47. /* Keep the order TW_Valid, TW_Zero, TW_Denormal */
  48. #define TW_Valid    Const(0)    /* valid */
  49. #define TW_Zero        Const(1)    /* zero */
  50. /* The following fold to 2 (Special) in the Tag Word */
  51. /* #define TW_Denormal     Const(4) */       /* De-normal */
  52. #define TW_Infinity    Const(5)    /* + or - infinity */
  53. #define    TW_NaN        Const(6)    /* Not a Number */
  54.  
  55. #define TW_Empty    Const(7)    /* empty */
  56.  
  57.  
  58. #ifndef __ASSEMBLER__
  59.  
  60. #include <linux/math_emu.h>
  61. #include <linux/linkage.h>
  62.  
  63. #ifdef PARANOID
  64. extern char emulating;
  65. #  define RE_ENTRANT_CHECK_OFF emulating = 0
  66. #  define RE_ENTRANT_CHECK_ON emulating = 1
  67. #else
  68. #  define RE_ENTRANT_CHECK_OFF
  69. #  define RE_ENTRANT_CHECK_ON
  70. #endif PARANOID
  71.  
  72. #define FWAIT_OPCODE 0x9b
  73. #define OP_SIZE_PREFIX 0x66
  74. #define ADDR_SIZE_PREFIX 0x67
  75. #define PREFIX_CS 0x2e
  76. #define PREFIX_DS 0x3e
  77. #define PREFIX_ES 0x26
  78. #define PREFIX_SS 0x36
  79. #define PREFIX_FS 0x64
  80. #define PREFIX_GS 0x65
  81. #define PREFIX_REPE 0xf3
  82. #define PREFIX_REPNE 0xf2
  83. #define PREFIX_LOCK 0xf0
  84. #define PREFIX_CS_ 1
  85. #define PREFIX_DS_ 2
  86. #define PREFIX_ES_ 3
  87. #define PREFIX_FS_ 4
  88. #define PREFIX_GS_ 5
  89. #define PREFIX_SS_ 6
  90. #define PREFIX_DEFAULT 7
  91.  
  92. /* These are to defeat the default action, giving the instruction
  93.    no net effect: */
  94. #define NO_NET_DATA_EFFECT \
  95.       { FPU_data_address = (void *)data_operand_offset; \
  96.     FPU_data_selector = operand_selector; }
  97. #define NO_NET_INSTR_EFFECT \
  98.       { FPU_entry_eip = ip_offset; \
  99.     FPU_entry_op_cs = cs_selector; }
  100.  
  101.  
  102. typedef void (*FUNC)(void);
  103. typedef struct fpu_reg FPU_REG;
  104. typedef struct { unsigned char address_size, operand_size, segment; }
  105.         overrides;
  106. /* This structure is 32 bits: */
  107. typedef struct { overrides override;
  108.          unsigned char vm86; } fpu_addr_modes;
  109.  
  110. #define    st(x)    ( regs[((top+x) &7 )] )
  111.  
  112. #define    STACK_OVERFLOW    (st_new_ptr = &st(-1), st_new_ptr->tag != TW_Empty)
  113. #define    NOT_EMPTY(i)    (st(i).tag != TW_Empty)
  114. #define    NOT_EMPTY_0    (FPU_st0_tag ^ TW_Empty)
  115.  
  116. extern unsigned char FPU_rm;
  117.  
  118. extern    char    FPU_st0_tag;
  119. extern    FPU_REG    *FPU_st0_ptr;
  120.  
  121. /* ###### These need to be shifted to somewhere safe. */
  122. /* extern void  *FPU_data_address; has been shifted */
  123. extern unsigned short FPU_data_selector;
  124. extern unsigned long FPU_entry_op_cs;
  125.  
  126. extern  FPU_REG  FPU_loaded_data;
  127.  
  128. #define pop()    { FPU_st0_ptr->tag = TW_Empty; top++; }
  129.  
  130. /* push() does not affect the tags */
  131. #define push()    { top--; FPU_st0_ptr = st_new_ptr; }
  132.  
  133.  
  134. #define reg_move(x, y) { \
  135.          *(short *)&((y)->sign) = *(short *)&((x)->sign); \
  136.          *(long *)&((y)->exp) = *(long *)&((x)->exp); \
  137.          *(long long *)&((y)->sigl) = *(long long *)&((x)->sigl); }
  138.  
  139. #define significand(x) ( ((unsigned long long *)&((x)->sigl))[0] )
  140.  
  141.  
  142. /*----- Prototypes for functions written in assembler -----*/
  143. /* extern void reg_move(FPU_REG *a, FPU_REG *b); */
  144.  
  145. asmlinkage void mul64(unsigned long long const *a, unsigned long long const *b,
  146.               unsigned long long *result);
  147. asmlinkage void poly_div2(unsigned long long *x);
  148. asmlinkage void poly_div4(unsigned long long *x);
  149. asmlinkage void poly_div16(unsigned long long *x);
  150. asmlinkage void polynomial(unsigned accum[], unsigned const x[],
  151.                unsigned short const terms[][4], int const n);
  152. asmlinkage void normalize(FPU_REG *x);
  153. asmlinkage void normalize_nuo(FPU_REG *x);
  154. asmlinkage int reg_div(FPU_REG const *arg1, FPU_REG const *arg2,
  155.                FPU_REG *answ, unsigned int control_w);
  156. asmlinkage int reg_u_sub(FPU_REG const *arg1, FPU_REG const *arg2,
  157.              FPU_REG *answ, unsigned int control_w);
  158. asmlinkage int reg_u_mul(FPU_REG const *arg1, FPU_REG const *arg2,
  159.              FPU_REG *answ, unsigned int control_w);
  160. asmlinkage int reg_u_div(FPU_REG const *arg1, FPU_REG const *arg2,
  161.              FPU_REG *answ, unsigned int control_w);
  162. asmlinkage int reg_u_add(FPU_REG const *arg1, FPU_REG const *arg2,
  163.              FPU_REG *answ, unsigned int control_w);
  164. asmlinkage int wm_sqrt(FPU_REG *n, unsigned int control_w);
  165. asmlinkage unsigned    shrx(void *l, unsigned x);
  166. asmlinkage unsigned    shrxs(void *v, unsigned x);
  167. asmlinkage unsigned long div_small(unsigned long long *x, unsigned long y);
  168. asmlinkage void round_reg(FPU_REG *arg, unsigned int extent,
  169.               unsigned int control_w);
  170.  
  171. #ifndef MAKING_PROTO
  172. #include "fpu_proto.h"
  173. #endif
  174.  
  175. #endif __ASSEMBLER__
  176.  
  177. #endif _FPU_EMU_H_
  178.