| Index: third_party/libc++abi/src/Unwind/UnwindRegistersRestore.s
|
| ===================================================================
|
| --- third_party/libc++abi/src/Unwind/UnwindRegistersRestore.s (revision 0)
|
| +++ third_party/libc++abi/src/Unwind/UnwindRegistersRestore.s (revision 0)
|
| @@ -0,0 +1,323 @@
|
| +//===-------------------- UnwindRegistersRestore.s ------------------------===//
|
| +//
|
| +// The LLVM Compiler Infrastructure
|
| +//
|
| +// This file is dual licensed under the MIT and the University of Illinois Open
|
| +// Source Licenses. See LICENSE.TXT for details.
|
| +//
|
| +//===----------------------------------------------------------------------===//
|
| +
|
| +
|
| +#if __i386__
|
| + .text
|
| + .globl __ZN9libunwind13Registers_x866jumptoEv
|
| + .private_extern __ZN9libunwind13Registers_x866jumptoEv
|
| +__ZN9libunwind13Registers_x866jumptoEv:
|
| +#
|
| +# void libunwind::Registers_x86::jumpto()
|
| +#
|
| +# On entry:
|
| +# + +
|
| +# +-----------------------+
|
| +# + thread_state pointer +
|
| +# +-----------------------+
|
| +# + return address +
|
| +# +-----------------------+ <-- SP
|
| +# + +
|
| + movl 4(%esp), %eax
|
| + # set up eax and ret on new stack location
|
| + movl 28(%eax), %edx # edx holds new stack pointer
|
| + subl $8,%edx
|
| + movl %edx, 28(%eax)
|
| + movl 0(%eax), %ebx
|
| + movl %ebx, 0(%edx)
|
| + movl 40(%eax), %ebx
|
| + movl %ebx, 4(%edx)
|
| + # we now have ret and eax pushed onto where new stack will be
|
| + # restore all registers
|
| + movl 4(%eax), %ebx
|
| + movl 8(%eax), %ecx
|
| + movl 12(%eax), %edx
|
| + movl 16(%eax), %edi
|
| + movl 20(%eax), %esi
|
| + movl 24(%eax), %ebp
|
| + movl 28(%eax), %esp
|
| + # skip ss
|
| + # skip eflags
|
| + pop %eax # eax was already pushed on new stack
|
| + ret # eip was already pushed on new stack
|
| + # skip cs
|
| + # skip ds
|
| + # skip es
|
| + # skip fs
|
| + # skip gs
|
| +
|
| +#elif __x86_64__
|
| +
|
| + .text
|
| + .globl __ZN9libunwind16Registers_x86_646jumptoEv
|
| + .private_extern __ZN9libunwind16Registers_x86_646jumptoEv
|
| +__ZN9libunwind16Registers_x86_646jumptoEv:
|
| +#
|
| +# void libunwind::Registers_x86_64::jumpto()
|
| +#
|
| +# On entry, thread_state pointer is in rdi
|
| +
|
| + movq 56(%rdi), %rax # rax holds new stack pointer
|
| + subq $16, %rax
|
| + movq %rax, 56(%rdi)
|
| + movq 32(%rdi), %rbx # store new rdi on new stack
|
| + movq %rbx, 0(%rax)
|
| + movq 128(%rdi), %rbx # store new rip on new stack
|
| + movq %rbx, 8(%rax)
|
| + # restore all registers
|
| + movq 0(%rdi), %rax
|
| + movq 8(%rdi), %rbx
|
| + movq 16(%rdi), %rcx
|
| + movq 24(%rdi), %rdx
|
| + # restore rdi later
|
| + movq 40(%rdi), %rsi
|
| + movq 48(%rdi), %rbp
|
| + # restore rsp later
|
| + movq 64(%rdi), %r8
|
| + movq 72(%rdi), %r9
|
| + movq 80(%rdi), %r10
|
| + movq 88(%rdi), %r11
|
| + movq 96(%rdi), %r12
|
| + movq 104(%rdi), %r13
|
| + movq 112(%rdi), %r14
|
| + movq 120(%rdi), %r15
|
| + # skip rflags
|
| + # skip cs
|
| + # skip fs
|
| + # skip gs
|
| + movq 56(%rdi), %rsp # cut back rsp to new location
|
| + pop %rdi # rdi was saved here earlier
|
| + ret # rip was saved here
|
| +
|
| +
|
| +#elif __ppc__
|
| +
|
| + .text
|
| + .globl __ZN9libunwind13Registers_ppc6jumptoEv
|
| + .private_extern __ZN9libunwind13Registers_ppc6jumptoEv
|
| +__ZN9libunwind13Registers_ppc6jumptoEv:
|
| +;
|
| +; void libunwind::Registers_ppc::jumpto()
|
| +;
|
| +; On entry:
|
| +; thread_state pointer is in r3
|
| +;
|
| +
|
| + ; restore integral registerrs
|
| + ; skip r0 for now
|
| + ; skip r1 for now
|
| + lwz r2, 16(r3)
|
| + ; skip r3 for now
|
| + ; skip r4 for now
|
| + ; skip r5 for now
|
| + lwz r6, 32(r3)
|
| + lwz r7, 36(r3)
|
| + lwz r8, 40(r3)
|
| + lwz r9, 44(r3)
|
| + lwz r10, 48(r3)
|
| + lwz r11, 52(r3)
|
| + lwz r12, 56(r3)
|
| + lwz r13, 60(r3)
|
| + lwz r14, 64(r3)
|
| + lwz r15, 68(r3)
|
| + lwz r16, 72(r3)
|
| + lwz r17, 76(r3)
|
| + lwz r18, 80(r3)
|
| + lwz r19, 84(r3)
|
| + lwz r20, 88(r3)
|
| + lwz r21, 92(r3)
|
| + lwz r22, 96(r3)
|
| + lwz r23,100(r3)
|
| + lwz r24,104(r3)
|
| + lwz r25,108(r3)
|
| + lwz r26,112(r3)
|
| + lwz r27,116(r3)
|
| + lwz r28,120(r3)
|
| + lwz r29,124(r3)
|
| + lwz r30,128(r3)
|
| + lwz r31,132(r3)
|
| +
|
| + ; restore float registers
|
| + lfd f0, 160(r3)
|
| + lfd f1, 168(r3)
|
| + lfd f2, 176(r3)
|
| + lfd f3, 184(r3)
|
| + lfd f4, 192(r3)
|
| + lfd f5, 200(r3)
|
| + lfd f6, 208(r3)
|
| + lfd f7, 216(r3)
|
| + lfd f8, 224(r3)
|
| + lfd f9, 232(r3)
|
| + lfd f10,240(r3)
|
| + lfd f11,248(r3)
|
| + lfd f12,256(r3)
|
| + lfd f13,264(r3)
|
| + lfd f14,272(r3)
|
| + lfd f15,280(r3)
|
| + lfd f16,288(r3)
|
| + lfd f17,296(r3)
|
| + lfd f18,304(r3)
|
| + lfd f19,312(r3)
|
| + lfd f20,320(r3)
|
| + lfd f21,328(r3)
|
| + lfd f22,336(r3)
|
| + lfd f23,344(r3)
|
| + lfd f24,352(r3)
|
| + lfd f25,360(r3)
|
| + lfd f26,368(r3)
|
| + lfd f27,376(r3)
|
| + lfd f28,384(r3)
|
| + lfd f29,392(r3)
|
| + lfd f30,400(r3)
|
| + lfd f31,408(r3)
|
| +
|
| + ; restore vector registers if any are in use
|
| + lwz r5,156(r3) ; test VRsave
|
| + cmpwi r5,0
|
| + beq Lnovec
|
| +
|
| + subi r4,r1,16
|
| + rlwinm r4,r4,0,0,27 ; mask low 4-bits
|
| + ; r4 is now a 16-byte aligned pointer into the red zone
|
| + ; the _vectorRegisters may not be 16-byte aligned so copy via red zone temp buffer
|
| +
|
| +
|
| +#define LOAD_VECTOR_UNALIGNEDl(_index) \
|
| + andis. r0,r5,(1<<(15-_index)) @\
|
| + beq Ldone ## _index @\
|
| + lwz r0, 424+_index*16(r3) @\
|
| + stw r0, 0(r4) @\
|
| + lwz r0, 424+_index*16+4(r3) @\
|
| + stw r0, 4(r4) @\
|
| + lwz r0, 424+_index*16+8(r3) @\
|
| + stw r0, 8(r4) @\
|
| + lwz r0, 424+_index*16+12(r3)@\
|
| + stw r0, 12(r4) @\
|
| + lvx v ## _index,0,r4 @\
|
| +Ldone ## _index:
|
| +
|
| +#define LOAD_VECTOR_UNALIGNEDh(_index) \
|
| + andi. r0,r5,(1<<(31-_index)) @\
|
| + beq Ldone ## _index @\
|
| + lwz r0, 424+_index*16(r3) @\
|
| + stw r0, 0(r4) @\
|
| + lwz r0, 424+_index*16+4(r3) @\
|
| + stw r0, 4(r4) @\
|
| + lwz r0, 424+_index*16+8(r3) @\
|
| + stw r0, 8(r4) @\
|
| + lwz r0, 424+_index*16+12(r3)@\
|
| + stw r0, 12(r4) @\
|
| + lvx v ## _index,0,r4 @\
|
| + Ldone ## _index:
|
| +
|
| +
|
| + LOAD_VECTOR_UNALIGNEDl(0)
|
| + LOAD_VECTOR_UNALIGNEDl(1)
|
| + LOAD_VECTOR_UNALIGNEDl(2)
|
| + LOAD_VECTOR_UNALIGNEDl(3)
|
| + LOAD_VECTOR_UNALIGNEDl(4)
|
| + LOAD_VECTOR_UNALIGNEDl(5)
|
| + LOAD_VECTOR_UNALIGNEDl(6)
|
| + LOAD_VECTOR_UNALIGNEDl(7)
|
| + LOAD_VECTOR_UNALIGNEDl(8)
|
| + LOAD_VECTOR_UNALIGNEDl(9)
|
| + LOAD_VECTOR_UNALIGNEDl(10)
|
| + LOAD_VECTOR_UNALIGNEDl(11)
|
| + LOAD_VECTOR_UNALIGNEDl(12)
|
| + LOAD_VECTOR_UNALIGNEDl(13)
|
| + LOAD_VECTOR_UNALIGNEDl(14)
|
| + LOAD_VECTOR_UNALIGNEDl(15)
|
| + LOAD_VECTOR_UNALIGNEDh(16)
|
| + LOAD_VECTOR_UNALIGNEDh(17)
|
| + LOAD_VECTOR_UNALIGNEDh(18)
|
| + LOAD_VECTOR_UNALIGNEDh(19)
|
| + LOAD_VECTOR_UNALIGNEDh(20)
|
| + LOAD_VECTOR_UNALIGNEDh(21)
|
| + LOAD_VECTOR_UNALIGNEDh(22)
|
| + LOAD_VECTOR_UNALIGNEDh(23)
|
| + LOAD_VECTOR_UNALIGNEDh(24)
|
| + LOAD_VECTOR_UNALIGNEDh(25)
|
| + LOAD_VECTOR_UNALIGNEDh(26)
|
| + LOAD_VECTOR_UNALIGNEDh(27)
|
| + LOAD_VECTOR_UNALIGNEDh(28)
|
| + LOAD_VECTOR_UNALIGNEDh(29)
|
| + LOAD_VECTOR_UNALIGNEDh(30)
|
| + LOAD_VECTOR_UNALIGNEDh(31)
|
| +
|
| +Lnovec:
|
| + lwz r0, 136(r3) ; __cr
|
| + mtocrf 255,r0
|
| + lwz r0, 148(r3) ; __ctr
|
| + mtctr r0
|
| + lwz r0, 0(r3) ; __ssr0
|
| + mtctr r0
|
| + lwz r0, 8(r3) ; do r0 now
|
| + lwz r5,28(r3) ; do r5 now
|
| + lwz r4,24(r3) ; do r4 now
|
| + lwz r1,12(r3) ; do sp now
|
| + lwz r3,20(r3) ; do r3 last
|
| + bctr
|
| +
|
| +#elif __arm64__
|
| +
|
| + .text
|
| + .globl __ZN9libunwind15Registers_arm646jumptoEv
|
| + .private_extern __ZN9libunwind15Registers_arm646jumptoEv
|
| +__ZN9libunwind15Registers_arm646jumptoEv:
|
| +;
|
| +; void libunwind::Registers_arm64::jumpto()
|
| +;
|
| +; On entry:
|
| +; thread_state pointer is in x0
|
| +;
|
| + ; skip restore of x0,x1 for now
|
| + ldp x2, x3, [x0, #0x010]
|
| + ldp x4, x5, [x0, #0x020]
|
| + ldp x6, x7, [x0, #0x030]
|
| + ldp x8, x9, [x0, #0x040]
|
| + ldp x10,x11, [x0, #0x050]
|
| + ldp x12,x13, [x0, #0x060]
|
| + ldp x14,x15, [x0, #0x070]
|
| + ldp x16,x17, [x0, #0x080]
|
| + ldp x18,x19, [x0, #0x090]
|
| + ldp x20,x21, [x0, #0x0A0]
|
| + ldp x22,x23, [x0, #0x0B0]
|
| + ldp x24,x25, [x0, #0x0C0]
|
| + ldp x26,x27, [x0, #0x0D0]
|
| + ldp x28,fp, [x0, #0x0E0]
|
| + ldr lr, [x0, #0x100] ; restore pc into lr
|
| + ldr x1, [x0, #0x0F8]
|
| + mov sp,x1 ; restore sp
|
| +
|
| + ldp d0, d1, [x0, #0x110]
|
| + ldp d2, d3, [x0, #0x120]
|
| + ldp d4, d5, [x0, #0x130]
|
| + ldp d6, d7, [x0, #0x140]
|
| + ldp d8, d9, [x0, #0x150]
|
| + ldp d10,d11, [x0, #0x160]
|
| + ldp d12,d13, [x0, #0x170]
|
| + ldp d14,d15, [x0, #0x180]
|
| + ldp d16,d17, [x0, #0x190]
|
| + ldp d18,d19, [x0, #0x1A0]
|
| + ldp d20,d21, [x0, #0x1B0]
|
| + ldp d22,d23, [x0, #0x1C0]
|
| + ldp d24,d25, [x0, #0x1D0]
|
| + ldp d26,d27, [x0, #0x1E0]
|
| + ldp d28,d29, [x0, #0x1F0]
|
| + ldr d30, [x0, #0x200]
|
| + ldr d31, [x0, #0x208]
|
| +
|
| + ldp x0, x1, [x0, #0x000] ; restore x0,x1
|
| + ret lr ; jump to pc
|
| +
|
| +
|
| +
|
| +
|
| +#endif
|
| +
|
|
|
| Property changes on: third_party/libc++abi/src/Unwind/UnwindRegistersRestore.s
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|