| /* stuff needed for libgcc on win32. */ |
| |
| #ifdef L_chkstk |
| |
| .global __chkstk |
| .global __alloca |
| __chkstk: |
| __alloca: |
| pushl %ecx /* save temp */ |
| movl %esp,%ecx /* get sp */ |
| addl $0x8,%ecx /* and point to return addr */ |
| |
| probe: cmpl $0x1000,%eax /* > 4k ?*/ |
| jb done |
| |
| subl $0x1000,%ecx /* yes, move pointer down 4k*/ |
| orl $0x0,(%ecx) /* probe there */ |
| subl $0x1000,%eax /* decrement count */ |
| jmp probe /* and do it again */ |
| |
| done: subl %eax,%ecx |
| orl $0x0,(%ecx) /* less that 4k, just peek here */ |
| |
| movl %esp,%eax |
| movl %ecx,%esp /* decrement stack */ |
| |
| movl (%eax),%ecx /* recover saved temp */ |
| movl 4(%eax),%eax /* get return address */ |
| jmp *%eax |
| |
| |
| #endif |