Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#ifndef nil
2
#include <u.h>
3
#endif
4
 
5
typedef long Word;
6
typedef long long Vlong;
7
typedef unsigned long Single;
8
 
9
/* use u.h's FPdbleword */
10
#define Double	FPdbleword
11
#define h hi
12
#define l lo
13
 
14
enum {
15
	FractBits	= 28,
16
	CarryBit	= 0x10000000,
17
	HiddenBit	= 0x08000000,
18
	MsBit		= HiddenBit,
19
	NGuardBits	= 3,
20
	GuardMask	= 0x07,
21
	LsBit		= (1<<NGuardBits),
22
 
23
	SingleExpBias	= 127,
24
	SingleExpMax	= 255,
25
	DoubleExpBias	= 1023,
26
	DoubleExpMax	= 2047,
27
 
28
	ExpBias		= DoubleExpBias,
29
	ExpInfinity	= DoubleExpMax,
30
};
31
 
32
typedef struct {
33
	/* order matters: must start with s, e, l, h in that order */
34
	unsigned char s;
35
	short e;
36
	/* double bits */
37
	long l;				/* 0000FFFFFFFFFFFFFFFFFFFFFFFFFGGG */
38
	long h;				/* 0000HFFFFFFFFFFFFFFFFFFFFFFFFFFF */
39
} Internal;
40
 
41
#define IsWeird(n)	((n)->e >= ExpInfinity)
42
#define	IsInfinity(n)	(IsWeird(n) && (n)->h == HiddenBit && (n)->l == 0)
43
#define	SetInfinity(n)	((n)->e = ExpInfinity, (n)->h = HiddenBit, (n)->l = 0)
44
#define IsNaN(n)	(IsWeird(n) && (((n)->h & ~HiddenBit) || (n)->l))
45
#define	SetQNaN(n)	((n)->s = 0, (n)->e = ExpInfinity, 		\
46
			 (n)->h = HiddenBit|(LsBit<<1), (n)->l = 0)
47
#define IsZero(n)	((n)->e == 1 && (n)->h == 0 && (n)->l == 0)
48
#define SetZero(n)	((n)->e = 1, (n)->h = 0, (n)->l = 0)
49
 
50
/*
51
 * fpi.c
52
 */
53
extern void fpiround(Internal *);
54
extern void fpiadd(Internal *, Internal *, Internal *);
55
extern void fpisub(Internal *, Internal *, Internal *);
56
extern void fpimul(Internal *, Internal *, Internal *);
57
extern void fpidiv(Internal *, Internal *, Internal *);
58
extern int fpicmp(Internal *, Internal *);
59
extern void fpinormalise(Internal*);
60
 
61
/*
62
 * fpimem.c
63
 */
64
extern void fpis2i(Internal *, void *);
65
extern void fpid2i(Internal *, void *);
66
extern void fpiw2i(Internal *, void *);
67
extern void fpiv2i(Internal *, void *);
68
extern void fpii2s(void *, Internal *);
69
extern void fpii2d(void *, Internal *);
70
extern void fpii2w(Word *, Internal *);
71
extern void fpii2v(Vlong *, Internal *);