- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
inline int ms_001(int x){ return x ;} // x * 1
inline int ms_002(int x){ return x<<1 ;} // x * 2
inline int ms_003(int x){ return x<<2 - x ;} // x * 3
...
inline int ms_799(int x){ return x<<10 - x<<8 + x<<5 - x ;} // x * 799
inline int ms_800(int x){ return x<<10 - x<<8 + x<<5 ;} // x * 800
// массив указателей
int ( *mult_shift[800] ) (int) = {
ms_001,
ms_002,
...
ms_799,
ms_800 };
gost 14.07.2017 13:23 # +2
> x<<10 - x<<8 + x<<5 - x
gcc с -O3 разворачивает эту поебень в 8 инструкций. Сразу видно, что быстрее одного imul!
bormand 14.07.2017 20:14 # 0
lvdpidor 14.07.2017 22:34 # 0
bormand 14.07.2017 22:36 # +2
fse 14.07.2017 23:25 # 0
Загадка:
1. Почему ЭТОТ код не работает в принципе
2. Почему не инлайнится
3. Почему описан в cpp-файле
4. Почему файл существует и впаривается разным заказчикам (возможны варианты)
Psionic 16.07.2017 00:23 # +1
3. Наверное какой-то жутко оптимизированный модуль
4. Я и не такое видел как заказчикам впаривают.
j123123 17.07.2017 09:49 # 0
Возможно существуют абсолютно идиотские компиляторы, которые подобную замену умножения на сдвиг осуществить не могут вообще ни с какимии флагами? Или заказчиков пытаются убедить в существовании таких компиляторов, и потом это впаривают?
>1. Почему ЭТОТ код не работает в принципе
Не работает в смысле не используется? Возможно потому, что нахуй не надо такое использовать: компиляторы и так умеют умножение в сдвиги оптимизировать
Эта хренота с умножением через сдвиги вот описана http://z0mbie.daemonlab.org/asm.html#e
j123123 17.07.2017 10:17 # 0
roman-kashitsyn 17.07.2017 11:32 # 0
Я так понимаю, это "суперкомпиляция вручную". Компилятор заоптимизирует умножение только в том случае, если в коде будет стоять константа. Если хочется выполнить оптимизацию в рантайме, компилятор тебе не поможет. Поэтому автор кода выписал специализации для каждого значения аргумента и сделал табличку для диспатча в рантайме. Жаль, но его коварный план обречён на провал по понятным причинам.
Думаю, даже если заменить вызов функции по указателю на свитч-кейс по x, инструкция умножения всё равно будет ощутимо быстрее.
fse 17.07.2017 12:55 # −1
Имеется в виду дает неверный результат для всех множителей кроме степени двойки...
fse 17.07.2017 22:14 # +1
Antervis 15.07.2017 08:06 # +1
roman-kashitsyn 17.07.2017 11:24 # 0