winavr 080512, atmega32, optimization = 's'
index is signed char
sizeof(somestruct)= 16
Code:
somestruct* rx = base + index;
33b0: 80 91 de 02 lds r24, 0x02DE
33b4: e8 2e mov r14, r24
33b6: ff 24 eor r15, r15
33b8: e7 fc sbrc r14, 7
33ba: f0 94 com r15
33bc: 74 e0 ldi r23, 0x04 ; 4
33be: ee 0c add r14, r14
33c0: ff 1c adc r15, r15
33c2: 7a 95 dec r23
33c4: e1 f7 brne .-8 ; 0x33be <_Z5somefunctionh+0x72>
33c6: 8e e8 ldi r24, 0x8E ; 142
33c8: 92 e0 ldi r25, 0x02 ; 2
33ca: e8 0e add r14, r24
33cc: f9 1e adc r15, r25
sizeof(somestruct)= 17
Code:
somestruct* rx = base + index;
327e: 80 91 e3 02 lds r24, 0x02E3
3282: 91 e1 ldi r25, 0x11 ; 17
3284: 89 02 muls r24, r25
3286: 70 01 movw r14, r0
3288: 11 24 eor r1, r1
328a: 8e e8 ldi r24, 0x8E ; 142
328c: 92 e0 ldi r25, 0x02 ; 2
328e: e8 0e add r14, r24
3290: f9 1e adc r15, r25
Apparently on some stage compiler thinks it is still on 90s core without hardware multiply and decide to use shift instead for 'handy' sizes. Pad your structs for speed and size... |