Blame nss/lib/freebl/mpi/mulsqr.c

Packit 40b132
/*
Packit 40b132
 * Test whether to include squaring code given the current settings
Packit 40b132
 *
Packit 40b132
 * This Source Code Form is subject to the terms of the Mozilla Public
Packit 40b132
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit 40b132
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit 40b132
Packit 40b132
#include <stdio.h>
Packit 40b132
#include <stdlib.h>
Packit 40b132
#include <limits.h>
Packit 40b132
#include <time.h>
Packit 40b132
Packit 40b132
#define MP_SQUARE 1  /* make sure squaring code is included */
Packit 40b132
Packit 40b132
#include "mpi.h"
Packit 40b132
#include "mpprime.h"
Packit 40b132
Packit 40b132
int main(int argc, char *argv[])
Packit 40b132
{
Packit 40b132
  int           ntests, prec, ix;
Packit 40b132
  unsigned int  seed;
Packit 40b132
  clock_t       start, stop;
Packit 40b132
  double        multime, sqrtime;
Packit 40b132
  mp_int        a, c;
Packit 40b132
Packit 40b132
  seed = (unsigned int)time(NULL);
Packit 40b132
Packit 40b132
  if(argc < 3) {
Packit 40b132
    fprintf(stderr, "Usage: %s <ntests> <nbits>\n", argv[0]);
Packit 40b132
    return 1;
Packit 40b132
  }
Packit 40b132
Packit 40b132
  if((ntests = abs(atoi(argv[1]))) == 0) {
Packit 40b132
    fprintf(stderr, "%s: must request at least 1 test.\n", argv[0]);
Packit 40b132
    return 1;
Packit 40b132
  }
Packit 40b132
  if((prec = abs(atoi(argv[2]))) < CHAR_BIT) {
Packit 40b132
    fprintf(stderr, "%s: must request at least %d bits.\n", argv[0],
Packit 40b132
	    CHAR_BIT);
Packit 40b132
    return 1;
Packit 40b132
  }
Packit 40b132
Packit 40b132
  prec = (prec + (DIGIT_BIT - 1)) / DIGIT_BIT;
Packit 40b132
Packit 40b132
  mp_init_size(&a, prec);
Packit 40b132
  mp_init_size(&c, 2 * prec);
Packit 40b132
Packit 40b132
  /* Test multiplication by self */
Packit 40b132
  srand(seed);
Packit 40b132
  start = clock();
Packit 40b132
  for(ix = 0; ix < ntests; ix++) {
Packit 40b132
    mpp_random_size(&a, prec);
Packit 40b132
    mp_mul(&a, &a, &c);
Packit 40b132
  }
Packit 40b132
  stop = clock();
Packit 40b132
Packit 40b132
  multime = (double)(stop - start) / CLOCKS_PER_SEC;
Packit 40b132
Packit 40b132
  /* Test squaring */
Packit 40b132
  srand(seed);
Packit 40b132
  start = clock();
Packit 40b132
  for(ix = 0; ix < ntests; ix++) {
Packit 40b132
    mpp_random_size(&a, prec);
Packit 40b132
    mp_sqr(&a, &c);
Packit 40b132
  }
Packit 40b132
  stop = clock();
Packit 40b132
Packit 40b132
  sqrtime = (double)(stop - start) / CLOCKS_PER_SEC;
Packit 40b132
Packit 40b132
  printf("Multiply: %.4f\n", multime);
Packit 40b132
  printf("Square:   %.4f\n", sqrtime);
Packit 40b132
  if(multime < sqrtime) {
Packit 40b132
    printf("Speedup:  %.1f%%\n", 100.0 * (1.0 - multime / sqrtime));
Packit 40b132
    printf("Prefer:   multiply\n");
Packit 40b132
  } else {
Packit 40b132
    printf("Speedup:  %.1f%%\n", 100.0 * (1.0 - sqrtime / multime));
Packit 40b132
    printf("Prefer:   square\n");
Packit 40b132
  }
Packit 40b132
Packit 40b132
  mp_clear(&a); mp_clear(&c);
Packit 40b132
  return 0;
Packit 40b132
Packit 40b132
}