| /* ------------------------------------------ |
| * Copyright (c) 2016, Synopsys, Inc. All rights reserved. |
| |
| * Redistribution and use in source and binary forms, with or without modification, |
| * are permitted provided that the following conditions are met: |
| |
| * 1) Redistributions of source code must retain the above copyright notice, this |
| * list of conditions and the following disclaimer. |
| |
| * 2) Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation and/or |
| * other materials provided with the distribution. |
| |
| * 3) Neither the name of the Synopsys, Inc., nor the names of its contributors may |
| * be used to endorse or promote products derived from this software without |
| * specific prior written permission. |
| |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
| * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR |
| * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
| * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| * \version 2016.05 |
| * \date 2014-07-15 |
| * \author Wayne Ren(Wei.Ren@synopsys.com) |
| --------------------------------------------- */ |
| |
| /** |
| * \file |
| * \ingroup ARC_HAL_MISC |
| * \brief common macro definitions for assembly file |
| */ |
| /** @cond ARC_HAL_ASM_COMMON */ |
| |
| #ifndef _ARC_HAL_ASM_COMMON_H_ |
| #define _ARC_HAL_ASM_COMMON_H_ |
| |
| #include "embARC_BSP_config.h" |
| #include "arc_feature_config.h" |
| |
| /* Note on the LD/ST addr modes with addr reg wback |
| * |
| * LD.a same as LD.aw |
| * |
| * LD.a reg1, [reg2, x] => Pre Incr |
| * Eff Addr for load = [reg2 + x] |
| * |
| * LD.ab reg1, [reg2, x] => Post Incr |
| * Eff Addr for load = [reg2] |
| */ |
| #if defined(__GNU__) |
| .macro PUSH reg |
| st.a \reg, [sp, -4] |
| .endm |
| |
| .macro PUSHAX aux |
| lr r10, [\aux] |
| PUSH r10 |
| .endm |
| |
| .macro POP reg |
| ld.ab \reg, [sp, 4] |
| .endm |
| |
| .macro POPAX aux |
| POP r10 |
| sr r10, [\aux] |
| .endm |
| #else |
| .macro PUSH, reg |
| st.a reg, [sp, -4] |
| .endm |
| |
| .macro PUSHAX, aux |
| lr r10, [aux] |
| PUSH r10 |
| .endm |
| |
| .macro POP, reg |
| ld.ab reg, [sp, 4] |
| .endm |
| |
| .macro POPAX, aux |
| POP r10 |
| sr r10, [aux] |
| .endm |
| #endif |
| |
| /*-------------------------------------------------------------- |
| * Helpers to save/restore callee-saved regs: |
| * used by several macros below |
| *-------------------------------------------------------------*/ |
| .macro SAVE_CALLEE_REGS |
| PUSH r13 |
| PUSH r14 |
| PUSH r15 |
| #ifndef ARC_FEATURE_RF16 |
| PUSH r16 |
| PUSH r17 |
| PUSH r18 |
| PUSH r19 |
| PUSH r20 |
| PUSH r21 |
| PUSH r22 |
| PUSH r23 |
| PUSH r24 |
| PUSH r25 |
| #endif |
| .endm |
| |
| .macro RESTORE_CALLEE_REGS |
| #ifndef ARC_FEATURE_RF16 |
| POP r25 |
| POP r24 |
| POP r23 |
| POP r22 |
| POP r21 |
| POP r20 |
| POP r19 |
| POP r18 |
| POP r17 |
| POP r16 |
| #endif |
| POP r15 |
| POP r14 |
| POP r13 |
| .endm |
| |
| .macro CLEAR_CALLEE_REGS |
| #ifndef ARC_FEATURE_RF16 |
| mov r25, 0 |
| mov r24, 0 |
| mov r23, 0 |
| mov r22, 0 |
| mov r21, 0 |
| mov r20, 0 |
| mov r19, 0 |
| mov r18, 0 |
| mov r17, 0 |
| mov r16, 0 |
| #endif |
| mov r15, 0 |
| mov r14, 0 |
| mov r13, 0 |
| .endm |
| |
| .macro CLEAR_SCRATCH_REGS |
| mov r1, 0 |
| mov r2, 0 |
| mov r3, 0 |
| mov r4, 0 |
| mov r5, 0 |
| mov r6, 0 |
| mov r7, 0 |
| mov r8, 0 |
| mov r9, 0 |
| mov r10, 0 |
| mov r11, 0 |
| mov r12, 0 |
| |
| mov fp, 0 |
| mov r29, 0 |
| mov r30, 0 |
| .endm |
| |
| |
| .macro SAVE_LP_REGS |
| PUSH r60 |
| PUSHAX AUX_LP_START |
| PUSHAX AUX_LP_END |
| .endm |
| |
| .macro RESTORE_LP_REGS |
| POPAX AUX_LP_END |
| POPAX AUX_LP_START |
| POP r10 |
| /* must not use the LP_COUNT register(r60) as the destination of multi-cycle instruction */ |
| mov r60, r10 |
| |
| .endm |
| |
| .macro SAVE_R0_TO_R12 |
| PUSH r0 |
| PUSH r1 |
| PUSH r2 |
| PUSH r3 |
| #ifndef ARC_FEATURE_RF16 |
| PUSH r4 |
| PUSH r5 |
| PUSH r6 |
| PUSH r7 |
| PUSH r8 |
| PUSH r9 |
| #endif |
| PUSH r10 |
| PUSH r11 |
| PUSH r12 |
| .endm |
| |
| .macro RESTORE_R0_TO_R12 |
| POP r12 |
| POP r11 |
| POP r10 |
| #ifndef ARC_FEATURE_RF16 |
| POP r9 |
| POP r8 |
| POP r7 |
| POP r6 |
| POP r5 |
| POP r4 |
| #endif |
| POP r3 |
| POP r2 |
| POP r1 |
| POP r0 |
| .endm |
| |
| .macro SAVE_CODE_DENSITY |
| PUSHAX AUX_JLI_BASE |
| PUSHAX AUX_LDI_BASE |
| PUSHAX AUX_EI_BASE |
| .endm |
| |
| .macro RESTORE_CODE_DENSITY |
| POPAX AUX_EI_BASE |
| POPAX AUX_LDI_BASE |
| POPAX AUX_JLI_BASE |
| .endm |
| |
| /* todo: check the contents of NON_SCRATCH_REGS in debug */ |
| .macro SAVE_NONSCRATCH_REGS |
| /* r0-r12 are saved by caller function */ |
| PUSH gp |
| PUSH fp |
| PUSH blink |
| SAVE_CALLEE_REGS |
| .endm |
| |
| .macro RESTORE_NONSCRATCH_REGS |
| RESTORE_CALLEE_REGS |
| POP blink |
| POP fp |
| POP gp |
| .endm |
| |
| |
| .macro SAVE_FIQ_EXC_REGS |
| #ifndef ARC_FEATURE_RGF_BANKED_REGS |
| SAVE_R0_TO_R12 |
| |
| PUSH gp |
| PUSH fp |
| PUSH r30 /* general purpose */ |
| PUSH blink |
| |
| #else |
| #if ARC_FEATURE_RGF_BANKED_REGS != 4 && ARC_FEATURE_RGF_BANKED_REGS != 8 && \ |
| ARC_FEATURE_RGF_BANKED_REGS != 16 && ARC_FEATURE_RGF_BANKED_REGS != 32 |
| #error "unsupported ARC_FEATURE_RGF_BANKED_REGS" |
| #endif |
| |
| #if ARC_FEATURE_RGF_BANKED_REGS == 4 || ARC_FEATURE_BANKED_REGS == 8 || \ |
| ARC_FEATURE_RGF_BANKED_REGS == 16 |
| PUSH r4 |
| PUSH r5 |
| PUSH r6 |
| PUSH r7 |
| PUSH r8 |
| PUSH r9 |
| #endif |
| |
| #if ARC_FEATURE_RGF_BANKED_REGS == 4 || ARC_FEATURE_BANKED_REGS == 8 |
| PUSH r10 |
| PUSH r11 |
| #endif |
| |
| #if ARC_FEATURE_RGF_BANKED_REGS == 4 |
| PUSH r12 |
| #endif |
| |
| #if ARC_FEATURE_RGF_BANKED_REGS == 4 || ARC_FEATURE_BANKED_REGS == 8 |
| PUSH gp |
| PUSH fp |
| PUSH r30 /* general purpose */ |
| PUSH blink |
| #endif |
| |
| #endif /* #ifndef ARC_FEATURE_RGF_BANKED_REGS */ |
| |
| #ifdef ARC_FEATURE_CODE_DENSITY |
| SAVE_CODE_DENSITY |
| #endif |
| SAVE_LP_REGS |
| .endm |
| |
| .macro RESTORE_FIQ_EXC_REGS |
| RESTORE_LP_REGS |
| #ifdef ARC_FEATURE_CODE_DENSITY |
| RESTORE_CODE_DENSITY |
| #endif |
| |
| #ifndef ARC_FEATURE_RGF_BANKED_REGS |
| POP blink |
| POP r30 |
| POP fp |
| POP gp |
| |
| RESTORE_R0_TO_R12 |
| #else |
| |
| #if ARC_FEATURE_RGF_BANKED_REGS != 4 && ARC_FEATURE_RGF_BANKED_REGS != 8 && \ |
| ARC_FEATURE_RGF_BANKED_REGS != 16 && ARC_FEATURE_RGF_BANKED_REGS != 32 |
| #error "unsupported ARC_FEATURE_RGF_BANKED_REGS" |
| #endif |
| |
| #if ARC_FEATURE_RGF_BANKED_REGS == 4 || ARC_FEATURE_BANKED_REGS == 8 |
| POP blink |
| POP r30 |
| POP fp |
| POP gp |
| #endif |
| |
| #if ARC_FEATURE_RGF_BANKED_REGS == 4 |
| POP r12 |
| #endif |
| |
| #if ARC_FEATURE_RGF_BANKED_REGS == 4 || ARC_FEATURE_BANKED_REGS == 8 |
| POP r11 |
| POP r10 |
| #endif |
| |
| #if ARC_FEATURE_RGF_BANKED_REGS == 4 || ARC_FEATURE_BANKED_REGS == 8 || \ |
| ARC_FEATURE_RGF_BANKED_REGS == 16 |
| POP r9 |
| POP r8 |
| POP r7 |
| POP r6 |
| POP r5 |
| POP r4 |
| #endif |
| |
| #endif /* #ifndef ARC_FEATURE_RGF_BANKED_REGS */ |
| .endm |
| |
| /* normal interrupt prologue, pc, status and r0-r11 are saved by hardware */ |
| .macro INTERRUPT_PROLOGUE |
| PUSH r12 |
| PUSH gp |
| PUSH fp |
| PUSH ilink |
| PUSH r30 |
| |
| sub sp, sp, 4 /* skip bta */ |
| .endm |
| |
| |
| /* normal interrupt epilogue, pc, status and r0-r11 are restored by hardware */ |
| .macro INTERRUPT_EPILOGUE |
| add sp, sp, 4 /* skip bta */ |
| |
| POP r30 |
| POP ilink |
| POP fp |
| POP gp |
| POP r12 |
| .endm |
| |
| #if SECURESHIELD_VERSION == 2 |
| /* exception prologue, create the same frame of interrupt manually */ |
| .macro EXCEPTION_PROLOGUE |
| st.as r10, [sp, -6] /* save r10 first, free up a register*/ |
| |
| PUSHAX AUX_ERSTATUS |
| sub sp, sp, 4 /* slot for SEC_STAT */ |
| PUSHAX AUX_ERRET |
| |
| PUSH blink |
| |
| PUSH r11 |
| sub sp, sp, 4 /* r10 is pushed before */ |
| #ifndef ARC_FEATURE_RF16 |
| PUSH r9 |
| PUSH r8 |
| PUSH r7 |
| PUSH r6 |
| PUSH r5 |
| PUSH r4 |
| #endif |
| PUSH r3 |
| PUSH r2 |
| PUSH r1 |
| PUSH r0 |
| |
| #ifdef ARC_FEATURE_CODE_DENSITY |
| SAVE_CODE_DENSITY |
| #endif |
| SAVE_LP_REGS |
| |
| PUSH r12 |
| PUSH gp |
| PUSH fp |
| PUSH ilink |
| PUSH r30 |
| |
| PUSHAX AUX_ERBTA |
| .endm |
| |
| /* exception epilogue, restore the same frame of interrupt manually */ |
| .macro EXCEPTION_EPILOGUE |
| POPAX AUX_ERBTA |
| |
| POP r30 |
| POP ilink |
| POP fp |
| POP gp |
| POP r12 |
| |
| RESTORE_LP_REGS |
| |
| #ifdef ARC_FEATURE_CODE_DENSITY |
| RESTORE_CODE_DENSITY |
| #endif |
| POP r0 |
| POP r1 |
| POP r2 |
| POP r3 |
| #ifndef ARC_FEATURE_RF16 |
| POP r4 |
| POP r5 |
| POP r6 |
| POP r7 |
| POP r8 |
| POP r9 |
| #endif |
| add sp, sp, 4 /* r10 will be popped finally */ |
| POP r11 |
| |
| POP blink |
| |
| |
| POPAX AUX_ERRET |
| add sp, sp, 4 /* slot for SEC_STAT */ |
| POPAX AUX_ERSTATUS |
| |
| ld.as r10, [sp, -6] /* restore r10 */ |
| .endm |
| #else /* normal version */ |
| /* exception prologue, create the same frame of interrupt manually */ |
| .macro EXCEPTION_PROLOGUE |
| #ifdef ARC_FEATURE_CODE_DENSITY |
| st.as r10, [sp, -11] /* save r10 first, free up a register*/ |
| #else |
| st.as r10, [sp, -8] |
| #endif |
| PUSHAX AUX_ERSTATUS |
| PUSHAX AUX_ERRET |
| |
| #ifdef ARC_FEATURE_CODE_DENSITY |
| SAVE_CODE_DENSITY |
| #endif |
| SAVE_LP_REGS |
| |
| PUSH blink |
| |
| PUSH r11 |
| sub sp, sp, 4 /* r10 is pushed before */ |
| #ifndef ARC_FEATURE_RF16 |
| PUSH r9 |
| PUSH r8 |
| PUSH r7 |
| PUSH r6 |
| PUSH r5 |
| PUSH r4 |
| #endif |
| PUSH r3 |
| PUSH r2 |
| PUSH r1 |
| PUSH r0 |
| |
| PUSH r12 |
| PUSH gp |
| PUSH fp |
| PUSH ilink |
| PUSH r30 |
| |
| PUSHAX AUX_ERBTA |
| .endm |
| |
| /* exception epilogue, restore the same frame of interrupt manually */ |
| .macro EXCEPTION_EPILOGUE |
| POPAX AUX_ERBTA |
| |
| POP r30 |
| POP ilink |
| POP fp |
| POP gp |
| POP r12 |
| |
| POP r0 |
| POP r1 |
| POP r2 |
| POP r3 |
| #ifndef ARC_FEATURE_RF16 |
| POP r4 |
| POP r5 |
| POP r6 |
| POP r7 |
| POP r8 |
| POP r9 |
| #endif |
| add sp, sp, 4 /* r10 will be popped finally */ |
| POP r11 |
| |
| POP blink |
| |
| RESTORE_LP_REGS |
| |
| #ifdef ARC_FEATURE_CODE_DENSITY |
| RESTORE_CODE_DENSITY |
| #endif |
| |
| POPAX AUX_ERRET |
| POPAX AUX_ERSTATUS |
| |
| #ifdef ARC_FEATURE_CODE_DENSITY |
| ld.as r10, [sp, -11] /* restore r10 */ |
| #else |
| ld.as r10, [sp, -8] |
| #endif |
| .endm |
| |
| #endif /* SECURESHIELD_VERSION == 2 */ |
| |
| #endif /* _ARC_HAL_ASM_COMMON_H */ |
| /** @endcond */ |