summaryrefslogtreecommitdiffstats
path: root/library/fibers/switchstack_gcc_32_linux_mac.s
blob: e4eac6382f4ba84efc25a8d118b12fc0bf7c5db1 (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
.text
.globl _switchStackInternal

_switchStackInternal:
    // save callee-saved registers
    push %ebp
    movl %esp, %ebp
    push %ebx
    push %esi
    push %edi

    // store SIMD floating point control word
    sub $4, %esp
    stmxcsr (%esp)

    // store floating point control bytes
    sub $4, %esp
    fstcw (%esp)

    // save the old stack pointer
    movl 0xc(%ebp), %edx
    movl %esp, (%edx)
    // set the new stack pointer
    movl 0x8(%ebp), %esp

    // restore floating point control bytes
    fnclex
    fldcw (%esp)
    add $4, %esp

    // restore SIMD floating point control word
    ldmxcsr (%esp)
    add $4, %esp

    // pop callee-saved registers
    pop %edi
    pop %esi
    pop %ebx
    pop %ebp

    ret