asmmacro.h
来自「linux 内核源代码」· C头文件 代码 · 共 154 行
H
154 行
/* * include/asm-xtensa/asmmacro.h * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 2005 Tensilica Inc. */#ifndef _XTENSA_ASMMACRO_H#define _XTENSA_ASMMACRO_H#include <asm/variant/core.h>/* * Some little helpers for loops. Use zero-overhead-loops * where applicable and if supported by the processor. * * __loopi ar, at, size, inc * ar register initialized with the start address * at scratch register used by macro * size size immediate value * inc increment * * __loops ar, as, at, inc_log2[, mask_log2][, cond][, ncond] * ar register initialized with the start address * as register initialized with the size * at scratch register use by macro * inc_log2 increment [in log2] * mask_log2 mask [in log2] * cond true condition (used in loop'cond') * ncond false condition (used in b'ncond') * * __loop as * restart loop. 'as' register must not have been modified! * * __endla ar, at, incr * ar start address (modified) * as scratch register used by macro * inc increment *//* * loop for given size as immediate */ .macro __loopi ar, at, size, incr#if XCHAL_HAVE_LOOPS movi \at, ((\size + \incr - 1) / (\incr)) loop \at, 99f#else addi \at, \ar, \size 98:#endif .endm/* * loop for given size in register */ .macro __loops ar, as, at, incr_log2, mask_log2, cond, ncond#if XCHAL_HAVE_LOOPS .ifgt \incr_log2 - 1 addi \at, \as, (1 << \incr_log2) - 1 .ifnc \mask_log2, extui \at, \at, \incr_log2, \mask_log2 .else srli \at, \at, \incr_log2 .endif .endif loop\cond \at, 99f#else .ifnc \mask_log2, extui \at, \as, \incr_log2, \mask_log2 .else .ifnc \ncond, srli \at, \as, \incr_log2 .endif .endif .ifnc \ncond, b\ncond \at, 99f .endif .ifnc \mask_log2, slli \at, \at, \incr_log2 add \at, \ar, \at .else add \at, \ar, \as .endif#endif 98: .endm/* * loop from ar to ax */ .macro __loopt ar, as, at, incr_log2#if XCHAL_HAVE_LOOPS sub \at, \as, \ar .ifgt \incr_log2 - 1 addi \at, \at, (1 << \incr_log2) - 1 srli \at, \at, \incr_log2 .endif loop \at, 99f#else 98:#endif .endm/* * restart loop. registers must be unchanged */ .macro __loop as#if XCHAL_HAVE_LOOPS loop \as, 99f#else 98:#endif .endm/* * end of loop with no increment of the address. */ .macro __endl ar, as#if !XCHAL_HAVE_LOOPS bltu \ar, \as, 98b#endif 99: .endm/* * end of loop with increment of the address. */ .macro __endla ar, as, incr addi \ar, \ar, \incr __endl \ar \as .endm#endif /* _XTENSA_ASMMACRO_H */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?