summaryrefslogtreecommitdiff
path: root/src/grt/config/amd64.S
diff options
context:
space:
mode:
Diffstat (limited to 'src/grt/config/amd64.S')
-rw-r--r--src/grt/config/amd64.S138
1 files changed, 0 insertions, 138 deletions
diff --git a/src/grt/config/amd64.S b/src/grt/config/amd64.S
deleted file mode 100644
index bdf5294..0000000
--- a/src/grt/config/amd64.S
+++ /dev/null
@@ -1,138 +0,0 @@
-/* GRT stack implementation for amd64 (x86_64) -*- asm -*-
- Copyright (C) 2005 - 2014 Tristan Gingold.
-
- GHDL is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free
- Software Foundation; either version 2, or (at your option) any later
- version.
-
- GHDL is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- for more details.
-
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING. If not, write to the Free
- Software Foundation, 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA.
-
- As a special exception, if other files instantiate generics from this
- unit, or you link this unit with other files to produce an executable,
- this unit does not by itself cause the resulting executable to be
- covered by the GNU General Public License. This exception does not
- however invalidate any other reasons why the executable file might be
- covered by the GNU Public License.
-*/
- .file "amd64.S"
-
-#ifdef __ELF__
-#define ENTRY(func) .align 4; .globl func; .type func,@function; func:
-#define END(func) .size func, . - func
-#define NAME(name) name
-#elif __APPLE__
-#define ENTRY(func) .align 4; .globl _##func; _##func:
-#define END(func)
-#define NAME(name) _##name
-#else
-#define ENTRY(func) .align 4; func:
-#define END(func)
-#define NAME(name) name
-#endif
- .text
-
- /* Function called to loop on the process.
- At entry | Frame | In body
- ----------+-----------------+---------
- %rsp | 0 (ret addr) | %rbp+8
- | saved %rbp | %rbp
- */
-ENTRY(grt_stack_loop)
- /* Standard prologue. */
- pushq %rbp
- movq %rsp,%rbp
- /* Body. */
-0: mov %r13,%rdi
- call %r12
- jmp 0b
-END(grt_stack_loop)
-
- /* function Stack_Create (Func : Address; Arg : Address)
- return Stack_Type;
- Args: FUNC (RDI), ARG (RSI)
- */
-ENTRY(grt_stack_create)
- /* Standard prologue. */
- pushq %rbp
- movq %rsp,%rbp
- /* Save args. */
- sub $0x10,%rsp
- mov %rdi,-8(%rbp)
- mov %rsi,-16(%rbp)
-
- /* Allocate the stack, and exit in case of failure */
- callq NAME(grt_stack_allocate)
- test %rax,%rax
- je .Ldone
-
- /* Note: %RAX contains the address of the stack_context. This is
- also the top of the stack. */
-
- /* Prepare fake frame for stack_loop. */
- xorq %rsi, %rsi
- mov %rsi,-8(%rax) /* Null return address (must be 8 mod 16). */
- /* The return function. */
-#if __APPLE__
- movq _grt_stack_loop@GOTPCREL(%rip), %rdi
- movq %rdi, -16(%rax)
-#else
- movq $grt_stack_loop, -16(%rax)
-#endif
- /* The context. */
- mov %rsi, -24(%rax) /* %rbp <- 0 (null frame) */
- mov %rbx, -32(%rax)
- mov -8(%rbp), %rdi
- mov %rdi, -40(%rax) /* %r12 <- function address. */
- mov -16(%rbp), %rdi
- mov %rdi, -48(%rax) /* %r13 <- function argument. */
- mov %r14, -56(%rax)
- mov %r15, -64(%rax)
-
- /* Save the new stack pointer to the stack context. */
- lea -64(%rax), %rsi
- mov %rsi, (%rax)
-
-.Ldone:
- leave
- ret
-END(grt_stack_create)
-
-
-
- /* Arguments: TO (RDI), FROM (RSI) [VAL (RDX)]
- Both are pointers to a stack_context. */
-ENTRY(grt_stack_switch)
- /* Save call-used registers. */
- pushq %rbp
- pushq %rbx
- pushq %r12
- pushq %r13
- pushq %r14
- pushq %r15
- /* Save the current stack. */
- movq %rsp, (%rsi)
- /* Stack switch. */
- movq (%rdi), %rsp
- /* Restore call-used registers. */
- popq %r15
- popq %r14
- popq %r13
- popq %r12
- popq %rbx
- popq %rbp
- /* Return val. */
- movq %rdx, %rax
- /* Run. */
- ret
-END(grt_stack_switch)
-
- .ident "Written by T.Gingold"