~jderose/ubuntu/raring/qemu/vde-again

« back to all changes in this revision

Viewing changes to linux-user/arm/nwfpe/single_cpdo.c

  • Committer: Bazaar Package Importer
  • Author(s): Aurelien Jarno, Aurelien Jarno
  • Date: 2009-03-22 10:13:17 UTC
  • mfrom: (1.2.1 upstream) (6.1.1 sid)
  • Revision ID: james.westby@ubuntu.com-20090322101317-iigjtnu5qil35dtb
Tags: 0.10.1-1
[ Aurelien Jarno ]
* New upstream stable release:
  - patches/80_stable-branch.patch: remove.
* debian/control: 
  - Remove depends on proll.
  - Move depends on device-tree-compiler to build-depends.
  - Bump Standards-Version to 3.8.1 (no changes).
* patches/82_qemu-img_decimal.patch: new patch from upstream to make
  qemu-img accept sizes with decimal values (closes: bug#501400).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
    NetWinder Floating Point Emulator
 
3
    (c) Rebel.COM, 1998,1999
 
4
 
 
5
    Direct questions, comments to Scott Bambrough <scottb@netwinder.org>
 
6
 
 
7
    This program is free software; you can redistribute it and/or modify
 
8
    it under the terms of the GNU General Public License as published by
 
9
    the Free Software Foundation; either version 2 of the License, or
 
10
    (at your option) any later version.
 
11
 
 
12
    This program is distributed in the hope that it will be useful,
 
13
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
15
    GNU General Public License for more details.
 
16
 
 
17
    You should have received a copy of the GNU General Public License
 
18
    along with this program; if not, write to the Free Software
 
19
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
20
*/
 
21
 
 
22
#include "fpa11.h"
 
23
#include "softfloat.h"
 
24
#include "fpopcode.h"
 
25
 
 
26
float32 float32_exp(float32 Fm);
 
27
float32 float32_ln(float32 Fm);
 
28
float32 float32_sin(float32 rFm);
 
29
float32 float32_cos(float32 rFm);
 
30
float32 float32_arcsin(float32 rFm);
 
31
float32 float32_arctan(float32 rFm);
 
32
float32 float32_log(float32 rFm);
 
33
float32 float32_tan(float32 rFm);
 
34
float32 float32_arccos(float32 rFm);
 
35
float32 float32_pow(float32 rFn,float32 rFm);
 
36
float32 float32_pol(float32 rFn,float32 rFm);
 
37
 
 
38
unsigned int SingleCPDO(const unsigned int opcode)
 
39
{
 
40
   FPA11 *fpa11 = GET_FPA11();
 
41
   float32 rFm, rFn = float32_zero;
 
42
   unsigned int Fd, Fm, Fn, nRc = 1;
 
43
 
 
44
   Fm = getFm(opcode);
 
45
   if (CONSTANT_FM(opcode))
 
46
   {
 
47
     rFm = getSingleConstant(Fm);
 
48
   }
 
49
   else
 
50
   {
 
51
     switch (fpa11->fType[Fm])
 
52
     {
 
53
        case typeSingle:
 
54
          rFm = fpa11->fpreg[Fm].fSingle;
 
55
        break;
 
56
 
 
57
        default: return 0;
 
58
     }
 
59
   }
 
60
 
 
61
   if (!MONADIC_INSTRUCTION(opcode))
 
62
   {
 
63
      Fn = getFn(opcode);
 
64
      switch (fpa11->fType[Fn])
 
65
      {
 
66
        case typeSingle:
 
67
          rFn = fpa11->fpreg[Fn].fSingle;
 
68
        break;
 
69
 
 
70
        default: return 0;
 
71
      }
 
72
   }
 
73
 
 
74
   Fd = getFd(opcode);
 
75
   switch (opcode & MASK_ARITHMETIC_OPCODE)
 
76
   {
 
77
      /* dyadic opcodes */
 
78
      case ADF_CODE:
 
79
         fpa11->fpreg[Fd].fSingle = float32_add(rFn,rFm, &fpa11->fp_status);
 
80
      break;
 
81
 
 
82
      case MUF_CODE:
 
83
      case FML_CODE:
 
84
        fpa11->fpreg[Fd].fSingle = float32_mul(rFn,rFm, &fpa11->fp_status);
 
85
      break;
 
86
 
 
87
      case SUF_CODE:
 
88
         fpa11->fpreg[Fd].fSingle = float32_sub(rFn,rFm, &fpa11->fp_status);
 
89
      break;
 
90
 
 
91
      case RSF_CODE:
 
92
         fpa11->fpreg[Fd].fSingle = float32_sub(rFm,rFn, &fpa11->fp_status);
 
93
      break;
 
94
 
 
95
      case DVF_CODE:
 
96
      case FDV_CODE:
 
97
         fpa11->fpreg[Fd].fSingle = float32_div(rFn,rFm, &fpa11->fp_status);
 
98
      break;
 
99
 
 
100
      case RDF_CODE:
 
101
      case FRD_CODE:
 
102
         fpa11->fpreg[Fd].fSingle = float32_div(rFm,rFn, &fpa11->fp_status);
 
103
      break;
 
104
 
 
105
#if 0
 
106
      case POW_CODE:
 
107
         fpa11->fpreg[Fd].fSingle = float32_pow(rFn,rFm);
 
108
      break;
 
109
 
 
110
      case RPW_CODE:
 
111
         fpa11->fpreg[Fd].fSingle = float32_pow(rFm,rFn);
 
112
      break;
 
113
#endif
 
114
 
 
115
      case RMF_CODE:
 
116
         fpa11->fpreg[Fd].fSingle = float32_rem(rFn,rFm, &fpa11->fp_status);
 
117
      break;
 
118
 
 
119
#if 0
 
120
      case POL_CODE:
 
121
         fpa11->fpreg[Fd].fSingle = float32_pol(rFn,rFm);
 
122
      break;
 
123
#endif
 
124
 
 
125
      /* monadic opcodes */
 
126
      case MVF_CODE:
 
127
         fpa11->fpreg[Fd].fSingle = rFm;
 
128
      break;
 
129
 
 
130
      case MNF_CODE:
 
131
         fpa11->fpreg[Fd].fSingle = float32_chs(rFm);
 
132
      break;
 
133
 
 
134
      case ABS_CODE:
 
135
         fpa11->fpreg[Fd].fSingle = float32_abs(rFm);
 
136
      break;
 
137
 
 
138
      case RND_CODE:
 
139
      case URD_CODE:
 
140
         fpa11->fpreg[Fd].fSingle = float32_round_to_int(rFm, &fpa11->fp_status);
 
141
      break;
 
142
 
 
143
      case SQT_CODE:
 
144
         fpa11->fpreg[Fd].fSingle = float32_sqrt(rFm, &fpa11->fp_status);
 
145
      break;
 
146
 
 
147
#if 0
 
148
      case LOG_CODE:
 
149
         fpa11->fpreg[Fd].fSingle = float32_log(rFm);
 
150
      break;
 
151
 
 
152
      case LGN_CODE:
 
153
         fpa11->fpreg[Fd].fSingle = float32_ln(rFm);
 
154
      break;
 
155
 
 
156
      case EXP_CODE:
 
157
         fpa11->fpreg[Fd].fSingle = float32_exp(rFm);
 
158
      break;
 
159
 
 
160
      case SIN_CODE:
 
161
         fpa11->fpreg[Fd].fSingle = float32_sin(rFm);
 
162
      break;
 
163
 
 
164
      case COS_CODE:
 
165
         fpa11->fpreg[Fd].fSingle = float32_cos(rFm);
 
166
      break;
 
167
 
 
168
      case TAN_CODE:
 
169
         fpa11->fpreg[Fd].fSingle = float32_tan(rFm);
 
170
      break;
 
171
 
 
172
      case ASN_CODE:
 
173
         fpa11->fpreg[Fd].fSingle = float32_arcsin(rFm);
 
174
      break;
 
175
 
 
176
      case ACS_CODE:
 
177
         fpa11->fpreg[Fd].fSingle = float32_arccos(rFm);
 
178
      break;
 
179
 
 
180
      case ATN_CODE:
 
181
         fpa11->fpreg[Fd].fSingle = float32_arctan(rFm);
 
182
      break;
 
183
#endif
 
184
 
 
185
      case NRM_CODE:
 
186
      break;
 
187
 
 
188
      default:
 
189
      {
 
190
        nRc = 0;
 
191
      }
 
192
   }
 
193
 
 
194
   if (0 != nRc) fpa11->fType[Fd] = typeSingle;
 
195
   return nRc;
 
196
}
 
197
 
 
198
#if 0
 
199
float32 float32_exp(float32 Fm)
 
200
{
 
201
//series
 
202
}
 
203
 
 
204
float32 float32_ln(float32 Fm)
 
205
{
 
206
//series
 
207
}
 
208
 
 
209
float32 float32_sin(float32 rFm)
 
210
{
 
211
//series
 
212
}
 
213
 
 
214
float32 float32_cos(float32 rFm)
 
215
{
 
216
//series
 
217
}
 
218
 
 
219
float32 float32_arcsin(float32 rFm)
 
220
{
 
221
//series
 
222
}
 
223
 
 
224
float32 float32_arctan(float32 rFm)
 
225
{
 
226
  //series
 
227
}
 
228
 
 
229
float32 float32_arccos(float32 rFm)
 
230
{
 
231
   //return float32_sub(halfPi,float32_arcsin(rFm));
 
232
}
 
233
 
 
234
float32 float32_log(float32 rFm)
 
235
{
 
236
  return float32_div(float32_ln(rFm),getSingleConstant(7));
 
237
}
 
238
 
 
239
float32 float32_tan(float32 rFm)
 
240
{
 
241
  return float32_div(float32_sin(rFm),float32_cos(rFm));
 
242
}
 
243
 
 
244
float32 float32_pow(float32 rFn,float32 rFm)
 
245
{
 
246
  return float32_exp(float32_mul(rFm,float32_ln(rFn)));
 
247
}
 
248
 
 
249
float32 float32_pol(float32 rFn,float32 rFm)
 
250
{
 
251
  return float32_arctan(float32_div(rFn,rFm));
 
252
}
 
253
#endif