Steve, at least the following code struct __S { char a[64],b[64]; int c[13]; }; struct __S *s; struct __S * r(int i) { return s+i; }
being evaluated to .text .p2align 1,0 .global _r .type _r,@function /*********************** * Function `_r' ***********************/ _r: /* prologue: frame size = 0 */ .L__FrameSize_r=0x0 .L__FrameOffset_r=0x2 push r10 /* prologue end (size=1) */ mov r15, r10 ; 12 *movhi3/5 [length = 1] mov #llo(154), r12 ; 13 *movhi3/8 [length = 2] call #__mulhi3 ; 14 *mulhi3_call [length = 2] mov r14, r15 ; 15 *movhi3/5 [length = 1] add &s, r15 ; 16 *addhi3_3/5 [length = 2] /* epilogue: frame size=0 */ pop r10 ret /* epilogue end (size=2) */ /* function r size 11 (8) */ .Lfe1: .size _r,.Lfe1-_r /********* End of function ******/ .comm s,2,2 which seems to be correct... Actually, multiplication vs. shifts&adds/subs being used upon max number of iterations necessary for offset computation. For example, if a structure size if 90, the multiplier being used to compute indexing offset. In general the decision about shifts&adds vs. multiplier is the following: if total_sifts_and_adds_operations*operand_size_in_bytes > some_threshold then use multiplier otherwise use shifts and tricks. some_threshold == 10 now for example : a = b*65; requires 6 shifts and 1 add operations. cheers, ~d On Tuesday 25 May 2004 16:22, Dmitry wrote: > Hi Steve, > Hm.... > Multiplier produces incorrect result? > Or just an assembly output tricks registers? > I had no probs with such structures... > > ~d > > > > > -----Original Message----- > From: mspgcc-users-ad...@lists.sourceforge.net > [mailto:mspgcc-users-ad...@lists.sourceforge.net] On Behalf Of Steve > Underwood > Sent: Tuesday, May 25, 2004 3:52 PM > To: mspgcc-users@lists.sourceforge.net > Subject: [Mspgcc-users] compiler bug > > Hi Dimitry, > > I found a problem with the compiled code for GCC 3.2.3. > > If a structure is less than or equal to 128 bytes, an array of > structures is accessed using shifts and adds to calculate the offset > into the array. However, if the structure is more than 128 bytes the > multiplier is used for these calculations. When shifts and adds are > being used things work OK. When the multiplier is used the offset is > calculated incorrectly. > > Regards, > Steve > > > > ------------------------------------------------------- > This SF.Net email is sponsored by: Oracle 10g > Get certified on the hottest thing ever to hit the market... Oracle 10g. > > Take an Oracle 10g class now, and we'll give you the exam FREE. > http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click > _______________________________________________ > Mspgcc-users mailing list > Mspgcc-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/mspgcc-users > > > > ------------------------------------------------------- > This SF.Net email is sponsored by: Oracle 10g > Get certified on the hottest thing ever to hit the market... Oracle 10g. > Take an Oracle 10g class now, and we'll give you the exam FREE. > http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click > _______________________________________________ > Mspgcc-users mailing list > Mspgcc-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/mspgcc-users