diff options
author | robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-08-15 13:43:23 +0000 |
---|---|---|
committer | robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-08-15 13:43:23 +0000 |
commit | 0e6e8cc627242cc7e301401cfe112ba98a008101 (patch) | |
tree | f2bbce7d1b582f87d671d1b0f7adeef0e11ea5e8 /src/core/SkMath.cpp | |
parent | ed41d86a956a84e1438e334c15641393d68cf606 (diff) |
Revert r10705 (ARM Skia NEON patches - 04 - Clean SkFixed / SkLONGLONG) due to 1000+ linux_layout failures (http://build.chromium.org/p/tryserver.chromium/builders/linux_layout_rel/builds/18997/steps/webkit_tests/logs/stdio)
git-svn-id: http://skia.googlecode.com/svn/trunk@10729 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkMath.cpp')
-rw-r--r-- | src/core/SkMath.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/core/SkMath.cpp b/src/core/SkMath.cpp index 6c6c6d5670..2693e5c13c 100644 --- a/src/core/SkMath.cpp +++ b/src/core/SkMath.cpp @@ -105,6 +105,71 @@ int32_t SkMulShift(int32_t a, int32_t b, unsigned shift) { } } +SkFixed SkFixedMul_portable(SkFixed a, SkFixed b) { +#if 0 + Sk64 tmp; + + tmp.setMul(a, b); + tmp.shiftRight(16); + return tmp.fLo; +#elif defined(SkLONGLONG) + return static_cast<SkFixed>((SkLONGLONG)a * b >> 16); +#else + int sa = SkExtractSign(a); + int sb = SkExtractSign(b); + // now make them positive + a = SkApplySign(a, sa); + b = SkApplySign(b, sb); + + uint32_t ah = a >> 16; + uint32_t al = a & 0xFFFF; + uint32_t bh = b >> 16; + uint32_t bl = b & 0xFFFF; + + uint32_t R = ah * b + al * bh + (al * bl >> 16); + + return SkApplySign(R, sa ^ sb); +#endif +} + +SkFract SkFractMul_portable(SkFract a, SkFract b) { +#if 0 + Sk64 tmp; + tmp.setMul(a, b); + return tmp.getFract(); +#elif defined(SkLONGLONG) + return static_cast<SkFract>((SkLONGLONG)a * b >> 30); +#else + int sa = SkExtractSign(a); + int sb = SkExtractSign(b); + // now make them positive + a = SkApplySign(a, sa); + b = SkApplySign(b, sb); + + uint32_t ah = a >> 16; + uint32_t al = a & 0xFFFF; + uint32_t bh = b >> 16; + uint32_t bl = b & 0xFFFF; + + uint32_t A = ah * bh; + uint32_t B = ah * bl + al * bh; + uint32_t C = al * bl; + + /* [ A ] + [ B ] + [ C ] + */ + uint32_t Lo = C + (B << 16); + uint32_t Hi = A + (B >>16) + (Lo < C); + + SkASSERT((Hi >> 29) == 0); // else overflow + + int32_t R = (Hi << 2) + (Lo >> 30); + + return SkApplySign(R, sa ^ sb); +#endif +} + int SkFixedMulCommon(SkFixed a, int b, int bias) { // this function only works if b is 16bits SkASSERT(b == (int16_t)b); |