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