perf: Key the interpreter symbol cache by Name rather than FastString
[ghc.git] / rts / StgCRunAsm.S
blobee0e24f059972d8bb3d9c0ee8133f6c4e74e5ba1
1 #include "ghcconfig.h"
2 #include "rts/Constants.h"
4 /* If the RTS mini interpreter is used, e.g. for unregisterised builds,
5  * then functions StgRun/StgReturn are implemented in file StgCRun.c */
6 #if !defined(USE_MINIINTERPRETER)
8 #if defined(powerpc64le_HOST_ARCH) || defined(powerpc64_HOST_ARCH)
9 # if defined(_CALL_ELF) && _CALL_ELF == 2
10 /* 64-bit PowerPC ELF V2 ABI Revision 1.5
11  *
12  * Stack frame organization (see Figure 2.18, ELF V2 ABI Revision 1.5, p 34)
13  *
14  * +-> Back Chain (points to the prevoius stack frame)
15  * |   Floating point register save area (f14-f31)
16  * |   General register save area (r14-r31)
17  * |   ... unused (optional) save areas (size 0)
18  * |   Local variable space
19  * |   Parameter save area (8 doublewords)
20  * |   ... stack header (TOC, LR, CR)
21  * +-- Back chain           <---- SP (r1)
22  *
23  * We save all callee-saves general purpose registers (r14-r31, _savegpr1_14)
24  * and all callee-saves floating point registers (f14-31, _savefpr14) and
25  * the return address of the caller (LR), which is saved in the caller's
26  * stack frame as required by the ABI. We only modify the CR0 and CR1 fields
27  * of the condition register and those are caller-saves, so we don't save CR.
28  *
29  * StgReturn restores all saved registers from their respective locations
30  * on the stack before returning to the caller.
31  *
32  * There is no need to save the TOC register (r2) because we will return
33  * through StgReturn. All calls to StgReturn will be to the global entry
34  * point and we compute the TOC from the entry address of StgReturn, which
35  * is required to be in r12 by the ABI.
36  */
37 # define STACK_FRAME_SIZE (RESERVED_C_STACK_BYTES+288+15) & ~15
38         .file   "StgCRun.c"
39         .abiversion 2
40         .section        ".toc","aw"
41         .section        ".text"
42         .align 2
43         .globl StgRun
44         .hidden StgRun
45         .type StgRun,@function
46 StgRun:
47         .localentry StgRun,.-StgRun
48         mflr 0
49         addi 12,1,-(8*18)
50         bl _savegpr1_14
51         bl _savefpr_14
52         stdu 1, -(STACK_FRAME_SIZE)(1)
53         mr 27, 4
54         mtctr 3
55         mr 12, 3
56         bctr
58         .globl StgReturn
59         .type StgReturn,@function
60 StgReturn:
61         addis 2,12,.TOC.-StgReturn@ha
62         addi 2,2,.TOC.-StgReturn@l
63         .localentry StgReturn,.-StgReturn
64         mr 3,14
65         la 1, STACK_FRAME_SIZE(1)
66         addi 12,1,-(8*18)
67         bl _restgpr1_14
68         b _restfpr_14
70         .section        .note.GNU-stack,"",@progbits
71 # else // Not ELF v2
72        // ELF v1 is in StgCrun.c
73 # endif
75 #elif defined(powerpc_HOST_ARCH)
76 # if defined(aix_HOST_OS)
77 # define STACK_FRAME_SIZE RESERVED_C_STACK_BYTES+224
78         .toc
79         .csect StgRun[DS]
80         .globl StgRun[DS]
81         .long .StgRun, TOC[TC0], 0
82         .csect .text[PR]
83         .globl .StgRun
84 .StgRun:
85         mflr  0
86         mr    5,1
87         stw   0,8(1)
88         stwu  1,-(STACK_FRAME_SIZE)(1)
89         stw   2,-224(5)
90         stmw 13,-220(5)
91         stfd 14,-144(5)
92         stfd 15,-136(5)
93         stfd 16,-128(5)
94         stfd 17,-120(5)
95         stfd 18,-112(5)
96         stfd 19,-104(5)
97         stfd 20,-96(5)
98         stfd 21,-88(5)
99         stfd 22,-80(5)
100         stfd 23,-72(5)
101         stfd 24,-64(5)
102         stfd 25,-56(5)
103         stfd 26,-48(5)
104         stfd 27,-40(5)
105         stfd 28,-32(5)
106         stfd 29,-24(5)
107         stfd 30,-16(5)
108         stfd 31,-8(5)
109         mr   27,4
110         mtctr 3
111         bctr
113         .globl StgReturn
114 StgReturn:
115         mr   3,14
116         la   5,(STACK_FRAME_SIZE)(1)
117         lwz  2,-224(5)
118         lmw 13,-220(5)
119         lfd 14,-144(5)
120         lfd 15,-136(5)
121         lfd 16,-128(5)
122         lfd 17,-120(5)
123         lfd 18,-112(5)
124         lfd 19,-104(5)
125         lfd 20,-96(5)
126         lfd 21,-88(5)
127         lfd 22,-80(5)
128         lfd 23,-72(5)
129         lfd 24,-64(5)
130         lfd 25,-56(5)
131         lfd 26,-48(5)
132         lfd 27,-40(5)
133         lfd 28,-32(5)
134         lfd 29,-24(5)
135         lfd 30,-16(5)
136         lfd 31,-8(5)
137         mr   1,5
138         lwz  0,8(1)
139         mtlr 0
140         blr
142 # endif // aix_HOST_OS
144 #elif defined(s390x_HOST_ARCH)
145 # define STACK_FRAME_SIZE (RESERVED_C_STACK_BYTES+160)
146         .text
147         .align 8
148         .globl StgRun
149         .type StgRun, @function
150 StgRun:
151         .cfi_startproc
152         /* save callee-saved registers */
153         stmg %r6,%r14,16(%r15)
154         std  %f8,     88(%r15)
155         std  %f9,     96(%r15)
156         std  %f10,   104(%r15)
157         std  %f11,   112(%r15)
158         std  %f12,   120(%r15)
159         std  %f13,   128(%r15)
160         std  %f14,   136(%r15)
161         std  %f15,   144(%r15)
162         .cfi_offset  6, -144
163         .cfi_offset  7, -136
164         .cfi_offset  8, -128
165         .cfi_offset  9, -120
166         .cfi_offset 10, -112
167         .cfi_offset 11, -104
168         .cfi_offset 12,  -96
169         .cfi_offset 13,  -88
170         .cfi_offset 14,  -80
171         .cfi_offset 15,  -72
172         .cfi_offset 24,  -64
173         .cfi_offset 28,  -56
174         .cfi_offset 25,  -48
175         .cfi_offset 29,  -40
176         .cfi_offset 26,  -32
177         .cfi_offset 30,  -24
178         .cfi_offset 27,  -16
179         .cfi_offset 31,   -8
180         /* allocate stack frame */
181         aghi %r15,-STACK_FRAME_SIZE
182         .cfi_def_cfa_offset -(STACK_FRAME_SIZE+160)
183         /* set STGs BaseReg from S390Xs r3 */
184         lgr  %r7,%r3
185         /* jump to STG function */
186         br   %r2
187         .cfi_endproc
188         .size StgRun, .-StgRun
190         .text
191         .align 8
192         .globl StgReturn
193         .type StgReturn, @function
194 StgReturn:
195         .cfi_startproc
196         /* set return value from STGs R1 (S390Xs r11) */
197         lgr  %r2,%r11
198         /* deallocate stack frame */
199         aghi %r15,STACK_FRAME_SIZE
200         .cfi_def_cfa_offset (STACK_FRAME_SIZE+160)
201         /* restore callee-saved registers */
202         lmg  %r6,%r14, 16(%r15)
203         ld   %f8,      88(%r15)
204         ld   %f9,      96(%r15)
205         ld   %f10,    104(%r15)
206         ld   %f11,    112(%r15)
207         ld   %f12,    120(%r15)
208         ld   %f13,    128(%r15)
209         ld   %f14,    136(%r15)
210         ld   %f15,    144(%r15)
211         .cfi_restore  6
212         .cfi_restore  7
213         .cfi_restore  8
214         .cfi_restore  9
215         .cfi_restore 10
216         .cfi_restore 11
217         .cfi_restore 12
218         .cfi_restore 13
219         .cfi_restore 14
220         .cfi_restore 24
221         .cfi_restore 28
222         .cfi_restore 25
223         .cfi_restore 29
224         .cfi_restore 26
225         .cfi_restore 30
226         .cfi_restore 27
227         .cfi_restore 31
228         .cfi_def_cfa 15, 160
229         /* jump back to caller of StgRun() */
230         br   %r14
231         .cfi_endproc
232         .size StgReturn, .-StgReturn
234 #elif defined(riscv64_HOST_ARCH)
235 # define STACK_FRAME_SIZE (RESERVED_C_STACK_BYTES+208)
236         .text
237         .align 1
238         .globl StgRun
239         .type StgRun, @function
240 StgRun:
241         .cfi_startproc
242         addi    sp,sp,-208
243         .cfi_def_cfa_offset 208
244         /* save callee-saved registers plus ra */
245         sd      ra,200(sp)
246         sd      s0,192(sp)
247         sd      s1,184(sp)
248         sd      s2,176(sp)
249         sd      s3,168(sp)
250         sd      s4,160(sp)
251         sd      s5,152(sp)
252         sd      s6,144(sp)
253         sd      s7,136(sp)
254         sd      s8,128(sp)
255         sd      s9,120(sp)
256         sd      s10,112(sp)
257         sd      s11,104(sp)
258         fsd     fs0,88(sp)
259         fsd     fs1,80(sp)
260         fsd     fs2,72(sp)
261         fsd     fs3,64(sp)
262         fsd     fs4,56(sp)
263         fsd     fs5,48(sp)
264         fsd     fs6,40(sp)
265         fsd     fs7,32(sp)
266         fsd     fs8,24(sp)
267         fsd     fs9,16(sp)
268         fsd     fs10,8(sp)
269         fsd     fs11,0(sp)
270         /* allocate stack frame */
271         li      t0,RESERVED_C_STACK_BYTES
272         sub     sp,sp,t0
273         .cfi_def_cfa_offset STACK_FRAME_SIZE
274         .cfi_offset 1, -8
275         .cfi_offset 8, -16
276         .cfi_offset 9, -24
277         .cfi_offset 18, -32
278         .cfi_offset 19, -40
279         .cfi_offset 20, -48
280         .cfi_offset 21, -56
281         .cfi_offset 22, -64
282         .cfi_offset 23, -72
283         .cfi_offset 24, -80
284         .cfi_offset 25, -88
285         .cfi_offset 26, -96
286         .cfi_offset 27, -104
287         .cfi_offset 40, -120
288         .cfi_offset 41, -128
289         .cfi_offset 50, -136
290         .cfi_offset 51, -144
291         .cfi_offset 52, -152
292         .cfi_offset 53, -160
293         .cfi_offset 54, -168
294         .cfi_offset 55, -176
295         .cfi_offset 56, -184
296         .cfi_offset 57, -192
297         .cfi_offset 58, -200
298         .cfi_offset 59, -208
299         /* set STGs BaseReg from RISCV a1 */
300         mv      s1,a1
301         /* jump to STG function */
302         jr      a0
303         .cfi_endproc
304         .size StgRun, .-StgRun
306         .text
307         .align 1
308         .globl StgReturn
309         .type StgReturn, @function
310 StgReturn:
311         .cfi_startproc
312         /* set return value from STGs R1 (RISCV s4) */
313         mv      a0,s4
314         /* deallocate stack frame */
315         li      t0,RESERVED_C_STACK_BYTES
316         add     sp,sp,t0
317         .cfi_def_cfa_offset 208
318         /* restore callee-saved registers and ra */
319         ld      ra,200(sp)
320         .cfi_restore 1
321         ld      s0,192(sp)
322         .cfi_restore 8
323         ld      s1,184(sp)
324         .cfi_restore 9
325         ld      s2,176(sp)
326         .cfi_restore 18
327         ld      s3,168(sp)
328         .cfi_restore 19
329         ld      s4,160(sp)
330         .cfi_restore 20
331         ld      s5,152(sp)
332         .cfi_restore 21
333         ld      s6,144(sp)
334         .cfi_restore 22
335         ld      s7,136(sp)
336         .cfi_restore 23
337         ld      s8,128(sp)
338         .cfi_restore 24
339         ld      s9,120(sp)
340         .cfi_restore 25
341         ld      s10,112(sp)
342         .cfi_restore 26
343         ld      s11,104(sp)
344         .cfi_restore 27
345         fld     fs0,88(sp)
346         .cfi_restore 40
347         fld     fs1,80(sp)
348         .cfi_restore 41
349         fld     fs2,72(sp)
350         .cfi_restore 50
351         fld     fs3,64(sp)
352         .cfi_restore 51
353         fld     fs4,56(sp)
354         .cfi_restore 52
355         fld     fs5,48(sp)
356         .cfi_restore 53
357         fld     fs6,40(sp)
358         .cfi_restore 54
359         fld     fs7,32(sp)
360         .cfi_restore 55
361         fld     fs8,24(sp)
362         .cfi_restore 56
363         fld     fs9,16(sp)
364         .cfi_restore 57
365         fld     fs10,8(sp)
366         .cfi_restore 58
367         fld     fs11,0(sp)
368         .cfi_restore 59
369         addi    sp,sp,208
370         .cfi_def_cfa_offset 0
371         /* jump back to caller of StgRun() */
372         ret
373         .cfi_endproc
374         .size StgReturn, .-StgReturn
376 #elif defined(loongarch64_HOST_ARCH)
377 # define STACK_FRAME_SIZE (RESERVED_C_STACK_BYTES+160)
378         .text
379         .align 1
380         .globl StgRun
381         .type StgRun, @function
382 StgRun:
383         .cfi_startproc
384         addi.d  $sp,$sp,-160
385         .cfi_def_cfa_offset 160
386         /* save callee-saved registers plus ra */
387         st.d    $ra,$sp,152
388         st.d    $fp,$sp,144
389         st.d    $s0,$sp,136
390         st.d    $s1,$sp,128
391         st.d    $s2,$sp,120
392         st.d    $s3,$sp,112
393         st.d    $s4,$sp,104
394         st.d    $s5,$sp,96
395         st.d    $s6,$sp,88
396         st.d    $s7,$sp,80
397         st.d    $s8,$sp,72
398         fst.d   $fs0,$sp,56
399         fst.d   $fs1,$sp,48
400         fst.d   $fs2,$sp,40
401         fst.d   $fs3,$sp,32
402         fst.d   $fs4,$sp,24
403         fst.d   $fs5,$sp,16
404         fst.d   $fs6,$sp,8
405         fst.d   $fs7,$sp,0
406         /* allocate stack frame */
407         li.d    $t0,RESERVED_C_STACK_BYTES
408         sub.d   $sp,$sp,$t0
409         .cfi_def_cfa_offset STACK_FRAME_SIZE
410         .cfi_offset 1, -8
411         .cfi_offset 22, -16
412         .cfi_offset 23, -24
413         .cfi_offset 24, -32
414         .cfi_offset 25, -40
415         .cfi_offset 26, -48
416         .cfi_offset 27, -56
417         .cfi_offset 28, -64
418         .cfi_offset 29, -72
419         .cfi_offset 30, -80
420         .cfi_offset 31, -88
421         .cfi_offset 56, -104
422         .cfi_offset 57, -112
423         .cfi_offset 58, -120
424         .cfi_offset 59, -128
425         .cfi_offset 60, -136
426         .cfi_offset 61, -144
427         .cfi_offset 62, -152
428         .cfi_offset 63, -160
429         /* set STGs BaseReg from LoongArch a1 */
430         move    $s0,$a1
431         /* jump to STG function */
432         jr      $a0
433         .cfi_endproc
434         .size StgRun, .-StgRun
436         .text
437         .align 2
438         .globl StgReturn
439         .type StgReturn, @function
440 StgReturn:
441         .cfi_startproc
442         /* set return value from STGs R1 (LoongArch64 s3) */
443         move    $a0,$s3
444         /* deallocate stack frame */
445         li.d    $t0,RESERVED_C_STACK_BYTES
446         add.d   $sp,$sp,$t0
447         .cfi_def_cfa_offset 160
448         /* restore callee-saved registers and ra */
449         ld.d    $ra,$sp,152
450         .cfi_restore 1
451         ld.d    $fp,$sp,144
452         .cfi_restore 22
453         ld.d    $s0,$sp,136
454         .cfi_restore 23
455         ld.d    $s1,$sp,128
456         .cfi_restore 24
457         ld.d    $s2,$sp,120
458         .cfi_restore 25
459         ld.d    $s3,$sp,112
460         .cfi_restore 26
461         ld.d    $s4,$sp,104
462         .cfi_restore 27
463         ld.d    $s5,$sp,96
464         .cfi_restore 28
465         ld.d    $s6,$sp,88
466         .cfi_restore 29
467         ld.d    $s7,$sp,80
468         .cfi_restore 30
469         ld.d    $s8,$sp,72
470         .cfi_restore 31
471         fld.d   $fs0,$sp,56
472         .cfi_restore 56
473         fld.d   $fs1,$sp,48
474         .cfi_restore 57
475         fld.d   $fs2,$sp,40
476         .cfi_restore 58
477         fld.d   $fs3,$sp,32
478         .cfi_restore 59
479         fld.d   $fs4,$sp,24
480         .cfi_restore 60
481         fld.d   $fs5,$sp,16
482         .cfi_restore 61
483         fld.d   $fs6,$sp,8
484         .cfi_restore 62
485         fld.d   $fs7,$sp,0
486         .cfi_restore 63
487         addi.d  $sp,$sp,160
488         .cfi_def_cfa_offset 0
489         /* jump back to caller of StgRun() */
490         ret
491         .cfi_endproc
492         .size StgReturn, .-StgReturn
494         .section        .note.GNU-stack,"",@progbits
495 #endif
497 #endif /* !USE_MINIINTERPRETER */
499 /* mark stack as nonexecutable */
500 #if defined(HAVE_GNU_NONEXEC_STACK)
501 .section .note.GNU-stack,"",@progbits
502 #endif