15#if (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_AARCH64 || KMP_ARCH_ARM || \
20kmp_int8 __kmp_test_then_or8(
volatile kmp_int8 *p, kmp_int8 d) {
21 kmp_int8 old_value, new_value;
23 old_value = TCR_1(*p);
24 new_value = old_value | d;
26 while (!KMP_COMPARE_AND_STORE_REL8(p, old_value, new_value)) {
28 old_value = TCR_1(*p);
29 new_value = old_value | d;
34kmp_int8 __kmp_test_then_and8(
volatile kmp_int8 *p, kmp_int8 d) {
35 kmp_int8 old_value, new_value;
37 old_value = TCR_1(*p);
38 new_value = old_value & d;
40 while (!KMP_COMPARE_AND_STORE_REL8(p, old_value, new_value)) {
42 old_value = TCR_1(*p);
43 new_value = old_value & d;
48kmp_uint32 __kmp_test_then_or32(
volatile kmp_uint32 *p, kmp_uint32 d) {
49 kmp_uint32 old_value, new_value;
51 old_value = TCR_4(*p);
52 new_value = old_value | d;
54 while (!KMP_COMPARE_AND_STORE_REL32((
volatile kmp_int32 *)p, old_value,
57 old_value = TCR_4(*p);
58 new_value = old_value | d;
63kmp_uint32 __kmp_test_then_and32(
volatile kmp_uint32 *p, kmp_uint32 d) {
64 kmp_uint32 old_value, new_value;
66 old_value = TCR_4(*p);
67 new_value = old_value & d;
69 while (!KMP_COMPARE_AND_STORE_REL32((
volatile kmp_int32 *)p, old_value,
72 old_value = TCR_4(*p);
73 new_value = old_value & d;
78#if KMP_ARCH_X86 || KMP_ARCH_X86_64
79kmp_int8 __kmp_test_then_add8(
volatile kmp_int8 *p, kmp_int8 d) {
80 kmp_int64 old_value, new_value;
82 old_value = TCR_1(*p);
83 new_value = old_value + d;
84 while (!__kmp_compare_and_store8(p, old_value, new_value)) {
86 old_value = TCR_1(*p);
87 new_value = old_value + d;
93kmp_int64 __kmp_test_then_add64(
volatile kmp_int64 *p, kmp_int64 d) {
94 kmp_int64 old_value, new_value;
96 old_value = TCR_8(*p);
97 new_value = old_value + d;
98 while (!__kmp_compare_and_store64(p, old_value, new_value)) {
100 old_value = TCR_8(*p);
101 new_value = old_value + d;
108kmp_uint64 __kmp_test_then_or64(
volatile kmp_uint64 *p, kmp_uint64 d) {
109 kmp_uint64 old_value, new_value;
111 old_value = TCR_8(*p);
112 new_value = old_value | d;
113 while (!KMP_COMPARE_AND_STORE_REL64((
volatile kmp_int64 *)p, old_value,
116 old_value = TCR_8(*p);
117 new_value = old_value | d;
123kmp_uint64 __kmp_test_then_and64(
volatile kmp_uint64 *p, kmp_uint64 d) {
124 kmp_uint64 old_value, new_value;
126 old_value = TCR_8(*p);
127 new_value = old_value & d;
128 while (!KMP_COMPARE_AND_STORE_REL64((
volatile kmp_int64 *)p, old_value,
131 old_value = TCR_8(*p);
132 new_value = old_value & d;
138#if KMP_ARCH_AARCH64 && KMP_COMPILER_MSVC
141int __kmp_invoke_microtask(microtask_t pkfn,
int gtid,
int tid,
int argc,
145 void **exit_frame_ptr
149 *exit_frame_ptr = OMPT_GET_FRAME_ADDRESS(0);
154 (*pkfn)(>id, &tid);
157 (*pkfn)(>id, &tid, p_argv[0]);
160 (*pkfn)(>id, &tid, p_argv[0], p_argv[1]);
163 (*pkfn)(>id, &tid, p_argv[0], p_argv[1], p_argv[2]);
166 (*pkfn)(>id, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3]);
169 (*pkfn)(>id, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4]);
174 size_t len = (argc - 6) *
sizeof(
void *);
175 void *argbuf = alloca(len);
176 memcpy(argbuf, &p_argv[6], len);
180 (*pkfn)(>id, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],