[an error occurred while processing this directive]
|
правильно помножить два числа Q31. Объявляю:
long a,b;
long long c;
a=...; b=....
c = a*b;
получаю всякую х..
Смотрю, что выдает в Mixed Mode:
- во-первых, принудительно выставляет "SPM 0" (т.е. в PM стоИт единица - уже не то);
- во-вторых, вместо QMPYL стоит IMPYL;
- в третьих сдвигает результат вправо на 32 (точнее, два раза по 16);
в итоге умножение, например, 0x4000 0000 на 0x4000 0000 выдает вообще нулевой результат!
Где засада? Как этим управлять? В руководстве по сям нашел только рекомендации, как получить старшие 16 бит при умножении 16х16 (да и то через жопу: (long)a*(long)b>>16 - при int a,b; Про 32 разряда - ни слова.
Не дайте пропАсть. Не хочу из-за этой ерунды переходить на асм. Наверняка есть какое-то решение, просто не знаю, где рыть.