src/os_cpu/linux_x86/vm/linux_x86_32.s

Thu, 22 Apr 2010 13:23:15 -0700

author
jcoomes
date
Thu, 22 Apr 2010 13:23:15 -0700
changeset 1845
f03d0a26bf83
parent 435
a61af66fc99e
child 1907
c18cbe5936b8
permissions
-rw-r--r--

6888954: argument formatting for assert() and friends
Reviewed-by: kvn, twisti, apetrusenko, never, dcubed

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

mercurial