Home | History | Annotate | Line # | Download | only in sh3
      1  1.2  uwe /*	$NetBSD: sdivsi3_i4i.S,v 1.2 2011/08/05 02:00:25 uwe Exp $	*/
      2  1.1  uwe 
      3  1.1  uwe /*-
      4  1.1  uwe  * Copyright (c) 1990 The Regents of the University of California.
      5  1.1  uwe  * All rights reserved.
      6  1.1  uwe  *
      7  1.1  uwe  * This code is derived from software contributed to Berkeley by
      8  1.1  uwe  * William Jolitz.
      9  1.1  uwe  *
     10  1.1  uwe  * Redistribution and use in source and binary forms, with or without
     11  1.1  uwe  * modification, are permitted provided that the following conditions
     12  1.1  uwe  * are met:
     13  1.1  uwe  * 1. Redistributions of source code must retain the above copyright
     14  1.1  uwe  *    notice, this list of conditions and the following disclaimer.
     15  1.1  uwe  * 2. Redistributions in binary form must reproduce the above copyright
     16  1.1  uwe  *    notice, this list of conditions and the following disclaimer in the
     17  1.1  uwe  *    documentation and/or other materials provided with the distribution.
     18  1.1  uwe  * 3. Neither the name of the University nor the names of its contributors
     19  1.1  uwe  *    may be used to endorse or promote products derived from this software
     20  1.1  uwe  *    without specific prior written permission.
     21  1.1  uwe  *
     22  1.1  uwe  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     23  1.1  uwe  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     24  1.1  uwe  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     25  1.1  uwe  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     26  1.1  uwe  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     27  1.1  uwe  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     28  1.1  uwe  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     29  1.1  uwe  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     30  1.1  uwe  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     31  1.1  uwe  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     32  1.1  uwe  * SUCH DAMAGE.
     33  1.1  uwe  *
     34  1.1  uwe  *	from: @(#)udivsi3.s	5.1 (Berkeley) 5/15/90
     35  1.1  uwe  */
     36  1.1  uwe 
     37  1.1  uwe #include <machine/asm.h>
     38  1.1  uwe #if defined(LIBC_SCCS)
     39  1.2  uwe 	RCSID("$NetBSD: sdivsi3_i4i.S,v 1.2 2011/08/05 02:00:25 uwe Exp $")
     40  1.1  uwe #endif
     41  1.1  uwe 
     42  1.2  uwe /*
     43  1.2  uwe  * IMPOTANT: This function is special.
     44  1.2  uwe  *
     45  1.2  uwe  * This function is an auxiliary "millicode" function that is
     46  1.2  uwe  * referenced by the code generated by gcc for signed integer
     47  1.2  uwe  * division.  But gcc does NOT treat a call to this function as an
     48  1.2  uwe  * ordinary function call - it can clobber only R1, MACL and MACH.
     49  1.2  uwe  *
     50  1.2  uwe  * See the definition of "divsi3_i4_int" in gcc/config/sh/sh.md
     51  1.2  uwe  *
     52  1.2  uwe  * As the consequence this function cannot be called via any
     53  1.2  uwe  * indirection that assumes normal calling convention:
     54  1.2  uwe  *
     55  1.2  uwe  * . cannot have _PROF_PROLOGUE
     56  1.2  uwe  * . cannot be called via PLT (not relevant for kernel)
     57  1.2  uwe  *
     58  1.2  uwe  * XXX: uwe: Older gcc used __sdivsi3; newer uses __sdivsi3_i4i - a
     59  1.2  uwe  * heavily tuned version that is NOT compatible with __sdivsi3 because
     60  1.2  uwe  * it clobbers different registers.  We don't want to link the kernel
     61  1.2  uwe  * against libgcc and we don't have resources to write heavily tuned
     62  1.2  uwe  * version ourselves, so clone __sdivsi3 but adjust the code to
     63  1.2  uwe  * conform to the __sdivsi3_i4i clobber spec.
     64  1.2  uwe  */
     65  1.2  uwe 
     66  1.1  uwe 
     67  1.1  uwe #ifdef __ELF__
     68  1.1  uwe 	.hidden __sdivsi3_i4i
     69  1.1  uwe #endif
     70  1.1  uwe 
     71  1.1  uwe 
     72  1.1  uwe /* r0 <= r4 / r5 */
     73  1.1  uwe NENTRY(__sdivsi3_i4i)
     74  1.1  uwe 	mov	r4, r0
     75  1.1  uwe 	mov	r5, r1
     76  1.1  uwe 
     77  1.1  uwe 	tst	r1, r1
     78  1.1  uwe 	bt	.L_div_by_zero
     79  1.1  uwe 
     80  1.1  uwe 	!! this version cannot clobber r2 and r3, but can clobber macl/mach
     81  1.1  uwe 	lds	r2, macl
     82  1.1  uwe 	lds	r3, mach
     83  1.1  uwe 
     84  1.1  uwe 	mov	#0, r2
     85  1.1  uwe 	div0s	r2, r0
     86  1.1  uwe 	subc	r3, r3
     87  1.1  uwe 	subc	r2, r0
     88  1.1  uwe 	div0s	r1, r3
     89  1.1  uwe #define DIVSTEP	rotcl r0; div1 r1, r3
     90  1.1  uwe 	/* repeat 32 times */
     91  1.1  uwe 	DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP;
     92  1.1  uwe 	DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP;
     93  1.1  uwe 	DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP;
     94  1.1  uwe 	DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP; DIVSTEP;
     95  1.1  uwe #undef DIVSTEP
     96  1.1  uwe 	rotcl	r0
     97  1.1  uwe 
     98  1.1  uwe 	addc	r2, r0
     99  1.1  uwe 
    100  1.1  uwe 	sts	mach, r3
    101  1.1  uwe 	sts	macl, r2
    102  1.1  uwe 
    103  1.1  uwe 	rts
    104  1.1  uwe 	 nop
    105  1.1  uwe 
    106  1.1  uwe .L_div_by_zero:
    107  1.1  uwe 	rts
    108  1.1  uwe 	 mov	#0, r0
    109