1 /* SPDX-License-Identifier: GPL-2.0-or-later W !! 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 #include <asm/asmmacro.h> !! 3 4 #include <asm/core.h> !! 4 This file is part of GNU CC. 5 !! 5 6 ENTRY(__modsi3) !! 6 GNU CC is free software; you can redistribute it and/or modify it 7 !! 7 under the terms of the GNU General Public License as published by the 8 abi_entry_default !! 8 Free Software Foundation; either version 2, or (at your option) any 9 #if XCHAL_HAVE_DIV32 !! 9 later version. 10 rems a2, a2, a3 !! 10 >> 11 In addition to the permissions in the GNU General Public License, the >> 12 Free Software Foundation gives you unlimited permission to link the >> 13 compiled version of this file with other programs, and to distribute >> 14 those programs without any restriction coming from the use of this >> 15 file. (The General Public License restrictions do apply in other >> 16 respects; for example, they cover modification of the file, and >> 17 distribution when not linked into another program.) >> 18 >> 19 This file is distributed in the hope that it will be useful, but >> 20 WITHOUT ANY WARRANTY; without even the implied warranty of >> 21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >> 22 General Public License for more details. */ >> 23 >> 24 /* As a special exception, if you link this library with files >> 25 compiled with GCC to produce an executable, this does not cause >> 26 the resulting executable to be covered by the GNU General Public License. >> 27 This exception does not however invalidate any other reasons why >> 28 the executable file might be covered by the GNU General Public License. */ >> 29 >> 30 /* Use this one for any 680x0; assumes no floating point hardware. >> 31 The trailing " '" appearing on some lines is for ANSI preprocessors. Yuk. >> 32 Some of this code comes from MINIX, via the folks at ericsson. >> 33 D. V. Henkel-Wallace (gumby@cygnus.com) Fete Bastille, 1992 >> 34 */ >> 35 >> 36 #include <linux/export.h> >> 37 >> 38 /* These are predefined by new versions of GNU cpp. */ >> 39 >> 40 #ifndef __USER_LABEL_PREFIX__ >> 41 #define __USER_LABEL_PREFIX__ _ >> 42 #endif >> 43 >> 44 #ifndef __REGISTER_PREFIX__ >> 45 #define __REGISTER_PREFIX__ >> 46 #endif >> 47 >> 48 #ifndef __IMMEDIATE_PREFIX__ >> 49 #define __IMMEDIATE_PREFIX__ # >> 50 #endif >> 51 >> 52 /* ANSI concatenation macros. */ >> 53 >> 54 #define CONCAT1(a, b) CONCAT2(a, b) >> 55 #define CONCAT2(a, b) a ## b >> 56 >> 57 /* Use the right prefix for global labels. */ >> 58 >> 59 #define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x) >> 60 >> 61 /* Use the right prefix for registers. */ >> 62 >> 63 #define REG(x) CONCAT1 (__REGISTER_PREFIX__, x) >> 64 >> 65 /* Use the right prefix for immediate values. */ >> 66 >> 67 #define IMM(x) CONCAT1 (__IMMEDIATE_PREFIX__, x) >> 68 >> 69 #define d0 REG (d0) >> 70 #define d1 REG (d1) >> 71 #define d2 REG (d2) >> 72 #define d3 REG (d3) >> 73 #define d4 REG (d4) >> 74 #define d5 REG (d5) >> 75 #define d6 REG (d6) >> 76 #define d7 REG (d7) >> 77 #define a0 REG (a0) >> 78 #define a1 REG (a1) >> 79 #define a2 REG (a2) >> 80 #define a3 REG (a3) >> 81 #define a4 REG (a4) >> 82 #define a5 REG (a5) >> 83 #define a6 REG (a6) >> 84 #define fp REG (fp) >> 85 #define sp REG (sp) >> 86 >> 87 .text >> 88 .proc >> 89 .globl SYM (__modsi3) >> 90 SYM (__modsi3): >> 91 movel sp@(8), d1 /* d1 = divisor */ >> 92 movel sp@(4), d0 /* d0 = dividend */ >> 93 movel d1, sp@- >> 94 movel d0, sp@- >> 95 jbsr SYM (__divsi3) >> 96 addql IMM (8), sp >> 97 movel sp@(8), d1 /* d1 = divisor */ >> 98 #if !(defined(__mcf5200__) || defined(__mcoldfire__)) >> 99 movel d1, sp@- >> 100 movel d0, sp@- >> 101 jbsr SYM (__mulsi3) /* d0 = (a/b)*b */ >> 102 addql IMM (8), sp 11 #else 103 #else 12 mov a7, a2 /* save origin !! 104 mulsl d1,d0 13 do_abs a2, a2, a4 /* udividend = !! 105 #endif 14 do_abs a3, a3, a4 /* udivisor = !! 106 movel sp@(4), d1 /* d1 = dividend */ 15 bltui a3, 2, .Lle_one /* check if ud !! 107 subl d0, d1 /* d1 = a - (a/b)*b */ 16 do_nsau a5, a2, a6, a8 /* udividend_s !! 108 movel d1, d0 17 do_nsau a4, a3, a6, a8 /* udivisor_sh !! 109 rts 18 bgeu a5, a4, .Lspecial !! 110 19 !! 111 EXPORT_SYMBOL(__modsi3) 20 sub a4, a4, a5 /* count = udi << 21 ssl a4 << 22 sll a3, a3 /* udivisor << << 23 << 24 /* test-subtract-and-shift loop */ << 25 #if XCHAL_HAVE_LOOPS << 26 loopnez a4, .Lloopend << 27 #endif /* XCHAL_HAVE_LOOPS */ << 28 .Lloop: << 29 bltu a2, a3, .Lzerobit << 30 sub a2, a2, a3 << 31 .Lzerobit: << 32 srli a3, a3, 1 << 33 #if !XCHAL_HAVE_LOOPS << 34 addi a4, a4, -1 << 35 bnez a4, .Lloop << 36 #endif /* !XCHAL_HAVE_LOOPS */ << 37 .Lloopend: << 38 << 39 .Lspecial: << 40 bltu a2, a3, .Lreturn << 41 sub a2, a2, a3 /* subtract ag << 42 .Lreturn: << 43 bgez a7, .Lpositive << 44 neg a2, a2 /* if (dividen << 45 .Lpositive: << 46 abi_ret_default << 47 << 48 .Lle_one: << 49 bnez a3, .Lreturn0 << 50 << 51 /* Divide by zero: Use an illegal inst << 52 The subsequent "DIV0" string can be << 53 handler to identify the real cause << 54 ill << 55 .ascii "DIV0" << 56 << 57 .Lreturn0: << 58 movi a2, 0 << 59 #endif /* XCHAL_HAVE_DIV32 */ << 60 abi_ret_default << 61 << 62 ENDPROC(__modsi3) << 63 EXPORT_SYMBOL(__modsi3) << 64 << 65 #if !XCHAL_HAVE_NSA << 66 .section .rodata << 67 .align 4 << 68 .global __nsau_data << 69 .type __nsau_data, @object << 70 __nsau_data: << 71 .byte 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, << 72 .byte 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, << 73 .byte 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, << 74 .byte 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, << 75 .byte 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, << 76 .byte 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, << 77 .byte 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, << 78 .byte 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, << 79 .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, << 80 .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, << 81 .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, << 82 .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, << 83 .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, << 84 .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, << 85 .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, << 86 .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, << 87 .size __nsau_data, . - __nsau_data << 88 #endif /* !XCHAL_HAVE_NSA */ <<
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.