Здравствуйте, Marty, Вы писали:
M>Вот насчет 128х-разрядного результата не уверен, вроде совсем недавно где-то читал, что такого нет и только планируется.
Совсем недавно? Это есть в спецификации amd64, все процессоры, основанные на ней, уже более десятилетия умеют это. А сама спецификация даже ещё чуть старше.
M>Далее, если и есть — как это достать из C++?
M>Но опять же, как переносимо написать?
Ну это как раз совсем не проблема:
#include <cstdint>
static inline void mul32(uint32_t a, uint32_t b, uint32_t& hi, uint32_t &lo) {
uint64_t t = a;
lo = t *= b;
hi = t >> 32;
}
Компиляторы (по крайней мере популярные gcc, clang и icc) знают, что
uint64_t в данном коде — это всего лишь способ выразить желаемый результат, а не требование обязательно создать 64-битную переменную и как-то с ней работать даже на 32-битном процессоре (хотя они и это могут, для целей отладки, например). Собственно, если скомпилировать эту функцию на 32-битном процессоре x86, то она выродится в единственную инструкцию умножения двух 32-битных чисел, где 64-битный результат записывается в пару hi:lo.
Ну то есть код получается вполне переносим и при этом очень близок к тому что на самом деле происходит в процессоре.