bfd/
[binutils.git] / ld / testsuite / ld-mips-elf / mips16-pic-1.inc
blob9268a074fe2892515bf7f6ababc3679dc559a80d
1         # Declare a function called NAME and an __fn_NAME stub for it.
2         # Make the stub use la_TYPE to load the 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
14         .set    mips16
15         .text
16         .ent    \name
17 \name:
18 __fn_local_\name:
19         jr      $31
20         nop
21         .end    \name
22         .endm
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
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
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
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
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
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
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
76         # Likewise, but for non-MIPS16 code.
77         .macro  cpload_nomips16
78         .cpload $25
79         move    $2,$28
80         .endm
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
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
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
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
124 callpic_\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
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
138 jals_\name\()_\mode:
139         .option pic0
140         jal     a_\name
141         nop
143         jal     b_\name
144         nop
145         .option pic2
146         .end    jals_\name\()_\mode
147         .endm