12c48c7b0a453d32375a4df17e153011b797ef28csewardj
21ade697d13061d1abf5d74dd243e478aedabcaa6cerion/*--------------------------------------------------------------------*/
31ade697d13061d1abf5d74dd243e478aedabcaa6cerion/*--- The core dispatch loop, for jumping to a code address.       ---*/
40ddf76c4dd3b66b03b04cb1bc111765a6e2bd5e6sewardj/*---                                       dispatch-ppc64-linux.S ---*/
51ade697d13061d1abf5d74dd243e478aedabcaa6cerion/*--------------------------------------------------------------------*/
62c48c7b0a453d32375a4df17e153011b797ef28csewardj
72c48c7b0a453d32375a4df17e153011b797ef28csewardj/*
82c48c7b0a453d32375a4df17e153011b797ef28csewardj  This file is part of Valgrind, a dynamic binary instrumentation
92c48c7b0a453d32375a4df17e153011b797ef28csewardj  framework.
102c48c7b0a453d32375a4df17e153011b797ef28csewardj
110f157ddb404bcde7815a1c5bf2d7e41c114f3d73sewardj  Copyright (C) 2005-2013 Cerion Armour-Brown <cerion@open-works.co.uk>
122c48c7b0a453d32375a4df17e153011b797ef28csewardj
132c48c7b0a453d32375a4df17e153011b797ef28csewardj  This program is free software; you can redistribute it and/or
142c48c7b0a453d32375a4df17e153011b797ef28csewardj  modify it under the terms of the GNU General Public License as
152c48c7b0a453d32375a4df17e153011b797ef28csewardj  published by the Free Software Foundation; either version 2 of the
162c48c7b0a453d32375a4df17e153011b797ef28csewardj  License, or (at your option) any later version.
172c48c7b0a453d32375a4df17e153011b797ef28csewardj
182c48c7b0a453d32375a4df17e153011b797ef28csewardj  This program is distributed in the hope that it will be useful, but
192c48c7b0a453d32375a4df17e153011b797ef28csewardj  WITHOUT ANY WARRANTY; without even the implied warranty of
202c48c7b0a453d32375a4df17e153011b797ef28csewardj  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
212c48c7b0a453d32375a4df17e153011b797ef28csewardj  General Public License for more details.
222c48c7b0a453d32375a4df17e153011b797ef28csewardj
232c48c7b0a453d32375a4df17e153011b797ef28csewardj  You should have received a copy of the GNU General Public License
242c48c7b0a453d32375a4df17e153011b797ef28csewardj  along with this program; if not, write to the Free Software
252c48c7b0a453d32375a4df17e153011b797ef28csewardj  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
262c48c7b0a453d32375a4df17e153011b797ef28csewardj  02111-1307, USA.
272c48c7b0a453d32375a4df17e153011b797ef28csewardj
282c48c7b0a453d32375a4df17e153011b797ef28csewardj  The GNU General Public License is contained in the file COPYING.
292c48c7b0a453d32375a4df17e153011b797ef28csewardj*/
302c48c7b0a453d32375a4df17e153011b797ef28csewardj
31582d58245637ab05272d89fb94b12fd0f18fa0f8carll#if defined(VGP_ppc64be_linux)
328b68b64759254d514d98328c496cbd88cde4c9a5njn
332c48c7b0a453d32375a4df17e153011b797ef28csewardj#include "pub_core_basics_asm.h"
342c48c7b0a453d32375a4df17e153011b797ef28csewardj#include "pub_core_dispatch_asm.h"
352c48c7b0a453d32375a4df17e153011b797ef28csewardj#include "pub_core_transtab_asm.h"
362c48c7b0a453d32375a4df17e153011b797ef28csewardj#include "libvex_guest_offsets.h"	/* for OFFSET_ppc64_CIA */
372c48c7b0a453d32375a4df17e153011b797ef28csewardj
382c48c7b0a453d32375a4df17e153011b797ef28csewardj
392c48c7b0a453d32375a4df17e153011b797ef28csewardj/* References to globals via the TOC */
402c48c7b0a453d32375a4df17e153011b797ef28csewardj
412108204443f84bfa733397be519bdcf6810c5127cerion/*
42291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl  vgPlain_tt_fast
432108204443f84bfa733397be519bdcf6810c5127cerion        .lcomm  vgPlain_tt_fast,4,4
442108204443f84bfa733397be519bdcf6810c5127cerion        .type   vgPlain_tt_fast, @object
452108204443f84bfa733397be519bdcf6810c5127cerion*/
46291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.section ".toc","aw"
472108204443f84bfa733397be519bdcf6810c5127cerion.tocent__vgPlain_tt_fast:
482108204443f84bfa733397be519bdcf6810c5127cerion        .tc vgPlain_tt_fast[TC],vgPlain_tt_fast
4996b3c209fdcededc7aece86a23c7d9af78a036e0sewardj.tocent__vgPlain_stats__n_xindirs_32:
5096b3c209fdcededc7aece86a23c7d9af78a036e0sewardj        .tc vgPlain_stats__n_xindirs_32[TC],vgPlain_stats__n_xindirs_32
5196b3c209fdcededc7aece86a23c7d9af78a036e0sewardj.tocent__vgPlain_stats__n_xindir_misses_32:
5296b3c209fdcededc7aece86a23c7d9af78a036e0sewardj        .tc vgPlain_stats__n_xindir_misses_32[TC],vgPlain_stats__n_xindir_misses_32
532108204443f84bfa733397be519bdcf6810c5127cerion.tocent__vgPlain_machine_ppc64_has_VMX:
542108204443f84bfa733397be519bdcf6810c5127cerion        .tc vgPlain_machine_ppc64_has_VMX[TC],vgPlain_machine_ppc64_has_VMX
552c48c7b0a453d32375a4df17e153011b797ef28csewardj
562c48c7b0a453d32375a4df17e153011b797ef28csewardj/*------------------------------------------------------------*/
571a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj/*---                                                      ---*/
58291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*--- The dispatch loop.  VG_(disp_run_translations) is    ---*/
59291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*--- used to run all translations,                        ---*/
60291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*--- including no-redir ones.                             ---*/
611a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj/*---                                                      ---*/
622c48c7b0a453d32375a4df17e153011b797ef28csewardj/*------------------------------------------------------------*/
632c48c7b0a453d32375a4df17e153011b797ef28csewardj
641ade697d13061d1abf5d74dd243e478aedabcaa6cerion/*----------------------------------------------------*/
65291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*--- Entry and preamble (set everything up)       ---*/
661ade697d13061d1abf5d74dd243e478aedabcaa6cerion/*----------------------------------------------------*/
672c48c7b0a453d32375a4df17e153011b797ef28csewardj
681ade697d13061d1abf5d74dd243e478aedabcaa6cerion/* signature:
69291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjvoid VG_(disp_run_translations)( UWord* two_words,
70291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                                 void*  guest_state,
71291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                                 Addr   host_addr );
721ade697d13061d1abf5d74dd243e478aedabcaa6cerion*/
732108204443f84bfa733397be519bdcf6810c5127cerion
741ade697d13061d1abf5d74dd243e478aedabcaa6cerion.section ".text"
751ade697d13061d1abf5d74dd243e478aedabcaa6cerion.align   2
76291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.globl   VG_(disp_run_translations)
771ade697d13061d1abf5d74dd243e478aedabcaa6cerion.section ".opd","aw"
781ade697d13061d1abf5d74dd243e478aedabcaa6cerion.align   3
79291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjVG_(disp_run_translations):
80291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.quad    .VG_(disp_run_translations),.TOC.@tocbase,0
811ade697d13061d1abf5d74dd243e478aedabcaa6cerion.previous
82291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.type    .VG_(disp_run_translations),@function
83291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.globl   .VG_(disp_run_translations)
84291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.VG_(disp_run_translations):
85291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	/* r3 holds two_words */
86291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	/* r4 holds guest_state */
87291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* r5 holds host_addr */
88291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
89291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* ----- entry point to VG_(disp_run_translations) ----- */
902108204443f84bfa733397be519bdcf6810c5127cerion        /* PPC64 ABI saves LR->16(prt_sp), CR->8(prt_sp)) */
911ade697d13061d1abf5d74dd243e478aedabcaa6cerion
922108204443f84bfa733397be519bdcf6810c5127cerion        /* Save lr, cr */
93291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mflr    6
94291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     6,16(1)
95291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mfcr    6
96291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     6,8(1)
972c48c7b0a453d32375a4df17e153011b797ef28csewardj
982c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* New stack frame */
992108204443f84bfa733397be519bdcf6810c5127cerion        stdu    1,-624(1)  /* sp should maintain 16-byte alignment */
1002c48c7b0a453d32375a4df17e153011b797ef28csewardj
101291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* General reg save area : 152 bytes */
102291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     31,472(1)
103291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     30,464(1)
104291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     29,456(1)
105291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     28,448(1)
106291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     27,440(1)
107291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     26,432(1)
108291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     25,424(1)
109291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     24,416(1)
110291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     23,408(1)
111291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     22,400(1)
112291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     21,392(1)
113291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     20,384(1)
114291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     19,376(1)
115291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     18,368(1)
116291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     17,360(1)
117291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     16,352(1)
118291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     15,344(1)
119291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     14,336(1)
120291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     13,328(1)
121291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     3,104(1)  /* save two_words for later */
1222c48c7b0a453d32375a4df17e153011b797ef28csewardj
123291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Save callee-saved registers... */
1242c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* Floating-point reg save area : 144 bytes */
1252c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    31,616(1)
1262c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    30,608(1)
1272c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    29,600(1)
1282c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    28,592(1)
1292c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    27,584(1)
1302c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    26,576(1)
1312c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    25,568(1)
1322c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    24,560(1)
1332c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    23,552(1)
1342c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    22,544(1)
1352c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    21,536(1)
1362c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    20,528(1)
1372c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    19,520(1)
1382c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    18,512(1)
1392c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    17,504(1)
1402c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    16,496(1)
1412c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    15,488(1)
1422c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    14,480(1)
1432c48c7b0a453d32375a4df17e153011b797ef28csewardj
1442c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* It's necessary to save/restore VRSAVE in the AIX / Darwin ABI.
1452c48c7b0a453d32375a4df17e153011b797ef28csewardj           The Linux kernel might not actually use VRSAVE for its intended
1462c48c7b0a453d32375a4df17e153011b797ef28csewardj           purpose, but it should be harmless to preserve anyway. */
147291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	/* r3, r4, r5 are live here, so use r6 */
148291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	ld	6,.tocent__vgPlain_machine_ppc64_has_VMX@toc(2)
149291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	ld	6,0(6)
150291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        cmpldi  6,0
1512108204443f84bfa733397be519bdcf6810c5127cerion        beq     .LafterVMX1
1522c48c7b0a453d32375a4df17e153011b797ef28csewardj
1532c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* VRSAVE save word : 32 bytes */
154291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mfspr   6,256         /* vrsave reg is spr number 256 */
155291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stw     6,324(1)
1562c48c7b0a453d32375a4df17e153011b797ef28csewardj
1572c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* Alignment padding : 4 bytes */
1582c48c7b0a453d32375a4df17e153011b797ef28csewardj
1592c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* Vector reg save area (quadword aligned) : 192 bytes */
160291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,304
161291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    31,6,1
162291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,288
163291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    30,6,1
164291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,272
165291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    29,6,1
166291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,256
167291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    28,6,1
168291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,240
169291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    27,6,1
170291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,224
171291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    26,6,1
172291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,208
173291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    25,6,1
174291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,192
175291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    24,6,1
176291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,176
177291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    23,6,1
178291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,160
179291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    22,6,1
180291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,144
181291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    21,6,1
182291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,128
183291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    20,6,1
1842108204443f84bfa733397be519bdcf6810c5127cerion.LafterVMX1:
1852c48c7b0a453d32375a4df17e153011b797ef28csewardj
1862c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* Local variable space... */
1872c48c7b0a453d32375a4df17e153011b797ef28csewardj
188291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	/* r3 holds two_words */
189291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	/* r4 holds guest_state */
190291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* r5 holds host_addr */
1912c48c7b0a453d32375a4df17e153011b797ef28csewardj
1922c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* 96(sp) used later to check FPSCR[RM] */
1931ade697d13061d1abf5d74dd243e478aedabcaa6cerion        /* 88(sp) used later to load fpscr with zero */
1941ade697d13061d1abf5d74dd243e478aedabcaa6cerion	/* 48:87(sp) free */
1952c48c7b0a453d32375a4df17e153011b797ef28csewardj
196cae0cc22b83ffb260ee8379e92099c5a701944cbcarll        /* Linkage Area (reserved)  BE ABI
1972c48c7b0a453d32375a4df17e153011b797ef28csewardj           40(sp) : TOC
1982c48c7b0a453d32375a4df17e153011b797ef28csewardj           32(sp) : link editor doubleword
1992c48c7b0a453d32375a4df17e153011b797ef28csewardj           24(sp) : compiler doubleword
2002c48c7b0a453d32375a4df17e153011b797ef28csewardj           16(sp) : LR
2012c48c7b0a453d32375a4df17e153011b797ef28csewardj           8(sp)  : CR
2022c48c7b0a453d32375a4df17e153011b797ef28csewardj           0(sp)  : back-chain
2032c48c7b0a453d32375a4df17e153011b797ef28csewardj        */
2042c48c7b0a453d32375a4df17e153011b797ef28csewardj
2052c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* set host FPU control word to the default mode expected
2062c48c7b0a453d32375a4df17e153011b797ef28csewardj           by VEX-generated code.  See comments in libvex.h for
2072c48c7b0a453d32375a4df17e153011b797ef28csewardj           more info. */
2082108204443f84bfa733397be519bdcf6810c5127cerion        /* => get zero into f3 (tedious)
2092108204443f84bfa733397be519bdcf6810c5127cerion           fsub 3,3,3 is not a reliable way to do this, since if
2102108204443f84bfa733397be519bdcf6810c5127cerion           f3 holds a NaN or similar then we don't necessarily
2112108204443f84bfa733397be519bdcf6810c5127cerion           wind up with zero. */
212291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,0
213291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stw     6,88(1)
2141ade697d13061d1abf5d74dd243e478aedabcaa6cerion        lfs     3,88(1)
2152108204443f84bfa733397be519bdcf6810c5127cerion        mtfsf   0xFF,3   /* fpscr = lo32 of f3 */
2162c48c7b0a453d32375a4df17e153011b797ef28csewardj
2172c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* set host AltiVec control word to the default mode expected
2182c48c7b0a453d32375a4df17e153011b797ef28csewardj           by VEX-generated code. */
219291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	ld	6,.tocent__vgPlain_machine_ppc64_has_VMX@toc(2)
220291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	ld	6,0(6)
221291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        cmpldi  6,0
2222108204443f84bfa733397be519bdcf6810c5127cerion        beq     .LafterVMX2
2232c48c7b0a453d32375a4df17e153011b797ef28csewardj
2242c48c7b0a453d32375a4df17e153011b797ef28csewardj        vspltisw 3,0x0  /* generate zero */
2252c48c7b0a453d32375a4df17e153011b797ef28csewardj        mtvscr  3
2262108204443f84bfa733397be519bdcf6810c5127cerion.LafterVMX2:
2272c48c7b0a453d32375a4df17e153011b797ef28csewardj
2282c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* make a stack frame for the code we are calling */
2292108204443f84bfa733397be519bdcf6810c5127cerion        stdu    1,-48(1)
2302c48c7b0a453d32375a4df17e153011b797ef28csewardj
231291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Set up the guest state ptr */
232291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mr      31,4      /* r31 (generated code gsp) = r4 */
2332c48c7b0a453d32375a4df17e153011b797ef28csewardj
234291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* and jump into the code cache.  Chained translations in
235291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           the code cache run, until for whatever reason, they can't
236291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           continue.  When that happens, the translation in question
237291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           will jump (or call) to one of the continuation points
238291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           VG_(cp_...) below. */
239291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mtctr   5
240291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        bctr
2411ade697d13061d1abf5d74dd243e478aedabcaa6cerion	/*NOTREACHED*/
2421ade697d13061d1abf5d74dd243e478aedabcaa6cerion
2431ade697d13061d1abf5d74dd243e478aedabcaa6cerion/*----------------------------------------------------*/
244291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*--- Postamble and exit.                          ---*/
2451ade697d13061d1abf5d74dd243e478aedabcaa6cerion/*----------------------------------------------------*/
2461ade697d13061d1abf5d74dd243e478aedabcaa6cerion
247291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.postamble:
248291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* At this point, r6 and r7 contain two
249291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           words to be returned to the caller.  r6
250291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           holds a TRC value, and r7 optionally may
251291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           hold another word (for CHAIN_ME exits, the
252291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           address of the place to patch.) */
2532c48c7b0a453d32375a4df17e153011b797ef28csewardj
254291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* undo the "make a stack frame for the code we are calling" */
255291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        addi    1,1,48
2562c48c7b0a453d32375a4df17e153011b797ef28csewardj
2572c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* We're leaving.  Check that nobody messed with
258291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           VSCR or FPSCR in ways we don't expect. */
259291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	/* Using r11 - value used again further on, so don't trash! */
260291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	ld	11,.tocent__vgPlain_machine_ppc64_has_VMX@toc(2)
261291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	ld	11,0(11)
2622c48c7b0a453d32375a4df17e153011b797ef28csewardj
263fdac02c3ff8f4398295ed7b966c85fec5a11e4b0sewardj	/* Set fpscr back to a known state, since vex-generated code
264fdac02c3ff8f4398295ed7b966c85fec5a11e4b0sewardj	   may have messed with fpscr[rm]. */
265fdac02c3ff8f4398295ed7b966c85fec5a11e4b0sewardj        li      5,0
266fdac02c3ff8f4398295ed7b966c85fec5a11e4b0sewardj        addi    1,1,-16
267fdac02c3ff8f4398295ed7b966c85fec5a11e4b0sewardj        stw     5,0(1)
268fdac02c3ff8f4398295ed7b966c85fec5a11e4b0sewardj        lfs     3,0(1)
269fdac02c3ff8f4398295ed7b966c85fec5a11e4b0sewardj        addi    1,1,16
270fdac02c3ff8f4398295ed7b966c85fec5a11e4b0sewardj        mtfsf   0xFF,3   /* fpscr = f3 */
271fdac02c3ff8f4398295ed7b966c85fec5a11e4b0sewardj
272291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        cmpldi  11,0    /* Do we have altivec? */
2732108204443f84bfa733397be519bdcf6810c5127cerion        beq     .LafterVMX8
2742c48c7b0a453d32375a4df17e153011b797ef28csewardj
2752c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* Check VSCR[NJ] == 1 */
2762c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* first generate 4x 0x00010000 */
2772c48c7b0a453d32375a4df17e153011b797ef28csewardj        vspltisw  4,0x1                   /* 4x 0x00000001 */
2782c48c7b0a453d32375a4df17e153011b797ef28csewardj        vspltisw  5,0x0                   /* zero */
2792c48c7b0a453d32375a4df17e153011b797ef28csewardj        vsldoi    6,4,5,0x2               /* <<2*8 => 4x 0x00010000 */
2802c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* retrieve VSCR and mask wanted bits */
2812c48c7b0a453d32375a4df17e153011b797ef28csewardj        mfvscr    7
2822c48c7b0a453d32375a4df17e153011b797ef28csewardj        vand      7,7,6                   /* gives NJ flag */
2832c48c7b0a453d32375a4df17e153011b797ef28csewardj        vspltw    7,7,0x3                 /* flags-word to all lanes */
2842c48c7b0a453d32375a4df17e153011b797ef28csewardj        vcmpequw. 8,6,7                   /* CR[24] = 1 if v6 == v7 */
2852108204443f84bfa733397be519bdcf6810c5127cerion        bt        24,.invariant_violation /* branch if all_equal */
2862c48c7b0a453d32375a4df17e153011b797ef28csewardj
287291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.LafterVMX8:
2882c48c7b0a453d32375a4df17e153011b797ef28csewardj	/* otherwise we're OK */
289291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        b       .remove_frame
2902c48c7b0a453d32375a4df17e153011b797ef28csewardj
2912108204443f84bfa733397be519bdcf6810c5127cerion.invariant_violation:
292291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,VG_TRC_INVARIANT_FAILED
293291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      7,0
294291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* fall through */
2952c48c7b0a453d32375a4df17e153011b797ef28csewardj
296291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.remove_frame:
297291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* r11 already holds VG_(machine_ppc32_has_VMX) value */
298291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        cmplwi  11,0
299291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        beq     .LafterVMX9
3001ade697d13061d1abf5d74dd243e478aedabcaa6cerion
301291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Restore Altivec regs.
302291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           Use r5 as scratch since r6/r7 are live. */
303291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* VRSAVE */
304291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lwz     5,324(1)
305291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mfspr   5,256         /* VRSAVE reg is spr number 256 */
3062c48c7b0a453d32375a4df17e153011b797ef28csewardj
307291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Vector regs */
308291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,304
309291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     31,5,1
310291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,288
311291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     30,5,1
312291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,272
313291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     29,5,1
314291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,256
315291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     28,5,1
316291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,240
317291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     27,5,1
318291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,224
319291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     26,5,1
320291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,208
321291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     25,5,1
322291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,192
323291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     24,5,1
324291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,176
325291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     23,5,1
326291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,160
327291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     22,5,1
328291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,144
329291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     21,5,1
330291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,128
331291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     20,5,1
332291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.LafterVMX9:
3332c48c7b0a453d32375a4df17e153011b797ef28csewardj
334291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Restore FP regs */
3352c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* Floating-point regs */
3362108204443f84bfa733397be519bdcf6810c5127cerion        lfd     31,616(1)
3372108204443f84bfa733397be519bdcf6810c5127cerion        lfd     30,608(1)
3382108204443f84bfa733397be519bdcf6810c5127cerion        lfd     29,600(1)
3392108204443f84bfa733397be519bdcf6810c5127cerion        lfd     28,592(1)
3402108204443f84bfa733397be519bdcf6810c5127cerion        lfd     27,584(1)
3412108204443f84bfa733397be519bdcf6810c5127cerion        lfd     26,576(1)
3422108204443f84bfa733397be519bdcf6810c5127cerion        lfd     25,568(1)
3432108204443f84bfa733397be519bdcf6810c5127cerion        lfd     24,560(1)
3442108204443f84bfa733397be519bdcf6810c5127cerion        lfd     23,552(1)
3452108204443f84bfa733397be519bdcf6810c5127cerion        lfd     22,544(1)
3462108204443f84bfa733397be519bdcf6810c5127cerion        lfd     21,536(1)
3472108204443f84bfa733397be519bdcf6810c5127cerion        lfd     20,528(1)
3482108204443f84bfa733397be519bdcf6810c5127cerion        lfd     19,520(1)
3492108204443f84bfa733397be519bdcf6810c5127cerion        lfd     18,512(1)
3502108204443f84bfa733397be519bdcf6810c5127cerion        lfd     17,504(1)
3512108204443f84bfa733397be519bdcf6810c5127cerion        lfd     16,496(1)
3522108204443f84bfa733397be519bdcf6810c5127cerion        lfd     15,488(1)
3532108204443f84bfa733397be519bdcf6810c5127cerion        lfd     14,480(1)
3542c48c7b0a453d32375a4df17e153011b797ef28csewardj
355291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* restore int regs, including importantly r3 (two_words) */
3562108204443f84bfa733397be519bdcf6810c5127cerion        ld      31,472(1)
3572108204443f84bfa733397be519bdcf6810c5127cerion        ld      30,464(1)
3582108204443f84bfa733397be519bdcf6810c5127cerion        ld      29,456(1)
3592108204443f84bfa733397be519bdcf6810c5127cerion        ld      28,448(1)
3602108204443f84bfa733397be519bdcf6810c5127cerion        ld      27,440(1)
3612108204443f84bfa733397be519bdcf6810c5127cerion        ld      26,432(1)
3622108204443f84bfa733397be519bdcf6810c5127cerion        ld      25,424(1)
3632108204443f84bfa733397be519bdcf6810c5127cerion        ld      24,416(1)
3642108204443f84bfa733397be519bdcf6810c5127cerion        ld      23,408(1)
3652108204443f84bfa733397be519bdcf6810c5127cerion        ld      22,400(1)
3662108204443f84bfa733397be519bdcf6810c5127cerion        ld      21,392(1)
3672108204443f84bfa733397be519bdcf6810c5127cerion        ld      20,384(1)
3682108204443f84bfa733397be519bdcf6810c5127cerion        ld      19,376(1)
3692108204443f84bfa733397be519bdcf6810c5127cerion        ld      18,368(1)
3702108204443f84bfa733397be519bdcf6810c5127cerion        ld      17,360(1)
3712108204443f84bfa733397be519bdcf6810c5127cerion        ld      16,352(1)
3722108204443f84bfa733397be519bdcf6810c5127cerion        ld      15,344(1)
3732108204443f84bfa733397be519bdcf6810c5127cerion        ld      14,336(1)
3742108204443f84bfa733397be519bdcf6810c5127cerion        ld      13,328(1)
375291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        ld      3,104(1)
376291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Stash return values */
377291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     6,0(3)
378291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     7,8(3)
3792c48c7b0a453d32375a4df17e153011b797ef28csewardj
380291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* restore lr & sp, and leave */
3812108204443f84bfa733397be519bdcf6810c5127cerion        ld      0,632(1)  /* stack_size + 8 */
3822108204443f84bfa733397be519bdcf6810c5127cerion        mtcr    0
3832108204443f84bfa733397be519bdcf6810c5127cerion        ld      0,640(1)  /* stack_size + 16 */
3842c48c7b0a453d32375a4df17e153011b797ef28csewardj        mtlr    0
3852c48c7b0a453d32375a4df17e153011b797ef28csewardj        addi    1,1,624   /* stack_size */
3862c48c7b0a453d32375a4df17e153011b797ef28csewardj        blr
3872c48c7b0a453d32375a4df17e153011b797ef28csewardj
3882c48c7b0a453d32375a4df17e153011b797ef28csewardj
389291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*----------------------------------------------------*/
390291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*--- Continuation points                          ---*/
391291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*----------------------------------------------------*/
3921a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj
393291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/* ------ Chain me to slow entry point ------ */
394291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section ".text"
395291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   2
396291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   VG_(disp_cp_chain_me_to_slowEP)
397291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section ".opd","aw"
398291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   3
399291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjVG_(disp_cp_chain_me_to_slowEP):
400291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .quad    .VG_(disp_cp_chain_me_to_slowEP),.TOC.@tocbase,0
401291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .previous
402291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .type    .VG_(disp_cp_chain_me_to_slowEP),@function
403291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   .VG_(disp_cp_chain_me_to_slowEP)
404291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.VG_(disp_cp_chain_me_to_slowEP):
405291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* We got called.  The return address indicates
406291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           where the patching needs to happen.  Collect
407291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           the return address and, exit back to C land,
408291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           handing the caller the pair (Chain_me_S, RA) */
409291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li   6, VG_TRC_CHAIN_ME_TO_SLOW_EP
410291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mflr 7
411291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* 20 = imm64-fixed5 r30, disp_cp_chain_me_to_slowEP
412291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           4  = mtctr r30
413291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           4  = btctr
414291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        */
415291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        subi 7,7,20+4+4
416291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        b    .postamble
417291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
418291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/* ------ Chain me to fast entry point ------ */
419291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section ".text"
420291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   2
421291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   VG_(disp_cp_chain_me_to_fastEP)
422291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section ".opd","aw"
423291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   3
424291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjVG_(disp_cp_chain_me_to_fastEP):
425291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .quad    .VG_(disp_cp_chain_me_to_fastEP),.TOC.@tocbase,0
426291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .previous
427291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .type    .VG_(disp_cp_chain_me_to_fastEP),@function
428291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   .VG_(disp_cp_chain_me_to_fastEP)
429291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.VG_(disp_cp_chain_me_to_fastEP):
430291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* We got called.  The return address indicates
431291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           where the patching needs to happen.  Collect
432291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           the return address and, exit back to C land,
433291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           handing the caller the pair (Chain_me_S, RA) */
434291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li   6, VG_TRC_CHAIN_ME_TO_FAST_EP
435291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mflr 7
436291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* 20 = imm64-fixed5 r30, disp_cp_chain_me_to_fastEP
437291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           4  = mtctr r30
438291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           4  = btctr
439291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        */
440291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        subi 7,7,20+4+4
441291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        b    .postamble
442291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
443291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/* ------ Indirect but boring jump ------ */
444291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section ".text"
445291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   2
446291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   VG_(disp_cp_xindir)
447291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section ".opd","aw"
448291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   3
449291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjVG_(disp_cp_xindir):
450291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .quad    .VG_(disp_cp_xindir),.TOC.@tocbase,0
451291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .previous
452291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .type    .VG_(disp_cp_xindir),@function
453291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   .VG_(disp_cp_xindir)
454291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.VG_(disp_cp_xindir):
455291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Where are we going? */
456291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        ld      3,OFFSET_ppc64_CIA(31)
4571a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj
458291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* stats only */
45996b3c209fdcededc7aece86a23c7d9af78a036e0sewardj	ld	5, .tocent__vgPlain_stats__n_xindirs_32@toc(2)
46096b3c209fdcededc7aece86a23c7d9af78a036e0sewardj        lwz     6,0(5)
461291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        addi    6,6,1
46296b3c209fdcededc7aece86a23c7d9af78a036e0sewardj        stw     6,0(5)
463291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
464291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	/* r5 = &VG_(tt_fast) */
465291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	ld	5, .tocent__vgPlain_tt_fast@toc(2) /* &VG_(tt_fast) */
466291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
467291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* try a fast lookup in the translation cache */
468291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* r4 = VG_TT_FAST_HASH(addr)           * sizeof(FastCacheEntry)
469291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              = ((r3 >>u 2) & VG_TT_FAST_MASK)  << 4 */
470291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	rldicl	4,3, 62, 64-VG_TT_FAST_BITS   /* entry# */
471291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	sldi	4,4,4      /* entry# * sizeof(FastCacheEntry) */
472291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	add	5,5,4      /* & VG_(tt_fast)[entry#] */
473291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	ld	6,0(5)     /* .guest */
474291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	ld	7,8(5)     /* .host */
475291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        cmpd    3,6
476291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        bne     .fast_lookup_failed
477291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
478291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Found a match.  Jump to .host. */
479291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mtctr   7
480291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        bctr
4811a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj
482291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.fast_lookup_failed:
483291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* stats only */
48496b3c209fdcededc7aece86a23c7d9af78a036e0sewardj	ld	5, .tocent__vgPlain_stats__n_xindir_misses_32@toc(2)
48596b3c209fdcededc7aece86a23c7d9af78a036e0sewardj        lwz     6,0(5)
486291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        addi    6,6,1
48796b3c209fdcededc7aece86a23c7d9af78a036e0sewardj        stw     6,0(5)
488291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
489291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,VG_TRC_INNER_FASTMISS
490291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      7,0
491291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        b       .postamble
492291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	/*NOTREACHED*/
493291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
494291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/* ------ Assisted jump ------ */
495291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.section ".text"
496291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   2
497291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   VG_(disp_cp_xassisted)
498291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section ".opd","aw"
499291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   3
500291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjVG_(disp_cp_xassisted):
501291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .quad    .VG_(disp_cp_xassisted),.TOC.@tocbase,0
502291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .previous
503291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .type    .VG_(disp_cp_xassisted),@function
504291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   .VG_(disp_cp_xassisted)
505291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.VG_(disp_cp_xassisted):
506291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* r31 contains the TRC */
507291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mr      6,31
508291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      7,0
509291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        b       .postamble
510291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
511291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/* ------ Event check failed ------ */
512291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section ".text"
513291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   2
514291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   VG_(disp_cp_evcheck_fail)
515291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section ".opd","aw"
516291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   3
517291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjVG_(disp_cp_evcheck_fail):
518291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .quad    .VG_(disp_cp_evcheck_fail),.TOC.@tocbase,0
519291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .previous
520291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .type    .VG_(disp_cp_evcheck_fail),@function
521291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   .VG_(disp_cp_evcheck_fail)
522291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.VG_(disp_cp_evcheck_fail):
523291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,VG_TRC_INNER_COUNTERZERO
524291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      7,0
525291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        b       .postamble
526291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
527291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
528291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.size .VG_(disp_run_translations), .-.VG_(disp_run_translations)
5291a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj
5302c48c7b0a453d32375a4df17e153011b797ef28csewardj/* Let the linker know we don't need an executable stack */
5312c48c7b0a453d32375a4df17e153011b797ef28csewardj.section .note.GNU-stack,"",@progbits
5322c48c7b0a453d32375a4df17e153011b797ef28csewardj
533582d58245637ab05272d89fb94b12fd0f18fa0f8carll#endif // defined(VGP_ppc64be_linux)
5348b68b64759254d514d98328c496cbd88cde4c9a5njn
5351ade697d13061d1abf5d74dd243e478aedabcaa6cerion/*--------------------------------------------------------------------*/
5361ade697d13061d1abf5d74dd243e478aedabcaa6cerion/*--- end                                                          ---*/
5371ade697d13061d1abf5d74dd243e478aedabcaa6cerion/*--------------------------------------------------------------------*/
538