src/os_cpu/solaris_x86/vm/solaris_x86_32.s

Thu, 21 Oct 2010 11:55:10 -0700

author
never
date
Thu, 21 Oct 2010 11:55:10 -0700
changeset 2262
1e9a9d2e6509
parent 1958
d93949c5bdcc
child 2384
0a8e0d4345b3
permissions
-rw-r--r--

6970683: improvements to hs_err output
Reviewed-by: kvn, jrose, dholmes, coleenp

duke@435 1 //
trims@1907 2 // Copyright (c) 2004, 2007, Oracle and/or its affiliates. All rights reserved.
duke@435 3 // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 //
duke@435 5 // This code is free software; you can redistribute it and/or modify it
duke@435 6 // under the terms of the GNU General Public License version 2 only, as
duke@435 7 // published by the Free Software Foundation.
duke@435 8 //
duke@435 9 // This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 // version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 // accompanied this code).
duke@435 14 //
duke@435 15 // You should have received a copy of the GNU General Public License version
duke@435 16 // 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 //
trims@1907 19 // Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 // or visit www.oracle.com if you need additional information or have any
trims@1907 21 // questions.
duke@435 22 //
duke@435 23
duke@435 24 .globl fixcw
duke@435 25 .globl sse_check
duke@435 26 .globl sse_unavailable
duke@435 27 .globl gs_load
duke@435 28 .globl gs_thread
duke@435 29 .globl _Atomic_cmpxchg_long_gcc
duke@435 30
duke@435 31 // NOTE WELL! The _Copy functions are called directly
duke@435 32 // from server-compiler-generated code via CallLeafNoFP,
duke@435 33 // which means that they *must* either not use floating
duke@435 34 // point or use it in the same manner as does the server
duke@435 35 // compiler.
duke@435 36
duke@435 37 .globl _Copy_conjoint_bytes
duke@435 38 .globl _Copy_arrayof_conjoint_bytes
duke@435 39 .globl _Copy_conjoint_jshorts_atomic
duke@435 40 .globl _Copy_arrayof_conjoint_jshorts
duke@435 41 .globl _Copy_conjoint_jints_atomic
duke@435 42 .globl _Copy_arrayof_conjoint_jints
duke@435 43 .globl _Copy_conjoint_jlongs_atomic
duke@435 44 .globl _mmx_Copy_arrayof_conjoint_jshorts
duke@435 45
duke@435 46 .section .text,"ax"
duke@435 47
duke@435 48 / Support for void os::Solaris::init_thread_fpu_state() in os_solaris_i486.cpp
duke@435 49 / Set fpu to 53 bit precision. This happens too early to use a stub.
duke@435 50 .align 16
duke@435 51 fixcw:
duke@435 52 pushl $0x27f
duke@435 53 fldcw 0(%esp)
duke@435 54 popl %eax
duke@435 55 ret
duke@435 56
duke@435 57 .align 16
duke@435 58 .globl SafeFetch32
duke@435 59 .globl SafeFetchN
duke@435 60 .globl Fetch32PFI, Fetch32Resume
duke@435 61 SafeFetch32:
duke@435 62 SafeFetchN:
duke@435 63 movl 0x8(%esp), %eax
duke@435 64 movl 0x4(%esp), %ecx
duke@435 65 Fetch32PFI:
duke@435 66 movl (%ecx), %eax
duke@435 67 Fetch32Resume:
duke@435 68 ret
duke@435 69
duke@435 70
duke@435 71 .align 16
duke@435 72 .globl SpinPause
duke@435 73 SpinPause:
duke@435 74 rep
duke@435 75 nop
duke@435 76 movl $1, %eax
duke@435 77 ret
duke@435 78
duke@435 79
duke@435 80 / Test SSE availability, used by os_solaris_i486.cpp
duke@435 81 .align 16
duke@435 82 sse_check:
duke@435 83 / Fault if SSE not available
duke@435 84 xorps %xmm0,%xmm0
duke@435 85 / No fault
duke@435 86 movl $1,%eax
duke@435 87 ret
duke@435 88 / Signal handler continues here if SSE is not available
duke@435 89 sse_unavailable:
duke@435 90 xorl %eax,%eax
duke@435 91 ret
duke@435 92
duke@435 93 / Fast thread accessors, used by threadLS_solaris_i486.cpp
duke@435 94 .align 16
duke@435 95 gs_load:
duke@435 96 movl 4(%esp),%ecx
duke@435 97 movl %gs:(%ecx),%eax
duke@435 98 ret
duke@435 99
duke@435 100 .align 16
duke@435 101 gs_thread:
duke@435 102 movl %gs:0x0,%eax
duke@435 103 ret
duke@435 104
duke@435 105 / Support for void Copy::conjoint_bytes(void* from,
duke@435 106 / void* to,
duke@435 107 / size_t count)
duke@435 108 .align 16
duke@435 109 _Copy_conjoint_bytes:
duke@435 110 pushl %esi
duke@435 111 movl 4+12(%esp),%ecx / count
duke@435 112 pushl %edi
duke@435 113 movl 8+ 4(%esp),%esi / from
duke@435 114 movl 8+ 8(%esp),%edi / to
duke@435 115 cmpl %esi,%edi
duke@435 116 leal -1(%esi,%ecx),%eax / from + count - 1
duke@435 117 jbe cb_CopyRight
duke@435 118 cmpl %eax,%edi
duke@435 119 jbe cb_CopyLeft
duke@435 120 / copy from low to high
duke@435 121 cb_CopyRight:
duke@435 122 cmpl $3,%ecx
duke@435 123 jbe 5f / <= 3 bytes
duke@435 124 / align source address at dword address boundary
duke@435 125 movl %ecx,%eax / original count
duke@435 126 movl $4,%ecx
duke@435 127 subl %esi,%ecx
duke@435 128 andl $3,%ecx / prefix byte count
duke@435 129 jz 1f / no prefix
duke@435 130 subl %ecx,%eax / byte count less prefix
duke@435 131 / copy prefix
duke@435 132 subl %esi,%edi
duke@435 133 0: movb (%esi),%dl
duke@435 134 movb %dl,(%edi,%esi,1)
duke@435 135 addl $1,%esi
duke@435 136 subl $1,%ecx
duke@435 137 jnz 0b
duke@435 138 addl %esi,%edi
duke@435 139 1: movl %eax,%ecx / byte count less prefix
duke@435 140 shrl $2,%ecx / dword count
duke@435 141 jz 4f / no dwords to move
duke@435 142 cmpl $32,%ecx
duke@435 143 jbe 2f / <= 32 dwords
duke@435 144 / copy aligned dwords
duke@435 145 rep; smovl
duke@435 146 jmp 4f
duke@435 147 / copy aligned dwords
duke@435 148 2: subl %esi,%edi
duke@435 149 .align 16
duke@435 150 3: movl (%esi),%edx
duke@435 151 movl %edx,(%edi,%esi,1)
duke@435 152 addl $4,%esi
duke@435 153 subl $1,%ecx
duke@435 154 jnz 3b
duke@435 155 addl %esi,%edi
duke@435 156 4: movl %eax,%ecx / byte count less prefix
kvn@1958 157 5: andl $3,%ecx / suffix byte count
duke@435 158 jz 7f / no suffix
duke@435 159 / copy suffix
kvn@1958 160 xorl %eax,%eax
duke@435 161 6: movb (%esi,%eax,1),%dl
duke@435 162 movb %dl,(%edi,%eax,1)
duke@435 163 addl $1,%eax
duke@435 164 subl $1,%ecx
duke@435 165 jnz 6b
duke@435 166 7: popl %edi
duke@435 167 popl %esi
duke@435 168 ret
duke@435 169 / copy from high to low
duke@435 170 cb_CopyLeft:
duke@435 171 std
duke@435 172 leal -4(%edi,%ecx),%edi / to + count - 4
duke@435 173 movl %eax,%esi / from + count - 1
duke@435 174 movl %ecx,%eax
duke@435 175 subl $3,%esi / from + count - 4
duke@435 176 cmpl $3,%ecx
duke@435 177 jbe 5f / <= 3 bytes
duke@435 178 1: shrl $2,%ecx / dword count
duke@435 179 jz 4f / no dwords to move
duke@435 180 cmpl $32,%ecx
duke@435 181 ja 3f / > 32 dwords
duke@435 182 / copy dwords, aligned or not
duke@435 183 subl %esi,%edi
duke@435 184 .align 16
duke@435 185 2: movl (%esi),%edx
duke@435 186 movl %edx,(%edi,%esi,1)
duke@435 187 subl $4,%esi
duke@435 188 subl $1,%ecx
duke@435 189 jnz 2b
duke@435 190 addl %esi,%edi
duke@435 191 jmp 4f
duke@435 192 / copy dwords, aligned or not
duke@435 193 3: rep; smovl
duke@435 194 4: movl %eax,%ecx / byte count
kvn@1958 195 5: andl $3,%ecx / suffix byte count
duke@435 196 jz 7f / no suffix
duke@435 197 / copy suffix
kvn@1958 198 subl %esi,%edi
duke@435 199 addl $3,%esi
duke@435 200 6: movb (%esi),%dl
duke@435 201 movb %dl,(%edi,%esi,1)
duke@435 202 subl $1,%esi
duke@435 203 subl $1,%ecx
duke@435 204 jnz 6b
duke@435 205 7: cld
duke@435 206 popl %edi
duke@435 207 popl %esi
duke@435 208 ret
duke@435 209
duke@435 210 / Support for void Copy::arrayof_conjoint_bytes(void* from,
duke@435 211 / void* to,
duke@435 212 / size_t count)
duke@435 213 /
duke@435 214 / Same as _Copy_conjoint_bytes, except no source alignment check.
duke@435 215 .align 16
duke@435 216 _Copy_arrayof_conjoint_bytes:
duke@435 217 pushl %esi
duke@435 218 movl 4+12(%esp),%ecx / count
duke@435 219 pushl %edi
duke@435 220 movl 8+ 4(%esp),%esi / from
duke@435 221 movl 8+ 8(%esp),%edi / to
duke@435 222 cmpl %esi,%edi
duke@435 223 leal -1(%esi,%ecx),%eax / from + count - 1
duke@435 224 jbe acb_CopyRight
duke@435 225 cmpl %eax,%edi
duke@435 226 jbe acb_CopyLeft
duke@435 227 / copy from low to high
duke@435 228 acb_CopyRight:
duke@435 229 cmpl $3,%ecx
duke@435 230 jbe 5f
duke@435 231 1: movl %ecx,%eax
duke@435 232 shrl $2,%ecx
duke@435 233 jz 4f
duke@435 234 cmpl $32,%ecx
duke@435 235 ja 3f
duke@435 236 / copy aligned dwords
duke@435 237 subl %esi,%edi
duke@435 238 .align 16
duke@435 239 2: movl (%esi),%edx
duke@435 240 movl %edx,(%edi,%esi,1)
duke@435 241 addl $4,%esi
duke@435 242 subl $1,%ecx
duke@435 243 jnz 2b
duke@435 244 addl %esi,%edi
duke@435 245 jmp 4f
duke@435 246 / copy aligned dwords
duke@435 247 3: rep; smovl
duke@435 248 4: movl %eax,%ecx
kvn@1958 249 5: andl $3,%ecx
duke@435 250 jz 7f
duke@435 251 / copy suffix
kvn@1958 252 xorl %eax,%eax
duke@435 253 6: movb (%esi,%eax,1),%dl
duke@435 254 movb %dl,(%edi,%eax,1)
duke@435 255 addl $1,%eax
duke@435 256 subl $1,%ecx
duke@435 257 jnz 6b
duke@435 258 7: popl %edi
duke@435 259 popl %esi
duke@435 260 ret
duke@435 261 acb_CopyLeft:
duke@435 262 std
duke@435 263 leal -4(%edi,%ecx),%edi / to + count - 4
duke@435 264 movl %eax,%esi / from + count - 1
duke@435 265 movl %ecx,%eax
duke@435 266 subl $3,%esi / from + count - 4
duke@435 267 cmpl $3,%ecx
duke@435 268 jbe 5f
duke@435 269 1: shrl $2,%ecx
duke@435 270 jz 4f
duke@435 271 cmpl $32,%ecx
duke@435 272 jbe 2f / <= 32 dwords
duke@435 273 rep; smovl
duke@435 274 jmp 4f
duke@435 275 .=.+8
duke@435 276 2: subl %esi,%edi
duke@435 277 .align 16
duke@435 278 3: movl (%esi),%edx
duke@435 279 movl %edx,(%edi,%esi,1)
duke@435 280 subl $4,%esi
duke@435 281 subl $1,%ecx
duke@435 282 jnz 3b
duke@435 283 addl %esi,%edi
duke@435 284 4: movl %eax,%ecx
kvn@1958 285 5: andl $3,%ecx
duke@435 286 jz 7f
kvn@1958 287 subl %esi,%edi
duke@435 288 addl $3,%esi
duke@435 289 6: movb (%esi),%dl
duke@435 290 movb %dl,(%edi,%esi,1)
duke@435 291 subl $1,%esi
duke@435 292 subl $1,%ecx
duke@435 293 jnz 6b
duke@435 294 7: cld
duke@435 295 popl %edi
duke@435 296 popl %esi
duke@435 297 ret
duke@435 298
duke@435 299 / Support for void Copy::conjoint_jshorts_atomic(void* from,
duke@435 300 / void* to,
duke@435 301 / size_t count)
duke@435 302 .align 16
duke@435 303 _Copy_conjoint_jshorts_atomic:
duke@435 304 pushl %esi
duke@435 305 movl 4+12(%esp),%ecx / count
duke@435 306 pushl %edi
duke@435 307 movl 8+ 4(%esp),%esi / from
duke@435 308 movl 8+ 8(%esp),%edi / to
duke@435 309 cmpl %esi,%edi
duke@435 310 leal -2(%esi,%ecx,2),%eax / from + count*2 - 2
duke@435 311 jbe cs_CopyRight
duke@435 312 cmpl %eax,%edi
duke@435 313 jbe cs_CopyLeft
duke@435 314 / copy from low to high
duke@435 315 cs_CopyRight:
duke@435 316 / align source address at dword address boundary
duke@435 317 movl %esi,%eax / original from
duke@435 318 andl $3,%eax / either 0 or 2
duke@435 319 jz 1f / no prefix
duke@435 320 / copy prefix
kvn@1958 321 subl $1,%ecx
kvn@1958 322 jl 5f / zero count
duke@435 323 movw (%esi),%dx
duke@435 324 movw %dx,(%edi)
duke@435 325 addl %eax,%esi / %eax == 2
duke@435 326 addl %eax,%edi
duke@435 327 1: movl %ecx,%eax / word count less prefix
duke@435 328 sarl %ecx / dword count
duke@435 329 jz 4f / no dwords to move
duke@435 330 cmpl $32,%ecx
duke@435 331 jbe 2f / <= 32 dwords
duke@435 332 / copy aligned dwords
duke@435 333 rep; smovl
duke@435 334 jmp 4f
duke@435 335 / copy aligned dwords
duke@435 336 2: subl %esi,%edi
duke@435 337 .align 16
duke@435 338 3: movl (%esi),%edx
duke@435 339 movl %edx,(%edi,%esi,1)
duke@435 340 addl $4,%esi
duke@435 341 subl $1,%ecx
duke@435 342 jnz 3b
duke@435 343 addl %esi,%edi
duke@435 344 4: andl $1,%eax / suffix count
duke@435 345 jz 5f / no suffix
duke@435 346 / copy suffix
duke@435 347 movw (%esi),%dx
duke@435 348 movw %dx,(%edi)
duke@435 349 5: popl %edi
duke@435 350 popl %esi
duke@435 351 ret
duke@435 352 / copy from high to low
duke@435 353 cs_CopyLeft:
duke@435 354 std
duke@435 355 leal -4(%edi,%ecx,2),%edi / to + count*2 - 4
duke@435 356 movl %eax,%esi / from + count*2 - 2
duke@435 357 movl %ecx,%eax
duke@435 358 subl $2,%esi / from + count*2 - 4
duke@435 359 1: sarl %ecx / dword count
duke@435 360 jz 4f / no dwords to move
duke@435 361 cmpl $32,%ecx
duke@435 362 ja 3f / > 32 dwords
duke@435 363 subl %esi,%edi
duke@435 364 .align 16
duke@435 365 2: movl (%esi),%edx
duke@435 366 movl %edx,(%edi,%esi,1)
duke@435 367 subl $4,%esi
duke@435 368 subl $1,%ecx
duke@435 369 jnz 2b
duke@435 370 addl %esi,%edi
duke@435 371 jmp 4f
duke@435 372 3: rep; smovl
duke@435 373 4: andl $1,%eax / suffix count
duke@435 374 jz 5f / no suffix
duke@435 375 / copy suffix
duke@435 376 addl $2,%esi
duke@435 377 addl $2,%edi
duke@435 378 movw (%esi),%dx
duke@435 379 movw %dx,(%edi)
duke@435 380 5: cld
duke@435 381 popl %edi
duke@435 382 popl %esi
duke@435 383 ret
duke@435 384
duke@435 385 / Support for void Copy::arrayof_conjoint_jshorts(void* from,
duke@435 386 / void* to,
duke@435 387 / size_t count)
duke@435 388 .align 16
duke@435 389 _Copy_arrayof_conjoint_jshorts:
duke@435 390 pushl %esi
duke@435 391 movl 4+12(%esp),%ecx / count
duke@435 392 pushl %edi
duke@435 393 movl 8+ 4(%esp),%esi / from
duke@435 394 movl 8+ 8(%esp),%edi / to
duke@435 395 cmpl %esi,%edi
duke@435 396 leal -2(%esi,%ecx,2),%eax / from + count*2 - 2
duke@435 397 jbe acs_CopyRight
duke@435 398 cmpl %eax,%edi
duke@435 399 jbe acs_CopyLeft
duke@435 400 acs_CopyRight:
duke@435 401 movl %ecx,%eax / word count
duke@435 402 sarl %ecx / dword count
duke@435 403 jz 4f / no dwords to move
duke@435 404 cmpl $32,%ecx
duke@435 405 jbe 2f / <= 32 dwords
duke@435 406 / copy aligned dwords
duke@435 407 rep; smovl
duke@435 408 jmp 4f
duke@435 409 / copy aligned dwords
duke@435 410 .=.+5
duke@435 411 2: subl %esi,%edi
duke@435 412 .align 16
duke@435 413 3: movl (%esi),%edx
duke@435 414 movl %edx,(%edi,%esi,1)
duke@435 415 addl $4,%esi
duke@435 416 subl $1,%ecx
duke@435 417 jnz 3b
duke@435 418 addl %esi,%edi
duke@435 419 4: andl $1,%eax / suffix count
duke@435 420 jz 5f / no suffix
duke@435 421 / copy suffix
duke@435 422 movw (%esi),%dx
duke@435 423 movw %dx,(%edi)
duke@435 424 5: popl %edi
duke@435 425 popl %esi
duke@435 426 ret
duke@435 427 acs_CopyLeft:
duke@435 428 std
duke@435 429 leal -4(%edi,%ecx,2),%edi / to + count*2 - 4
duke@435 430 movl %eax,%esi / from + count*2 - 2
duke@435 431 movl %ecx,%eax
duke@435 432 subl $2,%esi / from + count*2 - 4
duke@435 433 sarl %ecx / dword count
duke@435 434 jz 4f / no dwords to move
duke@435 435 cmpl $32,%ecx
duke@435 436 ja 3f / > 32 dwords
duke@435 437 subl %esi,%edi
duke@435 438 .align 16
duke@435 439 2: movl (%esi),%edx
duke@435 440 movl %edx,(%edi,%esi,1)
duke@435 441 subl $4,%esi
duke@435 442 subl $1,%ecx
duke@435 443 jnz 2b
duke@435 444 addl %esi,%edi
duke@435 445 jmp 4f
duke@435 446 3: rep; smovl
duke@435 447 4: andl $1,%eax / suffix count
duke@435 448 jz 5f / no suffix
duke@435 449 / copy suffix
duke@435 450 addl $2,%esi
duke@435 451 addl $2,%edi
duke@435 452 movw (%esi),%dx
duke@435 453 movw %dx,(%edi)
duke@435 454 5: cld
duke@435 455 popl %edi
duke@435 456 popl %esi
duke@435 457 ret
duke@435 458
duke@435 459 / Support for void Copy::conjoint_jints_atomic(void* from,
duke@435 460 / void* to,
duke@435 461 / size_t count)
duke@435 462 / Equivalent to
duke@435 463 / arrayof_conjoint_jints
duke@435 464 .align 16
duke@435 465 _Copy_conjoint_jints_atomic:
duke@435 466 _Copy_arrayof_conjoint_jints:
duke@435 467 pushl %esi
duke@435 468 movl 4+12(%esp),%ecx / count
duke@435 469 pushl %edi
duke@435 470 movl 8+ 4(%esp),%esi / from
duke@435 471 movl 8+ 8(%esp),%edi / to
duke@435 472 cmpl %esi,%edi
duke@435 473 leal -4(%esi,%ecx,4),%eax / from + count*4 - 4
duke@435 474 jbe ci_CopyRight
duke@435 475 cmpl %eax,%edi
duke@435 476 jbe ci_CopyLeft
duke@435 477 ci_CopyRight:
duke@435 478 cmpl $32,%ecx
duke@435 479 jbe 2f / <= 32 dwords
duke@435 480 rep; smovl
duke@435 481 popl %edi
duke@435 482 popl %esi
duke@435 483 ret
duke@435 484 .=.+10
duke@435 485 2: subl %esi,%edi
kvn@1958 486 jmp 4f
duke@435 487 .align 16
duke@435 488 3: movl (%esi),%edx
duke@435 489 movl %edx,(%edi,%esi,1)
duke@435 490 addl $4,%esi
kvn@1958 491 4: subl $1,%ecx
kvn@1958 492 jge 3b
duke@435 493 popl %edi
duke@435 494 popl %esi
duke@435 495 ret
duke@435 496 ci_CopyLeft:
duke@435 497 std
duke@435 498 leal -4(%edi,%ecx,4),%edi / to + count*4 - 4
duke@435 499 cmpl $32,%ecx
kvn@1958 500 ja 4f / > 32 dwords
duke@435 501 subl %eax,%edi / eax == from + count*4 - 4
kvn@1958 502 jmp 3f
duke@435 503 .align 16
duke@435 504 2: movl (%eax),%edx
duke@435 505 movl %edx,(%edi,%eax,1)
duke@435 506 subl $4,%eax
kvn@1958 507 3: subl $1,%ecx
kvn@1958 508 jge 2b
duke@435 509 cld
duke@435 510 popl %edi
duke@435 511 popl %esi
duke@435 512 ret
kvn@1958 513 4: movl %eax,%esi / from + count*4 - 4
duke@435 514 rep; smovl
duke@435 515 cld
duke@435 516 popl %edi
duke@435 517 popl %esi
duke@435 518 ret
duke@435 519
duke@435 520 / Support for void Copy::conjoint_jlongs_atomic(jlong* from,
duke@435 521 / jlong* to,
duke@435 522 / size_t count)
duke@435 523 /
duke@435 524 / 32-bit
duke@435 525 /
duke@435 526 / count treated as signed
duke@435 527 /
duke@435 528 / if (from > to) {
duke@435 529 / while (--count >= 0) {
duke@435 530 / *to++ = *from++;
duke@435 531 / }
duke@435 532 / } else {
duke@435 533 / while (--count >= 0) {
duke@435 534 / to[count] = from[count];
duke@435 535 / }
duke@435 536 / }
duke@435 537 .align 16
duke@435 538 _Copy_conjoint_jlongs_atomic:
duke@435 539 movl 4+8(%esp),%ecx / count
duke@435 540 movl 4+0(%esp),%eax / from
duke@435 541 movl 4+4(%esp),%edx / to
duke@435 542 cmpl %eax,%edx
duke@435 543 jae cla_CopyLeft
duke@435 544 cla_CopyRight:
duke@435 545 subl %eax,%edx
duke@435 546 jmp 2f
duke@435 547 .align 16
duke@435 548 1: fildll (%eax)
duke@435 549 fistpll (%edx,%eax,1)
duke@435 550 addl $8,%eax
duke@435 551 2: subl $1,%ecx
duke@435 552 jge 1b
duke@435 553 ret
duke@435 554 .align 16
duke@435 555 3: fildll (%eax,%ecx,8)
duke@435 556 fistpll (%edx,%ecx,8)
duke@435 557 cla_CopyLeft:
duke@435 558 subl $1,%ecx
duke@435 559 jge 3b
duke@435 560 ret
duke@435 561
duke@435 562 / Support for void Copy::arrayof_conjoint_jshorts(void* from,
duke@435 563 / void* to,
duke@435 564 / size_t count)
duke@435 565 .align 16
duke@435 566 _mmx_Copy_arrayof_conjoint_jshorts:
duke@435 567 pushl %esi
duke@435 568 movl 4+12(%esp),%ecx
duke@435 569 pushl %edi
duke@435 570 movl 8+ 4(%esp),%esi
duke@435 571 movl 8+ 8(%esp),%edi
duke@435 572 cmpl %esi,%edi
duke@435 573 leal -2(%esi,%ecx,2),%eax
duke@435 574 jbe mmx_acs_CopyRight
duke@435 575 cmpl %eax,%edi
duke@435 576 jbe mmx_acs_CopyLeft
duke@435 577 mmx_acs_CopyRight:
duke@435 578 movl %ecx,%eax
duke@435 579 sarl %ecx
duke@435 580 je 5f
duke@435 581 cmpl $33,%ecx
duke@435 582 jae 3f
duke@435 583 1: subl %esi,%edi
duke@435 584 .align 16
duke@435 585 2: movl (%esi),%edx
duke@435 586 movl %edx,(%edi,%esi,1)
duke@435 587 addl $4,%esi
duke@435 588 subl $1,%ecx
duke@435 589 jnz 2b
duke@435 590 addl %esi,%edi
duke@435 591 jmp 5f
duke@435 592 3: smovl / align to 8 bytes, we know we are 4 byte aligned to start
duke@435 593 subl $1,%ecx
duke@435 594 4: .align 16
duke@435 595 movq 0(%esi),%mm0
duke@435 596 addl $64,%edi
duke@435 597 movq 8(%esi),%mm1
duke@435 598 subl $16,%ecx
duke@435 599 movq 16(%esi),%mm2
duke@435 600 movq %mm0,-64(%edi)
duke@435 601 movq 24(%esi),%mm0
duke@435 602 movq %mm1,-56(%edi)
duke@435 603 movq 32(%esi),%mm1
duke@435 604 movq %mm2,-48(%edi)
duke@435 605 movq 40(%esi),%mm2
duke@435 606 movq %mm0,-40(%edi)
duke@435 607 movq 48(%esi),%mm0
duke@435 608 movq %mm1,-32(%edi)
duke@435 609 movq 56(%esi),%mm1
duke@435 610 movq %mm2,-24(%edi)
duke@435 611 movq %mm0,-16(%edi)
duke@435 612 addl $64,%esi
duke@435 613 movq %mm1,-8(%edi)
duke@435 614 cmpl $16,%ecx
duke@435 615 jge 4b
duke@435 616 emms
duke@435 617 testl %ecx,%ecx
duke@435 618 ja 1b
duke@435 619 5: andl $1,%eax
duke@435 620 je 7f
duke@435 621 6: movw (%esi),%dx
duke@435 622 movw %dx,(%edi)
duke@435 623 7: popl %edi
duke@435 624 popl %esi
duke@435 625 ret
duke@435 626 mmx_acs_CopyLeft:
duke@435 627 std
duke@435 628 leal -4(%edi,%ecx,2),%edi
duke@435 629 movl %eax,%esi
duke@435 630 movl %ecx,%eax
duke@435 631 subl $2,%esi
duke@435 632 sarl %ecx
duke@435 633 je 4f
duke@435 634 cmpl $32,%ecx
duke@435 635 ja 3f
duke@435 636 subl %esi,%edi
duke@435 637 .align 16
duke@435 638 2: movl (%esi),%edx
duke@435 639 movl %edx,(%edi,%esi,1)
duke@435 640 subl $4,%esi
duke@435 641 subl $1,%ecx
duke@435 642 jnz 2b
duke@435 643 addl %esi,%edi
duke@435 644 jmp 4f
duke@435 645 3: rep; smovl
duke@435 646 4: andl $1,%eax
duke@435 647 je 6f
duke@435 648 addl $2,%esi
duke@435 649 addl $2,%edi
duke@435 650 5: movw (%esi),%dx
duke@435 651 movw %dx,(%edi)
duke@435 652 6: cld
duke@435 653 popl %edi
duke@435 654 popl %esi
duke@435 655 ret
duke@435 656
duke@435 657
duke@435 658 / Support for jlong Atomic::cmpxchg(jlong exchange_value,
duke@435 659 / volatile jlong* dest,
duke@435 660 / jlong compare_value,
duke@435 661 / bool is_MP)
duke@435 662 / Used only for Solaris/gcc builds
duke@435 663 .align 16
duke@435 664 _Atomic_cmpxchg_long_gcc:
duke@435 665 / 8(%esp) : return PC
duke@435 666 pushl %ebx / 4(%esp) : old %ebx
duke@435 667 pushl %edi / 0(%esp) : old %edi
duke@435 668 movl 12(%esp), %ebx / 12(%esp) : exchange_value (low)
duke@435 669 movl 16(%esp), %ecx / 16(%esp) : exchange_value (high)
duke@435 670 movl 24(%esp), %eax / 24(%esp) : compare_value (low)
duke@435 671 movl 28(%esp), %edx / 28(%esp) : compare_value (high)
duke@435 672 movl 20(%esp), %edi / 20(%esp) : dest
duke@435 673 cmpl $0, 32(%esp) / 32(%esp) : is_MP
duke@435 674 je 1f
duke@435 675 lock
duke@435 676 1: cmpxchg8b (%edi)
duke@435 677 popl %edi
duke@435 678 popl %ebx
duke@435 679 ret

mercurial