mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-10-31 20:42:49 +08:00 
			
		
		
		
	 b9cd922660
			
		
	
	b9cd922660
	
	
	
		
			
			1.mmiutils.h defined MMI_ load/store macros for loongson2e/2f/3a 2.mmiutils.h defined some mmi assembly macors Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
		
			
				
	
	
		
			242 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			242 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Loongson SIMD utils
 | |
|  *
 | |
|  * Copyright (c) 2016 Loongson Technology Corporation Limited
 | |
|  * Copyright (c) 2016 Zhou Xiaoyong <zhouxiaoyong@loongson.cn>
 | |
|  *
 | |
|  * 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_MIPS_MMIUTILS_H
 | |
| #define AVUTIL_MIPS_MMIUTILS_H
 | |
| 
 | |
| #include "config.h"
 | |
| #include "libavutil/mips/asmdefs.h"
 | |
| 
 | |
| #if HAVE_LOONGSON2
 | |
| 
 | |
| #define DECLARE_VAR_LOW32       int32_t low32
 | |
| #define RESTRICT_ASM_LOW32      [low32]"=&r"(low32),
 | |
| #define DECLARE_VAR_ALL64       int64_t all64
 | |
| #define RESTRICT_ASM_ALL64      [all64]"=&r"(all64),
 | |
| #define DECLARE_VAR_ADDRT       mips_reg addrt
 | |
| #define RESTRICT_ASM_ADDRT      [addrt]"=&r"(addrt),
 | |
| 
 | |
| #define MMI_LWX(reg, addr, stride, bias)                                    \
 | |
|     PTR_ADDU    "%[addrt],  "#addr",    "#stride"                   \n\t"   \
 | |
|     "lw         "#reg",     "#bias"(%[addrt])                       \n\t"
 | |
| 
 | |
| #define MMI_SWX(reg, addr, stride, bias)                                    \
 | |
|     PTR_ADDU    "%[addrt],  "#addr",    "#stride"                   \n\t"   \
 | |
|     "sw         "#reg",     "#bias"(%[addrt])                       \n\t"
 | |
| 
 | |
| #define MMI_LDX(reg, addr, stride, bias)                                    \
 | |
|     PTR_ADDU    "%[addrt],  "#addr",    "#stride"                   \n\t"   \
 | |
|     "ld         "#reg",     "#bias"(%[addrt])                       \n\t"
 | |
| 
 | |
| #define MMI_SDX(reg, addr, stride, bias)                                    \
 | |
|     PTR_ADDU    "%[addrt],  "#addr",    "#stride"                   \n\t"   \
 | |
|     "sd         "#reg",     "#bias"(%[addrt])                       \n\t"
 | |
| 
 | |
| #define MMI_LWC1(fp, addr, bias)                                            \
 | |
|     "lwc1       "#fp",      "#bias"("#addr")                        \n\t"
 | |
| 
 | |
| #define MMI_ULWC1(fp, addr, bias)                                           \
 | |
|     "ulw        %[low32],   "#bias"("#addr")                        \n\t"   \
 | |
|     "mtc1       %[low32],   "#fp"                                   \n\t"
 | |
| 
 | |
| #define MMI_LWXC1(fp, addr, stride, bias)                                   \
 | |
|     PTR_ADDU    "%[addrt],  "#addr",    "#stride"                   \n\t"   \
 | |
|     MMI_LWC1(fp, %[addrt], bias)
 | |
| 
 | |
| #define MMI_SWC1(fp, addr, bias)                                            \
 | |
|     "swc1       "#fp",      "#bias"("#addr")                        \n\t"
 | |
| 
 | |
| #define MMI_USWC1(fp, addr, bias)                                           \
 | |
|     "mfc1       %[low32],   "#fp"                                   \n\t"   \
 | |
|     "usw        %[low32],   "#bias"("#addr")                        \n\t"
 | |
| 
 | |
| #define MMI_SWXC1(fp, addr, stride, bias)                                   \
 | |
|     PTR_ADDU    "%[addrt],  "#addr",    "#stride"                   \n\t"   \
 | |
|     MMI_SWC1(fp, %[addrt], bias)
 | |
| 
 | |
| #define MMI_LDC1(fp, addr, bias)                                            \
 | |
|     "ldc1       "#fp",      "#bias"("#addr")                        \n\t"
 | |
| 
 | |
| #define MMI_ULDC1(fp, addr, bias)                                           \
 | |
|     "uld        %[all64],   "#bias"("#addr")                        \n\t"   \
 | |
|     "dmtc1      %[all64],   "#fp"                                   \n\t"
 | |
| 
 | |
| #define MMI_LDXC1(fp, addr, stride, bias)                                   \
 | |
|     PTR_ADDU    "%[addrt],  "#addr",    "#stride"                   \n\t"   \
 | |
|     MMI_LDC1(fp, %[addrt], bias)
 | |
| 
 | |
| #define MMI_SDC1(fp, addr, bias)                                            \
 | |
|     "sdc1       "#fp",      "#bias"("#addr")                        \n\t"
 | |
| 
 | |
| #define MMI_USDC1(fp, addr, bias)                                           \
 | |
|     "dmfc1      %[all64],   "#fp"                                   \n\t"   \
 | |
|     "usd        %[all64],   "#bias"("#addr")                        \n\t"
 | |
| 
 | |
| #define MMI_SDXC1(fp, addr, stride, bias)                                   \
 | |
|     PTR_ADDU    "%[addrt],  "#addr",    "#stride"                   \n\t"   \
 | |
|     MMI_SDC1(fp, %[addrt], bias)
 | |
| 
 | |
| #define MMI_LQ(reg1, reg2, addr, bias)                                      \
 | |
|     "ld         "#reg1",    "#bias"("#addr")                        \n\t"   \
 | |
|     "ld         "#reg2",  8+"#bias"("#addr")                        \n\t"
 | |
| 
 | |
| #define MMI_SQ(reg1, reg2, addr, bias)                                      \
 | |
|     "sd         "#reg1",    "#bias"("#addr")                        \n\t"   \
 | |
|     "sd         "#reg2",  8+"#bias"("#addr")                        \n\t"
 | |
| 
 | |
| #define MMI_LQC1(fp1, fp2, addr, bias)                                      \
 | |
|     "ldc1       "#fp1",     "#bias"("#addr")                        \n\t"   \
 | |
|     "ldc1       "#fp2",   8+"#bias"("#addr")                        \n\t"
 | |
| 
 | |
| #define MMI_SQC1(fp1, fp2, addr, bias)                                      \
 | |
|     "sdc1       "#fp1",     "#bias"("#addr")                        \n\t"   \
 | |
|     "sdc1       "#fp2",   8+"#bias"("#addr")                        \n\t"
 | |
| 
 | |
| #elif HAVE_LOONGSON3 /* !HAVE_LOONGSON2 */
 | |
| 
 | |
| #define DECLARE_VAR_ALL64
 | |
| #define RESTRICT_ASM_ALL64
 | |
| #define DECLARE_VAR_ADDRT
 | |
| #define RESTRICT_ASM_ADDRT
 | |
| 
 | |
| #define MMI_LWX(reg, addr, stride, bias)                                    \
 | |
|     "gslwx      "#reg",     "#bias"("#addr", "#stride")             \n\t"
 | |
| 
 | |
| #define MMI_SWX(reg, addr, stride, bias)                                    \
 | |
|     "gsswx      "#reg",     "#bias"("#addr", "#stride")             \n\t"
 | |
| 
 | |
| #define MMI_LDX(reg, addr, stride, bias)                                    \
 | |
|     "gsldx      "#reg",     "#bias"("#addr", "#stride")             \n\t"
 | |
| 
 | |
| #define MMI_SDX(reg, addr, stride, bias)                                    \
 | |
|     "gssdx      "#reg",     "#bias"("#addr", "#stride")             \n\t"
 | |
| 
 | |
| #define MMI_LWC1(fp, addr, bias)                                            \
 | |
|     "lwc1       "#fp",      "#bias"("#addr")                        \n\t"
 | |
| 
 | |
| #if _MIPS_SIM == _ABIO32 /* workaround for 3A2000 gslwlc1 bug */
 | |
| 
 | |
| #define DECLARE_VAR_LOW32       int32_t low32
 | |
| #define RESTRICT_ASM_LOW32      [low32]"=&r"(low32),
 | |
| 
 | |
| #define MMI_ULWC1(fp, addr, bias)                                           \
 | |
|     "ulw        %[low32],   "#bias"("#addr")                        \n\t"   \
 | |
|     "mtc1       %[low32],   "#fp"                                   \n\t"
 | |
| 
 | |
| #else /* _MIPS_SIM != _ABIO32 */
 | |
| 
 | |
| #define DECLARE_VAR_LOW32
 | |
| #define RESTRICT_ASM_LOW32
 | |
| 
 | |
| #define MMI_ULWC1(fp, addr, bias)                                           \
 | |
|     "gslwlc1    "#fp",    3+"#bias"("#addr")                        \n\t"   \
 | |
|     "gslwrc1    "#fp",      "#bias"("#addr")                        \n\t"
 | |
| 
 | |
| #endif /* _MIPS_SIM != _ABIO32 */
 | |
| 
 | |
| #define MMI_LWXC1(fp, addr, stride, bias)                                   \
 | |
|     "gslwxc1    "#fp",      "#bias"("#addr", "#stride")             \n\t"
 | |
| 
 | |
| #define MMI_SWC1(fp, addr, bias)                                            \
 | |
|     "swc1       "#fp",      "#bias"("#addr")                        \n\t"
 | |
| 
 | |
| #define MMI_USWC1(fp, addr, bias)                                           \
 | |
|     "gsswlc1    "#fp",    3+"#bias"("#addr")                        \n\t"   \
 | |
|     "gsswrc1    "#fp",      "#bias"("#addr")                        \n\t"
 | |
| 
 | |
| #define MMI_SWXC1(fp, addr, stride, bias)                                   \
 | |
|     "gsswxc1    "#fp",      "#bias"("#addr", "#stride")             \n\t"
 | |
| 
 | |
| #define MMI_LDC1(fp, addr, bias)                                            \
 | |
|     "ldc1       "#fp",      "#bias"("#addr")                        \n\t"
 | |
| 
 | |
| #define MMI_ULDC1(fp, addr, bias)                                           \
 | |
|     "gsldlc1    "#fp",    7+"#bias"("#addr")                        \n\t"   \
 | |
|     "gsldrc1    "#fp",      "#bias"("#addr")                        \n\t"
 | |
| 
 | |
| #define MMI_LDXC1(fp, addr, stride, bias)                                   \
 | |
|     "gsldxc1    "#fp",      "#bias"("#addr", "#stride")             \n\t"
 | |
| 
 | |
| #define MMI_SDC1(fp, addr, bias)                                            \
 | |
|     "sdc1       "#fp",      "#bias"("#addr")                        \n\t"
 | |
| 
 | |
| #define MMI_USDC1(fp, addr, bias)                                           \
 | |
|     "gssdlc1    "#fp",    7+"#bias"("#addr")                        \n\t"   \
 | |
|     "gssdrc1    "#fp",      "#bias"("#addr")                        \n\t"
 | |
| 
 | |
| #define MMI_SDXC1(fp, addr, stride, bias)                                   \
 | |
|     "gssdxc1    "#fp",      "#bias"("#addr", "#stride")             \n\t"
 | |
| 
 | |
| #define MMI_LQ(reg1, reg2, addr, bias)                                      \
 | |
|     "gslq       "#reg1",    "#reg2",     "#bias"("#addr")           \n\t"
 | |
| 
 | |
| #define MMI_SQ(reg1, reg2, addr, bias)                                      \
 | |
|     "gssq       "#reg1",    "#reg2",     "#bias"("#addr")           \n\t"
 | |
| 
 | |
| #define MMI_LQC1(fp1, fp2, addr, bias)                                      \
 | |
|     "gslqc1     "#fp1",     "#fp2",     "#bias"("#addr")            \n\t"
 | |
| 
 | |
| #define MMI_SQC1(fp1, fp2, addr, bias)                                      \
 | |
|     "gssqc1     "#fp1",     "#fp2",     "#bias"("#addr")            \n\t"
 | |
| 
 | |
| #endif /* HAVE_LOONGSON2 */
 | |
| 
 | |
| #define TRANSPOSE_4H(m1, m2, m3, m4, t1, t2, t3, t4, t5, r1, zero, shift) \
 | |
|         "li         "#r1",  0x93                                    \n\t" \
 | |
|         "xor        "#zero","#zero","#zero"                         \n\t" \
 | |
|         "mtc1       "#r1",  "#shift"                                \n\t" \
 | |
|         "punpcklhw  "#t1",  "#m1",  "#zero"                         \n\t" \
 | |
|         "punpcklhw  "#t5",  "#m2",  "#zero"                         \n\t" \
 | |
|         "pshufh     "#t5",  "#t5",  "#shift"                        \n\t" \
 | |
|         "or         "#t1",  "#t1",  "#t5"                           \n\t" \
 | |
|         "punpckhhw  "#t2",  "#m1",  "#zero"                         \n\t" \
 | |
|         "punpckhhw  "#t5",  "#m2",  "#zero"                         \n\t" \
 | |
|         "pshufh     "#t5",  "#t5",  "#shift"                        \n\t" \
 | |
|         "or         "#t2",  "#t2",  "#t5"                           \n\t" \
 | |
|         "punpcklhw  "#t3",  "#m3",  "#zero"                         \n\t" \
 | |
|         "punpcklhw  "#t5",  "#m4",  "#zero"                         \n\t" \
 | |
|         "pshufh     "#t5",  "#t5",  "#shift"                        \n\t" \
 | |
|         "or         "#t3",  "#t3",  "#t5"                           \n\t" \
 | |
|         "punpckhhw  "#t4",  "#m3",  "#zero"                         \n\t" \
 | |
|         "punpckhhw  "#t5",  "#m4",  "#zero"                         \n\t" \
 | |
|         "pshufh     "#t5",  "#t5",  "#shift"                        \n\t" \
 | |
|         "or         "#t4",  "#t4",  "#t5"                           \n\t" \
 | |
|         "punpcklwd  "#m1",  "#t1",  "#t3"                           \n\t" \
 | |
|         "punpckhwd  "#m2",  "#t1",  "#t3"                           \n\t" \
 | |
|         "punpcklwd  "#m3",  "#t2",  "#t4"                           \n\t" \
 | |
|         "punpckhwd  "#m4",  "#t2",  "#t4"                           \n\t"
 | |
| 
 | |
| 
 | |
| #define PSRAH_4_MMI(fp1, fp2, fp3, fp4, shift)                              \
 | |
|         "psrah      "#fp1",     "#fp1",     "#shift"                \n\t"   \
 | |
|         "psrah      "#fp2",     "#fp2",     "#shift"                \n\t"   \
 | |
|         "psrah      "#fp3",     "#fp3",     "#shift"                \n\t"   \
 | |
|         "psrah      "#fp4",     "#fp4",     "#shift"                \n\t"
 | |
| 
 | |
| #define PSRAH_8_MMI(fp1, fp2, fp3, fp4, fp5, fp6, fp7, fp8, shift)          \
 | |
|         PSRAH_4_MMI(fp1, fp2, fp3, fp4, shift)                              \
 | |
|         PSRAH_4_MMI(fp5, fp6, fp7, fp8, shift)
 | |
| 
 | |
| 
 | |
| #endif /* AVUTILS_MIPS_MMIUTILS_H */
 |