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 .text 53 .globl SpinPause 54 .type SpinPause, %function 55 SpinPause: 56 bx LR 57 58 # Support for void Copy::conjoint_bytes(void* from, 59 # void* to, 60 # size_t count) 61 _Copy_conjoint_bytes: 62 swi 0x9f0001 63 64 # Support for void Copy::arrayof_conjoint_bytes(void* from, 65 # void* to, 66 # size_t count) 67 _Copy_arrayof_conjoint_bytes: 68 swi 0x9f0001 69 70 71 # Support for void Copy::disjoint_words(void* from, 72 # void* to, 73 # size_t count) 74 _Copy_disjoint_words: 75 stmdb sp!, {r3 - r9, ip} 76 77 cmp r2, #0 78 beq disjoint_words_finish 79 80 pld [r1, #0] 81 cmp r2, #12 82 ble disjoint_words_small 83 84 .align 3 85 dw_f2b_loop_32: 86 subs r2, #32 87 blt dw_f2b_loop_32_finish 88 ldmia r1!, {r3 - r9, ip} 89 nop 90 pld [r1] 91 stmia r0!, {r3 - r9, ip} 92 bgt dw_f2b_loop_32 93 dw_f2b_loop_32_finish: 94 addlts r2, #32 95 beq disjoint_words_finish 96 cmp r2, #16 97 blt disjoint_words_small 98 ldmia r1!, {r3 - r6} 99 subge r2, r2, #16 100 stmia r0!, {r3 - r6} 101 beq disjoint_words_finish 102 disjoint_words_small: 103 cmp r2, #8 104 ldr r7, [r1], #4 105 ldrge r8, [r1], #4 106 ldrgt r9, [r1], #4 107 str r7, [r0], #4 108 strge r8, [r0], #4 109 strgt r9, [r0], #4 110 111 disjoint_words_finish: 112 ldmia sp!, {r3 - r9, ip} 113 bx lr 114 115 116 # Support for void Copy::conjoint_words(void* from, 117 # void* to, 118 # size_t count) 119 _Copy_conjoint_words: 120 stmdb sp!, {r3 - r9, ip} 121 122 cmp r2, #0 123 beq conjoint_words_finish 124 125 pld [r1, #0] 126 cmp r2, #12 127 ble conjoint_words_small 128 129 subs r3, r0, r1 130 cmphi r2, r3 131 bhi cw_b2f_copy 132 .align 3 133 cw_f2b_loop_32: 134 subs r2, #32 135 blt cw_f2b_loop_32_finish 136 ldmia r1!, {r3 - r9, ip} 137 nop 138 pld [r1] 139 stmia r0!, {r3 - r9, ip} 140 bgt cw_f2b_loop_32 141 cw_f2b_loop_32_finish: 142 addlts r2, #32 143 beq conjoint_words_finish 144 cmp r2, #16 145 blt conjoint_words_small 146 ldmia r1!, {r3 - r6} 147 subge r2, r2, #16 148 stmia r0!, {r3 - r6} 149 beq conjoint_words_finish 150 conjoint_words_small: 151 cmp r2, #8 152 ldr r7, [r1], #4 153 ldrge r8, [r1], #4 154 ldrgt r9, [r1], #4 155 str r7, [r0], #4 156 strge r8, [r0], #4 157 strgt r9, [r0], #4 158 b conjoint_words_finish 159 160 # Src and dest overlap, copy in a descending order 161 cw_b2f_copy: 162 add r1, r2 163 pld [r1, #-32] 164 add r0, r2 165 .align 3 166 cw_b2f_loop_32: 167 subs r2, #32 168 blt cw_b2f_loop_32_finish 169 ldmdb r1!, {r3-r9,ip} 170 nop 171 pld [r1, #-32] 172 stmdb r0!, {r3-r9,ip} 173 bgt cw_b2f_loop_32 174 cw_b2f_loop_32_finish: 175 addlts r2, #32 176 beq conjoint_words_finish 177 cmp r2, #16 178 blt cw_b2f_copy_small 179 ldmdb r1!, {r3 - r6} 180 subge r2, r2, #16 181 stmdb r0!, {r3 - r6} 182 beq conjoint_words_finish 183 cw_b2f_copy_small: 184 cmp r2, #8 185 ldr r7, [r1, #-4]! 186 ldrge r8, [r1, #-4]! 187 ldrgt r9, [r1, #-4]! 188 str r7, [r0, #-4]! 189 strge r8, [r0, #-4]! 190 strgt r9, [r0, #-4]! 191 192 conjoint_words_finish: 193 ldmia sp!, {r3 - r9, ip} 194 bx lr 195 196 # Support for void Copy::conjoint_jshorts_atomic(void* from, 197 # void* to, 198 # size_t count) 199 _Copy_conjoint_jshorts_atomic: 200 stmdb sp!, {r3 - r9, ip} 201 202 cmp r2, #0 203 beq conjoint_shorts_finish 204 205 subs r3, r0, r1 206 cmphi r2, r3 207 bhi cs_b2f_copy 208 209 pld [r1] 210 211 ands r3, r0, #3 212 bne cs_f2b_dest_u 213 ands r3, r1, #3 214 bne cs_f2b_src_u 215 216 # Aligned source address 217 .align 3 218 cs_f2b_loop_32: 219 subs r2, #32 220 blt cs_f2b_loop_32_finish 221 ldmia r1!, {r3 - r9, ip} 222 nop 223 pld [r1] 224 stmia r0!, {r3 - r9, ip} 225 bgt cs_f2b_loop_32 226 cs_f2b_loop_32_finish: 227 addlts r2, #32 228 beq conjoint_shorts_finish 229 movs r6, r2, lsr #3 230 .align 3 231 cs_f2b_8_loop: 232 beq cs_f2b_4 233 ldmia r1!, {r4-r5} 234 subs r6, #1 235 stmia r0!, {r4-r5} 236 bgt cs_f2b_8_loop 237 238 cs_f2b_4: 239 ands r2, #7 240 beq conjoint_shorts_finish 241 cmp r2, #4 242 ldrh r3, [r1], #2 243 ldrgeh r4, [r1], #2 244 ldrgth r5, [r1], #2 245 strh r3, [r0], #2 246 strgeh r4, [r0], #2 247 strgth r5, [r0], #2 248 b conjoint_shorts_finish 249 250 # Destination not aligned 251 cs_f2b_dest_u: 252 ldrh r3, [r1], #2 253 subs r2, #2 254 strh r3, [r0], #2 255 beq conjoint_shorts_finish 256 257 # Check to see if source is not aligned ether 258 ands r3, r1, #3 259 beq cs_f2b_loop_32 260 261 cs_f2b_src_u: 262 cmp r2, #16 263 blt cs_f2b_8_u 264 265 # Load 2 first bytes to r7 and make src ptr word aligned 266 bic r1, #3 267 ldr r7, [r1], #4 268 269 # Destination aligned, source not 270 mov r8, r2, lsr #4 271 .align 3 272 cs_f2b_16_u_loop: 273 mov r3, r7, lsr #16 274 ldmia r1!, {r4 - r7} 275 orr r3, r3, r4, lsl #16 276 mov r4, r4, lsr #16 277 pld [r1] 278 orr r4, r4, r5, lsl #16 279 mov r5, r5, lsr #16 280 orr r5, r5, r6, lsl #16 281 mov r6, r6, lsr #16 282 orr r6, r6, r7, lsl #16 283 stmia r0!, {r3 - r6} 284 subs r8, #1 285 bgt cs_f2b_16_u_loop 286 ands r2, #0xf 287 beq conjoint_shorts_finish 288 sub r1, #2 289 290 cs_f2b_8_u: 291 cmp r2, #8 292 blt cs_f2b_4_u 293 ldrh r4, [r1], #2 294 ldr r5, [r1], #4 295 ldrh r6, [r1], #2 296 orr r4, r4, r5, lsl #16 297 mov r5, r5, lsr #16 298 orr r5, r5, r6, lsl #16 299 subs r2, #8 300 stmia r0!, {r4 - r5} 301 cs_f2b_4_u: 302 beq conjoint_shorts_finish 303 cmp r2, #4 304 ldrh r3, [r1], #2 305 ldrgeh r4, [r1], #2 306 ldrgth r5, [r1], #2 307 strh r3, [r0], #2 308 strgeh r4, [r0], #2 309 strgth r5, [r0], #2 310 b conjoint_shorts_finish 311 312 # Src and dest overlap, copy in a descending order 313 cs_b2f_copy: 314 add r1, r2 315 pld [r1, #-32] 316 add r0, r2 317 318 ands r3, r0, #3 319 bne cs_b2f_dest_u 320 ands r3, r1, #3 321 bne cs_b2f_src_u 322 .align 3 323 cs_b2f_loop_32: 324 subs r2, #32 325 blt cs_b2f_loop_32_finish 326 ldmdb r1!, {r3-r9,ip} 327 nop 328 pld [r1, #-32] 329 stmdb r0!, {r3-r9,ip} 330 bgt cs_b2f_loop_32 331 cs_b2f_loop_32_finish: 332 addlts r2, #32 333 beq conjoint_shorts_finish 334 cmp r2, #24 335 blt cs_b2f_16 336 ldmdb r1!, {r3-r8} 337 sub r2, #24 338 stmdb r0!, {r3-r8} 339 beq conjoint_shorts_finish 340 cs_b2f_16: 341 cmp r2, #16 342 blt cs_b2f_8 343 ldmdb r1!, {r3-r6} 344 sub r2, #16 345 stmdb r0!, {r3-r6} 346 beq conjoint_shorts_finish 347 cs_b2f_8: 348 cmp r2, #8 349 blt cs_b2f_all_copy 350 ldmdb r1!, {r3-r4} 351 sub r2, #8 352 stmdb r0!, {r3-r4} 353 beq conjoint_shorts_finish 354 355 cs_b2f_all_copy: 356 cmp r2, #4 357 ldrh r3, [r1, #-2]! 358 ldrgeh r4, [r1, #-2]! 359 ldrgth r5, [r1, #-2]! 360 strh r3, [r0, #-2]! 361 strgeh r4, [r0, #-2]! 362 strgth r5, [r0, #-2]! 363 b conjoint_shorts_finish 364 365 # Destination not aligned 366 cs_b2f_dest_u: 367 ldrh r3, [r1, #-2]! 368 strh r3, [r0, #-2]! 369 sub r2, #2 370 # Check source alignment as well 371 ands r3, r1, #3 372 beq cs_b2f_loop_32 373 374 # Source not aligned 375 cs_b2f_src_u: 376 bic r1, #3 377 .align 3 378 cs_b2f_16_loop_u: 379 subs r2, #16 380 blt cs_b2f_16_loop_u_finished 381 ldr r7, [r1] 382 mov r3, r7 383 ldmdb r1!, {r4 - r7} 384 mov r4, r4, lsr #16 385 orr r4, r4, r5, lsl #16 386 pld [r1, #-32] 387 mov r5, r5, lsr #16 388 orr r5, r5, r6, lsl #16 389 mov r6, r6, lsr #16 390 orr r6, r6, r7, lsl #16 391 mov r7, r7, lsr #16 392 orr r7, r7, r3, lsl #16 393 stmdb r0!, {r4 - r7} 394 bgt cs_b2f_16_loop_u 395 beq conjoint_shorts_finish 396 cs_b2f_16_loop_u_finished: 397 addlts r2, #16 398 ldr r3, [r1] 399 cmp r2, #10 400 blt cs_b2f_2_u_loop 401 ldmdb r1!, {r4 - r5} 402 mov r6, r4, lsr #16 403 orr r6, r6, r5, lsl #16 404 mov r7, r5, lsr #16 405 orr r7, r7, r3, lsl #16 406 stmdb r0!, {r6-r7} 407 sub r2, #8 408 .align 3 409 cs_b2f_2_u_loop: 410 subs r2, #2 411 ldrh r3, [r1], #-2 412 strh r3, [r0, #-2]! 413 bgt cs_b2f_2_u_loop 414 415 conjoint_shorts_finish: 416 ldmia sp!, {r3 - r9, ip} 417 bx lr 418 419 420 # Support for void Copy::arrayof_conjoint_jshorts(void* from, 421 # void* to, 422 # size_t count) 423 _Copy_arrayof_conjoint_jshorts: 424 swi 0x9f0001 425 426 # Support for void Copy::conjoint_jints_atomic(void* from, 427 # void* to, 428 # size_t count) 429 _Copy_conjoint_jints_atomic: 430 _Copy_arrayof_conjoint_jints: 431 swi 0x9f0001 432 433 # Support for void Copy::conjoint_jlongs_atomic(jlong* from, 434 # jlong* to, 435 # size_t count) 436 _Copy_conjoint_jlongs_atomic: 437 _Copy_arrayof_conjoint_jlongs: 438 stmdb sp!, {r3 - r9, ip} 439 440 cmp r2, #0 441 beq conjoint_longs_finish 442 443 pld [r1, #0] 444 cmp r2, #24 445 ble conjoint_longs_small 446 447 subs r3, r0, r1 448 cmphi r2, r3 449 bhi cl_b2f_copy 450 .align 3 451 cl_f2b_loop_32: 452 subs r2, #32 453 blt cl_f2b_loop_32_finish 454 ldmia r1!, {r3 - r9, ip} 455 nop 456 pld [r1] 457 stmia r0!, {r3 - r9, ip} 458 bgt cl_f2b_loop_32 459 cl_f2b_loop_32_finish: 460 addlts r2, #32 461 beq conjoint_longs_finish 462 conjoint_longs_small: 463 cmp r2, #16 464 blt cl_f2b_copy_8 465 bgt cl_f2b_copy_24 466 ldmia r1!, {r3 - r6} 467 stmia r0!, {r3 - r6} 468 b conjoint_longs_finish 469 cl_f2b_copy_8: 470 ldmia r1!, {r3 - r4} 471 stmia r0!, {r3 - r4} 472 b conjoint_longs_finish 473 cl_f2b_copy_24: 474 ldmia r1!, {r3 - r8} 475 stmia r0!, {r3 - r8} 476 b conjoint_longs_finish 477 478 # Src and dest overlap, copy in a descending order 479 cl_b2f_copy: 480 add r1, r2 481 pld [r1, #-32] 482 add r0, r2 483 .align 3 484 cl_b2f_loop_32: 485 subs r2, #32 486 blt cl_b2f_loop_32_finish 487 ldmdb r1!, {r3 - r9, ip} 488 nop 489 pld [r1] 490 stmdb r0!, {r3 - r9, ip} 491 bgt cl_b2f_loop_32 492 cl_b2f_loop_32_finish: 493 addlts r2, #32 494 beq conjoint_longs_finish 495 cmp r2, #16 496 blt cl_b2f_copy_8 497 bgt cl_b2f_copy_24 498 ldmdb r1!, {r3 - r6} 499 stmdb r0!, {r3 - r6} 500 b conjoint_longs_finish 501 cl_b2f_copy_8: 502 ldmdb r1!, {r3 - r4} 503 stmdb r0!, {r3 - r4} 504 b conjoint_longs_finish 505 cl_b2f_copy_24: 506 ldmdb r1!, {r3 - r8} 507 stmdb r0!, {r3 - r8} 508 509 conjoint_longs_finish: 510 ldmia sp!, {r3 - r9, ip} 511 bx lr 512 513