1 /* SPDX-License-Identifier: GPL-2.0-or-later * << 2 /* Copyright (C) 1989, 1992, 1993, 1994, 1995 1 /* Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. 3 2 4 This file is part of GNU CC. 3 This file is part of GNU CC. 5 4 6 */ !! 5 GNU CC is free software; you can redistribute it and/or modify >> 6 it under the terms of the GNU General Public License as published by >> 7 the Free Software Foundation; either version 2, or (at your option) >> 8 any later version. >> 9 >> 10 GNU CC is distributed in the hope that it will be useful, >> 11 but WITHOUT ANY WARRANTY; without even the implied warranty of >> 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> 13 GNU General Public License for more details. >> 14 >> 15 You should have received a copy of the GNU General Public License >> 16 along with GNU CC; see the file COPYING. If not, write to >> 17 the Free Software Foundation, 59 Temple Place - Suite 330, >> 18 Boston, MA 02111-1307, USA. */ 7 19 8 #include <linux/export.h> << 9 .text 20 .text 10 .align 4 21 .align 4 11 .globl __divdi3 22 .globl __divdi3 12 __divdi3: 23 __divdi3: 13 save %sp,-104,%sp 24 save %sp,-104,%sp 14 cmp %i0,0 25 cmp %i0,0 15 bge .LL40 26 bge .LL40 16 mov 0,%l4 27 mov 0,%l4 17 mov -1,%l4 28 mov -1,%l4 18 sub %g0,%i1,%o0 29 sub %g0,%i1,%o0 19 mov %o0,%o5 30 mov %o0,%o5 20 subcc %g0,%o0,%g0 31 subcc %g0,%o0,%g0 21 sub %g0,%i0,%o0 32 sub %g0,%i0,%o0 22 subx %o0,0,%o4 33 subx %o0,0,%o4 23 mov %o4,%i0 34 mov %o4,%i0 24 mov %o5,%i1 35 mov %o5,%i1 25 .LL40: 36 .LL40: 26 cmp %i2,0 37 cmp %i2,0 27 bge .LL84 38 bge .LL84 28 mov %i3,%o4 39 mov %i3,%o4 29 xnor %g0,%l4,%l4 40 xnor %g0,%l4,%l4 30 sub %g0,%i3,%o0 41 sub %g0,%i3,%o0 31 mov %o0,%o3 42 mov %o0,%o3 32 subcc %g0,%o0,%g0 43 subcc %g0,%o0,%g0 33 sub %g0,%i2,%o0 44 sub %g0,%i2,%o0 34 subx %o0,0,%o2 45 subx %o0,0,%o2 35 mov %o2,%i2 46 mov %o2,%i2 36 mov %o3,%i3 47 mov %o3,%i3 37 mov %i3,%o4 48 mov %i3,%o4 38 .LL84: 49 .LL84: 39 cmp %i2,0 50 cmp %i2,0 40 bne .LL45 51 bne .LL45 41 mov %i1,%i3 52 mov %i1,%i3 42 cmp %o4,%i0 53 cmp %o4,%i0 43 bleu .LL46 54 bleu .LL46 44 mov %i3,%o1 55 mov %i3,%o1 45 mov 32,%g1 56 mov 32,%g1 46 subcc %i0,%o4,%g0 57 subcc %i0,%o4,%g0 47 1: bcs 5f 58 1: bcs 5f 48 addxcc %o1,%o1,%o1 ! shift n1n0 a 59 addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb 49 sub %i0,%o4,%i0 ! this kills m 60 sub %i0,%o4,%i0 ! this kills msb of n 50 addx %i0,%i0,%i0 ! so this cann 61 addx %i0,%i0,%i0 ! so this cannot give carry 51 subcc %g1,1,%g1 62 subcc %g1,1,%g1 52 2: bne 1b 63 2: bne 1b 53 subcc %i0,%o4,%g0 64 subcc %i0,%o4,%g0 54 bcs 3f 65 bcs 3f 55 addxcc %o1,%o1,%o1 ! shift n1n0 a 66 addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb 56 b 3f 67 b 3f 57 sub %i0,%o4,%i0 ! this kills m 68 sub %i0,%o4,%i0 ! this kills msb of n 58 4: sub %i0,%o4,%i0 69 4: sub %i0,%o4,%i0 59 5: addxcc %i0,%i0,%i0 70 5: addxcc %i0,%i0,%i0 60 bcc 2b 71 bcc 2b 61 subcc %g1,1,%g1 72 subcc %g1,1,%g1 62 ! Got carry from n. Subtract next step to can 73 ! Got carry from n. Subtract next step to cancel this carry. 63 bne 4b 74 bne 4b 64 addcc %o1,%o1,%o1 ! shift n1n0 a 75 addcc %o1,%o1,%o1 ! shift n1n0 and a 0-bit in lsb 65 sub %i0,%o4,%i0 76 sub %i0,%o4,%i0 66 3: xnor %o1,0,%o1 77 3: xnor %o1,0,%o1 67 b .LL50 78 b .LL50 68 mov 0,%o2 79 mov 0,%o2 69 .LL46: 80 .LL46: 70 cmp %o4,0 81 cmp %o4,0 71 bne .LL85 82 bne .LL85 72 mov %i0,%o2 83 mov %i0,%o2 73 mov 1,%o0 84 mov 1,%o0 74 mov 0,%o1 85 mov 0,%o1 75 wr %g0, 0, %y 86 wr %g0, 0, %y 76 udiv %o0, %o1, %o0 87 udiv %o0, %o1, %o0 77 mov %o0,%o4 88 mov %o0,%o4 78 mov %i0,%o2 89 mov %i0,%o2 79 .LL85: 90 .LL85: 80 mov 0,%g3 91 mov 0,%g3 81 mov 32,%g1 92 mov 32,%g1 82 subcc %g3,%o4,%g0 93 subcc %g3,%o4,%g0 83 1: bcs 5f 94 1: bcs 5f 84 addxcc %o2,%o2,%o2 ! shift n1n0 a 95 addxcc %o2,%o2,%o2 ! shift n1n0 and a q-bit in lsb 85 sub %g3,%o4,%g3 ! this kills m 96 sub %g3,%o4,%g3 ! this kills msb of n 86 addx %g3,%g3,%g3 ! so this cann 97 addx %g3,%g3,%g3 ! so this cannot give carry 87 subcc %g1,1,%g1 98 subcc %g1,1,%g1 88 2: bne 1b 99 2: bne 1b 89 subcc %g3,%o4,%g0 100 subcc %g3,%o4,%g0 90 bcs 3f 101 bcs 3f 91 addxcc %o2,%o2,%o2 ! shift n1n0 a 102 addxcc %o2,%o2,%o2 ! shift n1n0 and a q-bit in lsb 92 b 3f 103 b 3f 93 sub %g3,%o4,%g3 ! this kills m 104 sub %g3,%o4,%g3 ! this kills msb of n 94 4: sub %g3,%o4,%g3 105 4: sub %g3,%o4,%g3 95 5: addxcc %g3,%g3,%g3 106 5: addxcc %g3,%g3,%g3 96 bcc 2b 107 bcc 2b 97 subcc %g1,1,%g1 108 subcc %g1,1,%g1 98 ! Got carry from n. Subtract next step to can 109 ! Got carry from n. Subtract next step to cancel this carry. 99 bne 4b 110 bne 4b 100 addcc %o2,%o2,%o2 ! shift n1n0 a 111 addcc %o2,%o2,%o2 ! shift n1n0 and a 0-bit in lsb 101 sub %g3,%o4,%g3 112 sub %g3,%o4,%g3 102 3: xnor %o2,0,%o2 113 3: xnor %o2,0,%o2 103 mov %g3,%i0 114 mov %g3,%i0 104 mov %i3,%o1 115 mov %i3,%o1 105 mov 32,%g1 116 mov 32,%g1 106 subcc %i0,%o4,%g0 117 subcc %i0,%o4,%g0 107 1: bcs 5f 118 1: bcs 5f 108 addxcc %o1,%o1,%o1 ! shift n1n0 a 119 addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb 109 sub %i0,%o4,%i0 ! this kills m 120 sub %i0,%o4,%i0 ! this kills msb of n 110 addx %i0,%i0,%i0 ! so this cann 121 addx %i0,%i0,%i0 ! so this cannot give carry 111 subcc %g1,1,%g1 122 subcc %g1,1,%g1 112 2: bne 1b 123 2: bne 1b 113 subcc %i0,%o4,%g0 124 subcc %i0,%o4,%g0 114 bcs 3f 125 bcs 3f 115 addxcc %o1,%o1,%o1 ! shift n1n0 a 126 addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb 116 b 3f 127 b 3f 117 sub %i0,%o4,%i0 ! this kills m 128 sub %i0,%o4,%i0 ! this kills msb of n 118 4: sub %i0,%o4,%i0 129 4: sub %i0,%o4,%i0 119 5: addxcc %i0,%i0,%i0 130 5: addxcc %i0,%i0,%i0 120 bcc 2b 131 bcc 2b 121 subcc %g1,1,%g1 132 subcc %g1,1,%g1 122 ! Got carry from n. Subtract next step to can 133 ! Got carry from n. Subtract next step to cancel this carry. 123 bne 4b 134 bne 4b 124 addcc %o1,%o1,%o1 ! shift n1n0 a 135 addcc %o1,%o1,%o1 ! shift n1n0 and a 0-bit in lsb 125 sub %i0,%o4,%i0 136 sub %i0,%o4,%i0 126 3: xnor %o1,0,%o1 137 3: xnor %o1,0,%o1 127 b .LL86 138 b .LL86 128 mov %o1,%l1 139 mov %o1,%l1 129 .LL45: 140 .LL45: 130 cmp %i2,%i0 141 cmp %i2,%i0 131 bleu .LL51 142 bleu .LL51 132 sethi %hi(65535),%o0 143 sethi %hi(65535),%o0 133 b .LL78 144 b .LL78 134 mov 0,%o1 145 mov 0,%o1 135 .LL51: 146 .LL51: 136 or %o0,%lo(65535),%o0 147 or %o0,%lo(65535),%o0 137 cmp %i2,%o0 148 cmp %i2,%o0 138 bgu .LL58 149 bgu .LL58 139 mov %i2,%o1 150 mov %i2,%o1 140 cmp %i2,256 151 cmp %i2,256 141 addx %g0,-1,%o0 152 addx %g0,-1,%o0 142 b .LL64 153 b .LL64 143 and %o0,8,%o2 154 and %o0,8,%o2 144 .LL58: 155 .LL58: 145 sethi %hi(16777215),%o0 156 sethi %hi(16777215),%o0 146 or %o0,%lo(16777215),%o0 157 or %o0,%lo(16777215),%o0 147 cmp %i2,%o0 158 cmp %i2,%o0 148 bgu .LL64 159 bgu .LL64 149 mov 24,%o2 160 mov 24,%o2 150 mov 16,%o2 161 mov 16,%o2 151 .LL64: 162 .LL64: 152 srl %o1,%o2,%o0 163 srl %o1,%o2,%o0 153 sethi %hi(__clz_tab),%o1 164 sethi %hi(__clz_tab),%o1 154 or %o1,%lo(__clz_tab),%o1 165 or %o1,%lo(__clz_tab),%o1 155 ldub [%o0+%o1],%o0 166 ldub [%o0+%o1],%o0 156 add %o0,%o2,%o0 167 add %o0,%o2,%o0 157 mov 32,%o1 168 mov 32,%o1 158 subcc %o1,%o0,%o3 169 subcc %o1,%o0,%o3 159 bne,a .LL72 170 bne,a .LL72 160 sub %o1,%o3,%o1 171 sub %o1,%o3,%o1 161 cmp %i0,%i2 172 cmp %i0,%i2 162 bgu .LL74 173 bgu .LL74 163 cmp %i3,%o4 174 cmp %i3,%o4 164 blu .LL78 175 blu .LL78 165 mov 0,%o1 176 mov 0,%o1 166 .LL74: 177 .LL74: 167 b .LL78 178 b .LL78 168 mov 1,%o1 179 mov 1,%o1 169 .LL72: 180 .LL72: 170 sll %i2,%o3,%o2 181 sll %i2,%o3,%o2 171 srl %o4,%o1,%o0 182 srl %o4,%o1,%o0 172 or %o2,%o0,%i2 183 or %o2,%o0,%i2 173 sll %o4,%o3,%o4 184 sll %o4,%o3,%o4 174 srl %i0,%o1,%o2 185 srl %i0,%o1,%o2 175 sll %i0,%o3,%o0 186 sll %i0,%o3,%o0 176 srl %i3,%o1,%o1 187 srl %i3,%o1,%o1 177 or %o0,%o1,%i0 188 or %o0,%o1,%i0 178 sll %i3,%o3,%i3 189 sll %i3,%o3,%i3 179 mov %i0,%o1 190 mov %i0,%o1 180 mov 32,%g1 191 mov 32,%g1 181 subcc %o2,%i2,%g0 192 subcc %o2,%i2,%g0 182 1: bcs 5f 193 1: bcs 5f 183 addxcc %o1,%o1,%o1 ! shift n1n0 a 194 addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb 184 sub %o2,%i2,%o2 ! this kills m 195 sub %o2,%i2,%o2 ! this kills msb of n 185 addx %o2,%o2,%o2 ! so this cann 196 addx %o2,%o2,%o2 ! so this cannot give carry 186 subcc %g1,1,%g1 197 subcc %g1,1,%g1 187 2: bne 1b 198 2: bne 1b 188 subcc %o2,%i2,%g0 199 subcc %o2,%i2,%g0 189 bcs 3f 200 bcs 3f 190 addxcc %o1,%o1,%o1 ! shift n1n0 a 201 addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb 191 b 3f 202 b 3f 192 sub %o2,%i2,%o2 ! this kills m 203 sub %o2,%i2,%o2 ! this kills msb of n 193 4: sub %o2,%i2,%o2 204 4: sub %o2,%i2,%o2 194 5: addxcc %o2,%o2,%o2 205 5: addxcc %o2,%o2,%o2 195 bcc 2b 206 bcc 2b 196 subcc %g1,1,%g1 207 subcc %g1,1,%g1 197 ! Got carry from n. Subtract next step to can 208 ! Got carry from n. Subtract next step to cancel this carry. 198 bne 4b 209 bne 4b 199 addcc %o1,%o1,%o1 ! shift n1n0 a 210 addcc %o1,%o1,%o1 ! shift n1n0 and a 0-bit in lsb 200 sub %o2,%i2,%o2 211 sub %o2,%i2,%o2 201 3: xnor %o1,0,%o1 212 3: xnor %o1,0,%o1 202 mov %o2,%i0 213 mov %o2,%i0 203 wr %g0,%o1,%y ! SPARC has 0- 214 wr %g0,%o1,%y ! SPARC has 0-3 delay insn after a wr 204 sra %o4,31,%g2 ! Do not move 215 sra %o4,31,%g2 ! Do not move this insn 205 and %o1,%g2,%g2 ! Do not move 216 and %o1,%g2,%g2 ! Do not move this insn 206 andcc %g0,0,%g1 ! Do not move 217 andcc %g0,0,%g1 ! Do not move this insn 207 mulscc %g1,%o4,%g1 218 mulscc %g1,%o4,%g1 208 mulscc %g1,%o4,%g1 219 mulscc %g1,%o4,%g1 209 mulscc %g1,%o4,%g1 220 mulscc %g1,%o4,%g1 210 mulscc %g1,%o4,%g1 221 mulscc %g1,%o4,%g1 211 mulscc %g1,%o4,%g1 222 mulscc %g1,%o4,%g1 212 mulscc %g1,%o4,%g1 223 mulscc %g1,%o4,%g1 213 mulscc %g1,%o4,%g1 224 mulscc %g1,%o4,%g1 214 mulscc %g1,%o4,%g1 225 mulscc %g1,%o4,%g1 215 mulscc %g1,%o4,%g1 226 mulscc %g1,%o4,%g1 216 mulscc %g1,%o4,%g1 227 mulscc %g1,%o4,%g1 217 mulscc %g1,%o4,%g1 228 mulscc %g1,%o4,%g1 218 mulscc %g1,%o4,%g1 229 mulscc %g1,%o4,%g1 219 mulscc %g1,%o4,%g1 230 mulscc %g1,%o4,%g1 220 mulscc %g1,%o4,%g1 231 mulscc %g1,%o4,%g1 221 mulscc %g1,%o4,%g1 232 mulscc %g1,%o4,%g1 222 mulscc %g1,%o4,%g1 233 mulscc %g1,%o4,%g1 223 mulscc %g1,%o4,%g1 234 mulscc %g1,%o4,%g1 224 mulscc %g1,%o4,%g1 235 mulscc %g1,%o4,%g1 225 mulscc %g1,%o4,%g1 236 mulscc %g1,%o4,%g1 226 mulscc %g1,%o4,%g1 237 mulscc %g1,%o4,%g1 227 mulscc %g1,%o4,%g1 238 mulscc %g1,%o4,%g1 228 mulscc %g1,%o4,%g1 239 mulscc %g1,%o4,%g1 229 mulscc %g1,%o4,%g1 240 mulscc %g1,%o4,%g1 230 mulscc %g1,%o4,%g1 241 mulscc %g1,%o4,%g1 231 mulscc %g1,%o4,%g1 242 mulscc %g1,%o4,%g1 232 mulscc %g1,%o4,%g1 243 mulscc %g1,%o4,%g1 233 mulscc %g1,%o4,%g1 244 mulscc %g1,%o4,%g1 234 mulscc %g1,%o4,%g1 245 mulscc %g1,%o4,%g1 235 mulscc %g1,%o4,%g1 246 mulscc %g1,%o4,%g1 236 mulscc %g1,%o4,%g1 247 mulscc %g1,%o4,%g1 237 mulscc %g1,%o4,%g1 248 mulscc %g1,%o4,%g1 238 mulscc %g1,%o4,%g1 249 mulscc %g1,%o4,%g1 239 mulscc %g1,0,%g1 250 mulscc %g1,0,%g1 240 add %g1,%g2,%o0 251 add %g1,%g2,%o0 241 rd %y,%o2 252 rd %y,%o2 242 cmp %o0,%i0 253 cmp %o0,%i0 243 bgu,a .LL78 254 bgu,a .LL78 244 add %o1,-1,%o1 255 add %o1,-1,%o1 245 bne,a .LL50 256 bne,a .LL50 246 mov 0,%o2 257 mov 0,%o2 247 cmp %o2,%i3 258 cmp %o2,%i3 248 bleu .LL50 259 bleu .LL50 249 mov 0,%o2 260 mov 0,%o2 250 add %o1,-1,%o1 261 add %o1,-1,%o1 251 .LL78: 262 .LL78: 252 mov 0,%o2 263 mov 0,%o2 253 .LL50: 264 .LL50: 254 mov %o1,%l1 265 mov %o1,%l1 255 .LL86: 266 .LL86: 256 mov %o2,%l0 267 mov %o2,%l0 257 mov %l0,%i0 268 mov %l0,%i0 258 mov %l1,%i1 269 mov %l1,%i1 259 cmp %l4,0 270 cmp %l4,0 260 be .LL81 271 be .LL81 261 sub %g0,%i1,%o0 272 sub %g0,%i1,%o0 262 mov %o0,%l3 273 mov %o0,%l3 263 subcc %g0,%o0,%g0 274 subcc %g0,%o0,%g0 264 sub %g0,%i0,%o0 275 sub %g0,%i0,%o0 265 subx %o0,0,%l2 276 subx %o0,0,%l2 266 mov %l2,%i0 277 mov %l2,%i0 267 mov %l3,%i1 278 mov %l3,%i1 268 .LL81: 279 .LL81: 269 ret 280 ret 270 restore 281 restore 271 EXPORT_SYMBOL(__divdi3) <<
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.