blob: e91ee09be93e3fff026e7c413c99aa1e767ce60b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
/* This code is a little awkward. If somebody who understands Solaris
better would tell me an idiomatic way to invoke equivalent
behavior, I'd be grateful. ehg@bell-labs.com */
/*
* accrued exception bits in the fsr
*/
#define FPAINEX (1<<5)
#define FPAOVFL (1<<8)
#define FPAUNFL (1<<7)
#define FPAZDIV (1<<6)
#define FPAINVAL (1<<9)
/*
* exception enable bits in the fsr
*/
#define FPINEX (1<<23)
#define FPOVFL (1<<26)
#define FPUNFL (1<<25)
#define FPZDIV (1<<24)
#define FPINVAL (1<<27)
/*
* rounding
*/
#define FPRMASK (3<<30)
#define FPRNR (0<<30)
#define FPRNINF (3<<30)
#define FPRPINF (2<<30)
#define FPRZ (1<<30)
/*
* precision
*/
#define FPPDBL 0
#define FPFCR (FPRMASK|FPINEX|FPOVFL|FPUNFL|FPZDIV|FPINVAL)
#define FPFSR (FPAINEX|FPAOVFL|FPAUNFL|FPAZDIV|FPAINVAL)
static ulong
getfcr(void)
{
ulong v;
asm(" st %fsr, [%fp-8]");
return v;
}
static void
setfcr(ulong v)
{
ulong vv;
vv = (getfcr() & ~FPFCR) | (v & FPFCR);
asm(" ld [%fp-4], %fsr");
}
static ulong
getfsr(void)
{
ulong v;
asm(" st %fsr, [%fp-8]");
return v;
}
static void
setfsr(ulong v)
{
ulong vv;
vv = (getfsr() & ~FPFSR) | (v & FPFSR);
asm(" ld [%fp-4], %fsr");
}
|