Improve RISC-V cpu_relax
authorAndrew Waterman <waterman@cs.berkeley.edu>
Tue, 23 Apr 2013 12:20:54 +0000 (05:20 -0700)
committerAndrew Waterman <waterman@cs.berkeley.edu>
Tue, 23 Apr 2013 12:20:54 +0000 (05:20 -0700)
Before, it executed a tight loop, which isn't energy efficient.  Now,
it divides 0 by 0 and "uses" the result, which, on our in-order
microarchitectures, results in a long-latency stall that doesn't burn too
much energy.

kern/arch/riscv/arch.h

index de468d6..415ef83 100644 (file)
@@ -112,8 +112,9 @@ static __inline void disable_irqsave(int8_t* state)
 
 static __inline void cpu_relax(void)
 {
-       for(int i = 0; i < 100; i++)
-               asm ("nop");
+       // compute and use 0/0, which stalls Rocket for dozens of cycles
+       long scratch;
+       asm volatile ("div %0, zero, zero; move %0, %0" : "=r"(scratch));
 }
 
 static __inline void clflush(uintptr_t* addr)