xref: /netbsd-src/external/gpl3/gcc/dist/libdecnumber/decRound.c (revision b1e838363e3c6fc78a55519254d99869742dd33c)
14fee23f9Smrg /* Internal testing support for rounding for decimal float.
24fee23f9Smrg 
3*b1e83836Smrg    Copyright (C) 2005-2022 Free Software Foundation, Inc.
44fee23f9Smrg 
54fee23f9Smrg    This file is part of GCC.
64fee23f9Smrg 
74fee23f9Smrg    GCC is free software; you can redistribute it and/or modify it
84fee23f9Smrg    under the terms of the GNU General Public License as published by
94fee23f9Smrg    the Free Software Foundation; either version 3, or (at your option)
104fee23f9Smrg    any later version.
114fee23f9Smrg 
124fee23f9Smrg    GCC is distributed in the hope that it will be useful, but WITHOUT
134fee23f9Smrg    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
144fee23f9Smrg    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
154fee23f9Smrg    License for more details.
164fee23f9Smrg 
174fee23f9Smrg Under Section 7 of GPL version 3, you are granted additional
184fee23f9Smrg permissions described in the GCC Runtime Library Exception, version
194fee23f9Smrg 3.1, as published by the Free Software Foundation.
204fee23f9Smrg 
214fee23f9Smrg You should have received a copy of the GNU General Public License and
224fee23f9Smrg a copy of the GCC Runtime Library Exception along with this program;
234fee23f9Smrg see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
244fee23f9Smrg <http://www.gnu.org/licenses/>.  */
254fee23f9Smrg 
264fee23f9Smrg #include "dconfig.h"
274fee23f9Smrg #include "decContext.h"
284fee23f9Smrg #include "decRound.h"
294fee23f9Smrg 
304fee23f9Smrg /* Internal, non-documented functions for testing libgcc functions.
314fee23f9Smrg    This support is not sufficient for application use.  */
324fee23f9Smrg 
334fee23f9Smrg #define FE_DEC_DOWNWARD 0
344fee23f9Smrg #define FE_DEC_TONEAREST 1
354fee23f9Smrg #define FE_DEC_TONEARESTFROMZERO 2
364fee23f9Smrg #define FE_DEC_TOWARDZERO 3
374fee23f9Smrg #define FE_DEC_UPWARD 4
384fee23f9Smrg #define FE_DEC_MAX 5
394fee23f9Smrg 
404fee23f9Smrg static enum rounding __dfp_rounding_mode = DEC_ROUND_HALF_EVEN;
414fee23f9Smrg 
424fee23f9Smrg /* Set the decNumber rounding mode from the FE_DEC_* value in MODE.  */
434fee23f9Smrg 
444fee23f9Smrg void
__dfp_set_round(int mode)454fee23f9Smrg __dfp_set_round (int mode)
464fee23f9Smrg {
474fee23f9Smrg   switch (mode)
484fee23f9Smrg     {
494fee23f9Smrg     case FE_DEC_DOWNWARD:
504fee23f9Smrg       __dfp_rounding_mode = DEC_ROUND_FLOOR; break;
514fee23f9Smrg     case FE_DEC_TONEAREST:
524fee23f9Smrg       __dfp_rounding_mode = DEC_ROUND_HALF_EVEN; break;
534fee23f9Smrg     case FE_DEC_TONEARESTFROMZERO:
544fee23f9Smrg       __dfp_rounding_mode = DEC_ROUND_HALF_UP; break;
554fee23f9Smrg     case FE_DEC_TOWARDZERO:
564fee23f9Smrg       __dfp_rounding_mode = DEC_ROUND_DOWN; break;
574fee23f9Smrg     case FE_DEC_UPWARD:
584fee23f9Smrg       __dfp_rounding_mode = DEC_ROUND_CEILING; break;
594fee23f9Smrg     default:
604fee23f9Smrg      /* We can't use assert in libgcc, so just return the default mode.  */
614fee23f9Smrg       __dfp_rounding_mode = DEC_ROUND_HALF_EVEN; break;
624fee23f9Smrg     }
634fee23f9Smrg }
644fee23f9Smrg 
654fee23f9Smrg /* Return the decNumber rounding mode as an FE_DEC_* value.  */
664fee23f9Smrg 
674fee23f9Smrg int
__dfp_get_round(void)684fee23f9Smrg __dfp_get_round (void)
694fee23f9Smrg {
704fee23f9Smrg   int mode;
714fee23f9Smrg 
724fee23f9Smrg   switch (__dfp_rounding_mode)
734fee23f9Smrg     {
744fee23f9Smrg     case DEC_ROUND_FLOOR:
754fee23f9Smrg       mode = FE_DEC_DOWNWARD; break;
764fee23f9Smrg     case DEC_ROUND_HALF_EVEN:
774fee23f9Smrg       mode = FE_DEC_TONEAREST; break;
784fee23f9Smrg     case DEC_ROUND_HALF_UP:
794fee23f9Smrg       mode = FE_DEC_TONEARESTFROMZERO; break;
804fee23f9Smrg     case DEC_ROUND_DOWN:
814fee23f9Smrg       mode = FE_DEC_TOWARDZERO; break;
824fee23f9Smrg     case DEC_ROUND_CEILING:
834fee23f9Smrg       mode = FE_DEC_UPWARD; break;
844fee23f9Smrg     default:
854fee23f9Smrg       /* We shouldn't get here, but can't use assert in libgcc.  */
864fee23f9Smrg       mode = -1;
874fee23f9Smrg     }
884fee23f9Smrg   return mode;
894fee23f9Smrg }
904fee23f9Smrg 
914fee23f9Smrg /* Return the decNumber version of the current rounding mode.  */
924fee23f9Smrg 
934fee23f9Smrg enum rounding
__decGetRound(void)944fee23f9Smrg __decGetRound (void)
954fee23f9Smrg {
964fee23f9Smrg   return __dfp_rounding_mode;
974fee23f9Smrg }
98