Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
fpu_arith.c
Go to the documentation of this file.
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();
39 }
40 
41 void fsubr_(void)
42 {
43  /* fsubr st,st(i) */
44  clear_C1();
46 }
47 
48 void fdiv__(void)
49 {
50  /* fdiv st,st(i) */
51  clear_C1();
53 }
54 
55 void fdivr_(void)
56 {
57  /* fdivr st,st(i) */
58  clear_C1();
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();
75 }
76 
77 void fsubri(void)
78 {
79  /* fsubr st(i),st */
80  clear_C1();
82 }
83 
84 void fsub_i(void)
85 {
86  /* fsub st(i),st */
87  clear_C1();
89 }
90 
91 void fdivri(void)
92 {
93  /* fdivr st(i),st */
94  clear_C1();
96 }
97 
98 void fdiv_i(void)
99 {
100  /* fdiv st(i),st */
101  clear_C1();
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 }