[FFmpeg-devel] [RFC] Instruction set selection on x86 (was: Re: [PATCH] some SIMD write-combining for h264)

Måns Rullgård mans
Mon Jan 18 14:19:35 CET 2010


Alexander Strange <astrange at ithinksw.com> writes:

> On Jan 17, 2010, at 8:27 PM, M?ns Rullg?rd wrote:
>
>> Alexander Strange <astrange at ithinksw.com> writes:
>> 
>>> On Sun, Jan 17, 2010 at 7:54 PM, Carl Eugen Hoyos <cehoyos at ag.or.at> wrote:
>>>> Alexander Strange <astrange <at> ithinksw.com> writes:
>>>> 
>>>>>>>> also what sets __MMX__ ? we have our own defines for that
>>>>>>> 
>>>>>>> It's a gcc builtin define, set based on ./configure --cpu=x adding
>>>>>>> -march.  HAVE_MMX is for the build and not the host cpu family, and
>>>>>>> this is inlined asm, so it can't use it.
>>>>>> 
>>>>>> Huh?  Host... build???
>>>>> 
>>>>> Oh, that was supposed to be "target"...
>>>>> Anyway, this is MMX being used like the cmov/clz inlines, so it depends on the
>>>>> given --cpu and not on the build system's capabilities.
>>>> 
>>>> Could you explain once more why this shouldn't be HAVE_MMX?
>>>> If the user passes --disable-mmx to configure, he imo expects MMX to be disabled.
>>>> 
>>>> Carl Eugen
>>> 
>>> HAVE_MMX isn't enough to enable it - './configure --cpu=i586' enables
>>> HAVE_MMX, but i586 doesn't have it.
>> 
>> Not anymore.
>
> I think that was wrong. --cpu is the minimum required cpu, not the
> only expected cpu, but that turned off building dsputil mmx which is
> runtime-cpudetected. (even if runtime-cpudetection is disabled,
> actually)

How the heck do you want it then?  I am of the opinion that runtime
detection is a flawed idea from the start.  I'm not under the illusion
that I'll be able to change the minds of everyone, so I have an
alternative proposal.

First we need to look at the precise requirements:

1. With --cpu=foo code shall be built which will run on CPU foo, but have
   all optimised functions in place for activation on more capable CPUs.

2. With --disable-{mmx,sse,...} code shall be tuned for --cpu, but all
   {mmx,sse,...} shall be disabled in both hand-written asm and compiled
   code.  This implies adding compiler flags such -mno-mmx in some cases.

This means that for each of the extensions, we will have three
options:

1. Not allowed.
2. Allowed only in functions activated at runtime.
3. Allowed everywhere.

The current HAVE_* preprocessor symbols are boolean, so a change is
needed.  I see two possibilities here.

1. Use two symbols for each extension, one indicating option 2 above,
   the other option 3 (the latter obviously implying the former).

2. Extend the system to allow any (non-negative) number for feature
   macros, with the values 0, 1, and 2 indicating the options above.
   This would require more changes to the configure script, but might
   prove useful in future.

Did I miss anything?

-- 
M?ns Rullg?rd
mans at mansr.com



More information about the ffmpeg-devel mailing list