There is no way to specify a constraint for an operand of an asm statement that
may only be a destination operand (ie. the first operand of the st insn). If
you try to use the "m" constraint together with the %P operand modifier you can
get invalid asm code when %P expands to a register instead of a number. For
example, the Linux kernel uses this asm statement:
asm volatile ("\n[1:]\tst"#n" %1=%r2%P1\t// %0 gets overwritten by exception
handler\n"
"\t.xdata4 \"__ex_table\", 1b-., 1f-.\n"
"[1:]"
: "=r"(__pu_r8) : "m"(__m(addr)), "rO"(val), "0"(__pu_r8));
Occassionally you'll get an assembler error because the POST_MODIFY is expanded
into a register.
--
Summary: No constraint letter for destination_operand
Product: gcc
Version: 4.1.0
Status: UNCONFIRMED
Severity: enhancement
Priority: P3
Component: target
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: schwab at suse dot de
GCC target triplet: ia64-*-*
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24961