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

📄 integer_8cpp-source.html

📁 著名的密码库Crypto++的文档 C++语言的杰作。程序员必备。
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<a name="l00492"></a>00492 <span class="preprocessor"></span><span class="preprocessor">        #define SquPrologue                                     \</span><a name="l00493"></a>00493 <span class="preprocessor">                AS2(    mov             eax, A)                 \</span><a name="l00494"></a>00494 <span class="preprocessor">                AS2(    mov             ecx, C)                 \</span><a name="l00495"></a>00495 <span class="preprocessor">                SaveEBX                                                 \</span><a name="l00496"></a>00496 <span class="preprocessor">                AS2(    lea             ebx, s_maskLow16)</span><a name="l00497"></a>00497 <span class="preprocessor"></span><span class="preprocessor">        #define MulPrologue                                     \</span><a name="l00498"></a>00498 <span class="preprocessor">                AS2(    mov             eax, A)                 \</span><a name="l00499"></a>00499 <span class="preprocessor">                AS2(    mov             edi, B)                 \</span><a name="l00500"></a>00500 <span class="preprocessor">                AS2(    mov             ecx, C)                 \</span><a name="l00501"></a>00501 <span class="preprocessor">                SaveEBX                                                 \</span><a name="l00502"></a>00502 <span class="preprocessor">                AS2(    lea             ebx, s_maskLow16)</span><a name="l00503"></a>00503 <span class="preprocessor"></span><span class="preprocessor">        #define TopPrologue                                     \</span><a name="l00504"></a>00504 <span class="preprocessor">                AS2(    mov             eax, A)                 \</span><a name="l00505"></a>00505 <span class="preprocessor">                AS2(    mov             edi, B)                 \</span><a name="l00506"></a>00506 <span class="preprocessor">                AS2(    mov             ecx, C)                 \</span><a name="l00507"></a>00507 <span class="preprocessor">                AS2(    mov             esi, L)                 \</span><a name="l00508"></a>00508 <span class="preprocessor">                SaveEBX                                                 \</span><a name="l00509"></a>00509 <span class="preprocessor">                AS2(    lea             ebx, s_maskLow16)</span><a name="l00510"></a>00510 <span class="preprocessor"></span><span class="preprocessor">        #define SquEpilogue             RestoreEBX</span><a name="l00511"></a>00511 <span class="preprocessor"></span><span class="preprocessor">        #define MulEpilogue             RestoreEBX</span><a name="l00512"></a>00512 <span class="preprocessor"></span><span class="preprocessor">        #define TopEpilogue             RestoreEBX</span><a name="l00513"></a>00513 <span class="preprocessor"></span><span class="preprocessor">#endif</span><a name="l00514"></a>00514 <span class="preprocessor"></span><a name="l00515"></a>00515 <span class="preprocessor">#ifdef CRYPTOPP_X64_MASM_AVAILABLE</span><a name="l00516"></a>00516 <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> {<a name="l00517"></a>00517 <span class="keywordtype">int</span> Baseline_Add(<span class="keywordtype">size_t</span> N, word *C, <span class="keyword">const</span> word *A, <span class="keyword">const</span> word *B);<a name="l00518"></a>00518 <span class="keywordtype">int</span> Baseline_Sub(<span class="keywordtype">size_t</span> N, word *C, <span class="keyword">const</span> word *A, <span class="keyword">const</span> word *B);<a name="l00519"></a>00519 }<a name="l00520"></a>00520 <span class="preprocessor">#elif defined(CRYPTOPP_X64_ASM_AVAILABLE) &amp;&amp; defined(__GNUC__)</span><a name="l00521"></a>00521 <span class="preprocessor"></span><span class="keywordtype">int</span> Baseline_Add(<span class="keywordtype">size_t</span> N, word *C, <span class="keyword">const</span> word *A, <span class="keyword">const</span> word *B)<a name="l00522"></a>00522 {<a name="l00523"></a>00523         word result;<a name="l00524"></a>00524         __asm__ __volatile__<a name="l00525"></a>00525         (<a name="l00526"></a>00526         <span class="stringliteral">".intel_syntax;"</span><a name="l00527"></a>00527         AS1(    neg             %1)<a name="l00528"></a>00528         ASJ(    jz,             1, f)<a name="l00529"></a>00529         AS2(    mov             %0,[%3+8*%1])<a name="l00530"></a>00530         AS2(    <span class="keyword">add</span>             %0,[%4+8*%1])<a name="l00531"></a>00531         AS2(    mov             [%2+8*%1],%0)<a name="l00532"></a>00532         ASL(0)<a name="l00533"></a>00533         AS2(    mov             %0,[%3+8*%1+8])<a name="l00534"></a>00534         AS2(    adc             %0,[%4+8*%1+8])<a name="l00535"></a>00535         AS2(    mov             [%2+8*%1+8],%0)<a name="l00536"></a>00536         AS2(    lea             %1,[%1+2])<a name="l00537"></a>00537         ASJ(    jrcxz,  1, f)<a name="l00538"></a>00538         AS2(    mov             %0,[%3+8*%1])<a name="l00539"></a>00539         AS2(    adc             %0,[%4+8*%1])<a name="l00540"></a>00540         AS2(    mov             [%2+8*%1],%0)<a name="l00541"></a>00541         ASJ(    jmp,    0, b)<a name="l00542"></a>00542         ASL(1)<a name="l00543"></a>00543         AS2(    mov             %0, 0)<a name="l00544"></a>00544         AS2(    adc             %0, %0)<a name="l00545"></a>00545         <span class="stringliteral">".att_syntax;"</span><a name="l00546"></a>00546         : <span class="stringliteral">"=&amp;r"</span> (result)<a name="l00547"></a>00547         : <span class="stringliteral">"c"</span> (N), <span class="stringliteral">"r"</span> (C+N), <span class="stringliteral">"r"</span> (A+N), <span class="stringliteral">"r"</span> (B+N)<a name="l00548"></a>00548         : <span class="stringliteral">"memory"</span>, <span class="stringliteral">"cc"</span><a name="l00549"></a>00549         );<a name="l00550"></a>00550         <span class="keywordflow">return</span> (<span class="keywordtype">int</span>)result;<a name="l00551"></a>00551 }<a name="l00552"></a>00552 <a name="l00553"></a>00553 <span class="keywordtype">int</span> Baseline_Sub(<span class="keywordtype">size_t</span> N, word *C, <span class="keyword">const</span> word *A, <span class="keyword">const</span> word *B)<a name="l00554"></a>00554 {<a name="l00555"></a>00555         word result;<a name="l00556"></a>00556         __asm__ __volatile__<a name="l00557"></a>00557         (<a name="l00558"></a>00558         <span class="stringliteral">".intel_syntax;"</span><a name="l00559"></a>00559         AS1(    neg             %1)<a name="l00560"></a>00560         ASJ(    jz,             1, f)<a name="l00561"></a>00561         AS2(    mov             %0,[%3+8*%1])<a name="l00562"></a>00562         AS2(    sub             %0,[%4+8*%1])<a name="l00563"></a>00563         AS2(    mov             [%2+8*%1],%0)<a name="l00564"></a>00564         ASL(0)<a name="l00565"></a>00565         AS2(    mov             %0,[%3+8*%1+8])<a name="l00566"></a>00566         AS2(    sbb             %0,[%4+8*%1+8])<a name="l00567"></a>00567         AS2(    mov             [%2+8*%1+8],%0)<a name="l00568"></a>00568         AS2(    lea             %1,[%1+2])<a name="l00569"></a>00569         ASJ(    jrcxz,  1, f)<a name="l00570"></a>00570         AS2(    mov             %0,[%3+8*%1])<a name="l00571"></a>00571         AS2(    sbb             %0,[%4+8*%1])<a name="l00572"></a>00572         AS2(    mov             [%2+8*%1],%0)<a name="l00573"></a>00573         ASJ(    jmp,    0, b)<a name="l00574"></a>00574         ASL(1)<a name="l00575"></a>00575         AS2(    mov             %0, 0)<a name="l00576"></a>00576         AS2(    adc             %0, %0)<a name="l00577"></a>00577         <span class="stringliteral">".att_syntax;"</span><a name="l00578"></a>00578         : <span class="stringliteral">"=&amp;r"</span> (result)<a name="l00579"></a>00579         : <span class="stringliteral">"c"</span> (N), <span class="stringliteral">"r"</span> (C+N), <span class="stringliteral">"r"</span> (A+N), <span class="stringliteral">"r"</span> (B+N)<a name="l00580"></a>00580         : <span class="stringliteral">"memory"</span>, <span class="stringliteral">"cc"</span><a name="l00581"></a>00581         );<a name="l00582"></a>00582         <span class="keywordflow">return</span> (<span class="keywordtype">int</span>)result;<a name="l00583"></a>00583 }<a name="l00584"></a>00584 <span class="preprocessor">#elif defined(CRYPTOPP_X86_ASM_AVAILABLE) &amp;&amp; CRYPTOPP_BOOL_X86</span><a name="l00585"></a>00585 <span class="preprocessor"></span>CRYPTOPP_NAKED <span class="keywordtype">int</span> CRYPTOPP_FASTCALL Baseline_Add(<span class="keywordtype">size_t</span> N, word *C, <span class="keyword">const</span> word *A, <span class="keyword">const</span> word *B)<a name="l00586"></a>00586 {<a name="l00587"></a>00587         AddPrologue<a name="l00588"></a>00588 <a name="l00589"></a>00589         <span class="comment">// now: eax = A, edi = B, edx = C, ecx = N</span><a name="l00590"></a>00590         AS2(    lea             eax, [eax+4*ecx])<a name="l00591"></a>00591         AS2(    lea             edi, [edi+4*ecx])<a name="l00592"></a>00592         AS2(    lea             edx, [edx+4*ecx])<a name="l00593"></a>00593 <a name="l00594"></a>00594         AS1(    neg             ecx)                            <span class="comment">// ecx is negative index</span><a name="l00595"></a>00595         AS2(    test    ecx, 2)                         <span class="comment">// this clears carry flag</span><a name="l00596"></a>00596         ASJ(    jz,             0, f)<a name="l00597"></a>00597         AS2(    sub             ecx, 2)<a name="l00598"></a>00598         ASJ(    jmp,    1, f)<a name="l00599"></a>00599 <a name="l00600"></a>00600         ASL(0)<a name="l00601"></a>00601         ASJ(    jecxz,  2, f)                           <span class="comment">// loop until ecx overflows and becomes zero</span><a name="l00602"></a>00602         AS2(    mov             esi,[eax+4*ecx])<a name="l00603"></a>00603         AS2(    adc             esi,[edi+4*ecx])<a name="l00604"></a>00604         AS2(    mov             [edx+4*ecx],esi)<a name="l00605"></a>00605         AS2(    mov             esi,[eax+4*ecx+4])<a name="l00606"></a>00606         AS2(    adc             esi,[edi+4*ecx+4])<a name="l00607"></a>00607         AS2(    mov             [edx+4*ecx+4],esi)<a name="l00608"></a>00608         ASL(1)<a name="l00609"></a>00609         AS2(    mov             esi,[eax+4*ecx+8])<a name="l00610"></a>00610         AS2(    adc             esi,[edi+4*ecx+8])<a name="l00611"></a>00611         AS2(    mov             [edx+4*ecx+8],esi)<a name="l00612"></a>00612         AS2(    mov             esi,[eax+4*ecx+12])<a name="l00613"></a>00613         AS2(    adc             esi,[edi+4*ecx+12])<a name="l00614"></a>00614         AS2(    mov             [edx+4*ecx+12],esi)<a name="l00615"></a>00615 <a name="l00616"></a>00616         AS2(    lea             ecx,[ecx+4])            <span class="comment">// advance index, avoid inc which causes slowdown on Intel Core 2</span><a na

⌨️ 快捷键说明

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