MITSUNARI Shigeo via llvm-dev
2016-May-31 08:04 UTC
[llvm-dev] How to avoid register spills at wide integer addition?
Hi, all I want to make a function such as void add512(uint512_t *pz, const uint512_t *px, const uint512_t *py) { *pz = *px + *py; } # uint512_t means 512-bit unsigned integer register. Then, I make a sample code:>cat t.lldefine void @add512(i512*noalias %pz, i512*noalias %px, i512*noalias %py) { %x = load i512* %px %y = load i512* %py %z = add i512 %x, %y store i512 %z, i512* %pz ret void }>llc-3.6 -O3 -march=x86 t.ll -o -add512: pushl %ebp pushl %ebx pushl %edi pushl %esi subl $56, %esp movl 84(%esp), %eax movl 80(%esp), %edi movl 8(%edi), %esi movl (%edi), %edx movl 4(%edi), %ebx movl 60(%eax), %ecx movl %ecx, 52(%esp) # 4-byte Spill movl 56(%eax), %ecx movl %ecx, 48(%esp) # 4-byte Spill addl (%eax), %edx movl %edx, 24(%esp) # 4-byte Spill adcl 4(%eax), %ebx movl %ebx, 20(%esp) # 4-byte Spill adcl 8(%eax), %esi movl %esi, 16(%esp) # 4-byte Spill movl 52(%eax), %ecx movl %ecx, 40(%esp) # 4-byte Spill movl 48(%eax), %ecx movl %ecx, 36(%esp) # 4-byte Spill .... I expect a code such as add512: pushl %ebx movl 8(%esp), %ebx ; pz movl 12(%esp), %ecx ; px movl 16(%esp), %edx ; py movl (%ecx), %eax addl (%edx), %eax movl %eax, (%ebx) movl 4(%ecx), %eax adcl 4(%edx), %eax movl %eax, 4(%ebx) movl 8(%ecx), %eax adcl 8(%edx), %eax movl %eax, 8(%ebx) ... How can I let llvm to assign *%pz for work area of %z? For example, void twice512(uint512_t *pz, const uint512_t *px) { *pz = *px + *px; } generates good code without spills. Yours, Shigeo