kopia lustrzana https://github.com/espressif/esp-idf
56 wiersze
1.3 KiB
ArmAsm
56 wiersze
1.3 KiB
ArmAsm
|
/* Helper function for the test case in test_context_save_clobber.c */
|
||
|
|
||
|
#if defined(__XTENSA__)
|
||
|
#include "xtensa/config/core-isa.h"
|
||
|
#if defined(XCHAL_HAVE_WINDOWED)
|
||
|
|
||
|
.data
|
||
|
recursion_count:
|
||
|
.word 0
|
||
|
|
||
|
.text
|
||
|
.global test_context_save_clober_func
|
||
|
.type test_context_save_clober_func,@function
|
||
|
.align 4
|
||
|
|
||
|
/* This function recursively calls itself via call4, making sure each frame
|
||
|
* uses only 4 registers. For this reason, recursion count can not be
|
||
|
* a function argument (it would have to be in a6) and is placed into .data
|
||
|
* section above.
|
||
|
*/
|
||
|
test_context_save_clober_func:
|
||
|
entry a1, 16
|
||
|
|
||
|
/* load recursion count from memory */
|
||
|
movi a3, recursion_count
|
||
|
l32i a2, a3, 0
|
||
|
|
||
|
/* if it is zero, initialize it to 16 (=64 physical registers / 4 registers per call) */
|
||
|
bnez a2, 1f
|
||
|
movi a2, 16
|
||
|
1:
|
||
|
|
||
|
/* decrement the counter and write it back */
|
||
|
addi a2, a2, -1
|
||
|
s32i a2, a3, 0
|
||
|
|
||
|
/* counter not zero? do a recursive call */
|
||
|
beqz a2, wait
|
||
|
call4 test_context_save_clober_func
|
||
|
j end
|
||
|
|
||
|
wait:
|
||
|
/* Counter has reached zero, and we have 16 frames on the stack.
|
||
|
* Delay for a few seconds, expecting in interrupt to happen.
|
||
|
*/
|
||
|
movi a3, 100000000
|
||
|
1:
|
||
|
addi a3, a3, -1
|
||
|
bnez a3, 1b
|
||
|
|
||
|
end:
|
||
|
retw
|
||
|
|
||
|
#endif // XCHAL_HAVE_WINDOWED
|
||
|
#endif // __XTENSA__
|