>-----Original Message----- >From: ffmpeg-devel-boun...@ffmpeg.org [mailto:ffmpeg-devel-boun...@ffmpeg.org] >On Behalf Of >Jiaxun Yang >Sent: Monday, June 8, 2020 11:30 AM >To: ffmpeg-devel@ffmpeg.org >Cc: yinshi...@loongson.cn; Jiaxun Yang >Subject: [FFmpeg-devel] [PATCH v4 2/4] libavutils: Add parse_r helper for MIPS > >That helper grab from kernel code can allow us to inline >newer instructions (not implemented by the assembler) in >a elegant manner. > >Signed-off-by: Jiaxun Yang <jiaxun.y...@flygoat.com> >--- > libavutil/mips/asmdefs.h | 42 ++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 42 insertions(+) > >diff --git a/libavutil/mips/asmdefs.h b/libavutil/mips/asmdefs.h >index 748119918a..7e0e4cf575 100644 >--- a/libavutil/mips/asmdefs.h >+++ b/libavutil/mips/asmdefs.h >@@ -55,4 +55,46 @@ > # define PTR_SLL "sll " > #endif > >+/* >+ * parse_r var, r - Helper assembler macro for parsing register names. >+ * >+ * This converts the register name in $n form provided in \r to the >+ * corresponding register number, which is assigned to the variable \var. It >is >+ * needed to allow explicit encoding of instructions in inline assembly where >+ * registers are chosen by the compiler in $n form, allowing us to avoid using >+ * fixed register numbers. >+ * >+ * It also allows newer instructions (not implemented by the assembler) to be >+ * transparently implemented using assembler macros, instead of needing >separate >+ * cases depending on toolchain support. >+ * >+ * Simple usage example: >+ * __asm__ __volatile__("parse_r __rt, %0\n\t" >+ * ".insn\n\t" >+ * "# di %0\n\t" >+ * ".word (0x41606000 | (__rt << 16))" >+ * : "=r" (status); >+ */ >+ >+/* Match an individual register number and assign to \var */ >+#define _IFC_REG(n) \ >+ ".ifc \\r, $" #n "\n\t" \ >+ "\\var = " #n "\n\t" \ >+ ".endif\n\t" >+ >+__asm__(".macro parse_r var r\n\t" >+ "\\var = -1\n\t" >+ _IFC_REG(0) _IFC_REG(1) _IFC_REG(2) _IFC_REG(3) >+ _IFC_REG(4) _IFC_REG(5) _IFC_REG(6) _IFC_REG(7) >+ _IFC_REG(8) _IFC_REG(9) _IFC_REG(10) _IFC_REG(11) >+ _IFC_REG(12) _IFC_REG(13) _IFC_REG(14) _IFC_REG(15) >+ _IFC_REG(16) _IFC_REG(17) _IFC_REG(18) _IFC_REG(19) >+ _IFC_REG(20) _IFC_REG(21) _IFC_REG(22) _IFC_REG(23) >+ _IFC_REG(24) _IFC_REG(25) _IFC_REG(26) _IFC_REG(27) >+ _IFC_REG(28) _IFC_REG(29) _IFC_REG(30) _IFC_REG(31) >+ ".iflt \\var\n\t" >+ ".error \"Unable to parse register name \\r\"\n\t" >+ ".endif\n\t" >+ ".endm"); >+
In inline assembler, we can add asmSymbolicName in Input/ Output Operands, format: [ [asmSymbolicName] ] constraint (cExpression) [ [asmSymbolicName] ] constraint (cVariableName) > #endif /* AVCODEC_MIPS_ASMDEFS_H */ >-- >2.20.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". _______________________________________________ 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".