98 lines
3.0 KiB
ArmAsm
98 lines
3.0 KiB
ArmAsm
|
##############################################################################
|
||
|
# setjmp.S -- CR16 setjmp routine #
|
||
|
# #
|
||
|
# Copyright (c) 2004 National Semiconductor Corporation #
|
||
|
# #
|
||
|
# The authors hereby grant permission to use, copy, modify, distribute, #
|
||
|
# and license this software and its documentation for any purpose, provided #
|
||
|
# that existing copyright notices are retained in all copies and that this #
|
||
|
# notice is included verbatim in any distributions. No written agreement, #
|
||
|
# license, or royalty fee is required for any of the authorized uses. #
|
||
|
# Modifications to this software may be copyrighted by their authors #
|
||
|
# and need not follow the licensing terms described here, provided that #
|
||
|
# the new terms are clearly indicated on the first page of each file where #
|
||
|
# they apply. #
|
||
|
# #
|
||
|
# C library -- setjmp, longjmp #
|
||
|
# longjmp(a,v) #
|
||
|
# will generate a "return(v)" #
|
||
|
# from the last call to #
|
||
|
# setjmp(a) #
|
||
|
# by restoring r7-ra, sp, #
|
||
|
# and pc from 'a' #
|
||
|
# and doing a return. (Makes sure that longjmp never returns 0). #
|
||
|
##############################################################################
|
||
|
|
||
|
.text
|
||
|
.file "setjmp.s"
|
||
|
.align 4
|
||
|
|
||
|
.globl _setjmp
|
||
|
.align 4
|
||
|
_setjmp:
|
||
|
#r3, r2: .blkw
|
||
|
storw r7, 0(r3,r2)
|
||
|
addd $2, (r3,r2)
|
||
|
storw r8, 0(r3,r2)
|
||
|
addd $2, (r3,r2)
|
||
|
storw r9, 0(r3,r2)
|
||
|
addd $2, (r3,r2)
|
||
|
storw r10, 0(r3,r2)
|
||
|
addd $2, (r3,r2)
|
||
|
storw r11, 0(r3,r2)
|
||
|
addd $2, (r3,r2)
|
||
|
|
||
|
stord (r12), 0(r3,r2)
|
||
|
addd $4, (r3,r2)
|
||
|
stord (r13), 0(r3,r2)
|
||
|
addd $4, (r3,r2)
|
||
|
|
||
|
stord (ra), 0(r3,r2)
|
||
|
addd $4, (r3,r2)
|
||
|
stord (sp), 0(r3,r2)
|
||
|
|
||
|
movd $0,(r1,r0)
|
||
|
jump (ra)
|
||
|
|
||
|
.globl _longjmp
|
||
|
_longjmp:
|
||
|
#r3, r2: .blkw # pointer save area
|
||
|
#r5, r4: .blkw # ret vlaue
|
||
|
|
||
|
loadw 0(r3,r2), r7
|
||
|
addd $2, (r3,r2)
|
||
|
loadw 0(r3,r2), r8
|
||
|
addd $2, (r3,r2)
|
||
|
loadw 0(r3,r2), r9
|
||
|
addd $2, (r3,r2)
|
||
|
loadw 0(r3,r2), r10
|
||
|
addd $2, (r3,r2)
|
||
|
loadw 0(r3,r2), r11
|
||
|
addd $2, (r3,r2)
|
||
|
|
||
|
loadd 0(r3,r2), (r12)
|
||
|
addd $4, (r3,r2)
|
||
|
loadd 0(r3,r2), (r13)
|
||
|
addd $4, (r3,r2)
|
||
|
|
||
|
loadd 0(r3,r2), (ra)
|
||
|
addd $4, (r3,r2)
|
||
|
loadd 0(r3,r2), (sp)
|
||
|
|
||
|
#ifdef __INT32__
|
||
|
movd (r5,r4), (r1,r0)
|
||
|
cmpd $0, (r5,r4)
|
||
|
bne end1
|
||
|
movd $1, (r1,r0)
|
||
|
#else
|
||
|
movw r4, r0
|
||
|
cmpw $0, r4
|
||
|
bne end1
|
||
|
movw $1, r0
|
||
|
#endif
|
||
|
end1:
|
||
|
jump (ra)
|
||
|
.align 4
|
||
|
|
||
|
|