Lines 168-173
ulonglong my_timer_cycles(void) {
Link Here
|
168 |
__asm __volatile__("mrs %[rt],cntvct_el0" : [ rt ] "=r"(result)); |
168 |
__asm __volatile__("mrs %[rt],cntvct_el0" : [ rt ] "=r"(result)); |
169 |
return result; |
169 |
return result; |
170 |
} |
170 |
} |
|
|
171 |
#elif defined(__GNUC__) && defined(__riscv) // RISC-V |
172 |
// Use RDCYCLE (and RDCYCLEH on riscv32) |
173 |
{ |
174 |
#if __riscv_xlen == 32 |
175 |
ulong result_lo, result_hi0, result_hi1; |
176 |
// Implemented in assembly because Clang insisted on branching. |
177 |
__asm __volatile__( |
178 |
"rdcycleh %0\n" |
179 |
"rdcycle %1\n" |
180 |
"rdcycleh %2\n" |
181 |
"sub %0, %0, %2\n" |
182 |
"seqz %0, %0\n" |
183 |
"sub %0, zero, %0\n" |
184 |
"and %1, %1, %0\n" |
185 |
: "=r"(result_hi0), "=r"(result_lo), "=r"(result_hi1)); |
186 |
return (static_cast<ulonglong>(result_hi1) << 32) | result_lo; |
187 |
#else |
188 |
ulonglong result; |
189 |
__asm __volatile__("rdcycle %0" : "=r"(result)); |
190 |
return result; |
191 |
} |
192 |
#endif |
171 |
#elif defined(HAVE_SYS_TIMES_H) && defined(HAVE_GETHRTIME) |
193 |
#elif defined(HAVE_SYS_TIMES_H) && defined(HAVE_GETHRTIME) |
172 |
/* gethrtime may appear as either cycle or nanosecond counter */ |
194 |
/* gethrtime may appear as either cycle or nanosecond counter */ |
173 |
return (ulonglong)gethrtime(); |
195 |
return (ulonglong)gethrtime(); |
Lines 453-458
void my_timer_init(MY_TIMER_INFO *mti) {
Link Here
|
453 |
mti->cycles.routine = MY_TIMER_ROUTINE_ASM_GCC_SPARC64; |
475 |
mti->cycles.routine = MY_TIMER_ROUTINE_ASM_GCC_SPARC64; |
454 |
#elif defined(__GNUC__) && defined(__aarch64__) |
476 |
#elif defined(__GNUC__) && defined(__aarch64__) |
455 |
mti->cycles.routine = MY_TIMER_ROUTINE_ASM_AARCH64; |
477 |
mti->cycles.routine = MY_TIMER_ROUTINE_ASM_AARCH64; |
|
|
478 |
#elif defined(__GNUC__) && defined(__riscv) |
479 |
mti->cycles.routine = MY_TIMER_ROUTINE_ASM_RISCV; |
456 |
#elif defined(HAVE_SYS_TIMES_H) && defined(HAVE_GETHRTIME) |
480 |
#elif defined(HAVE_SYS_TIMES_H) && defined(HAVE_GETHRTIME) |
457 |
mti->cycles.routine = MY_TIMER_ROUTINE_GETHRTIME; |
481 |
mti->cycles.routine = MY_TIMER_ROUTINE_GETHRTIME; |
458 |
#else |
482 |
#else |
459 |
- |
|
|