| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #ifndef SkUtils_DEFINED | 8 #ifndef SkUtils_DEFINED |
| 9 #define SkUtils_DEFINED | 9 #define SkUtils_DEFINED |
| 10 | 10 |
| 11 #include "SkTypes.h" | 11 #include "SkTypes.h" |
| 12 | 12 |
| 13 namespace SkOpts { | |
| 14 extern void (*memset16)(uint16_t[], uint16_t, int); | |
| 15 extern void (*memset32)(uint32_t[], uint32_t, int); | |
| 16 } | |
| 17 | |
| 18 /////////////////////////////////////////////////////////////////////////////// | |
| 19 | |
| 20 // Inlining heuristics were determined by using perf.skia.org and bench/MemsetBe
nch.cpp. | |
| 21 // When using MSVC, inline is better >= 1K and worse <= 100. The Nexus Player w
as the opposite. | |
| 22 // Otherwise, when NEON or SSE is available to GCC or Clang, they can handle it
best. | |
| 23 // See https://code.google.com/p/chromium/issues/detail?id=516426#c15 for more d
etails. | |
| 24 // See also skia:4316; it might be a good idea to use rep stosw/stosd here. | |
| 25 #define INLINE_IF(cond) if (cond) { while (count --> 0) { *buffer++ = value; } r
eturn; } | |
| 26 | |
| 27 /** Similar to memset(), but it assigns a 16bit value into the buffer. | 13 /** Similar to memset(), but it assigns a 16bit value into the buffer. |
| 28 @param buffer The memory to have value copied into it | 14 @param buffer The memory to have value copied into it |
| 29 @param value The 16bit value to be copied into buffer | 15 @param value The 16bit value to be copied into buffer |
| 30 @param count The number of times value should be copied into the buffer. | 16 @param count The number of times value should be copied into the buffer. |
| 31 */ | 17 */ |
| 32 static inline void sk_memset16(uint16_t buffer[], uint16_t value, int count) { | 18 static inline void sk_memset16(uint16_t buffer[], uint16_t value, int count) { |
| 33 #if defined(_MSC_VER) | 19 for (int i = 0; i < count; i++) { |
| 34 INLINE_IF(count > 300) | 20 buffer[i] = value; |
| 35 #elif defined(SK_BUILD_FOR_ANDROID) && defined(SK_CPU_X86) | 21 } |
| 36 INLINE_IF(count < 300) | |
| 37 #elif defined(SK_ARM_HAS_NEON) || SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2 | |
| 38 INLINE_IF(true) | |
| 39 #else | |
| 40 INLINE_IF(count <= 10) | |
| 41 #endif | |
| 42 SkOpts::memset16(buffer, value, count); | |
| 43 } | 22 } |
| 44 | 23 |
| 45 /** Similar to memset(), but it assigns a 32bit value into the buffer. | 24 /** Similar to memset(), but it assigns a 32bit value into the buffer. |
| 46 @param buffer The memory to have value copied into it | 25 @param buffer The memory to have value copied into it |
| 47 @param value The 32bit value to be copied into buffer | 26 @param value The 32bit value to be copied into buffer |
| 48 @param count The number of times value should be copied into the buffer. | 27 @param count The number of times value should be copied into the buffer. |
| 49 */ | 28 */ |
| 50 static inline void sk_memset32(uint32_t buffer[], uint32_t value, int count) { | 29 static inline void sk_memset32(uint32_t buffer[], uint32_t value, int count) { |
| 51 #if defined(_MSC_VER) | 30 for (int i = 0; i < count; i++) { |
| 52 INLINE_IF(count > 300) | 31 buffer[i] = value; |
| 53 #elif defined(SK_BUILD_FOR_ANDROID) && defined(SK_CPU_X86) | 32 } |
| 54 INLINE_IF(count < 300) | |
| 55 #elif defined(SK_ARM_HAS_NEON) || SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2 | |
| 56 INLINE_IF(true) | |
| 57 #else | |
| 58 INLINE_IF(count <= 10) | |
| 59 #endif | |
| 60 SkOpts::memset32(buffer, value, count); | |
| 61 } | 33 } |
| 62 | 34 |
| 63 #undef INLINE_IF | |
| 64 | |
| 65 /////////////////////////////////////////////////////////////////////////////// | 35 /////////////////////////////////////////////////////////////////////////////// |
| 66 | 36 |
| 67 #define kMaxBytesInUTF8Sequence 4 | 37 #define kMaxBytesInUTF8Sequence 4 |
| 68 | 38 |
| 69 #ifdef SK_DEBUG | 39 #ifdef SK_DEBUG |
| 70 int SkUTF8_LeadByteToCount(unsigned c); | 40 int SkUTF8_LeadByteToCount(unsigned c); |
| 71 #else | 41 #else |
| 72 #define SkUTF8_LeadByteToCount(c) ((((0xE5 << 24) >> ((unsigned)c >> 4 <<
1)) & 3) + 1) | 42 #define SkUTF8_LeadByteToCount(c) ((((0xE5 << 24) >> ((unsigned)c >> 4 <<
1)) & 3) + 1) |
| 73 #endif | 43 #endif |
| 74 | 44 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 } | 102 } |
| 133 ~SkAutoTrace() { | 103 ~SkAutoTrace() { |
| 134 SkDebugf("--- trace: %s Leave\n", fLabel); | 104 SkDebugf("--- trace: %s Leave\n", fLabel); |
| 135 } | 105 } |
| 136 private: | 106 private: |
| 137 const char* fLabel; | 107 const char* fLabel; |
| 138 }; | 108 }; |
| 139 #define SkAutoTrace(...) SK_REQUIRE_LOCAL_VAR(SkAutoTrace) | 109 #define SkAutoTrace(...) SK_REQUIRE_LOCAL_VAR(SkAutoTrace) |
| 140 | 110 |
| 141 #endif | 111 #endif |
| OLD | NEW |