DSPRelated.com
Forums

Codewarrior Compiler for 56858

Started by actom_ng June 4, 2004
I am looking to optimize sequential reads from a buffer and writes
to GPIO registers:

GPIO_A_DR = buf[0];
GPIO_B_DR = buf[1];
GPIO_A_DR = buf[2];

etc.

The assembly looks like this:

move.l #0x1ffe62,R0
move.w X: 0x000000,A
move.w A1, X: (R0)

move.l #0x1ffe6e,R0
move.w X: 0x000000,A
move.w A1, X: (R0)

move.l #0x1ffe62,R0
move.w X: 0x000000,A
move.w A1, X: (R0)

etc.

It is suprising to me that the compiler cannot figure out to store
the second register address to, say, R1. But my main question is
how the instruction:

move.w X: 0x000000,A

is working. In fact, just a simple 'x = y' expression yields:

move.w X:0x000000,X:0x000000

how can that possibly be right if the immediate addresses are the
same? Something big is missing here.




If you use pointer instead of array, you will get
much compact assembly code.

Charlie

--- actom_ng <> wrote:
> I am looking to optimize sequential reads from a
> buffer and writes
> to GPIO registers:
>
> GPIO_A_DR = buf[0];
> GPIO_B_DR = buf[1];
> GPIO_A_DR = buf[2];
>
> etc.
>
> The assembly looks like this:
>
> move.l #0x1ffe62,R0
> move.w X: 0x000000,A
> move.w A1, X: (R0)
>
> move.l #0x1ffe6e,R0
> move.w X: 0x000000,A
> move.w A1, X: (R0)
>
> move.l #0x1ffe62,R0
> move.w X: 0x000000,A
> move.w A1, X: (R0)
>
> etc.
>
> It is suprising to me that the compiler cannot
> figure out to store
> the second register address to, say, R1. But my
> main question is
> how the instruction:
>
> move.w X: 0x000000,A
>
> is working. In fact, just a simple 'x = y'
> expression yields:
>
> move.w X:0x000000,X:0x000000
>
> how can that possibly be right if the immediate
> addresses are the
> same? Something big is missing here. >
>


__________________________________



>In fact, just a simple 'x = y'
> expression yields:
>
> move.w X:0x000000,X:0x000000
>
> how can that possibly be right if the immediate
> addresses are the
> same? Something big is missing here.
>

You probably generated the expression move.w X:0x000000,X:0x000000 by the
'disassembly' command, right? At this stage the compiler does not have the
information on where variables will be placed. That's the reason for having them
referred as x:000000. It's the linker that will place variables to their correct
address in memory.

Best regards,

Fabio Estevam --- actom_ng <> wrote:
> I am looking to optimize sequential reads from a
> buffer and writes
> to GPIO registers:
>
> GPIO_A_DR = buf[0];
> GPIO_B_DR = buf[1];
> GPIO_A_DR = buf[2];
>
> etc.
>
> The assembly looks like this:
>
> move.l #0x1ffe62,R0
> move.w X: 0x000000,A
> move.w A1, X: (R0)
>
> move.l #0x1ffe6e,R0
> move.w X: 0x000000,A
> move.w A1, X: (R0)
>
> move.l #0x1ffe62,R0
> move.w X: 0x000000,A
> move.w A1, X: (R0)
>
> etc.
>
> It is suprising to me that the compiler cannot
> figure out to store
> the second register address to, say, R1. But my
> main question is
> how the instruction:
>
> move.w X: 0x000000,A
>
> is working. In fact, just a simple 'x = y'
> expression yields:
>
> move.w X:0x000000,X:0x000000
>
> how can that possibly be right if the immediate
> addresses are the
> same? Something big is missing here. >
>


__________________________________
_____________________________________
Note: If you do a simple "reply" with your email client, only the author of this
message will receive your answer. You need to do a "reply all" if you want your
answer to be distributed to the entire group.

_____________________________________
About this discussion group:

To Join:

To Post:

To Leave:

Archives: http://www.yahoogroups.com/group/motoroladsp

More Groups: http://www.dsprelated.com/groups.php3

Yahoo! Groups Links