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

Reply via email to