1 1.10 mrg /* Copyright (C) 1994-2022 Free Software Foundation, Inc. 2 1.1 mrg 3 1.1 mrg This file is free software; you can redistribute it and/or modify it 4 1.1 mrg under the terms of the GNU General Public License as published by the 5 1.1 mrg Free Software Foundation; either version 3, or (at your option) any 6 1.1 mrg later version. 7 1.1 mrg 8 1.1 mrg This file is distributed in the hope that it will be useful, but 9 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of 10 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 11 1.1 mrg General Public License for more details. 12 1.1 mrg 13 1.1 mrg Under Section 7 of GPL version 3, you are granted additional 14 1.1 mrg permissions described in the GCC Runtime Library Exception, version 15 1.1 mrg 3.1, as published by the Free Software Foundation. 16 1.1 mrg 17 1.1 mrg You should have received a copy of the GNU General Public License and 18 1.1 mrg a copy of the GCC Runtime Library Exception along with this program; 19 1.1 mrg see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 20 1.1 mrg <http://www.gnu.org/licenses/>. */ 21 1.1 mrg 22 1.1 mrg 23 1.1 mrg !! libgcc routines for the Renesas / SuperH SH CPUs. 24 1.1 mrg !! Contributed by Steve Chamberlain. 25 1.1 mrg !! sac@cygnus.com 26 1.1 mrg 27 1.1 mrg !! ashiftrt_r4_x, ___ashrsi3, ___ashlsi3, ___lshrsi3 routines 28 1.1 mrg !! recoded in assembly by Toshiyasu Morita 29 1.1 mrg !! tm@netcom.com 30 1.1 mrg 31 1.1 mrg #if defined(__ELF__) && defined(__linux__) 32 1.1 mrg .section .note.GNU-stack,"",%progbits 33 1.1 mrg .previous 34 1.1 mrg #endif 35 1.1 mrg 36 1.1 mrg /* SH2 optimizations for ___ashrsi3, ___ashlsi3, ___lshrsi3 and 37 1.1 mrg ELF local label prefixes by J"orn Rennecke 38 1.1 mrg amylaar (at) cygnus.com */ 39 1.1 mrg 40 1.1 mrg #include "lib1funcs.h" 41 1.1 mrg 42 1.1 mrg /* t-vxworks needs to build both PIC and non-PIC versions of libgcc, 43 1.1 mrg so it is more convenient to define NO_FPSCR_VALUES here than to 44 1.1 mrg define it on the command line. */ 45 1.1 mrg #if defined __vxworks && defined __PIC__ 46 1.1 mrg #define NO_FPSCR_VALUES 47 1.1 mrg #endif 48 1.1 mrg 49 1.1 mrg #ifdef L_ashiftrt 50 1.1 mrg .global GLOBAL(ashiftrt_r4_0) 51 1.1 mrg .global GLOBAL(ashiftrt_r4_1) 52 1.1 mrg .global GLOBAL(ashiftrt_r4_2) 53 1.1 mrg .global GLOBAL(ashiftrt_r4_3) 54 1.1 mrg .global GLOBAL(ashiftrt_r4_4) 55 1.1 mrg .global GLOBAL(ashiftrt_r4_5) 56 1.1 mrg .global GLOBAL(ashiftrt_r4_6) 57 1.1 mrg .global GLOBAL(ashiftrt_r4_7) 58 1.1 mrg .global GLOBAL(ashiftrt_r4_8) 59 1.1 mrg .global GLOBAL(ashiftrt_r4_9) 60 1.1 mrg .global GLOBAL(ashiftrt_r4_10) 61 1.1 mrg .global GLOBAL(ashiftrt_r4_11) 62 1.1 mrg .global GLOBAL(ashiftrt_r4_12) 63 1.1 mrg .global GLOBAL(ashiftrt_r4_13) 64 1.1 mrg .global GLOBAL(ashiftrt_r4_14) 65 1.1 mrg .global GLOBAL(ashiftrt_r4_15) 66 1.1 mrg .global GLOBAL(ashiftrt_r4_16) 67 1.1 mrg .global GLOBAL(ashiftrt_r4_17) 68 1.1 mrg .global GLOBAL(ashiftrt_r4_18) 69 1.1 mrg .global GLOBAL(ashiftrt_r4_19) 70 1.1 mrg .global GLOBAL(ashiftrt_r4_20) 71 1.1 mrg .global GLOBAL(ashiftrt_r4_21) 72 1.1 mrg .global GLOBAL(ashiftrt_r4_22) 73 1.1 mrg .global GLOBAL(ashiftrt_r4_23) 74 1.1 mrg .global GLOBAL(ashiftrt_r4_24) 75 1.1 mrg .global GLOBAL(ashiftrt_r4_25) 76 1.1 mrg .global GLOBAL(ashiftrt_r4_26) 77 1.1 mrg .global GLOBAL(ashiftrt_r4_27) 78 1.1 mrg .global GLOBAL(ashiftrt_r4_28) 79 1.1 mrg .global GLOBAL(ashiftrt_r4_29) 80 1.1 mrg .global GLOBAL(ashiftrt_r4_30) 81 1.1 mrg .global GLOBAL(ashiftrt_r4_31) 82 1.1 mrg .global GLOBAL(ashiftrt_r4_32) 83 1.1 mrg 84 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_0)) 85 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_1)) 86 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_2)) 87 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_3)) 88 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_4)) 89 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_5)) 90 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_6)) 91 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_7)) 92 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_8)) 93 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_9)) 94 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_10)) 95 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_11)) 96 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_12)) 97 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_13)) 98 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_14)) 99 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_15)) 100 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_16)) 101 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_17)) 102 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_18)) 103 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_19)) 104 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_20)) 105 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_21)) 106 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_22)) 107 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_23)) 108 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_24)) 109 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_25)) 110 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_26)) 111 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_27)) 112 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_28)) 113 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_29)) 114 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_30)) 115 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_31)) 116 1.1 mrg HIDDEN_FUNC(GLOBAL(ashiftrt_r4_32)) 117 1.1 mrg 118 1.1 mrg .align 1 119 1.1 mrg GLOBAL(ashiftrt_r4_32): 120 1.1 mrg GLOBAL(ashiftrt_r4_31): 121 1.1 mrg rotcl r4 122 1.1 mrg rts 123 1.1 mrg subc r4,r4 124 1.1 mrg 125 1.1 mrg GLOBAL(ashiftrt_r4_30): 126 1.1 mrg shar r4 127 1.1 mrg GLOBAL(ashiftrt_r4_29): 128 1.1 mrg shar r4 129 1.1 mrg GLOBAL(ashiftrt_r4_28): 130 1.1 mrg shar r4 131 1.1 mrg GLOBAL(ashiftrt_r4_27): 132 1.1 mrg shar r4 133 1.1 mrg GLOBAL(ashiftrt_r4_26): 134 1.1 mrg shar r4 135 1.1 mrg GLOBAL(ashiftrt_r4_25): 136 1.1 mrg shar r4 137 1.1 mrg GLOBAL(ashiftrt_r4_24): 138 1.1 mrg shlr16 r4 139 1.1 mrg shlr8 r4 140 1.1 mrg rts 141 1.1 mrg exts.b r4,r4 142 1.1 mrg 143 1.1 mrg GLOBAL(ashiftrt_r4_23): 144 1.1 mrg shar r4 145 1.1 mrg GLOBAL(ashiftrt_r4_22): 146 1.1 mrg shar r4 147 1.1 mrg GLOBAL(ashiftrt_r4_21): 148 1.1 mrg shar r4 149 1.1 mrg GLOBAL(ashiftrt_r4_20): 150 1.1 mrg shar r4 151 1.1 mrg GLOBAL(ashiftrt_r4_19): 152 1.1 mrg shar r4 153 1.1 mrg GLOBAL(ashiftrt_r4_18): 154 1.1 mrg shar r4 155 1.1 mrg GLOBAL(ashiftrt_r4_17): 156 1.1 mrg shar r4 157 1.1 mrg GLOBAL(ashiftrt_r4_16): 158 1.1 mrg shlr16 r4 159 1.1 mrg rts 160 1.1 mrg exts.w r4,r4 161 1.1 mrg 162 1.1 mrg GLOBAL(ashiftrt_r4_15): 163 1.1 mrg shar r4 164 1.1 mrg GLOBAL(ashiftrt_r4_14): 165 1.1 mrg shar r4 166 1.1 mrg GLOBAL(ashiftrt_r4_13): 167 1.1 mrg shar r4 168 1.1 mrg GLOBAL(ashiftrt_r4_12): 169 1.1 mrg shar r4 170 1.1 mrg GLOBAL(ashiftrt_r4_11): 171 1.1 mrg shar r4 172 1.1 mrg GLOBAL(ashiftrt_r4_10): 173 1.1 mrg shar r4 174 1.1 mrg GLOBAL(ashiftrt_r4_9): 175 1.1 mrg shar r4 176 1.1 mrg GLOBAL(ashiftrt_r4_8): 177 1.1 mrg shar r4 178 1.1 mrg GLOBAL(ashiftrt_r4_7): 179 1.1 mrg shar r4 180 1.1 mrg GLOBAL(ashiftrt_r4_6): 181 1.1 mrg shar r4 182 1.1 mrg GLOBAL(ashiftrt_r4_5): 183 1.1 mrg shar r4 184 1.1 mrg GLOBAL(ashiftrt_r4_4): 185 1.1 mrg shar r4 186 1.1 mrg GLOBAL(ashiftrt_r4_3): 187 1.1 mrg shar r4 188 1.1 mrg GLOBAL(ashiftrt_r4_2): 189 1.1 mrg shar r4 190 1.1 mrg GLOBAL(ashiftrt_r4_1): 191 1.1 mrg rts 192 1.1 mrg shar r4 193 1.1 mrg 194 1.1 mrg GLOBAL(ashiftrt_r4_0): 195 1.1 mrg rts 196 1.1 mrg nop 197 1.1 mrg 198 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_0)) 199 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_1)) 200 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_2)) 201 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_3)) 202 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_4)) 203 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_5)) 204 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_6)) 205 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_7)) 206 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_8)) 207 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_9)) 208 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_10)) 209 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_11)) 210 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_12)) 211 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_13)) 212 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_14)) 213 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_15)) 214 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_16)) 215 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_17)) 216 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_18)) 217 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_19)) 218 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_20)) 219 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_21)) 220 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_22)) 221 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_23)) 222 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_24)) 223 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_25)) 224 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_26)) 225 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_27)) 226 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_28)) 227 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_29)) 228 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_30)) 229 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_31)) 230 1.1 mrg ENDFUNC(GLOBAL(ashiftrt_r4_32)) 231 1.1 mrg #endif 232 1.1 mrg 233 1.1 mrg #ifdef L_ashiftrt_n 234 1.1 mrg 235 1.1 mrg ! 236 1.1 mrg ! GLOBAL(ashrsi3) 237 1.1 mrg ! 238 1.1 mrg ! Entry: 239 1.1 mrg ! 240 1.1 mrg ! r4: Value to shift 241 1.1 mrg ! r5: Shift count 242 1.1 mrg ! 243 1.1 mrg ! Exit: 244 1.1 mrg ! 245 1.1 mrg ! r0: Result 246 1.1 mrg ! 247 1.1 mrg ! Destroys: 248 1.1 mrg ! 249 1.1 mrg ! T bit, r5 250 1.1 mrg ! 251 1.1 mrg 252 1.1 mrg .global GLOBAL(ashrsi3) 253 1.1 mrg HIDDEN_FUNC(GLOBAL(ashrsi3)) 254 1.1 mrg .align 2 255 1.1 mrg GLOBAL(ashrsi3): 256 1.1 mrg mov #31,r0 257 1.1 mrg and r0,r5 258 1.1 mrg mova LOCAL(ashrsi3_table),r0 259 1.1 mrg mov.b @(r0,r5),r5 260 1.1 mrg #ifdef __sh1__ 261 1.1 mrg add r5,r0 262 1.1 mrg jmp @r0 263 1.1 mrg #else 264 1.1 mrg braf r5 265 1.1 mrg #endif 266 1.1 mrg mov r4,r0 267 1.1 mrg 268 1.1 mrg .align 2 269 1.1 mrg LOCAL(ashrsi3_table): 270 1.1 mrg .byte LOCAL(ashrsi3_0)-LOCAL(ashrsi3_table) 271 1.1 mrg .byte LOCAL(ashrsi3_1)-LOCAL(ashrsi3_table) 272 1.1 mrg .byte LOCAL(ashrsi3_2)-LOCAL(ashrsi3_table) 273 1.1 mrg .byte LOCAL(ashrsi3_3)-LOCAL(ashrsi3_table) 274 1.1 mrg .byte LOCAL(ashrsi3_4)-LOCAL(ashrsi3_table) 275 1.1 mrg .byte LOCAL(ashrsi3_5)-LOCAL(ashrsi3_table) 276 1.1 mrg .byte LOCAL(ashrsi3_6)-LOCAL(ashrsi3_table) 277 1.1 mrg .byte LOCAL(ashrsi3_7)-LOCAL(ashrsi3_table) 278 1.1 mrg .byte LOCAL(ashrsi3_8)-LOCAL(ashrsi3_table) 279 1.1 mrg .byte LOCAL(ashrsi3_9)-LOCAL(ashrsi3_table) 280 1.1 mrg .byte LOCAL(ashrsi3_10)-LOCAL(ashrsi3_table) 281 1.1 mrg .byte LOCAL(ashrsi3_11)-LOCAL(ashrsi3_table) 282 1.1 mrg .byte LOCAL(ashrsi3_12)-LOCAL(ashrsi3_table) 283 1.1 mrg .byte LOCAL(ashrsi3_13)-LOCAL(ashrsi3_table) 284 1.1 mrg .byte LOCAL(ashrsi3_14)-LOCAL(ashrsi3_table) 285 1.1 mrg .byte LOCAL(ashrsi3_15)-LOCAL(ashrsi3_table) 286 1.1 mrg .byte LOCAL(ashrsi3_16)-LOCAL(ashrsi3_table) 287 1.1 mrg .byte LOCAL(ashrsi3_17)-LOCAL(ashrsi3_table) 288 1.1 mrg .byte LOCAL(ashrsi3_18)-LOCAL(ashrsi3_table) 289 1.1 mrg .byte LOCAL(ashrsi3_19)-LOCAL(ashrsi3_table) 290 1.1 mrg .byte LOCAL(ashrsi3_20)-LOCAL(ashrsi3_table) 291 1.1 mrg .byte LOCAL(ashrsi3_21)-LOCAL(ashrsi3_table) 292 1.1 mrg .byte LOCAL(ashrsi3_22)-LOCAL(ashrsi3_table) 293 1.1 mrg .byte LOCAL(ashrsi3_23)-LOCAL(ashrsi3_table) 294 1.1 mrg .byte LOCAL(ashrsi3_24)-LOCAL(ashrsi3_table) 295 1.1 mrg .byte LOCAL(ashrsi3_25)-LOCAL(ashrsi3_table) 296 1.1 mrg .byte LOCAL(ashrsi3_26)-LOCAL(ashrsi3_table) 297 1.1 mrg .byte LOCAL(ashrsi3_27)-LOCAL(ashrsi3_table) 298 1.1 mrg .byte LOCAL(ashrsi3_28)-LOCAL(ashrsi3_table) 299 1.1 mrg .byte LOCAL(ashrsi3_29)-LOCAL(ashrsi3_table) 300 1.1 mrg .byte LOCAL(ashrsi3_30)-LOCAL(ashrsi3_table) 301 1.1 mrg .byte LOCAL(ashrsi3_31)-LOCAL(ashrsi3_table) 302 1.1 mrg 303 1.1 mrg LOCAL(ashrsi3_31): 304 1.1 mrg rotcl r0 305 1.1 mrg rts 306 1.1 mrg subc r0,r0 307 1.1 mrg 308 1.1 mrg LOCAL(ashrsi3_30): 309 1.1 mrg shar r0 310 1.1 mrg LOCAL(ashrsi3_29): 311 1.1 mrg shar r0 312 1.1 mrg LOCAL(ashrsi3_28): 313 1.1 mrg shar r0 314 1.1 mrg LOCAL(ashrsi3_27): 315 1.1 mrg shar r0 316 1.1 mrg LOCAL(ashrsi3_26): 317 1.1 mrg shar r0 318 1.1 mrg LOCAL(ashrsi3_25): 319 1.1 mrg shar r0 320 1.1 mrg LOCAL(ashrsi3_24): 321 1.1 mrg shlr16 r0 322 1.1 mrg shlr8 r0 323 1.1 mrg rts 324 1.1 mrg exts.b r0,r0 325 1.1 mrg 326 1.1 mrg LOCAL(ashrsi3_23): 327 1.1 mrg shar r0 328 1.1 mrg LOCAL(ashrsi3_22): 329 1.1 mrg shar r0 330 1.1 mrg LOCAL(ashrsi3_21): 331 1.1 mrg shar r0 332 1.1 mrg LOCAL(ashrsi3_20): 333 1.1 mrg shar r0 334 1.1 mrg LOCAL(ashrsi3_19): 335 1.1 mrg shar r0 336 1.1 mrg LOCAL(ashrsi3_18): 337 1.1 mrg shar r0 338 1.1 mrg LOCAL(ashrsi3_17): 339 1.1 mrg shar r0 340 1.1 mrg LOCAL(ashrsi3_16): 341 1.1 mrg shlr16 r0 342 1.1 mrg rts 343 1.1 mrg exts.w r0,r0 344 1.1 mrg 345 1.1 mrg LOCAL(ashrsi3_15): 346 1.1 mrg shar r0 347 1.1 mrg LOCAL(ashrsi3_14): 348 1.1 mrg shar r0 349 1.1 mrg LOCAL(ashrsi3_13): 350 1.1 mrg shar r0 351 1.1 mrg LOCAL(ashrsi3_12): 352 1.1 mrg shar r0 353 1.1 mrg LOCAL(ashrsi3_11): 354 1.1 mrg shar r0 355 1.1 mrg LOCAL(ashrsi3_10): 356 1.1 mrg shar r0 357 1.1 mrg LOCAL(ashrsi3_9): 358 1.1 mrg shar r0 359 1.1 mrg LOCAL(ashrsi3_8): 360 1.1 mrg shar r0 361 1.1 mrg LOCAL(ashrsi3_7): 362 1.1 mrg shar r0 363 1.1 mrg LOCAL(ashrsi3_6): 364 1.1 mrg shar r0 365 1.1 mrg LOCAL(ashrsi3_5): 366 1.1 mrg shar r0 367 1.1 mrg LOCAL(ashrsi3_4): 368 1.1 mrg shar r0 369 1.1 mrg LOCAL(ashrsi3_3): 370 1.1 mrg shar r0 371 1.1 mrg LOCAL(ashrsi3_2): 372 1.1 mrg shar r0 373 1.1 mrg LOCAL(ashrsi3_1): 374 1.1 mrg rts 375 1.1 mrg shar r0 376 1.1 mrg 377 1.1 mrg LOCAL(ashrsi3_0): 378 1.1 mrg rts 379 1.1 mrg nop 380 1.1 mrg 381 1.1 mrg ENDFUNC(GLOBAL(ashrsi3)) 382 1.1 mrg #endif 383 1.1 mrg 384 1.1 mrg #ifdef L_ashiftlt 385 1.1 mrg 386 1.1 mrg ! 387 1.1 mrg ! GLOBAL(ashlsi3) 388 1.1 mrg ! (For compatibility with older binaries, not used by compiler) 389 1.1 mrg ! 390 1.1 mrg ! Entry: 391 1.1 mrg ! r4: Value to shift 392 1.1 mrg ! r5: Shift count 393 1.1 mrg ! 394 1.1 mrg ! Exit: 395 1.1 mrg ! r0: Result 396 1.1 mrg ! 397 1.1 mrg ! Destroys: 398 1.1 mrg ! T bit 399 1.1 mrg ! 400 1.1 mrg ! 401 1.1 mrg ! GLOBAL(ashlsi3_r0) 402 1.1 mrg ! 403 1.1 mrg ! Entry: 404 1.1 mrg ! r4: Value to shift 405 1.1 mrg ! r0: Shift count 406 1.1 mrg ! 407 1.1 mrg ! Exit: 408 1.1 mrg ! r0: Result 409 1.1 mrg ! 410 1.1 mrg ! Destroys: 411 1.1 mrg ! T bit 412 1.1 mrg 413 1.1 mrg .global GLOBAL(ashlsi3) 414 1.1 mrg .global GLOBAL(ashlsi3_r0) 415 1.1 mrg HIDDEN_FUNC(GLOBAL(ashlsi3)) 416 1.1 mrg HIDDEN_FUNC(GLOBAL(ashlsi3_r0)) 417 1.1 mrg GLOBAL(ashlsi3): 418 1.1 mrg mov r5,r0 419 1.1 mrg .align 2 420 1.1 mrg GLOBAL(ashlsi3_r0): 421 1.1 mrg 422 1.1 mrg #ifdef __sh1__ 423 1.1 mrg and #31,r0 424 1.1 mrg shll2 r0 425 1.1 mrg mov.l r4,@-r15 426 1.1 mrg mov r0,r4 427 1.1 mrg mova LOCAL(ashlsi3_table),r0 428 1.1 mrg add r4,r0 429 1.1 mrg mov.l @r15+,r4 430 1.1 mrg jmp @r0 431 1.1 mrg mov r4,r0 432 1.1 mrg .align 2 433 1.1 mrg #else 434 1.1 mrg and #31,r0 435 1.1 mrg shll2 r0 436 1.1 mrg braf r0 437 1.1 mrg mov r4,r0 438 1.1 mrg #endif 439 1.1 mrg 440 1.1 mrg LOCAL(ashlsi3_table): 441 1.1 mrg rts // << 0 442 1.1 mrg nop 443 1.1 mrg LOCAL(ashlsi_1): 444 1.1 mrg rts // << 1 445 1.1 mrg shll r0 446 1.1 mrg LOCAL(ashlsi_2): // << 2 447 1.1 mrg rts 448 1.1 mrg shll2 r0 449 1.1 mrg bra LOCAL(ashlsi_1) // << 3 450 1.1 mrg shll2 r0 451 1.1 mrg bra LOCAL(ashlsi_2) // << 4 452 1.1 mrg shll2 r0 453 1.1 mrg bra LOCAL(ashlsi_5) // << 5 454 1.1 mrg shll r0 455 1.1 mrg bra LOCAL(ashlsi_6) // << 6 456 1.1 mrg shll2 r0 457 1.1 mrg bra LOCAL(ashlsi_7) // << 7 458 1.1 mrg shll r0 459 1.1 mrg LOCAL(ashlsi_8): // << 8 460 1.1 mrg rts 461 1.1 mrg shll8 r0 462 1.1 mrg bra LOCAL(ashlsi_8) // << 9 463 1.1 mrg shll r0 464 1.1 mrg bra LOCAL(ashlsi_8) // << 10 465 1.1 mrg shll2 r0 466 1.1 mrg bra LOCAL(ashlsi_11) // << 11 467 1.1 mrg shll r0 468 1.1 mrg bra LOCAL(ashlsi_12) // << 12 469 1.1 mrg shll2 r0 470 1.1 mrg bra LOCAL(ashlsi_13) // << 13 471 1.1 mrg shll r0 472 1.1 mrg bra LOCAL(ashlsi_14) // << 14 473 1.1 mrg shll8 r0 474 1.1 mrg bra LOCAL(ashlsi_15) // << 15 475 1.1 mrg shll8 r0 476 1.1 mrg LOCAL(ashlsi_16): // << 16 477 1.1 mrg rts 478 1.1 mrg shll16 r0 479 1.1 mrg bra LOCAL(ashlsi_16) // << 17 480 1.1 mrg shll r0 481 1.1 mrg bra LOCAL(ashlsi_16) // << 18 482 1.1 mrg shll2 r0 483 1.1 mrg bra LOCAL(ashlsi_19) // << 19 484 1.1 mrg shll r0 485 1.1 mrg bra LOCAL(ashlsi_20) // << 20 486 1.1 mrg shll2 r0 487 1.1 mrg bra LOCAL(ashlsi_21) // << 21 488 1.1 mrg shll r0 489 1.1 mrg bra LOCAL(ashlsi_22) // << 22 490 1.1 mrg shll16 r0 491 1.1 mrg bra LOCAL(ashlsi_23) // << 23 492 1.1 mrg shll16 r0 493 1.1 mrg bra LOCAL(ashlsi_16) // << 24 494 1.1 mrg shll8 r0 495 1.1 mrg bra LOCAL(ashlsi_25) // << 25 496 1.1 mrg shll r0 497 1.1 mrg bra LOCAL(ashlsi_26) // << 26 498 1.1 mrg shll2 r0 499 1.1 mrg bra LOCAL(ashlsi_27) // << 27 500 1.1 mrg shll r0 501 1.1 mrg bra LOCAL(ashlsi_28) // << 28 502 1.1 mrg shll2 r0 503 1.1 mrg bra LOCAL(ashlsi_29) // << 29 504 1.1 mrg shll16 r0 505 1.1 mrg bra LOCAL(ashlsi_30) // << 30 506 1.1 mrg shll16 r0 507 1.1 mrg and #1,r0 // << 31 508 1.1 mrg rts 509 1.1 mrg rotr r0 510 1.1 mrg 511 1.1 mrg LOCAL(ashlsi_7): 512 1.1 mrg shll2 r0 513 1.1 mrg LOCAL(ashlsi_5): 514 1.1 mrg LOCAL(ashlsi_6): 515 1.1 mrg shll2 r0 516 1.1 mrg rts 517 1.1 mrg LOCAL(ashlsi_13): 518 1.1 mrg shll2 r0 519 1.1 mrg LOCAL(ashlsi_12): 520 1.1 mrg LOCAL(ashlsi_11): 521 1.1 mrg shll8 r0 522 1.1 mrg rts 523 1.1 mrg LOCAL(ashlsi_21): 524 1.1 mrg shll2 r0 525 1.1 mrg LOCAL(ashlsi_20): 526 1.1 mrg LOCAL(ashlsi_19): 527 1.1 mrg shll16 r0 528 1.1 mrg rts 529 1.1 mrg LOCAL(ashlsi_28): 530 1.1 mrg LOCAL(ashlsi_27): 531 1.1 mrg shll2 r0 532 1.1 mrg LOCAL(ashlsi_26): 533 1.1 mrg LOCAL(ashlsi_25): 534 1.1 mrg shll16 r0 535 1.1 mrg rts 536 1.1 mrg shll8 r0 537 1.1 mrg 538 1.1 mrg LOCAL(ashlsi_22): 539 1.1 mrg LOCAL(ashlsi_14): 540 1.1 mrg shlr2 r0 541 1.1 mrg rts 542 1.1 mrg shll8 r0 543 1.1 mrg 544 1.1 mrg LOCAL(ashlsi_23): 545 1.1 mrg LOCAL(ashlsi_15): 546 1.1 mrg shlr r0 547 1.1 mrg rts 548 1.1 mrg shll8 r0 549 1.1 mrg 550 1.1 mrg LOCAL(ashlsi_29): 551 1.1 mrg shlr r0 552 1.1 mrg LOCAL(ashlsi_30): 553 1.1 mrg shlr2 r0 554 1.1 mrg rts 555 1.1 mrg shll16 r0 556 1.1 mrg 557 1.1 mrg ENDFUNC(GLOBAL(ashlsi3)) 558 1.1 mrg ENDFUNC(GLOBAL(ashlsi3_r0)) 559 1.1 mrg #endif 560 1.1 mrg 561 1.1 mrg #ifdef L_lshiftrt 562 1.1 mrg 563 1.1 mrg ! 564 1.1 mrg ! GLOBAL(lshrsi3) 565 1.1 mrg ! (For compatibility with older binaries, not used by compiler) 566 1.1 mrg ! 567 1.1 mrg ! Entry: 568 1.1 mrg ! r4: Value to shift 569 1.1 mrg ! r5: Shift count 570 1.1 mrg ! 571 1.1 mrg ! Exit: 572 1.1 mrg ! r0: Result 573 1.1 mrg ! 574 1.1 mrg ! Destroys: 575 1.1 mrg ! T bit 576 1.1 mrg ! 577 1.1 mrg ! 578 1.1 mrg ! GLOBAL(lshrsi3_r0) 579 1.1 mrg ! 580 1.1 mrg ! Entry: 581 1.1 mrg ! r4: Value to shift 582 1.1 mrg ! r0: Shift count 583 1.1 mrg ! 584 1.1 mrg ! Exit: 585 1.1 mrg ! r0: Result 586 1.1 mrg ! 587 1.1 mrg ! Destroys: 588 1.1 mrg ! T bit 589 1.1 mrg 590 1.1 mrg .global GLOBAL(lshrsi3) 591 1.1 mrg .global GLOBAL(lshrsi3_r0) 592 1.1 mrg HIDDEN_FUNC(GLOBAL(lshrsi3)) 593 1.1 mrg HIDDEN_FUNC(GLOBAL(lshrsi3_r0)) 594 1.1 mrg GLOBAL(lshrsi3): 595 1.1 mrg mov r5,r0 596 1.1 mrg .align 2 597 1.1 mrg GLOBAL(lshrsi3_r0): 598 1.1 mrg 599 1.1 mrg #ifdef __sh1__ 600 1.1 mrg and #31,r0 601 1.1 mrg shll2 r0 602 1.1 mrg mov.l r4,@-r15 603 1.1 mrg mov r0,r4 604 1.1 mrg mova LOCAL(lshrsi3_table),r0 605 1.1 mrg add r4,r0 606 1.1 mrg mov.l @r15+,r4 607 1.1 mrg jmp @r0 608 1.1 mrg mov r4,r0 609 1.1 mrg .align 2 610 1.1 mrg #else 611 1.1 mrg and #31,r0 612 1.1 mrg shll2 r0 613 1.1 mrg braf r0 614 1.1 mrg mov r4,r0 615 1.1 mrg #endif 616 1.1 mrg LOCAL(lshrsi3_table): 617 1.1 mrg rts // >> 0 618 1.1 mrg nop 619 1.1 mrg LOCAL(lshrsi_1): // >> 1 620 1.1 mrg rts 621 1.1 mrg shlr r0 622 1.1 mrg LOCAL(lshrsi_2): // >> 2 623 1.1 mrg rts 624 1.1 mrg shlr2 r0 625 1.1 mrg bra LOCAL(lshrsi_1) // >> 3 626 1.1 mrg shlr2 r0 627 1.1 mrg bra LOCAL(lshrsi_2) // >> 4 628 1.1 mrg shlr2 r0 629 1.1 mrg bra LOCAL(lshrsi_5) // >> 5 630 1.1 mrg shlr r0 631 1.1 mrg bra LOCAL(lshrsi_6) // >> 6 632 1.1 mrg shlr2 r0 633 1.1 mrg bra LOCAL(lshrsi_7) // >> 7 634 1.1 mrg shlr r0 635 1.1 mrg LOCAL(lshrsi_8): // >> 8 636 1.1 mrg rts 637 1.1 mrg shlr8 r0 638 1.1 mrg bra LOCAL(lshrsi_8) // >> 9 639 1.1 mrg shlr r0 640 1.1 mrg bra LOCAL(lshrsi_8) // >> 10 641 1.1 mrg shlr2 r0 642 1.1 mrg bra LOCAL(lshrsi_11) // >> 11 643 1.1 mrg shlr r0 644 1.1 mrg bra LOCAL(lshrsi_12) // >> 12 645 1.1 mrg shlr2 r0 646 1.1 mrg bra LOCAL(lshrsi_13) // >> 13 647 1.1 mrg shlr r0 648 1.1 mrg bra LOCAL(lshrsi_14) // >> 14 649 1.1 mrg shlr8 r0 650 1.1 mrg bra LOCAL(lshrsi_15) // >> 15 651 1.1 mrg shlr8 r0 652 1.1 mrg LOCAL(lshrsi_16): // >> 16 653 1.1 mrg rts 654 1.1 mrg shlr16 r0 655 1.1 mrg bra LOCAL(lshrsi_16) // >> 17 656 1.1 mrg shlr r0 657 1.1 mrg bra LOCAL(lshrsi_16) // >> 18 658 1.1 mrg shlr2 r0 659 1.1 mrg bra LOCAL(lshrsi_19) // >> 19 660 1.1 mrg shlr r0 661 1.1 mrg bra LOCAL(lshrsi_20) // >> 20 662 1.1 mrg shlr2 r0 663 1.1 mrg bra LOCAL(lshrsi_21) // >> 21 664 1.1 mrg shlr r0 665 1.1 mrg bra LOCAL(lshrsi_22) // >> 22 666 1.1 mrg shlr16 r0 667 1.1 mrg bra LOCAL(lshrsi_23) // >> 23 668 1.1 mrg shlr16 r0 669 1.1 mrg bra LOCAL(lshrsi_16) // >> 24 670 1.1 mrg shlr8 r0 671 1.1 mrg bra LOCAL(lshrsi_25) // >> 25 672 1.1 mrg shlr r0 673 1.1 mrg bra LOCAL(lshrsi_26) // >> 26 674 1.1 mrg shlr2 r0 675 1.1 mrg bra LOCAL(lshrsi_27) // >> 27 676 1.1 mrg shlr r0 677 1.1 mrg bra LOCAL(lshrsi_28) // >> 28 678 1.1 mrg shlr2 r0 679 1.1 mrg bra LOCAL(lshrsi_29) // >> 29 680 1.1 mrg shlr16 r0 681 1.1 mrg bra LOCAL(lshrsi_30) // >> 30 682 1.1 mrg shlr16 r0 683 1.1 mrg shll r0 // >> 31 684 1.1 mrg rts 685 1.1 mrg movt r0 686 1.1 mrg 687 1.1 mrg LOCAL(lshrsi_7): 688 1.1 mrg shlr2 r0 689 1.1 mrg LOCAL(lshrsi_5): 690 1.1 mrg LOCAL(lshrsi_6): 691 1.1 mrg shlr2 r0 692 1.1 mrg rts 693 1.1 mrg LOCAL(lshrsi_13): 694 1.1 mrg shlr2 r0 695 1.1 mrg LOCAL(lshrsi_12): 696 1.1 mrg LOCAL(lshrsi_11): 697 1.1 mrg shlr8 r0 698 1.1 mrg rts 699 1.1 mrg LOCAL(lshrsi_21): 700 1.1 mrg shlr2 r0 701 1.1 mrg LOCAL(lshrsi_20): 702 1.1 mrg LOCAL(lshrsi_19): 703 1.1 mrg shlr16 r0 704 1.1 mrg rts 705 1.1 mrg LOCAL(lshrsi_28): 706 1.1 mrg LOCAL(lshrsi_27): 707 1.1 mrg shlr2 r0 708 1.1 mrg LOCAL(lshrsi_26): 709 1.1 mrg LOCAL(lshrsi_25): 710 1.1 mrg shlr16 r0 711 1.1 mrg rts 712 1.1 mrg shlr8 r0 713 1.1 mrg 714 1.1 mrg LOCAL(lshrsi_22): 715 1.1 mrg LOCAL(lshrsi_14): 716 1.1 mrg shll2 r0 717 1.1 mrg rts 718 1.1 mrg shlr8 r0 719 1.1 mrg 720 1.1 mrg LOCAL(lshrsi_23): 721 1.1 mrg LOCAL(lshrsi_15): 722 1.1 mrg shll r0 723 1.1 mrg rts 724 1.1 mrg shlr8 r0 725 1.1 mrg 726 1.1 mrg LOCAL(lshrsi_29): 727 1.1 mrg shll r0 728 1.1 mrg LOCAL(lshrsi_30): 729 1.1 mrg shll2 r0 730 1.1 mrg rts 731 1.1 mrg shlr16 r0 732 1.1 mrg 733 1.1 mrg ENDFUNC(GLOBAL(lshrsi3)) 734 1.1 mrg ENDFUNC(GLOBAL(lshrsi3_r0)) 735 1.1 mrg #endif 736 1.1 mrg 737 1.1 mrg #ifdef L_movmem 738 1.1 mrg .text 739 1.1 mrg .balign 4 740 1.1 mrg .global GLOBAL(movmem) 741 1.1 mrg HIDDEN_FUNC(GLOBAL(movmem)) 742 1.1 mrg HIDDEN_ALIAS(movstr,movmem) 743 1.1 mrg /* This would be a lot simpler if r6 contained the byte count 744 1.1 mrg minus 64, and we wouldn't be called here for a byte count of 64. */ 745 1.1 mrg GLOBAL(movmem): 746 1.1 mrg sts.l pr,@-r15 747 1.1 mrg shll2 r6 748 1.1 mrg bsr GLOBAL(movmemSI52+2) 749 1.1 mrg mov.l @(48,r5),r0 750 1.1 mrg .balign 4 751 1.1 mrg LOCAL(movmem_loop): /* Reached with rts */ 752 1.1 mrg mov.l @(60,r5),r0 753 1.1 mrg add #-64,r6 754 1.1 mrg mov.l r0,@(60,r4) 755 1.1 mrg tst r6,r6 756 1.1 mrg mov.l @(56,r5),r0 757 1.1 mrg bt LOCAL(movmem_done) 758 1.1 mrg mov.l r0,@(56,r4) 759 1.1 mrg cmp/pl r6 760 1.1 mrg mov.l @(52,r5),r0 761 1.1 mrg add #64,r5 762 1.1 mrg mov.l r0,@(52,r4) 763 1.1 mrg add #64,r4 764 1.1 mrg bt GLOBAL(movmemSI52) 765 1.1 mrg ! done all the large groups, do the remainder 766 1.1 mrg ! jump to movmem+ 767 1.1 mrg mova GLOBAL(movmemSI4)+4,r0 768 1.1 mrg add r6,r0 769 1.1 mrg jmp @r0 770 1.1 mrg LOCAL(movmem_done): ! share slot insn, works out aligned. 771 1.1 mrg lds.l @r15+,pr 772 1.1 mrg mov.l r0,@(56,r4) 773 1.1 mrg mov.l @(52,r5),r0 774 1.1 mrg rts 775 1.1 mrg mov.l r0,@(52,r4) 776 1.1 mrg .balign 4 777 1.1 mrg ! ??? We need aliases movstr* for movmem* for the older libraries. These 778 1.1 mrg ! aliases will be removed at the some point in the future. 779 1.1 mrg .global GLOBAL(movmemSI64) 780 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI64)) 781 1.1 mrg HIDDEN_ALIAS(movstrSI64,movmemSI64) 782 1.1 mrg GLOBAL(movmemSI64): 783 1.1 mrg mov.l @(60,r5),r0 784 1.1 mrg mov.l r0,@(60,r4) 785 1.1 mrg .global GLOBAL(movmemSI60) 786 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI60)) 787 1.1 mrg HIDDEN_ALIAS(movstrSI60,movmemSI60) 788 1.1 mrg GLOBAL(movmemSI60): 789 1.1 mrg mov.l @(56,r5),r0 790 1.1 mrg mov.l r0,@(56,r4) 791 1.1 mrg .global GLOBAL(movmemSI56) 792 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI56)) 793 1.1 mrg HIDDEN_ALIAS(movstrSI56,movmemSI56) 794 1.1 mrg GLOBAL(movmemSI56): 795 1.1 mrg mov.l @(52,r5),r0 796 1.1 mrg mov.l r0,@(52,r4) 797 1.1 mrg .global GLOBAL(movmemSI52) 798 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI52)) 799 1.1 mrg HIDDEN_ALIAS(movstrSI52,movmemSI52) 800 1.1 mrg GLOBAL(movmemSI52): 801 1.1 mrg mov.l @(48,r5),r0 802 1.1 mrg mov.l r0,@(48,r4) 803 1.1 mrg .global GLOBAL(movmemSI48) 804 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI48)) 805 1.1 mrg HIDDEN_ALIAS(movstrSI48,movmemSI48) 806 1.1 mrg GLOBAL(movmemSI48): 807 1.1 mrg mov.l @(44,r5),r0 808 1.1 mrg mov.l r0,@(44,r4) 809 1.1 mrg .global GLOBAL(movmemSI44) 810 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI44)) 811 1.1 mrg HIDDEN_ALIAS(movstrSI44,movmemSI44) 812 1.1 mrg GLOBAL(movmemSI44): 813 1.1 mrg mov.l @(40,r5),r0 814 1.1 mrg mov.l r0,@(40,r4) 815 1.1 mrg .global GLOBAL(movmemSI40) 816 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI40)) 817 1.1 mrg HIDDEN_ALIAS(movstrSI40,movmemSI40) 818 1.1 mrg GLOBAL(movmemSI40): 819 1.1 mrg mov.l @(36,r5),r0 820 1.1 mrg mov.l r0,@(36,r4) 821 1.1 mrg .global GLOBAL(movmemSI36) 822 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI36)) 823 1.1 mrg HIDDEN_ALIAS(movstrSI36,movmemSI36) 824 1.1 mrg GLOBAL(movmemSI36): 825 1.1 mrg mov.l @(32,r5),r0 826 1.1 mrg mov.l r0,@(32,r4) 827 1.1 mrg .global GLOBAL(movmemSI32) 828 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI32)) 829 1.1 mrg HIDDEN_ALIAS(movstrSI32,movmemSI32) 830 1.1 mrg GLOBAL(movmemSI32): 831 1.1 mrg mov.l @(28,r5),r0 832 1.1 mrg mov.l r0,@(28,r4) 833 1.1 mrg .global GLOBAL(movmemSI28) 834 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI28)) 835 1.1 mrg HIDDEN_ALIAS(movstrSI28,movmemSI28) 836 1.1 mrg GLOBAL(movmemSI28): 837 1.1 mrg mov.l @(24,r5),r0 838 1.1 mrg mov.l r0,@(24,r4) 839 1.1 mrg .global GLOBAL(movmemSI24) 840 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI24)) 841 1.1 mrg HIDDEN_ALIAS(movstrSI24,movmemSI24) 842 1.1 mrg GLOBAL(movmemSI24): 843 1.1 mrg mov.l @(20,r5),r0 844 1.1 mrg mov.l r0,@(20,r4) 845 1.1 mrg .global GLOBAL(movmemSI20) 846 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI20)) 847 1.1 mrg HIDDEN_ALIAS(movstrSI20,movmemSI20) 848 1.1 mrg GLOBAL(movmemSI20): 849 1.1 mrg mov.l @(16,r5),r0 850 1.1 mrg mov.l r0,@(16,r4) 851 1.1 mrg .global GLOBAL(movmemSI16) 852 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI16)) 853 1.1 mrg HIDDEN_ALIAS(movstrSI16,movmemSI16) 854 1.1 mrg GLOBAL(movmemSI16): 855 1.1 mrg mov.l @(12,r5),r0 856 1.1 mrg mov.l r0,@(12,r4) 857 1.1 mrg .global GLOBAL(movmemSI12) 858 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI12)) 859 1.1 mrg HIDDEN_ALIAS(movstrSI12,movmemSI12) 860 1.1 mrg GLOBAL(movmemSI12): 861 1.1 mrg mov.l @(8,r5),r0 862 1.1 mrg mov.l r0,@(8,r4) 863 1.1 mrg .global GLOBAL(movmemSI8) 864 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI8)) 865 1.1 mrg HIDDEN_ALIAS(movstrSI8,movmemSI8) 866 1.1 mrg GLOBAL(movmemSI8): 867 1.1 mrg mov.l @(4,r5),r0 868 1.1 mrg mov.l r0,@(4,r4) 869 1.1 mrg .global GLOBAL(movmemSI4) 870 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI4)) 871 1.1 mrg HIDDEN_ALIAS(movstrSI4,movmemSI4) 872 1.1 mrg GLOBAL(movmemSI4): 873 1.1 mrg mov.l @(0,r5),r0 874 1.1 mrg rts 875 1.1 mrg mov.l r0,@(0,r4) 876 1.1 mrg 877 1.1 mrg ENDFUNC(GLOBAL(movmemSI64)) 878 1.1 mrg ENDFUNC(GLOBAL(movmemSI60)) 879 1.1 mrg ENDFUNC(GLOBAL(movmemSI56)) 880 1.1 mrg ENDFUNC(GLOBAL(movmemSI52)) 881 1.1 mrg ENDFUNC(GLOBAL(movmemSI48)) 882 1.1 mrg ENDFUNC(GLOBAL(movmemSI44)) 883 1.1 mrg ENDFUNC(GLOBAL(movmemSI40)) 884 1.1 mrg ENDFUNC(GLOBAL(movmemSI36)) 885 1.1 mrg ENDFUNC(GLOBAL(movmemSI32)) 886 1.1 mrg ENDFUNC(GLOBAL(movmemSI28)) 887 1.1 mrg ENDFUNC(GLOBAL(movmemSI24)) 888 1.1 mrg ENDFUNC(GLOBAL(movmemSI20)) 889 1.1 mrg ENDFUNC(GLOBAL(movmemSI16)) 890 1.1 mrg ENDFUNC(GLOBAL(movmemSI12)) 891 1.1 mrg ENDFUNC(GLOBAL(movmemSI8)) 892 1.1 mrg ENDFUNC(GLOBAL(movmemSI4)) 893 1.1 mrg ENDFUNC(GLOBAL(movmem)) 894 1.1 mrg #endif 895 1.1 mrg 896 1.1 mrg #ifdef L_movmem_i4 897 1.1 mrg .text 898 1.1 mrg .global GLOBAL(movmem_i4_even) 899 1.1 mrg .global GLOBAL(movmem_i4_odd) 900 1.1 mrg .global GLOBAL(movmemSI12_i4) 901 1.1 mrg 902 1.1 mrg HIDDEN_FUNC(GLOBAL(movmem_i4_even)) 903 1.1 mrg HIDDEN_FUNC(GLOBAL(movmem_i4_odd)) 904 1.1 mrg HIDDEN_FUNC(GLOBAL(movmemSI12_i4)) 905 1.1 mrg 906 1.1 mrg HIDDEN_ALIAS(movstr_i4_even,movmem_i4_even) 907 1.1 mrg HIDDEN_ALIAS(movstr_i4_odd,movmem_i4_odd) 908 1.1 mrg HIDDEN_ALIAS(movstrSI12_i4,movmemSI12_i4) 909 1.1 mrg 910 1.1 mrg .p2align 5 911 1.1 mrg L_movmem_2mod4_end: 912 1.1 mrg mov.l r0,@(16,r4) 913 1.1 mrg rts 914 1.1 mrg mov.l r1,@(20,r4) 915 1.1 mrg 916 1.1 mrg .p2align 2 917 1.1 mrg 918 1.1 mrg GLOBAL(movmem_i4_even): 919 1.1 mrg mov.l @r5+,r0 920 1.1 mrg bra L_movmem_start_even 921 1.1 mrg mov.l @r5+,r1 922 1.1 mrg 923 1.1 mrg GLOBAL(movmem_i4_odd): 924 1.1 mrg mov.l @r5+,r1 925 1.1 mrg add #-4,r4 926 1.1 mrg mov.l @r5+,r2 927 1.1 mrg mov.l @r5+,r3 928 1.1 mrg mov.l r1,@(4,r4) 929 1.1 mrg mov.l r2,@(8,r4) 930 1.1 mrg 931 1.1 mrg L_movmem_loop: 932 1.1 mrg mov.l r3,@(12,r4) 933 1.1 mrg dt r6 934 1.1 mrg mov.l @r5+,r0 935 1.1 mrg bt/s L_movmem_2mod4_end 936 1.1 mrg mov.l @r5+,r1 937 1.1 mrg add #16,r4 938 1.1 mrg L_movmem_start_even: 939 1.1 mrg mov.l @r5+,r2 940 1.1 mrg mov.l @r5+,r3 941 1.1 mrg mov.l r0,@r4 942 1.1 mrg dt r6 943 1.1 mrg mov.l r1,@(4,r4) 944 1.1 mrg bf/s L_movmem_loop 945 1.1 mrg mov.l r2,@(8,r4) 946 1.1 mrg rts 947 1.1 mrg mov.l r3,@(12,r4) 948 1.1 mrg 949 1.1 mrg ENDFUNC(GLOBAL(movmem_i4_even)) 950 1.1 mrg ENDFUNC(GLOBAL(movmem_i4_odd)) 951 1.1 mrg 952 1.1 mrg .p2align 4 953 1.1 mrg GLOBAL(movmemSI12_i4): 954 1.1 mrg mov.l @r5,r0 955 1.1 mrg mov.l @(4,r5),r1 956 1.1 mrg mov.l @(8,r5),r2 957 1.1 mrg mov.l r0,@r4 958 1.1 mrg mov.l r1,@(4,r4) 959 1.1 mrg rts 960 1.1 mrg mov.l r2,@(8,r4) 961 1.1 mrg 962 1.1 mrg ENDFUNC(GLOBAL(movmemSI12_i4)) 963 1.1 mrg #endif 964 1.1 mrg 965 1.1 mrg #ifdef L_mulsi3 966 1.1 mrg 967 1.1 mrg 968 1.1 mrg .global GLOBAL(mulsi3) 969 1.1 mrg HIDDEN_FUNC(GLOBAL(mulsi3)) 970 1.1 mrg 971 1.1 mrg ! r4 = aabb 972 1.1 mrg ! r5 = ccdd 973 1.1 mrg ! r0 = aabb*ccdd via partial products 974 1.1 mrg ! 975 1.1 mrg ! if aa == 0 and cc = 0 976 1.1 mrg ! r0 = bb*dd 977 1.1 mrg ! 978 1.1 mrg ! else 979 1.1 mrg ! aa = bb*dd + (aa*dd*65536) + (cc*bb*65536) 980 1.1 mrg ! 981 1.1 mrg 982 1.1 mrg GLOBAL(mulsi3): 983 1.1 mrg mulu.w r4,r5 ! multiply the lsws macl=bb*dd 984 1.1 mrg mov r5,r3 ! r3 = ccdd 985 1.1 mrg swap.w r4,r2 ! r2 = bbaa 986 1.1 mrg xtrct r2,r3 ! r3 = aacc 987 1.1 mrg tst r3,r3 ! msws zero ? 988 1.1 mrg bf hiset 989 1.1 mrg rts ! yes - then we have the answer 990 1.1 mrg sts macl,r0 991 1.1 mrg 992 1.1 mrg hiset: sts macl,r0 ! r0 = bb*dd 993 1.1 mrg mulu.w r2,r5 ! brewing macl = aa*dd 994 1.1 mrg sts macl,r1 995 1.1 mrg mulu.w r3,r4 ! brewing macl = cc*bb 996 1.1 mrg sts macl,r2 997 1.1 mrg add r1,r2 998 1.1 mrg shll16 r2 999 1.1 mrg rts 1000 1.1 mrg add r2,r0 1001 1.1 mrg 1002 1.1 mrg ENDFUNC(GLOBAL(mulsi3)) 1003 1.1 mrg #endif 1004 1.3 mrg 1005 1.3 mrg /*------------------------------------------------------------------------------ 1006 1.3 mrg 32 bit signed integer division that uses FPU double precision division. */ 1007 1.3 mrg 1008 1.1 mrg #ifdef L_sdivsi3_i4 1009 1.1 mrg .title "SH DIVIDE" 1010 1.3 mrg 1011 1.1 mrg #if defined (__SH4__) || defined (__SH2A__) 1012 1.3 mrg /* This variant is used when FPSCR.PR = 1 (double precision) is the default 1013 1.3 mrg setting. 1014 1.3 mrg Args in r4 and r5, result in fpul, clobber dr0, dr2. */ 1015 1.1 mrg 1016 1.1 mrg .global GLOBAL(sdivsi3_i4) 1017 1.1 mrg HIDDEN_FUNC(GLOBAL(sdivsi3_i4)) 1018 1.1 mrg GLOBAL(sdivsi3_i4): 1019 1.1 mrg lds r4,fpul 1020 1.1 mrg float fpul,dr0 1021 1.1 mrg lds r5,fpul 1022 1.1 mrg float fpul,dr2 1023 1.1 mrg fdiv dr2,dr0 1024 1.1 mrg rts 1025 1.1 mrg ftrc dr0,fpul 1026 1.1 mrg 1027 1.1 mrg ENDFUNC(GLOBAL(sdivsi3_i4)) 1028 1.3 mrg 1029 1.6 mrg #elif defined (__SH2A_SINGLE__) || defined (__SH2A_SINGLE_ONLY__) || defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) 1030 1.3 mrg /* This variant is used when FPSCR.PR = 0 (sigle precision) is the default 1031 1.3 mrg setting. 1032 1.3 mrg Args in r4 and r5, result in fpul, clobber r2, dr0, dr2. 1033 1.3 mrg For this to work, we must temporarily switch the FPU do double precision, 1034 1.3 mrg but we better do not touch FPSCR.FR. See PR 6526. */ 1035 1.1 mrg 1036 1.1 mrg .global GLOBAL(sdivsi3_i4) 1037 1.1 mrg HIDDEN_FUNC(GLOBAL(sdivsi3_i4)) 1038 1.1 mrg GLOBAL(sdivsi3_i4): 1039 1.3 mrg 1040 1.3 mrg #ifndef __SH4A__ 1041 1.3 mrg mov.l r3,@-r15 1042 1.3 mrg sts fpscr,r2 1043 1.3 mrg mov #8,r3 1044 1.3 mrg swap.w r3,r3 // r3 = 1 << 19 (FPSCR.PR bit) 1045 1.3 mrg or r2,r3 1046 1.3 mrg lds r3,fpscr // Set FPSCR.PR = 1. 1047 1.3 mrg lds r4,fpul 1048 1.3 mrg float fpul,dr0 1049 1.3 mrg lds r5,fpul 1050 1.3 mrg float fpul,dr2 1051 1.3 mrg fdiv dr2,dr0 1052 1.3 mrg ftrc dr0,fpul 1053 1.3 mrg lds r2,fpscr 1054 1.3 mrg rts 1055 1.3 mrg mov.l @r15+,r3 1056 1.3 mrg #else 1057 1.3 mrg /* On SH4A we can use the fpchg instruction to flip the FPSCR.PR bit. */ 1058 1.3 mrg fpchg 1059 1.3 mrg lds r4,fpul 1060 1.3 mrg float fpul,dr0 1061 1.3 mrg lds r5,fpul 1062 1.3 mrg float fpul,dr2 1063 1.3 mrg fdiv dr2,dr0 1064 1.3 mrg ftrc dr0,fpul 1065 1.1 mrg rts 1066 1.3 mrg fpchg 1067 1.3 mrg 1068 1.3 mrg #endif /* __SH4A__ */ 1069 1.1 mrg 1070 1.1 mrg ENDFUNC(GLOBAL(sdivsi3_i4)) 1071 1.1 mrg #endif /* ! __SH4__ || __SH2A__ */ 1072 1.3 mrg #endif /* L_sdivsi3_i4 */ 1073 1.1 mrg 1074 1.3 mrg //------------------------------------------------------------------------------ 1075 1.1 mrg #ifdef L_sdivsi3 1076 1.1 mrg /* __SH4_SINGLE_ONLY__ keeps this part for link compatibility with 1077 1.1 mrg sh2e/sh3e code. */ 1078 1.1 mrg !! 1079 1.1 mrg !! Steve Chamberlain 1080 1.1 mrg !! sac@cygnus.com 1081 1.1 mrg !! 1082 1.1 mrg !! 1083 1.1 mrg 1084 1.1 mrg !! args in r4 and r5, result in r0 clobber r1, r2, r3, and t bit 1085 1.1 mrg 1086 1.1 mrg .global GLOBAL(sdivsi3) 1087 1.1 mrg .align 2 1088 1.6 mrg 1089 1.1 mrg FUNC(GLOBAL(sdivsi3)) 1090 1.1 mrg GLOBAL(sdivsi3): 1091 1.1 mrg mov r4,r1 1092 1.1 mrg mov r5,r0 1093 1.1 mrg 1094 1.1 mrg tst r0,r0 1095 1.1 mrg bt div0 1096 1.1 mrg mov #0,r2 1097 1.1 mrg div0s r2,r1 1098 1.1 mrg subc r3,r3 1099 1.1 mrg subc r2,r1 1100 1.1 mrg div0s r0,r3 1101 1.1 mrg rotcl r1 1102 1.1 mrg div1 r0,r3 1103 1.1 mrg rotcl r1 1104 1.1 mrg div1 r0,r3 1105 1.1 mrg rotcl r1 1106 1.1 mrg div1 r0,r3 1107 1.1 mrg rotcl r1 1108 1.1 mrg div1 r0,r3 1109 1.1 mrg rotcl r1 1110 1.1 mrg div1 r0,r3 1111 1.1 mrg rotcl r1 1112 1.1 mrg div1 r0,r3 1113 1.1 mrg rotcl r1 1114 1.1 mrg div1 r0,r3 1115 1.1 mrg rotcl r1 1116 1.1 mrg div1 r0,r3 1117 1.1 mrg rotcl r1 1118 1.1 mrg div1 r0,r3 1119 1.1 mrg rotcl r1 1120 1.1 mrg div1 r0,r3 1121 1.1 mrg rotcl r1 1122 1.1 mrg div1 r0,r3 1123 1.1 mrg rotcl r1 1124 1.1 mrg div1 r0,r3 1125 1.1 mrg rotcl r1 1126 1.1 mrg div1 r0,r3 1127 1.1 mrg rotcl r1 1128 1.1 mrg div1 r0,r3 1129 1.1 mrg rotcl r1 1130 1.1 mrg div1 r0,r3 1131 1.1 mrg rotcl r1 1132 1.1 mrg div1 r0,r3 1133 1.1 mrg rotcl r1 1134 1.1 mrg div1 r0,r3 1135 1.1 mrg rotcl r1 1136 1.1 mrg div1 r0,r3 1137 1.1 mrg rotcl r1 1138 1.1 mrg div1 r0,r3 1139 1.1 mrg rotcl r1 1140 1.1 mrg div1 r0,r3 1141 1.1 mrg rotcl r1 1142 1.1 mrg div1 r0,r3 1143 1.1 mrg rotcl r1 1144 1.1 mrg div1 r0,r3 1145 1.1 mrg rotcl r1 1146 1.1 mrg div1 r0,r3 1147 1.1 mrg rotcl r1 1148 1.1 mrg div1 r0,r3 1149 1.1 mrg rotcl r1 1150 1.1 mrg div1 r0,r3 1151 1.1 mrg rotcl r1 1152 1.1 mrg div1 r0,r3 1153 1.1 mrg rotcl r1 1154 1.1 mrg div1 r0,r3 1155 1.1 mrg rotcl r1 1156 1.1 mrg div1 r0,r3 1157 1.1 mrg rotcl r1 1158 1.1 mrg div1 r0,r3 1159 1.1 mrg rotcl r1 1160 1.1 mrg div1 r0,r3 1161 1.1 mrg rotcl r1 1162 1.1 mrg div1 r0,r3 1163 1.1 mrg rotcl r1 1164 1.1 mrg div1 r0,r3 1165 1.1 mrg rotcl r1 1166 1.1 mrg addc r2,r1 1167 1.1 mrg rts 1168 1.1 mrg mov r1,r0 1169 1.1 mrg 1170 1.1 mrg 1171 1.1 mrg div0: rts 1172 1.1 mrg mov #0,r0 1173 1.1 mrg 1174 1.1 mrg ENDFUNC(GLOBAL(sdivsi3)) 1175 1.3 mrg #endif /* L_sdivsi3 */ 1176 1.3 mrg 1177 1.3 mrg /*------------------------------------------------------------------------------ 1178 1.3 mrg 32 bit unsigned integer division that uses FPU double precision division. */ 1179 1.3 mrg 1180 1.1 mrg #ifdef L_udivsi3_i4 1181 1.3 mrg .title "SH DIVIDE" 1182 1.1 mrg 1183 1.1 mrg #if defined (__SH4__) || defined (__SH2A__) 1184 1.3 mrg /* This variant is used when FPSCR.PR = 1 (double precision) is the default 1185 1.3 mrg setting. 1186 1.3 mrg Args in r4 and r5, result in fpul, 1187 1.3 mrg clobber r0, r1, r4, r5, dr0, dr2, dr4, and t bit */ 1188 1.1 mrg 1189 1.1 mrg .global GLOBAL(udivsi3_i4) 1190 1.1 mrg HIDDEN_FUNC(GLOBAL(udivsi3_i4)) 1191 1.1 mrg GLOBAL(udivsi3_i4): 1192 1.3 mrg mov #1,r1 1193 1.3 mrg cmp/hi r1,r5 1194 1.3 mrg bf/s trivial 1195 1.3 mrg rotr r1 1196 1.3 mrg xor r1,r4 1197 1.3 mrg lds r4,fpul 1198 1.3 mrg mova L1,r0 1199 1.1 mrg #ifdef FMOVD_WORKS 1200 1.3 mrg fmov.d @r0+,dr4 1201 1.1 mrg #else 1202 1.3 mrg fmov.s @r0+,DR40 1203 1.3 mrg fmov.s @r0,DR41 1204 1.1 mrg #endif 1205 1.3 mrg float fpul,dr0 1206 1.3 mrg xor r1,r5 1207 1.3 mrg lds r5,fpul 1208 1.3 mrg float fpul,dr2 1209 1.3 mrg fadd dr4,dr0 1210 1.3 mrg fadd dr4,dr2 1211 1.3 mrg fdiv dr2,dr0 1212 1.1 mrg rts 1213 1.3 mrg ftrc dr0,fpul 1214 1.1 mrg 1215 1.1 mrg trivial: 1216 1.1 mrg rts 1217 1.3 mrg lds r4,fpul 1218 1.1 mrg 1219 1.1 mrg .align 2 1220 1.1 mrg #ifdef FMOVD_WORKS 1221 1.3 mrg .align 3 // Make the double below 8 byte aligned. 1222 1.1 mrg #endif 1223 1.1 mrg L1: 1224 1.1 mrg .double 2147483648 1225 1.1 mrg 1226 1.1 mrg ENDFUNC(GLOBAL(udivsi3_i4)) 1227 1.3 mrg 1228 1.1 mrg #elif defined (__SH2A_SINGLE__) || defined (__SH2A_SINGLE_ONLY__) || defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) 1229 1.3 mrg /* This variant is used when FPSCR.PR = 0 (sigle precision) is the default 1230 1.3 mrg setting. 1231 1.3 mrg Args in r4 and r5, result in fpul, 1232 1.3 mrg clobber r0, r1, r4, r5, dr0, dr2, dr4. 1233 1.3 mrg For this to work, we must temporarily switch the FPU do double precision, 1234 1.3 mrg but we better do not touch FPSCR.FR. See PR 6526. */ 1235 1.1 mrg 1236 1.1 mrg .global GLOBAL(udivsi3_i4) 1237 1.1 mrg HIDDEN_FUNC(GLOBAL(udivsi3_i4)) 1238 1.1 mrg GLOBAL(udivsi3_i4): 1239 1.3 mrg 1240 1.3 mrg #ifndef __SH4A__ 1241 1.3 mrg mov #1,r1 1242 1.3 mrg cmp/hi r1,r5 1243 1.3 mrg bf/s trivial 1244 1.3 mrg rotr r1 // r1 = 1 << 31 1245 1.3 mrg sts.l fpscr,@-r15 1246 1.3 mrg xor r1,r4 1247 1.3 mrg mov.l @(0,r15),r0 1248 1.3 mrg xor r1,r5 1249 1.3 mrg mov.l L2,r1 1250 1.3 mrg lds r4,fpul 1251 1.3 mrg or r0,r1 1252 1.3 mrg mova L1,r0 1253 1.3 mrg lds r1,fpscr 1254 1.1 mrg #ifdef FMOVD_WORKS 1255 1.3 mrg fmov.d @r0+,dr4 1256 1.1 mrg #else 1257 1.3 mrg fmov.s @r0+,DR40 1258 1.3 mrg fmov.s @r0,DR41 1259 1.1 mrg #endif 1260 1.3 mrg float fpul,dr0 1261 1.3 mrg lds r5,fpul 1262 1.3 mrg float fpul,dr2 1263 1.3 mrg fadd dr4,dr0 1264 1.3 mrg fadd dr4,dr2 1265 1.3 mrg fdiv dr2,dr0 1266 1.3 mrg ftrc dr0,fpul 1267 1.1 mrg rts 1268 1.3 mrg lds.l @r15+,fpscr 1269 1.1 mrg 1270 1.1 mrg #ifdef FMOVD_WORKS 1271 1.3 mrg .align 3 // Make the double below 8 byte aligned. 1272 1.1 mrg #endif 1273 1.1 mrg trivial: 1274 1.1 mrg rts 1275 1.3 mrg lds r4,fpul 1276 1.1 mrg 1277 1.1 mrg .align 2 1278 1.3 mrg L2: 1279 1.3 mrg #ifdef FMOVD_WORKS 1280 1.3 mrg .long 0x180000 // FPSCR.PR = 1, FPSCR.SZ = 1 1281 1.3 mrg #else 1282 1.3 mrg .long 0x80000 // FPSCR.PR = 1 1283 1.3 mrg #endif 1284 1.1 mrg L1: 1285 1.3 mrg .double 2147483648 1286 1.3 mrg 1287 1.1 mrg #else 1288 1.3 mrg /* On SH4A we can use the fpchg instruction to flip the FPSCR.PR bit. 1289 1.3 mrg Although on SH4A fmovd usually works, it would require either additional 1290 1.3 mrg two fschg instructions or an FPSCR push + pop. It's not worth the effort 1291 1.3 mrg for loading only one double constant. */ 1292 1.3 mrg mov #1,r1 1293 1.3 mrg cmp/hi r1,r5 1294 1.3 mrg bf/s trivial 1295 1.3 mrg rotr r1 // r1 = 1 << 31 1296 1.3 mrg fpchg 1297 1.3 mrg mova L1,r0 1298 1.3 mrg xor r1,r4 1299 1.3 mrg fmov.s @r0+,DR40 1300 1.3 mrg lds r4,fpul 1301 1.3 mrg fmov.s @r0,DR41 1302 1.3 mrg xor r1,r5 1303 1.3 mrg float fpul,dr0 1304 1.3 mrg lds r5,fpul 1305 1.3 mrg float fpul,dr2 1306 1.3 mrg fadd dr4,dr0 1307 1.3 mrg fadd dr4,dr2 1308 1.3 mrg fdiv dr2,dr0 1309 1.3 mrg ftrc dr0,fpul 1310 1.3 mrg rts 1311 1.3 mrg fpchg 1312 1.3 mrg 1313 1.3 mrg trivial: 1314 1.3 mrg rts 1315 1.3 mrg lds r4,fpul 1316 1.3 mrg 1317 1.3 mrg .align 2 1318 1.3 mrg L1: 1319 1.1 mrg .double 2147483648 1320 1.1 mrg 1321 1.3 mrg #endif /* __SH4A__ */ 1322 1.3 mrg 1323 1.3 mrg 1324 1.1 mrg ENDFUNC(GLOBAL(udivsi3_i4)) 1325 1.1 mrg #endif /* ! __SH4__ */ 1326 1.3 mrg #endif /* L_udivsi3_i4 */ 1327 1.1 mrg 1328 1.1 mrg #ifdef L_udivsi3 1329 1.1 mrg /* __SH4_SINGLE_ONLY__ keeps this part for link compatibility with 1330 1.1 mrg sh2e/sh3e code. */ 1331 1.1 mrg 1332 1.1 mrg !! args in r4 and r5, result in r0, clobbers r4, pr, and t bit 1333 1.1 mrg .global GLOBAL(udivsi3) 1334 1.1 mrg HIDDEN_FUNC(GLOBAL(udivsi3)) 1335 1.1 mrg 1336 1.1 mrg LOCAL(div8): 1337 1.1 mrg div1 r5,r4 1338 1.1 mrg LOCAL(div7): 1339 1.1 mrg div1 r5,r4; div1 r5,r4; div1 r5,r4 1340 1.1 mrg div1 r5,r4; div1 r5,r4; div1 r5,r4; rts; div1 r5,r4 1341 1.1 mrg 1342 1.1 mrg LOCAL(divx4): 1343 1.1 mrg div1 r5,r4; rotcl r0 1344 1.1 mrg div1 r5,r4; rotcl r0 1345 1.1 mrg div1 r5,r4; rotcl r0 1346 1.1 mrg rts; div1 r5,r4 1347 1.1 mrg 1348 1.1 mrg GLOBAL(udivsi3): 1349 1.1 mrg sts.l pr,@-r15 1350 1.1 mrg extu.w r5,r0 1351 1.1 mrg cmp/eq r5,r0 1352 1.1 mrg #ifdef __sh1__ 1353 1.1 mrg bf LOCAL(large_divisor) 1354 1.1 mrg #else 1355 1.1 mrg bf/s LOCAL(large_divisor) 1356 1.1 mrg #endif 1357 1.1 mrg div0u 1358 1.1 mrg swap.w r4,r0 1359 1.1 mrg shlr16 r4 1360 1.1 mrg bsr LOCAL(div8) 1361 1.1 mrg shll16 r5 1362 1.1 mrg bsr LOCAL(div7) 1363 1.1 mrg div1 r5,r4 1364 1.1 mrg xtrct r4,r0 1365 1.1 mrg xtrct r0,r4 1366 1.1 mrg bsr LOCAL(div8) 1367 1.1 mrg swap.w r4,r4 1368 1.1 mrg bsr LOCAL(div7) 1369 1.1 mrg div1 r5,r4 1370 1.1 mrg lds.l @r15+,pr 1371 1.1 mrg xtrct r4,r0 1372 1.1 mrg swap.w r0,r0 1373 1.1 mrg rotcl r0 1374 1.1 mrg rts 1375 1.1 mrg shlr16 r5 1376 1.1 mrg 1377 1.1 mrg LOCAL(large_divisor): 1378 1.1 mrg #ifdef __sh1__ 1379 1.1 mrg div0u 1380 1.1 mrg #endif 1381 1.1 mrg mov #0,r0 1382 1.1 mrg xtrct r4,r0 1383 1.1 mrg xtrct r0,r4 1384 1.1 mrg bsr LOCAL(divx4) 1385 1.1 mrg rotcl r0 1386 1.1 mrg bsr LOCAL(divx4) 1387 1.1 mrg rotcl r0 1388 1.1 mrg bsr LOCAL(divx4) 1389 1.1 mrg rotcl r0 1390 1.1 mrg bsr LOCAL(divx4) 1391 1.1 mrg rotcl r0 1392 1.1 mrg lds.l @r15+,pr 1393 1.1 mrg rts 1394 1.1 mrg rotcl r0 1395 1.1 mrg 1396 1.1 mrg ENDFUNC(GLOBAL(udivsi3)) 1397 1.1 mrg #endif /* L_udivsi3 */ 1398 1.1 mrg 1399 1.1 mrg #ifdef L_set_fpscr 1400 1.1 mrg #if !defined (__SH2A_NOFPU__) 1401 1.6 mrg #if defined (__SH2E__) || defined (__SH2A__) || defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) 1402 1.1 mrg .global GLOBAL(set_fpscr) 1403 1.1 mrg HIDDEN_FUNC(GLOBAL(set_fpscr)) 1404 1.1 mrg GLOBAL(set_fpscr): 1405 1.1 mrg lds r4,fpscr 1406 1.1 mrg #ifdef __PIC__ 1407 1.1 mrg mov.l r12,@-r15 1408 1.1 mrg #ifdef __vxworks 1409 1.1 mrg mov.l LOCAL(set_fpscr_L0_base),r12 1410 1.1 mrg mov.l LOCAL(set_fpscr_L0_index),r0 1411 1.1 mrg mov.l @r12,r12 1412 1.1 mrg mov.l @(r0,r12),r12 1413 1.1 mrg #else 1414 1.1 mrg mova LOCAL(set_fpscr_L0),r0 1415 1.1 mrg mov.l LOCAL(set_fpscr_L0),r12 1416 1.1 mrg add r0,r12 1417 1.1 mrg #endif 1418 1.1 mrg mov.l LOCAL(set_fpscr_L1),r0 1419 1.1 mrg mov.l @(r0,r12),r1 1420 1.1 mrg mov.l @r15+,r12 1421 1.1 mrg #else 1422 1.1 mrg mov.l LOCAL(set_fpscr_L1),r1 1423 1.1 mrg #endif 1424 1.1 mrg swap.w r4,r0 1425 1.1 mrg or #24,r0 1426 1.1 mrg #ifndef FMOVD_WORKS 1427 1.1 mrg xor #16,r0 1428 1.1 mrg #endif 1429 1.1 mrg #if defined(__SH4__) || defined (__SH2A_DOUBLE__) 1430 1.1 mrg swap.w r0,r3 1431 1.1 mrg mov.l r3,@(4,r1) 1432 1.1 mrg #else /* defined (__SH2E__) || defined(__SH3E__) || defined(__SH4_SINGLE*__) */ 1433 1.1 mrg swap.w r0,r2 1434 1.1 mrg mov.l r2,@r1 1435 1.1 mrg #endif 1436 1.1 mrg #ifndef FMOVD_WORKS 1437 1.1 mrg xor #8,r0 1438 1.1 mrg #else 1439 1.1 mrg xor #24,r0 1440 1.1 mrg #endif 1441 1.1 mrg #if defined(__SH4__) || defined (__SH2A_DOUBLE__) 1442 1.1 mrg swap.w r0,r2 1443 1.1 mrg rts 1444 1.1 mrg mov.l r2,@r1 1445 1.1 mrg #else /* defined(__SH2E__) || defined(__SH3E__) || defined(__SH4_SINGLE*__) */ 1446 1.1 mrg swap.w r0,r3 1447 1.1 mrg rts 1448 1.1 mrg mov.l r3,@(4,r1) 1449 1.1 mrg #endif 1450 1.1 mrg .align 2 1451 1.1 mrg #ifdef __PIC__ 1452 1.1 mrg #ifdef __vxworks 1453 1.1 mrg LOCAL(set_fpscr_L0_base): 1454 1.1 mrg .long ___GOTT_BASE__ 1455 1.1 mrg LOCAL(set_fpscr_L0_index): 1456 1.1 mrg .long ___GOTT_INDEX__ 1457 1.1 mrg #else 1458 1.1 mrg LOCAL(set_fpscr_L0): 1459 1.1 mrg .long _GLOBAL_OFFSET_TABLE_ 1460 1.1 mrg #endif 1461 1.1 mrg LOCAL(set_fpscr_L1): 1462 1.1 mrg .long GLOBAL(fpscr_values@GOT) 1463 1.1 mrg #else 1464 1.1 mrg LOCAL(set_fpscr_L1): 1465 1.1 mrg .long GLOBAL(fpscr_values) 1466 1.1 mrg #endif 1467 1.1 mrg 1468 1.1 mrg ENDFUNC(GLOBAL(set_fpscr)) 1469 1.1 mrg #ifndef NO_FPSCR_VALUES 1470 1.1 mrg #ifdef __ELF__ 1471 1.1 mrg .comm GLOBAL(fpscr_values),8,4 1472 1.1 mrg #else 1473 1.1 mrg .comm GLOBAL(fpscr_values),8 1474 1.1 mrg #endif /* ELF */ 1475 1.1 mrg #endif /* NO_FPSCR_VALUES */ 1476 1.1 mrg #endif /* SH2E / SH3E / SH4 */ 1477 1.1 mrg #endif /* __SH2A_NOFPU__ */ 1478 1.1 mrg #endif /* L_set_fpscr */ 1479 1.1 mrg #ifdef L_ic_invalidate 1480 1.6 mrg 1481 1.6 mrg #if defined(__SH4A__) 1482 1.1 mrg .global GLOBAL(ic_invalidate) 1483 1.1 mrg HIDDEN_FUNC(GLOBAL(ic_invalidate)) 1484 1.1 mrg GLOBAL(ic_invalidate): 1485 1.1 mrg ocbwb @r4 1486 1.1 mrg synco 1487 1.1 mrg icbi @r4 1488 1.1 mrg rts 1489 1.1 mrg nop 1490 1.1 mrg ENDFUNC(GLOBAL(ic_invalidate)) 1491 1.6 mrg #elif defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) || defined(__SH4_NOFPU__) 1492 1.1 mrg /* For system code, we use ic_invalidate_line_i, but user code 1493 1.1 mrg needs a different mechanism. A kernel call is generally not 1494 1.1 mrg available, and it would also be slow. Different SH4 variants use 1495 1.1 mrg different sizes and associativities of the Icache. We use a small 1496 1.1 mrg bit of dispatch code that can be put hidden in every shared object, 1497 1.1 mrg which calls the actual processor-specific invalidation code in a 1498 1.1 mrg separate module. 1499 1.1 mrg Or if you have operating system support, the OS could mmap the 1500 1.1 mrg procesor-specific code from a single page, since it is highly 1501 1.1 mrg repetitive. */ 1502 1.1 mrg .global GLOBAL(ic_invalidate) 1503 1.1 mrg HIDDEN_FUNC(GLOBAL(ic_invalidate)) 1504 1.1 mrg GLOBAL(ic_invalidate): 1505 1.1 mrg #ifdef __pic__ 1506 1.1 mrg #ifdef __vxworks 1507 1.1 mrg mov.l 1f,r1 1508 1.1 mrg mov.l 2f,r0 1509 1.1 mrg mov.l @r1,r1 1510 1.1 mrg mov.l 0f,r2 1511 1.1 mrg mov.l @(r0,r1),r0 1512 1.1 mrg #else 1513 1.1 mrg mov.l 1f,r1 1514 1.1 mrg mova 1f,r0 1515 1.1 mrg mov.l 0f,r2 1516 1.1 mrg add r1,r0 1517 1.1 mrg #endif 1518 1.1 mrg mov.l @(r0,r2),r1 1519 1.1 mrg #else 1520 1.1 mrg mov.l 0f,r1 1521 1.1 mrg #endif 1522 1.1 mrg ocbwb @r4 1523 1.1 mrg mov.l @(8,r1),r0 1524 1.1 mrg sub r1,r4 1525 1.1 mrg and r4,r0 1526 1.1 mrg add r1,r0 1527 1.1 mrg jmp @r0 1528 1.1 mrg mov.l @(4,r1),r0 1529 1.1 mrg .align 2 1530 1.1 mrg #ifndef __pic__ 1531 1.1 mrg 0: .long GLOBAL(ic_invalidate_array) 1532 1.1 mrg #else /* __pic__ */ 1533 1.1 mrg .global GLOBAL(ic_invalidate_array) 1534 1.1 mrg 0: .long GLOBAL(ic_invalidate_array)@GOT 1535 1.1 mrg #ifdef __vxworks 1536 1.1 mrg 1: .long ___GOTT_BASE__ 1537 1.1 mrg 2: .long ___GOTT_INDEX__ 1538 1.1 mrg #else 1539 1.1 mrg 1: .long _GLOBAL_OFFSET_TABLE_ 1540 1.1 mrg #endif 1541 1.1 mrg ENDFUNC(GLOBAL(ic_invalidate)) 1542 1.1 mrg #endif /* __pic__ */ 1543 1.1 mrg #endif /* SH4 */ 1544 1.1 mrg #endif /* L_ic_invalidate */ 1545 1.1 mrg 1546 1.1 mrg #ifdef L_ic_invalidate_array 1547 1.6 mrg #if defined(__SH4A__) || (defined (__FORCE_SH4A__) && (defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) || defined(__SH4_NOFPU__))) 1548 1.1 mrg .global GLOBAL(ic_invalidate_array) 1549 1.1 mrg /* This is needed when an SH4 dso with trampolines is used on SH4A. */ 1550 1.1 mrg .global GLOBAL(ic_invalidate_array) 1551 1.1 mrg FUNC(GLOBAL(ic_invalidate_array)) 1552 1.1 mrg GLOBAL(ic_invalidate_array): 1553 1.1 mrg add r1,r4 1554 1.1 mrg synco 1555 1.1 mrg icbi @r4 1556 1.1 mrg rts 1557 1.1 mrg nop 1558 1.1 mrg .align 2 1559 1.1 mrg .long 0 1560 1.1 mrg ENDFUNC(GLOBAL(ic_invalidate_array)) 1561 1.6 mrg #elif defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) || defined(__SH4_NOFPU__) 1562 1.1 mrg .global GLOBAL(ic_invalidate_array) 1563 1.1 mrg .p2align 5 1564 1.1 mrg FUNC(GLOBAL(ic_invalidate_array)) 1565 1.1 mrg /* This must be aligned to the beginning of a cache line. */ 1566 1.1 mrg GLOBAL(ic_invalidate_array): 1567 1.1 mrg #ifndef WAYS 1568 1.1 mrg #define WAYS 4 1569 1.1 mrg #define WAY_SIZE 0x4000 1570 1.1 mrg #endif 1571 1.1 mrg #if WAYS == 1 1572 1.1 mrg .rept WAY_SIZE * WAYS / 32 1573 1.1 mrg rts 1574 1.1 mrg nop 1575 1.1 mrg .rept 7 1576 1.1 mrg .long WAY_SIZE - 32 1577 1.1 mrg .endr 1578 1.1 mrg .endr 1579 1.1 mrg #elif WAYS <= 6 1580 1.1 mrg .rept WAY_SIZE * WAYS / 32 1581 1.1 mrg braf r0 1582 1.1 mrg add #-8,r0 1583 1.1 mrg .long WAY_SIZE + 8 1584 1.1 mrg .long WAY_SIZE - 32 1585 1.1 mrg .rept WAYS-2 1586 1.1 mrg braf r0 1587 1.1 mrg nop 1588 1.1 mrg .endr 1589 1.1 mrg .rept 7 - WAYS 1590 1.1 mrg rts 1591 1.1 mrg nop 1592 1.1 mrg .endr 1593 1.1 mrg .endr 1594 1.1 mrg #else /* WAYS > 6 */ 1595 1.1 mrg /* This variant needs two different pages for mmap-ing. */ 1596 1.1 mrg .rept WAYS-1 1597 1.1 mrg .rept WAY_SIZE / 32 1598 1.1 mrg braf r0 1599 1.1 mrg nop 1600 1.1 mrg .long WAY_SIZE 1601 1.1 mrg .rept 6 1602 1.1 mrg .long WAY_SIZE - 32 1603 1.1 mrg .endr 1604 1.1 mrg .endr 1605 1.1 mrg .endr 1606 1.1 mrg .rept WAY_SIZE / 32 1607 1.1 mrg rts 1608 1.1 mrg .rept 15 1609 1.1 mrg nop 1610 1.1 mrg .endr 1611 1.1 mrg .endr 1612 1.1 mrg #endif /* WAYS */ 1613 1.1 mrg ENDFUNC(GLOBAL(ic_invalidate_array)) 1614 1.1 mrg #endif /* SH4 */ 1615 1.1 mrg #endif /* L_ic_invalidate_array */ 1616 1.1 mrg 1617 1.1 mrg 1618 1.1 mrg #ifdef L_div_table 1619 1.1 mrg 1620 1.6 mrg #if defined (__SH2A__) || defined (__SH3__) || defined (__SH3E__) || defined (__SH4__) || defined (__SH4_SINGLE__) || defined (__SH4_SINGLE_ONLY__) || defined (__SH4_NOFPU__) 1621 1.1 mrg /* This code uses shld, thus is not suitable for SH1 / SH2. */ 1622 1.1 mrg 1623 1.1 mrg /* Signed / unsigned division without use of FPU, optimized for SH4. 1624 1.1 mrg Uses a lookup table for divisors in the range -128 .. +128, and 1625 1.1 mrg div1 with case distinction for larger divisors in three more ranges. 1626 1.1 mrg The code is lumped together with the table to allow the use of mova. */ 1627 1.1 mrg #ifdef __LITTLE_ENDIAN__ 1628 1.1 mrg #define L_LSB 0 1629 1.1 mrg #define L_LSWMSB 1 1630 1.1 mrg #define L_MSWLSB 2 1631 1.1 mrg #else 1632 1.1 mrg #define L_LSB 3 1633 1.1 mrg #define L_LSWMSB 2 1634 1.1 mrg #define L_MSWLSB 1 1635 1.1 mrg #endif 1636 1.1 mrg 1637 1.1 mrg .balign 4 1638 1.1 mrg .global GLOBAL(udivsi3_i4i) 1639 1.1 mrg FUNC(GLOBAL(udivsi3_i4i)) 1640 1.1 mrg GLOBAL(udivsi3_i4i): 1641 1.1 mrg mov.w LOCAL(c128_w), r1 1642 1.1 mrg div0u 1643 1.1 mrg mov r4,r0 1644 1.1 mrg shlr8 r0 1645 1.1 mrg cmp/hi r1,r5 1646 1.1 mrg extu.w r5,r1 1647 1.1 mrg bf LOCAL(udiv_le128) 1648 1.1 mrg cmp/eq r5,r1 1649 1.1 mrg bf LOCAL(udiv_ge64k) 1650 1.1 mrg shlr r0 1651 1.1 mrg mov r5,r1 1652 1.1 mrg shll16 r5 1653 1.1 mrg mov.l r4,@-r15 1654 1.1 mrg div1 r5,r0 1655 1.1 mrg mov.l r1,@-r15 1656 1.1 mrg div1 r5,r0 1657 1.1 mrg div1 r5,r0 1658 1.1 mrg bra LOCAL(udiv_25) 1659 1.1 mrg div1 r5,r0 1660 1.1 mrg 1661 1.1 mrg LOCAL(div_le128): 1662 1.1 mrg mova LOCAL(div_table_ix),r0 1663 1.1 mrg bra LOCAL(div_le128_2) 1664 1.1 mrg mov.b @(r0,r5),r1 1665 1.1 mrg LOCAL(udiv_le128): 1666 1.1 mrg mov.l r4,@-r15 1667 1.1 mrg mova LOCAL(div_table_ix),r0 1668 1.1 mrg mov.b @(r0,r5),r1 1669 1.1 mrg mov.l r5,@-r15 1670 1.1 mrg LOCAL(div_le128_2): 1671 1.1 mrg mova LOCAL(div_table_inv),r0 1672 1.1 mrg mov.l @(r0,r1),r1 1673 1.1 mrg mov r5,r0 1674 1.1 mrg tst #0xfe,r0 1675 1.1 mrg mova LOCAL(div_table_clz),r0 1676 1.1 mrg dmulu.l r1,r4 1677 1.1 mrg mov.b @(r0,r5),r1 1678 1.1 mrg bt/s LOCAL(div_by_1) 1679 1.1 mrg mov r4,r0 1680 1.1 mrg mov.l @r15+,r5 1681 1.1 mrg sts mach,r0 1682 1.1 mrg /* clrt */ 1683 1.1 mrg addc r4,r0 1684 1.1 mrg mov.l @r15+,r4 1685 1.1 mrg rotcr r0 1686 1.1 mrg rts 1687 1.1 mrg shld r1,r0 1688 1.1 mrg 1689 1.1 mrg LOCAL(div_by_1_neg): 1690 1.1 mrg neg r4,r0 1691 1.1 mrg LOCAL(div_by_1): 1692 1.1 mrg mov.l @r15+,r5 1693 1.1 mrg rts 1694 1.1 mrg mov.l @r15+,r4 1695 1.1 mrg 1696 1.1 mrg LOCAL(div_ge64k): 1697 1.1 mrg bt/s LOCAL(div_r8) 1698 1.1 mrg div0u 1699 1.1 mrg shll8 r5 1700 1.1 mrg bra LOCAL(div_ge64k_2) 1701 1.1 mrg div1 r5,r0 1702 1.1 mrg LOCAL(udiv_ge64k): 1703 1.1 mrg cmp/hi r0,r5 1704 1.1 mrg mov r5,r1 1705 1.1 mrg bt LOCAL(udiv_r8) 1706 1.1 mrg shll8 r5 1707 1.1 mrg mov.l r4,@-r15 1708 1.1 mrg div1 r5,r0 1709 1.1 mrg mov.l r1,@-r15 1710 1.1 mrg LOCAL(div_ge64k_2): 1711 1.1 mrg div1 r5,r0 1712 1.1 mrg mov.l LOCAL(zero_l),r1 1713 1.1 mrg .rept 4 1714 1.1 mrg div1 r5,r0 1715 1.1 mrg .endr 1716 1.1 mrg mov.l r1,@-r15 1717 1.1 mrg div1 r5,r0 1718 1.1 mrg mov.w LOCAL(m256_w),r1 1719 1.1 mrg div1 r5,r0 1720 1.1 mrg mov.b r0,@(L_LSWMSB,r15) 1721 1.1 mrg xor r4,r0 1722 1.1 mrg and r1,r0 1723 1.1 mrg bra LOCAL(div_ge64k_end) 1724 1.1 mrg xor r4,r0 1725 1.1 mrg 1726 1.1 mrg LOCAL(div_r8): 1727 1.1 mrg shll16 r4 1728 1.1 mrg bra LOCAL(div_r8_2) 1729 1.1 mrg shll8 r4 1730 1.1 mrg LOCAL(udiv_r8): 1731 1.1 mrg mov.l r4,@-r15 1732 1.1 mrg shll16 r4 1733 1.1 mrg clrt 1734 1.1 mrg shll8 r4 1735 1.1 mrg mov.l r5,@-r15 1736 1.1 mrg LOCAL(div_r8_2): 1737 1.1 mrg rotcl r4 1738 1.1 mrg mov r0,r1 1739 1.1 mrg div1 r5,r1 1740 1.1 mrg mov r4,r0 1741 1.1 mrg rotcl r0 1742 1.1 mrg mov r5,r4 1743 1.1 mrg div1 r5,r1 1744 1.1 mrg .rept 5 1745 1.1 mrg rotcl r0; div1 r5,r1 1746 1.1 mrg .endr 1747 1.1 mrg rotcl r0 1748 1.1 mrg mov.l @r15+,r5 1749 1.1 mrg div1 r4,r1 1750 1.1 mrg mov.l @r15+,r4 1751 1.1 mrg rts 1752 1.1 mrg rotcl r0 1753 1.1 mrg 1754 1.1 mrg ENDFUNC(GLOBAL(udivsi3_i4i)) 1755 1.1 mrg 1756 1.1 mrg .global GLOBAL(sdivsi3_i4i) 1757 1.1 mrg FUNC(GLOBAL(sdivsi3_i4i)) 1758 1.1 mrg /* This is link-compatible with a GLOBAL(sdivsi3) call, 1759 1.1 mrg but we effectively clobber only r1. */ 1760 1.1 mrg GLOBAL(sdivsi3_i4i): 1761 1.1 mrg mov.l r4,@-r15 1762 1.1 mrg cmp/pz r5 1763 1.1 mrg mov.w LOCAL(c128_w), r1 1764 1.1 mrg bt/s LOCAL(pos_divisor) 1765 1.1 mrg cmp/pz r4 1766 1.1 mrg mov.l r5,@-r15 1767 1.1 mrg neg r5,r5 1768 1.1 mrg bt/s LOCAL(neg_result) 1769 1.1 mrg cmp/hi r1,r5 1770 1.1 mrg neg r4,r4 1771 1.1 mrg LOCAL(pos_result): 1772 1.1 mrg extu.w r5,r0 1773 1.1 mrg bf LOCAL(div_le128) 1774 1.1 mrg cmp/eq r5,r0 1775 1.1 mrg mov r4,r0 1776 1.1 mrg shlr8 r0 1777 1.1 mrg bf/s LOCAL(div_ge64k) 1778 1.1 mrg cmp/hi r0,r5 1779 1.1 mrg div0u 1780 1.1 mrg shll16 r5 1781 1.1 mrg div1 r5,r0 1782 1.1 mrg div1 r5,r0 1783 1.1 mrg div1 r5,r0 1784 1.1 mrg LOCAL(udiv_25): 1785 1.1 mrg mov.l LOCAL(zero_l),r1 1786 1.1 mrg div1 r5,r0 1787 1.1 mrg div1 r5,r0 1788 1.1 mrg mov.l r1,@-r15 1789 1.1 mrg .rept 3 1790 1.1 mrg div1 r5,r0 1791 1.1 mrg .endr 1792 1.1 mrg mov.b r0,@(L_MSWLSB,r15) 1793 1.1 mrg xtrct r4,r0 1794 1.1 mrg swap.w r0,r0 1795 1.1 mrg .rept 8 1796 1.1 mrg div1 r5,r0 1797 1.1 mrg .endr 1798 1.1 mrg mov.b r0,@(L_LSWMSB,r15) 1799 1.1 mrg LOCAL(div_ge64k_end): 1800 1.1 mrg .rept 8 1801 1.1 mrg div1 r5,r0 1802 1.1 mrg .endr 1803 1.1 mrg mov.l @r15+,r4 ! zero-extension and swap using LS unit. 1804 1.1 mrg extu.b r0,r0 1805 1.1 mrg mov.l @r15+,r5 1806 1.1 mrg or r4,r0 1807 1.1 mrg mov.l @r15+,r4 1808 1.1 mrg rts 1809 1.1 mrg rotcl r0 1810 1.1 mrg 1811 1.1 mrg LOCAL(div_le128_neg): 1812 1.1 mrg tst #0xfe,r0 1813 1.1 mrg mova LOCAL(div_table_ix),r0 1814 1.1 mrg mov.b @(r0,r5),r1 1815 1.1 mrg mova LOCAL(div_table_inv),r0 1816 1.1 mrg bt/s LOCAL(div_by_1_neg) 1817 1.1 mrg mov.l @(r0,r1),r1 1818 1.1 mrg mova LOCAL(div_table_clz),r0 1819 1.1 mrg dmulu.l r1,r4 1820 1.1 mrg mov.b @(r0,r5),r1 1821 1.1 mrg mov.l @r15+,r5 1822 1.1 mrg sts mach,r0 1823 1.1 mrg /* clrt */ 1824 1.1 mrg addc r4,r0 1825 1.1 mrg mov.l @r15+,r4 1826 1.1 mrg rotcr r0 1827 1.1 mrg shld r1,r0 1828 1.1 mrg rts 1829 1.1 mrg neg r0,r0 1830 1.1 mrg 1831 1.1 mrg LOCAL(pos_divisor): 1832 1.1 mrg mov.l r5,@-r15 1833 1.1 mrg bt/s LOCAL(pos_result) 1834 1.1 mrg cmp/hi r1,r5 1835 1.1 mrg neg r4,r4 1836 1.1 mrg LOCAL(neg_result): 1837 1.1 mrg extu.w r5,r0 1838 1.1 mrg bf LOCAL(div_le128_neg) 1839 1.1 mrg cmp/eq r5,r0 1840 1.1 mrg mov r4,r0 1841 1.1 mrg shlr8 r0 1842 1.1 mrg bf/s LOCAL(div_ge64k_neg) 1843 1.1 mrg cmp/hi r0,r5 1844 1.1 mrg div0u 1845 1.1 mrg mov.l LOCAL(zero_l),r1 1846 1.1 mrg shll16 r5 1847 1.1 mrg div1 r5,r0 1848 1.1 mrg mov.l r1,@-r15 1849 1.1 mrg .rept 7 1850 1.1 mrg div1 r5,r0 1851 1.1 mrg .endr 1852 1.1 mrg mov.b r0,@(L_MSWLSB,r15) 1853 1.1 mrg xtrct r4,r0 1854 1.1 mrg swap.w r0,r0 1855 1.1 mrg .rept 8 1856 1.1 mrg div1 r5,r0 1857 1.1 mrg .endr 1858 1.1 mrg mov.b r0,@(L_LSWMSB,r15) 1859 1.1 mrg LOCAL(div_ge64k_neg_end): 1860 1.1 mrg .rept 8 1861 1.1 mrg div1 r5,r0 1862 1.1 mrg .endr 1863 1.1 mrg mov.l @r15+,r4 ! zero-extension and swap using LS unit. 1864 1.1 mrg extu.b r0,r1 1865 1.1 mrg mov.l @r15+,r5 1866 1.1 mrg or r4,r1 1867 1.1 mrg LOCAL(div_r8_neg_end): 1868 1.1 mrg mov.l @r15+,r4 1869 1.1 mrg rotcl r1 1870 1.1 mrg rts 1871 1.1 mrg neg r1,r0 1872 1.1 mrg 1873 1.1 mrg LOCAL(div_ge64k_neg): 1874 1.1 mrg bt/s LOCAL(div_r8_neg) 1875 1.1 mrg div0u 1876 1.1 mrg shll8 r5 1877 1.1 mrg mov.l LOCAL(zero_l),r1 1878 1.1 mrg .rept 6 1879 1.1 mrg div1 r5,r0 1880 1.1 mrg .endr 1881 1.1 mrg mov.l r1,@-r15 1882 1.1 mrg div1 r5,r0 1883 1.1 mrg mov.w LOCAL(m256_w),r1 1884 1.1 mrg div1 r5,r0 1885 1.1 mrg mov.b r0,@(L_LSWMSB,r15) 1886 1.1 mrg xor r4,r0 1887 1.1 mrg and r1,r0 1888 1.1 mrg bra LOCAL(div_ge64k_neg_end) 1889 1.1 mrg xor r4,r0 1890 1.1 mrg 1891 1.1 mrg LOCAL(c128_w): 1892 1.1 mrg .word 128 1893 1.1 mrg 1894 1.1 mrg LOCAL(div_r8_neg): 1895 1.1 mrg clrt 1896 1.1 mrg shll16 r4 1897 1.1 mrg mov r4,r1 1898 1.1 mrg shll8 r1 1899 1.1 mrg mov r5,r4 1900 1.1 mrg .rept 7 1901 1.1 mrg rotcl r1; div1 r5,r0 1902 1.1 mrg .endr 1903 1.1 mrg mov.l @r15+,r5 1904 1.1 mrg rotcl r1 1905 1.1 mrg bra LOCAL(div_r8_neg_end) 1906 1.1 mrg div1 r4,r0 1907 1.1 mrg 1908 1.1 mrg LOCAL(m256_w): 1909 1.1 mrg .word 0xff00 1910 1.1 mrg /* This table has been generated by divtab-sh4.c. */ 1911 1.1 mrg .balign 4 1912 1.1 mrg LOCAL(div_table_clz): 1913 1.1 mrg .byte 0 1914 1.1 mrg .byte 1 1915 1.1 mrg .byte 0 1916 1.1 mrg .byte -1 1917 1.1 mrg .byte -1 1918 1.1 mrg .byte -2 1919 1.1 mrg .byte -2 1920 1.1 mrg .byte -2 1921 1.1 mrg .byte -2 1922 1.1 mrg .byte -3 1923 1.1 mrg .byte -3 1924 1.1 mrg .byte -3 1925 1.1 mrg .byte -3 1926 1.1 mrg .byte -3 1927 1.1 mrg .byte -3 1928 1.1 mrg .byte -3 1929 1.1 mrg .byte -3 1930 1.1 mrg .byte -4 1931 1.1 mrg .byte -4 1932 1.1 mrg .byte -4 1933 1.1 mrg .byte -4 1934 1.1 mrg .byte -4 1935 1.1 mrg .byte -4 1936 1.1 mrg .byte -4 1937 1.1 mrg .byte -4 1938 1.1 mrg .byte -4 1939 1.1 mrg .byte -4 1940 1.1 mrg .byte -4 1941 1.1 mrg .byte -4 1942 1.1 mrg .byte -4 1943 1.1 mrg .byte -4 1944 1.1 mrg .byte -4 1945 1.1 mrg .byte -4 1946 1.1 mrg .byte -5 1947 1.1 mrg .byte -5 1948 1.1 mrg .byte -5 1949 1.1 mrg .byte -5 1950 1.1 mrg .byte -5 1951 1.1 mrg .byte -5 1952 1.1 mrg .byte -5 1953 1.1 mrg .byte -5 1954 1.1 mrg .byte -5 1955 1.1 mrg .byte -5 1956 1.1 mrg .byte -5 1957 1.1 mrg .byte -5 1958 1.1 mrg .byte -5 1959 1.1 mrg .byte -5 1960 1.1 mrg .byte -5 1961 1.1 mrg .byte -5 1962 1.1 mrg .byte -5 1963 1.1 mrg .byte -5 1964 1.1 mrg .byte -5 1965 1.1 mrg .byte -5 1966 1.1 mrg .byte -5 1967 1.1 mrg .byte -5 1968 1.1 mrg .byte -5 1969 1.1 mrg .byte -5 1970 1.1 mrg .byte -5 1971 1.1 mrg .byte -5 1972 1.1 mrg .byte -5 1973 1.1 mrg .byte -5 1974 1.1 mrg .byte -5 1975 1.1 mrg .byte -5 1976 1.1 mrg .byte -5 1977 1.1 mrg .byte -5 1978 1.1 mrg .byte -6 1979 1.1 mrg .byte -6 1980 1.1 mrg .byte -6 1981 1.1 mrg .byte -6 1982 1.1 mrg .byte -6 1983 1.1 mrg .byte -6 1984 1.1 mrg .byte -6 1985 1.1 mrg .byte -6 1986 1.1 mrg .byte -6 1987 1.1 mrg .byte -6 1988 1.1 mrg .byte -6 1989 1.1 mrg .byte -6 1990 1.1 mrg .byte -6 1991 1.1 mrg .byte -6 1992 1.1 mrg .byte -6 1993 1.1 mrg .byte -6 1994 1.1 mrg .byte -6 1995 1.1 mrg .byte -6 1996 1.1 mrg .byte -6 1997 1.1 mrg .byte -6 1998 1.1 mrg .byte -6 1999 1.1 mrg .byte -6 2000 1.1 mrg .byte -6 2001 1.1 mrg .byte -6 2002 1.1 mrg .byte -6 2003 1.1 mrg .byte -6 2004 1.1 mrg .byte -6 2005 1.1 mrg .byte -6 2006 1.1 mrg .byte -6 2007 1.1 mrg .byte -6 2008 1.1 mrg .byte -6 2009 1.1 mrg .byte -6 2010 1.1 mrg .byte -6 2011 1.1 mrg .byte -6 2012 1.1 mrg .byte -6 2013 1.1 mrg .byte -6 2014 1.1 mrg .byte -6 2015 1.1 mrg .byte -6 2016 1.1 mrg .byte -6 2017 1.1 mrg .byte -6 2018 1.1 mrg .byte -6 2019 1.1 mrg .byte -6 2020 1.1 mrg .byte -6 2021 1.1 mrg .byte -6 2022 1.1 mrg .byte -6 2023 1.1 mrg .byte -6 2024 1.1 mrg .byte -6 2025 1.1 mrg .byte -6 2026 1.1 mrg .byte -6 2027 1.1 mrg .byte -6 2028 1.1 mrg .byte -6 2029 1.1 mrg .byte -6 2030 1.1 mrg .byte -6 2031 1.1 mrg .byte -6 2032 1.1 mrg .byte -6 2033 1.1 mrg .byte -6 2034 1.1 mrg .byte -6 2035 1.1 mrg .byte -6 2036 1.1 mrg .byte -6 2037 1.1 mrg .byte -6 2038 1.1 mrg .byte -6 2039 1.1 mrg .byte -6 2040 1.1 mrg .byte -6 2041 1.1 mrg /* Lookup table translating positive divisor to index into table of 2042 1.1 mrg normalized inverse. N.B. the '0' entry is also the last entry of the 2043 1.1 mrg previous table, and causes an unaligned access for division by zero. */ 2044 1.1 mrg LOCAL(div_table_ix): 2045 1.1 mrg .byte -6 2046 1.1 mrg .byte -128 2047 1.1 mrg .byte -128 2048 1.1 mrg .byte 0 2049 1.1 mrg .byte -128 2050 1.1 mrg .byte -64 2051 1.1 mrg .byte 0 2052 1.1 mrg .byte 64 2053 1.1 mrg .byte -128 2054 1.1 mrg .byte -96 2055 1.1 mrg .byte -64 2056 1.1 mrg .byte -32 2057 1.1 mrg .byte 0 2058 1.1 mrg .byte 32 2059 1.1 mrg .byte 64 2060 1.1 mrg .byte 96 2061 1.1 mrg .byte -128 2062 1.1 mrg .byte -112 2063 1.1 mrg .byte -96 2064 1.1 mrg .byte -80 2065 1.1 mrg .byte -64 2066 1.1 mrg .byte -48 2067 1.1 mrg .byte -32 2068 1.1 mrg .byte -16 2069 1.1 mrg .byte 0 2070 1.1 mrg .byte 16 2071 1.1 mrg .byte 32 2072 1.1 mrg .byte 48 2073 1.1 mrg .byte 64 2074 1.1 mrg .byte 80 2075 1.1 mrg .byte 96 2076 1.1 mrg .byte 112 2077 1.1 mrg .byte -128 2078 1.1 mrg .byte -120 2079 1.1 mrg .byte -112 2080 1.1 mrg .byte -104 2081 1.1 mrg .byte -96 2082 1.1 mrg .byte -88 2083 1.1 mrg .byte -80 2084 1.1 mrg .byte -72 2085 1.1 mrg .byte -64 2086 1.1 mrg .byte -56 2087 1.1 mrg .byte -48 2088 1.1 mrg .byte -40 2089 1.1 mrg .byte -32 2090 1.1 mrg .byte -24 2091 1.1 mrg .byte -16 2092 1.1 mrg .byte -8 2093 1.1 mrg .byte 0 2094 1.1 mrg .byte 8 2095 1.1 mrg .byte 16 2096 1.1 mrg .byte 24 2097 1.1 mrg .byte 32 2098 1.1 mrg .byte 40 2099 1.1 mrg .byte 48 2100 1.1 mrg .byte 56 2101 1.1 mrg .byte 64 2102 1.1 mrg .byte 72 2103 1.1 mrg .byte 80 2104 1.1 mrg .byte 88 2105 1.1 mrg .byte 96 2106 1.1 mrg .byte 104 2107 1.1 mrg .byte 112 2108 1.1 mrg .byte 120 2109 1.1 mrg .byte -128 2110 1.1 mrg .byte -124 2111 1.1 mrg .byte -120 2112 1.1 mrg .byte -116 2113 1.1 mrg .byte -112 2114 1.1 mrg .byte -108 2115 1.1 mrg .byte -104 2116 1.1 mrg .byte -100 2117 1.1 mrg .byte -96 2118 1.1 mrg .byte -92 2119 1.1 mrg .byte -88 2120 1.1 mrg .byte -84 2121 1.1 mrg .byte -80 2122 1.1 mrg .byte -76 2123 1.1 mrg .byte -72 2124 1.1 mrg .byte -68 2125 1.1 mrg .byte -64 2126 1.1 mrg .byte -60 2127 1.1 mrg .byte -56 2128 1.1 mrg .byte -52 2129 1.1 mrg .byte -48 2130 1.1 mrg .byte -44 2131 1.1 mrg .byte -40 2132 1.1 mrg .byte -36 2133 1.1 mrg .byte -32 2134 1.1 mrg .byte -28 2135 1.1 mrg .byte -24 2136 1.1 mrg .byte -20 2137 1.1 mrg .byte -16 2138 1.1 mrg .byte -12 2139 1.1 mrg .byte -8 2140 1.1 mrg .byte -4 2141 1.1 mrg .byte 0 2142 1.1 mrg .byte 4 2143 1.1 mrg .byte 8 2144 1.1 mrg .byte 12 2145 1.1 mrg .byte 16 2146 1.1 mrg .byte 20 2147 1.1 mrg .byte 24 2148 1.1 mrg .byte 28 2149 1.1 mrg .byte 32 2150 1.1 mrg .byte 36 2151 1.1 mrg .byte 40 2152 1.1 mrg .byte 44 2153 1.1 mrg .byte 48 2154 1.1 mrg .byte 52 2155 1.1 mrg .byte 56 2156 1.1 mrg .byte 60 2157 1.1 mrg .byte 64 2158 1.1 mrg .byte 68 2159 1.1 mrg .byte 72 2160 1.1 mrg .byte 76 2161 1.1 mrg .byte 80 2162 1.1 mrg .byte 84 2163 1.1 mrg .byte 88 2164 1.1 mrg .byte 92 2165 1.1 mrg .byte 96 2166 1.1 mrg .byte 100 2167 1.1 mrg .byte 104 2168 1.1 mrg .byte 108 2169 1.1 mrg .byte 112 2170 1.1 mrg .byte 116 2171 1.1 mrg .byte 120 2172 1.1 mrg .byte 124 2173 1.1 mrg .byte -128 2174 1.1 mrg /* 1/64 .. 1/127, normalized. There is an implicit leading 1 in bit 32. */ 2175 1.1 mrg .balign 4 2176 1.1 mrg LOCAL(zero_l): 2177 1.1 mrg .long 0x0 2178 1.1 mrg .long 0xF81F81F9 2179 1.1 mrg .long 0xF07C1F08 2180 1.1 mrg .long 0xE9131AC0 2181 1.1 mrg .long 0xE1E1E1E2 2182 1.1 mrg .long 0xDAE6076C 2183 1.1 mrg .long 0xD41D41D5 2184 1.1 mrg .long 0xCD856891 2185 1.1 mrg .long 0xC71C71C8 2186 1.1 mrg .long 0xC0E07039 2187 1.1 mrg .long 0xBACF914D 2188 1.1 mrg .long 0xB4E81B4F 2189 1.1 mrg .long 0xAF286BCB 2190 1.1 mrg .long 0xA98EF607 2191 1.1 mrg .long 0xA41A41A5 2192 1.1 mrg .long 0x9EC8E952 2193 1.1 mrg .long 0x9999999A 2194 1.1 mrg .long 0x948B0FCE 2195 1.1 mrg .long 0x8F9C18FA 2196 1.1 mrg .long 0x8ACB90F7 2197 1.1 mrg .long 0x86186187 2198 1.1 mrg .long 0x81818182 2199 1.1 mrg .long 0x7D05F418 2200 1.1 mrg .long 0x78A4C818 2201 1.1 mrg .long 0x745D1746 2202 1.1 mrg .long 0x702E05C1 2203 1.1 mrg .long 0x6C16C16D 2204 1.1 mrg .long 0x68168169 2205 1.1 mrg .long 0x642C8591 2206 1.1 mrg .long 0x60581606 2207 1.1 mrg .long 0x5C9882BA 2208 1.1 mrg .long 0x58ED2309 2209 1.1 mrg LOCAL(div_table_inv): 2210 1.1 mrg .long 0x55555556 2211 1.1 mrg .long 0x51D07EAF 2212 1.1 mrg .long 0x4E5E0A73 2213 1.1 mrg .long 0x4AFD6A06 2214 1.1 mrg .long 0x47AE147B 2215 1.1 mrg .long 0x446F8657 2216 1.1 mrg .long 0x41414142 2217 1.1 mrg .long 0x3E22CBCF 2218 1.1 mrg .long 0x3B13B13C 2219 1.1 mrg .long 0x38138139 2220 1.1 mrg .long 0x3521CFB3 2221 1.1 mrg .long 0x323E34A3 2222 1.1 mrg .long 0x2F684BDB 2223 1.1 mrg .long 0x2C9FB4D9 2224 1.1 mrg .long 0x29E4129F 2225 1.1 mrg .long 0x27350B89 2226 1.1 mrg .long 0x24924925 2227 1.1 mrg .long 0x21FB7813 2228 1.1 mrg .long 0x1F7047DD 2229 1.1 mrg .long 0x1CF06ADB 2230 1.1 mrg .long 0x1A7B9612 2231 1.1 mrg .long 0x18118119 2232 1.1 mrg .long 0x15B1E5F8 2233 1.1 mrg .long 0x135C8114 2234 1.1 mrg .long 0x11111112 2235 1.1 mrg .long 0xECF56BF 2236 1.1 mrg .long 0xC9714FC 2237 1.1 mrg .long 0xA6810A7 2238 1.1 mrg .long 0x8421085 2239 1.1 mrg .long 0x624DD30 2240 1.1 mrg .long 0x4104105 2241 1.1 mrg .long 0x2040811 2242 1.1 mrg /* maximum error: 0.987342 scaled: 0.921875*/ 2243 1.1 mrg 2244 1.1 mrg ENDFUNC(GLOBAL(sdivsi3_i4i)) 2245 1.1 mrg #endif /* SH3 / SH4 */ 2246 1.1 mrg 2247 1.1 mrg #endif /* L_div_table */ 2248 1.1 mrg 2249 1.1 mrg #ifdef L_udiv_qrnnd_16 2250 1.1 mrg HIDDEN_FUNC(GLOBAL(udiv_qrnnd_16)) 2251 1.1 mrg /* r0: rn r1: qn */ /* r0: n1 r4: n0 r5: d r6: d1 */ /* r2: __m */ 2252 1.1 mrg /* n1 < d, but n1 might be larger than d1. */ 2253 1.1 mrg .global GLOBAL(udiv_qrnnd_16) 2254 1.1 mrg .balign 8 2255 1.1 mrg GLOBAL(udiv_qrnnd_16): 2256 1.1 mrg div0u 2257 1.1 mrg cmp/hi r6,r0 2258 1.1 mrg bt .Lots 2259 1.1 mrg .rept 16 2260 1.1 mrg div1 r6,r0 2261 1.1 mrg .endr 2262 1.1 mrg extu.w r0,r1 2263 1.1 mrg bt 0f 2264 1.1 mrg add r6,r0 2265 1.1 mrg 0: rotcl r1 2266 1.1 mrg mulu.w r1,r5 2267 1.1 mrg xtrct r4,r0 2268 1.1 mrg swap.w r0,r0 2269 1.1 mrg sts macl,r2 2270 1.1 mrg cmp/hs r2,r0 2271 1.1 mrg sub r2,r0 2272 1.1 mrg bt 0f 2273 1.1 mrg addc r5,r0 2274 1.1 mrg add #-1,r1 2275 1.1 mrg bt 0f 2276 1.1 mrg 1: add #-1,r1 2277 1.1 mrg rts 2278 1.1 mrg add r5,r0 2279 1.1 mrg .balign 8 2280 1.1 mrg .Lots: 2281 1.1 mrg sub r5,r0 2282 1.1 mrg swap.w r4,r1 2283 1.1 mrg xtrct r0,r1 2284 1.1 mrg clrt 2285 1.1 mrg mov r1,r0 2286 1.1 mrg addc r5,r0 2287 1.1 mrg mov #-1,r1 2288 1.1 mrg SL1(bf, 1b, 2289 1.1 mrg shlr16 r1) 2290 1.1 mrg 0: rts 2291 1.1 mrg nop 2292 1.1 mrg ENDFUNC(GLOBAL(udiv_qrnnd_16)) 2293 1.1 mrg #endif /* L_udiv_qrnnd_16 */ 2294