// Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
//
// This file is part of Threading Building Blocks.
//
// Threading Building Blocks is free software; you can redistribute it
// and/or modify it under the terms of the GNU General Public License
// version 2 as published by the Free Software Foundation.
//
// Threading Building Blocks is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Threading Building Blocks; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
//
// As a special exception, you may use this file as part of a free software
// library without restriction.  Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License.  This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.

	// Support for class ConcurrentVector
	.section .text
	.align 16
	// unsigned long __TBB_machine_lg( unsigned long x );
	// r32 = x
	.proc  __TBB_machine_lg#
	.global __TBB_machine_lg#
__TBB_machine_lg:
        shr r16=r32,1	// .x
;;
        shr r17=r32,2	// ..x
	or r32=r32,r16	// xx
;;
	shr r16=r32,3	// ...xx
	or r32=r32,r17  // xxx
;;
	shr r17=r32,5	// .....xxx
	or r32=r32,r16  // xxxxx
;;
	shr r16=r32,8	// ........xxxxx
	or r32=r32,r17	// xxxxxxxx
;;
	shr r17=r32,13
	or r32=r32,r16	// 13x
;;
	shr r16=r32,21
	or r32=r32,r17	// 21x
;;
	shr r17=r32,34  
	or r32=r32,r16	// 34x
;;
	shr r16=r32,55
	or r32=r32,r17  // 55x
;;
	or r32=r32,r16  // 64x
;;
	popcnt r8=r32
;;
	add r8=-1,r8
   	br.ret.sptk.many b0	
	.endp __TBB_machine_lg#
