From the sample code below which I got here, I don't understand why the value of registers are move to specific part in stack when byte-spilling is performed.
pushq %rbp
movq %rsp, %rbp
subq $96, %rsp
leaq L__unnamed_cfstring_23(%rip), %rax
leaq L__unnamed_cfstring_26(%rip), %rcx
movl $42, %edx
leaq l_objc_msgSend_fixup_alloc(%rip), %r8
movl $0, -4(%rbp)
movl %edi, -8(%rbp)
movq %rsi, -16(%rbp)
movq %rax, -48(%rbp) ## 8-byte Spill
movq %rcx, -56(%rbp) ## 8-byte Spill
movq %r8, -64(%rbp) ## 8-byte Spill
movl %edx, -68(%rbp) ## 4-byte Spill
callq _objc_autoreleasePoolPush
movq L_OBJC_CLASSLIST_REFERENCES_$_(%rip), %rcx
movq %rcx, %rdi
movq -64(%rbp), %rsi ## 8-byte Reload
movq %rax, -80(%rbp) ## 8-byte Spill
callq *l_objc_msgSend_fixup_alloc(%rip)
movq L_OBJC_SELECTOR_REFERENCES_27(%rip), %rsi
movq %rax, %rdi
movq -56(%rbp), %rdx ## 8-byte Reload
movl -68(%rbp), %ecx ## 4-byte Reload
And also, I don't know what is the purpose of byte-spilling since the program logic can still be achieved if the function is the one saving the value of the registers it will be used inside it.
I really have no idea why is this happening. Please help me understand this.