- freq->freq = fabs(x[idx]) * norm;
-
- /* get the maximum exec freq */
- ef->max = MAX(ef->max, freq->freq);
-
- /* Get the minimum non-zero execution frequency. */
- if(freq->freq > 0.0)
- ef->min_non_zero = MIN(ef->min_non_zero, freq->freq);
- }
-
- /* compute m and b of the transformation used to convert the doubles into scaled ints */
- {
- double smallest_diff = 1.0;
-
- double l2 = ef->min_non_zero;
- double h2 = ef->max;
- double l1 = 1.0;
- double h1 = MAX_INT_FREQ;
-
- double *fs = malloc(set_count(freqs) * sizeof(fs[0]));
- int i, j, n = 0;
-
- set_foreach(freqs, freq)
- fs[n++] = freq->freq;
-
- /*
- * find the smallest difference of the execution frequencies
- * we try to ressolve it with 1 integer.
- */
- for(i = 0; i < n; ++i) {
- if(fs[i] <= 0.0)
- continue;
-
- for(j = i + 1; j < n; ++j) {
- double diff = fabs(fs[i] - fs[j]);
-
- if(!UNDEF(diff))
- smallest_diff = MIN(diff, smallest_diff);
- }
- }
-
- /* according to that the slope of the translation function is 1.0 / smallest diff */
- ef->m = 1.0 / smallest_diff;
-
- /* the abscissa is then given by */
- ef->b = l1 - ef->m * l2;
-
- /*
- * if the slope is so high that the largest integer would be larger than MAX_INT_FREQ
- * set the largest int freq to that upper limit and recompute the translation function
- */
- if(ef->m * h2 + ef->b > MAX_INT_FREQ) {
- ef->m = (h1 - l1) / (h2 - l2);
- ef->b = l1 - ef->m * l2;
- }
-
- free(fs);