Browse Source

switch to read_cycle_counter_frequency from arm64_read_cycle_counter_freq, trap on invalid arch

Colin Davidson 1 month ago
parent
commit
9a2e6fff48

+ 1 - 2
base/intrinsics/intrinsics.odin

@@ -32,6 +32,7 @@ trap       :: proc() -> ! ---
 alloca             :: proc(size, align: int) -> [^]u8 ---
 cpu_relax          :: proc() ---
 read_cycle_counter :: proc() -> i64 ---
+read_cycle_counter_frequency :: proc() -> i64 ---
 
 count_ones           :: proc(x: $T) -> T where type_is_integer(T) || type_is_simd_vector(T) ---
 count_zeros          :: proc(x: $T) -> T where type_is_integer(T) || type_is_simd_vector(T) ---
@@ -361,8 +362,6 @@ wasm_memory_atomic_notify32 :: proc(ptr: ^u32, waiters: u32) -> (waiters_woken_u
 x86_cpuid  :: proc(ax, cx: u32) -> (eax, ebx, ecx, edx: u32) ---
 x86_xgetbv :: proc(cx: u32) -> (eax, edx: u32) ---
 
-// Arm64 targets
-arm64_read_cycle_counter_frequency :: proc() -> i64 ---
 
 
 // Darwin targets only

+ 1 - 1
core/time/tsc_darwin.odin

@@ -8,7 +8,7 @@ _get_tsc_frequency :: proc "contextless" () -> (freq: u64, ok: bool) {
 	if ODIN_ARCH == .amd64 {
 		unix.sysctlbyname("machdep.tsc.frequency", &freq) or_return
 	} else if ODIN_ARCH == .arm64 {
-		freq = u64(intrinsics.arm64_read_cycle_counter_frequency())
+		freq = u64(intrinsics.read_cycle_counter_frequency())
 	} else {
 		return
 	}

+ 1 - 1
core/time/tsc_linux.odin

@@ -7,7 +7,7 @@ import linux "core:sys/linux"
 
 _get_tsc_frequency :: proc "contextless" () -> (u64, bool) {
 	if ODIN_ARCH == .arm64 {
-		frequency := u64(intrinsics.arm64_read_cycle_counter_frequency())
+		frequency := u64(intrinsics.read_cycle_counter_frequency())
 		return frequency, true
 	} else {
 		// Get the file descriptor for the perf mapping

+ 1 - 1
src/check_builtin.cpp

@@ -4713,7 +4713,7 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As
 		}
 		break;
 
-	case BuiltinProc_arm64_read_cycle_counter_frequency:
+	case BuiltinProc_read_cycle_counter_frequency:
 	case BuiltinProc_read_cycle_counter:
 		operand->mode = Addressing_Value;
 		operand->type = t_i64;

+ 2 - 2
src/checker_builtin_procs.hpp

@@ -61,6 +61,7 @@ enum BuiltinProcId {
 	BuiltinProc_trap,
 	BuiltinProc_debug_trap,
 	BuiltinProc_read_cycle_counter,
+	BuiltinProc_read_cycle_counter_frequency,
 
 	BuiltinProc_count_ones,
 	BuiltinProc_count_zeros,
@@ -225,7 +226,6 @@ BuiltinProc__simd_end,
 	BuiltinProc_x86_cpuid,
 	BuiltinProc_x86_xgetbv,
 
-	BuiltinProc_arm64_read_cycle_counter_frequency,
 
 	// Constant type tests
 
@@ -423,6 +423,7 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = {
 	{STR_LIT("trap"),               0, false, Expr_Expr, BuiltinProcPkg_intrinsics, /*diverging*/true},
 	{STR_LIT("debug_trap"),         0, false, Expr_Stmt, BuiltinProcPkg_intrinsics, /*diverging*/false},
 	{STR_LIT("read_cycle_counter"), 0, false, Expr_Expr, BuiltinProcPkg_intrinsics},
+	{STR_LIT("read_cycle_counter_frequency"), 0, false, Expr_Expr, BuiltinProcPkg_intrinsics},
 
 	{STR_LIT("count_ones"),           1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
 	{STR_LIT("count_zeros"),          1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
@@ -586,7 +587,6 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = {
 	{STR_LIT("syscall_bsd"), 1, true, Expr_Expr, BuiltinProcPkg_intrinsics, false, true},
 	{STR_LIT("x86_cpuid"),  2, false, Expr_Expr, BuiltinProcPkg_intrinsics},
 	{STR_LIT("x86_xgetbv"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
-	{STR_LIT("arm64_read_cycle_counter_frequency"), 0, false, Expr_Expr, BuiltinProcPkg_intrinsics},
 
 
 	{STR_LIT(""), 0, false, Expr_Stmt, BuiltinProcPkg_intrinsics},

+ 10 - 6
src/llvm_backend_proc.cpp

@@ -2809,16 +2809,20 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
 			}
 			return res;
 		}
-	case BuiltinProc_arm64_read_cycle_counter_frequency:
+	case BuiltinProc_read_cycle_counter_frequency:
 		{
 			lbValue res = {};
 			res.type = tv.type;
 
-			LLVMTypeRef func_type = LLVMFunctionType(LLVMInt64TypeInContext(p->module->ctx), nullptr, 0, false);
-			bool has_side_effects = false;
-			LLVMValueRef the_asm = llvm_get_inline_asm(func_type, str_lit("mrs $0, cntfrq_el0"), str_lit("=r"), has_side_effects);
-			GB_ASSERT(the_asm != nullptr);
-			res.value = LLVMBuildCall2(p->builder, func_type, the_asm, nullptr, 0, "");
+			if (build_context.metrics.arch == TargetArch_arm64) {
+				LLVMTypeRef func_type = LLVMFunctionType(LLVMInt64TypeInContext(p->module->ctx), nullptr, 0, false);
+				bool has_side_effects = false;
+				LLVMValueRef the_asm = llvm_get_inline_asm(func_type, str_lit("mrs $0, cntfrq_el0"), str_lit("=r"), has_side_effects);
+				GB_ASSERT(the_asm != nullptr);
+				res.value = LLVMBuildCall2(p->builder, func_type, the_asm, nullptr, 0, "");
+			} else {
+				GB_PANIC("Unsupported architecture: %.*s", LIT(target_arch_names[build_context.metrics.arch]));
+			}
 
 			return res;
 		}