/* Copyright (C) 2021-2024 Free Software Foundation, Inc. Contributed by Oracle. This file is part of GNU Binutils. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include "stopwatch.h" /* The random number generator below is adapted from Kernighan and Ritchie, * "C Programming Language", Second Edition, p. 46. */ #define IA 1103515245u #define IC 12345u #define IM 2147483648u static unsigned int current_random = 1; static int my_irand (int imax) { /* Create a random integer between 0 and imax, inclusive. i.e. [0..imax] */ /* Use overflow to wrap */ current_random = current_random * IA + IC; int ival = current_random & (IM - 1); /* Modulus */ ival = (int) ((float) ival * (float) (imax + 0.999) / (float) IM); return ival; } #define N 6000000 int fitos (int n) { int i, k, retv; hrtime_t start = gethrtime (); hrtime_t vstart = gethrvtime (); /* Log the event */ wlog ("start of fitos", NULL); if (n <= 0) n = 1; int max = N * n; long long count = 0; do { for (current_random = 1, i = retv = k = 0; i < max; i++) { retv += my_irand (100); k += (current_random & (IM - 1)) >= (1 << 22); } count++; } while (start + testtime * 1e9 > gethrtime ()); fprintf (stderr, "\t\t%d out of a total of %d >= 2^22 (%d)\n", k, max, retv); fprintf (stderr, " Performed %lld while-loop iterations\n", count); whrvlog ((gethrtime () - start), (gethrvtime () - vstart), "fitos", NULL); return 0; }