Mercurial > hg > truffle
diff src/os_cpu/solaris_x86/vm/solaris_x86_32.il @ 0:a61af66fc99e jdk7-b24
Initial load
author | duke |
---|---|
date | Sat, 01 Dec 2007 00:00:00 +0000 |
parents | |
children | 7b920868b475 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/os_cpu/solaris_x86/vm/solaris_x86_32.il Sat Dec 01 00:00:00 2007 +0000 @@ -0,0 +1,129 @@ +// +// Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. +// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +// +// This code is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License version 2 only, as +// published by the Free Software Foundation. +// +// This code is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// version 2 for more details (a copy is included in the LICENSE file that +// accompanied this code). +// +// You should have received a copy of the GNU General Public License version +// 2 along with this work; if not, write to the Free Software Foundation, +// Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +// +// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, +// CA 95054 USA or visit www.sun.com if you need additional information or +// have any questions. +// +// + + + // Support for u8 os::setup_fpu() + .inline _solaris_raw_setup_fpu,1 + movl 0(%esp), %eax + fldcw (%eax) + .end + + // The argument size of each inline directive is ignored by the compiler + // and is set to 0 for compatibility reason. + + // Get the raw thread ID from %gs:0 + .inline _raw_thread_id,0 + movl %gs:0, %eax + .end + + // Get callers fp + .inline _get_previous_fp,0 + movl %ebp, %eax + movl %eax, %eax + .end + + // Support for jint Atomic::add(jint inc, volatile jint* dest) + // An additional bool (os::is_MP()) is passed as the last argument. + .inline _Atomic_add,3 + movl 0(%esp), %eax // inc + movl 4(%esp), %edx // dest + movl %eax, %ecx + cmpl $0, 8(%esp) // MP test + je 1f + lock +1: xaddl %eax, (%edx) + addl %ecx, %eax + .end + + // Support for jint Atomic::xchg(jint exchange_value, volatile jint* dest). + .inline _Atomic_xchg,2 + movl 0(%esp), %eax // exchange_value + movl 4(%esp), %ecx // dest + xchgl (%ecx), %eax + .end + + // Support for jint Atomic::cmpxchg(jint exchange_value, + // volatile jint *dest, + // jint compare_value) + // An additional bool (os::is_MP()) is passed as the last argument. + .inline _Atomic_cmpxchg,4 + movl 8(%esp), %eax // compare_value + movl 0(%esp), %ecx // exchange_value + movl 4(%esp), %edx // dest + cmp $0, 12(%esp) // MP test + je 1f + lock +1: cmpxchgl %ecx, (%edx) + .end + + // Support for jlong Atomic::cmpxchg(jlong exchange_value, + // volatile jlong* dest, + // jlong compare_value) + // An additional bool (os::is_MP()) is passed as the last argument. + .inline _Atomic_cmpxchg_long,6 + pushl %ebx + pushl %edi + movl 20(%esp), %eax // compare_value (low) + movl 24(%esp), %edx // compare_value (high) + movl 16(%esp), %edi // dest + movl 8(%esp), %ebx // exchange_value (low) + movl 12(%esp), %ecx // exchange_high (high) + cmp $0, 28(%esp) // MP test + je 1f + lock +1: cmpxchg8b (%edi) + popl %edi + popl %ebx + .end + + // Support for OrderAccess::acquire() + .inline _OrderAccess_acquire,0 + movl 0(%esp), %eax + .end + + // Support for OrderAccess::fence() + .inline _OrderAccess_fence,0 + lock + addl $0, (%esp) + .end + + // Support for u2 Bytes::swap_u2(u2 x) + .inline _raw_swap_u2,1 + movl 0(%esp), %eax + xchgb %al, %ah + .end + + // Support for u4 Bytes::swap_u4(u4 x) + .inline _raw_swap_u4,1 + movl 0(%esp), %eax + bswap %eax + .end + + // Support for u8 Bytes::swap_u8_base(u4 x, u4 y) + .inline _raw_swap_u8,2 + movl 4(%esp), %eax // y + movl 0(%esp), %edx // x + bswap %eax + bswap %edx + .end