1
/****************************************************************************
3
** Copyright (C) 1992-2005 Trolltech AS. All rights reserved.
5
** This file is part of the core module of the Qt Toolkit.
7
** This file may be distributed under the terms of the Q Public License
8
** as defined by Trolltech AS of Norway and appearing in the file
9
** LICENSE.QPL included in the packaging of this file.
11
** This file may be distributed and/or modified under the terms of the
12
** GNU General Public License version 2 as published by the Free Software
13
** Foundation and appearing in the file LICENSE.GPL included in the
14
** packaging of this file.
16
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
17
** information about Qt Commercial License Agreements.
18
** See http://www.trolltech.com/qpl/ for QPL licensing information.
19
** See http://www.trolltech.com/gpl/ for GPL licensing information.
21
** Contact info@trolltech.com if any conditions of this licensing are
24
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
25
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
27
****************************************************************************/
29
#ifndef X86_64_QATOMIC_H
30
#define X86_64_QATOMIC_H
32
#include <QtCore/qglobal.h>
36
inline int q_atomic_test_and_set_int(volatile int *ptr, int expected, int newval)
39
asm volatile("lock cmpxchgl %2,%3\n"
41
: "=a" (newval), "=qm" (ret)
42
: "r" (newval), "m" (*ptr), "0" (expected)
44
return static_cast<int>(ret);
47
inline int q_atomic_test_and_set_ptr(volatile void *ptr, void *expected, void *newval)
50
asm volatile("lock cmpxchgq %2,%3\n"
52
: "=a" (newval), "=qm" (ret)
53
: "r" (newval), "m" (*reinterpret_cast<volatile long *>(ptr)), "0" (expected)
55
return static_cast<int>(ret);
58
inline int q_atomic_increment(volatile int *ptr)
61
asm volatile("lock incl %0\n"
63
: "=m" (*ptr), "=qm" (ret)
66
return static_cast<int>(ret);
69
inline int q_atomic_decrement(volatile int *ptr)
72
asm volatile("lock decl %0\n"
74
: "=m" (*ptr), "=qm" (ret)
77
return static_cast<int>(ret);
80
inline int q_atomic_set_int(volatile int *ptr, int newval)
82
asm volatile("xchgl %0,%1"
84
: "m" (*ptr), "0" (newval)
89
inline void *q_atomic_set_ptr(volatile void *ptr, void *newval)
91
asm volatile("xchgq %0,%1"
93
: "m" (*reinterpret_cast<volatile long *>(ptr)), "0" (newval)
100
#endif // X86_64_QATOMIC_H