z_Windows_NT-586_util.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 #include "kmp.h"
00048
00049 #if (KMP_ARCH_X86 || KMP_ARCH_X86_64)
00050
00051
00052
00053
00054 kmp_int32
00055 __kmp_test_then_or32( volatile kmp_int32 *p, kmp_int32 d )
00056 {
00057 kmp_int32 old_value, new_value;
00058
00059 old_value = TCR_4( *p );
00060 new_value = old_value | d;
00061
00062 while ( ! __kmp_compare_and_store32 ( p, old_value, new_value ) )
00063 {
00064 KMP_CPU_PAUSE();
00065 old_value = TCR_4( *p );
00066 new_value = old_value | d;
00067 }
00068
00069 return old_value;
00070 }
00071
00072 kmp_int32
00073 __kmp_test_then_and32( volatile kmp_int32 *p, kmp_int32 d )
00074 {
00075 kmp_int32 old_value, new_value;
00076
00077 old_value = TCR_4( *p );
00078 new_value = old_value & d;
00079
00080 while ( ! __kmp_compare_and_store32 ( p, old_value, new_value ) )
00081 {
00082 KMP_CPU_PAUSE();
00083 old_value = TCR_4( *p );
00084 new_value = old_value & d;
00085 }
00086 return old_value;
00087 }
00088
00089 #if KMP_ARCH_X86
00090 kmp_int64
00091 __kmp_test_then_add64( volatile kmp_int64 *p, kmp_int64 d )
00092 {
00093 kmp_int64 old_value, new_value;
00094
00095 old_value = TCR_8( *p );
00096 new_value = old_value + d;
00097 while ( ! __kmp_compare_and_store64 ( p, old_value, new_value ) )
00098 {
00099 KMP_CPU_PAUSE();
00100 old_value = TCR_8( *p );
00101 new_value = old_value + d;
00102 }
00103
00104 return old_value;
00105 }
00106 #endif
00107
00108 kmp_int64
00109 __kmp_test_then_or64( volatile kmp_int64 *p, kmp_int64 d )
00110 {
00111 kmp_int64 old_value, new_value;
00112
00113 old_value = TCR_8( *p );
00114 new_value = old_value | d;
00115 while ( ! __kmp_compare_and_store64 ( p, old_value, new_value ) )
00116 {
00117 KMP_CPU_PAUSE();
00118 old_value = TCR_8( *p );
00119 new_value = old_value | d;
00120 }
00121
00122 return old_value;
00123 }
00124
00125 kmp_int64
00126 __kmp_test_then_and64( volatile kmp_int64 *p, kmp_int64 d )
00127 {
00128 kmp_int64 old_value, new_value;
00129
00130 old_value = TCR_8( *p );
00131 new_value = old_value & d;
00132 while ( ! __kmp_compare_and_store64 ( p, old_value, new_value ) )
00133 {
00134 KMP_CPU_PAUSE();
00135 old_value = TCR_8( *p );
00136 new_value = old_value & d;
00137 }
00138
00139 return old_value;
00140 }
00141
00142 #endif
00143
00144
00145
00146