📄 mp_cmul.cpp
字号:
/************************************************** Comba Multiplication Source File ** (C) 1999-2002 The Botan Project **************************************************/#include <botan/mp_core.h>namespace Botan {namespace {/************************************************** Multiply-Add Accumulator **************************************************/void word3_muladd(word& w0, word& w1, word& w2, word x, word y) { dword z = (dword)x * y + w2; w2 = MP_LOW_WORD(z); z = (dword)MP_HIGH_WORD(z) + w1; w1 = MP_LOW_WORD(z); w0 = (dword)MP_HIGH_WORD(z) + w0; }/************************************************** Shift the words down **************************************************/word word3_shift(word& w0, word& w1, word& w2) { word t = w2; w2 = w1; w1 = w0; w0 = 0; return t; }}/************************************************** Comba 4x4 Multiplication **************************************************/void bigint_comba4(word z[8], const word x[4], const word y[4]) { word w0 = 0, w1 = 0, w2 = 0; word3_muladd(w0, w1, w2, x[0], y[0]); z[0] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[0], y[1]); word3_muladd(w0, w1, w2, x[1], y[0]); z[1] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[0], y[2]); word3_muladd(w0, w1, w2, x[1], y[1]); word3_muladd(w0, w1, w2, x[2], y[0]); z[2] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[0], y[3]); word3_muladd(w0, w1, w2, x[1], y[2]); word3_muladd(w0, w1, w2, x[2], y[1]); word3_muladd(w0, w1, w2, x[3], y[0]); z[3] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[1], y[3]); word3_muladd(w0, w1, w2, x[2], y[2]); word3_muladd(w0, w1, w2, x[3], y[1]); z[4] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[2], y[3]); word3_muladd(w0, w1, w2, x[3], y[2]); z[5] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[3], y[3]); z[6] = w2; z[7] = w1; }/************************************************** Comba 8x8 Multiplication **************************************************/void bigint_comba8(word z[16], const word x[8], const word y[8]) { word w0 = 0, w1 = 0, w2 = 0; word3_muladd(w0, w1, w2, x[0], y[0]); z[0] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[0], y[1]); word3_muladd(w0, w1, w2, x[1], y[0]); z[1] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[0], y[2]); word3_muladd(w0, w1, w2, x[1], y[1]); word3_muladd(w0, w1, w2, x[2], y[0]); z[2] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[0], y[3]); word3_muladd(w0, w1, w2, x[1], y[2]); word3_muladd(w0, w1, w2, x[2], y[1]); word3_muladd(w0, w1, w2, x[3], y[0]); z[3] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[0], y[4]); word3_muladd(w0, w1, w2, x[1], y[3]); word3_muladd(w0, w1, w2, x[2], y[2]); word3_muladd(w0, w1, w2, x[3], y[1]); word3_muladd(w0, w1, w2, x[4], y[0]); z[4] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[0], y[5]); word3_muladd(w0, w1, w2, x[1], y[4]); word3_muladd(w0, w1, w2, x[2], y[3]); word3_muladd(w0, w1, w2, x[3], y[2]); word3_muladd(w0, w1, w2, x[4], y[1]); word3_muladd(w0, w1, w2, x[5], y[0]); z[5] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[0], y[6]); word3_muladd(w0, w1, w2, x[1], y[5]); word3_muladd(w0, w1, w2, x[2], y[4]); word3_muladd(w0, w1, w2, x[3], y[3]); word3_muladd(w0, w1, w2, x[4], y[2]); word3_muladd(w0, w1, w2, x[5], y[1]); word3_muladd(w0, w1, w2, x[6], y[0]); z[6] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[0], y[7]); word3_muladd(w0, w1, w2, x[1], y[6]); word3_muladd(w0, w1, w2, x[2], y[5]); word3_muladd(w0, w1, w2, x[3], y[4]); word3_muladd(w0, w1, w2, x[4], y[3]); word3_muladd(w0, w1, w2, x[5], y[2]); word3_muladd(w0, w1, w2, x[6], y[1]); word3_muladd(w0, w1, w2, x[7], y[0]); z[7] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[1], y[7]); word3_muladd(w0, w1, w2, x[2], y[6]); word3_muladd(w0, w1, w2, x[3], y[5]); word3_muladd(w0, w1, w2, x[4], y[4]); word3_muladd(w0, w1, w2, x[5], y[3]); word3_muladd(w0, w1, w2, x[6], y[2]); word3_muladd(w0, w1, w2, x[7], y[1]); z[8] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[2], y[7]); word3_muladd(w0, w1, w2, x[3], y[6]); word3_muladd(w0, w1, w2, x[4], y[5]); word3_muladd(w0, w1, w2, x[5], y[4]); word3_muladd(w0, w1, w2, x[6], y[3]); word3_muladd(w0, w1, w2, x[7], y[2]); z[9] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[3], y[7]); word3_muladd(w0, w1, w2, x[4], y[6]); word3_muladd(w0, w1, w2, x[5], y[5]); word3_muladd(w0, w1, w2, x[6], y[4]); word3_muladd(w0, w1, w2, x[7], y[3]); z[10] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[4], y[7]); word3_muladd(w0, w1, w2, x[5], y[6]); word3_muladd(w0, w1, w2, x[6], y[5]); word3_muladd(w0, w1, w2, x[7], y[4]); z[11] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[5], y[7]); word3_muladd(w0, w1, w2, x[6], y[6]); word3_muladd(w0, w1, w2, x[7], y[5]); z[12] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[6], y[7]); word3_muladd(w0, w1, w2, x[7], y[6]); z[13] = word3_shift(w0, w1, w2); word3_muladd(w0, w1, w2, x[7], y[7]); z[14] = w2; z[15] = w1; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -