It looks like ICC430 7.08A uses a helper function divmod8u
instead of register shift-right operations for unsigned
division by two if the variables are bytes (unsigned char)
instead of words (unsigned int).
Compiling with 7.08A for MSP430F1232 target:
1 ...
2 (1912) unsigned char length;
3 (1913) unsigned char nfactors;
4 ...
5 (1922) nfactors = (length / 2) - 1;
6 E68E 436F mov.B #2,R15
7 E690 454E mov.B R5,R14
8 E692 12B0 F602 call #divmod8u <------- helper function!
9 E696 4E46 mov.B R14,R6
10 E698 8356 dec.B R6
11 (1923) if (nfactors != 0) {
12 E69A 9346 tst.B R6
13 E69C 2439 jeq ...
But if I change the variables to 16-bit unsigned:
1 ...
2 (1912) unsigned int length;
3 (1913) unsigned int nfactors;
4 ...
5 (1922) nfactors = (length / 2) - 1;
6 E68E 454B mov.B R5,R11
7 E690 C312 clrC
8 E692 104B rrc.B R11 <-------------- register rotate
9 E694 835B dec.B R11
10 E696 4B46 mov.B R11,R6
11 (1923) if (nfactors != 0) {
12 E698 9346 tst.B R6
13 E69A 2439 jeq ...
As far as I can see, there's no reason why unsigned division
by 2 should ever be done with a helper function on the MSP430,
no matter what size the variables are.
There are two more missed opportunities for optimisation
visible in this code fragment.
1. The CLRC / RRC.B instructions (lines 7 and 8) could be
replaced with an RRA instruction, because the top half
of R11 is known to be zero because it was just loaded
using a MOV.B instruction.
2. The TST.B R6 instruction on line 12 isn't needed because
the zero flag is still set/cleared from the DEC.B R11
instruction at line 9.
Both of these optimisations would fall into the general
category of "keep track of known aspects of the MCU's
state, and take advantage of this to reduce code size
and/or execution time", and if ICC430 isn't already
doing this, I expect it would be a major change to add
it, but I think the benefits could be significant.
Anyway the real issue for me is the helper function used
for unsigned division by two.
Regards
Kris
--
Kris Heidenstrom Embedded systems designer / programmer
[email protected] Abbey Systems Ltd - Telemetry Specialists
Wellington NEW ZEALAND Voice +64-4-385-6611 Fax +64-4-385-6848