Ticket #1212: llvmdc.diff
| File llvmdc.diff, 15.7 kB (added by lindquist, 4 years ago) |
|---|
updated patch for rev [3899] |
-
object.di
old new 150 150 void function() dtor; 151 151 void function() unitTest; 152 152 153 void* xgetMembers; 154 void function() ictor; 155 153 156 static int opApply( int delegate( inout ModuleInfo ) ); 154 157 } 155 158 -
lib/unittest.sh
old new 18 18 --help: This message 19 19 --run-all: Reports result instead of breaking. Do not use this if you want to 20 20 run unittest runner through a debugger. 21 dmd: Builds unittests for dmd 22 gdc: Builds unittests for gdc 21 dmd: Builds unittests for dmd 22 gdc: Builds unittests for gdc 23 llvmdc: Builds unittests for llvmdc 23 24 24 25 <none>: Builds unittests for all known compilers.' 25 26 exit 0 … … 86 87 void main() {} 87 88 EOF 88 89 89 rebuild -w -d - g -L-ldl -L-lz -L-lbz2 -debug=UnitTest -debug -full -clean -unittest \90 rebuild -w -d -L-ldl -L-lz -L-lbz2 -debug=UnitTest -debug -full -clean -unittest \ 90 91 -version=UnitTest $EXE.d tango/core/*.d tango/core/sync/*.d tango/io/digest/*.d \ 91 92 tango/io/model/*.d tango/io/protocol/*.d tango/io/selector/*.d tango/io/*.d \ 92 93 tango/io/vfs/*.d tango/io/vfs/model/*.d \ … … 125 126 gdc) 126 127 GDC=1 127 128 ;; 129 llvmdc) 130 LLVMDC=1 131 ;; 128 132 *) 129 133 usage 130 134 ;; … … 132 136 shift 133 137 done 134 138 135 if [ ! "$DMD" -a ! "$GDC" ]139 if [ ! "$DMD" -a ! "$GDC" -a ! "$LLVMDC" ] 136 140 then 137 141 DMD=1 138 142 GDC=1 143 LLVMDC=1 139 144 fi 140 145 141 146 if [ "$DMD" = "1" ] … … 146 151 then 147 152 compile gdc runUnitTest_gdc 148 153 fi 149 154 if [ "$LLVMDC" = "1" ] 155 then 156 compile llvmdc runUnitTest_llvmdc 157 fi -
lib/common/tango/core/BitManip.d
old new 171 171 */ 172 172 uint outpl( uint port_address, uint value ); 173 173 } 174 else version( LLVMDC ) 175 { 176 public import llvmdc.bitmanip; 177 } 174 178 else 175 179 { 176 180 public import std.intrinsic; -
lib/common/tango/core/Thread.d
old new 255 255 { 256 256 __builtin_unwind_init(); 257 257 } 258 else version( LLVMDC ) 259 { 260 pragma(msg, "don't know how to push registers on the stack for this architecture with LLVMDC"); 261 } 258 262 else 259 263 { 260 264 static assert( false, "Architecture not supported." ); … … 308 312 { 309 313 // registers will be popped automatically 310 314 } 315 else version( LLVMDC ) 316 { 317 // TODO 318 } 311 319 else 312 320 { 313 321 static assert( false, "Architecture not supported." ); -
lib/gc/basic/gcx.d
old new 2178 2178 __builtin_unwind_init(); 2179 2179 sp = & sp; 2180 2180 } 2181 else version(LLVMDC) 2182 { 2183 version(X86) 2184 { 2185 asm 2186 { 2187 pushad ; 2188 mov sp[EBP],ESP ; 2189 } 2190 } 2191 else 2192 { 2193 pragma(msg, "don't know how to push registers on the stack for this architecture with llvmdc"); 2194 } 2195 } 2181 2196 else 2182 2197 { 2183 2198 asm … … 2191 2206 { 2192 2207 // nothing to do 2193 2208 } 2209 else version(LLVMDC) 2210 { 2211 version(X86) 2212 { 2213 asm 2214 { 2215 popad ; 2216 } 2217 } 2218 else 2219 { 2220 // TODO 2221 } 2222 } 2194 2223 else 2195 2224 { 2196 2225 asm -
lib/gc/basic/gcbits.d
old new 39 39 { 40 40 // use the unoptimized version 41 41 } 42 else version(LLVMDC) 43 { 44 // ditto 45 } 42 46 else version (D_InlineAsm_X86) 43 47 { 44 48 version = Asm86; -
tango/text/convert/Layout.d
old new 47 47 alias void* Arg; 48 48 alias va_list ArgList; 49 49 } 50 else version(LLVMDC) 51 { 52 private import tango.core.Vararg; 53 alias void* Arg; 54 alias va_list ArgList; 55 } 50 56 else 51 57 { 52 58 alias void* Arg; … … 197 203 assert (formatStr, "null format specifier"); 198 204 assert (arguments.length < 64, "too many args in Layout.convert"); 199 205 200 version ( GNU)206 version (LLVMDC) 201 207 { 202 208 Arg[64] arglist = void; 209 foreach (i, arg; arguments) 210 { 211 arglist[i] = args; 212 args += (arg.tsize + size_t.sizeof - 1) & ~ (size_t.sizeof - 1); 213 } 214 } 215 else version (GNU) 216 { 217 Arg[64] arglist = void; 203 218 int[64] intargs = void; 204 219 byte[64] byteargs = void; 205 220 long[64] longargs = void; -
tango/core/Vararg.d
old new 15 15 { 16 16 public import std.stdarg; 17 17 } 18 else version( LLVMDC ) 19 { 20 public import llvmdc.vararg; 21 } 18 22 else 19 23 { 20 24 /** -
tango/core/Atomic.d
old new 270 270 271 271 272 272 //////////////////////////////////////////////////////////////////////////////// 273 // LLVMDC Atomics Implementation 274 //////////////////////////////////////////////////////////////////////////////// 275 276 277 else version( LLVMDC ) 278 { 279 import llvmdc.intrinsics; 280 281 282 //////////////////////////////////////////////////////////////////////////// 283 // Atomic Load 284 //////////////////////////////////////////////////////////////////////////// 285 286 287 template atomicLoad( msync ms = msync.seq, T ) 288 { 289 T atomicLoad(ref T val) 290 { 291 llvm_memory_barrier( 292 ms == msync.hlb || ms == msync.acq || ms == msync.seq, 293 ms == msync.hsb || ms == msync.acq || ms == msync.seq, 294 ms == msync.slb || ms == msync.rel || ms == msync.seq, 295 ms == msync.ssb || ms == msync.rel || ms == msync.seq, 296 false); 297 static if (isPointerType!(T)) 298 { 299 return cast(T)llvm_atomic_load_add!(size_t)(cast(size_t*)&val, 0); 300 } 301 else 302 { 303 return llvm_atomic_load_add!(T)(&val, cast(T)0); 304 } 305 } 306 } 307 308 309 //////////////////////////////////////////////////////////////////////////// 310 // Atomic Store 311 //////////////////////////////////////////////////////////////////////////// 312 313 314 template atomicStore( msync ms = msync.seq, T ) 315 { 316 void atomicStore( ref T val, T newval ) 317 { 318 llvm_memory_barrier( 319 ms == msync.hlb || ms == msync.acq || ms == msync.seq, 320 ms == msync.hsb || ms == msync.acq || ms == msync.seq, 321 ms == msync.slb || ms == msync.rel || ms == msync.seq, 322 ms == msync.ssb || ms == msync.rel || ms == msync.seq, 323 false); 324 static if (isPointerType!(T)) 325 { 326 llvm_atomic_swap!(size_t)(cast(size_t*)&val, cast(size_t)newval); 327 } 328 else static if (is(T == bool)) 329 { 330 llvm_atomic_swap!(ubyte)(cast(ubyte*)&val, newval?1:0); 331 } 332 else 333 { 334 llvm_atomic_swap!(T)(&val, newval); 335 } 336 } 337 } 338 339 340 //////////////////////////////////////////////////////////////////////////// 341 // Atomic Store If 342 //////////////////////////////////////////////////////////////////////////// 343 344 345 template atomicStoreIf( msync ms = msync.seq, T ) 346 { 347 bool atomicStoreIf( ref T val, T newval, T equalTo ) 348 { 349 llvm_memory_barrier( 350 ms == msync.hlb || ms == msync.acq || ms == msync.seq, 351 ms == msync.hsb || ms == msync.acq || ms == msync.seq, 352 ms == msync.slb || ms == msync.rel || ms == msync.seq, 353 ms == msync.ssb || ms == msync.rel || ms == msync.seq, 354 false); 355 T oldval = void; 356 static if (isPointerType!(T)) 357 { 358 oldval = cast(T)llvm_atomic_cmp_swap!(size_t)(cast(size_t*)&val, cast(size_t)equalTo, cast(size_t)newval); 359 } 360 else static if (is(T == bool)) 361 { 362 oldval = llvm_atomic_cmp_swap!(ubyte)(cast(ubyte*)&val, equalTo?1:0, newval?1:0)?0:1; 363 } 364 else 365 { 366 oldval = llvm_atomic_cmp_swap!(T)(&val, equalTo, newval); 367 } 368 return oldval == equalTo; 369 } 370 } 371 372 373 //////////////////////////////////////////////////////////////////////////// 374 // Atomic Increment 375 //////////////////////////////////////////////////////////////////////////// 376 377 378 template atomicIncrement( msync ms = msync.seq, T ) 379 { 380 // 381 // NOTE: This operation is only valid for integer or pointer types 382 // 383 static assert( isValidNumericType!(T) ); 384 385 386 T atomicIncrement( ref T val ) 387 { 388 static if (isPointerType!(T)) 389 { 390 return cast(T)llvm_atomic_load_add!(size_t)(cast(size_t*)&val, 1); 391 } 392 else 393 { 394 return llvm_atomic_load_add!(T)(&val, cast(T)1); 395 } 396 } 397 } 398 399 400 //////////////////////////////////////////////////////////////////////////// 401 // Atomic Decrement 402 //////////////////////////////////////////////////////////////////////////// 403 404 405 template atomicDecrement( msync ms = msync.seq, T ) 406 { 407 // 408 // NOTE: This operation is only valid for integer or pointer types 409 // 410 static assert( isValidNumericType!(T) ); 411 412 413 T atomicDecrement( ref T val ) 414 { 415 static if (isPointerType!(T)) 416 { 417 return cast(T)llvm_atomic_load_sub!(size_t)(cast(size_t*)&val, 1); 418 } 419 else 420 { 421 return llvm_atomic_load_sub!(T)(&val, cast(T)1); 422 } 423 } 424 } 425 } 426 427 //////////////////////////////////////////////////////////////////////////////// 273 428 // x86 Atomic Function Implementation 274 429 //////////////////////////////////////////////////////////////////////////////// 275 430 -
tango/math/Math.d
old new 76 76 version = DigitalMars_D_InlineAsm_X86; 77 77 } 78 78 } 79 else version(LLVMDC) 80 { 81 import llvmdc.intrinsics; 82 version(X86) 83 { 84 version = LLVMDC_X86; 85 } 86 } 79 87 80 88 /* 81 89 * Constants … … 298 306 * Bugs: 299 307 * Results are undefined if |x| >= $(POWER 2,64). 300 308 */ 309 version(LLVMDC) 310 { 311 alias llvm_cos_f32 cos; 312 alias llvm_cos_f64 cos; 313 version(X86) 314 { 315 alias llvm_cos_f80 cos; 316 } 317 else 318 { 319 real cos(real x) 320 { 321 return tango.stdc.math.cosl(x); 322 } 323 } 324 } 325 else 326 { 301 327 real cos(real x) /* intrinsic */ 302 328 { 303 329 version(D_InlineAsm_X86) … … 313 339 return tango.stdc.math.cosl(x); 314 340 } 315 341 } 342 } 316 343 317 344 debug(UnitTest) { 318 345 unittest { … … 333 360 * Bugs: 334 361 * Results are undefined if |x| >= $(POWER 2,64). 335 362 */ 363 version(LLVMDC) 364 { 365 alias llvm_sin_f32 sin; 366 alias llvm_sin_f64 sin; 367 version(X86) 368 { 369 alias llvm_sin_f80 sin; 370 } 371 else 372 { 373 real sin(real x) 374 { 375 return tango.stdc.math.sinl(x); 376 } 377 } 378 } 379 else 380 { 336 381 real sin(real x) /* intrinsic */ 337 382 { 338 383 version(D_InlineAsm_X86) … … 348 393 return tango.stdc.math.sinl(x); 349 394 } 350 395 } 396 } 351 397 352 398 debug(UnitTest) { 353 399 unittest { … … 374 420 { 375 421 version (GNU) { 376 422 return tanl(x); 377 } else { 423 } 424 else version(LLVMDC) { 425 return tango.stdc.math.tanl(x); 426 } 427 else { 378 428 asm 379 429 { 380 430 fld x[EBP] ; // load theta … … 947 997 * <tr> <td> +∞ <td> +∞ <td> no 948 998 * ) 949 999 */ 1000 version(LLVMDC) 1001 { 1002 alias llvm_sqrt_f32 sqrt; 1003 alias llvm_sqrt_f64 sqrt; 1004 version(X86) 1005 { 1006 alias llvm_sqrt_f80 sqrt; 1007 } 1008 else 1009 { 1010 real sqrt(real x) 1011 { 1012 return tango.stdc.math.sqrtl(x); 1013 } 1014 } 1015 } 1016 else 1017 { 1018 950 1019 float sqrt(float x) /* intrinsic */ 951 1020 { 952 1021 version(D_InlineAsm_X86) … … 995 1064 } 996 1065 } 997 1066 1067 } 1068 998 1069 /** ditto */ 999 1070 creal sqrt(creal z) 1000 1071 { … … 1477 1548 } 1478 1549 } 1479 1550 } 1480 return tango.stdc.math.powl(x, y); 1551 version(LLVMDC_X86) 1552 { 1553 return llvm_pow_f80(x, y); 1554 } 1555 else 1556 { 1557 return tango.stdc.math.powl(x, y); 1558 } 1481 1559 } 1482 1560 1483 1561 debug(UnitTest) { -
tango/math/internal/BignumX86.d
old new 50 50 private: 51 51 version(GNU) { 52 52 // GDC is a filthy liar. It can't actually do inline asm. 53 } else version(LLVMDC) { 54 // I guess the same goes for llvmdc to some extent :( 53 55 } else version(D_InlineAsm_X86) { 54 56 /* Duplicate string s, with n times, substituting index for '@'. 55 57 * -
tango/math/internal/BiguintCore.d
old new 12 12 } else version(GNU) { 13 13 // GDC lies about its X86 support 14 14 private import tango.math.internal.BignumNoAsm; 15 } else version(D_InlineAsm_X86) { 15 } else version(LLVMDC) { 16 // I guess llvmdc does too :( 17 private import tango.math.internal.BignumNoAsm; 18 } else version(D_InlineAsm_X86) { 16 19 private import tango.math.internal.BignumX86; 17 20 } else { 18 21 private import tango.math.internal.BignumNoAsm; -
tango/stdc/stdlib.d
old new 94 94 { 95 95 void* alloca(size_t size); 96 96 } 97 else version( LLVMDC ) 98 { 99 pragma(alloca) 100 void* alloca(size_t size); 101 } 97 102 else version( GNU ) 98 103 { 99 104 private import gcc.builtins; -
tango/stdc/stdarg.d
old new 13 13 { 14 14 public import std.c.stdarg; 15 15 } 16 else version( LLVMDC ) 17 { 18 public import llvmdc.cstdarg; 19 } 16 20 else 17 21 { 18 22 alias void* va_list;










