1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 * Copyright 2014 Nexenta Systems, Inc. All rights reserved. 26 */ 27 28 #ifndef _ASM_BITMAP_H 29 #define _ASM_BITMAP_H 30 31 #include <sys/ccompile.h> 32 #include <sys/types.h> 33 34 #ifdef __cplusplus 35 extern "C" { 36 #endif 37 38 #if !defined(__lint) && defined(__GNUC__) 39 40 #if defined(__amd64) 41 #define __SUF "q" 42 #elif defined(__i386) 43 #define __SUF "l" 44 #else 45 #error "port me" 46 #endif 47 48 extern __GNU_INLINE int 49 highbit(ulong_t i) 50 { 51 long value = -1l; 52 53 __asm__( 54 "bsr" __SUF " %1,%0" 55 : "+r" (value) 56 : "r" (i) 57 : "cc"); 58 59 return ((int)(value + 1)); 60 } 61 62 extern __GNU_INLINE int 63 lowbit(ulong_t i) 64 { 65 long value = -1l; 66 67 __asm__( 68 "bsf" __SUF " %1,%0" 69 : "+r" (value) 70 : "r" (i) 71 : "cc"); 72 73 return ((int)(value + 1)); 74 } 75 76 extern __GNU_INLINE uint_t 77 atomic_btr32(uint32_t *memory, uint_t bitnum) 78 { 79 uint8_t value; 80 81 __asm__ __volatile__( 82 "lock;" 83 "btrl %2,%0;" 84 "setc %1" 85 : "+m" (*memory), "=r" (value) 86 : "ir" (bitnum) 87 : "cc"); 88 89 return ((uint_t)value); 90 } 91 92 #undef __SUF 93 94 #endif /* !__lint && __GNUC__ */ 95 96 #ifdef __cplusplus 97 } 98 #endif 99 100 #endif /* _ASM_BITMAP_H */ 101