Hi, all Some time ago I toyed with trying to build a super-optimizer for the avr. The project didn't went very far, but it produced a few small bits of code that I think are worth sharing.
Basically I was trying to produce functions to multiply an 8 bit value by 8 bit constants with a 16 bit result in avr families without a mul instruction. Most of the solutions it found were obvious (x0, x2, x3, x4, etc.), but a few were not so obvious: multiply x129: MOV r2, r0 ADD r0, r0 ADC r1, r2 ROR r1 ROR r0 multiply x254 NEG r0 SBC r1, r0 SBC r0, r1 SBC r1, r2 multiply x255 NEG r0 SBC r1, r0 The superoptimizer was only allowed to use a subset of available instructions so it is not guaranteed that these are optimal sequences. The functions assume that the value to be multiplied is passed as r0 and all other registers are zero. So for instance in the multiply x254, the r2 reference could in fact be __zero_reg__ and the working registers should not be r1:r0 at all (because "r0" is the "__zero_reg__"). I hope someone finds this to be useful anyway, -- Paulo Marques Software Development Department - Grupo PIE, S.A. Phone: +351 252 290600, Fax: +351 252 290601 Web: www.grupopie.com "Nostalgia isn't what it used to be." _______________________________________________ AVR-GCC-list mailing list AVR-GCC-list@nongnu.org https://lists.nongnu.org/mailman/listinfo/avr-gcc-list