📄 setjmp.s43
字号:
//////////////////////////////////////////////////////////////////
// Copyright 1996, 2002 IAR Systems. All rights reserved.
// $Id: setjmp.s43 1.5 2005/06/22 08:25:34Z ifrc Exp fredrikc $
#include "macros.m43"
#include "cfi.m43"
#define W0 R12
#define W1 R14
#define W2 R13
XCFI_NAMES libNames
XCFI_COMMON libCommon, libNames
// ---------------------------------------------------------
// setjmp
//
MODULE ?setjmp
PUBLIC setjmp
RSEG CODE:CODE:NOROOT(1)
EXTERN ?setjmp_save_r4
EXTERN ?setjmp_save_r5
REQUIRE ?setjmp_save_r4
REQUIRE ?setjmp_save_r5
XCFI_BEGIN setjmp
CFI W0 Undefined
setjmp:
#if __CORE__==__430X_CORE__
// Save all callee-save registers.
MOVA R11, 0(W0)
MOVA R10, 4(W0)
MOVA R9, 8(W0)
MOVA R8, 12(W0)
MOVA R7, 16(W0)
MOVA R6, 20(W0)
MOVA SP, 24(W0)
// Save the return address.
MOVX.A @SP, 28(W0)
#else
// Save all callee-save registers.
MOV R11, 0(W0)
MOV R10, 2(W0)
MOV R9, 4(W0)
MOV R8, 6(W0)
MOV R7, 8(W0)
MOV R6, 10(W0)
MOV SP, 12(W0)
// Save the return address.
MOV @SP, 14(W0)
#endif
REQUIRE ?setjmp_end
XCFI_END setjmp
// -------------------
// Save R5, if not locked by all modules.
//
RSEG CODE:CODE:NOROOT(1)
PUBLIC ?setjmp_r5
XCFI_BEGIN ?setjmp_r5
CFI W0 Undefined
?setjmp_r5
#if __CORE__==__430X_CORE__
MOVA R5, 32(W0)
#else
MOV R5, 16(W0)
#endif
XCFI_END ?setjmp_r5
// -------------------
// Save R4, if not locked by all modules.
//
RSEG CODE:CODE:NOROOT(1)
PUBLIC ?setjmp_r4
XCFI_BEGIN ?setjmp_r4
CFI W0 Undefined
?setjmp_r4
#if __CORE__==__430X_CORE__
MOVA R4, 36(W0)
#else
MOV R4, 18(W0)
#endif
XCFI_END ?setjmp_r4
// -------------------
// The end.
//
RSEG CODE:CODE:NOROOT(1)
PUBLIC ?setjmp_end
XCFI_BEGIN ?setjmp_end
CFI W0 Undefined
?setjmp_end:
MOV #0, W0
XRET
XCFI_END ?setjmp_end
ENDMOD
// ---------------------------------------------------------
// ?setjmp_save_rX
//
// The following three modules are the library versions
// of modules generated by the C-compiler to force
// the setjmp/longjmp functions to include code
// to handle non-locked registers.
//
// The setjmp/longjmp routines require these. In the
// C-compiler generated version they in turn require
// ?setjmpX and ?longjmpX which will save the appropriate
// number of registers.
//
// Note that it is sufficient for one module to
// use a non-locked register to make setjmp/longjmp
// save that register regardless from which module
// it was called.
//
MODULE ?setjmp_save_r4
PUBWEAK ?setjmp_save_r4
RSEG CODE:CODE:NOROOT(1)
?setjmp_save_r4:
ENDMOD
MODULE ?setjmp_save_r5
PUBWEAK ?setjmp_save_r5
RSEG CODE:CODE:NOROOT(1)
?setjmp_save_r5:
ENDMOD
// ---------------------------------------------------------
// longjmp
//
// A note on the implementation. The two segment parts "?longjmp_r5"
// and "?longjmp_r4" could be excluded or included depending on
// register locking. Note that the latter can not rely on side
// effects (read: post increment) performed in the former. This is
// the cause of the "2(W2)" operand in the latter.
MODULE ?longjmp
PUBLIC longjmp
PUBLIC ?longjmp_end
EXTERN ?setjmp_save_r4
EXTERN ?setjmp_save_r5
RSEG CODE:CODE:NOROOT(1)
XCFI_BEGIN longjmp
CFI W0 Undefined
CFI W2 Undefined
// Undefined due to calling convention.
CFI R15 Undefined
CFI R14 Undefined
CFI R13 Undefined
CFI R12 Undefined
CFI R11 Undefined
CFI R10 Undefined
CFI R9 Undefined
CFI R8 Undefined
CFI R7 Undefined
CFI R6 Undefined
longjmp:
// Pointer to the buffer.
MOV W0, W2
// Move the return value to the return location.
MOV W1, W0
// Ensure that the return value is not zero.
CMP #0, W0
JNE nonzero
MOV #1, W0
nonzero:
#if __CORE__==__430X_CORE__
// Restore the callee-save registern.
MOVX.A @W2+, R11
CFI R11 SameValue
MOVX.A @W2+, R10
CFI R10 SameValue
MOVX.A @W2+, R9
CFI R9 SameValue
MOVX.A @W2+, R8
CFI R8 SameValue
MOVX.A @W2+, R7
CFI R7 SameValue
MOVX.A @W2+, R6
CFI R6 SameValue
MOVX.A @W2+, SP
CFI rememberstate
CFI PC Undefined
// Restore the return address.
MOVX.A @W2+ , 0(SP)
#else
// Restore the callee-save registern.
MOV @W2+, R11
CFI R11 SameValue
MOV @W2+, R10
CFI R10 SameValue
MOV @W2+, R9
CFI R9 SameValue
MOV @W2+, R8
CFI R8 SameValue
MOV @W2+, R7
CFI R7 SameValue
MOV @W2+, R6
CFI R6 SameValue
MOV @W2+, SP
CFI rememberstate
CFI PC Undefined
// Restore the return address.
MOV @W2+ , 0(SP)
#endif
CFI restorestate
REQUIRE ?longjmp_end
XCFI_END longjmp
// -------------------
// Restore R5, if not locked by all modules.
//
RSEG CODE:CODE:NOROOT(1)
PUBLIC ?longjmp_r5
XCFI_BEGIN ?longjmp_r5
CFI PC Undefined
CFI R15 Undefined
CFI R14 Undefined
CFI R13 Undefined
CFI R12 Undefined
CFI R5 Undefined
?longjmp_r5:
#if __CORE__==__430X_CORE__
MOVX.A @W2, R5
#else
MOV @W2, R5
#endif
CFI R5 SameValue
XCFI_END ?longjmp_r5
// -------------------
// Restore R4, if not locked by all modules.
//
RSEG CODE:CODE:NOROOT(1)
PUBLIC ?longjmp_r4
XCFI_BEGIN ?longjmp_r4
CFI PC Undefined
CFI R15 Undefined
CFI R14 Undefined
CFI R13 Undefined
CFI R12 Undefined
CFI R4 Undefined
?longjmp_r4:
#if __CORE__==__430X_CORE__
MOVX.A 4(W2), R4
#else
MOV 2(W2), R4
#endif
CFI R4 SameValue
XCFI_END ?longjmp_r4
// -------------------
// The end.
//
RSEG CODE:CODE:NOROOT(1)
XCFI_BEGIN ?longjmp_end
CFI PC Undefined
CFI R15 Undefined
CFI R14 Undefined
CFI R13 Undefined
CFI R12 Undefined
XRET
?longjmp_end:
XCFI_END ?longjmp_end
ENDMOD
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -