From: S_JUFFA@iravcl.ira.uka.de (|S| Norbert Juffa)
Newsgroups: comp.sys.ibm.pc.hardware,comp.sys.intel
Subject: What you always wanted to know about math copros 3/5
Date: 28 Sep 1992 14:09:51 GMT
Organization: University of Karlsruhe (FRG) - Informatik Rechnerabt.
Distribution: world
NNTP-Posting-Host: irav1.ira.uka.de
X-News-Reader: VMS NEWS 1.23

         Performance

         Several computer magazines have published performance comparisons
         at the application level for the 387 coprocessors and Weitek's
         ABACUS 3167 and 4167 chips [1,25,68,70]. Applications tested included
         AutoCAD R11, RenderStar, Quattro Pro, Lotus 1-2-3, and AutoDesk's
         3D-Studio. For most tests, performance improvements for the 387
         clones over Intel's 387DX were small to marginal, the clones running
         the applications no more than 5% to 15% faster than the Intel 387DX.
         In the test of 3D-Studio, one of the few programs that supports
         the Weitek Abacus, the Weitek 3167 improved performance by 23%
         over an Intel 387DX and the 4167 improved performance by 10% over
         the 486 [1].


         The Intel Math Coprocessor Utilities Disk that accompanies the
         Intel 387DX coprocessor has a demonstration program that shows
         the speedup of certain application programs when run with the
         Intel coprocessor vs. a system with no coprocessor.

         Application      Time w/o 387   Time w/ 387  Speedup

         Art&Letters          87.0 sec      34.8 sec     150%
         Quattro Pro           8.0 sec       4.0 sec     100%
         Wingz                17.9 sec       9.1 sec      97%
         Mathematica         420.2 sec     337.0 sec      25%


         The following table is an excerpt from [70]:

         Application      Time w/o 387   Time w/ 387  Speedup

         Corel Draw          471.0 sec     416.0 sec      13%
         Freedom Of Press    163.0 sec      77.0 sec     112%
         Lotus 1-2-3         257.0 sec      43.0 sec     597%


         The following table is an excerpt from [25]:

         Application      Time w/o 387   Time w/ 387  Speedup

         Design CAD, Test1    98.1 sec      50.0 sec      96%
         Design CAD, Test2    75.3 sec      35.0 sec     115%
         Excel, Test 1         9.2 sec       6.8 sec      35%
         Excel, Test 1        12.6 sec       9.3 sec      35%



         The performance statistics below were put together with the
         help of four widely known numeric benchmarks and two benchmarks
         developed by me. Three Pascal programs, one FORTRAN program,
         and two assembly language program were used. The assembly language
         programs were linked with Turbo-Pascal 6.0 for library support,
         especially to include the coprocessor emulator of the TP 6.0
         run-time library. The Pascal programs were compiled with Turbo
         Pascal 6.0 from Borland International, a non-optimizing compiler
         that produces 16-bit code. The FORTRAN program was compiled using
         MS FORTRAN 5.0, an optimizing compiler that generates 16-bit
         code. All programs except PEAKFLOP and SAVAGE, which use double
         extended precision, use double precision variables. Note that
         using a highly optimizing compiler producing 32-bit code you
         will see much higher performance for some benchmarks. For example,
         Intel rates the 33 MHz 386/387DX at 3290 kWhetstones/sec and 0.4
         double precision LINPACK MFLOPS [28,29]. The 33 MHz Intel 486 is
         rated by Intel at 12300 kWhetstones/sec and 1.6 double precision
         LINPACK MFLOPS [30]. The compilers used in these benchmarks run by
         the chip vendor are the ones that give the highest performance
         available. These compilers are in the US$ 1000+ price range.
         Some of them may be experimental or prereleased versions not
         available to the general public. The relative performance of
         one coprocessor to another could vary depending on the code
         generated by compilers. Non-optimizing compilers tend to generate
         a high percentage of operations which access variables in memory,
         while optimizing compiler produce code that contains many
         operations involving registers. Thus it is well possible that
         coprocessor A beats coprocessor B running benchmark Z if compiled
         with compiler C, but B beats A when the same benchmark is compiled
         using compiler D. All benchmark in this overview were run from
         floppy under a 'bare-bones' MS-DOS 5.0 without the CONFIG.SYS
         and AUTOEXEC.BAT files. This way, it was made sure no TSR or
         other program unnecessarily stole computing resources from the
         benchmarks.

         Coprocessor performance also depends on the motherboard, or more
         specifically the chip set used on the motherboard. In [34] and [35]
         identically configured motherboards using different 386 chip sets
         were tested. Among other tests a coprocessor benchmark was run
         which is based on a fractal computation and its execution time
         recorded. The following tables showing coprocessor performance
         to vary with the chip set have been copied from these articles
         in abridged form.

                       Cyrix                                   Cyrix
         chip set      387+                 chip set           83D87

         Opti, 40 MHz  24.57 sec   97.0%    PC-Chips, 33 MHz  26.97 sec   93.0%
         Elite,40 MHz  24.46 sec   97.4%    UMC,      33 MHz  27.69 sec   90.5%
         ACT,  40 MHz  23.84 sec  100.0%    Headland, 33 MHz  25.08 sec  100.0%
         Forex,40 MHz  23.84 sec  100.0%    Eteq,     33 MHz  27.38 sec   91.6%

         This shows that performance of the same coprocessor can vary by
         up to ~10% depending on the chip set used on your board, at least
         for 386 motherboards (similar numbers for 286, 386SX, and 486 are
         unfortunately not available). The benchmarks for this article were
         run on a board with the Forex chip set, which is one of the fastest
         386 chip sets there is, not only with respect to floating-point
         performance [35].


         Description of benchmarks

         PEAKFLOP is the kernel of a fractal computation. It consists
         mainly of a tight loop written in assembly code and fine tuned
         to give maximum performance. All variables are held in the
         CPU's and coprocessor's registers, so the only memory access
         is for opcode fetches. The main loop contains three multiplications
         and five additions/subtractions. This ratio is fairly typical
         for other floating point intensive programs as well. The whole
         program fits nicely into even a very small CPU cache. Due to
         the nature of this program, its MFLOPS rate is hardly to be
         exceeded by any program that calculates anything useful. Thus
         the name PEAKFLOP. You will find the source code for PEAKFLOP
         in appendix B.

         TRNSFORM multiplies an array of 8191 vectors with a 3D-transformation
         matrix (a 4x4 matrix). Each vector consists of four double precision
         values. Multiplying vectors with a matrix is a typical operation in
         the manipulation (e.g. rotation) of 3D objects which are made up from
         many vectors describing the object. This benchmark stresses addition
         and multiplication as well as memory access. For each vector, 16
         multiplications and 12 additions are used. About 256 kByte of data
         is accessed during the benchmark. TRNSFORM is implemented as an
         optimized assembler program linked with the Turbo Pascal 6.0 library.
         For the IIT 3C87, a special version was written that makes use of
         the special F4X4 instruction available on that coprocessor. F4X4
         does a full multiplication of a 4x4 matrix by a 4x1 vector in a
         single instruction. The full source code for the TRNSFORM program is
         in appendix B.

         LLL is short for Lawrence Livermore Loops [21], a set of kernels
         taken from real floating point extensive programs. Some of these
         loops are vectorizable, but since we don't deal with vector
         processors here, this doesn't matter. For this test, LLL was
         adapted from the FORTRAN original [20] to Turbo Pascal 6.0. By
         variable overlaying (similar to FORTRAN's EQUIVALENCE statement)
         memory allocation for data was reduced to 64 kB, so all data fits
         into a single 64 kB segment. The older version of LLL is used here
         which contains 14 loops. There also exists a newer, more elaborate
         version consisting of 24 kernels. The kernels in LLL exercise only
         multiplication and addition. The MFLOPS rate reported is the
         average of the MFLOPS rate of all 14 kernels as reported by the
         LLL program. LLL and Whetstone results (see below) are reported
         as returned by my COMPTEST test program in which they have been
         included as a measure of coprocessor/FPU performance. COMPTEST
         has been compiled under Turbo Pascal 6.0 with all 'optimizations'
         on and using my own run-time library, which gives higher perfor-
         mance than the one included with TP 6.0. My library is available
         as TPL60N16.ZIP from garbo.uwasa.fi and ftp-sites that mirror
         this site.

         Linpack [5] is a well known floating-point benchmark that also
         heavily exercises the memory system. Linpack operates on large
         matrices and takes up about 570 kB in the version used for this
         test. This is about the largest program size a pure DOS system
         can accommodate. Linpack was originally designed to estimate
         performance of BLAS, a library of FORTRAN subroutines that
         handles various vector and matrix operations. It uses two routines
         from BLAS which are thought to be typical of the matrix operations
         used by BLAS. Both routines only use addition/subtraction and
         multiplication. The FORTRAN source code for Linpack can be
         obtained from the automated mail server netlib@ornl.gov. Linpack
         was compiled using MS FORTRAN 5.0 in the HUGE memory model (which
         can handle data structures larger than 64 kB) and with compiler
         switches set for maximum optimization. Linpack repeatedly does
         the same test. The number reported is the maximum MFLOPS rate
         returned by Linpack. Linpack MFLOPS ratings for a great number
         of machines are contained in [6]. This PostScript document is
         also available from netlib@ornl.gov.

         Whetstone [2,3,4] is a synthetic benchmark based upon statistics
         collected about the use of certain control and data structures
         in programs written in high level languages. Based on these
         statistics, Whetstone tries to mirror a 'typical' HLL program.
         Whetstone performance is expressed by how many theoretical
         'whetstone' instructions are executed per second. It was
         originally implemented in ALGOL. Unlike PEAKFLOP, LLL, and
         Linpack, Whetstone not only uses addition and multiplication
         but exercises all basic arithmetic operations as well as some
         transcendental functions. Whetstone performance depends on the
         speed of the coprocessor as well as on the speed of the CPU,
         while PEAKFLOP, LLL, and Linpack place a heavier burden on the
         coprocessor/FPU. There exists an old and a new version of
         Whetstone. Note that results from the two versions can differ
         by as much as 20% for the same test configuration. For this
         test, the new version in Pascal from [3] was used. It was
         compiled with Turbo Pascal 6.0 and my own library (see above)
         with all 'optimizations' on.

         SAVAGE tests the performance of transcendental function
         evaluation. It is basically a small loop in which the sin,
         cos, arctan, ln, exp, and sqrt functions are combined in a
         single expression. While sin, cos, arctan, and sqrt can be
         evaluated directly with a single 387 coprocessor instruction
         each, ln and exp need additional preprocessing for argument
         reduction and result conversion. According to [14], the Savage
         benchmark was devised by Bill Savage, and is distributed by:
         The Wohl Engine Company, Ltd., 8200 Shore Front Parkway,
         Rockaway Beach, NY 11693, USA. Usually, Savage is programmed
         to make 250,000 passes though the loop. Here only 10,000 loops
         are executed for a total of 60,000 transcendental function
         evaluations. The result is expressed in function evaluations
         per second. SAVAGE source code was taken from [7] and compiled
         with Turbo Pascal 6.0 and my own run-time library (see above).


         Benchmark results for 387 coprocessors, coprocessor emulators and
         the Intel RapidCAD and Intel 486 CPUs.


         33.3 MHz       PEAKFLOP TRNSFORM LLL     Linpack Whetstone Savage
                        MFLOPS   MFLOPS   MFLOPS  MFLOPS  kWhet/sec Func/sec

         Intel 386DX +
         EM87 emulator  0.0070   0.0040   0.0050  0.0050         26      418 ##
         Franke387 emu. 0.0307   0.0246   0.0194  0.0179        137     3335 $$
         TP/MS-FORT emu 0.0263   0.0227   0.0167  0.0158        133     3160 %%
         Intel 387DX    0.7647   0.6004   0.3283  0.2676       2046    43860
         ULSI 83C87     1.0097   0.6609   0.3239  0.2598       2089    47431
         IIT 3C87       0.8455   0.5957   0.3198  0.2646       2203    49020
         IIT 3C87,4X4   0.8455   1.4334   0.3198  0.2646       2203    49020 ??
         C&T 38700      0.9455   0.6907   0.3338  0.2700       2376    62565
         Cyrix 387+     0.9286   0.6806   0.3293  0.2669       2435    66890
         Cyrix EMC87    1.0400   0.6628   0.3352  0.2808       2540    71685 //

         Intel RapidCAD 1.8572   1.5798   0.6072  0.4533       3953    72464
         Intel 486      2.0800   1.7779   0.9387  0.6682       5143    82192



         40 MHz         PEAKFLOP TRNSFORM LLL     Linpack Whetstone Savage
                        MFLOPS   MFLOPS   MFLOPS  MFLOPS  kWhet/sec Func/sec

         Intel 386DX +
         EM87 emulator  0.0084   0.0080   0.0060  0.0060         31      502 ##
         Franke387 emu. 0.0369   0.0295   0.0233  0.0215        164     4002 $$
         TP/MS-FORT emu 0.0316   0.0273   0.0200  0.0190        160     3794 %%
         Intel 387DX    0.9204   0.7212   0.3932  0.3211       2428    52677
         ULSI 83C87     1.2093   0.7936   0.3890  0.3120       2528    56926
         IIT 3C87       1.0196   0.7145   0.3834  0.3179       2663    58766
         IIT 3C87,4x4   1.0196   1.7244   0.3834  0.3179       2663    58766 ??
         C&T 38700      1.0722   0.7908   0.4007  0.3222       2837    74906
         Cyrix 387+     1.1305   0.8162   0.3945  0.3208       2946    80322
         Cyrix EMC87    1.2381   0.7963   0.4025  0.3324       3061    86083 //

         Intel RapidCAD 2.2128   1.8931   0.7377  0.5432       4810    86957
         Intel 486DX    2.4762   2.1335   1.1110  0.8204       6195    98522



         The Cyrix 486DLC is the latest entry into the market of 386DX
         replacements. It features a 486SX compatible instruction set, a 1
         kByte on-chip cache, and a 16x16 bit hardware multiplier. The RISC
         like execution unit of the 486DLC executes many instructions in a
         single clock cycle. The hardware multiplier multiplies 16-bit
         quantities in 3 clock cycles, as compared to 12-25 on the Intel 386DX.
         It is especially useful in address calculations (code from
         non-optimizing compilers may contain many MUL instructions for array
         access) and for software floating-point arithmetic (e.g. coprocessor
         emulators). The on-chip cache is a unified data/instruction write-thru
         cache and can be configured as either a direct mapped or 2-way set
         associative cache. For compatibility reasons, it is disabled after
         a processor reset and must be enabled with the help of a little
         program provided by Cyrix. The cache helps the 486DLC to overcome the
         limitations of the reltively slow 386 bus interface, although its hit
         rate is only ~50% or so. The Cyrix 486DLC is the 386DX replacement
         with the highest integer performance. With the internal cache enabled,
         integer performance of the 486DLC can be up to 80% higher compared
         with an Intel 386DX at the same clock frequency, with the average
         speed gain for integer applications being 35%. Enabling the internal
         cache provides about 5-15% more performance than having the cache
         disabled for integer *and* floating-point applications. Floating-point
         applications are accelerated by about 15%-30% if the Cyrix 486DLC with
         cache enabled is used instead of the Intel 386DX. Cyrix has defined
         some additional cache control signals for some of the 486DLC pins.
         These improve communication between the on-chip cache and an external
         cache. Current 386 systems ignore these signals, since they are not
         defined for the Intel 386DX. However, future systems designed with
         the 486DLC in mind may take advantage of them. The 486DLC on-chip
         cache allows for up to four non-cacheable regions, which are
         particularly useful if your system has memory mapped peripherals
         (e.g. Weitek coprocessor). In existing 386 systems, DMA transfers
         (e.g. by a SCSI controller or a soundcard) may cause the internal
         cache of the 486DLC to be flushed, since no other means exist to
         enforce consistency between the cache contents and main memory.
         This reduces the performance of the 486DLC in these cases. Power
         consumption of the 40 MHz 486DLC is typically 2800 mW. The 486DLC
         sells for ~115 US$ for the 33 MHz version, according the German
         distributor.


         33.3 MHz       PEAKFLOP TRNSFORM LLL     Linpack Whetstone Savage
                        MFLOPS   MFLOPS   MFLOPS  MFLOPS  kWhet/sec Func/sec
         Cyrix 486DLC
         (cache off) +
         EM87 emulator  0.0089   0.0082   0.0062  0.0063         31      472 ##
         Franke387 emu. 0.0402   0.0324   0.0258  0.0240        184     4807 $$
         TP/MS-FORT emu 0.0346   0.0288   0.0206  0.0212        173     4401 %%
         Intel 387DX    0.8455   0.6552   0.3659  0.3033       2249    48780
         ULSI 83C87     1.1818   0.7543   0.3752  0.3026       2381    53476
         IIT 3C87       0.9541   0.6609   0.3653  0.3036       2476    55814
         IIT 3C87,4X4   0.9541   1.4988   0.3653  0.3036       2476    55814 ??
         C&T 38700      1.1183   0.7644   0.3796  0.3087       2703    73350
         Cyrix 387+     1.1305   0.7445   0.3727  0.3060       2731    81967
         Cyrix EMC87    1.2236   0.7593   0.3823  0.3144       2908    88889 //

         Intel RapidCAD 1.8572   1.5798   0.6072  0.4533       3953    72464
         Intel 486      2.0800   1.7779   0.9387  0.6682       5143    82192



         40.0 MHz       PEAKFLOP TRNSFORM LLL     Linpack Whetstone Savage
                        MFLOPS   MFLOPS   MFLOPS  MFLOPS  kWhet/sec Func/sec
         Cyrix 486DLC
         (cache off) +
         EM87 emulator  0.0107   0.0098   0.0075  0.0075         37      567 ##
         Franke387 emu. 0.0488   0.0392   0.0311  0.0288        223     5808 $$
         TP/MS-FORT emu 0.0416   0.0345   0.0246  0.0253        208     5284 %%
         Intel 387DX    1.0196   0.7880   0.4375  0.3644       2712    58479
         ULSI 83C87     1.4247   0.9064   0.4506  0.3630       2868    64171
         IIT 3C87       1.1556   0.7963   0.4399  0.3611       2988    66964
         IIT 3C87,4X4   1.1556   1.7916   0.4399  0.3611       2988    66964 ??
         C&T 38700      1.3333   0.9210   0.4548  0.3708       3254    88106
         Cyrix 387+     1.3507   0.8958   0.4477  0.3754       3297    98361
         Cyrix EMC87    1.4648   0.9136   0.4548  0.3773       3505   106572 //

         Intel RapidCAD 2.2128   1.8931   0.7377  0.5432       4810    86957
         Intel 486DX    2.4762   2.1335   1.1110  0.8204       6195    98522



         33.3 MHz       PEAKFLOP TRNSFORM LLL     Linpack Whetstone Savage
                        MFLOPS   MFLOPS   MFLOPS  MFLOPS  kWhet/sec Func/sec
         Cyrix 486DLC
         (cache on) +
         EM87 emulator  0.0099   0.0089   0.0068  0.0069         35      550 ##
         Franke387 emu. 0.0462   0.0362   0.0288  0.0265        205     5445 $$
         TP/MS-FORT emu 0.0410   0.0330   0.0234  0.0241        198     5339 %%
         Intel 387DX    0.8525   0.6552   0.3941  0.3279       2332    49834
         ULSI 83C87     1.2093   0.7543   0.4068  0.3270       2478    57197
         IIT 3C87       0.9720   0.6609   0.3959  0.3295       2579    57252
         IIT 3C87,4X4   0.9720   1.5087   0.3959  0.3295       2579    57252 ??
         C&T 38700      1.1305   0.7644   0.4126  0.3343       2839    75949
         Cyrix 387+     1.1429   0.7445   0.4023  0.3310       2866    85349
         Cyrix EMC87    1.2381   0.7593   0.4150  0.3412       3051    93897 //

         Intel RapidCAD 1.8572   1.5798   0.6072  0.4533       3953    72464
         Intel 486      2.0800   1.7779   0.9387  0.6682       5143    82192



         40.0 MHz       PEAKFLOP TRNSFORM LLL     Linpack Whetstone Savage
                        MFLOPS   MFLOPS   MFLOPS  MFLOPS  kWhet/sec Func/sec
         Cyrix 486DLC
         (cache on) +
         EM87 emulator  0.0118   0.0107   0.0082  0.0082         42      659 ##
         Franke387 emu. 0.0565   0.0438   0.0350  0.0313        248     6585 $$
         TP/MS-FORT emu 0.0491   0.0395   0.0279  0.0296        238     6408 %%
         Intel 387DX    1.0297   0.7880   0.4748  0.3937       2801    59821
         ULSI 83C87     1.4445   0.9028   0.4891  0.3926       2976    65789
         IIT 3C87       1.1686   0.7963   0.4734  0.3916       3096    68729
         IIT 3C87,4X4   1.1686   1.8057   0.4734  0.3916       3096    68729 ??
         C&T 38700      1.3685   0.9173   0.4958  0.4012       3401    91185
         Cyrix 387+     1.3867   0.8958   0.4887  0.3962       3448   102564
         Cyrix EMC87    1.4857   0.9100   0.4959  0.4091       3676   112360 //

         Intel RapidCAD 2.2128   1.8931   0.7377  0.5432       4810    86957
         Intel 486DX    2.4762   2.1335   1.1110  0.8204       6195    98522




         The Chips&Technologies 38600DX is supposed to be 100% compatible to
         the Intel 386DX. Unlike AMD's Am386 CPUs, which use microcode that
         is identical to the Intel 386DX's microcode, the C&T 38600DX uses
         microcode developed by C&T using "clean-room" techniques. C&T even
         included the 386DX's "undocumented" LOADALL386 instruction into the
         instruction set to provide full compatibility with the 386DX. Some
         instructions execute faster on the 38600DX than on the 386DX, giving
         an average speedup of 5-10% for integer applications. C&T also
         produces a 38605DX CPU that includes a 512 byte instruction cache and
         provides a further performance increase. However, the 38605DX needs a
         bigger socket (144-pin PGA) and is therefore *not* pin-compatible with
         the 386DX. In my tests I noticed that the 38600DX has severe problems
         with the CPU-coprocessor communication,which causes the floating-point
         performance to drop below the level provided by the Intel 386DX/Intel
         387DX for most programs. This problem exists with all available 387
         compatible coprocessors (ULSI 83C87, IIT 3C87, Cyrix EMX87, Cyrix
         83D87, Cyrix 387+, C&T 38700, Intel 387DX). A net.aquaintance also did
         tests with the 38600DX and arrived at similar results. He contacted
         C&T and they said they were aware of the problem. Typical power
         consumption of the 40 MHz 38600DX is 1650 mW, which is less than the
         typical power consumption of the Intel 386DX at 33 MHz (2000 mW). The
         38600DX currently sells for ~US$ 80 for the 33 MHz version.

         Tests using the C&T 38600DX were run at 33 MHz, as a 40 MHz version
         was not available as of 09-17-92 and running the 33 MHz version at
         40 MHz locked up the machine frequently. Testing the Intel 387DX even
         locked up in the TRNSFORM benchmark when run at 33.3 MHz. It ran
         fine at 20 MHz, and the results were scaled to show performance at
         33 MHz.


         33.3 MHz       PEAKFLOP TRNSFORM LLL     Linpack Whetstone Savage
                        MFLOPS   MFLOPS   MFLOPS  MFLOPS  kWhet/sec Func/sec

         C&T 38600DX+
         Intel 387DX    0.7376   0.5620   0.3337  0.2636       2066    45489
         ULSI 83C87     0.5226   0.4690   0.3236  0.2654       2087    43228
         IIT 3C87       0.7879   0.5762   0.3397  0.2674       2263    51195
         IIT 3C87,4X4   0.7879   0.6181   0.3397  0.2674       2263    51195 ??
         C&T 38700      0.5977   0.5572   0.3463  0.2681       2338    63966
         Cyrix 387+     0.5896   0.5508   0.3438  0.2673       2375    66741

         Intel RapidCAD 1.8572   1.5798   0.6072  0.4533       3953    72464
         Intel 486      2.0800   1.7779   0.9387  0.6682       5143    82192




         For comparison:

                        PEAKFLOP TRNSFORM LLL     Linpack Whetstone Savage
                        MFLOPS   MFLOPS   MFLOPS  MFLOPS  kWhet/sec Func/sec

         i486DX2-66     4.1601   3.4227   1.6531  1.3010      10655   163934
         i486DX2-50     3.0589   2.6665   1.2537  0.9744       7962   123203
         i387, 20 MHz   0.2253   0.3271   0.1434  0.1171        952    21739 ++
         i387DX, 20 MHz 0.3567   0.4444   0.1484  0.1161       1034    24155 &&
         i80287, 5 MHz  0.0281   0.0310   0.0242  0.0222        150     3261 !!
         i8087,9.54 MHz 0.0636   0.0705   0.0321  0.0219        234     5782 **




         HW configuration for test of 387 coprocessors with C&T 38600DX, Intel
         386DX, Cyrix 486DLC, and Intel RapidCAD:
         System A: Motherboard with Forex chip set, 128 kB CPU Cache, 8 MB RAM

         HW configuration for test of 486 FPU (extra fan for 40 MHz operation):
         System B: Motherboard with SIS chip set, 256 kB CPU Cache, 8 MB RAM


         ## EM87 V1.2 by Ron Kimball is a public domain coprocessor emulator
            that loads as a TSR. It uses INT 7 traps emitted by 80286, 80386,
            or 486SX systems with no coprocessor upon encountering coprocessor
            instructions to catch coprocessor instructions and emulate them.
            Whetstone and Savage benchmarks for this test were compiled
            with the original TP 6.0 library, as EM87 chokes on the 387
            specific FSIN and FCOS instructions used in my own library if
            a 387 is detected. Obviously EM87 identifies itself as a 387,
            but has no support for 387 specific instructions.
         $$ Franke387 is a commercial 387 emulator that is also available in
            a shareware version. For this test, shareware version V2.4 was
            used. Franke387 unlike many other emulators supports all 387
            instructions. It is loaded as a device driver and uses INT 7
            to trap coprocessor instructions.
         %% These benchmarks were run using the built-in coprocessor emulators
            of the TP 6.0 and the MS FORTRAN 5.0 run-time libraries by forcing
            the libraries into not using a coprocessor by using the environment
            settings NO87=NC and 87=N.
         ?? The 3C87 specific F4X4 instruction was used in the vector trans-
            formation benchmark.
         // The EMC87 was used in the 387 compatible mode only. The faster
            memory-mapped mode was *not* used. Times should therefore be
            identical to the Cyrix 83D87.
         ++ Older motherboard with no chip set (discrete logic), no CPU cache,
            16 MB RAM
         && System A, CPU cache disabled via extended set-up, turbo-switch
            set to half speed (that is, 20 MHz)
         !! 80386 @ 20 MHz / Intel 80287 @ 5 MHz, no CPU cache, 4 MB RAM
            due to the fast CPU used here, performance figures are somewhat
            higher than can be expected for a 80286/287 combination, except
            for the PEAKFLOP benchmark, which is basically coprocessor limited
         ** 8086/8087 system with 640 kB RAM



         Since neither a Weitek coprocessor nor a compiler that generates
         code for the Weitek chips were available, performance data for
         the Weitek Abacus is given here according to [31,32] and scaled to
         show performance of a 33 MHz system. The benchmarks were compiled
         using highly optimizing 32-bit compilers.

                              Single Prec.     Double Prec.    Double Prec.

                              3167    4167     3167    4167      387    486

         Linpack MFLOPS        1.8     5.0      0.8     3.2      0.4    1.6
         Whetstone kWhet/sec  7470   22700     4900   14000     3290  12300

         Note that for the Intel coprocessors, running programs in single
         vs. double precision doesn't provide much of an performance advantage
         since all internal calculations are always done in extended precision.
         Using Weitek coprocessors however, performance nearly doubles when
         switching from double to single precision. For double precision
         calculations using only basic arithmetic, the Weitek Abacus can
         provide performance at twice the level of the respective Intel
         coprocessor (387/486) clocked at the same speed at most.


         Comparison of floating point performance [30,32]

                                      single precision

                        Weitek 4167-33  Intel 486-33 Intel 486DX2-66

         LINPACK MFLOPS            5.0           1.8             3.5
         kWhetstones/sec         22700         12700           25500


                                      double precision

                        Weitek 4167-33  Intel 486-33 Intel 486DX2-66

         LINPACK MFLOPS            3.5           1.6             3.1
         kWhetstones/sec         14000         12300           24700



         Speed of various coprocessor instructions measured in clock cycles
         as measured with my program 87TIMES. Error is +/- one clock cycle,
         except for the Intel 80287. Times for the 80287 were determined on
         a system with a 20 MHz 80386 and a 5 MHz Intel 80287. Therefore,
         times may differ from a genuine 80286/287 system, especially for
         those instructions that access an operand in memory. Since the
         times are stated as the number of coprocessor clock cycles used,
         the faster 386 which can execute four clock cycles where the 80287
         executes one clock cycle may decrease memory access times as seen
         by the coprocessor. The CPU used in testing the 387 coprocessors was
         an Intel 386DX. Note that due to the improved coprocessor interface
         of the Cyrix 486DL the execution time of most coprocessor instructions
         drops by 2-3 clock cycles when used with this CPU.


                         Intel  Intel  Cyrix Cyrix C&T   ULSI  IIT  Intel Intel
                         i486 RapidCAD 83D87 387+  38700 83C87 3C87 387DX 80387

                    FLD1    4      3     14  14     14    14    18    24    23    26
                    FLDZ    4      3     14  14     14    14    18    24    23    31
                   FLDPI    7      8     14  14     15    14    18    24    38    45
                  FLDLG2    7      8     14  19     14    14    18    24    33    45
                  FLDL2T    7      8     14  14     14    14    19    24    38    45
                  FLDL2E    7      8     14  14     14    14    19    24    38    45
                  FLDLN2    7      8     14  14     14    14    19    24    38    45
               FLD ST(0)    4      4     14  14     14    14    14    24    20    21
               FST ST(1)    3      4     14  14     14    14    14    19    18    22
              FSTP ST(0)    4      4     14  14     14    14    15    19    19    22
              FSTP ST(1)    4      4     15  14     15    14    15    19    20    22
               FLD ST(1)    4      4     14  14     14    14    14    24    18    21
              FXCH ST(1)    4      4     14  14     20    14    19    24    24    27
             FILD [Word]   12     16     33  32     37    32    42    38    47    62
            FILD [DWord]    8     11     26  21     26    21    32    28    35    45
            FILD [QWord]    9     15     30  25     30    25    36    32    34    54
             FLD [DWord]    3      5     26  26     26    21    23    28    20    25
             FLD [QWord]    3      7     30  30     30    25    27    32    24    35
             FLD [TByte]    5     11     46  46     46    46    46    47    46    57
            FBLD [TByte]   83     90     66  61     86   106   146   197    71   278
             FIST [Word]   31     31     37  36     40    37    42    51    69    90
            FIST [DWord]   29     30     35  34     40    35    40    49    66    84
             FST [DWord]    7      7     35  32     37    32    40    33    37    40
             FST [QWord]    8      9     43  38     43    39    47    40    45    51
            FISTP [Word]   32     32     42  41     40    37    43    46    70    90
           FISTP [DWord]   31     31     40  39     40    35    41    50    67    87
           FISTP [QWord]   29     29     44  41     44    42    48    56    73    92
            FSTP [DWord]    8      8     38  37     36    32    41    35    38    43
            FSTP [QWord]    9      9     46  43     43    39    48    42    46    49
            FSTP [TByte]    8      8     50  46     45    49    50    48    53    58
           FBSTP [TByte]  170    172     98  93     98   114   129   218   144   533
                   FINIT   17     31     15  15     16    15    15    16    16    25
                   FCLEX    7     20     15  16     16    16    16    16    16    25
                    FCHS    7      8     14  14     15    14    14    19    30    33
                    FABS    5      5     14  14     15    14    14    19    30    33
                    FXAM   12     13     14  14     15    14    14    19    39    43
                    FTST    5      5     19  19     25    14    24    24    34    38
                  FSTENV   67     82    125 117    125   124   132   124   159   165
                  FLDENV   44     59    106 106    106   112   120   106   119   129
                   FSAVE  181    169    355 357    355   374   361   376   469   511
                  FRSTOR  130    203    358 358    358   385   372   371   420   456
             FSTSW [mem]    4      5     14  13     14    14    14    14    14    17
                FSTSW AX    3      4     12  10     12    11    11    11    11    14
             FSTCW [mem]    4      5     14  12     14    13    13    13    14    18
             FLDCW [mem]    4     11     26  25     26    31    32    27    32    36
           FADD ST,ST(0)    8      9     19  19     20    19    19    24    24    32
           FADD ST,ST(1)    9      9     19  19     20    19    18    24    20    32
           FADD ST(1),ST   10     10     19  19     20    19    18    24    24    37
          FADDP ST(1),ST   11     11     19  19     19    19    16    24    25    37
            FADD [DWord]    9     10     25  27     28    22    23    23    21    34
            FADD [QWord]    9     10     32  31     32    26    27    27    25    38
            FIADD [Word]   20     21     34  33     34    33    40    40    52    80
           FIADD [DWord]   20     21     27  27     28    27    30    30    37    61
           FSUB ST(1),ST   10     10     19  19     20    19    19    24    24    38
          FSUBR ST(1),ST    9     10     19  19     22    19    19    24    27    38
         FSUBRP ST(1),ST   10     10     19  19     19    22    20    24    25    38
            FSUB [DWord]   11     12     27  27     28    27    23    29    27    32
            FSUB [QWord]   11     12     32  31     32    31    27    33    26    44
            FISUB [Word]   21     21     34  33     34    34    40    40    52    80
           FISUB [DWord]   21     22     27  27     28    27    29    30    40    60
           FMUL ST,ST(1)   16     17     19  24     25    24    24    29    38    57
           FMUL ST(1),ST   16     17     19  24     24    24    24    29    40    62
          FMULP ST(1),ST   17     17     19  24     24    24    25    29    40    58
            FIMUL [Word]   22     23     40  39     40    37    46    46    52    80
           FIMUL [DWord]   22     23     27  28     28    27    36    35    45    68
            FMUL [DWord]   11     12     27  27     28    27    28    29    25    45
            FMUL [QWord]   14     15     32  31     32    31    32    33    37    61
           FDIV ST,ST(0)   73     74     26  25     40    59    54    54    89   100
           FDIV ST,ST(1)   73     74     36  34     45    59    54    54    77   100
           FDIV ST(1),ST   73     74     36  39     45    59    55    54    78   102
          FDIVR ST(1),ST   73     74     36  34     45    59    54    54    77   102
         FDIVRP ST(1),ST   73     74     36  34     44    59    55    54    76   106
            FIDIV [Word]   84     85     52  51     58    75    76    76   105   141
           FIDIV [DWord]   84     85     45  45     46    65    65    65   101   123
            FDIV [DWord]   73     74     45  45     46    63    56    59    77   101
            FDIV [QWord]   73     74     50  49     50    67    60    63    78   103
             FSQRT (0.0)   25     25     19  19     19    14    19    24    29    37
             FSQRT (1.0)   83     84     36  39     74    54    89    59   109   132
             FSQRT (L2T)   86     87     36  39     74    54    89    59   104   137
           FXTRACT (L2T)   17     17     19  19     19    19    28    79    53    72
           FSCALE (PI,5)   30     30     36  19     24    24    49    79    59    82
            FRNDINT (PI)   31     31     19  19     29    24    34    29    49    82
           FPREM (99,PI)   58     59     54  54     99    44    54    49    79    96
           FPREM1(99,PI)   90     91     54  59     99    44    59    54   104   121
                    FCOM    5      6     15  14     20    19    25    19    29    32
                   FCOMP    6      6     15  14     19    19    25    19    30    33
                  FCOMPP    7      7     15  14     19    19    25    19    31    40
            FICOM [Word]   16     17     34  33     34    33    46    34    58    76
           FICOM [DWord]   16     16     21  21     28    21    35    23    45    57
            FCOM [DWord]    5      6     21  21     28    22    23    23    27    34
            FCOM [QWord]    5      8     27  25     32    25    27    27    31    39
              FSIN (0.0)   24     24     14  14     99    14    19    24    39    43
              FSIN (1.0)  310    313    114 119    164   144   494   219   509   596
               FSIN (PI)   88     89    118 119    189    64    64   214   134   152
              FSIN (LG2)  292    295     72  79     89   139   454   184   449   531
              FSIN (L2T)  299    302    123 124    179   164   469   214   454   536
              FCOS (0.0)   24     24     19  19    159    14    19    24    34    42
              FCOS (1.0)  302    305     84  89    104   139   489   214   459   547
               FCOS (PI)   88     89    154 154    254    64    64   224   199   232
              FCOS (LG2)  300    303    108 109    149   139   454   194   504   583
              FCOS (L2T)  307    310    159 159    239   164   469   224   509   601
           FSINCOS (0.0)   25     25     14  19     19    19    18    34    38    55
           FSINCOS (1.0)  353    356    124 129    174   254   493   419   538   636
            FSINCOS (PI)  105    106    162 164    263    79    68   424   228   277
           FSINCOS (LG2)  340    343    119 119    159   249   458   359   533   627
           FSINCOS (L2T)  347    350    168 169    248   274   473   424   538   646
             FPTAN (0.0)   25     25     14  19     19    19    18    29    38    46
             FPTAN (1.0)  266    269    119 119    149   184   538   309   323   396
              FPTAN (PI)  145    146    134 134    228   104   108   304   168   211
             FPTAN (LG2)  244    246     94  94    129   179   498   274   298   363
             FPTAN (L2T)  247    249    139 139    219   204   513   304   298   365
            FPATAN (0.0)   38     39     19  19     24    19    20    29    95    93
            FPATAN (1.0)  294    298    124 124    159    29   375   604   360   433
             FPATAN (PI)  304    308    139 144    188   279   360   424   375   472
            FPATAN (LG2)  290    293    128 129    154   269   365   379   375   448
            FPATAN (L2T)  304    308    144 144    189   274   359   424   375   468
             F2XM1 (0.0)   25     25     14  19     14    14    19    24    34    37
             F2XM1 (LN2)  209    211     89  89    119   169   394   284   299   348
             F2XM1 (LG2)  204    206     78  79    104   159   379   284   294   337
             FYL2X (1.0)   60     61     36  34     39    24    75    94   115   127
              FYL2X (PI)  294    297    108 109    163   249   450   359   395   504
             FYL2X (LG2)  311    314    108 109    159   249   460   339   410   518
             FYL2X (L2T)  293    296    108 109    164   249   439   359   390   501
           FYL2XP1 (LG2)  334    337     99  99    169   234   460   284   435   538



                                         80386 +   80386 +  80386 +
                            Intel Intel  Franke387 TP 6.0   EM87
                            8087  80287  Emulator  Emulator Emulator

              FSTP ST(0)    26     54     507       358      2115
                    FLD1    26     55     481       422      1626
                    FLDZ    21     53     480       416      1646
                   FLDPI    26     55     486       443      1626
                  FLDLG2    26     56     486       423      1626
                  FLDL2T    26     55     486       440      1626
                  FLDL2E    26     53     486       423      1626
                  FLDLN2    26     55     486       441      1626
               FLD ST(0)    31     55     493       362      1851
               FST ST(1)    26     54     489       355      1931
              FSTP ST(1)    21     55     507       356      2116
               FLD ST(1)    26     55     493       362      1852
              FXCH ST(1)    21     57     497       486      2187
             FILD [Word]    58     90     667       712      2259
            FILD [DWord]    64     74     608       812      2164
            FILD [QWord]    74     93     652       707      2971
             FLD [DWord]    49     44     633       473      2077
             FLD [QWord]    54     57     641       524      2336
             FLD [TByte]    59     45     607       492      2063
            FBLD [TByte]   309    310    2019      1512     17827
             FIST [Word]    79     72     854       766      2418
            FIST [DWord]    84     80     865       518      2325
             FST [DWord]    89     85     686       441      2200
             FST [QWord]    99     92     703       516      2481
            FISTP [Word]    79     80     864       794      2620
           FISTP [DWord]    79     81     879       541      2523
           FISTP [QWord]    88     75     904       916      3226
            FSTP [DWord]    89     75     713       467      2400
            FSTP [QWord]    93     72     732       538      2678
            FSTP [TByte]    49     21     685       467      2124
           FBSTP [TByte]   528    472    3305      1555     27013
                   FINIT    11     10     742       641      1369
                   FCLEX    11     10     440       323       912
                    FCHS    21     54     460       354      1744
                    FABS    21     54     456       349      1738
                    FXAM    21     54     481       380      1551
                    FTST    51     75     585       386      2721
                  FSTENV    54     57     928       519      2104
                  FLDENV    48     50    1125       450      1631
                   FSAVE   214    244    1949       976      2749
                  FRSTOR   209    227    2182       657      2225
             FSTSW [mem]    28     10     516       401      1189
                FSTSW AX   N/A     55     451       N/A       N/A
             FSTCW [mem]    28     10     506       359      1167
             FLDCW [mem]    19     47     524       437      1584
           FADD ST,ST(0)    86    128     643       706      2805
           FADD ST,ST(1)    85    116     707       808      3093
           FADD ST(1),ST    92    131     664       812      3146
          FADDP ST(1),ST    92    129     704       799      3143
            FADD [DWord]   105    122     874       969      3139
            FADD [QWord]   115    122     888      1021      3396
            FIADD [Word]   115    122     940      1211      3330
           FIADD [DWord]   125    122     882      1297      3215
           FSUB ST(1),ST    88    130     738       817      3156
          FSUBR ST(1),ST    96    132     740       868      3004
         FSUBRP ST(1),ST    99    132     733       805      3301
            FSUB [DWord]   119    122     918      1018      3127
            FSUB [QWord]   129    123     932      1070      3632
            FISUB [Word]   115    123     977      1081      3802
           FISUB [DWord]   125    125     940       980      4161
           FMUL ST,ST(1)   145    151     810      1368      3924
           FMUL ST(1),ST   145    151     817      1377      3962
          FMULP ST(1),ST   148    168     840      1365      4164
            FIMUL [Word]   132    151    1039      1517      4039
           FIMUL [DWord]   141    151     980      1643      3976
            FMUL [DWord]   125    123     948      1480      3445
            FMUL [QWord]   175    192     991      1602      4416
           FDIV ST,ST(0)   201    207     726      1536      9789
           FDIV ST,ST(1)   203    218     808      1658     10332
           FDIV ST(1),ST   207    214     825      1655     10342
          FDIVR ST(1),ST   201    206     819      1806     10213
         FDIVRP ST(1),ST   201    205     845      1803     10409
            FIDIV [Word]   237    227     980      1779     11225
           FIDIV [DWord]   246    227     944      1680     11572
            FDIV [DWord]   229    226     893      1722     10577
            FDIV [QWord]   236    227     993      1777     10829
             FSQRT (0.0)    21     57     512       382      1755
             FSQRT (1.0)   186    206    1106      2504     37836
             FSQRT (L2T)   186    207    1398      2467     37925
           FXTRACT (L2T)    51     56     726       571      3326
           FSCALE (PI,5)    41     56     817       443      3194
            FRNDINT (PI)    51     58     808       800      7092
           FPREM (99,PI)    81    131    1696       941      4098
           FPREM1(99,PI)   N/A    N/A    1625       N/A       N/A
                    FCOM    56     75     582       483      2799
                   FCOMP    61     92     616       485      2983
                  FCOMPP    61     90     661       476      3198
            FICOM [Word]    79     77     808       861      3654
           FICOM [DWord]    89     77     750       964      3684
            FCOM [DWord]    74     75     741       625      3643
            FCOM [QWord]    74     76     754       667      3771
              FSIN (0.0)   N/A    N/A     639       N/A       N/A
              FSIN (1.0)   N/A    N/A    4640       N/A       N/A
               FSIN (PI)   N/A    N/A    2488       N/A       N/A
              FSIN (LG2)   N/A    N/A    3911       N/A       N/A
              FSIN (L2T)   N/A    N/A    3767       N/A       N/A
              FCOS (0.0)   N/A    N/A     740       N/A       N/A
              FCOS (1.0)   N/A    N/A    4777       N/A       N/A
               FCOS (PI)   N/A    N/A    2557       N/A       N/A
              FCOS (LG2)   N/A    N/A    4176       N/A       N/A
              FCOS (L2T)   N/A    N/A    3905       N/A       N/A
           FSINCOS (0.0)   N/A    N/A     714       N/A       N/A
           FSINCOS (1.0)   N/A    N/A    6049       N/A       N/A
            FSINCOS (PI)   N/A    N/A    4091       N/A       N/A
           FSINCOS (LG2)   N/A    N/A    5640       N/A       N/A
           FSINCOS (L2T)   N/A    N/A    5405       N/A       N/A
             FPTAN (0.0)    41     58     752      8381      2324
             FPTAN (1.0)   581    582    6366     10817     29824
              FPTAN (PI)   606    587    4388     12410      2300
             FPTAN (LG2)   516    513    5939     12502     26770
             FPTAN (L2T)   576    586    5723     12483      2301
            FPATAN (0.0)    41     55     616      1208     10578
            FPATAN (1.0)   736    736    1426     13446     34208
             FPATAN (PI)   206    207   12835     13305     46903
            FPATAN (LG2)   756    736   12490     13319     41312
            FPATAN (L2T)   206    204   12922     13364     50149
             F2XM1 (0.0)    16     56     563       723      1722
             F2XM1 (LN2)   631    624    4178     11070     33823
             F2XM1 (LG2)   611    585    4798     11116     32163
             FYL2X (1.0)    56     57     961      1214      4327
              FYL2X (PI)   946    961    8987     12858     40148
             FYL2X (LG2)  1081   1038    8933     12748     46821
             FYL2X (L2T)   926    886    8982     12712     38986
           FYL2XP1 (LG2)  1026   1037   10485     11867     44708


         The Weitek 3167 and 4167 coprocessors only implement the basic
         arithmetic functions (add, subtract, multiply, divide, square
         root) in hardware. Transcendental functions are implemented
         by means of a software library supplied by Weitek that uses
         the Weitek hardware to approximate the transcendental functions
         with polynomial and rational approximations. The clock cycle
         timings for the transcendental functions are average values,
         since execution time differs with the value of argument. The
         speed of transcendental functions for the 4167 is estimated
         based on the numbers in [31,33], from which this timing
         information has been extracted.


         Execution time for floating-point operations in clock cycles on
         Weitek coprocessors

                  Single Precision         Double Precision

                  3167       4167          3167        4167

         ABS         3          2             3           2
         NEG         6          2             6           2
         ADD         6          2             6           2
         SUB         6          2             6           2
         SUBR        6          2             6           2
         MUL         6          2            10           3
         DIVR       38         17            66          31
         SQRT       60         17           118          31
         SIN       146        ~50           292        ~100
         COS       140        ~50           285        ~100
         TAN       188        ~60           340        ~110
         EXP       179        ~60           401        ~130
         LOG       171        ~60           365        ~120
         F->ASCII 1000        N/A          1700         N/A  //
         ASCII->F 1100        N/A          1800         N/A  //

         // rough average of the timings given for different numeric
            formats by Weitek. Note that these conversions routines
            do much more work than the FBLD and FBSTP instructions
            provided by the 80x87 coprocessors. FBLD and FBSTP are
            useful for conversion routines but quite a bit of additional
            code is need for this purpose.