view runtime/llvmdc.diff @ 443:44f08170f4ef

Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn. Reworked the LLVMDC specific pragmas.
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Fri, 01 Aug 2008 00:32:06 +0200
parents
children f2b5f86348ef
line wrap: on
line source

Index: object.di
===================================================================
--- object.di	(revision 3819)
+++ object.di	(working copy)
@@ -150,6 +150,9 @@
     void function() dtor;
     void function() unitTest;
 
+    void* xgetMembers;
+    void function() ictor;
+
     static int opApply( int delegate( inout ModuleInfo ) );
 }
 
Index: lib/common/tango/core/BitManip.d
===================================================================
--- lib/common/tango/core/BitManip.d	(revision 3819)
+++ lib/common/tango/core/BitManip.d	(working copy)
@@ -171,6 +171,10 @@
      */
     uint outpl( uint port_address, uint value );
 }
+else version( LLVMDC )
+{
+    public import llvmdc.bitmanip;
+}
 else
 {
     public import std.intrinsic;
Index: lib/common/tango/core/Thread.d
===================================================================
--- lib/common/tango/core/Thread.d	(revision 3819)
+++ lib/common/tango/core/Thread.d	(working copy)
@@ -244,10 +244,33 @@
         }
         body
         {
-            version( D_InlineAsm_X86 )
+            version( LLVMDC )
             {
+                // put registers on the stack
+                version(D_InlineAsm_X86)
+                {
+                uint _eax, _ecx, _edx, _ebx, _esp, _ebp, _esi, _edi;
                 asm
                 {
+                    mov _eax, EAX;
+                    mov _ecx, ECX;
+                    mov _edx, EDX;
+                    mov _ebx, EBX;
+                    mov _esp, ESP;
+                    mov _ebp, EBP;
+                    mov _esi, ESI;
+                    mov _edi, EDI;
+                }
+                }
+                else
+                {
+                    // FIXME
+                }
+            }
+            else version( D_InlineAsm_X86 )
+            {
+                asm
+                {
                     pushad;
                 }
             }
@@ -297,8 +320,12 @@
                 }
             }
 
-            version( D_InlineAsm_X86 )
+            version( LLVMDC )
             {
+                // nothing to do
+            }
+            else version( D_InlineAsm_X86 )
+            {
                 asm
                 {
                     popad;
@@ -2266,8 +2293,12 @@
 
 private
 {
-    version( D_InlineAsm_X86 )
+    version( LLVMDC )
     {
+
+    }
+    else version( D_InlineAsm_X86 )
+    {
         version( X86_64 )
         {
 
Index: lib/gc/basic/gcx.d
===================================================================
--- lib/gc/basic/gcx.d	(revision 3819)
+++ lib/gc/basic/gcx.d	(working copy)
@@ -2178,6 +2178,28 @@
             __builtin_unwind_init();
             sp = & sp;
         }
+        else version(LLVMDC)
+        {
+            version(D_InlineAsm_X86)
+            {
+            uint _eax, _ecx, _edx, _ebx, _ebp, _esi, _edi;
+            asm
+            {
+                mov _eax, EAX;
+                mov _ecx, ECX;
+                mov _edx, EDX;
+                mov _ebx, EBX;
+                mov _ebp, EBP;
+                mov _esi, ESI;
+                mov _edi, EDI;
+                mov sp, ESP;
+            }
+            }
+            else
+            {
+                // FIXME
+            }
+        }
         else
         {
         asm
@@ -2191,6 +2213,10 @@
         {
             // nothing to do
         }
+        else version(LLVMDC)
+        {
+            // nothing to do
+        }
         else
         {
         asm
Index: lib/gc/basic/gcbits.d
===================================================================
--- lib/gc/basic/gcbits.d	(revision 3819)
+++ lib/gc/basic/gcbits.d	(working copy)
@@ -39,6 +39,10 @@
 {
     // use the unoptimized version
 }
+else version(LLVMDC)
+{
+    // ditto
+}
 else version (D_InlineAsm_X86)
 {
     version = Asm86;
Index: tango/text/convert/Layout.d
===================================================================
--- tango/text/convert/Layout.d	(revision 3819)
+++ tango/text/convert/Layout.d	(working copy)
@@ -47,6 +47,12 @@
         alias void* Arg;
         alias va_list ArgList;
         }
+else version(LLVMDC)
+        {
+        private import tango.core.Vararg;
+        alias void* Arg;
+        alias va_list ArgList;
+        }
      else
         {
         alias void* Arg;
@@ -197,9 +203,18 @@
                 assert (formatStr, "null format specifier");
                 assert (arguments.length < 64, "too many args in Layout.convert");
 
-                version (GNU)
+                version (LLVMDC)
                         {
                         Arg[64] arglist = void;
+                        foreach (i, arg; arguments)
+                                {
+                                arglist[i] = args;
+                                args += (arg.tsize + size_t.sizeof - 1) & ~ (size_t.sizeof - 1);
+                                }
+                        }
+                else version (GNU)
+                        {
+                        Arg[64] arglist = void;
                         int[64] intargs = void;
                         byte[64] byteargs = void;
                         long[64] longargs = void;
Index: tango/core/Vararg.d
===================================================================
--- tango/core/Vararg.d	(revision 3819)
+++ tango/core/Vararg.d	(working copy)
@@ -15,6 +15,10 @@
 {
     public import std.stdarg;
 }
+else version( LLVMDC )
+{
+    public import llvmdc.vararg;
+}
 else
 {
     /**
Index: tango/math/Math.d
===================================================================
--- tango/math/Math.d	(revision 3819)
+++ tango/math/Math.d	(working copy)
@@ -76,7 +76,77 @@
         version = DigitalMars_D_InlineAsm_X86;
     }
 }
+else version(LLVMDC)
+{
+    private
+    {
 
+    pragma(LLVM_internal, "intrinsic", "llvm.sqrt.f32")
+        float llvm_sqrt(float);
+    pragma(LLVM_internal, "intrinsic", "llvm.sqrt.f64")
+        double llvm_sqrt(double);
+
+    version(LLVM_X86_FP80)
+    {
+        alias tango.stdc.math.tanl llvm_tan;
+        alias tango.stdc.math.acosl llvm_acos;
+        alias tango.stdc.math.asinl llvm_asin;
+        alias tango.stdc.math.atanl llvm_atan;
+        alias tango.stdc.math.atan2l llvm_atan2;
+        alias tango.stdc.math.coshl llvm_cosh;
+        alias tango.stdc.math.sinhl llvm_sinh;
+        alias tango.stdc.math.tanhl llvm_tanh;
+        alias tango.stdc.math.cbrtl llvm_cbrt;
+        alias tango.stdc.math.expl llvm_exp;
+        alias tango.stdc.math.exp1ml llvm_exp1m;
+        alias tango.stdc.math.exp2l llvm_exp2;
+        alias tango.stdc.math.logl llvm_log;
+        alias tango.stdc.math.log1pl llvm_log1p;
+        alias tango.stdc.math.log2l llvm_log2;
+        alias tango.stdc.math.log10l llvm_log10;
+        alias tango.stdc.math.powl llvm_pow;
+        alias tango.stdc.math.lrintl llvm_lrint;
+        alias tango.stdc.math.llrintl llvm_llrint;
+
+        pragma(LLVM_internal, "intrinsic", "llvm.cos.f80")
+            real llvm_cos(real);
+        pragma(LLVM_internal, "intrinsic", "llvm.sin.f80")
+            real llvm_sin(real);
+        pragma(LLVM_internal, "intrinsic", "llvm.sqrt.f80")
+            real llvm_sqrt(real);
+    }
+    else
+    {
+        alias tango.stdc.math.tan llvm_tan;
+        alias tango.stdc.math.acos llvm_acos;
+        alias tango.stdc.math.asin llvm_asin;
+        alias tango.stdc.math.atan llvm_atan;
+        alias tango.stdc.math.atan2 llvm_atan2;
+        alias tango.stdc.math.cosh llvm_cosh;
+        alias tango.stdc.math.sinh llvm_sinh;
+        alias tango.stdc.math.tanh llvm_tanh;
+        alias tango.stdc.math.cbrt llvm_cbrt;
+        alias tango.stdc.math.exp llvm_exp;
+        alias tango.stdc.math.exp1m llvm_exp1m;
+        alias tango.stdc.math.exp2 llvm_exp2;
+        alias tango.stdc.math.log llvm_log;
+        alias tango.stdc.math.log1p llvm_log1p;
+        alias tango.stdc.math.log2 llvm_log2;
+        alias tango.stdc.math.log10 llvm_log10;
+        alias tango.stdc.math.pow llvm_pow;
+        alias tango.stdc.math.lrint llvm_lrint;
+        alias tango.stdc.math.llrint llvm_llrint;
+
+        pragma(LLVM_internal, "intrinsic", "llvm.cos.f64")
+            real llvm_cos(real);
+        pragma(LLVM_internal, "intrinsic", "llvm.sin.f64")
+            real llvm_sin(real);
+        pragma(LLVM_internal, "intrinsic", "llvm.sqrt.f64")
+            real llvm_sqrt(real);
+    }
+    }
+}
+
 /*
  * Constants
  */
@@ -300,6 +370,10 @@
  */
 real cos(real x) /* intrinsic */
 {
+    version(LLVMDC)
+    {
+        return llvm_cos(x);
+    }
     version(D_InlineAsm_X86)
     {
         asm
@@ -335,6 +409,10 @@
  */
 real sin(real x) /* intrinsic */
 {
+    version(LLVMDC)
+    {
+        return llvm_sin(x);
+    }
     version(D_InlineAsm_X86)
     {
         asm
@@ -374,6 +452,9 @@
 {
     version (GNU) {
         return tanl(x);
+    }
+    else version(LLVMDC) {
+        return llvm_tan(x);
     } else {
     asm
     {
@@ -576,7 +657,14 @@
  */
 real acos(real x)
 {
-    return tango.stdc.math.acosl(x);
+    version(LLVMDC)
+    {
+        return llvm_acos(x);
+    }
+    else
+    {
+        return tango.stdc.math.acosl(x);
+    }
 }
 
 debug(UnitTest) {
@@ -599,7 +687,14 @@
  */
 real asin(real x)
 {
-    return tango.stdc.math.asinl(x);
+    version(LLVMDC)
+    {
+        return llvm_asin(x);
+    }
+    else
+    {
+        return tango.stdc.math.asinl(x);
+    }
 }
 
 debug(UnitTest) {
@@ -621,7 +716,14 @@
  */
 real atan(real x)
 {
-    return tango.stdc.math.atanl(x);
+    version(LLVMDC)
+    {
+        return llvm_atan(x);
+    }
+    else
+    {
+        return tango.stdc.math.atanl(x);
+    }
 }
 
 debug(UnitTest) {
@@ -658,7 +760,14 @@
  */
 real atan2(real y, real x)
 {
-    return tango.stdc.math.atan2l(y,x);
+    version(LLVMDC)
+    {
+        return llvm_atan2(x);
+    }
+    else
+    {
+        return tango.stdc.math.atan2l(x);
+    }
 }
 
 debug(UnitTest) {
@@ -707,7 +816,14 @@
  */
 real cosh(real x)
 {
-    return tango.stdc.math.coshl(x);
+    version(LLVMDC)
+    {
+        return llvm_cosh(x);
+    }
+    else
+    {
+        return tango.stdc.math.coshl(x);
+    }
 }
 
 debug(UnitTest) {
@@ -728,7 +844,14 @@
  */
 real sinh(real x)
 {
-    return tango.stdc.math.sinhl(x);
+    version(LLVMDC)
+    {
+        return llvm_sinh(x);
+    }
+    else
+    {
+        return tango.stdc.math.sinhl(x);
+    }
 }
 
 debug(UnitTest) {
@@ -749,7 +872,14 @@
  */
 real tanh(real x)
 {
-    return tango.stdc.math.tanhl(x);
+    version(LLVMDC)
+    {
+        return llvm_tanh(x);
+    }
+    else
+    {
+        return tango.stdc.math.tanhl(x);
+    }
 }
 
 debug(UnitTest) {
@@ -949,8 +1079,12 @@
  */
 float sqrt(float x) /* intrinsic */
 {
-    version(D_InlineAsm_X86)
+    version(LLVMDC)
     {
+        return llvm_sqrt_f32(x);
+    }
+    else version(D_InlineAsm_X86)
+    {
         asm
         {
             fld x;
@@ -965,8 +1099,12 @@
 
 double sqrt(double x) /* intrinsic */ /// ditto
 {
-    version(D_InlineAsm_X86)
+    version(LLVMDC)
     {
+        return llvm_sqrt_f64(x);
+    }
+    else version(D_InlineAsm_X86)
+    {
         asm
         {
             fld x;
@@ -981,8 +1119,12 @@
 
 real sqrt(real x) /* intrinsic */ /// ditto
 {
-    version(D_InlineAsm_X86)
+    version(LLVMDC)
     {
+        return llvm_sqrt_f80(x);
+    }
+    else version(D_InlineAsm_X86)
+    {
         asm
         {
             fld x;
@@ -1045,7 +1187,14 @@
  */
 real cbrt(real x)
 {
-    return tango.stdc.math.cbrtl(x);
+    version(LLVMDC)
+    {
+        return llvm_cbrt(x);
+    }
+    else
+    {
+        return tango.stdc.math.cbrtl(x);
+    }
 }
 
 
@@ -1067,7 +1216,14 @@
  */
 real exp(real x)
 {
-    return tango.stdc.math.expl(x);
+    version(LLVMDC)
+    {
+        return llvm_exp(x);
+    }
+    else
+    {
+        return tango.stdc.math.expl(x);
+    }
 }
 
 debug(UnitTest) {
@@ -1093,7 +1249,14 @@
  */
 real expm1(real x)
 {
-    return tango.stdc.math.expm1l(x);
+    version(LLVMDC)
+    {
+        return llvm_expm1(x);
+    }
+    else
+    {
+        return tango.stdc.math.expm1l(x);
+    }
 }
 
 debug(UnitTest) {
@@ -1115,7 +1278,14 @@
  */
 real exp2(real x)
 {
-    return tango.stdc.math.exp2l(x);
+    version(LLVMDC)
+    {
+        return llvm_exp2(x);
+    }
+    else
+    {
+        return tango.stdc.math.exp2l(x);
+    }
 }
 
 debug(UnitTest) {
@@ -1141,7 +1311,14 @@
  */
 real log(real x)
 {
-    return tango.stdc.math.logl(x);
+    version(LLVMDC)
+    {
+        return llvm_log(x);
+    }
+    else
+    {
+        return tango.stdc.math.logl(x);
+    }
 }
 
 debug(UnitTest) {
@@ -1167,7 +1344,14 @@
  */
 real log1p(real x)
 {
-    return tango.stdc.math.log1pl(x);
+    version(LLVMDC)
+    {
+        return llvm_log1p(x);
+    }
+    else
+    {
+        return tango.stdc.math.log1pl(x);
+    }
 }
 
 debug(UnitTest) {
@@ -1190,7 +1374,14 @@
  */
 real log2(real x)
 {
-    return tango.stdc.math.log2l(x);
+    version(LLVMDC)
+    {
+        return llvm_log2(x);
+    }
+    else
+    {
+        return tango.stdc.math.log2l(x);
+    }
 }
 
 debug(UnitTest) {
@@ -1212,7 +1403,14 @@
  */
 real log10(real x)
 {
-    return tango.stdc.math.log10l(x);
+    version(LLVMDC)
+    {
+        return llvm_log10(x);
+    }
+    else
+    {
+        return tango.stdc.math.log10l(x);
+    }
 }
 
 debug(UnitTest) {
@@ -1477,7 +1675,14 @@
         }
     }
     }
-    return tango.stdc.math.powl(x, y);
+    version(LLVMDC)
+    {
+        return llvm_pow(x, y);
+    }
+    else
+    {
+        return tango.stdc.math.powl(x, y);
+    }
 }
 
 debug(UnitTest) {
@@ -1823,6 +2028,10 @@
         }
         return n;
     }
+    else version(LLVMDC)
+    {
+        return llvm_lrint(x);
+    }
     else
     {
         return tango.stdc.math.lrintl(x);
@@ -1842,6 +2051,10 @@
         }
         return n;
     }
+    else version(LLVMDC)
+    {
+        return llvm_llrint(x);
+    }
     else
     {
         return tango.stdc.math.llrintl(x);
Index: tango/stdc/stdlib.d
===================================================================
--- tango/stdc/stdlib.d	(revision 3819)
+++ tango/stdc/stdlib.d	(working copy)
@@ -94,6 +94,11 @@
 {
     void* alloca(size_t size);
 }
+else version( LLVMDC )
+{
+    pragma(alloca)
+        void* alloca(size_t size);
+}
 else version( GNU )
 {
     private import gcc.builtins;
Index: tango/stdc/stdarg.d
===================================================================
--- tango/stdc/stdarg.d	(revision 3819)
+++ tango/stdc/stdarg.d	(working copy)
@@ -13,6 +13,10 @@
 {
     public import std.c.stdarg;
 }
+else version( LLVMDC )
+{
+    public import llvmdc.cstdarg;
+}
 else
 {
     alias void* va_list;