1 | */* mpn_addmul_1 -- multiply the S1_SIZE long limb vector pointed to by S1_PTR* |

2 | * by S2_LIMB, add the S1_SIZE least significant limbs of the product to the* |

3 | * limb vector pointed to by RES_PTR. Return the most significant limb of* |

4 | * the product, adjusted for carry-out from the addition.* |

5 | |

6 | *Copyright (C) 1992, 1993, 1994, 1996 Free Software Foundation, Inc.* |

7 | |

8 | *This file is part of the GNU MP Library.* |

9 | |

10 | *The GNU MP Library is free software; you can redistribute it and/or modify* |

11 | *it under the terms of the GNU Lesser General Public License as published by* |

12 | *the Free Software Foundation; either version 2.1 of the License, or (at your* |

13 | *option) any later version.* |

14 | |

15 | *The GNU MP Library is distributed in the hope that it will be useful, but* |

16 | *WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY* |

17 | *or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public* |

18 | *License for more details.* |

19 | |

20 | *You should have received a copy of the GNU Lesser General Public License* |

21 | *along with the GNU MP Library; see the file COPYING.LIB. If not, write to* |

22 | *the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,* |

23 | *MA 02111-1307, USA. */* |

24 | |

25 | __#include <config.h>__ |

26 | __#include "gmp-impl.h"__ |

27 | |

28 | mp_limb_t |

29 | mpn_addmul_1 (res_ptr, s1_ptr, s1_size, s2_limb) |

30 | *register* mp_ptr res_ptr; |

31 | *register* mp_srcptr s1_ptr; |

32 | mp_size_t s1_size; |

33 | *register* mp_limb_t s2_limb; |

34 | { |

35 | *register* mp_limb_t cy_limb; |

36 | *register* mp_size_t j; |

37 | *register* mp_limb_t prod_high, prod_low; |

38 | *register* mp_limb_t x; |

39 | |

40 | */* The loop counter and index J goes from -SIZE to -1. This way* |

41 | * the loop becomes faster. */* |

42 | j = -s1_size; |

43 | |

44 | */* Offset the base pointers to compensate for the negative indices. */* |

45 | res_ptr -= j; |

46 | s1_ptr -= j; |

47 | |

48 | cy_limb = `0`; |

49 | **do** |

50 | { |

51 | umul_ppmm (prod_high, prod_low, s1_ptr[j], s2_limb); |

52 | |

53 | prod_low += cy_limb; |

54 | cy_limb = (prod_low < cy_limb) + prod_high; |

55 | |

56 | x = res_ptr[j]; |

57 | prod_low = x + prod_low; |

58 | cy_limb += (prod_low < x); |

59 | res_ptr[j] = prod_low; |

60 | } |

61 | **while** (++j != `0`); |

62 | |

63 | **return** cy_limb; |

64 | } |

65 | |