VladislavS, спасибо за идею. Это не совсем то, что нужно, но получилось слегка ускорить алгоритм.
Создал обычный макрос
Код
#define MULSHIFT32(arg1, arg2) ((((long long)arg1)*((long long)arg2))>>32)
Всё-равно получается избыточно, если верить листингу.
Было до
Код
b0 = a0 + a7; b7 = MULSHIFT32(*cptr++, a0 - a7) << 1;
0x59ac0: 0xf8d4 0xa010 LDR.W R10, [R4, #0x10]
b0 = a0 + a7; b7 = MULSHIFT32(*cptr++, a0 - a7) << 1;
0x59ac4: 0x1846 ADDS R6, R0, R1
b0 = a0 + a7; b7 = MULSHIFT32(*cptr++, a0 - a7) << 1;
0x59ac6: 0x1a09 SUBS R1, R1, R0
0x59ac8: 0xf855 0x0b04 LDR.W R0, [R5], #0x4
0x59acc: 0xf7fd 0xf9ea BL MULSHIFT32 ; 0x56ea4
MULSHIFT32:
0x56ea4: 0xfb81 0x2000 SMULL R2, R0, R1, R0
0x56ea8: 0x4770 BX LR
0x59ad0: 0x4680 MOV R8, R0
0x59ad2: 0xea4f 0x0848 LSL.W R8, R8, #1
Стало после
Код
b0 = a0 + a7; b7 = MULSHIFT32(*cptr++, a0 - a7) << 1;
0x58dee: 0xf851 0x6b04 LDR.W R6, [R1], #0x4
0x58df2: 0x17f7 ASRS R7, R6, #31
0x58df4: 0x17e5 ASRS R5, R4, #31
0x58df6: 0x17d3 ASRS R3, R2, #31
0x58df8: 0x1aa2 SUBS R2, R4, R2
0x58dfa: 0xeb65 0x0303 SBC.W R3, R5, R3
0x58dfe: 0x4634 MOV R4, R6
0x58e00: 0x463d MOV R5, R7
0x58e02: 0xfba2 0x6704 UMULL R6, R7, R2, R4
0x58e06: 0xfb02 0x7705 MLA R7, R2, R5, R7
0x58e0a: 0xfb03 0x7704 MLA R7, R3, R4, R7
0x58e0e: 0x46b8 MOV R8, R7
0x58e10: 0xea4f 0x0848 LSL.W R8, R8, #1
В моём случае объявить, как в Вашем примере 64-битную переменную и положить в неё результат 32х32 не получится.