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