https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112268
Georg-Johann Lay <gjl at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Target Milestone|--- |15.0 Depends on| |117726, 84211, 107957 Status|UNCONFIRMED |RESOLVED Resolution|--- |FIXED --- Comment #1 from Georg-Johann Lay <gjl at gcc dot gnu.org> --- With PR84211, PR107957, PR117726 in place, the generated code with v15 is: uint8_t extract22 (uint32_t val) { return val >> 22; } uint8_t extract23 (uint32_t val) { return val >> 23; } uint8_t extract24 (uint32_t val) { return val >> 24; } uint8_t extract25 (uint32_t val) { return val >> 25; } uint8_t extract26 (uint32_t val) { return val >> 26; } uint8_t extract27 (uint32_t val) { return val >> 27; } uint8_t extract28 (uint32_t val) { return val >> 28; } uint8_t extract29 (uint32_t val) { return val >> 29; } uint8_t extract30 (uint32_t val) { return val >> 30; } uint8_t extract31 (uint32_t val) { return val >> 31; } extract22: ldi r18,6 ; 23 [c=20 l=5] *lshrhi3_const/3 1: lsr r25 ror r24 dec r18 brne 1b ret extract23: lsl r24 ; 23 [c=20 l=5] *lshrhi3_const/1 mov r24,r25 rol r24 sbc r25,r25 neg r25 ret extract24: mov r24,r25 ; 21 [c=4 l=1] movqi_insn/0 ret extract25: mov r24,r25 ; 23 [c=4 l=1] movqi_insn/0 lsr r24 ; 24 [c=4 l=1] *lshrqi3/1 ret extract26: mov r24,r25 ; 23 [c=4 l=1] movqi_insn/0 lsr r24 ; 24 [c=8 l=2] *lshrqi3/1 lsr r24 ret extract27: mov r24,r25 ; 23 [c=4 l=1] movqi_insn/0 lsr r24 ; 24 [c=12 l=3] *lshrqi3/3 lsr r24 lsr r24 ret extract28: mov r24,r25 ; 23 [c=4 l=1] movqi_insn/0 swap r24 ; 24 [c=16 l=2] *lshrqi3/3 andi r24,0x0f ret extract29: mov r24,r25 ; 23 [c=4 l=1] movqi_insn/0 swap r24 ; 24 [c=20 l=3] *lshrqi3/3 lsr r24 andi r24,0x7 ret extract30: ldi r24,1<<2 ; 23 [c=16 l=4] *lshrqi3/2 mul r24,r25 mov r24,r1 clr __zero_reg__ ret extract31: bst r25,7 ; 18 [c=4 l=3] *extzvqi clr r24 bld r24,0 ret Referenced Bugs: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84211 [Bug 84211] [avr] Perform a post-reload register optimization pass https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107957 [Bug 107957] [AVR] Missed optimization in access to upper-half of a variable https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117726 [Bug 117726] [avr] better optimize multi-byte shifts