#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <inttypes.h>
uint32_t multiply (uint16_t a, uint16_t b)
{
return ((a & ( (int16_t)( ( b & (1 << 0) ) << 15 ) ) / ( 1 << 15) ) << 0 ) +
((a & ( (int16_t)( ( b & (1 << 1) ) << 14 ) ) / ( 1 << 15) ) << 1 ) +
((a & ( (int16_t)( ( b & (1 << 2) ) << 13 ) ) / ( 1 << 15) ) << 2 ) +
((a & ( (int16_t)( ( b & (1 << 3) ) << 12 ) ) / ( 1 << 15) ) << 3 ) +
((a & ( (int16_t)( ( b & (1 << 4) ) << 11 ) ) / ( 1 << 15) ) << 4 ) +
((a & ( (int16_t)( ( b & (1 << 5) ) << 10 ) ) / ( 1 << 15) ) << 5 ) +
((a & ( (int16_t)( ( b & (1 << 6) ) << 9 ) ) / ( 1 << 15) ) << 6 ) +
((a & ( (int16_t)( ( b & (1 << 7) ) << 8 ) ) / ( 1 << 15) ) << 7 ) +
((a & ( (int16_t)( ( b & (1 << 8) ) << 7 ) ) / ( 1 << 15) ) << 8 ) +
((a & ( (int16_t)( ( b & (1 << 9) ) << 6 ) ) / ( 1 << 15) ) << 9 ) +
((a & ( (int16_t)( ( b & (1 <<10) ) << 5 ) ) / ( 1 << 15) ) << 10) +
((a & ( (int16_t)( ( b & (1 <<11) ) << 4 ) ) / ( 1 << 15) ) << 11) +
((a & ( (int16_t)( ( b & (1 <<12) ) << 3 ) ) / ( 1 << 15) ) << 12) +
((a & ( (int16_t)( ( b & (1 <<13) ) << 2 ) ) / ( 1 << 15) ) << 13) +
((a & ( (int16_t)( ( b & (1 <<14) ) << 1 ) ) / ( 1 << 15) ) << 14) +
((a & ( (int16_t)( ( b & (1 <<15) ) << 0 ) ) / ( 1 << 15) ) << 15);
}
int main(void)
{
uint16_t a, b;
a = 0;
b = 0;
do
{
if (multiply(a, b) != a * b)
"ERROR:\n"
"my: %u\n"
"norm: %u\n"
"%hu * %hu\n"
"\n",
multiply(a, b), (a * b),a, b
);
if (UINT16_MAX == a)
{
b++;
}
a++;
//fprintf(stderr, "%hu * %hu\n", a, b);
} while ( ( a != 0 ) || (b != 0) );
fprintf(stderr
, "%"PRIu16
"* ""%"PRIu16
"\n", a
, b
);
return 0;
}
CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxsaW1pdHMuaD4KI2luY2x1ZGUgPGludHR5cGVzLmg+Cgp1aW50MzJfdCBtdWx0aXBseSAodWludDE2X3QgYSwgdWludDE2X3QgYikKewogIHJldHVybiAoKGEgJiAgKCAoaW50MTZfdCkoICggYiAmICgxIDw8IDApICkgPDwgMTUgKSApIC8gKCAxIDw8IDE1KSApIDw8IDAgKSArCiAgICAgICAgICgoYSAmICAoIChpbnQxNl90KSggKCBiICYgKDEgPDwgMSkgKSA8PCAxNCApICkgLyAoIDEgPDwgMTUpICkgPDwgMSApICsKICAgICAgICAgKChhICYgICggKGludDE2X3QpKCAoIGIgJiAoMSA8PCAyKSApIDw8IDEzICkgKSAvICggMSA8PCAxNSkgKSA8PCAyICkgKwogICAgICAgICAoKGEgJiAgKCAoaW50MTZfdCkoICggYiAmICgxIDw8IDMpICkgPDwgMTIgKSApIC8gKCAxIDw8IDE1KSApIDw8IDMgKSArCiAgICAgICAgICgoYSAmICAoIChpbnQxNl90KSggKCBiICYgKDEgPDwgNCkgKSA8PCAxMSApICkgLyAoIDEgPDwgMTUpICkgPDwgNCApICsKICAgICAgICAgKChhICYgICggKGludDE2X3QpKCAoIGIgJiAoMSA8PCA1KSApIDw8IDEwICkgKSAvICggMSA8PCAxNSkgKSA8PCA1ICkgKwogICAgICAgICAoKGEgJiAgKCAoaW50MTZfdCkoICggYiAmICgxIDw8IDYpICkgPDwgOSAgKSApIC8gKCAxIDw8IDE1KSApIDw8IDYgKSArCiAgICAgICAgICgoYSAmICAoIChpbnQxNl90KSggKCBiICYgKDEgPDwgNykgKSA8PCA4ICApICkgLyAoIDEgPDwgMTUpICkgPDwgNyApICsKICAgICAgICAgKChhICYgICggKGludDE2X3QpKCAoIGIgJiAoMSA8PCA4KSApIDw8IDcgICkgKSAvICggMSA8PCAxNSkgKSA8PCA4ICkgKwogICAgICAgICAoKGEgJiAgKCAoaW50MTZfdCkoICggYiAmICgxIDw8IDkpICkgPDwgNiAgKSApIC8gKCAxIDw8IDE1KSApIDw8IDkgKSArCiAgICAgICAgICgoYSAmICAoIChpbnQxNl90KSggKCBiICYgKDEgPDwxMCkgKSA8PCA1ICApICkgLyAoIDEgPDwgMTUpICkgPDwgMTApICsKICAgICAgICAgKChhICYgICggKGludDE2X3QpKCAoIGIgJiAoMSA8PDExKSApIDw8IDQgICkgKSAvICggMSA8PCAxNSkgKSA8PCAxMSkgKwogICAgICAgICAoKGEgJiAgKCAoaW50MTZfdCkoICggYiAmICgxIDw8MTIpICkgPDwgMyAgKSApIC8gKCAxIDw8IDE1KSApIDw8IDEyKSArCiAgICAgICAgICgoYSAmICAoIChpbnQxNl90KSggKCBiICYgKDEgPDwxMykgKSA8PCAyICApICkgLyAoIDEgPDwgMTUpICkgPDwgMTMpICsKICAgICAgICAgKChhICYgICggKGludDE2X3QpKCAoIGIgJiAoMSA8PDE0KSApIDw8IDEgICkgKSAvICggMSA8PCAxNSkgKSA8PCAxNCkgKwogICAgICAgICAoKGEgJiAgKCAoaW50MTZfdCkoICggYiAmICgxIDw8MTUpICkgPDwgMCAgKSApIC8gKCAxIDw8IDE1KSApIDw8IDE1KTsKfQoKaW50IG1haW4odm9pZCkKewoKICB1aW50MTZfdCBhLCBiOwogIGEgPSAwOwogIGIgPSAwOwoKICBkbwogIHsKICAgIGlmIChtdWx0aXBseShhLCBiKSAhPSBhICogYikKCgogICAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAgIkVSUk9SOlxuIgogICAgICAgICAgICAgICAibXk6ICV1XG4iCiAgICAgICAgICAgICAgICJub3JtOiAldVxuIgogICAgICAgICAgICAgICAiJWh1ICogJWh1XG4iCiAgICAgICAgICAgICAgICJcbiIsCiAgICAgICAgICAgICAgIG11bHRpcGx5KGEsIGIpLCAoYSAqIGIpLGEsIGIKICAgICAgICAgICAgICk7CgogICAgaWYgKFVJTlQxNl9NQVggPT0gYSkKICAgIHsKICAgICAgYisrOwogICAgfQogICAgYSsrOwogIC8vZnByaW50ZihzdGRlcnIsICIlaHUgKiAlaHVcbiIsIGEsIGIpOwogIH0gd2hpbGUgKCAoIGEgIT0gMCApIHx8IChiICE9IDApICk7CgogIGZwcmludGYoc3RkZXJyLCAiJSJQUkl1MTYiKiAiIiUiUFJJdTE2IlxuIiwgYSwgYik7CiAgcHJpbnRmKCJEb25lIVxuIik7CgogIHJldHVybiAwOwp9Cg==