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

            Bug ID: 64662
           Summary: [SH] QImode/HImode atomics should return sign extended
                    SImode values
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: olegendo at gcc dot gnu.org
            Target: sh*-*-*

Currently, QImode/HImode atomic insns return the values as such, although the
memory loads actually do a sign extension.  They should return sign extended
SImode values instead, so that it's easier to eliminate redundant sign/zero
extensions around atomic insns.

Example:

int test4 (volatile char* mem)
{
  return __atomic_fetch_add (mem, 1, __ATOMIC_ACQ_REL);
}

compiled with -O2 -m4 -matomic-model=soft-gusa:

        mov     #1,r3

        mova    1f,r0  ! atomic_fetch_addqi_soft_gusa  [length = 18]
        .align 2
        mov     r15,r1
        mov     #(0f-1f),r15
0:      mov.b   @r4,r2        <<< sign extending load of previous value
        mov     r2,r7
        add     r3,r7
        mov.b   r7,@r4
1:      mov     r1,r15
        rts
        exts.b  r2,r0         <<< redundant sign extension

Reply via email to