]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/compiler-rt/lib/xray/xray_trampoline_loongarch64.S
zfs: merge openzfs/zfs@86e115e21
[FreeBSD/FreeBSD.git] / contrib / llvm-project / compiler-rt / lib / xray / xray_trampoline_loongarch64.S
1 //===-- xray_trampoline_loongarch64.s ---------------------------*- ASM -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file is a part of XRay, a dynamic runtime instrumentation system.
10 //
11 // This implements the loongarch-specific assembler for the trampolines.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "../sanitizer_common/sanitizer_asm.h"
16
17 #define FROM_0_TO_7 0,1,2,3,4,5,6,7
18 #define FROM_7_TO_0 7,6,5,4,3,2,1,0
19
20 .macro SAVE_ARG_REGISTERS
21   .irp i,FROM_7_TO_0
22     st.d  $a\i, $sp, (8 * 8 + 8 * \i)
23   .endr
24   .irp i,FROM_7_TO_0
25     fst.d $f\i, $sp, (8 * \i)
26   .endr
27 .endm
28
29 .macro RESTORE_ARG_REGISTERS
30   .irp i,FROM_0_TO_7
31     fld.d $f\i, $sp, (8 * \i)
32   .endr
33   .irp i,FROM_0_TO_7
34     ld.d  $a\i, $sp, (8 * 8 + 8 * \i)
35   .endr
36 .endm
37
38 .macro SAVE_RET_REGISTERS
39   st.d    $a1, $sp, 24
40   st.d    $a0, $sp, 16
41   fst.d   $f1, $sp, 8
42   fst.d   $f0, $sp, 0
43 .endm
44
45 .macro RESTORE_RET_REGISTERS
46   fld.d   $f0, $sp, 0
47   fld.d   $f1, $sp, 8
48   ld.d    $a0, $sp, 16
49   ld.d    $a1, $sp, 24
50 .endm
51
52   .text
53   .file "xray_trampoline_loongarch64.S"
54   .globl ASM_SYMBOL(__xray_FunctionEntry)
55   ASM_HIDDEN(__xray_FunctionEntry)
56   .p2align 2
57   ASM_TYPE_FUNCTION(__xray_FunctionEntry)
58 ASM_SYMBOL(__xray_FunctionEntry):
59   .cfi_startproc
60   // Save argument registers before doing any actual work.
61   .cfi_def_cfa_offset 136
62   addi.d  $sp, $sp, -136
63   st.d    $ra, $sp, 128
64   .cfi_offset 1, -8
65   SAVE_ARG_REGISTERS
66
67   la.got  $t2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)
68   ld.d    $t2, $t2, 0
69
70   beqz    $t2, FunctionEntry_restore
71
72   // a1=0 means that we are tracing an entry event.
73   move    $a1, $zero
74   // Function ID is in t1 (the first parameter).
75   move    $a0, $t1
76   jirl    $ra, $t2, 0
77
78 FunctionEntry_restore:
79   // Restore argument registers.
80   RESTORE_ARG_REGISTERS
81   ld.d    $ra, $sp, 128
82   addi.d  $sp, $sp, 136
83   ret
84 FunctionEntry_end:
85   ASM_SIZE(__xray_FunctionEntry)
86   .cfi_endproc
87
88   .text
89   .globl ASM_SYMBOL(__xray_FunctionExit)
90   ASM_HIDDEN(__xray_FunctionExit)
91   .p2align 2
92   ASM_TYPE_FUNCTION(__xray_FunctionExit)
93 ASM_SYMBOL(__xray_FunctionExit):
94   .cfi_startproc
95   // Save return registers before doing any actual work.
96   .cfi_def_cfa_offset 48
97   addi.d  $sp, $sp, -48
98   st.d    $ra, $sp, 40
99   .cfi_offset 1, -8
100   st.d    $fp, $sp, 32
101   SAVE_RET_REGISTERS
102
103   la.got  $t2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)
104   ld.d    $t2, $t2, 0
105
106   beqz    $t2, FunctionExit_restore
107
108   // a1=1 means that we are tracing an exit event.
109   li.w    $a1, 1
110   // Function ID is in t1 (the first parameter).
111   move    $a0, $t1
112   jirl    $ra, $t2, 0
113
114 FunctionExit_restore:
115   // Restore return registers.
116   RESTORE_RET_REGISTERS
117   ld.d    $fp, $sp, 32
118   ld.d    $ra, $sp, 40
119   addi.d  $sp, $sp, 48
120   ret
121
122 FunctionExit_end:
123   ASM_SIZE(__xray_FunctionExit)
124   .cfi_endproc