Skip to content

Commit 6fc73f6

Browse files
committed
[OpenCL] Add math and common builtin functions
Add the remaining math and common builtin functions from the OpenCL C specification. Patch by Pierre Gondois and Sven van Haastregt. Differential Revision: https://reviews.llvm.org/D69883
1 parent 83901cb commit 6fc73f6

File tree

1 file changed

+153
-18
lines changed

1 file changed

+153
-18
lines changed

clang/lib/Sema/OpenCLBuiltins.td

Lines changed: 153 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,160 @@ let MinVersion = CL20 in {
350350
}
351351
}
352352

353+
354+
//--------------------------------------------------------------------
355+
// OpenCL v1.1 s6.11.2, v1.2 s6.12.2, v2.0 s6.13.2 - Math functions
356+
// OpenCL Extension v2.0 s5.1.2 and s6.1.2 - Math Functions
357+
// --- Table 8 ---
358+
// --- 1 argument ---
359+
foreach name = ["acos", "acosh", "acospi",
360+
"asin", "asinh", "asinpi",
361+
"atan", "atanh", "atanpi",
362+
"cbrt", "ceil",
363+
"cos", "cosh", "cospi",
364+
"erfc", "erf",
365+
"exp", "exp2", "exp10", "expm1",
366+
"fabs", "floor",
367+
"log", "log2", "log10", "log1p", "logb",
368+
"rint", "round", "rsqrt",
369+
"sin", "sinh", "sinpi",
370+
"sqrt",
371+
"tan", "tanh", "tanpi",
372+
"tgamma", "trunc",
373+
"lgamma"] in {
374+
def : Builtin<name, [FGenTypeN, FGenTypeN], Attr.Const>;
375+
}
376+
foreach name = ["nan"] in {
377+
def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>;
378+
def : Builtin<name, [GenTypeDoubleVecAndScalar, GenTypeULongVecAndScalar], Attr.Const>;
379+
def : Builtin<name, [GenTypeHalfVecAndScalar, GenTypeUShortVecAndScalar], Attr.Const>;
380+
}
381+
382+
// --- 2 arguments ---
383+
foreach name = ["atan2", "atan2pi", "copysign", "fdim", "fmod", "hypot",
384+
"maxmag", "minmag", "nextafter", "pow", "powr",
385+
"remainder"] in {
386+
def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
387+
}
388+
foreach name = ["fmax", "fmin"] in {
389+
def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
390+
def : Builtin<name, [GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, Float], Attr.Const>;
391+
def : Builtin<name, [GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, Double], Attr.Const>;
392+
def : Builtin<name, [GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, Half], Attr.Const>;
393+
}
394+
foreach name = ["ilogb"] in {
395+
def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>;
396+
def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeDoubleVecAndScalar], Attr.Const>;
397+
def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeHalfVecAndScalar], Attr.Const>;
398+
}
399+
foreach name = ["ldexp"] in {
400+
def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
401+
def : Builtin<name, [GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, Int], Attr.Const>;
402+
def : Builtin<name, [GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
403+
def : Builtin<name, [GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, Int], Attr.Const>;
404+
def : Builtin<name, [GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
405+
def : Builtin<name, [GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, Int], Attr.Const>;
406+
}
407+
foreach name = ["pown", "rootn"] in {
408+
def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
409+
def : Builtin<name, [GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
410+
def : Builtin<name, [GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
411+
}
412+
413+
// --- 3 arguments ---
414+
foreach name = ["fma", "mad"] in {
415+
def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
416+
}
417+
418+
// --- Version dependent ---
419+
let MaxVersion = CL20 in {
420+
foreach AS = [GlobalAS, LocalAS, PrivateAS] in {
421+
foreach name = ["fract", "modf", "sincos"] in {
422+
def : Builtin<name, [FGenTypeN, FGenTypeN, PointerType<FGenTypeN, AS>]>;
423+
}
424+
foreach name = ["frexp", "lgamma_r"] in {
425+
foreach Type = [GenTypeFloatVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeHalfVecAndScalar] in {
426+
def : Builtin<name, [Type, Type, PointerType<GenTypeIntVecAndScalar, AS>]>;
427+
}
428+
}
429+
foreach name = ["remquo"] in {
430+
foreach Type = [GenTypeFloatVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeHalfVecAndScalar] in {
431+
def : Builtin<name, [Type, Type, Type, PointerType<GenTypeIntVecAndScalar, AS>]>;
432+
}
433+
}
434+
}
435+
}
436+
let MinVersion = CL20 in {
437+
foreach name = ["fract", "modf", "sincos"] in {
438+
def : Builtin<name, [FGenTypeN, FGenTypeN, PointerType<FGenTypeN, GenericAS>]>;
439+
}
440+
foreach name = ["frexp", "lgamma_r"] in {
441+
foreach Type = [GenTypeFloatVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeHalfVecAndScalar] in {
442+
def : Builtin<name, [Type, Type, PointerType<GenTypeIntVecAndScalar, GenericAS>]>;
443+
} }
444+
foreach name = ["remquo"] in {
445+
foreach Type = [GenTypeFloatVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeHalfVecAndScalar] in {
446+
def : Builtin<name, [Type, Type, Type, PointerType<GenTypeIntVecAndScalar, GenericAS>]>;
447+
}
448+
}
449+
}
450+
451+
// --- Table 9 ---
452+
foreach name = ["half_cos",
453+
"half_exp", "half_exp2", "half_exp10",
454+
"half_log", "half_log2", "half_log10",
455+
"half_recip", "half_rsqrt",
456+
"half_sin", "half_sqrt", "half_tan",
457+
"native_cos",
458+
"native_exp", "native_exp2", "native_exp10",
459+
"native_log", "native_log2", "native_log10",
460+
"native_recip", "native_rsqrt",
461+
"native_sin", "native_sqrt", "native_tan"] in {
462+
def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>;
463+
}
464+
foreach name = ["half_divide", "half_powr",
465+
"native_divide", "native_powr"] in {
466+
def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>;
467+
}
468+
353469
//--------------------------------------------------------------------
470+
// OpenCL v1.1 s6.11.4, v1.2 s6.12.4, v2.0 s6.13.4 - Common Functions
471+
// OpenCL Extension v2.0 s5.1.3 and s6.1.3 - Common Functions
472+
// --- Table 12 ---
473+
// --- 1 argument ---
474+
foreach name = ["degrees", "radians", "sign"] in {
475+
def : Builtin<name, [FGenTypeN, FGenTypeN], Attr.Const>;
476+
}
477+
478+
// --- 2 arguments ---
479+
foreach name = ["max", "min"] in {
480+
def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
481+
def : Builtin<name, [GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, Float], Attr.Const>;
482+
def : Builtin<name, [GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, Double], Attr.Const>;
483+
def : Builtin<name, [GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, Half], Attr.Const>;
484+
}
485+
foreach name = ["step"] in {
486+
def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
487+
def : Builtin<name, [GenTypeFloatVecNoScalar, Float, GenTypeFloatVecNoScalar], Attr.Const>;
488+
def : Builtin<name, [GenTypeDoubleVecNoScalar, Double, GenTypeDoubleVecNoScalar], Attr.Const>;
489+
def : Builtin<name, [GenTypeHalfVecNoScalar, Half, GenTypeHalfVecNoScalar], Attr.Const>;
490+
}
491+
492+
// --- 3 arguments ---
493+
foreach name = ["clamp", "mix"] in {
494+
def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
495+
def : Builtin<name, [GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, Float, Float], Attr.Const>;
496+
def : Builtin<name, [GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, Double, Double], Attr.Const>;
497+
def : Builtin<name, [GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, Half, Half], Attr.Const>;
498+
}
499+
foreach name = ["smoothstep"] in {
500+
def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
501+
def : Builtin<name, [GenTypeFloatVecNoScalar, Float, Float, GenTypeFloatVecNoScalar], Attr.Const>;
502+
def : Builtin<name, [GenTypeDoubleVecNoScalar, Double, Double, GenTypeDoubleVecNoScalar], Attr.Const>;
503+
def : Builtin<name, [GenTypeHalfVecNoScalar, Half, Half, GenTypeHalfVecNoScalar], Attr.Const>;
504+
}
505+
506+
354507
// OpenCL v1.1 s6.11.7, v1.2 s6.12.7, v2.0 s6.13.7 - Vector Data Load and Store Functions
355508
// OpenCL Extension v1.1 s9.3.6 and s9.6.6, v1.2 s9.5.6, v2.0 s9.4.6, v2.0 s5.1.6 and 6.1.6 - Vector Data Load and Store Functions
356509
// --- Table 15 ---
@@ -502,24 +655,6 @@ foreach Type = [Int, UInt] in {
502655
}
503656
}
504657

505-
// OpenCL v1.2 s6.12.2: Math Functions
506-
foreach name = ["acos", "acosh", "acospi",
507-
"asin", "asinh", "asinpi",
508-
"atan", "atanh", "atanpi"] in {
509-
def : Builtin<name, [FGenTypeN, FGenTypeN], Attr.Const>;
510-
}
511-
512-
foreach name = ["atan2", "atan2pi"] in {
513-
def : Builtin<name, [FGenTypeN, FGenTypeN,FGenTypeN], Attr.Const>;
514-
}
515-
516-
foreach name = ["fmax", "fmin"] in {
517-
def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN]>;
518-
def : Builtin<name, [GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, Float], Attr.Const>;
519-
def : Builtin<name, [GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, Double], Attr.Const>;
520-
def : Builtin<name, [GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, Half], Attr.Const>;
521-
}
522-
523658
// OpenCL v1.1 s6.11.3, v1.2 s6.12.3, v2.0 s6.13.3 - Integer Functions
524659
foreach name = ["max", "min"] in {
525660
def : Builtin<name, [AIGenTypeN, AIGenTypeN, AIGenTypeN], Attr.Const>;

0 commit comments

Comments
 (0)