If you have a Pentium 4 or clone processor that supports the SSE2 
extensions, then using these instructions can be faster.

The file sse2.mcs is provided as a plug-in alternative for ms86.mcs, and 
gccsse2.mcs is provided as an alternative for gcc386.mcs

Using the COMBA or KCM methods and these provided macros, PCs will execute 
big number code up to 60% faster. Ideal for a Pentium 4 based Crypto server. 
See kcmcomba.txt

It is the programmers responsibility to ensure that their hardware and their 
compiler supports SSE2 extensions.

Tested with latest Microsoft (use sse2.mcs) and GCC compilers (V3.3 or greater 
- use gccsse2.mcs)

The key instruction is PMULUDQ which multiplies two pairs of 32-bit numbers in 
a single instruction. Unfortunately trying to exploit this capability is very 
difficult. But even just using it for a single multiplication is faster than 
the standard x386 MUL instruction. However SSE2 instructions do not support a 
carry flag :(. But the PADDQ instruction adds 64-bit numbers.

Consider the following trick:-

The 64-bit result of a PMULUDQ is written to a 128-bit SSE2 register thus

< 32 bits >

+--------+---------+----------+-----------+
|        |         |          |           |
|00000000|000000000|   Hi     |     Lo    |
|        |         |          |           |
+--------+---------+----------+-----------+

<---------------- 128 bits --------------->


Now shuffle this (using PSHUFD) so it becomes


+--------+---------+----------+-----------+
|        |         |          |           |
|00000000|    Hi   |0000000000|     Lo    |
|        |         |          |           |
+--------+---------+----------+-----------+


Now accumulate (by simple addition) partial products like these 
(see makemcs.txt) in an SSE2 register, using the PADDQ instruction

+--------+---------+----------+-----------+
|        |         |          |           |
|00000CHi|  SumHi  |0000000CLo|   SumLo   |
|        |         |          |           |
+--------+---------+----------+-----------+


where CHi and CLo are accumulated carries from each half

At the bottom of each column of partial products, the sum for the column is 
SumLo, and the Carry for the next column is the sum of


+--------+---------+----------+-----------+
|        |         |          |           |
|   0    |    0    |0000000CHi|   SumHi   |
|        |         |          |           |
+--------+---------+----------+-----------+

and


+--------+---------+----------+-----------+
|        |         |          |           |
|   0    |    0    |    0     |00000000Clo|
|        |         |          |           |
+--------+---------+----------+-----------+


This can easily be achieved using the available shift instructions and PADDQ. 


