Linux 4.6-rc6
[linux/fpc-iii.git] / arch / x86 / lib / cmpxchg8b_emu.S
blobad53497784904b2c1f420fd41576c9ffeea8ce0b
1 /*
2  *      This program is free software; you can redistribute it and/or
3  *      modify it under the terms of the GNU General Public License
4  *      as published by the Free Software Foundation; version 2
5  *      of the License.
6  *
7  */
9 #include <linux/linkage.h>
11 .text
14  * Inputs:
15  * %esi : memory location to compare
16  * %eax : low 32 bits of old value
17  * %edx : high 32 bits of old value
18  * %ebx : low 32 bits of new value
19  * %ecx : high 32 bits of new value
20  */
21 ENTRY(cmpxchg8b_emu)
24 # Emulate 'cmpxchg8b (%esi)' on UP except we don't
25 # set the whole ZF thing (caller will just compare
26 # eax:edx with the expected value)
28         pushfl
29         cli
31         cmpl  (%esi), %eax
32         jne .Lnot_same
33         cmpl 4(%esi), %edx
34         jne .Lhalf_same
36         movl %ebx,  (%esi)
37         movl %ecx, 4(%esi)
39         popfl
40         ret
42 .Lnot_same:
43         movl  (%esi), %eax
44 .Lhalf_same:
45         movl 4(%esi), %edx
47         popfl
48         ret
50 ENDPROC(cmpxchg8b_emu)