about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2014-12-22 12:48:13 -0800
committerAlex Crichton <alex@alexcrichton.com>2014-12-22 12:48:13 -0800
commitca441df82a1b6c79c67119624255132352167909 (patch)
tree7fea0e9dfedf1d838820cb471c392eef15e048ef
parente5800dd4540d4586e8d085a8fd9614c86a30e80e (diff)
parent98ed8825114d4413c3d739e734ca0668222eb2f6 (diff)
downloadrust-ca441df82a1b6c79c67119624255132352167909.tar.gz
rust-ca441df82a1b6c79c67119624255132352167909.zip
rollup merge of #20135: selaine/less-asm
r? @alexcrichton
-rw-r--r--mk/rt.mk5
-rw-r--r--src/rt/arch/arm/_context.S69
-rw-r--r--src/rt/arch/i386/_context.S65
-rw-r--r--src/rt/arch/mips/_context.S88
-rw-r--r--src/rt/arch/mipsel/_context.S88
-rw-r--r--src/rt/arch/x86_64/_context.S192
-rw-r--r--src/rt/arch/x86_64/regs.h65
7 files changed, 2 insertions, 570 deletions
diff --git a/mk/rt.mk b/mk/rt.mk
index 38aec836316..a1d18aae1b4 100644
--- a/mk/rt.mk
+++ b/mk/rt.mk
@@ -35,7 +35,7 @@
 # that's per-target so you're allowed to conditionally add files based on the
 # target.
 ################################################################################
-NATIVE_LIBS := rust_builtin hoedown morestack miniz context_switch \
+NATIVE_LIBS := rust_builtin hoedown morestack miniz \
 		rustrt_native rust_test_helpers
 
 # $(1) is the target triple
@@ -58,8 +58,7 @@ NATIVE_DEPS_rustrt_native_$(1) := \
 			arch/$$(HOST_$(1))/record_sp.S
 NATIVE_DEPS_rust_test_helpers_$(1) := rust_test_helpers.c
 NATIVE_DEPS_morestack_$(1) := arch/$$(HOST_$(1))/morestack.S
-NATIVE_DEPS_context_switch_$(1) := \
-			arch/$$(HOST_$(1))/_context.S
+
 
 ################################################################################
 # You shouldn't find it that necessary to edit anything below this line.
diff --git a/src/rt/arch/arm/_context.S b/src/rt/arch/arm/_context.S
deleted file mode 100644
index 38fc4827f58..00000000000
--- a/src/rt/arch/arm/_context.S
+++ /dev/null
@@ -1,69 +0,0 @@
-// Mark stack as non-executable
-#if defined(__linux__) && defined(__ELF__)
-.section	.note.GNU-stack, "", %progbits
-#endif
-
-.text
-.code 32
-.arm
-#if defined(__APPLE__)
-.align 2
-#else
-.align
-#endif
-
-#if defined(__APPLE__)
-  #define SWAP_REGISTERS  _rust_swap_registers
-  #define BOOTSTRAP_TASK  _rust_bootstrap_green_task
-#else
-  #define SWAP_REGISTERS  rust_swap_registers
-  #define BOOTSTRAP_TASK  rust_bootstrap_green_task
-#endif
-        
-.globl SWAP_REGISTERS
-SWAP_REGISTERS:
-	str r0, [r0, #0]
-	str r3, [r0, #12]
-	str r4, [r0, #16]
-	str r5, [r0, #20]
-	str r6, [r0, #24]
-	str r7, [r0, #28]
-	str r8, [r0, #32]
-	str r9, [r0, #36]
-	str r10, [r0, #40]
-	str r11, [r0, #44]
-	str r12, [r0, #48]
-	str sp, [r0, #52]
-	str lr, [r0, #56]
-
-	mrs r2, cpsr
-	str r2, [r0, #64]
-
-
-	ldr r0, [r1, #0]
-	ldr r3, [r1, #12]
-	ldr r4, [r1, #16]
-	ldr r5, [r1, #20]
-	ldr r6, [r1, #24]
-	ldr r7, [r1, #28]
-	ldr r8, [r1, #32]
-	ldr r9, [r1, #36]
-	ldr r10, [r1, #40]
-	ldr r11, [r1, #44]
-	ldr r12, [r1, #48]
-
-	ldr sp, [r1, #52]
-	ldr lr, [r1, #56]
-
-	ldr r2, [r1, #64]
-	msr cpsr_cxsf, r2
-
-	mov pc, lr
-
-// For reasons of this existence, see the comments in x86_64/_context.S
-.globl BOOTSTRAP_TASK
-BOOTSTRAP_TASK:
-    mov r0, r0
-    mov r1, r3
-    mov r2, r4
-    mov pc, r5
diff --git a/src/rt/arch/i386/_context.S b/src/rt/arch/i386/_context.S
deleted file mode 100644
index 6b79a82e4ac..00000000000
--- a/src/rt/arch/i386/_context.S
+++ /dev/null
@@ -1,65 +0,0 @@
-// Mark stack as non-executable
-#if defined(__linux__) && defined(__ELF__)
-.section	.note.GNU-stack, "", @progbits
-#endif
-
-        .text
-
-/*
-Callee save registers:
-        ebp, ebx, esi, edi
-
-Caller save registers:
-        eax, ecx, edx
-*/
-
-/*
-Saves a set of registers. This is used by our implementation of
-getcontext.
-
-The registers_t variable is in (%esp)
-*/
-
-#if defined(__APPLE__) || defined(_WIN32)
-#define SWAP_REGISTERS _rust_swap_registers
-#else
-#define SWAP_REGISTERS rust_swap_registers
-#endif
-
-// swap_registers(registers_t *oregs, registers_t *regs)
-.globl SWAP_REGISTERS
-SWAP_REGISTERS:
-    // save the old context
-    movl 4(%esp), %eax
-    movl %ebx, 4(%eax)
-    movl %ebp, 16(%eax)
-    movl %esi, 20(%eax)
-    movl %edi, 24(%eax)
-
-    // save the flags
-    pushf
-    popl %ecx
-    movl %ecx, 44(%eax)
-
-    // save the return address as the instruction pointer
-    // and save the stack pointer of the caller
-    popl %ecx
-    movl %esp, 28(%eax)
-    movl %ecx, 48(%eax)
-
-    // restore the new context
-    movl 4(%esp), %eax
-
-    movl 4(%eax), %ebx
-    movl 16(%eax), %ebp
-    movl 20(%eax), %esi
-    movl 24(%eax), %edi
-    movl 28(%eax), %esp
-
-    // restore the flags
-    movl 44(%eax), %ecx
-    push %ecx
-    popf
-
-    // Return!
-    jmp *48(%eax)
diff --git a/src/rt/arch/mips/_context.S b/src/rt/arch/mips/_context.S
deleted file mode 100644
index cfe77cc3045..00000000000
--- a/src/rt/arch/mips/_context.S
+++ /dev/null
@@ -1,88 +0,0 @@
-// Mark stack as non-executable
-#if defined(__linux__) && defined(__ELF__)
-.section	.note.GNU-stack, "", @progbits
-#endif
-
-.text
-.globl rust_swap_registers
-.align 2
-.set nomips16
-.ent rust_swap_registers
-rust_swap_registers:
-        .set noreorder
-        .set nomacro
-        .set noat
-        sw $1, 1 * 4($4)
-        sw $2, 2 * 4($4)
-        sw $3, 3 * 4($4)
-        sw $4, 4 * 4($4)
-        sw $5, 5 * 4($4)
-        sw $6, 6 * 4($4)
-        sw $7, 7 * 4($4)
-
-        sw $8, 8 * 4($4)
-        sw $9, 9 * 4($4)
-        sw $10, 10 * 4($4)
-        sw $11, 11 * 4($4)
-        sw $12, 12 * 4($4)
-        sw $13, 13 * 4($4)
-        sw $14, 14 * 4($4)
-        sw $15, 15 * 4($4)
-
-        sw $16, 16 * 4($4)
-        sw $17, 17 * 4($4)
-        sw $18, 18 * 4($4)
-        sw $19, 19 * 4($4)
-        sw $20, 20 * 4($4)
-        sw $21, 21 * 4($4)
-        sw $22, 22 * 4($4)
-        sw $23, 23 * 4($4)
-
-        sw $24, 24 * 4($4)
-        sw $25, 25 * 4($4)
-        sw $26, 26 * 4($4)
-        sw $27, 27 * 4($4)
-        sw $28, 28 * 4($4)
-        sw $29, 29 * 4($4)
-        sw $30, 30 * 4($4)
-        sw $31, 31 * 4($4)
-
-        lw $1, 1 * 4($5)
-        lw $2, 2 * 4($5)
-        lw $3, 3 * 4($5)
-        lw $4, 4 * 4($5)
-        lw $6, 6 * 4($5)
-        lw $7, 7 * 4($5)
-
-        lw $8, 8 * 4($5)
-        lw $9, 9 * 4($5)
-        lw $10, 10 * 4($5)
-        lw $11, 11 * 4($5)
-        lw $12, 12 * 4($5)
-        lw $13, 13 * 4($5)
-        lw $14, 14 * 4($5)
-        lw $15, 15 * 4($5)
-
-        lw $16, 16 * 4($5)
-        lw $17, 17 * 4($5)
-        lw $18, 18 * 4($5)
-        lw $19, 19 * 4($5)
-        lw $20, 20 * 4($5)
-        lw $21, 21 * 4($5)
-        lw $22, 22 * 4($5)
-        lw $23, 23 * 4($5)
-
-        lw $24, 24 * 4($5)
-        lw $25, 25 * 4($5)
-        lw $26, 26 * 4($5)
-        lw $27, 27 * 4($5)
-        lw $28, 28 * 4($5)
-        lw $29, 29 * 4($5)
-        lw $30, 30 * 4($5)
-        lw $31, 31 * 4($5)
-
-        lw $5, 5 * 4($5)
-
-        jr $31
-        nop
-.end rust_swap_registers
diff --git a/src/rt/arch/mipsel/_context.S b/src/rt/arch/mipsel/_context.S
deleted file mode 100644
index cfe77cc3045..00000000000
--- a/src/rt/arch/mipsel/_context.S
+++ /dev/null
@@ -1,88 +0,0 @@
-// Mark stack as non-executable
-#if defined(__linux__) && defined(__ELF__)
-.section	.note.GNU-stack, "", @progbits
-#endif
-
-.text
-.globl rust_swap_registers
-.align 2
-.set nomips16
-.ent rust_swap_registers
-rust_swap_registers:
-        .set noreorder
-        .set nomacro
-        .set noat
-        sw $1, 1 * 4($4)
-        sw $2, 2 * 4($4)
-        sw $3, 3 * 4($4)
-        sw $4, 4 * 4($4)
-        sw $5, 5 * 4($4)
-        sw $6, 6 * 4($4)
-        sw $7, 7 * 4($4)
-
-        sw $8, 8 * 4($4)
-        sw $9, 9 * 4($4)
-        sw $10, 10 * 4($4)
-        sw $11, 11 * 4($4)
-        sw $12, 12 * 4($4)
-        sw $13, 13 * 4($4)
-        sw $14, 14 * 4($4)
-        sw $15, 15 * 4($4)
-
-        sw $16, 16 * 4($4)
-        sw $17, 17 * 4($4)
-        sw $18, 18 * 4($4)
-        sw $19, 19 * 4($4)
-        sw $20, 20 * 4($4)
-        sw $21, 21 * 4($4)
-        sw $22, 22 * 4($4)
-        sw $23, 23 * 4($4)
-
-        sw $24, 24 * 4($4)
-        sw $25, 25 * 4($4)
-        sw $26, 26 * 4($4)
-        sw $27, 27 * 4($4)
-        sw $28, 28 * 4($4)
-        sw $29, 29 * 4($4)
-        sw $30, 30 * 4($4)
-        sw $31, 31 * 4($4)
-
-        lw $1, 1 * 4($5)
-        lw $2, 2 * 4($5)
-        lw $3, 3 * 4($5)
-        lw $4, 4 * 4($5)
-        lw $6, 6 * 4($5)
-        lw $7, 7 * 4($5)
-
-        lw $8, 8 * 4($5)
-        lw $9, 9 * 4($5)
-        lw $10, 10 * 4($5)
-        lw $11, 11 * 4($5)
-        lw $12, 12 * 4($5)
-        lw $13, 13 * 4($5)
-        lw $14, 14 * 4($5)
-        lw $15, 15 * 4($5)
-
-        lw $16, 16 * 4($5)
-        lw $17, 17 * 4($5)
-        lw $18, 18 * 4($5)
-        lw $19, 19 * 4($5)
-        lw $20, 20 * 4($5)
-        lw $21, 21 * 4($5)
-        lw $22, 22 * 4($5)
-        lw $23, 23 * 4($5)
-
-        lw $24, 24 * 4($5)
-        lw $25, 25 * 4($5)
-        lw $26, 26 * 4($5)
-        lw $27, 27 * 4($5)
-        lw $28, 28 * 4($5)
-        lw $29, 29 * 4($5)
-        lw $30, 30 * 4($5)
-        lw $31, 31 * 4($5)
-
-        lw $5, 5 * 4($5)
-
-        jr $31
-        nop
-.end rust_swap_registers
diff --git a/src/rt/arch/x86_64/_context.S b/src/rt/arch/x86_64/_context.S
deleted file mode 100644
index 36caf7720c4..00000000000
--- a/src/rt/arch/x86_64/_context.S
+++ /dev/null
@@ -1,192 +0,0 @@
-// Mark stack as non-executable
-#if defined(__linux__) && defined(__ELF__)
-.section	.note.GNU-stack, "", @progbits
-#endif
-
-#include "regs.h"
-#define ARG0 RUSTRT_ARG0_S
-#define ARG1 RUSTRT_ARG1_S
-
-        .text
-
-/*
-According to ABI documentation found at
-http://www.x86-64.org/documentation.html
-and Microsoft discussion at
-http://msdn.microsoft.com/en-US/library/9z1stfyw%28v=VS.80%29.aspx.
-
-BOTH CALLING CONVENTIONS
-
-Callee save registers:
-	R12--R15, RDI, RSI, RBX, RBP, RSP
-        XMM0--XMM5
-
-Caller save registers:
-	RAX, RCX, RDX, R8--R11
-        XMM6--XMM15
-        Floating point stack
-
-MAC/AMD CALLING CONVENTIONS
-
-Integer arguments go in registers:
-        rdi, rsi, rdx, rcx, r8, r9
-
-User flags have no specified role and are not preserved
-        across calls, with the exception of DF in %rFLAGS,
-        which must be clear (set to "forward" direction)
-        on function entry and return.
-
-MICROSOFT CALLING CONVENTIONS
-
-Return value: RAX
-
-First four arguments:
-        RCX, RDX, R8, R9
-        XMM0, XMM1, XMM2, XMM3
-*/
-
-/*
-        Stores current registers into arg0/RCX and restores
-        registers found in arg1/RDX. This is used by our
-	    implementation of getcontext.  Only saves/restores nonvolatile
-        registers and the register used for the first argument.
-        Volatile registers in general ought to be saved by the caller
-        anyhow.
-*/
-
-#if defined(__APPLE__)
-#define SWAP_REGISTERS _rust_swap_registers
-#else
-#define SWAP_REGISTERS rust_swap_registers
-#endif
-
-// swap_registers(registers_t *oregs, registers_t *regs)
-.globl SWAP_REGISTERS
-SWAP_REGISTERS:
-        // n.b. when we enter, the return address is at the top of
-        // the stack (i.e., 0(%RSP)) and the argument is in
-        // RUSTRT_ARG0_S.  We
-        // simply save all NV registers into oregs.
-        // We then restore all NV registers from regs.  This restores
-        // the old stack pointer, which should include the proper
-        // return address. We can therefore just return normally to
-        // jump back into the old code.
-
-        // Save instruction pointer:
-        pop %rax
-        mov %rax, (RUSTRT_IP*8)(RUSTRT_ARG0_S)
-
-        // Save non-volatile integer registers:
-        //   (including RSP)
-        mov %rbx, (RUSTRT_RBX*8)(ARG0)
-        mov %rsp, (RUSTRT_RSP*8)(ARG0)
-        mov %rbp, (RUSTRT_RBP*8)(ARG0)
-        mov %r12, (RUSTRT_R12*8)(ARG0)
-        mov %r13, (RUSTRT_R13*8)(ARG0)
-        mov %r14, (RUSTRT_R14*8)(ARG0)
-        mov %r15, (RUSTRT_R15*8)(ARG0)
-
-#if defined(__MINGW32__) || defined(_WINDOWS)
-        mov %rdi, (RUSTRT_RDI*8)(ARG0)
-        mov %rsi, (RUSTRT_RSI*8)(ARG0)
-#endif
-
-        // Save 0th argument register:
-        mov ARG0, (RUSTRT_ARG0*8)(ARG0)
-
-        // Save non-volatile XMM registers:
-#if defined(__MINGW32__) || defined(_WINDOWS)
-        movapd %xmm6, (RUSTRT_XMM6*8)(ARG0)
-        movapd %xmm7, (RUSTRT_XMM7*8)(ARG0)
-        movapd %xmm8, (RUSTRT_XMM8*8)(ARG0)
-        movapd %xmm9, (RUSTRT_XMM9*8)(ARG0)
-        movapd %xmm10, (RUSTRT_XMM10*8)(ARG0)
-        movapd %xmm11, (RUSTRT_XMM11*8)(ARG0)
-        movapd %xmm12, (RUSTRT_XMM12*8)(ARG0)
-        movapd %xmm13, (RUSTRT_XMM13*8)(ARG0)
-        movapd %xmm14, (RUSTRT_XMM14*8)(ARG0)
-        movapd %xmm15, (RUSTRT_XMM15*8)(ARG0)
-#else
-        movapd %xmm0, (RUSTRT_XMM0*8)(ARG0)
-        movapd %xmm1, (RUSTRT_XMM1*8)(ARG0)
-        movapd %xmm2, (RUSTRT_XMM2*8)(ARG0)
-        movapd %xmm3, (RUSTRT_XMM3*8)(ARG0)
-        movapd %xmm4, (RUSTRT_XMM4*8)(ARG0)
-        movapd %xmm5, (RUSTRT_XMM5*8)(ARG0)
-#endif
-
-        // Restore non-volatile integer registers:
-        //   (including RSP)
-        mov (RUSTRT_RBX*8)(ARG1), %rbx
-        mov (RUSTRT_RSP*8)(ARG1), %rsp
-        mov (RUSTRT_RBP*8)(ARG1), %rbp
-        mov (RUSTRT_R12*8)(ARG1), %r12
-        mov (RUSTRT_R13*8)(ARG1), %r13
-        mov (RUSTRT_R14*8)(ARG1), %r14
-        mov (RUSTRT_R15*8)(ARG1), %r15
-
-#if defined(__MINGW32__) || defined(_WINDOWS)
-        mov (RUSTRT_RDI*8)(ARG1), %rdi
-        mov (RUSTRT_RSI*8)(ARG1), %rsi
-#endif
-
-        // Restore 0th argument register:
-        mov (RUSTRT_ARG0*8)(ARG1), ARG0
-
-        // Restore non-volatile XMM registers:
-#if defined(__MINGW32__) || defined(_WINDOWS)
-        movapd (RUSTRT_XMM6*8)(ARG1), %xmm6
-        movapd (RUSTRT_XMM7*8)(ARG1), %xmm7
-        movapd (RUSTRT_XMM8*8)(ARG1), %xmm8
-        movapd (RUSTRT_XMM9*8)(ARG1), %xmm9
-        movapd (RUSTRT_XMM10*8)(ARG1), %xmm10
-        movapd (RUSTRT_XMM11*8)(ARG1), %xmm11
-        movapd (RUSTRT_XMM12*8)(ARG1), %xmm12
-        movapd (RUSTRT_XMM13*8)(ARG1), %xmm13
-        movapd (RUSTRT_XMM14*8)(ARG1), %xmm14
-        movapd (RUSTRT_XMM15*8)(ARG1), %xmm15
-#else
-        movapd (RUSTRT_XMM0*8)(ARG1), %xmm0
-        movapd (RUSTRT_XMM1*8)(ARG1), %xmm1
-        movapd (RUSTRT_XMM2*8)(ARG1), %xmm2
-        movapd (RUSTRT_XMM3*8)(ARG1), %xmm3
-        movapd (RUSTRT_XMM4*8)(ARG1), %xmm4
-        movapd (RUSTRT_XMM5*8)(ARG1), %xmm5
-#endif
-
-        // Jump to the instruction pointer
-        // found in regs:
-        jmp *(RUSTRT_IP*8)(ARG1)
-
-// This function below, rust_bootstrap_green_task, is used to initialize a green
-// task. This code is the very first code that is run whenever a green task
-// starts. The only assumptions that this code makes is that it has a register
-// context previously set up by Context::new() and some values are in some
-// special registers.
-//
-// In theory the register context could be set up and then the context switching
-// would plop us directly into some 'extern "C" fn', but not all platforms have
-// the argument registers saved throughout a context switch (linux doesn't save
-// rdi/rsi, the first two argument registers). Instead of modifying all context
-// switches, instead the initial data for starting a green thread is shoved into
-// unrelated registers (r12/13, etc) which always need to be saved on context
-// switches anyway.
-//
-// With this strategy we get the benefit of being able to pass a fair bit of
-// contextual data from the start of a green task to its init function, as well
-// as not hindering any context switches.
-//
-// If you alter this code in any way, you likely need to update
-// src/libgreen/context.rs as well.
-
-#if defined(__APPLE__)
-#define BOOTSTRAP _rust_bootstrap_green_task
-#else
-#define BOOTSTRAP rust_bootstrap_green_task
-#endif
-.globl BOOTSTRAP
-BOOTSTRAP:
-    mov %r12, RUSTRT_ARG0_S
-    mov %r13, RUSTRT_ARG1_S
-    mov %r14, RUSTRT_ARG2_S
-    jmpq *%r15
diff --git a/src/rt/arch/x86_64/regs.h b/src/rt/arch/x86_64/regs.h
deleted file mode 100644
index 25160ca68a6..00000000000
--- a/src/rt/arch/x86_64/regs.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-// This is loosely kept in sync with src/libstd/rt/context.rs
-
-#define RUSTRT_RBX   0
-#define RUSTRT_RSP   1
-#define RUSTRT_RBP   2
-// RCX on Windows, RDI elsewhere
-#define RUSTRT_ARG0  3
-#define RUSTRT_R12   4
-#define RUSTRT_R13   5
-#define RUSTRT_R14   6
-#define RUSTRT_R15   7
-#define RUSTRT_IP    8
-#if defined(__MINGW32__) || defined(_WINDOWS)
-    #define RUSTRT_RDI   9
-    #define RUSTRT_RSI   10
-    #define RUSTRT_ST1   11
-    #define RUSTRT_ST2   12
-    #define RUSTRT_XMM6  14
-    #define RUSTRT_XMM7  16
-    #define RUSTRT_XMM8  18
-    #define RUSTRT_XMM9  20
-    #define RUSTRT_XMM10 22
-    #define RUSTRT_XMM11 24
-    #define RUSTRT_XMM12 26
-    #define RUSTRT_XMM13 28
-    #define RUSTRT_XMM14 30
-    #define RUSTRT_XMM15 32
-    #define RUSTRT_MAX   34
-#else
-    // Not used, just padding
-    #define RUSTRT_XXX   9
-    #define RUSTRT_XMM0 10
-    #define RUSTRT_XMM1 12
-    #define RUSTRT_XMM2 14
-    #define RUSTRT_XMM3 16
-    #define RUSTRT_XMM4 18
-    #define RUSTRT_XMM5 20
-    #define RUSTRT_MAX  22
-#endif
-
-// ARG0 is the register in which the first argument goes.
-// Naturally this depends on your operating system.
-#if defined(__MINGW32__) || defined(_WINDOWS)
-#   define RUSTRT_ARG0_S %rcx
-#   define RUSTRT_ARG1_S %rdx
-#   define RUSTRT_ARG2_S %r8
-#   define RUSTRT_ARG3_S %r9
-#else
-#   define RUSTRT_ARG0_S %rdi
-#   define RUSTRT_ARG1_S %rsi
-#   define RUSTRT_ARG2_S %rdx
-#   define RUSTRT_ARG3_S %rcx
-#   define RUSTRT_ARG4_S %r8
-#   define RUSTRT_ARG5_S %r9
-#endif