[FFmpeg-devel] [PATCH 1/3] ffbuild: Refine MIPS handling
guxiwei
guxiwei-hf at loongson.cn
Tue Jun 2 12:06:37 EEST 2020
> 2020年5月31日 下午3:59,Shiyou Yin <yinshiyou-hf at loongson.cn> 写道:
>
>> -----Original Message-----
>> From: ffmpeg-devel-bounces at ffmpeg.org <mailto:ffmpeg-devel-bounces at ffmpeg.org> [mailto:ffmpeg-devel-bounces at ffmpeg.org <mailto:ffmpeg-devel-bounces at ffmpeg.org>] On Behalf Of
>> Shiyou Yin
>> Sent: Sunday, May 31, 2020 11:33 AM
>> To: 'FFmpeg development discussions and patches'
>> Cc: yinshiyou at loongson.cn <mailto:yinshiyou at loongson.cn>
>> Subject: Re: [FFmpeg-devel] [PATCH 1/3] ffbuild: Refine MIPS handling
>>
>>> -----Original Message-----
>>> From: ffmpeg-devel-bounces at ffmpeg.org [mailto:ffmpeg-devel-bounces at ffmpeg.org] On Behalf Of
>>> Jiaxun Yang
>>> Sent: Tuesday, May 26, 2020 5:48 PM
>>> To: ffmpeg-devel at ffmpeg.org
>>> Cc: yinshiyou at loongson.cn; Jiaxun Yang
>>> Subject: [FFmpeg-devel] [PATCH 1/3] ffbuild: Refine MIPS handling
>>>
>>> To enable runtime detection for MIPS, we need to refine ffbuild
>>> part to support buildding these feature together.
>>>
>>> Firstly, we fixed configure, let it probe native ability of toolchain
>>> to decide wether a feature can to be enabled, also clearly marked
>>> the conflictions between loongson2 & loongson3 and Release 6 & rest.
>>>
>>> Secondly, we compile MMI and MSA C sources with their own flags to ensure
>>> their flags won't pollute the whole program and generate illegal code.
>>>
>>> Signed-off-by: Jiaxun Yang <jiaxun.yang at flygoat.com>
>>> ---
>>> configure | 179 +++++++++++++++++++++++----------------
>>> ffbuild/common.mak | 10 ++-
>>> libavcodec/mips/Makefile | 3 +-
>>> 3 files changed, 117 insertions(+), 75 deletions(-)
>>>
>>> diff --git a/configure b/configure
>>> index f97cad0298..8dc3874642 100755
>>> --- a/configure
>>> +++ b/configure
>>> @@ -1113,6 +1113,26 @@ void foo(void){ __asm__ volatile($code); }
>>> EOF
>>> }
>>>
>>> +check_extra_inline_asm_flags(){
>>> + log check_extra_inline_asm_flags "$@"
>>> + name="$1"
>>> + extra=$2
>>> + code="$3"
>>> + flags=''
>>> + shift 3
>>> + while [ "$1" != "" ]; do
>>> + append flags $1
>>> + shift
>>> + done;
>>> + disable $name
>>> + cat > $TMPC <<EOF
>>> +void foo(void){ __asm__ volatile($code); }
>>> +EOF
>>> + log_file $TMPC
>>> + test_cmd $cc $CPPFLAGS $CFLAGS $flags "$@" $CC_C $(cc_o $TMPO) $TMPC &&
>>> + enable $name && append $extra "$flags"
>>> +}
>>> +
>>
>> Use function check_inline_asm_flags is suggested.
>
> To avoid adding '-mmsa' to the global CFLAGS, use check_inline_asm. e.g.
> enabled msa && check_inline_asm msa '"addvi.b $w0, $w1, 1"' '-mmsa'
> enabled mmi && check_inline_asm mmi '"punpcklhw $f0, $f0, $f0"' "-mloongson-mmi"
> enabled loongson3 && check_inline_asm loongson3 '"gsldxc1 $f0, 0($2, $3)"' '-mloongson-ext'
>
>>
>>> check_inline_asm_flags(){
>>> log check_inline_asm_flags "$@"
>>> name="$1"
>>> @@ -2551,7 +2571,7 @@ mips64r6_deps="mips"
>>> mipsfpu_deps="mips"
>>> mipsdsp_deps="mips"
>>> mipsdspr2_deps="mips"
>>> -mmi_deps="mips"
>>> +mmi_deps_any="loongson2 loongson3"
>>> msa_deps="mipsfpu"
>>> msa2_deps="msa"
>>>
>>> @@ -4999,29 +5019,57 @@ elif enabled bfin; then
>>>
>>> elif enabled mips; then
>>>
>>> - cpuflags="-march=$cpu"
>>> -
>>> if [ "$cpu" != "generic" ]; then
>>> - disable mips32r2
>>> - disable mips32r5
>>> - disable mips64r2
>>> - disable mips32r6
>>> - disable mips64r6
>>> - disable loongson2
>>> - disable loongson3
>>> + # DSP is disabled by deafult as they can't be detected at runtime
>>> + disable mipsdsp
>>> + disable mipsdspr2
>>> +
>>> + cpuflags="-march=$cpu"
>>>
>>> case $cpu in
>>> - 24kc|24kf*|24kec|34kc|1004kc|24kef*|34kf*|1004kf*|74kc|74kf)
>>> + # General ISA levels
>>> + mips1|mips3)
>>> + disable msa
>>> + ;;
>>> + mips32r2)
>>> enable mips32r2
>>> + ;;
>>> + mips32r5)
>>> + enable mips32r5
>>> + ;;
>>> + mips64r2|mips64r5)
>>> + enable mips64r2
>>> + ;;
>>> + # Cores from MIPS(MTI)
>>> + 24kc)
>>> + disable mipsfpu
>>> + ;;
>>> + 24kf*|24kec|34kc|74Kc|1004kc)
>>> + disable mmi
>>> disable msa
>>> ;;
>>> - p5600|i6400|p6600)
>>> - disable mipsdsp
>>> - disable mipsdspr2
>>> + 24kef*|34kf*|1004kf*)
>>> + disable mmi
>>> + disable msa
>>> + enable mipsdsp
>>> + ;;
>>> + p5600)
>>> + disable mmi
>>> + enable mips32r5
>>> + check_cflags "-mtune=p5600" && check_cflags "-msched-weight
>> -mload-store-pairs
>>> -funroll-loops"
>>> + ;;
>>> + i6400)
>>> + disable mmi
>>> + enable mips64r6
>>> + check_cflags "-mtune=i6400 -mabi=64" && check_cflags "-msched-weight
>>> -mload-store-pairs -funroll-loops" && check_ldflags "-mabi=64"
>>> + ;;
>>> + p6600)
>>> + disable mmi
>>> + enable mips64r6
>>> + check_cflags "-mtune=p6600 -mabi=64" && check_cflags "-msched-weight
>>> -mload-store-pairs -funroll-loops" && check_ldflags "-mabi=64"
>>> ;;
>>> + # Cores from Loongson
>>> loongson*)
>>> - enable loongson2
>>> - enable loongson3
>>> enable local_aligned
>>> enable simd_align_16
>>> enable fast_64bit
>>> @@ -5029,8 +5077,6 @@ elif enabled mips; then
>>> enable fast_cmov
>>> enable fast_unaligned
>>> disable aligned_stack
>>> - disable mipsdsp
>>> - disable mipsdspr2
>>> # When gcc version less than 5.3.0, add -fno-expensive-optimizations flag.
>>> if [ $cc == gcc ]; then
>>> gcc_version=$(gcc -dumpversion)
>>> @@ -5042,62 +5088,26 @@ elif enabled mips; then
>>> fi
>>> case $cpu in
>>> loongson3*)
>>> + enable loongson3
>>> + enable mips64r2
>>> cpuflags="-march=loongson3a -mhard-float
>> $expensive_optimization_flag"
>>> ;;
>>> loongson2e)
>>> + enable loongson2
>>> cpuflags="-march=loongson2e -mhard-float
>> $expensive_optimization_flag"
>>> ;;
>>> loongson2f)
>>> + enable loongson2
>>> cpuflags="-march=loongson2f -mhard-float
>> $expensive_optimization_flag"
>>> ;;
>>> esac
>>> ;;
>>> *)
>>> - # Unknown CPU. Disable everything.
>>> - warn "unknown CPU. Disabling all MIPS optimizations."
>>> - disable mipsfpu
>>> - disable mipsdsp
>>> - disable mipsdspr2
>>> - disable msa
>>> - disable mmi
>>> + warn "unknown MIPS CPU"
>>> ;;
>>> esac
>>>
>>> - case $cpu in
>>> - 24kc)
>>> - disable mipsfpu
>>> - disable mipsdsp
>>> - disable mipsdspr2
>>> - ;;
>>> - 24kf*)
>>> - disable mipsdsp
>>> - disable mipsdspr2
>>> - ;;
>>> - 24kec|34kc|1004kc)
>>> - disable mipsfpu
>>> - disable mipsdspr2
>>> - ;;
>>> - 24kef*|34kf*|1004kf*)
>>> - disable mipsdspr2
>>> - ;;
>>> - 74kc)
>>> - disable mipsfpu
>>> - ;;
>>> - p5600)
>>> - enable mips32r5
>>> - check_cflags "-mtune=p5600" && check_cflags "-msched-weight -mload-store-pairs
>>> -funroll-loops"
>>> - ;;
>>> - i6400)
>>> - enable mips64r6
>>> - check_cflags "-mtune=i6400 -mabi=64" && check_cflags "-msched-weight
>>> -mload-store-pairs -funroll-loops" && check_ldflags "-mabi=64"
>>> - ;;
>>> - p6600)
>>> - enable mips64r6
>>> - check_cflags "-mtune=p6600 -mabi=64" && check_cflags "-msched-weight
>>> -mload-store-pairs -funroll-loops" && check_ldflags "-mabi=64"
>>> - ;;
>>> - esac
>>> else
>>> - # We do not disable anything. Is up to the user to disable the unwanted features.
>>> warn 'generic cpu selected'
>>> fi
>>>
>>> @@ -5844,28 +5854,49 @@ EOF
>>>
>>> elif enabled mips; then
>>>
>>> - enabled loongson2 && check_inline_asm loongson2 '"dmult.g $8, $9, $10"'
>>> - enabled loongson3 && check_inline_asm loongson3 '"gsldxc1 $f0, 0($2, $3)"'
>>> - enabled mmi && check_inline_asm mmi '"punpcklhw $f0, $f0, $f0"'
>>>
>>> - # Enable minimum ISA based on selected options
>>> + # Check toolchain ISA level
>>> if enabled mips64; then
>>> - enabled mips64r6 && check_inline_asm_flags mips64r6 '"dlsa $0, $0, $0, 1"' '-mips64r6'
>>> - enabled mips64r2 && check_inline_asm_flags mips64r2 '"dext $0, $0, 0, 1"' '-mips64r2'
>>> - disabled mips64r6 && disabled mips64r2 && check_inline_asm_flags mips64r1 '"daddi $0, $0,
>>> 0"' '-mips64'
>>> + enabled mips64r6 && check_inline_asm mips64r6 '"dlsa $0, $0, $0, 1"' &&
>>> + disable mips64r2
>>> + enabled mips64r2 && check_inline_asm mips64r2 '"dext $0, $0, 0, 1"'
>>> +
>>> + disable mips32r6 && disable mips32r5 && disable mips32r2
>>> else
>>> - enabled mips32r6 && check_inline_asm_flags mips32r6 '"aui $0, $0, 0"' '-mips32r6'
>>> - enabled mips32r5 && check_inline_asm_flags mips32r5 '"eretnc"' '-mips32r5'
>>> - enabled mips32r2 && check_inline_asm_flags mips32r2 '"ext $0, $0, 0, 1"' '-mips32r2'
>>> - disabled mips32r6 && disabled mips32r5 && disabled mips32r2 && check_inline_asm_flags
>>> mips32r1 '"addi $0, $0, 0"' '-mips32'
>>> + enabled mips32r6 && check_inline_asm mips32r6 '"aui $0, $0, 0"' &&
>>> + disable mips32r5 && disable mips32r2
>>> + enabled mips32r5 && check_inline_asm mips32r5 '"eretnc"'
>>> + enabled mips32r2 && check_inline_asm mips32r2 '"ext $0, $0, 0, 1"'
>>> +
>>> + disable mips64r6 && disable mips64r5 && disable mips64r2
>>> fi
>>>
>>> - enabled mipsfpu && check_inline_asm_flags mipsfpu '"cvt.d.l $f0, $f2"' '-mhard-float'
>>> + enabled mipsfpu && check_inline_asm mipsfpu '"cvt.d.l $f0, $f2"'
>>> enabled mipsfpu && (enabled mips32r5 || enabled mips32r6 || enabled mips64r6) &&
>>> check_inline_asm_flags mipsfpu '"cvt.d.l $f0, $f1"' '-mfp64'
>>> - enabled mipsfpu && enabled msa && check_inline_asm_flags msa '"addvi.b $w0, $w1, 1"' '-mmsa'
>>> && check_headers msa.h || disable msa
>>> +
>>> enabled mipsdsp && check_inline_asm_flags mipsdsp '"addu.qb $t0, $t1, $t2"' '-mdsp'
>>> enabled mipsdspr2 && check_inline_asm_flags mipsdspr2 '"absq_s.qb $t0, $t1"' '-mdspr2'
>>> - enabled msa && enabled msa2 && check_inline_asm_flags msa2 '"nxbits.any.b $w0, $w0"'
>>> '-mmsa2' && check_headers msa2.h || disable msa2
>>> +
>>> + # MSA and MSA2 can be detected at runtime so we supply extra flags here
>>> + enabled msa && check_extra_inline_asm_flags msa MSAFLAGS '"addvi.b $w0, $w1, 1"' '-mmsa'
>>> + enabled msa && enabled msa2 && check_extra_inline_asm_flags msa2 MSAFLAGS '"nxbits.any.b
>>> $w0, $w0"' '-mmsa2'
>>> +
>>
>> For your reference, the following code use check_inline_asm_flags.
>> + enabled msa && check_inline_asm_flags msa MSAFLAGS '"addvi.b $w0, $w1, 1"' '-mmsa'
>> + && append MSAFLAGS '-mmsa'
>> + enabled msa && enabled msa2 && check_inline_asm_flags msa2 '"nxbits.any.b $w0, $w0"'
>> '-mmsa2'
>> + && append MSAFLAGS '-mmsa2'
>>
>
msa relies on mipsfpu, the original method of detection maybe better.
> Use check_inline_asm :
> + enabled msa && check_inline_asm msa '"addvi.b $w0, $w1, 1"' '-mmsa'
> + && append MSAFLAGS '-mmsa'
> + enabled msa && enabled msa2 && check_inline_asm msa2 '"nxbits.any.b $w0, $w0"' '-mmsa2'
> + && append MSAFLAGS '-mmsa2'
>
>>> + # loongson2 have no switch cflag so we can only probe toolchain ability
>>> + enabled loongson2 && check_inline_asm loongson2 '"dmult.g $8, $9, $10"'
>>> + if enabled loongson2 ; then
>>> + disable loongson3
>>> + fi
>>> +
>>> + # loongson3 can be treated as a part of MMI
>>> + enabled loongson3 && check_extra_inline_asm_flags loongson3 MMIFLAGS '"gsldxc1 $f0, 0($2,
>>> $3)"' '-mloongson-ext'
>>> +
>>> + # MMI must come together with loongson2 or loongson3
>>> + if disabled loongson2 && disabled loongson3; then
>>> + disable mmi
>>> + fi
>>> +
>>> + # MMI can be detected at runtime too
>>> + enabled mmi && check_extra_inline_asm_flags mmi MMIFLAGS '"punpcklhw $f0, $f0, $f0"'
>>> '-mloongson-mmi'
>>>
>>
>> For MMI, I suggest to use check_inline_asm_flags and explicitly append "-mloongson-mmi
>> -mloongson-ext" to MMIFLAGS.
>> Just in case of cpu=loongson2, '-mloongson-ext ' is also needed.
>>
>
> Use check_inline_as for LOONGSON2,LOONGSON3 and MMI two.
Using (enabled loongson2 || enabled loongson3) && enabled mmi && … maybe better.
>
>>> if enabled bigendian && enabled msa; then
>>> disable msa
>>> @@ -7439,6 +7470,8 @@ LDSOFLAGS=$LDSOFLAGS
>>> SHFLAGS=$(echo $($ldflags_filter $SHFLAGS))
>>> ASMSTRIPFLAGS=$ASMSTRIPFLAGS
>>> X86ASMFLAGS=$X86ASMFLAGS
>>> +MSAFLAGS=$MSAFLAGS
>>> +MMIFLAGS=$MMIFLAGS
>>> BUILDSUF=$build_suffix
>>> PROGSSUF=$progs_suffix
>>> FULLNAME=$FULLNAME
>>> diff --git a/ffbuild/common.mak b/ffbuild/common.mak
>>> index a60d27c9bd..6b95a17fbb 100644
>>> --- a/ffbuild/common.mak
>>> +++ b/ffbuild/common.mak
>>> @@ -44,7 +44,7 @@ LDFLAGS := $(ALLFFLIBS:%=$(LD_PATH)lib%) $(LDFLAGS)
>>>
>>> define COMPILE
>>> $(call $(1)DEP,$(1))
>>> - $($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $(patsubst
>>> $(SRC_PATH)/%,$(SRC_LINK)/%,$<)
>>> + $($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $($(2)) $(patsubst
>>> $(SRC_PATH)/%,$(SRC_LINK)/%,$<)
>>> endef
>>>
>>> COMPILE_C = $(call COMPILE,CC)
>>> @@ -54,6 +54,14 @@ COMPILE_M = $(call COMPILE,OBJCC)
>>> COMPILE_X86ASM = $(call COMPILE,X86ASM)
>>> COMPILE_HOSTC = $(call COMPILE,HOSTCC)
>>> COMPILE_NVCC = $(call COMPILE,NVCC)
>>> +COMPILE_MMI = $(call COMPILE,CC,MMIFLAGS)
>>> +COMPILE_MSA = $(call COMPILE,CC,MSAFLAGS)
>>> +
>>> +%_mmi.o: %_mmi.c
>>> + $(COMPILE_MMI)
>>> +
>>> +%_msa.o: %_msa.c
>>> + $(COMPILE_MSA)
>>>
>>> %.o: %.c
>>> $(COMPILE_C)
>>> diff --git a/libavcodec/mips/Makefile b/libavcodec/mips/Makefile
>>> index b4993f6e76..2be4d9b8a2 100644
>>> --- a/libavcodec/mips/Makefile
>>> +++ b/libavcodec/mips/Makefile
>>> @@ -71,6 +71,8 @@ MSA-OBJS-$(CONFIG_IDCTDSP) += mips/idctdsp_msa.o
>>> \
>>> MSA-OBJS-$(CONFIG_MPEGVIDEO) += mips/mpegvideo_msa.o
>>> MSA-OBJS-$(CONFIG_MPEGVIDEOENC) += mips/mpegvideoencdsp_msa.o
>>> MSA-OBJS-$(CONFIG_ME_CMP) += mips/me_cmp_msa.o
>>> +MSA-OBJS-$(CONFIG_VC1_DECODER) += mips/vc1dsp_msa.o
>>> +
>>> MMI-OBJS += mips/constants.o
>>> MMI-OBJS-$(CONFIG_H264DSP) += mips/h264dsp_mmi.o
>>> MMI-OBJS-$(CONFIG_H264CHROMA) += mips/h264chroma_mmi.o
>>> @@ -89,4 +91,3 @@ MMI-OBJS-$(CONFIG_WMV2DSP) += mips/wmv2dsp_mmi.o
>>> MMI-OBJS-$(CONFIG_HEVC_DECODER) += mips/hevcdsp_mmi.o
>>> MMI-OBJS-$(CONFIG_VP3DSP) += mips/vp3dsp_idct_mmi.o
>>> MMI-OBJS-$(CONFIG_VP9_DECODER) += mips/vp9_mc_mmi.o
>>> -MSA-OBJS-$(CONFIG_VC1_DECODER) += mips/vc1dsp_msa.o
>>> --
>>> 2.26.2
>>>
>>>
>>> _______________________________________________
>>> ffmpeg-devel mailing list
>>> ffmpeg-devel at ffmpeg.org
>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>>
>>> To unsubscribe, visit link above, or email
>>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>>
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel at ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>> To unsubscribe, visit link above, or email
>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org <mailto:ffmpeg-devel at ffmpeg.org>
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org <mailto:ffmpeg-devel-request at ffmpeg.org> with subject "unsubscribe".
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel at ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list