diff options
| author | gingerBill <bill@gingerbill.org> | 2020-11-24 15:18:20 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2020-11-24 15:18:20 +0000 |
| commit | 9c1c9693f26114499d0fb37bb692291ede8fa7ea (patch) | |
| tree | bd25fc2e16428bff7351db5d31108ecda874b9ab /src | |
| parent | 776c3f4e90f5a8c2240ea084ffe94cce9f5525aa (diff) | |
Patch up gb.h
Diffstat (limited to 'src')
| -rw-r--r-- | src/gb/gb.h | 23 | ||||
| -rw-r--r-- | src/ir_print.cpp | 6 |
2 files changed, 27 insertions, 2 deletions
diff --git a/src/gb/gb.h b/src/gb/gb.h index b2718561b..9981b9e34 100644 --- a/src/gb/gb.h +++ b/src/gb/gb.h @@ -4639,7 +4639,11 @@ gb_inline void gb_yield_thread(void) { #if defined(GB_SYSTEM_WINDOWS) _mm_pause(); #elif defined(GB_SYSTEM_OSX) + #if defined(GB_CPU_X86) __asm__ volatile ("" : : : "memory"); + #elif defined(GB_CPU_ARM) + __asm__ volatile ("yield" : : : "memory"); + #endif #elif defined(GB_CPU_X86) _mm_pause(); #else @@ -4651,7 +4655,11 @@ gb_inline void gb_mfence(void) { #if defined(GB_SYSTEM_WINDOWS) _ReadWriteBarrier(); #elif defined(GB_SYSTEM_OSX) + #if defined(GB_CPU_X86) __sync_synchronize(); + #elif defined(GB_CPU_ARM) + __atomic_thread_fence(__ATOMIC_SEQ_CST); + #endif #elif defined(GB_CPU_X86) _mm_mfence(); #else @@ -4663,7 +4671,12 @@ gb_inline void gb_sfence(void) { #if defined(GB_SYSTEM_WINDOWS) _WriteBarrier(); #elif defined(GB_SYSTEM_OSX) + #if defined(GB_CPU_X86) __asm__ volatile ("" : : : "memory"); + #elif defined(GB_CPU_ARM) + // TODO(bill): is this correct? + __atomic_thread_fence(__ATOMIC_SEQ_CST); + #endif #elif defined(GB_CPU_X86) _mm_sfence(); #else @@ -5278,7 +5291,7 @@ void gb_affinity_init(gbAffinity *a) { for (;;) { // The 'temporary char'. Everything goes into this char, // so that we can check against EOF at the end of this loop. - char c; + int c; #define AF__CHECK(letter) ((c = getc(cpu_info)) == letter) if (AF__CHECK('c') && AF__CHECK('p') && AF__CHECK('u') && AF__CHECK(' ') && @@ -8884,6 +8897,14 @@ gb_inline gbDllProc gb_dll_proc_address(gbDllHandle dll, char const *proc_name) return result; } +#elif defined(__aarch64__) + gb_inline u64 gb_rdtsc(void) { + int64_t virtual_timer_value; + asm volatile("mrs %0, cntvct_el0" : "=r"(virtual_timer_value)); + return virtual_timer_value; + } +#else +#error "gb_rdtsc not supported" #endif #if defined(GB_SYSTEM_WINDOWS) diff --git a/src/ir_print.cpp b/src/ir_print.cpp index a6bfc75d3..cb71589c5 100644 --- a/src/ir_print.cpp +++ b/src/ir_print.cpp @@ -1575,7 +1575,11 @@ void ir_print_instr(irFileBuffer *f, irModule *m, irValue *value) { break; case BuiltinProc_cpu_relax: - ir_write_str_lit(f, "call void asm sideeffect \"pause\", \"\"()"); + if (build_context.metrics.arch == TargetArch_amd64) { + ir_write_str_lit(f, "call void asm sideeffect \"pause\", \"\"()"); + } else { + // ir_write_str_lit(f, "call void asm sideeffect \"yield\", \"\"()"); + } break; default: GB_PANIC("Unknown inline code %d", instr->InlineCode.id); break; } |