1 /* SPDX-License-Identifier: GPL-2.0-only */ !! 1 /* libgcc1 routines for 68000 w/o floating-point hardware. 2 /* !! 2 Copyright (C) 1994, 1996, 1997, 1998 Free Software Foundation, Inc. 3 * Copyright (c) 2021, The Linux Foundation. A !! 3 4 */ !! 4 This file is part of GNU CC. 5 !! 5 6 #include <linux/linkage.h> !! 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 SYM_FUNC_START(__hexagon_divsi3) !! 8 Free Software Foundation; either version 2, or (at your option) any 9 { !! 9 later version. 10 p0 = cmp.gt(r0,#-1) !! 10 11 p1 = cmp.gt(r1,#-1) !! 11 In addition to the permissions in the GNU General Public License, the 12 r3:2 = vabsw(r1:0) !! 12 Free Software Foundation gives you unlimited permission to link the 13 } !! 13 compiled version of this file with other programs, and to distribute 14 { !! 14 those programs without any restriction coming from the use of this 15 p3 = xor(p0,p1) !! 15 file. (The General Public License restrictions do apply in other 16 r4 = sub(r2,r3) !! 16 respects; for example, they cover modification of the file, and 17 r6 = cl0(r2) !! 17 distribution when not linked into another program.) 18 p0 = cmp.gtu(r3,r2) !! 18 19 } !! 19 This file is distributed in the hope that it will be useful, but 20 { !! 20 WITHOUT ANY WARRANTY; without even the implied warranty of 21 r0 = mux(p3,#-1,#1) !! 21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 22 r7 = cl0(r3) !! 22 General Public License for more details. */ 23 p1 = cmp.gtu(r3,r4) !! 23 24 } !! 24 /* As a special exception, if you link this library with files 25 { !! 25 compiled with GCC to produce an executable, this does not cause 26 r0 = mux(p0,#0,r0) !! 26 the resulting executable to be covered by the GNU General Public License. 27 p0 = or(p0,p1) !! 27 This exception does not however invalidate any other reasons why 28 if (p0.new) jumpr:nt r31 !! 28 the executable file might be covered by the GNU General Public License. */ 29 r6 = sub(r7,r6) !! 29 30 } !! 30 /* Use this one for any 680x0; assumes no floating point hardware. 31 { !! 31 The trailing " '" appearing on some lines is for ANSI preprocessors. Yuk. 32 r7 = r6 !! 32 Some of this code comes from MINIX, via the folks at ericsson. 33 r5:4 = combine(#1,r3) !! 33 D. V. Henkel-Wallace (gumby@cygnus.com) Fete Bastille, 1992 34 r6 = add(#1,lsr(r6,#1)) !! 34 */ 35 p0 = cmp.gtu(r6,#4) !! 35 36 } !! 36 #include <linux/export.h> 37 { !! 37 38 r5:4 = vaslw(r5:4,r7) !! 38 /* These are predefined by new versions of GNU cpp. */ 39 if (!p0) r6 = #3 !! 39 40 } !! 40 #ifndef __USER_LABEL_PREFIX__ 41 { !! 41 #define __USER_LABEL_PREFIX__ _ 42 loop0(1f,r6) !! 42 #endif 43 r7:6 = vlsrw(r5:4,#1) !! 43 44 r1:0 = #0 !! 44 #ifndef __REGISTER_PREFIX__ 45 } !! 45 #define __REGISTER_PREFIX__ 46 .falign !! 46 #endif 47 1: !! 47 48 { !! 48 #ifndef __IMMEDIATE_PREFIX__ 49 r5:4 = vlsrw(r5:4,#2) !! 49 #define __IMMEDIATE_PREFIX__ # 50 if (!p0.new) r0 = add(r0,r5) !! 50 #endif 51 if (!p0.new) r2 = sub(r2,r4) !! 51 52 p0 = cmp.gtu(r4,r2) !! 52 /* ANSI concatenation macros. */ 53 } !! 53 54 { !! 54 #define CONCAT1(a, b) CONCAT2(a, b) 55 r7:6 = vlsrw(r7:6,#2) !! 55 #define CONCAT2(a, b) a ## b 56 if (!p0.new) r0 = add(r0,r7) !! 56 57 if (!p0.new) r2 = sub(r2,r6) !! 57 /* Use the right prefix for global labels. */ 58 p0 = cmp.gtu(r6,r2) !! 58 59 }:endloop0 !! 59 #define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x) 60 { !! 60 61 if (!p0) r0 = add(r0,r7) !! 61 /* Use the right prefix for registers. */ 62 } !! 62 63 { !! 63 #define REG(x) CONCAT1 (__REGISTER_PREFIX__, x) 64 if (p3) r0 = sub(r1,r0) !! 64 65 jumpr r31 !! 65 /* Use the right prefix for immediate values. */ 66 } !! 66 67 SYM_FUNC_END(__hexagon_divsi3) !! 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 (__divsi3) >> 90 SYM (__divsi3): >> 91 movel d2, sp@- >> 92 >> 93 moveq IMM (1), d2 /* sign of result stored in d2 (=1 or =-1) */ >> 94 movel sp@(12), d1 /* d1 = divisor */ >> 95 jpl L1 >> 96 negl d1 >> 97 #if !(defined(__mcf5200__) || defined(__mcoldfire__)) >> 98 negb d2 /* change sign because divisor <0 */ >> 99 #else >> 100 negl d2 /* change sign because divisor <0 */ >> 101 #endif >> 102 L1: movel sp@(8), d0 /* d0 = dividend */ >> 103 jpl L2 >> 104 negl d0 >> 105 #if !(defined(__mcf5200__) || defined(__mcoldfire__)) >> 106 negb d2 >> 107 #else >> 108 negl d2 >> 109 #endif >> 110 >> 111 L2: movel d1, sp@- >> 112 movel d0, sp@- >> 113 jbsr SYM (__udivsi3) /* divide abs(dividend) by abs(divisor) */ >> 114 addql IMM (8), sp >> 115 >> 116 tstb d2 >> 117 jpl L3 >> 118 negl d0 >> 119 >> 120 L3: movel sp@+, d2 >> 121 rts >> 122 >> 123 EXPORT_SYMBOL(__divsi3)
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.