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