[llvm-commits] [Review request][Win64] Use pushq/popq GPRs in function prologue/epilogue
NAKAMURA Takumi
geek4civic at gmail.com
Thu Feb 17 21:02:45 PST 2011
Ping.
It would also resolve potential issue if other x86-64 targets had a
new calling conversions to preserve XMMs.
...Takumi
On Mon, Feb 7, 2011 at 8:49 PM, NAKAMURA Takumi <geek4civic at gmail.com> wrote:
> Anton,
>
> I attached an updated patch, refined and comments added, thank you.
> It is at; https://github.com/chapuni/LLVM/commit/8da7419f8170e5a11063eb8e992ecb1ad40f9f6a
>
>
> On the github, Anton wrote;
>> View Commit: https://github.com/chapuni/LLVM/commit/d719f1b1ba5f01823e00904c1599adf356089a1d
>
>> This will pessimize non-win64 targets. Basically, the problem is that you cannot use pushq/popq for high xmm regs, which are callee-saved on win64-only (but not on linux / darwin, for example).
>
> I thought the patch does not affect to non-win64 targets, but it might
> be dubious to check whether regs are GPR or not.
> I rewrote checking expressions.
>
> I am sorry if I missed your point.
>
>> Another problem is function prologue emission. Have you verified that you always have proper stack frame? Even in case when high xmm regs (xmm5, etc.) are spilled?
>
> As far as spiller emits in order [pushq GPRs...] and [mov xmm to fp],
> and restorer emits in order [mov xmm from fp] and [popq GPRs],
> emitPrologue() and emitEpilogue() will emit adjusting %rsp onto proper place.
> And I can expect spiller can place XMMs i128 aligned.
>
> ; for example
> define void @foo() nounwind {
> entry:
> tail call void (...)* @bar() nounwind
> tail call void asm sideeffect "nop",
> "~{si},~{di},~{xmm13},~{xmm11},~{xmm15},~{dirflag},~{fpsr},~{flags}"()
> nounwind
> ret void
> }
> declare void @bar(...)
>
> #### -mtriple=x86_64-mingw32
> foo:
> pushq %rsi
> pushq %rdi
> subq $88, %rsp
> movaps %xmm15, 32(%rsp) # 16-byte Spill
> movaps %xmm13, 48(%rsp) # 16-byte Spill
> movaps %xmm11, 64(%rsp) # 16-byte Spill
> callq bar
> #APP
> nop
> #NO_APP
> movaps 64(%rsp), %xmm11 # 16-byte Reload
> movaps 48(%rsp), %xmm13 # 16-byte Reload
> movaps 32(%rsp), %xmm15 # 16-byte Reload
> addq $88, %rsp
> popq %rdi
> popq %rsi
> ret
>
> And also, I have checked to build clang by 3 stage.
> (x64-clang can build and test clang and llvm)
>
>
> ...Takumi
>
More information about the llvm-commits
mailing list