]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/compiler-rt/lib/xray/xray_trampoline_mips64.S
Merge compiler-rt trunk r366426, resolve conflicts, and add
[FreeBSD/FreeBSD.git] / contrib / compiler-rt / lib / xray / xray_trampoline_mips64.S
1 //===-- xray_trampoline_mips64.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 MIPS64-specific assembler for the trampolines.
12 //
13 //===----------------------------------------------------------------------===//
14
15   .text
16   .file "xray_trampoline_mips64.S"
17   .globl __xray_FunctionEntry
18   .p2align 2
19   .type __xray_FunctionEntry,@function
20 __xray_FunctionEntry:
21   .cfi_startproc
22   // Save argument registers before doing any actual work.
23   .cfi_def_cfa_offset 144
24   daddiu  $sp, $sp, -144
25   sd      $ra, 136($sp)
26   .cfi_offset 31, -8
27   sd      $gp, 128($sp)
28   sd      $a7, 120($sp)
29   sd      $a6, 112($sp)
30   sd      $a5, 104($sp)
31   sd      $a4, 96($sp)
32   sd      $a3, 88($sp)
33   sd      $a2, 80($sp)
34   sd      $a1, 72($sp)
35   sd      $a0, 64($sp)
36   sdc1    $f19, 56($sp)
37   sdc1    $f18, 48($sp)
38   sdc1    $f17, 40($sp)
39   sdc1    $f16, 32($sp)
40   sdc1    $f15, 24($sp)
41   sdc1    $f14, 16($sp)
42   sdc1    $f13, 8($sp)
43   sdc1    $f12, 0($sp)
44
45   lui     $gp, %hi(%neg(%gp_rel(__xray_FunctionEntry)))
46   daddu   $gp, $gp, $t9
47   daddiu  $gp ,$gp, %lo(%neg(%gp_rel(__xray_FunctionEntry)))
48
49   dla     $t9, _ZN6__xray19XRayPatchedFunctionE
50   ld      $t9, 0($t9)
51
52   beqz    $t9, FunctionEntry_restore
53
54   // a1=0 means that we are tracing an entry event
55   move    $a1, $zero
56   // Function ID is in t0 (the first parameter).
57   move    $a0, $t0
58   jalr    $t9
59
60 FunctionEntry_restore:
61   // Restore argument registers
62   ldc1    $f12, 0($sp)
63   ldc1    $f13, 8($sp)
64   ldc1    $f14, 16($sp)
65   ldc1    $f15, 24($sp)
66   ldc1    $f16, 32($sp)
67   ldc1    $f17, 40($sp)
68   ldc1    $f18, 48($sp)
69   ldc1    $f19, 56($sp)
70   ld      $a0, 64($sp)
71   ld      $a1, 72($sp)
72   ld      $a2, 80($sp)
73   ld      $a3, 88($sp)
74   ld      $a4, 96($sp)
75   ld      $a5, 104($sp)
76   ld      $a6, 112($sp)
77   ld      $a7, 120($sp)
78   ld      $gp, 128($sp)
79   ld      $ra, 136($sp)
80   daddiu  $sp, $sp, 144
81   jr      $ra
82 FunctionEntry_end:
83   .size __xray_FunctionEntry, FunctionEntry_end-__xray_FunctionEntry
84   .cfi_endproc
85
86   .text
87   .globl __xray_FunctionExit
88   .p2align 2
89   .type __xray_FunctionExit,@function
90 __xray_FunctionExit:
91   .cfi_startproc
92   // Save return registers before doing any actual work.
93   .cfi_def_cfa_offset 64
94   daddiu  $sp, $sp, -64
95   sd      $ra, 56($sp)
96   .cfi_offset 31, -8
97   sd      $gp, 48($sp)
98   sd      $a0, 40($sp)
99   sd      $v1, 32($sp)
100   sd      $v0, 24($sp)
101   sdc1    $f2, 16($sp)
102   sdc1    $f1, 8($sp)
103   sdc1    $f0, 0($sp)
104
105   lui     $gp, %hi(%neg(%gp_rel(__xray_FunctionExit)))
106   daddu   $gp, $gp, $t9
107   daddiu  $gp ,$gp, %lo(%neg(%gp_rel(__xray_FunctionExit)))
108
109   dla     $t9, _ZN6__xray19XRayPatchedFunctionE
110   ld      $t9, 0($t9)
111
112   beqz    $t9, FunctionExit_restore
113
114   // a1=1 means that we are tracing an exit event
115   li      $a1, 1
116   // Function ID is in t0 (the first parameter).
117   move    $a0, $t0
118   jalr    $t9
119
120 FunctionExit_restore:
121   // Restore return registers
122   ldc1    $f0, 0($sp)
123   ldc1    $f1, 8($sp)
124   ldc1    $f2, 16($sp)
125   ld      $v0, 24($sp)
126   ld      $v1, 32($sp)
127   ld      $a0, 40($sp)
128   ld      $gp, 48($sp)
129   ld      $ra, 56($sp)
130   daddiu  $sp, $sp, 64
131   jr      $ra
132
133 FunctionExit_end:
134   .size __xray_FunctionExit, FunctionExit_end-__xray_FunctionExit
135   .cfi_endproc