diff options
Diffstat (limited to 'vendor/psm/src/arch/mips64_eabi.s')
-rw-r--r-- | vendor/psm/src/arch/mips64_eabi.s | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/vendor/psm/src/arch/mips64_eabi.s b/vendor/psm/src/arch/mips64_eabi.s new file mode 100644 index 000000000..72bc01eb7 --- /dev/null +++ b/vendor/psm/src/arch/mips64_eabi.s @@ -0,0 +1,87 @@ +/* +Not only MIPS has 20 different ABIs... nobody tells anybody what specific variant of which ABI is +used where. + +This is an "EABI" implementation based on the following page: + +http://www.cygwin.com/ml/binutils/2003-06/msg00436.html +*/ + +#include "psm.h" + +.set noreorder /* we’ll manage the delay slots on our own, thanks! */ + +.text +.globl rust_psm_stack_direction +.p2align 3 +.type rust_psm_stack_direction,@function +.ent rust_psm_stack_direction +/* extern "C" fn() -> u8 */ +rust_psm_stack_direction: +.cfi_startproc + jr $31 + addiu $2, $zero, STACK_DIRECTION_DESCENDING +.end rust_psm_stack_direction +.rust_psm_stack_direction_end: +.size rust_psm_stack_direction,.rust_psm_stack_direction_end-rust_psm_stack_direction +.cfi_endproc + + +.globl rust_psm_stack_pointer +.p2align 3 +.type rust_psm_stack_pointer,@function +.ent rust_psm_stack_pointer +/* extern "C" fn() -> *mut u8 */ +rust_psm_stack_pointer: +.cfi_startproc + jr $31 + move $2, $29 +.end rust_psm_stack_pointer +.rust_psm_stack_pointer_end: +.size rust_psm_stack_pointer,.rust_psm_stack_pointer_end-rust_psm_stack_pointer +.cfi_endproc + + + +.globl rust_psm_replace_stack +.p2align 3 +.type rust_psm_replace_stack,@function +.ent rust_psm_replace_stack +/* extern "C" fn(r4: usize, r5: extern "C" fn(usize), r6: *mut u8) */ +rust_psm_replace_stack: +.cfi_startproc + move $25, $5 + jr $5 + move $29, $6 +.end rust_psm_replace_stack +.rust_psm_replace_stack_end: +.size rust_psm_replace_stack,.rust_psm_on_stack_end-rust_psm_on_stack +.cfi_endproc + + +.globl rust_psm_on_stack +.p2align 3 +.type rust_psm_on_stack,@function +.ent rust_psm_on_stack +/* extern "C" fn(r4: usize, r5: usize, r6: extern "C" fn(usize), r7: *mut u8) */ +rust_psm_on_stack: +.cfi_startproc + sd $29, -8($7) + sd $31, -16($7) + .cfi_def_cfa 7, 0 + .cfi_offset 31, -16 + .cfi_offset 29, -8 + move $25, $6 + jalr $31, $6 + daddiu $29, $7, -16 + .cfi_def_cfa 29, 16 + ld $31, 0($29) + .cfi_restore 31 + ld $29, 8($29) + .cfi_restore 29 + jr $31 + nop +.end rust_psm_on_stack +.rust_psm_on_stack_end: +.size rust_psm_on_stack,.rust_psm_on_stack_end-rust_psm_on_stack +.cfi_endproc |