X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=device%2Flib%2F_fs2sint.c;h=53f2e2d3da6092812068747fe3f8e3a0ffd08b93;hb=3bd25d75bcad68055bb616dcc29dde8a2965965e;hp=9299872f9559668d785adad9def42c364ec9f30d;hpb=9da5fdfa3ce768702c72349975421df704ec3e4c;p=fw%2Fsdcc diff --git a/device/lib/_fs2sint.c b/device/lib/_fs2sint.c index 9299872f..53f2e2d3 100644 --- a/device/lib/_fs2sint.c +++ b/device/lib/_fs2sint.c @@ -1,11 +1,81 @@ -#include <_float.h> +/* Floating point library in optimized assembly for 8051 + * Copyright (c) 2004, Paul Stoffregen, paul@pjrc.com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + + +#define SDCC_FLOAT_LIB +#include + + +#ifdef FLOAT_ASM_MCS51 + +// int __fs2sint (float x) +static void dummy(void) __naked +{ + __asm + .globl ___fs2sint +___fs2sint: + lcall ___fs2slong + jnz fs2sint_not_zero + mov a, dpl + orl a, dph + orl a, b + jnz fs2sint_clr_a + ret +fs2sint_clr_a: + clr a +fs2sint_not_zero: + jnb sign_a, fs2sint_pos +fs2sint_neg: + cpl a + jnz fs2sint_maxval_neg + mov a, b + cpl a + jnz fs2sint_maxval_neg + mov a, dph + jnb acc.7, fs2sint_maxval_neg + ret +fs2sint_maxval_neg: + mov dptr, #0x8000 + ret +fs2sint_pos: + jnz fs2sint_maxval_pos + mov a, b + jnz fs2sint_maxval_pos + mov a, dph + jb acc.7, fs2sint_maxval_pos + ret +fs2sint_maxval_pos: + mov dptr, #0x7FFF + ret + __endasm; +} + +#else /* convert float to signed int */ -signed int __fs2sint (float f) { +signed int __fs2sint (float f) +{ signed long sl=__fs2slong(f); - if (sl>=SINT_MAX) - return SINT_MAX; - if (sl<=SINT_MIN) - return -SINT_MIN; + if (sl>=INT_MAX) + return INT_MAX; + if (sl<=INT_MIN) + return -INT_MIN; return sl; } + +#endif