X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fgmp%2Fmpn%2Fpowerpc32%2Fadd_n.asm;fp=rts%2Fgmp%2Fmpn%2Fpowerpc32%2Fadd_n.asm;h=81ed04b1628a813c1731f5536ec67ef3ddb82e8e;hb=0065d5ab628975892cea1ec7303f968c3338cbe1;hp=0000000000000000000000000000000000000000;hpb=28a464a75e14cece5db40f2765a29348273ff2d2;p=ghc-hetmet.git diff --git a/rts/gmp/mpn/powerpc32/add_n.asm b/rts/gmp/mpn/powerpc32/add_n.asm new file mode 100644 index 0000000..81ed04b --- /dev/null +++ b/rts/gmp/mpn/powerpc32/add_n.asm @@ -0,0 +1,61 @@ +dnl PowerPC-32 mpn_add_n -- Add two limb vectors of the same length > 0 and +dnl store sum in a third limb vector. + +dnl Copyright (C) 1995, 1997, 2000 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 by +dnl the Free Software Foundation; either version 2.1 of the License, or (at your +dnl 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; see the file COPYING.LIB. If not, write to +dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +dnl MA 02111-1307, USA. + + +dnl INPUT PARAMETERS +dnl res_ptr r3 +dnl s1_ptr r4 +dnl s2_ptr r5 +dnl size r6 + +include(`../config.m4') + +ASM_START() +PROLOGUE(mpn_add_n) + mtctr r6 C copy size into CTR + addic r0,r0,0 C clear cy + lwz r8,0(r4) C load least significant s1 limb + lwz r0,0(r5) C load least significant s2 limb + addi r3,r3,-4 C offset res_ptr, it's updated before it's used + bdz .Lend C If done, skip loop +.Loop: lwz r9,4(r4) C load s1 limb + lwz r10,4(r5) C load s2 limb + adde r7,r0,r8 C add limbs with cy, set cy + stw r7,4(r3) C store result limb + bdz .Lexit C decrement CTR and exit if done + lwzu r8,8(r4) C load s1 limb and update s1_ptr + lwzu r0,8(r5) C load s2 limb and update s2_ptr + adde r7,r10,r9 C add limbs with cy, set cy + stwu r7,8(r3) C store result limb and update res_ptr + bdnz .Loop C decrement CTR and loop back + +.Lend: adde r7,r0,r8 + stw r7,4(r3) C store ultimate result limb + li r3,0 C load cy into ... + addze r3,r3 C ... return value register + blr +.Lexit: adde r7,r10,r9 + stw r7,8(r3) + li r3,0 C load cy into ... + addze r3,r3 C ... return value register + blr +EPILOGUE(mpn_add_n)