ping On Wed, Oct 15, 2014 at 9:27 AM, Akira Hatanaka <[email protected]> wrote:
> There were mistakes in my previous email. The correct mapping should be > like this: > > %0 => "+r" (one) => ConstraintIdx = 0 > %1 => "+r" (two) => ConstraintIdx = 1 > %2 => "r" (three) => ConstraintIdx = 2 > %3 => "+r" (one) => ConstraintIdx = 0 > %4 => "+r" (two) => ConstraintIdx = 1 > > On Wed, Oct 15, 2014 at 8:36 AM, Akira Hatanaka <[email protected]> > wrote: > >> The attached patch fixes a bug in Sema::ActOnGCCAsmStmt where it wasn't >> computing the corresponding ConstraintIdx from an operand number correctly >> when there were constraints with the '+' modifier. >> >> For example, when the following inline-asm statement is compiled, >> >> void g2(int one, int two, int three) { >> asm volatile ("%0 %1 %2 %3 %4" : "+r" (one), "+r"(two) : "r"(three)); >> } >> >> the existing code maps the operand number in the assembly template to >> ConstraintIdx in the following way: >> >> %0 => "+r" (one) => ConstraintIdx = 0 >> %1 => "+r" (one) => ConstraintIdx = 0 >> %2 => "+r" (two) => ConstraintIdx = 1 >> %3 => "+r" (two) => ConstraintIdx = 1 >> %4 => "+r" (three) => ConstraintIdx = 2 >> >> The correct mapping should be like this: >> >> %0 => "+r" (one) => ConstraintIdx = 0 >> %1 => "+r" (two) => ConstraintIdx = 1 >> %3 => "+r" (three) => ConstraintIdx = 2 >> %4 => "+r" (one) => ConstraintIdx = 0 >> %5 => "+r" (two) => ConstraintIdx = 1 >> >> I couldn't find the rule documented anywhere in the link below, but >> judging from the code I see in CodeGenFunction::EmitAsmStmt and the IR >> clang generates, I believe this is the correct way to find the >> corresponding constraint. >> >> https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html >> >> This is the IR generated: >> >> %1 = tail call { i32, i32 } asm sideeffect "$0 $1 $2 $3 $4", >> "=r,=r,r,0,1"(i32 %three, i32 %one, i32 %two) >> > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
