OLD | NEW |
| 1 /* |
| 2 * Copyright 2015 Google Inc. |
| 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. |
| 6 */ |
| 7 |
1 #include "Benchmark.h" | 8 #include "Benchmark.h" |
2 #include "SkColorPriv.h" | 9 #include "SkColorPriv.h" |
3 #include "SkMatrix.h" | 10 #include "SkMatrix.h" |
4 #include "SkPaint.h" | 11 #include "SkPaint.h" |
5 #include "SkRandom.h" | 12 #include "SkRandom.h" |
6 #include "SkString.h" | 13 #include "SkString.h" |
7 | 14 |
8 static float sk_fsel(float pred, float result_ge, float result_lt) { | 15 static float sk_fsel(float pred, float result_ge, float result_lt) { |
9 return pred >= 0 ? result_ge : result_lt; | 16 return pred >= 0 ? result_ge : result_lt; |
10 } | 17 } |
(...skipping 24 matching lines...) Expand all Loading... |
35 return backend == kNonRendering_Backend; | 42 return backend == kNonRendering_Backend; |
36 } | 43 } |
37 | 44 |
38 virtual void performTest(float* SK_RESTRICT dst, | 45 virtual void performTest(float* SK_RESTRICT dst, |
39 const float* SK_RESTRICT src, | 46 const float* SK_RESTRICT src, |
40 int count) = 0; | 47 int count) = 0; |
41 | 48 |
42 protected: | 49 protected: |
43 virtual int mulLoopCount() const { return 1; } | 50 virtual int mulLoopCount() const { return 1; } |
44 | 51 |
45 virtual const char* onGetName() { | 52 const char* onGetName() override { |
46 return fName.c_str(); | 53 return fName.c_str(); |
47 } | 54 } |
48 | 55 |
49 virtual void onDraw(const int loops, SkCanvas*) { | 56 void onDraw(const int loops, SkCanvas*) override { |
50 int n = loops * this->mulLoopCount(); | 57 int n = loops * this->mulLoopCount(); |
51 for (int i = 0; i < n; i++) { | 58 for (int i = 0; i < n; i++) { |
52 this->performTest(fDst, fSrc, kBuffer); | 59 this->performTest(fDst, fSrc, kBuffer); |
53 } | 60 } |
54 } | 61 } |
55 | 62 |
56 private: | 63 private: |
57 typedef Benchmark INHERITED; | 64 typedef Benchmark INHERITED; |
58 }; | 65 }; |
59 | 66 |
60 class MathBenchU32 : public MathBench { | 67 class MathBenchU32 : public MathBench { |
61 public: | 68 public: |
62 MathBenchU32(const char name[]) : INHERITED(name) {} | 69 MathBenchU32(const char name[]) : INHERITED(name) {} |
63 | 70 |
64 protected: | 71 protected: |
65 virtual void performITest(uint32_t* SK_RESTRICT dst, | 72 virtual void performITest(uint32_t* SK_RESTRICT dst, |
66 const uint32_t* SK_RESTRICT src, | 73 const uint32_t* SK_RESTRICT src, |
67 int count) = 0; | 74 int count) = 0; |
68 | 75 |
69 virtual void performTest(float* SK_RESTRICT dst, | 76 void performTest(float* SK_RESTRICT dst, const float* SK_RESTRICT src, int c
ount) override { |
70 const float* SK_RESTRICT src, | |
71 int count) override { | |
72 uint32_t* d = SkTCast<uint32_t*>(dst); | 77 uint32_t* d = SkTCast<uint32_t*>(dst); |
73 const uint32_t* s = SkTCast<const uint32_t*>(src); | 78 const uint32_t* s = SkTCast<const uint32_t*>(src); |
74 this->performITest(d, s, count); | 79 this->performITest(d, s, count); |
75 } | 80 } |
76 private: | 81 private: |
77 typedef MathBench INHERITED; | 82 typedef MathBench INHERITED; |
78 }; | 83 }; |
79 | 84 |
80 /////////////////////////////////////////////////////////////////////////////// | 85 /////////////////////////////////////////////////////////////////////////////// |
81 | 86 |
82 class NoOpMathBench : public MathBench { | 87 class NoOpMathBench : public MathBench { |
83 public: | 88 public: |
84 NoOpMathBench() : INHERITED("noOp") {} | 89 NoOpMathBench() : INHERITED("noOp") {} |
85 protected: | 90 protected: |
86 virtual void performTest(float* SK_RESTRICT dst, | 91 void performTest(float* SK_RESTRICT dst, const float* SK_RESTRICT src, int c
ount) override { |
87 const float* SK_RESTRICT src, | |
88 int count) { | |
89 for (int i = 0; i < count; ++i) { | 92 for (int i = 0; i < count; ++i) { |
90 dst[i] = src[i] + 1; | 93 dst[i] = src[i] + 1; |
91 } | 94 } |
92 } | 95 } |
93 private: | 96 private: |
94 typedef MathBench INHERITED; | 97 typedef MathBench INHERITED; |
95 }; | 98 }; |
96 | 99 |
97 class SkRSqrtMathBench : public MathBench { | 100 class SkRSqrtMathBench : public MathBench { |
98 public: | 101 public: |
99 SkRSqrtMathBench() : INHERITED("sk_float_rsqrt") {} | 102 SkRSqrtMathBench() : INHERITED("sk_float_rsqrt") {} |
100 protected: | 103 protected: |
101 virtual void performTest(float* SK_RESTRICT dst, | 104 void performTest(float* SK_RESTRICT dst, const float* SK_RESTRICT src, int c
ount) override { |
102 const float* SK_RESTRICT src, | |
103 int count) { | |
104 for (int i = 0; i < count; ++i) { | 105 for (int i = 0; i < count; ++i) { |
105 dst[i] = sk_float_rsqrt(src[i]); | 106 dst[i] = sk_float_rsqrt(src[i]); |
106 } | 107 } |
107 } | 108 } |
108 private: | 109 private: |
109 typedef MathBench INHERITED; | 110 typedef MathBench INHERITED; |
110 }; | 111 }; |
111 | 112 |
112 | 113 |
113 class SlowISqrtMathBench : public MathBench { | 114 class SlowISqrtMathBench : public MathBench { |
114 public: | 115 public: |
115 SlowISqrtMathBench() : INHERITED("slowIsqrt") {} | 116 SlowISqrtMathBench() : INHERITED("slowIsqrt") {} |
116 protected: | 117 protected: |
117 virtual void performTest(float* SK_RESTRICT dst, | 118 void performTest(float* SK_RESTRICT dst, const float* SK_RESTRICT src, int c
ount) override { |
118 const float* SK_RESTRICT src, | |
119 int count) { | |
120 for (int i = 0; i < count; ++i) { | 119 for (int i = 0; i < count; ++i) { |
121 dst[i] = 1.0f / sk_float_sqrt(src[i]); | 120 dst[i] = 1.0f / sk_float_sqrt(src[i]); |
122 } | 121 } |
123 } | 122 } |
124 private: | 123 private: |
125 typedef MathBench INHERITED; | 124 typedef MathBench INHERITED; |
126 }; | 125 }; |
127 | 126 |
128 static inline float SkFastInvSqrt(float x) { | 127 static inline float SkFastInvSqrt(float x) { |
129 float xhalf = 0.5f*x; | 128 float xhalf = 0.5f*x; |
130 int i = *SkTCast<int*>(&x); | 129 int i = *SkTCast<int*>(&x); |
131 i = 0x5f3759df - (i>>1); | 130 i = 0x5f3759df - (i>>1); |
132 x = *SkTCast<float*>(&i); | 131 x = *SkTCast<float*>(&i); |
133 x = x*(1.5f-xhalf*x*x); | 132 x = x*(1.5f-xhalf*x*x); |
134 // x = x*(1.5f-xhalf*x*x); // this line takes err from 10^-3 to 10^-6 | 133 // x = x*(1.5f-xhalf*x*x); // this line takes err from 10^-3 to 10^-6 |
135 return x; | 134 return x; |
136 } | 135 } |
137 | 136 |
138 class FastISqrtMathBench : public MathBench { | 137 class FastISqrtMathBench : public MathBench { |
139 public: | 138 public: |
140 FastISqrtMathBench() : INHERITED("fastIsqrt") {} | 139 FastISqrtMathBench() : INHERITED("fastIsqrt") {} |
141 protected: | 140 protected: |
142 virtual void performTest(float* SK_RESTRICT dst, | 141 void performTest(float* SK_RESTRICT dst, const float* SK_RESTRICT src, int c
ount) override { |
143 const float* SK_RESTRICT src, | |
144 int count) { | |
145 for (int i = 0; i < count; ++i) { | 142 for (int i = 0; i < count; ++i) { |
146 dst[i] = SkFastInvSqrt(src[i]); | 143 dst[i] = SkFastInvSqrt(src[i]); |
147 } | 144 } |
148 } | 145 } |
149 private: | 146 private: |
150 typedef MathBench INHERITED; | 147 typedef MathBench INHERITED; |
151 }; | 148 }; |
152 | 149 |
153 static inline uint32_t QMul64(uint32_t value, U8CPU alpha) { | 150 static inline uint32_t QMul64(uint32_t value, U8CPU alpha) { |
154 SkASSERT((uint8_t)alpha == alpha); | 151 SkASSERT((uint8_t)alpha == alpha); |
155 const uint32_t mask = 0xFF00FF; | 152 const uint32_t mask = 0xFF00FF; |
156 | 153 |
157 uint64_t tmp = value; | 154 uint64_t tmp = value; |
158 tmp = (tmp & mask) | ((tmp & ~mask) << 24); | 155 tmp = (tmp & mask) | ((tmp & ~mask) << 24); |
159 tmp *= alpha; | 156 tmp *= alpha; |
160 return (uint32_t) (((tmp >> 8) & mask) | ((tmp >> 32) & ~mask)); | 157 return (uint32_t) (((tmp >> 8) & mask) | ((tmp >> 32) & ~mask)); |
161 } | 158 } |
162 | 159 |
163 class QMul64Bench : public MathBenchU32 { | 160 class QMul64Bench : public MathBenchU32 { |
164 public: | 161 public: |
165 QMul64Bench() : INHERITED("qmul64") {} | 162 QMul64Bench() : INHERITED("qmul64") {} |
166 protected: | 163 protected: |
167 virtual void performITest(uint32_t* SK_RESTRICT dst, | 164 void performITest(uint32_t* SK_RESTRICT dst, |
168 const uint32_t* SK_RESTRICT src, | 165 const uint32_t* SK_RESTRICT src, |
169 int count) override { | 166 int count) override { |
170 for (int i = 0; i < count; ++i) { | 167 for (int i = 0; i < count; ++i) { |
171 dst[i] = QMul64(src[i], (uint8_t)i); | 168 dst[i] = QMul64(src[i], (uint8_t)i); |
172 } | 169 } |
173 } | 170 } |
174 private: | 171 private: |
175 typedef MathBenchU32 INHERITED; | 172 typedef MathBenchU32 INHERITED; |
176 }; | 173 }; |
177 | 174 |
178 class QMul32Bench : public MathBenchU32 { | 175 class QMul32Bench : public MathBenchU32 { |
179 public: | 176 public: |
180 QMul32Bench() : INHERITED("qmul32") {} | 177 QMul32Bench() : INHERITED("qmul32") {} |
181 protected: | 178 protected: |
182 virtual void performITest(uint32_t* SK_RESTRICT dst, | 179 void performITest(uint32_t* SK_RESTRICT dst, |
183 const uint32_t* SK_RESTRICT src, | 180 const uint32_t* SK_RESTRICT src, |
184 int count) override { | 181 int count) override { |
185 for (int i = 0; i < count; ++i) { | 182 for (int i = 0; i < count; ++i) { |
186 dst[i] = SkAlphaMulQ(src[i], (uint8_t)i); | 183 dst[i] = SkAlphaMulQ(src[i], (uint8_t)i); |
187 } | 184 } |
188 } | 185 } |
189 private: | 186 private: |
190 typedef MathBenchU32 INHERITED; | 187 typedef MathBenchU32 INHERITED; |
191 }; | 188 }; |
192 | 189 |
193 /////////////////////////////////////////////////////////////////////////////// | 190 /////////////////////////////////////////////////////////////////////////////// |
194 | 191 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 fProc = gRec[index].fProc; | 280 fProc = gRec[index].fProc; |
284 fName = gRec[index].fName; | 281 fName = gRec[index].fName; |
285 } | 282 } |
286 } | 283 } |
287 | 284 |
288 bool isSuitableFor(Backend backend) override { | 285 bool isSuitableFor(Backend backend) override { |
289 return backend == kNonRendering_Backend; | 286 return backend == kNonRendering_Backend; |
290 } | 287 } |
291 | 288 |
292 protected: | 289 protected: |
293 virtual void onDraw(const int loops, SkCanvas*) { | 290 void onDraw(const int loops, SkCanvas*) override { |
294 IsFiniteProc proc = fProc; | 291 IsFiniteProc proc = fProc; |
295 const float* data = fData; | 292 const float* data = fData; |
296 // do this so the compiler won't throw away the function call | 293 // do this so the compiler won't throw away the function call |
297 int counter = 0; | 294 int counter = 0; |
298 | 295 |
299 if (proc) { | 296 if (proc) { |
300 for (int j = 0; j < loops; ++j) { | 297 for (int j = 0; j < loops; ++j) { |
301 for (int i = 0; i < N - 4; ++i) { | 298 for (int i = 0; i < N - 4; ++i) { |
302 counter += proc(&data[i]); | 299 counter += proc(&data[i]); |
303 } | 300 } |
304 } | 301 } |
305 } else { | 302 } else { |
306 for (int j = 0; j < loops; ++j) { | 303 for (int j = 0; j < loops; ++j) { |
307 for (int i = 0; i < N - 4; ++i) { | 304 for (int i = 0; i < N - 4; ++i) { |
308 const SkRect* r = reinterpret_cast<const SkRect*>(&data[i]); | 305 const SkRect* r = reinterpret_cast<const SkRect*>(&data[i]); |
309 if (false) { // avoid bit rot, suppress warning | 306 if (false) { // avoid bit rot, suppress warning |
310 isFinite(*r); | 307 isFinite(*r); |
311 } | 308 } |
312 counter += r->isFinite(); | 309 counter += r->isFinite(); |
313 } | 310 } |
314 } | 311 } |
315 } | 312 } |
316 | 313 |
317 SkPaint paint; | 314 SkPaint paint; |
318 if (paint.getAlpha() == 0) { | 315 if (paint.getAlpha() == 0) { |
319 SkDebugf("%d\n", counter); | 316 SkDebugf("%d\n", counter); |
320 } | 317 } |
321 } | 318 } |
322 | 319 |
323 virtual const char* onGetName() { | 320 const char* onGetName() override { |
324 return fName; | 321 return fName; |
325 } | 322 } |
326 | 323 |
327 private: | 324 private: |
328 IsFiniteProc fProc; | 325 IsFiniteProc fProc; |
329 const char* fName; | 326 const char* fName; |
330 | 327 |
331 typedef Benchmark INHERITED; | 328 typedef Benchmark INHERITED; |
332 }; | 329 }; |
333 | 330 |
(...skipping 19 matching lines...) Expand all Loading... |
353 } | 350 } |
354 } | 351 } |
355 | 352 |
356 bool isSuitableFor(Backend backend) override { | 353 bool isSuitableFor(Backend backend) override { |
357 return backend == kNonRendering_Backend; | 354 return backend == kNonRendering_Backend; |
358 } | 355 } |
359 | 356 |
360 virtual void process(float) {} | 357 virtual void process(float) {} |
361 | 358 |
362 protected: | 359 protected: |
363 virtual void onDraw(const int loops, SkCanvas*) { | 360 void onDraw(const int loops, SkCanvas*) override { |
364 SkRandom rand; | 361 SkRandom rand; |
365 float accum = 0; | 362 float accum = 0; |
366 const float* data = fData; | 363 const float* data = fData; |
367 | 364 |
368 if (fFast) { | 365 if (fFast) { |
369 for (int j = 0; j < loops; ++j) { | 366 for (int j = 0; j < loops; ++j) { |
370 for (int i = 0; i < ARRAY; ++i) { | 367 for (int i = 0; i < ARRAY; ++i) { |
371 accum += fast_floor(data[i]); | 368 accum += fast_floor(data[i]); |
372 } | 369 } |
373 this->process(accum); | 370 this->process(accum); |
374 } | 371 } |
375 } else { | 372 } else { |
376 for (int j = 0; j < loops; ++j) { | 373 for (int j = 0; j < loops; ++j) { |
377 for (int i = 0; i < ARRAY; ++i) { | 374 for (int i = 0; i < ARRAY; ++i) { |
378 accum += sk_float_floor(data[i]); | 375 accum += sk_float_floor(data[i]); |
379 } | 376 } |
380 this->process(accum); | 377 this->process(accum); |
381 } | 378 } |
382 } | 379 } |
383 } | 380 } |
384 | 381 |
385 virtual const char* onGetName() { | 382 const char* onGetName() override { |
386 return fName; | 383 return fName; |
387 } | 384 } |
388 | 385 |
389 private: | 386 private: |
390 const char* fName; | 387 const char* fName; |
391 | 388 |
392 typedef Benchmark INHERITED; | 389 typedef Benchmark INHERITED; |
393 }; | 390 }; |
394 | 391 |
395 class CLZBench : public Benchmark { | 392 class CLZBench : public Benchmark { |
(...skipping 19 matching lines...) Expand all Loading... |
415 } | 412 } |
416 | 413 |
417 bool isSuitableFor(Backend backend) override { | 414 bool isSuitableFor(Backend backend) override { |
418 return backend == kNonRendering_Backend; | 415 return backend == kNonRendering_Backend; |
419 } | 416 } |
420 | 417 |
421 // just so the compiler doesn't remove our loops | 418 // just so the compiler doesn't remove our loops |
422 virtual void process(int) {} | 419 virtual void process(int) {} |
423 | 420 |
424 protected: | 421 protected: |
425 virtual void onDraw(const int loops, SkCanvas*) { | 422 void onDraw(const int loops, SkCanvas*) override { |
426 int accum = 0; | 423 int accum = 0; |
427 | 424 |
428 if (fUsePortable) { | 425 if (fUsePortable) { |
429 for (int j = 0; j < loops; ++j) { | 426 for (int j = 0; j < loops; ++j) { |
430 for (int i = 0; i < ARRAY; ++i) { | 427 for (int i = 0; i < ARRAY; ++i) { |
431 accum += SkCLZ_portable(fData[i]); | 428 accum += SkCLZ_portable(fData[i]); |
432 } | 429 } |
433 this->process(accum); | 430 this->process(accum); |
434 } | 431 } |
435 } else { | 432 } else { |
436 for (int j = 0; j < loops; ++j) { | 433 for (int j = 0; j < loops; ++j) { |
437 for (int i = 0; i < ARRAY; ++i) { | 434 for (int i = 0; i < ARRAY; ++i) { |
438 accum += SkCLZ(fData[i]); | 435 accum += SkCLZ(fData[i]); |
439 } | 436 } |
440 this->process(accum); | 437 this->process(accum); |
441 } | 438 } |
442 } | 439 } |
443 } | 440 } |
444 | 441 |
445 virtual const char* onGetName() { | 442 const char* onGetName() override { |
446 return fName; | 443 return fName; |
447 } | 444 } |
448 | 445 |
449 private: | 446 private: |
450 const char* fName; | 447 const char* fName; |
451 | 448 |
452 typedef Benchmark INHERITED; | 449 typedef Benchmark INHERITED; |
453 }; | 450 }; |
454 | 451 |
455 /////////////////////////////////////////////////////////////////////////////// | 452 /////////////////////////////////////////////////////////////////////////////// |
(...skipping 15 matching lines...) Expand all Loading... |
471 } | 468 } |
472 | 469 |
473 bool isSuitableFor(Backend backend) override { | 470 bool isSuitableFor(Backend backend) override { |
474 return backend == kNonRendering_Backend; | 471 return backend == kNonRendering_Backend; |
475 } | 472 } |
476 | 473 |
477 // just so the compiler doesn't remove our loops | 474 // just so the compiler doesn't remove our loops |
478 virtual void process(int) {} | 475 virtual void process(int) {} |
479 | 476 |
480 protected: | 477 protected: |
481 virtual void onDraw(const int loops, SkCanvas*) { | 478 void onDraw(const int loops, SkCanvas*) override { |
482 int accum = 0; | 479 int accum = 0; |
483 | 480 |
484 for (int j = 0; j < loops; ++j) { | 481 for (int j = 0; j < loops; ++j) { |
485 for (int i = 0; i < ARRAY; ++i) { | 482 for (int i = 0; i < ARRAY; ++i) { |
486 accum += fVec[i].normalize(); | 483 accum += fVec[i].normalize(); |
487 } | 484 } |
488 this->process(accum); | 485 this->process(accum); |
489 } | 486 } |
490 } | 487 } |
491 | 488 |
492 virtual const char* onGetName() { | 489 const char* onGetName() override { |
493 return fName; | 490 return fName; |
494 } | 491 } |
495 | 492 |
496 private: | 493 private: |
497 const char* fName; | 494 const char* fName; |
498 | 495 |
499 typedef Benchmark INHERITED; | 496 typedef Benchmark INHERITED; |
500 }; | 497 }; |
501 | 498 |
502 /////////////////////////////////////////////////////////////////////////////// | 499 /////////////////////////////////////////////////////////////////////////////// |
(...skipping 12 matching lines...) Expand all Loading... |
515 fData[i] = rand.nextSScalar1(); | 512 fData[i] = rand.nextSScalar1(); |
516 } | 513 } |
517 | 514 |
518 } | 515 } |
519 | 516 |
520 bool isSuitableFor(Backend backend) override { | 517 bool isSuitableFor(Backend backend) override { |
521 return backend == kNonRendering_Backend; | 518 return backend == kNonRendering_Backend; |
522 } | 519 } |
523 | 520 |
524 protected: | 521 protected: |
525 virtual void onDraw(const int loops, SkCanvas*) { | 522 void onDraw(const int loops, SkCanvas*) override { |
526 for (int j = 0; j < loops; ++j) { | 523 for (int j = 0; j < loops; ++j) { |
527 for (int i = 0; i < N - 4; ++i) { | 524 for (int i = 0; i < N - 4; ++i) { |
528 fResult[i] = SkFloatToFixed(fData[i]); | 525 fResult[i] = SkFloatToFixed(fData[i]); |
529 } | 526 } |
530 } | 527 } |
531 | 528 |
532 SkPaint paint; | 529 SkPaint paint; |
533 if (paint.getAlpha() == 0) { | 530 if (paint.getAlpha() == 0) { |
534 SkDebugf("%d\n", fResult[0]); | 531 SkDebugf("%d\n", fResult[0]); |
535 } | 532 } |
536 } | 533 } |
537 | 534 |
538 virtual const char* onGetName() { | 535 const char* onGetName() override { |
539 return "float_to_fixed"; | 536 return "float_to_fixed"; |
540 } | 537 } |
541 | 538 |
542 private: | 539 private: |
543 typedef Benchmark INHERITED; | 540 typedef Benchmark INHERITED; |
544 }; | 541 }; |
545 | 542 |
546 /////////////////////////////////////////////////////////////////////////////// | 543 /////////////////////////////////////////////////////////////////////////////// |
547 | 544 |
548 template <typename T> | 545 template <typename T> |
549 class DivModBench : public Benchmark { | 546 class DivModBench : public Benchmark { |
550 SkString fName; | 547 SkString fName; |
551 public: | 548 public: |
552 explicit DivModBench(const char* name) { | 549 explicit DivModBench(const char* name) { |
553 fName.printf("divmod_%s", name); | 550 fName.printf("divmod_%s", name); |
554 } | 551 } |
555 | 552 |
556 bool isSuitableFor(Backend backend) override { | 553 bool isSuitableFor(Backend backend) override { |
557 return backend == kNonRendering_Backend; | 554 return backend == kNonRendering_Backend; |
558 } | 555 } |
559 | 556 |
560 protected: | 557 protected: |
561 virtual const char* onGetName() { | 558 const char* onGetName() override { |
562 return fName.c_str(); | 559 return fName.c_str(); |
563 } | 560 } |
564 | 561 |
565 virtual void onDraw(const int loops, SkCanvas*) { | 562 void onDraw(const int loops, SkCanvas*) override { |
566 volatile T a = 0, b = 0; | 563 volatile T a = 0, b = 0; |
567 T div = 0, mod = 0; | 564 T div = 0, mod = 0; |
568 for (int i = 0; i < loops; i++) { | 565 for (int i = 0; i < loops; i++) { |
569 if ((T)i == 0) continue; // Small T will wrap around. | 566 if ((T)i == 0) continue; // Small T will wrap around. |
570 SkTDivMod((T)(i+1), (T)i, &div, &mod); | 567 SkTDivMod((T)(i+1), (T)i, &div, &mod); |
571 a ^= div; | 568 a ^= div; |
572 b ^= mod; | 569 b ^= mod; |
573 } | 570 } |
574 } | 571 } |
575 }; | 572 }; |
(...skipping 26 matching lines...) Expand all Loading... |
602 | 599 |
603 DEF_BENCH( return new FloorBench(false); ) | 600 DEF_BENCH( return new FloorBench(false); ) |
604 DEF_BENCH( return new FloorBench(true); ) | 601 DEF_BENCH( return new FloorBench(true); ) |
605 | 602 |
606 DEF_BENCH( return new CLZBench(false); ) | 603 DEF_BENCH( return new CLZBench(false); ) |
607 DEF_BENCH( return new CLZBench(true); ) | 604 DEF_BENCH( return new CLZBench(true); ) |
608 | 605 |
609 DEF_BENCH( return new NormalizeBench(); ) | 606 DEF_BENCH( return new NormalizeBench(); ) |
610 | 607 |
611 DEF_BENCH( return new FixedMathBench(); ) | 608 DEF_BENCH( return new FixedMathBench(); ) |
OLD | NEW |