Home | History | Annotate | Download | only in sunspider-1.0
      1 /*
      2  * Copyright (C) Rich Moore.  All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY CONTRIBUTORS ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 /////. Start CORDIC
     27 
     28 var AG_CONST = 0.6072529350;
     29 
     30 function FIXED(X)
     31 {
     32   return X * 65536.0;
     33 }
     34 
     35 function FLOAT(X)
     36 {
     37   return X / 65536.0;
     38 }
     39 
     40 function DEG2RAD(X)
     41 {
     42   return 0.017453 * (X);
     43 }
     44 
     45 var Angles = [
     46   FIXED(45.0), FIXED(26.565), FIXED(14.0362), FIXED(7.12502),
     47   FIXED(3.57633), FIXED(1.78991), FIXED(0.895174), FIXED(0.447614),
     48   FIXED(0.223811), FIXED(0.111906), FIXED(0.055953),
     49   FIXED(0.027977)
     50               ];
     51 
     52 var Target = 28.027;
     53 
     54 function cordicsincos(Target) {
     55     var X;
     56     var Y;
     57     var TargetAngle;
     58     var CurrAngle;
     59     var Step;
     60 
     61     X = FIXED(AG_CONST);         /* AG_CONST * cos(0) */
     62     Y = 0;                       /* AG_CONST * sin(0) */
     63 
     64     TargetAngle = FIXED(Target);
     65     CurrAngle = 0;
     66     for (Step = 0; Step < 12; Step++) {
     67         var NewX;
     68         if (TargetAngle > CurrAngle) {
     69             NewX = X - (Y >> Step);
     70             Y = (X >> Step) + Y;
     71             X = NewX;
     72             CurrAngle += Angles[Step];
     73         } else {
     74             NewX = X + (Y >> Step);
     75             Y = -(X >> Step) + Y;
     76             X = NewX;
     77             CurrAngle -= Angles[Step];
     78         }
     79     }
     80 
     81     return FLOAT(X) * FLOAT(Y);
     82 }
     83 
     84 ///// End CORDIC
     85 
     86 var total = 0;
     87 
     88 function cordic( runs ) {
     89   var start = new Date();
     90 
     91   for ( var i = 0 ; i < runs ; i++ ) {
     92       total += cordicsincos(Target);
     93   }
     94 
     95   var end = new Date();
     96 
     97   return end.getTime() - start.getTime();
     98 }
     99 
    100 cordic(25000);
    101