У меня MUL получается только при u8*u8 все остальные варианты
приводят к вызову библиотечной функции умножения. Вот пример: Мне кажется тут компилятор мог бы догадаться, что выполняется u16*u8 для которго надо всего два вызова MUL. Да даже u16*u16 делается через 3 MUL, вызов библиотечной функции выглядит не оправданным из-за накладных расходов на подготовку исходных данных и получения результата
1 unsigned int x1;
2 unsigned int x2;
3 unsigned long s;
4 unsigned char c1;
5
6 void f()
7 {
8 1 s+=x1*c1 + x2*20u;
9 1 }
C51 COMPILER V9.60.0.0 TEST 04/16/2024 15:10:23 PAGE 2
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION f (BEGIN)
; SOURCE LINE # 6
; SOURCE LINE # 7
; SOURCE LINE # 8
0000 AF00 R MOV R7,c1
0002 7E00 MOV R6,#00H
0004 AC00 R MOV R4,x1
0006 AD00 R MOV R5,x1+01H
0008 120000 E LCALL ?C?IMUL
000B AA06 MOV R2,AR6
000D AB07 MOV R3,AR7
000F AE00 R MOV R6,x2
0011 AF00 R MOV R7,x2+01H
0013 7C00 MOV R4,#00H
0015 7D14 MOV R5,#014H
0017 120000 E LCALL ?C?IMUL
001A EB MOV A,R3
001B 2F ADD A,R7
001C FF MOV R7,A
001D EA MOV A,R2
001E 3E ADDC A,R6
001F FE MOV R6,A
0020 E4 CLR A
0021 FD MOV R5,A
0022 E500 R MOV A,s+03H
0024 2F ADD A,R7
0025 F500 R MOV s+03H,A
0027 E500 R MOV A,s+02H
0029 3E ADDC A,R6
002A F500 R MOV s+02H,A
002C ED MOV A,R5
002D 3500 R ADDC A,s+01H
002F F500 R MOV s+01H,A
0031 EC MOV A,R4
0032 3500 R ADDC A,s
0034 F500 R MOV s,A
; SOURCE LINE # 9
0036 22 RET