summaryrefslogtreecommitdiffstats
path: root/src/backend/switchstack_msvc_64.asm
blob: 3c6f321c851965a6e72af18d5dd060d159ce18cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
.model flat, c
.code

_switchStackInternal PROC to:QWORD, from:QWORD
    ; save callee-saved registers
    PUSH RBP
    MOV RBP, RSP
    PUSH RBX
    PUSH ESI
    PUSH EDI

    PUSH R12
    PUSH R13
    PUSH R14
    PUSH R15

    PUSH RSI
    PUSH RDI

    SUB RSP, 0x10
    MOVUPD [RSP], XMM6
    SUB RSP, 0x10
    MOVUPD [RSP], XMM7
    SUB RSP, 0x10
    MOVUPD [RSP], XMM8
    SUB RSP, 0x10
    MOVUPD [RSP], XMM9
    SUB RSP, 0x10
    MOVUPD [RSP], XMM10
    SUB RSP, 0x10
    MOVUPD [RSP], XMM11
    SUB RSP, 0x10
    MOVUPD [RSP], XMM12
    SUB RSP, 0x10
    MOVUPD [RSP], XMM13
    SUB RSP, 0x10
    MOVUPD [RSP], XMM14
    SUB RSP, 0x10
    MOVUPD [RSP], XMM15

    ; store SIMD floating point control word
    SUB RSP, 4
    STMXCSR [RSP]

    ; store floating point control bytes
    SUB RSP, 4
    FSTCW [RSP]

    ; save the old stack pointer
    MOV [from], RSP
    ; set the new stack pointer
    MOV RSP, to

    ; restore floating point control bytes
    FNCLEX
    FLDCW [RSP]
    ADD RSP, 4

    ; restore SIMD floating point control word
    LDMXCSR [RSP]
    ADD RSP, 4

    ; pop callee-saved registers
    MOVUPD XMM15, [RSP]
    ADD RSP, 0x10
    MOVUPD XMM14, [RSP]
    ADD RSP, 0x10
    MOVUPD XMM13, [RSP]
    ADD RSP, 0x10
    MOVUPD XMM12, [RSP]
    ADD RSP, 0x10
    MOVUPD XMM11, [RSP]
    ADD RSP, 0x10
    MOVUPD XMM10, [RSP]
    ADD RSP, 0x10
    MOVUPD XMM9, [RSP]
    ADD RSP, 0x10
    MOVUPD XMM8, [RSP]
    ADD RSP, 0x10
    MOVUPD XMM7, [RSP]
    ADD RSP, 0x10
    MOVUPD XMM6, [RSP]
    ADD RSP, 0x10

    POP RDI
    POP RSI

    POP R15
    POP R14
    POP R13
    POP R12
    POP RBX
    POP RBP

    RET
_switchStackInternal ENDP

end