1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- The core dispatch loop, for jumping to a code address.       ---*/
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---                                       dispatch-ppc64-linux.S ---*/
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  This file is part of Valgrind, a dynamic binary instrumentation
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  framework.
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  Copyright (C) 2005-2011 Cerion Armour-Brown <cerion@open-works.co.uk>
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  This program is free software; you can redistribute it and/or
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  modify it under the terms of the GNU General Public License as
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  published by the Free Software Foundation; either version 2 of the
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  License, or (at your option) any later version.
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  This program is distributed in the hope that it will be useful, but
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  WITHOUT ANY WARRANTY; without even the implied warranty of
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  General Public License for more details.
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  You should have received a copy of the GNU General Public License
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  along with this program; if not, write to the Free Software
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  02111-1307, USA.
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  The GNU General Public License is contained in the file COPYING.
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_ppc64_linux)
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_basics_asm.h"
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_dispatch_asm.h"
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_transtab_asm.h"
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex_guest_offsets.h"	/* for OFFSET_ppc64_CIA */
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* References to globals via the TOC */
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .globl vgPlain_tt_fast
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .lcomm  vgPlain_tt_fast,4,4
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .type   vgPlain_tt_fast, @object
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .section        ".toc","aw"
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.tocent__vgPlain_tt_fast:
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .tc vgPlain_tt_fast[TC],vgPlain_tt_fast
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.tocent__vgPlain_tt_fastN:
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .tc vgPlain_tt_fastN[TC],vgPlain_tt_fastN
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.tocent__vgPlain_dispatch_ctr:
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .tc vgPlain_dispatch_ctr[TC],vgPlain_dispatch_ctr
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.tocent__vgPlain_machine_ppc64_has_VMX:
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .tc vgPlain_machine_ppc64_has_VMX[TC],vgPlain_machine_ppc64_has_VMX
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---                                                      ---*/
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- The dispatch loop.  VG_(run_innerloop) is used to    ---*/
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- run all translations except no-redir ones.           ---*/
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---                                                      ---*/
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------*/
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Preamble (set everything up)                 ---*/
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------*/
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* signature:
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownUWord VG_(run_innerloop) ( void* guest_state, UWord do_profiling );
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.section ".text"
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.align   2
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(run_innerloop)
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.section ".opd","aw"
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.align   3
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(run_innerloop):
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.quad    .VG_(run_innerloop),.TOC.@tocbase,0
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.previous
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.type    .VG_(run_innerloop),@function
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl   .VG_(run_innerloop)
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.VG_(run_innerloop):
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* r3 holds guest_state */
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* r4 holds do_profiling */
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* ----- entry point to VG_(run_innerloop) ----- */
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* PPC64 ABI saves LR->16(prt_sp), CR->8(prt_sp)) */
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Save lr, cr */
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mflr    0
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     0,16(1)
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mfcr    0
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     0,8(1)
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* New stack frame */
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stdu    1,-624(1)  /* sp should maintain 16-byte alignment */
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Save callee-saved registers... */
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Floating-point reg save area : 144 bytes */
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stfd    31,616(1)
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stfd    30,608(1)
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stfd    29,600(1)
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stfd    28,592(1)
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stfd    27,584(1)
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stfd    26,576(1)
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stfd    25,568(1)
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stfd    24,560(1)
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stfd    23,552(1)
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stfd    22,544(1)
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stfd    21,536(1)
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stfd    20,528(1)
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stfd    19,520(1)
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stfd    18,512(1)
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stfd    17,504(1)
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stfd    16,496(1)
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stfd    15,488(1)
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stfd    14,480(1)
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* General reg save area : 144 bytes */
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     31,472(1)
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     30,464(1)
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     29,456(1)
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     28,448(1)
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     27,440(1)
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     26,432(1)
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     25,424(1)
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     24,416(1)
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     23,408(1)
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     22,400(1)
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     21,392(1)
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     20,384(1)
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     19,376(1)
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     18,368(1)
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     17,360(1)
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     16,352(1)
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     15,344(1)
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     14,336(1)
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Probably not necessary to save r13 (thread-specific ptr),
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           as VEX stays clear of it... but what the hey. */
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     13,328(1)
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* It's necessary to save/restore VRSAVE in the AIX / Darwin ABI.
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           The Linux kernel might not actually use VRSAVE for its intended
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           purpose, but it should be harmless to preserve anyway. */
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* r3, r4 are live here, so use r5 */
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld	5,.tocent__vgPlain_machine_ppc64_has_VMX@toc(2)
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld	5,0(5)
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpldi  5,0
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beq     .LafterVMX1
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* VRSAVE save word : 32 bytes */
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mfspr   5,256         /* vrsave reg is spr number 256 */
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stw     5,324(1)
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Alignment padding : 4 bytes */
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Vector reg save area (quadword aligned) : 192 bytes */
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      5,304
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stvx    31,5,1
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      5,288
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stvx    30,5,1
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      5,272
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stvx    29,5,1
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      5,256
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stvx    28,5,1
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      5,240
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stvx    27,5,1
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      5,224
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stvx    26,5,1
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      5,208
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stvx    25,5,1
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      5,192
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stvx    24,5,1
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      5,176
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stvx    23,5,1
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      5,160
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stvx    22,5,1
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      5,144
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stvx    21,5,1
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      5,128
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stvx    20,5,1
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LafterVMX1:
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Local variable space... */
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* r3 holds guest_state */
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* r4 holds do_profiling */
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mr      31,3
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     3,104(1)       /* spill orig guest_state ptr */
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* 96(sp) used later to check FPSCR[RM] */
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* 88(sp) used later to load fpscr with zero */
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* 48:87(sp) free */
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Linkage Area (reserved)
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           40(sp) : TOC
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           32(sp) : link editor doubleword
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           24(sp) : compiler doubleword
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           16(sp) : LR
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           8(sp)  : CR
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           0(sp)  : back-chain
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        */
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// CAB TODO: Use a caller-saved reg for orig guest_state ptr
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// - rem to set non-allocateable in isel.c
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* hold dispatch_ctr (=32bit value) in r29 */
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld	29,.tocent__vgPlain_dispatch_ctr@toc(2)
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lwz	29,0(29)  /* 32-bit zero-extending load */
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* set host FPU control word to the default mode expected
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           by VEX-generated code.  See comments in libvex.h for
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           more info. */
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* => get zero into f3 (tedious)
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           fsub 3,3,3 is not a reliable way to do this, since if
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           f3 holds a NaN or similar then we don't necessarily
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           wind up with zero. */
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      5,0
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stw     5,88(1)
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfs     3,88(1)
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mtfsf   0xFF,3   /* fpscr = lo32 of f3 */
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* set host AltiVec control word to the default mode expected
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           by VEX-generated code. */
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld	5,.tocent__vgPlain_machine_ppc64_has_VMX@toc(2)
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld	5,0(5)
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpldi  5,0
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beq     .LafterVMX2
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        vspltisw 3,0x0  /* generate zero */
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mtvscr  3
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LafterVMX2:
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* make a stack frame for the code we are calling */
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stdu    1,-48(1)
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* fetch %CIA into r3 */
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      3,OFFSET_ppc64_CIA(31)
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* fall into main loop (the right one) */
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* r4 = do_profiling.  It's probably trashed after here,
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           but that's OK: we don't need it after here. */
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmplwi	4,0
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	beq	.VG_(run_innerloop__dispatch_unprofiled)
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	b	.VG_(run_innerloop__dispatch_profiled)
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/*NOTREACHED*/
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------*/
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- NO-PROFILING (standard) dispatcher           ---*/
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------*/
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .section        ".text"
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .align 2
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .globl VG_(run_innerloop__dispatch_unprofiled)
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .section        ".opd","aw"
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .align 3
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(run_innerloop__dispatch_unprofiled):
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .quad   .VG_(run_innerloop__dispatch_unprofiled),.TOC.@tocbase,0
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .previous
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .type   .VG_(run_innerloop__dispatch_unprofiled),@function
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .globl  .VG_(run_innerloop__dispatch_unprofiled)
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.VG_(run_innerloop__dispatch_unprofiled):
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* At entry: Live regs:
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		r1  (=sp)
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		r2  (toc pointer)
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		r3  (=CIA = next guest address)
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		r29 (=dispatch_ctr)
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		r31 (=guest_state)
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	   Stack state:
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		144(r1) (=var space for FPSCR[RM])
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	*/
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* Has the guest state pointer been messed with?  If yes, exit.
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           Also set up & VG_(tt_fast) early in an attempt at better
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           scheduling. */
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld	5, .tocent__vgPlain_tt_fast@toc(2) /* &VG_(tt_fast) */
277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        rldicl. 0,31,0,63
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bne	.gsp_changed
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* save the jump address in the guest state */
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     3,OFFSET_ppc64_CIA(31)
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Are we out of timeslice?  If yes, defer to scheduler. */
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subi	29,29,1
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpldi	29,0
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beq	.counter_is_zero
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* try a fast lookup in the translation cache */
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* r4 = VG_TT_FAST_HASH(addr)           * sizeof(FastCacheEntry)
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              = ((r3 >>u 2) & VG_TT_FAST_MASK)  << 4 */
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	rldicl	4,3, 62, 64-VG_TT_FAST_BITS   /* entry# */
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sldi	4,4,4      /* entry# * sizeof(FastCacheEntry) */
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	5,5,4      /* & VG_(tt_fast)[entry#] */
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld	6,0(5)     /* .guest */
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld	7,8(5)     /* .host */
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpd    3,6
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bne     .fast_lookup_failed
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Found a match.  Call .host. */
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mtctr   7
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bctrl
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* On return from guest code:
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	   r3  holds destination (original) address.
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           r31 may be unchanged (guest_state), or may indicate further
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           details of the control transfer requested to *r3.
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        */
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* start over */
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	b	.VG_(run_innerloop__dispatch_unprofiled)
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/*NOTREACHED*/
311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        .size .VG_(run_innerloop), .-.VG_(run_innerloop)
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------*/
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- PROFILING dispatcher (can be much slower)    ---*/
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------*/
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .section        ".text"
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .align 2
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .globl VG_(run_innerloop__dispatch_profiled)
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .section        ".opd","aw"
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .align 3
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(run_innerloop__dispatch_profiled):
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .quad   .VG_(run_innerloop__dispatch_profiled),.TOC.@tocbase,0
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .previous
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .type   .VG_(run_innerloop__dispatch_profiled),@function
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        .globl  .VG_(run_innerloop__dispatch_profiled)
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.VG_(run_innerloop__dispatch_profiled):
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* At entry: Live regs:
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		r1  (=sp)
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		r2  (toc pointer)
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		r3  (=CIA = next guest address)
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		r29 (=dispatch_ctr)
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		r31 (=guest_state)
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	   Stack state:
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		144(r1) (=var space for FPSCR[RM])
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	*/
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* Has the guest state pointer been messed with?  If yes, exit.
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           Also set up & VG_(tt_fast) early in an attempt at better
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           scheduling. */
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld	5, .tocent__vgPlain_tt_fast@toc(2) /* &VG_(tt_fast) */
342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        rldicl. 0,31,0,63
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bne	.gsp_changed
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* save the jump address in the guest state */
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     3,OFFSET_ppc64_CIA(31)
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Are we out of timeslice?  If yes, defer to scheduler. */
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	subi	29,29,1
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpldi	29,0
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beq	.counter_is_zero
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* try a fast lookup in the translation cache */
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* r4 = VG_TT_FAST_HASH(addr)           * sizeof(FastCacheEntry)
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              = ((r3 >>u 2) & VG_TT_FAST_MASK)  << 4 */
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	rldicl	4,3, 62, 64-VG_TT_FAST_BITS   /* entry# */
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	sldi	4,4,4      /* entry# * sizeof(FastCacheEntry) */
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	add	5,5,4      /* & VG_(tt_fast)[entry#] */
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld	6,0(5)     /* .guest */
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld	7,8(5)     /* .host */
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpd    3,6
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bne     .fast_lookup_failed
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* increment bb profile counter VG_(tt_fastN)[x] (=32bit val) */
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld	9, .tocent__vgPlain_tt_fastN@toc(2)
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	srdi	4, 4,1     /* entry# * sizeof(UInt*) */
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldx	9, 9,4     /* r7 = VG_(tt_fastN)[VG_TT_HASH(addr)] */
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	lwz	6, 0(9)    /* *(UInt*)r7 ++ */
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi	6, 6,1
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	stw	6, 0(9)
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Found a match.  Call .host. */
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mtctr   7
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bctrl
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* On return from guest code:
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	   r3  holds destination (original) address.
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           r31 may be unchanged (guest_state), or may indicate further
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           details of the control transfer requested to *r3.
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        */
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* start over */
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	b	.VG_(run_innerloop__dispatch_profiled)
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/*NOTREACHED*/
384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        .size .VG_(run_a_noredir_translation), .-.VG_(run_a_noredir_translation)
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------*/
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- exit points                                  ---*/
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------*/
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.gsp_changed:
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* Someone messed with the gsp (in r31).  Have to
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           defer to scheduler to resolve this.  dispatch ctr
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	   is not yet decremented, so no need to increment. */
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* %CIA is NOT up to date here.  First, need to write
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	   %r3 back to %CIA, but without trashing %r31 since
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	   that holds the value we want to return to the scheduler.
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	   Hence use %r5 transiently for the guest state pointer. */
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      5,152(1)         /* original guest_state ptr */
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        std     3,OFFSET_ppc64_CIA(5)
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mr	3,31		/* r3 = new gsp value */
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	b	.run_innerloop_exit
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/*NOTREACHED*/
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.counter_is_zero:
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* %CIA is up to date */
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* back out decrement of the dispatch counter */
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        addi    29,29,1
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      3,VG_TRC_INNER_COUNTERZERO
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        b       .run_innerloop_exit
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.fast_lookup_failed:
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* %CIA is up to date */
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* back out decrement of the dispatch counter */
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        addi    29,29,1
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      3,VG_TRC_INNER_FASTMISS
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	b       .run_innerloop_exit
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* All exits from the dispatcher go through here.
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r3 holds the return value.
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.run_innerloop_exit:
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* We're leaving.  Check that nobody messed with
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           VSCR or FPSCR. */
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* Set fpscr back to a known state, since vex-generated code
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	   may have messed with fpscr[rm]. */
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      5,0
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        addi    1,1,-16
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stw     5,0(1)
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfs     3,0(1)
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        addi    1,1,16
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mtfsf   0xFF,3   /* fpscr = f3 */
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* Using r11 - value used again further on, so don't trash! */
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld	11,.tocent__vgPlain_machine_ppc64_has_VMX@toc(2)
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      11,0(11)
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpldi  11,0
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beq     .LafterVMX8
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Check VSCR[NJ] == 1 */
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* first generate 4x 0x00010000 */
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        vspltisw  4,0x1                   /* 4x 0x00000001 */
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        vspltisw  5,0x0                   /* zero */
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        vsldoi    6,4,5,0x2               /* <<2*8 => 4x 0x00010000 */
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* retrieve VSCR and mask wanted bits */
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mfvscr    7
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        vand      7,7,6                   /* gives NJ flag */
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        vspltw    7,7,0x3                 /* flags-word to all lanes */
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        vcmpequw. 8,6,7                   /* CR[24] = 1 if v6 == v7 */
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        bt        24,.invariant_violation /* branch if all_equal */
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LafterVMX8:
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* otherwise we're OK */
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        b       .run_innerloop_exit_REALLY
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.invariant_violation:
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      3,VG_TRC_INVARIANT_FAILED
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        b       .run_innerloop_exit_REALLY
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.run_innerloop_exit_REALLY:
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* r3 holds VG_TRC_* value to return */
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Return to parent stack */
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        addi    1,1,48
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Write ctr to VG_(dispatch_ctr) (=32bit value) */
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld	5,.tocent__vgPlain_dispatch_ctr@toc(2)
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        stw     29,0(5)
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Restore cr */
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lwz     0,44(1)
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mtcr    0
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Restore callee-saved registers... */
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Floating-point regs */
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfd     31,616(1)
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfd     30,608(1)
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfd     29,600(1)
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfd     28,592(1)
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfd     27,584(1)
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfd     26,576(1)
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfd     25,568(1)
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfd     24,560(1)
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfd     23,552(1)
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfd     22,544(1)
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfd     21,536(1)
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfd     20,528(1)
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfd     19,520(1)
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfd     18,512(1)
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfd     17,504(1)
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfd     16,496(1)
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfd     15,488(1)
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lfd     14,480(1)
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* General regs */
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      31,472(1)
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      30,464(1)
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      29,456(1)
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      28,448(1)
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      27,440(1)
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      26,432(1)
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      25,424(1)
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      24,416(1)
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      23,408(1)
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      22,400(1)
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      21,392(1)
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      20,384(1)
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      19,376(1)
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      18,368(1)
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      17,360(1)
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      16,352(1)
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      15,344(1)
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      14,336(1)
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      13,328(1)
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* r11 already holds VG_(machine_ppc64_has_VMX) value */
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        cmpldi  11,0
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        beq     .LafterVMX9
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* VRSAVE */
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lwz     4,324(1)
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mfspr   4,256         /* VRSAVE reg is spr number 256 */
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* Vector regs */
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      4,304
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lvx     31,4,1
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      4,288
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lvx     30,4,1
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      4,272
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lvx     29,4,1
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      4,256
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lvx     28,4,1
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      4,240
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lvx     27,4,1
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      4,224
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lvx     26,4,1
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      4,208
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lvx     25,4,1
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      4,192
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lvx     24,4,1
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      4,176
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lvx     23,4,1
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      4,160
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lvx     22,4,1
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      4,144
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lvx     21,4,1
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        li      4,128
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        lvx     20,4,1
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.LafterVMX9:
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* reset cr, lr, sp */
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      0,632(1)  /* stack_size + 8 */
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mtcr    0
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        ld      0,640(1)  /* stack_size + 16 */
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        mtlr    0
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        addi    1,1,624   /* stack_size */
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        blr
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---                                                      ---*/
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- A special dispatcher, for running no-redir           ---*/
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- translations.  Just runs the given translation once. ---*/
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---                                                      ---*/
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* signature:
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid VG_(run_a_noredir_translation) ( UWord* argblock );
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Run a no-redir translation.  argblock points to 4 UWords, 2 to carry args
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   and 2 to carry results:
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      0: input:  ptr to translation
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      1: input:  ptr to guest state
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      2: output: next guest PC
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      3: output: guest state pointer afterwards (== thread return code)
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.section ".text"
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.align   2
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl VG_(run_a_noredir_translation)
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.section ".opd","aw"
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.align   3
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVG_(run_a_noredir_translation):
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.quad    .VG_(run_a_noredir_translation),.TOC.@tocbase,0
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.previous
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.type    .VG_(run_a_noredir_translation),@function
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.globl   .VG_(run_a_noredir_translation)
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.VG_(run_a_noredir_translation):
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* save callee-save int regs, & lr */
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	stdu 1,-512(1)
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  14,256(1)
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  15,264(1)
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  16,272(1)
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  17,280(1)
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  18,288(1)
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  19,296(1)
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  20,304(1)
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  21,312(1)
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  22,320(1)
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  23,328(1)
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  24,336(1)
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  25,344(1)
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  26,352(1)
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  27,360(1)
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  28,368(1)
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  29,376(1)
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  30,384(1)
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  31,392(1)
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mflr 31
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  31,400(1)
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std   2,408(1)  /* also preserve R2, just in case .. */
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  3,416(1)
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   31,8(3)
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   30,0(3)
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mtlr 30
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	blrl
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   4,416(1)
625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  3, 16(4)
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	std  31,24(4)
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   14,256(1)
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   15,264(1)
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   16,272(1)
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   17,280(1)
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   18,288(1)
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   19,296(1)
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   20,304(1)
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   21,312(1)
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   22,320(1)
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   23,328(1)
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   24,336(1)
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   25,344(1)
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   26,352(1)
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   27,360(1)
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   28,368(1)
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   29,376(1)
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   30,384(1)
645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   31,400(1)
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	mtlr 31
647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld   31,392(1)
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ld    2,408(1)  /* also preserve R2, just in case .. */
649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addi 1,1,512
651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	blr
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Let the linker know we don't need an executable stack */
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.section .note.GNU-stack,"",@progbits
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // defined(VGP_ppc64_linux)
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                                          ---*/
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
662