/security/nss/lib/freebl/mpi/mpi_hp.c

http://github.com/zpao/v8monkey · C · 115 lines · 61 code · 13 blank · 41 comment · 8 complexity · bd9495a2409bf2304e06303dc6b76764 MD5 · raw file

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3. *
  4. * The contents of this file are subject to the Mozilla Public License Version
  5. * 1.1 (the "License"); you may not use this file except in compliance with
  6. * the License. You may obtain a copy of the License at
  7. * http://www.mozilla.org/MPL/
  8. *
  9. * Software distributed under the License is distributed on an "AS IS" basis,
  10. * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11. * for the specific language governing rights and limitations under the
  12. * License.
  13. *
  14. * The Original Code is the Netscape security libraries.
  15. *
  16. * The Initial Developer of the Original Code is
  17. * Netscape Communications Corporation.
  18. * Portions created by the Initial Developer are Copyright (C) 2000
  19. * the Initial Developer. All Rights Reserved.
  20. *
  21. * Contributor(s):
  22. *
  23. * Alternatively, the contents of this file may be used under the terms of
  24. * either the GNU General Public License Version 2 or later (the "GPL"), or
  25. * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  26. * in which case the provisions of the GPL or the LGPL are applicable instead
  27. * of those above. If you wish to allow use of your version of this file only
  28. * under the terms of either the GPL or the LGPL, and not to allow others to
  29. * use your version of this file under the terms of the MPL, indicate your
  30. * decision by deleting the provisions above and replace them with the notice
  31. * and other provisions required by the GPL or the LGPL. If you do not delete
  32. * the provisions above, a recipient may use your version of this file under
  33. * the terms of any one of the MPL, the GPL or the LGPL.
  34. *
  35. * ***** END LICENSE BLOCK ***** */
  36. /* $Id: mpi_hp.c,v 1.5 2004/04/27 23:04:36 gerv%gerv.net Exp $ */
  37. /* This file contains routines that perform vector multiplication. */
  38. #include "mpi-priv.h"
  39. #include <unistd.h>
  40. #include <stddef.h>
  41. /* #include <sys/systeminfo.h> */
  42. #include <strings.h>
  43. extern void multacc512(
  44. int length, /* doublewords in multiplicand vector. */
  45. const mp_digit *scalaraddr, /* Address of scalar. */
  46. const mp_digit *multiplicand, /* The multiplicand vector. */
  47. mp_digit * result); /* Where to accumulate the result. */
  48. extern void maxpy_little(
  49. int length, /* doublewords in multiplicand vector. */
  50. const mp_digit *scalaraddr, /* Address of scalar. */
  51. const mp_digit *multiplicand, /* The multiplicand vector. */
  52. mp_digit * result); /* Where to accumulate the result. */
  53. extern void add_diag_little(
  54. int length, /* doublewords in input vector. */
  55. const mp_digit *root, /* The vector to square. */
  56. mp_digit * result); /* Where to accumulate the result. */
  57. void
  58. s_mpv_sqr_add_prop(const mp_digit *pa, mp_size a_len, mp_digit *ps)
  59. {
  60. add_diag_little(a_len, pa, ps);
  61. }
  62. #define MAX_STACK_DIGITS 258
  63. #define MULTACC512_LEN (512 / MP_DIGIT_BIT)
  64. #define HP_MPY_ADD_FN (a_len == MULTACC512_LEN ? multacc512 : maxpy_little)
  65. /* c = a * b */
  66. void
  67. s_mpv_mul_d(const mp_digit *a, mp_size a_len, mp_digit b, mp_digit *c)
  68. {
  69. mp_digit x[MAX_STACK_DIGITS];
  70. mp_digit *px = x;
  71. size_t xSize = 0;
  72. if (a == c) {
  73. if (a_len > MAX_STACK_DIGITS) {
  74. xSize = sizeof(mp_digit) * (a_len + 2);
  75. px = malloc(xSize);
  76. if (!px)
  77. return;
  78. }
  79. memcpy(px, a, a_len * sizeof(*a));
  80. a = px;
  81. }
  82. s_mp_setz(c, a_len + 1);
  83. HP_MPY_ADD_FN(a_len, &b, a, c);
  84. if (px != x && px) {
  85. memset(px, 0, xSize);
  86. free(px);
  87. }
  88. }
  89. /* c += a * b, where a is a_len words long. */
  90. void
  91. s_mpv_mul_d_add(const mp_digit *a, mp_size a_len, mp_digit b, mp_digit *c)
  92. {
  93. c[a_len] = 0; /* so carry propagation stops here. */
  94. HP_MPY_ADD_FN(a_len, &b, a, c);
  95. }
  96. /* c += a * b, where a is y words long. */
  97. void
  98. s_mpv_mul_d_add_prop(const mp_digit *a, mp_size a_len, mp_digit b,
  99. mp_digit *c)
  100. {
  101. HP_MPY_ADD_FN(a_len, &b, a, c);
  102. }