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