1/* libgcc routines for the FR30.
2   Copyright (C) 1998-2019 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it
7under the terms of the GNU General Public License as published by the
8Free Software Foundation; either version 3, or (at your option) any
9later version.
10
11This file is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14General Public License for more details.
15
16Under Section 7 of GPL version 3, you are granted additional
17permissions described in the GCC Runtime Library Exception, version
183.1, as published by the Free Software Foundation.
19
20You should have received a copy of the GNU General Public License and
21a copy of the GCC Runtime Library Exception along with this program;
22see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23<http://www.gnu.org/licenses/>.  */
24
25	.macro FUNC_START name
26	.text
27	.globl __\name
28	.type  __\name, @function
29__\name:
30	.endm
31
32	.macro FUNC_END name
33	.size  __\name, . - __\name
34	.endm
35
36	.macro DIV_BODY reg number
37	.if \number
38	DIV_BODY  \reg, "\number - 1"
39	div1	\reg
40	.endif
41	.endm
42
43#ifdef L_udivsi3
44FUNC_START udivsi3
45	;; Perform an unsiged division of r4 / r5 and place the result in r4.
46	;; Does not handle overflow yet...
47	mov	r4, mdl
48	div0u	r5
49	DIV_BODY r5 32
50	mov	mdl, r4
51	ret
52FUNC_END udivsi3
53#endif /* L_udivsi3 */
54
55#ifdef L_divsi3
56FUNC_START divsi3
57	;; Perform a siged division of r4 / r5 and place the result in r4.
58	;; Does not handle overflow yet...
59	mov	r4, mdl
60	div0s	r5
61	DIV_BODY r5 32
62	div2    r5
63	div3
64	div4s
65	mov	mdl, r4
66	ret
67FUNC_END divsi3
68#endif /* L_divsi3 */
69
70#ifdef L_umodsi3
71FUNC_START umodsi3
72	;; Perform an unsiged division of r4 / r5 and places the remainder in r4.
73	;; Does not handle overflow yet...
74	mov	r4, mdl
75	div0u	r5
76	DIV_BODY r5 32
77	mov	mdh, r4
78	ret
79FUNC_END umodsi3
80#endif /* L_umodsi3 */
81
82#ifdef L_modsi3
83FUNC_START modsi3
84	;; Perform a siged division of r4 / r5 and place the remainder in r4.
85	;; Does not handle overflow yet...
86	mov	r4, mdl
87	div0s	r5
88	DIV_BODY r5 32
89	div2    r5
90	div3
91	div4s
92	mov	mdh, r4
93	ret
94FUNC_END modsi3
95#endif /* L_modsi3 */
96
97#ifdef L_negsi2
98FUNC_START negsi2
99	ldi:8	#0, r0
100	sub	r4, r0
101	mov	r0, r4
102	ret
103FUNC_END negsi2
104#endif /* L_negsi2 */
105
106#ifdef L_one_cmplsi2
107FUNC_START one_cmplsi2
108	ldi:8	#0xff, r0
109	extsb	r0
110	eor	r0, r4
111	ret
112FUNC_END one_cmplsi2
113#endif /* L_one_cmplsi2 */
114
115
116