ReactOS 0.4.17-dev-540-g8f54750
intrin_arm64.h
Go to the documentation of this file.
1/*
2 Compatibility <intrin_arm64.h> header providing GCC/Clang equivalents
3 of intrinsic Microsoft Visual C++ functions.
4
5 Copyright (c) 2026 Ahmed Arif <arif.ing@outlook.com>
6
7 Permission is hereby granted, free of charge, to any person obtaining a
8 copy of this software and associated documentation files (the "Software"),
9 to deal in the Software without restriction, including without limitation
10 the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 and/or sell copies of the Software, and to permit persons to whom the
12 Software is furnished to do so, subject to the following conditions:
13
14 The above copyright notice and this permission notice shall be included in
15 all copies or substantial portions of the Software.
16
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 DEALINGS IN THE SOFTWARE.
24*/
25
26#ifndef KJK_INTRIN_ARM64_H_
27#define KJK_INTRIN_ARM64_H_
28
29#if !defined(__GNUC__) && !defined(__clang__)
30#error Unsupported compiler
31#endif
32
33#ifndef HAS_BUILTIN
34# ifdef __has_builtin
35# define HAS_BUILTIN(x) __has_builtin(x)
36# else
37# define HAS_BUILTIN(x) 0
38# endif
39#endif
40
41/* Fallback for tools that analyze this header in isolation; the real
42 definition lives in sdk/include/vcruntime/_mingw.h and wins via the
43 umbrella intrin.h. */
44#ifndef __INTRIN_INLINE
45# define __INTRIN_INLINE extern __inline__ __attribute__((__always_inline__, __gnu_inline__))
46#endif
47
48#define _ReturnAddress() (__builtin_return_address(0))
49/* AAPCS64 prologue stores LR at [fp, #8]. Requires -fno-omit-frame-pointer. */
50#define _AddressOfReturnAddress() ((void *)((unsigned char *)__builtin_frame_address(0) + 8))
51
52#if !HAS_BUILTIN(__break)
54{
55 __asm__ __volatile__("brk %0" : : "i"(value));
56}
57#endif
58
59#if !HAS_BUILTIN(_ReadWriteBarrier)
61{
62 __asm__ __volatile__("" : : : "memory");
63}
64#endif
65
66#define _ReadBarrier _ReadWriteBarrier
67#define _WriteBarrier _ReadWriteBarrier
68
69#if !HAS_BUILTIN(_byteswap_ushort)
70__INTRIN_INLINE unsigned short _byteswap_ushort(unsigned short value)
71{
72 return __builtin_bswap16(value);
73}
74#endif
75
76#if !HAS_BUILTIN(_byteswap_ulong)
77__INTRIN_INLINE unsigned long __cdecl _byteswap_ulong(unsigned long value)
78{
79 return __builtin_bswap32(value);
80}
81#endif
82
83#if !HAS_BUILTIN(_byteswap_uint64)
85{
86 return __builtin_bswap64(value);
87}
88#endif
89
90#if !HAS_BUILTIN(_BitScanForward)
91__INTRIN_INLINE unsigned char _BitScanForward(unsigned long *Index, unsigned long Mask)
92{
93 if (!Mask)
94 return 0;
95
96 *Index = __builtin_ctzl(Mask);
97 return 1;
98}
99#endif
100
101#if !HAS_BUILTIN(_BitScanReverse)
102__INTRIN_INLINE unsigned char _BitScanReverse(unsigned long *Index, unsigned long Mask)
103{
104 if (!Mask)
105 return 0;
106
107 *Index = 31 - __builtin_clzl(Mask);
108 return 1;
109}
110#endif
111
112#if !HAS_BUILTIN(_BitScanForward64)
113__INTRIN_INLINE unsigned char _BitScanForward64(unsigned long *Index, unsigned long long Mask)
114{
115 if (!Mask)
116 return 0;
117
118 *Index = __builtin_ctzll(Mask);
119 return 1;
120}
121#endif
122
123#if !HAS_BUILTIN(_BitScanReverse64)
124__INTRIN_INLINE unsigned char _BitScanReverse64(unsigned long *Index, unsigned long long Mask)
125{
126 if (!Mask)
127 return 0;
128
129 *Index = 63 - __builtin_clzll(Mask);
130 return 1;
131}
132#endif
133
134#if !HAS_BUILTIN(_InterlockedCompareExchange)
135__INTRIN_INLINE long _InterlockedCompareExchange(volatile long *Destination, long Exchange, long Comparand)
136{
137 return __sync_val_compare_and_swap(Destination, Comparand, Exchange);
138}
139#endif
140
141#if !HAS_BUILTIN(_InterlockedCompareExchange16)
142__INTRIN_INLINE short _InterlockedCompareExchange16(volatile short *Destination, short Exchange, short Comparand)
143{
144 return __sync_val_compare_and_swap(Destination, Comparand, Exchange);
145}
146#endif
147
148#if !HAS_BUILTIN(_InterlockedCompareExchange8)
149__INTRIN_INLINE char _InterlockedCompareExchange8(volatile char *Destination, char Exchange, char Comparand)
150{
151 return __sync_val_compare_and_swap(Destination, Comparand, Exchange);
152}
153#endif
154
155#if !HAS_BUILTIN(_InterlockedCompareExchange64)
156__INTRIN_INLINE long long _InterlockedCompareExchange64(volatile long long *Destination, long long Exchange, long long Comparand)
157{
158 return __sync_val_compare_and_swap(Destination, Comparand, Exchange);
159}
160#endif
161
162#if !HAS_BUILTIN(_InterlockedCompareExchangePointer)
163__INTRIN_INLINE void *_InterlockedCompareExchangePointer(void *volatile *Destination, void *Exchange, void *Comparand)
164{
165 return __sync_val_compare_and_swap(Destination, Comparand, Exchange);
166}
167#endif
168
169#if !HAS_BUILTIN(_InterlockedExchange)
171{
172 /* MS _InterlockedExchange is a full barrier; __sync_lock_test_and_set is acquire-only. */
173 return __atomic_exchange_n(Target, Value, __ATOMIC_SEQ_CST);
174}
175#endif
176
177#if !HAS_BUILTIN(_InterlockedExchange16)
179{
180 return __atomic_exchange_n(Target, Value, __ATOMIC_SEQ_CST);
181}
182#endif
183
184#if !HAS_BUILTIN(_InterlockedExchange8)
186{
187 return __atomic_exchange_n(Target, Value, __ATOMIC_SEQ_CST);
188}
189#endif
190
191#if !HAS_BUILTIN(_InterlockedExchange64)
192__INTRIN_INLINE long long _InterlockedExchange64(volatile long long *Target, long long Value)
193{
194 return __atomic_exchange_n(Target, Value, __ATOMIC_SEQ_CST);
195}
196#endif
197
198#if !HAS_BUILTIN(_InterlockedExchangePointer)
200{
201 return __atomic_exchange_n(Target, Value, __ATOMIC_SEQ_CST);
202}
203#endif
204
205#if !HAS_BUILTIN(_InterlockedExchangeAdd)
207{
208 return __sync_fetch_and_add(Addend, Value);
209}
210#endif
211
212#if !HAS_BUILTIN(_InterlockedExchangeAdd16)
214{
215 return __sync_fetch_and_add(Addend, Value);
216}
217#endif
218
219#if !HAS_BUILTIN(_InterlockedExchangeAdd8)
221{
222 return __sync_fetch_and_add(Addend, Value);
223}
224#endif
225
226#if !HAS_BUILTIN(_InterlockedExchangeAdd64)
227__INTRIN_INLINE long long _InterlockedExchangeAdd64(volatile long long *Addend, long long Value)
228{
229 return __sync_fetch_and_add(Addend, Value);
230}
231#endif
232
233#if !HAS_BUILTIN(_InterlockedAnd)
234__INTRIN_INLINE long _InterlockedAnd(volatile long *Value, long Mask)
235{
236 return __sync_fetch_and_and(Value, Mask);
237}
238#endif
239
240#if !HAS_BUILTIN(_InterlockedAnd16)
241__INTRIN_INLINE short _InterlockedAnd16(volatile short *Value, short Mask)
242{
243 return __sync_fetch_and_and(Value, Mask);
244}
245#endif
246
247#if !HAS_BUILTIN(_InterlockedAnd8)
248__INTRIN_INLINE char _InterlockedAnd8(volatile char *Value, char Mask)
249{
250 return __sync_fetch_and_and(Value, Mask);
251}
252#endif
253
254#if !HAS_BUILTIN(_InterlockedAnd64)
255__INTRIN_INLINE long long _InterlockedAnd64(volatile long long *Value, long long Mask)
256{
257 return __sync_fetch_and_and(Value, Mask);
258}
259#endif
260
261#if !HAS_BUILTIN(_InterlockedOr)
262__INTRIN_INLINE long _InterlockedOr(volatile long *Value, long Mask)
263{
264 return __sync_fetch_and_or(Value, Mask);
265}
266#endif
267
268#if !HAS_BUILTIN(_InterlockedOr16)
269__INTRIN_INLINE short _InterlockedOr16(volatile short *Value, short Mask)
270{
271 return __sync_fetch_and_or(Value, Mask);
272}
273#endif
274
275#if !HAS_BUILTIN(_InterlockedOr8)
276__INTRIN_INLINE char _InterlockedOr8(volatile char *Value, char Mask)
277{
278 return __sync_fetch_and_or(Value, Mask);
279}
280#endif
281
282#if !HAS_BUILTIN(_InterlockedOr64)
283__INTRIN_INLINE long long _InterlockedOr64(volatile long long *Value, long long Mask)
284{
285 return __sync_fetch_and_or(Value, Mask);
286}
287#endif
288
289#if !HAS_BUILTIN(_InterlockedXor)
290__INTRIN_INLINE long _InterlockedXor(volatile long *Value, long Mask)
291{
292 return __sync_fetch_and_xor(Value, Mask);
293}
294#endif
295
296#if !HAS_BUILTIN(_InterlockedXor16)
297__INTRIN_INLINE short _InterlockedXor16(volatile short *Value, short Mask)
298{
299 return __sync_fetch_and_xor(Value, Mask);
300}
301#endif
302
303#if !HAS_BUILTIN(_InterlockedXor8)
304__INTRIN_INLINE char _InterlockedXor8(volatile char *Value, char Mask)
305{
306 return __sync_fetch_and_xor(Value, Mask);
307}
308#endif
309
310#if !HAS_BUILTIN(_InterlockedXor64)
311__INTRIN_INLINE long long _InterlockedXor64(volatile long long *Value, long long Mask)
312{
313 return __sync_fetch_and_xor(Value, Mask);
314}
315#endif
316
317#if !HAS_BUILTIN(_InterlockedIncrement)
319{
320 return __sync_add_and_fetch(Addend, 1);
321}
322#endif
323
324#if !HAS_BUILTIN(_InterlockedIncrement16)
326{
327 return __sync_add_and_fetch(Addend, 1);
328}
329#endif
330
331#if !HAS_BUILTIN(_InterlockedIncrement64)
332__INTRIN_INLINE long long _InterlockedIncrement64(volatile long long *Addend)
333{
334 return __sync_add_and_fetch(Addend, 1);
335}
336#endif
337
338#if !HAS_BUILTIN(_InterlockedDecrement)
340{
341 return __sync_sub_and_fetch(Addend, 1);
342}
343#endif
344
345#if !HAS_BUILTIN(_InterlockedDecrement16)
347{
348 return __sync_sub_and_fetch(Addend, 1);
349}
350#endif
351
352#if !HAS_BUILTIN(_InterlockedDecrement64)
353__INTRIN_INLINE long long _InterlockedDecrement64(volatile long long *Addend)
354{
355 return __sync_sub_and_fetch(Addend, 1);
356}
357#endif
358
359#if !HAS_BUILTIN(_InterlockedCompareExchange128)
360/* may_alias avoids strict-aliasing UB on the (__int64*) / __int128 pair. */
361typedef __int128 __attribute__((may_alias)) __ms_int128_t;
363 volatile __int64 *Destination, __int64 ExchangeHigh,
364 __int64 ExchangeLow, __int64 *ComparandResult)
365{
366 /* Baseline armv8-a LL/SC; matches MS full-barrier contract. */
367 unsigned __int64 cmp_lo = (unsigned __int64)ComparandResult[0];
368 unsigned __int64 cmp_hi = (unsigned __int64)ComparandResult[1];
369 unsigned __int64 old_lo, old_hi;
370 unsigned int status;
371 __asm__ __volatile__(
372 "1: ldaxp %[ol], %[oh], %[mem] \n"
373 " cmp %[ol], %[cl] \n"
374 " ccmp %[oh], %[ch], #0, eq \n"
375 " b.ne 2f \n"
376 " stlxp %w[st], %[xl], %[xh], %[mem] \n"
377 " cbnz %w[st], 1b \n"
378 " mov %w[st], #0 \n"
379 " b 3f \n"
380 "2: clrex \n"
381 " mov %w[st], #1 \n"
382 "3: \n"
383 : [ol] "=&r"(old_lo), [oh] "=&r"(old_hi),
384 [st] "=&r"(status),
385 [mem] "+Q"(*(volatile __ms_int128_t *)Destination)
386 : [cl] "r"(cmp_lo), [ch] "r"(cmp_hi),
387 [xl] "r"((unsigned __int64)ExchangeLow),
388 [xh] "r"((unsigned __int64)ExchangeHigh)
389 : "cc", "memory");
390 __asm__ __volatile__("dmb ish" ::: "memory");
391 if (status == 0)
392 return 1;
393 ComparandResult[0] = (__int64)old_lo;
394 ComparandResult[1] = (__int64)old_hi;
395 return 0;
396}
397#endif
398
399#if !HAS_BUILTIN(__nop)
401{
402 __asm__ __volatile__("nop");
403}
404#endif
405
406/*** Bit manipulation ***/
407#if !HAS_BUILTIN(_bittest)
408__INTRIN_INLINE unsigned char _bittest(const long *a, long b)
409{
410 return (a[b / 32] >> (b % 32)) & 1;
411}
412#endif
413
414#if !HAS_BUILTIN(_bittestandset)
415__INTRIN_INLINE unsigned char _bittestandset(long *a, long b)
416{
417 long bit = 1L << (b % 32);
418 long *ptr = &a[b / 32];
419 unsigned char retval = (*ptr >> (b % 32)) & 1;
420 *ptr |= bit;
421 return retval;
422}
423#endif
424
425#if !HAS_BUILTIN(_bittestandreset)
426__INTRIN_INLINE unsigned char _bittestandreset(long *a, long b)
427{
428 long bit = 1L << (b % 32);
429 long *ptr = &a[b / 32];
430 unsigned char retval = (*ptr >> (b % 32)) & 1;
431 *ptr &= ~bit;
432 return retval;
433}
434#endif
435
436#if !HAS_BUILTIN(_bittestandcomplement)
437__INTRIN_INLINE unsigned char _bittestandcomplement(long *a, long b)
438{
439 long bit = 1L << (b % 32);
440 long *ptr = &a[b / 32];
441 unsigned char retval = (*ptr >> (b % 32)) & 1;
442 *ptr ^= bit;
443 return retval;
444}
445#endif
446
447#if !HAS_BUILTIN(_bittest64)
448__INTRIN_INLINE unsigned char _bittest64(const long long *a, long long b)
449{
450 return (a[b / 64] >> (b % 64)) & 1;
451}
452#endif
453
454#if !HAS_BUILTIN(_bittestandset64)
455__INTRIN_INLINE unsigned char _bittestandset64(long long *a, long long b)
456{
457 long long bit = 1LL << (b % 64);
458 long long *ptr = &a[b / 64];
459 unsigned char retval = (*ptr >> (b % 64)) & 1;
460 *ptr |= bit;
461 return retval;
462}
463#endif
464
465#if !HAS_BUILTIN(_bittestandreset64)
466__INTRIN_INLINE unsigned char _bittestandreset64(long long *a, long long b)
467{
468 long long bit = 1LL << (b % 64);
469 long long *ptr = &a[b / 64];
470 unsigned char retval = (*ptr >> (b % 64)) & 1;
471 *ptr &= ~bit;
472 return retval;
473}
474#endif
475
476#if !HAS_BUILTIN(_bittestandcomplement64)
477__INTRIN_INLINE unsigned char _bittestandcomplement64(long long *a, long long b)
478{
479 long long bit = 1LL << (b % 64);
480 long long *ptr = &a[b / 64];
481 unsigned char retval = (*ptr >> (b % 64)) & 1;
482 *ptr ^= bit;
483 return retval;
484}
485#endif
486
487/*** Interlocked bit test ***/
488#if !HAS_BUILTIN(_interlockedbittestandreset)
489__INTRIN_INLINE unsigned char _interlockedbittestandreset(volatile long *a, long b)
490{
491 unsigned int bit = b & 31;
492 long mask = 1L << bit;
493 long old = __sync_fetch_and_and(a, ~mask);
494 return (unsigned char)((old >> bit) & 1);
495}
496#endif
497
498#if !HAS_BUILTIN(_interlockedbittestandset)
499__INTRIN_INLINE unsigned char _interlockedbittestandset(volatile long *a, long b)
500{
501 unsigned int bit = b & 31;
502 long mask = 1L << bit;
503 long old = __sync_fetch_and_or(a, mask);
504 return (unsigned char)((old >> bit) & 1);
505}
506#endif
507
508#if !HAS_BUILTIN(_interlockedbittestandreset64)
509__INTRIN_INLINE unsigned char _interlockedbittestandreset64(volatile long long *a, long long b)
510{
511 unsigned int bit = b & 63;
512 long long mask = 1LL << bit;
513 long long old = __sync_fetch_and_and(a, ~mask);
514 return (unsigned char)((old >> bit) & 1);
515}
516#endif
517
518#if !HAS_BUILTIN(_interlockedbittestandset64)
519__INTRIN_INLINE unsigned char _interlockedbittestandset64(volatile long long *a, long long b)
520{
521 unsigned int bit = b & 63;
522 long long mask = 1LL << bit;
523 long long old = __sync_fetch_and_or(a, mask);
524 return (unsigned char)((old >> bit) & 1);
525}
526#endif
527
528/*** Rotates ***/
529#if !HAS_BUILTIN(_rotl8)
530__INTRIN_INLINE unsigned char __cdecl _rotl8(unsigned char value, unsigned char shift)
531{
532 shift &= 7;
533 if (!shift)
534 return value;
535 return (value << shift) | (value >> (8 - shift));
536}
537#endif
538
539#if !HAS_BUILTIN(_rotl16)
540__INTRIN_INLINE unsigned short __cdecl _rotl16(unsigned short value, unsigned char shift)
541{
542 shift &= 15;
543 if (!shift)
544 return value;
545 return (value << shift) | (value >> (16 - shift));
546}
547#endif
548
549#if !HAS_BUILTIN(_rotl)
550__INTRIN_INLINE unsigned int __cdecl _rotl(unsigned int value, int shift)
551{
552 shift &= 31;
553 if (!shift)
554 return value;
555 return (value << shift) | (value >> (32 - shift));
556}
557#endif
558
559#if !HAS_BUILTIN(_rotl64)
560__INTRIN_INLINE unsigned long long _rotl64(unsigned long long value, int shift)
561{
562 shift &= 63;
563 if (!shift)
564 return value;
565 return (value << shift) | (value >> (64 - shift));
566}
567#endif
568
569#if !HAS_BUILTIN(_rotr8)
570__INTRIN_INLINE unsigned char __cdecl _rotr8(unsigned char value, unsigned char shift)
571{
572 shift &= 7;
573 if (!shift)
574 return value;
575 return (value >> shift) | (value << (8 - shift));
576}
577#endif
578
579#if !HAS_BUILTIN(_rotr16)
580__INTRIN_INLINE unsigned short __cdecl _rotr16(unsigned short value, unsigned char shift)
581{
582 shift &= 15;
583 if (!shift)
584 return value;
585 return (value >> shift) | (value << (16 - shift));
586}
587#endif
588
589#if !HAS_BUILTIN(_rotr)
590__INTRIN_INLINE unsigned int __cdecl _rotr(unsigned int value, int shift)
591{
592 shift &= 31;
593 if (!shift)
594 return value;
595 return (value >> shift) | (value << (32 - shift));
596}
597#endif
598
599#if !HAS_BUILTIN(_rotr64)
600__INTRIN_INLINE unsigned long long _rotr64(unsigned long long value, int shift)
601{
602 shift &= 63;
603 if (!shift)
604 return value;
605 return (value >> shift) | (value << (64 - shift));
606}
607#endif
608
609#if !HAS_BUILTIN(_lrotl)
610__INTRIN_INLINE unsigned long __cdecl _lrotl(unsigned long value, int shift)
611{
612 shift &= 31;
613 if (!shift)
614 return value;
615 return (value << shift) | (value >> (32 - shift));
616}
617#endif
618
619#if !HAS_BUILTIN(_lrotr)
620__INTRIN_INLINE unsigned long __cdecl _lrotr(unsigned long value, int shift)
621{
622 shift &= 31;
623 if (!shift)
624 return value;
625 return (value >> shift) | (value << (32 - shift));
626}
627#endif
628
629/*** Bit count ***/
630#if !HAS_BUILTIN(_CountLeadingZeros)
631__INTRIN_INLINE unsigned int _CountLeadingZeros(unsigned long value)
632{
633 if (!value)
634 return sizeof(value) * 8;
635 return __builtin_clzl(value);
636}
637#endif
638
639#if !HAS_BUILTIN(_CountLeadingZeros64)
641{
642 if (!value)
643 return 64;
644 return __builtin_clzll(value);
645}
646#endif
647
648#if !HAS_BUILTIN(_CountOneBits)
649__INTRIN_INLINE unsigned int _CountOneBits(unsigned long value)
650{
651 return __builtin_popcountl(value);
652}
653#endif
654
655#if !HAS_BUILTIN(_CountOneBits64)
657{
658 return __builtin_popcountll(value);
659}
660#endif
661
662/*** 64-bit math ***/
663#if !HAS_BUILTIN(__mulh)
664__INTRIN_INLINE long long __mulh(long long a, long long b)
665{
666 return ((__int128)a * (__int128)b) >> 64;
667}
668#endif
669
670#if !HAS_BUILTIN(__umulh)
671__INTRIN_INLINE unsigned long long __umulh(unsigned long long a, unsigned long long b)
672{
673 return ((unsigned __int128)a * (unsigned __int128)b) >> 64;
674}
675#endif
676
677#if !HAS_BUILTIN(_abs64)
679{
680 return (value >= 0) ? value : -value;
681}
682#endif
683
684/*** ARM64 hints and barriers ***/
685#if !HAS_BUILTIN(__yield)
686/* YIELD is a pure scheduling hint; no memory ordering per MS docs. */
688{
689 __asm__ __volatile__("yield");
690}
691#endif
692
693#if !HAS_BUILTIN(__dmb)
694__INTRIN_INLINE void __dmb(unsigned int type)
695{
696 /* MS _ARM64_BARRIER_* constants: OSHLD=1 OSHST=2 OSH=3 NSHLD=5 NSHST=6
697 NSH=7 ISHLD=9 ISHST=10 ISH=11 LD=13 ST=14 SY=15. The dmb option must
698 be an assembler literal, so we dispatch on the runtime value. */
699 switch (type)
700 {
701 case 1: __asm__ __volatile__("dmb oshld" ::: "memory"); break;
702 case 2: __asm__ __volatile__("dmb oshst" ::: "memory"); break;
703 case 3: __asm__ __volatile__("dmb osh" ::: "memory"); break;
704 case 5: __asm__ __volatile__("dmb nshld" ::: "memory"); break;
705 case 6: __asm__ __volatile__("dmb nshst" ::: "memory"); break;
706 case 7: __asm__ __volatile__("dmb nsh" ::: "memory"); break;
707 case 9: __asm__ __volatile__("dmb ishld" ::: "memory"); break;
708 case 10: __asm__ __volatile__("dmb ishst" ::: "memory"); break;
709 case 11: __asm__ __volatile__("dmb ish" ::: "memory"); break;
710 case 13: __asm__ __volatile__("dmb ld" ::: "memory"); break;
711 case 14: __asm__ __volatile__("dmb st" ::: "memory"); break;
712 default: __asm__ __volatile__("dmb sy" ::: "memory"); break;
713 }
714}
715#endif
716
717#if !HAS_BUILTIN(__dsb)
718__INTRIN_INLINE void __dsb(unsigned int type)
719{
720 switch (type)
721 {
722 case 1: __asm__ __volatile__("dsb oshld" ::: "memory"); break;
723 case 2: __asm__ __volatile__("dsb oshst" ::: "memory"); break;
724 case 3: __asm__ __volatile__("dsb osh" ::: "memory"); break;
725 case 5: __asm__ __volatile__("dsb nshld" ::: "memory"); break;
726 case 6: __asm__ __volatile__("dsb nshst" ::: "memory"); break;
727 case 7: __asm__ __volatile__("dsb nsh" ::: "memory"); break;
728 case 9: __asm__ __volatile__("dsb ishld" ::: "memory"); break;
729 case 10: __asm__ __volatile__("dsb ishst" ::: "memory"); break;
730 case 11: __asm__ __volatile__("dsb ish" ::: "memory"); break;
731 case 13: __asm__ __volatile__("dsb ld" ::: "memory"); break;
732 case 14: __asm__ __volatile__("dsb st" ::: "memory"); break;
733 default: __asm__ __volatile__("dsb sy" ::: "memory"); break;
734 }
735}
736#endif
737
738#if !HAS_BUILTIN(__isb)
739__INTRIN_INLINE void __isb(unsigned int type)
740{
741 /* ISB on ARM64 only supports the 'sy' option; accept the type arg
742 for API compatibility with MS docs and ignore it. */
743 (void)type;
744 __asm__ __volatile__("isb" ::: "memory");
745}
746#endif
747
748/* _ReadStatusReg/_WriteStatusReg and __setReg intentionally omitted: they take
749 a 15-bit encoded sysreg op0:op1:CRn:CRm:op2 immediate. Callers in HAL/KE
750 should use named MSR/MRS asm wrappers instead. */
751
752#if !HAS_BUILTIN(__getReg)
753#define __getReg(reg) \
754 __extension__({ \
755 _Static_assert((unsigned long long)(reg) <= 31ULL, \
756 "__getReg: register index out of range"); \
757 unsigned __int64 _value; \
758 __asm__ __volatile__("mov %0, x%c1" : "=r"(_value) : "i"(reg)); \
759 _value; \
760 })
761#endif
762
763/*** _InterlockedAdd (returns the new, post-add value) ***/
764#if !HAS_BUILTIN(_InterlockedAdd)
765__INTRIN_INLINE long _InterlockedAdd(volatile long *Addend, long Value)
766{
767 return __atomic_add_fetch(Addend, Value, __ATOMIC_SEQ_CST);
768}
769#endif
770
771#if !HAS_BUILTIN(_InterlockedAdd64)
772__INTRIN_INLINE long long _InterlockedAdd64(volatile long long *Addend, long long Value)
773{
774 return __atomic_add_fetch(Addend, Value, __ATOMIC_SEQ_CST);
775}
776#endif
777
778/*** TEB access via x18 (Windows ARM64 ABI dedicates x18 to the TEB).
779 *** Requires the toolchain to reserve x18 (default for aarch64-w64-mingw32;
780 *** add -ffixed-x18 on bare aarch64 targets if ever building elsewhere). ***/
781#if !HAS_BUILTIN(__readx18byte)
782__INTRIN_INLINE unsigned char __readx18byte(unsigned long offset)
783{
784 unsigned char value;
785 __asm__ __volatile__("ldrb %w0, [x18, %1]" : "=r"(value) : "r"((unsigned long long)offset));
786 return value;
787}
788#endif
789
790#if !HAS_BUILTIN(__readx18word)
791__INTRIN_INLINE unsigned short __readx18word(unsigned long offset)
792{
793 unsigned short value;
794 __asm__ __volatile__("ldrh %w0, [x18, %1]" : "=r"(value) : "r"((unsigned long long)offset));
795 return value;
796}
797#endif
798
799#if !HAS_BUILTIN(__readx18dword)
800__INTRIN_INLINE unsigned long __readx18dword(unsigned long offset)
801{
802 unsigned long value;
803 __asm__ __volatile__("ldr %w0, [x18, %1]" : "=r"(value) : "r"((unsigned long long)offset));
804 return value;
805}
806#endif
807
808#if !HAS_BUILTIN(__readx18qword)
810{
811 unsigned __int64 value;
812 __asm__ __volatile__("ldr %0, [x18, %1]" : "=r"(value) : "r"((unsigned long long)offset));
813 return value;
814}
815#endif
816
817#if !HAS_BUILTIN(__writex18byte)
818__INTRIN_INLINE void __writex18byte(unsigned long offset, unsigned char value)
819{
820 __asm__ __volatile__("strb %w1, [x18, %0]" : : "r"((unsigned long long)offset), "r"(value) : "memory");
821}
822#endif
823
824#if !HAS_BUILTIN(__writex18word)
825__INTRIN_INLINE void __writex18word(unsigned long offset, unsigned short value)
826{
827 __asm__ __volatile__("strh %w1, [x18, %0]" : : "r"((unsigned long long)offset), "r"(value) : "memory");
828}
829#endif
830
831#if !HAS_BUILTIN(__writex18dword)
832__INTRIN_INLINE void __writex18dword(unsigned long offset, unsigned long value)
833{
834 __asm__ __volatile__("str %w1, [x18, %0]" : : "r"((unsigned long long)offset), "r"(value) : "memory");
835}
836#endif
837
838#if !HAS_BUILTIN(__writex18qword)
840{
841 __asm__ __volatile__("str %1, [x18, %0]" : : "r"((unsigned long long)offset), "r"(value) : "memory");
842}
843#endif
844
845#endif
unsigned char ch[4][2]
Definition: console.c:118
#define __cdecl
Definition: corecrt.h:121
#define __int64
Definition: corecrt.h:72
IN OUT PLONG Addend
Definition: CrNtStubs.h:25
unsigned int Mask
Definition: fpcontrol.c:82
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLintptr offset
Definition: glext.h:5920
GLenum GLint GLuint mask
Definition: glext.h:6028
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
__int128 __attribute__((may_alias)) __ms_int128_t
Definition: intrin_arm64.h:361
__INTRIN_INLINE unsigned char _interlockedbittestandset(volatile long *a, long b)
Definition: intrin_arm64.h:499
__INTRIN_INLINE unsigned long long __umulh(unsigned long long a, unsigned long long b)
Definition: intrin_arm64.h:671
__INTRIN_INLINE void __writex18qword(unsigned long offset, unsigned __int64 value)
Definition: intrin_arm64.h:839
__INTRIN_INLINE unsigned short __cdecl _rotl16(unsigned short value, unsigned char shift)
Definition: intrin_arm64.h:540
__INTRIN_INLINE long long _InterlockedXor64(volatile long long *Value, long long Mask)
Definition: intrin_arm64.h:311
__INTRIN_INLINE unsigned char _interlockedbittestandset64(volatile long long *a, long long b)
Definition: intrin_arm64.h:519
__INTRIN_INLINE long _InterlockedAdd(volatile long *Addend, long Value)
Definition: intrin_arm64.h:765
__INTRIN_INLINE unsigned char _BitScanForward(unsigned long *Index, unsigned long Mask)
Definition: intrin_arm64.h:91
__INTRIN_INLINE void _ReadWriteBarrier(void)
Definition: intrin_arm64.h:60
__INTRIN_INLINE short _InterlockedAnd16(volatile short *Value, short Mask)
Definition: intrin_arm64.h:241
__INTRIN_INLINE void __dsb(unsigned int type)
Definition: intrin_arm64.h:718
__INTRIN_INLINE unsigned char __readx18byte(unsigned long offset)
Definition: intrin_arm64.h:782
__INTRIN_INLINE unsigned __int64 __readx18qword(unsigned long offset)
Definition: intrin_arm64.h:809
__INTRIN_INLINE long long _InterlockedAnd64(volatile long long *Value, long long Mask)
Definition: intrin_arm64.h:255
__INTRIN_INLINE long _InterlockedIncrement(volatile long *Addend)
Definition: intrin_arm64.h:318
__INTRIN_INLINE short _InterlockedDecrement16(volatile short *Addend)
Definition: intrin_arm64.h:346
__INTRIN_INLINE unsigned int _CountOneBits(unsigned long value)
Definition: intrin_arm64.h:649
__INTRIN_INLINE void __yield(void)
Definition: intrin_arm64.h:687
__INTRIN_INLINE long long __cdecl _abs64(long long value)
Definition: intrin_arm64.h:678
__INTRIN_INLINE unsigned int __cdecl _rotl(unsigned int value, int shift)
Definition: intrin_arm64.h:550
__INTRIN_INLINE unsigned char _bittestandcomplement64(long long *a, long long b)
Definition: intrin_arm64.h:477
__INTRIN_INLINE long long _InterlockedExchange64(volatile long long *Target, long long Value)
Definition: intrin_arm64.h:192
__INTRIN_INLINE long long __mulh(long long a, long long b)
Definition: intrin_arm64.h:664
__INTRIN_INLINE unsigned short _byteswap_ushort(unsigned short value)
Definition: intrin_arm64.h:70
__INTRIN_INLINE unsigned int _CountLeadingZeros(unsigned long value)
Definition: intrin_arm64.h:631
__INTRIN_INLINE unsigned long long _rotr64(unsigned long long value, int shift)
Definition: intrin_arm64.h:600
__INTRIN_INLINE long long _InterlockedOr64(volatile long long *Value, long long Mask)
Definition: intrin_arm64.h:283
__INTRIN_INLINE void __dmb(unsigned int type)
Definition: intrin_arm64.h:694
__INTRIN_INLINE unsigned short __readx18word(unsigned long offset)
Definition: intrin_arm64.h:791
__INTRIN_INLINE unsigned char _interlockedbittestandreset(volatile long *a, long b)
Definition: intrin_arm64.h:489
__INTRIN_INLINE long long _InterlockedIncrement64(volatile long long *Addend)
Definition: intrin_arm64.h:332
__INTRIN_INLINE unsigned char __cdecl _rotl8(unsigned char value, unsigned char shift)
Definition: intrin_arm64.h:530
__INTRIN_INLINE unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64 value)
Definition: intrin_arm64.h:84
__INTRIN_INLINE void __nop(void)
Definition: intrin_arm64.h:400
__INTRIN_INLINE long long _InterlockedExchangeAdd64(volatile long long *Addend, long long Value)
Definition: intrin_arm64.h:227
__INTRIN_INLINE unsigned char _bittestandreset64(long long *a, long long b)
Definition: intrin_arm64.h:466
__INTRIN_INLINE char _InterlockedOr8(volatile char *Value, char Mask)
Definition: intrin_arm64.h:276
__INTRIN_INLINE short _InterlockedCompareExchange16(volatile short *Destination, short Exchange, short Comparand)
Definition: intrin_arm64.h:142
__INTRIN_INLINE void __writex18word(unsigned long offset, unsigned short value)
Definition: intrin_arm64.h:825
__INTRIN_INLINE unsigned char _BitScanReverse(unsigned long *Index, unsigned long Mask)
Definition: intrin_arm64.h:102
__INTRIN_INLINE void __writex18dword(unsigned long offset, unsigned long value)
Definition: intrin_arm64.h:832
__INTRIN_INLINE long long _InterlockedCompareExchange64(volatile long long *Destination, long long Exchange, long long Comparand)
Definition: intrin_arm64.h:156
__INTRIN_INLINE long _InterlockedOr(volatile long *Value, long Mask)
Definition: intrin_arm64.h:262
__INTRIN_INLINE unsigned char _BitScanReverse64(unsigned long *Index, unsigned long long Mask)
Definition: intrin_arm64.h:124
__INTRIN_INLINE unsigned char _bittestandset64(long long *a, long long b)
Definition: intrin_arm64.h:455
__INTRIN_INLINE long long _InterlockedAdd64(volatile long long *Addend, long long Value)
Definition: intrin_arm64.h:772
__INTRIN_INLINE short _InterlockedExchangeAdd16(volatile short *Addend, short Value)
Definition: intrin_arm64.h:213
__INTRIN_INLINE void __isb(unsigned int type)
Definition: intrin_arm64.h:739
__INTRIN_INLINE void * _InterlockedExchangePointer(void *volatile *Target, void *Value)
Definition: intrin_arm64.h:199
__INTRIN_INLINE unsigned long __cdecl _lrotr(unsigned long value, int shift)
Definition: intrin_arm64.h:620
__INTRIN_INLINE void __writex18byte(unsigned long offset, unsigned char value)
Definition: intrin_arm64.h:818
__INTRIN_INLINE char _InterlockedExchangeAdd8(volatile char *Addend, char Value)
Definition: intrin_arm64.h:220
__INTRIN_INLINE unsigned int _CountOneBits64(unsigned __int64 value)
Definition: intrin_arm64.h:656
__INTRIN_INLINE unsigned char _bittestandset(long *a, long b)
Definition: intrin_arm64.h:415
__INTRIN_INLINE short _InterlockedExchange16(volatile short *Target, short Value)
Definition: intrin_arm64.h:178
__INTRIN_INLINE unsigned char _bittestandreset(long *a, long b)
Definition: intrin_arm64.h:426
__INTRIN_INLINE long _InterlockedExchangeAdd(volatile long *Addend, long Value)
Definition: intrin_arm64.h:206
__INTRIN_INLINE unsigned short __cdecl _rotr16(unsigned short value, unsigned char shift)
Definition: intrin_arm64.h:580
__INTRIN_INLINE unsigned char __cdecl _rotr8(unsigned char value, unsigned char shift)
Definition: intrin_arm64.h:570
__INTRIN_INLINE unsigned long __cdecl _byteswap_ulong(unsigned long value)
Definition: intrin_arm64.h:77
__INTRIN_INLINE short _InterlockedIncrement16(volatile short *Addend)
Definition: intrin_arm64.h:325
__INTRIN_INLINE short _InterlockedXor16(volatile short *Value, short Mask)
Definition: intrin_arm64.h:297
__INTRIN_INLINE long _InterlockedExchange(volatile long *Target, long Value)
Definition: intrin_arm64.h:170
__INTRIN_INLINE long _InterlockedDecrement(volatile long *Addend)
Definition: intrin_arm64.h:339
#define __INTRIN_INLINE
Definition: intrin_arm64.h:45
__INTRIN_INLINE unsigned long long _rotl64(unsigned long long value, int shift)
Definition: intrin_arm64.h:560
__INTRIN_INLINE unsigned int __cdecl _rotr(unsigned int value, int shift)
Definition: intrin_arm64.h:590
__INTRIN_INLINE long long _InterlockedDecrement64(volatile long long *Addend)
Definition: intrin_arm64.h:353
__INTRIN_INLINE char _InterlockedCompareExchange8(volatile char *Destination, char Exchange, char Comparand)
Definition: intrin_arm64.h:149
__INTRIN_INLINE unsigned int _CountLeadingZeros64(unsigned __int64 value)
Definition: intrin_arm64.h:640
__INTRIN_INLINE void __break(int value)
Definition: intrin_arm64.h:53
__INTRIN_INLINE unsigned char _bittest(const long *a, long b)
Definition: intrin_arm64.h:408
__INTRIN_INLINE unsigned long __cdecl _lrotl(unsigned long value, int shift)
Definition: intrin_arm64.h:610
__INTRIN_INLINE unsigned char _bittestandcomplement(long *a, long b)
Definition: intrin_arm64.h:437
__INTRIN_INLINE long _InterlockedCompareExchange(volatile long *Destination, long Exchange, long Comparand)
Definition: intrin_arm64.h:135
__INTRIN_INLINE unsigned char _bittest64(const long long *a, long long b)
Definition: intrin_arm64.h:448
__INTRIN_INLINE unsigned char _interlockedbittestandreset64(volatile long long *a, long long b)
Definition: intrin_arm64.h:509
__INTRIN_INLINE unsigned long __readx18dword(unsigned long offset)
Definition: intrin_arm64.h:800
__INTRIN_INLINE void * _InterlockedCompareExchangePointer(void *volatile *Destination, void *Exchange, void *Comparand)
Definition: intrin_arm64.h:163
__INTRIN_INLINE unsigned char _BitScanForward64(unsigned long *Index, unsigned long long Mask)
Definition: intrin_arm64.h:113
__INTRIN_INLINE char _InterlockedExchange8(volatile char *Target, char Value)
Definition: intrin_arm64.h:185
__INTRIN_INLINE unsigned char _InterlockedCompareExchange128(volatile __int64 *Destination, __int64 ExchangeHigh, __int64 ExchangeLow, __int64 *ComparandResult)
Definition: intrin_arm64.h:362
volatile char *const const char modify volatile long *const const long modify _InterlockedOr16
Definition: intrin_ppc.h:269
_InterlockedAnd8
Definition: intrin_ppc.h:265
volatile char *const const char modify volatile long *const const long modify volatile short *const const short modify volatile char *const const char modify _InterlockedXor
Definition: intrin_ppc.h:273
volatile char *const const char modify _InterlockedAnd
Definition: intrin_ppc.h:267
volatile char *const const char modify volatile long *const const long modify volatile short *const const short modify _InterlockedXor8
Definition: intrin_ppc.h:271
static PVOID ptr
Definition: dispmode.c:27
#define shift
Definition: input.c:3280
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:3051
__asm__(".p2align 4, 0x90\n" ".seh_proc __seh2_global_filter_func\n" "__seh2_global_filter_func:\n" "\tsub %rbp, %rax\n" "\tpush %rbp\n" "\t.seh_pushreg %rbp\n" "\tpush %rbx\n" "\t.seh_pushreg %rbx\n" "\tpush %rdi\n" "\t.seh_pushreg %rdi\n" "\tpush %rsi\n" "\t.seh_pushreg %rsi\n" "\tpush %r12\n" "\t.seh_pushreg %r12\n" "\tpush %r13\n" "\t.seh_pushreg %r13\n" "\tpush %r14\n" "\t.seh_pushreg %r14\n" "\tpush %r15\n" "\t.seh_pushreg %r15\n" "\tsub $40, %rsp\n" "\t.seh_stackalloc 40\n" "\t.seh_endprologue\n" "\tsub %rax, %rdx\n" "\tmov %rdx, %rbp\n" "\tjmp *%r8\n" "__seh2_global_filter_func_exit:\n" "\t.p2align 4\n" "\tadd $40, %rsp\n" "\tpop %r15\n" "\tpop %r14\n" "\tpop %r13\n" "\tpop %r12\n" "\tpop %rsi\n" "\tpop %rdi\n" "\tpop %rbx\n" "\tpop %rbp\n" "\tret\n" "\t.seh_endproc")
Definition: mem.c:349
Definition: ps.c:97
Definition: pdh_main.c:96
int retval
Definition: wcstombs.cpp:91
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306