1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** emfloat.c
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Source for emulated floating-point routines.
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** BYTEmark (tm)
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** BYTE's Native Mode Benchmarks
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Rick Grehan, BYTE Magazine.
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Created:
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Last update: 3/95
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** DISCLAIMER
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** The source, executable, and documentation files that comprise
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** the BYTEmark benchmarks are made available on an "as is" basis.
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** This means that we at BYTE Magazine have made every reasonable
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** effort to verify that the there are no errors in the source and
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** executable code.  We cannot, however, guarantee that the programs
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** are error-free.  Consequently, McGraw-HIll and BYTE Magazine make
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** no claims in regard to the fitness of the source code, executable
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** code, and documentation of the BYTEmark.
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**  Furthermore, BYTE Magazine, McGraw-Hill, and all employees
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** of McGraw-Hill cannot be held responsible for any damages resulting
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** from the use of this code or the results obtained from using
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** this code.
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "../pub/libvex_basictypes.h"
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HWord (*serviceFn)(HWord,HWord) = 0;
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/////////////////////////////////////////////////////////////////////
32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/////////////////////////////////////////////////////////////////////
33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic char* my_strcpy ( char* dest, const char* src )
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   char* dest_orig = dest;
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   while (*src) *dest++ = *src++;
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *dest = 0;
39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return dest_orig;
40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void* my_memcpy ( void *dest, const void *src, int sz )
43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   const char *s = (const char *)src;
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   char *d = (char *)dest;
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   while (sz--)
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      *d++ = *s++;
49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return dest;
51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void* my_memmove( void *dst, const void *src, unsigned int len )
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    register char *d;
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    register char *s;
57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    if ( dst > src ) {
58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        d = (char *)dst + len - 1;
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        s = (char *)src + len - 1;
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        while ( len >= 4 ) {
61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            *d-- = *s--;
62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            *d-- = *s--;
63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            *d-- = *s--;
64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            *d-- = *s--;
65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            len -= 4;
66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        while ( len-- ) {
68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            *d-- = *s--;
69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    } else if ( dst < src ) {
71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        d = (char *)dst;
72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        s = (char *)src;
73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        while ( len >= 4 ) {
74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            *d++ = *s++;
75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            *d++ = *s++;
76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            *d++ = *s++;
77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            *d++ = *s++;
78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            len -= 4;
79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        while ( len-- ) {
81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            *d++ = *s++;
82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    return dst;
85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/////////////////////////////////////////////////////////////////////
88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void vexxx_log_bytes ( char* p, int n )
90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int i;
92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   for (i = 0; i < n; i++)
93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      (*serviceFn)( 1, (int)p[i] );
94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---------------------------------------------------------*/
97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- vexxx_printf                                        ---*/
98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---------------------------------------------------------*/
99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* This should be the only <...> include in the entire VEXXX library.
101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   New code for vexxx_util.c should go above this point. */
102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdarg.h>
103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar vexxx_toupper ( HChar c )
105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (c >= 'a' && c <= 'z')
107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return toHChar(c + ('A' - 'a'));
108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   else
109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return c;
110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic Int vexxx_strlen ( const HChar* str )
113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int i = 0;
115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   while (str[i] != 0) i++;
116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return i;
117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovBool vexxx_streq ( const HChar* s1, const HChar* s2 )
120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   while (True) {
122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (*s1 == 0 && *s2 == 0)
123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return True;
124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (*s1 != *s2)
125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return False;
126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s1++;
127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s2++;
128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Some flags.  */
132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VG_MSG_SIGNED    1 /* The value is signed. */
133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VG_MSG_ZJUSTIFY  2 /* Must justify with '0'. */
134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VG_MSG_LJUSTIFY  4 /* Must justify on the left. */
135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VG_MSG_PAREN     8 /* Parenthesize if present (for %y) */
136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VG_MSG_COMMA    16 /* Add commas to numbers (for %d, %u) */
137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Copy a string into the buffer. */
139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic UInt
140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmyvprintf_str ( void(*send)(HChar), Int flags, Int width, HChar* str,
141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                Bool capitalise )
142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  define MAYBE_TOUPPER(ch) toHChar(capitalise ? vexxx_toupper(ch) : (ch))
144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt ret = 0;
145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int i, extra;
146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int len = vexxx_strlen(str);
147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (width == 0) {
149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ret += len;
150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      for (i = 0; i < len; i++)
151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         send(MAYBE_TOUPPER(str[i]));
152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return ret;
153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (len > width) {
156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ret += width;
157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      for (i = 0; i < width; i++)
158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         send(MAYBE_TOUPPER(str[i]));
159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return ret;
160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   extra = width - len;
163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (flags & VG_MSG_LJUSTIFY) {
164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ret += extra;
165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      for (i = 0; i < extra; i++)
166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         send(' ');
167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ret += len;
169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   for (i = 0; i < len; i++)
170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      send(MAYBE_TOUPPER(str[i]));
171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (!(flags & VG_MSG_LJUSTIFY)) {
172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ret += extra;
173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      for (i = 0; i < extra; i++)
174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         send(' ');
175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  undef MAYBE_TOUPPER
178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return ret;
180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write P into the buffer according to these args:
183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *  If SIGN is true, p is a signed.
184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *  BASE is the base.
185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *  If WITH_ZERO is true, '0' must be added.
186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov *  WIDTH is the width of the field.
187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov */
188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic UInt
189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmyvprintf_int64 ( void(*send)(HChar), Int flags, Int base, Int width, ULong pL)
190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar buf[40];
192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int   ind = 0;
193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int   i, nc = 0;
194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Bool  neg = False;
195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *digits = "0123456789ABCDEF";
196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt  ret = 0;
197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt  p = (UInt)pL;
198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (base < 2 || base > 16)
200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return ret;
201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((flags & VG_MSG_SIGNED) && (Int)p < 0) {
203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      p   = - (Int)p;
204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      neg = True;
205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (p == 0)
208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      buf[ind++] = '0';
209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   else {
210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      while (p > 0) {
211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if ((flags & VG_MSG_COMMA) && 10 == base &&
212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             0 == (ind-nc) % 3 && 0 != ind)
213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         {
214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            buf[ind++] = ',';
215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            nc++;
216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         buf[ind++] = digits[p % base];
218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         p /= base;
219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (neg)
223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      buf[ind++] = '-';
224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (width > 0 && !(flags & VG_MSG_LJUSTIFY)) {
226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      for(; ind < width; ind++) {
227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	//vassert(ind < 39);
228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         buf[ind] = toHChar((flags & VG_MSG_ZJUSTIFY) ? '0': ' ');
229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Reverse copy to buffer.  */
233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ret += ind;
234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   for (i = ind -1; i >= 0; i--) {
235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      send(buf[i]);
236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (width > 0 && (flags & VG_MSG_LJUSTIFY)) {
238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      for(; ind < width; ind++) {
239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	 ret++;
240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         send(' ');  // Never pad with zeroes on RHS -- changes the value!
241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return ret;
244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* A simple vprintf().  */
248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovUInt vprintf_wrk ( void(*send)(HChar), const HChar *format, va_list vargs )
250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt ret = 0;
252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int i;
253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int flags;
254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int width;
255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Bool is_long;
256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* We assume that vargs has already been initialised by the
258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      caller, using va_start, and that the caller will similarly
259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      clean up with va_end.
260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   */
261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   for (i = 0; format[i] != 0; i++) {
263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (format[i] != '%') {
264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         send(format[i]);
265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	 ret++;
266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         continue;
267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      i++;
269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* A '%' has been found.  Ignore a trailing %. */
270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (format[i] == 0)
271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (format[i] == '%') {
273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* `%%' is replaced by `%'. */
274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         send('%');
275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	 ret++;
276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         continue;
277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      flags = 0;
279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      is_long = False;
280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      width = 0; /* length of the field. */
281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (format[i] == '(') {
282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	 flags |= VG_MSG_PAREN;
283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	 i++;
284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* If ',' follows '%', commas will be inserted. */
286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (format[i] == ',') {
287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         flags |= VG_MSG_COMMA;
288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         i++;
289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* If '-' follows '%', justify on the left. */
291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (format[i] == '-') {
292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         flags |= VG_MSG_LJUSTIFY;
293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         i++;
294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* If '0' follows '%', pads will be inserted. */
296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (format[i] == '0') {
297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         flags |= VG_MSG_ZJUSTIFY;
298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         i++;
299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* Compute the field length. */
301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      while (format[i] >= '0' && format[i] <= '9') {
302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         width *= 10;
303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         width += format[i++] - '0';
304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      while (format[i] == 'l') {
306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         i++;
307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         is_long = True;
308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      switch (format[i]) {
311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         case 'd': /* %d */
312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            flags |= VG_MSG_SIGNED;
313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            if (is_long)
314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               ret += myvprintf_int64(send, flags, 10, width,
315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov				      (ULong)(va_arg (vargs, Long)));
316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            else
317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               ret += myvprintf_int64(send, flags, 10, width,
318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov				      (ULong)(va_arg (vargs, Int)));
319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            break;
320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         case 'u': /* %u */
321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            if (is_long)
322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               ret += myvprintf_int64(send, flags, 10, width,
323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov				      (ULong)(va_arg (vargs, ULong)));
324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            else
325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               ret += myvprintf_int64(send, flags, 10, width,
326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov				      (ULong)(va_arg (vargs, UInt)));
327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            break;
328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         case 'p': /* %p */
329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	    ret += 2;
330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            send('0');
331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            send('x');
332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ret += myvprintf_int64(send, flags, 16, width,
333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov				   (ULong)((HWord)va_arg (vargs, void *)));
334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            break;
335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         case 'x': /* %x */
336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            if (is_long)
337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               ret += myvprintf_int64(send, flags, 16, width,
338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov				      (ULong)(va_arg (vargs, ULong)));
339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            else
340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               ret += myvprintf_int64(send, flags, 16, width,
341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov				      (ULong)(va_arg (vargs, UInt)));
342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            break;
343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         case 'c': /* %c */
344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	    ret++;
345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            send(toHChar(va_arg (vargs, int)));
346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            break;
347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         case 's': case 'S': { /* %s */
348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            char *str = va_arg (vargs, char *);
349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            if (str == (char*) 0) str = "(null)";
350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ret += myvprintf_str(send, flags, width, str,
351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 toBool(format[i]=='S'));
352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            break;
353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	 }
354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#        if 0
355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	 case 'y': { /* %y - print symbol */
356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	    Char buf[100];
357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	    Char *cp = buf;
358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	    Addr a = va_arg(vargs, Addr);
359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	    if (flags & VG_MSG_PAREN)
361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	       *cp++ = '(';
362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	    if (VG_(get_fnname_w_offset)(a, cp, sizeof(buf)-4)) {
363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	       if (flags & VG_MSG_PAREN) {
364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		  cp += VG_(strlen)(cp);
365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		  *cp++ = ')';
366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		  *cp = '\0';
367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	       }
368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	       ret += myvprintf_str(send, flags, width, buf, 0);
369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	    }
370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	    break;
371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	 }
372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#        endif
373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         default:
374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            break;
375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return ret;
378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* A general replacement for printf().  Note that only low-level
382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   debugging info should be sent via here.  The official route is to
383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   to use vg_message().  This interface is deprecated.
384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar myprintf_buf[1000];
386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic Int   n_myprintf_buf;
387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void add_to_myprintf_buf ( HChar c )
389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (c == '\n' || n_myprintf_buf >= 1000-10 /*paranoia*/ ) {
391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      (*vexxx_log_bytes)( myprintf_buf, vexxx_strlen(myprintf_buf) );
392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n_myprintf_buf = 0;
393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      myprintf_buf[n_myprintf_buf] = 0;
394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   myprintf_buf[n_myprintf_buf++] = c;
396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   myprintf_buf[n_myprintf_buf] = 0;
397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic UInt vexxx_printf ( const char *format, ... )
400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt ret;
402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   va_list vargs;
403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   va_start(vargs,format);
404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n_myprintf_buf = 0;
406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   myprintf_buf[n_myprintf_buf] = 0;
407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ret = vprintf_wrk ( add_to_myprintf_buf, format, vargs );
408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (n_myprintf_buf > 0) {
410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      (*vexxx_log_bytes)( myprintf_buf, n_myprintf_buf );
411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   va_end(vargs);
414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return ret;
416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---------------------------------------------------------------*/
419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- end                                          vexxx_util.c ---*/
420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---------------------------------------------------------------*/
421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/////////////////////////////////////////////////////////////////////
424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/////////////////////////////////////////////////////////////////////
425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov//#include <stdio.h>
427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov//#include <string.h>
428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov//#include <malloc.h>
429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef unsigned char uchar;
431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef unsigned int uint;
432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef unsigned short ushort;
433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef unsigned long ulong;
434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef int int32;              /* Signed 32 bit integer */
435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define INTERNAL_FPF_PRECISION 4
437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define CPUEMFLOATLOOPMAX 500000L
438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define EMFARRAYSIZE 3000L
439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef struct {
441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        int adjust;             /* Set adjust code */
442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ulong request_secs;     /* # of seconds requested */
443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ulong arraysize;        /* Size of array */
444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ulong loops;            /* Loops per iterations */
445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        double emflops;         /* Results */
446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} EmFloatStruct;
447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Is this a 64 bit architecture? If so, this will define LONG64 */
451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Uwe F. Mayer 15 November 1997                                 */
452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// #include "pointer.h"
453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define u8 unsigned char
455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define u16 unsigned short
456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifdef LONG64
457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define u32 unsigned int
458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define u32 unsigned long
460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define uchar unsigned char
462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ulong unsigned long
463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define MAX_EXP 32767L
465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define MIN_EXP (-32767L)
466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define IFPF_IS_ZERO 0
468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define IFPF_IS_SUBNORMAL 1
469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define IFPF_IS_NORMAL 2
470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define IFPF_IS_INFINITY 3
471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define IFPF_IS_NAN 4
472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define IFPF_TYPE_COUNT 5
473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ZERO_ZERO                       0
475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ZERO_SUBNORMAL                  1
476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ZERO_NORMAL                     2
477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ZERO_INFINITY                   3
478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define ZERO_NAN                        4
479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define SUBNORMAL_ZERO                  5
481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define SUBNORMAL_SUBNORMAL             6
482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define SUBNORMAL_NORMAL                7
483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define SUBNORMAL_INFINITY              8
484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define SUBNORMAL_NAN                   9
485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define NORMAL_ZERO                     10
487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define NORMAL_SUBNORMAL                11
488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define NORMAL_NORMAL                   12
489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define NORMAL_INFINITY                 13
490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define NORMAL_NAN                      14
491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define INFINITY_ZERO                   15
493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define INFINITY_SUBNORMAL              16
494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define INFINITY_NORMAL                 17
495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define INFINITY_INFINITY               18
496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define INFINITY_NAN                    19
497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define NAN_ZERO                        20
499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define NAN_SUBNORMAL                   21
500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define NAN_NORMAL                      22
501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define NAN_INFINITY                    23
502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define NAN_NAN                         24
503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define OPERAND_ZERO                    0
504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define OPERAND_SUBNORMAL               1
505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define OPERAND_NORMAL                  2
506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define OPERAND_INFINITY                3
507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define OPERAND_NAN                     4
508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef struct
510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        u8 type;        /* Indicates, NORMAL, SUBNORMAL, etc. */
512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        u8 sign;        /* Mantissa sign */
513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        short exp;      /* Signed exponent...no bias */
514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        u16 mantissa[INTERNAL_FPF_PRECISION];
515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} InternalFPF;
516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid SetupCPUEmFloatArrays(InternalFPF *abase,
519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        InternalFPF *bbase, InternalFPF *cbase, ulong arraysize);
520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovulong DoEmFloatIteration(InternalFPF *abase,
522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        InternalFPF *bbase, InternalFPF *cbase,
523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ulong arraysize, ulong loops);
524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void SetInternalFPFZero(InternalFPF *dest,
526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        uchar sign);
527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void SetInternalFPFInfinity(InternalFPF *dest,
528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        uchar sign);
529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void SetInternalFPFNaN(InternalFPF *dest);
530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int IsMantissaZero(u16 *mant);
531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void Add16Bits(u16 *carry,u16 *a,u16 b,u16 c);
532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void Sub16Bits(u16 *borrow,u16 *a,u16 b,u16 c);
533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void ShiftMantLeft1(u16 *carry,u16 *mantissa);
534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void ShiftMantRight1(u16 *carry,u16 *mantissa);
535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void StickyShiftRightMant(InternalFPF *ptr,int amount);
536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void normalize(InternalFPF *ptr);
537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void denormalize(InternalFPF *ptr,int minimum_exponent);
538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void RoundInternalFPF(InternalFPF *ptr);
539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void choose_nan(InternalFPF *x,InternalFPF *y,InternalFPF *z,
540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                int intel_flag);
541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void AddSubInternalFPF(uchar operation,InternalFPF *x,
542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                InternalFPF *y,InternalFPF *z);
543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void MultiplyInternalFPF(InternalFPF *x,InternalFPF *y,
544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        InternalFPF *z);
545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void DivideInternalFPF(InternalFPF *x,InternalFPF *y,
546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        InternalFPF *z);
547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void Int32ToInternalFPF(int32 mylong,
549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                InternalFPF *dest);
550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int InternalFPFToString(char *dest,
551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                InternalFPF *src);
552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int32 randnum(int32 lngval);
554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int32 randwc(int32 num)
556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	return(randnum((int32)0)%num);
558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int32 randw[2] = { (int32)13 , (int32)117 };
561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int32 randnum(int32 lngval)
562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	register int32 interm;
564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	if (lngval!=(int32)0)
566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	{	randw[0]=(int32)13; randw[1]=(int32)117; }
567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	interm=(randw[0]*(int32)254754+randw[1]*(int32)529562)%(int32)999563;
569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	randw[1]=randw[0];
570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	randw[0]=interm;
571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	return(interm);
572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid SetupCPUEmFloatArrays(InternalFPF *abase,
577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                InternalFPF *bbase,
578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                InternalFPF *cbase,
579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ulong arraysize)
580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovulong i;
582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovInternalFPF locFPF1,locFPF2;
583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovrandnum((int32)13);
585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfor(i=0;i<arraysize;i++)
587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{/*       LongToInternalFPF(randwc(50000L),&locFPF1); */
588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Int32ToInternalFPF(randwc((int32)50000),&locFPF1);
589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /*       LongToInternalFPF(randwc(50000L)+1L,&locFPF2); */
590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Int32ToInternalFPF(randwc((int32)50000)+(int32)1,&locFPF2);
591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        DivideInternalFPF(&locFPF1,&locFPF2,abase+i);
592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /*       LongToInternalFPF(randwc(50000L)+1L,&locFPF2); */
593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Int32ToInternalFPF(randwc((int32)50000)+(int32)1,&locFPF2);
594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        DivideInternalFPF(&locFPF1,&locFPF2,bbase+i);
595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn;
597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic char* str1 = "loops %d\n";
601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovulong DoEmFloatIteration(InternalFPF *abase,
603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                InternalFPF *bbase,
604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                InternalFPF *cbase,
605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ulong arraysize, ulong loops)
606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic uchar jtable[16] = {0,0,0,0,1,1,1,1,2,2,2,2,2,3,3,3};
608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovulong i;
609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint number_of_loops;
610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov loops = 100;
611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovnumber_of_loops=loops-1; /* the index of the first loop we run */
612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvexxx_printf(str1, (int)loops);
614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Each pass through the array performs operations in
617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** the followingratios:
618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**   4 adds, 4 subtracts, 5 multiplies, 3 divides
619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** (adds and subtracts being nearly the same operation)
620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        for(i=0;i<arraysize;i++)
624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                switch(jtable[i % 16])
625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                {
626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        case 0: /* Add */
627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                AddSubInternalFPF(0,abase+i,
628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  bbase+i,
629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  cbase+i);
630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                break;
631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        case 1: /* Subtract */
632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                AddSubInternalFPF(1,abase+i,
633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  bbase+i,
634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  cbase+i);
635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                break;
636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        case 2: /* Multiply */
637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                MultiplyInternalFPF(abase+i,
638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  bbase+i,
639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  cbase+i);
640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                break;
641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        case 3: /* Divide */
642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                DivideInternalFPF(abase+i,
643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  bbase+i,
644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  cbase+i);
645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                break;
646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                }
647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  ulong j[8];   /* we test 8 entries */
649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  int k;
650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  ulong i;
651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  char buffer[1024];
652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (100==loops) /* the first loop */
653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      j[0]=(ulong)2;
655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      j[1]=(ulong)6;
656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      j[2]=(ulong)10;
657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      j[3]=(ulong)14;
658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      j[4]=(ulong)(arraysize-14);
659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      j[5]=(ulong)(arraysize-10);
660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      j[6]=(ulong)(arraysize-6);
661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      j[7]=(ulong)(arraysize-2);
662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      for(k=0;k<8;k++){
663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	i=j[k];
664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	InternalFPFToString(buffer,abase+i);
665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	vexxx_printf("%6d: (%s) ",i,buffer);
666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	switch(jtable[i % 16])
667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	  {
668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	  case 0: my_strcpy(buffer,"+"); break;
669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	  case 1: my_strcpy(buffer,"-"); break;
670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	  case 2: my_strcpy(buffer,"*"); break;
671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	  case 3: my_strcpy(buffer,"/"); break;
672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	  }
673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	vexxx_printf("%s ",buffer);
674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	InternalFPFToString(buffer,bbase+i);
675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	vexxx_printf("(%s) = ",buffer);
676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	InternalFPFToString(buffer,cbase+i);
677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	vexxx_printf("%s\n",buffer);
678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn 0;
680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn 0;
684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/***********************
687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** SetInternalFPFZero **
688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov************************
689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Set an internal floating-point-format number to zero.
690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** sign determines the sign of the zero.
691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void SetInternalFPFZero(InternalFPF *dest,
693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        uchar sign)
694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint i;          /* Index */
696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovdest->type=IFPF_IS_ZERO;
698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovdest->sign=sign;
699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovdest->exp=MIN_EXP;
700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfor(i=0;i<INTERNAL_FPF_PRECISION;i++)
701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        dest->mantissa[i]=0;
702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn;
703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/***************************
706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** SetInternalFPFInfinity **
707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov****************************
708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Set an internal floating-point-format number to infinity.
709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** This can happen if the exponent exceeds MAX_EXP.
710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** As above, sign picks the sign of infinity.
711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void SetInternalFPFInfinity(InternalFPF *dest,
713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        uchar sign)
714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint i;          /* Index */
716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovdest->type=IFPF_IS_INFINITY;
718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovdest->sign=sign;
719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovdest->exp=MIN_EXP;
720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfor(i=0;i<INTERNAL_FPF_PRECISION;i++)
721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        dest->mantissa[i]=0;
722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn;
723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/**********************
726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** SetInternalFPFNaN **
727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov***********************
728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Set an internal floating-point-format number to Nan
729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** (not a number).  Note that we "emulate" an 80x87 as far
730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** as the mantissa bits go.
731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void SetInternalFPFNaN(InternalFPF *dest)
733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint i;          /* Index */
735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovdest->type=IFPF_IS_NAN;
737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovdest->exp=MAX_EXP;
738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovdest->sign=1;
739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovdest->mantissa[0]=0x4000;
740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfor(i=1;i<INTERNAL_FPF_PRECISION;i++)
741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        dest->mantissa[i]=0;
742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn;
744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*******************
747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** IsMantissaZero **
748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov********************
749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Pass this routine a pointer to an internal floating point format
750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** number's mantissa.  It checks for an all-zero mantissa.
751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Returns 0 if it is NOT all zeros, !=0 otherwise.
752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int IsMantissaZero(u16 *mant)
754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint i;          /* Index */
756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint n;          /* Return value */
757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovn=0;
759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfor(i=0;i<INTERNAL_FPF_PRECISION;i++)
760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        n|=mant[i];
761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn(!n);
763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/**************
766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Add16Bits **
767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov***************
768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Add b, c, and carry.  Retult in a.  New carry in carry.
769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void Add16Bits(u16 *carry,
771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                u16 *a,
772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                u16 b,
773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                u16 c)
774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovu32 accum;              /* Accumulator */
776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Do the work in the 32-bit accumulator so we can return
779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** the carry.
780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovaccum=(u32)b;
782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovaccum+=(u32)c;
783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovaccum+=(u32)*carry;
784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*carry=(u16)((accum & 0x00010000) ? 1 : 0);     /* New carry */
785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*a=(u16)(accum & 0xFFFF);       /* Result is lo 16 bits */
786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn;
787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/**************
790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Sub16Bits **
791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov***************
792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Additive inverse of above.
793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void Sub16Bits(u16 *borrow,
795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                u16 *a,
796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                u16 b,
797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                u16 c)
798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovu32 accum;              /* Accumulator */
800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovaccum=(u32)b;
802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovaccum-=(u32)c;
803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovaccum-=(u32)*borrow;
804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*borrow=(u32)((accum & 0x00010000) ? 1 : 0);    /* New borrow */
805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*a=(u16)(accum & 0xFFFF);
806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn;
807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*******************
810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** ShiftMantLeft1 **
811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov********************
812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Shift a vector of 16-bit numbers left 1 bit.  Also provides
813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** a carry bit, which is shifted in at the beginning, and
814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** shifted out at the end.
815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void ShiftMantLeft1(u16 *carry,
817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        u16 *mantissa)
818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint i;          /* Index */
820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint new_carry;
821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovu16 accum;      /* Temporary holding placed */
822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfor(i=INTERNAL_FPF_PRECISION-1;i>=0;i--)
824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{       accum=mantissa[i];
825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        new_carry=accum & 0x8000;       /* Get new carry */
826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        accum=accum<<1;                 /* Do the shift */
827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if(*carry)
828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                accum|=1;               /* Insert previous carry */
829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        *carry=new_carry;
830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        mantissa[i]=accum;              /* Return shifted value */
831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn;
833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/********************
836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** ShiftMantRight1 **
837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*********************
838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Shift a mantissa right by 1 bit.  Provides carry, as
839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** above
840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void ShiftMantRight1(u16 *carry,
842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        u16 *mantissa)
843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint i;          /* Index */
845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint new_carry;
846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovu16 accum;
847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfor(i=0;i<INTERNAL_FPF_PRECISION;i++)
849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{       accum=mantissa[i];
850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        new_carry=accum & 1;            /* Get new carry */
851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        accum=accum>>1;
852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if(*carry)
853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                accum|=0x8000;
854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        *carry=new_carry;
855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        mantissa[i]=accum;
856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn;
858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*****************************
862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** StickyShiftMantRight **
863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov******************************
864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** This is a shift right of the mantissa with a "sticky bit".
865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** I.E., if a carry of 1 is shifted out of the least significant
866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** bit, the least significant bit is set to 1.
867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void StickyShiftRightMant(InternalFPF *ptr,
869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        int amount)
870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint i;          /* Index */
872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovu16 carry;      /* Self-explanatory */
873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovu16 *mantissa;
874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmantissa=ptr->mantissa;
876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovif(ptr->type!=IFPF_IS_ZERO)     /* Don't bother shifting a zero */
878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        /*
880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** If the amount of shifting will shift everyting
881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** out of existence, then just clear the whole mantissa
882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** and set the lowmost bit to 1.
883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        */
884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if(amount>=INTERNAL_FPF_PRECISION * 16)
885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {
886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                for(i=0;i<INTERNAL_FPF_PRECISION-1;i++)
887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        mantissa[i]=0;
888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mantissa[INTERNAL_FPF_PRECISION-1]=1;
889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        else
891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                for(i=0;i<amount;i++)
892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                {
893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        carry=0;
894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        ShiftMantRight1(&carry,mantissa);
895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        if(carry)
896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                mantissa[INTERNAL_FPF_PRECISION-1] |= 1;
897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                }
898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn;
900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/**************************************************
904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**         POST ARITHMETIC PROCESSING            **
905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**  (NORMALIZE, ROUND, OVERFLOW, AND UNDERFLOW)  **
906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**************************************************/
907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/**************
909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** normalize **
910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov***************
911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Normalize an internal-representation number.  Normalization
912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** discards empty most-significant bits.
913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void normalize(InternalFPF *ptr)
915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovu16     carry;
917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** As long as there's a highmost 0 bit, shift the significand
920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** left 1 bit.  Each time you do this, though, you've
921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** gotta decrement the exponent.
922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovwhile ((ptr->mantissa[0] & 0x8000) == 0)
924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        carry = 0;
926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ShiftMantLeft1(&carry, ptr->mantissa);
927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ptr->exp--;
928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn;
930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/****************
933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** denormalize **
934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*****************
935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Denormalize an internal-representation number.  This means
936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** shifting it right until its exponent is equivalent to
937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** minimum_exponent. (You have to do this often in order
938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** to perform additions and subtractions).
939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void denormalize(InternalFPF *ptr,
941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                int minimum_exponent)
942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovlong exponent_difference;
944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovif (IsMantissaZero(ptr->mantissa))
946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        vexxx_printf("Error:  zero significand in denormalize\n");
948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovexponent_difference = ptr->exp-minimum_exponent;
951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovif (exponent_difference < 0)
952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        /*
954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** The number is subnormal
955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        */
956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        exponent_difference = -exponent_difference;
957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if (exponent_difference >= (INTERNAL_FPF_PRECISION * 16))
958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {
959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                /* Underflow */
960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                SetInternalFPFZero(ptr, ptr->sign);
961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        else
963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {
964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ptr->exp+=exponent_difference;
965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                StickyShiftRightMant(ptr, exponent_difference);
966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn;
969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*********************
973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** RoundInternalFPF **
974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**********************
975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Round an internal-representation number.
976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** The kind of rounding we do here is simplest...referred to as
977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** "chop".  "Extraneous" rightmost bits are simply hacked off.
978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid RoundInternalFPF(InternalFPF *ptr)
980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* int i; */
982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovif (ptr->type == IFPF_IS_NORMAL ||
984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ptr->type == IFPF_IS_SUBNORMAL)
985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        denormalize(ptr, MIN_EXP);
987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if (ptr->type != IFPF_IS_ZERO)
988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {
989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                /* clear the extraneous bits */
991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ptr->mantissa[3] &= 0xfff8;
992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*              for (i=4; i<INTERNAL_FPF_PRECISION; i++)
993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                {
994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        ptr->mantissa[i] = 0;
995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                }
996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                /*
998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ** Check for overflow
999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                */
1000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*              Does not do anything as ptr->exp is a short and MAX_EXP=37268
1001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		if (ptr->exp > MAX_EXP)
1002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                {
1003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        SetInternalFPFInfinity(ptr, ptr->sign);
1004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                }
1005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
1007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn;
1009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*******************************************************
1012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**  ARITHMETIC OPERATIONS ON INTERNAL REPRESENTATION  **
1013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*******************************************************/
1014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/***************
1016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** choose_nan **
1017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov****************
1018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Called by routines that are forced to perform math on
1019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** a pair of NaN's.  This routine "selects" which NaN is
1020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** to be returned.
1021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void choose_nan(InternalFPF *x,
1023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                InternalFPF *y,
1024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                InternalFPF *z,
1025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                int intel_flag)
1026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint i;
1028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Compare the two mantissas,
1031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** return the larger.  Note that we will be emulating
1032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** an 80387 in this operation.
1033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfor (i=0; i<INTERNAL_FPF_PRECISION; i++)
1035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if (x->mantissa[i] > y->mantissa[i])
1037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {
1038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                my_memmove((void *)x,(void *)z,sizeof(InternalFPF));
1039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                return;
1040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
1041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if (x->mantissa[i] < y->mantissa[i])
1042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {
1043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                my_memmove((void *)y,(void *)z,sizeof(InternalFPF));
1044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                return;
1045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
1046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** They are equal
1050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovif (!intel_flag)
1052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        /* if the operation is addition */
1053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        my_memmove((void *)x,(void *)z,sizeof(InternalFPF));
1054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovelse
1055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        /* if the operation is multiplication */
1056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        my_memmove((void *)y,(void *)z,sizeof(InternalFPF));
1057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn;
1058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/**********************
1062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** AddSubInternalFPF **
1063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov***********************
1064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Adding or subtracting internal-representation numbers.
1065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Internal-representation numbers pointed to by x and y are
1066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** added/subtracted and the result returned in z.
1067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void AddSubInternalFPF(uchar operation,
1069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                InternalFPF *x,
1070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                InternalFPF *y,
1071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                InternalFPF *z)
1072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint exponent_difference;
1074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovu16 borrow;
1075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovu16 carry;
1076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint i;
1077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovInternalFPF locx,locy;  /* Needed since we alter them */
1078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Following big switch statement handles the
1081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** various combinations of operand types.
1082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovswitch ((x->type * IFPF_TYPE_COUNT) + y->type)
1084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase ZERO_ZERO:
1086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        my_memmove((void *)x,(void *)z,sizeof(InternalFPF));
1087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if (x->sign ^ y->sign ^ operation)
1088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {
1089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                z->sign = 0; /* positive */
1090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
1091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NAN_ZERO:
1094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NAN_SUBNORMAL:
1095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NAN_NORMAL:
1096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NAN_INFINITY:
1097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase SUBNORMAL_ZERO:
1098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NORMAL_ZERO:
1099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase INFINITY_ZERO:
1100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase INFINITY_SUBNORMAL:
1101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase INFINITY_NORMAL:
1102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        my_memmove((void *)x,(void *)z,sizeof(InternalFPF));
1103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase ZERO_NAN:
1107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase SUBNORMAL_NAN:
1108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NORMAL_NAN:
1109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase INFINITY_NAN:
1110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        my_memmove((void *)y,(void *)z,sizeof(InternalFPF));
1111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase ZERO_SUBNORMAL:
1114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase ZERO_NORMAL:
1115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase ZERO_INFINITY:
1116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase SUBNORMAL_INFINITY:
1117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NORMAL_INFINITY:
1118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        my_memmove((void *)y,(void *)z,sizeof(InternalFPF));
1119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        z->sign ^= operation;
1120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase SUBNORMAL_SUBNORMAL:
1123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase SUBNORMAL_NORMAL:
1124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NORMAL_SUBNORMAL:
1125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NORMAL_NORMAL:
1126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        /*
1127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** Copy x and y to locals, since we may have
1128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** to alter them.
1129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        */
1130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        my_memmove((void *)&locx,(void *)x,sizeof(InternalFPF));
1131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        my_memmove((void *)&locy,(void *)y,sizeof(InternalFPF));
1132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        /* compute sum/difference */
1134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        exponent_difference = locx.exp-locy.exp;
1135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if (exponent_difference == 0)
1136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {
1137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                /*
1138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ** locx.exp == locy.exp
1139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ** so, no shifting required
1140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                */
1141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                if (locx.type == IFPF_IS_SUBNORMAL ||
1142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  locy.type == IFPF_IS_SUBNORMAL)
1143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        z->type = IFPF_IS_SUBNORMAL;
1144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                else
1145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        z->type = IFPF_IS_NORMAL;
1146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                /*
1148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ** Assume that locx.mantissa > locy.mantissa
1149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                */
1150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                z->sign = locx.sign;
1151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                z->exp= locx.exp;
1152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
1153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        else
1154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                if (exponent_difference > 0)
1155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                {
1156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        /*
1157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        ** locx.exp > locy.exp
1158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        */
1159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        StickyShiftRightMant(&locy,
1160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 exponent_difference);
1161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        z->type = locx.type;
1162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        z->sign = locx.sign;
1163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        z->exp = locx.exp;
1164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                }
1165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                else    /* if (exponent_difference < 0) */
1166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                {
1167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        /*
1168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        ** locx.exp < locy.exp
1169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        */
1170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        StickyShiftRightMant(&locx,
1171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                -exponent_difference);
1172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        z->type = locy.type;
1173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        z->sign = locy.sign ^ operation;
1174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        z->exp = locy.exp;
1175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                }
1176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                if (locx.sign ^ locy.sign ^ operation)
1178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                {
1179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        /*
1180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        ** Signs are different, subtract mantissas
1181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        */
1182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        borrow = 0;
1183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        for (i=(INTERNAL_FPF_PRECISION-1); i>=0; i--)
1184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                Sub16Bits(&borrow,
1185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                        &z->mantissa[i],
1186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                        locx.mantissa[i],
1187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                        locy.mantissa[i]);
1188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        if (borrow)
1190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        {
1191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                /* The y->mantissa was larger than the
1192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                ** x->mantissa leaving a negative
1193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                ** result.  Change the result back to
1194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                ** an unsigned number and flip the
1195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                ** sign flag.
1196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                */
1197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                z->sign = locy.sign ^ operation;
1198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                borrow = 0;
1199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                for (i=(INTERNAL_FPF_PRECISION-1); i>=0; i--)
1200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                {
1201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                        Sub16Bits(&borrow,
1202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                &z->mantissa[i],
1203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                0,
1204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                z->mantissa[i]);
1205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                }
1206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        }
1207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        else
1208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        {
1209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                /* The assumption made above
1210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                ** (i.e. x->mantissa >= y->mantissa)
1211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                ** was correct.  Therefore, do nothing.
1212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                ** z->sign = x->sign;
1213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                */
1214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        }
1215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        if (IsMantissaZero(z->mantissa))
1217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        {
1218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                z->type = IFPF_IS_ZERO;
1219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                z->sign = 0; /* positive */
1220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        }
1221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        else
1222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                if (locx.type == IFPF_IS_NORMAL ||
1223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                         locy.type == IFPF_IS_NORMAL)
1224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                {
1225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                        normalize(z);
1226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                }
1227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                }
1228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                else
1229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                {
1230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        /* signs are the same, add mantissas */
1231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        carry = 0;
1232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        for (i=(INTERNAL_FPF_PRECISION-1); i>=0; i--)
1233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        {
1234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                Add16Bits(&carry,
1235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                        &z->mantissa[i],
1236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                        locx.mantissa[i],
1237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                        locy.mantissa[i]);
1238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        }
1239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        if (carry)
1241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        {
1242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                z->exp++;
1243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                carry=0;
1244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                ShiftMantRight1(&carry,z->mantissa);
1245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                z->mantissa[0] |= 0x8000;
1246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                z->type = IFPF_IS_NORMAL;
1247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        }
1248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        else
1249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                if (z->mantissa[0] & 0x8000)
1250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                        z->type = IFPF_IS_NORMAL;
1251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
1252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase INFINITY_INFINITY:
1255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        SetInternalFPFNaN(z);
1256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NAN_NAN:
1259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        choose_nan(x, y, z, 1);
1260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** All the math is done; time to round.
1265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovRoundInternalFPF(z);
1267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn;
1268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/************************
1272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** MultiplyInternalFPF **
1273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*************************
1274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Two internal-representation numbers x and y are multiplied; the
1275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** result is returned in z.
1276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void MultiplyInternalFPF(InternalFPF *x,
1278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        InternalFPF *y,
1279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        InternalFPF *z)
1280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint i;
1282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint j;
1283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovu16 carry;
1284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovu16 extra_bits[INTERNAL_FPF_PRECISION];
1285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovInternalFPF locy;       /* Needed since this will be altered */
1286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** As in the preceding function, this large switch
1288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** statement selects among the many combinations
1289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** of operands.
1290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovswitch ((x->type * IFPF_TYPE_COUNT) + y->type)
1292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase INFINITY_SUBNORMAL:
1294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase INFINITY_NORMAL:
1295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase INFINITY_INFINITY:
1296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase ZERO_ZERO:
1297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase ZERO_SUBNORMAL:
1298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase ZERO_NORMAL:
1299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        my_memmove((void *)x,(void *)z,sizeof(InternalFPF));
1300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        z->sign ^= y->sign;
1301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase SUBNORMAL_INFINITY:
1304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NORMAL_INFINITY:
1305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase SUBNORMAL_ZERO:
1306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NORMAL_ZERO:
1307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        my_memmove((void *)y,(void *)z,sizeof(InternalFPF));
1308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        z->sign ^= x->sign;
1309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase ZERO_INFINITY:
1312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase INFINITY_ZERO:
1313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        SetInternalFPFNaN(z);
1314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NAN_ZERO:
1317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NAN_SUBNORMAL:
1318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NAN_NORMAL:
1319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NAN_INFINITY:
1320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        my_memmove((void *)x,(void *)z,sizeof(InternalFPF));
1321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase ZERO_NAN:
1324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase SUBNORMAL_NAN:
1325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NORMAL_NAN:
1326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase INFINITY_NAN:
1327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        my_memmove((void *)y,(void *)z,sizeof(InternalFPF));
1328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase SUBNORMAL_SUBNORMAL:
1332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase SUBNORMAL_NORMAL:
1333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NORMAL_SUBNORMAL:
1334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NORMAL_NORMAL:
1335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        /*
1336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** Make a local copy of the y number, since we will be
1337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** altering it in the process of multiplying.
1338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        */
1339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        my_memmove((void *)&locy,(void *)y,sizeof(InternalFPF));
1340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        /*
1342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** Check for unnormal zero arguments
1343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        */
1344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if (IsMantissaZero(x->mantissa) || IsMantissaZero(y->mantissa))
1345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                SetInternalFPFInfinity(z, 0);
1346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        /*
1348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** Initialize the result
1349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        */
1350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if (x->type == IFPF_IS_SUBNORMAL ||
1351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            y->type == IFPF_IS_SUBNORMAL)
1352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                z->type = IFPF_IS_SUBNORMAL;
1353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        else
1354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                z->type = IFPF_IS_NORMAL;
1355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        z->sign = x->sign ^ y->sign;
1357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        z->exp = x->exp + y->exp ;
1358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        for (i=0; i<INTERNAL_FPF_PRECISION; i++)
1359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {
1360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                z->mantissa[i] = 0;
1361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                extra_bits[i] = 0;
1362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
1363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        for (i=0; i<(INTERNAL_FPF_PRECISION*16); i++)
1365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {
1366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                /*
1367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ** Get rightmost bit of the multiplier
1368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                */
1369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                carry = 0;
1370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ShiftMantRight1(&carry, locy.mantissa);
1371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                if (carry)
1372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                {
1373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        /*
1374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        ** Add the multiplicand to the product
1375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        */
1376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        carry = 0;
1377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        for (j=(INTERNAL_FPF_PRECISION-1); j>=0; j--)
1378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                Add16Bits(&carry,
1379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                        &z->mantissa[j],
1380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                        z->mantissa[j],
1381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                        x->mantissa[j]);
1382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                }
1383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                else
1384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                {
1385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        carry = 0;
1386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                }
1387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                /*
1389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ** Shift the product right.  Overflow bits get
1390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ** shifted into extra_bits.  We'll use it later
1391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ** to help with the "sticky" bit.
1392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                */
1393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ShiftMantRight1(&carry, z->mantissa);
1394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ShiftMantRight1(&carry, extra_bits);
1395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
1396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        /*
1398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** Normalize
1399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** Note that we use a "special" normalization routine
1400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** because we need to use the extra bits. (These are
1401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** bits that may have been shifted off the bottom that
1402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** we want to reclaim...if we can.
1403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        */
1404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        while ((z->mantissa[0] & 0x8000) == 0)
1405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {
1406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                carry = 0;
1407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ShiftMantLeft1(&carry, extra_bits);
1408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ShiftMantLeft1(&carry, z->mantissa);
1409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                z->exp--;
1410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
1411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        /*
1413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** Set the sticky bit if any bits set in extra bits.
1414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        */
1415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if (IsMantissaZero(extra_bits))
1416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {
1417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                z->mantissa[INTERNAL_FPF_PRECISION-1] |= 1;
1418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
1419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NAN_NAN:
1422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        choose_nan(x, y, z, 0);
1423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** All math done...do rounding.
1428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovRoundInternalFPF(z);
1430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn;
1431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/**********************
1435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** DivideInternalFPF **
1436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov***********************
1437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Divide internal FPF number x by y.  Return result in z.
1438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void DivideInternalFPF(InternalFPF *x,
1440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        InternalFPF *y,
1441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        InternalFPF *z)
1442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint i;
1444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint j;
1445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovu16 carry;
1446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovu16 extra_bits[INTERNAL_FPF_PRECISION];
1447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovInternalFPF locx;       /* Local for x number */
1448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** As with preceding function, the following switch
1451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** statement selects among the various possible
1452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** operands.
1453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovswitch ((x->type * IFPF_TYPE_COUNT) + y->type)
1455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase ZERO_ZERO:
1457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase INFINITY_INFINITY:
1458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        SetInternalFPFNaN(z);
1459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase ZERO_SUBNORMAL:
1462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase ZERO_NORMAL:
1463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if (IsMantissaZero(y->mantissa))
1464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {
1465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                SetInternalFPFNaN(z);
1466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                break;
1467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
1468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase ZERO_INFINITY:
1470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase SUBNORMAL_INFINITY:
1471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NORMAL_INFINITY:
1472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        SetInternalFPFZero(z, x->sign ^ y->sign);
1473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase SUBNORMAL_ZERO:
1476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NORMAL_ZERO:
1477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if (IsMantissaZero(x->mantissa))
1478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {
1479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                SetInternalFPFNaN(z);
1480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                break;
1481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
1482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase INFINITY_ZERO:
1484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase INFINITY_SUBNORMAL:
1485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase INFINITY_NORMAL:
1486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        SetInternalFPFInfinity(z, 0);
1487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        z->sign = x->sign ^ y->sign;
1488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NAN_ZERO:
1491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NAN_SUBNORMAL:
1492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NAN_NORMAL:
1493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NAN_INFINITY:
1494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        my_memmove((void *)x,(void *)z,sizeof(InternalFPF));
1495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase ZERO_NAN:
1498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase SUBNORMAL_NAN:
1499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NORMAL_NAN:
1500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase INFINITY_NAN:
1501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        my_memmove((void *)y,(void *)z,sizeof(InternalFPF));
1502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase SUBNORMAL_SUBNORMAL:
1505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NORMAL_SUBNORMAL:
1506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase SUBNORMAL_NORMAL:
1507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NORMAL_NORMAL:
1508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        /*
1509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** Make local copy of x number, since we'll be
1510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** altering it in the process of dividing.
1511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        */
1512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        my_memmove((void *)&locx,(void *)x,sizeof(InternalFPF));
1513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        /*
1515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** Check for unnormal zero arguments
1516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        */
1517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if (IsMantissaZero(locx.mantissa))
1518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {
1519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                if (IsMantissaZero(y->mantissa))
1520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        SetInternalFPFNaN(z);
1521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                else
1522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        SetInternalFPFZero(z, 0);
1523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                break;
1524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
1525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if (IsMantissaZero(y->mantissa))
1526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {
1527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                SetInternalFPFInfinity(z, 0);
1528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                break;
1529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
1530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        /*
1532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ** Initialize the result
1533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        */
1534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        z->type = x->type;
1535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        z->sign = x->sign ^ y->sign;
1536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        z->exp = x->exp - y->exp +
1537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        ((INTERNAL_FPF_PRECISION * 16 * 2));
1538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        for (i=0; i<INTERNAL_FPF_PRECISION; i++)
1539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {
1540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                z->mantissa[i] = 0;
1541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                extra_bits[i] = 0;
1542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
1543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        while ((z->mantissa[0] & 0x8000) == 0)
1545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {
1546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                carry = 0;
1547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ShiftMantLeft1(&carry, locx.mantissa);
1548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ShiftMantLeft1(&carry, extra_bits);
1549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                /*
1551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ** Time to subtract yet?
1552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                */
1553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                if (carry == 0)
1554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        for (j=0; j<INTERNAL_FPF_PRECISION; j++)
1555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        {
1556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                if (y->mantissa[j] > extra_bits[j])
1557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                {
1558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                        carry = 0;
1559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                        goto no_subtract;
1560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                }
1561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                if (y->mantissa[j] < extra_bits[j])
1562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                        break;
1563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        }
1564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                /*
1565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ** Divisor (y) <= dividend (x), subtract
1566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                */
1567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                carry = 0;
1568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                for (j=(INTERNAL_FPF_PRECISION-1); j>=0; j--)
1569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        Sub16Bits(&carry,
1570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                &extra_bits[j],
1571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                extra_bits[j],
1572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                y->mantissa[j]);
1573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                carry = 1;      /* 1 shifted into quotient */
1574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        no_subtract:
1575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ShiftMantLeft1(&carry, z->mantissa);
1576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                z->exp--;
1577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
1578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcase NAN_NAN:
1581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        choose_nan(x, y, z, 0);
1582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
1583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Math complete...do rounding
1587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovRoundInternalFPF(z);
1589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/**********************
1592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** LongToInternalFPF **
1593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Int32ToInternalFPF **
1594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov***********************
1595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Convert a signed (long) 32-bit integer into an internal FPF number.
1596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* static void LongToInternalFPF(long mylong, */
1598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void Int32ToInternalFPF(int32 mylong,
1599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                InternalFPF *dest)
1600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint i;          /* Index */
1602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovu16 myword;     /* Used to hold converted stuff */
1603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Save the sign and get the absolute value.  This will help us
1605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** with 64-bit machines, since we use only the lower 32
1606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** bits just in case. (No longer necessary after we use int32.)
1607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* if(mylong<0L) */
1609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovif(mylong<(int32)0)
1610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{       dest->sign=1;
1611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        mylong=(int32)0-mylong;
1612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovelse
1614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        dest->sign=0;
1615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Prepare the destination floating point number
1617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovdest->type=IFPF_IS_NORMAL;
1619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfor(i=0;i<INTERNAL_FPF_PRECISION;i++)
1620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        dest->mantissa[i]=0;
1621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** See if we've got a zero.  If so, make the resultant FP
1624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** number a true zero and go home.
1625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovif(mylong==0)
1627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{       dest->type=IFPF_IS_ZERO;
1628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        dest->exp=0;
1629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return;
1630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Not a true zero.  Set the exponent to 32 (internal FPFs have
1634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** no bias) and load the low and high words into their proper
1635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** locations in the mantissa.  Then normalize.  The action of
1636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** normalizing slides the mantissa bits into place and sets
1637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** up the exponent properly.
1638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovdest->exp=32;
1640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmyword=(u16)((mylong >> 16) & 0xFFFFL);
1641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovdest->mantissa[0]=myword;
1642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmyword=(u16)(mylong & 0xFFFFL);
1643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovdest->mantissa[1]=myword;
1644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovnormalize(dest);
1645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn;
1646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if 1
1649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/************************
1650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** InternalFPFToString **
1651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*************************
1652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** FOR DEBUG PURPOSES
1653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** This routine converts an internal floating point representation
1654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** number to a string.  Used in debugging the package.
1655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Returns length of converted number.
1656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** NOTE: dest must point to a buffer big enough to hold the
1657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**  result.  Also, this routine does append a null (an effect
1658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**  of using the sprintf() function).  It also returns
1659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**  a length count.
1660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** NOTE: This routine returns 5 significant digits.  Thats
1661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**  about all I feel safe with, given the method of
1662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**  conversion.  It should be more than enough for programmers
1663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**  to determine whether the package is properly ported.
1664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int InternalFPFToString(char *dest,
1666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                InternalFPF *src)
1667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovInternalFPF locFPFNum;          /* Local for src (will be altered) */
1669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovInternalFPF IFPF10;             /* Floating-point 10 */
1670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovInternalFPF IFPFComp;           /* For doing comparisons */
1671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint msign;                      /* Holding for mantissa sign */
1672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint expcount;                   /* Exponent counter */
1673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint ccount;                     /* Character counter */
1674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint i,j,k;                      /* Index */
1675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovu16 carryaccum;                 /* Carry accumulator */
1676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovu16 mycarry;                    /* Local for carry */
1677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Check first for the simple things...Nan, Infinity, Zero.
1680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** If found, copy the proper string in and go home.
1681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovswitch(src->type)
1683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case IFPF_IS_NAN:
1685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                my_memcpy(dest,"NaN",3);
1686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                return(3);
1687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case IFPF_IS_INFINITY:
1689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                if(src->sign==0)
1690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        my_memcpy(dest,"+Inf",4);
1691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                else
1692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        my_memcpy(dest,"-Inf",4);
1693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                return(4);
1694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case IFPF_IS_ZERO:
1696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                if(src->sign==0)
1697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        my_memcpy(dest,"+0",2);
1698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                else
1699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        my_memcpy(dest,"-0",2);
1700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                return(2);
1701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Move the internal number into our local holding area, since
1705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** we'll be altering it to print it out.
1706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmy_memcpy((void *)&locFPFNum,(void *)src,sizeof(InternalFPF));
1708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Set up a floating-point 10...which we'll use a lot in a minute.
1711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* LongToInternalFPF(10L,&IFPF10); */
1713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovInt32ToInternalFPF((int32)10,&IFPF10);
1714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Save the mantissa sign and make it positive.
1717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmsign=src->sign;
1719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* src->sign=0 */ /* bug, fixed Nov. 13, 1997 */
1721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov(&locFPFNum)->sign=0;
1722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovexpcount=0;             /* Init exponent counter */
1724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** See if the number is less than 10.  If so, multiply
1727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** the number repeatedly by 10 until it's not.   For each
1728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** multiplication, decrement a counter so we can keep track
1729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** of the exponent.
1730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovwhile(1)
1733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{       AddSubInternalFPF(1,&locFPFNum,&IFPF10,&IFPFComp);
1734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if(IFPFComp.sign==0) break;
1735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        MultiplyInternalFPF(&locFPFNum,&IFPF10,&IFPFComp);
1736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        expcount--;
1737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        my_memcpy((void *)&locFPFNum,(void *)&IFPFComp,sizeof(InternalFPF));
1738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Do the reverse of the above.  As long as the number is
1741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** greater than or equal to 10, divide it by 10.  Increment the
1742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** exponent counter for each multiplication.
1743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovwhile(1)
1746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        AddSubInternalFPF(1,&locFPFNum,&IFPF10,&IFPFComp);
1748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if(IFPFComp.sign!=0) break;
1749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        DivideInternalFPF(&locFPFNum,&IFPF10,&IFPFComp);
1750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        expcount++;
1751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        my_memcpy((void *)&locFPFNum,(void *)&IFPFComp,sizeof(InternalFPF));
1752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** About time to start storing things.  First, store the
1756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** mantissa sign.
1757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovccount=1;               /* Init character counter */
1759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovif(msign==0)
1760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        *dest++='+';
1761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovelse
1762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        *dest++='-';
1763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** At this point we know that the number is in the range
1766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** 10 > n >=1.  We need to "strip digits" out of the
1767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** mantissa.  We do this by treating the mantissa as
1768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** an integer and multiplying by 10. (Not a floating-point
1769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** 10, but an integer 10.  Since this is debug code and we
1770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** could care less about speed, we'll do it the stupid
1771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** way and simply add the number to itself 10 times.
1772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Anything that makes it to the left of the implied binary point
1773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** gets stripped off and emitted.  We'll do this for
1774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** 5 significant digits (which should be enough to
1775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** verify things).
1776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Re-position radix point
1779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcarryaccum=0;
1781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovwhile(locFPFNum.exp>0)
1782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        mycarry=0;
1784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ShiftMantLeft1(&mycarry,locFPFNum.mantissa);
1785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        carryaccum=(carryaccum<<1);
1786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if(mycarry) carryaccum++;
1787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        locFPFNum.exp--;
1788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovwhile(locFPFNum.exp<0)
1791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        mycarry=0;
1793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ShiftMantRight1(&mycarry,locFPFNum.mantissa);
1794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        locFPFNum.exp++;
1795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfor(i=0;i<6;i++)
1798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if(i==1)
1799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {       /* Emit decimal point */
1800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                *dest++='.';
1801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ccount++;
1802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
1803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        else
1804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        {       /* Emit a digit */
1805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                *dest++=('0'+carryaccum);
1806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                ccount++;
1807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                carryaccum=0;
1809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                my_memcpy((void *)&IFPF10,
1810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        (void *)&locFPFNum,
1811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        sizeof(InternalFPF));
1812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                /* Do multiply via repeated adds */
1814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                for(j=0;j<9;j++)
1815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                {
1816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        mycarry=0;
1817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        for(k=(INTERNAL_FPF_PRECISION-1);k>=0;k--)
1818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                Add16Bits(&mycarry,&(IFPFComp.mantissa[k]),
1819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                        locFPFNum.mantissa[k],
1820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                        IFPF10.mantissa[k]);
1821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        carryaccum+=mycarry ? 1 : 0;
1822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        my_memcpy((void *)&locFPFNum,
1823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                (void *)&IFPFComp,
1824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                sizeof(InternalFPF));
1825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                }
1826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
1827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Now move the 'E', the exponent sign, and the exponent
1830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** into the string.
1831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*dest++='E';
1833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* sprint is supposed to return an integer, but it caused problems on SunOS
1835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov * with the native cc. Hence we force it.
1836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov * Uwe F. Mayer
1837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov */
1838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovif (expcount < 0) {
1839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     *dest++ = '-';
1840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     expcount =- expcount;
1841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovelse *dest++ = ' ';
1843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*dest++ = (char)(expcount + '0');
1845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*dest++ = 0;
1846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovccount += 3;
1848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** All done, go home.
1850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn(ccount);
1852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
1856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov////////////////////////////////////////////////////////////////////////
1860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
1861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid* AllocateMemory ( unsigned long n, int* p )
1862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  *p = 0;
1864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  void* r = (void*) (*serviceFn)(2,n);
1865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  return r;
1866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
1868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid FreeMemory ( void* p, int* zz )
1869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  *zz = 0;
1871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  // free(p);
1872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/**************
1877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** DoEmFloat **
1878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov***************
1879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Perform the floating-point emulation routines portion of the
1880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** CPU benchmark.  Returns the operations per second.
1881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
1883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid DoEmFloat(void)
1884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovEmFloatStruct *locemfloatstruct;        /* Local structure */
1886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovInternalFPF *abase;             /* Base of A array */
1887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovInternalFPF *bbase;             /* Base of B array */
1888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovInternalFPF *cbase;             /* Base of C array */
1889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovulong tickcount;                /* # of ticks */
1890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovchar *errorcontext;             /* Error context string pointer */
1891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint systemerror;                /* For holding error code */
1892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovulong loops;                    /* # of loops */
1893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Link to global structure
1896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovEmFloatStruct global_emfloatstruct;
1898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov global_emfloatstruct.adjust = 0;
1899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov global_emfloatstruct.request_secs = 0;
1900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov global_emfloatstruct.arraysize = 100;
1901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov global_emfloatstruct.loops = 1;
1902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov global_emfloatstruct.emflops = 0.0;
1903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovlocemfloatstruct=&global_emfloatstruct;
1904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Set the error context
1907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanoverrorcontext="CPU:Floating Emulation";
1909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovabase=(InternalFPF *)AllocateMemory(locemfloatstruct->arraysize*sizeof(InternalFPF),
1912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		&systemerror);
1913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovbbase=(InternalFPF *)AllocateMemory(locemfloatstruct->arraysize*sizeof(InternalFPF),
1915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		&systemerror);
1916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcbase=(InternalFPF *)AllocateMemory(locemfloatstruct->arraysize*sizeof(InternalFPF),
1918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		&systemerror);
1919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
1921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Set up the arrays
1922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
1923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovSetupCPUEmFloatArrays(abase,bbase,cbase,locemfloatstruct->arraysize);
1924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov loops=100;
1926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	       tickcount=DoEmFloatIteration(abase,bbase,cbase,
1927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			locemfloatstruct->arraysize,
1928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			loops);
1929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovFreeMemory((void *)abase,&systemerror);
1931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovFreeMemory((void *)bbase,&systemerror);
1932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovFreeMemory((void *)cbase,&systemerror);
1933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn;
1935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov//////////////////
1938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid entry ( HWord(*f)(HWord,HWord) )
1939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  serviceFn = f;
1941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  vexxx_printf("starting\n");
1942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  DoEmFloat();
1943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  (*serviceFn)(0,0);
1944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1945