Blame view

arch/x86/math-emu/fpu_arith.c 2.94 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  /*---------------------------------------------------------------------------+
   |  fpu_arith.c                                                              |
   |                                                                           |
   | Code to implement the FPU register/register arithmetic instructions       |
   |                                                                           |
   | Copyright (C) 1992,1993,1997                                              |
   |                  W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia |
   |                  E-mail   billm@suburbia.net                              |
   |                                                                           |
   |                                                                           |
   +---------------------------------------------------------------------------*/
  
  #include "fpu_system.h"
  #include "fpu_emu.h"
  #include "control_w.h"
  #include "status_w.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
18
  void fadd__(void)
  {
3d0d14f98   Ingo Molnar   x86: lindent arch...
19
20
21
22
  	/* fadd st,st(i) */
  	int i = FPU_rm;
  	clear_C1();
  	FPU_add(&st(i), FPU_gettagi(i), 0, control_word);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
  void fmul__(void)
  {
3d0d14f98   Ingo Molnar   x86: lindent arch...
26
27
28
29
  	/* fmul st,st(i) */
  	int i = FPU_rm;
  	clear_C1();
  	FPU_mul(&st(i), FPU_gettagi(i), 0, control_word);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
32
  void fsub__(void)
  {
3d0d14f98   Ingo Molnar   x86: lindent arch...
33
34
35
  	/* fsub st,st(i) */
  	clear_C1();
  	FPU_sub(0, FPU_rm, control_word);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
38
  void fsubr_(void)
  {
3d0d14f98   Ingo Molnar   x86: lindent arch...
39
40
41
  	/* fsubr st,st(i) */
  	clear_C1();
  	FPU_sub(REV, FPU_rm, control_word);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43
44
  void fdiv__(void)
  {
3d0d14f98   Ingo Molnar   x86: lindent arch...
45
46
47
  	/* fdiv st,st(i) */
  	clear_C1();
  	FPU_div(0, FPU_rm, control_word);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
50
  void fdivr_(void)
  {
3d0d14f98   Ingo Molnar   x86: lindent arch...
51
52
53
  	/* fdivr st,st(i) */
  	clear_C1();
  	FPU_div(REV, FPU_rm, control_word);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
56
  void fadd_i(void)
  {
3d0d14f98   Ingo Molnar   x86: lindent arch...
57
58
59
60
  	/* fadd st(i),st */
  	int i = FPU_rm;
  	clear_C1();
  	FPU_add(&st(i), FPU_gettagi(i), i, control_word);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62
63
  void fmul_i(void)
  {
3d0d14f98   Ingo Molnar   x86: lindent arch...
64
65
66
  	/* fmul st(i),st */
  	clear_C1();
  	FPU_mul(&st(0), FPU_gettag0(), FPU_rm, control_word);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
69
  void fsubri(void)
  {
3d0d14f98   Ingo Molnar   x86: lindent arch...
70
71
72
  	/* fsubr st(i),st */
  	clear_C1();
  	FPU_sub(DEST_RM, FPU_rm, control_word);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
75
  void fsub_i(void)
  {
3d0d14f98   Ingo Molnar   x86: lindent arch...
76
77
78
  	/* fsub st(i),st */
  	clear_C1();
  	FPU_sub(REV | DEST_RM, FPU_rm, control_word);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
79
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
  void fdivri(void)
  {
3d0d14f98   Ingo Molnar   x86: lindent arch...
82
83
84
  	/* fdivr st(i),st */
  	clear_C1();
  	FPU_div(DEST_RM, FPU_rm, control_word);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
86
87
  void fdiv_i(void)
  {
3d0d14f98   Ingo Molnar   x86: lindent arch...
88
89
90
  	/* fdiv st(i),st */
  	clear_C1();
  	FPU_div(REV | DEST_RM, FPU_rm, control_word);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
91
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
93
  void faddp_(void)
  {
3d0d14f98   Ingo Molnar   x86: lindent arch...
94
95
96
97
98
  	/* faddp st(i),st */
  	int i = FPU_rm;
  	clear_C1();
  	if (FPU_add(&st(i), FPU_gettagi(i), i, control_word) >= 0)
  		FPU_pop();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
101
  void fmulp_(void)
  {
3d0d14f98   Ingo Molnar   x86: lindent arch...
102
103
104
105
  	/* fmulp st(i),st */
  	clear_C1();
  	if (FPU_mul(&st(0), FPU_gettag0(), FPU_rm, control_word) >= 0)
  		FPU_pop();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
106
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107
108
  void fsubrp(void)
  {
3d0d14f98   Ingo Molnar   x86: lindent arch...
109
110
111
112
  	/* fsubrp st(i),st */
  	clear_C1();
  	if (FPU_sub(DEST_RM, FPU_rm, control_word) >= 0)
  		FPU_pop();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
114
115
  void fsubp_(void)
  {
3d0d14f98   Ingo Molnar   x86: lindent arch...
116
117
118
119
  	/* fsubp st(i),st */
  	clear_C1();
  	if (FPU_sub(REV | DEST_RM, FPU_rm, control_word) >= 0)
  		FPU_pop();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
121
122
  void fdivrp(void)
  {
3d0d14f98   Ingo Molnar   x86: lindent arch...
123
124
125
126
  	/* fdivrp st(i),st */
  	clear_C1();
  	if (FPU_div(DEST_RM, FPU_rm, control_word) >= 0)
  		FPU_pop();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
128
129
  void fdivp_(void)
  {
3d0d14f98   Ingo Molnar   x86: lindent arch...
130
131
132
133
  	/* fdivp st(i),st */
  	clear_C1();
  	if (FPU_div(REV | DEST_RM, FPU_rm, control_word) >= 0)
  		FPU_pop();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134
  }