annotate src/os_cpu/linux_x86/vm/linux_x86_64.s @ 3193:52087773be5b

IdealGraphVisualizer: Make scheduling more robust by ignoring graphs without any nodes and by using the node with the lowest id as root when there is no node labeled "Root" and no node without predecessors
author Peter Hofer <peter.hofer@jku.at>
date Fri, 08 Jul 2011 14:26:12 +0200
parents c18cbe5936b8
children 980532a806a5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 #
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
2 # Copyright (c) 2004, 2007, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 #
a61af66fc99e Initial load
duke
parents:
diff changeset
5 # This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 # under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 # published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 #
a61af66fc99e Initial load
duke
parents:
diff changeset
9 # This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 # version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 # accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 #
a61af66fc99e Initial load
duke
parents:
diff changeset
15 # You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 # 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 #
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
19 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
20 # or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
21 # questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 #
a61af66fc99e Initial load
duke
parents:
diff changeset
23
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 # NOTE WELL! The _Copy functions are called directly
a61af66fc99e Initial load
duke
parents:
diff changeset
26 # from server-compiler-generated code via CallLeafNoFP,
a61af66fc99e Initial load
duke
parents:
diff changeset
27 # which means that they *must* either not use floating
a61af66fc99e Initial load
duke
parents:
diff changeset
28 # point or use it in the same manner as does the server
a61af66fc99e Initial load
duke
parents:
diff changeset
29 # compiler.
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 .globl _Copy_arrayof_conjoint_bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
32 .globl _Copy_arrayof_conjoint_jshorts
a61af66fc99e Initial load
duke
parents:
diff changeset
33 .globl _Copy_conjoint_jshorts_atomic
a61af66fc99e Initial load
duke
parents:
diff changeset
34 .globl _Copy_arrayof_conjoint_jints
a61af66fc99e Initial load
duke
parents:
diff changeset
35 .globl _Copy_conjoint_jints_atomic
a61af66fc99e Initial load
duke
parents:
diff changeset
36 .globl _Copy_arrayof_conjoint_jlongs
a61af66fc99e Initial load
duke
parents:
diff changeset
37 .globl _Copy_conjoint_jlongs_atomic
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 .text
a61af66fc99e Initial load
duke
parents:
diff changeset
40
a61af66fc99e Initial load
duke
parents:
diff changeset
41 .globl SafeFetch32, Fetch32PFI, Fetch32Resume
a61af66fc99e Initial load
duke
parents:
diff changeset
42 .align 16
a61af66fc99e Initial load
duke
parents:
diff changeset
43 .type SafeFetch32,@function
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // Prototype: int SafeFetch32 (int * Adr, int ErrValue)
a61af66fc99e Initial load
duke
parents:
diff changeset
45 SafeFetch32:
a61af66fc99e Initial load
duke
parents:
diff changeset
46 movl %esi, %eax
a61af66fc99e Initial load
duke
parents:
diff changeset
47 Fetch32PFI:
a61af66fc99e Initial load
duke
parents:
diff changeset
48 movl (%rdi), %eax
a61af66fc99e Initial load
duke
parents:
diff changeset
49 Fetch32Resume:
a61af66fc99e Initial load
duke
parents:
diff changeset
50 ret
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52 .globl SafeFetchN, FetchNPFI, FetchNResume
a61af66fc99e Initial load
duke
parents:
diff changeset
53 .align 16
a61af66fc99e Initial load
duke
parents:
diff changeset
54 .type SafeFetchN,@function
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // Prototype: intptr_t SafeFetchN (intptr_t * Adr, intptr_t ErrValue)
a61af66fc99e Initial load
duke
parents:
diff changeset
56 SafeFetchN:
a61af66fc99e Initial load
duke
parents:
diff changeset
57 movq %rsi, %rax
a61af66fc99e Initial load
duke
parents:
diff changeset
58 FetchNPFI:
a61af66fc99e Initial load
duke
parents:
diff changeset
59 movq (%rdi), %rax
a61af66fc99e Initial load
duke
parents:
diff changeset
60 FetchNResume:
a61af66fc99e Initial load
duke
parents:
diff changeset
61 ret
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 .globl SpinPause
a61af66fc99e Initial load
duke
parents:
diff changeset
64 .align 16
a61af66fc99e Initial load
duke
parents:
diff changeset
65 .type SpinPause,@function
a61af66fc99e Initial load
duke
parents:
diff changeset
66 SpinPause:
a61af66fc99e Initial load
duke
parents:
diff changeset
67 rep
a61af66fc99e Initial load
duke
parents:
diff changeset
68 nop
a61af66fc99e Initial load
duke
parents:
diff changeset
69 movq $1, %rax
a61af66fc99e Initial load
duke
parents:
diff changeset
70 ret
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 # Support for void Copy::arrayof_conjoint_bytes(void* from,
a61af66fc99e Initial load
duke
parents:
diff changeset
73 # void* to,
a61af66fc99e Initial load
duke
parents:
diff changeset
74 # size_t count)
a61af66fc99e Initial load
duke
parents:
diff changeset
75 # rdi - from
a61af66fc99e Initial load
duke
parents:
diff changeset
76 # rsi - to
a61af66fc99e Initial load
duke
parents:
diff changeset
77 # rdx - count, treated as ssize_t
a61af66fc99e Initial load
duke
parents:
diff changeset
78 #
a61af66fc99e Initial load
duke
parents:
diff changeset
79 .p2align 4,,15
a61af66fc99e Initial load
duke
parents:
diff changeset
80 .type _Copy_arrayof_conjoint_bytes,@function
a61af66fc99e Initial load
duke
parents:
diff changeset
81 _Copy_arrayof_conjoint_bytes:
a61af66fc99e Initial load
duke
parents:
diff changeset
82 movq %rdx,%r8 # byte count
a61af66fc99e Initial load
duke
parents:
diff changeset
83 shrq $3,%rdx # qword count
a61af66fc99e Initial load
duke
parents:
diff changeset
84 cmpq %rdi,%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
85 leaq -1(%rdi,%r8,1),%rax # from + bcount*1 - 1
a61af66fc99e Initial load
duke
parents:
diff changeset
86 jbe acb_CopyRight
a61af66fc99e Initial load
duke
parents:
diff changeset
87 cmpq %rax,%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
88 jbe acb_CopyLeft
a61af66fc99e Initial load
duke
parents:
diff changeset
89 acb_CopyRight:
a61af66fc99e Initial load
duke
parents:
diff changeset
90 leaq -8(%rdi,%rdx,8),%rax # from + qcount*8 - 8
a61af66fc99e Initial load
duke
parents:
diff changeset
91 leaq -8(%rsi,%rdx,8),%rcx # to + qcount*8 - 8
a61af66fc99e Initial load
duke
parents:
diff changeset
92 negq %rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
93 jmp 7f
a61af66fc99e Initial load
duke
parents:
diff changeset
94 .p2align 4,,15
a61af66fc99e Initial load
duke
parents:
diff changeset
95 1: movq 8(%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
96 movq %rsi,8(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
97 addq $1,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
98 jnz 1b
a61af66fc99e Initial load
duke
parents:
diff changeset
99 2: testq $4,%r8 # check for trailing dword
a61af66fc99e Initial load
duke
parents:
diff changeset
100 jz 3f
a61af66fc99e Initial load
duke
parents:
diff changeset
101 movl 8(%rax),%esi # copy trailing dword
a61af66fc99e Initial load
duke
parents:
diff changeset
102 movl %esi,8(%rcx)
a61af66fc99e Initial load
duke
parents:
diff changeset
103 addq $4,%rax
a61af66fc99e Initial load
duke
parents:
diff changeset
104 addq $4,%rcx # original %rsi is trashed, so we
a61af66fc99e Initial load
duke
parents:
diff changeset
105 # can't use it as a base register
a61af66fc99e Initial load
duke
parents:
diff changeset
106 3: testq $2,%r8 # check for trailing word
a61af66fc99e Initial load
duke
parents:
diff changeset
107 jz 4f
a61af66fc99e Initial load
duke
parents:
diff changeset
108 movw 8(%rax),%si # copy trailing word
a61af66fc99e Initial load
duke
parents:
diff changeset
109 movw %si,8(%rcx)
a61af66fc99e Initial load
duke
parents:
diff changeset
110 addq $2,%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
111 4: testq $1,%r8 # check for trailing byte
a61af66fc99e Initial load
duke
parents:
diff changeset
112 jz 5f
a61af66fc99e Initial load
duke
parents:
diff changeset
113 movb -1(%rdi,%r8,1),%al # copy trailing byte
a61af66fc99e Initial load
duke
parents:
diff changeset
114 movb %al,8(%rcx)
a61af66fc99e Initial load
duke
parents:
diff changeset
115 5: ret
a61af66fc99e Initial load
duke
parents:
diff changeset
116 .p2align 4,,15
a61af66fc99e Initial load
duke
parents:
diff changeset
117 6: movq -24(%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
118 movq %rsi,-24(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
119 movq -16(%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
120 movq %rsi,-16(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
121 movq -8(%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
122 movq %rsi,-8(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
123 movq (%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
124 movq %rsi,(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
125 7: addq $4,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
126 jle 6b
a61af66fc99e Initial load
duke
parents:
diff changeset
127 subq $4,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
128 jl 1b
a61af66fc99e Initial load
duke
parents:
diff changeset
129 jmp 2b
a61af66fc99e Initial load
duke
parents:
diff changeset
130 acb_CopyLeft:
a61af66fc99e Initial load
duke
parents:
diff changeset
131 testq $1,%r8 # check for trailing byte
a61af66fc99e Initial load
duke
parents:
diff changeset
132 jz 1f
a61af66fc99e Initial load
duke
parents:
diff changeset
133 movb -1(%rdi,%r8,1),%cl # copy trailing byte
a61af66fc99e Initial load
duke
parents:
diff changeset
134 movb %cl,-1(%rsi,%r8,1)
a61af66fc99e Initial load
duke
parents:
diff changeset
135 subq $1,%r8 # adjust for possible trailing word
a61af66fc99e Initial load
duke
parents:
diff changeset
136 1: testq $2,%r8 # check for trailing word
a61af66fc99e Initial load
duke
parents:
diff changeset
137 jz 2f
a61af66fc99e Initial load
duke
parents:
diff changeset
138 movw -2(%rdi,%r8,1),%cx # copy trailing word
a61af66fc99e Initial load
duke
parents:
diff changeset
139 movw %cx,-2(%rsi,%r8,1)
a61af66fc99e Initial load
duke
parents:
diff changeset
140 2: testq $4,%r8 # check for trailing dword
a61af66fc99e Initial load
duke
parents:
diff changeset
141 jz 5f
a61af66fc99e Initial load
duke
parents:
diff changeset
142 movl (%rdi,%rdx,8),%ecx # copy trailing dword
a61af66fc99e Initial load
duke
parents:
diff changeset
143 movl %ecx,(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
144 jmp 5f
a61af66fc99e Initial load
duke
parents:
diff changeset
145 .p2align 4,,15
a61af66fc99e Initial load
duke
parents:
diff changeset
146 3: movq -8(%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
147 movq %rcx,-8(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
148 subq $1,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
149 jnz 3b
a61af66fc99e Initial load
duke
parents:
diff changeset
150 ret
a61af66fc99e Initial load
duke
parents:
diff changeset
151 .p2align 4,,15
a61af66fc99e Initial load
duke
parents:
diff changeset
152 4: movq 24(%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
153 movq %rcx,24(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
154 movq 16(%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
155 movq %rcx,16(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
156 movq 8(%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
157 movq %rcx,8(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
158 movq (%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
159 movq %rcx,(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
160 5: subq $4,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
161 jge 4b
a61af66fc99e Initial load
duke
parents:
diff changeset
162 addq $4,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
163 jg 3b
a61af66fc99e Initial load
duke
parents:
diff changeset
164 ret
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 # Support for void Copy::arrayof_conjoint_jshorts(void* from,
a61af66fc99e Initial load
duke
parents:
diff changeset
167 # void* to,
a61af66fc99e Initial load
duke
parents:
diff changeset
168 # size_t count)
a61af66fc99e Initial load
duke
parents:
diff changeset
169 # Equivalent to
a61af66fc99e Initial load
duke
parents:
diff changeset
170 # conjoint_jshorts_atomic
a61af66fc99e Initial load
duke
parents:
diff changeset
171 #
a61af66fc99e Initial load
duke
parents:
diff changeset
172 # If 'from' and/or 'to' are aligned on 4- or 2-byte boundaries, we
a61af66fc99e Initial load
duke
parents:
diff changeset
173 # let the hardware handle it. The tow or four words within dwords
a61af66fc99e Initial load
duke
parents:
diff changeset
174 # or qwords that span cache line boundaries will still be loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
175 # and stored atomically.
a61af66fc99e Initial load
duke
parents:
diff changeset
176 #
a61af66fc99e Initial load
duke
parents:
diff changeset
177 # rdi - from
a61af66fc99e Initial load
duke
parents:
diff changeset
178 # rsi - to
a61af66fc99e Initial load
duke
parents:
diff changeset
179 # rdx - count, treated as ssize_t
a61af66fc99e Initial load
duke
parents:
diff changeset
180 #
a61af66fc99e Initial load
duke
parents:
diff changeset
181 .p2align 4,,15
a61af66fc99e Initial load
duke
parents:
diff changeset
182 .type _Copy_arrayof_conjoint_jshorts,@function
a61af66fc99e Initial load
duke
parents:
diff changeset
183 .type _Copy_conjoint_jshorts_atomic,@function
a61af66fc99e Initial load
duke
parents:
diff changeset
184 _Copy_arrayof_conjoint_jshorts:
a61af66fc99e Initial load
duke
parents:
diff changeset
185 _Copy_conjoint_jshorts_atomic:
a61af66fc99e Initial load
duke
parents:
diff changeset
186 movq %rdx,%r8 # word count
a61af66fc99e Initial load
duke
parents:
diff changeset
187 shrq $2,%rdx # qword count
a61af66fc99e Initial load
duke
parents:
diff changeset
188 cmpq %rdi,%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
189 leaq -2(%rdi,%r8,2),%rax # from + wcount*2 - 2
a61af66fc99e Initial load
duke
parents:
diff changeset
190 jbe acs_CopyRight
a61af66fc99e Initial load
duke
parents:
diff changeset
191 cmpq %rax,%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
192 jbe acs_CopyLeft
a61af66fc99e Initial load
duke
parents:
diff changeset
193 acs_CopyRight:
a61af66fc99e Initial load
duke
parents:
diff changeset
194 leaq -8(%rdi,%rdx,8),%rax # from + qcount*8 - 8
a61af66fc99e Initial load
duke
parents:
diff changeset
195 leaq -8(%rsi,%rdx,8),%rcx # to + qcount*8 - 8
a61af66fc99e Initial load
duke
parents:
diff changeset
196 negq %rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
197 jmp 6f
a61af66fc99e Initial load
duke
parents:
diff changeset
198 1: movq 8(%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
199 movq %rsi,8(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
200 addq $1,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
201 jnz 1b
a61af66fc99e Initial load
duke
parents:
diff changeset
202 2: testq $2,%r8 # check for trailing dword
a61af66fc99e Initial load
duke
parents:
diff changeset
203 jz 3f
a61af66fc99e Initial load
duke
parents:
diff changeset
204 movl 8(%rax),%esi # copy trailing dword
a61af66fc99e Initial load
duke
parents:
diff changeset
205 movl %esi,8(%rcx)
a61af66fc99e Initial load
duke
parents:
diff changeset
206 addq $4,%rcx # original %rsi is trashed, so we
a61af66fc99e Initial load
duke
parents:
diff changeset
207 # can't use it as a base register
a61af66fc99e Initial load
duke
parents:
diff changeset
208 3: testq $1,%r8 # check for trailing word
a61af66fc99e Initial load
duke
parents:
diff changeset
209 jz 4f
a61af66fc99e Initial load
duke
parents:
diff changeset
210 movw -2(%rdi,%r8,2),%si # copy trailing word
a61af66fc99e Initial load
duke
parents:
diff changeset
211 movw %si,8(%rcx)
a61af66fc99e Initial load
duke
parents:
diff changeset
212 4: ret
a61af66fc99e Initial load
duke
parents:
diff changeset
213 .p2align 4,,15
a61af66fc99e Initial load
duke
parents:
diff changeset
214 5: movq -24(%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
215 movq %rsi,-24(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
216 movq -16(%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
217 movq %rsi,-16(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
218 movq -8(%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
219 movq %rsi,-8(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
220 movq (%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
221 movq %rsi,(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
222 6: addq $4,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
223 jle 5b
a61af66fc99e Initial load
duke
parents:
diff changeset
224 subq $4,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
225 jl 1b
a61af66fc99e Initial load
duke
parents:
diff changeset
226 jmp 2b
a61af66fc99e Initial load
duke
parents:
diff changeset
227 acs_CopyLeft:
a61af66fc99e Initial load
duke
parents:
diff changeset
228 testq $1,%r8 # check for trailing word
a61af66fc99e Initial load
duke
parents:
diff changeset
229 jz 1f
a61af66fc99e Initial load
duke
parents:
diff changeset
230 movw -2(%rdi,%r8,2),%cx # copy trailing word
a61af66fc99e Initial load
duke
parents:
diff changeset
231 movw %cx,-2(%rsi,%r8,2)
a61af66fc99e Initial load
duke
parents:
diff changeset
232 1: testq $2,%r8 # check for trailing dword
a61af66fc99e Initial load
duke
parents:
diff changeset
233 jz 4f
a61af66fc99e Initial load
duke
parents:
diff changeset
234 movl (%rdi,%rdx,8),%ecx # copy trailing dword
a61af66fc99e Initial load
duke
parents:
diff changeset
235 movl %ecx,(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
236 jmp 4f
a61af66fc99e Initial load
duke
parents:
diff changeset
237 2: movq -8(%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
238 movq %rcx,-8(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
239 subq $1,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
240 jnz 2b
a61af66fc99e Initial load
duke
parents:
diff changeset
241 ret
a61af66fc99e Initial load
duke
parents:
diff changeset
242 .p2align 4,,15
a61af66fc99e Initial load
duke
parents:
diff changeset
243 3: movq 24(%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
244 movq %rcx,24(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
245 movq 16(%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
246 movq %rcx,16(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
247 movq 8(%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
248 movq %rcx,8(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
249 movq (%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
250 movq %rcx,(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
251 4: subq $4,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
252 jge 3b
a61af66fc99e Initial load
duke
parents:
diff changeset
253 addq $4,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
254 jg 2b
a61af66fc99e Initial load
duke
parents:
diff changeset
255 ret
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 # Support for void Copy::arrayof_conjoint_jints(jint* from,
a61af66fc99e Initial load
duke
parents:
diff changeset
258 # jint* to,
a61af66fc99e Initial load
duke
parents:
diff changeset
259 # size_t count)
a61af66fc99e Initial load
duke
parents:
diff changeset
260 # Equivalent to
a61af66fc99e Initial load
duke
parents:
diff changeset
261 # conjoint_jints_atomic
a61af66fc99e Initial load
duke
parents:
diff changeset
262 #
a61af66fc99e Initial load
duke
parents:
diff changeset
263 # If 'from' and/or 'to' are aligned on 4-byte boundaries, we let
a61af66fc99e Initial load
duke
parents:
diff changeset
264 # the hardware handle it. The two dwords within qwords that span
a61af66fc99e Initial load
duke
parents:
diff changeset
265 # cache line boundaries will still be loaded and stored atomically.
a61af66fc99e Initial load
duke
parents:
diff changeset
266 #
a61af66fc99e Initial load
duke
parents:
diff changeset
267 # rdi - from
a61af66fc99e Initial load
duke
parents:
diff changeset
268 # rsi - to
a61af66fc99e Initial load
duke
parents:
diff changeset
269 # rdx - count, treated as ssize_t
a61af66fc99e Initial load
duke
parents:
diff changeset
270 #
a61af66fc99e Initial load
duke
parents:
diff changeset
271 .p2align 4,,15
a61af66fc99e Initial load
duke
parents:
diff changeset
272 .type _Copy_arrayof_conjoint_jints,@function
a61af66fc99e Initial load
duke
parents:
diff changeset
273 .type _Copy_conjoint_jints_atomic,@function
a61af66fc99e Initial load
duke
parents:
diff changeset
274 _Copy_arrayof_conjoint_jints:
a61af66fc99e Initial load
duke
parents:
diff changeset
275 _Copy_conjoint_jints_atomic:
a61af66fc99e Initial load
duke
parents:
diff changeset
276 movq %rdx,%r8 # dword count
a61af66fc99e Initial load
duke
parents:
diff changeset
277 shrq %rdx # qword count
a61af66fc99e Initial load
duke
parents:
diff changeset
278 cmpq %rdi,%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
279 leaq -4(%rdi,%r8,4),%rax # from + dcount*4 - 4
a61af66fc99e Initial load
duke
parents:
diff changeset
280 jbe aci_CopyRight
a61af66fc99e Initial load
duke
parents:
diff changeset
281 cmpq %rax,%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
282 jbe aci_CopyLeft
a61af66fc99e Initial load
duke
parents:
diff changeset
283 aci_CopyRight:
a61af66fc99e Initial load
duke
parents:
diff changeset
284 leaq -8(%rdi,%rdx,8),%rax # from + qcount*8 - 8
a61af66fc99e Initial load
duke
parents:
diff changeset
285 leaq -8(%rsi,%rdx,8),%rcx # to + qcount*8 - 8
a61af66fc99e Initial load
duke
parents:
diff changeset
286 negq %rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
287 jmp 5f
a61af66fc99e Initial load
duke
parents:
diff changeset
288 .p2align 4,,15
a61af66fc99e Initial load
duke
parents:
diff changeset
289 1: movq 8(%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
290 movq %rsi,8(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
291 addq $1,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
292 jnz 1b
a61af66fc99e Initial load
duke
parents:
diff changeset
293 2: testq $1,%r8 # check for trailing dword
a61af66fc99e Initial load
duke
parents:
diff changeset
294 jz 3f
a61af66fc99e Initial load
duke
parents:
diff changeset
295 movl 8(%rax),%esi # copy trailing dword
a61af66fc99e Initial load
duke
parents:
diff changeset
296 movl %esi,8(%rcx)
a61af66fc99e Initial load
duke
parents:
diff changeset
297 3: ret
a61af66fc99e Initial load
duke
parents:
diff changeset
298 .p2align 4,,15
a61af66fc99e Initial load
duke
parents:
diff changeset
299 4: movq -24(%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
300 movq %rsi,-24(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
301 movq -16(%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
302 movq %rsi,-16(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
303 movq -8(%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
304 movq %rsi,-8(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
305 movq (%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
306 movq %rsi,(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
307 5: addq $4,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
308 jle 4b
a61af66fc99e Initial load
duke
parents:
diff changeset
309 subq $4,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
310 jl 1b
a61af66fc99e Initial load
duke
parents:
diff changeset
311 jmp 2b
a61af66fc99e Initial load
duke
parents:
diff changeset
312 aci_CopyLeft:
a61af66fc99e Initial load
duke
parents:
diff changeset
313 testq $1,%r8 # check for trailing dword
a61af66fc99e Initial load
duke
parents:
diff changeset
314 jz 3f
a61af66fc99e Initial load
duke
parents:
diff changeset
315 movl -4(%rdi,%r8,4),%ecx # copy trailing dword
a61af66fc99e Initial load
duke
parents:
diff changeset
316 movl %ecx,-4(%rsi,%r8,4)
a61af66fc99e Initial load
duke
parents:
diff changeset
317 jmp 3f
a61af66fc99e Initial load
duke
parents:
diff changeset
318 1: movq -8(%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
319 movq %rcx,-8(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
320 subq $1,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
321 jnz 1b
a61af66fc99e Initial load
duke
parents:
diff changeset
322 ret
a61af66fc99e Initial load
duke
parents:
diff changeset
323 .p2align 4,,15
a61af66fc99e Initial load
duke
parents:
diff changeset
324 2: movq 24(%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
325 movq %rcx,24(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
326 movq 16(%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
327 movq %rcx,16(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
328 movq 8(%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
329 movq %rcx,8(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
330 movq (%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
331 movq %rcx,(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
332 3: subq $4,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
333 jge 2b
a61af66fc99e Initial load
duke
parents:
diff changeset
334 addq $4,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
335 jg 1b
a61af66fc99e Initial load
duke
parents:
diff changeset
336 ret
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338 # Support for void Copy::arrayof_conjoint_jlongs(jlong* from,
a61af66fc99e Initial load
duke
parents:
diff changeset
339 # jlong* to,
a61af66fc99e Initial load
duke
parents:
diff changeset
340 # size_t count)
a61af66fc99e Initial load
duke
parents:
diff changeset
341 # Equivalent to
a61af66fc99e Initial load
duke
parents:
diff changeset
342 # conjoint_jlongs_atomic
a61af66fc99e Initial load
duke
parents:
diff changeset
343 # arrayof_conjoint_oops
a61af66fc99e Initial load
duke
parents:
diff changeset
344 # conjoint_oops_atomic
a61af66fc99e Initial load
duke
parents:
diff changeset
345 #
a61af66fc99e Initial load
duke
parents:
diff changeset
346 # rdi - from
a61af66fc99e Initial load
duke
parents:
diff changeset
347 # rsi - to
a61af66fc99e Initial load
duke
parents:
diff changeset
348 # rdx - count, treated as ssize_t
a61af66fc99e Initial load
duke
parents:
diff changeset
349 #
a61af66fc99e Initial load
duke
parents:
diff changeset
350 .p2align 4,,15
a61af66fc99e Initial load
duke
parents:
diff changeset
351 .type _Copy_arrayof_conjoint_jlongs,@function
a61af66fc99e Initial load
duke
parents:
diff changeset
352 .type _Copy_conjoint_jlongs_atomic,@function
a61af66fc99e Initial load
duke
parents:
diff changeset
353 _Copy_arrayof_conjoint_jlongs:
a61af66fc99e Initial load
duke
parents:
diff changeset
354 _Copy_conjoint_jlongs_atomic:
a61af66fc99e Initial load
duke
parents:
diff changeset
355 cmpq %rdi,%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
356 leaq -8(%rdi,%rdx,8),%rax # from + count*8 - 8
a61af66fc99e Initial load
duke
parents:
diff changeset
357 jbe acl_CopyRight
a61af66fc99e Initial load
duke
parents:
diff changeset
358 cmpq %rax,%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
359 jbe acl_CopyLeft
a61af66fc99e Initial load
duke
parents:
diff changeset
360 acl_CopyRight:
a61af66fc99e Initial load
duke
parents:
diff changeset
361 leaq -8(%rsi,%rdx,8),%rcx # to + count*8 - 8
a61af66fc99e Initial load
duke
parents:
diff changeset
362 negq %rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
363 jmp 3f
a61af66fc99e Initial load
duke
parents:
diff changeset
364 1: movq 8(%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
365 movq %rsi,8(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
366 addq $1,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
367 jnz 1b
a61af66fc99e Initial load
duke
parents:
diff changeset
368 ret
a61af66fc99e Initial load
duke
parents:
diff changeset
369 .p2align 4,,15
a61af66fc99e Initial load
duke
parents:
diff changeset
370 2: movq -24(%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
371 movq %rsi,-24(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
372 movq -16(%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
373 movq %rsi,-16(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
374 movq -8(%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
375 movq %rsi,-8(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
376 movq (%rax,%rdx,8),%rsi
a61af66fc99e Initial load
duke
parents:
diff changeset
377 movq %rsi,(%rcx,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
378 3: addq $4,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
379 jle 2b
a61af66fc99e Initial load
duke
parents:
diff changeset
380 subq $4,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
381 jl 1b
a61af66fc99e Initial load
duke
parents:
diff changeset
382 ret
a61af66fc99e Initial load
duke
parents:
diff changeset
383 4: movq -8(%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
384 movq %rcx,-8(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
385 subq $1,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
386 jnz 4b
a61af66fc99e Initial load
duke
parents:
diff changeset
387 ret
a61af66fc99e Initial load
duke
parents:
diff changeset
388 .p2align 4,,15
a61af66fc99e Initial load
duke
parents:
diff changeset
389 5: movq 24(%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
390 movq %rcx,24(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
391 movq 16(%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
392 movq %rcx,16(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
393 movq 8(%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
394 movq %rcx,8(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
395 movq (%rdi,%rdx,8),%rcx
a61af66fc99e Initial load
duke
parents:
diff changeset
396 movq %rcx,(%rsi,%rdx,8)
a61af66fc99e Initial load
duke
parents:
diff changeset
397 acl_CopyLeft:
a61af66fc99e Initial load
duke
parents:
diff changeset
398 subq $4,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
399 jge 5b
a61af66fc99e Initial load
duke
parents:
diff changeset
400 addq $4,%rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
401 jg 4b
a61af66fc99e Initial load
duke
parents:
diff changeset
402 ret