1 #
   2 # Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
   3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4 #
   5 # This code is free software; you can redistribute it and/or modify it
   6 # under the terms of the GNU General Public License version 2 only, as
   7 # published by the Free Software Foundation.
   8 #
   9 # This code is distributed in the hope that it will be useful, but WITHOUT
  10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12 # version 2 for more details (a copy is included in the LICENSE file that
  13 # accompanied this code).
  14 #
  15 # You should have received a copy of the GNU General Public License version
  16 # 2 along with this work; if not, write to the Free Software Foundation,
  17 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18 #
  19 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20 # or visit www.oracle.com if you need additional information or have any
  21 # questions.
  22 #
  23 
  24 
  25         # NOTE WELL!  The _Copy functions are called directly
  26         # from server-compiler-generated code via CallLeafNoFP,
  27         # which means that they *must* either not use floating
  28         # point or use it in the same manner as does the server
  29         # compiler.
  30 
  31         .globl _Copy_conjoint_bytes
  32         .type _Copy_conjoint_bytes, %function
  33         .globl _Copy_arrayof_conjoint_bytes
  34         .type _Copy_arrayof_conjoint_bytes, %function
  35         .globl _Copy_disjoint_words
  36         .type _Copy_disjoint_words, %function
  37         .globl _Copy_conjoint_words
  38         .type _Copy_conjoint_words, %function
  39         .globl _Copy_conjoint_jshorts_atomic
  40         .type _Copy_conjoint_jshorts_atomic, %function
  41         .globl _Copy_arrayof_conjoint_jshorts
  42         .type _Copy_arrayof_conjoint_jshorts, %function
  43         .globl _Copy_conjoint_jints_atomic
  44         .type _Copy_conjoint_jints_atomic, %function
  45         .globl _Copy_arrayof_conjoint_jints
  46         .type _Copy_arrayof_conjoint_jints, %function
  47         .globl _Copy_conjoint_jlongs_atomic
  48         .type _Copy_conjoint_jlongs_atomic, %function
  49         .globl _Copy_arrayof_conjoint_jlongs
  50         .type _Copy_arrayof_conjoint_jlongs, %function
  51 
  52 from    .req    r0
  53 to      .req    r1
  54 
  55         .text
  56         .globl  SpinPause
  57         .type SpinPause, %function
  58 SpinPause:
  59         bx      LR
  60 
  61         # Support for void Copy::conjoint_bytes(void* from,
  62         #                                       void* to,
  63         #                                       size_t count)
  64 _Copy_conjoint_bytes:
  65         swi     0x9f0001
  66 
  67         # Support for void Copy::arrayof_conjoint_bytes(void* from,
  68         #                                               void* to,
  69         #                                               size_t count)
  70 _Copy_arrayof_conjoint_bytes:
  71         swi     0x9f0001
  72 
  73 
  74         # Support for void Copy::disjoint_words(void* from,
  75         #                                       void* to,
  76         #                                       size_t count)
  77 _Copy_disjoint_words:
  78         stmdb    sp!, {r3 - r9, ip}
  79  
  80         cmp     r2, #0
  81         beq     disjoint_words_finish
  82 
  83         pld     [from, #0]
  84         cmp     r2, #12
  85         ble disjoint_words_small
  86 
  87         .align 3
  88 dw_f2b_loop_32:
  89         subs    r2, #32
  90         blt     dw_f2b_loop_32_finish
  91         ldmia from!, {r3 - r9, ip}
  92         nop
  93         pld     [from]
  94         stmia to!, {r3 - r9, ip}
  95         bgt     dw_f2b_loop_32
  96 dw_f2b_loop_32_finish:
  97         addlts  r2, #32
  98         beq     disjoint_words_finish
  99         cmp     r2, #16
 100         blt     disjoint_words_small
 101         ldmia from!, {r3 - r6}
 102         subge   r2, r2, #16
 103         stmia to!, {r3 - r6}
 104         beq     disjoint_words_finish
 105 disjoint_words_small:
 106         cmp     r2, #8
 107         ldr     r7, [from], #4
 108         ldrge   r8, [from], #4
 109         ldrgt   r9, [from], #4
 110         str     r7, [to], #4
 111         strge   r8, [to], #4
 112         strgt   r9, [to], #4
 113 
 114 disjoint_words_finish:
 115         ldmia   sp!, {r3 - r9, ip}
 116         bx      lr
 117 
 118 
 119         # Support for void Copy::conjoint_words(void* from,
 120         #                                       void* to,
 121         #                                       size_t count)
 122 _Copy_conjoint_words:
 123         stmdb    sp!, {r3 - r9, ip}
 124 
 125         cmp     r2, #0
 126         beq     conjoint_words_finish
 127 
 128         pld     [from, #0]
 129         cmp     r2, #12
 130         ble conjoint_words_small
 131 
 132         subs    r3, to, from
 133         cmphi   r2, r3
 134         bhi     cw_b2f_copy
 135         .align 3
 136 cw_f2b_loop_32:
 137         subs    r2, #32
 138         blt     cw_f2b_loop_32_finish
 139         ldmia from!, {r3 - r9, ip}
 140         nop
 141         pld     [from]
 142         stmia to!, {r3 - r9, ip}
 143         bgt     cw_f2b_loop_32
 144 cw_f2b_loop_32_finish:
 145         addlts  r2, #32
 146         beq     conjoint_words_finish
 147         cmp     r2, #16
 148         blt     conjoint_words_small
 149         ldmia from!, {r3 - r6}
 150         subge   r2, r2, #16
 151         stmia to!, {r3 - r6}
 152         beq     conjoint_words_finish
 153 conjoint_words_small:
 154         cmp     r2, #8
 155         ldr     r7, [from], #4
 156         ldrge   r8, [from], #4
 157         ldrgt   r9, [from], #4
 158         str     r7, [to], #4
 159         strge   r8, [to], #4
 160         strgt   r9, [to], #4
 161         b       conjoint_words_finish
 162 
 163         # Src and dest overlap, copy in a descending order
 164 cw_b2f_copy:
 165         add     from, r2
 166         pld     [from, #-32]
 167         add     to, r2
 168         .align 3
 169 cw_b2f_loop_32:
 170         subs    r2, #32
 171         blt     cw_b2f_loop_32_finish
 172         ldmdb from!, {r3-r9,ip}
 173         nop
 174         pld     [from, #-32]
 175         stmdb to!, {r3-r9,ip}
 176         bgt     cw_b2f_loop_32
 177 cw_b2f_loop_32_finish:
 178         addlts  r2, #32
 179         beq     conjoint_words_finish
 180         cmp     r2, #16
 181         blt     cw_b2f_copy_small
 182         ldmdb from!, {r3 - r6}
 183         subge   r2, r2, #16
 184         stmdb to!, {r3 - r6}
 185         beq     conjoint_words_finish
 186 cw_b2f_copy_small:
 187         cmp     r2, #8
 188         ldr     r7, [from, #-4]!
 189         ldrge   r8, [from, #-4]!
 190         ldrgt   r9, [from, #-4]!
 191         str     r7, [to, #-4]!
 192         strge   r8, [to, #-4]!
 193         strgt   r9, [to, #-4]!
 194 
 195 conjoint_words_finish:
 196         ldmia   sp!, {r3 - r9, ip}
 197         bx      lr
 198 
 199         # Support for void Copy::conjoint_jshorts_atomic(void* from,
 200         #                                                void* to,
 201         #                                                size_t count)
 202 _Copy_conjoint_jshorts_atomic:
 203         stmdb   sp!, {r3 - r9, ip}
 204 
 205         cmp     r2, #0
 206         beq     conjoint_shorts_finish  
 207 
 208         subs    r3, to, from
 209         cmphi   r2, r3
 210         bhi     cs_b2f_copy
 211 
 212         pld     [from]
 213 
 214         ands    r3, to, #3
 215         bne     cs_f2b_dest_u
 216         ands    r3, from, #3
 217         bne     cs_f2b_src_u
 218 
 219         # Aligned source address
 220         .align 3
 221 cs_f2b_loop_32:
 222         subs    r2, #32
 223         blt     cs_f2b_loop_32_finish
 224         ldmia from!, {r3 - r9, ip}
 225         nop
 226         pld     [from]
 227         stmia to!, {r3 - r9, ip}
 228         bgt     cs_f2b_loop_32
 229 cs_f2b_loop_32_finish:
 230         addlts  r2, #32
 231         beq     conjoint_shorts_finish
 232         movs    r6, r2, lsr #3
 233         .align 3
 234 cs_f2b_8_loop:
 235         beq     cs_f2b_4
 236         ldmia   from!, {r4-r5}
 237         subs    r6, #1
 238         stmia   to!, {r4-r5}
 239         bgt     cs_f2b_8_loop
 240 
 241 cs_f2b_4:
 242         ands    r2, #7
 243         beq     conjoint_shorts_finish
 244         cmp     r2, #4
 245         ldrh    r3, [from], #2
 246         ldrgeh  r4, [from], #2
 247         ldrgth  r5, [from], #2
 248         strh    r3, [to], #2
 249         strgeh  r4, [to], #2
 250         strgth  r5, [to], #2
 251         b       conjoint_shorts_finish
 252 
 253         # Destination not aligned
 254 cs_f2b_dest_u:
 255         ldrh    r3, [from], #2
 256         subs    r2, #2
 257         strh    r3, [to], #2
 258         beq     conjoint_shorts_finish
 259 
 260         # Check to see if source is not aligned ether
 261         ands    r3, from, #3
 262         beq     cs_f2b_loop_32
 263 
 264 cs_f2b_src_u:
 265         cmp     r2, #16
 266         blt     cs_f2b_8_u
 267 
 268         # Load 2 first bytes to r7 and make src ptr word aligned
 269         bic     from, #3
 270         ldr     r7, [from], #4
 271 
 272         # Destination aligned, source not
 273         mov     r8, r2, lsr #4
 274         .align 3
 275 cs_f2b_16_u_loop:
 276         mov     r3, r7, lsr #16
 277         ldmia   from!, {r4 - r7}
 278         orr     r3, r3, r4, lsl #16
 279         mov     r4, r4, lsr #16
 280         pld     [from]
 281         orr     r4, r4, r5, lsl #16
 282         mov     r5, r5, lsr #16
 283         orr     r5, r5, r6, lsl #16
 284         mov     r6, r6, lsr #16
 285         orr     r6, r6, r7, lsl #16
 286         stmia   to!, {r3 - r6}
 287         subs    r8, #1
 288         bgt     cs_f2b_16_u_loop
 289         ands    r2, #0xf
 290         beq     conjoint_shorts_finish
 291         sub     from, #2
 292 
 293 cs_f2b_8_u:
 294         cmp     r2, #8
 295         blt     cs_f2b_4_u
 296         ldrh    r4, [from], #2
 297         ldr     r5, [from], #4
 298         ldrh    r6, [from], #2
 299         orr     r4, r4, r5, lsl #16
 300         mov     r5, r5, lsr #16
 301         orr     r5, r5, r6, lsl #16
 302         subs    r2, #8
 303         stmia   to!, {r4 - r5}
 304 cs_f2b_4_u:
 305         beq     conjoint_shorts_finish
 306         cmp     r2, #4
 307         ldrh    r3, [from], #2
 308         ldrgeh  r4, [from], #2
 309         ldrgth  r5, [from], #2
 310         strh    r3, [to], #2
 311         strgeh  r4, [to], #2
 312         strgth  r5, [to], #2
 313         b       conjoint_shorts_finish
 314 
 315         # Src and dest overlap, copy in a descending order
 316 cs_b2f_copy:
 317         add     from, r2
 318         pld     [from, #-32]
 319         add     to, r2
 320 
 321         ands    r3, to, #3
 322         bne     cs_b2f_dest_u
 323         ands    r3, from, #3
 324         bne     cs_b2f_src_u
 325         .align 3
 326 cs_b2f_loop_32:
 327         subs    r2, #32
 328         blt     cs_b2f_loop_32_finish
 329         ldmdb from!, {r3-r9,ip}
 330         nop
 331         pld     [from, #-32]
 332         stmdb to!, {r3-r9,ip}
 333         bgt     cs_b2f_loop_32
 334 cs_b2f_loop_32_finish:
 335         addlts  r2, #32
 336         beq     conjoint_shorts_finish
 337         cmp     r2, #24
 338         blt     cs_b2f_16
 339         ldmdb   from!, {r3-r8}
 340         sub     r2, #24
 341         stmdb   to!, {r3-r8}
 342         beq     conjoint_shorts_finish
 343 cs_b2f_16:
 344         cmp     r2, #16
 345         blt     cs_b2f_8
 346         ldmdb   from!, {r3-r6}
 347         sub     r2, #16
 348         stmdb   to!, {r3-r6}
 349         beq     conjoint_shorts_finish
 350 cs_b2f_8:
 351         cmp     r2, #8
 352         blt     cs_b2f_all_copy
 353         ldmdb   from!, {r3-r4}
 354         sub     r2, #8
 355         stmdb   to!, {r3-r4}
 356         beq     conjoint_shorts_finish
 357 
 358 cs_b2f_all_copy:
 359         cmp     r2, #4
 360         ldrh    r3, [from, #-2]!
 361         ldrgeh  r4, [from, #-2]!
 362         ldrgth  r5, [from, #-2]!
 363         strh    r3, [to, #-2]!
 364         strgeh  r4, [to, #-2]!
 365         strgth  r5, [to, #-2]!
 366         b       conjoint_shorts_finish
 367 
 368         # Destination not aligned
 369 cs_b2f_dest_u:
 370         ldrh    r3, [from, #-2]!
 371         strh    r3, [to, #-2]!
 372         sub     r2, #2
 373         # Check source alignment as well
 374         ands    r3, from, #3
 375         beq     cs_b2f_loop_32
 376 
 377         # Source not aligned
 378 cs_b2f_src_u:
 379         bic     from, #3
 380         .align 3
 381 cs_b2f_16_loop_u:
 382         subs    r2, #16
 383         blt     cs_b2f_16_loop_u_finished
 384         ldr     r7, [from]
 385         mov     r3, r7
 386         ldmdb   from!, {r4 - r7}
 387         mov     r4, r4, lsr #16
 388         orr     r4, r4, r5, lsl #16
 389         pld     [from, #-32]
 390         mov     r5, r5, lsr #16
 391         orr     r5, r5, r6, lsl #16
 392         mov     r6, r6, lsr #16
 393         orr     r6, r6, r7, lsl #16
 394         mov     r7, r7, lsr #16
 395         orr     r7, r7, r3, lsl #16
 396         stmdb   to!, {r4 - r7}
 397         bgt     cs_b2f_16_loop_u
 398         beq     conjoint_shorts_finish
 399 cs_b2f_16_loop_u_finished:
 400         addlts  r2, #16
 401         ldr     r3, [from]
 402         cmp     r2, #10
 403         blt     cs_b2f_2_u_loop
 404         ldmdb   from!, {r4 - r5}
 405         mov     r6, r4, lsr #16
 406         orr     r6, r6, r5, lsl #16
 407         mov     r7, r5, lsr #16
 408         orr     r7, r7, r3, lsl #16
 409         stmdb   to!, {r6-r7}
 410         sub     r2, #8
 411         .align 3
 412 cs_b2f_2_u_loop:
 413         subs    r2, #2
 414         ldrh    r3, [from], #-2
 415         strh    r3, [to, #-2]!
 416         bgt     cs_b2f_2_u_loop
 417 
 418 conjoint_shorts_finish:
 419         ldmia   sp!, {r3 - r9, ip}
 420         bx      lr
 421 
 422 
 423         # Support for void Copy::arrayof_conjoint_jshorts(void* from,
 424         #                                                 void* to,
 425         #                                                 size_t count)
 426 _Copy_arrayof_conjoint_jshorts:
 427         swi     0x9f0001
 428 
 429         # Support for void Copy::conjoint_jints_atomic(void* from,
 430         #                                              void* to,
 431         #                                              size_t count)
 432 _Copy_conjoint_jints_atomic:
 433 _Copy_arrayof_conjoint_jints:
 434         swi     0x9f0001
 435         
 436         # Support for void Copy::conjoint_jlongs_atomic(jlong* from,
 437         #                                               jlong* to,
 438         #                                               size_t count)
 439 _Copy_conjoint_jlongs_atomic:
 440 _Copy_arrayof_conjoint_jlongs:
 441         stmdb    sp!, {r3 - r9, ip}
 442 
 443         cmp     r2, #0
 444         beq     conjoint_longs_finish
 445 
 446         pld     [from, #0]
 447         cmp     r2, #24
 448         ble conjoint_longs_small
 449 
 450         subs    r3, to, from
 451         cmphi   r2, r3
 452         bhi     cl_b2f_copy
 453         .align 3
 454 cl_f2b_loop_32:
 455         subs    r2, #32
 456         blt     cl_f2b_loop_32_finish
 457         ldmia from!, {r3 - r9, ip}
 458         nop
 459         pld     [from]
 460         stmia to!, {r3 - r9, ip}
 461         bgt     cl_f2b_loop_32
 462 cl_f2b_loop_32_finish:
 463         addlts  r2, #32
 464         beq     conjoint_longs_finish
 465 conjoint_longs_small:
 466         cmp     r2, #16
 467         blt     cl_f2b_copy_8
 468         bgt     cl_f2b_copy_24
 469         ldmia   from!, {r3 - r6}
 470         stmia   to!, {r3 - r6}
 471         b       conjoint_longs_finish
 472 cl_f2b_copy_8:
 473         ldmia   from!, {r3 - r4}
 474         stmia   to!, {r3 - r4}
 475         b       conjoint_longs_finish
 476 cl_f2b_copy_24:
 477         ldmia   from!, {r3 - r8}
 478         stmia   to!, {r3 - r8}
 479         b       conjoint_longs_finish
 480 
 481         # Src and dest overlap, copy in a descending order
 482 cl_b2f_copy:
 483         add     from, r2
 484         pld     [from, #-32]
 485         add     to, r2
 486         .align 3
 487 cl_b2f_loop_32:
 488         subs    r2, #32
 489         blt     cl_b2f_loop_32_finish
 490         ldmdb   from!, {r3 - r9, ip}
 491         nop
 492         pld     [from]
 493         stmdb   to!, {r3 - r9, ip}
 494         bgt     cl_b2f_loop_32
 495 cl_b2f_loop_32_finish:
 496         addlts  r2, #32
 497         beq     conjoint_longs_finish
 498         cmp     r2, #16
 499         blt     cl_b2f_copy_8
 500         bgt     cl_b2f_copy_24
 501         ldmdb   from!, {r3 - r6}
 502         stmdb   to!, {r3 - r6}
 503         b       conjoint_longs_finish
 504 cl_b2f_copy_8:
 505         ldmdb   from!, {r3 - r4}
 506         stmdb   to!, {r3 - r4}
 507         b       conjoint_longs_finish
 508 cl_b2f_copy_24:
 509         ldmdb   from!, {r3 - r8}
 510         stmdb   to!, {r3 - r8}
 511 
 512 conjoint_longs_finish:
 513         ldmia   sp!, {r3 - r9, ip}
 514         bx      lr
 515 
 516