Во-первых, очень некрасиво не показывать типы используемых переменных и желаемого результата.
Во-вторых, разберитесь с размерностью вычислений. Написанный вами макрос делает совсем не то что вы хотите.
В-третьих, ваш mulshift32, судя по всему, это банальное
Код
int32_t x=1L,y=2L;
int32_t z;
z = ((int64_t)x*y)>>32;
Поверьте, компилятор сделает всё лучше вас, особенно с оптимизацией. Только не мешайте ему.
Код
// int32_t x=1L,y=2L;
MOVS R0,#+1
MOVS R1,#+2
// int32_t z;
// z = ((int64_t)x*y)>>32;
SMULL R0,R1,R1,R0
В-четвёртых, вместо x и y можете ставить что угодно, только с соблюдением типов.