98 lines
1.9 KiB
C++
Executable File
98 lines
1.9 KiB
C++
Executable File
namespace factor
|
|
{
|
|
|
|
inline static void memset_2(void *dst, u16 pattern, size_t size)
|
|
{
|
|
#ifdef __APPLE__
|
|
cell cell_pattern = (pattern | (pattern << 16));
|
|
memset_pattern4(dst,&cell_pattern,size);
|
|
#else
|
|
if(pattern == 0)
|
|
memset(dst,0,size);
|
|
else
|
|
{
|
|
u16 *start = (u16 *)dst;
|
|
u16 *end = (u16 *)((cell)dst + size);
|
|
while(start < end)
|
|
{
|
|
*start = pattern;
|
|
start++;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
inline static void memset_cell(void *dst, cell pattern, size_t size)
|
|
{
|
|
#ifdef __APPLE__
|
|
#ifdef FACTOR_64
|
|
memset_pattern8(dst,&pattern,size);
|
|
#else
|
|
memset_pattern4(dst,&pattern,size);
|
|
#endif
|
|
#else
|
|
if(pattern == 0)
|
|
memset(dst,0,size);
|
|
else
|
|
{
|
|
cell *start = (cell *)dst;
|
|
cell *end = (cell *)((cell)dst + size);
|
|
while(start < end)
|
|
{
|
|
*start = pattern;
|
|
start++;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void *fill_function_descriptor(void *ptr, void *code);
|
|
void *function_descriptor_field(void *ptr, size_t idx);
|
|
|
|
vm_char *safe_strdup(const vm_char *str);
|
|
cell read_cell_hex();
|
|
VM_C_API void *factor_memcpy(void *dst, void *src, size_t len);
|
|
|
|
#if defined(WINDOWS)
|
|
|
|
#if defined(FACTOR_64)
|
|
|
|
#define FACTOR_ATOMIC_CAS(ptr, old_val, new_val) \
|
|
(InterlockedCompareExchange64(ptr, new_val, old_val) == old_val)
|
|
|
|
#define FACTOR_ATOMIC_ADD(ptr, val) \
|
|
InterlockedAdd64(ptr, val)
|
|
|
|
#define FACTOR_ATOMIC_SUB(ptr, val) \
|
|
InterlockedSub64(ptr, val)
|
|
|
|
#else
|
|
|
|
#define FACTOR_ATOMIC_CAS(ptr, old_val, new_val) \
|
|
(InterlockedCompareExchange(ptr, new_val, old_val) == old_val)
|
|
|
|
#define FACTOR_ATOMIC_ADD(ptr, val) \
|
|
InterlockedAdd(ptr, val)
|
|
|
|
#define FACTOR_ATOMIC_SUB(ptr, val) \
|
|
InterlockedSub(ptr, val)
|
|
|
|
#endif
|
|
|
|
#elif defined(__GNUC__) || defined(__clang__)
|
|
|
|
#define FACTOR_ATOMIC_CAS(ptr, old_val, new_val) \
|
|
__sync_bool_compare_and_swap(ptr, old_val, new_val)
|
|
|
|
#define FACTOR_ATOMIC_ADD(ptr, val) \
|
|
__sync_add_and_fetch(ptr, val)
|
|
|
|
#define FACTOR_ATOMIC_SUB(ptr, val) \
|
|
__sync_sub_and_fetch(ptr, val)
|
|
|
|
#else
|
|
#error "Unsupported compiler"
|
|
#endif
|
|
|
|
}
|