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> << 4 #include <asm/core.h> << 5 << 6 .macro do_addx2 dst, as, at, tmp << 7 #if XCHAL_HAVE_ADDX << 8 addx2 \dst, \as, \at << 9 #else << 10 slli \tmp, \as, 1 << 11 add \dst, \tmp, \at << 12 #endif << 13 .endm << 14 3 15 .macro do_addx4 dst, as, at, tmp !! 4 This file is part of GNU CC. 16 #if XCHAL_HAVE_ADDX !! 5 17 addx4 \dst, \as, \at !! 6 GNU CC is free software; you can redistribute it and/or modify it 18 #else !! 7 under the terms of the GNU General Public License as published by the 19 slli \tmp, \as, 2 !! 8 Free Software Foundation; either version 2, or (at your option) any 20 add \dst, \tmp, \at !! 9 later version. >> 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 #include <linux/export.h> >> 36 /* These are predefined by new versions of GNU cpp. */ >> 37 >> 38 #ifndef __USER_LABEL_PREFIX__ >> 39 #define __USER_LABEL_PREFIX__ _ 21 #endif 40 #endif 22 .endm << 23 41 24 .macro do_addx8 dst, as, at, tmp !! 42 #ifndef __REGISTER_PREFIX__ 25 #if XCHAL_HAVE_ADDX !! 43 #define __REGISTER_PREFIX__ 26 addx8 \dst, \as, \at << 27 #else << 28 slli \tmp, \as, 3 << 29 add \dst, \tmp, \at << 30 #endif 44 #endif 31 .endm << 32 45 33 ENTRY(__mulsi3) !! 46 #ifndef __IMMEDIATE_PREFIX__ >> 47 #define __IMMEDIATE_PREFIX__ # >> 48 #endif 34 49 35 abi_entry_default !! 50 /* ANSI concatenation macros. */ 36 51 37 #if XCHAL_HAVE_MUL32 !! 52 #define CONCAT1(a, b) CONCAT2(a, b) 38 mull a2, a2, a3 !! 53 #define CONCAT2(a, b) a ## b 39 54 40 #elif XCHAL_HAVE_MUL16 !! 55 /* Use the right prefix for global labels. */ 41 or a4, a2, a3 << 42 srai a4, a4, 16 << 43 bnez a4, .LMUL16 << 44 mul16u a2, a2, a3 << 45 abi_ret_default << 46 .LMUL16: << 47 srai a4, a2, 16 << 48 srai a5, a3, 16 << 49 mul16u a7, a4, a3 << 50 mul16u a6, a5, a2 << 51 mul16u a4, a2, a3 << 52 add a7, a7, a6 << 53 slli a7, a7, 16 << 54 add a2, a7, a4 << 55 << 56 #elif XCHAL_HAVE_MAC16 << 57 mul.aa.hl a2, a3 << 58 mula.aa.lh a2, a3 << 59 rsr a5, ACCLO << 60 umul.aa.ll a2, a3 << 61 rsr a4, ACCLO << 62 slli a5, a5, 16 << 63 add a2, a4, a5 << 64 << 65 #else /* !MUL32 && !MUL16 && !MAC16 */ << 66 << 67 /* Multiply one bit at a time, but unr << 68 exploit the addx instructions and a << 69 Peel the first iteration to save a << 70 << 71 /* Avoid negative numbers. */ << 72 xor a5, a2, a3 /* Top bit is << 73 do_abs a3, a3, a6 << 74 do_abs a2, a2, a6 << 75 << 76 /* Swap so the second argument is smal << 77 sub a7, a2, a3 << 78 mov a4, a3 << 79 movgez a4, a2, a7 /* a4 = max (a << 80 movltz a3, a2, a7 /* a3 = min (a << 81 << 82 movi a2, 0 << 83 extui a6, a3, 0, 1 << 84 movnez a2, a4, a6 << 85 << 86 do_addx2 a7, a4, a2, a7 << 87 extui a6, a3, 1, 1 << 88 movnez a2, a7, a6 << 89 << 90 do_addx4 a7, a4, a2, a7 << 91 extui a6, a3, 2, 1 << 92 movnez a2, a7, a6 << 93 << 94 do_addx8 a7, a4, a2, a7 << 95 extui a6, a3, 3, 1 << 96 movnez a2, a7, a6 << 97 << 98 bgeui a3, 16, .Lmult_main_loop << 99 neg a3, a2 << 100 movltz a2, a3, a5 << 101 abi_ret_default << 102 << 103 .align 4 << 104 .Lmult_main_loop: << 105 srli a3, a3, 4 << 106 slli a4, a4, 4 << 107 << 108 add a7, a4, a2 << 109 extui a6, a3, 0, 1 << 110 movnez a2, a7, a6 << 111 << 112 do_addx2 a7, a4, a2, a7 << 113 extui a6, a3, 1, 1 << 114 movnez a2, a7, a6 << 115 << 116 do_addx4 a7, a4, a2, a7 << 117 extui a6, a3, 2, 1 << 118 movnez a2, a7, a6 << 119 << 120 do_addx8 a7, a4, a2, a7 << 121 extui a6, a3, 3, 1 << 122 movnez a2, a7, a6 << 123 << 124 bgeui a3, 16, .Lmult_main_loop << 125 << 126 neg a3, a2 << 127 movltz a2, a3, a5 << 128 56 129 #endif /* !MUL32 && !MUL16 && !MAC16 */ !! 57 #define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x) 130 58 131 abi_ret_default !! 59 /* Use the right prefix for registers. */ >> 60 >> 61 #define REG(x) CONCAT1 (__REGISTER_PREFIX__, x) >> 62 >> 63 /* Use the right prefix for immediate values. */ >> 64 >> 65 #define IMM(x) CONCAT1 (__IMMEDIATE_PREFIX__, x) >> 66 >> 67 #define d0 REG (d0) >> 68 #define d1 REG (d1) >> 69 #define d2 REG (d2) >> 70 #define d3 REG (d3) >> 71 #define d4 REG (d4) >> 72 #define d5 REG (d5) >> 73 #define d6 REG (d6) >> 74 #define d7 REG (d7) >> 75 #define a0 REG (a0) >> 76 #define a1 REG (a1) >> 77 #define a2 REG (a2) >> 78 #define a3 REG (a3) >> 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) >> 84 >> 85 .text >> 86 .proc >> 87 .globl SYM (__mulsi3) >> 88 SYM (__mulsi3): >> 89 movew sp@(4), d0 /* x0 -> d0 */ >> 90 muluw sp@(10), d0 /* x0*y1 */ >> 91 movew sp@(6), d1 /* x1 -> d1 */ >> 92 muluw sp@(8), d1 /* x1*y0 */ >> 93 #if !(defined(__mcf5200__) || defined(__mcoldfire__)) >> 94 addw d1, d0 >> 95 #else >> 96 addl d1, d0 >> 97 #endif >> 98 swap d0 >> 99 clrw d0 >> 100 movew sp@(6), d1 /* x1 -> d1 */ >> 101 muluw sp@(10), d1 /* x1*y1 */ >> 102 addl d1, d0 132 103 133 ENDPROC(__mulsi3) !! 104 rts 134 EXPORT_SYMBOL(__mulsi3) !! 105 EXPORT_SYMBOL(__mulsi3)
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.