xref: /openbmc/linux/arch/m68k/lib/umodsi3.S (revision 66d857b08b8c3ed5c72c361f863cce77d2a978d7)
1*66d857b0SGreg Ungerer/* libgcc1 routines for 68000 w/o floating-point hardware.
2*66d857b0SGreg Ungerer   Copyright (C) 1994, 1996, 1997, 1998 Free Software Foundation, Inc.
3*66d857b0SGreg Ungerer
4*66d857b0SGreg UngererThis file is part of GNU CC.
5*66d857b0SGreg Ungerer
6*66d857b0SGreg UngererGNU CC is free software; you can redistribute it and/or modify it
7*66d857b0SGreg Ungererunder the terms of the GNU General Public License as published by the
8*66d857b0SGreg UngererFree Software Foundation; either version 2, or (at your option) any
9*66d857b0SGreg Ungererlater version.
10*66d857b0SGreg Ungerer
11*66d857b0SGreg UngererIn addition to the permissions in the GNU General Public License, the
12*66d857b0SGreg UngererFree Software Foundation gives you unlimited permission to link the
13*66d857b0SGreg Ungerercompiled version of this file with other programs, and to distribute
14*66d857b0SGreg Ungererthose programs without any restriction coming from the use of this
15*66d857b0SGreg Ungererfile.  (The General Public License restrictions do apply in other
16*66d857b0SGreg Ungererrespects; for example, they cover modification of the file, and
17*66d857b0SGreg Ungererdistribution when not linked into another program.)
18*66d857b0SGreg Ungerer
19*66d857b0SGreg UngererThis file is distributed in the hope that it will be useful, but
20*66d857b0SGreg UngererWITHOUT ANY WARRANTY; without even the implied warranty of
21*66d857b0SGreg UngererMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22*66d857b0SGreg UngererGeneral Public License for more details.
23*66d857b0SGreg Ungerer
24*66d857b0SGreg UngererYou should have received a copy of the GNU General Public License
25*66d857b0SGreg Ungereralong with this program; see the file COPYING.  If not, write to
26*66d857b0SGreg Ungererthe Free Software Foundation, 59 Temple Place - Suite 330,
27*66d857b0SGreg UngererBoston, MA 02111-1307, USA.  */
28*66d857b0SGreg Ungerer
29*66d857b0SGreg Ungerer/* As a special exception, if you link this library with files
30*66d857b0SGreg Ungerer   compiled with GCC to produce an executable, this does not cause
31*66d857b0SGreg Ungerer   the resulting executable to be covered by the GNU General Public License.
32*66d857b0SGreg Ungerer   This exception does not however invalidate any other reasons why
33*66d857b0SGreg Ungerer   the executable file might be covered by the GNU General Public License.  */
34*66d857b0SGreg Ungerer
35*66d857b0SGreg Ungerer/* Use this one for any 680x0; assumes no floating point hardware.
36*66d857b0SGreg Ungerer   The trailing " '" appearing on some lines is for ANSI preprocessors.  Yuk.
37*66d857b0SGreg Ungerer   Some of this code comes from MINIX, via the folks at ericsson.
38*66d857b0SGreg Ungerer   D. V. Henkel-Wallace (gumby@cygnus.com) Fete Bastille, 1992
39*66d857b0SGreg Ungerer*/
40*66d857b0SGreg Ungerer
41*66d857b0SGreg Ungerer/* These are predefined by new versions of GNU cpp.  */
42*66d857b0SGreg Ungerer
43*66d857b0SGreg Ungerer#ifndef __USER_LABEL_PREFIX__
44*66d857b0SGreg Ungerer#define __USER_LABEL_PREFIX__ _
45*66d857b0SGreg Ungerer#endif
46*66d857b0SGreg Ungerer
47*66d857b0SGreg Ungerer#ifndef __REGISTER_PREFIX__
48*66d857b0SGreg Ungerer#define __REGISTER_PREFIX__
49*66d857b0SGreg Ungerer#endif
50*66d857b0SGreg Ungerer
51*66d857b0SGreg Ungerer#ifndef __IMMEDIATE_PREFIX__
52*66d857b0SGreg Ungerer#define __IMMEDIATE_PREFIX__ #
53*66d857b0SGreg Ungerer#endif
54*66d857b0SGreg Ungerer
55*66d857b0SGreg Ungerer/* ANSI concatenation macros.  */
56*66d857b0SGreg Ungerer
57*66d857b0SGreg Ungerer#define CONCAT1(a, b) CONCAT2(a, b)
58*66d857b0SGreg Ungerer#define CONCAT2(a, b) a ## b
59*66d857b0SGreg Ungerer
60*66d857b0SGreg Ungerer/* Use the right prefix for global labels.  */
61*66d857b0SGreg Ungerer
62*66d857b0SGreg Ungerer#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
63*66d857b0SGreg Ungerer
64*66d857b0SGreg Ungerer/* Use the right prefix for registers.  */
65*66d857b0SGreg Ungerer
66*66d857b0SGreg Ungerer#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
67*66d857b0SGreg Ungerer
68*66d857b0SGreg Ungerer/* Use the right prefix for immediate values.  */
69*66d857b0SGreg Ungerer
70*66d857b0SGreg Ungerer#define IMM(x) CONCAT1 (__IMMEDIATE_PREFIX__, x)
71*66d857b0SGreg Ungerer
72*66d857b0SGreg Ungerer#define d0 REG (d0)
73*66d857b0SGreg Ungerer#define d1 REG (d1)
74*66d857b0SGreg Ungerer#define d2 REG (d2)
75*66d857b0SGreg Ungerer#define d3 REG (d3)
76*66d857b0SGreg Ungerer#define d4 REG (d4)
77*66d857b0SGreg Ungerer#define d5 REG (d5)
78*66d857b0SGreg Ungerer#define d6 REG (d6)
79*66d857b0SGreg Ungerer#define d7 REG (d7)
80*66d857b0SGreg Ungerer#define a0 REG (a0)
81*66d857b0SGreg Ungerer#define a1 REG (a1)
82*66d857b0SGreg Ungerer#define a2 REG (a2)
83*66d857b0SGreg Ungerer#define a3 REG (a3)
84*66d857b0SGreg Ungerer#define a4 REG (a4)
85*66d857b0SGreg Ungerer#define a5 REG (a5)
86*66d857b0SGreg Ungerer#define a6 REG (a6)
87*66d857b0SGreg Ungerer#define fp REG (fp)
88*66d857b0SGreg Ungerer#define sp REG (sp)
89*66d857b0SGreg Ungerer
90*66d857b0SGreg Ungerer	.text
91*66d857b0SGreg Ungerer	.proc
92*66d857b0SGreg Ungerer	.globl	SYM (__umodsi3)
93*66d857b0SGreg UngererSYM (__umodsi3):
94*66d857b0SGreg Ungerer	movel	sp@(8), d1	/* d1 = divisor */
95*66d857b0SGreg Ungerer	movel	sp@(4), d0	/* d0 = dividend */
96*66d857b0SGreg Ungerer	movel	d1, sp@-
97*66d857b0SGreg Ungerer	movel	d0, sp@-
98*66d857b0SGreg Ungerer	jbsr	SYM (__udivsi3)
99*66d857b0SGreg Ungerer	addql	IMM (8), sp
100*66d857b0SGreg Ungerer	movel	sp@(8), d1	/* d1 = divisor */
101*66d857b0SGreg Ungerer#if !(defined(__mcf5200__) || defined(__mcoldfire__))
102*66d857b0SGreg Ungerer	movel	d1, sp@-
103*66d857b0SGreg Ungerer	movel	d0, sp@-
104*66d857b0SGreg Ungerer	jbsr	SYM (__mulsi3)	/* d0 = (a/b)*b */
105*66d857b0SGreg Ungerer	addql	IMM (8), sp
106*66d857b0SGreg Ungerer#else
107*66d857b0SGreg Ungerer	mulsl	d1,d0
108*66d857b0SGreg Ungerer#endif
109*66d857b0SGreg Ungerer	movel	sp@(4), d1	/* d1 = dividend */
110*66d857b0SGreg Ungerer	subl	d0, d1		/* d1 = a - (a/b)*b */
111*66d857b0SGreg Ungerer	movel	d1, d0
112*66d857b0SGreg Ungerer	rts
113*66d857b0SGreg Ungerer
114