|
From: | Paulo Marques |
Subject: | Re: [avr-gcc-list] Missing compiler optimizations? |
Date: | Mon, 23 Jan 2006 09:40:50 +0000 |
User-agent: | Mozilla Thunderbird 1.0.6 (X11/20050716) |
Erik Walthinsen wrote:
[...]In other cases I've seen all kinds of relatively common idioms get translated very poorly. A classic one is constructing a word from two bytes, which in my case happens as TWI interrupts feed them to me one at a time:w = b | (c<<8); 68: 99 27 eor r25, r25 6a: 33 27 eor r19, r19 6c: 32 2f mov r19, r18 6e: 22 27 eor r18, r18 70: 82 2b or r24, r18 72: 93 2b or r25, r19w is 16 bits, b and c are both 8. This should be doable with just two mov's, but instead it takes 6 instructions. I understand that it's promoting the variables, but it's still inefficient.
I can not help you with the other stuff, but for this case I usually define a structure like this:
typedef struct { uint8_t l, h} BYTES; typedef union { uint16_t w; BYTES b; } WORD; Then, you can just do: var.b.l = b; var.b.h = c; and access the 16 bit value with "var.w"; Not only gcc gets this right, but it even makes the code more readble :) I hope this helps, -- Paulo Marques Software Development Department - Grupo PIE, S.A. Phone: +351 252 290600, Fax: +351 252 290601 Web: www.grupopie.com Pointy-Haired Boss: I don't see anything that could stand in our way. Dilbert: Sanity? Reality? The laws of physics?
[Prev in Thread] | Current Thread | [Next in Thread] |