/* Implementation for gcc's internal stack-allocation routines. */ .global ___chkstk .global __alloca .global ___chkstk_ms ___chkstk_ms: #ifdef _WIN64 pushq %rax pushq %rcx cmpq $0x1000, %rax leaq 24(%rsp), %rcx jb .Lchkstk_ms_end .Lchkstk_ms_loop: subq $0x1000, %rcx subq $0x1000, %rax orq $0x0, (%rcx) cmpq $0x1000, %rax ja .Lchkstk_ms_loop .Lchkstk_ms_end: subq %rax, %rcx orq $0x0, (%rcx) popq %rcx popq %rax ret #else pushl %eax pushl %ecx cmpl $0x1000, %eax leal 12(%esp), %ecx jb chkstk_ms_end chkstk_ms_loop: subl $0x1000, %ecx subl $0x1000, %eax orl $0x0, (%ecx) cmpl $0x1000, %eax ja chkstk_ms_loop chkstk_ms_end: subl %eax, %ecx orl $0x0, (%ecx) popl %ecx popl %eax ret #endif #ifdef _WIN64 __alloca: movq %rcx, %rax .align 4 ___chkstk: popq %r11 movq %rsp, %r10 cmpq $0x1000, %rax jb .Lchkstk_end .Lchkstk_loop: subq $0x1000, %r10 subq $0x1000, %rax orl $0x0, (%r10) cmpq $0x1000, %rax ja .Lchkstk_loop .Lchkstk_end: subq %rax, %r10 movq %rsp, %rax orl $0x0, (%r10) movq %r10, %rsp pushq %r11 ret #else ___chkstk: __alloca: pushl %ecx leal 8(%esp), %ecx cmpl $0x1000, %eax /* > 4k ?*/ jb chkstk_end chkstk_loop: subl $0x1000, %ecx subl $0x1000, %eax orl $0x0, (%ecx) cmpl $0x1000, %eax ja chkstk_loop chkstk_end: subl %eax, %ecx orl $0x0, (%ecx) movl %esp, %eax movl %ecx, %esp movl (%eax), %ecx pushl 4(%eax) ret #endif