| /* |
| * This file is part of the MicroPython project, http://micropython.org/ |
| * |
| * The MIT License (MIT) |
| * |
| * Copyright (c) 2013-2017 Damien P. George |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a copy |
| * of this software and associated documentation files (the "Software"), to deal |
| * in the Software without restriction, including without limitation the rights |
| * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| * copies of the Software, and to permit persons to whom the Software is |
| * furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included in |
| * all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| * THE SOFTWARE. |
| */ |
| |
| #include "py/mpstate.h" |
| |
| #if MICROPY_NLR_MIPS |
| |
| __attribute__((used)) unsigned int nlr_push_tail(nlr_buf_t *nlr); |
| |
| __asm( |
| ".globl nlr_push \n" |
| "nlr_push: \n" |
| ".ent nlr_push \n" |
| ".frame $29, 0, $31 \n" |
| ".set noreorder \n" |
| ".cpload $25 \n" |
| ".set reorder \n" |
| "sw $31, 8($4) \n" /* is the offset of regs in nlr_buf_t */ |
| "sw $30, 12($4) \n" |
| "sw $29, 16($4) \n" |
| "sw $28, 20($4) \n" |
| "sw $23, 24($4) \n" |
| "sw $22, 28($4) \n" |
| "sw $21, 32($4) \n" |
| "sw $20, 36($4) \n" |
| "sw $19, 40($4) \n" |
| "sw $18, 44($4) \n" |
| "sw $17, 48($4) \n" |
| "sw $16, 52($4) \n" |
| #ifdef __pic__ |
| "la $25, nlr_push_tail \n" |
| #endif |
| "j nlr_push_tail \n" |
| ".end nlr_push \n" |
| ); |
| |
| NORETURN void nlr_jump(void *val) { |
| MP_NLR_JUMP_HEAD(val, top) |
| __asm( |
| "move $4, %0 \n" |
| "lw $31, 8($4) \n" |
| "lw $30, 12($4) \n" |
| "lw $29, 16($4) \n" |
| "lw $28, 20($4) \n" |
| "lw $23, 24($4) \n" |
| "lw $22, 28($4) \n" |
| "lw $21, 32($4) \n" |
| "lw $20, 36($4) \n" |
| "lw $19, 40($4) \n" |
| "lw $18, 44($4) \n" |
| "lw $17, 48($4) \n" |
| "lw $16, 52($4) \n" |
| "lui $2,1 \n" // set return value 1 |
| "j $31 \n" |
| "nop \n" |
| : |
| : "r" (top) |
| : |
| ); |
| MP_UNREACHABLE |
| } |
| |
| #endif // MICROPY_NLR_MIPS |