X-Git-Url: https://www.bearssl.org/gitweb//home/git/?p=BearSSL;a=blobdiff_plain;f=src%2Fint%2Fi31_mulacc.c;h=7410e546727ccfba1e7dba201a0a075b2f711903;hp=024d095665a6b5c6f0e46eb4479386cc8dd03e18;hb=001d094d140488def90cb3876d5c03f4d79b3e27;hpb=08eb07825be067729dff343de2d9a0c13252b415;ds=sidebyside diff --git a/src/int/i31_mulacc.c b/src/int/i31_mulacc.c index 024d095..7410e54 100644 --- a/src/int/i31_mulacc.c +++ b/src/int/i31_mulacc.c @@ -45,7 +45,20 @@ br_i31_mulacc(uint32_t *d, const uint32_t *a, const uint32_t *b) for (u = 0; u < blen; u ++) { uint32_t f; size_t v; + + /* + * Carry always fits on 31 bits; we want to keep it in a + * 32-bit register on 32-bit architectures (on a 64-bit + * architecture, cast down from 64 to 32 bits means + * clearing the high bits, which is not free; on a 32-bit + * architecture, the same operation really means ignoring + * the top register, which has negative or zero cost). + */ +#if BR_64 uint64_t cc; +#else + uint32_t cc; +#endif f = b[1 + u]; cc = 0;