mpir/mpn/a29k/submul_1.s

117 lines
2.8 KiB
ArmAsm

; 29000 __gmpn_submul_1 -- Multiply a limb vector with a single limb and
; subtract the product from a second limb vector.
; Copyright 1992, 1994, 2000 Free Software Foundation, Inc.
; This file is part of the GNU MP Library.
; The GNU MP Library is free software; you can redistribute it and/or modify
; it under the terms of the GNU Lesser General Public License as published by
; the Free Software Foundation; either version 2.1 of the License, or (at your
; option) any later version.
; The GNU MP Library is distributed in the hope that it will be useful, but
; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
; License for more details.
; You should have received a copy of the GNU Lesser General Public License
; along with the GNU MP Library; see the file COPYING.LIB. If not, write to
; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
; MA 02110-1301, USA.
; INPUT PARAMETERS
; res_ptr lr2
; s1_ptr lr3
; size lr4
; s2_limb lr5
.cputype 29050
.sect .lit,lit
.text
.align 4
.global ___gmpn_submul_1
.word 0x60000
___gmpn_submul_1:
sub lr4,lr4,8
jmpt lr4,Ltail
const gr120,0 ; init cylimb reg
srl gr117,lr4,3 ; divide by 8
sub gr117,gr117,1 ; count for jmpfdec
Loop: mtsrim cr,(8-1)
loadm 0,0,gr96,lr3
add lr3,lr3,32
multiplu gr104,gr96,lr5
multmu gr96,gr96,lr5
multiplu gr105,gr97,lr5
multmu gr97,gr97,lr5
multiplu gr106,gr98,lr5
multmu gr98,gr98,lr5
multiplu gr107,gr99,lr5
multmu gr99,gr99,lr5
multiplu gr108,gr100,lr5
multmu gr100,gr100,lr5
multiplu gr109,gr101,lr5
multmu gr101,gr101,lr5
multiplu gr110,gr102,lr5
multmu gr102,gr102,lr5
multiplu gr111,gr103,lr5
multmu gr103,gr103,lr5
add gr104,gr104,gr120
addc gr105,gr105,gr96
addc gr106,gr106,gr97
addc gr107,gr107,gr98
addc gr108,gr108,gr99
addc gr109,gr109,gr100
addc gr110,gr110,gr101
addc gr111,gr111,gr102
addc gr120,gr103,0
mtsrim cr,(8-1)
loadm 0,0,gr96,lr2
sub gr96,gr96,gr104
subc gr97,gr97,gr105
subc gr98,gr98,gr106
subc gr99,gr99,gr107
subc gr100,gr100,gr108
subc gr101,gr101,gr109
subc gr102,gr102,gr110
subc gr103,gr103,gr111
add gr104,gr103,gr111 ; invert carry from previus sub
addc gr120,gr120,0
mtsrim cr,(8-1)
storem 0,0,gr96,lr2
jmpfdec gr117,Loop
add lr2,lr2,32
Ltail: and lr4,lr4,(8-1)
sub gr118,lr4,1 ; count for CR
jmpt gr118,Lend
sub lr4,lr4,2
sub lr2,lr2,4 ; offset res_ptr by one limb
Loop2: load 0,0,gr116,lr3
add lr3,lr3,4
multiplu gr117,gr116,lr5
multmu gr118,gr116,lr5
add lr2,lr2,4
load 0,0,gr119,lr2
add gr117,gr117,gr120
addc gr118,gr118,0
sub gr119,gr119,gr117
add gr104,gr119,gr117 ; invert carry from previus sub
store 0,0,gr119,lr2
jmpfdec lr4,Loop2
addc gr120,gr118,0
Lend: jmpi lr0
or gr96,gr120,0 ; copy