Mercurial > projects > ldc
diff tango.patch @ 1079:4e388d9d0e25
Intrinsics overhaul:
- More error checking for pragma(intrinsic)
- Properly handle templating for real (use actual nr of bits, not .sizeof * 8)
- Template all .i* and .f* intrinsics
- The old names are deprecated aliases now
I also added a preliminary patch to make tango.math.Math use the new versions.
(I think it looks a lot nicer now)
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Tue, 10 Mar 2009 04:45:32 +0100 |
parents | |
children | 5710440ea420 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango.patch Tue Mar 10 04:45:32 2009 +0100 @@ -0,0 +1,178 @@ +Index: tango/tango/math/Math.d +=================================================================== +--- tango/tango/math/Math.d (revision 4388) ++++ tango/tango/math/Math.d (working copy) +@@ -80,13 +80,9 @@ + } else version(D_InlineAsm_X86) { + version = Naked_D_InlineAsm_X86; + } +-else version(LDC) ++version(LDC) + { + import ldc.intrinsics; +- version(X86) +- { +- version = LDC_X86; +- } + } + + /* +@@ -312,26 +308,12 @@ + * Results are undefined if |x| >= $(POWER 2,64). + */ + +-version(LDC) ++real cos(real x) /* intrinsic */ + { +- alias llvm_cos_f32 cos; +- alias llvm_cos_f64 cos; +- version(X86) ++ version(LDC) + { +- alias llvm_cos_f80 cos; ++ return llvm_cos(x); + } +- else +- { +- real cos(real x) +- { +- return tango.stdc.math.cosl(x); +- } +- } +-} +-else +-{ +-real cos(real x) /* intrinsic */ +-{ + version(D_InlineAsm_X86) + { + asm +@@ -345,7 +327,6 @@ + return tango.stdc.math.cosl(x); + } + } +-} + + debug(UnitTest) { + unittest { +@@ -366,26 +347,12 @@ + * Bugs: + * Results are undefined if |x| >= $(POWER 2,64). + */ +-version(LDC) ++real sin(real x) /* intrinsic */ + { +- alias llvm_sin_f32 sin; +- alias llvm_sin_f64 sin; +- version(X86) ++ version(LDC) + { +- alias llvm_sin_f80 sin; ++ return llvm_sin(x); + } +- else +- { +- real sin(real x) +- { +- return tango.stdc.math.sinl(x); +- } +- } +-} +-else +-{ +-real sin(real x) /* intrinsic */ +-{ + version(D_InlineAsm_X86) + { + asm +@@ -399,7 +366,6 @@ + return tango.stdc.math.sinl(x); + } + } +-} + + debug(UnitTest) { + unittest { +@@ -999,29 +965,14 @@ + * $(TR $(TD +$(INFIN)) $(TD +$(INFIN)) $(TD no)) + * ) + */ +-version(LDC) ++float sqrt(float x) /* intrinsic */ + { +- alias llvm_sqrt_f32 sqrt; +- alias llvm_sqrt_f64 sqrt; +- version(X86) ++ version(LDC) + { +- alias llvm_sqrt_f80 sqrt; ++ return llvm_sqrt(x); + } +- else ++ else version(D_InlineAsm_X86) + { +- real sqrt(real x) +- { +- return tango.stdc.math.sqrtl(x); +- } +- } +-} +-else +-{ +- +-float sqrt(float x) /* intrinsic */ +-{ +- version(D_InlineAsm_X86) +- { + asm + { + fld x; +@@ -1036,8 +987,12 @@ + + double sqrt(double x) /* intrinsic */ /// ditto + { +- version(D_InlineAsm_X86) ++ version(LDC) + { ++ return llvm_sqrt(x); ++ } ++ else version(D_InlineAsm_X86) ++ { + asm + { + fld x; +@@ -1052,8 +1007,12 @@ + + real sqrt(real x) /* intrinsic */ /// ditto + { +- version(D_InlineAsm_X86) ++ version(LDC) + { ++ return llvm_sqrt(x); ++ } ++ else version(D_InlineAsm_X86) ++ { + asm + { + fld x; +@@ -1066,8 +1025,6 @@ + } + } + +-} +- + /** ditto */ + creal sqrt(creal z) + { +@@ -1714,9 +1671,9 @@ + } + } + } +- version(LDC_X86) ++ version(LDC) + { +- return llvm_pow_f80(x, y); ++ return llvm_pow(x, y); + } + else + {