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

            Bug ID: 100378
           Summary: [Regression 9/10/11/12] arm64: lsl + asr used instead
                    of sxth
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: luc.vanoostenryck at gmail dot com
  Target Milestone: ---

Created attachment 50727
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=50727&action=edit
testcase

On arm64, when compiling with optimization, for example with -O2,
the following code:

    struct sh {
        short a;
        short b;
        short y[2];
    };
    int fooh(struct sh s) { return s.a; }

produces the following assembly code since GCC9.x:
    fooh:
        lsl     x0, x0, 16
        asr     w0, w0, 16
        ret

but with GCC8.x and before it produces the shorter:
    fooh(sh):
        sxth    w0, w0
        ret


See https://gcc.godbolt.org/z/YrW7E3cro

Reply via email to