Linux Audio

Check our new training course

Loading...
v3.1
  1/* Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
 
 
  2   2004, 2005, 2006
  3   Free Software Foundation, Inc.
  4
  5This file is free software; you can redistribute it and/or modify it
  6under the terms of the GNU General Public License as published by the
  7Free Software Foundation; either version 2, or (at your option) any
  8later version.
  9
 10In addition to the permissions in the GNU General Public License, the
 11Free Software Foundation gives you unlimited permission to link the
 12compiled version of this file into combinations with other programs,
 13and to distribute those combinations without any restriction coming
 14from the use of this file.  (The General Public License restrictions
 15do apply in other respects; for example, they cover modification of
 16the file, and distribution when not linked into a combine
 17executable.)
 18
 19This file is distributed in the hope that it will be useful, but
 20WITHOUT ANY WARRANTY; without even the implied warranty of
 21MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 22General Public License for more details.
 23
 24You should have received a copy of the GNU General Public License
 25along with this program; see the file COPYING.  If not, write to
 26the Free Software Foundation, 51 Franklin Street, Fifth Floor,
 27Boston, MA 02110-1301, USA.  */
 28
 29!! libgcc routines for the Renesas / SuperH SH CPUs.
 30!! Contributed by Steve Chamberlain.
 31!! sac@cygnus.com
 32
 33!! ashiftrt_r4_x, ___ashrsi3, ___ashlsi3, ___lshrsi3 routines
 34!! recoded in assembly by Toshiyasu Morita
 35!! tm@netcom.com
 36
 37/* SH2 optimizations for ___ashrsi3, ___ashlsi3, ___lshrsi3 and
 38   ELF local label prefixes by J"orn Rennecke
 39   amylaar@cygnus.com  */
 40
 41/* This code used shld, thus is not suitable for SH1 / SH2.  */
 42
 43/* Signed / unsigned division without use of FPU, optimized for SH4.
 44   Uses a lookup table for divisors in the range -128 .. +128, and
 45   div1 with case distinction for larger divisors in three more ranges.
 46   The code is lumped together with the table to allow the use of mova.  */
 47#ifdef CONFIG_CPU_LITTLE_ENDIAN
 48#define L_LSB 0
 49#define L_LSWMSB 1
 50#define L_MSWLSB 2
 51#else
 52#define L_LSB 3
 53#define L_LSWMSB 2
 54#define L_MSWLSB 1
 55#endif
 56
 57	.balign 4
 58	.global	__udivsi3_i4i
 59	.global	__udivsi3_i4
 60	.set	__udivsi3_i4, __udivsi3_i4i
 61	.type	__udivsi3_i4i, @function
 62__udivsi3_i4i:
 63	mov.w c128_w, r1
 64	div0u
 65	mov r4,r0
 66	shlr8 r0
 67	cmp/hi r1,r5
 68	extu.w r5,r1
 69	bf udiv_le128
 70	cmp/eq r5,r1
 71	bf udiv_ge64k
 72	shlr r0
 73	mov r5,r1
 74	shll16 r5
 75	mov.l r4,@-r15
 76	div1 r5,r0
 77	mov.l r1,@-r15
 78	div1 r5,r0
 79	div1 r5,r0
 80	bra udiv_25
 81	div1 r5,r0
 82
 83div_le128:
 84	mova div_table_ix,r0
 85	bra div_le128_2
 86	mov.b @(r0,r5),r1
 87udiv_le128:
 88	mov.l r4,@-r15
 89	mova div_table_ix,r0
 90	mov.b @(r0,r5),r1
 91	mov.l r5,@-r15
 92div_le128_2:
 93	mova div_table_inv,r0
 94	mov.l @(r0,r1),r1
 95	mov r5,r0
 96	tst #0xfe,r0
 97	mova div_table_clz,r0
 98	dmulu.l r1,r4
 99	mov.b @(r0,r5),r1
100	bt/s div_by_1
101	mov r4,r0
102	mov.l @r15+,r5
103	sts mach,r0
104	/* clrt */
105	addc r4,r0
106	mov.l @r15+,r4
107	rotcr r0
108	rts
109	shld r1,r0
110
111div_by_1_neg:
112	neg r4,r0
113div_by_1:
114	mov.l @r15+,r5
115	rts
116	mov.l @r15+,r4
117
118div_ge64k:
119	bt/s div_r8
120	div0u
121	shll8 r5
122	bra div_ge64k_2
123	div1 r5,r0
124udiv_ge64k:
125	cmp/hi r0,r5
126	mov r5,r1
127	bt udiv_r8
128	shll8 r5
129	mov.l r4,@-r15
130	div1 r5,r0
131	mov.l r1,@-r15
132div_ge64k_2:
133	div1 r5,r0
134	mov.l zero_l,r1
135	.rept 4
136	div1 r5,r0
137	.endr
138	mov.l r1,@-r15
139	div1 r5,r0
140	mov.w m256_w,r1
141	div1 r5,r0
142	mov.b r0,@(L_LSWMSB,r15)
143	xor r4,r0
144	and r1,r0
145	bra div_ge64k_end
146	xor r4,r0
147	
148div_r8:
149	shll16 r4
150	bra div_r8_2
151	shll8 r4
152udiv_r8:
153	mov.l r4,@-r15
154	shll16 r4
155	clrt
156	shll8 r4
157	mov.l r5,@-r15
158div_r8_2:
159	rotcl r4
160	mov r0,r1
161	div1 r5,r1
162	mov r4,r0
163	rotcl r0
164	mov r5,r4
165	div1 r5,r1
166	.rept 5
167	rotcl r0; div1 r5,r1
168	.endr
169	rotcl r0
170	mov.l @r15+,r5
171	div1 r4,r1
172	mov.l @r15+,r4
173	rts
174	rotcl r0
175
176	.global	__sdivsi3_i4i
177	.global __sdivsi3_i4
178	.global	__sdivsi3
179	.set	__sdivsi3_i4, __sdivsi3_i4i
180	.set	__sdivsi3, __sdivsi3_i4i
181	.type	__sdivsi3_i4i, @function
182	/* This is link-compatible with a __sdivsi3 call,
183	   but we effectively clobber only r1.  */
184__sdivsi3_i4i:
185	mov.l r4,@-r15
186	cmp/pz r5
187	mov.w c128_w, r1
188	bt/s pos_divisor
189	cmp/pz r4
190	mov.l r5,@-r15
191	neg r5,r5
192	bt/s neg_result
193	cmp/hi r1,r5
194	neg r4,r4
195pos_result:
196	extu.w r5,r0
197	bf div_le128
198	cmp/eq r5,r0
199	mov r4,r0
200	shlr8 r0
201	bf/s div_ge64k
202	cmp/hi r0,r5
203	div0u
204	shll16 r5
205	div1 r5,r0
206	div1 r5,r0
207	div1 r5,r0
208udiv_25:
209	mov.l zero_l,r1
210	div1 r5,r0
211	div1 r5,r0
212	mov.l r1,@-r15
213	.rept 3
214	div1 r5,r0
215	.endr
216	mov.b r0,@(L_MSWLSB,r15)
217	xtrct r4,r0
218	swap.w r0,r0
219	.rept 8
220	div1 r5,r0
221	.endr
222	mov.b r0,@(L_LSWMSB,r15)
223div_ge64k_end:
224	.rept 8
225	div1 r5,r0
226	.endr
227	mov.l @r15+,r4 ! zero-extension and swap using LS unit.
228	extu.b r0,r0
229	mov.l @r15+,r5
230	or r4,r0
231	mov.l @r15+,r4
232	rts
233	rotcl r0
234
235div_le128_neg:
236	tst #0xfe,r0
237	mova div_table_ix,r0
238	mov.b @(r0,r5),r1
239	mova div_table_inv,r0
240	bt/s div_by_1_neg
241	mov.l @(r0,r1),r1
242	mova div_table_clz,r0
243	dmulu.l r1,r4
244	mov.b @(r0,r5),r1
245	mov.l @r15+,r5
246	sts mach,r0
247	/* clrt */
248	addc r4,r0
249	mov.l @r15+,r4
250	rotcr r0
251	shld r1,r0
252	rts
253	neg r0,r0
254
255pos_divisor:
256	mov.l r5,@-r15
257	bt/s pos_result
258	cmp/hi r1,r5
259	neg r4,r4
260neg_result:
261	extu.w r5,r0
262	bf div_le128_neg
263	cmp/eq r5,r0
264	mov r4,r0
265	shlr8 r0
266	bf/s div_ge64k_neg
267	cmp/hi r0,r5
268	div0u
269	mov.l zero_l,r1
270	shll16 r5
271	div1 r5,r0
272	mov.l r1,@-r15
273	.rept 7
274	div1 r5,r0
275	.endr
276	mov.b r0,@(L_MSWLSB,r15)
277	xtrct r4,r0
278	swap.w r0,r0
279	.rept 8
280	div1 r5,r0
281	.endr
282	mov.b r0,@(L_LSWMSB,r15)
283div_ge64k_neg_end:
284	.rept 8
285	div1 r5,r0
286	.endr
287	mov.l @r15+,r4 ! zero-extension and swap using LS unit.
288	extu.b r0,r1
289	mov.l @r15+,r5
290	or r4,r1
291div_r8_neg_end:
292	mov.l @r15+,r4
293	rotcl r1
294	rts
295	neg r1,r0
296
297div_ge64k_neg:
298	bt/s div_r8_neg
299	div0u
300	shll8 r5
301	mov.l zero_l,r1
302	.rept 6
303	div1 r5,r0
304	.endr
305	mov.l r1,@-r15
306	div1 r5,r0
307	mov.w m256_w,r1
308	div1 r5,r0
309	mov.b r0,@(L_LSWMSB,r15)
310	xor r4,r0
311	and r1,r0
312	bra div_ge64k_neg_end
313	xor r4,r0
314
315c128_w:
316	.word 128
317
318div_r8_neg:
319	clrt
320	shll16 r4
321	mov r4,r1
322	shll8 r1
323	mov r5,r4
324	.rept 7
325	rotcl r1; div1 r5,r0
326	.endr
327	mov.l @r15+,r5
328	rotcl r1
329	bra div_r8_neg_end
330	div1 r4,r0
331
332m256_w:
333	.word 0xff00
334/* This table has been generated by divtab-sh4.c.  */
335	.balign 4
336div_table_clz:
337	.byte	0
338	.byte	1
339	.byte	0
340	.byte	-1
341	.byte	-1
342	.byte	-2
343	.byte	-2
344	.byte	-2
345	.byte	-2
346	.byte	-3
347	.byte	-3
348	.byte	-3
349	.byte	-3
350	.byte	-3
351	.byte	-3
352	.byte	-3
353	.byte	-3
354	.byte	-4
355	.byte	-4
356	.byte	-4
357	.byte	-4
358	.byte	-4
359	.byte	-4
360	.byte	-4
361	.byte	-4
362	.byte	-4
363	.byte	-4
364	.byte	-4
365	.byte	-4
366	.byte	-4
367	.byte	-4
368	.byte	-4
369	.byte	-4
370	.byte	-5
371	.byte	-5
372	.byte	-5
373	.byte	-5
374	.byte	-5
375	.byte	-5
376	.byte	-5
377	.byte	-5
378	.byte	-5
379	.byte	-5
380	.byte	-5
381	.byte	-5
382	.byte	-5
383	.byte	-5
384	.byte	-5
385	.byte	-5
386	.byte	-5
387	.byte	-5
388	.byte	-5
389	.byte	-5
390	.byte	-5
391	.byte	-5
392	.byte	-5
393	.byte	-5
394	.byte	-5
395	.byte	-5
396	.byte	-5
397	.byte	-5
398	.byte	-5
399	.byte	-5
400	.byte	-5
401	.byte	-5
402	.byte	-6
403	.byte	-6
404	.byte	-6
405	.byte	-6
406	.byte	-6
407	.byte	-6
408	.byte	-6
409	.byte	-6
410	.byte	-6
411	.byte	-6
412	.byte	-6
413	.byte	-6
414	.byte	-6
415	.byte	-6
416	.byte	-6
417	.byte	-6
418	.byte	-6
419	.byte	-6
420	.byte	-6
421	.byte	-6
422	.byte	-6
423	.byte	-6
424	.byte	-6
425	.byte	-6
426	.byte	-6
427	.byte	-6
428	.byte	-6
429	.byte	-6
430	.byte	-6
431	.byte	-6
432	.byte	-6
433	.byte	-6
434	.byte	-6
435	.byte	-6
436	.byte	-6
437	.byte	-6
438	.byte	-6
439	.byte	-6
440	.byte	-6
441	.byte	-6
442	.byte	-6
443	.byte	-6
444	.byte	-6
445	.byte	-6
446	.byte	-6
447	.byte	-6
448	.byte	-6
449	.byte	-6
450	.byte	-6
451	.byte	-6
452	.byte	-6
453	.byte	-6
454	.byte	-6
455	.byte	-6
456	.byte	-6
457	.byte	-6
458	.byte	-6
459	.byte	-6
460	.byte	-6
461	.byte	-6
462	.byte	-6
463	.byte	-6
464	.byte	-6
465/* Lookup table translating positive divisor to index into table of
466   normalized inverse.  N.B. the '0' entry is also the last entry of the
467 previous table, and causes an unaligned access for division by zero.  */
468div_table_ix:
469	.byte	-6
470	.byte	-128
471	.byte	-128
472	.byte	0
473	.byte	-128
474	.byte	-64
475	.byte	0
476	.byte	64
477	.byte	-128
478	.byte	-96
479	.byte	-64
480	.byte	-32
481	.byte	0
482	.byte	32
483	.byte	64
484	.byte	96
485	.byte	-128
486	.byte	-112
487	.byte	-96
488	.byte	-80
489	.byte	-64
490	.byte	-48
491	.byte	-32
492	.byte	-16
493	.byte	0
494	.byte	16
495	.byte	32
496	.byte	48
497	.byte	64
498	.byte	80
499	.byte	96
500	.byte	112
501	.byte	-128
502	.byte	-120
503	.byte	-112
504	.byte	-104
505	.byte	-96
506	.byte	-88
507	.byte	-80
508	.byte	-72
509	.byte	-64
510	.byte	-56
511	.byte	-48
512	.byte	-40
513	.byte	-32
514	.byte	-24
515	.byte	-16
516	.byte	-8
517	.byte	0
518	.byte	8
519	.byte	16
520	.byte	24
521	.byte	32
522	.byte	40
523	.byte	48
524	.byte	56
525	.byte	64
526	.byte	72
527	.byte	80
528	.byte	88
529	.byte	96
530	.byte	104
531	.byte	112
532	.byte	120
533	.byte	-128
534	.byte	-124
535	.byte	-120
536	.byte	-116
537	.byte	-112
538	.byte	-108
539	.byte	-104
540	.byte	-100
541	.byte	-96
542	.byte	-92
543	.byte	-88
544	.byte	-84
545	.byte	-80
546	.byte	-76
547	.byte	-72
548	.byte	-68
549	.byte	-64
550	.byte	-60
551	.byte	-56
552	.byte	-52
553	.byte	-48
554	.byte	-44
555	.byte	-40
556	.byte	-36
557	.byte	-32
558	.byte	-28
559	.byte	-24
560	.byte	-20
561	.byte	-16
562	.byte	-12
563	.byte	-8
564	.byte	-4
565	.byte	0
566	.byte	4
567	.byte	8
568	.byte	12
569	.byte	16
570	.byte	20
571	.byte	24
572	.byte	28
573	.byte	32
574	.byte	36
575	.byte	40
576	.byte	44
577	.byte	48
578	.byte	52
579	.byte	56
580	.byte	60
581	.byte	64
582	.byte	68
583	.byte	72
584	.byte	76
585	.byte	80
586	.byte	84
587	.byte	88
588	.byte	92
589	.byte	96
590	.byte	100
591	.byte	104
592	.byte	108
593	.byte	112
594	.byte	116
595	.byte	120
596	.byte	124
597	.byte	-128
598/* 1/64 .. 1/127, normalized.  There is an implicit leading 1 in bit 32.  */
599	.balign 4
600zero_l:
601	.long	0x0
602	.long	0xF81F81F9
603	.long	0xF07C1F08
604	.long	0xE9131AC0
605	.long	0xE1E1E1E2
606	.long	0xDAE6076C
607	.long	0xD41D41D5
608	.long	0xCD856891
609	.long	0xC71C71C8
610	.long	0xC0E07039
611	.long	0xBACF914D
612	.long	0xB4E81B4F
613	.long	0xAF286BCB
614	.long	0xA98EF607
615	.long	0xA41A41A5
616	.long	0x9EC8E952
617	.long	0x9999999A
618	.long	0x948B0FCE
619	.long	0x8F9C18FA
620	.long	0x8ACB90F7
621	.long	0x86186187
622	.long	0x81818182
623	.long	0x7D05F418
624	.long	0x78A4C818
625	.long	0x745D1746
626	.long	0x702E05C1
627	.long	0x6C16C16D
628	.long	0x68168169
629	.long	0x642C8591
630	.long	0x60581606
631	.long	0x5C9882BA
632	.long	0x58ED2309
633div_table_inv:
634	.long	0x55555556
635	.long	0x51D07EAF
636	.long	0x4E5E0A73
637	.long	0x4AFD6A06
638	.long	0x47AE147B
639	.long	0x446F8657
640	.long	0x41414142
641	.long	0x3E22CBCF
642	.long	0x3B13B13C
643	.long	0x38138139
644	.long	0x3521CFB3
645	.long	0x323E34A3
646	.long	0x2F684BDB
647	.long	0x2C9FB4D9
648	.long	0x29E4129F
649	.long	0x27350B89
650	.long	0x24924925
651	.long	0x21FB7813
652	.long	0x1F7047DD
653	.long	0x1CF06ADB
654	.long	0x1A7B9612
655	.long	0x18118119
656	.long	0x15B1E5F8
657	.long	0x135C8114
658	.long	0x11111112
659	.long	0xECF56BF
660	.long	0xC9714FC
661	.long	0xA6810A7
662	.long	0x8421085
663	.long	0x624DD30
664	.long	0x4104105
665	.long	0x2040811
666	/* maximum error: 0.987342 scaled: 0.921875*/
v6.2
  1/* SPDX-License-Identifier: GPL-2.0+ WITH GCC-exception-2.0
  2
  3   Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
  4   2004, 2005, 2006
  5   Free Software Foundation, Inc.
  6*/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  7
  8!! libgcc routines for the Renesas / SuperH SH CPUs.
  9!! Contributed by Steve Chamberlain.
 10!! sac@cygnus.com
 11
 12!! ashiftrt_r4_x, ___ashrsi3, ___ashlsi3, ___lshrsi3 routines
 13!! recoded in assembly by Toshiyasu Morita
 14!! tm@netcom.com
 15
 16/* SH2 optimizations for ___ashrsi3, ___ashlsi3, ___lshrsi3 and
 17   ELF local label prefixes by J"orn Rennecke
 18   amylaar@cygnus.com  */
 19
 20/* This code used shld, thus is not suitable for SH1 / SH2.  */
 21
 22/* Signed / unsigned division without use of FPU, optimized for SH4.
 23   Uses a lookup table for divisors in the range -128 .. +128, and
 24   div1 with case distinction for larger divisors in three more ranges.
 25   The code is lumped together with the table to allow the use of mova.  */
 26#ifdef CONFIG_CPU_LITTLE_ENDIAN
 27#define L_LSB 0
 28#define L_LSWMSB 1
 29#define L_MSWLSB 2
 30#else
 31#define L_LSB 3
 32#define L_LSWMSB 2
 33#define L_MSWLSB 1
 34#endif
 35
 36	.balign 4
 37	.global	__udivsi3_i4i
 38	.global	__udivsi3_i4
 39	.set	__udivsi3_i4, __udivsi3_i4i
 40	.type	__udivsi3_i4i, @function
 41__udivsi3_i4i:
 42	mov.w c128_w, r1
 43	div0u
 44	mov r4,r0
 45	shlr8 r0
 46	cmp/hi r1,r5
 47	extu.w r5,r1
 48	bf udiv_le128
 49	cmp/eq r5,r1
 50	bf udiv_ge64k
 51	shlr r0
 52	mov r5,r1
 53	shll16 r5
 54	mov.l r4,@-r15
 55	div1 r5,r0
 56	mov.l r1,@-r15
 57	div1 r5,r0
 58	div1 r5,r0
 59	bra udiv_25
 60	div1 r5,r0
 61
 62div_le128:
 63	mova div_table_ix,r0
 64	bra div_le128_2
 65	mov.b @(r0,r5),r1
 66udiv_le128:
 67	mov.l r4,@-r15
 68	mova div_table_ix,r0
 69	mov.b @(r0,r5),r1
 70	mov.l r5,@-r15
 71div_le128_2:
 72	mova div_table_inv,r0
 73	mov.l @(r0,r1),r1
 74	mov r5,r0
 75	tst #0xfe,r0
 76	mova div_table_clz,r0
 77	dmulu.l r1,r4
 78	mov.b @(r0,r5),r1
 79	bt/s div_by_1
 80	mov r4,r0
 81	mov.l @r15+,r5
 82	sts mach,r0
 83	/* clrt */
 84	addc r4,r0
 85	mov.l @r15+,r4
 86	rotcr r0
 87	rts
 88	shld r1,r0
 89
 90div_by_1_neg:
 91	neg r4,r0
 92div_by_1:
 93	mov.l @r15+,r5
 94	rts
 95	mov.l @r15+,r4
 96
 97div_ge64k:
 98	bt/s div_r8
 99	div0u
100	shll8 r5
101	bra div_ge64k_2
102	div1 r5,r0
103udiv_ge64k:
104	cmp/hi r0,r5
105	mov r5,r1
106	bt udiv_r8
107	shll8 r5
108	mov.l r4,@-r15
109	div1 r5,r0
110	mov.l r1,@-r15
111div_ge64k_2:
112	div1 r5,r0
113	mov.l zero_l,r1
114	.rept 4
115	div1 r5,r0
116	.endr
117	mov.l r1,@-r15
118	div1 r5,r0
119	mov.w m256_w,r1
120	div1 r5,r0
121	mov.b r0,@(L_LSWMSB,r15)
122	xor r4,r0
123	and r1,r0
124	bra div_ge64k_end
125	xor r4,r0
126	
127div_r8:
128	shll16 r4
129	bra div_r8_2
130	shll8 r4
131udiv_r8:
132	mov.l r4,@-r15
133	shll16 r4
134	clrt
135	shll8 r4
136	mov.l r5,@-r15
137div_r8_2:
138	rotcl r4
139	mov r0,r1
140	div1 r5,r1
141	mov r4,r0
142	rotcl r0
143	mov r5,r4
144	div1 r5,r1
145	.rept 5
146	rotcl r0; div1 r5,r1
147	.endr
148	rotcl r0
149	mov.l @r15+,r5
150	div1 r4,r1
151	mov.l @r15+,r4
152	rts
153	rotcl r0
154
155	.global	__sdivsi3_i4i
156	.global __sdivsi3_i4
157	.global	__sdivsi3
158	.set	__sdivsi3_i4, __sdivsi3_i4i
159	.set	__sdivsi3, __sdivsi3_i4i
160	.type	__sdivsi3_i4i, @function
161	/* This is link-compatible with a __sdivsi3 call,
162	   but we effectively clobber only r1.  */
163__sdivsi3_i4i:
164	mov.l r4,@-r15
165	cmp/pz r5
166	mov.w c128_w, r1
167	bt/s pos_divisor
168	cmp/pz r4
169	mov.l r5,@-r15
170	neg r5,r5
171	bt/s neg_result
172	cmp/hi r1,r5
173	neg r4,r4
174pos_result:
175	extu.w r5,r0
176	bf div_le128
177	cmp/eq r5,r0
178	mov r4,r0
179	shlr8 r0
180	bf/s div_ge64k
181	cmp/hi r0,r5
182	div0u
183	shll16 r5
184	div1 r5,r0
185	div1 r5,r0
186	div1 r5,r0
187udiv_25:
188	mov.l zero_l,r1
189	div1 r5,r0
190	div1 r5,r0
191	mov.l r1,@-r15
192	.rept 3
193	div1 r5,r0
194	.endr
195	mov.b r0,@(L_MSWLSB,r15)
196	xtrct r4,r0
197	swap.w r0,r0
198	.rept 8
199	div1 r5,r0
200	.endr
201	mov.b r0,@(L_LSWMSB,r15)
202div_ge64k_end:
203	.rept 8
204	div1 r5,r0
205	.endr
206	mov.l @r15+,r4 ! zero-extension and swap using LS unit.
207	extu.b r0,r0
208	mov.l @r15+,r5
209	or r4,r0
210	mov.l @r15+,r4
211	rts
212	rotcl r0
213
214div_le128_neg:
215	tst #0xfe,r0
216	mova div_table_ix,r0
217	mov.b @(r0,r5),r1
218	mova div_table_inv,r0
219	bt/s div_by_1_neg
220	mov.l @(r0,r1),r1
221	mova div_table_clz,r0
222	dmulu.l r1,r4
223	mov.b @(r0,r5),r1
224	mov.l @r15+,r5
225	sts mach,r0
226	/* clrt */
227	addc r4,r0
228	mov.l @r15+,r4
229	rotcr r0
230	shld r1,r0
231	rts
232	neg r0,r0
233
234pos_divisor:
235	mov.l r5,@-r15
236	bt/s pos_result
237	cmp/hi r1,r5
238	neg r4,r4
239neg_result:
240	extu.w r5,r0
241	bf div_le128_neg
242	cmp/eq r5,r0
243	mov r4,r0
244	shlr8 r0
245	bf/s div_ge64k_neg
246	cmp/hi r0,r5
247	div0u
248	mov.l zero_l,r1
249	shll16 r5
250	div1 r5,r0
251	mov.l r1,@-r15
252	.rept 7
253	div1 r5,r0
254	.endr
255	mov.b r0,@(L_MSWLSB,r15)
256	xtrct r4,r0
257	swap.w r0,r0
258	.rept 8
259	div1 r5,r0
260	.endr
261	mov.b r0,@(L_LSWMSB,r15)
262div_ge64k_neg_end:
263	.rept 8
264	div1 r5,r0
265	.endr
266	mov.l @r15+,r4 ! zero-extension and swap using LS unit.
267	extu.b r0,r1
268	mov.l @r15+,r5
269	or r4,r1
270div_r8_neg_end:
271	mov.l @r15+,r4
272	rotcl r1
273	rts
274	neg r1,r0
275
276div_ge64k_neg:
277	bt/s div_r8_neg
278	div0u
279	shll8 r5
280	mov.l zero_l,r1
281	.rept 6
282	div1 r5,r0
283	.endr
284	mov.l r1,@-r15
285	div1 r5,r0
286	mov.w m256_w,r1
287	div1 r5,r0
288	mov.b r0,@(L_LSWMSB,r15)
289	xor r4,r0
290	and r1,r0
291	bra div_ge64k_neg_end
292	xor r4,r0
293
294c128_w:
295	.word 128
296
297div_r8_neg:
298	clrt
299	shll16 r4
300	mov r4,r1
301	shll8 r1
302	mov r5,r4
303	.rept 7
304	rotcl r1; div1 r5,r0
305	.endr
306	mov.l @r15+,r5
307	rotcl r1
308	bra div_r8_neg_end
309	div1 r4,r0
310
311m256_w:
312	.word 0xff00
313/* This table has been generated by divtab-sh4.c.  */
314	.balign 4
315div_table_clz:
316	.byte	0
317	.byte	1
318	.byte	0
319	.byte	-1
320	.byte	-1
321	.byte	-2
322	.byte	-2
323	.byte	-2
324	.byte	-2
325	.byte	-3
326	.byte	-3
327	.byte	-3
328	.byte	-3
329	.byte	-3
330	.byte	-3
331	.byte	-3
332	.byte	-3
333	.byte	-4
334	.byte	-4
335	.byte	-4
336	.byte	-4
337	.byte	-4
338	.byte	-4
339	.byte	-4
340	.byte	-4
341	.byte	-4
342	.byte	-4
343	.byte	-4
344	.byte	-4
345	.byte	-4
346	.byte	-4
347	.byte	-4
348	.byte	-4
349	.byte	-5
350	.byte	-5
351	.byte	-5
352	.byte	-5
353	.byte	-5
354	.byte	-5
355	.byte	-5
356	.byte	-5
357	.byte	-5
358	.byte	-5
359	.byte	-5
360	.byte	-5
361	.byte	-5
362	.byte	-5
363	.byte	-5
364	.byte	-5
365	.byte	-5
366	.byte	-5
367	.byte	-5
368	.byte	-5
369	.byte	-5
370	.byte	-5
371	.byte	-5
372	.byte	-5
373	.byte	-5
374	.byte	-5
375	.byte	-5
376	.byte	-5
377	.byte	-5
378	.byte	-5
379	.byte	-5
380	.byte	-5
381	.byte	-6
382	.byte	-6
383	.byte	-6
384	.byte	-6
385	.byte	-6
386	.byte	-6
387	.byte	-6
388	.byte	-6
389	.byte	-6
390	.byte	-6
391	.byte	-6
392	.byte	-6
393	.byte	-6
394	.byte	-6
395	.byte	-6
396	.byte	-6
397	.byte	-6
398	.byte	-6
399	.byte	-6
400	.byte	-6
401	.byte	-6
402	.byte	-6
403	.byte	-6
404	.byte	-6
405	.byte	-6
406	.byte	-6
407	.byte	-6
408	.byte	-6
409	.byte	-6
410	.byte	-6
411	.byte	-6
412	.byte	-6
413	.byte	-6
414	.byte	-6
415	.byte	-6
416	.byte	-6
417	.byte	-6
418	.byte	-6
419	.byte	-6
420	.byte	-6
421	.byte	-6
422	.byte	-6
423	.byte	-6
424	.byte	-6
425	.byte	-6
426	.byte	-6
427	.byte	-6
428	.byte	-6
429	.byte	-6
430	.byte	-6
431	.byte	-6
432	.byte	-6
433	.byte	-6
434	.byte	-6
435	.byte	-6
436	.byte	-6
437	.byte	-6
438	.byte	-6
439	.byte	-6
440	.byte	-6
441	.byte	-6
442	.byte	-6
443	.byte	-6
444/* Lookup table translating positive divisor to index into table of
445   normalized inverse.  N.B. the '0' entry is also the last entry of the
446 previous table, and causes an unaligned access for division by zero.  */
447div_table_ix:
448	.byte	-6
449	.byte	-128
450	.byte	-128
451	.byte	0
452	.byte	-128
453	.byte	-64
454	.byte	0
455	.byte	64
456	.byte	-128
457	.byte	-96
458	.byte	-64
459	.byte	-32
460	.byte	0
461	.byte	32
462	.byte	64
463	.byte	96
464	.byte	-128
465	.byte	-112
466	.byte	-96
467	.byte	-80
468	.byte	-64
469	.byte	-48
470	.byte	-32
471	.byte	-16
472	.byte	0
473	.byte	16
474	.byte	32
475	.byte	48
476	.byte	64
477	.byte	80
478	.byte	96
479	.byte	112
480	.byte	-128
481	.byte	-120
482	.byte	-112
483	.byte	-104
484	.byte	-96
485	.byte	-88
486	.byte	-80
487	.byte	-72
488	.byte	-64
489	.byte	-56
490	.byte	-48
491	.byte	-40
492	.byte	-32
493	.byte	-24
494	.byte	-16
495	.byte	-8
496	.byte	0
497	.byte	8
498	.byte	16
499	.byte	24
500	.byte	32
501	.byte	40
502	.byte	48
503	.byte	56
504	.byte	64
505	.byte	72
506	.byte	80
507	.byte	88
508	.byte	96
509	.byte	104
510	.byte	112
511	.byte	120
512	.byte	-128
513	.byte	-124
514	.byte	-120
515	.byte	-116
516	.byte	-112
517	.byte	-108
518	.byte	-104
519	.byte	-100
520	.byte	-96
521	.byte	-92
522	.byte	-88
523	.byte	-84
524	.byte	-80
525	.byte	-76
526	.byte	-72
527	.byte	-68
528	.byte	-64
529	.byte	-60
530	.byte	-56
531	.byte	-52
532	.byte	-48
533	.byte	-44
534	.byte	-40
535	.byte	-36
536	.byte	-32
537	.byte	-28
538	.byte	-24
539	.byte	-20
540	.byte	-16
541	.byte	-12
542	.byte	-8
543	.byte	-4
544	.byte	0
545	.byte	4
546	.byte	8
547	.byte	12
548	.byte	16
549	.byte	20
550	.byte	24
551	.byte	28
552	.byte	32
553	.byte	36
554	.byte	40
555	.byte	44
556	.byte	48
557	.byte	52
558	.byte	56
559	.byte	60
560	.byte	64
561	.byte	68
562	.byte	72
563	.byte	76
564	.byte	80
565	.byte	84
566	.byte	88
567	.byte	92
568	.byte	96
569	.byte	100
570	.byte	104
571	.byte	108
572	.byte	112
573	.byte	116
574	.byte	120
575	.byte	124
576	.byte	-128
577/* 1/64 .. 1/127, normalized.  There is an implicit leading 1 in bit 32.  */
578	.balign 4
579zero_l:
580	.long	0x0
581	.long	0xF81F81F9
582	.long	0xF07C1F08
583	.long	0xE9131AC0
584	.long	0xE1E1E1E2
585	.long	0xDAE6076C
586	.long	0xD41D41D5
587	.long	0xCD856891
588	.long	0xC71C71C8
589	.long	0xC0E07039
590	.long	0xBACF914D
591	.long	0xB4E81B4F
592	.long	0xAF286BCB
593	.long	0xA98EF607
594	.long	0xA41A41A5
595	.long	0x9EC8E952
596	.long	0x9999999A
597	.long	0x948B0FCE
598	.long	0x8F9C18FA
599	.long	0x8ACB90F7
600	.long	0x86186187
601	.long	0x81818182
602	.long	0x7D05F418
603	.long	0x78A4C818
604	.long	0x745D1746
605	.long	0x702E05C1
606	.long	0x6C16C16D
607	.long	0x68168169
608	.long	0x642C8591
609	.long	0x60581606
610	.long	0x5C9882BA
611	.long	0x58ED2309
612div_table_inv:
613	.long	0x55555556
614	.long	0x51D07EAF
615	.long	0x4E5E0A73
616	.long	0x4AFD6A06
617	.long	0x47AE147B
618	.long	0x446F8657
619	.long	0x41414142
620	.long	0x3E22CBCF
621	.long	0x3B13B13C
622	.long	0x38138139
623	.long	0x3521CFB3
624	.long	0x323E34A3
625	.long	0x2F684BDB
626	.long	0x2C9FB4D9
627	.long	0x29E4129F
628	.long	0x27350B89
629	.long	0x24924925
630	.long	0x21FB7813
631	.long	0x1F7047DD
632	.long	0x1CF06ADB
633	.long	0x1A7B9612
634	.long	0x18118119
635	.long	0x15B1E5F8
636	.long	0x135C8114
637	.long	0x11111112
638	.long	0xECF56BF
639	.long	0xC9714FC
640	.long	0xA6810A7
641	.long	0x8421085
642	.long	0x624DD30
643	.long	0x4104105
644	.long	0x2040811
645	/* maximum error: 0.987342 scaled: 0.921875*/