/home/dko/projects/mobilec/trunk/src/security/xyssl-0.7/include/xyssl/bn_asm.h

Go to the documentation of this file.
00001 /* SVN FILE INFO
00002  * $Revision: 174 $ : Last Committed Revision
00003  * $Date: 2008-06-24 10:50:29 -0700 (Tue, 24 Jun 2008) $ : Last Committed Date */
00027 #ifndef _BN_ASM_H
00028 #define _BN_ASM_H
00029 
00030 #if defined(__GNUC__)
00031 #if defined(__i386__)
00032 
00033 #define MULADDC_INIT                            \
00034     asm( "movl   %%ebx, %0      " : "=m" (t));  \
00035     asm( "movl   %0, %%esi      " :: "m" (s));  \
00036     asm( "movl   %0, %%edi      " :: "m" (d));  \
00037     asm( "movl   %0, %%ecx      " :: "m" (c));  \
00038     asm( "movl   %0, %%ebx      " :: "m" (b));
00039 
00040 #define MULADDC_CORE                            \
00041     asm( "lodsl                 " );            \
00042     asm( "mull   %ebx           " );            \
00043     asm( "addl   %ecx,   %eax   " );            \
00044     asm( "adcl   $0,     %edx   " );            \
00045     asm( "addl   (%edi), %eax   " );            \
00046     asm( "adcl   $0,     %edx   " );            \
00047     asm( "movl   %edx,   %ecx   " );            \
00048     asm( "stosl                 " );
00049 
00050 #define MULADDC_STOP                            \
00051     asm( "movl   %%ecx, %0      " : "=m" (c));  \
00052     asm( "movl   %%edi, %0      " : "=m" (d));  \
00053     asm( "movl   %%esi, %0      " : "=m" (s));  \
00054     asm( "movl   %0, %%ebx      " :: "m" (t) :  \
00055     "eax", "ecx", "edx", "esi", "edi" );
00056 
00057 #if defined(HAVE_SSE2)
00058 
00059 #define MULADDC_HUIT                            \
00060     asm( "movd     %ecx,     %mm1     " );      \
00061     asm( "movd     %ebx,     %mm0     " );      \
00062     asm( "movd     (%edi),   %mm3     " );      \
00063     asm( "paddq    %mm3,     %mm1     " );      \
00064     asm( "movd     (%esi),   %mm2     " );      \
00065     asm( "pmuludq  %mm0,     %mm2     " );      \
00066     asm( "movd     4(%esi),  %mm4     " );      \
00067     asm( "pmuludq  %mm0,     %mm4     " );      \
00068     asm( "movd     8(%esi),  %mm6     " );      \
00069     asm( "pmuludq  %mm0,     %mm6     " );      \
00070     asm( "movd     12(%esi), %mm7     " );      \
00071     asm( "pmuludq  %mm0,     %mm7     " );      \
00072     asm( "paddq    %mm2,     %mm1     " );      \
00073     asm( "movd     4(%edi),  %mm3     " );      \
00074     asm( "paddq    %mm4,     %mm3     " );      \
00075     asm( "movd     8(%edi),  %mm5     " );      \
00076     asm( "paddq    %mm6,     %mm5     " );      \
00077     asm( "movd     12(%edi), %mm4     " );      \
00078     asm( "paddq    %mm4,     %mm7     " );      \
00079     asm( "movd     %mm1,     (%edi)   " );      \
00080     asm( "movd     16(%esi), %mm2     " );      \
00081     asm( "pmuludq  %mm0,     %mm2     " );      \
00082     asm( "psrlq    $32,      %mm1     " );      \
00083     asm( "movd     20(%esi), %mm4     " );      \
00084     asm( "pmuludq  %mm0,     %mm4     " );      \
00085     asm( "paddq    %mm3,     %mm1     " );      \
00086     asm( "movd     24(%esi), %mm6     " );      \
00087     asm( "pmuludq  %mm0,     %mm6     " );      \
00088     asm( "movd     %mm1,     4(%edi)  " );      \
00089     asm( "psrlq    $32,      %mm1     " );      \
00090     asm( "movd     28(%esi), %mm3     " );      \
00091     asm( "pmuludq  %mm0,     %mm3     " );      \
00092     asm( "paddq    %mm5,     %mm1     " );      \
00093     asm( "movd     16(%edi), %mm5     " );      \
00094     asm( "paddq    %mm5,     %mm2     " );      \
00095     asm( "movd     %mm1,     8(%edi)  " );      \
00096     asm( "psrlq    $32,      %mm1     " );      \
00097     asm( "paddq    %mm7,     %mm1     " );      \
00098     asm( "movd     20(%edi), %mm5     " );      \
00099     asm( "paddq    %mm5,     %mm4     " );      \
00100     asm( "movd     %mm1,     12(%edi) " );      \
00101     asm( "psrlq    $32,      %mm1     " );      \
00102     asm( "paddq    %mm2,     %mm1     " );      \
00103     asm( "movd     24(%edi), %mm5     " );      \
00104     asm( "paddq    %mm5,     %mm6     " );      \
00105     asm( "movd     %mm1,     16(%edi) " );      \
00106     asm( "psrlq    $32,      %mm1     " );      \
00107     asm( "paddq    %mm4,     %mm1     " );      \
00108     asm( "movd     28(%edi), %mm5     " );      \
00109     asm( "paddq    %mm5,     %mm3     " );      \
00110     asm( "movd     %mm1,     20(%edi) " );      \
00111     asm( "psrlq    $32,      %mm1     " );      \
00112     asm( "paddq    %mm6,     %mm1     " );      \
00113     asm( "movd     %mm1,     24(%edi) " );      \
00114     asm( "psrlq    $32,      %mm1     " );      \
00115     asm( "paddq    %mm3,     %mm1     " );      \
00116     asm( "movd     %mm1,     28(%edi) " );      \
00117     asm( "addl     $32,      %edi     " );      \
00118     asm( "addl     $32,      %esi     " );      \
00119     asm( "psrlq    $32,      %mm1     " );      \
00120     asm( "movd     %mm1,     %ecx     " );
00121 
00122 #endif /* SSE2 */
00123 #endif /* i386 */
00124 
00125 #if defined(__amd64__) || defined (__x86_64__)
00126 
00127 #define MULADDC_INIT                            \
00128     asm( "movq   %0, %%rsi      " :: "m" (s));  \
00129     asm( "movq   %0, %%rdi      " :: "m" (d));  \
00130     asm( "movq   %0, %%rcx      " :: "m" (c));  \
00131     asm( "movq   %0, %%rbx      " :: "m" (b));  \
00132     asm( "xorq   %r8, %r8       " );
00133 
00134 #define MULADDC_CORE                            \
00135     asm( "movq  (%rsi),%rax     " );            \
00136     asm( "mulq   %rbx           " );            \
00137     asm( "addq   $8,   %rsi     " );            \
00138     asm( "addq   %rcx, %rax     " );            \
00139     asm( "movq   %r8,  %rcx     " );            \
00140     asm( "adcq   $0,   %rdx     " );            \
00141     asm( "nop                   " );            \
00142     asm( "addq   %rax, (%rdi)   " );            \
00143     asm( "adcq   %rdx, %rcx     " );            \
00144     asm( "addq   $8,   %rdi     " );
00145 
00146 #define MULADDC_STOP                            \
00147     asm( "movq   %%rcx, %0      " : "=m" (c));  \
00148     asm( "movq   %%rdi, %0      " : "=m" (d));  \
00149     asm( "movq   %%rsi, %0      " : "=m" (s) :: \
00150     "rax", "rcx", "rdx", "rbx", "rsi", "rdi", "r8" );
00151 
00152 #endif /* AMD64 */
00153 
00154 #if defined(__mc68020__) || defined(__mcpu32__)
00155 
00156 #define MULADDC_INIT                            \
00157     asm( "movl   %0, %%a2       " :: "m" (s));  \
00158     asm( "movl   %0, %%a3       " :: "m" (d));  \
00159     asm( "movl   %0, %%d3       " :: "m" (c));  \
00160     asm( "movl   %0, %%d2       " :: "m" (b));  \
00161     asm( "moveq  #0, %d0        " );
00162 
00163 #define MULADDC_CORE                            \
00164     asm( "movel  %a2@+, %d1     " );            \
00165     asm( "mulul  %d2, %d4:%d1   " );            \
00166     asm( "addl   %d3, %d1       " );            \
00167     asm( "addxl  %d0, %d4       " );            \
00168     asm( "moveq  #0,  %d3       " );            \
00169     asm( "addl   %d1, %a3@+     " );            \
00170     asm( "addxl  %d4, %d3       " );
00171 
00172 #define MULADDC_STOP                            \
00173     asm( "movl   %%d3, %0       " : "=m" (c));  \
00174     asm( "movl   %%a3, %0       " : "=m" (d));  \
00175     asm( "movl   %%a2, %0       " : "=m" (s) :: \
00176     "d0", "d1", "d2", "d3", "d4", "a2", "a3" );
00177 
00178 #define MULADDC_HUIT                            \
00179     asm( "movel  %a2@+, %d1     " );            \
00180     asm( "mulul  %d2, %d4:%d1   " );            \
00181     asm( "addxl  %d3, %d1       " );            \
00182     asm( "addxl  %d0, %d4       " );            \
00183     asm( "addl   %d1, %a3@+     " );            \
00184     asm( "movel  %a2@+, %d1     " );            \
00185     asm( "mulul  %d2, %d3:%d1   " );            \
00186     asm( "addxl  %d4, %d1       " );            \
00187     asm( "addxl  %d0, %d3       " );            \
00188     asm( "addl   %d1, %a3@+     " );            \
00189     asm( "movel  %a2@+, %d1     " );            \
00190     asm( "mulul  %d2, %d4:%d1   " );            \
00191     asm( "addxl  %d3, %d1       " );            \
00192     asm( "addxl  %d0, %d4       " );            \
00193     asm( "addl   %d1, %a3@+     " );            \
00194     asm( "movel  %a2@+, %d1     " );            \
00195     asm( "mulul  %d2, %d3:%d1   " );            \
00196     asm( "addxl  %d4, %d1       " );            \
00197     asm( "addxl  %d0, %d3       " );            \
00198     asm( "addl   %d1, %a3@+     " );            \
00199     asm( "movel  %a2@+, %d1     " );            \
00200     asm( "mulul  %d2, %d4:%d1   " );            \
00201     asm( "addxl  %d3, %d1       " );            \
00202     asm( "addxl  %d0, %d4       " );            \
00203     asm( "addl   %d1, %a3@+     " );            \
00204     asm( "movel  %a2@+, %d1     " );            \
00205     asm( "mulul  %d2, %d3:%d1   " );            \
00206     asm( "addxl  %d4, %d1       " );            \
00207     asm( "addxl  %d0, %d3       " );            \
00208     asm( "addl   %d1, %a3@+     " );            \
00209     asm( "movel  %a2@+, %d1     " );            \
00210     asm( "mulul  %d2, %d4:%d1   " );            \
00211     asm( "addxl  %d3, %d1       " );            \
00212     asm( "addxl  %d0, %d4       " );            \
00213     asm( "addl   %d1, %a3@+     " );            \
00214     asm( "movel  %a2@+, %d1     " );            \
00215     asm( "mulul  %d2, %d3:%d1   " );            \
00216     asm( "addxl  %d4, %d1       " );            \
00217     asm( "addxl  %d0, %d3       " );            \
00218     asm( "addl   %d1, %a3@+     " );            \
00219     asm( "addxl  %d0, %d3       " );
00220 
00221 #endif /* MC68000 */
00222 
00223 #if defined(__powerpc__)   || defined(__ppc__)
00224 #if defined(__powerpc64__) || defined(__ppc64__)
00225 
00226 #define MULADDC_INIT                            \
00227     asm( "ld     %%r3, %0       " :: "m" (s));  \
00228     asm( "ld     %%r4, %0       " :: "m" (d));  \
00229     asm( "ld     %%r5, %0       " :: "m" (c));  \
00230     asm( "ld     %%r6, %0       " :: "m" (b));  \
00231     asm( "addi   %r3, %r3, -8   " );            \
00232     asm( "addi   %r4, %r4, -8   " );            \
00233     asm( "addic  %r5, %r5,  0   " );
00234 
00235 #define MULADDC_CORE                            \
00236     asm( "ldu    %r7, 8(%r3)    " );            \
00237     asm( "mulld  %r8, %r7, %r6  " );            \
00238     asm( "mulhdu %r9, %r7, %r6  " );            \
00239     asm( "adde   %r8, %r8, %r5  " );            \
00240     asm( "ld     %r7, 8(%r4)    " );            \
00241     asm( "addze  %r5, %r9       " );            \
00242     asm( "addc   %r8, %r8, %r7  " );            \
00243     asm( "stdu   %r8, 8(%r4)    " );
00244 
00245 #define MULADDC_STOP                            \
00246     asm( "addze  %r5, %r5       " );            \
00247     asm( "addi   %r4, %r4, 8    " );            \
00248     asm( "addi   %r3, %r3, 8    " );            \
00249     asm( "std    %%r5, %0       " : "=m" (c));  \
00250     asm( "std    %%r4, %0       " : "=m" (d));  \
00251     asm( "std    %%r3, %0       " : "=m" (s) :: \
00252     "r3", "r4", "r5", "r6", "r7", "r8", "r9" );
00253 
00254 #else
00255 
00256 #define MULADDC_INIT                            \
00257     asm( "lwz    %%r3, %0       " :: "m" (s));  \
00258     asm( "lwz    %%r4, %0       " :: "m" (d));  \
00259     asm( "lwz    %%r5, %0       " :: "m" (c));  \
00260     asm( "lwz    %%r6, %0       " :: "m" (b));  \
00261     asm( "addi   %r3, %r3, -4   " );            \
00262     asm( "addi   %r4, %r4, -4   " );            \
00263     asm( "addic  %r5, %r5,  0   " );
00264 
00265 #define MULADDC_CORE                            \
00266     asm( "lwzu   %r7, 4(%r3)    " );            \
00267     asm( "mullw  %r8, %r7, %r6  " );            \
00268     asm( "mulhwu %r9, %r7, %r6  " );            \
00269     asm( "adde   %r8, %r8, %r5  " );            \
00270     asm( "lwz    %r7, 4(%r4)    " );            \
00271     asm( "addze  %r5, %r9       " );            \
00272     asm( "addc   %r8, %r8, %r7  " );            \
00273     asm( "stwu   %r8, 4(%r4)    " );
00274 
00275 #define MULADDC_STOP                            \
00276     asm( "addze  %r5, %r5       " );            \
00277     asm( "addi   %r4, %r4, 4    " );            \
00278     asm( "addi   %r3, %r3, 4    " );            \
00279     asm( "stw    %%r5, %0       " : "=m" (c));  \
00280     asm( "stw    %%r4, %0       " : "=m" (d));  \
00281     asm( "stw    %%r3, %0       " : "=m" (s) :: \
00282     "r3", "r4", "r5", "r6", "r7", "r8", "r9" );
00283 
00284 #endif /* PPC32 */
00285 #endif /* PPC64 */
00286 
00287 #if defined(__sparc__)
00288 
00289 #define MULADDC_INIT                            \
00290     asm( "ld     %0, %%o0       " :: "m" (s));  \
00291     asm( "ld     %0, %%o1       " :: "m" (d));  \
00292     asm( "ld     %0, %%o2       " :: "m" (c));  \
00293     asm( "ld     %0, %%o3       " :: "m" (b));
00294 
00295 #define MULADDC_CORE                            \
00296     asm( "ld    [%o0], %o4      " );            \
00297     asm( "inc      4,  %o0      " );            \
00298     asm( "ld    [%o1], %o5      " );            \
00299     asm( "umul   %o3,  %o4, %o4 " );            \
00300     asm( "addcc  %o4,  %o2, %o4 " );            \
00301     asm( "rd      %y,  %g1      " );            \
00302     asm( "addx   %g1,    0, %g1 " );            \
00303     asm( "addcc  %o4,  %o5, %o4 " );            \
00304     asm( "st     %o4, [%o1]     " );            \
00305     asm( "addx   %g1,    0, %o2 " );            \
00306     asm( "inc      4,  %o1      " );
00307 
00308 #define MULADDC_STOP                            \
00309     asm( "st     %%o2, %0       " : "=m" (c));  \
00310     asm( "st     %%o1, %0       " : "=m" (d));  \
00311     asm( "st     %%o0, %0       " : "=m" (s) :: \
00312     "g1", "o0", "o1", "o2", "o3", "o4", "o5" );
00313 
00314 #endif /* SPARCv8 */
00315 
00316 #if defined(__microblaze__) || defined(microblaze)
00317 
00318 #define MULADDC_INIT                            \
00319     asm( "lwi   r3,   %0        " :: "m" (s));  \
00320     asm( "lwi   r4,   %0        " :: "m" (d));  \
00321     asm( "lwi   r5,   %0        " :: "m" (c));  \
00322     asm( "lwi   r6,   %0        " :: "m" (b));  \
00323     asm( "andi  r7,   r6, 0xffff" );            \
00324     asm( "bsrli r6,   r6, 16    " );
00325 
00326 #define MULADDC_CORE                            \
00327     asm( "lhui  r8,   r3,   0   " );            \
00328     asm( "addi  r3,   r3,   2   " );            \
00329     asm( "lhui  r9,   r3,   0   " );            \
00330     asm( "addi  r3,   r3,   2   " );            \
00331     asm( "mul   r10,  r9,  r6   " );            \
00332     asm( "mul   r11,  r8,  r7   " );            \
00333     asm( "mul   r12,  r9,  r7   " );            \
00334     asm( "mul   r13,  r8,  r6   " );            \
00335     asm( "bsrli  r8, r10,  16   " );            \
00336     asm( "bsrli  r9, r11,  16   " );            \
00337     asm( "add   r13, r13,  r8   " );            \
00338     asm( "add   r13, r13,  r9   " );            \
00339     asm( "bslli r10, r10,  16   " );            \
00340     asm( "bslli r11, r11,  16   " );            \
00341     asm( "add   r12, r12, r10   " );            \
00342     asm( "addc  r13, r13,  r0   " );            \
00343     asm( "add   r12, r12, r11   " );            \
00344     asm( "addc  r13, r13,  r0   " );            \
00345     asm( "lwi   r10,  r4,   0   " );            \
00346     asm( "add   r12, r12, r10   " );            \
00347     asm( "addc  r13, r13,  r0   " );            \
00348     asm( "add   r12, r12,  r5   " );            \
00349     asm( "addc   r5, r13,  r0   " );            \
00350     asm( "swi   r12,  r4,   0   " );            \
00351     asm( "addi   r4,  r4,   4   " );
00352 
00353 #define MULADDC_STOP                            \
00354     asm( "swi   r5,   %0        " : "=m" (c));  \
00355     asm( "swi   r4,   %0        " : "=m" (d));  \
00356     asm( "swi   r3,   %0        " : "=m" (s) :: \
00357      "r3", "r4" , "r5" , "r6" , "r7" , "r8" ,   \
00358      "r9", "r10", "r11", "r12", "r13" );
00359 
00360 #endif /* MicroBlaze */
00361 
00362 #if defined(__tricore__)
00363 
00364 #define MULADDC_INIT                            \
00365     asm( "ld.a   %%a2, %0       " :: "m" (s));  \
00366     asm( "ld.a   %%a3, %0       " :: "m" (d));  \
00367     asm( "ld.w   %%d4, %0       " :: "m" (c));  \
00368     asm( "ld.w   %%d1, %0       " :: "m" (b));  \
00369     asm( "xor    %d5, %d5       " );
00370 
00371 #define MULADDC_CORE                            \
00372     asm( "ld.w   %d0,   [%a2+]      " );        \
00373     asm( "madd.u %e2, %e4, %d0, %d1 " );        \
00374     asm( "ld.w   %d0,   [%a3]       " );        \
00375     asm( "addx   %d2,    %d2,  %d0  " );        \
00376     asm( "addc   %d3,    %d3,    0  " );        \
00377     asm( "mov    %d4,    %d3        " );        \
00378     asm( "st.w  [%a3+],  %d2        " );
00379 
00380 #define MULADDC_STOP                            \
00381     asm( "st.w   %0, %%d4       " : "=m" (c));  \
00382     asm( "st.a   %0, %%a3       " : "=m" (d));  \
00383     asm( "st.a   %0, %%a2       " : "=m" (s) :: \
00384     "d0", "d1", "e2", "d4", "a2", "a3" );
00385 
00386 #endif /* TriCore */
00387 
00388 #if defined(__arm__)
00389 
00390 #define MULADDC_INIT                            \
00391     asm( "ldr    r0, %0         " :: "m" (s));  \
00392     asm( "ldr    r1, %0         " :: "m" (d));  \
00393     asm( "ldr    r2, %0         " :: "m" (c));  \
00394     asm( "ldr    r3, %0         " :: "m" (b));
00395 
00396 #define MULADDC_CORE                            \
00397     asm( "ldr    r4, [r0], #4   " );            \
00398     asm( "mov    r5, #0         " );            \
00399     asm( "ldr    r6, [r1]       " );            \
00400     asm( "umlal  r2, r5, r3, r4 " );            \
00401     asm( "adds   r7, r6, r2     " );            \
00402     asm( "adc    r2, r5, #0     " );            \
00403     asm( "str    r7, [r1], #4   " );
00404 
00405 #define MULADDC_STOP                            \
00406     asm( "str    r2, %0         " : "=m" (c));  \
00407     asm( "str    r1, %0         " : "=m" (d));  \
00408     asm( "str    r0, %0         " : "=m" (s) :: \
00409     "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7" );
00410 
00411 #endif /* ARMv3 */
00412 
00413 #if defined(__alpha__)
00414 
00415 #define MULADDC_INIT                            \
00416     asm( "ldq    $1, %0         " :: "m" (s));  \
00417     asm( "ldq    $2, %0         " :: "m" (d));  \
00418     asm( "ldq    $3, %0         " :: "m" (c));  \
00419     asm( "ldq    $4, %0         " :: "m" (b));
00420 
00421 #define MULADDC_CORE                            \
00422     asm( "ldq    $6,  0($1)     " );            \
00423     asm( "addq   $1,  8, $1     " );            \
00424     asm( "mulq   $6, $4, $7     " );            \
00425     asm( "umulh  $6, $4, $6     " );            \
00426     asm( "addq   $7, $3, $7     " );            \
00427     asm( "cmpult $7, $3, $3     " );            \
00428     asm( "ldq    $5,  0($2)     " );            \
00429     asm( "addq   $7, $5, $7     " );            \
00430     asm( "cmpult $7, $5, $5     " );            \
00431     asm( "stq    $7,  0($2)     " );            \
00432     asm( "addq   $2,  8, $2     " );            \
00433     asm( "addq   $6, $3, $3     " );            \
00434     asm( "addq   $5, $3, $3     " );
00435 
00436 #define MULADDC_STOP                            \
00437     asm( "stq    $3, %0         " : "=m" (c));  \
00438     asm( "stq    $2, %0         " : "=m" (d));  \
00439     asm( "stq    $1, %0         " : "=m" (s) :: \
00440     "$1", "$2", "$3", "$4", "$5", "$6", "$7" );
00441 
00442 #endif /* Alpha */
00443 
00444 #if defined(__mips__)
00445 
00446 #define MULADDC_INIT                            \
00447     asm( "lw     $10, %0        " :: "m" (s));  \
00448     asm( "lw     $11, %0        " :: "m" (d));  \
00449     asm( "lw     $12, %0        " :: "m" (c));  \
00450     asm( "lw     $13, %0        " :: "m" (b));
00451 
00452 #define MULADDC_CORE                            \
00453     asm( "lw     $14, 0($10)    " );            \
00454     asm( "multu  $13, $14       " );            \
00455     asm( "addi   $10, $10, 4    " );            \
00456     asm( "mflo   $14            " );            \
00457     asm( "mfhi   $9             " );            \
00458     asm( "addu   $14, $12, $14  " );            \
00459     asm( "lw     $15, 0($11)    " );            \
00460     asm( "sltu   $12, $14, $12  " );            \
00461     asm( "addu   $15, $14, $15  " );            \
00462     asm( "sltu   $14, $15, $14  " );            \
00463     asm( "addu   $12, $12, $9   " );            \
00464     asm( "sw     $15, 0($11)    " );            \
00465     asm( "addu   $12, $12, $14  " );            \
00466     asm( "addi   $11, $11, 4    " );
00467 
00468 #define MULADDC_STOP                            \
00469     asm( "sw     $12, %0        " : "=m" (c));  \
00470     asm( "sw     $11, %0        " : "=m" (d));  \
00471     asm( "sw     $10, %0        " : "=m" (s) :: \
00472     "$9", "$10", "$11", "$12", "$13", "$14", "$15" );
00473 
00474 #endif /* MIPS */
00475 #endif /* GNUC */
00476 
00477 #if (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)
00478 
00479 #define MULADDC_INIT                            \
00480     __asm   mov     esi, s                      \
00481     __asm   mov     edi, d                      \
00482     __asm   mov     ecx, c                      \
00483     __asm   mov     ebx, b
00484 
00485 #define MULADDC_CORE                            \
00486     __asm   lodsd                               \
00487     __asm   mul     ebx                         \
00488     __asm   add     eax, ecx                    \
00489     __asm   adc     edx, 0                      \
00490     __asm   add     eax, [edi]                  \
00491     __asm   adc     edx, 0                      \
00492     __asm   mov     ecx, edx                    \
00493     __asm   stosd
00494 
00495 #define MULADDC_STOP                            \
00496     __asm   mov     c, ecx                      \
00497     __asm   mov     d, edi                      \
00498     __asm   mov     s, esi                      \
00499 
00500 #if defined HAVE_SSE2
00501 
00502 #define EMIT __asm _emit
00503 
00504 #define MULADDC_HUIT                            \
00505     EMIT 0x0F  EMIT 0x6E  EMIT 0xC9             \
00506     EMIT 0x0F  EMIT 0x6E  EMIT 0xC3             \
00507     EMIT 0x0F  EMIT 0x6E  EMIT 0x1F             \
00508     EMIT 0x0F  EMIT 0xD4  EMIT 0xCB             \
00509     EMIT 0x0F  EMIT 0x6E  EMIT 0x16             \
00510     EMIT 0x0F  EMIT 0xF4  EMIT 0xD0             \
00511     EMIT 0x0F  EMIT 0x6E  EMIT 0x66  EMIT 0x04  \
00512     EMIT 0x0F  EMIT 0xF4  EMIT 0xE0             \
00513     EMIT 0x0F  EMIT 0x6E  EMIT 0x76  EMIT 0x08  \
00514     EMIT 0x0F  EMIT 0xF4  EMIT 0xF0             \
00515     EMIT 0x0F  EMIT 0x6E  EMIT 0x7E  EMIT 0x0C  \
00516     EMIT 0x0F  EMIT 0xF4  EMIT 0xF8             \
00517     EMIT 0x0F  EMIT 0xD4  EMIT 0xCA             \
00518     EMIT 0x0F  EMIT 0x6E  EMIT 0x5F  EMIT 0x04  \
00519     EMIT 0x0F  EMIT 0xD4  EMIT 0xDC             \
00520     EMIT 0x0F  EMIT 0x6E  EMIT 0x6F  EMIT 0x08  \
00521     EMIT 0x0F  EMIT 0xD4  EMIT 0xEE             \
00522     EMIT 0x0F  EMIT 0x6E  EMIT 0x67  EMIT 0x0C  \
00523     EMIT 0x0F  EMIT 0xD4  EMIT 0xFC             \
00524     EMIT 0x0F  EMIT 0x7E  EMIT 0x0F             \
00525     EMIT 0x0F  EMIT 0x6E  EMIT 0x56  EMIT 0x10  \
00526     EMIT 0x0F  EMIT 0xF4  EMIT 0xD0             \
00527     EMIT 0x0F  EMIT 0x73  EMIT 0xD1  EMIT 0x20  \
00528     EMIT 0x0F  EMIT 0x6E  EMIT 0x66  EMIT 0x14  \
00529     EMIT 0x0F  EMIT 0xF4  EMIT 0xE0             \
00530     EMIT 0x0F  EMIT 0xD4  EMIT 0xCB             \
00531     EMIT 0x0F  EMIT 0x6E  EMIT 0x76  EMIT 0x18  \
00532     EMIT 0x0F  EMIT 0xF4  EMIT 0xF0             \
00533     EMIT 0x0F  EMIT 0x7E  EMIT 0x4F  EMIT 0x04  \
00534     EMIT 0x0F  EMIT 0x73  EMIT 0xD1  EMIT 0x20  \
00535     EMIT 0x0F  EMIT 0x6E  EMIT 0x5E  EMIT 0x1C  \
00536     EMIT 0x0F  EMIT 0xF4  EMIT 0xD8             \
00537     EMIT 0x0F  EMIT 0xD4  EMIT 0xCD             \
00538     EMIT 0x0F  EMIT 0x6E  EMIT 0x6F  EMIT 0x10  \
00539     EMIT 0x0F  EMIT 0xD4  EMIT 0xD5             \
00540     EMIT 0x0F  EMIT 0x7E  EMIT 0x4F  EMIT 0x08  \
00541     EMIT 0x0F  EMIT 0x73  EMIT 0xD1  EMIT 0x20  \
00542     EMIT 0x0F  EMIT 0xD4  EMIT 0xCF             \
00543     EMIT 0x0F  EMIT 0x6E  EMIT 0x6F  EMIT 0x14  \
00544     EMIT 0x0F  EMIT 0xD4  EMIT 0xE5             \
00545     EMIT 0x0F  EMIT 0x7E  EMIT 0x4F  EMIT 0x0C  \
00546     EMIT 0x0F  EMIT 0x73  EMIT 0xD1  EMIT 0x20  \
00547     EMIT 0x0F  EMIT 0xD4  EMIT 0xCA             \
00548     EMIT 0x0F  EMIT 0x6E  EMIT 0x6F  EMIT 0x18  \
00549     EMIT 0x0F  EMIT 0xD4  EMIT 0xF5             \
00550     EMIT 0x0F  EMIT 0x7E  EMIT 0x4F  EMIT 0x10  \
00551     EMIT 0x0F  EMIT 0x73  EMIT 0xD1  EMIT 0x20  \
00552     EMIT 0x0F  EMIT 0xD4  EMIT 0xCC             \
00553     EMIT 0x0F  EMIT 0x6E  EMIT 0x6F  EMIT 0x1C  \
00554     EMIT 0x0F  EMIT 0xD4  EMIT 0xDD             \
00555     EMIT 0x0F  EMIT 0x7E  EMIT 0x4F  EMIT 0x14  \
00556     EMIT 0x0F  EMIT 0x73  EMIT 0xD1  EMIT 0x20  \
00557     EMIT 0x0F  EMIT 0xD4  EMIT 0xCE             \
00558     EMIT 0x0F  EMIT 0x7E  EMIT 0x4F  EMIT 0x18  \
00559     EMIT 0x0F  EMIT 0x73  EMIT 0xD1  EMIT 0x20  \
00560     EMIT 0x0F  EMIT 0xD4  EMIT 0xCB             \
00561     EMIT 0x0F  EMIT 0x7E  EMIT 0x4F  EMIT 0x1C  \
00562     EMIT 0x83  EMIT 0xC7  EMIT 0x20             \
00563     EMIT 0x83  EMIT 0xC6  EMIT 0x20             \
00564     EMIT 0x0F  EMIT 0x73  EMIT 0xD1  EMIT 0x20  \
00565     EMIT 0x0F  EMIT 0x7E  EMIT 0xC9
00566 
00567 #endif /* SSE2 */
00568 #endif /* MSVC */
00569 
00570 #if !defined(MULADDC_CORE)
00571 #if defined(HAVE_LONGLONG)
00572 
00573 #define MULADDC_INIT                    \
00574 {                                       \
00575     t_dbl r;                            \
00576     t_int r0, r1;
00577 
00578 #define MULADDC_CORE                    \
00579     r   = *(s++) * (t_dbl) b;           \
00580     r0  = r;                            \
00581     r1  = r >> biL;                     \
00582     r0 += c;  r1 += (r0 <  c);          \
00583     r0 += *d; r1 += (r0 < *d);          \
00584     c = r1; *(d++) = r0;
00585 
00586 #define MULADDC_STOP                    \
00587 }
00588 
00589 #else
00590 #define MULADDC_INIT                    \
00591 {                                       \
00592     t_int s0, s1, b0, b1;               \
00593     t_int r0, r1, rx, ry;               \
00594     b0 = ( b << biH ) >> biH;           \
00595     b1 = ( b >> biH );
00596 
00597 #define MULADDC_CORE                    \
00598     s0 = ( *s << biH ) >> biH;          \
00599     s1 = ( *s >> biH ); s++;            \
00600     rx = s0 * b1; r0 = s0 * b0;         \
00601     ry = s1 * b0; r1 = s1 * b1;         \
00602     r1 += ( rx >> biH );                \
00603     r1 += ( ry >> biH );                \
00604     rx <<= biH; ry <<= biH;             \
00605     r0 += rx; r1 += (r0 < rx);          \
00606     r0 += ry; r1 += (r0 < ry);          \
00607     r0 +=  c; r1 += (r0 <  c);          \
00608     r0 += *d; r1 += (r0 < *d);          \
00609     c = r1; *(d++) = r0;
00610 
00611 #define MULADDC_STOP                    \
00612 }
00613 
00614 #endif /* C (generic)  */
00615 #endif /* C (longlong) */
00616 
00617 #endif /* bn_asm.h */

Generated on Tue Jul 1 15:29:58 2008 for Mobile-C by  doxygen 1.5.4