1/* libgcc routines for NEC V850.
2   Copyright (C) 1996, 1997, 2002 Free Software Foundation, Inc.
3
4This file is part of GNU CC.
5
6GNU CC 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 2, or (at your option) any
9later version.
10
11In addition to the permissions in the GNU General Public License, the
12Free Software Foundation gives you unlimited permission to link the
13compiled version of this file into combinations with other programs,
14and to distribute those combinations without any restriction coming
15from the use of this file.  (The General Public License restrictions
16do apply in other respects; for example, they cover modification of
17the file, and distribution when not linked into a combine
18executable.)
19
20This file is distributed in the hope that it will be useful, but
21WITHOUT ANY WARRANTY; without even the implied warranty of
22MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23General Public License for more details.
24
25You should have received a copy of the GNU General Public License
26along with this program; see the file COPYING.  If not, write to
27the Free Software Foundation, 59 Temple Place - Suite 330,
28Boston, MA 02111-1307, USA.  */
29
30#ifdef L_mulsi3
31	.text
32	.globl ___mulsi3
33	.type  ___mulsi3,@function
34___mulsi3:
35#ifdef __v850__
36/*
37   #define SHIFT 12
38   #define MASK ((1 << SHIFT) - 1)
39
40   #define STEP(i, j)                               \
41   ({                                               \
42       short a_part = (a >> (i)) & MASK;            \
43       short b_part = (b >> (j)) & MASK;            \
44       int res = (((int) a_part) * ((int) b_part)); \
45       res;                                         \
46   })
47
48   int
49   __mulsi3 (unsigned a, unsigned b)
50   {
51      return STEP (0, 0) +
52          ((STEP (SHIFT, 0) + STEP (0, SHIFT)) << SHIFT) +
53          ((STEP (0, 2 * SHIFT) + STEP (SHIFT, SHIFT) + STEP (2 * SHIFT, 0))
54           << (2 * SHIFT));
55   }
56*/
57        mov   r6, r14
58        movea lo(32767), r0, r10
59        and   r10, r14
60        mov   r7,  r15
61        and   r10, r15
62        shr   15,  r6
63        mov   r6,  r13
64        and   r10, r13
65        shr   15,  r7
66        mov   r7,  r12
67        and   r10, r12
68        shr   15,  r6
69        shr   15,  r7
70        mov   r14, r10
71        mulh  r15, r10
72        mov   r14, r11
73        mulh  r12, r11
74        mov   r13, r16
75        mulh  r15, r16
76        mulh  r14, r7
77        mulh  r15, r6
78        add   r16, r11
79        mulh  r13, r12
80        shl   15,  r11
81        add   r11, r10
82        add   r12, r7
83        add   r6,  r7
84        shl   30,  r7
85        add   r7,  r10
86        jmp   [r31]
87#endif /* __v850__ */
88#if defined(__v850e__) || defined(__v850ea__)
89        /* This routine is almost unneccesarry because gcc
90           generates the MUL instruction for the RTX mulsi3.
91           But if someone wants to link his application with
92           previsously compiled v850 objects then they will
93	   need this function.  */
94
95        /* It isn't good to put the inst sequence as below;
96              mul r7, r6,
97              mov r6, r10, r0
98           In this case, there is a RAW hazard between them.
99           MUL inst takes 2 cycle in EX stage, then MOV inst
100           must wait 1cycle.  */
101        mov   r7, r10
102        mul   r6, r10, r0
103        jmp   [r31]
104#endif /* __v850e__ */
105	.size ___mulsi3,.-___mulsi3
106#endif /* L_mulsi3 */
107
108
109#ifdef L_udivsi3
110	.text
111	.global ___udivsi3
112	.type	___udivsi3,@function
113___udivsi3:
114#ifdef __v850__
115	mov 1,r12
116	mov 0,r10
117	cmp r6,r7
118	bnl .L12
119	movhi hi(-2147483648),r0,r13
120	cmp r0,r7
121	blt .L12
122.L4:
123	shl 1,r7
124	shl 1,r12
125	cmp r6,r7
126	bnl .L12
127	cmp r0,r12
128	be .L8
129	mov r7,r19
130	and r13,r19
131	be .L4
132	br .L12
133.L9:
134	cmp r7,r6
135	bl .L10
136	sub r7,r6
137	or r12,r10
138.L10:
139	shr 1,r12
140	shr 1,r7
141.L12:
142	cmp r0,r12
143	bne .L9
144.L8:
145	jmp [r31]
146
147#else /* defined(__v850e__) */
148
149	/* See comments at end of __mulsi3.  */
150	mov   r6, r10
151	divu  r7, r10, r0
152	jmp   [r31]
153
154#endif /* __v850e__ */
155
156	.size ___udivsi3,.-___udivsi3
157#endif
158
159#ifdef L_divsi3
160	.text
161	.globl ___divsi3
162	.type  ___divsi3,@function
163___divsi3:
164#ifdef __v850__
165	add -8,sp
166	st.w r31,4[sp]
167	st.w r22,0[sp]
168	mov 1,r22
169	tst r7,r7
170	bp .L3
171	subr r0,r7
172	subr r0,r22
173.L3:
174	tst r6,r6
175	bp .L4
176	subr r0,r6
177	subr r0,r22
178.L4:
179	jarl ___udivsi3,r31
180	cmp r0,r22
181	bp .L7
182	subr r0,r10
183.L7:
184	ld.w 0[sp],r22
185	ld.w 4[sp],r31
186	add 8,sp
187	jmp [r31]
188
189#else /* defined(__v850e__) */
190
191	/* See comments at end of __mulsi3.  */
192	mov   r6, r10
193	div   r7, r10, r0
194	jmp   [r31]
195
196#endif /* __v850e__ */
197
198	.size ___divsi3,.-___divsi3
199#endif
200
201#ifdef  L_umodsi3
202	.text
203	.globl ___umodsi3
204	.type  ___umodsi3,@function
205___umodsi3:
206#ifdef __v850__
207	add -12,sp
208	st.w r31,8[sp]
209	st.w r7,4[sp]
210	st.w r6,0[sp]
211	jarl ___udivsi3,r31
212	ld.w 4[sp],r7
213	mov r10,r6
214	jarl ___mulsi3,r31
215	ld.w 0[sp],r6
216	subr r6,r10
217	ld.w 8[sp],r31
218	add 12,sp
219	jmp [r31]
220
221#else /* defined(__v850e__) */
222
223	/* See comments at end of __mulsi3.  */
224	divu  r7, r6, r10
225	jmp   [r31]
226
227#endif /* __v850e__ */
228
229	.size ___umodsi3,.-___umodsi3
230#endif /* L_umodsi3 */
231
232#ifdef  L_modsi3
233	.text
234	.globl ___modsi3
235	.type  ___modsi3,@function
236___modsi3:
237#ifdef __v850__
238	add -12,sp
239	st.w r31,8[sp]
240	st.w r7,4[sp]
241	st.w r6,0[sp]
242	jarl ___divsi3,r31
243	ld.w 4[sp],r7
244	mov r10,r6
245	jarl ___mulsi3,r31
246	ld.w 0[sp],r6
247	subr r6,r10
248	ld.w 8[sp],r31
249	add 12,sp
250	jmp [r31]
251
252#else /* defined(__v850e__) */
253
254	/* See comments at end of __mulsi3.  */
255	div  r7, r6, r10
256	jmp [r31]
257
258#endif /* __v850e__ */
259
260	.size ___modsi3,.-___modsi3
261#endif /* L_modsi3 */
262
263#ifdef	L_save_2
264	.text
265	.align	2
266	.globl	__save_r2_r29
267	.type	__save_r2_r29,@function
268	/* Allocate space and save registers 2, 20 .. 29 on the stack */
269	/* Called via:	jalr __save_r2_r29,r10 */
270__save_r2_r29:
271	mov	ep,r1
272	addi	-44,sp,sp
273	mov	sp,ep
274	sst.w	r29,0[ep]
275	sst.w	r28,4[ep]
276	sst.w	r27,8[ep]
277	sst.w	r26,12[ep]
278	sst.w	r25,16[ep]
279	sst.w	r24,20[ep]
280	sst.w	r23,24[ep]
281	sst.w	r22,28[ep]
282	sst.w	r21,32[ep]
283	sst.w	r20,36[ep]
284	sst.w	r2,40[ep]
285	mov	r1,ep
286	jmp	[r10]
287	.size	__save_r2_r29,.-__save_r2_r29
288
289	/* Restore saved registers, deallocate stack and return to the user */
290	/* Called via:	jr __return_r2_r29 */
291	.align	2
292	.globl	__return_r2_r29
293	.type	__return_r2_r29,@function
294__return_r2_r29:
295	mov	ep,r1
296	mov	sp,ep
297	sld.w	0[ep],r29
298	sld.w	4[ep],r28
299	sld.w	8[ep],r27
300	sld.w	12[ep],r26
301	sld.w	16[ep],r25
302	sld.w	20[ep],r24
303	sld.w	24[ep],r23
304	sld.w	28[ep],r22
305	sld.w	32[ep],r21
306	sld.w	36[ep],r20
307	sld.w	40[ep],r2
308	addi	44,sp,sp
309	mov	r1,ep
310	jmp	[r31]
311	.size	__return_r2_r29,.-__return_r2_r29
312#endif /* L_save_2 */
313
314#ifdef	L_save_20
315	.text
316	.align	2
317	.globl	__save_r20_r29
318	.type	__save_r20_r29,@function
319	/* Allocate space and save registers 20 .. 29 on the stack */
320	/* Called via:	jalr __save_r20_r29,r10 */
321__save_r20_r29:
322	mov	ep,r1
323	addi	-40,sp,sp
324	mov	sp,ep
325	sst.w	r29,0[ep]
326	sst.w	r28,4[ep]
327	sst.w	r27,8[ep]
328	sst.w	r26,12[ep]
329	sst.w	r25,16[ep]
330	sst.w	r24,20[ep]
331	sst.w	r23,24[ep]
332	sst.w	r22,28[ep]
333	sst.w	r21,32[ep]
334	sst.w	r20,36[ep]
335	mov	r1,ep
336	jmp	[r10]
337	.size	__save_r20_r29,.-__save_r20_r29
338
339	/* Restore saved registers, deallocate stack and return to the user */
340	/* Called via:	jr __return_r20_r29 */
341	.align	2
342	.globl	__return_r20_r29
343	.type	__return_r20_r29,@function
344__return_r20_r29:
345	mov	ep,r1
346	mov	sp,ep
347	sld.w	0[ep],r29
348	sld.w	4[ep],r28
349	sld.w	8[ep],r27
350	sld.w	12[ep],r26
351	sld.w	16[ep],r25
352	sld.w	20[ep],r24
353	sld.w	24[ep],r23
354	sld.w	28[ep],r22
355	sld.w	32[ep],r21
356	sld.w	36[ep],r20
357	addi	40,sp,sp
358	mov	r1,ep
359	jmp	[r31]
360	.size	__return_r20_r29,.-__return_r20_r29
361#endif /* L_save_20 */
362
363#ifdef	L_save_21
364	.text
365	.align	2
366	.globl	__save_r21_r29
367	.type	__save_r21_r29,@function
368	/* Allocate space and save registers 21 .. 29 on the stack */
369	/* Called via:	jalr __save_r21_r29,r10 */
370__save_r21_r29:
371	mov	ep,r1
372	addi	-36,sp,sp
373	mov	sp,ep
374	sst.w	r29,0[ep]
375	sst.w	r28,4[ep]
376	sst.w	r27,8[ep]
377	sst.w	r26,12[ep]
378	sst.w	r25,16[ep]
379	sst.w	r24,20[ep]
380	sst.w	r23,24[ep]
381	sst.w	r22,28[ep]
382	sst.w	r21,32[ep]
383	mov	r1,ep
384	jmp	[r10]
385	.size	__save_r21_r29,.-__save_r21_r29
386
387	/* Restore saved registers, deallocate stack and return to the user */
388	/* Called via:	jr __return_r21_r29 */
389	.align	2
390	.globl	__return_r21_r29
391	.type	__return_r21_r29,@function
392__return_r21_r29:
393	mov	ep,r1
394	mov	sp,ep
395	sld.w	0[ep],r29
396	sld.w	4[ep],r28
397	sld.w	8[ep],r27
398	sld.w	12[ep],r26
399	sld.w	16[ep],r25
400	sld.w	20[ep],r24
401	sld.w	24[ep],r23
402	sld.w	28[ep],r22
403	sld.w	32[ep],r21
404	addi	36,sp,sp
405	mov	r1,ep
406	jmp	[r31]
407	.size	__return_r21_r29,.-__return_r21_r29
408#endif /* L_save_21 */
409
410#ifdef	L_save_22
411	.text
412	.align	2
413	.globl	__save_r22_r29
414	.type	__save_r22_r29,@function
415	/* Allocate space and save registers 22 .. 29 on the stack */
416	/* Called via:	jalr __save_r22_r29,r10 */
417__save_r22_r29:
418	mov	ep,r1
419	addi	-32,sp,sp
420	mov	sp,ep
421	sst.w	r29,0[ep]
422	sst.w	r28,4[ep]
423	sst.w	r27,8[ep]
424	sst.w	r26,12[ep]
425	sst.w	r25,16[ep]
426	sst.w	r24,20[ep]
427	sst.w	r23,24[ep]
428	sst.w	r22,28[ep]
429	mov	r1,ep
430	jmp	[r10]
431	.size	__save_r22_r29,.-__save_r22_r29
432
433	/* Restore saved registers, deallocate stack and return to the user */
434	/* Called via:	jr __return_r22_r29 */
435	.align	2
436	.globl	__return_r22_r29
437	.type	__return_r22_r29,@function
438__return_r22_r29:
439	mov	ep,r1
440	mov	sp,ep
441	sld.w	0[ep],r29
442	sld.w	4[ep],r28
443	sld.w	8[ep],r27
444	sld.w	12[ep],r26
445	sld.w	16[ep],r25
446	sld.w	20[ep],r24
447	sld.w	24[ep],r23
448	sld.w	28[ep],r22
449	addi	32,sp,sp
450	mov	r1,ep
451	jmp	[r31]
452	.size	__return_r22_r29,.-__return_r22_r29
453#endif /* L_save_22 */
454
455#ifdef	L_save_23
456	.text
457	.align	2
458	.globl	__save_r23_r29
459	.type	__save_r23_r29,@function
460	/* Allocate space and save registers 23 .. 29 on the stack */
461	/* Called via:	jalr __save_r23_r29,r10 */
462__save_r23_r29:
463	mov	ep,r1
464	addi	-28,sp,sp
465	mov	sp,ep
466	sst.w	r29,0[ep]
467	sst.w	r28,4[ep]
468	sst.w	r27,8[ep]
469	sst.w	r26,12[ep]
470	sst.w	r25,16[ep]
471	sst.w	r24,20[ep]
472	sst.w	r23,24[ep]
473	mov	r1,ep
474	jmp	[r10]
475	.size	__save_r23_r29,.-__save_r23_r29
476
477	/* Restore saved registers, deallocate stack and return to the user */
478	/* Called via:	jr __return_r23_r29 */
479	.align	2
480	.globl	__return_r23_r29
481	.type	__return_r23_r29,@function
482__return_r23_r29:
483	mov	ep,r1
484	mov	sp,ep
485	sld.w	0[ep],r29
486	sld.w	4[ep],r28
487	sld.w	8[ep],r27
488	sld.w	12[ep],r26
489	sld.w	16[ep],r25
490	sld.w	20[ep],r24
491	sld.w	24[ep],r23
492	addi	28,sp,sp
493	mov	r1,ep
494	jmp	[r31]
495	.size	__return_r23_r29,.-__return_r23_r29
496#endif /* L_save_23 */
497
498#ifdef	L_save_24
499	.text
500	.align	2
501	.globl	__save_r24_r29
502	.type	__save_r24_r29,@function
503	/* Allocate space and save registers 24 .. 29 on the stack */
504	/* Called via:	jalr __save_r24_r29,r10 */
505__save_r24_r29:
506	mov	ep,r1
507	addi	-24,sp,sp
508	mov	sp,ep
509	sst.w	r29,0[ep]
510	sst.w	r28,4[ep]
511	sst.w	r27,8[ep]
512	sst.w	r26,12[ep]
513	sst.w	r25,16[ep]
514	sst.w	r24,20[ep]
515	mov	r1,ep
516	jmp	[r10]
517	.size	__save_r24_r29,.-__save_r24_r29
518
519	/* Restore saved registers, deallocate stack and return to the user */
520	/* Called via:	jr __return_r24_r29 */
521	.align	2
522	.globl	__return_r24_r29
523	.type	__return_r24_r29,@function
524__return_r24_r29:
525	mov	ep,r1
526	mov	sp,ep
527	sld.w	0[ep],r29
528	sld.w	4[ep],r28
529	sld.w	8[ep],r27
530	sld.w	12[ep],r26
531	sld.w	16[ep],r25
532	sld.w	20[ep],r24
533	addi	24,sp,sp
534	mov	r1,ep
535	jmp	[r31]
536	.size	__return_r24_r29,.-__return_r24_r29
537#endif /* L_save_24 */
538
539#ifdef	L_save_25
540	.text
541	.align	2
542	.globl	__save_r25_r29
543	.type	__save_r25_r29,@function
544	/* Allocate space and save registers 25 .. 29 on the stack */
545	/* Called via:	jalr __save_r25_r29,r10 */
546__save_r25_r29:
547	mov	ep,r1
548	addi	-20,sp,sp
549	mov	sp,ep
550	sst.w	r29,0[ep]
551	sst.w	r28,4[ep]
552	sst.w	r27,8[ep]
553	sst.w	r26,12[ep]
554	sst.w	r25,16[ep]
555	mov	r1,ep
556	jmp	[r10]
557	.size	__save_r25_r29,.-__save_r25_r29
558
559	/* Restore saved registers, deallocate stack and return to the user */
560	/* Called via:	jr __return_r25_r29 */
561	.align	2
562	.globl	__return_r25_r29
563	.type	__return_r25_r29,@function
564__return_r25_r29:
565	mov	ep,r1
566	mov	sp,ep
567	sld.w	0[ep],r29
568	sld.w	4[ep],r28
569	sld.w	8[ep],r27
570	sld.w	12[ep],r26
571	sld.w	16[ep],r25
572	addi	20,sp,sp
573	mov	r1,ep
574	jmp	[r31]
575	.size	__return_r25_r29,.-__return_r25_r29
576#endif /* L_save_25 */
577
578#ifdef	L_save_26
579	.text
580	.align	2
581	.globl	__save_r26_r29
582	.type	__save_r26_r29,@function
583	/* Allocate space and save registers 26 .. 29 on the stack */
584	/* Called via:	jalr __save_r26_r29,r10 */
585__save_r26_r29:
586	mov	ep,r1
587	add	-16,sp
588	mov	sp,ep
589	sst.w	r29,0[ep]
590	sst.w	r28,4[ep]
591	sst.w	r27,8[ep]
592	sst.w	r26,12[ep]
593	mov	r1,ep
594	jmp	[r10]
595	.size	__save_r26_r29,.-__save_r26_r29
596
597	/* Restore saved registers, deallocate stack and return to the user */
598	/* Called via:	jr __return_r26_r29 */
599	.align	2
600	.globl	__return_r26_r29
601	.type	__return_r26_r29,@function
602__return_r26_r29:
603	mov	ep,r1
604	mov	sp,ep
605	sld.w	0[ep],r29
606	sld.w	4[ep],r28
607	sld.w	8[ep],r27
608	sld.w	12[ep],r26
609	addi	16,sp,sp
610	mov	r1,ep
611	jmp	[r31]
612	.size	__return_r26_r29,.-__return_r26_r29
613#endif /* L_save_26 */
614
615#ifdef	L_save_27
616	.text
617	.align	2
618	.globl	__save_r27_r29
619	.type	__save_r27_r29,@function
620	/* Allocate space and save registers 27 .. 29 on the stack */
621	/* Called via:	jalr __save_r27_r29,r10 */
622__save_r27_r29:
623	add	-12,sp
624	st.w	r29,0[sp]
625	st.w	r28,4[sp]
626	st.w	r27,8[sp]
627	jmp	[r10]
628	.size	__save_r27_r29,.-__save_r27_r29
629
630	/* Restore saved registers, deallocate stack and return to the user */
631	/* Called via:	jr __return_r27_r29 */
632	.align	2
633	.globl	__return_r27_r29
634	.type	__return_r27_r29,@function
635__return_r27_r29:
636	ld.w	0[sp],r29
637	ld.w	4[sp],r28
638	ld.w	8[sp],r27
639	add	12,sp
640	jmp	[r31]
641	.size	__return_r27_r29,.-__return_r27_r29
642#endif /* L_save_27 */
643
644#ifdef	L_save_28
645	.text
646	.align	2
647	.globl	__save_r28_r29
648	.type	__save_r28_r29,@function
649	/* Allocate space and save registers 28,29 on the stack */
650	/* Called via:	jalr __save_r28_r29,r10 */
651__save_r28_r29:
652	add	-8,sp
653	st.w	r29,0[sp]
654	st.w	r28,4[sp]
655	jmp	[r10]
656	.size	__save_r28_r29,.-__save_r28_r29
657
658	/* Restore saved registers, deallocate stack and return to the user */
659	/* Called via:	jr __return_r28_r29 */
660	.align	2
661	.globl	__return_r28_r29
662	.type	__return_r28_r29,@function
663__return_r28_r29:
664	ld.w	0[sp],r29
665	ld.w	4[sp],r28
666	add	8,sp
667	jmp	[r31]
668	.size	__return_r28_r29,.-__return_r28_r29
669#endif /* L_save_28 */
670
671#ifdef	L_save_29
672	.text
673	.align	2
674	.globl	__save_r29
675	.type	__save_r29,@function
676	/* Allocate space and save register 29 on the stack */
677	/* Called via:	jalr __save_r29,r10 */
678__save_r29:
679	add	-4,sp
680	st.w	r29,0[sp]
681	jmp	[r10]
682	.size	__save_r29,.-__save_r29
683
684	/* Restore saved register 29, deallocate stack and return to the user */
685	/* Called via:	jr __return_r29 */
686	.align	2
687	.globl	__return_r29
688	.type	__return_r29,@function
689__return_r29:
690	ld.w	0[sp],r29
691	add	4,sp
692	jmp	[r31]
693	.size	__return_r29,.-__return_r29
694#endif /* L_save_28 */
695
696#ifdef	L_save_2c
697	.text
698	.align	2
699	.globl	__save_r2_r31
700	.type	__save_r2_r31,@function
701	/* Allocate space and save registers 20 .. 29, 31 on the stack */
702	/* Also allocate space for the argument save area */
703	/* Called via:	jalr __save_r2_r31,r10 */
704__save_r2_r31:
705	mov	ep,r1
706	addi	-64,sp,sp
707	mov	sp,ep
708	sst.w	r29,16[ep]
709	sst.w	r28,20[ep]
710	sst.w	r27,24[ep]
711	sst.w	r26,28[ep]
712	sst.w	r25,32[ep]
713	sst.w	r24,36[ep]
714	sst.w	r23,40[ep]
715	sst.w	r22,44[ep]
716	sst.w	r21,48[ep]
717	sst.w	r20,52[ep]
718	sst.w	r2,56[ep]
719	sst.w	r31,60[ep]
720	mov	r1,ep
721	jmp	[r10]
722	.size	__save_r2_r31,.-__save_r2_r31
723
724	/* Restore saved registers, deallocate stack and return to the user */
725	/* Called via:	jr __return_r20_r31 */
726	.align	2
727	.globl	__return_r2_r31
728	.type	__return_r2_r31,@function
729__return_r2_r31:
730	mov	ep,r1
731	mov	sp,ep
732	sld.w	16[ep],r29
733	sld.w	20[ep],r28
734	sld.w	24[ep],r27
735	sld.w	28[ep],r26
736	sld.w	32[ep],r25
737	sld.w	36[ep],r24
738	sld.w	40[ep],r23
739	sld.w	44[ep],r22
740	sld.w	48[ep],r21
741	sld.w	52[ep],r20
742	sld.w	56[ep],r2
743	sld.w	60[ep],r31
744	addi	64,sp,sp
745	mov	r1,ep
746	jmp	[r31]
747	.size	__return_r2_r31,.-__return_r2_r31
748#endif /* L_save_2c */
749
750#ifdef	L_save_20c
751	.text
752	.align	2
753	.globl	__save_r20_r31
754	.type	__save_r20_r31,@function
755	/* Allocate space and save registers 20 .. 29, 31 on the stack */
756	/* Also allocate space for the argument save area */
757	/* Called via:	jalr __save_r20_r31,r10 */
758__save_r20_r31:
759	mov	ep,r1
760	addi	-60,sp,sp
761	mov	sp,ep
762	sst.w	r29,16[ep]
763	sst.w	r28,20[ep]
764	sst.w	r27,24[ep]
765	sst.w	r26,28[ep]
766	sst.w	r25,32[ep]
767	sst.w	r24,36[ep]
768	sst.w	r23,40[ep]
769	sst.w	r22,44[ep]
770	sst.w	r21,48[ep]
771	sst.w	r20,52[ep]
772	sst.w	r31,56[ep]
773	mov	r1,ep
774	jmp	[r10]
775	.size	__save_r20_r31,.-__save_r20_r31
776
777	/* Restore saved registers, deallocate stack and return to the user */
778	/* Called via:	jr __return_r20_r31 */
779	.align	2
780	.globl	__return_r20_r31
781	.type	__return_r20_r31,@function
782__return_r20_r31:
783	mov	ep,r1
784	mov	sp,ep
785	sld.w	16[ep],r29
786	sld.w	20[ep],r28
787	sld.w	24[ep],r27
788	sld.w	28[ep],r26
789	sld.w	32[ep],r25
790	sld.w	36[ep],r24
791	sld.w	40[ep],r23
792	sld.w	44[ep],r22
793	sld.w	48[ep],r21
794	sld.w	52[ep],r20
795	sld.w	56[ep],r31
796	addi	60,sp,sp
797	mov	r1,ep
798	jmp	[r31]
799	.size	__return_r20_r31,.-__return_r20_r31
800#endif /* L_save_20c */
801
802#ifdef	L_save_21c
803	.text
804	.align	2
805	.globl	__save_r21_r31
806	.type	__save_r21_r31,@function
807	/* Allocate space and save registers 21 .. 29, 31 on the stack */
808	/* Also allocate space for the argument save area */
809	/* Called via:	jalr __save_r21_r31,r10 */
810__save_r21_r31:
811	mov	ep,r1
812	addi	-56,sp,sp
813	mov	sp,ep
814	sst.w	r29,16[ep]
815	sst.w	r28,20[ep]
816	sst.w	r27,24[ep]
817	sst.w	r26,28[ep]
818	sst.w	r25,32[ep]
819	sst.w	r24,36[ep]
820	sst.w	r23,40[ep]
821	sst.w	r22,44[ep]
822	sst.w	r21,48[ep]
823	sst.w	r31,52[ep]
824	mov	r1,ep
825	jmp	[r10]
826	.size	__save_r21_r31,.-__save_r21_r31
827
828	/* Restore saved registers, deallocate stack and return to the user */
829	/* Called via:	jr __return_r21_r31 */
830	.align	2
831	.globl	__return_r21_r31
832	.type	__return_r21_r31,@function
833__return_r21_r31:
834	mov	ep,r1
835	mov	sp,ep
836	sld.w	16[ep],r29
837	sld.w	20[ep],r28
838	sld.w	24[ep],r27
839	sld.w	28[ep],r26
840	sld.w	32[ep],r25
841	sld.w	36[ep],r24
842	sld.w	40[ep],r23
843	sld.w	44[ep],r22
844	sld.w	48[ep],r21
845	sld.w	52[ep],r31
846	addi	56,sp,sp
847	mov	r1,ep
848	jmp	[r31]
849	.size	__return_r21_r31,.-__return_r21_r31
850#endif /* L_save_21c */
851
852#ifdef	L_save_22c
853	.text
854	.align	2
855	.globl	__save_r22_r31
856	.type	__save_r22_r31,@function
857	/* Allocate space and save registers 22 .. 29, 31 on the stack */
858	/* Also allocate space for the argument save area */
859	/* Called via:	jalr __save_r22_r31,r10 */
860__save_r22_r31:
861	mov	ep,r1
862	addi	-52,sp,sp
863	mov	sp,ep
864	sst.w	r29,16[ep]
865	sst.w	r28,20[ep]
866	sst.w	r27,24[ep]
867	sst.w	r26,28[ep]
868	sst.w	r25,32[ep]
869	sst.w	r24,36[ep]
870	sst.w	r23,40[ep]
871	sst.w	r22,44[ep]
872	sst.w	r31,48[ep]
873	mov	r1,ep
874	jmp	[r10]
875	.size	__save_r22_r31,.-__save_r22_r31
876
877	/* Restore saved registers, deallocate stack and return to the user */
878	/* Called via:	jr __return_r22_r31 */
879	.align	2
880	.globl	__return_r22_r31
881	.type	__return_r22_r31,@function
882__return_r22_r31:
883	mov	ep,r1
884	mov	sp,ep
885	sld.w	16[ep],r29
886	sld.w	20[ep],r28
887	sld.w	24[ep],r27
888	sld.w	28[ep],r26
889	sld.w	32[ep],r25
890	sld.w	36[ep],r24
891	sld.w	40[ep],r23
892	sld.w	44[ep],r22
893	sld.w	48[ep],r31
894	addi	52,sp,sp
895	mov	r1,ep
896	jmp	[r31]
897	.size	__return_r22_r31,.-__return_r22_r31
898#endif /* L_save_22c */
899
900#ifdef	L_save_23c
901	.text
902	.align	2
903	.globl	__save_r23_r31
904	.type	__save_r23_r31,@function
905	/* Allocate space and save registers 23 .. 29, 31 on the stack */
906	/* Also allocate space for the argument save area */
907	/* Called via:	jalr __save_r23_r31,r10 */
908__save_r23_r31:
909	mov	ep,r1
910	addi	-48,sp,sp
911	mov	sp,ep
912	sst.w	r29,16[ep]
913	sst.w	r28,20[ep]
914	sst.w	r27,24[ep]
915	sst.w	r26,28[ep]
916	sst.w	r25,32[ep]
917	sst.w	r24,36[ep]
918	sst.w	r23,40[ep]
919	sst.w	r31,44[ep]
920	mov	r1,ep
921	jmp	[r10]
922	.size	__save_r23_r31,.-__save_r23_r31
923
924	/* Restore saved registers, deallocate stack and return to the user */
925	/* Called via:	jr __return_r23_r31 */
926	.align	2
927	.globl	__return_r23_r31
928	.type	__return_r23_r31,@function
929__return_r23_r31:
930	mov	ep,r1
931	mov	sp,ep
932	sld.w	16[ep],r29
933	sld.w	20[ep],r28
934	sld.w	24[ep],r27
935	sld.w	28[ep],r26
936	sld.w	32[ep],r25
937	sld.w	36[ep],r24
938	sld.w	40[ep],r23
939	sld.w	44[ep],r31
940	addi	48,sp,sp
941	mov	r1,ep
942	jmp	[r31]
943	.size	__return_r23_r31,.-__return_r23_r31
944#endif /* L_save_23c */
945
946#ifdef	L_save_24c
947	.text
948	.align	2
949	.globl	__save_r24_r31
950	.type	__save_r24_r31,@function
951	/* Allocate space and save registers 24 .. 29, 31 on the stack */
952	/* Also allocate space for the argument save area */
953	/* Called via:	jalr __save_r24_r31,r10 */
954__save_r24_r31:
955	mov	ep,r1
956	addi	-44,sp,sp
957	mov	sp,ep
958	sst.w	r29,16[ep]
959	sst.w	r28,20[ep]
960	sst.w	r27,24[ep]
961	sst.w	r26,28[ep]
962	sst.w	r25,32[ep]
963	sst.w	r24,36[ep]
964	sst.w	r31,40[ep]
965	mov	r1,ep
966	jmp	[r10]
967	.size	__save_r24_r31,.-__save_r24_r31
968
969	/* Restore saved registers, deallocate stack and return to the user */
970	/* Called via:	jr __return_r24_r31 */
971	.align	2
972	.globl	__return_r24_r31
973	.type	__return_r24_r31,@function
974__return_r24_r31:
975	mov	ep,r1
976	mov	sp,ep
977	sld.w	16[ep],r29
978	sld.w	20[ep],r28
979	sld.w	24[ep],r27
980	sld.w	28[ep],r26
981	sld.w	32[ep],r25
982	sld.w	36[ep],r24
983	sld.w	40[ep],r31
984	addi	44,sp,sp
985	mov	r1,ep
986	jmp	[r31]
987	.size	__return_r24_r31,.-__return_r24_r31
988#endif /* L_save_24c */
989
990#ifdef	L_save_25c
991	.text
992	.align	2
993	.globl	__save_r25_r31
994	.type	__save_r25_r31,@function
995	/* Allocate space and save registers 25 .. 29, 31 on the stack */
996	/* Also allocate space for the argument save area */
997	/* Called via:	jalr __save_r25_r31,r10 */
998__save_r25_r31:
999	mov	ep,r1
1000	addi	-40,sp,sp
1001	mov	sp,ep
1002	sst.w	r29,16[ep]
1003	sst.w	r28,20[ep]
1004	sst.w	r27,24[ep]
1005	sst.w	r26,28[ep]
1006	sst.w	r25,32[ep]
1007	sst.w	r31,36[ep]
1008	mov	r1,ep
1009	jmp	[r10]
1010	.size	__save_r25_r31,.-__save_r25_r31
1011
1012	/* Restore saved registers, deallocate stack and return to the user */
1013	/* Called via:	jr __return_r25_r31 */
1014	.align	2
1015	.globl	__return_r25_r31
1016	.type	__return_r25_r31,@function
1017__return_r25_r31:
1018	mov	ep,r1
1019	mov	sp,ep
1020	sld.w	16[ep],r29
1021	sld.w	20[ep],r28
1022	sld.w	24[ep],r27
1023	sld.w	28[ep],r26
1024	sld.w	32[ep],r25
1025	sld.w	36[ep],r31
1026	addi	40,sp,sp
1027	mov	r1,ep
1028	jmp	[r31]
1029	.size	__return_r25_r31,.-__return_r25_r31
1030#endif /* L_save_25c */
1031
1032#ifdef	L_save_26c
1033	.text
1034	.align	2
1035	.globl	__save_r26_r31
1036	.type	__save_r26_r31,@function
1037	/* Allocate space and save registers 26 .. 29, 31 on the stack */
1038	/* Also allocate space for the argument save area */
1039	/* Called via:	jalr __save_r26_r31,r10 */
1040__save_r26_r31:
1041	mov	ep,r1
1042	addi	-36,sp,sp
1043	mov	sp,ep
1044	sst.w	r29,16[ep]
1045	sst.w	r28,20[ep]
1046	sst.w	r27,24[ep]
1047	sst.w	r26,28[ep]
1048	sst.w	r31,32[ep]
1049	mov	r1,ep
1050	jmp	[r10]
1051	.size	__save_r26_r31,.-__save_r26_r31
1052
1053	/* Restore saved registers, deallocate stack and return to the user */
1054	/* Called via:	jr __return_r26_r31 */
1055	.align	2
1056	.globl	__return_r26_r31
1057	.type	__return_r26_r31,@function
1058__return_r26_r31:
1059	mov	ep,r1
1060	mov	sp,ep
1061	sld.w	16[ep],r29
1062	sld.w	20[ep],r28
1063	sld.w	24[ep],r27
1064	sld.w	28[ep],r26
1065	sld.w	32[ep],r31
1066	addi	36,sp,sp
1067	mov	r1,ep
1068	jmp	[r31]
1069	.size	__return_r26_r31,.-__return_r26_r31
1070#endif /* L_save_26c */
1071
1072#ifdef	L_save_27c
1073	.text
1074	.align	2
1075	.globl	__save_r27_r31
1076	.type	__save_r27_r31,@function
1077	/* Allocate space and save registers 27 .. 29, 31 on the stack */
1078	/* Also allocate space for the argument save area */
1079	/* Called via:	jalr __save_r27_r31,r10 */
1080__save_r27_r31:
1081	mov	ep,r1
1082	addi	-32,sp,sp
1083	mov	sp,ep
1084	sst.w	r29,16[ep]
1085	sst.w	r28,20[ep]
1086	sst.w	r27,24[ep]
1087	sst.w	r31,28[ep]
1088	mov	r1,ep
1089	jmp	[r10]
1090	.size	__save_r27_r31,.-__save_r27_r31
1091
1092	/* Restore saved registers, deallocate stack and return to the user */
1093	/* Called via:	jr __return_r27_r31 */
1094	.align	2
1095	.globl	__return_r27_r31
1096	.type	__return_r27_r31,@function
1097__return_r27_r31:
1098	mov	ep,r1
1099	mov	sp,ep
1100	sld.w	16[ep],r29
1101	sld.w	20[ep],r28
1102	sld.w	24[ep],r27
1103	sld.w	28[ep],r31
1104	addi	32,sp,sp
1105	mov	r1,ep
1106	jmp	[r31]
1107	.size	__return_r27_r31,.-__return_r27_r31
1108#endif /* L_save_27c */
1109
1110#ifdef	L_save_28c
1111	.text
1112	.align	2
1113	.globl	__save_r28_r31
1114	.type	__save_r28_r31,@function
1115	/* Allocate space and save registers 28 .. 29, 31 on the stack */
1116	/* Also allocate space for the argument save area */
1117	/* Called via:	jalr __save_r28_r31,r10 */
1118__save_r28_r31:
1119	addi	-28,sp,sp
1120	st.w	r29,16[sp]
1121	st.w	r28,20[sp]
1122	st.w	r31,24[sp]
1123	jmp	[r10]
1124	.size	__save_r28_r31,.-__save_r28_r31
1125
1126	/* Restore saved registers, deallocate stack and return to the user */
1127	/* Called via:	jr __return_r28_r31 */
1128	.align	2
1129	.globl	__return_r28_r31
1130	.type	__return_r28_r31,@function
1131__return_r28_r31:
1132	ld.w	16[sp],r29
1133	ld.w	20[sp],r28
1134	ld.w	24[sp],r31
1135	addi	28,sp,sp
1136	jmp	[r31]
1137	.size	__return_r28_r31,.-__return_r28_r31
1138#endif /* L_save_28c */
1139
1140#ifdef	L_save_29c
1141	.text
1142	.align	2
1143	.globl	__save_r29_r31
1144	.type	__save_r29_r31,@function
1145	/* Allocate space and save registers 29 & 31 on the stack */
1146	/* Also allocate space for the argument save area */
1147	/* Called via:	jalr __save_r29_r31,r10 */
1148__save_r29_r31:
1149	addi	-24,sp,sp
1150	st.w	r29,16[sp]
1151	st.w	r31,20[sp]
1152	jmp	[r10]
1153	.size	__save_r29_r31,.-__save_r29_r31
1154
1155	/* Restore saved registers, deallocate stack and return to the user */
1156	/* Called via:	jr __return_r29_r31 */
1157	.align	2
1158	.globl	__return_r29_r31
1159	.type	__return_r29_r31,@function
1160__return_r29_r31:
1161	ld.w	16[sp],r29
1162	ld.w	20[sp],r31
1163	addi	24,sp,sp
1164	jmp	[r31]
1165	.size	__return_r29_r31,.-__return_r29_r31
1166#endif /* L_save_29c */
1167
1168#ifdef	L_save_31c
1169	.text
1170	.align	2
1171	.globl	__save_r31
1172	.type	__save_r31,@function
1173	/* Allocate space and save register 31 on the stack */
1174	/* Also allocate space for the argument save area */
1175	/* Called via:	jalr __save_r31,r10 */
1176__save_r31:
1177	addi	-20,sp,sp
1178	st.w	r31,16[sp]
1179	jmp	[r10]
1180	.size	__save_r31,.-__save_r31
1181
1182	/* Restore saved registers, deallocate stack and return to the user */
1183	/* Called via:	jr __return_r31 */
1184	.align	2
1185	.globl	__return_r31
1186	.type	__return_r31,@function
1187__return_r31:
1188	ld.w	16[sp],r31
1189	addi	20,sp,sp
1190	jmp	[r31]
1191        .size   __return_r31,.-__return_r31
1192#endif /* L_save_31c */
1193
1194#ifdef L_save_varargs
1195	.text
1196	.align	2
1197	.globl	__save_r6_r9
1198	.type	__save_r6_r9,@function
1199	/* Save registers 6 .. 9 on the stack for variable argument functions */
1200	/* Called via:	jalr __save_r6_r9,r10 */
1201__save_r6_r9:
1202	mov	ep,r1
1203	mov	sp,ep
1204	sst.w	r6,0[ep]
1205	sst.w	r7,4[ep]
1206	sst.w	r8,8[ep]
1207	sst.w	r9,12[ep]
1208	mov	r1,ep
1209	jmp	[r10]
1210	.size	__save_r6_r9,.-__save_r6_r9
1211#endif /* L_save_varargs */
1212
1213#ifdef	L_save_interrupt
1214	.text
1215	.align	2
1216	.globl	__save_interrupt
1217	.type	__save_interrupt,@function
1218	/* Save registers r1, r4 on stack and load up with expected values */
1219	/* Note, 12 bytes of stack have already been allocated. */
1220	/* Called via:	jalr __save_interrupt,r10 */
1221__save_interrupt:
1222	st.w	ep,0[sp]
1223	st.w	gp,4[sp]
1224	st.w	r1,8[sp]
1225	movhi	hi(__ep),r0,ep
1226	movea	lo(__ep),ep,ep
1227	movhi	hi(__gp),r0,gp
1228	movea	lo(__gp),gp,gp
1229	jmp	[r10]
1230	.size	__save_interrupt,.-__save_interrupt
1231
1232	/* Restore saved registers, deallocate stack and return from the interrupt */
1233	/* Called via:	jr __return_interrupt */
1234	.align	2
1235	.globl	__return_interrupt
1236	.type	__return_interrupt,@function
1237__return_interrupt:
1238	ld.w	0[sp],ep
1239	ld.w	4[sp],gp
1240	ld.w	8[sp],r1
1241	ld.w	12[sp],r10
1242	addi	16,sp,sp
1243	reti
1244	.size	__return_interrupt,.-__return_interrupt
1245#endif /* L_save_interrupt */
1246
1247#ifdef L_save_all_interrupt
1248	.text
1249	.align	2
1250	.globl	__save_all_interrupt
1251	.type	__save_all_interrupt,@function
1252	/* Save all registers except for those saved in __save_interrupt */
1253	/* allocate enough stack for all of the registers & 16 bytes of space */
1254	/* Called via:	jalr __save_all_interrupt,r10 */
1255__save_all_interrupt:
1256	addi	-120,sp,sp
1257	mov	ep,r1
1258	mov	sp,ep
1259	sst.w	r31,116[ep]
1260	sst.w	r2,112[ep]
1261	sst.w	gp,108[ep]
1262	sst.w	r6,104[ep]
1263	sst.w	r7,100[ep]
1264	sst.w	r8,96[ep]
1265	sst.w	r9,92[ep]
1266	sst.w	r11,88[ep]
1267	sst.w	r12,84[ep]
1268	sst.w	r13,80[ep]
1269	sst.w	r14,76[ep]
1270	sst.w	r15,72[ep]
1271	sst.w	r16,68[ep]
1272	sst.w	r17,64[ep]
1273	sst.w	r18,60[ep]
1274	sst.w	r19,56[ep]
1275	sst.w	r20,52[ep]
1276	sst.w	r21,48[ep]
1277	sst.w	r22,44[ep]
1278	sst.w	r23,40[ep]
1279	sst.w	r24,36[ep]
1280	sst.w	r25,32[ep]
1281	sst.w	r26,28[ep]
1282	sst.w	r27,24[ep]
1283	sst.w	r28,20[ep]
1284	sst.w	r29,16[ep]
1285	mov	r1,ep
1286	jmp	[r10]
1287	.size	__save_all_interrupt,.-__save_all_interrupt
1288
1289	.globl	__restore_all_interrupt
1290	.type	__restore_all_interrupt,@function
1291	/* Restore all registers saved in __save_all_interrupt */
1292	/* & deallocate the stack space */
1293	/* Called via:	jalr __restore_all_interrupt,r10 */
1294__restore_all_interrupt:
1295	mov	ep,r1
1296	mov	sp,ep
1297	sld.w	116[ep],r31
1298	sld.w	112[ep],r2
1299	sld.w	108[ep],gp
1300	sld.w	104[ep],r6
1301	sld.w	100[ep],r7
1302	sld.w	96[ep],r8
1303	sld.w	92[ep],r9
1304	sld.w	88[ep],r11
1305	sld.w	84[ep],r12
1306	sld.w	80[ep],r13
1307	sld.w	76[ep],r14
1308	sld.w	72[ep],r15
1309	sld.w	68[ep],r16
1310	sld.w	64[ep],r17
1311	sld.w	60[ep],r18
1312	sld.w	56[ep],r19
1313	sld.w	52[ep],r20
1314	sld.w	48[ep],r21
1315	sld.w	44[ep],r22
1316	sld.w	40[ep],r23
1317	sld.w	36[ep],r24
1318	sld.w	32[ep],r25
1319	sld.w	28[ep],r26
1320	sld.w	24[ep],r27
1321	sld.w	20[ep],r28
1322	sld.w	16[ep],r29
1323	mov	r1,ep
1324	addi	120,sp,sp
1325	jmp	[r10]
1326	.size	__restore_all_interrupt,.-__restore_all_interrupt
1327#endif /* L_save_all_interrupt */
1328
1329
1330#if defined __v850e__
1331#ifdef	L_callt_save_r2_r29
1332	/* Put these functions into the call table area.  */
1333	.call_table_text
1334
1335	/* Allocate space and save registers 2, 20 .. 29 on the stack.  */
1336	/* Called via:	callt ctoff(__callt_save_r2_r29).  */
1337	.align	2
1338.L_save_r2_r29:
1339	add	-4, sp
1340	st.w	r2, 0[sp]
1341	prepare {r20 - r29}, 0
1342	ctret
1343
1344	/* Restore saved registers, deallocate stack and return to the user.  */
1345	/* Called via:	callt ctoff(__callt_return_r2_r29).  */
1346	.align	2
1347.L_return_r2_r29:
1348	dispose 0, {r20-r29}
1349	ld.w    0[sp], r2
1350	add	4, sp
1351	jmp     [r31]
1352
1353	/* Place the offsets of the start of these routines into the call table.  */
1354	.call_table_data
1355
1356	.global	__callt_save_r2_r29
1357	.type	__callt_save_r2_r29,@function
1358__callt_save_r2_r29:	.short ctoff(.L_save_r2_r29)
1359
1360	.global	__callt_return_r2_r29
1361	.type	__callt_return_r2_r29,@function
1362__callt_return_r2_r29:	.short ctoff(.L_return_r2_r29)
1363
1364#endif /* L_callt_save_r2_r29 */
1365
1366#ifdef	L_callt_save_r2_r31
1367	/* Put these functions into the call table area.  */
1368	.call_table_text
1369
1370	/* Allocate space and save registers 2 and 20 .. 29, 31 on the stack.  */
1371	/* Also allocate space for the argument save area.  */
1372	/* Called via:	callt ctoff(__callt_save_r2_r31).  */
1373	.align	2
1374.L_save_r2_r31:
1375	add	-4, sp
1376	st.w	r2, 0[sp]
1377	prepare {r20 - r29, r31}, 4
1378	ctret
1379
1380	/* Restore saved registers, deallocate stack and return to the user.  */
1381	/* Called via:	callt ctoff(__callt_return_r2_r31).  */
1382	.align	2
1383.L_return_r2_r31:
1384	dispose 4, {r20 - r29, r31}
1385	ld.w    0[sp], r2
1386	addi	4, sp, sp
1387	jmp     [r31]
1388
1389	/* Place the offsets of the start of these routines into the call table.  */
1390	.call_table_data
1391
1392	.global	__callt_save_r2_r31
1393	.type	__callt_save_r2_r31,@function
1394__callt_save_r2_r31:	.short ctoff(.L_save_r2_r31)
1395
1396	.global	__callt_return_r2_r31
1397	.type	__callt_return_r2_r31,@function
1398__callt_return_r2_r31:	.short ctoff(.L_return_r2_r31)
1399
1400#endif /* L_callt_save_r2_r31 */
1401
1402
1403#ifdef L_callt_save_r6_r9
1404	/* Put these functions into the call table area.  */
1405	.call_table_text
1406
1407	/* Save registers r6 - r9 onto the stack in the space reserved for them.
1408	   Use by variable argument functions.
1409	   Called via:	callt ctoff(__callt_save_r6_r9).  */
1410	.align	2
1411.L_save_r6_r9:
1412	mov	ep,r1
1413	mov	sp,ep
1414	sst.w	r6,0[ep]
1415	sst.w	r7,4[ep]
1416	sst.w	r8,8[ep]
1417	sst.w	r9,12[ep]
1418	mov	r1,ep
1419	ctret
1420
1421	/* Place the offsets of the start of this routines into the call table.  */
1422	.call_table_data
1423
1424	.global	__callt_save_r6_r9
1425	.type	__callt_save_r6_r9,@function
1426__callt_save_r6_r9:	.short ctoff(.L_save_r6_r9)
1427#endif /* L_callt_save_r6_r9 */
1428
1429
1430#ifdef	L_callt_save_interrupt
1431	/* Put this functions into the call table area */
1432	.call_table_text
1433
1434	/* Save registers r1, ep, gp, r10 on stack and load up with expected values.  */
1435	/* Called via:	callt ctoff(__callt_save_interrupt).  */
1436	.align	2
1437.L_save_interrupt:
1438        /* SP has already been moved before callt ctoff(_save_interrupt).  */
1439        /* addi -24, sp, sp  */
1440        st.w    ep,  0[sp]
1441        st.w    gp,  4[sp]
1442        st.w    r1,  8[sp]
1443        /* R10 has alread been saved bofore callt ctoff(_save_interrupt).  */
1444        /* st.w    r10, 12[sp]  */
1445	mov	hilo(__ep),ep
1446	mov	hilo(__gp),gp
1447	ctret
1448
1449        /* Place the offsets of the start of the routine into the call table.  */
1450        .call_table_data
1451        .global __callt_save_interrupt
1452        .type   __callt_save_interrupt,@function
1453__callt_save_interrupt: .short ctoff(.L_save_interrupt)
1454
1455        .call_table_text
1456
1457	/* Restore saved registers, deallocate stack and return from the interrupt.  */
1458        /* Called via:  callt ctoff(__callt_restore_itnerrupt).   */
1459	.text
1460	.align	2
1461	.globl	__return_interrupt
1462	.type	__return_interrupt,@function
1463.L_return_interrupt:
1464        ld.w    20[sp], r1
1465        ldsr    r1,     ctpsw
1466        ld.w    16[sp], r1
1467        ldsr    r1,     ctpc
1468        ld.w    12[sp], r10
1469        ld.w     8[sp], r1
1470        ld.w     4[sp], gp
1471        ld.w     0[sp], ep
1472        addi    24, sp, sp
1473        reti
1474
1475	/* Place the offsets of the start of the routine into the call table.  */
1476	.call_table_data
1477
1478        .global __callt_return_interrupt
1479        .type   __callt_return_interrupt,@function
1480__callt_return_interrupt:       .short ctoff(.L_return_interrupt)
1481
1482#endif /* L_callt_save_interrupt */
1483
1484#ifdef L_callt_save_all_interrupt
1485	/* Put this functions into the call table area.  */
1486	.call_table_text
1487
1488	/* Save all registers except for those saved in __save_interrupt.  */
1489	/* Allocate enough stack for all of the registers & 16 bytes of space.  */
1490	/* Called via:	callt ctoff(__callt_save_all_interrupt).  */
1491	.align	2
1492.L_save_all_interrupt:
1493	addi	-60, sp, sp
1494	mov	ep,  r1
1495	mov	sp,  ep
1496	sst.w	r2,  56[ep]
1497	sst.w	r5,  52[ep]
1498	sst.w	r6,  48[ep]
1499	sst.w	r7,  44[ep]
1500	sst.w	r8,  40[ep]
1501	sst.w	r9,  36[ep]
1502	sst.w	r11, 32[ep]
1503	sst.w	r12, 28[ep]
1504	sst.w	r13, 24[ep]
1505	sst.w	r14, 20[ep]
1506	sst.w	r15, 16[ep]
1507	sst.w	r16, 12[ep]
1508	sst.w	r17, 8[ep]
1509	sst.w	r18, 4[ep]
1510	sst.w	r19, 0[ep]
1511	mov	r1,  ep
1512
1513	prepare {r20 - r29, r31}, 4
1514	ctret
1515
1516	/* Restore all registers saved in __save_all_interrupt.  */
1517	/* & deallocate the stack space.  */
1518	/* Called via:	callt ctoff(__callt_restore_all_interrupt).  */
1519	.align 2
1520.L_restore_all_interrupt:
1521	dispose 4, {r20 - r29, r31}
1522
1523	mov	ep, r1
1524	mov	sp, ep
1525	sld.w	0 [ep], r19
1526	sld.w	4 [ep], r18
1527	sld.w	8 [ep], r17
1528	sld.w	12[ep], r16
1529	sld.w	16[ep], r15
1530	sld.w	20[ep], r14
1531	sld.w	24[ep], r13
1532	sld.w	28[ep], r12
1533	sld.w	32[ep], r11
1534	sld.w	36[ep], r9
1535	sld.w	40[ep], r8
1536	sld.w	44[ep], r7
1537	sld.w	48[ep], r6
1538	sld.w	52[ep], r5
1539	sld.w	56[ep], r2
1540	mov	r1, ep
1541	addi	60, sp, sp
1542	ctret
1543
1544	/* Place the offsets of the start of these routines into the call table.  */
1545	.call_table_data
1546
1547	.global	__callt_save_all_interrupt
1548	.type	__callt_save_all_interrupt,@function
1549__callt_save_all_interrupt:	.short ctoff(.L_save_all_interrupt)
1550
1551	.global	__callt_restore_all_interrupt
1552	.type	__callt_restore_all_interrupt,@function
1553__callt_restore_all_interrupt:	.short ctoff(.L_restore_all_interrupt)
1554
1555#endif /* L_callt_save_all_interrupt */
1556
1557
1558#define MAKE_CALLT_FUNCS( START )						\
1559	.call_table_text							;\
1560	.align	2								;\
1561	/* Allocate space and save registers START .. r29 on the stack.  */	;\
1562	/* Called via:	callt ctoff(__callt_save_START_r29).  */		;\
1563.L_save_##START##_r29:								;\
1564	prepare { START - r29 }, 0						;\
1565	ctret									;\
1566										;\
1567	/* Restore saved registers, deallocate stack and return.  */		;\
1568	/* Called via:	callt ctoff(__return_START_r29) */			;\
1569	.align	2								;\
1570.L_return_##START##_r29:							;\
1571	dispose 0, { START - r29 }, r31						;\
1572										;\
1573	/* Place the offsets of the start of these funcs into the call table. */;\
1574	.call_table_data							;\
1575										;\
1576	.global	__callt_save_##START##_r29					;\
1577	.type	__callt_save_##START##_r29,@function				;\
1578__callt_save_##START##_r29:	.short ctoff(.L_save_##START##_r29 )		;\
1579										;\
1580	.global	__callt_return_##START##_r29					;\
1581	.type	__callt_return_##START##_r29,@function				;\
1582__callt_return_##START##_r29:	.short ctoff(.L_return_##START##_r29 )
1583
1584
1585#define MAKE_CALLT_CFUNCS( START )						\
1586	.call_table_text							;\
1587	.align	2								;\
1588	/* Allocate space and save registers START .. r31 on the stack.  */	;\
1589	/* Called via:	callt ctoff(__callt_save_START_r31c).  */		;\
1590.L_save_##START##_r31c:								;\
1591	prepare { START - r29, r31}, 4						;\
1592	ctret									;\
1593										;\
1594	/* Restore saved registers, deallocate stack and return.  */		;\
1595	/* Called via:	callt ctoff(__return_START_r31c).  */			;\
1596	.align	2								;\
1597.L_return_##START##_r31c:							;\
1598	dispose 4, { START - r29, r31}, r31					;\
1599										;\
1600	/* Place the offsets of the start of these funcs into the call table. */;\
1601	.call_table_data							;\
1602										;\
1603	.global	__callt_save_##START##_r31c					;\
1604	.type	__callt_save_##START##_r31c,@function				;\
1605__callt_save_##START##_r31c:    .short ctoff(.L_save_##START##_r31c )		;\
1606										;\
1607	.global	__callt_return_##START##_r31c					;\
1608	.type	__callt_return_##START##_r31c,@function				;\
1609__callt_return_##START##_r31c:  .short ctoff(.L_return_##START##_r31c )
1610
1611
1612#ifdef	L_callt_save_20
1613	MAKE_CALLT_FUNCS (r20)
1614#endif
1615#ifdef	L_callt_save_21
1616	MAKE_CALLT_FUNCS (r21)
1617#endif
1618#ifdef	L_callt_save_22
1619	MAKE_CALLT_FUNCS (r22)
1620#endif
1621#ifdef	L_callt_save_23
1622	MAKE_CALLT_FUNCS (r23)
1623#endif
1624#ifdef	L_callt_save_24
1625	MAKE_CALLT_FUNCS (r24)
1626#endif
1627#ifdef	L_callt_save_25
1628	MAKE_CALLT_FUNCS (r25)
1629#endif
1630#ifdef	L_callt_save_26
1631	MAKE_CALLT_FUNCS (r26)
1632#endif
1633#ifdef	L_callt_save_27
1634	MAKE_CALLT_FUNCS (r27)
1635#endif
1636#ifdef	L_callt_save_28
1637	MAKE_CALLT_FUNCS (r28)
1638#endif
1639#ifdef	L_callt_save_29
1640	MAKE_CALLT_FUNCS (r29)
1641#endif
1642
1643#ifdef	L_callt_save_20c
1644	MAKE_CALLT_CFUNCS (r20)
1645#endif
1646#ifdef	L_callt_save_21c
1647	MAKE_CALLT_CFUNCS (r21)
1648#endif
1649#ifdef	L_callt_save_22c
1650	MAKE_CALLT_CFUNCS (r22)
1651#endif
1652#ifdef	L_callt_save_23c
1653	MAKE_CALLT_CFUNCS (r23)
1654#endif
1655#ifdef	L_callt_save_24c
1656	MAKE_CALLT_CFUNCS (r24)
1657#endif
1658#ifdef	L_callt_save_25c
1659	MAKE_CALLT_CFUNCS (r25)
1660#endif
1661#ifdef	L_callt_save_26c
1662	MAKE_CALLT_CFUNCS (r26)
1663#endif
1664#ifdef	L_callt_save_27c
1665	MAKE_CALLT_CFUNCS (r27)
1666#endif
1667#ifdef	L_callt_save_28c
1668	MAKE_CALLT_CFUNCS (r28)
1669#endif
1670#ifdef	L_callt_save_29c
1671	MAKE_CALLT_CFUNCS (r29)
1672#endif
1673
1674
1675#ifdef	L_callt_save_31c
1676	.call_table_text
1677	.align	2
1678	/* Allocate space and save register r31 on the stack.  */
1679	/* Called via:	callt ctoff(__callt_save_r31c).  */
1680.L_callt_save_r31c:
1681	prepare {r31}, 4
1682	ctret
1683
1684	/* Restore saved registers, deallocate stack and return.  */
1685	/* Called via:	callt ctoff(__return_r31c).  */
1686	.align	2
1687.L_callt_return_r31c:
1688	dispose 4, {r31}, r31
1689
1690	/* Place the offsets of the start of these funcs into the call table.  */
1691	.call_table_data
1692
1693	.global	__callt_save_r31c
1694	.type	__callt_save_r31c,@function
1695__callt_save_r31c:	.short ctoff(.L_callt_save_r31c)
1696
1697	.global	__callt_return_r31c
1698	.type	__callt_return_r31c,@function
1699__callt_return_r31c:	.short ctoff(.L_callt_return_r31c)
1700#endif
1701
1702#endif /* __v850e__ */
1703
1704/*  libgcc2 routines for NEC V850.  */
1705/*  Double Integer Arithmetical Operation.  */
1706
1707#ifdef L_negdi2
1708	.text
1709	.global ___negdi2
1710	.type   ___negdi2, @function
1711___negdi2:
1712	not	r6, r10
1713	add	1,  r10
1714	setf	l,  r6
1715	not	r7, r11
1716	add	r6, r11
1717	jmp	[lp]
1718
1719	.size ___negdi2,.-___negdi2
1720#endif
1721
1722#ifdef L_cmpdi2
1723	.text
1724	.global ___cmpdi2
1725	.type	___cmpdi2,@function
1726___cmpdi2:
1727	# Signed comparison bitween each high word.
1728	cmp	r9, r7
1729	be	.L_cmpdi_cmp_low
1730	setf	ge, r10
1731	setf	gt, r6
1732	add	r6, r10
1733	jmp	[lp]
1734.L_cmpdi_cmp_low:
1735	# Unsigned comparigon bitween each low word.
1736	cmp     r8, r6
1737	setf	nl, r10
1738	setf	h,  r6
1739	add	r6, r10
1740	jmp	[lp]
1741	.size ___cmpdi2, . - ___cmpdi2
1742#endif
1743
1744#ifdef L_ucmpdi2
1745	.text
1746	.global ___ucmpdi2
1747	.type	___ucmpdi2,@function
1748___ucmpdi2:
1749	cmp	r9, r7  # Check if each high word are same.
1750	be	.L_ucmpdi_check_psw
1751	cmp     r8, r6  # Compare the word.
1752.L_ucmpdi_check_psw:
1753	setf	nl, r10 #
1754	setf	h,  r6  #
1755	add	r6, r10 # Add the result of comparison NL and comparison H.
1756	jmp	[lp]
1757	.size ___ucmpdi2, . - ___ucmpdi2
1758#endif
1759
1760#ifdef L_muldi3
1761	.text
1762	.global ___muldi3
1763	.type	___muldi3,@function
1764___muldi3:
1765#ifdef __v850__
1766        jarl  __save_r26_r31, r10
1767        addi  16,  sp, sp
1768        mov   r6,  r28
1769        shr   15,  r28
1770        movea lo(32767), r0, r14
1771        and   r14, r28
1772        mov   r8,  r10
1773        shr   15,  r10
1774        and   r14, r10
1775        mov   r6,  r19
1776        shr   30,  r19
1777        mov   r7,  r12
1778        shl   2,   r12
1779        or    r12, r19
1780        and   r14, r19
1781        mov   r8,  r13
1782        shr   30,  r13
1783        mov   r9,  r12
1784        shl   2,   r12
1785        or    r12, r13
1786        and   r14, r13
1787        mov   r7,  r11
1788        shr   13,  r11
1789        and   r14, r11
1790        mov   r9,  r31
1791        shr   13,  r31
1792        and   r14, r31
1793        mov   r7,  r29
1794        shr   28,  r29
1795        and   r14, r29
1796        mov   r9,  r12
1797        shr   28,  r12
1798        and   r14, r12
1799        and   r14, r6
1800        and   r14, r8
1801        mov   r6,  r14
1802        mulh  r8,  r14
1803        mov   r6,  r16
1804        mulh  r10, r16
1805        mov   r6,  r18
1806        mulh  r13, r18
1807        mov   r6,  r15
1808        mulh  r31, r15
1809        mulh  r12, r6
1810        mov   r28,  r17
1811        mulh  r10, r17
1812        add   -16, sp
1813        mov   r28,  r12
1814        mulh  r8,  r12
1815        add   r17, r18
1816        mov   r28,  r17
1817        mulh  r31, r17
1818        add   r12, r16
1819        mov   r28,  r12
1820        mulh  r13, r12
1821        add   r17, r6
1822        mov   r19, r17
1823        add   r12, r15
1824        mov   r19, r12
1825        mulh  r8,  r12
1826        mulh  r10, r17
1827        add   r12, r18
1828        mov   r19, r12
1829        mulh  r13, r12
1830        add   r17, r15
1831        mov   r11, r13
1832        mulh  r8,  r13
1833        add   r12, r6
1834        mov   r11, r12
1835        mulh  r10, r12
1836        add   r13, r15
1837        mulh  r29, r8
1838        add   r12, r6
1839        mov   r16, r13
1840        shl   15,  r13
1841        add   r14, r13
1842        mov   r18, r12
1843        shl   30,  r12
1844        mov   r13, r26
1845        add   r12, r26
1846        shr   15,  r14
1847        movhi hi(131071), r0,  r12
1848        movea lo(131071), r12, r13
1849        and   r13, r14
1850        mov   r16, r12
1851        and   r13, r12
1852        add   r12, r14
1853        mov   r18, r12
1854        shl   15,  r12
1855        and   r13, r12
1856        add   r12, r14
1857        shr   17,  r14
1858        shr   17,  r16
1859        add   r14, r16
1860        shl   13,  r15
1861        shr   2,   r18
1862        add   r18, r15
1863        add   r15, r16
1864        mov   r16, r27
1865        add   r8,  r6
1866        shl   28,  r6
1867        add   r6,  r27
1868        mov   r26, r10
1869        mov   r27, r11
1870        jr    __return_r26_r31
1871#endif /* __v850__ */
1872#if defined(__v850e__) || defined(__v850ea__)
1873	/*  (Ahi << 32 + Alo) * (Bhi << 32 + Blo) */
1874	/*   r7           r6      r9         r8   */
1875	mov  r8, r10
1876	mulu r7, r8,  r0		/* Ahi * Blo */
1877	mulu r6, r9,  r0		/* Alo * Bhi */
1878	mulu r6, r10, r11		/* Alo * Blo */
1879	add  r8, r11
1880	add  r9, r11
1881	jmp  [r31]
1882
1883#endif /* defined(__v850e__)  || defined(__v850ea__) */
1884	.size ___muldi3, . - ___muldi3
1885#endif
1886