Господа, знает кто-нибудь, как заставить компилятор (IAR) использовать команду SMULL? Пример такой:
long x, y;
long long z;
z = x*y;//генерится команда MUL, умножение делается в long, старшие 32 бита отбрасываются, потом дополняются до long long знаком, результат неправильный
z=(long long)x*y;//генерится набор команд для выполнения 64-битного умножения, результат правильный, но вычисления занимают большое время
А как бы использовать SMULL, тогда получим long*long = long long. И результат правильный, и время небольшое.
Можно написать свою ассемблерную функцию, но в ней нужно будет сохранять регистры в стеке, а это опять потери времени. Компилятор мог бы это сделать лучше, т. к. переменные уже лежат в регистрах.