[444] | 1 | ; setjmp/longjmp for D10V. The jmpbuf looks like this: |
---|
| 2 | ; |
---|
| 3 | ; Register jmpbuf offset |
---|
| 4 | ; R6 0x00 |
---|
| 5 | ; R7 0x02 |
---|
| 6 | ; R8 0x04 |
---|
| 7 | ; R9 0x06 |
---|
| 8 | ; R10 0x08 |
---|
| 9 | ; R11 0x0a |
---|
| 10 | ; R13 (return address) 0x0c |
---|
| 11 | ; R15 (SP) 0x0E |
---|
| 12 | |
---|
| 13 | .text |
---|
| 14 | .globl setjmp |
---|
| 15 | .type setjmp,@function |
---|
| 16 | .stabs "setjmp.S",100,0,0,setjmp |
---|
| 17 | .stabs "int:t(0,1)=r(0,1);-65536;65535;",128,0,0,0 |
---|
| 18 | .stabs "setjmp:F(0,1)",36,0,1,setjmp |
---|
| 19 | |
---|
| 20 | setjmp: |
---|
| 21 | ; Address of jmpbuf is passed in R0. Save the appropriate registers. |
---|
| 22 | st2w r6, @r0+ |
---|
| 23 | st2w r8, @r0+ |
---|
| 24 | st2w r10, @r0+ |
---|
| 25 | st r13, @r0+ |
---|
| 26 | st r15, @r0+ |
---|
| 27 | |
---|
| 28 | ; Return 0 to caller |
---|
| 29 | ldi r0, 0 |
---|
| 30 | jmp r13 |
---|
| 31 | .Lsetjmp: |
---|
| 32 | .size setjmp,.Lsetjmp-setjmp |
---|
| 33 | .stabs "",36,0,0,.Lsetjmp-setjmp |
---|
| 34 | |
---|
| 35 | .globl longjmp |
---|
| 36 | .type longjmp,@function |
---|
| 37 | .stabs "longjmp:F(0,1)",36,0,1,longjmp |
---|
| 38 | longjmp: |
---|
| 39 | ; Address of jmpbuf is in R0. Restore the registers. |
---|
| 40 | ld2w r6, @r0+ |
---|
| 41 | ld2w r8, @r0+ |
---|
| 42 | ld2w r10, @r0+ |
---|
| 43 | ld r13, @r0+ |
---|
| 44 | ld r15, @r0+ |
---|
| 45 | |
---|
| 46 | ; Value to return to caller is in R1. If caller attemped to return 0, |
---|
| 47 | ; return 1 instead. |
---|
| 48 | |
---|
| 49 | mv r0, r1 |
---|
| 50 | cmpeqi r0, 0 |
---|
| 51 | exef0t || ldi r0,1 |
---|
| 52 | jmp r13 |
---|
| 53 | .Llongjmp: |
---|
| 54 | .size longjmp,.Llongjmp-longjmp |
---|
| 55 | .stabs "",36,0,0,.Llongjmp-longjmp |
---|