Thanks, committed r228089.

On Tue, Feb 3, 2015 at 12:55 PM, Reid Kleckner <[email protected]> wrote:

> lgtm
>
> +
> +// No warnings expected.
>
> Consider adding "// CHECK-NOT: warning:" to verify this.
>
> On Tue, Feb 3, 2015 at 11:53 AM, Akira Hatanaka <[email protected]>
> wrote:
>
>> ping
>>
>> On Mon, Nov 3, 2014 at 1:07 PM, Akira Hatanaka <[email protected]>
>> wrote:
>>
>>> 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
>>
>>
>
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to