blob: 3c9b02ee4c0a7f47373130081e5774ef3cfa20c1 [file] [log] [blame]
Torne (Richard Coles)9e12abd2014-08-28 12:05:47 +01001// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5/*
6 * typedef void (*PushAllRegistersCallback)(SafePointBarrier*, ThreadState*, intptr_t*);
7 * extern "C" void pushAllRegisters(SafePointBarrier*, ThreadState*, PushAllRegistersCallback)
8 */
9
10.type pushAllRegisters, %function
11.global pushAllRegisters
12.hidden pushAllRegisters
13pushAllRegisters:
14 // Push all callee-saves registers to get them
15 // on the stack for conservative stack scanning.
16 // Reserve space for callee-saved registers and return address.
17 daddiu $sp,$sp,-80
18 // Save the callee-saved registers and the return address.
19 sd $s0,0($sp)
20 sd $s1,8($sp)
21 sd $s2,16($sp)
22 sd $s3,24($sp)
23 sd $s4,32($sp)
24 sd $s5,40($sp)
25 sd $s6,48($sp)
26 sd $s7,56($sp)
27 sd $ra,64($sp)
28 // Note: the callee-saved floating point registers do not need to be
29 // copied to the stack, because fp registers never hold heap pointers
30 // and so do not need to be kept visible to the garbage collector.
31 // Pass the two first arguments untouched in a0 and a1 and the
32 // stack pointer to the callback.
33 move $t9,$a2
34 move $a2,$sp
35 jal $t9
36 // Restore return address, adjust stack and return.
37 // Note: the copied registers do not need to be reloaded here,
38 // because they were preserved by the called routine.
39 ld $ra,64($sp)
40 daddiu $sp,$sp,80
41 jr $ra