/* Bitwise manipulation over float. Function prototypes. Copyright (C) 2011-2014 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Adhemerval Zanella , 2011 The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, see . */ #ifndef _FLOAT_BITWISE_ #define _FLOAT_BITWISE_ 1 #include /* Returns (int)(num & 0x7FFFFFF0 == value) */ static inline int __float_and_test28 (float num, float value) { float ret; #ifdef _ARCH_PWR7 union { int i; float f; } mask = { .i = 0x7ffffff0 }; __asm__ ( /* the 'f' constraint is used on mask because we just need * to compare floats, not full vector */ "xxland %x0,%x1,%x2" : "=f" (ret) : "f" (num), "f" (mask.f) ); #else int32_t inum; GET_FLOAT_WORD(inum, num); inum = (inum & 0x7ffffff0); SET_FLOAT_WORD(ret, inum); #endif return (ret == value); } /* Returns (int)(num & 0x7FFFFF00 == value) */ static inline int __float_and_test24 (float num, float value) { float ret; #ifdef _ARCH_PWR7 union { int i; float f; } mask = { .i = 0x7fffff00 }; __asm__ ( "xxland %x0,%x1,%x2" : "=f" (ret) : "f" (num), "f" (mask.f) ); #else int32_t inum; GET_FLOAT_WORD(inum, num); inum = (inum & 0x7fffff00); SET_FLOAT_WORD(ret, inum); #endif return (ret == value); } /* Returns (float)(num & 0x7F800000) */ static inline float __float_and8 (float num) { float ret; #ifdef _ARCH_PWR7 union { int i; float f; } mask = { .i = 0x7f800000 }; __asm__ ( "xxland %x0,%x1,%x2" : "=f" (ret) : "f" (num), "f" (mask.f) ); #else int32_t inum; GET_FLOAT_WORD(inum, num); inum = (inum & 0x7f800000); SET_FLOAT_WORD(ret, inum); #endif return ret; } /* Returns ((int32_t)(num & 0x7F800000) >> 23) */ static inline int32_t __float_get_exp (float num) { int32_t inum; #ifdef _ARCH_PWR7 float ret; union { int i; float f; } mask = { .i = 0x7f800000 }; __asm__ ( "xxland %x0,%x1,%x2" : "=f" (ret) : "f" (num), "f" (mask.f) ); GET_FLOAT_WORD(inum, ret); #else GET_FLOAT_WORD(inum, num); inum = inum & 0x7f800000; #endif return inum >> 23; } #endif /* s_float_bitwise.h */