Вот листинг, в котором видно, что поделить на 16 требует больше команд, чем сдвинуть на 4 разряда. Для чего это, числа ведь беззнаковые?
Код
;;;222 uint8_t s0, s1, s2, s3;
;;;223 uint8_t m1 = ((s1 + s2) * 9 - s0 - s3) / 16;
000106 eb0c0006 ADD r0,r12,r6
00010a eb0000c0 ADD r0,r0,r0,LSL #3
00010e eba00007 SUB r0,r0,r7
000112 eba00006 SUB r0,r0,r6
000116 ea4f71e0 ASR r1,r0,#31
00011a eb007111 ADD r1,r0,r1,LSR #28
00011e f3c11107 UBFX r1,r1,#4,#8
;;;224 uint8_t m2 = ((s1 + s2) * 9 - s0 - s3) >> 4;
000122 f3c01007 UBFX r0,r0,#4,#8
Округление, что ли?