Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/x86/math-emu/fpu_arith.c
10817 views
1
/*---------------------------------------------------------------------------+
2
| fpu_arith.c |
3
| |
4
| Code to implement the FPU register/register arithmetic instructions |
5
| |
6
| Copyright (C) 1992,1993,1997 |
7
| W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia |
8
| E-mail [email protected] |
9
| |
10
| |
11
+---------------------------------------------------------------------------*/
12
13
#include "fpu_system.h"
14
#include "fpu_emu.h"
15
#include "control_w.h"
16
#include "status_w.h"
17
18
void fadd__(void)
19
{
20
/* fadd st,st(i) */
21
int i = FPU_rm;
22
clear_C1();
23
FPU_add(&st(i), FPU_gettagi(i), 0, control_word);
24
}
25
26
void fmul__(void)
27
{
28
/* fmul st,st(i) */
29
int i = FPU_rm;
30
clear_C1();
31
FPU_mul(&st(i), FPU_gettagi(i), 0, control_word);
32
}
33
34
void fsub__(void)
35
{
36
/* fsub st,st(i) */
37
clear_C1();
38
FPU_sub(0, FPU_rm, control_word);
39
}
40
41
void fsubr_(void)
42
{
43
/* fsubr st,st(i) */
44
clear_C1();
45
FPU_sub(REV, FPU_rm, control_word);
46
}
47
48
void fdiv__(void)
49
{
50
/* fdiv st,st(i) */
51
clear_C1();
52
FPU_div(0, FPU_rm, control_word);
53
}
54
55
void fdivr_(void)
56
{
57
/* fdivr st,st(i) */
58
clear_C1();
59
FPU_div(REV, FPU_rm, control_word);
60
}
61
62
void fadd_i(void)
63
{
64
/* fadd st(i),st */
65
int i = FPU_rm;
66
clear_C1();
67
FPU_add(&st(i), FPU_gettagi(i), i, control_word);
68
}
69
70
void fmul_i(void)
71
{
72
/* fmul st(i),st */
73
clear_C1();
74
FPU_mul(&st(0), FPU_gettag0(), FPU_rm, control_word);
75
}
76
77
void fsubri(void)
78
{
79
/* fsubr st(i),st */
80
clear_C1();
81
FPU_sub(DEST_RM, FPU_rm, control_word);
82
}
83
84
void fsub_i(void)
85
{
86
/* fsub st(i),st */
87
clear_C1();
88
FPU_sub(REV | DEST_RM, FPU_rm, control_word);
89
}
90
91
void fdivri(void)
92
{
93
/* fdivr st(i),st */
94
clear_C1();
95
FPU_div(DEST_RM, FPU_rm, control_word);
96
}
97
98
void fdiv_i(void)
99
{
100
/* fdiv st(i),st */
101
clear_C1();
102
FPU_div(REV | DEST_RM, FPU_rm, control_word);
103
}
104
105
void faddp_(void)
106
{
107
/* faddp st(i),st */
108
int i = FPU_rm;
109
clear_C1();
110
if (FPU_add(&st(i), FPU_gettagi(i), i, control_word) >= 0)
111
FPU_pop();
112
}
113
114
void fmulp_(void)
115
{
116
/* fmulp st(i),st */
117
clear_C1();
118
if (FPU_mul(&st(0), FPU_gettag0(), FPU_rm, control_word) >= 0)
119
FPU_pop();
120
}
121
122
void fsubrp(void)
123
{
124
/* fsubrp st(i),st */
125
clear_C1();
126
if (FPU_sub(DEST_RM, FPU_rm, control_word) >= 0)
127
FPU_pop();
128
}
129
130
void fsubp_(void)
131
{
132
/* fsubp st(i),st */
133
clear_C1();
134
if (FPU_sub(REV | DEST_RM, FPU_rm, control_word) >= 0)
135
FPU_pop();
136
}
137
138
void fdivrp(void)
139
{
140
/* fdivrp st(i),st */
141
clear_C1();
142
if (FPU_div(DEST_RM, FPU_rm, control_word) >= 0)
143
FPU_pop();
144
}
145
146
void fdivp_(void)
147
{
148
/* fdivp st(i),st */
149
clear_C1();
150
if (FPU_div(REV | DEST_RM, FPU_rm, control_word) >= 0)
151
FPU_pop();
152
}
153
154