https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100056

            Bug ID: 100056
           Summary: [9/10/11 Regression]
           Product: gcc
           Version: 9.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: luc.vanoostenryck at gmail dot com
  Target Milestone: ---
            Target: aarch64

Created attachment 50573
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=50573&action=edit
or-shift vs. [us]bfiz

On arm64, the following code:
    unsigned or_shift(unsigned char i)
    {
        return i | (i << 11);
    }

translate to the following assembly:
    or_shift:
        and     w1, w0, 255
        ubfiz   w0, w0, 11, 8
        orr     w0, w0, w1
        ret

where the ubfiz instruction is a bit weird since the code
matches directly what was generated in gcc 8.x and before:
    or_shift:
        and     w0, w0, 255
        orr     w0, w0, w0, lsl 11
        ret

Same with a signed argument (see https://gcc.godbolt.org/z/af4zffMYa ).

Reply via email to