UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
VVMAtomics.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#if WITH_VERSE_VM || defined(__INTELLISENSE__)
6
7#include "HAL/Platform.h"
8#include <atomic>
9
10namespace Verse
11{
12
16inline void CompilerFence()
17{
18#if PLATFORM_WINDOWS
20#else
21 asm volatile("" ::
22 : "memory");
23#endif
24}
25
26#if PLATFORM_CPU_ARM_FAMILY
27
29inline void ArmDmb()
30{
31 asm volatile("dmb ish" ::
32 : "memory");
33}
34
35// Like the above, but only affects stores.
36inline void ArmDmbSt()
37{
38 asm volatile("dmb ishst" ::
39 : "memory");
40}
41
42inline void ArmIsb()
43{
44 asm volatile("isb" ::
45 : "memory");
46}
47
48inline void LoadLoadFence()
49{
50 ArmDmb();
51}
52inline void LoadStoreFence()
53{
54 ArmDmb();
55}
56inline void StoreLoadFence()
57{
58 ArmDmb();
59}
60inline void StoreStoreFence()
61{
62 ArmDmbSt();
63}
64inline void CrossModifyingCodeFence()
65{
66 ArmIsb();
67}
68
69#elif PLATFORM_CPU_X86_FAMILY
70
71inline void X86Ortop()
72{
73#if PLATFORM_WINDOWS
75#elif PLATFORM_64BITS
76 asm volatile("lock; orl $0, (%%rsp)" ::
77 : "memory");
78#else
79 asm volatile("lock; orl $0, (%%esp)" ::
80 : "memory");
81#endif
82}
83
84inline void X86Cpuid()
85{
86#if PLATFORM_WINDOWS
87 int info[4];
88 __cpuid(info, 0);
89#else
90 intptr_t a = 0, b, c, d;
91 asm volatile(
92 "cpuid"
93 : "+a"(a), "=b"(b), "=c"(c), "=d"(d)
94 :
95 : "memory");
96#endif
97}
98
99inline void LoadLoadFence()
100{
102}
103inline void LoadStoreFence()
104{
106}
107inline void StoreLoadFence()
108{
109 X86Ortop();
110}
111inline void StoreStoreFence()
112{
114}
115inline void CrossModifyingCodeFence()
116{
117 X86Cpuid();
118}
119
120#else
121
122inline void LoadLoadFence()
123{
124 std::atomic_thread_fence(std::memory_order_seq_cst);
125}
126inline void LoadStoreFence()
127{
128 std::atomic_thread_fence(std::memory_order_seq_cst);
129}
130inline void StoreLoadFence()
131{
132 std::atomic_thread_fence(std::memory_order_seq_cst);
133}
134inline void StoreStoreFence()
135{
136 std::atomic_thread_fence(std::memory_order_seq_cst);
137}
138inline void CrossModifyingCodeFence()
139{
140 std::atomic_thread_fence(std::memory_order_seq_cst);
141} // Probably not strong enough.
142
143#endif
144
145} // namespace Verse
146#endif // WITH_VERSE_VM
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
Definition Archive.h:36
CORE_API static FORCENOINLINE void MemoryBarrier()
Definition GenericPlatformMisc.cpp:746