/* This C language subroutine provides for an unexpected return from nested functions. The Run Time Library for the C Language. Gordon A. Sterling (617) 461 - 3076 DSP Development Tools Engineering Created on 5/21/91 Updated on 5/94 by AS #include
int longjmp(jmp_buf env, int rtn_val); */ #include "lib_glob.h" #include "jmp_glob.h" .SEGMENT/CODE Code_Space_Name; .FILE RTL_FILENAME; .GLOBAL _longjmp; _longjmp: R0=PASS R8, dm_ptr=R4; /*Point to jmp_buf*/ IF EQ R0=R0+1, dm_lnt=dm_0; /* Longjmp cannot return 0! */ R1=DM(dm_ptr,dm_1); /*Begin saving all registers*/ R2=DM(dm_ptr,dm_1); R3=DM(dm_ptr,dm_1); R5=DM(dm_ptr,dm_1); R6=DM(dm_ptr,dm_1); R7=DM(dm_ptr,dm_1); R9=DM(dm_ptr,dm_1); R10=DM(dm_ptr,dm_1); R11=DM(dm_ptr,dm_1); R13=DM(dm_ptr,dm_1); R14=DM(dm_ptr,dm_1); R15=DM(dm_ptr,dm_1); R12=DM(dm_ptr,dm_1); /*Save DAG1 registers*/ B0=R12; R12=DM(dm_ptr,dm_1); I0=R12; R12=DM(dm_ptr,dm_1); M0=R12; R12=DM(dm_ptr,dm_1); L0=R12; R12=DM(dm_ptr,dm_1); B1=R12; R12=DM(dm_ptr,dm_1); I1=R12; R12=DM(dm_ptr,dm_1); M1=R12; R12=DM(dm_ptr,dm_1); L1=R12; R12=DM(dm_ptr,dm_1); B2=R12; R12=DM(dm_ptr,dm_1); I2=R12; R12=DM(dm_ptr,dm_1); M2=R12; R12=DM(dm_ptr,dm_1); L2=R12; R12=DM(dm_ptr,dm_1); B3=R12; R12=DM(dm_ptr,dm_1); I3=R12; R12=DM(dm_ptr,dm_1); M3=R12; R12=DM(dm_ptr,dm_1); L3=R12; R12=DM(dm_ptr,dm_1); B5=R12; R12=DM(dm_ptr,dm_1); I5=R12; R12=DM(dm_ptr,dm_1); L5=R12; R12=DM(dm_ptr,dm_1); I6=R12; R12=DM(dm_ptr,dm_1); I7=R12; R12=DM(dm_ptr,dm_1); /*Save DAG2 registers*/ B8=R12; R12=DM(dm_ptr,dm_1); I8=R12; R12=DM(dm_ptr,dm_1); M8=R12; R12=DM(dm_ptr,dm_1); L8=R12; R12=DM(dm_ptr,dm_1); B9=R12; R12=DM(dm_ptr,dm_1); I9=R12; R12=DM(dm_ptr,dm_1); M9=R12; R12=DM(dm_ptr,dm_1); L9=R12; R12=DM(dm_ptr,dm_1); B10=R12; R12=DM(dm_ptr,dm_1); I10=R12; R12=DM(dm_ptr,dm_1); M10=R12; R12=DM(dm_ptr,dm_1); L10=R12; R12=DM(dm_ptr,dm_1); B11=R12; R12=DM(dm_ptr,dm_1); I11=R12; R12=DM(dm_ptr,dm_1); M11=R12; R12=DM(dm_ptr,dm_1); L11=R12; R12=DM(dm_ptr,dm_1); B13=R12; R12=DM(dm_ptr,dm_1); I13=R12; R12=DM(dm_ptr,dm_1); L13=R12; R12=DM(dm_ptr,dm_1); I14=R12; R12=DM(dm_ptr,dm_1); R4=R4-R4, I15=R12; R4=R4+1, R12=DM(dm_ptr,dm_1); R1=MODE1; BIT CLR MODE1 0x1000; put(R1); /*Save state in mode1 latency cycle */ PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R4; NOP; R4=R4+1, PCSTK=DM(dm_ptr,dm_1); PCSTKP=R12; I12=DM(dm_ptr,dm_1); BIT CLR IRPTL 8; get(R1,1); MODE1=R1; /*Restore state */ alter(1); restore_state: RETURN (DB); RESTORE_STACK RESTORE_FRAME .ENDSEG;