/*-------------------------------------------------------------------------
 
   _logexpf.c
 
 
 
   Copyright (C) 2005, Paul Stoffregen
 
 
 
   This library is free software; you can redistribute it and/or modify it
 
   under the terms of the GNU General Public License as published by the
 
   Free Software Foundation; either version 2, 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 library; see the file COPYING. If not, write to the
 
   Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
 
   MA 02110-1301, USA.
 
 
 
   As a special exception, if you link this library with other files,
 
   some of which are compiled with SDCC, to produce an executable,
 
   this library does not by itself cause the resulting executable to
 
   be covered by the GNU General Public License. This exception does
 
   not however invalidate any other reasons why the executable file
 
   might be covered by the GNU General Public License.
 
-------------------------------------------------------------------------*/
 
 
 
#define __SDCC_MATH_LIB
 
#include <math.h>
 
 
 
 
 
#ifdef MATH_ASM_MCS51
 
 
 
// This code is shared by both logf() and expf(), so it goes in this
 
// separate file to allow the linker to include it when either
 
// function is needed, but only 1 copy when both are used.
 
 
 
void _fs_cordic_rshift_r765_unsigned(void) __naked
 
{
 
        __asm
 
        ar2 = 0x02
 
        ar3 = 0x03
 
        ar4 = 0x04
 
        ar5 = 0x05
 
        ar6 = 0x06
 
        ar7 = 0x07
 
        ar0 = 0x00
 
        ar1 = 0x01
 
 
 
        add     a, #248
 
        jnc     00003$
 
        mov     b, r5
 
        mov     r5, ar6
 
        mov     r6, ar7
 
        mov     r7, #0
 
        add     a, #248
 
        jnc     00003$
 
        mov     b, r5
 
        mov     r5, ar6
 
        mov     r6, #0
 
        add     a, #248
 
        jnc     00003$
 
        mov     b, r5
 
        mov     r5, #0
 
        add     a, #248
 
        jnc     00003$
 
        mov     b, #0
 
        ret
 
00003$:
 
        add     a, #8
 
        jz      00030$
 
        push    ar0
 
        mov     r0, a
 
00010$:
 
        clr     c
 
        mov     a, r7
 
        rrc     a
 
        mov     r7, a
 
        mov     a, r6
 
        rrc     a
 
        mov     r6, a
 
        mov     a, r5
 
        rrc     a
 
        mov     r5, a
 
        mov     a, b
 
        rrc     a
 
        mov     b, a
 
        djnz    r0, 00010$
 
        pop     ar0
 
00030$:
 
        ret
 
        __endasm;
 
}
 
 
 
__code unsigned char _fs_natural_log_table[] = {
 
0xFF, 0x42, 0x2E, 0x16,         // 0.693147180560
 
0xF6, 0x91, 0xF9, 0x0C,         // 0.405465108108
 
0xF2, 0xFD, 0x23, 0x07,         // 0.223143551314
 
0xEE, 0xE0, 0xC4, 0x03,         // 0.117783035656
 
0x0C, 0xA3, 0xF0, 0x01,         // 0.060624621816
 
0xD8, 0x14, 0xFC, 0x00,         // 0.030771658667
 
0xA3, 0x02, 0x7F, 0x00,         // 0.015504186536
 
0x55, 0xC0, 0x3F, 0x00,         // 0.007782140442
 
0x0B, 0xF0, 0x1F, 0x00,         // 0.003898640416
 
0x01, 0xFC, 0x0F, 0x00,         // 0.001951220131
 
0x00, 0xFF, 0x07, 0x00,         // 0.000976085973
 
0xC0, 0xFF, 0x03, 0x00,         // 0.000488162080
 
0xF0, 0xFF, 0x01, 0x00,         // 0.000244110828
 
0xFC, 0xFF, 0x00, 0x00,         // 0.000122062863
 
0xFF, 0x7F, 0x00, 0x00,         // 0.000061033294
 
0x00, 0x40, 0x00, 0x00,         // 0.000030517112
 
0x00, 0x20, 0x00, 0x00,         // 0.000015258673
 
0x00, 0x10, 0x00, 0x00,         // 0.000007629365
 
0x00, 0x08, 0x00, 0x00,         // 0.000003814690
 
0x00, 0x04, 0x00, 0x00,         // 0.000001907347
 
0x00, 0x02, 0x00, 0x00,         // 0.000000953674
 
0x00, 0x01, 0x00, 0x00,         // 0.000000476837
 
0x80, 0x00, 0x00, 0x00,         // 0.000000238419
 
0x40, 0x00, 0x00, 0x00,         // 0.000000119209
 
0x20, 0x00, 0x00, 0x00,         // 0.000000059605
 
0x10, 0x00, 0x00, 0x00,         // 0.000000029802
 
0x08, 0x00, 0x00, 0x00,         // 0.000000014901
 
0x04, 0x00, 0x00, 0x00,         // 0.000000007451
 
0x02, 0x00, 0x00, 0x00,         // 0.000000003725
 
0x01, 0x00, 0x00, 0x00          // 0.000000001863
 
};
 
 
 
#endif