dnl HP-PA 2.0 mpn_lshift -- Left shift. dnl Copyright 1997, 2000, 2002, 2003 Free Software Foundation, Inc. dnl This file is part of the GNU MP Library. dnl The GNU MP Library is free software; you can redistribute it and/or modify dnl it under the terms of the GNU Lesser General Public License as published dnl by the Free Software Foundation; either version 3 of the License, or (at dnl your option) any later version. dnl The GNU MP Library is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public dnl License for more details. dnl You should have received a copy of the GNU Lesser General Public License dnl along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. dnl This runs at 1.5 cycles/limb on PA8000 and 1.0 cycles/limb on PA8500. include(`../config.m4') dnl INPUT PARAMETERS define(`rp',`%r26') define(`up',`%r25') define(`n',`%r24') define(`cnt',`%r23') ifdef(`HAVE_ABI_2_0w', ` .level 2.0w ',` .level 2.0 ') PROLOGUE(mpn_lshift) shladd n, 3, up, up shladd n, 3, rp, rp subi 64, cnt, cnt mtsar cnt ldd -8(up), %r21 addib,= -1, n, L(end) shrpd %r0, %r21, %sar, %r29 C compute carry out limb depw,z n, 31, 3, %r28 C r28 = (size & 7) sub %r0, n, %r22 depw,z %r22, 28, 3, %r22 C r22 = 8 * (-size & 7) add up, %r22, up C offset up blr %r28, %r0 C branch into jump table add rp, %r22, rp C offset rp b L(0) nop b L(1) copy %r21, %r20 b L(2) nop b L(3) copy %r21, %r20 b L(4) nop b L(5) copy %r21, %r20 b L(6) nop b L(7) copy %r21, %r20 LDEF(loop) LDEF(0) ldd -16(up), %r20 shrpd %r21, %r20, %sar, %r21 std %r21, -8(rp) LDEF(7) ldd -24(up), %r21 shrpd %r20, %r21, %sar, %r20 std %r20, -16(rp) LDEF(6) ldd -32(up), %r20 shrpd %r21, %r20, %sar, %r21 std %r21, -24(rp) LDEF(5) ldd -40(up), %r21 shrpd %r20, %r21, %sar, %r20 std %r20, -32(rp) LDEF(4) ldd -48(up), %r20 shrpd %r21, %r20, %sar, %r21 std %r21, -40(rp) LDEF(3) ldd -56(up), %r21 shrpd %r20, %r21, %sar, %r20 std %r20, -48(rp) LDEF(2) ldd -64(up), %r20 shrpd %r21, %r20, %sar, %r21 std %r21, -56(rp) LDEF(1) ldd -72(up), %r21 ldo -64(up), up shrpd %r20, %r21, %sar, %r20 std %r20, -64(rp) addib,> -8, n, L(loop) ldo -64(rp), rp LDEF(end) shrpd %r21, %r0, %sar, %r21 std %r21, -8(rp) bve (%r2) ifdef(`HAVE_ABI_2_0w', ` copy %r29,%r28 ',` extrd,u %r29, 31, 32, %r28 ') EPILOGUE(mpn_lshift)