src/os_cpu/linux_x86/vm/linux_x86_64.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_arrayof_conjoint_bytes
duke@435 32 .globl _Copy_arrayof_conjoint_jshorts
duke@435 33 .globl _Copy_conjoint_jshorts_atomic
duke@435 34 .globl _Copy_arrayof_conjoint_jints
duke@435 35 .globl _Copy_conjoint_jints_atomic
duke@435 36 .globl _Copy_arrayof_conjoint_jlongs
duke@435 37 .globl _Copy_conjoint_jlongs_atomic
duke@435 38
duke@435 39 .text
duke@435 40
duke@435 41 .globl SafeFetch32, Fetch32PFI, Fetch32Resume
duke@435 42 .align 16
duke@435 43 .type SafeFetch32,@function
duke@435 44 // Prototype: int SafeFetch32 (int * Adr, int ErrValue)
duke@435 45 SafeFetch32:
duke@435 46 movl %esi, %eax
duke@435 47 Fetch32PFI:
duke@435 48 movl (%rdi), %eax
duke@435 49 Fetch32Resume:
duke@435 50 ret
duke@435 51
duke@435 52 .globl SafeFetchN, FetchNPFI, FetchNResume
duke@435 53 .align 16
duke@435 54 .type SafeFetchN,@function
duke@435 55 // Prototype: intptr_t SafeFetchN (intptr_t * Adr, intptr_t ErrValue)
duke@435 56 SafeFetchN:
duke@435 57 movq %rsi, %rax
duke@435 58 FetchNPFI:
duke@435 59 movq (%rdi), %rax
duke@435 60 FetchNResume:
duke@435 61 ret
duke@435 62
duke@435 63 .globl SpinPause
duke@435 64 .align 16
duke@435 65 .type SpinPause,@function
duke@435 66 SpinPause:
duke@435 67 rep
duke@435 68 nop
duke@435 69 movq $1, %rax
duke@435 70 ret
duke@435 71
duke@435 72 # Support for void Copy::arrayof_conjoint_bytes(void* from,
duke@435 73 # void* to,
duke@435 74 # size_t count)
duke@435 75 # rdi - from
duke@435 76 # rsi - to
duke@435 77 # rdx - count, treated as ssize_t
duke@435 78 #
duke@435 79 .p2align 4,,15
duke@435 80 .type _Copy_arrayof_conjoint_bytes,@function
duke@435 81 _Copy_arrayof_conjoint_bytes:
duke@435 82 movq %rdx,%r8 # byte count
duke@435 83 shrq $3,%rdx # qword count
duke@435 84 cmpq %rdi,%rsi
duke@435 85 leaq -1(%rdi,%r8,1),%rax # from + bcount*1 - 1
duke@435 86 jbe acb_CopyRight
duke@435 87 cmpq %rax,%rsi
duke@435 88 jbe acb_CopyLeft
duke@435 89 acb_CopyRight:
duke@435 90 leaq -8(%rdi,%rdx,8),%rax # from + qcount*8 - 8
duke@435 91 leaq -8(%rsi,%rdx,8),%rcx # to + qcount*8 - 8
duke@435 92 negq %rdx
duke@435 93 jmp 7f
duke@435 94 .p2align 4,,15
duke@435 95 1: movq 8(%rax,%rdx,8),%rsi
duke@435 96 movq %rsi,8(%rcx,%rdx,8)
duke@435 97 addq $1,%rdx
duke@435 98 jnz 1b
duke@435 99 2: testq $4,%r8 # check for trailing dword
duke@435 100 jz 3f
duke@435 101 movl 8(%rax),%esi # copy trailing dword
duke@435 102 movl %esi,8(%rcx)
duke@435 103 addq $4,%rax
duke@435 104 addq $4,%rcx # original %rsi is trashed, so we
duke@435 105 # can't use it as a base register
duke@435 106 3: testq $2,%r8 # check for trailing word
duke@435 107 jz 4f
duke@435 108 movw 8(%rax),%si # copy trailing word
duke@435 109 movw %si,8(%rcx)
duke@435 110 addq $2,%rcx
duke@435 111 4: testq $1,%r8 # check for trailing byte
duke@435 112 jz 5f
duke@435 113 movb -1(%rdi,%r8,1),%al # copy trailing byte
duke@435 114 movb %al,8(%rcx)
duke@435 115 5: ret
duke@435 116 .p2align 4,,15
duke@435 117 6: movq -24(%rax,%rdx,8),%rsi
duke@435 118 movq %rsi,-24(%rcx,%rdx,8)
duke@435 119 movq -16(%rax,%rdx,8),%rsi
duke@435 120 movq %rsi,-16(%rcx,%rdx,8)
duke@435 121 movq -8(%rax,%rdx,8),%rsi
duke@435 122 movq %rsi,-8(%rcx,%rdx,8)
duke@435 123 movq (%rax,%rdx,8),%rsi
duke@435 124 movq %rsi,(%rcx,%rdx,8)
duke@435 125 7: addq $4,%rdx
duke@435 126 jle 6b
duke@435 127 subq $4,%rdx
duke@435 128 jl 1b
duke@435 129 jmp 2b
duke@435 130 acb_CopyLeft:
duke@435 131 testq $1,%r8 # check for trailing byte
duke@435 132 jz 1f
duke@435 133 movb -1(%rdi,%r8,1),%cl # copy trailing byte
duke@435 134 movb %cl,-1(%rsi,%r8,1)
duke@435 135 subq $1,%r8 # adjust for possible trailing word
duke@435 136 1: testq $2,%r8 # check for trailing word
duke@435 137 jz 2f
duke@435 138 movw -2(%rdi,%r8,1),%cx # copy trailing word
duke@435 139 movw %cx,-2(%rsi,%r8,1)
duke@435 140 2: testq $4,%r8 # check for trailing dword
duke@435 141 jz 5f
duke@435 142 movl (%rdi,%rdx,8),%ecx # copy trailing dword
duke@435 143 movl %ecx,(%rsi,%rdx,8)
duke@435 144 jmp 5f
duke@435 145 .p2align 4,,15
duke@435 146 3: movq -8(%rdi,%rdx,8),%rcx
duke@435 147 movq %rcx,-8(%rsi,%rdx,8)
duke@435 148 subq $1,%rdx
duke@435 149 jnz 3b
duke@435 150 ret
duke@435 151 .p2align 4,,15
duke@435 152 4: movq 24(%rdi,%rdx,8),%rcx
duke@435 153 movq %rcx,24(%rsi,%rdx,8)
duke@435 154 movq 16(%rdi,%rdx,8),%rcx
duke@435 155 movq %rcx,16(%rsi,%rdx,8)
duke@435 156 movq 8(%rdi,%rdx,8),%rcx
duke@435 157 movq %rcx,8(%rsi,%rdx,8)
duke@435 158 movq (%rdi,%rdx,8),%rcx
duke@435 159 movq %rcx,(%rsi,%rdx,8)
duke@435 160 5: subq $4,%rdx
duke@435 161 jge 4b
duke@435 162 addq $4,%rdx
duke@435 163 jg 3b
duke@435 164 ret
duke@435 165
duke@435 166 # Support for void Copy::arrayof_conjoint_jshorts(void* from,
duke@435 167 # void* to,
duke@435 168 # size_t count)
duke@435 169 # Equivalent to
duke@435 170 # conjoint_jshorts_atomic
duke@435 171 #
duke@435 172 # If 'from' and/or 'to' are aligned on 4- or 2-byte boundaries, we
duke@435 173 # let the hardware handle it. The tow or four words within dwords
duke@435 174 # or qwords that span cache line boundaries will still be loaded
duke@435 175 # and stored atomically.
duke@435 176 #
duke@435 177 # rdi - from
duke@435 178 # rsi - to
duke@435 179 # rdx - count, treated as ssize_t
duke@435 180 #
duke@435 181 .p2align 4,,15
duke@435 182 .type _Copy_arrayof_conjoint_jshorts,@function
duke@435 183 .type _Copy_conjoint_jshorts_atomic,@function
duke@435 184 _Copy_arrayof_conjoint_jshorts:
duke@435 185 _Copy_conjoint_jshorts_atomic:
duke@435 186 movq %rdx,%r8 # word count
duke@435 187 shrq $2,%rdx # qword count
duke@435 188 cmpq %rdi,%rsi
duke@435 189 leaq -2(%rdi,%r8,2),%rax # from + wcount*2 - 2
duke@435 190 jbe acs_CopyRight
duke@435 191 cmpq %rax,%rsi
duke@435 192 jbe acs_CopyLeft
duke@435 193 acs_CopyRight:
duke@435 194 leaq -8(%rdi,%rdx,8),%rax # from + qcount*8 - 8
duke@435 195 leaq -8(%rsi,%rdx,8),%rcx # to + qcount*8 - 8
duke@435 196 negq %rdx
duke@435 197 jmp 6f
duke@435 198 1: movq 8(%rax,%rdx,8),%rsi
duke@435 199 movq %rsi,8(%rcx,%rdx,8)
duke@435 200 addq $1,%rdx
duke@435 201 jnz 1b
duke@435 202 2: testq $2,%r8 # check for trailing dword
duke@435 203 jz 3f
duke@435 204 movl 8(%rax),%esi # copy trailing dword
duke@435 205 movl %esi,8(%rcx)
duke@435 206 addq $4,%rcx # original %rsi is trashed, so we
duke@435 207 # can't use it as a base register
duke@435 208 3: testq $1,%r8 # check for trailing word
duke@435 209 jz 4f
duke@435 210 movw -2(%rdi,%r8,2),%si # copy trailing word
duke@435 211 movw %si,8(%rcx)
duke@435 212 4: ret
duke@435 213 .p2align 4,,15
duke@435 214 5: movq -24(%rax,%rdx,8),%rsi
duke@435 215 movq %rsi,-24(%rcx,%rdx,8)
duke@435 216 movq -16(%rax,%rdx,8),%rsi
duke@435 217 movq %rsi,-16(%rcx,%rdx,8)
duke@435 218 movq -8(%rax,%rdx,8),%rsi
duke@435 219 movq %rsi,-8(%rcx,%rdx,8)
duke@435 220 movq (%rax,%rdx,8),%rsi
duke@435 221 movq %rsi,(%rcx,%rdx,8)
duke@435 222 6: addq $4,%rdx
duke@435 223 jle 5b
duke@435 224 subq $4,%rdx
duke@435 225 jl 1b
duke@435 226 jmp 2b
duke@435 227 acs_CopyLeft:
duke@435 228 testq $1,%r8 # check for trailing word
duke@435 229 jz 1f
duke@435 230 movw -2(%rdi,%r8,2),%cx # copy trailing word
duke@435 231 movw %cx,-2(%rsi,%r8,2)
duke@435 232 1: testq $2,%r8 # check for trailing dword
duke@435 233 jz 4f
duke@435 234 movl (%rdi,%rdx,8),%ecx # copy trailing dword
duke@435 235 movl %ecx,(%rsi,%rdx,8)
duke@435 236 jmp 4f
duke@435 237 2: movq -8(%rdi,%rdx,8),%rcx
duke@435 238 movq %rcx,-8(%rsi,%rdx,8)
duke@435 239 subq $1,%rdx
duke@435 240 jnz 2b
duke@435 241 ret
duke@435 242 .p2align 4,,15
duke@435 243 3: movq 24(%rdi,%rdx,8),%rcx
duke@435 244 movq %rcx,24(%rsi,%rdx,8)
duke@435 245 movq 16(%rdi,%rdx,8),%rcx
duke@435 246 movq %rcx,16(%rsi,%rdx,8)
duke@435 247 movq 8(%rdi,%rdx,8),%rcx
duke@435 248 movq %rcx,8(%rsi,%rdx,8)
duke@435 249 movq (%rdi,%rdx,8),%rcx
duke@435 250 movq %rcx,(%rsi,%rdx,8)
duke@435 251 4: subq $4,%rdx
duke@435 252 jge 3b
duke@435 253 addq $4,%rdx
duke@435 254 jg 2b
duke@435 255 ret
duke@435 256
duke@435 257 # Support for void Copy::arrayof_conjoint_jints(jint* from,
duke@435 258 # jint* to,
duke@435 259 # size_t count)
duke@435 260 # Equivalent to
duke@435 261 # conjoint_jints_atomic
duke@435 262 #
duke@435 263 # If 'from' and/or 'to' are aligned on 4-byte boundaries, we let
duke@435 264 # the hardware handle it. The two dwords within qwords that span
duke@435 265 # cache line boundaries will still be loaded and stored atomically.
duke@435 266 #
duke@435 267 # rdi - from
duke@435 268 # rsi - to
duke@435 269 # rdx - count, treated as ssize_t
duke@435 270 #
duke@435 271 .p2align 4,,15
duke@435 272 .type _Copy_arrayof_conjoint_jints,@function
duke@435 273 .type _Copy_conjoint_jints_atomic,@function
duke@435 274 _Copy_arrayof_conjoint_jints:
duke@435 275 _Copy_conjoint_jints_atomic:
duke@435 276 movq %rdx,%r8 # dword count
duke@435 277 shrq %rdx # qword count
duke@435 278 cmpq %rdi,%rsi
duke@435 279 leaq -4(%rdi,%r8,4),%rax # from + dcount*4 - 4
duke@435 280 jbe aci_CopyRight
duke@435 281 cmpq %rax,%rsi
duke@435 282 jbe aci_CopyLeft
duke@435 283 aci_CopyRight:
duke@435 284 leaq -8(%rdi,%rdx,8),%rax # from + qcount*8 - 8
duke@435 285 leaq -8(%rsi,%rdx,8),%rcx # to + qcount*8 - 8
duke@435 286 negq %rdx
duke@435 287 jmp 5f
duke@435 288 .p2align 4,,15
duke@435 289 1: movq 8(%rax,%rdx,8),%rsi
duke@435 290 movq %rsi,8(%rcx,%rdx,8)
duke@435 291 addq $1,%rdx
duke@435 292 jnz 1b
duke@435 293 2: testq $1,%r8 # check for trailing dword
duke@435 294 jz 3f
duke@435 295 movl 8(%rax),%esi # copy trailing dword
duke@435 296 movl %esi,8(%rcx)
duke@435 297 3: ret
duke@435 298 .p2align 4,,15
duke@435 299 4: movq -24(%rax,%rdx,8),%rsi
duke@435 300 movq %rsi,-24(%rcx,%rdx,8)
duke@435 301 movq -16(%rax,%rdx,8),%rsi
duke@435 302 movq %rsi,-16(%rcx,%rdx,8)
duke@435 303 movq -8(%rax,%rdx,8),%rsi
duke@435 304 movq %rsi,-8(%rcx,%rdx,8)
duke@435 305 movq (%rax,%rdx,8),%rsi
duke@435 306 movq %rsi,(%rcx,%rdx,8)
duke@435 307 5: addq $4,%rdx
duke@435 308 jle 4b
duke@435 309 subq $4,%rdx
duke@435 310 jl 1b
duke@435 311 jmp 2b
duke@435 312 aci_CopyLeft:
duke@435 313 testq $1,%r8 # check for trailing dword
duke@435 314 jz 3f
duke@435 315 movl -4(%rdi,%r8,4),%ecx # copy trailing dword
duke@435 316 movl %ecx,-4(%rsi,%r8,4)
duke@435 317 jmp 3f
duke@435 318 1: movq -8(%rdi,%rdx,8),%rcx
duke@435 319 movq %rcx,-8(%rsi,%rdx,8)
duke@435 320 subq $1,%rdx
duke@435 321 jnz 1b
duke@435 322 ret
duke@435 323 .p2align 4,,15
duke@435 324 2: movq 24(%rdi,%rdx,8),%rcx
duke@435 325 movq %rcx,24(%rsi,%rdx,8)
duke@435 326 movq 16(%rdi,%rdx,8),%rcx
duke@435 327 movq %rcx,16(%rsi,%rdx,8)
duke@435 328 movq 8(%rdi,%rdx,8),%rcx
duke@435 329 movq %rcx,8(%rsi,%rdx,8)
duke@435 330 movq (%rdi,%rdx,8),%rcx
duke@435 331 movq %rcx,(%rsi,%rdx,8)
duke@435 332 3: subq $4,%rdx
duke@435 333 jge 2b
duke@435 334 addq $4,%rdx
duke@435 335 jg 1b
duke@435 336 ret
duke@435 337
duke@435 338 # Support for void Copy::arrayof_conjoint_jlongs(jlong* from,
duke@435 339 # jlong* to,
duke@435 340 # size_t count)
duke@435 341 # Equivalent to
duke@435 342 # conjoint_jlongs_atomic
duke@435 343 # arrayof_conjoint_oops
duke@435 344 # conjoint_oops_atomic
duke@435 345 #
duke@435 346 # rdi - from
duke@435 347 # rsi - to
duke@435 348 # rdx - count, treated as ssize_t
duke@435 349 #
duke@435 350 .p2align 4,,15
duke@435 351 .type _Copy_arrayof_conjoint_jlongs,@function
duke@435 352 .type _Copy_conjoint_jlongs_atomic,@function
duke@435 353 _Copy_arrayof_conjoint_jlongs:
duke@435 354 _Copy_conjoint_jlongs_atomic:
duke@435 355 cmpq %rdi,%rsi
duke@435 356 leaq -8(%rdi,%rdx,8),%rax # from + count*8 - 8
duke@435 357 jbe acl_CopyRight
duke@435 358 cmpq %rax,%rsi
duke@435 359 jbe acl_CopyLeft
duke@435 360 acl_CopyRight:
duke@435 361 leaq -8(%rsi,%rdx,8),%rcx # to + count*8 - 8
duke@435 362 negq %rdx
duke@435 363 jmp 3f
duke@435 364 1: movq 8(%rax,%rdx,8),%rsi
duke@435 365 movq %rsi,8(%rcx,%rdx,8)
duke@435 366 addq $1,%rdx
duke@435 367 jnz 1b
duke@435 368 ret
duke@435 369 .p2align 4,,15
duke@435 370 2: movq -24(%rax,%rdx,8),%rsi
duke@435 371 movq %rsi,-24(%rcx,%rdx,8)
duke@435 372 movq -16(%rax,%rdx,8),%rsi
duke@435 373 movq %rsi,-16(%rcx,%rdx,8)
duke@435 374 movq -8(%rax,%rdx,8),%rsi
duke@435 375 movq %rsi,-8(%rcx,%rdx,8)
duke@435 376 movq (%rax,%rdx,8),%rsi
duke@435 377 movq %rsi,(%rcx,%rdx,8)
duke@435 378 3: addq $4,%rdx
duke@435 379 jle 2b
duke@435 380 subq $4,%rdx
duke@435 381 jl 1b
duke@435 382 ret
duke@435 383 4: movq -8(%rdi,%rdx,8),%rcx
duke@435 384 movq %rcx,-8(%rsi,%rdx,8)
duke@435 385 subq $1,%rdx
duke@435 386 jnz 4b
duke@435 387 ret
duke@435 388 .p2align 4,,15
duke@435 389 5: movq 24(%rdi,%rdx,8),%rcx
duke@435 390 movq %rcx,24(%rsi,%rdx,8)
duke@435 391 movq 16(%rdi,%rdx,8),%rcx
duke@435 392 movq %rcx,16(%rsi,%rdx,8)
duke@435 393 movq 8(%rdi,%rdx,8),%rcx
duke@435 394 movq %rcx,8(%rsi,%rdx,8)
duke@435 395 movq (%rdi,%rdx,8),%rcx
duke@435 396 movq %rcx,(%rsi,%rdx,8)
duke@435 397 acl_CopyLeft:
duke@435 398 subq $4,%rdx
duke@435 399 jge 5b
duke@435 400 addq $4,%rdx
duke@435 401 jg 4b
duke@435 402 ret

mercurial