1dnl PowerPC-64 mpn_lshift -- rp[] = up[] << cnt 2 3dnl Copyright 2003, 2005 Free Software Foundation, Inc. 4 5dnl This file is part of the GNU MP Library. 6 7dnl The GNU MP Library is free software; you can redistribute it and/or modify 8dnl it under the terms of the GNU Lesser General Public License as published 9dnl by the Free Software Foundation; either version 3 of the License, or (at 10dnl your option) any later version. 11 12dnl The GNU MP Library is distributed in the hope that it will be useful, but 13dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 15dnl License for more details. 16 17dnl You should have received a copy of the GNU Lesser General Public License 18dnl along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. 19 20include(`../config.m4') 21 22C cycles/limb 23C POWER3/PPC630: 1.5 24C POWER4/PPC970: 3.0 25 26C INPUT PARAMETERS 27define(`rp',`r3') 28define(`up',`r4') 29define(`n',`r5') 30define(`cnt',`r6') 31 32define(`tnc',`r5') 33define(`v0',`r0') 34define(`v1',`r7') 35define(`u0',`r8') 36define(`u1',`r9') 37define(`h0',`r10') 38define(`h1',`r11') 39 40 41ASM_START() 42PROLOGUE(mpn_lshift) 43ifdef(`HAVE_ABI_mode32', 44` rldicl r7, r5, 0, 32 C zero extend n 45 mtctr r7', C copy n to count register 46` mtctr n') C copy n to count register 47 48ifdef(`HAVE_ABI_mode32', 49` rldic r0, n, 3, 32', C byte count corresponding to n 50` rldicr r0, n, 3, 60') C byte count corresponding to n 51 52 add rp, rp, r0 C rp = rp + n 53 add up, up, r0 C up = up + n 54 addi rp, rp, 8 C rp now points 16 beyond end 55 addi up, up, -8 C up now points to last limb 56 subfic tnc, cnt, 64 C reverse shift count 57 58 ld u0, 0(up) 59 sld h0, u0, cnt 60 srd r12, u0, tnc C return value 61 bdz L(1) C jump for n = 1 62 63 ld u1, -8(up) 64 bdz L(2) C jump for n = 2 65 66 ldu u0, -16(up) 67 bdz L(end) C jump for n = 3 68 69L(oop): srd v1, u1, tnc 70 sld h1, u1, cnt 71 ld u1, -8(up) 72 or h0, v1, h0 73 stdu h0, -16(rp) 74 75 bdz L(exit) 76 77 srd v0, u0, tnc 78 sld h0, u0, cnt 79 ldu u0, -16(up) 80 or h1, v0, h1 81 std h1, -8(rp) 82 83 bdnz L(oop) 84 85L(end): srd v1, u1, tnc 86 sld h1, u1, cnt 87 or h0, v1, h0 88 stdu h0, -16(rp) 89 srd v0, u0, tnc 90 sld h0, u0, cnt 91 or h1, v0, h1 92 std h1, -8(rp) 93L(1): std h0, -16(rp) 94ifdef(`HAVE_ABI_mode32', 95` srdi r3, r12, 32 96 mr r4, r12 97',` mr r3, r12 98') 99 blr 100 101L(exit): srd v0, u0, tnc 102 sld h0, u0, cnt 103 or h1, v0, h1 104 std h1, -8(rp) 105L(2): srd v1, u1, tnc 106 sld h1, u1, cnt 107 or h0, v1, h0 108 stdu h0, -16(rp) 109 std h1, -8(rp) 110ifdef(`HAVE_ABI_mode32', 111` srdi r3, r12, 32 112 mr r4, r12 113',` mr r3, r12 114') 115 blr 116EPILOGUE() 117