- Updated assembly to not clobber ebx and allow shared libs again

This commit is contained in:
Paul Bakker 2009-07-19 21:37:39 +00:00
parent 854963cee3
commit c89cf7ceff

View file

@ -43,15 +43,17 @@
#if defined(__GNUC__) #if defined(__GNUC__)
#if defined(__i386__) #if defined(__i386__)
#define MULADDC_INIT \ #define MULADDC_INIT \
asm( "movl %%ebx, %0 " : "=m" (t)); \ asm( " \
asm( "movl %0, %%esi " :: "m" (s)); \ movl %%ebx, %0; \
asm( "movl %0, %%edi " :: "m" (d)); \ movl %5, %%esi; \
asm( "movl %0, %%ecx " :: "m" (c)); \ movl %6, %%edi; \
asm( "movl %0, %%ebx " :: "m" (b)); movl %7, %%ecx; \
movl %8, %%ebx; \
"
#define MULADDC_CORE \ #define MULADDC_CORE \
asm( " \ " \
lodsl; \ lodsl; \
mull %%ebx; \ mull %%ebx; \
addl %%ecx, %%eax; \ addl %%ecx, %%eax; \
@ -59,90 +61,102 @@
addl (%%edi), %%eax; \ addl (%%edi), %%eax; \
adcl $0, %%edx; \ adcl $0, %%edx; \
movl %%edx, %%ecx; \ movl %%edx, %%ecx; \
stosl; " ::: \ stosl; \
"%eax", "%ebx", "%ecx", "%edx", "%edi", "esi"); "
#if defined(POLARSSL_HAVE_SSE2) #if defined(POLARSSL_HAVE_SSE2)
#define MULADDC_HUIT \ #define MULADDC_HUIT \
asm( "movd %ecx, %mm1 " ); \ " \
asm( "movd %ebx, %mm0 " ); \ movd %%ecx, %%mm1; \
asm( "movd (%edi), %mm3 " ); \ movd %%ebx, %%mm0; \
asm( "paddq %mm3, %mm1 " ); \ movd (%%edi), %%mm3; \
asm( "movd (%esi), %mm2 " ); \ paddq %%mm3, %%mm1; \
asm( "pmuludq %mm0, %mm2 " ); \ movd (%%esi), %%mm2; \
asm( "movd 4(%esi), %mm4 " ); \ pmuludq %%mm0, %%mm2; \
asm( "pmuludq %mm0, %mm4 " ); \ movd 4(%%esi), %%mm4; \
asm( "movd 8(%esi), %mm6 " ); \ pmuludq %%mm0, %%mm4; \
asm( "pmuludq %mm0, %mm6 " ); \ movd 8(%%esi), %%mm6; \
asm( "movd 12(%esi), %mm7 " ); \ pmuludq %%mm0, %%mm6; \
asm( "pmuludq %mm0, %mm7 " ); \ movd 12(%%esi), %%mm7; \
asm( "paddq %mm2, %mm1 " ); \ pmuludq %%mm0, %%mm7; \
asm( "movd 4(%edi), %mm3 " ); \ paddq %%mm2, %%mm1; \
asm( "paddq %mm4, %mm3 " ); \ movd 4(%%edi), %%mm3; \
asm( "movd 8(%edi), %mm5 " ); \ paddq %%mm4, %%mm3; \
asm( "paddq %mm6, %mm5 " ); \ movd 8(%%edi), %%mm5; \
asm( "movd 12(%edi), %mm4 " ); \ paddq %%mm6, %%mm5; \
asm( "paddq %mm4, %mm7 " ); \ movd 12(%%edi), %%mm4; \
asm( "movd %mm1, (%edi) " ); \ paddq %%mm4, %%mm7; \
asm( "movd 16(%esi), %mm2 " ); \ movd %%mm1, (%%edi); \
asm( "pmuludq %mm0, %mm2 " ); \ movd 16(%%esi), %%mm2; \
asm( "psrlq $32, %mm1 " ); \ pmuludq %%mm0, %%mm2; \
asm( "movd 20(%esi), %mm4 " ); \ psrlq $32, %%mm1; \
asm( "pmuludq %mm0, %mm4 " ); \ movd 20(%%esi), %%mm4; \
asm( "paddq %mm3, %mm1 " ); \ pmuludq %%mm0, %%mm4; \
asm( "movd 24(%esi), %mm6 " ); \ paddq %%mm3, %%mm1; \
asm( "pmuludq %mm0, %mm6 " ); \ movd 24(%%esi), %%mm6; \
asm( "movd %mm1, 4(%edi) " ); \ pmuludq %%mm0, %%mm6; \
asm( "psrlq $32, %mm1 " ); \ movd %%mm1, 4(%%edi); \
asm( "movd 28(%esi), %mm3 " ); \ psrlq $32, %%mm1; \
asm( "pmuludq %mm0, %mm3 " ); \ movd 28(%%esi), %%mm3; \
asm( "paddq %mm5, %mm1 " ); \ pmuludq %%mm0, %%mm3; \
asm( "movd 16(%edi), %mm5 " ); \ paddq %%mm5, %%mm1; \
asm( "paddq %mm5, %mm2 " ); \ movd 16(%%edi), %%mm5; \
asm( "movd %mm1, 8(%edi) " ); \ paddq %%mm5, %%mm2; \
asm( "psrlq $32, %mm1 " ); \ movd %%mm1, 8(%%edi); \
asm( "paddq %mm7, %mm1 " ); \ psrlq $32, %%mm1; \
asm( "movd 20(%edi), %mm5 " ); \ paddq %%mm7, %%mm1; \
asm( "paddq %mm5, %mm4 " ); \ movd 20(%%edi), %%mm5; \
asm( "movd %mm1, 12(%edi) " ); \ paddq %%mm5, %%mm4; \
asm( "psrlq $32, %mm1 " ); \ movd %%mm1, 12(%%edi); \
asm( "paddq %mm2, %mm1 " ); \ psrlq $32, %%mm1; \
asm( "movd 24(%edi), %mm5 " ); \ paddq %%mm2, %%mm1; \
asm( "paddq %mm5, %mm6 " ); \ movd 24(%%edi), %%mm5; \
asm( "movd %mm1, 16(%edi) " ); \ paddq %%mm5, %%mm6; \
asm( "psrlq $32, %mm1 " ); \ movd %%mm1, 16(%%edi); \
asm( "paddq %mm4, %mm1 " ); \ psrlq $32, %%mm1; \
asm( "movd 28(%edi), %mm5 " ); \ paddq %%mm4, %%mm1; \
asm( "paddq %mm5, %mm3 " ); \ movd 28(%%edi), %%mm5; \
asm( "movd %mm1, 20(%edi) " ); \ paddq %%mm5, %%mm3; \
asm( "psrlq $32, %mm1 " ); \ movd %%mm1, 20(%%edi); \
asm( "paddq %mm6, %mm1 " ); \ psrlq $32, %%mm1; \
asm( "movd %mm1, 24(%edi) " ); \ paddq %%mm6, %%mm1; \
asm( "psrlq $32, %mm1 " ); \ movd %%mm1, 24(%%edi); \
asm( "paddq %mm3, %mm1 " ); \ psrlq $32, %%mm1; \
asm( "movd %mm1, 28(%edi) " ); \ paddq %%mm3, %%mm1; \
asm( "addl $32, %edi " ); \ movd %%mm1, 28(%%edi); \
asm( "addl $32, %esi " ); \ addl $32, %%edi; \
asm( "psrlq $32, %mm1 " ); \ addl $32, %%esi; \
asm( "movd %mm1, %ecx " ); psrlq $32, %%mm1; \
movd %%mm1, %%ecx; \
"
#define MULADDC_STOP \ #define MULADDC_STOP \
asm( "emms " ); \ " \
asm( "movl %0, %%ebx " :: "m" (t)); \ emms; \
asm( "movl %%ecx, %0 " : "=m" (c)); \ movl %4, %%ebx; \
asm( "movl %%edi, %0 " : "=m" (d)); \ movl %%ecx, %1; \
asm( "movl %%esi, %0 " : "=m" (s) :: \ movl %%edi, %2; \
"eax", "ecx", "edx", "esi", "edi" ); movl %%esi, %3; \
" \
: "=m" (t), "=m" (c), "=m" (d), "=m" (s) \
: "m" (t), "m" (s), "m" (d), "m" (c), "m" (b) \
: "eax", "ecx", "edx", "esi", "edi" \
);
#else #else
#define MULADDC_STOP \ #define MULADDC_STOP \
asm( "movl %0, %%ebx " :: "m" (t)); \ " \
asm( "movl %%ecx, %0 " : "=m" (c)); \ movl %4, %%ebx; \
asm( "movl %%edi, %0 " : "=m" (d)); \ movl %%ecx, %1; \
asm( "movl %%esi, %0 " : "=m" (s)); movl %%edi, %2; \
movl %%esi, %3; \
" \
: "=m" (t), "=m" (c), "=m" (d), "=m" (s) \
: "m" (t), "m" (s), "m" (d), "m" (c), "m" (b) \
: "eax", "ecx", "edx", "esi", "edi" \
);
#endif /* SSE2 */ #endif /* SSE2 */
#endif /* i386 */ #endif /* i386 */