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