Из любопытства попробовал на GCC вот такое:
Код
#define MULSHIFT32(arg1, arg2) ((((long long)arg1)*((long long)arg2))>>32)
int volatile a0, a7, b7, ar[2];
void f(void)
{
int* cptr = ar;
b7 = MULSHIFT32(*cptr++, a0) << 1;
}
Получилось вот что:
Код
0x0800146E 4D72 LDR r5,[pc,#456]; @0x08001638
0x08001470 686B LDR r3,[r5,#0x04]
0x08001472 68E8 LDR r0,[r5,#0x0C]
0x08001474 FB830100 SMULL r0,r1,r3,r0
0x08001478 184A ADDS r2,r1,r1
0x0800147A 612A STR r2,[r5,#0x10]
А если написать вот так
Код
b7 = MULSHIFT32(*cptr++, a0 - a7) << 1;
То получается АдЪ:
Код
0x0800146E 4D77 LDR r5,[pc,#476]; @0x0800164C
0x08001470 6868 LDR r0,[r5,#0x04]
0x08001472 68AE LDR r6,[r5,#0x08]
0x08001474 68EC LDR r4,[r5,#0x0C]
0x08001476 17C1 ASRS r1,r0,#31
0x08001478 1B80 SUBS r0,r0,r6
0x0800147A EB6171E6 SBC r1,r1,r6,ASR #31
0x0800147E FB04F201 MUL r2,r4,r1
0x08001482 17E3 ASRS r3,r4,#31
0x08001484 FB002303 MLA r3,r0,r3,r2
0x08001488 FBA40100 UMULL r0,r1,r4,r0
0x0800148C 185C ADDS r4,r3,r1
0x0800148E 1922 ADDS r2,r4,r4
0x08001490 616A STR r2,[r5,#0x14]