123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- /* ---------------------------------------------- */
- /* alloca86_64.S */
- .globl __bound_alloca
- __bound_alloca:
- #ifdef _WIN32
- # bound checking is not implemented
- pop %rdx
- mov %rcx,%rax
- add $15,%rax
- and $-16,%rax
- jz p3
- p1:
- cmp $4096,%rax
- jbe p2
- test %rax,-4096(%rsp)
- sub $4096,%rsp
- sub $4096,%rax
- jmp p1
- p2:
- sub %rax,%rsp
- mov %rsp,%rax
- add $32,%rax
- p3:
- push %rdx
- ret
- #else
- pop %rdx
- mov %rdi,%rax
- mov %rax,%rsi # size, a second parm to the __bound_new_region
- add $15,%rax
- and $-16,%rax
- jz p3
- sub %rax,%rsp
- mov %rsp,%rdi # pointer, a first parm to the __bound_new_region
- mov %rsp,%rax
- push %rdx
- push %rax
- call __bound_new_region
- pop %rax
- pop %rdx
- p3:
- push %rdx
- ret
- #endif
- /* ---------------------------------------------- */
|