PageRenderTime 32ms CodeModel.GetById 15ms app.highlight 12ms RepoModel.GetById 2ms app.codeStats 0ms

/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
 38/* This file contains routines that perform vector multiplication.  */
 39
 40#include "mpi-priv.h"
 41#include <unistd.h>
 42
 43#include <stddef.h>
 44/* #include <sys/systeminfo.h> */
 45#include <strings.h>
 46
 47extern void multacc512( 
 48   int             length,        /* doublewords in multiplicand vector. */
 49   const mp_digit *scalaraddr,    /* Address of scalar. */
 50   const mp_digit *multiplicand,  /* The multiplicand vector. */
 51   mp_digit *      result);       /* Where to accumulate the result. */
 52
 53extern void maxpy_little(
 54   int             length,        /* doublewords in multiplicand vector. */
 55   const mp_digit *scalaraddr,    /* Address of scalar. */
 56   const mp_digit *multiplicand,  /* The multiplicand vector. */
 57   mp_digit *      result);       /* Where to accumulate the result. */
 58
 59extern void add_diag_little(
 60   int            length,       /* doublewords in input vector. */
 61   const mp_digit *root,         /* The vector to square. */
 62   mp_digit *      result);      /* Where to accumulate the result. */
 63
 64void 
 65s_mpv_sqr_add_prop(const mp_digit *pa, mp_size a_len, mp_digit *ps)
 66{
 67    add_diag_little(a_len, pa, ps);
 68}
 69
 70#define MAX_STACK_DIGITS 258
 71#define MULTACC512_LEN   (512 / MP_DIGIT_BIT)
 72#define HP_MPY_ADD_FN    (a_len == MULTACC512_LEN ? multacc512 : maxpy_little)
 73
 74/* c = a * b */
 75void 
 76s_mpv_mul_d(const mp_digit *a, mp_size a_len, mp_digit b, mp_digit *c)
 77{
 78    mp_digit x[MAX_STACK_DIGITS];
 79    mp_digit *px = x;
 80    size_t   xSize = 0;
 81
 82    if (a == c) {
 83	if (a_len > MAX_STACK_DIGITS) {
 84	    xSize = sizeof(mp_digit) * (a_len + 2);
 85	    px = malloc(xSize);
 86	    if (!px)
 87		return;
 88	}
 89	memcpy(px, a, a_len * sizeof(*a));
 90	a = px;
 91    }
 92    s_mp_setz(c, a_len + 1);
 93    HP_MPY_ADD_FN(a_len, &b, a, c);
 94    if (px != x && px) {
 95	memset(px, 0, xSize);
 96	free(px);
 97    }
 98}
 99
100/* c += a * b, where a is a_len words long. */
101void     
102s_mpv_mul_d_add(const mp_digit *a, mp_size a_len, mp_digit b, mp_digit *c)
103{
104    c[a_len] = 0;	/* so carry propagation stops here. */
105    HP_MPY_ADD_FN(a_len, &b, a, c);
106}
107
108/* c += a * b, where a is y words long. */
109void     
110s_mpv_mul_d_add_prop(const mp_digit *a, mp_size a_len, mp_digit b, 
111			 mp_digit *c)
112{
113    HP_MPY_ADD_FN(a_len, &b, a, c);
114}
115