Source:

void foo(float *a, float *b) {
    __asm__ volatile (
        "vld1.32 {d8[],d9[]}, [%1,:32] \n\t"
        "vst1.32 {q4},        [%0,:128] \n\t"
        :: "r"(a), "r"(b)
        : "q4"
    );
}

arm-none-linux-gnueabi-gcc-4.4.3 -O3 -mcpu=cortex-a8 -mfpu=neon
-mfloat-abi=softfp neonasm.c -S

foo:
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 0, uses_anonymous_args = 0
        @ link register save eliminated.
        fstmfdd sp!, {d8}
#APP
@ 2 "neonasm.c" 1
        vld1.32 {d8[],d9[]}, [r1,:32] 
        vst1.32 {q4},        [r0,:128] 

@ 0 "" 2
        fldmfdd sp!, {d8}
        bx      lr


Both d8 and d9 should be saved, not just d8.


-- 
           Summary: Inline asm doesn't respect q clobbers
           Product: gcc
           Version: 4.4.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: inline-asm
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: lessen42+gcc at gmail dot com
 GCC build triplet: x86_64-apple-darwin
  GCC host triplet: x86_64-apple-darwin
GCC target triplet: arm-none-linux-gnueabi


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43860

Reply via email to