[Libre-soc-dev] SVP64 Vectorised add-carry => big int add

lkcl luke.leighton at gmail.com
Wed Apr 13 21:17:41 BST 2022


i found this which looks clear, well commented:
https://github.com/Richard-Mace/huge-integer-class/blob/master/HugeInt.cpp

the nice thing is, each calculation with a tight for-loop is a blindingly-obvious candidate for a single SVP64 instruction.  even this:

        for (int i = 0; i < n; ++i) {
            std::uint64_t product = static_cast<std::uint32_t>(qhat) 
                            * static_cast<std::uint64_t>(divisor.digits_[i]);

but that would be modified to a vector of products (a single sv.mul) and a second loop would perform the add-with-carry

even this i believe is just sv.adde

            widedigit = 0;
            for (int i = 0; i < n; ++i) {
                widedigit += static_cast<std::uint64_t>(dividend.digits_[k + i])
                           + divisor.digits_[i];
                dividend.digits_[k + i] = widedigit;
                widedigit >>= 32;
            }

from what i can gather, the number of instructions we end up with would be astoundingly, ridiculously low.

l.



More information about the Libre-soc-dev mailing list