Blame mpn/power/lshift.asm

Packit 5c3484
dnl  IBM POWER mpn_lshift -- Shift a number left.
Packit 5c3484
Packit 5c3484
dnl  Copyright 1992, 1994, 1999-2001 Free Software Foundation, Inc.
Packit 5c3484
Packit 5c3484
dnl  This file is part of the GNU MP Library.
Packit 5c3484
dnl
Packit 5c3484
dnl  The GNU MP Library is free software; you can redistribute it and/or modify
Packit 5c3484
dnl  it under the terms of either:
Packit 5c3484
dnl
Packit 5c3484
dnl    * the GNU Lesser General Public License as published by the Free
Packit 5c3484
dnl      Software Foundation; either version 3 of the License, or (at your
Packit 5c3484
dnl      option) any later version.
Packit 5c3484
dnl
Packit 5c3484
dnl  or
Packit 5c3484
dnl
Packit 5c3484
dnl    * the GNU General Public License as published by the Free Software
Packit 5c3484
dnl      Foundation; either version 2 of the License, or (at your option) any
Packit 5c3484
dnl      later version.
Packit 5c3484
dnl
Packit 5c3484
dnl  or both in parallel, as here.
Packit 5c3484
dnl
Packit 5c3484
dnl  The GNU MP Library is distributed in the hope that it will be useful, but
Packit 5c3484
dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit 5c3484
dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
Packit 5c3484
dnl  for more details.
Packit 5c3484
dnl
Packit 5c3484
dnl  You should have received copies of the GNU General Public License and the
Packit 5c3484
dnl  GNU Lesser General Public License along with the GNU MP Library.  If not,
Packit 5c3484
dnl  see https://www.gnu.org/licenses/.
Packit 5c3484
Packit 5c3484
Packit 5c3484
dnl  INPUT PARAMETERS
Packit 5c3484
dnl  res_ptr	r3
Packit 5c3484
dnl  s_ptr	r4
Packit 5c3484
dnl  size	r5
Packit 5c3484
dnl  cnt	r6
Packit 5c3484
Packit 5c3484
include(`../config.m4')
Packit 5c3484
Packit 5c3484
ASM_START()
Packit 5c3484
PROLOGUE(mpn_lshift)
Packit 5c3484
	sli	0,5,2
Packit 5c3484
	cax	9,3,0
Packit 5c3484
	cax	4,4,0
Packit 5c3484
	sfi	8,6,32
Packit 5c3484
	mtctr	5		C put limb count in CTR loop register
Packit 5c3484
	lu	0,-4(4)		C read most significant limb
Packit 5c3484
	sre	3,0,8		C compute carry out limb, and init MQ register
Packit 5c3484
	bdz	Lend2		C if just one limb, skip loop
Packit 5c3484
	lu	0,-4(4)		C read 2:nd most significant limb
Packit 5c3484
	sreq	7,0,8		C compute most significant limb of result
Packit 5c3484
	bdz	Lend		C if just two limb, skip loop
Packit 5c3484
Loop:	lu	0,-4(4)		C load next lower limb
Packit 5c3484
	stu	7,-4(9)		C store previous result during read latency
Packit 5c3484
	sreq	7,0,8		C compute result limb
Packit 5c3484
	bdn	Loop		C loop back until CTR is zero
Packit 5c3484
Lend:	stu	7,-4(9)		C store 2:nd least significant limb
Packit 5c3484
Lend2:	sle	7,0,6		C compute least significant limb
Packit 5c3484
	st	7,-4(9)		C store it
Packit 5c3484
	br
Packit 5c3484
EPILOGUE(mpn_lshift)