【发布时间】:2015-06-16 02:30:32
【问题描述】:
我在汇编源文件中找到了这个宏,但我不知道它是如何工作的。
所以我首先介绍一下这个功能(hevc_deblock.h):
cglobal hevc_v_loop_filter_chroma_8, 3, 5, 7, pix, stride, tc, pix0, r3stride
sub pixq, 2
lea r3strideq, [3*strideq]
mov pix0q, pixq
add pixq, r3strideq
TRANSPOSE4x8B_LOAD PASS8ROWS(pix0q, pixq, strideq, r3strideq)
CHROMA_DEBLOCK_BODY 8
TRANSPOSE8x4B_STORE PASS8ROWS(pix0q, pixq, strideq, r3strideq)
RET
所以我假设 cglobal 似乎做了一些名称修改,所以我在其他包含的文件中查找它,我在 cglobal 宏 (x86util.asm) 中找到了该宏:
%macro CAT_UNDEF 2
%undef %1%2
%endmacro
%macro DEFINE_ARGS 0-*
%ifdef n_arg_names
%assign %%i 0
%rep n_arg_names
CAT_UNDEF arg_name %+ %%i, q
CAT_UNDEF arg_name %+ %%i, d
CAT_UNDEF arg_name %+ %%i, w
CAT_UNDEF arg_name %+ %%i, h
CAT_UNDEF arg_name %+ %%i, b
CAT_UNDEF arg_name %+ %%i, m
CAT_UNDEF arg_name %+ %%i, mp
CAT_UNDEF arg_name, %%i
%assign %%i %%i+1
%endrep
%endif
%xdefine %%stack_offset stack_offset
%undef stack_offset ; so that the current value of stack_offset doesn't get baked in by xdefine
%assign %%i 0
%rep %0
%xdefine %1q r %+ %%i %+ q
%xdefine %1d r %+ %%i %+ d
%xdefine %1w r %+ %%i %+ w
%xdefine %1h r %+ %%i %+ h
%xdefine %1b r %+ %%i %+ b
%xdefine %1m r %+ %%i %+ m
%xdefine %1mp r %+ %%i %+ mp
CAT_XDEFINE arg_name, %%i, %1
%assign %%i %%i+1
%rotate 1
%endrep
%xdefine stack_offset %%stack_offset
%assign n_arg_names %0
%endmacro
它似乎做了这个名字修饰并在参数末尾添加q。但是,我不明白为什么有几行%undef 指令,而函数中似乎只使用了带有q 后缀的变量名。它似乎还在末尾附加了一个数字,但由于某种原因,我在另一个 asm 文件中没有看到它。
我在这里错过了什么?
【问题讨论】:
标签: assembly macros ffmpeg nasm