123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426 |
- #include "nds32.h"
- .set regno, 0
- #ifdef __TARGET_IFC_EXT
- .set regno, regno+1
- #endif
- #ifdef __TARGET_ZOL_EXT
- .set regno, regno+3
- #endif
- /* Descend PSW.INTL and enable PSW.AEN */
- .macro IntlDescend
- mfsr $r1, $PSW
- #ifdef __TARGET_ZOL_EXT
- /* Also enable ZOL (PSW.AEN) */
- xori $r1, $r1, #((1 << 13) | (1 << 1))
- #else
- addi $r1, $r1, #-2
- #endif
- mtsr $r1, $PSW
- .endm
- /* FPU registers */
- .macro SAVE_FPU_REGS_00
- fsdi.bi $fd3, [$sp], -8
- fsdi.bi $fd2, [$sp], -8
- fsdi.bi $fd1, [$sp], -8
- fsdi $fd0, [$sp+0]
- .endm
- .macro SAVE_FPU_REGS_01
- fsdi.bi $fd7, [$sp], -8
- fsdi.bi $fd6, [$sp], -8
- fsdi.bi $fd5, [$sp], -8
- fsdi.bi $fd4, [$sp], -8
- SAVE_FPU_REGS_00
- .endm
- .macro SAVE_FPU_REGS_02
- fsdi.bi $fd15, [$sp], -8
- fsdi.bi $fd14, [$sp], -8
- fsdi.bi $fd13, [$sp], -8
- fsdi.bi $fd12, [$sp], -8
- fsdi.bi $fd11, [$sp], -8
- fsdi.bi $fd10, [$sp], -8
- fsdi.bi $fd9, [$sp], -8
- fsdi.bi $fd8, [$sp], -8
- SAVE_FPU_REGS_01
- .endm
- .macro SAVE_FPU_REGS_03
- fsdi.bi $fd31, [$sp], -8
- fsdi.bi $fd30, [$sp], -8
- fsdi.bi $fd29, [$sp], -8
- fsdi.bi $fd28, [$sp], -8
- fsdi.bi $fd27, [$sp], -8
- fsdi.bi $fd26, [$sp], -8
- fsdi.bi $fd25, [$sp], -8
- fsdi.bi $fd24, [$sp], -8
- fsdi.bi $fd23, [$sp], -8
- fsdi.bi $fd22, [$sp], -8
- fsdi.bi $fd21, [$sp], -8
- fsdi.bi $fd20, [$sp], -8
- fsdi.bi $fd19, [$sp], -8
- fsdi.bi $fd18, [$sp], -8
- fsdi.bi $fd17, [$sp], -8
- fsdi.bi $fd16, [$sp], -8
- SAVE_FPU_REGS_02
- .endm
- .macro push_fpu
- #if defined(__NDS32_EXT_FPU_CONFIG_0__)
- addi $sp, $sp, -8
- SAVE_FPU_REGS_00
- #elif defined(__NDS32_EXT_FPU_CONFIG_1__)
- addi $sp, $sp, -8
- SAVE_FPU_REGS_01
- #elif defined(__NDS32_EXT_FPU_CONFIG_2__)
- addi $sp, $sp, -8
- SAVE_FPU_REGS_02
- #elif defined(__NDS32_EXT_FPU_CONFIG_3__)
- addi $sp, $sp, -8
- SAVE_FPU_REGS_03
- #else
- #endif
- .endm
- .macro RESTORE_FPU_REGS_00
- fldi.bi $fd0, [$sp], 8
- fldi.bi $fd1, [$sp], 8
- fldi.bi $fd2, [$sp], 8
- fldi.bi $fd3, [$sp], 8
- .endm
- .macro RESTORE_FPU_REGS_01
- RESTORE_FPU_REGS_00
- fldi.bi $fd4, [$sp], 8
- fldi.bi $fd5, [$sp], 8
- fldi.bi $fd6, [$sp], 8
- fldi.bi $fd7, [$sp], 8
- .endm
- .macro RESTORE_FPU_REGS_02
- RESTORE_FPU_REGS_01
- fldi.bi $fd8, [$sp], 8
- fldi.bi $fd9, [$sp], 8
- fldi.bi $fd10, [$sp], 8
- fldi.bi $fd11, [$sp], 8
- fldi.bi $fd12, [$sp], 8
- fldi.bi $fd13, [$sp], 8
- fldi.bi $fd14, [$sp], 8
- fldi.bi $fd15, [$sp], 8
- .endm
- .macro RESTORE_FPU_REGS_03
- RESTORE_FPU_REGS_02
- fldi.bi $fd16, [$sp], 8
- fldi.bi $fd17, [$sp], 8
- fldi.bi $fd18, [$sp], 8
- fldi.bi $fd19, [$sp], 8
- fldi.bi $fd20, [$sp], 8
- fldi.bi $fd21, [$sp], 8
- fldi.bi $fd22, [$sp], 8
- fldi.bi $fd23, [$sp], 8
- fldi.bi $fd24, [$sp], 8
- fldi.bi $fd25, [$sp], 8
- fldi.bi $fd26, [$sp], 8
- fldi.bi $fd27, [$sp], 8
- fldi.bi $fd28, [$sp], 8
- fldi.bi $fd29, [$sp], 8
- fldi.bi $fd30, [$sp], 8
- fldi.bi $fd31, [$sp], 8
- .endm
- .macro pop_fpu
- #if defined(__NDS32_EXT_FPU_CONFIG_0__)
- RESTORE_FPU_REGS_00
- #elif defined(__NDS32_EXT_FPU_CONFIG_1__)
- RESTORE_FPU_REGS_01
- #elif defined(__NDS32_EXT_FPU_CONFIG_2__)
- RESTORE_FPU_REGS_02
- #elif defined(__NDS32_EXT_FPU_CONFIG_3__)
- RESTORE_FPU_REGS_03
- #else
- #endif
- .endm
- /* FPU Caller registers */
- .macro SAVE_FPU_CALLER_REGS_00
- addi $sp, $sp, -8
- fsdi.bi $fd2, [$sp], -8
- fsdi.bi $fd1, [$sp], -8
- fsdi $fd0, [$sp+0]
- .endm
- .macro SAVE_FPU_CALLER_REGS_01
- SAVE_FPU_CALLER_REGS_00
- .endm
- .macro SAVE_FPU_CALLER_REGS_02
- addi $sp, $sp, -8
- fsdi.bi $fd15, [$sp], -8
- fsdi.bi $fd14, [$sp], -8
- fsdi.bi $fd13, [$sp], -8
- fsdi.bi $fd12, [$sp], -8
- fsdi.bi $fd11, [$sp], -8
- fsdi.bi $fd2, [$sp], -8
- fsdi.bi $fd1, [$sp], -8
- fsdi $fd0, [$sp+0]
- .endm
- .macro SAVE_FPU_CALLER_REGS_03
- addi $sp, $sp, -8
- fsdi.bi $fd23, [$sp], -8
- fsdi.bi $fd22, [$sp], -8
- fsdi.bi $fd21, [$sp], -8
- fsdi.bi $fd20, [$sp], -8
- fsdi.bi $fd19, [$sp], -8
- fsdi.bi $fd18, [$sp], -8
- fsdi.bi $fd17, [$sp], -8
- fsdi.bi $fd16, [$sp], -8
- fsdi.bi $fd15, [$sp], -8
- fsdi.bi $fd14, [$sp], -8
- fsdi.bi $fd13, [$sp], -8
- fsdi.bi $fd12, [$sp], -8
- fsdi.bi $fd11, [$sp], -8
- fsdi.bi $fd2, [$sp], -8
- fsdi.bi $fd1, [$sp], -8
- fsdi $fd0, [$sp+0]
- .endm
- .macro push_fpu_caller
- #if defined(__NDS32_EXT_FPU_CONFIG_0__)
- SAVE_FPU_CALLER_REGS_00
- #elif defined(__NDS32_EXT_FPU_CONFIG_1__)
- SAVE_FPU_CALLER_REGS_01
- #elif defined(__NDS32_EXT_FPU_CONFIG_2__)
- SAVE_FPU_CALLER_REGS_02
- #elif defined(__NDS32_EXT_FPU_CONFIG_3__)
- SAVE_FPU_CALLER_REGS_03
- #else
- #endif
- .endm
- .macro RESTORE_FPU_CALLER_REGS_00
- fldi.bi $fd0, [$sp], 8
- fldi.bi $fd1, [$sp], 8
- fldi.bi $fd2, [$sp], 8
- .endm
- .macro RESTORE_FPU_CALLER_REGS_01
- RESTORE_FPU_CALLER_REGS_00
- .endm
- .macro RESTORE_FPU_CALLER_REGS_02
- fldi.bi $fd0, [$sp], 8
- fldi.bi $fd1, [$sp], 8
- fldi.bi $fd2, [$sp], 8
- fldi.bi $fd11, [$sp], 8
- fldi.bi $fd12, [$sp], 8
- fldi.bi $fd13, [$sp], 8
- fldi.bi $fd14, [$sp], 8
- fldi.bi $fd15, [$sp], 8
- .endm
- .macro RESTORE_FPU_CALLER_REGS_03
- fldi.bi $fd0, [$sp], 8
- fldi.bi $fd1, [$sp], 8
- fldi.bi $fd2, [$sp], 8
- fldi.bi $fd11, [$sp], 8
- fldi.bi $fd12, [$sp], 8
- fldi.bi $fd13, [$sp], 8
- fldi.bi $fd14, [$sp], 8
- fldi.bi $fd15, [$sp], 8
- fldi.bi $fd16, [$sp], 8
- fldi.bi $fd17, [$sp], 8
- fldi.bi $fd18, [$sp], 8
- fldi.bi $fd19, [$sp], 8
- fldi.bi $fd20, [$sp], 8
- fldi.bi $fd21, [$sp], 8
- fldi.bi $fd22, [$sp], 8
- fldi.bi $fd23, [$sp], 8
- .endm
- .macro pop_fpu_caller
- #if defined(__NDS32_EXT_FPU_CONFIG_0__)
- RESTORE_FPU_CALLER_REGS_00
- #elif defined(__NDS32_EXT_FPU_CONFIG_1__)
- RESTORE_FPU_CALLER_REGS_01
- #elif defined(__NDS32_EXT_FPU_CONFIG_2__)
- RESTORE_FPU_CALLER_REGS_02
- #elif defined(__NDS32_EXT_FPU_CONFIG_3__)
- RESTORE_FPU_CALLER_REGS_03
- #else
- #endif
- .endm
- /* IFC system register */
- .macro MFUSR_IFC R0="$r1"
- mfusr \R0, $IFC_LP
- .endm
- .macro MTUSR_IFC R0="$r1"
- mtusr \R0, $IFC_LP
- .endm
- /* ZOL system registers */
- .macro MFUSR_ZOL R0="$r1", R1="$r2", R2="$r3"
- mfusr \R0, $LB
- mfusr \R1, $LE
- mfusr \R2, $LC
- .endm
- .macro MTUSR_ZOL R0="$r1", R1="$r2", R2="$r3"
- mtusr \R0, $LB
- mtusr \R1, $LE
- mtusr \R2, $LC
- .endm
- /* Context-switch save and restore routines */
- .macro SAVE_ALL
- pushm $r6, $r30
- mfsr $r1, $IPC
- mfsr $r2, $IPSW
- .if (regno == 4)
- MFUSR_ZOL "$r3","$r4","$r5"
- MFUSR_IFC "$r6"
- pushm $r0, $r6 /* $0 is dummy */
- .else
- .if (regno == 3)
- MFUSR_ZOL "$r3","$r4","$r5"
- pushm $r1, $r5
- .else
- .if (regno == 1)
- MFUSR_IFC "$r3"
- pushm $r1, $r3
- .else
- pushm $r1, $r2
- .endif
- .endif
- .endif
- push_fpu
- .endm
- .macro RESTORE_ALL
- pop_fpu
- setgie.d
- dsb
- .if (regno == 4)
- popm $r0, $r6 /* $0 is dummy */
- MTUSR_ZOL "$r3","$r4","$r5"
- MTUSR_IFC "$r6"
- .else
- .if (regno == 3)
- popm $r1, $r5
- MTUSR_ZOL "$r3","$r4","$r5"
- .else
- .if (regno == 1)
- popm $r1, $r3
- MTUSR_IFC "$r3"
- .else
- popm $r1, $r2
- .endif
- .endif
- .endif
- mtsr $r1, $IPC
- mtsr $r2, $IPSW
- popm $r6, $r30
- popm $r0, $r5
- .endm
- /* Nested IRQ save and restore routines*/
- .macro SAVE_CALLER
- pushm $r15,$r30 /* full: 16 gpr, reduce: 4 gpr */
- .if (regno == 4)
- MFUSR_ZOL "$r1","$r2","$r3"
- MFUSR_IFC "$r4"
- pushm $r1, $r4
- mfsr $r1, $IPC
- mfsr $r2, $IPSW
- pushm $r1, $r2
- .else
- mfsr $r1, $IPC
- mfsr $r2, $IPSW
- .if (regno == 3)
- MFUSR_ZOL "$r3","$r4","$r5"
- pushm $r0, $r5 /* $0 is dummy */
- .else
- .if (regno == 1)
- MFUSR_IFC "$r3"
- pushm $r0, $r3 /* $r0 is dummy */
- .else
- pushm $r1, $r2
- .endif
- .endif
- .endif
- push_fpu_caller
- .endm
- .macro RESTORE_CALLER
- pop_fpu_caller
- setgie.d
- dsb
- .if (regno == 4)
- popm $r1, $r2
- mtsr $r1, $IPC
- mtsr $r2, $IPSW
- popm $r1, $r4
- MTUSR_ZOL "$r1","$r2","$r3"
- MTUSR_IFC "$r4"
- .else
- .if (regno == 3)
- popm $r0, $r5 /* $0 is dummy */
- MTUSR_ZOL "$r3","$r4","$r5"
- .else
- .if (regno == 1)
- popm $r0, $r3 /* $0 is dummy */
- MTUSR_IFC "$r3"
- .else
- popm $r1, $r2
- .endif
- .endif
- mtsr $r1, $IPC
- mtsr $r2, $IPSW
- .endif
- popm $r15,$r30 /* full: 16 gpr, reduce: 4 gpr*/
- popm $r0, $r5
- .endm
- /* Non-Nested IRQ save and restore routines */
- .macro SAVE_CALLER_UNNESTED
- pushm $r15,$r30 /* full: 16 gpr, reduce: 4 gpr */
- .if (regno == 1)
- MFUSR_IFC "$r1"
- pushm $r0, $r1 /* $r0 is dummy */
- .endif
- push_fpu_caller
- .endm
- .macro RESTORE_CALLER_UNNESTED
- pop_fpu_caller
- .if (regno == 1)
- setgie.d
- dsb
- popm $r0, $r1 /* $0 is dummy */
- MTUSR_IFC "$r1"
- .endif
- popm $r15,$r30 /* full: 16 gpr, reduce: 4 gpr*/
- popm $r0, $r5
- .endm
|