annotate dyncallback/dyncall_callback_mips_eabi_gas.s @ 457:90b1d927912a

- suite_aggrs: make sure random memory used doesn't ever result in NaN fp values (for every possible address), as this messes with result comparison
author Tassilo Philipp
date Fri, 28 Jan 2022 14:11:21 +0100
parents 9e4f1355a388
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
94
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
1 /*
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
2
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
3 Package: dyncall
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
4 Library: dyncallback
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
5 File: dyncallback/dyncall_callback_mips_eabi_gas.s
101
1ce60358fbad - mips related cleanup, mostly comments, cpp macro lib
cslag
parents: 94
diff changeset
6 Description: Callback Thunk - Implementation for mips32 eabi
94
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
7 License:
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
8
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
9 Copyright (c) 2016 Tassilo Philipp <tphilipp@potion-studios.com>
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
10
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
11 Permission to use, copy, modify, and distribute this software for any
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
12 purpose with or without fee is hereby granted, provided that the above
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
13 copyright notice and this permission notice appear in all copies.
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
14
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
15 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
16 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
17 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
18 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
22
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
23 */
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
24
156
9e4f1355a388 - cosmetics
cslag
parents: 110
diff changeset
25 /* input:
9e4f1355a388 - cosmetics
cslag
parents: 110
diff changeset
26 $t4 -> thunk
9e4f1355a388 - cosmetics
cslag
parents: 110
diff changeset
27 $t4+20 -> cb handler
9e4f1355a388 - cosmetics
cslag
parents: 110
diff changeset
28 $t4+24 -> userdata
9e4f1355a388 - cosmetics
cslag
parents: 110
diff changeset
29 */
110
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
30
156
9e4f1355a388 - cosmetics
cslag
parents: 110
diff changeset
31 .text
9e4f1355a388 - cosmetics
cslag
parents: 110
diff changeset
32 .globl dcCallbackThunkEntry
9e4f1355a388 - cosmetics
cslag
parents: 110
diff changeset
33 .ent dcCallbackThunkEntry
110
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
34
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
35 /* Called by thunk - thunk stores pointer to DCCallback in $12 ($t4), and */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
36 /* pointer to called function in $25 ($t9, required for PIC) */
94
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
37 dcCallbackThunkEntry:
110
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
38 .set noreorder
94
ea17e6e6bd3a - stubs for mips callback support
cslag
parents:
diff changeset
39
110
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
40 /* Prolog. */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
41 /* Frame size of 88b comes from following: */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
42 /* DCargs(fregs:32 + iregs:32 + regcounts:4 + stackptr:4) + retval:8 + ra:4 (+ pad:4) */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
43 subu $sp, 88 /* open frame */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
44 sw $ra, 84($sp) /* save link register */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
45
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
46 .frame $fp,88,$31 /* specify our frame: fp,size,lr; creates virt $fp */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
47 /* code below doesn't use $fp though, as n/a with -O1 */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
48 /* Init return value */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
49 sw $zero, 72($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
50 sw $zero, 76($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
51
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
52 /* Store float and int args where our DCargs member arrays are, in local area. */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
53 sw $4, 0($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
54 sw $5, 4($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
55 sw $6, 8($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
56 sw $7, 12($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
57 sw $8, 16($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
58 sw $9, 20($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
59 sw $10, 24($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
60 sw $11, 28($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
61 s.s $f12, 32($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
62 s.s $f13, 36($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
63 s.s $f14, 40($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
64 s.s $f15, 44($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
65 s.s $f16, 48($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
66 s.s $f17, 52($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
67 s.s $f18, 56($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
68 s.s $f19, 60($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
69
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
70 /* Init DCarg's reg_counts and stackptr. */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
71 sw $zero, 64($sp) /* reg_count */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
72 addiu $4, $sp, 88
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
73 sw $4, 68($sp) /* stackptr */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
74
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
75 /* Prepare callback handler call. */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
76 move $4, $12 /* Param 0 = DCCallback*, $12 ($t4) holds pointer to thunk */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
77 move $5, $sp /* Param 1 = DCArgs*, pointer to where pointer to args is stored */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
78 addiu $6, $sp, 72 /* Param 2 = results pointer to 8b of local data on stack */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
79 lw $7, 24($12) /* Param 3 = userdata pointer */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
80
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
81 lw $25, 20($12) /* store handler entry in $25 ($t9), required for PIC */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
82 jalr $25 /* jump */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
83 nop /* branch delay nop */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
84
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
85 /* Copy result in corresponding registers $2-$3 ($v0-$v1) and $f0 */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
86 lw $2, 72($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
87 lw $3, 76($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
88 l.d $f0, 72($sp)
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
89
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
90 /* Epilog. Tear down frame and return. */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
91 lw $ra, 84($sp) /* restore return address */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
92 addiu $sp, $sp, 88 /* close frame */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
93 j $ra /* return */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
94 nop /* branch delay nop */
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
95
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
96 .set reorder
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
97 .end dcCallbackThunkEntry
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
98 .ident "handwritten"
9aa75a74614c - working mips32 eabi callbacks
cslag
parents: 101
diff changeset
99