github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/mpn/pa64/umul.asm (about) 1 dnl Copyright 1999, 2000, 2002, 2003 Free Software Foundation, Inc. 2 3 dnl This file is part of the GNU MP Library. 4 dnl 5 dnl The GNU MP Library is free software; you can redistribute it and/or modify 6 dnl it under the terms of either: 7 dnl 8 dnl * the GNU Lesser General Public License as published by the Free 9 dnl Software Foundation; either version 3 of the License, or (at your 10 dnl option) any later version. 11 dnl 12 dnl or 13 dnl 14 dnl * the GNU General Public License as published by the Free Software 15 dnl Foundation; either version 2 of the License, or (at your option) any 16 dnl later version. 17 dnl 18 dnl or both in parallel, as here. 19 dnl 20 dnl The GNU MP Library is distributed in the hope that it will be useful, but 21 dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 22 dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 23 dnl for more details. 24 dnl 25 dnl You should have received copies of the GNU General Public License and the 26 dnl GNU Lesser General Public License along with the GNU MP Library. If not, 27 dnl see https://www.gnu.org/licenses/. 28 29 30 dnl Optimizations: 31 dnl * Avoid skip instructions 32 dnl * Put carry-generating and carry-consuming insns consecutively 33 dnl * Don't allocate any stack, "home" positions for parameters could be used. 34 35 include(`../config.m4') 36 37 define(`p0',`%r28') 38 define(`p1',`%r29') 39 define(`t32',`%r19') 40 define(`t0',`%r20') 41 define(`t1',`%r21') 42 define(`x',`%r22') 43 define(`m0',`%r23') 44 define(`m1',`%r24') 45 46 ifdef(`HAVE_ABI_2_0w', 47 ` .level 2.0w 48 ',` .level 2.0 49 ') 50 PROLOGUE(mpn_umul_ppmm_r) 51 ldo 128(%r30),%r30 52 ifdef(`HAVE_ABI_2_0w', 53 ` std %r26,-64(%r30) 54 std %r25,-56(%r30) 55 copy %r24,%r31 56 ',` 57 depd %r25,31,32,%r26 58 std %r26,-64(%r30) 59 depd %r23,31,32,%r24 60 std %r24,-56(%r30) 61 ldw -180(%r30),%r31 62 ') 63 64 fldd -64(%r30),%fr4 65 fldd -56(%r30),%fr5 66 67 xmpyu %fr5R,%fr4R,%fr6 68 fstd %fr6,-128(%r30) 69 xmpyu %fr5R,%fr4L,%fr7 70 fstd %fr7,-120(%r30) 71 xmpyu %fr5L,%fr4R,%fr8 72 fstd %fr8,-112(%r30) 73 xmpyu %fr5L,%fr4L,%fr9 74 fstd %fr9,-104(%r30) 75 76 depdi,z 1,31,1,t32 C t32 = 2^32 77 78 ldd -128(%r30),p0 C lo = low 64 bit of product 79 ldd -120(%r30),m0 C m0 = mid0 64 bit of product 80 ldd -112(%r30),m1 C m1 = mid1 64 bit of product 81 ldd -104(%r30),p1 C hi = high 64 bit of product 82 83 add,l,*nuv m0,m1,x C x = m1+m0 84 add,l t32,p1,p1 C propagate carry to mid of p1 85 depd,z x,31,32,t0 C lo32(m1+m0) 86 add t0,p0,p0 87 extrd,u x,31,32,t1 C hi32(m1+m0) 88 add,dc t1,p1,p1 89 90 std p0,0(%r31) C store low half of product 91 ifdef(`HAVE_ABI_2_0w', 92 ` copy p1,%r28 C return val in %r28 93 ',` extrd,u p1,31,32,%r28 C return val in %r28,%r29 94 ') 95 bve (%r2) 96 ldo -128(%r30),%r30 97 EPILOGUE(mpn_umul_ppmm_r) 98