summaryrefslogtreecommitdiff
path: root/lib/mlibc/options/internal/x86_64
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mlibc/options/internal/x86_64')
-rw-r--r--lib/mlibc/options/internal/x86_64/fenv.S102
-rw-r--r--lib/mlibc/options/internal/x86_64/mlibc_crtbegin.S29
-rw-r--r--lib/mlibc/options/internal/x86_64/mlibc_crtend.S24
-rw-r--r--lib/mlibc/options/internal/x86_64/setjmp.S54
4 files changed, 209 insertions, 0 deletions
diff --git a/lib/mlibc/options/internal/x86_64/fenv.S b/lib/mlibc/options/internal/x86_64/fenv.S
new file mode 100644
index 0000000..3748988
--- /dev/null
+++ b/lib/mlibc/options/internal/x86_64/fenv.S
@@ -0,0 +1,102 @@
+# The functions below are taken from musl.
+.global feclearexcept
+.type feclearexcept,@function
+feclearexcept:
+ # maintain exceptions in the sse mxcsr, clear x87 exceptions
+ mov %edi,%ecx
+ and $0x3f,%ecx
+ fnstsw %ax
+ test %eax,%ecx
+ jz 1f
+ fnclex
+1: stmxcsr -8(%rsp)
+ and $0x3f,%eax
+ or %eax,-8(%rsp)
+ test %ecx,-8(%rsp)
+ jz 1f
+ not %ecx
+ and %ecx,-8(%rsp)
+ ldmxcsr -8(%rsp)
+1: xor %eax,%eax
+ ret
+
+.global feraiseexcept
+.type feraiseexcept,@function
+feraiseexcept:
+ and $0x3f,%edi
+ stmxcsr -8(%rsp)
+ or %edi,-8(%rsp)
+ ldmxcsr -8(%rsp)
+ xor %eax,%eax
+ ret
+
+.global __fesetround
+.hidden __fesetround
+.type __fesetround,@function
+__fesetround:
+ push %rax
+ xor %eax,%eax
+ mov %edi,%ecx
+ fnstcw (%rsp)
+ andb $0xf3,1(%rsp)
+ or %ch,1(%rsp)
+ fldcw (%rsp)
+ stmxcsr (%rsp)
+ shl $3,%ch
+ andb $0x9f,1(%rsp)
+ or %ch,1(%rsp)
+ ldmxcsr (%rsp)
+ pop %rcx
+ ret
+
+.global fegetround
+.type fegetround,@function
+fegetround:
+ push %rax
+ stmxcsr (%rsp)
+ pop %rax
+ shr $3,%eax
+ and $0xc00,%eax
+ ret
+
+.global fegetenv
+.type fegetenv,@function
+fegetenv:
+ xor %eax,%eax
+ fnstenv (%rdi)
+ stmxcsr 28(%rdi)
+ ret
+
+.global fesetenv
+.type fesetenv,@function
+fesetenv:
+ xor %eax,%eax
+ inc %rdi
+ jz 1f
+ fldenv -1(%rdi)
+ ldmxcsr 27(%rdi)
+ ret
+1: push %rax
+ push %rax
+ pushq $0xffff
+ pushq $0x37f
+ fldenv (%rsp)
+ pushq $0x1f80
+ ldmxcsr (%rsp)
+ add $40,%rsp
+ ret
+
+.global fetestexcept
+.type fetestexcept,@function
+fetestexcept:
+ and $0x3f,%edi
+ push %rax
+ stmxcsr (%rsp)
+ pop %rsi
+ fnstsw %ax
+ or %esi,%eax
+ and %edi,%eax
+ ret
+
+.section .note.GNU-stack,"",%progbits
+
diff --git a/lib/mlibc/options/internal/x86_64/mlibc_crtbegin.S b/lib/mlibc/options/internal/x86_64/mlibc_crtbegin.S
new file mode 100644
index 0000000..b99748b
--- /dev/null
+++ b/lib/mlibc/options/internal/x86_64/mlibc_crtbegin.S
@@ -0,0 +1,29 @@
+
+.section .data
+.hidden __dso_handle
+.global __dso_handle
+__dso_handle:
+ .quad __dso_handle
+
+.section .init
+.hidden _init
+.global _init
+_init:
+
+.section .fini
+.hidden _fini
+.global _fini
+_fini:
+
+.section .ctors
+.hidden __CTOR_LIST__
+.global __CTOR_LIST__
+__CTOR_LIST__:
+
+.section .dtors
+.hidden __DTOR_LIST__
+.global __DTOR_LIST__
+__DTOR_LIST__:
+
+.section .note.GNU-stack,"",%progbits
+
diff --git a/lib/mlibc/options/internal/x86_64/mlibc_crtend.S b/lib/mlibc/options/internal/x86_64/mlibc_crtend.S
new file mode 100644
index 0000000..e9d9136
--- /dev/null
+++ b/lib/mlibc/options/internal/x86_64/mlibc_crtend.S
@@ -0,0 +1,24 @@
+
+.hidden __mlibc_do_ctors
+.hidden __mlibc_do_dtors
+
+.section .init
+ call __mlibc_do_ctors
+ ret
+
+.section .fini
+ call __mlibc_do_dtors
+ ret
+
+.section .ctors
+.hidden __CTOR_END__
+.global __CTOR_END__
+__CTOR_END__:
+
+.section .dtors
+.hidden __DTOR_END__
+.global __DTOR_END__
+__DTOR_END__:
+
+.section .note.GNU-stack,"",%progbits
+
diff --git a/lib/mlibc/options/internal/x86_64/setjmp.S b/lib/mlibc/options/internal/x86_64/setjmp.S
new file mode 100644
index 0000000..aa8a134
--- /dev/null
+++ b/lib/mlibc/options/internal/x86_64/setjmp.S
@@ -0,0 +1,54 @@
+
+.type __setjmp, "function"
+__setjmp:
+ mov %rbx, 0x00(%rdi)
+ mov %rbp, 0x08(%rdi)
+ mov %r12, 0x10(%rdi)
+ mov %r13, 0x18(%rdi)
+ mov %r14, 0x20(%rdi)
+ mov %r15, 0x28(%rdi)
+
+ lea 8(%rsp), %rax # rsp before return rip is pushed
+ mov %rax, 0x30(%rdi)
+ mov (%rsp), %rax # return rip
+ mov %rax, 0x38(%rdi)
+
+ test %rdx, %rdx
+ jnz 1f
+ xor %rax, %rax
+ ret
+
+1:
+ jmp __sigsetjmp
+
+.global setjmp
+.type setjmp, "function"
+setjmp:
+ xor %rdx, %rdx
+ jmp __setjmp
+
+.global sigsetjmp
+.type sigsetjmp, "function"
+sigsetjmp:
+ mov $1, %rdx
+ jmp __setjmp
+
+.global longjmp
+.type longjmp, "function"
+longjmp:
+ mov 0x00(%rdi), %rbx
+ mov 0x08(%rdi), %rbp
+ mov 0x10(%rdi), %r12
+ mov 0x18(%rdi), %r13
+ mov 0x20(%rdi), %r14
+ mov 0x28(%rdi), %r15
+
+ mov %rsi, %rax
+ test %rax, %rax
+ jnz 1f
+ inc %rax
+1:
+ mov 0x30(%rdi), %rsp
+ jmp *0x38(%rdi)
+.section .note.GNU-stack,"",%progbits
+