1 dnl IBM POWER mpn_submul_1 -- Multiply a limb vector with a limb and subtract
2 dnl the result from a second limb vector.
4 dnl Copyright 1992, 1994, 1999, 2000, 2001 Free Software Foundation, Inc.
6 dnl This file is part of the GNU MP Library.
8 dnl The GNU MP Library is free software; you can redistribute it and/or modify
9 dnl it under the terms of the GNU Lesser General Public License as published
10 dnl by the Free Software Foundation; either version 3 of the License, or (at
11 dnl your option) any later version.
13 dnl The GNU MP Library is distributed in the hope that it will be useful, but
14 dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 dnl License for more details.
18 dnl You should have received a copy of the GNU Lesser General Public License
19 dnl along with the GNU MP Library. If not, see http://www.gnu.org/licenses/.
28 dnl The POWER architecture has no unsigned 32x32->64 bit multiplication
29 dnl instruction. To obtain that operation, we have to use the 32x32->64
30 dnl signed multiplication instruction, and add the appropriate compensation to
31 dnl the high limb of the result. We add the multiplicand if the multiplier
32 dnl has its most significant bit set, and we add the multiplier if the
33 dnl multiplicand has its most significant bit set. We need to preserve the
34 dnl carry flag between each iteration, so we have to compute the compensation
35 dnl carefully (the natural, srai+and doesn't work). Since all POWER can
36 dnl branch in zero cycles, we use conditional branches for the compensation.
38 include(`../config.m4')
41 PROLOGUE(mpn_submul_1)
52 sf 8,11,7 C add res_limb
53 a 11,8,11 C invert cy (r11 is junk)
62 ae 11,0,9 C low limb + old_cy_limb + old cy
64 aze 10,10 C propagate cy to new cy_limb
65 sf 8,11,7 C add res_limb
66 a 11,8,11 C invert cy (r11 is junk)
68 cax 10,10,6 C adjust high limb for negative limb from s1
79 a 11,8,11 C invert cy (r11 is junk)
81 cax 9,9,6 C adjust high limb for negative limb from s1
95 ae 10,10,0 C propagate cy to new cy_limb
96 sf 8,11,7 C add res_limb
97 a 11,8,11 C invert cy (r11 is junk)
99 cax 10,10,6 C adjust high limb for negative limb from s1
108 ae 9,9,0 C propagate cy to new cy_limb
109 sf 8,11,7 C add res_limb
110 a 11,8,11 C invert cy (r11 is junk)
112 cax 9,9,6 C adjust high limb for negative limb from s1
120 EPILOGUE(mpn_submul_1)