Mercurial > projects > ldc
comparison runtime/import/ldc/intrinsics.di @ 1001:7a0238db1962
Implement support for intrinsics returning struct types
(such as llvm.*.with.overflow)
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Thu, 26 Feb 2009 22:47:06 +0100 |
parents | 4ac97ec7c18e |
children | 34bc1945bc85 |
comparison
equal
deleted
inserted
replaced
1000:d6895f24dc8f | 1001:7a0238db1962 |
---|---|
330 pragma(intrinsic, "llvm.atomic.load.umax.i#.p0i#") | 330 pragma(intrinsic, "llvm.atomic.load.umax.i#.p0i#") |
331 T llvm_atomic_load_umax(T)(T* ptr, T val); | 331 T llvm_atomic_load_umax(T)(T* ptr, T val); |
332 pragma(intrinsic, "llvm.atomic.load.umin.i#.p0i#") | 332 pragma(intrinsic, "llvm.atomic.load.umin.i#.p0i#") |
333 T llvm_atomic_load_umin(T)(T* ptr, T val); | 333 T llvm_atomic_load_umin(T)(T* ptr, T val); |
334 | 334 |
335 | |
336 // | |
337 // ARITHMETIC-WITH-OVERFLOW INTRINSICS | |
338 // | |
339 | |
340 struct OverflowRet(T) { | |
341 static assert(is(T : int), T.stringof ~ " is not an integer type!"); | |
342 T result; | |
343 bool overflow; | |
344 } | |
345 | |
346 // Signed and unsigned addition | |
347 pragma(intrinsic, "llvm.sadd.with.overflow.i#") | |
348 OverflowRet!(T) llvm_sadd_with_overflow(T)(T lhs, T rhs); | |
349 | |
350 pragma(intrinsic, "llvm.uadd.with.overflow.i#") | |
351 OverflowRet!(T) llvm_uadd_with_overflow(T)(T lhs, T rhs); | |
352 | |
353 // Signed and unsigned subtraction | |
354 pragma(intrinsic, "llvm.ssub.with.overflow.i#") | |
355 OverflowRet!(T) llvm_ssub_with_overflow(T)(T lhs, T rhs); | |
356 | |
357 pragma(intrinsic, "llvm.usub.with.overflow.i#") | |
358 OverflowRet!(T) llvm_usub_with_overflow(T)(T lhs, T rhs); | |
359 | |
360 // Signed and unsigned multiplication | |
361 pragma(intrinsic, "llvm.smul.with.overflow.i#") | |
362 OverflowRet!(T) llvm_smul_with_overflow(T)(T lhs, T rhs); | |
363 | |
364 /* Note: LLVM documentations says: | |
365 * Warning: 'llvm.umul.with.overflow' is badly broken. | |
366 * It is actively being fixed, but it should not currently be used! | |
367 * | |
368 * See: http://llvm.org/docs/LangRef.html#int_umul_overflow | |
369 */ | |
370 pragma(intrinsic, "llvm.umul.with.overflow.i#") | |
371 OverflowRet!(T) llvm_umul_with_overflow(T)(T lhs, T rhs); | |
372 | |
373 | |
335 // | 374 // |
336 // GENERAL INTRINSICS | 375 // GENERAL INTRINSICS |
337 // | 376 // |
338 | 377 |
339 | 378 |