diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- phobos-orig/std/concurrency.d phobos/std/concurrency.d --- phobos-orig/std/concurrency.d 2010-10-29 05:54:44.000000000 +0400 +++ phobos/std/concurrency.d 2010-11-07 19:26:52.000000000 +0300 @@ -359,9 +359,10 @@ owner = ownerTid; fn( args ); } - + // TODO: MessageList and &exec should be shared. auto t = new Thread( &exec ); t.start(); + version(LDC) Thread.sleep(5_000); links[spawnTid] = linked; return spawnTid; } diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- phobos-orig/std/conv.d phobos/std/conv.d --- phobos-orig/std/conv.d 2010-10-29 05:54:44.000000000 +0400 +++ phobos/std/conv.d 2010-11-08 15:54:33.109464001 +0300 @@ -1405,7 +1405,7 @@ else // not hex { if (toupper(p.front) == 'N' && !startsWithZero) - { + { // nan enforce((p.popFront(), !p.empty && toupper(p.front) == 'A') && (p.popFront(), !p.empty && toupper(p.front) == 'N'), @@ -3243,6 +3243,11 @@ T toImpl(T, S)(S d) if (is(Unqual!S == double) && isSomeString!(T)) { //alias Unqual!(ElementType!T) Char; + version(LDC) // FIXME: workarond for case when this function returns "-nan" + { + if (isnan(d)) + return "nan"; + } char[20] buffer; int len = sprintf(buffer.ptr, "%g", d); return to!T(buffer[0 .. len].dup); diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- phobos-orig/std/format.d phobos/std/format.d --- phobos-orig/std/format.d 2010-10-29 05:54:44.000000000 +0400 +++ phobos/std/format.d 2010-11-07 19:26:52.000000000 +0300 @@ -2582,20 +2582,42 @@ FLprecision = 0x80, } - static TypeInfo skipCI(TypeInfo valti) + version(LDC) { - for (;;) + static TypeInfo skipCI(TypeInfo valti) { - if (valti.classinfo.name.length == 18 && - valti.classinfo.name[9..18] == "Invariant") - valti = (cast(TypeInfo_Invariant)valti).next; - else if (valti.classinfo.name.length == 14 && - valti.classinfo.name[9..14] == "Const") - valti = (cast(TypeInfo_Const)valti).next; - else - break; + for (;;) + { + if (valti.classinfo.name.length == 18 && + valti.classinfo.name[9..18] == "Invariant") + valti = (cast(TypeInfo_Invariant)valti).base; + else if (valti.classinfo.name.length == 14 && + valti.classinfo.name[9..14] == "Const") + valti = (cast(TypeInfo_Const)valti).base; + else + break; + } + return valti; + } + + } + else + { + static TypeInfo skipCI(TypeInfo valti) + { + for (;;) + { + if (valti.classinfo.name.length == 18 && + valti.classinfo.name[9..18] == "Invariant") + valti = (cast(TypeInfo_Invariant)valti).next; + else if (valti.classinfo.name.length == 14 && + valti.classinfo.name[9..14] == "Const") + valti = (cast(TypeInfo_Const)valti).next; + else + break; + } + return valti; } - return valti; } void formatArg(char fc) diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- phobos-orig/std/functional.d phobos/std/functional.d --- phobos-orig/std/functional.d 2010-10-29 05:54:44.000000000 +0400 +++ phobos/std/functional.d 2010-11-07 19:26:52.000000000 +0300 @@ -713,6 +713,13 @@ assert(dg_pure_nothrow() == 7); //assert(dg_pure_nothrow_safe() == 8); } + version (LDC) + { + // FIXME: + } + else + { + /* test for linkage */ { struct S @@ -724,4 +731,6 @@ auto dg_xtrnD = toDelegate(&S.xtrnD); static assert(! is(typeof(dg_xtrnC) == typeof(dg_xtrnD))); } + + } } diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- phobos-orig/std/internal/math/biguintx86.d phobos/std/internal/math/biguintx86.d --- phobos-orig/std/internal/math/biguintx86.d 2010-10-29 05:54:44.000000000 +0400 +++ phobos/std/internal/math/biguintx86.d 2010-11-07 19:26:52.000000000 +0300 @@ -734,7 +734,10 @@ // EDI = dest // ESI = src - enum string OP = (op=='+')? "add" : "sub"; + version(LDC) { + } else { + enum string OP = (op=='+')? "add" : "sub"; + } version(D_PIC) { enum { zero = 0 } } else { @@ -768,7 +771,10 @@ jnz L_enter_odd; } // Main loop, with entry point for even length -mixin(asmMulAdd_innerloop(OP, "ESP+LASTPARAM")); +version(LDC) + mixin(asmMulAdd_innerloop((op=='+')? "add" : "sub", "ESP+LASTPARAM")); +else + mixin(asmMulAdd_innerloop(OP, "ESP+LASTPARAM")); asm { mov EAX, EBP; // get final carry pop EBP; @@ -778,6 +784,9 @@ ret 5*4; } L_enter_odd: +version(LDC) + mixin(asmMulAdd_enter_odd((op=='+')? "add" : "sub", "ESP+LASTPARAM")); +else mixin(asmMulAdd_enter_odd(OP, "ESP+LASTPARAM")); } diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- phobos-orig/std/math.d phobos/std/math.d --- phobos-orig/std/math.d 2010-10-29 05:54:44.000000000 +0400 +++ phobos/std/math.d 2010-11-07 19:26:52.000000000 +0300 @@ -276,7 +276,7 @@ assert(abs(71.6Li) == 71.6L); assert(abs(-56) == 56); assert(abs(2321312L) == 2321312L); - assert(abs(-1+1i) == sqrt(2.0)); + assert(abs(-1+1i) == sqrt(2.0L)); } /*********************************** @@ -318,7 +318,10 @@ * Results are undefined if |x| >= $(POWER 2,64). */ -@safe pure nothrow real cos(real x); /* intrinsic */ +version(LDC) + @safe pure nothrow real cos(real x) { return llvm_cos(x); } +else + @safe pure nothrow real cos(real x); /* intrinsic */ /*********************************** * Returns sine of x. x is in radians. @@ -333,7 +336,10 @@ * Results are undefined if |x| >= $(POWER 2,64). */ -@safe pure nothrow real sin(real x); /* intrinsic */ +version(LDC) + @safe pure nothrow real sin(real x) { return llvm_sin(x); } +else + @safe pure nothrow real sin(real x); /* intrinsic */ /*********************************** @@ -400,7 +406,9 @@ @trusted pure nothrow real tan(real x) { - version(Naked_D_InlineAsm_X86) { + version(LDC) { + return core.stdc.math.tanl(x); + } else version(Naked_D_InlineAsm_X86) { asm { fld x[EBP] ; // load theta @@ -831,6 +839,20 @@ * ) */ +version(LDC) +{ + +@safe pure nothrow +{ + float sqrt(float x) { return llvm_sqrt(x); } + double sqrt(double x) { return llvm_sqrt(x); } + real sqrt(real x) { return llvm_sqrt(x); } +} + +} +else +{ + @safe pure nothrow { float sqrt(float x); /* intrinsic */ @@ -838,6 +860,8 @@ real sqrt(real x); /* intrinsic */ /// ditto } +} + @trusted pure nothrow { // Should be @safe. See bugs 4628, 4630. // Create explicit overloads for integer sqrts. No ddoc for these because // hopefully a more elegant solution will eventually be found, so we don't @@ -1413,9 +1437,22 @@ * Compute n * 2$(SUP exp) * References: frexp */ +version(LDC) +{ + +pure nothrow real ldexp(real n, int exp) +{ + return core.stdc.math.ldexpl(n, exp); +} + +} +else +{ @safe pure nothrow real ldexp(real n, int exp); /* intrinsic */ +} + unittest { assert(ldexp(1, -16384) == 0x1p-16384L); assert(ldexp(1, -16382) == 0x1p-16382L); @@ -1608,7 +1645,31 @@ * $(TR $(TD $(PLUSMN)$(INFIN)) $(TD +$(INFIN)) ) * ) */ -@safe pure nothrow real fabs(real x); /* intrinsic */ +version(LDC) { + version( FreeBSD ) + version (all) // < 8-CURRENT + private extern(C) real fabsl(real x) { return fabs(x); } + else + private extern(C) real fabsl(real x); + else + private extern(C) real fabsl(real x); + pure nothrow real fabs(real x) + { + version(D_InlineAsm_X86) + { + asm { + fld x; + fabs; + } + } + else + { + return fabsl(x); + } + } +} else { + @safe pure nothrow real fabs(real x); /* intrinsic */ +} /*********************************************************************** @@ -2993,9 +3054,15 @@ assert(pow(x,eight) == (x * x) * (x * x) * (x * x) * (x * x)); assert(pow(x, neg1) == 1 / x); - assert(pow(xd, neg2) == 1 / (x * x)); + version(LDC) // FIXME: + assert(pow(xd, neg2) == 1 / (xd * xd)); + else + assert(pow(xd, neg2) == 1 / (x * x)); assert(pow(x, neg3) == 1 / (x * x * x)); - assert(pow(xf, neg8) == 1 / ((x * x) * (x * x) * (x * x) * (x * x))); + version(LDC) + assert(pow(xf, neg8) == 1 / ((xf * xf) * (xf * xf) * (xf * xf) * (xf * xf))); + else + assert(pow(xf, neg8) == 1 / ((x * x) * (x * x) * (x * x) * (x * x))); } /** Compute the value of an integer x, raised to the power of a positive diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- phobos-orig/std/openrj.d phobos/std/openrj.d --- phobos-orig/std/openrj.d 2009-09-03 12:01:40.000000000 +0400 +++ phobos/std/openrj.d 2010-10-26 13:17:37.000000000 +0400 @@ -620,11 +620,11 @@ /** * */ - int opApply(int delegate(inout Field field) dg) + int opApply(int delegate(ref Field field) dg) { int result = 0; - foreach (inout field; m_fields) + foreach (ref Field field; m_fields) { result = dg(field); @@ -1000,11 +1000,11 @@ /** * */ - int opApply(int delegate(inout Record record) dg) + int opApply(int delegate(ref Record record) dg) { int result = 0; - foreach(inout Record record; m_records) + foreach(ref Record record; m_records) { result = dg(record); @@ -1020,11 +1020,11 @@ /** * */ - int opApply(int delegate(inout Field field) dg) + int opApply(int delegate(ref Field field) dg) { int result = 0; - foreach(inout Field field; m_fields) + foreach(ref Field field; m_fields) { result = dg(field); diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- phobos-orig/std/outbuffer.d phobos/std/outbuffer.d --- phobos-orig/std/outbuffer.d 2010-10-29 05:54:44.000000000 +0400 +++ phobos/std/outbuffer.d 2010-11-05 13:59:42.000000000 +0300 @@ -308,8 +308,15 @@ void printf(string format, ...) { va_list ap; - ap = cast(va_list)&format; - ap += format.sizeof; + version(LDC) + { + ap = _argptr; + } + else + { + ap = cast(va_list)&format; + ap += format.sizeof; + } vprintf(format, ap); }