| //===-- xray_trampoline_mips64.s --------------------------------*- ASM -*-===// | 
 | // | 
 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
 | // See https://llvm.org/LICENSE.txt for license information. | 
 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | // | 
 | // This file is a part of XRay, a dynamic runtime instrumentation system. | 
 | // | 
 | // This implements the MIPS64-specific assembler for the trampolines. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 |   .text | 
 |   .file "xray_trampoline_mips64.S" | 
 |   .globl __xray_FunctionEntry | 
 |   .p2align 2 | 
 |   .type __xray_FunctionEntry,@function | 
 | __xray_FunctionEntry: | 
 |   .cfi_startproc | 
 |   // Save argument registers before doing any actual work. | 
 |   .cfi_def_cfa_offset 144 | 
 |   daddiu  $sp, $sp, -144 | 
 |   sd      $ra, 136($sp) | 
 |   .cfi_offset 31, -8 | 
 |   sd      $gp, 128($sp) | 
 |   sd      $a7, 120($sp) | 
 |   sd      $a6, 112($sp) | 
 |   sd      $a5, 104($sp) | 
 |   sd      $a4, 96($sp) | 
 |   sd      $a3, 88($sp) | 
 |   sd      $a2, 80($sp) | 
 |   sd      $a1, 72($sp) | 
 |   sd      $a0, 64($sp) | 
 |   sdc1    $f19, 56($sp) | 
 |   sdc1    $f18, 48($sp) | 
 |   sdc1    $f17, 40($sp) | 
 |   sdc1    $f16, 32($sp) | 
 |   sdc1    $f15, 24($sp) | 
 |   sdc1    $f14, 16($sp) | 
 |   sdc1    $f13, 8($sp) | 
 |   sdc1    $f12, 0($sp) | 
 |  | 
 |   lui     $gp, %hi(%neg(%gp_rel(__xray_FunctionEntry))) | 
 |   daddu   $gp, $gp, $t9 | 
 |   daddiu  $gp ,$gp, %lo(%neg(%gp_rel(__xray_FunctionEntry))) | 
 |  | 
 |   dla     $t9, _ZN6__xray19XRayPatchedFunctionE | 
 |   ld      $t9, 0($t9) | 
 |  | 
 |   beqz    $t9, FunctionEntry_restore | 
 |  | 
 |   // a1=0 means that we are tracing an entry event | 
 |   move    $a1, $zero | 
 |   // Function ID is in t0 (the first parameter). | 
 |   move    $a0, $t0 | 
 |   jalr    $t9 | 
 |  | 
 | FunctionEntry_restore: | 
 |   // Restore argument registers | 
 |   ldc1    $f12, 0($sp) | 
 |   ldc1    $f13, 8($sp) | 
 |   ldc1    $f14, 16($sp) | 
 |   ldc1    $f15, 24($sp) | 
 |   ldc1    $f16, 32($sp) | 
 |   ldc1    $f17, 40($sp) | 
 |   ldc1    $f18, 48($sp) | 
 |   ldc1    $f19, 56($sp) | 
 |   ld      $a0, 64($sp) | 
 |   ld      $a1, 72($sp) | 
 |   ld      $a2, 80($sp) | 
 |   ld      $a3, 88($sp) | 
 |   ld      $a4, 96($sp) | 
 |   ld      $a5, 104($sp) | 
 |   ld      $a6, 112($sp) | 
 |   ld      $a7, 120($sp) | 
 |   ld      $gp, 128($sp) | 
 |   ld      $ra, 136($sp) | 
 |   daddiu  $sp, $sp, 144 | 
 |   jr      $ra | 
 | FunctionEntry_end: | 
 |   .size __xray_FunctionEntry, FunctionEntry_end-__xray_FunctionEntry | 
 |   .cfi_endproc | 
 |  | 
 |   .text | 
 |   .globl __xray_FunctionExit | 
 |   .p2align 2 | 
 |   .type __xray_FunctionExit,@function | 
 | __xray_FunctionExit: | 
 |   .cfi_startproc | 
 |   // Save return registers before doing any actual work. | 
 |   .cfi_def_cfa_offset 64 | 
 |   daddiu  $sp, $sp, -64 | 
 |   sd      $ra, 56($sp) | 
 |   .cfi_offset 31, -8 | 
 |   sd      $gp, 48($sp) | 
 |   sd      $a0, 40($sp) | 
 |   sd      $v1, 32($sp) | 
 |   sd      $v0, 24($sp) | 
 |   sdc1    $f2, 16($sp) | 
 |   sdc1    $f1, 8($sp) | 
 |   sdc1    $f0, 0($sp) | 
 |  | 
 |   lui     $gp, %hi(%neg(%gp_rel(__xray_FunctionExit))) | 
 |   daddu   $gp, $gp, $t9 | 
 |   daddiu  $gp ,$gp, %lo(%neg(%gp_rel(__xray_FunctionExit))) | 
 |  | 
 |   dla     $t9, _ZN6__xray19XRayPatchedFunctionE | 
 |   ld      $t9, 0($t9) | 
 |  | 
 |   beqz    $t9, FunctionExit_restore | 
 |  | 
 |   // a1=1 means that we are tracing an exit event | 
 |   li      $a1, 1 | 
 |   // Function ID is in t0 (the first parameter). | 
 |   move    $a0, $t0 | 
 |   jalr    $t9 | 
 |  | 
 | FunctionExit_restore: | 
 |   // Restore return registers | 
 |   ldc1    $f0, 0($sp) | 
 |   ldc1    $f1, 8($sp) | 
 |   ldc1    $f2, 16($sp) | 
 |   ld      $v0, 24($sp) | 
 |   ld      $v1, 32($sp) | 
 |   ld      $a0, 40($sp) | 
 |   ld      $gp, 48($sp) | 
 |   ld      $ra, 56($sp) | 
 |   daddiu  $sp, $sp, 64 | 
 |   jr      $ra | 
 |  | 
 | FunctionExit_end: | 
 |   .size __xray_FunctionExit, FunctionExit_end-__xray_FunctionExit | 
 |   .cfi_endproc |