[libclc] Move fract to the CLC library (#137785)

The builtin was already vectorized so there's no difference to codegen
for non-SPIR-V targets.
diff --git a/libclc/clc/include/clc/math/clc_fract.h b/libclc/clc/include/clc/math/clc_fract.h
new file mode 100644
index 0000000..8ea47d4
--- /dev/null
+++ b/libclc/clc/include/clc/math/clc_fract.h
@@ -0,0 +1,20 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef __CLC_MATH_CLC_FRACT_H__
+#define __CLC_MATH_CLC_FRACT_H__
+
+#define __CLC_FUNCTION __clc_fract
+#define __CLC_BODY <clc/math/unary_decl_with_ptr.inc>
+
+#include <clc/math/gentype.inc>
+
+#undef __CLC_BODY
+#undef __CLC_FUNCTION
+
+#endif // __CLC_MATH_CLC_FRACT_H__
diff --git a/libclc/clc/lib/generic/SOURCES b/libclc/clc/lib/generic/SOURCES
index 4c81a15..dafc69e 100644
--- a/libclc/clc/lib/generic/SOURCES
+++ b/libclc/clc/lib/generic/SOURCES
@@ -46,6 +46,7 @@
 math/clc_fmin.cl
 math/clc_floor.cl
 math/clc_fmod.cl
+math/clc_fract.cl
 math/clc_frexp.cl
 math/clc_hypot.cl
 math/clc_ldexp.cl
diff --git a/libclc/clc/lib/generic/math/clc_fract.cl b/libclc/clc/lib/generic/math/clc_fract.cl
new file mode 100644
index 0000000..7db43ef
--- /dev/null
+++ b/libclc/clc/lib/generic/math/clc_fract.cl
@@ -0,0 +1,17 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include <clc/clcmacro.h>
+#include <clc/internal/clc.h>
+#include <clc/math/clc_floor.h>
+#include <clc/math/clc_fmin.h>
+#include <clc/relational/clc_isinf.h>
+#include <clc/relational/clc_isnan.h>
+
+#define __CLC_BODY <clc_fract.inc>
+#include <clc/math/gentype.inc>
diff --git a/libclc/clc/lib/generic/math/clc_fract.inc b/libclc/clc/lib/generic/math/clc_fract.inc
new file mode 100644
index 0000000..31d3239
--- /dev/null
+++ b/libclc/clc/lib/generic/math/clc_fract.inc
@@ -0,0 +1,38 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#if __CLC_FPSIZE == 64
+#define MIN_CONSTANT 0x1.fffffffffffffp-1
+#elif __CLC_FPSIZE == 32
+#define MIN_CONSTANT 0x1.fffffep-1f
+#elif __CLC_FPSIZE == 16
+#define MIN_CONSTANT 0x1.ffcp-1h
+#endif
+
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_fract(__CLC_GENTYPE x,
+                                                 private __CLC_GENTYPE *iptr) {
+  *iptr = __clc_floor(x);
+  __CLC_GENTYPE r = __clc_fmin(x - *iptr, MIN_CONSTANT);
+  r = __clc_isinf(x) ? __CLC_FP_LIT(0.0) : r;
+  r = __clc_isnan(x) ? x : r;
+  return r;
+}
+
+#define FRACT_DEF(addrspace)                                                   \
+  _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_fract(                            \
+      __CLC_GENTYPE x, addrspace __CLC_GENTYPE *iptr) {                        \
+    __CLC_GENTYPE private_iptr;                                                \
+    __CLC_GENTYPE ret = __clc_fract(x, &private_iptr);                         \
+    *iptr = private_iptr;                                                      \
+    return ret;                                                                \
+  }
+
+FRACT_DEF(local);
+FRACT_DEF(global);
+
+#undef MIN_CONSTANT
diff --git a/libclc/generic/include/clc/math/fract.h b/libclc/generic/include/clc/math/fract.h
index 75bce83..8443d49 100644
--- a/libclc/generic/include/clc/math/fract.h
+++ b/libclc/generic/include/clc/math/fract.h
@@ -6,5 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#define __CLC_BODY <clc/math/fract.inc>
+#define __CLC_FUNCTION fract
+#define __CLC_BODY <clc/math/unary_decl_with_ptr.inc>
 #include <clc/math/gentype.inc>
+#undef __CLC_FUNCTION
diff --git a/libclc/generic/include/clc/math/fract.inc b/libclc/generic/include/clc/math/fract.inc
deleted file mode 100644
index 72e65d4..0000000
--- a/libclc/generic/include/clc/math/fract.inc
+++ /dev/null
@@ -1,11 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE fract(__CLC_GENTYPE x, global __CLC_GENTYPE *iptr);
-_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE fract(__CLC_GENTYPE x, local __CLC_GENTYPE *iptr);
-_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE fract(__CLC_GENTYPE x, private __CLC_GENTYPE *iptr);
diff --git a/libclc/generic/lib/math/fract.cl b/libclc/generic/lib/math/fract.cl
index 35eb7da..54a2cf8 100644
--- a/libclc/generic/lib/math/fract.cl
+++ b/libclc/generic/lib/math/fract.cl
@@ -7,6 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include <clc/clc.h>
+#include <clc/math/clc_fract.h>
 
-#define __CLC_BODY <fract.inc>
+#define FUNCTION fract
+#define __CLC_BODY <clc/math/unary_def_with_ptr.inc>
 #include <clc/math/gentype.inc>
diff --git a/libclc/generic/lib/math/fract.inc b/libclc/generic/lib/math/fract.inc
deleted file mode 100644
index e6f43b8..0000000
--- a/libclc/generic/lib/math/fract.inc
+++ /dev/null
@@ -1,41 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#if __CLC_FPSIZE == 64
-#define MIN_CONSTANT 0x1.fffffffffffffp-1
-#define ZERO 0.0
-#elif __CLC_FPSIZE == 32
-#define MIN_CONSTANT 0x1.fffffep-1f
-#define ZERO 0.0f
-#elif __CLC_FPSIZE == 16
-#define MIN_CONSTANT 0x1.ffcp-1h
-#define ZERO 0.0h
-#endif
-
-_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE fract(__CLC_GENTYPE x, private __CLC_GENTYPE *iptr) {
-  *iptr = floor(x);
-  __CLC_GENTYPE r = fmin(x - *iptr, MIN_CONSTANT);
-  r = isinf(x) ? ZERO : r;
-  r = isnan(x) ? x : r;
-  return r;
-}
-
-
-#define FRACT_DEF(addrspace) \
-  _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE fract(__CLC_GENTYPE x, addrspace __CLC_GENTYPE *iptr) { \
-    __CLC_GENTYPE private_iptr; \
-    __CLC_GENTYPE ret = fract(x, &private_iptr); \
-    *iptr = private_iptr; \
-    return ret; \
- }
-
-FRACT_DEF(local);
-FRACT_DEF(global);
-
-#undef MIN_CONSTANT
-#undef ZERO