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