Version 3.2.3 is doing some strange things when I try to multiply 32bit and 16bit variables.
look this (with -O2) volatile long a; volatile int b; int test ( void ) { long c = (long)b * 65536l; return ( ! ( (a==0) || (a>=c) || (b==42) ) ); } 00002988 <test>: 2988: 0b 12 push r11 ; 298a: 1f 42 3e 02 mov &0x023e,r15 ;0x023e -> b 298e: 0e 4f mov r15, r14 ; 2990: 0f 4e mov r14, r15 ; 2992: 0f 5f rla r15 ; 2994: 0f 7f subc r15, r15 ; 2996: 3f e3 inv r15 ; 2998: 0d 4e mov r14, r13 ; 299a: 0b 43 clr r11 ; <- should be R12?? 299c: 1e 42 9a 02 mov &0x029a,r14 ;0x029a ->a 29a0: 1f 42 9c 02 mov &0x029c,r15 ;0x029c ->a 29a4: 0f de bis r14, r15 ; 29a6: 0f 93 cmp #0, r15 ;r3 As==00 29a8: 0c 24 jz $+26 ;abs 0x29c2 29aa: 1e 42 9a 02 mov &0x029a,r14 ;0x029a ->a 29ae: 1f 42 9c 02 mov &0x029c,r15 ;0x029c ->a 29b2: 0e 8c sub r12, r14 ;<----------?? 29b4: 0f 7d subc r13, r15 ; 29b6: 05 34 jge $+12 ;abs 0x29c2 29b8: b2 90 2a 00 cmp #42, &0x023e ;#0x002a 29bc: 3e 02 29be: 01 24 jz $+4 ;abs 0x29c2 29c0: 1b 43 mov #1, r11 ;r3 As==01 29c2: 0f 4b mov r11, r15 ; 29c4: 3b 41 pop r11 ; 29c6: 30 41 ret Where is R12 initialized??? (using <<16 it works). And there must be another bug, that I have not yet found. When I try to calculate a average over 256 values using long I get different results compared to my solution calculated with the host PC (I use "short int" and int instead of int and long). Use long with care! ;-( How can I avoid the usage of so much registers? mov #1, r11 mov r11,r15 ret seems a little bit crazy!? M.