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