1/*
2Not only MIPS has 20 different ABIs... nobody tells anybody what specific variant of which ABI is
3used where.
4
5This is an "EABI" implementation based on the following page:
6
7http://www.cygwin.com/ml/binutils/2003-06/msg00436.html
8*/
9
10#include "psm.h"
11
12.set noreorder /* we’ll manage the delay slots on our own, thanks! */
13
14.text
15.globl rust_psm_stack_direction
16.p2align 3
17.type rust_psm_stack_direction,@function
18.ent rust_psm_stack_direction
19/* extern "C" fn() -> u8 */
20rust_psm_stack_direction:
21.cfi_startproc
22    jr $31
23    addiu $2, $zero, STACK_DIRECTION_DESCENDING
24.end rust_psm_stack_direction
25.rust_psm_stack_direction_end:
26.size       rust_psm_stack_direction,.rust_psm_stack_direction_end-rust_psm_stack_direction
27.cfi_endproc
28
29
30.globl rust_psm_stack_pointer
31.p2align 3
32.type rust_psm_stack_pointer,@function
33.ent rust_psm_stack_pointer
34/* extern "C" fn() -> *mut u8 */
35rust_psm_stack_pointer:
36.cfi_startproc
37    jr $31
38    move $2, $29
39.end rust_psm_stack_pointer
40.rust_psm_stack_pointer_end:
41.size       rust_psm_stack_pointer,.rust_psm_stack_pointer_end-rust_psm_stack_pointer
42.cfi_endproc
43
44
45
46.globl rust_psm_replace_stack
47.p2align 3
48.type rust_psm_replace_stack,@function
49.ent rust_psm_replace_stack
50/* extern "C" fn(r4: usize, r5: extern "C" fn(usize), r6: *mut u8) */
51rust_psm_replace_stack:
52.cfi_startproc
53    move $25, $5
54    jr $5
55    move $29, $6
56.end rust_psm_replace_stack
57.rust_psm_replace_stack_end:
58.size       rust_psm_replace_stack,.rust_psm_on_stack_end-rust_psm_on_stack
59.cfi_endproc
60
61
62.globl rust_psm_on_stack
63.p2align 3
64.type rust_psm_on_stack,@function
65.ent rust_psm_on_stack
66/* extern "C" fn(r4: usize, r5: usize, r6: extern "C" fn(usize), r7: *mut u8) */
67rust_psm_on_stack:
68.cfi_startproc
69    sd $29, -8($7)
70    sd $31, -16($7)
71    .cfi_def_cfa 7, 0
72    .cfi_offset 31, -16
73    .cfi_offset 29, -8
74    move $25, $6
75    jalr $31, $6
76    daddiu $29, $7, -16
77    .cfi_def_cfa 29, 16
78    ld $31, 0($29)
79    .cfi_restore 31
80    ld $29, 8($29)
81    .cfi_restore 29
82    jr $31
83    nop
84.end rust_psm_on_stack
85.rust_psm_on_stack_end:
86.size       rust_psm_on_stack,.rust_psm_on_stack_end-rust_psm_on_stack
87.cfi_endproc
88