FFmpeg/libavutil/riscv/timer.h
Rémi Denis-Courmont 7a24d794f6 Revert "lavu/timer: remove gratuitous volatile"
It does not make much sense to me, but GCC somehow optimises the
inline assembler even though the output is very obviously used and
having observable side effects.

This reverts commit 09731fbfc3.
2023-09-28 17:48:18 +03:00

55 lines
1.4 KiB
C

/*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVUTIL_RISCV_TIMER_H
#define AVUTIL_RISCV_TIMER_H
#include "config.h"
#if HAVE_INLINE_ASM
#include <stdint.h>
static inline uint64_t ff_read_time(void)
{
#if (__riscv_xlen >= 64)
uintptr_t cycles;
__asm__ volatile ("rdtime %0" : "=r" (cycles));
#else
uint64_t cycles;
uint32_t hi, lo, check;
__asm__ volatile (
"1: rdtimeh %0\n"
" rdtime %1\n"
" rdtimeh %2\n"
" bne %0, %2, 1b\n" : "=r" (hi), "=r" (lo), "=r" (check));
cycles = (((uint64_t)hi) << 32) | lo;
#endif
return cycles;
}
#define AV_READ_TIME ff_read_time
#define FF_TIMER_UNITS "ticks"
#endif
#endif /* AVUTIL_RISCV_TIMER_H */