1/* Copyright (c) 2002  Michael Stumpf  <mistumpf@de.pepperl-fuchs.com>
2   Copyright (c) 2006  Dmitry Xmelkov
3   All rights reserved.
4
5   Redistribution and use in source and binary forms, with or without
6   modification, are permitted provided that the following conditions are met:
7
8   * Redistributions of source code must retain the above copyright
9     notice, this list of conditions and the following disclaimer.
10   * Redistributions in binary form must reproduce the above copyright
11     notice, this list of conditions and the following disclaimer in
12     the documentation and/or other materials provided with the
13     distribution.
14   * Neither the name of the copyright holders nor the names of
15     contributors may be used to endorse or promote products derived
16     from this software without specific prior written permission.
17
18   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28   POSSIBILITY OF SUCH DAMAGE. */
29
30/* $Id: fp_powser.S 2473 2015-04-09 08:10:22Z pitchumani $ */
31
32#if !defined(__AVR_TINY__)
33
34#include "fp32def.h"
35#include "asmdef.h"
36
37/* flt40_t __fp_powser (float x, ZH.ZL);
38     The __fp_powser() function calculates the polynom.
39
40   Input:
41     rA3.rA2.rA1.rA0	- an 'x' arg
42     ZH.ZL		- table address (in low 64K flash memory)
43   Output:
44     rA3.rA2.rA1.rA0.rAE - result (is't rounded)
45
46   Table format:
47     ; example for 3 power: C0 + x*(C1 + x*(C2 + x*C3))
48     ; all floats are little-endian
49	.byte	3		; polynom power
50	.byte	   C3,C3,C3,C3	; flt32_t C3
51	.byte	C2,C2,C2,C2,C2	; flt40_t C2
52	.byte	C1,C1,C1,C1,C1	; flt40_t C1
53	.byte	C0,C0,C0,C0,C0	; flt40_t C0
54 */
55
56#define	rC3	r17
57#define	rC2	r16
58#define	rC1	r15
59#define	rC0	r14
60#define	rcntr	r13
61
62ENTRY __fp_powser
63	push	YH
64	push	YL
65	push	rC3
66	push	rC2
67	push	rC1
68	push	rC0
69	push	rcntr
70
71	X_movw	rC0, rA0
72	X_movw	rC2, rA2
73
74	set			; as flag to return
75	rjmp	.Load5
761:	mov	rcntr, rBE
77
78.Loop:	X_movw	YL, ZL
79	XCALL	_U(__mulsf3x)
80	X_movw	ZL, YL
81
82	clt
83.Load5:
84	X_lpm	rBE, Z+
85	X_lpm	rB0, Z+
86	X_lpm	rB1, Z+
87	X_lpm	rB2, Z+
88	X_lpm	rB3, Z+
89	brts	1b
90
91	X_movw	YL, ZL
92	XCALL	_U(__addsf3x)
93	X_movw	ZL, YL
94
95	X_movw	rB0, rC0
96	X_movw	rB2, rC2
97	dec	rcntr
98	brne	.Loop
99
100	pop	rcntr
101	pop	rC0
102	pop	rC1
103	pop	rC2
104	pop	rC3
105	pop	YL
106	pop	YH
107	ret
108ENDFUNC
109
110#endif /* !defined(__AVR_TINY__) */
111