diff --git a/arch/arm/mach-msm/Makefile b/arch/arm/mach-msm/Makefile index 314b446a..93933c8d 100644 --- a/arch/arm/mach-msm/Makefile +++ b/arch/arm/mach-msm/Makefile @@ -101,6 +101,7 @@ obj-$(CONFIG_MACH_BRAVOC) += board-bravoc-microp.o clock.o obj-$(CONFIG_MACH_HTCLEO) += board-htcleo.o board-htcleo-spi.o board-htcleo-panel.o board-htcleo-keypad.o obj-$(CONFIG_MACH_HTCLEO) += board-htcleo-ts.o board-htcleo-mmc.o ieee754-df.o +obj-$(CONFIG_MACH_HTCLEO) += board-htcleo-log.o obj-$(CONFIG_MACH_HTCLEO) += clock-wince.o # MSM7x30 boards diff --git a/arch/arm/mach-msm/board-htcleo-log.c b/arch/arm/mach-msm/board-htcleo-log.c new file mode 100644 index 00000000..db920492 --- /dev/null +++ b/arch/arm/mach-msm/board-htcleo-log.c @@ -0,0 +1,121 @@ +/* arch/arm/mach-msm/board-htcleo-log.c +* +* Copyright (C) 2010 Cotulla +* Copyright (C) Open Watcom Project +* +* This software is licensed under the terms of the GNU General Public +* License version 2, as published by the Free Software Foundation, and +* may be copied, distributed, and modified under those terms. +* +* This program 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. +* +*/ +#include +#include +#include +#include +#include + + + +#define sqrt_of_half 0.7071067811865475244 +#define C1 (355./512.) +#define C2 (-2.121944400546905827679e-4) + + +static const double APoly[] = +{ + -0.78956112887491257267, + 0.16383943563021534222e+2, + -0.64124943423745581147e+2 +}; + +static const double BPoly[] = +{ + 1.0, + -0.35667977739034646171e+2, + 0.31203222091924532844e+3, + -0.76949932108494879777e+3 +}; + +static double _EvalPoly( double x, const double *poly, int degree ) +/********************************************************************/ +{ + double z; + + z = *poly++; + do + { + z = z * x + *poly++; + } while( --degree != 0 ); + return( z ); +} + +static double frexp( double value, int *exp ) +/**********************************************/ +{ + int n; + union + { + double x; + unsigned short a[4]; + } u; + + n = 0; + u.x = value; + if( value != 0.0 ) + { + n = (u.a[3] & 0x7ff0) >> 4; + n -= 0x03fe; + u.a[3] &= 0x800f; + u.a[3] |= 0x3fe0; + } + *exp = n; + return( u.x ); +} + + +double log(double x) +/***********************************/ +{ + int exp; + double z; + + if( x <= 0.0 ) + { + BUG(); + x = 0; // who cares? :) + } + else + { + x = frexp( x, &exp ); + z = x - .5; + if( x > sqrt_of_half ) + { + z -= .5; + } + else + { + x = z; + --exp; + } + z = z / (x * .5 + .5); + x = z * z; + x = z + z * x * _EvalPoly( x, APoly, 2 ) / _EvalPoly( x, BPoly, 3 ); + if( exp != 0 ) + { + z = exp; + x = (z * C2 + x) + z * C1; + } + } + return( x ); +} + + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Cotulla"); +MODULE_DESCRIPTION("htcleo log function"); +// END OF FILE