summaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-mips-elf/mips16-pic-1.inc
diff options
context:
space:
mode:
Diffstat (limited to 'ld/testsuite/ld-mips-elf/mips16-pic-1.inc')
-rw-r--r--ld/testsuite/ld-mips-elf/mips16-pic-1.inc147
1 files changed, 147 insertions, 0 deletions
diff --git a/ld/testsuite/ld-mips-elf/mips16-pic-1.inc b/ld/testsuite/ld-mips-elf/mips16-pic-1.inc
new file mode 100644
index 0000000000..9268a074fe
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/mips16-pic-1.inc
@@ -0,0 +1,147 @@
+ # Declare a function called NAME and an __fn_NAME stub for it.
+ # Make the stub use la_TYPE to load the 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