13fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved. 23fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Redistribution and use in source and binary forms, with or without 33fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// modification, are permitted provided that the following conditions are 43fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// met: 53fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// 63fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// * Redistributions of source code must retain the above copyright 73fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// notice, this list of conditions and the following disclaimer. 83fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// * Redistributions in binary form must reproduce the above 93fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// copyright notice, this list of conditions and the following 103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// disclaimer in the documentation and/or other materials provided 113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// with the distribution. 123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// * Neither the name of Google Inc. nor the names of its 133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// contributors may be used to endorse or promote products derived 143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// from this software without specific prior written permission. 153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// 163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#ifndef V8_MISC_INTRINSICS_H_ 293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#define V8_MISC_INTRINSICS_H_ 303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include "../include/v8.h" 323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include "globals.h" 333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochnamespace v8 { 353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochnamespace internal { 363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Returns the index of the leading 1 bit, counting the least significant bit at 383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// index 0. (1 << IntegerLog2(x)) is a mask for the most significant bit of x. 393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Result is undefined if input is zero. 403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochint IntegerLog2(uint32_t value); 413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#if defined(__GNUC__) 433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochinline int IntegerLog2(uint32_t value) { 453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return 31 - __builtin_clz(value); 463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#elif defined(_MSC_VER) 493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#pragma intrinsic(_BitScanReverse) 513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochinline int IntegerLog2(uint32_t value) { 533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch unsigned long result; // NOLINT: MSVC intrinsic demands this type. 543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch _BitScanReverse(&result, value); 553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return result; 563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#else 593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Default version using regular operations. Code taken from: 613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog 623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochinline int IntegerLog2(uint32_t value) { 633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int result, shift; 643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch shift = (value > 0xFFFF) << 4; 663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch value >>= shift; 673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch result = shift; 683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch shift = (value > 0xFF) << 3; 703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch value >>= shift; 713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch result |= shift; 723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch shift = (value > 0xF) << 2; 743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch value >>= shift; 753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch result |= shift; 763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch shift = (value > 0x3) << 1; 783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch value >>= shift; 793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch result |= shift; 803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch result |= (value >> 1); 823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return result; 843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#endif 863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} } // namespace v8::internal 883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#endif // V8_MISC_INTRINSICS_H_ 90