📄 integer_8cpp-source.html
字号:
<a name="l00108"></a>00108 <span class="preprocessor"></span><span class="preprocessor"> #define LowWord(a) a##0</span><a name="l00109"></a>00109 <span class="preprocessor"></span><span class="preprocessor"> #define HighWord(a) a##1</span><a name="l00110"></a>00110 <span class="preprocessor"></span><span class="preprocessor"> #ifdef _MSC_VER</span><a name="l00111"></a>00111 <span class="preprocessor"></span><span class="preprocessor"> #define MultiplyWords(p, a, b) p##0 = _umul128(a, b, &p##1);</span><a name="l00112"></a>00112 <span class="preprocessor"></span><span class="preprocessor"> #define Double3Words(c, d) d##1 = __shiftleft128(d##0, d##1, 1); d##0 = __shiftleft128(c, d##0, 1); c *= 2;</span><a name="l00113"></a>00113 <span class="preprocessor"></span><span class="preprocessor"> #elif defined(__DECCXX)</span><a name="l00114"></a>00114 <span class="preprocessor"></span><span class="preprocessor"> #define MultiplyWords(p, a, b) p##0 = a*b; p##1 = asm("umulh %a0, %a1, %v0", a, b);</span><a name="l00115"></a>00115 <span class="preprocessor"></span><span class="preprocessor"> #elif CRYPTOPP_BOOL_X64</span><a name="l00116"></a>00116 <span class="preprocessor"></span><span class="preprocessor"> #define MultiplyWords(p, a, b) asm ("mulq %3" : "=a"(p##0), "=d"(p##1) : "a"(a), "g"(b) : "cc");</span><a name="l00117"></a>00117 <span class="preprocessor"></span><span class="preprocessor"> #define MulAcc(c, d, a, b) asm ("mulq %6; addq %3, %0; adcq %4, %1; adcq $0, %2;" : "+r"(c), "+r"(d##0), "+r"(d##1), "=a"(p0), "=d"(p1) : "a"(a), "g"(b) : "cc");</span><a name="l00118"></a>00118 <span class="preprocessor"></span><span class="preprocessor"> #define Double3Words(c, d) asm ("addq %0, %0; adcq %1, %1; adcq %2, %2;" : "+r"(c), "+r"(d##0), "+r"(d##1) : : "cc");</span><a name="l00119"></a>00119 <span class="preprocessor"></span><span class="preprocessor"> #define Acc2WordsBy1(a, b) asm ("addq %2, %0; adcq $0, %1;" : "+r"(a##0), "+r"(a##1) : "r"(b) : "cc");</span><a name="l00120"></a>00120 <span class="preprocessor"></span><span class="preprocessor"> #define Acc2WordsBy2(a, b) asm ("addq %2, %0; adcq %3, %1;" : "+r"(a##0), "+r"(a##1) : "r"(b##0), "r"(b##1) : "cc");</span><a name="l00121"></a>00121 <span class="preprocessor"></span><span class="preprocessor"> #define Acc3WordsBy2(c, d, e) asm ("addq %5, %0; adcq %6, %1; adcq $0, %2;" : "+r"(c), "=r"(e##0), "=r"(e##1) : "1"(d##0), "2"(d##1), "r"(e##0), "r"(e##1) : "cc");</span><a name="l00122"></a>00122 <span class="preprocessor"></span><span class="preprocessor"> #endif</span><a name="l00123"></a>00123 <span class="preprocessor"></span><span class="preprocessor"> #ifndef Double3Words</span><a name="l00124"></a>00124 <span class="preprocessor"></span><span class="preprocessor"> #define Double3Words(c, d) d##1 = 2*d##1 + (d##0>>(WORD_BITS-1)); d##0 = 2*d##0 + (c>>(WORD_BITS-1)); c *= 2;</span><a name="l00125"></a>00125 <span class="preprocessor"></span><span class="preprocessor"> #endif</span><a name="l00126"></a>00126 <span class="preprocessor"></span><span class="preprocessor"> #ifndef Acc2WordsBy2</span><a name="l00127"></a>00127 <span class="preprocessor"></span><span class="preprocessor"> #define Acc2WordsBy2(a, b) a##0 += b##0; a##1 += a##0 < b##0; a##1 += b##1;</span><a name="l00128"></a>00128 <span class="preprocessor"></span><span class="preprocessor"> #endif</span><a name="l00129"></a>00129 <span class="preprocessor"></span><span class="preprocessor"> #define AddWithCarry(u, a, b) {word t = a+b; u##0 = t + u##1; u##1 = (t<a) + (u##0<t);}</span><a name="l00130"></a>00130 <span class="preprocessor"></span><span class="preprocessor"> #define SubtractWithBorrow(u, a, b) {word t = a-b; u##0 = t - u##1; u##1 = (t>a) + (u##0>t);}</span><a name="l00131"></a>00131 <span class="preprocessor"></span><span class="preprocessor"> #define GetCarry(u) u##1</span><a name="l00132"></a>00132 <span class="preprocessor"></span><span class="preprocessor"> #define GetBorrow(u) u##1</span><a name="l00133"></a>00133 <span class="preprocessor"></span><span class="preprocessor">#else</span><a name="l00134"></a>00134 <span class="preprocessor"></span><span class="preprocessor"> #define Declare2Words(x) dword x;</span><a name="l00135"></a>00135 <span class="preprocessor"></span><span class="preprocessor"> #if _MSC_VER >= 1400 && !defined(__INTEL_COMPILER)</span><a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor"> #define MultiplyWords(p, a, b) p = __emulu(a, b);</span><a name="l00137"></a>00137 <span class="preprocessor"></span><span class="preprocessor"> #else</span><a name="l00138"></a>00138 <span class="preprocessor"></span><span class="preprocessor"> #define MultiplyWords(p, a, b) p = (dword)a*b;</span><a name="l00139"></a>00139 <span class="preprocessor"></span><span class="preprocessor"> #endif</span><a name="l00140"></a>00140 <span class="preprocessor"></span><span class="preprocessor"> #define AssignWord(a, b) a = b;</span><a name="l00141"></a>00141 <span class="preprocessor"></span><span class="preprocessor"> #define Add2WordsBy1(a, b, c) a = b + c;</span><a name="l00142"></a>00142 <span class="preprocessor"></span><span class="preprocessor"> #define Acc2WordsBy2(a, b) a += b;</span><a name="l00143"></a>00143 <span class="preprocessor"></span><span class="preprocessor"> #define LowWord(a) word(a)</span><a name="l00144"></a>00144 <span class="preprocessor"></span><span class="preprocessor"> #define HighWord(a) word(a>>WORD_BITS)</span><a name="l00145"></a>00145 <span class="preprocessor"></span><span class="preprocessor"> #define Double3Words(c, d) d = 2*d + (c>>(WORD_BITS-1)); c *= 2;</span><a name="l00146"></a>00146 <span class="preprocessor"></span><span class="preprocessor"> #define AddWithCarry(u, a, b) u = dword(a) + b + GetCarry(u);</span><a name="l00147"></a>00147 <span class="preprocessor"></span><span class="preprocessor"> #define SubtractWithBorrow(u, a, b) u = dword(a) - b - GetBorrow(u);</span><a name="l00148"></a>00148 <span class="preprocessor"></span><span class="preprocessor"> #define GetCarry(u) HighWord(u)</span><a name="l00149"></a>00149 <span class="preprocessor"></span><span class="preprocessor"> #define GetBorrow(u) word(u>>(WORD_BITS*2-1))</span><a name="l00150"></a>00150 <span class="preprocessor"></span><span class="preprocessor">#endif</span><a name="l00151"></a>00151 <span class="preprocessor"></span><span class="preprocessor">#ifndef MulAcc</span><a name="l00152"></a>00152 <span class="preprocessor"></span><span class="preprocessor"> #define MulAcc(c, d, a, b) MultiplyWords(p, a, b); Acc2WordsBy1(p, c); c = LowWord(p); Acc2WordsBy1(d, HighWord(p));</span><a name="l00153"></a>00153 <span class="preprocessor"></span><span class="preprocessor">#endif</span><a name="l00154"></a>00154 <span class="preprocessor"></span><span class="preprocessor">#ifndef Acc2WordsBy1</span><a name="l00155"></a>00155 <span class="preprocessor"></span><span class="preprocessor"> #define Acc2WordsBy1(a, b) Add2WordsBy1(a, a, b)</span><a name="l00156"></a>00156 <span class="preprocessor"></span><span class="preprocessor">#endif</span><a name="l00157"></a>00157 <span class="preprocessor"></span><span class="preprocessor">#ifndef Acc3WordsBy2</span><a name="l00158"></a>00158 <span class="preprocessor"></span><span class="preprocessor"> #define Acc3WordsBy2(c, d, e) Acc2WordsBy1(e, c); c = LowWord(e); Add2WordsBy1(e, d, HighWord(e));</span><a name="l00159"></a>00159 <span class="preprocessor"></span><span class="preprocessor">#endif</span><a name="l00160"></a>00160 <span class="preprocessor"></span><a name="l00161"></a><a class="code" href="class_d_word.html">00161</a> <span class="keyword">class </span><a class="code" href="class_d_word.html">DWord</a><a name="l00162"></a>00162 {<a name="l00163"></a>00163 <span class="keyword">public</span>:<a name="l00164"></a><a class="code" href="class_d_word.html#bfd01f04e0570e990fe27e9bbdf1c6ce">00164</a> <a class="code" href="class_d_word.html#bfd01f04e0570e990fe27e9bbdf1c6ce">DWord</a>() {}<a name="l00165"></a>00165 <a name="l00166"></a>00166 <span class="preprocessor">#ifdef CRYPTOPP_NATIVE_DWORD_AVAILABLE</span><a name="l00167"></a><a class="code" href="class_d_word.html#39aee22ff28986f7d5b3a4b1278d63c4">00167</a> <span class="preprocessor"></span> <span class="keyword">explicit</span> <a class="code" href="class_d_word.html#bfd01f04e0570e990fe27e9bbdf1c6ce">DWord</a>(word <a class="code" href="class_d_word.html#be364d3c0509c62f464e3813e152502e">low</a>)<a name="l00168"></a>00168 {<a name="l00169"></a>00169 <a class="code" href="class_d_word.html#f1503dcbfece6416389ad1ff69a0c10b">m_whole</a> = low;<a name="l00170"></a>00170 }<a name="l00171"></a>00171 <span class="preprocessor">#else</span><a name="l00172"></a>00172 <span class="preprocessor"></span> <span class="keyword">explicit</span> <a class="code" href="class_d_word.html#bfd01f04e0570e990fe27e9bbdf1c6ce">DWord</a>(word <a class="code" href="class_d_word.html#be364d3c0509c62f464e3813e152502e">low</a>)<a name="l00173"></a>00173 {<a name="l00174"></a>00174 m_halfs.low = low;<a name="l00175"></a>00175 m_halfs.high = 0;<a name="l00176"></a>00176 }<a name="l00177"></a>00177 <span class="preprocessor">#endif</span><a name="l00178"></a>00178 <span class="preprocessor"></span><a name="l00179"></a><a class="code" href="class_d_word.html#bbb0ecbdb03ece0f85fc81d0034c2804">00179</a> <a class="code" href="class_d_word.html#bfd01f04e0570e990fe27e9bbdf1c6ce">DWord</a>(word <a class="code" href="class_d_word.html#be364d3c0509c62f464e3813e152502e">low</a>, word <a class="code" href="class_d_word.html#b961352c0156e8a803cc7f06fac36f4f">high</a>)<a name="l00180"></a>00180 {<a name="l00181"></a>00181 m_halfs.low = low;<a name="l00182"></a>00182 m_halfs.high = high;<a name="l00183"></a>00183 }<a name="l00184"></a>00184 <a name="l00185"></a><a class="code" href="class_d_word.html#7fb9bde7a30b7fc28a08bb2fc0fc2706">00185</a> <span class="keyword">static</span> <a class="code" href="class_d_word.html">DWord</a> <a class="code" href="class_d_word.html#7fb9bde7a30b7fc28a08bb2fc0fc2706">Multiply</a>(word a, word b)<a name="l00186"></a>00186 {<a name="l00187"></a>00187 <a class="code" href="class_d_word.html">DWord</a> r;<a name="l00188"></a>00188 <span class="preprocessor"> #ifdef CRYPTOPP_NATIVE_DWORD_AVAILABLE</span><a name="l00189"></a>00189 <span class="preprocessor"></span> r.<a class="code" href="class_d_word.html#f1503dcbfece6416389ad1ff69a0c10b">m_whole</a> = (dword)a * b;<a name="l00190"></a>00190 <span class="preprocessor"> #else</span><a name="l00191"></a>00191 <span class="preprocessor"></span> r.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.low = _umul128(a, b, &r.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.high);<a name="l00192"></a>00192 <span class="preprocessor"> #endif</span><a name="l00193"></a>00193 <span class="preprocessor"></span> <span class="keywordflow">return</span> r;<a name="l00194"></a>00194 }<a name="l00195"></a>00195 <a name="l00196"></a><a class="code" href="class_d_word.html#4e7349021336181074857b4049ef2f3f">00196</a> <span class="keyword">static</span> <a class="code" href="class_d_word.html">DWord</a> <a class="code" href="class_d_word.html#4e7349021336181074857b4049ef2f3f">MultiplyAndAdd</a>(word a, word b, word c)<a name="l00197"></a>00197 {<a name="l00198"></a>00198 <a class="code" href="class_d_word.html">DWord</a> r = <a class="code" href="class_d_word.html#7fb9bde7a30b7fc28a08bb2fc0fc2706">Multiply</a>(a, b);<a name="l00199"></a>00199 <span class="keywordflow">return</span> r += c;<a name="l00200"></a>00200 }<a name="l00201"></a>00201 <a name="l00202"></a><a class="code" href="class_d_word.html#7e2dd59548ac9f6eb3bc8f75f4a7b114">00202</a> <a class="code" href="class_d_word.html">DWord</a> & <a class="code" href="class_d_word.html#7e2dd59548ac9f6eb3bc8f75f4a7b114">operator+=</a>(word a)<a name="l00203"></a>00203 {<a name="l00204"></a>00204 <span class="preprocessor"> #ifdef CRYPTOPP_NATIVE_DWORD_AVAILABLE</span><a name="l00205"></a>00205 <span class="preprocessor"></span> <a class="code" href="class_d_word.html#f1503dcbfece6416389ad1ff69a0c10b">m_whole</a> = <a class="code" href="class_d_word.html#f1503dcbfece6416389ad1ff69a0c10b">m_whole</a> + a;<a name="l00206"></a>00206 <span class="preprocessor"> #else</span><a name="l00207"></a>00207 <span class="preprocessor"></span> m_halfs.low += a;<a name="l00208"></a>00208 m_halfs.high += (m_halfs.low < a);<a name="l00209"></a>00209 <span class="preprocessor"> #endif</span><a name="l00210"></a>00210 <span class="preprocessor"></span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;<a name="l00211"></a>00211 }<a name="l00212"></a>00212 <a name="l00213"></a><a class="code" href="class_d_word.html#d00fe4996c837cff9bd1f85c8bcea17b">00213</a> <a class="code" href="class_d_word.html">DWord</a> <a class="code" href="class_d_word.html#d00fe4996c837cff9bd1f85c8bcea17b">operator+</a>(word a)<a name="l00214"></a>00214 {<a name="l00215"></a>00215 <a class="code" href="class_d_word.html">DWord</a> r;<a name="l00216"></a>00216 <span class="preprocessor"> #ifdef CRYPTOPP_NATIVE_DWORD_AVAILABLE</span><a name="l00217"></a>00217 <span class="preprocessor"></span> r.<a class="code" href="class_d_word.html#f1503dcbfece6416389ad1ff69a0c10b">m_whole</a> = <a class="code" href="class_d_word.html#f1503dcbfece6416389ad1ff69a0c10b">m_whole</a> + a;<a name="l00218"></a>00218 <span class="preprocessor"> #else</span><a name="l00219"></a>00219 <span class="preprocessor"></span> r.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.low = m_halfs.low + a;<a name="l00220"></a>00220 r.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.high = m_halfs.high + (r.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.low < a);<a name="l00221"></a>00221 <span class="preprocessor"> #endif</span><a name="l00222"></a>00222 <span class="preprocessor"></span> <span class="keywordflow">return</span> r;<a name="l00223"></a>00223 }<a name="l00224"></a>00224 <a name="l00225"></a><a class="code" href="class_d_word.html#159c633b6d08fc28b7babb58346d7a83">00225</a> <a class="code" href="class_d_word.html">DWord</a> <a class="code" href="class_d_word.html#159c633b6d08fc28b7babb58346d7a83">operator-</a>(<a class="code" href="class_d_word.html">DWord</a> a)<a name="l00226"></a>00226 {<a name="l00227"></a>00227 <a class="code" href="class_d_word.html">DWord</a> r;<a name="l00228"></a>00228 <span class="preprocessor"> #ifdef CRYPTOPP_NATIVE_DWORD_AVAILABLE</span><a name="l00229"></a>00229 <span class="preprocessor"></span> r.<a class="code" href="class_d_word.html#f1503dcbfece6416389ad1ff69a0c10b">m_whole</a> = <a class="code" href="class_d_word.html#f1503dcbfece6416389ad1ff69a0c10b">m_whole</a> - a.<a class="code" href="class_d_word.html#f1503dcbfece6416389ad1ff69a0c10b">m_whole</a>;<a name="l00230"></a>00230 <span class="preprocessor"> #else</span><a name="l00231"></a>00231 <span class="preprocessor"></span> r.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.low = m_halfs.low - a.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.low;<a name="l00232"></a>00232 r.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.high = m_halfs.high - a.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.high - (r.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.low > m_halfs.low);<a name="l00233"></a>00233 <span class="preprocessor"> #endif</span><a name="l00234"></a>00234 <span class="preprocessor"></span> <span class="keywordflow">return</span> r;<a name="l00235"></a>00235 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -