Index: bench/MathBench.cpp |
diff --git a/bench/MathBench.cpp b/bench/MathBench.cpp |
index c34be44303c3fe0609eb11bd4c7565ccaa95b801..260159f3f0ebf58b513f1f16fb53e406130e9f1f 100644 |
--- a/bench/MathBench.cpp |
+++ b/bench/MathBench.cpp |
@@ -512,6 +512,42 @@ private: |
/////////////////////////////////////////////////////////////////////////////// |
+template <typename T> |
+class DivModBench : public SkBenchmark { |
+ const char* fName; |
+public: |
+ explicit DivModBench(const char* name) : fName(name) { |
+ fIsRendering = false; |
+ } |
+ |
+protected: |
+ virtual const char* onGetName() { |
+ return SkStringPrintf("divmod_%s", fName).c_str(); |
+ } |
+ |
+ virtual void onDraw(SkCanvas*) { |
+ volatile T a = 0, b = 0; |
+ T div = 0, mod = 0; |
+ for (int i = 0; i < this->getLoops(); i++) { |
+ if ((T)i == 0) continue; // Small T will wrap around. |
+ SkTDivMod((T)(i+1), (T)i, &div, &mod); |
+ a ^= div; |
+ b ^= mod; |
+ } |
+ } |
+}; |
+DEF_BENCH(return new DivModBench<uint8_t>("uint8_t")) |
+DEF_BENCH(return new DivModBench<uint16_t>("uint16_t")) |
+DEF_BENCH(return new DivModBench<uint32_t>("uint32_t")) |
+DEF_BENCH(return new DivModBench<uint64_t>("uint64_t")) |
+ |
+DEF_BENCH(return new DivModBench<int8_t>("int8_t")) |
+DEF_BENCH(return new DivModBench<int16_t>("int16_t")) |
+DEF_BENCH(return new DivModBench<int32_t>("int32_t")) |
+DEF_BENCH(return new DivModBench<int64_t>("int64_t")) |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
DEF_BENCH( return new NoOpMathBench(); ) |
DEF_BENCH( return new SlowISqrtMathBench(); ) |
DEF_BENCH( return new FastISqrtMathBench(); ) |