public static TEnum VolatileRead <TEnum>(this ref TEnum value) where TEnum : struct, Enum { const string resultVar = "result"; const string nonFastPath = "nonFastPath"; DeclareLocals(false, new Var(resultVar, typeof(long))); Push(ref value); Emit.Sizeof <TEnum>(); Emit.Ldc_I4_8(); Emit.Beq(nonFastPath); // fast path - use volatile read instruction Emit.Volatile(); Emit.Ldobj <TEnum>(); Emit.Ret(); // non-fast path - use Volatile class MarkLabel(nonFastPath); Emit.Call(Method(typeof(Volatile), nameof(Volatile.Read), Type <long>().MakeByRefType())); Emit.Stloc(resultVar); Emit.Ldloca(resultVar); Emit.Ldobj <TEnum>(); return(Return <TEnum>()); }