1169689Skan/* This file contains the vector save and restore routines. 2169689Skan * 3169689Skan * Copyright (C) 2004 Free Software Foundation, Inc. 4169689Skan * 5169689Skan * This file is free software; you can redistribute it and/or modify it 6169689Skan * under the terms of the GNU General Public License as published by the 7169689Skan * Free Software Foundation; either version 2, or (at your option) any 8169689Skan * later version. 9169689Skan * 10169689Skan * In addition to the permissions in the GNU General Public License, the 11169689Skan * Free Software Foundation gives you unlimited permission to link the 12169689Skan * compiled version of this file with other programs, and to distribute 13169689Skan * those programs without any restriction coming from the use of this 14169689Skan * file. (The General Public License restrictions do apply in other 15169689Skan * respects; for example, they cover modification of the file, and 16169689Skan * distribution when not linked into another program.) 17169689Skan * 18169689Skan * This file is distributed in the hope that it will be useful, but 19169689Skan * WITHOUT ANY WARRANTY; without even the implied warranty of 20169689Skan * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21169689Skan * General Public License for more details. 22169689Skan * 23169689Skan * You should have received a copy of the GNU General Public License 24169689Skan * along with this program; see the file COPYING. If not, write to 25169689Skan * the Free Software Foundation, 51 Franklin Street, Fifth Floor, 26169689Skan * Boston, MA 02110-1301, USA. 27169689Skan * 28169689Skan * As a special exception, if you link this library with files 29169689Skan * compiled with GCC to produce an executable, this does not cause the 30169689Skan * resulting executable to be covered by the GNU General Public License. 31169689Skan * This exception does not however invalidate any other reasons why the 32169689Skan * executable file might be covered by the GNU General Public License. 33169689Skan */ 34169689Skan 35169689Skan/* Vector save/restore routines for Darwin. Note that each vector 36169689Skan save/restore requires 2 instructions (8 bytes.) 37169689Skan 38169689Skan THE SAVE AND RESTORE ROUTINES CAN HAVE ONLY ONE GLOBALLY VISIBLE 39169689Skan ENTRY POINT - callers have to jump to "saveFP+60" to save f29..f31, 40169689Skan for example. For FP reg saves/restores, it takes one instruction 41169689Skan (4 bytes) to do the operation; for Vector regs, 2 instructions are 42169689Skan required (8 bytes.). */ 43169689Skan 44169689Skan .machine ppc7400 45169689Skan.text 46169689Skan .align 2 47169689Skan 48169689Skan.private_extern saveVEC 49169689SkansaveVEC: 50169689Skan li r11,-192 51169689Skan stvx v20,r11,r0 52169689Skan li r11,-176 53169689Skan stvx v21,r11,r0 54169689Skan li r11,-160 55169689Skan stvx v22,r11,r0 56169689Skan li r11,-144 57169689Skan stvx v23,r11,r0 58169689Skan li r11,-128 59169689Skan stvx v24,r11,r0 60169689Skan li r11,-112 61169689Skan stvx v25,r11,r0 62169689Skan li r11,-96 63169689Skan stvx v26,r11,r0 64169689Skan li r11,-80 65169689Skan stvx v27,r11,r0 66169689Skan li r11,-64 67169689Skan stvx v28,r11,r0 68169689Skan li r11,-48 69169689Skan stvx v29,r11,r0 70169689Skan li r11,-32 71169689Skan stvx v30,r11,r0 72169689Skan li r11,-16 73169689Skan stvx v31,r11,r0 74169689Skan blr 75169689Skan 76169689Skan.private_extern restVEC 77169689SkanrestVEC: 78169689Skan li r11,-192 79169689Skan lvx v20,r11,r0 80169689Skan li r11,-176 81169689Skan lvx v21,r11,r0 82169689Skan li r11,-160 83169689Skan lvx v22,r11,r0 84169689Skan li r11,-144 85169689Skan lvx v23,r11,r0 86169689Skan li r11,-128 87169689Skan lvx v24,r11,r0 88169689Skan li r11,-112 89169689Skan lvx v25,r11,r0 90169689Skan li r11,-96 91169689Skan lvx v26,r11,r0 92169689Skan li r11,-80 93169689Skan lvx v27,r11,r0 94169689Skan li r11,-64 95169689Skan lvx v28,r11,r0 96169689Skan li r11,-48 97169689Skan lvx v29,r11,r0 98169689Skan li r11,-32 99169689Skan lvx v30,r11,r0 100169689Skan li r11,-16 101169689Skan lvx v31,r11,r0 102169689Skan blr 103169689Skan 104169689Skan/* saveVEC_vr11 -- as saveVEC but VRsave is returned in R11. */ 105169689Skan 106169689Skan.private_extern saveVEC_vr11 107169689SkansaveVEC_vr11: 108169689Skan li r11,-192 109169689Skan stvx v20,r11,r0 110169689Skan li r11,-176 111169689Skan stvx v21,r11,r0 112169689Skan li r11,-160 113169689Skan stvx v22,r11,r0 114169689Skan li r11,-144 115169689Skan stvx v23,r11,r0 116169689Skan li r11,-128 117169689Skan stvx v24,r11,r0 118169689Skan li r11,-112 119169689Skan stvx v25,r11,r0 120169689Skan li r11,-96 121169689Skan stvx v26,r11,r0 122169689Skan li r11,-80 123169689Skan stvx v27,r11,r0 124169689Skan li r11,-64 125169689Skan stvx v28,r11,r0 126169689Skan li r11,-48 127169689Skan stvx v29,r11,r0 128169689Skan li r11,-32 129169689Skan stvx v30,r11,r0 130169689Skan li r11,-16 131169689Skan stvx v31,r11,r0 132169689Skan mfspr r11,VRsave 133169689Skan blr 134169689Skan 135169689Skan/* As restVec, but the original VRsave value passed in R10. */ 136169689Skan 137169689Skan.private_extern restVEC_vr10 138169689SkanrestVEC_vr10: 139169689Skan li r11,-192 140169689Skan lvx v20,r11,r0 141169689Skan li r11,-176 142169689Skan lvx v21,r11,r0 143169689Skan li r11,-160 144169689Skan lvx v22,r11,r0 145169689Skan li r11,-144 146169689Skan lvx v23,r11,r0 147169689Skan li r11,-128 148169689Skan lvx v24,r11,r0 149169689Skan li r11,-112 150169689Skan lvx v25,r11,r0 151169689Skan li r11,-96 152169689Skan lvx v26,r11,r0 153169689Skan li r11,-80 154169689Skan lvx v27,r11,r0 155169689Skan li r11,-64 156169689Skan lvx v28,r11,r0 157169689Skan li r11,-48 158169689Skan lvx v29,r11,r0 159169689Skan li r11,-32 160169689Skan lvx v30,r11,r0 161169689Skan li r11,-16 162169689Skan lvx v31,r11,r0 163169689Skan /* restore VRsave from R10. */ 164169689Skan mtspr VRsave,r10 165169689Skan blr 166