Mercurial > hg > graal-jvmci-8
diff src/share/vm/libadt/port.cpp @ 0:a61af66fc99e jdk7-b24
Initial load
author | duke |
---|---|
date | Sat, 01 Dec 2007 00:00:00 +0000 |
parents | |
children | c18cbe5936b8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/vm/libadt/port.cpp Sat Dec 01 00:00:00 2007 +0000 @@ -0,0 +1,123 @@ +/* + * Copyright 1997-1998 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +// Code for portable compiling + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include "incls/_precompiled.incl" +#include "incls/_port.cpp.incl" + +// %%%%% includes not needed with AVM framework - Ungar +// #include "port.hpp" + +// This is only used if turboc is used and it causes problems with +// gcc. +#ifdef __TURBOC__ +#include <iostream.h> +#endif + +#include <stdio.h> + +//------------------------------gcd-------------------------------------------- +// Greatest common divisor +uint32 gcd( register uint32 x, register uint32 y ) +{ + register uint32 tmp; + while( x ) { // While not zero + tmp = x; // Hold onto smaller x value + x = y % x; // Compute modulus; since y>=x, 0 <= mod < x + y = tmp; // y = old x + } + return y; +} + +//----------------------------------------------------------------------------- +// Find first 1, or return 32 if empty +int ff1( uint32 mask ) +{ + unsigned i, n = 0; + + for( i=1, n=0; i; i<<=1, n++) + if( mask&i ) return n; + return 32; +} + +//----------------------------------------------------------------------------- +// Find highest 1, or return 32 if empty +int fh1( uint32 mask ) +{ + unsigned i, n = 0; + + for( i=((uint32)1<<31), n=31; i; i>>=1, n--) + if( mask&i ) return n; + return 32; +} + +//------------------------------rotate32--------------------------------------- +// Rotate 32bits. Postive rotates left (bits move toward high-order bit), +// negative rotates right. +uint32 rotate32( register uint32 x, register int32 cnt ) +{ + if( cnt >= 0 ) { // Positive rotates left + cnt &= 31; // Mask off extra shift bits + } else { // Negative rotates right + cnt = (-cnt)&31; // Flip sign; mask extra shift bits + cnt = 32-cnt; // Rotate right by big left rotation + } + return (x << cnt) | (x >> (32-cnt)); +} + +/* Disabled - we have another log2 in the system. + This function doesn't work if used as substitute + for the existing log2. Keep around until we have + verified all uses of log2 do the correct thing! +//------------------------------log2------------------------------------------- +// Log base 2. Might also be called 'count leading zeros'. Log2(x) returns +// an l such that (1L<<l) <= x < (2L<<l). log2(x) returns 32. +uint log2( uint32 x ) +{ + register uint l = 32; // Log bits + register int32 sx = x; // Treat as signed number + while( sx >= 0 ) // While high bit is clear + sx <<= 1, l--; // Shift bits left, count down log2 + return l; +} +*/ + +//------------------------------print------------------------------------------ +// Print a pointer without modifying the contents +#ifdef __TURBOC__ +ostream &ostream::operator << (const void *ptr) +{ + return (*this) << "0x" << hex << (uint)ptr << dec; +} +#else +/*ostream &operator << (ostream &os, const void *ptr) +{ + return os << "0x" << hex << (uint)ptr << dec; +}*/ +#endif