1	# Declare a function called NAME and an __fn_NAME stub for it.
2	# Make the stub use la_TYPE to load the target address into $2.
3	.macro	stub,name,type
4	.set	nomips16
5	.section .mips16.fn.\name, "ax", @progbits
6	.ent	__fn_\name
7__fn_\name:
8	la_\type \name
9	mfc1	$4,$f12
10	jr	$2
11	nop
12	.end	__fn_\name
13
14	.set	mips16
15	.text
16	.ent	\name
17\name:
18__fn_local_\name:
19	jr	$31
20	nop
21	.end	\name
22	.endm
23
24	# Like stub, but ensure NAME is a local symbol.
25	.macro	lstub,name,type
26	stub	\name, \type
27	.equ	local_\name,1
28	.endm
29
30	# Like stub, but ensure NAME is a hidden symbol.
31	.macro	hstub,name,type
32	.globl	\name
33	.hidden	\name
34	stub	\name, \type
35	.endm
36
37	# Like lstub, but make the MIPS16 function global rather than local.
38	.macro	gstub,name,type
39	.globl	\name
40	stub	\name, \type
41	.endm
42
43	# Use an absolute sequence to load NAME into a register.
44	.macro	la_noshared,name
45	lui	$2,%hi(\name)
46	addiu	$2,$2,%lo(\name)
47	.endm
48
49	# Use the normal PIC sequence to load __fn_local_NAME into $2
50	# and emit a dummy relocation against NAME.  This macro is always
51	# used at the start of a function.
52	.macro	la_shared,name
53	.reloc	0,R_MIPS_NONE,\name
54	.cpload	$25
55	la	$2,__fn_local_\name
56	.endm
57
58	# Use TYPE (either LSTUB, HSTUB or GSTUB) to define functions
59	# called a_NAME and b_NAME.  The former uses absolute accesses
60	# and the latter uses PIC accesses.
61	.macro	decl,name,type
62	\type	a_\name, noshared
63	\type	b_\name, shared
64	.endm
65
66	# Emit the MIPS16 PIC sequence for setting $28 from $25.
67	# Make the value of $25 available in $2 as well.
68	.macro	cpload_mips16
69	li	$2,%hi(_gp_disp)
70	addiu	$3,$pc,%lo(_gp_disp)
71	sll	$2,16
72	addu	$2,$2,$3
73	move	$28,$2
74	.endm
75
76	# Likewise, but for non-MIPS16 code.
77	.macro	cpload_nomips16
78	.cpload	$25
79	move	$2,$28
80	.endm
81
82	# Start a PIC function in ISA mode MODE, which is either "mips16"
83	# or "nomips16".
84	.macro	pic_prologue,mode
85	cpload_\mode
86	addiu	$sp,$sp,-32
87	sw	$2,16($sp)
88	sw	$31,20($sp)
89	.endm
90
91	# Use a PIC function to call NAME.
92	.macro	pic_call,name,mode
93	.ifdef	local_\name
94	.ifc	\mode,mips16
95	lw	$2,%got(__fn_local_\name)($2)
96	addiu	$2,%lo(__fn_local_\name)
97	.else
98	lw	$2,%got(\name)($2)
99	addiu	$2,%lo(\name)
100	.endif
101	.else
102	lw	$2,%call16(\name)($2)
103	.endif
104	jalr	$2
105	move	$25,$2
106	lw	$2,16($sp)
107	move	$28,$2
108	.endm
109
110	# Finish a PIC function started by pic_prologue.
111	.macro	pic_epilogue
112	lw	$2,20($sp)
113	jr	$2
114	addiu	$sp,$sp,32
115	.endm
116
117	# Use PIC %call16 sequences to call a_NAME and b_NAME.
118	# MODE selects the ISA mode of the code: either "mips16"
119	# or "nomips16".
120	.macro	callpic,name,mode
121	.text
122	.set	\mode
123	.ent	callpic_\name\()_\mode
124callpic_\name\()_\mode:
125	pic_prologue \mode
126	pic_call     a_\name,\mode
127	pic_call     b_\name,\mode
128	pic_epilogue
129	.end	callpic_\name\()_\mode
130	.endm
131
132	# Use absolute jals to call a_NAME and b_NAME.  MODE selects the
133	# ISA mode of the code: either "mips16" or "nomips16".
134	.macro	jals,name,mode
135	.text
136	.set	\mode
137	.ent	jals_\name\()_\mode
138jals_\name\()_\mode:
139	.option	pic0
140	jal	a_\name
141	nop
142
143	jal	b_\name
144	nop
145	.option	pic2
146	.end	jals_\name\()_\mode
147	.endm
148