src/os_cpu/bsd_x86/vm/bsd_x86_32.s

Fri, 08 Feb 2013 12:48:24 +0100

author
sla
date
Fri, 08 Feb 2013 12:48:24 +0100
changeset 4564
758935f7c23f
parent 3202
436b4a3231bf
child 5400
980532a806a5
permissions
-rw-r--r--

8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
Summary: Do not rely on mach thread port names to identify threads from SA
Reviewed-by: dholmes, minqi, rbackman

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

mercurial