1 /* SPDX-License-Identifier: GPL-2.0 */ !! 1 /* libgcc1 routines for 68000 w/o floating-point hardware. 2 #include <linux/linkage.h> !! 2 Copyright (C) 1994, 1996, 1997, 1998 Free Software Foundation, Inc. 3 3 4 /* !! 4 This file is part of GNU CC. 5 * Unsigned modulo operation for 32 bit intege << 6 * Input : op1 in Reg r5 << 7 * op2 in Reg r6 << 8 * Output: op1 mod op2 in Reg r3 << 9 */ << 10 5 11 .text !! 6 GNU CC is free software; you can redistribute it and/or modify it 12 .globl __umodsi3 !! 7 under the terms of the GNU General Public License as published by the 13 .type __umodsi3, @function !! 8 Free Software Foundation; either version 2, or (at your option) any 14 .ent __umodsi3 !! 9 later version. 15 !! 10 16 __umodsi3: !! 11 In addition to the permissions in the GNU General Public License, the 17 .frame r1, 0, r15 !! 12 Free Software Foundation gives you unlimited permission to link the 18 !! 13 compiled version of this file with other programs, and to distribute 19 addik r1, r1, -12 !! 14 those programs without any restriction coming from the use of this 20 swi r29, r1, 0 !! 15 file. (The General Public License restrictions do apply in other 21 swi r30, r1, 4 !! 16 respects; for example, they cover modification of the file, and 22 swi r31, r1, 8 !! 17 distribution when not linked into another program.) 23 !! 18 24 beqi r6, div_by_zero /* div_by_zero !! 19 This file is distributed in the hope that it will be useful, but 25 beqid r5, result_is_zero /* result i !! 20 WITHOUT ANY WARRANTY; without even the implied warranty of 26 addik r3, r0, 0 /* clear div */ !! 21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 27 addik r30, r0, 0 /* clear mod */ !! 22 General Public License for more details. */ 28 addik r29, r0, 32 /* initialize the !! 23 29 !! 24 /* As a special exception, if you link this library with files 30 /* check if r6 and r5 are equal /* if yes, ret !! 25 compiled with GCC to produce an executable, this does not cause 31 rsub r18, r5, r6 !! 26 the resulting executable to be covered by the GNU General Public License. 32 beqi r18, return_here !! 27 This exception does not however invalidate any other reasons why 33 !! 28 the executable file might be covered by the GNU General Public License. */ 34 /* check if (uns)r6 is greater than (uns)r5. i !! 29 35 xor r18, r5, r6 !! 30 /* Use this one for any 680x0; assumes no floating point hardware. 36 bgeid r18, 16 !! 31 The trailing " '" appearing on some lines is for ANSI preprocessors. Yuk. 37 addik r3, r5, 0 !! 32 Some of this code comes from MINIX, via the folks at ericsson. 38 blti r6, return_here !! 33 D. V. Henkel-Wallace (gumby@cygnus.com) Fete Bastille, 1992 39 bri $lcheckr6 !! 34 */ 40 rsub r18, r5, r6 /* microblazecmp * !! 35 #include <linux/export.h> 41 bgti r18, return_here !! 36 /* These are predefined by new versions of GNU cpp. */ 42 !! 37 43 /* if r6 [bit 31] is set, then return result a !! 38 #ifndef __USER_LABEL_PREFIX__ 44 $lcheckr6: !! 39 #define __USER_LABEL_PREFIX__ _ 45 bgtid r6, div0 !! 40 #endif 46 addik r3, r0, 0 !! 41 47 addik r18, r0, 0x7fffffff !! 42 #ifndef __REGISTER_PREFIX__ 48 and r5, r5, r18 !! 43 #define __REGISTER_PREFIX__ 49 and r6, r6, r18 !! 44 #endif 50 brid return_here !! 45 51 rsub r3, r6, r5 !! 46 #ifndef __IMMEDIATE_PREFIX__ 52 /* first part: try to find the first '1' in th !! 47 #define __IMMEDIATE_PREFIX__ # 53 div0: !! 48 #endif 54 blti r5, div2 !! 49 55 div1: !! 50 /* ANSI concatenation macros. */ 56 add r5, r5, r5 /* left shift logic !! 51 57 bgeid r5, div1 !! 52 #define CONCAT1(a, b) CONCAT2(a, b) 58 addik r29, r29, -1 !! 53 #define CONCAT2(a, b) a ## b 59 div2: !! 54 60 /* left shift logical r5 get the '1' i !! 55 /* Use the right prefix for global labels. */ 61 add r5, r5, r5 !! 56 62 addc r3, r3, r3 /* move that bit in !! 57 #define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x) 63 rsub r31, r6, r3 /* try to subtract !! 58 64 blti r31, mod_too_small !! 59 /* Use the right prefix for registers. */ 65 /* move the r31 to mod since the resul !! 60 66 or r3, r0, r31 !! 61 #define REG(x) CONCAT1 (__REGISTER_PREFIX__, x) 67 addik r30, r30, 1 !! 62 68 mod_too_small: !! 63 /* Use the right prefix for immediate values. */ 69 addik r29, r29, -1 !! 64 70 beqi r29, loop_end !! 65 #define IMM(x) CONCAT1 (__IMMEDIATE_PREFIX__, x) 71 add r30, r30, r30 /* shift in the !! 66 72 bri div2 /* div2 */ !! 67 #define d0 REG (d0) 73 loop_end: !! 68 #define d1 REG (d1) 74 bri return_here !! 69 #define d2 REG (d2) 75 div_by_zero: !! 70 #define d3 REG (d3) 76 result_is_zero: !! 71 #define d4 REG (d4) 77 or r3, r0, r0 /* set result to 0 !! 72 #define d5 REG (d5) 78 return_here: !! 73 #define d6 REG (d6) 79 /* restore values of csrs and that of r3 and t !! 74 #define d7 REG (d7) 80 lwi r29, r1, 0 !! 75 #define a0 REG (a0) 81 lwi r30, r1, 4 !! 76 #define a1 REG (a1) 82 lwi r31, r1, 8 !! 77 #define a2 REG (a2) 83 rtsd r15, 8 !! 78 #define a3 REG (a3) 84 addik r1, r1, 12 !! 79 #define a4 REG (a4) >> 80 #define a5 REG (a5) >> 81 #define a6 REG (a6) >> 82 #define fp REG (fp) >> 83 #define sp REG (sp) 85 84 86 .size __umodsi3, . - __umodsi3 !! 85 .text 87 .end __umodsi3 !! 86 .proc >> 87 .globl SYM (__umodsi3) >> 88 SYM (__umodsi3): >> 89 movel sp@(8), d1 /* d1 = divisor */ >> 90 movel sp@(4), d0 /* d0 = dividend */ >> 91 movel d1, sp@- >> 92 movel d0, sp@- >> 93 jbsr SYM (__udivsi3) >> 94 addql IMM (8), sp >> 95 movel sp@(8), d1 /* d1 = divisor */ >> 96 #if !(defined(__mcf5200__) || defined(__mcoldfire__)) >> 97 movel d1, sp@- >> 98 movel d0, sp@- >> 99 jbsr SYM (__mulsi3) /* d0 = (a/b)*b */ >> 100 addql IMM (8), sp >> 101 #else >> 102 mulsl d1,d0 >> 103 #endif >> 104 movel sp@(4), d1 /* d1 = dividend */ >> 105 subl d0, d1 /* d1 = a - (a/b)*b */ >> 106 movel d1, d0 >> 107 rts >> 108 EXPORT_SYMBOL(__umodsi3)
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.