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