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