Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1)  +---------------------------------------------------------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2)  |  wm-FPU-emu   an FPU emulator for 80386 and 80486SX microprocessors.      |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  |                                                                           |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  | Copyright (C) 1992,1993,1994,1995,1996,1997,1999                          |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  |                       W. Metzenthen, 22 Parker St, Ormond, Vic 3163,      |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  |                       Australia.  E-mail billm@melbpc.org.au              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  |                                                                           |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  |    This program is free software; you can redistribute it and/or modify   |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  |    it under the terms of the GNU General Public License version 2 as      |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  |    published by the Free Software Foundation.                             |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  |                                                                           |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  |    This program is distributed in the hope that it will be useful,        |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13)  |    but WITHOUT ANY WARRANTY; without even the implied warranty of         |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14)  |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15)  |    GNU General Public License for more details.                           |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16)  |                                                                           |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)  |    You should have received a copy of the GNU General Public License      |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)  |    along with this program; if not, write to the Free Software            |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)  |    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)  |                                                                           |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21)  +---------------------------------------------------------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) wm-FPU-emu is an FPU emulator for Linux. It is derived from wm-emu387
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) which was my 80387 emulator for early versions of djgpp (gcc under
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) msdos); wm-emu387 was in turn based upon emu387 which was written by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) DJ Delorie for djgpp.  The interface to the Linux kernel is based upon
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) the original Linux math emulator by Linus Torvalds.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) My target FPU for wm-FPU-emu is that described in the Intel486
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) Programmer's Reference Manual (1992 edition). Unfortunately, numerous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) facets of the functioning of the FPU are not well covered in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) Reference Manual. The information in the manual has been supplemented
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) with measurements on real 80486's. Unfortunately, it is simply not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) possible to be sure that all of the peculiarities of the 80486 have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) been discovered, so there is always likely to be obscure differences
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) in the detailed behaviour of the emulator and a real 80486.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) wm-FPU-emu does not implement all of the behaviour of the 80486 FPU,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) but is very close.  See "Limitations" later in this file for a list of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) some differences.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) Please report bugs, etc to me at:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45)        billm@melbpc.org.au
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) or     b.metzenthen@medoto.unimelb.edu.au
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) For more information on the emulator and on floating point topics, see
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) my web pages, currently at  http://www.suburbia.net/~billm/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) --Bill Metzenthen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53)   December 1999
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) ----------------------- Internals of wm-FPU-emu -----------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) Numeric algorithms:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) (1) Add, subtract, and multiply. Nothing remarkable in these.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) (2) Divide has been tuned to get reasonable performance. The algorithm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61)     is not the obvious one which most people seem to use, but is designed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62)     to take advantage of the characteristics of the 80386. I expect that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63)     it has been invented many times before I discovered it, but I have not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64)     seen it. It is based upon one of those ideas which one carries around
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65)     for years without ever bothering to check it out.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) (3) The sqrt function has been tuned to get good performance. It is based
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67)     upon Newton's classic method. Performance was improved by capitalizing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68)     upon the properties of Newton's method, and the code is once again
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69)     structured taking account of the 80386 characteristics.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) (4) The trig, log, and exp functions are based in each case upon quasi-
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71)     "optimal" polynomial approximations. My definition of "optimal" was
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72)     based upon getting good accuracy with reasonable speed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) (5) The argument reducing code for the trig function effectively uses
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74)     a value of pi which is accurate to more than 128 bits. As a consequence,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75)     the reduced argument is accurate to more than 64 bits for arguments up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76)     to a few pi, and accurate to more than 64 bits for most arguments,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77)     even for arguments approaching 2^63. This is far superior to an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78)     80486, which uses a value of pi which is accurate to 66 bits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) The code of the emulator is complicated slightly by the need to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) account for a limited form of re-entrancy. Normally, the emulator will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) emulate each FPU instruction to completion without interruption.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) However, it may happen that when the emulator is accessing the user
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) memory space, swapping may be needed. In this case the emulator may be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) temporarily suspended while disk i/o takes place. During this time
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) another process may use the emulator, thereby perhaps changing static
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) variables. The code which accesses user memory is confined to five
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) files:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89)     fpu_entry.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90)     reg_ld_str.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91)     load_store.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92)     get_address.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93)     errors.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) As from version 1.12 of the emulator, no static variables are used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) (apart from those in the kernel's per-process tables). The emulator is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) therefore now fully re-entrant, rather than having just the restricted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) form of re-entrancy which is required by the Linux kernel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) ----------------------- Limitations of wm-FPU-emu -----------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) There are a number of differences between the current wm-FPU-emu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) (version 2.01) and the 80486 FPU (apart from bugs).  The differences
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) are fewer than those which applied to the 1.xx series of the emulator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) Some of the more important differences are listed below:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) The Roundup flag does not have much meaning for the transcendental
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) functions and its 80486 value with these functions is likely to differ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) from its emulator value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) In a few rare cases the Underflow flag obtained with the emulator will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) be different from that obtained with an 80486. This occurs when the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) following conditions apply simultaneously:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) (a) the operands have a higher precision than the current setting of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)     precision control (PC) flags.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) (b) the underflow exception is masked.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) (c) the magnitude of the exact result (before rounding) is less than 2^-16382.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) (d) the magnitude of the final result (after rounding) is exactly 2^-16382.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) (e) the magnitude of the exact result would be exactly 2^-16382 if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)     operands were rounded to the current precision before the arithmetic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)     operation was performed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) If all of these apply, the emulator will set the Underflow flag but a real
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 80486 will not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) NOTE: Certain formats of Extended Real are UNSUPPORTED. They are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) unsupported by the 80486. They are the Pseudo-NaNs, Pseudoinfinities,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) and Unnormals. None of these will be generated by an 80486 or by the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) emulator. Do not use them. The emulator treats them differently in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) detail from the way an 80486 does.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) Self modifying code can cause the emulator to fail. An example of such
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) code is:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)           movl %esp,[%ebx]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	  fld1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) The FPU instruction may be (usually will be) loaded into the pre-fetch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) queue of the CPU before the mov instruction is executed. If the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) destination of the 'movl' overlaps the FPU instruction then the bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) in the prefetch queue and memory will be inconsistent when the FPU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) instruction is executed. The emulator will be invoked but will not be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) able to find the instruction which caused the device-not-present
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) exception. For this case, the emulator cannot emulate the behaviour of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) an 80486DX.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) Handling of the address size override prefix byte (0x67) has not been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) extensively tested yet. A major problem exists because using it in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) vm86 mode can cause a general protection fault. Address offsets
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) greater than 0xffff appear to be illegal in vm86 mode but are quite
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) acceptable (and work) in real mode. A small test program developed to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) check the addressing, and which runs successfully in real mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) crashes dosemu under Linux and also brings Windows down with a general
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) protection fault message when run under the MS-DOS prompt of Windows
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 3.1. (The program simply reads data from a valid address).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) The emulator supports 16-bit protected mode, with one difference from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) an 80486DX.  A 80486DX will allow some floating point instructions to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) write a few bytes below the lowest address of the stack.  The emulator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) will not allow this in 16-bit protected mode: no instructions are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) allowed to write outside the bounds set by the protection.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) ----------------------- Performance of wm-FPU-emu -----------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) Speed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) -----
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) The speed of floating point computation with the emulator will depend
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) upon instruction mix. Relative performance is best for the instructions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) which require most computation. The simple instructions are adversely
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) affected by the FPU instruction trap overhead.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) Timing: Some simple timing tests have been made on the emulator functions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) The times include load/store instructions. All times are in microseconds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) measured on a 33MHz 386 with 64k cache. The Turbo C tests were under
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) ms-dos, the next two columns are for emulators running with the djgpp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) ms-dos extender. The final column is for wm-FPU-emu in Linux 0.97,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) using libm4.0 (hard).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) function      Turbo C        djgpp 1.06        WM-emu387     wm-FPU-emu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)    +          60.5           154.8              76.5          139.4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)    -          61.1-65.5      157.3-160.8        76.2-79.5     142.9-144.7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)    *          71.0           190.8              79.6          146.6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)    /          61.2-75.0      261.4-266.9        75.3-91.6     142.2-158.1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)  sin()        310.8          4692.0            319.0          398.5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)  cos()        284.4          4855.2            308.0          388.7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)  tan()        495.0          8807.1            394.9          504.7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)  atan()       328.9          4866.4            601.1          419.5-491.9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)  sqrt()       128.7          crashed           145.2          227.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)  log()        413.1-419.1    5103.4-5354.21    254.7-282.2    409.4-437.1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)  exp()        479.1          6619.2            469.1          850.8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) The performance under Linux is improved by the use of look-ahead code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) The following results show the improvement which is obtained under
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) Linux due to the look-ahead code. Also given are the times for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) original Linux emulator with the 4.1 'soft' lib.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)  [ Linus' note: I changed look-ahead to be the default under linux, as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)    there was no reason not to use it after I had edited it to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)    disabled during tracing ]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)             wm-FPU-emu w     original w
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)             look-ahead       'soft' lib
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)    +         106.4             190.2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)    -         108.6-111.6      192.4-216.2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)    *         113.4             193.1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)    /         108.8-124.4      700.1-706.2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)  sin()       390.5            2642.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)  cos()       381.5            2767.4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)  tan()       496.5            3153.3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)  atan()      367.2-435.5     2439.4-3396.8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)  sqrt()      195.1            4732.5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)  log()       358.0-387.5     3359.2-3390.3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)  exp()       619.3            4046.4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) These figures are now somewhat out-of-date. The emulator has become
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) progressively slower for most functions as more of the 80486 features
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) have been implemented.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) ----------------------- Accuracy of wm-FPU-emu -----------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) The accuracy of the emulator is in almost all cases equal to or better
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) than that of an Intel 80486 FPU.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) The results of the basic arithmetic functions (+,-,*,/), and fsqrt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) match those of an 80486 FPU. They are the best possible; the error for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) these never exceeds 1/2 an lsb. The fprem and fprem1 instructions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) return exact results; they have no error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) The following table compares the emulator accuracy for the sqrt(),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) trig and log functions against the Turbo C "emulator". For this table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) each function was tested at about 400 points. Ideal worst-case results
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) would be 64 bits. The reduced Turbo C accuracy of cos() and tan() for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) arguments greater than pi/4 can be thought of as being related to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) precision of the argument x; e.g. an argument of pi/2-(1e-10) which is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) accurate to 64 bits can result in a relative accuracy in cos() of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) about 64 + log2(cos(x)) = 31 bits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) Function      Tested x range            Worst result                Turbo C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)                                         (relative bits)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) sqrt(x)       1 .. 2                    64.1                         63.2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) atan(x)       1e-10 .. 200              64.2                         62.8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) cos(x)        0 .. pi/2-(1e-10)         64.4 (x <= pi/4)             62.4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)                                         64.1 (x = pi/2-(1e-10))      31.9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) sin(x)        1e-10 .. pi/2             64.0                         62.8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) tan(x)        1e-10 .. pi/2-(1e-10)     64.0 (x <= pi/4)             62.1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)                                         64.1 (x = pi/2-(1e-10))      31.9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) exp(x)        0 .. 1                    63.1 **                      62.9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) log(x)        1+1e-6 .. 2               63.8 **                      62.1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) ** The accuracy for exp() and log() is low because the FPU (emulator)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) does not compute them directly; two operations are required.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) The emulator passes the "paranoia" tests (compiled with gcc 2.3.3 or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) later) for 'float' variables (24 bit precision numbers) when precision
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) control is set to 24, 53 or 64 bits, and for 'double' variables (53
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) bit precision numbers) when precision control is set to 53 bits (a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) properly performing FPU cannot pass the 'paranoia' tests for 'double'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) variables when precision control is set to 64 bits).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) The code for reducing the argument for the trig functions (fsin, fcos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) fptan and fsincos) has been improved and now effectively uses a value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) for pi which is accurate to more than 128 bits precision. As a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) consequence, the accuracy of these functions for large arguments has
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) been dramatically improved (and is now very much better than an 80486
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) FPU). There is also now no degradation of accuracy for fcos and fptan
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) for operands close to pi/2. Measured results are (note that the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) definition of accuracy has changed slightly from that used for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) above table):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) Function      Tested x range          Worst result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)                                      (absolute bits)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) cos(x)        0 .. 9.22e+18              62.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) sin(x)        1e-16 .. 9.22e+18          62.1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) tan(x)        1e-16 .. 9.22e+18          61.8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) It is possible with some effort to find very large arguments which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) give much degraded precision. For example, the integer number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)            8227740058411162616.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) is within about 10e-7 of a multiple of pi. To find the tan (for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) example) of this number to 64 bits precision it would be necessary to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) have a value of pi which had about 150 bits precision. The FPU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) emulator computes the result to about 42.6 bits precision (the correct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) result is about -9.739715e-8). On the other hand, an 80486 FPU returns
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 0.01059, which in relative terms is hopelessly inaccurate.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) For arguments close to critical angles (which occur at multiples of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) pi/2) the emulator is more accurate than an 80486 FPU. For very large
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) arguments, the emulator is far more accurate.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) Prior to version 1.20 of the emulator, the accuracy of the results for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) the transcendental functions (in their principal range) was not as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) good as the results from an 80486 FPU. From version 1.20, the accuracy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) has been considerably improved and these functions now give measured
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) worst-case results which are better than the worst-case results given
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) by an 80486 FPU.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) The following table gives the measured results for the emulator. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) number of randomly selected arguments in each case is about half a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) million.  The group of three columns gives the frequency of the given
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) accuracy in number of times per million, thus the second of these
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) columns shows that an accuracy of between 63.80 and 63.89 bits was
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) found at a rate of 133 times per one million measurements for fsin.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) The results show that the fsin, fcos and fptan instructions return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) results which are in error (i.e. less accurate than the best possible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) result (which is 64 bits)) for about one per cent of all arguments
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) between -pi/2 and +pi/2.  The other instructions have a lower
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) frequency of results which are in error.  The last two columns give
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) the worst accuracy which was found (in bits) and the approximate value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) of the argument which produced it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)                                 frequency (per M)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)                                -------------------   ---------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) instr   arg range    # tests   63.7   63.8    63.9   worst   at arg
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)                                bits   bits    bits    bits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) -----  ------------  -------   ----   ----   -----   -----  --------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) fsin     (0,pi/2)     547756      0    133   10673   63.89  0.451317
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) fcos     (0,pi/2)     547563      0    126   10532   63.85  0.700801
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) fptan    (0,pi/2)     536274     11    267   10059   63.74  0.784876
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) fpatan  4 quadrants   517087      0      8    1855   63.88  0.435121 (4q)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) fyl2x     (0,20)      541861      0      0    1323   63.94  1.40923  (x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) fyl2xp1 (-.293,.414)  520256      0      0    5678   63.93  0.408542 (x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) f2xm1     (-1,1)      538847      4    481    6488   63.79  0.167709
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) Tests performed on an 80486 FPU showed results of lower accuracy. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) following table gives the results which were obtained with an AMD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 486DX2/66 (other tests indicate that an Intel 486DX produces
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) identical results).  The tests were basically the same as those used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) to measure the emulator (the values, being random, were in general not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) the same).  The total number of tests for each instruction are given
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) at the end of the table, in case each about 100k tests were performed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) Another line of figures at the end of the table shows that most of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) instructions return results which are in error for more than 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) percent of the arguments tested.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) The numbers in the body of the table give the approx number of times a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) result of the given accuracy in bits (given in the left-most column)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) was obtained per one million arguments. For three of the instructions,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) two columns of results are given: * The second column for f2xm1 gives
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) the number cases where the results of the first column were for a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) positive argument, this shows that this instruction gives better
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) results for positive arguments than it does for negative.  * In the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) cases of fcos and fptan, the first column gives the results when all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) cases where arguments greater than 1.5 were removed from the results
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) given in the second column. Unlike the emulator, an 80486 FPU returns
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) results of relatively poor accuracy for these instructions when the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) argument approaches pi/2. The table does not show those cases when the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) accuracy of the results were less than 62 bits, which occurs quite
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) often for fsin and fptan when the argument approaches pi/2. This poor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) accuracy is discussed above in relation to the Turbo C "emulator", and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) the accuracy of the value of pi.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) bits   f2xm1  f2xm1 fpatan   fcos   fcos  fyl2x fyl2xp1  fsin  fptan  fptan
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 62.0       0      0      0      0    437      0      0      0      0    925
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 62.1       0      0     10      0    894      0      0      0      0   1023
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 62.2      14      0      0      0   1033      0      0      0      0    945
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 62.3      57      0      0      0   1202      0      0      0      0   1023
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 62.4     385      0      0     10   1292      0     23      0      0   1178
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 62.5    1140      0      0    119   1649      0     39      0      0   1149
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 62.6    2037      0      0    189   1620      0     16      0      0   1169
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 62.7    5086     14      0    646   2315     10    101     35     39   1402
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 62.8    8818     86      0    984   3050     59    287    131    224   2036
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 62.9   11340   1355      0   2126   4153     79    605    357    321   1948
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 63.0   15557   4750      0   3319   5376    246   1281    862    808   2688
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 63.1   20016   8288      0   4620   6628    511   2569   1723   1510   3302
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 63.2   24945  11127     10   6588   8098   1120   4470   2968   2990   4724
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 63.3   25686  12382     69   8774  10682   1906   6775   4482   5474   7236
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 63.4   29219  14722     79  11109  12311   3094   9414   7259   8912  10587
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 63.5   30458  14936    393  13802  15014   5874  12666   9609  13762  15262
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 63.6   32439  16448   1277  17945  19028  10226  15537  14657  19158  20346
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 63.7   35031  16805   4067  23003  23947  18910  20116  21333  25001  26209
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 63.8   33251  15820   7673  24781  25675  24617  25354  24440  29433  30329
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 63.9   33293  16833  18529  28318  29233  31267  31470  27748  29676  30601
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) Per cent with error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390)         30.9           3.2          18.5    9.8   13.1   11.6          17.4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) Total arguments tested:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)        70194  70099 101784 100641 100641 101799 128853 114893 102675 102675
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) ------------------------- Contributors -------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) A number of people have contributed to the development of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) emulator, often by just reporting bugs, sometimes with suggested
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) fixes, and a few kind people have provided me with access in one way
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) or another to an 80486 machine. Contributors include (to those people
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) who I may have forgotten, please forgive me):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) Linus Torvalds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) Tommy.Thorn@daimi.aau.dk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) Andrew.Tridgell@anu.edu.au
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) Nick Holloway, alfie@dcs.warwick.ac.uk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) Hermano Moura, moura@dcs.gla.ac.uk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) Jon Jagger, J.Jagger@scp.ac.uk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) Lennart Benschop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) Brian Gallew, geek+@CMU.EDU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) Thomas Staniszewski, ts3v+@andrew.cmu.edu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) Martin Howell, mph@plasma.apana.org.au
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) M Saggaf, alsaggaf@athena.mit.edu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) Peter Barker, PETER@socpsy.sci.fau.edu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) tom@vlsivie.tuwien.ac.at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) Dan Russel, russed@rpi.edu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) Daniel Carosone, danielce@ee.mu.oz.au
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) cae@jpmorgan.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) Hamish Coleman, t933093@minyos.xx.rmit.oz.au
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) Bruce Evans, bde@kralizec.zeta.org.au
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) Timo Korvola, Timo.Korvola@hut.fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) Rick Lyons, rick@razorback.brisnet.org.au
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) Rick, jrs@world.std.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)  
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) ...and numerous others who responded to my request for help with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) a real 80486.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)