root/drivers/FPU-emu/fpu_emu.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


   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 
  91 /* These are to defeat the default action, giving the instruction
  92    no net effect: */
  93 #define NO_NET_DATA_EFFECT \
  94       { FPU_data_address = (void *)data_operand_offset; \
  95         FPU_data_selector = operand_selector; }
  96 #define NO_NET_INSTR_EFFECT \
  97       { FPU_entry_eip = ip_offset; \
  98         FPU_entry_op_cs = cs_selector; }
  99 
 100 
 101 typedef void (*FUNC)(void);
 102 typedef struct fpu_reg FPU_REG;
 103 typedef struct { unsigned char address_size, operand_size, segment; }
 104         overrides;
 105 /* This structure is 32 bits: */
 106 typedef struct { overrides override;
 107                  unsigned char vm86; } fpu_addr_modes;
 108 
 109 #define st(x)   ( regs[((top+x) &7 )] )
 110 
 111 #define STACK_OVERFLOW  (st_new_ptr = &st(-1), st_new_ptr->tag != TW_Empty)
 112 #define NOT_EMPTY(i)    (st(i).tag != TW_Empty)
 113 #define NOT_EMPTY_0     (FPU_st0_tag ^ TW_Empty)
 114 
 115 extern unsigned char FPU_rm;
 116 
 117 extern  char    FPU_st0_tag;
 118 extern  FPU_REG *FPU_st0_ptr;
 119 
 120 /* ###### These need to be shifted to somewhere safe. */
 121 /* extern void  *FPU_data_address; has been shifted */
 122 extern unsigned short FPU_data_selector;
 123 extern unsigned long FPU_entry_op_cs;
 124 
 125 extern  FPU_REG  FPU_loaded_data;
 126 
 127 #define pop()   { FPU_st0_ptr->tag = TW_Empty; top++; }
 128 
 129 /* push() does not affect the tags */
 130 #define push()  { top--; FPU_st0_ptr = st_new_ptr; }
 131 
 132 
 133 #define reg_move(x, y) { \
 134                  *(short *)&((y)->sign) = *(short *)&((x)->sign); \
 135                  *(long *)&((y)->exp) = *(long *)&((x)->exp); \
 136                  *(long long *)&((y)->sigl) = *(long long *)&((x)->sigl); }
 137 
 138 #define significand(x) ( ((unsigned long long *)&((x)->sigl))[0] )
 139 
 140 
 141 /*----- Prototypes for functions written in assembler -----*/
 142 /* extern void reg_move(FPU_REG *a, FPU_REG *b); */
 143 
 144 asmlinkage void mul64(unsigned long long const *a, unsigned long long const *b,
 145                       unsigned long long *result);
 146 asmlinkage void poly_div2(unsigned long long *x);
 147 asmlinkage void poly_div4(unsigned long long *x);
 148 asmlinkage void poly_div16(unsigned long long *x);
 149 asmlinkage void polynomial(unsigned accum[], unsigned const x[],
 150                        unsigned short const terms[][4], int const n);
 151 asmlinkage void normalize(FPU_REG *x);
 152 asmlinkage void normalize_nuo(FPU_REG *x);
 153 asmlinkage int reg_div(FPU_REG const *arg1, FPU_REG const *arg2,
 154                        FPU_REG *answ, unsigned int control_w);
 155 asmlinkage int reg_u_sub(FPU_REG const *arg1, FPU_REG const *arg2,
 156                          FPU_REG *answ, unsigned int control_w);
 157 asmlinkage int reg_u_mul(FPU_REG const *arg1, FPU_REG const *arg2,
 158                          FPU_REG *answ, unsigned int control_w);
 159 asmlinkage int reg_u_div(FPU_REG const *arg1, FPU_REG const *arg2,
 160                          FPU_REG *answ, unsigned int control_w);
 161 asmlinkage int reg_u_add(FPU_REG const *arg1, FPU_REG const *arg2,
 162                          FPU_REG *answ, unsigned int control_w);
 163 asmlinkage int wm_sqrt(FPU_REG *n, unsigned int control_w);
 164 asmlinkage unsigned     shrx(void *l, unsigned x);
 165 asmlinkage unsigned     shrxs(void *v, unsigned x);
 166 asmlinkage unsigned long div_small(unsigned long long *x, unsigned long y);
 167 asmlinkage void round_reg(FPU_REG *arg, unsigned int extent,
 168                       unsigned int control_w);
 169 
 170 #ifndef MAKING_PROTO
 171 #include "fpu_proto.h"
 172 #endif
 173 
 174 #endif __ASSEMBLER__
 175 
 176 #endif _FPU_EMU_H_

/* [previous][next][first][last][top][bottom][index][help] */