On Thu, Jul 05, 2018 at 08:45:30AM -0400, Paul Koning wrote:
> I have a struct that looks like this:
> 
> struct Xrb
> {
>     uint16_t xrlen;           /* Length of I/O buffer in bytes */
>     uint16_t xrbc;            /* Byte count for transfer */
>     void * xrloc;             /* Pointer to I/O buffer */
>     uint8_t xrci;             /* Channel number times 2 for transfer */
>     uint32_t xrblk:24;        /* Random access block number */
>     uint16_t xrtime;  /* Wait time for terminal input */
>     uint16_t xrmod;           /* Modifiers */
> };
> 
> When I write to xrblk (that 24 bit field) on my 16 bit target, I get 
> unexpectly inefficient output:
> 
>     XRB->xrblk = 5;
> 
>       movb    #5,10(r0)
>       clrb    11(r0)
>       clrb    7(r0)

(7? not 12?)

> rather than the expected word write to the word-aligned lower half of that 
> field.
> 
> Looking at the dumps, I see it coming into the RTL expand phase as a single 
> write, which expand then turns into the three insns corresponding to the 
> above.  But (of course) there is a word (HImode) move also, which has the 
> same cost as the byte one.
> 
> Is there something I have to do in my target definition to get this to come 
> out right?  This is a strict_alignment target, but alignment is satisfied in 
> this example.  Also, SLOW_BYTE_ACCESS is 1.

What is your MOVE_MAX?  It should be 2 probably.


Segher

Reply via email to