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