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