testuite: fix libtdc++ libatomic flags
[official-gcc.git] / libgo / runtime / go-context.S
blobd55baa26f559f47cf8a1b71b03cb77d580c86914
1 // Copyright 2019 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 // This provides a simplified version of getcontext and
6 // setcontext. They are like the corresponding functions
7 // in libc, but we only save/restore the callee-save
8 // registers and PC, SP. Unlike the libc functions, we
9 // don't save/restore the signal masks and floating point
10 // environment.
12 #if defined(__x86_64__) && defined(__linux__) && !defined(__CET__)
14 #define RBP_OFF (0*8)
15 #define RBX_OFF (1*8)
16 #define R12_OFF (2*8)
17 #define R13_OFF (3*8)
18 #define R14_OFF (4*8)
19 #define R15_OFF (5*8)
20 #define SP_OFF  (6*8)
21 #define PC_OFF  (7*8)
23 .globl __go_getcontext
24 .text
25 __go_getcontext:
26         movq    %rbx, RBX_OFF(%rdi)
27         movq    %rbp, RBP_OFF(%rdi)
28         movq    %r12, R12_OFF(%rdi)
29         movq    %r13, R13_OFF(%rdi)
30         movq    %r14, R14_OFF(%rdi)
31         movq    %r15, R15_OFF(%rdi)
33         movq    (%rsp), %rax    // return PC
34         movq    %rax, PC_OFF(%rdi)
35         leaq    8(%rsp), %rax   // the SP before pushing return PC
36         movq    %rax, SP_OFF(%rdi)
38         ret
40 .globl __go_setcontext
41 .text
42 __go_setcontext:
43         movq    RBX_OFF(%rdi), %rbx
44         movq    RBP_OFF(%rdi), %rbp
45         movq    R12_OFF(%rdi), %r12
46         movq    R13_OFF(%rdi), %r13
47         movq    R14_OFF(%rdi), %r14
48         movq    R15_OFF(%rdi), %r15
49         movq    SP_OFF(%rdi), %rsp
50         movq    PC_OFF(%rdi), %rdx
52         jmp     *%rdx
54 .globl __go_makecontext
55 .text
56 __go_makecontext:
57         addq    %rcx, %rdx
59         // Align the SP, and push a dummy return address.
60         andq    $~0xf, %rdx
61         subq    $8, %rdx
62         movq    $0, (%rdx)
64         movq    %rdx, SP_OFF(%rdi)
65         movq    %rsi, PC_OFF(%rdi)
67         ret
69         .section        .note.GNU-split-stack,"",@progbits
70         .section        .note.GNU-no-split-stack,"",@progbits
72 #endif
74         .section        .note.GNU-stack,"",@progbits