1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 #ifndef _FPU_EMU_H_
  12 #define _FPU_EMU_H_
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 #define DENORM_OPERAND
  21 
  22 
  23 
  24 
  25 
  26 
  27 
  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)    
  40 #define EXP_UNDER       Const(-0x3fff)   
  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 
  48 #define TW_Valid        Const(0)        
  49 #define TW_Zero         Const(1)        
  50 
  51        
  52 #define TW_Infinity     Const(5)        
  53 #define TW_NaN          Const(6)        
  54 
  55 #define TW_Empty        Const(7)        
  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 
  85 
  86 
  87 #define NO_NET_DATA_EFFECT \
  88       { FPU_data_address = (void *)data_operand_offset; \
  89         FPU_data_selector = operand_selector; }
  90 #define NO_NET_INSTR_EFFECT \
  91       { FPU_entry_eip = ip_offset; \
  92         FPU_entry_op_cs = cs_selector; }
  93 
  94 
  95 typedef void (*FUNC)(void);
  96 typedef struct fpu_reg FPU_REG;
  97 typedef struct { unsigned char address_size, operand_size, segment; }
  98         overrides;
  99 
 100 typedef struct { overrides override;
 101                  unsigned char vm86; } fpu_addr_modes;
 102 
 103 #define st(x)   ( regs[((top+x) &7 )] )
 104 
 105 #define STACK_OVERFLOW  (st_new_ptr = &st(-1), st_new_ptr->tag != TW_Empty)
 106 #define NOT_EMPTY(i)    (st(i).tag != TW_Empty)
 107 #define NOT_EMPTY_0     (FPU_st0_tag ^ TW_Empty)
 108 
 109 extern unsigned char FPU_rm;
 110 
 111 extern  char    FPU_st0_tag;
 112 extern  FPU_REG *FPU_st0_ptr;
 113 
 114 
 115 
 116 extern unsigned short FPU_data_selector;
 117 extern unsigned long FPU_entry_op_cs;
 118 
 119 extern  FPU_REG  FPU_loaded_data;
 120 
 121 #define pop()   { FPU_st0_ptr->tag = TW_Empty; top++; }
 122 
 123 
 124 #define push()  { top--; FPU_st0_ptr = st_new_ptr; }
 125 
 126 
 127 #define reg_move(x, y) { \
 128                  *(short *)&((y)->sign) = *(short *)&((x)->sign); \
 129                  *(long *)&((y)->exp) = *(long *)&((x)->exp); \
 130                  *(long long *)&((y)->sigl) = *(long long *)&((x)->sigl); }
 131 
 132 #define significand(x) ( ((unsigned long long *)&((x)->sigl))[0] )
 133 
 134 
 135 
 136 
 137 
 138 asmlinkage void mul64(unsigned long long const *a, unsigned long long const *b,
 139                       unsigned long long *result);
 140 asmlinkage void poly_div2(unsigned long long *x);
 141 asmlinkage void poly_div4(unsigned long long *x);
 142 asmlinkage void poly_div16(unsigned long long *x);
 143 asmlinkage void polynomial(unsigned accum[], unsigned const x[],
 144                        unsigned short const terms[][4], int const n);
 145 asmlinkage void normalize(FPU_REG *x);
 146 asmlinkage void normalize_nuo(FPU_REG *x);
 147 asmlinkage int reg_div(FPU_REG const *arg1, FPU_REG const *arg2,
 148                        FPU_REG *answ, unsigned int control_w);
 149 asmlinkage int reg_u_sub(FPU_REG const *arg1, FPU_REG const *arg2,
 150                          FPU_REG *answ, unsigned int control_w);
 151 asmlinkage int reg_u_mul(FPU_REG const *arg1, FPU_REG const *arg2,
 152                          FPU_REG *answ, unsigned int control_w);
 153 asmlinkage int reg_u_div(FPU_REG const *arg1, FPU_REG const *arg2,
 154                          FPU_REG *answ, unsigned int control_w);
 155 asmlinkage int reg_u_add(FPU_REG const *arg1, FPU_REG const *arg2,
 156                          FPU_REG *answ, unsigned int control_w);
 157 asmlinkage int wm_sqrt(FPU_REG *n, unsigned int control_w);
 158 asmlinkage unsigned     shrx(void *l, unsigned x);
 159 asmlinkage unsigned     shrxs(void *v, unsigned x);
 160 asmlinkage unsigned long div_small(unsigned long long *x, unsigned long y);
 161 asmlinkage void round_reg(FPU_REG *arg, unsigned int extent,
 162                       unsigned int control_w);
 163 
 164 #ifndef MAKING_PROTO
 165 #include "fpu_proto.h"
 166 #endif
 167 
 168 #endif __ASSEMBLER__
 169 
 170 #endif _FPU_EMU_H_