| /* A setjmp.c for Moxie |
| Copyright (C) 2009 Anthony Green |
| |
| 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. */ |
| |
| # setjmp/longjmp for moxie. The jmpbuf looks like this: |
| # |
| # Register jmpbuf offset |
| # $r0 0x00 |
| # $r1 0x04 |
| # $r2 0x08 |
| # $r3 0x0c |
| # $r4 0x10 |
| # $r5 0x14 |
| # $r6 0x18 |
| # $r7 0x1c |
| # $r8 0x20 |
| # $r9 0x24 |
| # $r10 0x28 |
| # $r11 0x2c |
| # $r12 0x30 |
| # $r13 0x34 |
| # $fp 0x38 |
| # $sp 0x3c |
| |
| .text |
| .global setjmp |
| .type setjmp,@function |
| setjmp: |
| st.l ($r0), $r0 |
| sto.l 0x04($r0), $r1 |
| sto.l 0x08($r0), $r2 |
| sto.l 0x0c($r0), $r3 |
| sto.l 0x10($r0), $r4 |
| sto.l 0x14($r0), $r5 |
| sto.l 0x18($r0), $r6 |
| sto.l 0x1c($r0), $r7 |
| sto.l 0x20($r0), $r8 |
| sto.l 0x24($r0), $r9 |
| sto.l 0x28($r0), $r10 |
| sto.l 0x2c($r0), $r11 |
| sto.l 0x30($r0), $r12 |
| sto.l 0x34($r0), $r13 |
| sto.l 0x38($r0), $sp |
| sto.l 0x3c($r0), $fp |
| xor $r0, $r0 |
| ret |
| .Lend1: |
| .size setjmp,.Lend1-setjmp |
| |
| .global longjmp |
| .type longjmp,@function |
| longjmp: |
| ldi.l $r2, 0x00 |
| cmp $r1, $r2 |
| beq .Lreturn1 |
| ldo.l $r1, 0x04($r0) |
| ldo.l $r2, 0x08($r0) |
| ldo.l $r3, 0x0c($r0) |
| ldo.l $r4, 0x10($r0) |
| ldo.l $r5, 0x14($r0) |
| ldo.l $r6, 0x18($r0) |
| ldo.l $r7, 0x1c($r0) |
| ldo.l $r8, 0x20($r0) |
| ldo.l $r9, 0x24($r0) |
| ldo.l $r10, 0x28($r0) |
| ldo.l $r11, 0x2c($r0) |
| ldo.l $r12, 0x30($r0) |
| ldo.l $r13, 0x34($r0) |
| ldo.l $sp, 0x38($r0) |
| ldo.l $fp, 0x3c($r0) |
| mov $r0, $r1 |
| ret |
| .Lreturn1: |
| ldo.l $r1, 0x04($r0) |
| ldo.l $r2, 0x08($r0) |
| ldo.l $r3, 0x0c($r0) |
| ldo.l $r4, 0x10($r0) |
| ldo.l $r5, 0x14($r0) |
| ldo.l $r6, 0x18($r0) |
| ldo.l $r7, 0x1c($r0) |
| ldo.l $r8, 0x20($r0) |
| ldo.l $r9, 0x24($r0) |
| ldo.l $r10, 0x28($r0) |
| ldo.l $r11, 0x2c($r0) |
| ldo.l $r12, 0x30($r0) |
| ldo.l $r13, 0x34($r0) |
| ldo.l $sp, 0x38($r0) |
| ldo.l $fp, 0x3c($r0) |
| ldi.l $r0, 0x01 |
| ret |
| .Lend2: |
| .size longjmp,.Lend2-longjmp |