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
18void 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
26void 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
34void fsub__(void)
35{
36	/* fsub st,st(i) */
37	clear_C1();
38	FPU_sub(0, FPU_rm, control_word);
39}
40
41void fsubr_(void)
42{
43	/* fsubr st,st(i) */
44	clear_C1();
45	FPU_sub(REV, FPU_rm, control_word);
46}
47
48void fdiv__(void)
49{
50	/* fdiv st,st(i) */
51	clear_C1();
52	FPU_div(0, FPU_rm, control_word);
53}
54
55void fdivr_(void)
56{
57	/* fdivr st,st(i) */
58	clear_C1();
59	FPU_div(REV, FPU_rm, control_word);
60}
61
62void 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
70void 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
77void fsubri(void)
78{
79	/* fsubr st(i),st */
80	clear_C1();
81	FPU_sub(DEST_RM, FPU_rm, control_word);
82}
83
84void fsub_i(void)
85{
86	/* fsub st(i),st */
87	clear_C1();
88	FPU_sub(REV | DEST_RM, FPU_rm, control_word);
89}
90
91void fdivri(void)
92{
93	/* fdivr st(i),st */
94	clear_C1();
95	FPU_div(DEST_RM, FPU_rm, control_word);
96}
97
98void fdiv_i(void)
99{
100	/* fdiv st(i),st */
101	clear_C1();
102	FPU_div(REV | DEST_RM, FPU_rm, control_word);
103}
104
105void 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
114void 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
122void 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
130void 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
138void 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
146void 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