| /* 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 |