Demikhovsky, Elena
2012-Jan-09 07:18 UTC
[LLVMdev] Calling conventions for YMM registers on AVX
I'll explain what we see in the code. 1. The caller saves XMM registers across the call if needed (according to DEFS definition). YMMs are not in the set, so caller does not take care. 2. The callee preserves XMMs but works with YMMs and clobbering them. 3. So after the call, the upper part of YMM is gone. - Elena -----Original Message----- From: Bruno Cardoso Lopes [mailto:bruno.cardoso at gmail.com] Sent: Monday, January 09, 2012 05:19 To: Demikhovsky, Elena Cc: llvmdev at cs.uiuc.edu Subject: Re: [LLVMdev] Calling conventions for YMM registers on AVX Hi,> What is the calling conventions for YMM. According to documents I saw till now, the YMMs are scratch and not saved in callee. > This is also the default behavior of the Intel Compiler.x86_64 Non-windows targets use the rules defined in the x86_64 abi!> In X86InstrControl.td the YMMs are not in "defs" set of call.The XMMs are subregisters of YMMs, and they are in the list, that should be sufficient for clobbering the YMM ones. -- Bruno Cardoso Lopes http://www.brunocardoso.cc --------------------------------------------------------------------- Intel Israel (74) Limited This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.
Jakob Stoklund Olesen
2012-Jan-09 18:00 UTC
[LLVMdev] Calling conventions for YMM registers on AVX
On Jan 8, 2012, at 11:18 PM, Demikhovsky, Elena wrote:> I'll explain what we see in the code. > 1. The caller saves XMM registers across the call if needed (according to DEFS definition). > YMMs are not in the set, so caller does not take care.This is not how the register allocator works. It saves the registers holding values, it doesn't care which alias is clobbered. Are you saying that only the xmm part of a ymm register gets spilled before a call?> 2. The callee preserves XMMs but works with YMMs and clobbering them. > 3. So after the call, the upper part of YMM is gone.Are you on Windows? As Bruno said, all xmm and ymm registers are call-clobbered on non-Windows platforms. /jakob
Jakob Stoklund Olesen
2012-Jan-09 23:13 UTC
[LLVMdev] Calling conventions for YMM registers on AVX
On Jan 9, 2012, at 10:00 AM, Jakob Stoklund Olesen wrote:> > On Jan 8, 2012, at 11:18 PM, Demikhovsky, Elena wrote: > >> I'll explain what we see in the code. >> 1. The caller saves XMM registers across the call if needed (according to DEFS definition). >> YMMs are not in the set, so caller does not take care. > > This is not how the register allocator works. It saves the registers holding values, it doesn't care which alias is clobbered. > > Are you saying that only the xmm part of a ymm register gets spilled before a call? > >> 2. The callee preserves XMMs but works with YMMs and clobbering them. >> 3. So after the call, the upper part of YMM is gone. > > Are you on Windows? As Bruno said, all xmm and ymm registers are call-clobbered on non-Windows platforms.This thread has lots of interesting information: http://software.intel.com/en-us/forums/showthread.php?t=59291 I wasn't able to find a formal Win64 ABI spec, but according to http://www.agner.org/optimize/calling_conventions.pdf, xmm6-xmm15 are callee-saved on win64, but the high bits in ymm6-ymm15 are not. That's not currently correctly modelled in LLVM. To fix it, create a pseudo-register YMMHI_CLOBBER that aliases ymm6-ymm15. Then add YMMHI_CLOBBER to the registers clobbered by WINCALL64*. /jakob
Reasonably Related Threads
- [LLVMdev] Calling conventions for YMM registers on AVX
- [LLVMdev] Calling conventions for YMM registers on AVX
- [LLVMdev] Calling conventions for YMM registers on AVX
- [LLVMdev] Calling conventions for YMM registers on AVX
- [LLVMdev] Calling conventions for YMM registers on AVX