^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*---------------------------------------------------------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) | fpu_emu.h |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) | Copyright (C) 1992,1993,1994,1997 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) | Australia. E-mail billm@suburbia.net |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) +---------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #ifndef _FPU_EMU_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define _FPU_EMU_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * Define PECULIAR_486 to get a closer approximation to 80486 behaviour,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * rather than behaviour which appears to be cleaner.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * This is a matter of opinion: for all I know, the 80486 may simply
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * be complying with the IEEE spec. Maybe one day I'll get to see the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * spec...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define PECULIAR_486
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #ifdef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include "fpu_asm.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define Const(x) $##x
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define Const(x) x
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define EXP_BIAS Const(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define EXP_OVER Const(0x4000) /* smallest invalid large exponent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define EXP_UNDER Const(-0x3fff) /* largest invalid small exponent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define EXP_WAY_UNDER Const(-0x6000) /* Below the smallest denormal, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) still a 16 bit nr. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define EXP_Infinity EXP_OVER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define EXP_NaN EXP_OVER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define EXTENDED_Ebias Const(0x3fff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define EXTENDED_Emin (-0x3ffe) /* smallest valid exponent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define SIGN_POS Const(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define SIGN_NEG Const(0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define SIGN_Positive Const(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define SIGN_Negative Const(0x8000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) /* Keep the order TAG_Valid, TAG_Zero, TW_Denormal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) /* The following fold to 2 (Special) in the Tag Word */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define TW_Denormal Const(4) /* De-normal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define TW_Infinity Const(5) /* + or - infinity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define TW_NaN Const(6) /* Not a Number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define TW_Unsupported Const(7) /* Not supported by an 80486 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define TAG_Valid Const(0) /* valid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define TAG_Zero Const(1) /* zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define TAG_Special Const(2) /* De-normal, + or - infinity,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) or Not a Number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define TAG_Empty Const(3) /* empty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define TAG_Error Const(0x80) /* probably need to abort */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define LOADED_DATA Const(10101) /* Special st() number to identify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) loaded data (not on stack). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) /* A few flags (must be >= 0x10). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define REV 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define DEST_RM 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define LOADED 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define FPU_Exception Const(0x80000000) /* Added to tag returns. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #ifndef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #include "fpu_system.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #include <uapi/asm/sigcontext.h> /* for struct _fpstate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #include <asm/math_emu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define RE_ENTRANT_CHECKING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #ifdef RE_ENTRANT_CHECKING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) extern u_char emulating;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) # define RE_ENTRANT_CHECK_OFF emulating = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) # define RE_ENTRANT_CHECK_ON emulating = 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) # define RE_ENTRANT_CHECK_OFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) # define RE_ENTRANT_CHECK_ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #endif /* RE_ENTRANT_CHECKING */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define FWAIT_OPCODE 0x9b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define OP_SIZE_PREFIX 0x66
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define ADDR_SIZE_PREFIX 0x67
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define PREFIX_CS 0x2e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define PREFIX_DS 0x3e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define PREFIX_ES 0x26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define PREFIX_SS 0x36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define PREFIX_FS 0x64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define PREFIX_GS 0x65
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define PREFIX_REPE 0xf3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define PREFIX_REPNE 0xf2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define PREFIX_LOCK 0xf0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define PREFIX_CS_ 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define PREFIX_DS_ 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define PREFIX_ES_ 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define PREFIX_FS_ 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define PREFIX_GS_ 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define PREFIX_SS_ 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define PREFIX_DEFAULT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) struct address {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) unsigned int offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) unsigned int selector:16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) unsigned int opcode:11;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) unsigned int empty:5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) struct fpu__reg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) unsigned sigl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) unsigned sigh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) short exp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) typedef void (*FUNC) (void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) typedef struct fpu__reg FPU_REG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) typedef void (*FUNC_ST0) (FPU_REG *st0_ptr, u_char st0_tag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) u_char address_size, operand_size, segment;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) } overrides;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) /* This structure is 32 bits: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) overrides override;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) u_char default_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) } fpu_addr_modes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) /* PROTECTED has a restricted meaning in the emulator; it is used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) to signal that the emulator needs to do special things to ensure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) that protection is respected in a segmented model. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define PROTECTED 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define SIXTEEN 1 /* We rely upon this being 1 (true) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define VM86 SIXTEEN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define PM16 (SIXTEEN | PROTECTED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define SEG32 PROTECTED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) extern u_char const data_sizes_16[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define register_base ((u_char *) registers )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define fpu_register(x) ( * ((FPU_REG *)( register_base + 10 * (x & 7) )) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define st(x) ( * ((FPU_REG *)( register_base + 10 * ((top+x) & 7) )) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #define STACK_OVERFLOW (FPU_stackoverflow(&st_new_ptr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #define NOT_EMPTY(i) (!FPU_empty_i(i))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define NOT_EMPTY_ST0 (st0_tag ^ TAG_Empty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define poppop() { FPU_pop(); FPU_pop(); }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) /* push() does not affect the tags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define push() { top--; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #define signbyte(a) (((u_char *)(a))[9])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) #define getsign(a) (signbyte(a) & 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #define setsign(a,b) { if ((b) != 0) signbyte(a) |= 0x80; else signbyte(a) &= 0x7f; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #define copysign(a,b) { if (getsign(a)) signbyte(b) |= 0x80; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) else signbyte(b) &= 0x7f; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #define changesign(a) { signbyte(a) ^= 0x80; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #define setpositive(a) { signbyte(a) &= 0x7f; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #define setnegative(a) { signbyte(a) |= 0x80; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #define signpositive(a) ( (signbyte(a) & 0x80) == 0 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #define signnegative(a) (signbyte(a) & 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) static inline void reg_copy(FPU_REG const *x, FPU_REG *y)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) *(short *)&(y->exp) = *(const short *)&(x->exp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) *(long long *)&(y->sigl) = *(const long long *)&(x->sigl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) #define exponent(x) (((*(short *)&((x)->exp)) & 0x7fff) - EXTENDED_Ebias)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #define setexponentpos(x,y) { (*(short *)&((x)->exp)) = \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) ((y) + EXTENDED_Ebias) & 0x7fff; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) #define exponent16(x) (*(short *)&((x)->exp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #define setexponent16(x,y) { (*(short *)&((x)->exp)) = (u16)(y); }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) #define addexponent(x,y) { (*(short *)&((x)->exp)) += (y); }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) #define stdexp(x) { (*(short *)&((x)->exp)) += EXTENDED_Ebias; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) #define isdenormal(ptr) (exponent(ptr) == EXP_BIAS+EXP_UNDER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) #define significand(x) ( ((unsigned long long *)&((x)->sigl))[0] )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) /*----- Prototypes for functions written in assembler -----*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) /* extern void reg_move(FPU_REG *a, FPU_REG *b); */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) asmlinkage int FPU_normalize(FPU_REG *x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) asmlinkage int FPU_normalize_nuo(FPU_REG *x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) asmlinkage int FPU_u_sub(FPU_REG const *arg1, FPU_REG const *arg2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) FPU_REG * answ, unsigned int control_w, u_char sign,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) int expa, int expb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) asmlinkage int FPU_u_mul(FPU_REG const *arg1, FPU_REG const *arg2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) FPU_REG * answ, unsigned int control_w, u_char sign,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) int expon);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) asmlinkage int FPU_u_div(FPU_REG const *arg1, FPU_REG const *arg2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) FPU_REG * answ, unsigned int control_w, u_char sign);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) asmlinkage int FPU_u_add(FPU_REG const *arg1, FPU_REG const *arg2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) FPU_REG * answ, unsigned int control_w, u_char sign,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) int expa, int expb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) asmlinkage int wm_sqrt(FPU_REG *n, int dummy1, int dummy2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) unsigned int control_w, u_char sign);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) asmlinkage unsigned FPU_shrx(void *l, unsigned x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) asmlinkage unsigned FPU_shrxs(void *v, unsigned x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) asmlinkage unsigned long FPU_div_small(unsigned long long *x, unsigned long y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) asmlinkage int FPU_round(FPU_REG *arg, unsigned int extent, int dummy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) unsigned int control_w, u_char sign);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) #ifndef MAKING_PROTO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) #include "fpu_proto.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) #endif /* __ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) #endif /* _FPU_EMU_H_ */