Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libm/machine/spu/headers/fesetround.h')
-rw-r--r--newlib/libm/machine/spu/headers/fesetround.h104
1 files changed, 0 insertions, 104 deletions
diff --git a/newlib/libm/machine/spu/headers/fesetround.h b/newlib/libm/machine/spu/headers/fesetround.h
deleted file mode 100644
index 3cda4c80d..000000000
--- a/newlib/libm/machine/spu/headers/fesetround.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- (C) Copyright 2001,2006,
- International Business Machines Corporation,
- Sony Computer Entertainment, Incorporated,
- Toshiba Corporation,
-
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- * Neither the names of the copyright holders nor the names of their
- contributors may be used to endorse or promote products derived from this
- software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-#ifndef _FESETROUND_H_
-#define _FESETROUND_H_ 1
-
-#include <spu_intrinsics.h>
-#include <fenv.h>
-
-#define FE_MASK_ROUND (__FE_ROUND_ELE_0 | __FE_ROUND_ELE_1)
-
-#define SMALL (FE_MASK_ROUND - 1)
-#define LARGE (FE_MASK_ROUND + \
- ((__FE_SPU_DOWNWARD << 2) | __FE_SPU_DOWNWARD) + 1)
-
-static __inline int _fesetround(int mode)
-{
- unsigned int umode;
- vec_uint4 vec_mode;
- vec_uint4 valid, fail;
- vec_uint4 cur_fpscr, new_fpscr, mask_fpscr;
- vec_uint4 const valid_ele0 =
- { FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD, FE_DOWNWARD };
- vec_uint4 const valid_ele1 =
- { FE_TONEAREST_1, FE_TOWARDZERO_1, FE_UPWARD_1, FE_DOWNWARD_1 };
- vec_uint4 const too_large = { LARGE, LARGE, LARGE, LARGE };
- vec_uchar16 const splat_ele0 =
- { 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3 };
- vec_uint4 const clear_non_ele0 = { 0xffffffff, 0, 0, 0 };
-
- /*
- * There are 24 valid values, check for a range plus the other 8
- * rather than check for specific bit settings.
- *
- * These are all the valid values:
- * 0xf00 through 0xf0f (SMALL + 1 through LARGE - 1, 16 values)
- * 0xc00 0xc04 0xc08 0xc0c (in ele0)
- * 0x300 0x301 0x302 0x303 (in ele1)
- */
- umode = mode;
- vec_mode = spu_splats(umode);
- valid = spu_cmpeq(vec_mode, valid_ele0);
- valid = spu_or(valid, spu_cmpeq(vec_mode, valid_ele1));
- valid = spu_or(valid, spu_cmpgt(vec_mode, SMALL));
- valid = spu_and(valid, spu_cmpgt(too_large, vec_mode));
-
- fail = spu_gather(valid);
- fail = spu_cmpeq(fail, 0);
- /*
- * set all elements of fail to the value of fail's element 0, so
- * we can select the current fpscr values on failure.
- */
- fail = spu_shuffle(fail, fail, splat_ele0);
-
- cur_fpscr = spu_mffpscr();
- /*
- * We don't have to mask the round element selection out since it
- * is shifted out.
- */
- new_fpscr = spu_promote(umode << 8, 0);
- new_fpscr = spu_and(new_fpscr, clear_non_ele0);
- /*
- * Use the element bits of the mode to set the mask.
- */
- mask_fpscr = spu_promote((umode & FE_MASK_ROUND), 0);
- new_fpscr = spu_sel(cur_fpscr, new_fpscr, mask_fpscr);
- /*
- * Use the current fpscr value if the round mode was invalid
- */
- new_fpscr = spu_sel(new_fpscr, cur_fpscr, fail);
- spu_mtfpscr(new_fpscr);
-
- return spu_extract(fail, 0);
-}
-#endif /* _FESETROUND_H_ */