qatomic_powerpc.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:22k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the QtCore module of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
  23. ** exception, Nokia gives you certain additional rights. These rights
  24. ** are described in the Nokia Qt GPL Exception version 1.3, included in
  25. ** the file GPL_EXCEPTION.txt in this package.
  26. **
  27. ** Qt for Windows(R) Licensees
  28. ** As a special exception, Nokia, as the sole copyright holder for Qt
  29. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  30. ** right for the Qt/Eclipse Integration to link to functionality
  31. ** provided by Qt Designer and its related libraries.
  32. **
  33. ** If you are unsure which license is appropriate for your use, please
  34. ** contact the sales department at qt-sales@nokia.com.
  35. **
  36. ****************************************************************************/
  37. #ifndef QATOMIC_POWERPC_H
  38. #define QATOMIC_POWERPC_H
  39. QT_BEGIN_HEADER
  40. QT_BEGIN_NAMESPACE
  41. #define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
  42. inline bool QBasicAtomicInt::isReferenceCountingNative()
  43. { return true; }
  44. inline bool QBasicAtomicInt::isReferenceCountingWaitFree()
  45. { return false; }
  46. #define Q_ATOMIC_INT_TEST_AND_SET_IS_ALWAYS_NATIVE
  47. inline bool QBasicAtomicInt::isTestAndSetNative()
  48. { return true; }
  49. inline bool QBasicAtomicInt::isTestAndSetWaitFree()
  50. { return false; }
  51. #define Q_ATOMIC_INT_FETCH_AND_STORE_IS_ALWAYS_NATIVE
  52. inline bool QBasicAtomicInt::isFetchAndStoreNative()
  53. { return true; }
  54. inline bool QBasicAtomicInt::isFetchAndStoreWaitFree()
  55. { return false; }
  56. #define Q_ATOMIC_INT_FETCH_AND_ADD_IS_ALWAYS_NATIVE
  57. inline bool QBasicAtomicInt::isFetchAndAddNative()
  58. { return true; }
  59. inline bool QBasicAtomicInt::isFetchAndAddWaitFree()
  60. { return false; }
  61. #define Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE
  62. template <typename T>
  63. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetNative()
  64. { return true; }
  65. template <typename T>
  66. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetWaitFree()
  67. { return false; }
  68. #define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_ALWAYS_NATIVE
  69. template <typename T>
  70. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreNative()
  71. { return true; }
  72. template <typename T>
  73. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreWaitFree()
  74. { return false; }
  75. #define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_ALWAYS_NATIVE
  76. template <typename T>
  77. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddNative()
  78. { return true; }
  79. template <typename T>
  80. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddWaitFree()
  81. { return false; }
  82. QT_BEGIN_NAMESPACE
  83. #if defined(Q_CC_GNU)
  84. inline bool QBasicAtomicInt::ref()
  85. {
  86.     register int originalValue;
  87.     register int newValue;
  88.     asm volatile("lwarx  %[originalValue], 0, %[_q_value]n"
  89.                  "addi   %[newValue], %[originalValue], %[one]n"
  90.                  "stwcx. %[newValue], 0, %[_q_value]n"
  91.                  "bne-   $-12n"
  92.                  : [originalValue] "=&b" (originalValue),
  93.                    "+m" (_q_value),
  94.                    [newValue] "=&r" (newValue)
  95.                  : [_q_value] "r" (&_q_value),
  96.                    [one] "i" (1)
  97.                  : "cc", "memory");
  98.     return newValue != 0;
  99. }
  100. inline bool QBasicAtomicInt::deref()
  101. {
  102.     register int originalValue;
  103.     register int newValue;
  104.     asm volatile("lwarx  %[originalValue], 0, %[_q_value]n"
  105.                  "addi   %[newValue], %[originalValue], %[minusOne]n"
  106.                  "stwcx. %[newValue], 0, %[_q_value]n"
  107.                  "bne-   $-12n"
  108.                  : [originalValue] "=&b" (originalValue),
  109.                    "+m" (_q_value),
  110.                    [newValue] "=&r" (newValue)
  111.                  : [_q_value] "r" (&_q_value),
  112.                    [minusOne] "i" (-1)
  113.                  : "cc", "memory");
  114.     return newValue != 0;
  115. }
  116. inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue)
  117. {
  118.     register int result;
  119.     asm volatile("lwarx  %[result], 0, %[_q_value]n"
  120.                  "xor.   %[result], %[result], %[expectedValue]n"
  121.                  "bne    $+12n"
  122.                  "stwcx. %[newValue], 0, %[_q_value]n"
  123.                  "bne-   $-16n"
  124.                  : [result] "=&r" (result),
  125.                    "+m" (_q_value)
  126.                  : [_q_value] "r" (&_q_value),
  127.                    [expectedValue] "r" (expectedValue),
  128.                    [newValue] "r" (newValue)
  129.                  : "cc", "memory");
  130.     return result == 0;
  131. }
  132. inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue)
  133. {
  134.     register int result;
  135.     asm volatile("lwarx  %[result], 0, %[_q_value]n"
  136.                  "xor.   %[result], %[result], %[expectedValue]n"
  137.                  "bne    $+16n"
  138.                  "stwcx. %[newValue], 0, %[_q_value]n"
  139.                  "bne-   $-16n"
  140.                  "isyncn"
  141.                  : [result] "=&r" (result),
  142.                    "+m" (_q_value)
  143.                  : [_q_value] "r" (&_q_value),
  144.                    [expectedValue] "r" (expectedValue),
  145.                    [newValue] "r" (newValue)
  146.                  : "cc", "memory");
  147.     return result == 0;
  148. }
  149. inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue)
  150. {
  151.     register int result;
  152.     asm volatile("eieion"
  153.                  "lwarx  %[result], 0, %[_q_value]n"
  154.                  "xor.   %[result], %[result], %[expectedValue]n"
  155.                  "bne    $+12n"
  156.                  "stwcx. %[newValue],0,%[_q_value]n"
  157.                  "bne-   $-16n"
  158.                  : [result] "=&r" (result),
  159.                    "+m" (_q_value)
  160.                  : [_q_value] "r" (&_q_value),
  161.                    [expectedValue] "r" (expectedValue),
  162.                    [newValue] "r" (newValue)
  163.                  : "cc", "memory");
  164.     return result == 0;
  165. }
  166. inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue)
  167. {
  168.     register int originalValue;
  169.     asm volatile("lwarx  %[originalValue], 0, %[_q_value]n"
  170.                  "stwcx. %[newValue], 0, %[_q_value]n"
  171.                  "bne-   $-8n"
  172.                  : [originalValue] "=&r" (originalValue),
  173.                    "+m" (_q_value)
  174.                  : [_q_value] "r" (&_q_value),
  175.                    [newValue] "r" (newValue)
  176.                  : "cc", "memory");
  177.     return originalValue;
  178. }
  179. inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue)
  180. {
  181.     register int originalValue;
  182.     asm volatile("lwarx  %[originalValue], 0, %[_q_value]n"
  183.                  "stwcx. %[newValue], 0, %[_q_value]n"
  184.                  "bne-   $-8n"
  185.                  "isyncn"
  186.                  : [originalValue] "=&r" (originalValue),
  187.                    "+m" (_q_value)
  188.                  : [_q_value] "r" (&_q_value),
  189.                    [newValue] "r" (newValue)
  190.                  : "cc", "memory");
  191.     return originalValue;
  192. }
  193. inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue)
  194. {
  195.     register int originalValue;
  196.     asm volatile("eieion"
  197.                  "lwarx  %[originalValue], 0, %[_q_value]n"
  198.                  "stwcx. %[newValue], 0, %[_q_value]n"
  199.                  "bne-   $-8n"
  200.                  : [originalValue] "=&r" (originalValue),
  201.                    "+m" (_q_value)
  202.                  : [_q_value] "r" (&_q_value),
  203.                    [newValue] "r" (newValue)
  204.                  : "cc", "memory");
  205.     return originalValue;
  206. }
  207. inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd)
  208. {
  209.     register int originalValue;
  210.     register int newValue;
  211.     asm volatile("lwarx  %[originalValue], 0, %[_q_value]n"
  212.                  "add    %[newValue], %[originalValue], %[valueToAdd]n"
  213.                  "stwcx. %[newValue], 0, %[_q_value]n"
  214.                  "bne-   $-12n"
  215.                  : [originalValue] "=&r" (originalValue),
  216.                    [newValue] "=&r" (newValue),
  217.                    "+m" (_q_value)
  218.                  : [_q_value] "r" (&_q_value),
  219.                    [valueToAdd] "r" (valueToAdd)
  220.                  : "cc", "memory");
  221.     return originalValue;
  222. }
  223. inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd)
  224. {
  225.     register int originalValue;
  226.     register int newValue;
  227.     asm volatile("lwarx  %[originalValue], 0, %[_q_value]n"
  228.                  "add    %[newValue], %[originalValue], %[valueToAdd]n"
  229.                  "stwcx. %[newValue], 0, %[_q_value]n"
  230.                  "bne-   $-12n"
  231.                  "isyncn"
  232.                  : [originalValue] "=&r" (originalValue),
  233.                    [newValue] "=&r" (newValue),
  234.                    "+m" (_q_value)
  235.                  : [_q_value] "r" (&_q_value),
  236.                    [valueToAdd] "r" (valueToAdd)
  237.                  : "cc", "memory");
  238.     return originalValue;
  239. }
  240. inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd)
  241. {
  242.     register int originalValue;
  243.     register int newValue;
  244.     asm volatile("eieion"
  245.                  "lwarx  %[originalValue], 0, %[_q_value]n"
  246.                  "add    %[newValue], %[originalValue], %[valueToAdd]n"
  247.                  "stwcx. %[newValue], 0, %[_q_value]n"
  248.                  "bne-   $-12n"
  249.                  : [originalValue] "=&r" (originalValue),
  250.                    [newValue] "=&r" (newValue),
  251.                    "+m" (_q_value)
  252.                  : [_q_value] "r" (&_q_value),
  253.                    [valueToAdd] "r" (valueToAdd)
  254.                  : "cc", "memory");
  255.     return originalValue;
  256. }
  257. #if defined(__64BIT__) || defined(__powerpc64__) || defined(__ppc64__)
  258. #  define LPARX "ldarx"
  259. #  define STPCX "stdcx."
  260. #else
  261. #  define LPARX "lwarx"
  262. #  define STPCX "stwcx."
  263. #endif
  264. template <typename T>
  265. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelaxed(T *expectedValue, T *newValue)
  266. {
  267.     register void *result;
  268.     asm volatile(LPARX"  %[result], 0, %[_q_value]n"
  269.                  "xor.   %[result], %[result], %[expectedValue]n"
  270.                  "bne    $+12n"
  271.                  STPCX"  %[newValue], 0, %[_q_value]n"
  272.                  "bne-   $-16n"
  273.                  : [result] "=&r" (result),
  274.                    "+m" (_q_value)
  275.                  : [_q_value] "r" (&_q_value),
  276.                    [expectedValue] "r" (expectedValue),
  277.                    [newValue] "r" (newValue)
  278.                  : "cc", "memory");
  279.     return result == 0;
  280. }
  281. template <typename T>
  282. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetAcquire(T *expectedValue, T *newValue)
  283. {
  284.     register void *result;
  285.     asm volatile(LPARX"  %[result], 0, %[_q_value]n"
  286.                  "xor.   %[result], %[result], %[expectedValue]n"
  287.                  "bne    $+16n"
  288.                  STPCX"  %[newValue], 0, %[_q_value]n"
  289.                  "bne-   $-16n"
  290.                  "isyncn"
  291.                  : [result] "=&r" (result),
  292.                    "+m" (_q_value)
  293.                  : [_q_value] "r" (&_q_value),
  294.                    [expectedValue] "r" (expectedValue),
  295.                    [newValue] "r" (newValue)
  296.                  : "cc", "memory");
  297.     return result == 0;
  298. }
  299. template <typename T>
  300. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelease(T *expectedValue, T *newValue)
  301. {
  302.     register void *result;
  303.     asm volatile("eieion"
  304.                  LPARX"  %[result], 0, %[_q_value]n"
  305.                  "xor.   %[result], %[result], %[expectedValue]n"
  306.                  "bne    $+12n"
  307.                  STPCX"  %[newValue], 0, %[_q_value]n"
  308.                  "bne-   $-16n"
  309.                  : [result] "=&r" (result),
  310.                    "+m" (_q_value)
  311.                  : [_q_value] "r" (&_q_value),
  312.                    [expectedValue] "r" (expectedValue),
  313.                    [newValue] "r" (newValue)
  314.                  : "cc", "memory");
  315.     return result == 0;
  316. }
  317. template <typename T>
  318. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelaxed(T *newValue)
  319. {
  320.     register T *originalValue;
  321.     asm volatile(LPARX"  %[originalValue], 0, %[_q_value]n"
  322.                  STPCX"  %[newValue], 0, %[_q_value]n"
  323.                  "bne-   $-8n"
  324.                  : [originalValue] "=&r" (originalValue),
  325.                    "+m" (_q_value)
  326.                  : [_q_value] "r" (&_q_value),
  327.                    [newValue] "r" (newValue)
  328.                  : "cc", "memory");
  329.     return originalValue;
  330. }
  331. template <typename T>
  332. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreAcquire(T *newValue)
  333. {
  334.     register T *originalValue;
  335.     asm volatile(LPARX"  %[originalValue], 0, %[_q_value]n"
  336.                  STPCX"  %[newValue], 0, %[_q_value]n"
  337.                  "bne-   $-8n"
  338.                  "isyncn"
  339.                  : [originalValue] "=&r" (originalValue),
  340.                    "+m" (_q_value)
  341.                  : [_q_value] "r" (&_q_value),
  342.                    [newValue] "r" (newValue)
  343.                  : "cc", "memory");
  344.     return originalValue;
  345. }
  346. template <typename T>
  347. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelease(T *newValue)
  348. {
  349.     register T *originalValue;
  350.     asm volatile("eieion"
  351.                  LPARX"  %[originalValue], 0, %[_q_value]n"
  352.                  STPCX"  %[newValue], 0, %[_q_value]n"
  353.                  "bne-   $-8n"
  354.                  : [originalValue] "=&r" (originalValue),
  355.                    "+m" (_q_value)
  356.                  : [_q_value] "r" (&_q_value),
  357.                    [newValue] "r" (newValue)
  358.                  : "cc", "memory");
  359.     return originalValue;
  360. }
  361. template <typename T>
  362. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelaxed(qptrdiff valueToAdd)
  363. {
  364.     register T *originalValue;
  365.     register T *newValue;
  366.     asm volatile(LPARX"  %[originalValue], 0, %[_q_value]n"
  367.                  "add    %[newValue], %[originalValue], %[valueToAdd]n"
  368.                  STPCX"  %[newValue], 0, %[_q_value]n"
  369.                  "bne-   $-12n"
  370.                  : [originalValue] "=&r" (originalValue),
  371.                    [newValue] "=&r" (newValue),
  372.                    "+m" (_q_value)
  373.                  : [_q_value] "r" (&_q_value),
  374.                    [valueToAdd] "r" (valueToAdd * sizeof(T))
  375.                  : "cc", "memory");
  376.     return originalValue;
  377. }
  378. template <typename T>
  379. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddAcquire(qptrdiff valueToAdd)
  380. {
  381.     register T *originalValue;
  382.     register T *newValue;
  383.     asm volatile(LPARX"  %[originalValue], 0, %[_q_value]n"
  384.                  "add    %[newValue], %[originalValue], %[valueToAdd]n"
  385.                  STPCX"  %[newValue], 0, %[_q_value]n"
  386.                  "bne-   $-12n"
  387.                  "isyncn"
  388.                  : [originalValue] "=&r" (originalValue),
  389.                    [newValue] "=&r" (newValue),
  390.                    "+m" (_q_value)
  391.                  : [_q_value] "r" (&_q_value),
  392.                    [valueToAdd] "r" (valueToAdd * sizeof(T))
  393.                  : "cc", "memory");
  394.     return originalValue;
  395. }
  396. template <typename T>
  397. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueToAdd)
  398. {
  399.     register T *originalValue;
  400.     register T *newValue;
  401.     asm volatile("eieion"
  402.                  LPARX"  %[originalValue], 0, %[_q_value]n"
  403.                  "add    %[newValue], %[originalValue], %[valueToAdd]n"
  404.                  STPCX"  %[newValue], 0, %[_q_value]n"
  405.                  "bne-   $-12n"
  406.                  : [originalValue] "=&r" (originalValue),
  407.                    [newValue] "=&r" (newValue),
  408.                    "+m" (_q_value)
  409.                  : [_q_value] "r" (&_q_value),
  410.                    [valueToAdd] "r" (valueToAdd * sizeof(T))
  411.                  : "cc", "memory");
  412.     return originalValue;
  413. }
  414. #undef LPARX
  415. #undef STPCX
  416. #else
  417. extern "C" {
  418.     int q_atomic_test_and_set_int(volatile int *ptr, int expectedValue, int newValue);
  419.     int q_atomic_test_and_set_acquire_int(volatile int *ptr, int expectedValue, int newValue);
  420.     int q_atomic_test_and_set_release_int(volatile int *ptr, int expectedValue, int newValue);
  421.     int q_atomic_test_and_set_ptr(volatile void *ptr, void *expectedValue, void *newValue);
  422.     int q_atomic_test_and_set_acquire_ptr(volatile void *ptr, void *expectedValue, void *newValue);
  423.     int q_atomic_test_and_set_release_ptr(volatile void *ptr, void *expectedValue, void *newValue);
  424.     int q_atomic_increment(volatile int *);
  425.     int q_atomic_decrement(volatile int *);
  426.     int q_atomic_set_int(volatile int *, int);
  427.     int q_atomic_fetch_and_store_acquire_int(volatile int *ptr, int newValue);
  428.     int q_atomic_fetch_and_store_release_int(volatile int *ptr, int newValue);
  429.     void *q_atomic_set_ptr(volatile void *, void *);
  430.     int q_atomic_fetch_and_store_acquire_ptr(volatile void *ptr, void *newValue);
  431.     int q_atomic_fetch_and_store_release_ptr(volatile void *ptr, void *newValue);
  432.     int q_atomic_fetch_and_add_int(volatile int *ptr, int valueToAdd);
  433.     int q_atomic_fetch_and_add_acquire_int(volatile int *ptr, int valueToAdd);
  434.     int q_atomic_fetch_and_add_release_int(volatile int *ptr, int valueToAdd);
  435.     void *q_atomic_fetch_and_add_ptr(volatile void *ptr, qptrdiff valueToAdd);
  436.     void *q_atomic_fetch_and_add_acquire_ptr(volatile void *ptr, qptrdiff valueToAdd);
  437.     void *q_atomic_fetch_and_add_release_ptr(volatile void *ptr, qptrdiff valueToAdd);
  438. } // extern "C"
  439. inline bool QBasicAtomicInt::ref()
  440. {
  441.     return q_atomic_increment(&_q_value) != 0;
  442. }
  443. inline bool QBasicAtomicInt::deref()
  444. {
  445.     return q_atomic_decrement(&_q_value) != 0;
  446. }
  447. inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue)
  448. {
  449.     return q_atomic_test_and_set_int(&_q_value, expectedValue, newValue) != 0;
  450. }
  451. inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue)
  452. {
  453.     return q_atomic_test_and_set_acquire_int(&_q_value, expectedValue, newValue) != 0;
  454. }
  455. inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue)
  456. {
  457.     return q_atomic_test_and_set_release_int(&_q_value, expectedValue, newValue) != 0;
  458. }
  459. inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue)
  460. {
  461.     return q_atomic_set_int(&_q_value, newValue);
  462. }
  463. inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue)
  464. {
  465.     return q_atomic_fetch_and_store_acquire_int(&_q_value, newValue);
  466. }
  467. inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue)
  468. {
  469.     return q_atomic_fetch_and_store_release_int(&_q_value, newValue);
  470. }
  471. inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd)
  472. {
  473.     return q_atomic_fetch_and_add_int(&_q_value, valueToAdd);
  474. }
  475. inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd)
  476. {
  477.     return q_atomic_fetch_and_add_acquire_int(&_q_value, valueToAdd);
  478. }
  479. inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd)
  480. {
  481.     return q_atomic_fetch_and_add_release_int(&_q_value, valueToAdd);
  482. }
  483. template <typename T>
  484. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelaxed(T *expectedValue, T *newValue)
  485. {
  486.     return q_atomic_test_and_set_ptr(&_q_value, expectedValue, newValue) != 0;
  487. }
  488. template <typename T>
  489. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetAcquire(T *expectedValue, T *newValue)
  490. {
  491.     return q_atomic_test_and_set_acquire_ptr(&_q_value, expectedValue, newValue) != 0;
  492. }
  493. template <typename T>
  494. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelease(T *expectedValue, T *newValue)
  495. {
  496.     return q_atomic_test_and_set_release_ptr(&_q_value, expectedValue, newValue) != 0;
  497. }
  498. template <typename T>
  499. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelaxed(T *newValue)
  500. {
  501.     return reinterpret_cast<T *>(q_atomic_set_ptr(&_q_value, newValue));
  502. }
  503. template <typename T>
  504. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreAcquire(T *newValue)
  505. {
  506.     return reinterpret_cast<T *>(q_atomic_fetch_and_store_acquire_ptr(&_q_value, newValue));
  507. }
  508. template <typename T>
  509. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelease(T *newValue)
  510. {
  511.     return reinterpret_cast<T *>(q_atomic_fetch_and_store_release_ptr(&_q_value, newValue));
  512. }
  513. template <typename T>
  514. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelaxed(qptrdiff valueToAdd)
  515. {
  516.     return reinterpret_cast<T *>(q_atomic_fetch_and_add_ptr(&_q_value, valueToAdd * sizeof(T)));
  517. }
  518. template <typename T>
  519. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddAcquire(qptrdiff valueToAdd)
  520. {
  521.     return reinterpret_cast<T *>(q_atomic_fetch_and_add_acquire_ptr(&_q_value, valueToAdd * sizeof(T)));
  522. }
  523. template <typename T>
  524. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueToAdd)
  525. {
  526.     return reinterpret_cast<T *>(q_atomic_fetch_and_add_release_ptr(&_q_value, valueToAdd * sizeof(T)));
  527. }
  528. #endif
  529. inline bool QBasicAtomicInt::testAndSetOrdered(int expectedValue, int newValue)
  530. {
  531.     return testAndSetAcquire(expectedValue, newValue);
  532. }
  533. inline int QBasicAtomicInt::fetchAndStoreOrdered(int newValue)
  534. {
  535.     return fetchAndStoreAcquire(newValue);
  536. }
  537. inline int QBasicAtomicInt::fetchAndAddOrdered(int valueToAdd)
  538. {
  539.     return fetchAndAddAcquire(valueToAdd);
  540. }
  541. template <typename T>
  542. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetOrdered(T *expectedValue, T *newValue)
  543. {
  544.     return testAndSetAcquire(expectedValue, newValue);
  545. }
  546. template <typename T>
  547. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreOrdered(T *newValue)
  548. {
  549.     return fetchAndStoreAcquire(newValue);
  550. }
  551. template <typename T>
  552. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddOrdered(qptrdiff valueToAdd)
  553. {
  554.     return fetchAndAddAcquire(valueToAdd);
  555. }
  556. QT_END_NAMESPACE
  557. QT_END_HEADER
  558. #endif // QATOMIC_POWERPC_H