UnwindRegistersRestore.S revision 5ff06b0156f5820a87b4dd90bcd06f8ed41af8cc
1be38d822057438996715f7bcae3d293a50908d03Nico Weber//===-------------------- UnwindRegistersRestore.S ------------------------===//
2b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik//
3b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik//                     The LLVM Compiler Infrastructure
4b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik//
5b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik// This file is dual licensed under the MIT and the University of Illinois Open
6b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik// Source Licenses. See LICENSE.TXT for details.
7b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik//
8b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik//===----------------------------------------------------------------------===//
9b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
107c61d80c68ef9af39fbc49ef532c2252fa719ac9Nico Weber#include "assembly.h"
11b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
127be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  .text
137c61d80c68ef9af39fbc49ef532c2252fa719ac9Nico Weber
147c61d80c68ef9af39fbc49ef532c2252fa719ac9Nico Weber#if __i386__
157c61d80c68ef9af39fbc49ef532c2252fa719ac9Nico WeberDEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_x866jumptoEv)
16b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#
177be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik# void libunwind::Registers_x86::jumpto()
18b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#
19b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik# On entry:
207be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik#  +                       +
217be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik#  +-----------------------+
227be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik#  + thread_state pointer  +
237be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik#  +-----------------------+
247be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik#  + return address        +
257be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik#  +-----------------------+   <-- SP
267be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik#  +                       +
277be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movl   4(%esp), %eax
287be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  # set up eax and ret on new stack location
297be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movl  28(%eax), %edx # edx holds new stack pointer
307be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  subl  $8,%edx
317be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movl  %edx, 28(%eax)
327be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movl  0(%eax), %ebx
337be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movl  %ebx, 0(%edx)
347be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movl  40(%eax), %ebx
357be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movl  %ebx, 4(%edx)
367be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  # we now have ret and eax pushed onto where new stack will be
377be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  # restore all registers
387be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movl   4(%eax), %ebx
397be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movl   8(%eax), %ecx
407be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movl  12(%eax), %edx
417be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movl  16(%eax), %edi
427be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movl  20(%eax), %esi
437be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movl  24(%eax), %ebp
447be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movl  28(%eax), %esp
45b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  # skip ss
46b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  # skip eflags
477be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  pop    %eax  # eax was already pushed on new stack
487be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ret        # eip was already pushed on new stack
49b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  # skip cs
50b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  # skip ds
51b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  # skip es
52b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  # skip fs
53b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  # skip gs
54b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
55b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#elif __x86_64__
56b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
577c61d80c68ef9af39fbc49ef532c2252fa719ac9Nico WeberDEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind16Registers_x86_646jumptoEv)
58b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#
597be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik# void libunwind::Registers_x86_64::jumpto()
60b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#
617be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik# On entry, thread_state pointer is in rdi
627be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik
637be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq  56(%rdi), %rax # rax holds new stack pointer
647be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  subq  $16, %rax
657be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq  %rax, 56(%rdi)
667be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq  32(%rdi), %rbx  # store new rdi on new stack
677be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq  %rbx, 0(%rax)
687be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq  128(%rdi), %rbx # store new rip on new stack
697be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq  %rbx, 8(%rax)
707be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  # restore all registers
717be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq    0(%rdi), %rax
727be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq    8(%rdi), %rbx
737be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq   16(%rdi), %rcx
747be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq   24(%rdi), %rdx
757be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  # restore rdi later
767be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq   40(%rdi), %rsi
777be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq   48(%rdi), %rbp
787be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  # restore rsp later
797be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq   64(%rdi), %r8
807be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq   72(%rdi), %r9
817be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq   80(%rdi), %r10
827be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq   88(%rdi), %r11
837be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq   96(%rdi), %r12
847be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq  104(%rdi), %r13
857be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq  112(%rdi), %r14
867be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq  120(%rdi), %r15
87b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  # skip rflags
88b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  # skip cs
89b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  # skip fs
90b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  # skip gs
917be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  movq  56(%rdi), %rsp  # cut back rsp to new location
927be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  pop    %rdi      # rdi was saved here earlier
937be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ret            # rip was saved here
947be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik
95b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
96b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#elif __ppc__
97b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
987c61d80c68ef9af39fbc49ef532c2252fa719ac9Nico WeberDEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_ppc6jumptoEv)
99b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik;
1007be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik; void libunwind::Registers_ppc::jumpto()
101b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik;
102b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik; On entry:
103b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik;  thread_state pointer is in r3
104b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik;
105b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
1067be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ; restore integral registerrs
1077be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ; skip r0 for now
1087be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ; skip r1 for now
1097be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz     r2, 16(r3)
1107be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ; skip r3 for now
1117be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ; skip r4 for now
1127be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ; skip r5 for now
1137be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz     r6, 32(r3)
1147be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz     r7, 36(r3)
1157be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz     r8, 40(r3)
1167be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz     r9, 44(r3)
1177be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r10, 48(r3)
1187be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r11, 52(r3)
1197be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r12, 56(r3)
1207be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r13, 60(r3)
1217be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r14, 64(r3)
1227be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r15, 68(r3)
1237be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r16, 72(r3)
1247be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r17, 76(r3)
1257be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r18, 80(r3)
1267be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r19, 84(r3)
1277be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r20, 88(r3)
1287be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r21, 92(r3)
1297be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r22, 96(r3)
1307be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r23,100(r3)
1317be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r24,104(r3)
1327be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r25,108(r3)
1337be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r26,112(r3)
1347be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r27,116(r3)
1357be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r28,120(r3)
1367be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r29,124(r3)
1377be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r30,128(r3)
1387be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r31,132(r3)
139b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
1407be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ; restore float registers
1417be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f0, 160(r3)
1427be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f1, 168(r3)
1437be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f2, 176(r3)
1447be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f3, 184(r3)
1457be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f4, 192(r3)
1467be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f5, 200(r3)
1477be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f6, 208(r3)
1487be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f7, 216(r3)
1497be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f8, 224(r3)
1507be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f9, 232(r3)
1517be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f10,240(r3)
1527be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f11,248(r3)
1537be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f12,256(r3)
1547be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f13,264(r3)
1557be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f14,272(r3)
1567be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f15,280(r3)
1577be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f16,288(r3)
1587be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f17,296(r3)
1597be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f18,304(r3)
1607be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f19,312(r3)
1617be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f20,320(r3)
1627be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f21,328(r3)
1637be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f22,336(r3)
1647be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f23,344(r3)
1657be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f24,352(r3)
1667be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f25,360(r3)
1677be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f26,368(r3)
1687be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f27,376(r3)
1697be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f28,384(r3)
1707be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f29,392(r3)
1717be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f30,400(r3)
1727be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lfd    f31,408(r3)
173b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
1747be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ; restore vector registers if any are in use
1757be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r5,156(r3)  ; test VRsave
1767be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  cmpwi  r5,0
1777be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  beq    Lnovec
178b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
179b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  subi  r4,r1,16
180b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  rlwinm  r4,r4,0,0,27  ; mask low 4-bits
181b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  ; r4 is now a 16-byte aligned pointer into the red zone
1827be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ; the _vectorRegisters may not be 16-byte aligned so copy via red zone temp buffer
183b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
184b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
1857be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik#define LOAD_VECTOR_UNALIGNEDl(_index) \
1867be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  andis.  r0,r5,(1<<(15-_index))  @\
1877be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  beq    Ldone  ## _index     @\
1887be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r0, 424+_index*16(r3)  @\
1897be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  stw    r0, 0(r4)        @\
1907be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r0, 424+_index*16+4(r3)  @\
1917be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  stw    r0, 4(r4)        @\
1927be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r0, 424+_index*16+8(r3)  @\
1937be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  stw    r0, 8(r4)        @\
1947be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r0, 424+_index*16+12(r3)@\
1957be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  stw    r0, 12(r4)        @\
1967be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lvx    v ## _index,0,r4    @\
1977be749ac9c2c7b1871d29e5db957352d82728721Nick KledzikLdone  ## _index:
198b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
1997be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik#define LOAD_VECTOR_UNALIGNEDh(_index) \
2007be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  andi.  r0,r5,(1<<(31-_index))  @\
2017be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  beq    Ldone  ## _index    @\
2027be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r0, 424+_index*16(r3)  @\
2037be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  stw    r0, 0(r4)        @\
2047be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r0, 424+_index*16+4(r3)  @\
2057be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  stw    r0, 4(r4)        @\
2067be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r0, 424+_index*16+8(r3)  @\
2077be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  stw    r0, 8(r4)        @\
2087be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r0, 424+_index*16+12(r3)@\
2097be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  stw    r0, 12(r4)        @\
2107be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lvx    v ## _index,0,r4    @\
2117be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  Ldone  ## _index:
212b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
213b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
2147be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDl(0)
2157be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDl(1)
2167be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDl(2)
2177be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDl(3)
2187be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDl(4)
2197be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDl(5)
2207be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDl(6)
2217be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDl(7)
2227be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDl(8)
2237be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDl(9)
2247be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDl(10)
2257be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDl(11)
2267be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDl(12)
2277be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDl(13)
2287be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDl(14)
2297be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDl(15)
2307be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDh(16)
2317be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDh(17)
2327be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDh(18)
2337be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDh(19)
2347be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDh(20)
2357be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDh(21)
2367be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDh(22)
2377be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDh(23)
2387be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDh(24)
2397be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDh(25)
2407be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDh(26)
2417be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDh(27)
2427be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDh(28)
2437be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDh(29)
2447be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDh(30)
2457be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  LOAD_VECTOR_UNALIGNEDh(31)
2467be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik
2477be749ac9c2c7b1871d29e5db957352d82728721Nick KledzikLnovec:
2487be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r0, 136(r3) ; __cr
2497be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  mtocrf  255,r0
2507be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r0, 148(r3) ; __ctr
2517be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  mtctr  r0
2527be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r0, 0(r3)  ; __ssr0
2537be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  mtctr  r0
2547be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r0, 8(r3)  ; do r0 now
2557be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r5,28(r3)  ; do r5 now
2567be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r4,24(r3)  ; do r4 now
2577be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r1,12(r3)  ; do sp now
2587be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  lwz    r3,20(r3)  ; do r3 last
2597be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  bctr
2607be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik
261b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#elif __arm64__
262b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
263b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik;
2647be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik; void libunwind::Registers_arm64::jumpto()
265b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik;
266b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik; On entry:
267b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik;  thread_state pointer is in x0
268b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik;
2697c61d80c68ef9af39fbc49ef532c2252fa719ac9Nico WeberDEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind15Registers_arm646jumptoEv)
2707be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ; skip restore of x0,x1 for now
2717be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    x2, x3,  [x0, #0x010]
2727be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    x4, x5,  [x0, #0x020]
2737be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    x6, x7,  [x0, #0x030]
2747be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    x8, x9,  [x0, #0x040]
2757be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    x10,x11, [x0, #0x050]
2767be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    x12,x13, [x0, #0x060]
2777be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    x14,x15, [x0, #0x070]
2787be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    x16,x17, [x0, #0x080]
2797be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    x18,x19, [x0, #0x090]
2807be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    x20,x21, [x0, #0x0A0]
2817be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    x22,x23, [x0, #0x0B0]
2827be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    x24,x25, [x0, #0x0C0]
2837be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    x26,x27, [x0, #0x0D0]
2847be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    x28,fp,  [x0, #0x0E0]
2857be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldr    lr,      [x0, #0x100]  ; restore pc into lr
2867be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldr    x1,      [x0, #0x0F8]
2877be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  mov    sp,x1          ; restore sp
2887be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik
2897be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    d0, d1,  [x0, #0x110]
2907be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    d2, d3,  [x0, #0x120]
2917be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    d4, d5,  [x0, #0x130]
2927be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    d6, d7,  [x0, #0x140]
2937be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    d8, d9,  [x0, #0x150]
2947be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    d10,d11, [x0, #0x160]
2957be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    d12,d13, [x0, #0x170]
2967be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    d14,d15, [x0, #0x180]
2977be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    d16,d17, [x0, #0x190]
2987be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    d18,d19, [x0, #0x1A0]
2997be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    d20,d21, [x0, #0x1B0]
3007be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    d22,d23, [x0, #0x1C0]
3017be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    d24,d25, [x0, #0x1D0]
3027be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    d26,d27, [x0, #0x1E0]
3037be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    d28,d29, [x0, #0x1F0]
3047be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldr    d30,     [x0, #0x200]
3057be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldr    d31,     [x0, #0x208]
3067be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik
3077be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ldp    x0, x1,  [x0, #0x000]  ; restore x0,x1
3087be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik  ret    lr            ; jump to pc
3097be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik
3105ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber#elif __arm__
3115ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber
3125ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber@
3135ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber@ void libunwind::Registers_arm::jumpto()
3145ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber@
3155ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber@ On entry:
3165ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber@  thread_state pointer is in r0
3175ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber@
3185ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico WeberDEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_arm6jumptoEv)
3195ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber  @ Use lr as base so that r0 can be restored.
3205ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber  mov lr, r0
3215ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber  @ 32bit thumb-2 restrictions for ldm:
3225ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber  @ . the sp (r13) cannot be in the list
3235ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber  @ . the pc (r15) and lr (r14) cannot both be in the list in an LDM instruction
3245ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber  ldm lr, {r0-r12}
3255ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber  ldr sp, [lr, #52]
3265ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber  ldr lr, [lr, #60]  @ restore pc into lr
3275ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber  mov pc, lr
3285ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber
329b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#endif
330