src/os_cpu/solaris_x86/vm/solaris_x86_32.s

Thu, 16 Feb 2012 17:12:49 -0800

author
kvn
date
Thu, 16 Feb 2012 17:12:49 -0800
changeset 3577
9b8ce46870df
parent 2384
0a8e0d4345b3
child 5400
980532a806a5
permissions
-rw-r--r--

7145346: VerifyStackAtCalls is broken
Summary: Replace call_epilog() encoding with macroassembler use. Moved duplicated code to x86.ad. Fixed return_addr() definition.
Reviewed-by: never

     1 //
     2 // Copyright (c) 2004, 2010, 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 //
    24 	.globl fixcw
    25 	.globl sse_check
    26 	.globl sse_unavailable
    27 	.globl gs_load
    28 	.globl gs_thread
    29         .globl _Atomic_cmpxchg_long_gcc
    31         // NOTE WELL!  The _Copy functions are called directly
    32 	// from server-compiler-generated code via CallLeafNoFP,
    33 	// which means that they *must* either not use floating
    34 	// point or use it in the same manner as does the server
    35 	// compiler.
    37         .globl _Copy_conjoint_bytes
    38         .globl _Copy_arrayof_conjoint_bytes
    39         .globl _Copy_conjoint_jshorts_atomic
    40 	.globl _Copy_arrayof_conjoint_jshorts
    41         .globl _Copy_conjoint_jints_atomic
    42         .globl _Copy_arrayof_conjoint_jints
    43 	.globl _Copy_conjoint_jlongs_atomic
    44         .globl _mmx_Copy_arrayof_conjoint_jshorts
    46 	.section .text,"ax"
    48 / Support for void os::Solaris::init_thread_fpu_state() in os_solaris_i486.cpp
    49 / Set fpu to 53 bit precision.  This happens too early to use a stub.
    50 	.align   16
    51 fixcw:
    52 	pushl    $0x27f
    53 	fldcw    0(%esp)
    54 	popl     %eax
    55 	ret
    57        .align  16
    58        .globl  SafeFetch32
    59        .globl  SafeFetchN
    60        .globl  Fetch32PFI, Fetch32Resume
    61 SafeFetch32:
    62 SafeFetchN:
    63         movl    0x8(%esp), %eax
    64         movl    0x4(%esp), %ecx
    65 Fetch32PFI:
    66         movl    (%ecx), %eax
    67 Fetch32Resume:
    68         ret
    71         .align  16
    72         .globl  SpinPause
    73 SpinPause:
    74         rep 
    75         nop
    76         movl    $1, %eax
    77         ret
    80 / Test SSE availability, used by os_solaris_i486.cpp
    81 	.align   16
    82 sse_check:
    83 	/ Fault if SSE not available
    84 	xorps %xmm0,%xmm0
    85 	/ No fault
    86 	movl $1,%eax
    87 	ret
    88 	/ Signal handler continues here if SSE is not available
    89 sse_unavailable:
    90 	xorl %eax,%eax
    91 	ret
    93 / Fast thread accessors, used by threadLS_solaris_i486.cpp
    94 	.align   16
    95 gs_load:
    96 	movl 4(%esp),%ecx
    97 	movl %gs:(%ecx),%eax
    98 	ret
   100 	.align   16
   101 gs_thread:
   102 	movl %gs:0x0,%eax
   103 	ret
   105         / Support for void Copy::conjoint_bytes(void* from,
   106         /                                       void* to,
   107         /                                       size_t count)
   108         .align   16
   109 _Copy_conjoint_bytes:
   110         pushl    %esi
   111         movl     4+12(%esp),%ecx      / count
   112         pushl    %edi
   113         movl     8+ 4(%esp),%esi      / from
   114         movl     8+ 8(%esp),%edi      / to
   115         cmpl     %esi,%edi
   116         leal     -1(%esi,%ecx),%eax   / from + count - 1
   117         jbe      cb_CopyRight
   118         cmpl     %eax,%edi
   119         jbe      cb_CopyLeft
   120         / copy from low to high
   121 cb_CopyRight:
   122         cmpl     $3,%ecx
   123         jbe      5f                   / <= 3 bytes
   124         / align source address at dword address boundary
   125         movl     %ecx,%eax            / original count
   126         movl     $4,%ecx
   127         subl     %esi,%ecx
   128         andl     $3,%ecx              / prefix byte count
   129         jz       1f                   / no prefix
   130         subl     %ecx,%eax            / byte count less prefix
   131         / copy prefix
   132         subl     %esi,%edi
   133 0:      movb     (%esi),%dl
   134         movb     %dl,(%edi,%esi,1)
   135         addl     $1,%esi
   136         subl     $1,%ecx
   137         jnz      0b
   138         addl     %esi,%edi
   139 1:      movl     %eax,%ecx            / byte count less prefix
   140         shrl     $2,%ecx              / dword count
   141         jz       4f                   / no dwords to move
   142         cmpl     $32,%ecx
   143         jbe      2f                   / <= 32 dwords
   144         / copy aligned dwords
   145         rep;     smovl
   146         jmp      4f
   147         / copy aligned dwords
   148 2:      subl     %esi,%edi
   149         .align   16
   150 3:      movl     (%esi),%edx
   151         movl     %edx,(%edi,%esi,1)
   152         addl     $4,%esi
   153         subl     $1,%ecx
   154         jnz      3b
   155         addl     %esi,%edi
   156 4:      movl     %eax,%ecx            / byte count less prefix
   157 5:      andl     $3,%ecx              / suffix byte count
   158         jz       7f                   / no suffix
   159         / copy suffix
   160         xorl     %eax,%eax
   161 6:      movb     (%esi,%eax,1),%dl
   162         movb     %dl,(%edi,%eax,1)
   163         addl     $1,%eax
   164         subl     $1,%ecx
   165         jnz      6b
   166 7:      popl     %edi
   167         popl     %esi
   168         ret
   169         / copy from high to low
   170 cb_CopyLeft:
   171         std
   172         leal     -4(%edi,%ecx),%edi   / to + count - 4
   173         movl     %eax,%esi            / from + count - 1
   174         movl     %ecx,%eax
   175         subl     $3,%esi              / from + count - 4
   176         cmpl     $3,%ecx
   177         jbe      5f                   / <= 3 bytes
   178 1:      shrl     $2,%ecx              / dword count
   179         jz       4f                   / no dwords to move
   180         cmpl     $32,%ecx
   181         ja       3f                   / > 32 dwords
   182         / copy dwords, aligned or not
   183         subl     %esi,%edi
   184         .align   16
   185 2:      movl     (%esi),%edx
   186         movl     %edx,(%edi,%esi,1)
   187         subl     $4,%esi
   188         subl     $1,%ecx
   189         jnz      2b
   190         addl     %esi,%edi
   191         jmp      4f
   192         / copy dwords, aligned or not
   193 3:      rep;     smovl
   194 4:      movl     %eax,%ecx            / byte count
   195 5:      andl     $3,%ecx              / suffix byte count
   196         jz       7f                   / no suffix
   197         / copy suffix
   198         subl     %esi,%edi
   199         addl     $3,%esi
   200 6:      movb     (%esi),%dl
   201         movb     %dl,(%edi,%esi,1)
   202 	subl     $1,%esi
   203         subl     $1,%ecx
   204         jnz      6b
   205 7:      cld
   206         popl     %edi
   207         popl     %esi
   208         ret
   210         / Support for void Copy::arrayof_conjoint_bytes(void* from,
   211         /                                               void* to,
   212         /                                               size_t count)
   213         /
   214         / Same as _Copy_conjoint_bytes, except no source alignment check.
   215         .align   16
   216 _Copy_arrayof_conjoint_bytes:
   217         pushl    %esi
   218         movl     4+12(%esp),%ecx      / count
   219         pushl    %edi
   220         movl     8+ 4(%esp),%esi      / from
   221         movl     8+ 8(%esp),%edi      / to
   222         cmpl     %esi,%edi
   223         leal     -1(%esi,%ecx),%eax   / from + count - 1
   224         jbe      acb_CopyRight
   225         cmpl     %eax,%edi
   226         jbe      acb_CopyLeft 
   227         / copy from low to high
   228 acb_CopyRight:
   229         cmpl     $3,%ecx
   230         jbe      5f
   231 1:      movl     %ecx,%eax
   232         shrl     $2,%ecx
   233         jz       4f
   234         cmpl     $32,%ecx
   235         ja       3f
   236         / copy aligned dwords
   237         subl     %esi,%edi
   238         .align   16
   239 2:      movl     (%esi),%edx
   240         movl     %edx,(%edi,%esi,1)
   241         addl     $4,%esi
   242         subl     $1,%ecx
   243         jnz      2b
   244         addl     %esi,%edi
   245         jmp      4f
   246         / copy aligned dwords
   247 3:      rep;     smovl
   248 4:      movl     %eax,%ecx
   249 5:      andl     $3,%ecx
   250         jz       7f
   251         / copy suffix
   252         xorl     %eax,%eax
   253 6:      movb     (%esi,%eax,1),%dl
   254         movb     %dl,(%edi,%eax,1)
   255         addl     $1,%eax
   256         subl     $1,%ecx
   257         jnz      6b
   258 7:      popl     %edi
   259         popl     %esi
   260         ret
   261 acb_CopyLeft:
   262         std
   263         leal     -4(%edi,%ecx),%edi   / to + count - 4
   264         movl     %eax,%esi            / from + count - 1
   265         movl     %ecx,%eax
   266         subl     $3,%esi              / from + count - 4
   267         cmpl     $3,%ecx
   268         jbe      5f
   269 1:      shrl     $2,%ecx
   270         jz       4f
   271         cmpl     $32,%ecx
   272         jbe      2f                   / <= 32 dwords
   273         rep;     smovl
   274         jmp      4f
   275 	.=.+8
   276 2:      subl     %esi,%edi
   277         .align   16
   278 3:      movl     (%esi),%edx
   279         movl     %edx,(%edi,%esi,1)
   280         subl     $4,%esi
   281         subl     $1,%ecx
   282         jnz      3b
   283         addl     %esi,%edi
   284 4:      movl     %eax,%ecx
   285 5:      andl     $3,%ecx
   286         jz       7f
   287         subl     %esi,%edi
   288         addl     $3,%esi
   289 6:      movb     (%esi),%dl
   290         movb     %dl,(%edi,%esi,1)
   291 	subl     $1,%esi
   292         subl     $1,%ecx
   293         jnz      6b
   294 7:      cld
   295         popl     %edi
   296         popl     %esi
   297         ret
   299         / Support for void Copy::conjoint_jshorts_atomic(void* from,
   300         /                                                void* to,
   301         /                                                size_t count)
   302         .align   16
   303 _Copy_conjoint_jshorts_atomic:
   304         pushl    %esi
   305         movl     4+12(%esp),%ecx      / count
   306         pushl    %edi
   307         movl     8+ 4(%esp),%esi      / from
   308         movl     8+ 8(%esp),%edi      / to
   309         cmpl     %esi,%edi
   310         leal     -2(%esi,%ecx,2),%eax / from + count*2 - 2
   311         jbe      cs_CopyRight
   312         cmpl     %eax,%edi
   313         jbe      cs_CopyLeft 
   314         / copy from low to high
   315 cs_CopyRight:
   316         / align source address at dword address boundary
   317         movl     %esi,%eax            / original from
   318         andl     $3,%eax              / either 0 or 2
   319         jz       1f                   / no prefix
   320         / copy prefix
   321         subl     $1,%ecx
   322         jl       5f                   / zero count
   323         movw     (%esi),%dx
   324         movw     %dx,(%edi)
   325         addl     %eax,%esi            / %eax == 2
   326         addl     %eax,%edi
   327 1:      movl     %ecx,%eax            / word count less prefix
   328         sarl     %ecx                 / dword count
   329         jz       4f                   / no dwords to move
   330         cmpl     $32,%ecx
   331         jbe      2f                   / <= 32 dwords
   332         / copy aligned dwords
   333         rep;     smovl
   334         jmp      4f 
   335         / copy aligned dwords
   336 2:      subl     %esi,%edi
   337         .align   16
   338 3:      movl     (%esi),%edx
   339         movl     %edx,(%edi,%esi,1)
   340         addl     $4,%esi
   341         subl     $1,%ecx
   342         jnz      3b
   343         addl     %esi,%edi
   344 4:      andl     $1,%eax              / suffix count
   345         jz       5f                   / no suffix
   346         / copy suffix
   347         movw     (%esi),%dx
   348         movw     %dx,(%edi)
   349 5:      popl     %edi
   350         popl     %esi
   351         ret
   352         / copy from high to low
   353 cs_CopyLeft:
   354         std
   355         leal     -4(%edi,%ecx,2),%edi / to + count*2 - 4
   356         movl     %eax,%esi            / from + count*2 - 2
   357         movl     %ecx,%eax
   358         subl     $2,%esi              / from + count*2 - 4
   359 1:      sarl     %ecx                 / dword count
   360         jz       4f                   / no dwords to move
   361         cmpl     $32,%ecx
   362         ja       3f                   / > 32 dwords
   363         subl     %esi,%edi
   364         .align   16
   365 2:      movl     (%esi),%edx
   366         movl     %edx,(%edi,%esi,1)
   367         subl     $4,%esi
   368         subl     $1,%ecx
   369         jnz      2b
   370         addl     %esi,%edi
   371         jmp      4f
   372 3:      rep;     smovl
   373 4:      andl     $1,%eax              / suffix count
   374         jz       5f                   / no suffix
   375         / copy suffix
   376         addl     $2,%esi
   377         addl     $2,%edi
   378         movw     (%esi),%dx
   379         movw     %dx,(%edi)
   380 5:      cld
   381         popl     %edi
   382         popl     %esi
   383         ret
   385         / Support for void Copy::arrayof_conjoint_jshorts(void* from,
   386         /                                                 void* to,
   387         /                                                 size_t count)
   388         .align   16
   389 _Copy_arrayof_conjoint_jshorts:
   390         pushl    %esi
   391         movl     4+12(%esp),%ecx      / count
   392         pushl    %edi
   393         movl     8+ 4(%esp),%esi      / from
   394         movl     8+ 8(%esp),%edi      / to
   395         cmpl     %esi,%edi
   396         leal     -2(%esi,%ecx,2),%eax / from + count*2 - 2
   397         jbe      acs_CopyRight
   398         cmpl     %eax,%edi
   399         jbe      acs_CopyLeft 
   400 acs_CopyRight:
   401         movl     %ecx,%eax            / word count
   402         sarl     %ecx                 / dword count
   403         jz       4f                   / no dwords to move
   404         cmpl     $32,%ecx
   405         jbe      2f                   / <= 32 dwords
   406         / copy aligned dwords
   407         rep;     smovl 	 
   408         jmp      4f 
   409         / copy aligned dwords
   410         .=.+5
   411 2:      subl     %esi,%edi 
   412         .align   16	
   413 3:      movl     (%esi),%edx
   414         movl     %edx,(%edi,%esi,1)
   415         addl     $4,%esi
   416         subl     $1,%ecx
   417         jnz      3b
   418         addl     %esi,%edi
   419 4:      andl     $1,%eax              / suffix count
   420         jz       5f                   / no suffix
   421         / copy suffix
   422         movw     (%esi),%dx
   423         movw     %dx,(%edi)
   424 5:      popl     %edi
   425         popl     %esi
   426         ret
   427 acs_CopyLeft:
   428         std
   429         leal     -4(%edi,%ecx,2),%edi / to + count*2 - 4
   430         movl     %eax,%esi            / from + count*2 - 2
   431         movl     %ecx,%eax
   432         subl     $2,%esi              / from + count*2 - 4
   433         sarl     %ecx                 / dword count
   434         jz       4f                   / no dwords to move
   435         cmpl     $32,%ecx
   436         ja       3f                   / > 32 dwords
   437         subl     %esi,%edi
   438         .align   16
   439 2:      movl     (%esi),%edx
   440         movl     %edx,(%edi,%esi,1)
   441         subl     $4,%esi
   442         subl     $1,%ecx
   443         jnz      2b
   444         addl     %esi,%edi
   445         jmp      4f
   446 3:      rep;     smovl
   447 4:      andl     $1,%eax              / suffix count
   448         jz       5f                   / no suffix
   449         / copy suffix
   450         addl     $2,%esi
   451         addl     $2,%edi
   452         movw     (%esi),%dx
   453         movw     %dx,(%edi)
   454 5:      cld
   455         popl     %edi
   456         popl     %esi
   457         ret
   459         / Support for void Copy::conjoint_jints_atomic(void* from,
   460         /                                              void* to,
   461         /                                              size_t count)
   462         / Equivalent to
   463         /   arrayof_conjoint_jints
   464         .align   16
   465 _Copy_conjoint_jints_atomic:
   466 _Copy_arrayof_conjoint_jints:
   467         pushl    %esi
   468         movl     4+12(%esp),%ecx      / count
   469         pushl    %edi
   470         movl     8+ 4(%esp),%esi      / from
   471         movl     8+ 8(%esp),%edi      / to
   472         cmpl     %esi,%edi
   473         leal     -4(%esi,%ecx,4),%eax / from + count*4 - 4
   474         jbe      ci_CopyRight
   475         cmpl     %eax,%edi
   476         jbe      ci_CopyLeft 
   477 ci_CopyRight:
   478         cmpl     $32,%ecx
   479         jbe      2f                   / <= 32 dwords
   480         rep;     smovl 
   481         popl     %edi
   482         popl     %esi
   483         ret
   484         .=.+10
   485 2:      subl     %esi,%edi
   486         jmp      4f
   487         .align   16
   488 3:      movl     (%esi),%edx
   489         movl     %edx,(%edi,%esi,1)
   490         addl     $4,%esi
   491 4:      subl     $1,%ecx
   492         jge      3b
   493         popl     %edi
   494         popl     %esi
   495         ret
   496 ci_CopyLeft:
   497         std
   498         leal     -4(%edi,%ecx,4),%edi / to + count*4 - 4
   499         cmpl     $32,%ecx
   500         ja       4f                   / > 32 dwords
   501         subl     %eax,%edi            / eax == from + count*4 - 4
   502         jmp      3f
   503         .align   16
   504 2:      movl     (%eax),%edx
   505         movl     %edx,(%edi,%eax,1)
   506         subl     $4,%eax
   507 3:      subl     $1,%ecx
   508         jge      2b
   509         cld
   510         popl     %edi
   511         popl     %esi
   512         ret
   513 4:      movl     %eax,%esi            / from + count*4 - 4
   514         rep;     smovl
   515         cld
   516         popl     %edi
   517         popl     %esi
   518         ret
   520         / Support for void Copy::conjoint_jlongs_atomic(jlong* from,
   521         /                                               jlong* to,
   522         /                                               size_t count)
   523         /
   524         / 32-bit
   525         /
   526         / count treated as signed
   527         /
   528         / if (from > to) {
   529         /   while (--count >= 0) {
   530         /     *to++ = *from++;
   531         /   }
   532         / } else {
   533         /   while (--count >= 0) {
   534         /     to[count] = from[count];
   535         /   }
   536         / }
   537         .align   16
   538 _Copy_conjoint_jlongs_atomic:
   539         movl     4+8(%esp),%ecx       / count
   540         movl     4+0(%esp),%eax       / from
   541         movl     4+4(%esp),%edx       / to
   542         cmpl     %eax,%edx
   543         jae      cla_CopyLeft
   544 cla_CopyRight:
   545         subl     %eax,%edx
   546         jmp      2f
   547         .align   16
   548 1:      fildll   (%eax)
   549         fistpll  (%edx,%eax,1)
   550         addl     $8,%eax
   551 2:      subl     $1,%ecx
   552         jge      1b
   553         ret
   554         .align   16
   555 3:      fildll   (%eax,%ecx,8)
   556         fistpll  (%edx,%ecx,8)
   557 cla_CopyLeft:
   558         subl     $1,%ecx
   559         jge      3b
   560         ret
   562         / Support for void Copy::arrayof_conjoint_jshorts(void* from,
   563         /                                                 void* to,
   564         /                                                 size_t count)
   565        .align   16
   566 _mmx_Copy_arrayof_conjoint_jshorts:
   567         pushl    %esi
   568         movl     4+12(%esp),%ecx
   569         pushl    %edi
   570         movl     8+ 4(%esp),%esi
   571         movl     8+ 8(%esp),%edi
   572         cmpl     %esi,%edi
   573         leal     -2(%esi,%ecx,2),%eax
   574         jbe      mmx_acs_CopyRight
   575         cmpl     %eax,%edi
   576         jbe      mmx_acs_CopyLeft
   577 mmx_acs_CopyRight:
   578         movl     %ecx,%eax
   579         sarl     %ecx
   580         je       5f
   581         cmpl     $33,%ecx
   582         jae      3f
   583 1:      subl     %esi,%edi 
   584         .align   16
   585 2:      movl     (%esi),%edx
   586         movl     %edx,(%edi,%esi,1)
   587         addl     $4,%esi
   588         subl     $1,%ecx
   589         jnz      2b
   590         addl     %esi,%edi
   591         jmp      5f 
   592 3:      smovl / align to 8 bytes, we know we are 4 byte aligned to start
   593         subl     $1,%ecx
   594 4:      .align   16
   595         movq     0(%esi),%mm0
   596         addl     $64,%edi
   597         movq     8(%esi),%mm1
   598         subl     $16,%ecx
   599         movq     16(%esi),%mm2
   600         movq     %mm0,-64(%edi)
   601         movq     24(%esi),%mm0
   602         movq     %mm1,-56(%edi)
   603         movq     32(%esi),%mm1
   604         movq     %mm2,-48(%edi)
   605         movq     40(%esi),%mm2
   606         movq     %mm0,-40(%edi)
   607         movq     48(%esi),%mm0
   608         movq     %mm1,-32(%edi)
   609         movq     56(%esi),%mm1
   610         movq     %mm2,-24(%edi)
   611         movq     %mm0,-16(%edi)
   612         addl     $64,%esi
   613         movq     %mm1,-8(%edi)
   614         cmpl     $16,%ecx
   615         jge      4b
   616         emms
   617 	testl    %ecx,%ecx
   618 	ja       1b
   619 5:      andl     $1,%eax
   620         je       7f
   621 6:      movw     (%esi),%dx
   622         movw     %dx,(%edi)
   623 7:      popl     %edi
   624         popl     %esi
   625         ret
   626 mmx_acs_CopyLeft:
   627         std
   628         leal     -4(%edi,%ecx,2),%edi
   629         movl     %eax,%esi
   630         movl     %ecx,%eax
   631         subl     $2,%esi
   632         sarl     %ecx
   633         je       4f
   634         cmpl     $32,%ecx
   635         ja       3f
   636         subl     %esi,%edi
   637         .align   16
   638 2:      movl     (%esi),%edx
   639         movl     %edx,(%edi,%esi,1)
   640         subl     $4,%esi
   641         subl     $1,%ecx
   642         jnz      2b
   643         addl     %esi,%edi
   644         jmp      4f
   645 3:      rep;     smovl
   646 4:      andl     $1,%eax
   647         je       6f
   648         addl     $2,%esi
   649         addl     $2,%edi
   650 5:      movw     (%esi),%dx
   651         movw     %dx,(%edi)
   652 6:      cld
   653         popl     %edi
   654         popl     %esi
   655         ret
   658         / Support for jlong Atomic::cmpxchg(jlong exchange_value,
   659         /                                   volatile jlong* dest,
   660         /                                   jlong compare_value,
   661         /                                   bool is_MP)
   662         / Used only for Solaris/gcc builds
   663         .align 16
   664 _Atomic_cmpxchg_long_gcc:
   665                                    /  8(%esp) : return PC
   666         pushl    %ebx              /  4(%esp) : old %ebx
   667         pushl    %edi              /  0(%esp) : old %edi
   668         movl     12(%esp), %ebx    / 12(%esp) : exchange_value (low)
   669         movl     16(%esp), %ecx    / 16(%esp) : exchange_value (high)
   670         movl     24(%esp), %eax    / 24(%esp) : compare_value (low)
   671         movl     28(%esp), %edx    / 28(%esp) : compare_value (high)
   672         movl     20(%esp), %edi    / 20(%esp) : dest
   673         cmpl     $0, 32(%esp)      / 32(%esp) : is_MP
   674         je       1f
   675         lock
   676 1:      cmpxchg8b (%edi)
   677         popl     %edi
   678         popl     %ebx
   679         ret

mercurial