diff options
-rw-r--r-- | BUILD.public | 2 | ||||
-rw-r--r-- | src/core/SkMath.cpp | 46 | ||||
-rw-r--r-- | tools/dm_flags.json | 4 | ||||
-rwxr-xr-x | tools/dm_flags.py | 5 |
4 files changed, 24 insertions, 33 deletions
diff --git a/BUILD.public b/BUILD.public index e76d879bce..a029a9fa02 100644 --- a/BUILD.public +++ b/BUILD.public @@ -439,7 +439,7 @@ cc_test( "--nogpu", "--verbose", # TODO(mtklein): maybe investigate why these fail? - "--match ~FontMgr ~Scalar ~Canvas ~Codec_stripes ~Codec_Dimensions ~Codec ~Stream ~skps ~RecordDraw_TextBounds", + "--match ~FontMgr ~Scalar ~Canvas ~Codec_stripes ~Codec_Dimensions ~Codec ~Stream ~skps ~Math ~RecordDraw_TextBounds", "--resourcePath %s/resources" % BASE_DIR, "--images %s/resources" % BASE_DIR, ], diff --git a/src/core/SkMath.cpp b/src/core/SkMath.cpp index 9ca1569de6..af93d7ecb2 100644 --- a/src/core/SkMath.cpp +++ b/src/core/SkMath.cpp @@ -45,38 +45,21 @@ int SkCLZ_portable(uint32_t x) { /////////////////////////////////////////////////////////////////////////////// - -#define DIVBITS_ITER(k) \ - case k: \ - if (numer*2 >= denom) { \ - numer = numer*2 - denom; \ - result |= 1 << (k-1); \ - } else { \ - numer *= 2; \ - } - -// NOTE: if you're thinking of editing this method, consider replacing it with -// a simple shift and divide. This legacy method predated reliable hardware division. -int32_t SkDivBits(int32_t n, int32_t d, int shift_bias) { - SkASSERT(d != 0); - if (n == 0) { +#define DIVBITS_ITER(n) \ + case n: \ + if ((numer = (numer << 1) - denom) >= 0) \ + result |= 1 << (n - 1); else numer += denom + +int32_t SkDivBits(int32_t numer, int32_t denom, int shift_bias) { + SkASSERT(denom != 0); + if (numer == 0) { return 0; } - // Make numer and denom positive, and sign hold the resulting sign - // We'll be left-shifting numer, so it's important it's a uint32_t. - // We put denom in a uint32_t just to keep things simple. - int32_t sign = SkExtractSign(n ^ d); -#if defined(SK_SUPPORT_LEGACY_DIVBITS_UB) - // Blink layout tests are baselined to Clang optimizing through the UB. - int32_t numer = SkAbs32(n); - int32_t denom = SkAbs32(d); -#else - uint32_t numer = SkAbs32(n); - uint32_t denom = SkAbs32(d); -#endif - - // It's probably a bug to use n or d below here. + // make numer and denom positive, and sign hold the resulting sign + int32_t sign = SkExtractSign(numer ^ denom); + numer = SkAbs32(numer); + denom = SkAbs32(denom); int nbits = SkCLZ(numer) - 1; int dbits = SkCLZ(denom) - 1; @@ -95,9 +78,10 @@ int32_t SkDivBits(int32_t n, int32_t d, int shift_bias) { SkFixed result = 0; // do the first one - if (numer >= denom) { - numer -= denom; + if ((numer -= denom) >= 0) { result = 1; + } else { + numer += denom; } // Now fall into our switch statement if there are more bits to compute diff --git a/tools/dm_flags.json b/tools/dm_flags.json index 3c557865dc..be6bc3d747 100644 --- a/tools/dm_flags.json +++ b/tools/dm_flags.json @@ -1221,7 +1221,9 @@ "_", "image", "_", - "interlaced3.png" + "interlaced3.png", + "--match", + "~Math" ], "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-Valgrind": [ "--matrix", diff --git a/tools/dm_flags.py b/tools/dm_flags.py index 5341b221da..7c901891ca 100755 --- a/tools/dm_flags.py +++ b/tools/dm_flags.py @@ -169,6 +169,11 @@ def get_args(bot): if 'Valgrind' in bot: # skia:3021 match.append('~Threaded') + # skia:3562 + if ('TSAN' in bot or + 'Test-Mac10.8-Clang-MacMini4.1-CPU-SSE4-x86_64-Release' in bot): + match.append('~Math') + if 'GalaxyS3' in bot: # skia:1699 match.append('~WritePixels') |