summaryrefslogtreecommitdiff
path: root/device/lib/_logexpf.c
diff options
context:
space:
mode:
Diffstat (limited to 'device/lib/_logexpf.c')
-rw-r--r--device/lib/_logexpf.c129
1 files changed, 129 insertions, 0 deletions
diff --git a/device/lib/_logexpf.c b/device/lib/_logexpf.c
new file mode 100644
index 0000000..f89046c
--- /dev/null
+++ b/device/lib/_logexpf.c
@@ -0,0 +1,129 @@
+/*-------------------------------------------------------------------------
+ _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