1 //
   2 // Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
   3 // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4 //
   5 // This code is free software; you can redistribute it and/or modify it
   6 // under the terms of the GNU General Public License version 2 only, as
   7 // published by the Free Software Foundation.
   8 //
   9 // This code is distributed in the hope that it will be useful, but WITHOUT
  10 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12 // version 2 for more details (a copy is included in the LICENSE file that
  13 // accompanied this code).
  14 //
  15 // You should have received a copy of the GNU General Public License version
  16 // 2 along with this work; if not, write to the Free Software Foundation,
  17 // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18 //
  19 // Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20 // or visit www.oracle.com if you need additional information or have any
  21 // questions.
  22 //  
  23 //
  24 
  25 
  26   // Support for u8 os::setup_fpu()
  27       .inline _solaris_raw_setup_fpu,1
  28       movl     0(%esp), %eax
  29       fldcw    (%eax)
  30       .end
  31 
  32   // The argument size of each inline directive is ignored by the compiler
  33   // and is set to 0 for compatibility reason.
  34 
  35   // Get the raw thread ID from %gs:0
  36       .inline _raw_thread_id,0
  37       movl     %gs:0, %eax 
  38       .end
  39 
  40   // Get current sp
  41       .inline _get_current_sp,0
  42       .volatile
  43       movl     %esp, %eax 
  44       .end
  45 
  46   // Get current fp
  47       .inline _get_current_fp,0
  48       .volatile
  49       movl     %ebp, %eax 
  50       .end
  51 
  52   // Support for os::rdtsc()
  53       .inline _raw_rdtsc,0
  54       rdtsc
  55       .end
  56 
  57   // Support for jint Atomic::add(jint inc, volatile jint* dest)
  58   // An additional bool (os::is_MP()) is passed as the last argument.
  59       .inline _Atomic_add,3
  60       movl     0(%esp), %eax   // inc
  61       movl     4(%esp), %edx   // dest
  62       movl     %eax, %ecx
  63       cmpl     $0, 8(%esp)     // MP test
  64       jne      1f
  65       xaddl    %eax, (%edx)
  66       jmp      2f
  67 1:    lock
  68       xaddl    %eax, (%edx)
  69 2:    addl     %ecx, %eax
  70       .end
  71 
  72   // Support for jint Atomic::xchg(jint exchange_value, volatile jint* dest).
  73       .inline _Atomic_xchg,2
  74       movl     0(%esp), %eax   // exchange_value
  75       movl     4(%esp), %ecx   // dest
  76       xchgl    (%ecx), %eax
  77       .end
  78 
  79   // Support for jbyte Atomic::cmpxchg(jbyte exchange_value, 
  80   //                                   volatile jbyte *dest, 
  81   //                                   jbyte compare_value)
  82   // An additional bool (os::is_MP()) is passed as the last argument.
  83       .inline _Atomic_cmpxchg_byte,4
  84       movb     8(%esp), %al   // compare_value
  85       movb     0(%esp), %cl   // exchange_value
  86       movl     4(%esp), %edx   // dest
  87       cmp      $0, 12(%esp)    // MP test
  88       jne      1f
  89       cmpxchgb %cl, (%edx)
  90       jmp      2f
  91 1:    lock
  92       cmpxchgb %cl, (%edx)
  93 2:
  94       .end
  95 
  96   // Support for jint Atomic::cmpxchg(jint exchange_value, 
  97   //                                  volatile jint *dest, 
  98   //                                  jint compare_value)
  99   // An additional bool (os::is_MP()) is passed as the last argument.
 100       .inline _Atomic_cmpxchg,4
 101       movl     8(%esp), %eax   // compare_value
 102       movl     0(%esp), %ecx   // exchange_value
 103       movl     4(%esp), %edx   // dest
 104       cmp      $0, 12(%esp)    // MP test
 105       jne      1f
 106       cmpxchgl %ecx, (%edx)
 107       jmp      2f
 108 1:    lock
 109       cmpxchgl %ecx, (%edx)
 110 2:
 111       .end
 112 
 113   // Support for jlong Atomic::cmpxchg(jlong exchange_value,
 114   //                                   volatile jlong* dest,
 115   //                                   jlong compare_value)
 116   // An additional bool (os::is_MP()) is passed as the last argument.
 117       .inline _Atomic_cmpxchg_long,6
 118       pushl    %ebx
 119       pushl    %edi
 120       movl     20(%esp), %eax  // compare_value (low)
 121       movl     24(%esp), %edx  // compare_value (high)
 122       movl     16(%esp), %edi  // dest
 123       movl     8(%esp), %ebx   // exchange_value (low)
 124       movl     12(%esp), %ecx  // exchange_high (high)
 125       cmp      $0, 28(%esp)    // MP test
 126       jne      1f
 127       cmpxchg8b (%edi)
 128       jmp      2f
 129 1:    lock
 130       cmpxchg8b (%edi)
 131 2:    popl     %edi
 132       popl     %ebx
 133       .end
 134 
 135   // Support for jlong Atomic::load and Atomic::store.
 136   // void _Atomic_move_long(volatile jlong* src, volatile jlong* dst)
 137       .inline _Atomic_move_long,2
 138       movl     0(%esp), %eax   // src
 139       fildll    (%eax)
 140       movl     4(%esp), %eax   // dest
 141       fistpll   (%eax)
 142       .end
 143 
 144   // Support for OrderAccess::acquire()
 145       .inline _OrderAccess_acquire,0
 146       movl     0(%esp), %eax
 147       .end
 148 
 149   // Support for OrderAccess::fence()
 150       .inline _OrderAccess_fence,0
 151       lock
 152       addl     $0, (%esp)
 153       .end
 154 
 155   // Support for u2 Bytes::swap_u2(u2 x)
 156       .inline _raw_swap_u2,1
 157       movl     0(%esp), %eax
 158       xchgb    %al, %ah
 159       .end
 160 
 161   // Support for u4 Bytes::swap_u4(u4 x)
 162       .inline _raw_swap_u4,1
 163       movl     0(%esp), %eax
 164       bswap    %eax
 165       .end
 166 
 167   // Support for u8 Bytes::swap_u8_base(u4 x, u4 y)
 168       .inline _raw_swap_u8,2
 169       movl     4(%esp), %eax   // y
 170       movl     0(%esp), %edx   // x
 171       bswap    %eax
 172       bswap    %edx
 173       .end