diff options
-rw-r--r-- | bench/MathBench.cpp | 44 | ||||
-rw-r--r-- | include/core/SkFixed.h | 5 |
2 files changed, 48 insertions, 1 deletions
diff --git a/bench/MathBench.cpp b/bench/MathBench.cpp index 5b46d1c704..e0d519407f 100644 --- a/bench/MathBench.cpp +++ b/bench/MathBench.cpp @@ -545,6 +545,50 @@ private: /////////////////////////////////////////////////////////////////////////////// +class DivBitsBench : public Benchmark { +protected: + enum { + N = 1000 + }; + volatile int32_t fSrc[N], fDst[N]; +public: + DivBitsBench() { + SkRandom rand; + for (int i = 0; i < N; ++i) { + fSrc[i] = rand.nextU(); + } + } +protected: + virtual void onDraw(const int loops, SkCanvas*) { + for (int j = 0; j < loops; ++j) { + for (int i = 0; i < N - 4; ++i) { + fDst[i] = SkDivBits(fSrc[i], fSrc[i] >> 3, 16); + } + } + } + virtual const char* onGetName() { + return "divbits"; + } +}; +DEF_BENCH( return new DivBitsBench; ) + +class FixedDivBench : public DivBitsBench { +protected: + virtual void onDraw(const int loops, SkCanvas*) { + for (int j = 0; j < loops; ++j) { + for (int i = 0; i < N - 4; ++i) { + fDst[i] = SkFixedDiv(fSrc[i], fSrc[i] >> 3); + } + } + } + virtual const char* onGetName() { + return "fixeddiv"; + } +}; +DEF_BENCH( return new FixedDivBench; ) + +/////////////////////////////////////////////////////////////////////////////// + template <typename T> class DivModBench : public Benchmark { SkString fName; diff --git a/include/core/SkFixed.h b/include/core/SkFixed.h index 8cf7a5679c..f920fea736 100644 --- a/include/core/SkFixed.h +++ b/include/core/SkFixed.h @@ -78,7 +78,10 @@ typedef int32_t SkFixed; #define SkFixedAbs(x) SkAbs32(x) #define SkFixedAve(a, b) (((a) + (b)) >> 1) -#define SkFixedDiv(numer, denom) SkDivBits(numer, denom, 16) +static inline int32_t SkFixedDiv(int32_t numer, int32_t denom) { + int64_t tmp = ((int64_t)numer << 16) / denom; + return (int32_t)tmp; +} ////////////////////////////////////////////////////////////////////////////////////////////////////// // Now look for ASM overrides for our portable versions (should consider putting this in its own file) |