annotate src/os_cpu/bsd_x86/vm/bsd_x86_32.s @ 3960:f08d439fab8c

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