Fix up mix of man(7)/mdoc(7).
[netbsd-mini2440.git] / sys / lib / libkern / arch / sh3 / udivsi3.S
blobb1882d9584ff4fa9a7e118146eaa452050083bcd
1 /*      $NetBSD: udivsi3.S,v 1.7 2006/05/22 20:56:44 uwe Exp $  */
3 /*-
4  * Copyright (c) 1990 The Regents of the University of California.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to Berkeley by
8  * William Jolitz.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. Neither the name of the University nor the names of its contributors
19  *    may be used to endorse or promote products derived from this software
20  *    without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  *      from: @(#)udivsi3.s     5.1 (Berkeley) 5/15/90
35  */
37 #include <machine/asm.h>
38 #if defined(LIBC_SCCS)
39         RCSID("$NetBSD: udivsi3.S,v 1.7 2006/05/22 20:56:44 uwe Exp $")
40 #endif
43  * IMPOTANT: This function is special.
44  *
45  * This function is an auxiliary function that is referenced by the
46  * code generated by gcc for integer division.  But gcc does NOT treat
47  * a call to this function as an ordinary function call w.r.t. the set
48  * of register this call clobbers.  See the definition of "udivsi3_i1"
49  * in gcc/config/sh/sh.md.
50  *
51  * Any call to this function MUST NOT clobber any registers besides r4
52  * and r0, where the result is returned.  At the time of the call the
53  * r4 contains the first argument, so we are only left with r0, and we
54  * cannot do anything meaningful using only one register.  The
55  * consequences are:
56  *
57  * . this function cannot have _PROF_PROLOGUE
58  * . this function cannot be called via PLT
59  */
62 #ifdef __ELF__
63         .hidden __udivsi3
64 #endif
67 /* r0 <= r4 / r5 */
68 NENTRY(__udivsi3)
69         tst     r5, r5
70         bt      div_by_zero
72         mov     #0, r0
73         div0u
74 #define DIVSTEP rotcl r4; div1 r5, r0
75         /* repeat 32 times */
76         DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP;
77         DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP;
78         DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP;
79         DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP;
80 #undef DIVSTEP
81         rotcl   r4
83         rts
84          mov    r4, r0
86 div_by_zero:
87 #ifdef _KERNEL
88         rts
89          mov    #0, r0
90 #else
91         mov.l   r14, @-r15
92         sts.l   pr, @-r15
93         mov     r15, r14
95         mov.l   L_raise, r1
96 #ifdef PIC
97 1:      bsrf    r1
98 #else
99         jsr     @r1
100 #endif
101          mov    #8, r4          /* delay slot.  8 <- SIGFPE. */
102         mov     #0, r0
104         lds.l   @r15+, pr
105         rts
106          mov.l  @r15+, r14
108         .align  2
109 L_raise:
110 #ifdef PIC
111         .long   _C_LABEL(raise)-(1b+4)
112 #else
113         .long   _C_LABEL(raise)
114 #endif
115 #endif