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)

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.

        paul


Reply via email to