# Declare a function called NAME and an __fn_NAME stub for it.
	# Make the stub use la_TYPE to load the target address into $2.
	.macro	stub,name,type
	.set	nomips16
	.section .mips16.fn.\name, "ax", @progbits
	.ent	__fn_\name
__fn_\name:
	la_\type \name
	mfc1	$4,$f12
	jr	$2
	nop
	.end	__fn_\name

	.set	mips16
	.text
	.ent	\name
\name:
__fn_local_\name:
	jr	$31
	nop
	.end	\name
	.endm

	# Like stub, but ensure NAME is a local symbol.
	.macro	lstub,name,type
	stub	\name, \type
	.equ	local_\name,1
	.endm

	# Like stub, but ensure NAME is a hidden symbol.
	.macro	hstub,name,type
	.globl	\name
	.hidden	\name
	stub	\name, \type
	.endm

	# Like lstub, but make the MIPS16 function global rather than local.
	.macro	gstub,name,type
	.globl	\name
	stub	\name, \type
	.endm

	# Use an absolute sequence to load NAME into a register.
	.macro	la_noshared,name
	lui	$2,%hi(\name)
	addiu	$2,$2,%lo(\name)
	.endm

	# Use the normal PIC sequence to load __fn_local_NAME into $2
	# and emit a dummy relocation against NAME.  This macro is always
	# used at the start of a function.
	.macro	la_shared,name
	.reloc	0,R_MIPS_NONE,\name
	.cpload	$25
	la	$2,__fn_local_\name
	.endm

	# Use TYPE (either LSTUB, HSTUB or GSTUB) to define functions
	# called a_NAME and b_NAME.  The former uses absolute accesses
	# and the latter uses PIC accesses.
	.macro	decl,name,type
	\type	a_\name, noshared
	\type	b_\name, shared
	.endm

	# Emit the MIPS16 PIC sequence for setting $28 from $25.
	# Make the value of $25 available in $2 as well.
	.macro	cpload_mips16
	li	$2,%hi(_gp_disp)
	addiu	$3,$pc,%lo(_gp_disp)
	sll	$2,16
	addu	$2,$2,$3
	move	$28,$2
	.endm

	# Likewise, but for non-MIPS16 code.
	.macro	cpload_nomips16
	.cpload	$25
	move	$2,$28
	.endm

	# Start a PIC function in ISA mode MODE, which is either "mips16"
	# or "nomips16".
	.macro	pic_prologue,mode
	cpload_\mode
	addiu	$sp,$sp,-32
	sw	$2,16($sp)
	sw	$31,20($sp)
	.endm

	# Use a PIC function to call NAME.
	.macro	pic_call,name,mode
	.ifdef	local_\name
	.ifc	\mode,mips16
	lw	$2,%got(__fn_local_\name)($2)
	addiu	$2,%lo(__fn_local_\name)
	.else
	lw	$2,%got(\name)($2)
	addiu	$2,%lo(\name)
	.endif
	.else
	lw	$2,%call16(\name)($2)
	.endif
	jalr	$2
	move	$25,$2
	lw	$2,16($sp)
	move	$28,$2
	.endm

	# Finish a PIC function started by pic_prologue.
	.macro	pic_epilogue
	lw	$2,20($sp)
	jr	$2
	addiu	$sp,$sp,32
	.endm

	# Use PIC %call16 sequences to call a_NAME and b_NAME.
	# MODE selects the ISA mode of the code: either "mips16"
	# or "nomips16".
	.macro	callpic,name,mode
	.text
	.set	\mode
	.ent	callpic_\name\()_\mode
callpic_\name\()_\mode:
	pic_prologue \mode
	pic_call     a_\name,\mode
	pic_call     b_\name,\mode
	pic_epilogue
	.end	callpic_\name\()_\mode
	.endm

	# Use absolute jals to call a_NAME and b_NAME.  MODE selects the
	# ISA mode of the code: either "mips16" or "nomips16".
	.macro	jals,name,mode
	.text
	.set	\mode
	.ent	jals_\name\()_\mode
jals_\name\()_\mode:
	.option	pic0
	jal	a_\name
	nop

	jal	b_\name
	nop
	.option	pic2
	.end	jals_\name\()_\mode
	.endm