Steve Underwood wrote:
Hi Dmitry,
Hmmm. I just tried a couple of examples myself which look OK. It seems
the problem must be something more specific than just being over 128
bytes. I won't have access to the code that caused me problem for a
couple of days. I will post an example that illustrates the problem
later in the week.
Is this something to do with the problem I have with structures, it
seems related to calculating the offset within the structure when R14
get used instead of R15. The code I have has a problem with the shift
and add routines and only appears when optimized.
Maybe its the optimizer and not the generated code?
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
--
Peter Jansen
STS
Australian Antarctic Division
Channel Highway
Kingston
TAS 7050
AUSTRALIA
Ph (03) 62 323 533
Fax (03) 62 323 351