| Index: bench/MathBench.cpp | 
| diff --git a/bench/MathBench.cpp b/bench/MathBench.cpp | 
| index 32a89d64efd9263033207ad9757c00d6361a1dc1..c2b600c2a60686381682da184bfea8d33c12af53 100644 | 
| --- a/bench/MathBench.cpp | 
| +++ b/bench/MathBench.cpp | 
| @@ -93,44 +93,58 @@ private: | 
| typedef MathBench INHERITED; | 
| }; | 
|  | 
| -class SlowISqrtMathBench : public MathBench { | 
| +class InvSqrtBench : public SkBenchmark { | 
| +    enum { | 
| +        ARRAY = SkBENCHLOOP(1000), | 
| +        LOOP = SkBENCHLOOP(5000), | 
| +    }; | 
| +    float fData[ARRAY]; | 
| +    const char *type; | 
| + | 
| public: | 
| -    SlowISqrtMathBench(void* param) : INHERITED(param, "slowIsqrt") {} | 
| +    InvSqrtBench(void* param, const char *type) | 
| +        : INHERITED(param) | 
| +        , type(type) { | 
| +    } | 
| + | 
| +    // just so the compiler doesn't remove our loops | 
| +    virtual void process(int) {} | 
| + | 
| protected: | 
| -    virtual void performTest(float* SK_RESTRICT dst, | 
| -                              const float* SK_RESTRICT src, | 
| -                              int count) { | 
| -        for (int i = 0; i < count; ++i) { | 
| -            dst[i] = 1.0f / sk_float_sqrt(src[i]); | 
| +    virtual void onPreDraw() SK_OVERRIDE { | 
| +        SkRandom rand; | 
| +        for (int i = 0; i < ARRAY; ++i) { | 
| +            fData[i] = rand.nextRangeF(0, 10000); | 
| } | 
| + | 
| +        fIsRendering = false; | 
| } | 
| -private: | 
| -    typedef MathBench INHERITED; | 
| -}; | 
|  | 
| -static inline float SkFastInvSqrt(float x) { | 
| -    float xhalf = 0.5f*x; | 
| -    int i = *SkTCast<int*>(&x); | 
| -    i = 0x5f3759df - (i>>1); | 
| -    x = *SkTCast<float*>(&i); | 
| -    x = x*(1.5f-xhalf*x*x); | 
| -//    x = x*(1.5f-xhalf*x*x); // this line takes err from 10^-3 to 10^-6 | 
| -    return x; | 
| -} | 
| +    virtual void onDraw(SkCanvas*) { | 
| +        float accum = 0; | 
|  | 
| -class FastISqrtMathBench : public MathBench { | 
| -public: | 
| -    FastISqrtMathBench(void* param) : INHERITED(param, "fastIsqrt") {} | 
| -protected: | 
| -    virtual void performTest(float* SK_RESTRICT dst, | 
| -                              const float* SK_RESTRICT src, | 
| -                              int count) { | 
| -        for (int i = 0; i < count; ++i) { | 
| -            dst[i] = SkFastInvSqrt(src[i]); | 
| +        if (strcmp(type, "float_slow") == 0) { | 
| +            for (int j = 0; j < LOOP; ++j) | 
| +                for (int i = 0; i < ARRAY; ++i) | 
| +                    accum += 1.0f / sk_float_sqrt(fData[i]); | 
| +        } else if (strcmp(type, "float_fast") == 0) { | 
| +            for (int j = 0; j < LOOP; ++j) | 
| +                for (int i = 0; i < ARRAY; ++i) | 
| +                    accum += SkFloatInvSqrt(fData[i]); | 
| } | 
| + | 
| +        this->process(accum); | 
| +    } | 
| + | 
| +    virtual const char* onGetName() { | 
| +        fName.printf("math_inv_sqrt"); | 
| +        fName.appendf("_%s", type); | 
| +        return fName.c_str(); | 
| } | 
| + | 
| private: | 
| -    typedef MathBench INHERITED; | 
| +    SkString    fName; | 
| +    typedef SkBenchmark INHERITED; | 
| }; | 
|  | 
| static inline uint32_t QMul64(uint32_t value, U8CPU alpha) { | 
| @@ -523,8 +537,8 @@ private: | 
| /////////////////////////////////////////////////////////////////////////////// | 
|  | 
| DEF_BENCH( return new NoOpMathBench(p); ) | 
| -DEF_BENCH( return new SlowISqrtMathBench(p); ) | 
| -DEF_BENCH( return new FastISqrtMathBench(p); ) | 
| +DEF_BENCH( return new InvSqrtBench(p, "float_slow"); ) | 
| +DEF_BENCH( return new InvSqrtBench(p, "float_fast"); ) | 
| DEF_BENCH( return new QMul64Bench(p); ) | 
| DEF_BENCH( return new QMul32Bench(p); ) | 
|  | 
|  |