Re[7]: Попинайте арифметику
От: watchmaker  
Дата: 03.06.14 11:05
Оценка:
Здравствуйте, 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.
Ну то есть код получается вполне переносим и при этом очень близок к тому что на самом деле происходит в процессоре.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.