#include <stdint.h>
#include "stdio.h"
typedef uint16_t uint16;
#define DEPTH 4
void print16( char* text, uint16 *a)
{
// int i=0;
for ( int i=DEPTH; i; i--)
}
void sum1(uint16 *a, uint16 *b, uint16 *sum)
{
sum[0]=0;
for (int i=0; i < DEPTH; i++)
{
if ( a[i] > 256 && b[i] > 256)
sum[i] = (a[i] + b[i]+sum[i]) & 0xff;
if (i < DEPTH-1) sum[i+1] = (a[i] + b[i]) >> 8;
}
}
void mul2(uint16 *a, uint16 b, uint16 *res)
{
uint16 tmp;
res[0]=0;
for (int i=0; i < DEPTH; i++)
{
tmp = (res[i] + b*a[i]);
res[i] = tmp & 0xff;
res[i+1] = tmp >> 8;
}
}
void shl (uint16 *a, uint16 bytes)
{
for (int i=DEPTH-1; i > bytes-1; i--)
a[i] = a[i-bytes];
for (int i=bytes-1; i >=0; i--)
a[i] = 0;
}
void copy(uint16 *a, uint16 *b)
{
for (int i = 0; i < DEPTH; i++)
b[i] = a[i];
}
void mul1(uint16 *a, uint16 *b, uint16 *mul)
{
uint16 tmp[DEPTH];
uint16 res[DEPTH];
for (int i=0; i < DEPTH ; i++)
{
mul2(a,b[i],tmp);
shl(tmp,i);
sum1(tmp,mul,res);
copy(res,mul);
}
}
int main() {
uint16 b[] = { 0x78, 0x56, 0x34, 0x12 }; // 65535
uint16 a[] = { 0xee, 0xaa, 0x11, 0x44 }; // 39321
uint16 mulres[] = {
0x0,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
mul1(a,b,mulres);
print16("a = ", a);
print16("b = ", b);
print16("a*b = ",mulres);
return 0;
}
I2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSAic3RkaW8uaCIKCnR5cGVkZWYgdWludDE2X3QgdWludDE2OwoKI2RlZmluZSBERVBUSCA0Cgp2b2lkIHByaW50MTYoIGNoYXIqIHRleHQsIHVpbnQxNiAqYSkKewogICAgICAgLy8gaW50IGk9MDsKCiAgICAgICAgcHJpbnRmKCIlcyAweCIsdGV4dCk7CiAgICAgICAgZm9yICggaW50IGk9REVQVEg7IGk7IGktLSkKICAgICAgICAgICAgICAgIHByaW50ZigiJTAyeCIsYVtpLTFdKTsKICAgICAgICAgcHJpbnRmKCJcbiIpOwp9CgoKCgoKdm9pZCBzdW0xKHVpbnQxNiAqYSwgdWludDE2ICpiLCB1aW50MTYgKnN1bSkKewogICAgICAgIHN1bVswXT0wOwoKICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBERVBUSDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmICggYVtpXSA+IDI1NiAmJiBiW2ldID4gMjU2KQogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yISIpOwogICAgICAgICAgICAgICAgc3VtW2ldICAgICA9IChhW2ldICsgYltpXStzdW1baV0pICYgMHhmZjsKICAgICAgICAgICAgICAgIGlmIChpIDwgREVQVEgtMSkgc3VtW2krMV0gPSAoYVtpXSArIGJbaV0pID4+IDg7CiAgICAgICAgICAgICAgICB9Cn0KCgp2b2lkIG11bDIodWludDE2ICphLCB1aW50MTYgYiwgdWludDE2ICpyZXMpCnsKICAgICAgICB1aW50MTYgdG1wOwogICAgICAgIHJlc1swXT0wOwoKICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBERVBUSDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgICAgIHRtcCA9IChyZXNbaV0gKyBiKmFbaV0pOwogICAgICAgICAgICAgICAgcmVzW2ldID0gdG1wICYgMHhmZjsKICAgICAgICAgICAgICAgIHJlc1tpKzFdID0gdG1wID4+IDg7CiAgICAgICAgfQp9Cgp2b2lkIHNobCAodWludDE2ICphLCB1aW50MTYgYnl0ZXMpCnsKICAgICAgICBmb3IgKGludCBpPURFUFRILTE7IGkgPiAgYnl0ZXMtMTsgaS0tKQogICAgICAgICAgICAgICAgYVtpXSA9IGFbaS1ieXRlc107CiAgICAgICAgZm9yIChpbnQgaT1ieXRlcy0xOyBpID49MDsgaS0tKQogICAgICAgICAgICAgICAgYVtpXSA9IDA7Cgp9CgoKdm9pZCBjb3B5KHVpbnQxNiAqYSwgdWludDE2ICpiKQp7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBERVBUSDsgaSsrKQogICAgICAgICAgICAgICAgYltpXSA9IGFbaV07Cn0KCgp2b2lkIG11bDEodWludDE2ICphLCB1aW50MTYgKmIsIHVpbnQxNiAqbXVsKQp7CgogICAgICAgIHVpbnQxNiB0bXBbREVQVEhdOwogICAgICAgIHVpbnQxNiByZXNbREVQVEhdOwoKCiAgICAgICBmb3IgKGludCBpPTA7IGkgPCBERVBUSCA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgbXVsMihhLGJbaV0sdG1wKTsKICAgICAgICAgICBzaGwodG1wLGkpOwogICAgICAgICAgIHN1bTEodG1wLG11bCxyZXMpOwogICAgICAgICAgIGNvcHkocmVzLG11bCk7CiAgICAgICAgfQoKfQoKCgppbnQgbWFpbigpIHsKCiAgICAgICAgdWludDE2IGJbXSA9IHsgMHg3OCwgMHg1NiwgMHgzNCwgMHgxMiB9OyAvLyA2NTUzNQogICAgICAgIHVpbnQxNiBhW10gPSB7IDB4ZWUsIDB4YWEsIDB4MTEsIDB4NDQgfTsgLy8gMzkzMjEKCiAgICAgICAgdWludDE2IG11bHJlc1tdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCwweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAgfTsKCiAgICAgICAgbXVsMShhLGIsbXVscmVzKTsKICAgICAgICBwcmludDE2KCJhICA9ICAiLCBhKTsKICAgICAgICBwcmludDE2KCJiICA9ICAiLCBiKTsKICAgICAgICBwcmludDE2KCJhKmIgPSAiLG11bHJlcyk7CiAgICAgICAgcmV0dXJuIDA7Cn0=