diff options
author | Christopher Faylor <me@cgf.cx> | 2000-02-17 19:39:52 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2000-02-17 19:39:52 +0000 |
commit | 8a0efa53e44919bcf5ccb1d3353618a82afdf8bc (patch) | |
tree | 68c3dbf3f2c6fd5d49777def9914d77b5cd4589d /newlib/libc/machine/d30v/setjmp.S | |
parent | 1fd5e000ace55b323124c7e556a7a864b972a5c4 (diff) | |
download | cygnal-8a0efa53e44919bcf5ccb1d3353618a82afdf8bc.tar.gz cygnal-8a0efa53e44919bcf5ccb1d3353618a82afdf8bc.tar.bz2 cygnal-8a0efa53e44919bcf5ccb1d3353618a82afdf8bc.zip |
import newlib-2000-02-17 snapshot
Diffstat (limited to 'newlib/libc/machine/d30v/setjmp.S')
-rw-r--r-- | newlib/libc/machine/d30v/setjmp.S | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/newlib/libc/machine/d30v/setjmp.S b/newlib/libc/machine/d30v/setjmp.S new file mode 100644 index 000000000..c0ca8250b --- /dev/null +++ b/newlib/libc/machine/d30v/setjmp.S @@ -0,0 +1,106 @@ +; setjmp/longjmp for D30V. + + .text + .globl setjmp + .type setjmp,@function + .stabs "setjmp.S",100,0,0,setjmp + .stabs "int:t(0,1)=r(0,1);-2147483648;2147483647;",128,0,0,0 + .stabs "setjmp:F(0,1)",36,0,1,setjmp + +setjmp: +; Address of jmpbuf is passed in R2. Save the appropriate registers. + st2w r26, @(r2+,r0) + st2w r28, @(r2+,r0) + st2w r30, @(r2+,r0) + st2w r32, @(r2+,r0) + st2w r34, @(r2+,r0) + st2w r36, @(r2+,r0) + st2w r38, @(r2+,r0) + st2w r40, @(r2+,r0) + st2w r42, @(r2+,r0) + st2w r44, @(r2+,r0) + st2w r46, @(r2+,r0) + st2w r48, @(r2+,r0) + st2w r50, @(r2+,r0) + st2w r52, @(r2+,r0) + st2w r54, @(r2+,r0) + st2w r56, @(r2+,r0) + st2w r58, @(r2+,r0) + st2w r60, @(r2+,r0) + st2w r62, @(r2+,r0) + + mvfacc r4, a1, 16 + mvfacc r5, a1, 0 + st2w r4, @(r2+,r0) + + mvfsys r4, psw + mvfsys r5, rpt_c + st2w r4, @(r2+,r0) + + mvfsys r4, rpt_s + mvfsys r5, rpt_e + st2w r4, @(r2+,r0) + + mvfsys r4, mod_s + mvfsys r5, mod_e + st2w r4, @(r2+,r0) + +; Return 0 to caller + add r2, r0, r0 + jmp link +.Lsetjmp: + .size setjmp,.Lsetjmp-setjmp + .stabs "",36,0,0,.Lsetjmp-setjmp + + .globl longjmp + .type longjmp,@function + .stabs "longjmp:F(0,1)",36,0,1,longjmp +longjmp: +; Address of jmpbuf is in R2. Restore the registers. + ld2w r26, @(r2+,r0) + ld2w r28, @(r2+,r0) + ld2w r30, @(r2+,r0) + ld2w r32, @(r2+,r0) + ld2w r34, @(r2+,r0) + ld2w r36, @(r2+,r0) + ld2w r38, @(r2+,r0) + ld2w r40, @(r2+,r0) + ld2w r42, @(r2+,r0) + ld2w r44, @(r2+,r0) + ld2w r46, @(r2+,r0) + ld2w r48, @(r2+,r0) + ld2w r50, @(r2+,r0) + ld2w r52, @(r2+,r0) + ld2w r54, @(r2+,r0) + ld2w r56, @(r2+,r0) + ld2w r58, @(r2+,r0) + ld2w r60, @(r2+,r0) + ld2w r62, @(r2+,r0) + + ld2w r4, @(r2+,r0) + mvtacc a1, r4, r5 + + mvfsys r6, psw + ld2w r4, @(r2+,r0) /* psw, rpt_c */ + and r6, r6, 0xfcff /* set rp, md bits from setjmp, leave */ + and r4, r4, 0x0300 /* all other psw bits the same */ + or r4, r4, r6 + mvtsys psw, r4 + mvtsys rpt_c, r5 + + ld2w r4, @(r2+,r0) + mvtsys rpt_s, r4 + mvtsys rpt_e, r5 + + ld2w r4, @(r2+,r0) + mvtsys mod_s, r4 + mvtsys mod_e, r5 + +; Value to return to caller is in R3. If caller attemped to return 0, +; return 1 instead. + + cmpeq f0, r3, 0 || add r2, r3, r0 + jmp link || add/tx r2, r2, 1 +.Llongjmp: + .size longjmp,.Llongjmp-longjmp + .stabs "",36,0,0,.Llongjmp-longjmp |