xref: /minix3/lib/libc/arch/arm/hardfloat/fpgetround.c (revision 84d9c625bfea59e274550651111ae9edfdc40fbd)
1*84d9c625SLionel Sambuc /*	$NetBSD: fpgetround.c,v 1.6 2013/01/11 13:55:26 matt Exp $	*/
22fe8fb19SBen Gras 
3*84d9c625SLionel Sambuc /*-
4*84d9c625SLionel Sambuc  * Copyright (c) 2013 The NetBSD Foundation, Inc.
52fe8fb19SBen Gras  * All rights reserved.
62fe8fb19SBen Gras  *
7*84d9c625SLionel Sambuc  * This code is derived from software contributed to The NetBSD Foundation
8*84d9c625SLionel Sambuc  * by Matt Thomas of 3am Software Foundry.
9*84d9c625SLionel Sambuc  *
102fe8fb19SBen Gras  * Redistribution and use in source and binary forms, with or without
112fe8fb19SBen Gras  * modification, are permitted provided that the following conditions
122fe8fb19SBen Gras  * are met:
132fe8fb19SBen Gras  * 1. Redistributions of source code must retain the above copyright
142fe8fb19SBen Gras  *    notice, this list of conditions and the following disclaimer.
152fe8fb19SBen Gras  * 2. Redistributions in binary form must reproduce the above copyright
162fe8fb19SBen Gras  *    notice, this list of conditions and the following disclaimer in the
172fe8fb19SBen Gras  *    documentation and/or other materials provided with the distribution.
182fe8fb19SBen Gras  *
19*84d9c625SLionel Sambuc  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20*84d9c625SLionel Sambuc  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21*84d9c625SLionel Sambuc  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22*84d9c625SLionel Sambuc  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23*84d9c625SLionel Sambuc  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*84d9c625SLionel Sambuc  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*84d9c625SLionel Sambuc  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*84d9c625SLionel Sambuc  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*84d9c625SLionel Sambuc  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*84d9c625SLionel Sambuc  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*84d9c625SLionel Sambuc  * POSSIBILITY OF SUCH DAMAGE.
302fe8fb19SBen Gras  */
312fe8fb19SBen Gras 
32*84d9c625SLionel Sambuc #ifndef __VFP_FP__
33*84d9c625SLionel Sambuc #error FPA is not supported anymore
34*84d9c625SLionel Sambuc #endif
35*84d9c625SLionel Sambuc 
362fe8fb19SBen Gras #include <sys/cdefs.h>
372fe8fb19SBen Gras #if defined(LIBC_SCCS) && !defined(lint)
38*84d9c625SLionel Sambuc __RCSID("$NetBSD: fpgetround.c,v 1.6 2013/01/11 13:55:26 matt Exp $");
392fe8fb19SBen Gras #endif /* LIBC_SCCS and not lint */
402fe8fb19SBen Gras 
412fe8fb19SBen Gras #include "namespace.h"
422fe8fb19SBen Gras 
432fe8fb19SBen Gras #include <sys/types.h>
442fe8fb19SBen Gras #include <ieeefp.h>
452fe8fb19SBen Gras 
46*84d9c625SLionel Sambuc #include <arm/vfpreg.h>
47*84d9c625SLionel Sambuc 
482fe8fb19SBen Gras #ifdef __weak_alias
__weak_alias(fpgetround,_fpgetround)492fe8fb19SBen Gras __weak_alias(fpgetround,_fpgetround)
502fe8fb19SBen Gras #endif
512fe8fb19SBen Gras 
522fe8fb19SBen Gras /*
532fe8fb19SBen Gras  * Return the current FP rounding mode
542fe8fb19SBen Gras  */
552fe8fb19SBen Gras 
562fe8fb19SBen Gras fp_rnd
57f14fb602SLionel Sambuc fpgetround(void)
582fe8fb19SBen Gras {
59*84d9c625SLionel Sambuc 	__CTASSERT(__SHIFTOUT(VFP_FPSCR_RN, VFP_FPSCR_RMODE) == FP_RN);
60*84d9c625SLionel Sambuc 	__CTASSERT(__SHIFTOUT(VFP_FPSCR_RP, VFP_FPSCR_RMODE) == FP_RP);
61*84d9c625SLionel Sambuc 	__CTASSERT(__SHIFTOUT(VFP_FPSCR_RM, VFP_FPSCR_RMODE) == FP_RM);
62*84d9c625SLionel Sambuc 	__CTASSERT(__SHIFTOUT(VFP_FPSCR_RZ, VFP_FPSCR_RMODE) == FP_RZ);
63*84d9c625SLionel Sambuc 	uint32_t fpscr;
64*84d9c625SLionel Sambuc 	__asm __volatile("vmrs %0, fpscr" : "=r" (fpscr));
65*84d9c625SLionel Sambuc 	return __SHIFTOUT(fpscr, VFP_FPSCR_RMODE);
662fe8fb19SBen Gras }
67