Я использую Freescale Kinetis K60 и использую CodeWarrior IDE (которая, как мне кажется, использует GCC для компилятора).
Я хочу умножить два 32-битных числа (что дает 64-битное число) и сохранить только старшие 32 бита.
Я думаю, что правильной инструкцией по сборке ARM Cortex-M4 является инструкция SMMUL. Я бы предпочел получить доступ к этой инструкции из кода C, а не из сборки. Как мне это сделать?
Я полагаю, что в идеале код будет примерно таким:
int a,b,c;
a = 1073741824; // 0x40000000 = 0.5 as a D0 fixed point number
b = 1073741824; // 0x40000000 = 0.5 as a D0 fixed point number
c = ((long long)a*b) >> 31; // 31 because there are two sign bits after the multiplication
// so I can throw away the most significant bit
Когда я пробую это в CodeWarrior, я получаю правильный результат для c (536870912 = 0,25 как число D0 FP). Я нигде не вижу инструкции SMMUL, а умножение - это 3 инструкции (UMULL, MLA и MLA - я не понимаю, почему используется беззнаковое умножение, но это другой вопрос). Я также пробовал сдвиг вправо на 32, так как это может иметь больше смысла для инструкции SMMUL, но это не делает ничего другого.