[FFmpeg-devel] [PATCH] read_time() for SPARC
Michael Kostylev
michael.kostylev
Thu Sep 9 12:15:57 CEST 2010
On Wed Sep 8 21:54:43 2010
M?ns Rullg?rd wrote:
>>>>>> The attached patch provides access to a 63-bit tick counter which is
>>>>>> available on the v9 cpus in the manner compatible with the v8+ abi.
>>>>>>
>>>>>> +#ifndef AVUTIL_SPARC_TIMER_H
>>>>>> +#define AVUTIL_SPARC_TIMER_H
>>>>>> +
>>>>>> +#ifdef __sparc_v9__
>>>>>> +
>>>>>> +#include <stdint.h>
>>>>>> +
>>>>>> +#define AV_READ_TIME read_time
>>>>>> +
>>>>>> +static inline uint64_t read_time(void)
>>>>>> +{
>>>>>> + uint64_t tc;
>>>>>> + __asm__ volatile("rd %%tick,%%g1\n\t"
>>>>>> + "stx %%g1,%0\n\t"
>>>>>> + : "=m" (tc) :: "g1");
>>>>>> + return tc;
>>>>>> +}
>>>>>
>>>>>Why can't you read the counter directly to whatever register 'tc'
>>>>>lives in?
>>>>
>>>> That will not work with v8+, tc will be filled with the least significant
>>>> 32 bits.
>>>
>>>Why?
>>
>> The rd instruction uses only register operands and the r constraint
>> is considered 32-bit (the rest bits are filled by the compiler). I
>> see no register constraint which would be 64-bit with v9 and v8+.
>
>$ cat sparc.c
>long long foo()
>{
> long long tc;
> __asm__ ("rd %%tick, %0" : "=r"(tc));
> return tc;
>}
>$ sparc64-unknown-linux-gnu-gcc -O3 -c sparc.c && sparc64-unknown-linux-gnu-objdump -d sparc.o
>sparc.o: file format elf64-sparc
>
>Disassembly of section .text:
>
>0000000000000000 <foo>:
> 0: 91 41 00 00 rd %tick, %o0
> 4: 81 c3 e0 08 retl
> 8: 01 00 00 00 nop
>$ sparc64-unknown-linux-gnu-gcc -mv8plus -O3 -c sparc.c && sparc64-unknown-linux-gnu-objdump -d sparc.o
>sparc.o: file format elf64-sparc
That's wrong. You must use -m32. How it looks on a real machine:
% gcc -O3 -c sparc.c
/tmp/ccdAPwzx.s: Assembler messages:
/tmp/ccdAPwzx.s:9: Error: Architecture mismatch on "rd".
/tmp/ccdAPwzx.s:9: (Requires v9|v9a|v9b; requested architecture is sparclite.)
% gcc -mcpu=v9 -O3 -c sparc.c && objdump -d sparc.o
>sparc.o: file format elf32-sparc
Disassembly of section .text:
00000000 <foo>:
0: 85 41 00 00 rd %tick, %g2
4: 92 10 00 03 mov %g3, %o1
8: 81 c3 e0 08 retl
c: 90 10 00 02 mov %g2, %o0
Not better when inlined.
% file sparc.o
sparc.o: ELF 32-bit MSB relocatable, SPARC32PLUS, V8+ Required, version 1 (SYSV), not stripped
Speaking of macros:
% gcc -E -xc -dM /dev/null | grep 'arch\|sparc'
#define sparc 1
#define __sparc__ 1
#define __sparc 1
#define __sparc_v8__ 1
% gcc -mcpu=v9 -E -xc -dM /dev/null | grep 'arch\|sparc'
#define sparc 1
#define __sparc__ 1
#define __sparc 1
#define __sparc_v9__ 1
% gcc -m64 -E -xc -dM /dev/null | grep 'arch\|sparc'
#define sparc 1
#define __sparc__ 1
#define __sparc 1
#define __arch64__ 1
% gcc -m64 -mcpu=ultrasparc -E -xc -dM /dev/null | grep 'arch\|sparc'
#define sparc 1
#define __sparc__ 1
#define __sparc 1
#define __sparc_v9__ 1
#define __arch64__ 1
-> #if defined (__sparc_v9__) || defined (__arch64__)
Michael
More information about the ffmpeg-devel
mailing list