]> git.ipfire.org Git - thirdparty/gcc.git/blob - libphobos/libdruntime/config/mingw/switchcontext.S
Update copyright years.
[thirdparty/gcc.git] / libphobos / libdruntime / config / mingw / switchcontext.S
1 /* Windows i386 support code for fibers and multithreading.
2 Copyright (C) 2019-2020 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
15
16 Under Section 7 of GPL version 3, you are granted additional
17 permissions described in the GCC Runtime Library Exception, version
18 3.1, as published by the Free Software Foundation.
19
20 You should have received a copy of the GNU General Public License and
21 a copy of the GCC Runtime Library Exception along with this program;
22 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 <http://www.gnu.org/licenses/>. */
24
25 #include "../common/threadasm.S"
26
27 #if defined(__x86_64__)
28
29 .text
30 .globl CSYM(fiber_switchContext)
31 .type CSYM(fiber_switchContext), @function
32 .align 16
33 CSYM(fiber_switchContext):
34 .cfi_startproc
35 pushq %RBP;
36 movq %RSP, %RBP;
37 pushq %RBX;
38 pushq %R12;
39 pushq %R13;
40 pushq %R14;
41 pushq %R15;
42 pushq %GS:0;
43 pushq %GS:8;
44 pushq %GS:16;
45
46 // store oldp
47 movq %RSP, (%RCX);
48 // load newp to begin context switch
49 movq %RDX, %RSP;
50
51 // load saved state from new stack
52 popq %GS:16;
53 popq %GS:8;
54 popq %GS:0;
55 popq %R15;
56 popq %R14;
57 popq %R13;
58 popq %R12;
59 popq %RBX;
60 popq %RBP;
61
62 // 'return' to complete switch
63 popq %RCX;
64 jmp *%RCX;
65 .cfi_endproc
66 .size CSYM(fiber_switchContext),.-CSYM(fiber_switchContext)
67
68 #elif defined(_X86_)
69
70 .text
71 .globl CSYM(fiber_switchContext)
72 .type CSYM(fiber_switchContext), @function
73 .align 16
74 CSYM(fiber_switchContext):
75 .cfi_startproc
76 // Save current stack state.save current stack state
77 // Standard CDECL prologue.
78 push %EBP;
79 mov %ESP, %EBP;
80 push %EDI;
81 push %ESI;
82 push %EBX;
83 push %FS:0;
84 push %FS:4;
85 push %FS:8;
86 push %EAX;
87
88 // store oldp again with more accurate address
89 mov 8(%EBP), %EAX;
90 mov %ESP, (%EAX);
91 // load newp to begin context switch
92 mov 12(%EBP), %ESP;
93
94 // load saved state from new stack
95 pop %EAX;
96 pop %FS:8;
97 pop %FS:4;
98 pop %FS:0;
99 pop %EBX;
100 pop %ESI;
101 pop %EDI;
102 pop %EBP;
103
104 // 'return' to complete switch
105 ret;
106 .cfi_endproc
107 .size CSYM(fiber_switchContext),.-CSYM(fiber_switchContext)
108
109 #endif