Merge git://git.linux-nfs.org/pub/linux/nfs-2.6
[linux-2.6] / arch / x86 / math-emu / fpu_arith.c
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   billm@suburbia.net                              |
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
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
28 void fmul__(void)
29 {
30   /* fmul st,st(i) */
31   int i = FPU_rm;
32   clear_C1();
33   FPU_mul(&st(i), FPU_gettagi(i), 0, control_word);
34 }
35
36
37
38 void fsub__(void)
39 {
40   /* fsub st,st(i) */
41   clear_C1();
42   FPU_sub(0, FPU_rm, control_word);
43 }
44
45
46 void fsubr_(void)
47 {
48   /* fsubr st,st(i) */
49   clear_C1();
50   FPU_sub(REV, FPU_rm, control_word);
51 }
52
53
54 void fdiv__(void)
55 {
56   /* fdiv st,st(i) */
57   clear_C1();
58   FPU_div(0, FPU_rm, control_word);
59 }
60
61
62 void fdivr_(void)
63 {
64   /* fdivr st,st(i) */
65   clear_C1();
66   FPU_div(REV, FPU_rm, control_word);
67 }
68
69
70
71 void fadd_i(void)
72 {
73   /* fadd st(i),st */
74   int i = FPU_rm;
75   clear_C1();
76   FPU_add(&st(i), FPU_gettagi(i), i, control_word);
77 }
78
79
80 void fmul_i(void)
81 {
82   /* fmul st(i),st */
83   clear_C1();
84   FPU_mul(&st(0), FPU_gettag0(), FPU_rm, control_word);
85 }
86
87
88 void fsubri(void)
89 {
90   /* fsubr st(i),st */
91   clear_C1();
92   FPU_sub(DEST_RM, FPU_rm, control_word);
93 }
94
95
96 void fsub_i(void)
97 {
98   /* fsub st(i),st */
99   clear_C1();
100   FPU_sub(REV|DEST_RM, FPU_rm, control_word);
101 }
102
103
104 void fdivri(void)
105 {
106   /* fdivr st(i),st */
107   clear_C1();
108   FPU_div(DEST_RM, FPU_rm, control_word);
109 }
110
111
112 void fdiv_i(void)
113 {
114   /* fdiv st(i),st */
115   clear_C1();
116   FPU_div(REV|DEST_RM, FPU_rm, control_word);
117 }
118
119
120
121 void faddp_(void)
122 {
123   /* faddp st(i),st */
124   int i = FPU_rm;
125   clear_C1();
126   if ( FPU_add(&st(i), FPU_gettagi(i), i, control_word) >= 0 )
127     FPU_pop();
128 }
129
130
131 void fmulp_(void)
132 {
133   /* fmulp st(i),st */
134   clear_C1();
135   if ( FPU_mul(&st(0), FPU_gettag0(), FPU_rm, control_word) >= 0 )
136     FPU_pop();
137 }
138
139
140
141 void fsubrp(void)
142 {
143   /* fsubrp st(i),st */
144   clear_C1();
145   if ( FPU_sub(DEST_RM, FPU_rm, control_word) >= 0 )
146     FPU_pop();
147 }
148
149
150 void fsubp_(void)
151 {
152   /* fsubp st(i),st */
153   clear_C1();
154   if ( FPU_sub(REV|DEST_RM, FPU_rm, control_word) >= 0 )
155     FPU_pop();
156 }
157
158
159 void fdivrp(void)
160 {
161   /* fdivrp st(i),st */
162   clear_C1();
163   if ( FPU_div(DEST_RM, FPU_rm, control_word) >= 0 )
164     FPU_pop();
165 }
166
167
168 void fdivp_(void)
169 {
170   /* fdivp st(i),st */
171   clear_C1();
172   if ( FPU_div(REV|DEST_RM, FPU_rm, control_word) >= 0 )
173     FPU_pop();
174 }