public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
From: "gjl at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org> To: gcc-bugs@gcc.gnu.org Subject: [Bug target/29560] [avr] Poor optimization for byte shifts Date: Tue, 21 Jun 2011 18:25:00 -0000 [thread overview] Message-ID: <bug-29560-4-LqaTFYhlLM@http.gcc.gnu.org/bugzilla/> (raw) In-Reply-To: <bug-29560-4@http.gcc.gnu.org/bugzilla/> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29560 Georg-Johann Lay <gjl at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution| |INVALID --- Comment #6 from Georg-Johann Lay <gjl at gcc dot gnu.org> 2011-06-21 18:24:44 UTC --- Closing this PR as invalid. As Andy already explained, for shift offsets >7 and <15 there has to be a defined result because int for avr-gcc is 16 bits, and this is actually *not* a byte shift. With alternative code that tested for these offsets at runtime, jumped around and loaded 0 if appropriate, you were not better of than with the current code -- in the contrary. Note that gcc deflates you function calls to just one instruction in main. So maybe what you really want here is to make these functions static inline so that you do no more see the code in the functions. Presumably you always call this functions with compile time constants. If you really need to quench out the last tick and call with non-constants, you could invent inline assembler with an instruction sequence that is similar to (1 << (R24 & 7)), perhaps together with __builtin_constant_p magic: LDI R24, 1 SBRC R24, 1 LDI R24, 4 SBRC R24, 0 LSL R24 SBRC R24, 2 SWAP R24 Note that with -mint8, int is 8 bits. That is still present as option, but no more supported and perhaps non-functional. -- Just for reference; here is a source without external #include: #define PORTC (*((unsigned char volatile*) 53)) void setpin(unsigned char pin, unsigned char val) { if (val == 1) PORTC |= (1<<pin); else PORTC &= ~(1<<pin); } void setpin1(unsigned char pin, unsigned char val) { const unsigned char one = 1; if (val == 1) PORTC |= (one<<(pin)); else PORTC &= ~(one<<pin); } int main(void) { setpin(3, 1); setpin1(3, 1); return 0; }
next parent reply other threads:[~2011-06-21 18:25 UTC|newest] Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top [not found] <bug-29560-4@http.gcc.gnu.org/bugzilla/> 2011-06-21 18:25 ` gjl at gcc dot gnu.org [this message] 2011-07-23 14:51 ` gjl at gcc dot gnu.org 2011-07-23 14:55 ` gjl at gcc dot gnu.org 2011-07-25 12:49 ` gjl at gcc dot gnu.org 2011-08-10 8:59 ` gjl at gcc dot gnu.org 2011-08-10 9:20 ` gjl at gcc dot gnu.org 2006-10-23 11:39 [Bug target/29560] New: Poor optimization for character shifts on Atmel AVR gcc-bugzilla at gcc dot gnu dot org 2009-08-24 17:18 ` [Bug target/29560] [avr] Poor optimization for byte shifts eric dot weddington at atmel dot com 2009-12-31 3:16 ` hutchinsonandy at gcc dot gnu dot org 2010-02-18 13:28 ` Rudolf dot Leitgeb at gmx dot at
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=bug-29560-4-LqaTFYhlLM@http.gcc.gnu.org/bugzilla/ \ --to=gcc-bugzilla@gcc.gnu.org \ --cc=gcc-bugs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).