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

--- Comment #4 from ktkachov at gcc dot gnu.org ---
You should use "Q" when you want a memory address with only a register
addressing mode (i.e. no offsets), which is what AdvancedSIMD ldn/stn
instructions take.

I used:
void fun(unsigned int *src) {
  asm volatile("ld4 {v4.4s,v5.4s,v6.4s,v7.4s},%0" : : "Q" (*(src)));
  asm volatile("ld4 {v20.4s,v21.4s,v22.4s,v23.4s},%0" : : "Q" (*(src+16)));
}

and it assembled ok into:
fun:
        // Start of user assembly
// 2 "neon-asm.c" 1
        ld4 {v4.4s,v5.4s,v6.4s,v7.4s},[x0]
// 0 "" 2
        // End of user assembly
        add     x0, x0, 64
        // Start of user assembly
// 3 "neon-asm.c" 1
        ld4 {v20.4s,v21.4s,v22.4s,v23.4s},[x0]
// 0 "" 2
        // End of user assembly
        ret

Reply via email to