1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */ 2c978b524SChris Zankel /* 3c978b524SChris Zankel * Copyright (C) 2005 - 2013 Tensilica Inc. 4c978b524SChris Zankel * Copyright (C) 2014 - 2016 Cadence Design Systems Inc. 5c978b524SChris Zankel */ 6c978b524SChris Zankel 7c978b524SChris Zankel #ifndef _XTENSA_ASMMACRO_H 8c978b524SChris Zankel #define _XTENSA_ASMMACRO_H 9c978b524SChris Zankel 10c978b524SChris Zankel #include <asm/arch/core.h> 11c978b524SChris Zankel 12c978b524SChris Zankel /* 13c978b524SChris Zankel * Function entry and return macros for supported ABIs. 14c978b524SChris Zankel */ 15c978b524SChris Zankel 16c978b524SChris Zankel #if defined(__XTENSA_WINDOWED_ABI__) 17c978b524SChris Zankel #define abi_entry entry sp, 16 18c978b524SChris Zankel #define abi_ret retw 19c978b524SChris Zankel #elif defined(__XTENSA_CALL0_ABI__) 20c978b524SChris Zankel #define abi_entry 21c978b524SChris Zankel #define abi_ret ret 22c978b524SChris Zankel #else 23c978b524SChris Zankel #error Unsupported Xtensa ABI 24c978b524SChris Zankel #endif 25c978b524SChris Zankel 26c978b524SChris Zankel /* 27c978b524SChris Zankel * Some little helpers for loops. Use zero-overhead-loops 28c978b524SChris Zankel * where applicable and if supported by the processor. 29c978b524SChris Zankel * 30c978b524SChris Zankel * __loopi ar, at, size, inc 31c978b524SChris Zankel * ar register initialized with the start address 32c978b524SChris Zankel * at scratch register used by macro 33c978b524SChris Zankel * size size immediate value 34c978b524SChris Zankel * inc increment 35c978b524SChris Zankel * 36c978b524SChris Zankel * __loops ar, as, at, inc_log2[, mask_log2][, cond][, ncond] 37c978b524SChris Zankel * ar register initialized with the start address 38c978b524SChris Zankel * as register initialized with the size 39c978b524SChris Zankel * at scratch register use by macro 40c978b524SChris Zankel * inc_log2 increment [in log2] 41c978b524SChris Zankel * mask_log2 mask [in log2] 42c978b524SChris Zankel * cond true condition (used in loop'cond') 43c978b524SChris Zankel * ncond false condition (used in b'ncond') 44c978b524SChris Zankel * 45c978b524SChris Zankel * __loop as 46c978b524SChris Zankel * restart loop. 'as' register must not have been modified! 47c978b524SChris Zankel * 48c978b524SChris Zankel * __endla ar, as, incr 49c978b524SChris Zankel * ar start address (modified) 50c978b524SChris Zankel * as scratch register used by __loops/__loopi macros or 51c978b524SChris Zankel * end address used by __loopt macro 52c978b524SChris Zankel * inc increment 53c978b524SChris Zankel */ 54c978b524SChris Zankel 55c978b524SChris Zankel #if XCHAL_HAVE_LOOPS 56c978b524SChris Zankel 57c978b524SChris Zankel .macro __loopi ar, at, size, incr 58c978b524SChris Zankel movi \at, ((\size + \incr - 1) / (\incr)) 59c978b524SChris Zankel loop \at, 99f 60c978b524SChris Zankel .endm 61c978b524SChris Zankel 62c978b524SChris Zankel 63c978b524SChris Zankel .macro __loops ar, as, at, incr_log2, mask_log2, cond, ncond 64c978b524SChris Zankel .ifgt \incr_log2 - 1 65c978b524SChris Zankel addi \at, \as, (1 << \incr_log2) - 1 66c978b524SChris Zankel .ifnc \mask_log2, 67c978b524SChris Zankel extui \at, \at, \incr_log2, \mask_log2 68c978b524SChris Zankel .else 69c978b524SChris Zankel srli \at, \at, \incr_log2 70c978b524SChris Zankel .endif 71c978b524SChris Zankel .endif 72c978b524SChris Zankel loop\cond \at, 99f 73c978b524SChris Zankel .endm 74c978b524SChris Zankel 75c978b524SChris Zankel 76c978b524SChris Zankel .macro __loopt ar, as, at, incr_log2 77c978b524SChris Zankel sub \at, \as, \ar 78c978b524SChris Zankel .ifgt \incr_log2 - 1 79c978b524SChris Zankel addi \at, \at, (1 << \incr_log2) - 1 80c978b524SChris Zankel srli \at, \at, \incr_log2 81c978b524SChris Zankel .endif 82c978b524SChris Zankel loop \at, 99f 83c978b524SChris Zankel .endm 84c978b524SChris Zankel 85c978b524SChris Zankel 86c978b524SChris Zankel .macro __loop as 87c978b524SChris Zankel loop \as, 99f 88c978b524SChris Zankel .endm 89c978b524SChris Zankel 90c978b524SChris Zankel 91c978b524SChris Zankel .macro __endl ar, as 92c978b524SChris Zankel 99: 93c978b524SChris Zankel .endm 94c978b524SChris Zankel 95c978b524SChris Zankel 96c978b524SChris Zankel #else 97c978b524SChris Zankel 98c978b524SChris Zankel .macro __loopi ar, at, size, incr 99c978b524SChris Zankel movi \at, ((\size + \incr - 1) / (\incr)) 100c978b524SChris Zankel addi \at, \ar, \size 101c978b524SChris Zankel 98: 102c978b524SChris Zankel .endm 103c978b524SChris Zankel 104c978b524SChris Zankel 105c978b524SChris Zankel .macro __loops ar, as, at, incr_log2, mask_log2, cond, ncond 106c978b524SChris Zankel .ifnc \mask_log2, 107c978b524SChris Zankel extui \at, \as, \incr_log2, \mask_log2 108c978b524SChris Zankel .else 109c978b524SChris Zankel .ifnc \ncond, 110c978b524SChris Zankel srli \at, \as, \incr_log2 111c978b524SChris Zankel .endif 112c978b524SChris Zankel .endif 113c978b524SChris Zankel .ifnc \ncond, 114c978b524SChris Zankel b\ncond \at, 99f 115c978b524SChris Zankel 116c978b524SChris Zankel .endif 117c978b524SChris Zankel .ifnc \mask_log2, 118c978b524SChris Zankel slli \at, \at, \incr_log2 119c978b524SChris Zankel add \at, \ar, \at 120c978b524SChris Zankel .else 121c978b524SChris Zankel add \at, \ar, \as 122c978b524SChris Zankel .endif 123c978b524SChris Zankel 98: 124c978b524SChris Zankel .endm 125c978b524SChris Zankel 126c978b524SChris Zankel .macro __loopt ar, as, at, incr_log2 127c978b524SChris Zankel 98: 128c978b524SChris Zankel .endm 129c978b524SChris Zankel 130c978b524SChris Zankel 131c978b524SChris Zankel .macro __loop as 132c978b524SChris Zankel 98: 133c978b524SChris Zankel .endm 134c978b524SChris Zankel 135c978b524SChris Zankel 136c978b524SChris Zankel .macro __endl ar, as 137c978b524SChris Zankel bltu \ar, \as, 98b 138c978b524SChris Zankel 99: 139c978b524SChris Zankel .endm 140c978b524SChris Zankel 141c978b524SChris Zankel 142c978b524SChris Zankel #endif 143c978b524SChris Zankel 144c978b524SChris Zankel 145c978b524SChris Zankel .macro __endla ar, as, incr 146c978b524SChris Zankel addi \ar, \ar, \incr 147c978b524SChris Zankel __endl \ar \as 148c978b524SChris Zankel .endm 149c978b524SChris Zankel 150c978b524SChris Zankel 151c978b524SChris Zankel #endif /* _XTENSA_ASMMACRO_H */ 152