xref: /openbmc/linux/arch/x86/math-emu/fpu_arith.c (revision 9cfc5c90)
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 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