From ece44698697f0fd93ead5411e9ca02716fee3a3a Mon Sep 17 00:00:00 2001 From: Sergey Fedorov Date: Sat, 16 Aug 2025 02:25:32 +0800 Subject: [PATCH] Fix PowerPC support (#6292) --- docs/CONTRIBUTORS | 1 + include/verilatedos.h | 4 +++- include/verilatedos_c.h | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/CONTRIBUTORS b/docs/CONTRIBUTORS index e30c878d2..ba0af2f62 100644 --- a/docs/CONTRIBUTORS +++ b/docs/CONTRIBUTORS @@ -214,6 +214,7 @@ Ryszard Rozak Samuel Riedel Sean Cross Sebastien Van Cauwenberghe +Sergey Fedorov Sergi Granell Seth Pellegrino Shou-Li Hsu diff --git a/include/verilatedos.h b/include/verilatedos.h index 6b289292f..7894a4510 100644 --- a/include/verilatedos.h +++ b/include/verilatedos.h @@ -575,7 +575,9 @@ static inline double VL_ROUND(double n) { # define VL_CPU_RELAX() asm volatile("nop" ::: "memory") #elif defined(__mips64el__) || defined(__mips__) || defined(__mips64__) || defined(__mips64) # define VL_CPU_RELAX() asm volatile("pause" ::: "memory") -#elif defined(__powerpc64__) +#elif defined(__POWERPC__) && defined(__APPLE__) // First check for a special case of macOS +# define VL_CPU_RELAX() asm volatile("or r1, r1, r1; or r2, r2, r2;" ::: "memory") +#elif defined(__powerpc64__) || defined(__powerpc__) // Generic powerpc # define VL_CPU_RELAX() asm volatile("or 1, 1, 1; or 2, 2, 2;" ::: "memory") #elif defined(__riscv) // RiscV does not currently have yield/pause, but one is proposed # define VL_CPU_RELAX() asm volatile("nop" ::: "memory") diff --git a/include/verilatedos_c.h b/include/verilatedos_c.h index 2b4619816..849419701 100644 --- a/include/verilatedos_c.h +++ b/include/verilatedos_c.h @@ -38,7 +38,7 @@ #if defined(__linux) # include // For sched_getcpu() #endif -#if defined(__APPLE__) && !defined(__arm64__) +#if defined(__APPLE__) && !defined(__arm64__) && !defined(__POWERPC__) # include // For __cpuid_count() #endif // clang-format on @@ -88,7 +88,7 @@ double DeltaWallTime::gettime() VL_MT_SAFE { uint16_t getcpu() VL_MT_SAFE { #if defined(__linux) return sched_getcpu(); // TODO: this is a system call. Not exactly cheap. -#elif defined(__APPLE__) && !defined(__arm64__) +#elif defined(__APPLE__) && !defined(__arm64__) && !defined(__POWERPC__) uint32_t info[4]; __cpuid_count(1, 0, info[0], info[1], info[2], info[3]); // info[1] is EBX, bits 24-31 are APIC ID