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
11b3a1e4bffbdbbf38304f216af405009868f43628sewardj  Copyright (C) 2005-2015 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
313f1d6138db68f2aa74c5d005c3333cbe94788c7bflorian#include "pub_core_basics_asm.h"
323f1d6138db68f2aa74c5d005c3333cbe94788c7bflorian
33582d58245637ab05272d89fb94b12fd0f18fa0f8carll#if defined(VGP_ppc64be_linux)
348b68b64759254d514d98328c496cbd88cde4c9a5njn
352c48c7b0a453d32375a4df17e153011b797ef28csewardj#include "pub_core_dispatch_asm.h"
362c48c7b0a453d32375a4df17e153011b797ef28csewardj#include "pub_core_transtab_asm.h"
372c48c7b0a453d32375a4df17e153011b797ef28csewardj#include "libvex_guest_offsets.h"	/* for OFFSET_ppc64_CIA */
382c48c7b0a453d32375a4df17e153011b797ef28csewardj
392c48c7b0a453d32375a4df17e153011b797ef28csewardj
402c48c7b0a453d32375a4df17e153011b797ef28csewardj/* References to globals via the TOC */
412c48c7b0a453d32375a4df17e153011b797ef28csewardj
422108204443f84bfa733397be519bdcf6810c5127cerion/*
43291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl  vgPlain_tt_fast
442108204443f84bfa733397be519bdcf6810c5127cerion        .lcomm  vgPlain_tt_fast,4,4
452108204443f84bfa733397be519bdcf6810c5127cerion        .type   vgPlain_tt_fast, @object
462108204443f84bfa733397be519bdcf6810c5127cerion*/
47291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.section ".toc","aw"
482108204443f84bfa733397be519bdcf6810c5127cerion.tocent__vgPlain_tt_fast:
492108204443f84bfa733397be519bdcf6810c5127cerion        .tc vgPlain_tt_fast[TC],vgPlain_tt_fast
5096b3c209fdcededc7aece86a23c7d9af78a036e0sewardj.tocent__vgPlain_stats__n_xindirs_32:
5196b3c209fdcededc7aece86a23c7d9af78a036e0sewardj        .tc vgPlain_stats__n_xindirs_32[TC],vgPlain_stats__n_xindirs_32
5296b3c209fdcededc7aece86a23c7d9af78a036e0sewardj.tocent__vgPlain_stats__n_xindir_misses_32:
5396b3c209fdcededc7aece86a23c7d9af78a036e0sewardj        .tc vgPlain_stats__n_xindir_misses_32[TC],vgPlain_stats__n_xindir_misses_32
542108204443f84bfa733397be519bdcf6810c5127cerion.tocent__vgPlain_machine_ppc64_has_VMX:
552108204443f84bfa733397be519bdcf6810c5127cerion        .tc vgPlain_machine_ppc64_has_VMX[TC],vgPlain_machine_ppc64_has_VMX
562c48c7b0a453d32375a4df17e153011b797ef28csewardj
572c48c7b0a453d32375a4df17e153011b797ef28csewardj/*------------------------------------------------------------*/
581a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj/*---                                                      ---*/
59291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*--- The dispatch loop.  VG_(disp_run_translations) is    ---*/
60291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*--- used to run all translations,                        ---*/
61291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*--- including no-redir ones.                             ---*/
621a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj/*---                                                      ---*/
632c48c7b0a453d32375a4df17e153011b797ef28csewardj/*------------------------------------------------------------*/
642c48c7b0a453d32375a4df17e153011b797ef28csewardj
651ade697d13061d1abf5d74dd243e478aedabcaa6cerion/*----------------------------------------------------*/
66291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*--- Entry and preamble (set everything up)       ---*/
671ade697d13061d1abf5d74dd243e478aedabcaa6cerion/*----------------------------------------------------*/
682c48c7b0a453d32375a4df17e153011b797ef28csewardj
691ade697d13061d1abf5d74dd243e478aedabcaa6cerion/* signature:
70291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjvoid VG_(disp_run_translations)( UWord* two_words,
71291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                                 void*  guest_state,
72291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                                 Addr   host_addr );
731ade697d13061d1abf5d74dd243e478aedabcaa6cerion*/
742108204443f84bfa733397be519bdcf6810c5127cerion
751ade697d13061d1abf5d74dd243e478aedabcaa6cerion.section ".text"
761ade697d13061d1abf5d74dd243e478aedabcaa6cerion.align   2
77291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.globl   VG_(disp_run_translations)
781ade697d13061d1abf5d74dd243e478aedabcaa6cerion.section ".opd","aw"
791ade697d13061d1abf5d74dd243e478aedabcaa6cerion.align   3
80291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjVG_(disp_run_translations):
81291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.quad    .VG_(disp_run_translations),.TOC.@tocbase,0
821ade697d13061d1abf5d74dd243e478aedabcaa6cerion.previous
83291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.type    .VG_(disp_run_translations),@function
84291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.globl   .VG_(disp_run_translations)
85291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.VG_(disp_run_translations):
86291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	/* r3 holds two_words */
87291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	/* r4 holds guest_state */
88291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* r5 holds host_addr */
89291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
90291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* ----- entry point to VG_(disp_run_translations) ----- */
912108204443f84bfa733397be519bdcf6810c5127cerion        /* PPC64 ABI saves LR->16(prt_sp), CR->8(prt_sp)) */
921ade697d13061d1abf5d74dd243e478aedabcaa6cerion
932108204443f84bfa733397be519bdcf6810c5127cerion        /* Save lr, cr */
94291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mflr    6
95291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     6,16(1)
96291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mfcr    6
97291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     6,8(1)
982c48c7b0a453d32375a4df17e153011b797ef28csewardj
992c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* New stack frame */
1002108204443f84bfa733397be519bdcf6810c5127cerion        stdu    1,-624(1)  /* sp should maintain 16-byte alignment */
1012c48c7b0a453d32375a4df17e153011b797ef28csewardj
102291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* General reg save area : 152 bytes */
103291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     31,472(1)
104291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     30,464(1)
105291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     29,456(1)
106291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     28,448(1)
107291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     27,440(1)
108291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     26,432(1)
109291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     25,424(1)
110291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     24,416(1)
111291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     23,408(1)
112291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     22,400(1)
113291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     21,392(1)
114291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     20,384(1)
115291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     19,376(1)
116291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     18,368(1)
117291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     17,360(1)
118291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     16,352(1)
119291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     15,344(1)
120291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     14,336(1)
121291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     13,328(1)
122291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     3,104(1)  /* save two_words for later */
1232c48c7b0a453d32375a4df17e153011b797ef28csewardj
124291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Save callee-saved registers... */
1252c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* Floating-point reg save area : 144 bytes */
1262c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    31,616(1)
1272c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    30,608(1)
1282c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    29,600(1)
1292c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    28,592(1)
1302c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    27,584(1)
1312c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    26,576(1)
1322c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    25,568(1)
1332c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    24,560(1)
1342c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    23,552(1)
1352c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    22,544(1)
1362c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    21,536(1)
1372c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    20,528(1)
1382c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    19,520(1)
1392c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    18,512(1)
1402c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    17,504(1)
1412c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    16,496(1)
1422c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    15,488(1)
1432c48c7b0a453d32375a4df17e153011b797ef28csewardj        stfd    14,480(1)
1442c48c7b0a453d32375a4df17e153011b797ef28csewardj
1452c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* It's necessary to save/restore VRSAVE in the AIX / Darwin ABI.
1462c48c7b0a453d32375a4df17e153011b797ef28csewardj           The Linux kernel might not actually use VRSAVE for its intended
1472c48c7b0a453d32375a4df17e153011b797ef28csewardj           purpose, but it should be harmless to preserve anyway. */
148291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	/* r3, r4, r5 are live here, so use r6 */
149291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	ld	6,.tocent__vgPlain_machine_ppc64_has_VMX@toc(2)
150291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	ld	6,0(6)
151291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        cmpldi  6,0
1522108204443f84bfa733397be519bdcf6810c5127cerion        beq     .LafterVMX1
1532c48c7b0a453d32375a4df17e153011b797ef28csewardj
1542c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* VRSAVE save word : 32 bytes */
155291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mfspr   6,256         /* vrsave reg is spr number 256 */
156291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stw     6,324(1)
1572c48c7b0a453d32375a4df17e153011b797ef28csewardj
1582c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* Alignment padding : 4 bytes */
1592c48c7b0a453d32375a4df17e153011b797ef28csewardj
1602c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* Vector reg save area (quadword aligned) : 192 bytes */
161291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,304
162291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    31,6,1
163291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,288
164291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    30,6,1
165291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,272
166291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    29,6,1
167291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,256
168291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    28,6,1
169291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,240
170291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    27,6,1
171291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,224
172291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    26,6,1
173291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,208
174291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    25,6,1
175291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,192
176291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    24,6,1
177291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,176
178291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    23,6,1
179291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,160
180291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    22,6,1
181291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,144
182291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    21,6,1
183291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,128
184291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stvx    20,6,1
1852108204443f84bfa733397be519bdcf6810c5127cerion.LafterVMX1:
1862c48c7b0a453d32375a4df17e153011b797ef28csewardj
1872c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* Local variable space... */
1882c48c7b0a453d32375a4df17e153011b797ef28csewardj
189291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	/* r3 holds two_words */
190291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	/* r4 holds guest_state */
191291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* r5 holds host_addr */
1922c48c7b0a453d32375a4df17e153011b797ef28csewardj
1932c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* 96(sp) used later to check FPSCR[RM] */
1941ade697d13061d1abf5d74dd243e478aedabcaa6cerion        /* 88(sp) used later to load fpscr with zero */
1951ade697d13061d1abf5d74dd243e478aedabcaa6cerion	/* 48:87(sp) free */
1962c48c7b0a453d32375a4df17e153011b797ef28csewardj
197cae0cc22b83ffb260ee8379e92099c5a701944cbcarll        /* Linkage Area (reserved)  BE ABI
1982c48c7b0a453d32375a4df17e153011b797ef28csewardj           40(sp) : TOC
1992c48c7b0a453d32375a4df17e153011b797ef28csewardj           32(sp) : link editor doubleword
2002c48c7b0a453d32375a4df17e153011b797ef28csewardj           24(sp) : compiler doubleword
2012c48c7b0a453d32375a4df17e153011b797ef28csewardj           16(sp) : LR
2022c48c7b0a453d32375a4df17e153011b797ef28csewardj           8(sp)  : CR
2032c48c7b0a453d32375a4df17e153011b797ef28csewardj           0(sp)  : back-chain
2042c48c7b0a453d32375a4df17e153011b797ef28csewardj        */
2052c48c7b0a453d32375a4df17e153011b797ef28csewardj
2062c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* set host FPU control word to the default mode expected
2072c48c7b0a453d32375a4df17e153011b797ef28csewardj           by VEX-generated code.  See comments in libvex.h for
2082c48c7b0a453d32375a4df17e153011b797ef28csewardj           more info. */
2092108204443f84bfa733397be519bdcf6810c5127cerion        /* => get zero into f3 (tedious)
2102108204443f84bfa733397be519bdcf6810c5127cerion           fsub 3,3,3 is not a reliable way to do this, since if
2112108204443f84bfa733397be519bdcf6810c5127cerion           f3 holds a NaN or similar then we don't necessarily
2122108204443f84bfa733397be519bdcf6810c5127cerion           wind up with zero. */
213291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,0
214291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stw     6,88(1)
2151ade697d13061d1abf5d74dd243e478aedabcaa6cerion        lfs     3,88(1)
2162108204443f84bfa733397be519bdcf6810c5127cerion        mtfsf   0xFF,3   /* fpscr = lo32 of f3 */
2172c48c7b0a453d32375a4df17e153011b797ef28csewardj
2182c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* set host AltiVec control word to the default mode expected
2192c48c7b0a453d32375a4df17e153011b797ef28csewardj           by VEX-generated code. */
220291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	ld	6,.tocent__vgPlain_machine_ppc64_has_VMX@toc(2)
221291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	ld	6,0(6)
222291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        cmpldi  6,0
2232108204443f84bfa733397be519bdcf6810c5127cerion        beq     .LafterVMX2
2242c48c7b0a453d32375a4df17e153011b797ef28csewardj
2252c48c7b0a453d32375a4df17e153011b797ef28csewardj        vspltisw 3,0x0  /* generate zero */
2262c48c7b0a453d32375a4df17e153011b797ef28csewardj        mtvscr  3
2272108204443f84bfa733397be519bdcf6810c5127cerion.LafterVMX2:
2282c48c7b0a453d32375a4df17e153011b797ef28csewardj
2292c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* make a stack frame for the code we are calling */
2302108204443f84bfa733397be519bdcf6810c5127cerion        stdu    1,-48(1)
2312c48c7b0a453d32375a4df17e153011b797ef28csewardj
232291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Set up the guest state ptr */
233291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mr      31,4      /* r31 (generated code gsp) = r4 */
2342c48c7b0a453d32375a4df17e153011b797ef28csewardj
235291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* and jump into the code cache.  Chained translations in
236291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           the code cache run, until for whatever reason, they can't
237291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           continue.  When that happens, the translation in question
238291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           will jump (or call) to one of the continuation points
239291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           VG_(cp_...) below. */
240291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mtctr   5
241291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        bctr
2421ade697d13061d1abf5d74dd243e478aedabcaa6cerion	/*NOTREACHED*/
2431ade697d13061d1abf5d74dd243e478aedabcaa6cerion
2441ade697d13061d1abf5d74dd243e478aedabcaa6cerion/*----------------------------------------------------*/
245291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*--- Postamble and exit.                          ---*/
2461ade697d13061d1abf5d74dd243e478aedabcaa6cerion/*----------------------------------------------------*/
2471ade697d13061d1abf5d74dd243e478aedabcaa6cerion
248291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.postamble:
249291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* At this point, r6 and r7 contain two
250291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           words to be returned to the caller.  r6
251291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           holds a TRC value, and r7 optionally may
252291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           hold another word (for CHAIN_ME exits, the
253291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           address of the place to patch.) */
2542c48c7b0a453d32375a4df17e153011b797ef28csewardj
255291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* undo the "make a stack frame for the code we are calling" */
256291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        addi    1,1,48
2572c48c7b0a453d32375a4df17e153011b797ef28csewardj
2582c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* We're leaving.  Check that nobody messed with
259291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           VSCR or FPSCR in ways we don't expect. */
260291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	/* Using r11 - value used again further on, so don't trash! */
261291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	ld	11,.tocent__vgPlain_machine_ppc64_has_VMX@toc(2)
262291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	ld	11,0(11)
2632c48c7b0a453d32375a4df17e153011b797ef28csewardj
264fdac02c3ff8f4398295ed7b966c85fec5a11e4b0sewardj	/* Set fpscr back to a known state, since vex-generated code
265fdac02c3ff8f4398295ed7b966c85fec5a11e4b0sewardj	   may have messed with fpscr[rm]. */
266fdac02c3ff8f4398295ed7b966c85fec5a11e4b0sewardj        li      5,0
267fdac02c3ff8f4398295ed7b966c85fec5a11e4b0sewardj        addi    1,1,-16
268fdac02c3ff8f4398295ed7b966c85fec5a11e4b0sewardj        stw     5,0(1)
269fdac02c3ff8f4398295ed7b966c85fec5a11e4b0sewardj        lfs     3,0(1)
270fdac02c3ff8f4398295ed7b966c85fec5a11e4b0sewardj        addi    1,1,16
271fdac02c3ff8f4398295ed7b966c85fec5a11e4b0sewardj        mtfsf   0xFF,3   /* fpscr = f3 */
272fdac02c3ff8f4398295ed7b966c85fec5a11e4b0sewardj
273291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        cmpldi  11,0    /* Do we have altivec? */
2742108204443f84bfa733397be519bdcf6810c5127cerion        beq     .LafterVMX8
2752c48c7b0a453d32375a4df17e153011b797ef28csewardj
2762c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* Check VSCR[NJ] == 1 */
2772c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* first generate 4x 0x00010000 */
2782c48c7b0a453d32375a4df17e153011b797ef28csewardj        vspltisw  4,0x1                   /* 4x 0x00000001 */
2792c48c7b0a453d32375a4df17e153011b797ef28csewardj        vspltisw  5,0x0                   /* zero */
2802c48c7b0a453d32375a4df17e153011b797ef28csewardj        vsldoi    6,4,5,0x2               /* <<2*8 => 4x 0x00010000 */
2812c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* retrieve VSCR and mask wanted bits */
2822c48c7b0a453d32375a4df17e153011b797ef28csewardj        mfvscr    7
2832c48c7b0a453d32375a4df17e153011b797ef28csewardj        vand      7,7,6                   /* gives NJ flag */
2842c48c7b0a453d32375a4df17e153011b797ef28csewardj        vspltw    7,7,0x3                 /* flags-word to all lanes */
2852c48c7b0a453d32375a4df17e153011b797ef28csewardj        vcmpequw. 8,6,7                   /* CR[24] = 1 if v6 == v7 */
2862108204443f84bfa733397be519bdcf6810c5127cerion        bt        24,.invariant_violation /* branch if all_equal */
2872c48c7b0a453d32375a4df17e153011b797ef28csewardj
288291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.LafterVMX8:
2892c48c7b0a453d32375a4df17e153011b797ef28csewardj	/* otherwise we're OK */
290291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        b       .remove_frame
2912c48c7b0a453d32375a4df17e153011b797ef28csewardj
2922108204443f84bfa733397be519bdcf6810c5127cerion.invariant_violation:
293291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,VG_TRC_INVARIANT_FAILED
294291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      7,0
295291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* fall through */
2962c48c7b0a453d32375a4df17e153011b797ef28csewardj
297291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.remove_frame:
298291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* r11 already holds VG_(machine_ppc32_has_VMX) value */
299291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        cmplwi  11,0
300291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        beq     .LafterVMX9
3011ade697d13061d1abf5d74dd243e478aedabcaa6cerion
302291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Restore Altivec regs.
303291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           Use r5 as scratch since r6/r7 are live. */
304291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* VRSAVE */
305291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lwz     5,324(1)
306291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mfspr   5,256         /* VRSAVE reg is spr number 256 */
3072c48c7b0a453d32375a4df17e153011b797ef28csewardj
308291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Vector regs */
309291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,304
310291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     31,5,1
311291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,288
312291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     30,5,1
313291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,272
314291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     29,5,1
315291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,256
316291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     28,5,1
317291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,240
318291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     27,5,1
319291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,224
320291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     26,5,1
321291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,208
322291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     25,5,1
323291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,192
324291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     24,5,1
325291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,176
326291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     23,5,1
327291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,160
328291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     22,5,1
329291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,144
330291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     21,5,1
331291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      5,128
332291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lvx     20,5,1
333291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.LafterVMX9:
3342c48c7b0a453d32375a4df17e153011b797ef28csewardj
335291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Restore FP regs */
3362c48c7b0a453d32375a4df17e153011b797ef28csewardj        /* Floating-point regs */
3372108204443f84bfa733397be519bdcf6810c5127cerion        lfd     31,616(1)
3382108204443f84bfa733397be519bdcf6810c5127cerion        lfd     30,608(1)
3392108204443f84bfa733397be519bdcf6810c5127cerion        lfd     29,600(1)
3402108204443f84bfa733397be519bdcf6810c5127cerion        lfd     28,592(1)
3412108204443f84bfa733397be519bdcf6810c5127cerion        lfd     27,584(1)
3422108204443f84bfa733397be519bdcf6810c5127cerion        lfd     26,576(1)
3432108204443f84bfa733397be519bdcf6810c5127cerion        lfd     25,568(1)
3442108204443f84bfa733397be519bdcf6810c5127cerion        lfd     24,560(1)
3452108204443f84bfa733397be519bdcf6810c5127cerion        lfd     23,552(1)
3462108204443f84bfa733397be519bdcf6810c5127cerion        lfd     22,544(1)
3472108204443f84bfa733397be519bdcf6810c5127cerion        lfd     21,536(1)
3482108204443f84bfa733397be519bdcf6810c5127cerion        lfd     20,528(1)
3492108204443f84bfa733397be519bdcf6810c5127cerion        lfd     19,520(1)
3502108204443f84bfa733397be519bdcf6810c5127cerion        lfd     18,512(1)
3512108204443f84bfa733397be519bdcf6810c5127cerion        lfd     17,504(1)
3522108204443f84bfa733397be519bdcf6810c5127cerion        lfd     16,496(1)
3532108204443f84bfa733397be519bdcf6810c5127cerion        lfd     15,488(1)
3542108204443f84bfa733397be519bdcf6810c5127cerion        lfd     14,480(1)
3552c48c7b0a453d32375a4df17e153011b797ef28csewardj
356291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* restore int regs, including importantly r3 (two_words) */
3572108204443f84bfa733397be519bdcf6810c5127cerion        ld      31,472(1)
3582108204443f84bfa733397be519bdcf6810c5127cerion        ld      30,464(1)
3592108204443f84bfa733397be519bdcf6810c5127cerion        ld      29,456(1)
3602108204443f84bfa733397be519bdcf6810c5127cerion        ld      28,448(1)
3612108204443f84bfa733397be519bdcf6810c5127cerion        ld      27,440(1)
3622108204443f84bfa733397be519bdcf6810c5127cerion        ld      26,432(1)
3632108204443f84bfa733397be519bdcf6810c5127cerion        ld      25,424(1)
3642108204443f84bfa733397be519bdcf6810c5127cerion        ld      24,416(1)
3652108204443f84bfa733397be519bdcf6810c5127cerion        ld      23,408(1)
3662108204443f84bfa733397be519bdcf6810c5127cerion        ld      22,400(1)
3672108204443f84bfa733397be519bdcf6810c5127cerion        ld      21,392(1)
3682108204443f84bfa733397be519bdcf6810c5127cerion        ld      20,384(1)
3692108204443f84bfa733397be519bdcf6810c5127cerion        ld      19,376(1)
3702108204443f84bfa733397be519bdcf6810c5127cerion        ld      18,368(1)
3712108204443f84bfa733397be519bdcf6810c5127cerion        ld      17,360(1)
3722108204443f84bfa733397be519bdcf6810c5127cerion        ld      16,352(1)
3732108204443f84bfa733397be519bdcf6810c5127cerion        ld      15,344(1)
3742108204443f84bfa733397be519bdcf6810c5127cerion        ld      14,336(1)
3752108204443f84bfa733397be519bdcf6810c5127cerion        ld      13,328(1)
376291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        ld      3,104(1)
377291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Stash return values */
378291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     6,0(3)
379291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std     7,8(3)
3802c48c7b0a453d32375a4df17e153011b797ef28csewardj
381291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* restore lr & sp, and leave */
3822108204443f84bfa733397be519bdcf6810c5127cerion        ld      0,632(1)  /* stack_size + 8 */
3832108204443f84bfa733397be519bdcf6810c5127cerion        mtcr    0
3842108204443f84bfa733397be519bdcf6810c5127cerion        ld      0,640(1)  /* stack_size + 16 */
3852c48c7b0a453d32375a4df17e153011b797ef28csewardj        mtlr    0
3862c48c7b0a453d32375a4df17e153011b797ef28csewardj        addi    1,1,624   /* stack_size */
3872c48c7b0a453d32375a4df17e153011b797ef28csewardj        blr
3882c48c7b0a453d32375a4df17e153011b797ef28csewardj
3892c48c7b0a453d32375a4df17e153011b797ef28csewardj
390291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*----------------------------------------------------*/
391291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*--- Continuation points                          ---*/
392291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*----------------------------------------------------*/
3931a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj
394291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/* ------ Chain me to slow entry point ------ */
395291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section ".text"
396291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   2
397291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   VG_(disp_cp_chain_me_to_slowEP)
398291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section ".opd","aw"
399291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   3
400291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjVG_(disp_cp_chain_me_to_slowEP):
401291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .quad    .VG_(disp_cp_chain_me_to_slowEP),.TOC.@tocbase,0
402291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .previous
403291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .type    .VG_(disp_cp_chain_me_to_slowEP),@function
404291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   .VG_(disp_cp_chain_me_to_slowEP)
405291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.VG_(disp_cp_chain_me_to_slowEP):
406291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* We got called.  The return address indicates
407291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           where the patching needs to happen.  Collect
408291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           the return address and, exit back to C land,
409291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           handing the caller the pair (Chain_me_S, RA) */
410291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li   6, VG_TRC_CHAIN_ME_TO_SLOW_EP
411291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mflr 7
412291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* 20 = imm64-fixed5 r30, disp_cp_chain_me_to_slowEP
413291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           4  = mtctr r30
414291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           4  = btctr
415291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        */
416291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        subi 7,7,20+4+4
417291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        b    .postamble
418291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
419291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/* ------ Chain me to fast entry point ------ */
420291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section ".text"
421291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   2
422291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   VG_(disp_cp_chain_me_to_fastEP)
423291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section ".opd","aw"
424291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   3
425291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjVG_(disp_cp_chain_me_to_fastEP):
426291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .quad    .VG_(disp_cp_chain_me_to_fastEP),.TOC.@tocbase,0
427291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .previous
428291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .type    .VG_(disp_cp_chain_me_to_fastEP),@function
429291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   .VG_(disp_cp_chain_me_to_fastEP)
430291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.VG_(disp_cp_chain_me_to_fastEP):
431291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* We got called.  The return address indicates
432291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           where the patching needs to happen.  Collect
433291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           the return address and, exit back to C land,
434291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           handing the caller the pair (Chain_me_S, RA) */
435291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li   6, VG_TRC_CHAIN_ME_TO_FAST_EP
436291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mflr 7
437291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* 20 = imm64-fixed5 r30, disp_cp_chain_me_to_fastEP
438291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           4  = mtctr r30
439291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           4  = btctr
440291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        */
441291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        subi 7,7,20+4+4
442291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        b    .postamble
443291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
444291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/* ------ Indirect but boring jump ------ */
445291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section ".text"
446291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   2
447291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   VG_(disp_cp_xindir)
448291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section ".opd","aw"
449291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   3
450291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjVG_(disp_cp_xindir):
451291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .quad    .VG_(disp_cp_xindir),.TOC.@tocbase,0
452291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .previous
453291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .type    .VG_(disp_cp_xindir),@function
454291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   .VG_(disp_cp_xindir)
455291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.VG_(disp_cp_xindir):
456291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Where are we going? */
457291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        ld      3,OFFSET_ppc64_CIA(31)
4581a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj
459291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* stats only */
46096b3c209fdcededc7aece86a23c7d9af78a036e0sewardj	ld	5, .tocent__vgPlain_stats__n_xindirs_32@toc(2)
46196b3c209fdcededc7aece86a23c7d9af78a036e0sewardj        lwz     6,0(5)
462291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        addi    6,6,1
46396b3c209fdcededc7aece86a23c7d9af78a036e0sewardj        stw     6,0(5)
464291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
465291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	/* r5 = &VG_(tt_fast) */
466291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	ld	5, .tocent__vgPlain_tt_fast@toc(2) /* &VG_(tt_fast) */
467291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
468291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* try a fast lookup in the translation cache */
469291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* r4 = VG_TT_FAST_HASH(addr)           * sizeof(FastCacheEntry)
470291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              = ((r3 >>u 2) & VG_TT_FAST_MASK)  << 4 */
471291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	rldicl	4,3, 62, 64-VG_TT_FAST_BITS   /* entry# */
472291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	sldi	4,4,4      /* entry# * sizeof(FastCacheEntry) */
473291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	add	5,5,4      /* & VG_(tt_fast)[entry#] */
474291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	ld	6,0(5)     /* .guest */
475291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	ld	7,8(5)     /* .host */
476291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        cmpd    3,6
477291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        bne     .fast_lookup_failed
478291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
479291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Found a match.  Jump to .host. */
480291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mtctr   7
481291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        bctr
4821a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj
483291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.fast_lookup_failed:
484291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* stats only */
48596b3c209fdcededc7aece86a23c7d9af78a036e0sewardj	ld	5, .tocent__vgPlain_stats__n_xindir_misses_32@toc(2)
48696b3c209fdcededc7aece86a23c7d9af78a036e0sewardj        lwz     6,0(5)
487291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        addi    6,6,1
48896b3c209fdcededc7aece86a23c7d9af78a036e0sewardj        stw     6,0(5)
489291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
490291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,VG_TRC_INNER_FASTMISS
491291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      7,0
492291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        b       .postamble
493291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	/*NOTREACHED*/
494291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
495291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/* ------ Assisted jump ------ */
496291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.section ".text"
497291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   2
498291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   VG_(disp_cp_xassisted)
499291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section ".opd","aw"
500291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   3
501291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjVG_(disp_cp_xassisted):
502291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .quad    .VG_(disp_cp_xassisted),.TOC.@tocbase,0
503291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .previous
504291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .type    .VG_(disp_cp_xassisted),@function
505291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   .VG_(disp_cp_xassisted)
506291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.VG_(disp_cp_xassisted):
507291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* r31 contains the TRC */
508291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        mr      6,31
509291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      7,0
510291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        b       .postamble
511291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
512291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/* ------ Event check failed ------ */
513291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section ".text"
514291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   2
515291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   VG_(disp_cp_evcheck_fail)
516291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section ".opd","aw"
517291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   3
518291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjVG_(disp_cp_evcheck_fail):
519291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .quad    .VG_(disp_cp_evcheck_fail),.TOC.@tocbase,0
520291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .previous
521291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .type    .VG_(disp_cp_evcheck_fail),@function
522291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   .VG_(disp_cp_evcheck_fail)
523291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.VG_(disp_cp_evcheck_fail):
524291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      6,VG_TRC_INNER_COUNTERZERO
525291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        li      7,0
526291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        b       .postamble
527291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
528291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
529291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj.size .VG_(disp_run_translations), .-.VG_(disp_run_translations)
5301a85f4f4e5e1ec2518137ffa9a6a9bf7d9c50df9sewardj
531582d58245637ab05272d89fb94b12fd0f18fa0f8carll#endif // defined(VGP_ppc64be_linux)
5328b68b64759254d514d98328c496cbd88cde4c9a5njn
5333f1d6138db68f2aa74c5d005c3333cbe94788c7bflorian/* Let the linker know we don't need an executable stack */
5343f1d6138db68f2aa74c5d005c3333cbe94788c7bflorianMARK_STACK_NO_EXEC
5353f1d6138db68f2aa74c5d005c3333cbe94788c7bflorian
5361ade697d13061d1abf5d74dd243e478aedabcaa6cerion/*--------------------------------------------------------------------*/
5371ade697d13061d1abf5d74dd243e478aedabcaa6cerion/*--- end                                                          ---*/
5381ade697d13061d1abf5d74dd243e478aedabcaa6cerion/*--------------------------------------------------------------------*/
539