xref: /openbmc/linux/arch/x86/math-emu/fpu_arith.c (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
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   billm@suburbia.net                              |
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  
fadd__(void)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  
fmul__(void)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  
fsub__(void)35  void fsub__(void)
36  {
37  	/* fsub st,st(i) */
38  	clear_C1();
39  	FPU_sub(0, FPU_rm, control_word);
40  }
41  
fsubr_(void)42  void fsubr_(void)
43  {
44  	/* fsubr st,st(i) */
45  	clear_C1();
46  	FPU_sub(REV, FPU_rm, control_word);
47  }
48  
fdiv__(void)49  void fdiv__(void)
50  {
51  	/* fdiv st,st(i) */
52  	clear_C1();
53  	FPU_div(0, FPU_rm, control_word);
54  }
55  
fdivr_(void)56  void fdivr_(void)
57  {
58  	/* fdivr st,st(i) */
59  	clear_C1();
60  	FPU_div(REV, FPU_rm, control_word);
61  }
62  
fadd_i(void)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  
fmul_i(void)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  
fsubri(void)78  void fsubri(void)
79  {
80  	/* fsubr st(i),st */
81  	clear_C1();
82  	FPU_sub(DEST_RM, FPU_rm, control_word);
83  }
84  
fsub_i(void)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  
fdivri(void)92  void fdivri(void)
93  {
94  	/* fdivr st(i),st */
95  	clear_C1();
96  	FPU_div(DEST_RM, FPU_rm, control_word);
97  }
98  
fdiv_i(void)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  
faddp_(void)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  
fmulp_(void)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  
fsubrp(void)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  
fsubp_(void)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  
fdivrp(void)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  
fdivp_(void)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