aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-11-24 15:18:20 +0000
committergingerBill <bill@gingerbill.org>2020-11-24 15:18:20 +0000
commit9c1c9693f26114499d0fb37bb692291ede8fa7ea (patch)
treebd25fc2e16428bff7351db5d31108ecda874b9ab /src
parent776c3f4e90f5a8c2240ea084ffe94cce9f5525aa (diff)
Patch up gb.h
Diffstat (limited to 'src')
-rw-r--r--src/gb/gb.h23
-rw-r--r--src/ir_print.cpp6
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;
}