📄 sub_n.s
字号:
; mc88110 __gmpn_sub_n -- Subtract two limb vectors of the same length > 0 and; store difference in a third limb vector.; Copyright 1995, 1996, 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 3 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. If not, see http://www.gnu.org/licenses/.; INPUT PARAMETERS#define res_ptr r2#define s1_ptr r3#define s2_ptr r4#define size r5#include "sysdep.h" text align 16 global C_SYMBOL_NAME(__gmpn_sub_n)C_SYMBOL_NAME(__gmpn_sub_n): subu.co r0,r0,r0 ; set cy flag xor r12,s2_ptr,res_ptr bb1 2,r12,L1; ** V1a **L0: bb0 2,res_ptr,L_v1 ; branch if res_ptr is aligned/* Add least significant limb separately to align res_ptr and s2_ptr */ ld r10,s1_ptr,0 addu s1_ptr,s1_ptr,4 ld r8,s2_ptr,0 addu s2_ptr,s2_ptr,4 subu size,size,1 subu.co r6,r10,r8 st r6,res_ptr,0 addu res_ptr,res_ptr,4L_v1: cmp r12,size,2 bb1 lt,r12,Lend2 ld r10,s1_ptr,0 ld r12,s1_ptr,4 ld.d r8,s2_ptr,0 subu size,size,10 bcnd lt0,size,Lfin1/* Add blocks of 8 limbs until less than 8 limbs remain */ align 8Loop1: subu size,size,8 subu.cio r6,r10,r8 ld r10,s1_ptr,8 subu.cio r7,r12,r9 ld r12,s1_ptr,12 ld.d r8,s2_ptr,8 st.d r6,res_ptr,0 subu.cio r6,r10,r8 ld r10,s1_ptr,16 subu.cio r7,r12,r9 ld r12,s1_ptr,20 ld.d r8,s2_ptr,16 st.d r6,res_ptr,8 subu.cio r6,r10,r8 ld r10,s1_ptr,24 subu.cio r7,r12,r9 ld r12,s1_ptr,28 ld.d r8,s2_ptr,24 st.d r6,res_ptr,16 subu.cio r6,r10,r8 ld r10,s1_ptr,32 subu.cio r7,r12,r9 ld r12,s1_ptr,36 addu s1_ptr,s1_ptr,32 ld.d r8,s2_ptr,32 addu s2_ptr,s2_ptr,32 st.d r6,res_ptr,24 addu res_ptr,res_ptr,32 bcnd ge0,size,Loop1Lfin1: addu size,size,8-2 bcnd lt0,size,Lend1/* Add blocks of 2 limbs until less than 2 limbs remain */Loope1: subu.cio r6,r10,r8 ld r10,s1_ptr,8 subu.cio r7,r12,r9 ld r12,s1_ptr,12 ld.d r8,s2_ptr,8 st.d r6,res_ptr,0 subu size,size,2 addu s1_ptr,s1_ptr,8 addu s2_ptr,s2_ptr,8 addu res_ptr,res_ptr,8 bcnd ge0,size,Loope1Lend1: subu.cio r6,r10,r8 subu.cio r7,r12,r9 st.d r6,res_ptr,0 bb0 0,size,Lret1/* Add last limb */ ld r10,s1_ptr,8 ld r8,s2_ptr,8 subu.cio r6,r10,r8 st r6,res_ptr,8Lret1: addu.ci r2,r0,r0 ; return carry-out from most sign. limb jmp.n r1 xor r2,r2,1L1: xor r12,s1_ptr,res_ptr bb1 2,r12,L2; ** V1b ** bb0 2,res_ptr,L_v1b ; branch if res_ptr is aligned/* Add least significant limb separately to align res_ptr and s1_ptr */ ld r10,s2_ptr,0 addu s2_ptr,s2_ptr,4 ld r8,s1_ptr,0 addu s1_ptr,s1_ptr,4 subu size,size,1 subu.co r6,r8,r10 st r6,res_ptr,0 addu res_ptr,res_ptr,4L_v1b: cmp r12,size,2 bb1 lt,r12,Lend2 ld r10,s2_ptr,0 ld r12,s2_ptr,4 ld.d r8,s1_ptr,0 subu size,size,10 bcnd lt0,size,Lfin1b/* Add blocks of 8 limbs until less than 8 limbs remain */ align 8Loop1b: subu size,size,8 subu.cio r6,r8,r10 ld r10,s2_ptr,8 subu.cio r7,r9,r12 ld r12,s2_ptr,12 ld.d r8,s1_ptr,8 st.d r6,res_ptr,0 subu.cio r6,r8,r10 ld r10,s2_ptr,16 subu.cio r7,r9,r12 ld r12,s2_ptr,20 ld.d r8,s1_ptr,16 st.d r6,res_ptr,8 subu.cio r6,r8,r10 ld r10,s2_ptr,24 subu.cio r7,r9,r12 ld r12,s2_ptr,28 ld.d r8,s1_ptr,24 st.d r6,res_ptr,16 subu.cio r6,r8,r10 ld r10,s2_ptr,32 subu.cio r7,r9,r12 ld r12,s2_ptr,36 addu s2_ptr,s2_ptr,32 ld.d r8,s1_ptr,32 addu s1_ptr,s1_ptr,32 st.d r6,res_ptr,24 addu res_ptr,res_ptr,32 bcnd ge0,size,Loop1bLfin1b: addu size,size,8-2 bcnd lt0,size,Lend1b/* Add blocks of 2 limbs until less than 2 limbs remain */Loope1b:subu.cio r6,r8,r10 ld r10,s2_ptr,8 subu.cio r7,r9,r12 ld r12,s2_ptr,12 ld.d r8,s1_ptr,8 st.d r6,res_ptr,0 subu size,size,2 addu s1_ptr,s1_ptr,8 addu s2_ptr,s2_ptr,8 addu res_ptr,res_ptr,8 bcnd ge0,size,Loope1bLend1b: subu.cio r6,r8,r10 subu.cio r7,r9,r12 st.d r6,res_ptr,0 bb0 0,size,Lret1b/* Add last limb */ ld r10,s2_ptr,8 ld r8,s1_ptr,8 subu.cio r6,r8,r10 st r6,res_ptr,8Lret1b: addu.ci r2,r0,r0 ; return carry-out from most sign. limb jmp.n r1 xor r2,r2,1; ** V2 **/* If we come here, the alignment of s1_ptr and res_ptr as well as the alignment of s2_ptr and res_ptr differ. Since there are only two ways things can be aligned (that we care about) we now know that the alignment of s1_ptr and s2_ptr are the same. */L2: cmp r12,size,1 bb1 eq,r12,Ljone bb0 2,s1_ptr,L_v2 ; branch if s1_ptr is aligned/* Add least significant limb separately to align res_ptr and s2_ptr */ ld r10,s1_ptr,0 addu s1_ptr,s1_ptr,4 ld r8,s2_ptr,0 addu s2_ptr,s2_ptr,4 subu size,size,1 subu.co r6,r10,r8 st r6,res_ptr,0 addu res_ptr,res_ptr,4L_v2: subu size,size,8 bcnd lt0,size,Lfin2/* Add blocks of 8 limbs until less than 8 limbs remain */ align 8Loop2: subu size,size,8 ld.d r8,s1_ptr,0 ld.d r6,s2_ptr,0 subu.cio r8,r8,r6 st r8,res_ptr,0 subu.cio r9,r9,r7 st r9,res_ptr,4 ld.d r8,s1_ptr,8 ld.d r6,s2_ptr,8 subu.cio r8,r8,r6 st r8,res_ptr,8 subu.cio r9,r9,r7 st r9,res_ptr,12 ld.d r8,s1_ptr,16 ld.d r6,s2_ptr,16 subu.cio r8,r8,r6 st r8,res_ptr,16 subu.cio r9,r9,r7 st r9,res_ptr,20 ld.d r8,s1_ptr,24 ld.d r6,s2_ptr,24 subu.cio r8,r8,r6 st r8,res_ptr,24 subu.cio r9,r9,r7 st r9,res_ptr,28 addu s1_ptr,s1_ptr,32 addu s2_ptr,s2_ptr,32 addu res_ptr,res_ptr,32 bcnd ge0,size,Loop2Lfin2: addu size,size,8-2 bcnd lt0,size,Lend2Loope2: ld.d r8,s1_ptr,0 ld.d r6,s2_ptr,0 subu.cio r8,r8,r6 st r8,res_ptr,0 subu.cio r9,r9,r7 st r9,res_ptr,4 subu size,size,2 addu s1_ptr,s1_ptr,8 addu s2_ptr,s2_ptr,8 addu res_ptr,res_ptr,8 bcnd ge0,size,Loope2Lend2: bb0 0,size,Lret2/* Add last limb */Ljone: ld r10,s1_ptr,0 ld r8,s2_ptr,0 subu.cio r6,r10,r8 st r6,res_ptr,0Lret2: addu.ci r2,r0,r0 ; return carry-out from most sign. limb jmp.n r1 xor r2,r2,1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -