Optimized reltime_to_me
authorSven-Ola Tuecke <sven-ola@gmx.de>
Sat, 13 Dec 2008 17:28:39 +0000 (18:28 +0100)
committerSven-Ola Tuecke <sven-ola@gmx.de>
Sat, 13 Dec 2008 17:28:39 +0000 (18:28 +0100)
Makefile.inc
src/mantissa.c

index 97cb799..abc90b9 100644 (file)
@@ -160,7 +160,6 @@ LDFLAGS +=  $(EXTRA_LDFLAGS)
 CPPFLAGS +=    -DSUPPORT_OLD_PLUGIN_VERSIONS=0
 
 # use the new fixed point math stuff
-#CPPFLAGS +=     -DUSE_FPM
 ifneq ($(USE_FPM),0)
 CPPFLAGS +=    -DUSE_FPM=1
 else
index 6058947..b971408 100644 (file)
@@ -55,7 +55,7 @@
  *@return a 8-bit mantissa/exponent product
  */
 uint8_t reltime_to_me(const olsr_reltime interval) {
-  uint8_t a, b;
+  uint8_t a = 0, b = 0;                /* Underflow defaults */
 
   /* It is sufficent to compare the integer part since we test on >=.
    * So we have now only a floating point division and the rest of the loop
@@ -68,62 +68,23 @@ uint8_t reltime_to_me(const olsr_reltime interval) {
    * => unscaled_interval = interval(ms) / 1000 * 16
    *                      = interval(ms) / 125 * 2
    */
-  const unsigned int unscaled_interval = interval / 125 * 2;
-  b = 0;
-  while (unscaled_interval >= (1U << b)) {
+
+  unsigned unscaled_interval = interval;
+  while (unscaled_interval >= 62) {
+    unscaled_interval >>= 1;
     b++;
   }
 
-  if (b == 0) {
-    a = 1;
-    b = 0;
-  } else {
-    b--;
-    if (b > 15) {
-      a = 15;
+  if (0 < b) {
+    if (15 < --b) {
+      a = 15;                   /* Overflow defaults */
       b = 15;
     } else {
-      /* And again some maths simplification from the former version:
-       *    a = 16 * ((double)interval / (VTIME_SCALE_FACTOR * (double)(1 << b)) - 1)
-       * Since interval is already double:
-       *    a = 16 * (interval / (VTIME_SCALE_FACTOR * (double)(1 << b)) - 1)
-       * first, we can get rid of parentheses and change the * to a /
-       *    a = 16 * (interval / VTIME_SCALE_FACTOR / (double)(1 << b) - 1)
-       * then we make an integer addition from the floating point addition
-       *    a = (int)(16.0 * interval / VTIME_SCALE_FACTOR / (double)(1 << b)) - 16
-       * and we loose an unnecessary cast
-       *    a = (int)(16.0 * interval / VTIME_SCALE_FACTOR / (1 << b)) - 16
-       *
-       * VTIME_SCALE_FACTOR = 1/16
-       *
-       * => a = (16 * interval(ms) / 1000 * 16 / (1 << b)) - 16
-       *      = (interval(ms) * 256 / 1000 / (1 << b)) - 16
-       *      = (interval(ms) * 32 / 125 / (1<<b)) - 16
-       *      = (interval(ms) - 16/32*125*(1<<b)) * 32 / 125 / (1<<b)
-       *      = (interval(ms) - 125*(1<<(b-1))) * 32 / 125 / (1<<b)
-       *
-       * 1. case: b >= 5
-       *      = (interval(ms) - (125 << (b-1))) / 125 / (1 << (b-5))
-       *      = (interval(ms) - (125 << (b-1))) / (125  << (b-5))
-       *
-       * 2. case: b <= 5
-       *      = (interval(ms) - (125 << (b-1))) / 125 * (1 << (5-b))
-       *      = (interval(ms) - (125 << (b-1))) * (1 << (5-b)) / 125
-       */
-
-      if (b >= 5) {
-        a = (interval - (125 << (b-1))) / (125 << (b-5));
-      }
-      else {
-        a = (interval - (125 << (b-1))) * (1 << (5-b)) / 125;
-      }
-
-      b += a >> 4;
-      a &= 0x0f;
+      a = (interval >> (b + 2)) - 15;
     }
   }
-
-  return (a << 4) | (b & 0x0F);
+  
+  return (a << 4) + b;
 }
 
 /**