[cfe-commits] r116696 - in /cfe/trunk: lib/CodeGen/TargetInfo.cpp test/CodeGen/x86_32-arguments-darwin.c test/CodeGen/x86_32-arguments-linux.c
Bill Wendling
isanbard at gmail.com
Mon Oct 18 16:42:46 PDT 2010
On Oct 18, 2010, at 4:16 PM, Daniel Dunbar wrote:
> Hi Bill,
>
> On Sun, Oct 17, 2010 at 8:41 PM, Bill Wendling <isanbard at gmail.com> wrote:
>> Author: void
>> Date: Sun Oct 17 22:41:31 2010
>> New Revision: 116696
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=116696&view=rev
>> Log:
>> Reapply r116684 with fixes. The test cases needed to be updated.
>
> I like the general approach, but I don't think any of the changes to
> propagate neededMMX are, err, needed. Actually, I think they are wrong
> because we won't stop using registers for varargs at the right point
> any more unless I am misreading things.
>
I was wondering that too. I think it's useful in this part:
>> @@ -1787,7 +1817,7 @@
>> FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
>>
>> // Keep track of the number of assigned registers.
>> - unsigned freeIntRegs = 6, freeSSERegs = 8;
>> + unsigned freeIntRegs = 6, freeSSERegs = 8, freeMMXRegs = 8;
>>
>> // If the return value is indirect, then the hidden argument is consuming one
>> // integer register.
>> @@ -1798,16 +1828,18 @@
>> // get assigned (in left-to-right order) for passing as follows...
>> for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
>> it != ie; ++it) {
>> - unsigned neededInt, neededSSE;
>> - it->info = classifyArgumentType(it->type, neededInt, neededSSE);
>> + unsigned neededInt, neededSSE, neededMMX;
>> + it->info = classifyArgumentType(it->type, neededInt, neededSSE, neededMMX);
>>
>> // AMD64-ABI 3.2.3p3: If there are no registers available for any
>> // eightbyte of an argument, the whole argument is passed on the
>> // stack. If registers have already been assigned for some
>> // eightbytes of such an argument, the assignments get reverted.
>> - if (freeIntRegs >= neededInt && freeSSERegs >= neededSSE) {
>> + if (freeIntRegs >= neededInt && freeSSERegs >= neededSSE &&
>> + freeMMXRegs >= neededMMX) {
>> freeIntRegs -= neededInt;
>> freeSSERegs -= neededSSE;
>> + freeMMXRegs -= neededMMX;
>> } else {
>> it->info = getIndirectResult(it->type);
>> }
But it was this part that I was unsure about, so I made it and neededSSE equivalent:
>> @@ -1876,10 +1908,13 @@
>> // i8* overflow_arg_area;
>> // i8* reg_save_area;
>> // };
>> - unsigned neededInt, neededSSE;
>> + unsigned neededInt, neededSSE, neededMMX;
>>
>> Ty = CGF.getContext().getCanonicalType(Ty);
>> - ABIArgInfo AI = classifyArgumentType(Ty, neededInt, neededSSE);
>> + ABIArgInfo AI = classifyArgumentType(Ty, neededInt, neededSSE, neededMMX);
>> +
>> + // Lump the MMX in with SSE.
>> + neededSSE += neededMMX;
>>
>> // AMD64-ABI 3.5.7p5: Step 1. Determine whether type may be passed
>> // in the registers. If not go to step 7.
Basically, the variable then comes down to use in X86_64ABIInfo::computeInfo...
-bw
More information about the cfe-commits
mailing list