1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
.macro NESTED_ENTRY Name, Section, Handler
LEAF_ENTRY \Name, \Section
.ifnc \Handler, NoHandler
.cfi_personality 0, C_FUNC(\Handler) // 0 == DW_EH_PE_absptr
.endif
.endm
.macro NESTED_END Name, Section
LEAF_END \Name, \Section
.endm
.macro PATCH_LABEL Name
.global C_FUNC(\Name)
C_FUNC(\Name):
.endm
.macro ALTERNATE_ENTRY Name
.global C_FUNC(\Name)
C_FUNC(\Name):
.endm
.macro LEAF_ENTRY Name, Section
.global C_FUNC(\Name)
.type \Name, %function
C_FUNC(\Name):
.cfi_startproc
.endm
.macro LEAF_END Name, Section
.size \Name, .-\Name
.cfi_endproc
.endm
.macro PREPARE_EXTERNAL_VAR Name, HelperReg
ldr \HelperReg, [pc, #C_FUNC(\Name)@GOTPCREL]
.endm
.macro PROLOG_STACK_ALLOC Size
sub sp, sp, \Size
.cfi_adjust_cfa_offset \Size
.endm
.macro EPILOG_STACK_FREE Size
add sp, sp, \Size
.endm
.macro EPILOG_STACK_RESTORE
mov sp, fp
.endm
.macro PROLOG_SAVE_REG reg, ofs
str \reg, [sp, \ofs]
.endm
.macro PROLOG_SAVE_REG_PAIR reg1, reg2, ofs
stp \reg1, \reg2, [sp, \ofs]
.ifc \reg1, fp
mov fp, sp
.endif
.endm
.macro PROLOG_SAVE_REG_PAIR_INDEXED reg1, reg2, ofs
stp \reg1, \reg2, [sp, \ofs]!
.ifc \reg1, fp
mov fp, sp
.endif
.endm
.macro EPILOG_RESTORE_REG reg, ofs
ldr \reg, [sp, \ofs]
.endm
.macro EPILOG_RESTORE_REG_PAIR reg1, reg2, ofs
ldp \reg1, \reg2, [sp, \ofs]
.endm
.macro EPILOG_RESTORE_REG_PAIR_INDEXED reg1, reg2, ofs
ldp \reg1, \reg2, [sp], \ofs
.endm
.macro EPILOG_RETURN
ret
.endm
.macro EMIT_BREAKPOINT
brk #0
.endm
//-----------------------------------------------------------------------------
// The Following sets of SAVE_*_REGISTERS expect the memory to be reserved and
// base address to be passed in $reg
//
// Reserve 64 bytes of memory before calling SAVE_ARGUMENT_REGISTERS
.macro SAVE_ARGUMENT_REGISTERS reg, ofs
stp x0, x1, [\reg, #(\ofs)]
stp x2, x3, [\reg, #(\ofs + 16)]
stp x4, x5, [\reg, #(\ofs + 32)]
stp x6, x7, [\reg, #(\ofs + 48)]
.endm
// Reserve 64 bytes of memory before calling SAVE_FLOAT_ARGUMENT_REGISTERS
.macro SAVE_FLOAT_ARGUMENT_REGISTERS reg, ofs
stp d0, d1, [\reg, #(\ofs)]
stp d2, d3, [\reg, #(\ofs + 16)]
stp d4, d5, [\reg, #(\ofs + 32)]
stp d6, d7, [\reg, #(\ofs + 48)]
.endm
.macro RESTORE_ARGUMENT_REGISTERS reg, ofs
ldp x0, x1, [\reg, #(\ofs)]
ldp x2, x3, [\reg, #(\ofs + 16)]
ldp x4, x5, [\reg, #(\ofs + 32)]
ldp x6, x7, [\reg, #(\ofs + 48)]
.endm
.macro RESTORE_FLOAT_ARGUMENT_REGISTERS reg, ofs
ldp d0, d1, [\reg, #(\ofs)]
ldp d2, d3, [\reg, #(\ofs + 16)]
ldp d4, d5, [\reg, #(\ofs + 32)]
ldp d6, d7, [\reg, #(\ofs + 48)]
.endm
.macro EPILOG_BRANCH_REG reg
br \reg
.endm
|