src/os_cpu/linux_x86/vm/linux_x86_32.s

Wed, 25 Sep 2013 13:58:13 +0200

author
dsimms
date
Wed, 25 Sep 2013 13:58:13 +0200
changeset 5781
899ecf76b570
parent 5400
980532a806a5
child 6198
55fb97c4c58d
permissions
-rw-r--r--

8023956: Provide a work-around to broken Linux 32 bit "Exec Shield" using CS for NX emulation (crashing with SI_KERNEL)
Summary: Execute some code at a high virtual address value, and keep mapped
Reviewed-by: coleenp, zgu

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

mercurial