Умножение 64-битных чисел по 64-битному модулю ассемблерной вставкой в GCC

Revision ru3, by Gornak40, 2022-08-16 19:19:50

Компилятор GCC предоставляет возможность использовать ассемблерные вставки. Это может быть полезно например для умножения двух 64-битных чисел по 64-битному модулю. Дело в том, что умножая два 64-битных регистор, процессор сохраняет результат в паре регистров rdx (верхнюю часть) и rax (нижнюю часть). Деление же работает похожим образом: делимое берется с регистров rdx и rax, после чего в rax сохраняется частное, а в rdx остаток. Используя эти знания можно реализовать аналог следующей функции:

inline long long mul(long long a, long long b) {
    return (__int128)a * b % 1000000014018503LL;
}
Tags ассемблер, gcc, хеши, умножение

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en3 English Gornak40 2022-08-17 00:45:03 0 (published)
ru11 Russian Gornak40 2022-08-17 00:44:29 0 (опубликовано)
en2 English Gornak40 2022-08-17 00:42:48 117
en1 English Gornak40 2022-08-17 00:42:16 1468 Initial revision for English translation (saved to drafts)
ru10 Russian Gornak40 2022-08-17 00:38:02 2 Мелкая правка: 'ндартного AT&T синтаксис' -> 'ндартного _AT&T_ синтаксис'
ru9 Russian Gornak40 2022-08-17 00:36:47 8 Мелкая правка: 'льзования ***__int128***.\n' -> 'льзования ___int128_.\n'
ru8 Russian Gornak40 2022-08-17 00:36:17 24
ru7 Russian Gornak40 2022-08-17 00:34:49 31
ru6 Russian Gornak40 2022-08-17 00:33:34 3 Мелкая правка: 'ных регистор, процессо' -> 'ных регистров, процессо'
ru5 Russian Gornak40 2022-08-17 00:32:42 191
ru4 Russian Gornak40 2022-08-17 00:00:48 567
ru3 Russian Gornak40 2022-08-16 19:19:50 522 Мелкая правка: 'функции:\n~~~~~\ni' -> 'функции:\n\n~~~~~\ni'
ru2 Russian Gornak40 2022-08-16 18:29:43 75
ru1 Russian Gornak40 2022-08-16 18:20:20 233 Первая редакция (сохранено в черновиках)