Re: [FFmpeg-devel] [PATCH] x86: cabac: Disable the inline asm on clang on windows on i386

2020-05-29 Thread Martin Storsjö

On Fri, 29 May 2020, Carl Eugen Hoyos wrote:


Am 28.05.2020 um 12:37 schrieb Martin Storsjö :

Any further comments on this patch?


Please wait a few days more, I am not happy about the patch and at least 
I’d like to understand better why this is a good and why there is no 
alternative.


Fair enough, take your time.

A different alternative would maybe be to just disable HAVE_7REGS for this 
configuration, that would leave a couple more inline functions that might 
work. (I haven't tested that configuration to see if it fails as easily.)


// Martin
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH] x86: cabac: Disable the inline asm on clang on windows on i386

2020-05-29 Thread Carl Eugen Hoyos


> Am 28.05.2020 um 12:37 schrieb Martin Storsjö :
> 
>> On Mon, 25 May 2020, Martin Storsjö wrote:
>> 
>>> On Sun, 24 May 2020, Carl Eugen Hoyos wrote:
>>> 
>>> Am So., 24. Mai 2020 um 21:53 Uhr schrieb Martin Storsjö 
>> :
>>> 
 configure --enable-gpl --arch=i686 --cc=clang-cl --ld=lld-link
 --target-os=win32 --toolchain=msvc --enable-cross-compile --ar=llvm-ar
 --nm=llvm-nm --disable-stripping --extra-cflags=-m32
>>> 
>>> Why are you cross-compiling?
>>> On which system are you testing this?
>> 
>> Because I normally only ever cross compile for windows.
>> 
>> There seems to be a subtle difference in this case, between using clang-cl 
>> and "clang -target i686-win32-msvc"; clang-cl passes "-mdisable-fp-elim" to 
>> the compiler internals, while "clang -target i686-win32-msvc" doesn't.
>> 
>> And cross compiling does seem to affect this particular case; there's a 
>> check for whether ebp is available, which requires running the built 
>> executable. When cross compiling, it's assumed the built executable is ok 
>> and it isn't test run.
>> 
>> So with clang-cl running on windows, you'll end up with "#define 
>> HAVE_EBP_AVAILABLE 0" in config.h, and the x86 cabac code won't end up used 
>> at all - i.e. this patch wouldn't make any difference.
>> 
>> With clang-cl in cross compilation, and other invocations of "clang" instead 
>> of "clang-cl", targeting i686 windows, you'll end up with ebp_available 
>> enabled.
>> 
>> For a case where it does make a difference, in the same setup, try 
>> configuring this way instead:
>> 
>> --cc='clang -target i686-win32-msvc' --ld=lld-link 
>> --extra-ldflags='msvcrt.lib oldnames.lib' --toolchain=msvc
>> 
>> In this case, the ebp_available test will succeed, it will proceed to trying 
>> to build the x86 inline cabac code, which fails.
> 
> Any further comments on this patch?

Please wait a few days more, I am not happy about the patch and at least I’d 
like to understand better why this is a good and why there is no alternative.

Carl Eugen
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH] x86: cabac: Disable the inline asm on clang on windows on i386

2020-05-28 Thread Martin Storsjö

On Mon, 25 May 2020, Martin Storsjö wrote:


On Sun, 24 May 2020, Carl Eugen Hoyos wrote:

Am So., 24. Mai 2020 um 21:53 Uhr schrieb Martin Storsjö 

:



configure --enable-gpl --arch=i686 --cc=clang-cl --ld=lld-link
--target-os=win32 --toolchain=msvc --enable-cross-compile --ar=llvm-ar
--nm=llvm-nm --disable-stripping --extra-cflags=-m32


Why are you cross-compiling?
On which system are you testing this?


Because I normally only ever cross compile for windows.

There seems to be a subtle difference in this case, between using clang-cl 
and "clang -target i686-win32-msvc"; clang-cl passes "-mdisable-fp-elim" 
to the compiler internals, while "clang -target i686-win32-msvc" doesn't.


And cross compiling does seem to affect this particular case; there's a 
check for whether ebp is available, which requires running the built 
executable. When cross compiling, it's assumed the built executable is ok 
and it isn't test run.


So with clang-cl running on windows, you'll end up with "#define 
HAVE_EBP_AVAILABLE 0" in config.h, and the x86 cabac code won't end up 
used at all - i.e. this patch wouldn't make any difference.


With clang-cl in cross compilation, and other invocations of "clang" 
instead of "clang-cl", targeting i686 windows, you'll end up with 
ebp_available enabled.


For a case where it does make a difference, in the same setup, try 
configuring this way instead:


--cc='clang -target i686-win32-msvc' --ld=lld-link 
--extra-ldflags='msvcrt.lib oldnames.lib' --toolchain=msvc


In this case, the ebp_available test will succeed, it will proceed to 
trying to build the x86 inline cabac code, which fails.


Any further comments on this patch?

// Martin
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH] x86: cabac: Disable the inline asm on clang on windows on i386

2020-05-24 Thread Martin Storsjö

On Sun, 24 May 2020, Carl Eugen Hoyos wrote:


Am So., 24. Mai 2020 um 21:53 Uhr schrieb Martin Storsjö :


configure --enable-gpl --arch=i686 --cc=clang-cl --ld=lld-link
--target-os=win32 --toolchain=msvc --enable-cross-compile --ar=llvm-ar
--nm=llvm-nm --disable-stripping --extra-cflags=-m32


Why are you cross-compiling?
On which system are you testing this?


Because I normally only ever cross compile for windows.

There seems to be a subtle difference in this case, between using clang-cl 
and "clang -target i686-win32-msvc"; clang-cl passes "-mdisable-fp-elim" 
to the compiler internals, while "clang -target i686-win32-msvc" doesn't.


And cross compiling does seem to affect this particular case; there's a 
check for whether ebp is available, which requires running the built 
executable. When cross compiling, it's assumed the built executable is ok 
and it isn't test run.


So with clang-cl running on windows, you'll end up with "#define 
HAVE_EBP_AVAILABLE 0" in config.h, and the x86 cabac code won't end up 
used at all - i.e. this patch wouldn't make any difference.


With clang-cl in cross compilation, and other invocations of "clang" 
instead of "clang-cl", targeting i686 windows, you'll end up with 
ebp_available enabled.


For a case where it does make a difference, in the same setup, try 
configuring this way instead:


--cc='clang -target i686-win32-msvc' --ld=lld-link 
--extra-ldflags='msvcrt.lib oldnames.lib' --toolchain=msvc


In this case, the ebp_available test will succeed, it will proceed to 
trying to build the x86 inline cabac code, which fails.


// Martin
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH] x86: cabac: Disable the inline asm on clang on windows on i386

2020-05-24 Thread Carl Eugen Hoyos
Am So., 24. Mai 2020 um 21:53 Uhr schrieb Martin Storsjö :

> configure --enable-gpl --arch=i686 --cc=clang-cl --ld=lld-link
> --target-os=win32 --toolchain=msvc --enable-cross-compile --ar=llvm-ar
> --nm=llvm-nm --disable-stripping --extra-cflags=-m32

Why are you cross-compiling?
On which system are you testing this?

Carl Eugen
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH] x86: cabac: Disable the inline asm on clang on windows on i386

2020-05-24 Thread Martin Storsjö

On Sun, 24 May 2020, Carl Eugen Hoyos wrote:


Am Sa., 23. Mai 2020 um 20:35 Uhr schrieb Martin Storsjö :


The cabac inline assembly is very brittle to assemble properly
on i386 windows with clang; libavcodec/hevc_cabac.c fails to build
in the default mode (which is -march=pentium4), it only works if
ffmpeg is configured with --cpu=i686 (translating to -march=i686),
and likewise, the inline assembly fails to assemble in
libavcodec/h264_cabac.c if building with optimizations disabled.

Instead of trying to step around the problem (and end up bit by it
occasionally), just disable the inline assembly for this configuration.


I think I cannot reproduce this issue, what may I miss?


That's a good question - how are you building? I can reproduce it both in 
mingw and msvc mode.


In mingw mode (with my llvm-mingw toolchains from 
https://github.com/mstorsjo/llvm-mingw, but any clang configured to target 
i386 mingw should do), I can reproduce it (in a cross compile setup) like 
this (tested with Clang 10.0 but any version should do, I remember seeing 
the issue long ago):


$ configure --cross-prefix=i686-w64-mingw32- --target-os=mingw32 
--arch=i686 --enable-gpl

$ make V=1
...
i686-w64-mingw32-gcc -I. -Isrc/ -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 
-D_LARGEFILE_SOURCE -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1 
-D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -DHAVE_AV_CONFIG_H 
-DBUILDING_avcodec -std=c11 -fomit-frame-pointer -g 
-Wdeclaration-after-statement -Wall -Wdisabled-optimization 
-Wpointer-arith -Wredundant-decls -Wwrite-strings -Wtype-limits -Wundef 
-Wmissing-prototypes -Wno-pointer-to-int-cast -Wstrict-prototypes 
-Wempty-body -Wno-parentheses -Wno-switch -Wno-format-zero-length 
-Wno-pointer-sign -Wno-unused-const-variable -Wno-bool-operation 
-Wno-char-subscripts -O3 -fno-math-errno -fno-signed-zeros 
-Qunused-arguments -Werror=implicit-function-declaration 
-Werror=missing-prototypes -Werror=return-type  -MMD -MF 
libavcodec/hevc_cabac.d -MT libavcodec/hevc_cabac.o -c -o 
libavcodec/hevc_cabac.o src/libavcodec/hevc_cabac.c
warning: unknown warning option '-Wno-bool-operation'; did you mean 
'-Wno-bool-conversion'? [-Wunknown-warning-option]
src/libavcodec/hevc_cabac.c:37:21: warning: variable 'num_bins_in_se' is 
not needed and will not be emitted [-Wunneeded-internal-declaration]

static const int8_t num_bins_in_se[] = {
^
In file included from src/libavcodec/hevc_cabac.c:27:
In file included from src/libavcodec/cabac_functions.h:46:
src/libavcodec/x86/cabac.h:193:9: error: inline assembly requires more 
registers than available

BRANCHLESS_GET_CABAC("%0", "%q0", "(%4)", "%1", "%w1",
^


Same thing if I build in MSVC mode, by setting INCLUDE and LIB to point to 
the right MSVC folders, and configure like this:


$ configure --enable-gpl --arch=i686 --cc='clang -target i686-win32-msvc' 
--ld=lld-link --target-os=win32 --extra-ldflags='msvcrt.lib oldnames.lib' 
--enable-cross-compile --ar=llvm-ar --nm=llvm-nm --disable-stripping

$ make V=1
clang -target i686-win32-msvc -I. -Isrc/ -D_ISOC99_SOURCE 
-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_USE_MATH_DEFINES 
-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS -D_WIN32_WINNT=0x0600 
-DHAVE_AV_CONFIG_H -DBUILDING_avcodec -std=c11 -fomit-frame-pointer -g 
-Wdeclaration-after-statement -Wall -Wdisabled-optimization 
-Wpointer-arith -Wredundant-decls -Wwrite-strings -Wtype-limits -Wundef 
-Wmissing-prototypes -Wno-pointer-to-int-cast -Wstrict-prototypes 
-Wempty-body -Wno-parentheses -Wno-switch -Wno-format-zero-length 
-Wno-pointer-sign -Wno-unused-const-variable -Wno-bool-operation 
-Wno-char-subscripts -O3 -fno-math-errno -fno-signed-zeros 
-Qunused-arguments -Werror=implicit-function-declaration 
-Werror=missing-prototypes -Werror=return-type  -MMD -MF 
libavcodec/hevc_cabac.d -MT libavcodec/hevc_cabac.o -c -o 
libavcodec/hevc_cabac.o src/libavcodec/hevc_cabac.c
src/libavcodec/hevc_cabac.c:37:21: warning: variable 'num_bins_in_se' is 
not needed and will not be emitted [-Wunneeded-internal-declaration]

static const int8_t num_bins_in_se[] = {
^
In file included from src/libavcodec/hevc_cabac.c:27:
In file included from src/libavcodec/cabac_functions.h:46:
src/libavcodec/x86/cabac.h:193:9: error: inline assembly requires more 
registers than available

BRANCHLESS_GET_CABAC("%0", "%q0", "(%4)", "%1", "%w1",
^

The same also seems to trigger in the same way if using the clang-cl 
frontend, e.g. configured like this:


configure --enable-gpl --arch=i686 --cc=clang-cl --ld=lld-link 
--target-os=win32 --toolchain=msvc --enable-cross-compile --ar=llvm-ar 
--nm=llvm-nm --disable-stripping --extra-cflags=-m32



In the first two cases, adding --cpu=i686 to the configure line, which 
converts into -march=i686 on the compile commands, makes the issue go 
away. For clang-cl, --cpu=i686 doesn't have any effect, so the issue 
doesn't easily go away there.


Now if configuring with 

Re: [FFmpeg-devel] [PATCH] x86: cabac: Disable the inline asm on clang on windows on i386

2020-05-23 Thread Carl Eugen Hoyos
Am Sa., 23. Mai 2020 um 20:35 Uhr schrieb Martin Storsjö :
>
> The cabac inline assembly is very brittle to assemble properly
> on i386 windows with clang; libavcodec/hevc_cabac.c fails to build
> in the default mode (which is -march=pentium4), it only works if
> ffmpeg is configured with --cpu=i686 (translating to -march=i686),
> and likewise, the inline assembly fails to assemble in
> libavcodec/h264_cabac.c if building with optimizations disabled.
>
> Instead of trying to step around the problem (and end up bit by it
> occasionally), just disable the inline assembly for this configuration.

I think I cannot reproduce this issue, what may I miss?

Carl Eugen
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH] x86: cabac: Disable the inline asm on clang on windows on i386

2020-05-23 Thread Martin Storsjö
The cabac inline assembly is very brittle to assemble properly
on i386 windows with clang; libavcodec/hevc_cabac.c fails to build
in the default mode (which is -march=pentium4), it only works if
ffmpeg is configured with --cpu=i686 (translating to -march=i686),
and likewise, the inline assembly fails to assemble in
libavcodec/h264_cabac.c if building with optimizations disabled.

Instead of trying to step around the problem (and end up bit by it
occasionally), just disable the inline assembly for this configuration.
---
 libavcodec/x86/cabac.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavcodec/x86/cabac.h b/libavcodec/x86/cabac.h
index cfd3b759c9..5f1b97cec0 100644
--- a/libavcodec/x86/cabac.h
+++ b/libavcodec/x86/cabac.h
@@ -27,7 +27,7 @@
 #include "libavutil/x86/asm.h"
 #include "config.h"
 
-#if   (defined(__i386) && defined(__clang__) && (__clang_major__<2 || 
(__clang_major__==2 && __clang_minor__<10)))\
+#if   (defined(__i386) && defined(__clang__) && (__clang_major__<2 || 
(__clang_major__==2 && __clang_minor__<10)) || defined(_WIN32))\
|| (  !defined(__clang__) && defined(__llvm__) && 
__GNUC__==4 && __GNUC_MINOR__==2 && __GNUC_PATCHLEVEL__<=1)\
|| (defined(__INTEL_COMPILER) && defined(_MSC_VER))
 #   define BROKEN_COMPILER 1
-- 
2.17.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".