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