1 1.1 mrg dnl PowerPC-32 mpn_add_n and mpn_sub_n. 2 1.1 mrg 3 1.1 mrg dnl Copyright 2002, 2005, 2007 Free Software Foundation, Inc. 4 1.1 mrg 5 1.1 mrg dnl This file is part of the GNU MP Library. 6 1.1.1.3 mrg dnl 7 1.1 mrg dnl The GNU MP Library is free software; you can redistribute it and/or modify 8 1.1.1.3 mrg dnl it under the terms of either: 9 1.1.1.3 mrg dnl 10 1.1.1.3 mrg dnl * the GNU Lesser General Public License as published by the Free 11 1.1.1.3 mrg dnl Software Foundation; either version 3 of the License, or (at your 12 1.1.1.3 mrg dnl option) any later version. 13 1.1.1.3 mrg dnl 14 1.1.1.3 mrg dnl or 15 1.1.1.3 mrg dnl 16 1.1.1.3 mrg dnl * the GNU General Public License as published by the Free Software 17 1.1.1.3 mrg dnl Foundation; either version 2 of the License, or (at your option) any 18 1.1.1.3 mrg dnl later version. 19 1.1.1.3 mrg dnl 20 1.1.1.3 mrg dnl or both in parallel, as here. 21 1.1.1.3 mrg dnl 22 1.1 mrg dnl The GNU MP Library is distributed in the hope that it will be useful, but 23 1.1 mrg dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 24 1.1.1.3 mrg dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 25 1.1.1.3 mrg dnl for more details. 26 1.1.1.3 mrg dnl 27 1.1.1.3 mrg dnl You should have received copies of the GNU General Public License and the 28 1.1.1.3 mrg dnl GNU Lesser General Public License along with the GNU MP Library. If not, 29 1.1.1.3 mrg dnl see https://www.gnu.org/licenses/. 30 1.1 mrg 31 1.1 mrg include(`../config.m4') 32 1.1 mrg 33 1.1.1.2 mrg C cycles/limb 34 1.1.1.2 mrg C 603e: ? 35 1.1.1.2 mrg C 604e: ? old: 3.25 36 1.1.1.2 mrg C 75x (G3): ? old: 3.5 37 1.1.1.2 mrg C 7400,7410 (G4): 3.25 38 1.1.1.2 mrg C 744x,745x (G4+): 4 39 1.1.1.2 mrg C POWER3/PPC630 2 40 1.1.1.2 mrg C POWER4/PPC970 2.4 41 1.1.1.2 mrg C POWER5 2.75 42 1.1.1.2 mrg C POWER6 40-140 43 1.1.1.2 mrg C POWER7 3 44 1.1 mrg 45 1.1 mrg C INPUT PARAMETERS 46 1.1 mrg define(`rp', `r3') 47 1.1 mrg define(`up', `r4') 48 1.1 mrg define(`vp', `r5') 49 1.1 mrg define(`n', `r6') 50 1.1 mrg define(`cy', `r7') 51 1.1 mrg 52 1.1 mrg ifdef(`OPERATION_add_n', ` 53 1.1 mrg define(ADCSBC, adde) 54 1.1 mrg define(func, mpn_add_n) 55 1.1 mrg define(func_nc, mpn_add_nc) 56 1.1 mrg define(IFADD, `$1') 57 1.1 mrg define(IFSUB, `')') 58 1.1 mrg ifdef(`OPERATION_sub_n', ` 59 1.1 mrg define(ADCSBC, subfe) 60 1.1 mrg define(func, mpn_sub_n) 61 1.1 mrg define(func_nc, mpn_sub_nc) 62 1.1 mrg define(IFADD, `') 63 1.1 mrg define(IFSUB, `$1')') 64 1.1 mrg 65 1.1 mrg MULFUNC_PROLOGUE(mpn_add_n mpn_add_nc mpn_sub_n mpn_sub_nc) 66 1.1 mrg 67 1.1 mrg ASM_START() 68 1.1 mrg 69 1.1 mrg PROLOGUE(func_nc) 70 1.1 mrg IFADD(` addic r0, cy, -1') C set carry from argument 71 1.1 mrg IFSUB(` subfic r0, cy, 0') C set carry from argument 72 1.1 mrg b L(ent) 73 1.1 mrg EPILOGUE() 74 1.1 mrg 75 1.1 mrg PROLOGUE(func) 76 1.1 mrg IFADD(` addic r0, n, 0') C clear carry 77 1.1 mrg IFSUB(` addic r0, n, -1') C set carry 78 1.1 mrg L(ent): andi. r0, n, 3 79 1.1 mrg addi r3, r3, -12 80 1.1 mrg addi n, n, 1 81 1.1 mrg cmpwi cr7, r0, 2 82 1.1 mrg srwi r0, n, 2 83 1.1 mrg sub r4, r4, r3 84 1.1 mrg sub r5, r5, r3 85 1.1 mrg mtctr r0 86 1.1 mrg bne cr0, L(n00) 87 1.1 mrg 88 1.1 mrg lwzx r7, r4, r3 C n = 4, 8, 12, ... 89 1.1 mrg lwzx r8, r5, r3 90 1.1 mrg addi r3, r3, 4 91 1.1 mrg lwzx r9, r4, r3 92 1.1 mrg ADCSBC r7, r8, r7 93 1.1 mrg lwzx r10, r5, r3 94 1.1 mrg addi r3, r3, 4 95 1.1 mrg b L(00) 96 1.1 mrg 97 1.1 mrg L(n00): bge cr7, L(n01) 98 1.1 mrg cmpwi cr0, r0, 0 C n = 1, 5, 9, 13, ... 99 1.1 mrg lwzx r0, r4, r3 100 1.1 mrg lwzx r6, r5, r3 101 1.1 mrg addi r3, r3, 4 102 1.1 mrg ADCSBC r0, r6, r0 103 1.1 mrg ble L(ret) 104 1.1 mrg L(gt1): lwzx r7, r4, r3 105 1.1 mrg lwzx r8, r5, r3 106 1.1 mrg addi r3, r3, 4 107 1.1 mrg b L(01) 108 1.1 mrg 109 1.1 mrg L(n10): 110 1.1 mrg lwzx r9, r4, r3 C n = 3, 7, 11, 15, ... 111 1.1 mrg lwzx r10, r5, r3 112 1.1 mrg addi r3, r3, 4 113 1.1 mrg lwzx r11, r4, r3 114 1.1 mrg ADCSBC r9, r10, r9 115 1.1 mrg lwzx r12, r5, r3 116 1.1 mrg addi r3, r3, 4 117 1.1 mrg b L(11) 118 1.1 mrg 119 1.1 mrg L(n01): bne cr7, L(n10) 120 1.1 mrg cmpwi cr0, r0, 0 C n = 2, 6, 10, 14, ... 121 1.1 mrg lwzx r11, r4, r3 122 1.1 mrg lwzx r12, r5, r3 123 1.1 mrg addi r3, r3, 4 124 1.1 mrg lwzx r0, r4, r3 125 1.1 mrg ADCSBC r11, r12, r11 126 1.1 mrg lwzx r6, r5, r3 127 1.1 mrg addi r3, r3, 4 128 1.1 mrg ble cr0, L(end) 129 1.1 mrg 130 1.1 mrg 131 1.1 mrg L(lp): lwzx r7, r4, r3 132 1.1 mrg ADCSBC r0, r6, r0 133 1.1 mrg lwzx r8, r5, r3 134 1.1 mrg stwu r11, 4(r3) 135 1.1 mrg L(01): lwzx r9, r4, r3 136 1.1 mrg ADCSBC r7, r8, r7 137 1.1 mrg lwzx r10, r5, r3 138 1.1 mrg stwu r0, 4(r3) 139 1.1 mrg L(00): lwzx r11, r4, r3 140 1.1 mrg ADCSBC r9, r10, r9 141 1.1 mrg lwzx r12, r5, r3 142 1.1 mrg stwu r7, 4(r3) 143 1.1 mrg L(11): lwzx r0, r4, r3 144 1.1 mrg ADCSBC r11, r12, r11 145 1.1 mrg lwzx r6, r5, r3 146 1.1 mrg stwu r9, 4(r3) 147 1.1 mrg bdnz L(lp) 148 1.1 mrg 149 1.1 mrg L(end): ADCSBC r0, r6, r0 150 1.1 mrg stw r11, 4(r3) 151 1.1 mrg L(ret): stw r0, 8(r3) 152 1.1 mrg IFADD(` li r3, 0 ') 153 1.1 mrg IFADD(` addze r3, r3 ') 154 1.1 mrg IFSUB(` subfe r3, r0, r0') 155 1.1 mrg IFSUB(` neg r3, r3') 156 1.1 mrg blr 157 1.1 mrg EPILOGUE() 158