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 #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_

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