Mercurial > projects > ldc
diff runtime/ldc.diff @ 755:61c7a96f28c3
Merge in most of x86-64 tango patch.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Sat, 08 Nov 2008 11:34:35 +0100 |
parents | f34b552619fd |
children | 0375841e3175 |
line wrap: on
line diff
--- a/runtime/ldc.diff Sat Nov 08 10:22:08 2008 +0100 +++ b/runtime/ldc.diff Sat Nov 08 11:34:35 2008 +0100 @@ -96,7 +96,7 @@ extern (C) void thread_suspendHandler( int sig ) -@@ -256,8 +257,29 @@ +@@ -256,8 +257,50 @@ } body { @@ -117,6 +117,27 @@ + mov edi[EBP], EDI ; + } + } ++ else version (X86_64) ++ { ++ ulong rax,rbx,rcx,rdx,rbp,rsi,rdi,rsp,r10,r11,r12,r13,r14,r15; ++ asm ++ { ++ movq rax[RBP], RAX ; ++ movq rbx[RBP], RBX ; ++ movq rcx[RBP], RCX ; ++ movq rdx[RBP], RDX ; ++ movq rbp[RBP], RBP ; ++ movq rsi[RBP], RSI ; ++ movq rdi[RBP], RDI ; ++ movq rsp[RBP], RSP ; ++ movq r10[RBP], R10 ; ++ movq r11[RBP], R11 ; ++ movq r12[RBP], R12 ; ++ movq r13[RBP], R13 ; ++ movq r14[RBP], R14 ; ++ movq r15[RBP], R15 ; ++ } ++ } + else + { + static assert( false, "Architecture not supported." ); @@ -127,7 +148,7 @@ asm { pushad; -@@ -298,7 +320,7 @@ +@@ -298,7 +341,7 @@ status = sigdelset( &sigres, SIGUSR2 ); assert( status == 0 ); @@ -136,7 +157,7 @@ assert( status == 0 ); sigsuspend( &sigres ); -@@ -309,8 +331,12 @@ +@@ -309,8 +352,12 @@ } } @@ -150,7 +171,7 @@ asm { popad; -@@ -1584,8 +1610,14 @@ +@@ -1584,8 +1631,14 @@ status = sigaction( SIGUSR2, &sigusr2, null ); assert( status == 0 ); @@ -167,7 +188,7 @@ status = pthread_key_create( &Thread.sm_this, null ); assert( status == 0 ); -@@ -1793,7 +1825,7 @@ +@@ -1793,7 +1846,7 @@ // to simply loop on sem_wait at the end, but I'm not // convinced that this would be much faster than the // current approach. @@ -176,7 +197,7 @@ } else if( !t.m_lock ) { -@@ -2298,6 +2330,13 @@ +@@ -2298,7 +2351,20 @@ version = AsmPPC_Posix; } @@ -187,19 +208,28 @@ + else version( Posix ) + version = LLVM_AsmX86_Posix; + } ++ else version( LLVM_InlineAsm_X86_64 ) ++ { ++ version( Posix ) ++ version = LLVM_AsmX86_64_Posix; ++ } ++ version( Posix ) { -@@ -2308,6 +2347,8 @@ + import tango.stdc.posix.unistd; // for sysconf +@@ -2308,6 +2374,10 @@ version( AsmX86_Win32 ) {} else version( AsmX86_Posix ) {} else version( AsmPPC_Posix ) {} else + version( LLVM_AsmX86_Win32 ) {} else + version( LLVM_AsmX86_Posix ) {} else ++//TODO: Enable when x86-64 Posix supports fibers ++// version( LLVM_AsmX86_64_Posix ) {} else { // NOTE: The ucontext implementation requires architecture specific // data definitions to operate so testing for it must be done -@@ -2318,10 +2359,10 @@ +@@ -2318,10 +2388,10 @@ import tango.stdc.posix.ucontext; } } @@ -212,7 +242,7 @@ static this() { -@@ -2348,7 +2389,7 @@ +@@ -2348,7 +2418,7 @@ } } @@ -221,7 +251,7 @@ //////////////////////////////////////////////////////////////////////////////// // Fiber Entry Point and Context Switch //////////////////////////////////////////////////////////////////////////////// -@@ -2462,6 +2503,22 @@ +@@ -2462,6 +2532,28 @@ ret; } } @@ -241,10 +271,46 @@ + mov ESP, newp; + } + } ++/+ ++ version( LLVM_AsmX86_64_Posix ) ++ { ++ //TODO: Fiber implementation here ++ } +++/ else static if( is( ucontext_t ) ) { Fiber cfib = Fiber.getThis(); -@@ -3127,6 +3184,16 @@ +@@ -2980,16 +3072,25 @@ + m_size = sz; + } + else +- { static if( is( typeof( mmap ) ) ) ++ { ++ static if( is( typeof( mmap ) ) ) + { +- m_pmem = mmap( null, ++ //TODO: This seems a bit dubious. ++ version (X86_64) ++ { ++ m_pmem = malloc( sz ); ++ } ++ else ++ { ++ m_pmem = mmap( null, + sz, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANON, + -1, + 0 ); +- if( m_pmem == MAP_FAILED ) +- m_pmem = null; ++ if( m_pmem == MAP_FAILED ) ++ m_pmem = null; ++ } + } + else static if( is( typeof( valloc ) ) ) + { +@@ -3127,6 +3228,22 @@ push( 0x00000000 ); // ESI push( 0x00000000 ); // EDI } @@ -258,6 +324,12 @@ + push( 0x00000000 ); // ESI + push( 0x00000000 ); // EDI + } ++//TODO: Implement x86-64 fibers ++/+ ++ else version( LLVM_AsmX86_Posix ) ++ { ++ } +++/ else version( AsmPPC_Posix ) { version( StackGrowsDown ) @@ -293,7 +365,7 @@ extern (C) void* rt_stackBottom(); extern (C) void* rt_stackTop(); -@@ -2178,6 +2178,28 @@ +@@ -2178,6 +2178,49 @@ __builtin_unwind_init(); sp = & sp; } @@ -314,6 +386,27 @@ + mov sp[EBP],ESP ; + } + } ++ else version (X86_64) ++ { ++ ulong rax,rbx,rcx,rdx,rbp,rsi,rdi,rsp,r10,r11,r12,r13,r14,r15; ++ asm ++ { ++ movq rax[RBP], RAX ; ++ movq rbx[RBP], RBX ; ++ movq rcx[RBP], RCX ; ++ movq rdx[RBP], RDX ; ++ movq rbp[RBP], RBP ; ++ movq rsi[RBP], RSI ; ++ movq rdi[RBP], RDI ; ++ movq rsp[RBP], RSP ; ++ movq r10[RBP], R10 ; ++ movq r11[RBP], R11 ; ++ movq r12[RBP], R12 ; ++ movq r13[RBP], R13 ; ++ movq r14[RBP], R14 ; ++ movq r15[RBP], R15 ; ++ } ++ } + else + { + static assert( false, "Architecture not supported." ); @@ -322,7 +415,7 @@ else { asm -@@ -2191,6 +2213,10 @@ +@@ -2191,6 +2234,10 @@ { // nothing to do }