Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(803)

Unified Diff: nss/mozilla/nsprpub/pr/include/prbit.h

Issue 3135002: Update to NSS 3.12.7 and NSPR 4.8.6.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/
Patch Set: Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: nss/mozilla/nsprpub/pr/include/prbit.h
===================================================================
--- nss/mozilla/nsprpub/pr/include/prbit.h (revision 55475)
+++ nss/mozilla/nsprpub/pr/include/prbit.h (working copy)
@@ -41,6 +41,33 @@
#include "prtypes.h"
PR_BEGIN_EXTERN_C
+/* replace compare/jump/add/shift sequence with x86 BSF/BSR instruction */
+#if defined(_WIN32) && (_MSC_VER >= 1300) && (defined(_M_IX86) || defined(_M_AMD64))
+ unsigned char _BitScanForward(unsigned long * Index, unsigned long Mask);
+ unsigned char _BitScanReverse(unsigned long * Index, unsigned long Mask);
+# pragma intrinsic(_BitScanForward,_BitScanReverse)
+ __forceinline static int __prBitScanForward32(unsigned int val)
+ {
+ unsigned long idx;
+ _BitScanForward(&idx, (unsigned long)val);
+ return( (int)idx );
+ }
+ __forceinline static int __prBitScanReverse32(unsigned int val)
+ {
+ unsigned long idx;
+ _BitScanReverse(&idx, (unsigned long)val);
+ return( (int)(31-idx) );
+ }
+# define pr_bitscan_ctz32(val) __prBitScanForward32(val)
+# define pr_bitscan_clz32(val) __prBitScanReverse32(val)
+# define PR_HAVE_BUILTIN_BITSCAN32
+#elif ((__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) && \
+ (defined(__i386__) || defined(__x86_64__) || defined(__arm__))
+# define pr_bitscan_ctz32(val) __builtin_ctz(val)
+# define pr_bitscan_clz32(val) __builtin_clz(val)
+# define PR_HAVE_BUILTIN_BITSCAN32
+#endif /* MSVC || GCC */
+
/*
** A prbitmap_t is a long integer that can be used for bitmaps
*/
@@ -67,6 +94,13 @@
** Macro version of PR_CeilingLog2: Compute the log of the least power of
** 2 greater than or equal to _n. The result is returned in _log2.
*/
+#ifdef PR_HAVE_BUILTIN_BITSCAN32
+#define PR_CEILING_LOG2(_log2,_n) \
+ PR_BEGIN_MACRO \
+ PRUint32 j_ = (PRUint32)(_n); \
+ (_log2) = (j_ <= 1 ? 0 : 32 - pr_bitscan_clz32(j_ - 1)); \
+ PR_END_MACRO
+#else
#define PR_CEILING_LOG2(_log2,_n) \
PR_BEGIN_MACRO \
PRUint32 j_ = (PRUint32)(_n); \
@@ -84,6 +118,7 @@
if ((j_) >> 1) \
(_log2) += 1; \
PR_END_MACRO
+#endif /* PR_HAVE_BUILTIN_BITSCAN32 */
/*
** Macro version of PR_FloorLog2: Compute the log of the greatest power of
@@ -91,6 +126,13 @@
**
** This is equivalent to finding the highest set bit in the word.
*/
+#ifdef PR_HAVE_BUILTIN_BITSCAN32
+#define PR_FLOOR_LOG2(_log2,_n) \
+ PR_BEGIN_MACRO \
+ PRUint32 j_ = (PRUint32)(_n); \
+ (_log2) = 31 - pr_bitscan_clz32((j_) | 1); \
+ PR_END_MACRO
+#else
#define PR_FLOOR_LOG2(_log2,_n) \
PR_BEGIN_MACRO \
PRUint32 j_ = (PRUint32)(_n); \
@@ -106,6 +148,7 @@
if ((j_) >> 1) \
(_log2) += 1; \
PR_END_MACRO
+#endif /* PR_HAVE_BUILTIN_BITSCAN32 */
/*
** Macros for rotate left and right. The argument 'a' must be an unsigned

Powered by Google App Engine
This is Rietveld 408576698