⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wfta_asm.cpp

📁 任意精度计算的实现
💻 CPP
字号:
#include "ap.h"


// Assembler optimized but not-so-good performance WFTA routines

#if defined (USEASMGCC386)

asm (";\
    .globl _wfta2;\
    .globl _wfta3;\
    .globl _wfta4;\
    .globl _wfta5;\
/*;\
    .globl _wfta7;\
    .globl _wfta8;\
    .globl _wfta9;\
    .globl _wfta16;\
*/;\
    .globl _wftan2;\
    .globl _wftan3;\
/*;\
    .globl _wftan4;\
    .globl _wftan5;\
    .globl _wftan7;\
    .globl _wftan8;\
    .globl _wftan9;\
    .globl _wftan16;\
*/;\
;\
_wfta2:;\
    pushl %ebx;\
    pushl %ecx;\
    pushl %edx;\
    pushl %esi;\
    pushl %edi;\
;\
    movl 24(%esp), %ecx;\
    movl _modulus, %edi;\
    movl (%ecx), %eax;\
    movl 4(%ecx), %ebx;\
    movl %eax, %esi;\
;\
    addl %ebx, %esi; cmpl %edi, %esi; jb 0f; subl %edi, %esi; 0:;\
;\
    subl %ebx, %eax; jnc 0f; addl %edi, %eax; 0:;\
;\
    movl %esi, (%ecx);\
    movl %eax, 4(%ecx);\
;\
    movl 28(%esp), %ebx;\
;\
    movl $2, %esi;\
;\
    wfta2mulloop:;\
");

#if defined (USEFPU)

asm (";\
    fildl (%ecx);\
    fimull (%ebx);\
    fld %st;\
    fmul %st(2), %st;\
    fadd %st(4), %st;\
    fsub %st(4), %st;\
    fmul %st(3), %st;\
    fsubrp %st, %st(1);\
    fistpl (%ecx);\
");

#else

asm (";\
    movl (%ecx), %eax;\
    mull (%ebx);\
    divl %edi;\
    movl %edx, (%ecx);\
");

#endif

asm (";\
    addl $4, %ecx;\
    addl $4, %ebx;\
    decl %esi;\
    jnz wfta2mulloop;\
;\
    popl %edi;\
    popl %esi;\
    popl %edx;\
    popl %ecx;\
    popl %ebx;\
;\
    ret;\
;\
_wfta3:;\
    pushl %ebx;\
    pushl %ecx;\
    pushl %edx;\
    pushl %esi;\
    pushl %edi;\
;\
    movl 24(%esp), %ecx;\
    movl _modulus, %edi;\
    movl 4(%ecx), %eax;\
    movl 8(%ecx), %ebx;\
    movl %eax, %esi;\
;\
    addl %ebx, %esi; cmpl %edi, %esi; jb 0f; subl %edi, %esi; 0:;\
;\
    subl %ebx, %eax; jnc 0f; addl %edi, %eax; 0:;\
;\
    movl (%ecx), %ebx;\
    movl %esi, 4(%ecx);\
    movl %eax, 8(%ecx);\
;\
    addl %ebx, %esi; cmpl %edi, %esi; jb 0f; subl %edi, %esi; 0:;\
;\
    movl %esi, (%ecx);\
;\
    movl 28(%esp), %ebx;\
;\
    movl $3, %esi;\
;\
    wfta3mulloop:;\
");

#if defined (USEFPU)

asm (";\
    fildl (%ecx);\
    fimull (%ebx);\
    fld %st;\
    fmul %st(2), %st;\
    fadd %st(4), %st;\
    fsub %st(4), %st;\
    fmul %st(3), %st;\
    fsubrp %st, %st(1);\
    fistpl (%ecx);\
");

#else

asm (";\
    movl (%ecx), %eax;\
    mull (%ebx);\
    divl %edi;\
    movl %edx, (%ecx);\
");

#endif

asm (";\
    addl $4, %ecx;\
    addl $4, %ebx;\
    decl %esi;\
    jnz wfta3mulloop;\
;\
    subl $12, %ecx;\
;\
    movl (%ecx), %eax;\
    movl 4(%ecx), %ebx;\
;\
    addl %ebx, %eax; cmpl %edi, %eax; jb 0f; subl %edi, %eax; 0:;\
;\
    movl %eax, %esi;\
    movl 8(%ecx), %ebx;\
;\
    addl %ebx, %esi; cmpl %edi, %esi; jb 0f; subl %edi, %esi; 0:;\
;\
    subl %ebx, %eax; jnc 0f; addl %edi, %eax; 0:;\
;\
    movl %esi, 4(%ecx);\
    movl %eax, 8(%ecx);\
;\
    popl %edi;\
    popl %esi;\
    popl %edx;\
    popl %ecx;\
    popl %ebx;\
;\
    ret;\
;\
_wfta4:;\
    pushl %ebx;\
    pushl %ecx;\
    pushl %edx;\
    pushl %esi;\
    pushl %edi;\
    pushl %ebp;\
;\
    movl 28(%esp), %ecx;\
    movl _modulus, %edi;\
    movl (%ecx), %eax;\
    movl 8(%ecx), %ebx;\
    movl %eax, %esi;\
;\
    addl %ebx, %esi; cmpl %edi, %esi; jb 0f; subl %edi, %esi; 0:;\
;\
    subl %ebx, %eax; jnc 0f; addl %edi, %eax; 0:;\
;\
    movl %eax, 8(%ecx);\
    movl 4(%ecx), %eax;\
    movl 12(%ecx), %ebx;\
    movl %eax, %ebp;\
;\
    addl %ebx, %ebp; cmpl %edi, %ebp; jb 0f; subl %edi, %ebp; 0:;\
;\
    subl %ebx, %eax; jnc 0f; addl %edi, %eax; 0:;\
;\
    movl %eax, 12(%ecx);\
    movl %esi, %eax;\
;\
    addl %ebp, %esi; cmpl %edi, %esi; jb 0f; subl %edi, %esi; 0:;\
;\
    subl %ebp, %eax; jnc 0f; addl %edi, %eax; 0:;\
;\
    movl %esi, (%ecx);\
    movl %eax, 4(%ecx);\
;\
    movl 32(%esp), %ebx;\
;\
    movl $4, %esi;\
;\
    wfta4mulloop:;\
");

#if defined (USEFPU)

asm (";\
    fildl (%ecx);\
    fimull (%ebx);\
    fld %st;\
    fmul %st(2), %st;\
    fadd %st(4), %st;\
    fsub %st(4), %st;\
    fmul %st(3), %st;\
    fsubrp %st, %st(1);\
    fistpl (%ecx);\
");

#else

asm (";\
    movl (%ecx), %eax;\
    mull (%ebx);\
    divl %edi;\
    movl %edx, (%ecx);\
");

#endif

asm (";\
    addl $4, %ecx;\
    addl $4, %ebx;\
    decl %esi;\
    jnz wfta4mulloop;\
;\
    subl $16, %ecx;\
;\
    movl 8(%ecx), %eax;\
    movl 12(%ecx), %ebx;\
    movl %eax, %esi;\
;\
    addl %ebx, %esi; cmpl %edi, %esi; jb 0f; subl %edi, %esi; 0:;\
;\
    subl %ebx, %eax; jnc 0f; addl %edi, %eax; 0:;\
;\
    movl 4(%ecx), %ebx;\
    movl %eax, 12(%ecx);\
    movl %esi, 4(%ecx);\
    movl %ebx, 8(%ecx);\
;\
    popl %ebp;\
    popl %edi;\
    popl %esi;\
    popl %edx;\
    popl %ecx;\
    popl %ebx;\
;\
    ret;\
;\
_wfta5:;\
    subl $24, %esp;\
    pushl %ebx;\
    pushl %ecx;\
    pushl %edx;\
    pushl %esi;\
    pushl %edi;\
    pushl %ebp;\
;\
    movl 52(%esp), %ecx;\
    movl _modulus, %edi;\
    movl 4(%ecx), %eax;\
    movl 16(%ecx), %ebx;\
    movl %eax, %esi;\
;\
    addl %ebx, %esi; cmpl %edi, %esi; jb 0f; subl %edi, %esi; 0:;\
;\
    subl %ebx, %eax; jnc 0f; addl %edi, %eax; 0:;\
;\
    movl 12(%ecx), %edx;\
    movl 8(%ecx), %ebx;\
    movl %edx, %ebp;\
;\
    addl %ebx, %ebp; cmpl %edi, %ebp; jb 0f; subl %edi, %ebp; 0:;\
;\
    subl %ebx, %edx; jnc 0f; addl %edi, %edx; 0:;\
;\
    movl %esi, %ebx;\
;\
    addl %ebp, %esi; cmpl %edi, %esi; jb 0f; subl %edi, %esi; 0:;\
;\
    movl %esi, 28(%esp);\
    movl %edx, 40(%esp);\
    movl %eax, 44(%esp);\
;\
    subl %ebp, %ebx; jnc 0f; addl %edi, %ebx; 0:;\
;\
    addl %eax, %edx; cmpl %edi, %edx; jb 0f; subl %edi, %edx; 0:;\
;\
    movl (%ecx), %eax;\
    movl %ebx, 32(%esp);\
    movl %edx, 36(%esp);\
;\
    addl %eax, %esi; cmpl %edi, %esi; jb 0f; subl %edi, %esi; 0:;\
;\
    movl %esi, 24(%esp);\
;\
    leal 24(%esp), %ecx;\
    movl 56(%esp), %ebx;\
;\
    movl $6, %esi;\
;\
    wfta5mulloop:;\
");

#if defined (USEFPU)

asm (";\
    fildl (%ecx);\
    fimull (%ebx);\
    fld %st;\
    fmul %st(2), %st;\
    fadd %st(4), %st;\
    fsub %st(4), %st;\
    fmul %st(3), %st;\
    fsubrp %st, %st(1);\
    fistpl (%ecx);\
");

#else

asm (";\
    movl (%ecx), %eax;\
    mull (%ebx);\
    divl %edi;\
    movl %edx, (%ecx);\
");

#endif

asm (";\
    addl $4, %ecx;\
    addl $4, %ebx;\
    decl %esi;\
    jnz wfta5mulloop;\
;\
    movl 24(%esp), %eax;\
    movl 28(%esp), %ebx;\
;\
    addl %ebx, %eax; cmpl %edi, %eax; jb 0f; subl %edi, %eax; 0:;\
;\
    movl 32(%esp), %ebx;\
    movl %eax, %esi;\
;\
    addl %ebx, %esi; cmpl %edi, %esi; jb 0f; subl %edi, %esi; 0:;\
;\
    subl %ebx, %eax; jnc 0f; addl %edi, %eax; 0:;\
;\
    movl 36(%esp), %ebx;\
    movl 40(%esp), %ebp;\
    movl 44(%esp), %ecx;\
    movl %ebx, %edx;\
;\
    addl %ecx, %ebx; cmpl %edi, %ebx; jb 0f; subl %edi, %ebx; 0:;\
;\
    subl %ebp, %edx; jnc 0f; addl %edi, %edx; 0:;\
;\
    movl %esi, %ebp;\
    movl 52(%esp), %ecx;\
;\
    addl %edx, %esi; cmpl %edi, %esi; jb 0f; subl %edi, %esi; 0:;\
;\
    subl %edx, %ebp; jnc 0f; addl %edi, %ebp; 0:;\
;\
    movl %esi, 4(%ecx);\
    movl %ebp, 16(%ecx);\
    movl %eax, %esi;\
;\
    addl %ebx, %esi; cmpl %edi, %esi; jb 0f; subl %edi, %esi; 0:;\
;\
    subl %ebx, %eax; jnc 0f; addl %edi, %eax; 0:;\
;\
    movl 24(%esp), %edx;\
    movl %esi, 8(%ecx);\
    movl %eax, 12(%ecx);\
    movl %edx, (%ecx);\
;\
    popl %ebp;\
    popl %edi;\
    popl %esi;\
    popl %edx;\
    popl %ecx;\
    popl %ebx;\
    addl $24, %esp;\
;\
    ret;\
;\
_wftan2:;\
    pushl %ebx;\
    pushl %ecx;\
    pushl %edx;\
    pushl %esi;\
    pushl %edi;\
    pushl %ebp;\
;\
    movl 28(%esp), %ecx;\
    movl 36(%esp), %esi;\
    movl _modulus, %edi;\
    leal (%ecx, %esi, 4), %edx;\
;\
    wftan2loop1:;\
    movl -4(%ecx, %esi, 4), %eax;\
    movl -4(%edx, %esi, 4), %ebx;\
;\
    addl %eax, %ebx; addl %eax, %eax;\
    subl %ebx, %eax; jnc 0f; addl %edi, %eax; 0:;\
    cmpl %edi, %ebx; jb 0f; subl %edi, %ebx; 0:;\
;\
    movl %eax, -4(%edx, %esi, 4);\
    movl %ebx, -4(%ecx, %esi, 4);\
;\
    decl %esi;\
    jnz wftan2loop1;\
;\
    movl 40(%esp), %ebx;\
    movl 44(%esp), %ecx;\
    movl 36(%esp), %esi;\
    movl (%ebx), %ebx;\
;\
    cmpl %ebx, %esi;\
    jne wftan2nblock;\
;\
    movl _wftas(, %ebx, 4), %ebx;\
    movl 32(%esp), %edx;\
    movl 28(%esp), %edi;\
    shll $2, %ecx;\
    shll $2, %esi;\
    pushl %edx;\
    pushl %edi;\
;\
    addl %ecx, %edx;\
    addl %esi, %edi;\
    pushl %edx;\
    pushl %edi;\
;\
    call *%ebx;\
    addl $8, %esp;\
;\
    call *%ebx;\
    addl $8, %esp;\
;\
    jmp wftan2end;\
;\
    wftan2nblock:;\
;\
    movl %esi, %eax;\
    xorl %edx, %edx;\
    divw %bx;\
    movl %eax, %ebp;\
;\
    movl 48(%esp), %edi;\
    movl %ecx, %eax;\
    xorl %edx, %edx;\
    divw (%edi);\
;\
    movl _wftan(, %ebx, 4), %ebx;\
    shll $2, %ecx;\
    shll $2, %esi;\
    movl 28(%esp), %edi;\
    movl 32(%esp), %edx;\
;\
    addl $4, 48(%esp);\
    addl $4, 40(%esp);\
;\
    pushl 48(%esp);\
    pushl %eax;\
    pushl 48(%esp)              # 40(esp) but esp changed;\
    pushl %ebp;\
    pushl %edx;\
    pushl %edi;\
;\
    addl %esi, %edi;\
    addl %ecx, %edx;\
    pushl 72(%esp)              # 48(esp) but esp changed;\
    pushl %eax;\
    pushl 72(%esp)              # 40(esp) but esp changed;\
    pushl %ebp;\
    pushl %edx;\
    pushl %edi;\
;\
    call *%ebx;\
    addl $24, %esp;\
;\
    call *%ebx;\
    addl $24, %esp;\
;\
    wftan2end:;\
;\
    popl %ebp;\
    popl %edi;\
    popl %esi;\
    popl %edx;\
    popl %ecx;\
    popl %ebx;\
;\
    ret;\
;\
_wftan3:;\
    pushl %ebx;\
    pushl %ecx;\
    pushl %edx;\
    pushl %esi;\
    pushl %edi;\
    pushl %ebp;\
;\
    movl 28(%esp), %ecx;\
    movl 36(%esp), %esi;\
    movl _modulus, %edi;\
    leal (%ecx, %esi, 4), %edx;\
    leal (%ecx, %esi, 8), %ebp;\
;\
    wftan3loop1:;\
    movl -4(%edx, %esi, 4), %eax;\
    movl -4(%ebp, %esi, 4), %ebx;\
;\
    addl %eax, %ebx; addl %eax, %eax;\
    subl %ebx, %eax; jnc 0f; addl %edi, %eax; 0:;\
    cmpl %edi, %ebx; jb 0f; subl %edi, %ebx; 0:;\
;\
    movl %eax, -4(%ebp, %esi, 4);\
    movl -4(%ecx, %esi, 4), %eax;\
    movl %ebx, -4(%edx, %esi, 4);\
;\
    addl %eax, %ebx; cmpl %edi, %ebx; jb 0f; subl %edi, %ebx; 0:;\
;\
    movl %ebx, -4(%ecx, %esi, 4);\
;\
    decl %esi;\
    jnz wftan3loop1;\
;\
    movl 40(%esp), %ebx;\
    movl 44(%esp), %ecx;\
    movl 36(%esp), %esi;\
    movl (%ebx), %ebx;\
;\
    cmpl %ebx, %esi;\
    jne wftan3nblock;\
;\
    movl _wftas(, %ebx, 4), %ebx;\
    movl 32(%esp), %edx;\
    movl 28(%esp), %edi;\
    shll $2, %ecx;\
    shll $2, %esi;\
    pushl %edx;\
    pushl %edi;\
;\
    addl %ecx, %edx;\
    addl %esi, %edi;\
    pushl %edx;\
    pushl %edi;\
;\
    addl %ecx, %edx;\
    addl %esi, %edi;\
    pushl %edx;\
    pushl %edi;\
;\
    call *%ebx;\
    addl $8, %esp;\
;\
    call *%ebx;\
    addl $8, %esp;\
;\
    call *%ebx;\
    addl $8, %esp;\
;\
    jmp wftan3end;\
;\
    wftan3nblock:;\
;\
    movl %esi, %eax;\
    xorl %edx, %edx;\
    divw %bx;\
    movl %eax, %ebp;\
;\
    movl 48(%esp), %edi;\
    movl %ecx, %eax;\
    xorl %edx, %edx;\
    divw (%edi);\
;\
    movl _wftan(, %ebx, 4), %ebx;\
    shll $2, %ecx;\
    shll $2, %esi;\
    movl 28(%esp), %edi;\
    movl 32(%esp), %edx;\
;\
    addl $4, 48(%esp);\
    addl $4, 40(%esp);\
;\
    pushl 48(%esp);\
    pushl %eax;\
    pushl 48(%esp)              # 40(esp) but esp changed;\
    pushl %ebp;\
    pushl %edx;\
    pushl %edi;\
;\
    addl %esi, %edi;\
    addl %ecx, %edx;\
    pushl 72(%esp)              # 48(esp) but esp changed;\
    pushl %eax;\
    pushl 72(%esp)              # 40(esp) but esp changed;\
    pushl %ebp;\
    pushl %edx;\
    pushl %edi;\
;\
    addl %esi, %edi;\
    addl %ecx, %edx;\
    pushl 96(%esp)              # 48(esp) but esp changed;\
    pushl %eax;\
    pushl 96(%esp)              # 40(esp) but esp changed;\
    pushl %ebp;\
    pushl %edx;\
    pushl %edi;\
;\
    call *%ebx;\
    addl $24, %esp;\
;\
    call *%ebx;\
    addl $24, %esp;\
;\
    call *%ebx;\
    addl $24, %esp;\
;\
    wftan3end:;\
;\
    movl 28(%esp), %ecx;\
    movl 36(%esp), %esi;\
    movl _modulus, %edi;\
    leal (%ecx, %esi, 4), %edx;\
    leal (%ecx, %esi, 8), %ebp;\
;\
    wftan3loop2:;\
    movl -4(%ecx, %esi, 4), %eax;\
    movl -4(%edx, %esi, 4), %ebx;\
;\
    addl %ebx, %eax; cmpl %edi, %eax; jb 0f; subl %edi, %eax; 0:;\
;\
    movl -4(%ebp, %esi, 4), %ebx;\
;\
    addl %eax, %ebx; addl %eax, %eax;\
    subl %ebx, %eax; jnc 0f; addl %edi, %eax; 0:;\
    cmpl %edi, %ebx; jb 0f; subl %edi, %ebx; 0:;\
;\
    movl %eax, -4(%ebp, %esi, 4);\
    movl %ebx, -4(%edx, %esi, 4);\
;\
    decl %esi;\
    jnz wftan3loop2;\
;\
    popl %ebp;\
    popl %edi;\
    popl %esi;\
    popl %edx;\
    popl %ecx;\
    popl %ebx;\
;\
    ret;\
");

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -