Математика с фиксированной точкой с ARM Cortex-M4 и компилятором gcc

Я использую 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, но это не делает ничего другого.

8
задан artless noise 29 October 2013 в 21:49
поделиться