diff options
author | Eric Andersen <andersen@codepoet.org> | 2004-12-21 08:35:58 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2004-12-21 08:35:58 +0000 |
commit | 05d9958f685e3f0c51be4f1128348645451e51fb (patch) | |
tree | b28c486ae60ad9065ba6d061b494c253fdc73ef5 /libc/sysdeps/linux/bfin/setjmp.S | |
parent | f6cc7543c5530106123f1fa7958d1c594ddff3d8 (diff) |
Add support for the Analog Devices Blackfin mmuless processor
Diffstat (limited to 'libc/sysdeps/linux/bfin/setjmp.S')
-rw-r--r-- | libc/sysdeps/linux/bfin/setjmp.S | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/bfin/setjmp.S b/libc/sysdeps/linux/bfin/setjmp.S new file mode 100644 index 000000000..9bb3ddc8b --- /dev/null +++ b/libc/sysdeps/linux/bfin/setjmp.S @@ -0,0 +1,105 @@ + +/* Cetjmp for the Blackfin project + * + * Copyright (C) 2003, Metrowerks + * Based on code from Analog Devices. + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License. See the file COPYING.LIB in the main + * directory of this archive for more details. + * + */ +#define _ASM +#define _SETJMP_H +#include <bits/setjmp.h> + +.globl ___sigsetjmp; +.align 4; + +___sigsetjmp: + [--SP] = P0; /* Save P0 */ + P0 = R0; + R0 = [SP++]; + [P0 + 0x00] = R0; /* Save saved P0 */ + [P0 + 0x04] = P1; + [P0 + 0x08] = P2; + [P0 + 0x0C] = P3; + [P0 + 0x10] = P4; + [P0 + 0x14] = P5; + + [P0 + 0x18] = FP; /* Frame Pointer */ + [P0 + 0x1C] = SP; /* Stack Pointer */ + + [P0 + 0x20] = P0; /* Data Registers */ + [P0 + 0x24] = R1; + [P0 + 0x28] = R2; + [P0 + 0x2C] = R3; + [P0 + 0x30] = R4; + [P0 + 0x34] = R5; + [P0 + 0x38] = R6; + [P0 + 0x3C] = R7; + + R0 = ASTAT; + [P0 + 0x40] = R0; + + R0 = LC0; /* Loop Counters */ + [P0 + 0x44] = R0; + R0 = LC1; + [P0 + 0x48] = R0; + + R0 = A0.W; /* Accumulators */ + [P0 + 0x4C] = R0; + R0 = A0.X; + [P0 + 0x50] = R0; + R0 = A1.W; + [P0 + 0x54] = R0; + R0 = A1.X; + [P0 + 0x58] = R0; + + R0 = I0; /* Index Registers */ + [P0 + 0x5C] = R0; + R0 = I1; + [P0 + 0x60] = R0; + R0 = I2; + [P0 + 0x64] = R0; + R0 = I3; + [P0 + 0x68] = R0; + + R0 = M0; /* Modifier Registers */ + [P0 + 0x6C] = R0; + R0 = M1; + [P0 + 0x70] = R0; + R0 = M2; + [P0 + 0x74] = R0; + R0 = M3; + [P0 + 0x78] = R0; + + R0 = L0; /* Length Registers */ + [P0 + 0x7c] = R0; + R0 = L1; + [P0 + 0x80] = R0; + R0 = L2; + [P0 + 0x84] = R0; + R0 = L3; + [P0 + 0x88] = R0; + + R0 = B0; /* Base Registers */ + [P0 + 0x8C] = R0; + R0 = B1; + [P0 + 0x90] = R0; + R0 = B2; + [P0 + 0x94] = R0; + R0 = B3; + [P0 + 0x98] = R0; + + R0 = RETS; + [P0 + 0x9C] = R0; + + R0 = [P0 + 0x20]; + CC = R1 == 1; + IF CC JUMP finished; + CALL ___sigjmp_save; +finished: + R0 = 0; + RTS; +___sigsetjmp.end: |