# OpenCL built-in library: type conversion functions
#
# Copyright (c) 2013 Victor Oliveira <victormatheus@gmail.com>
# Copyright (c) 2013 Jesse Towner <jessetowner@lavabit.com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

# This script generates the file convert_type.cl, which contains all of the
# OpenCL functions in the form:
#
# convert_<destTypen><_sat><_roundingMode>(<sourceTypen>)

types = [
    "char",
    "uchar",
    "short",
    "ushort",
    "int",
    "uint",
    "long",
    "ulong",
    "float",
    "double",
]
int_types = ["char", "uchar", "short", "ushort", "int", "uint", "long", "ulong"]
unsigned_types = ["uchar", "ushort", "uint", "ulong"]
float_types = ["float", "double"]
int64_types = ["long", "ulong"]
float64_types = ["double"]
vector_sizes = ["", "2", "3", "4", "8", "16"]
half_sizes = [("2", ""), ("4", "2"), ("8", "4"), ("16", "8")]

saturation = ["", "_sat"]
rounding_modes = ["_rtz", "_rte", "_rtp", "_rtn"]
float_prefix = {"float": "FLT_", "double": "DBL_"}
float_suffix = {"float": "f", "double": ""}

bool_type = {
    "char": "char",
    "uchar": "char",
    "short": "short",
    "ushort": "short",
    "int": "int",
    "uint": "int",
    "long": "long",
    "ulong": "long",
    "float": "int",
    "double": "long",
}

unsigned_type = {
    "char": "uchar",
    "uchar": "uchar",
    "short": "ushort",
    "ushort": "ushort",
    "int": "uint",
    "uint": "uint",
    "long": "ulong",
    "ulong": "ulong",
}

sizeof_type = {
    "char": 1,
    "uchar": 1,
    "short": 2,
    "ushort": 2,
    "int": 4,
    "uint": 4,
    "long": 8,
    "ulong": 8,
    "float": 4,
    "double": 8,
}

limit_max = {
    "char": "CHAR_MAX",
    "uchar": "UCHAR_MAX",
    "short": "SHRT_MAX",
    "ushort": "USHRT_MAX",
    "int": "INT_MAX",
    "uint": "UINT_MAX",
    "long": "LONG_MAX",
    "ulong": "ULONG_MAX",
}

limit_min = {
    "char": "CHAR_MIN",
    "uchar": "0",
    "short": "SHRT_MIN",
    "ushort": "0",
    "int": "INT_MIN",
    "uint": "0",
    "long": "LONG_MIN",
    "ulong": "0",
}


def conditional_guard(src, dst):
    int64_count = 0
    float64_count = 0
    if src in int64_types:
        int64_count = int64_count + 1
    elif src in float64_types:
        float64_count = float64_count + 1
    if dst in int64_types:
        int64_count = int64_count + 1
    elif dst in float64_types:
        float64_count = float64_count + 1
    if float64_count > 0:
        # In embedded profile, if cl_khr_fp64 is supported cles_khr_int64 has to be
        print("#ifdef cl_khr_fp64")
        return True
    elif int64_count > 0:
        print("#if defined cles_khr_int64 || !defined(__EMBEDDED_PROFILE__)")
        return True
    return False


print(
    """/* !!!! AUTOGENERATED FILE generated by convert_type.py !!!!!

   DON'T CHANGE THIS FILE. MAKE YOUR CHANGES TO convert_type.py AND RUN:
   $ ./generate-conversion-type-cl.sh

   OpenCL type conversion functions

   Copyright (c) 2013 Victor Oliveira <victormatheus@gmail.com>
   Copyright (c) 2013 Jesse Towner <jessetowner@lavabit.com>

   Permission is hereby granted, free of charge, to any person obtaining a copy
   of this software and associated documentation files (the "Software"), to deal
   in the Software without restriction, including without limitation the rights
   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
   copies of the Software, and to permit persons to whom the Software is
   furnished to do so, subject to the following conditions:

   The above copyright notice and this permission notice shall be included in
   all copies or substantial portions of the Software.

   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
   THE SOFTWARE.
*/

#include <clc/clc.h>

#ifdef cl_khr_fp64
#pragma OPENCL EXTENSION cl_khr_fp64 : enable

#if defined(__EMBEDDED_PROFILE__) && !defined(cles_khr_int64)
#error Embedded profile that supports cl_khr_fp64 also has to support cles_khr_int64
#endif

#endif

#ifdef cles_khr_int64
#pragma OPENCL EXTENSION cles_khr_int64 : enable
#endif

"""
)

#
# Default Conversions
#
# All conversions are in accordance with the OpenCL specification,
# which cites the C99 conversion rules.
#
# Casting from floating point to integer results in conversions
# with truncation, so it should be suitable for the default convert
# functions.
#
# Conversions from integer to floating-point, and floating-point to
# floating-point through casting is done with the default rounding
# mode. While C99 allows dynamically changing the rounding mode
# during runtime, it is not a supported feature in OpenCL according
# to Section 7.1 - Rounding Modes in the OpenCL 1.2 specification.
#
# Therefore, we can assume for optimization purposes that the
# rounding mode is fixed to round-to-nearest-even. Platform target
# authors should ensure that the rounding-control registers remain
# in this state, and that this invariant holds.
#
# Also note, even though the OpenCL specification isn't entirely
# clear on this matter, we implement all rounding mode combinations
# even for integer-to-integer conversions. When such a conversion
# is used, the rounding mode is ignored.
#


def generate_default_conversion(src, dst, mode):
    close_conditional = conditional_guard(src, dst)

    # scalar conversions
    print(
        """_CLC_DEF _CLC_OVERLOAD
{DST} convert_{DST}{M}({SRC} x)
{{
  return ({DST})x;
}}
""".format(
            SRC=src, DST=dst, M=mode
        )
    )

    # vector conversions, done through decomposition to components
    for size, half_size in half_sizes:
        print(
            """_CLC_DEF _CLC_OVERLOAD
{DST}{N} convert_{DST}{N}{M}({SRC}{N} x)
{{
  return ({DST}{N})(convert_{DST}{H}(x.lo), convert_{DST}{H}(x.hi));
}}
""".format(
                SRC=src, DST=dst, N=size, H=half_size, M=mode
            )
        )

    # 3-component vector conversions
    print(
        """_CLC_DEF _CLC_OVERLOAD
{DST}3 convert_{DST}3{M}({SRC}3 x)
{{
  return ({DST}3)(convert_{DST}2(x.s01), convert_{DST}(x.s2));
}}""".format(
            SRC=src, DST=dst, M=mode
        )
    )

    if close_conditional:
        print("#endif")


for src in types:
    for dst in types:
        generate_default_conversion(src, dst, "")

for src in int_types:
    for dst in int_types:
        for mode in rounding_modes:
            generate_default_conversion(src, dst, mode)

#
# Saturated Conversions To Integers
#
# These functions are dependent on the unsaturated conversion functions
# generated above, and use clamp, max, min, and select to eliminate
# branching and vectorize the conversions.
#
# Again, as above, we allow all rounding modes for integer-to-integer
# conversions with saturation.
#


def generate_saturated_conversion(src, dst, size):
    # Header
    close_conditional = conditional_guard(src, dst)
    print(
        """_CLC_DEF _CLC_OVERLOAD
{DST}{N} convert_{DST}{N}_sat({SRC}{N} x)
{{""".format(
            DST=dst, SRC=src, N=size
        )
    )

    # FIXME: This is a work around for lack of select function with
    # signed third argument when the first two arguments are unsigned types.
    # We cast to the signed type for sign-extension, then do a bitcast to
    # the unsigned type.
    if dst in unsigned_types:
        bool_prefix = "as_{DST}{N}(convert_{BOOL}{N}".format(
            DST=dst, BOOL=bool_type[dst], N=size
        )
        bool_suffix = ")"
    else:
        bool_prefix = "convert_{BOOL}{N}".format(BOOL=bool_type[dst], N=size)
        bool_suffix = ""

    # Body
    if src == dst:

        # Conversion between same types
        print("  return x;")

    elif src in float_types:

        # Conversion from float to int
        print(
            """  {DST}{N} y = convert_{DST}{N}(x);
  y = select(y, ({DST}{N}){DST_MIN}, {BP}(x < ({SRC}{N}){DST_MIN}){BS});
  y = select(y, ({DST}{N}){DST_MAX}, {BP}(x > ({SRC}{N}){DST_MAX}){BS});
  return y;""".format(
                SRC=src,
                DST=dst,
                N=size,
                DST_MIN=limit_min[dst],
                DST_MAX=limit_max[dst],
                BP=bool_prefix,
                BS=bool_suffix,
            )
        )

    else:

        # Integer to integer convesion with sizeof(src) == sizeof(dst)
        if sizeof_type[src] == sizeof_type[dst]:
            if src in unsigned_types:
                print(
                    "  x = min(x, ({SRC}){DST_MAX});".format(
                        SRC=src, DST_MAX=limit_max[dst]
                    )
                )
            else:
                print("  x = max(x, ({SRC})0);".format(SRC=src))

        # Integer to integer conversion where sizeof(src) > sizeof(dst)
        elif sizeof_type[src] > sizeof_type[dst]:
            if src in unsigned_types:
                print(
                    "  x = min(x, ({SRC}){DST_MAX});".format(
                        SRC=src, DST_MAX=limit_max[dst]
                    )
                )
            else:
                print(
                    "  x = clamp(x, ({SRC}){DST_MIN}, ({SRC}){DST_MAX});".format(
                        SRC=src, DST_MIN=limit_min[dst], DST_MAX=limit_max[dst]
                    )
                )

        # Integer to integer conversion where sizeof(src) < sizeof(dst)
        elif src not in unsigned_types and dst in unsigned_types:
            print("  x = max(x, ({SRC})0);".format(SRC=src))

        print("  return convert_{DST}{N}(x);".format(DST=dst, N=size))

    # Footer
    print("}")
    if close_conditional:
        print("#endif")


for src in types:
    for dst in int_types:
        for size in vector_sizes:
            generate_saturated_conversion(src, dst, size)


def generate_saturated_conversion_with_rounding(src, dst, size, mode):
    # Header
    close_conditional = conditional_guard(src, dst)

    # Body
    print(
        """_CLC_DEF _CLC_OVERLOAD
{DST}{N} convert_{DST}{N}_sat{M}({SRC}{N} x)
{{
  return convert_{DST}{N}_sat(x);
}}
""".format(
            DST=dst, SRC=src, N=size, M=mode
        )
    )

    # Footer
    if close_conditional:
        print("#endif")


for src in int_types:
    for dst in int_types:
        for size in vector_sizes:
            for mode in rounding_modes:
                generate_saturated_conversion_with_rounding(src, dst, size, mode)

#
# Conversions To/From Floating-Point With Rounding
#
# Note that we assume as above that casts from floating-point to
# integer are done with truncation, and that the default rounding
# mode is fixed to round-to-nearest-even, as per C99 and OpenCL
# rounding rules.
#
# These functions rely on the use of abs, ceil, fabs, floor,
# nextafter, sign, rint and the above generated conversion functions.
#
# Only conversions to integers can have saturation.
#


def generate_float_conversion(src, dst, size, mode, sat):
    # Header
    close_conditional = conditional_guard(src, dst)
    print(
        """_CLC_DEF _CLC_OVERLOAD
{DST}{N} convert_{DST}{N}{S}{M}({SRC}{N} x)
{{""".format(
            SRC=src, DST=dst, N=size, M=mode, S=sat
        )
    )

    # Perform conversion
    if dst in int_types:
        if mode == "_rte":
            print("  x = rint(x);")
        elif mode == "_rtp":
            print("  x = ceil(x);")
        elif mode == "_rtn":
            print("  x = floor(x);")
        print("  return convert_{DST}{N}{S}(x);".format(DST=dst, N=size, S=sat))
    elif mode == "_rte":
        print("  return convert_{DST}{N}(x);".format(DST=dst, N=size))
    else:
        print("  {DST}{N} r = convert_{DST}{N}(x);".format(DST=dst, N=size))
        print("  {SRC}{N} y = convert_{SRC}{N}(r);".format(SRC=src, N=size))
        if mode == "_rtz":
            if src in int_types:
                print(
                    "  {USRC}{N} abs_x = abs(x);".format(
                        USRC=unsigned_type[src], N=size
                    )
                )
                print(
                    "  {USRC}{N} abs_y = abs(y);".format(
                        USRC=unsigned_type[src], N=size
                    )
                )
            else:
                print("  {SRC}{N} abs_x = fabs(x);".format(SRC=src, N=size))
                print("  {SRC}{N} abs_y = fabs(y);".format(SRC=src, N=size))
            print(
                "  return select(r, nextafter(r, sign(r) * ({DST}{N})-INFINITY), convert_{BOOL}{N}(abs_y > abs_x));".format(
                    DST=dst, N=size, BOOL=bool_type[dst]
                )
            )
        if mode == "_rtp":
            print(
                "  return select(r, nextafter(r, ({DST}{N})INFINITY), convert_{BOOL}{N}(y < x));".format(
                    DST=dst, N=size, BOOL=bool_type[dst]
                )
            )
        if mode == "_rtn":
            print(
                "  return select(r, nextafter(r, ({DST}{N})-INFINITY), convert_{BOOL}{N}(y > x));".format(
                    DST=dst, N=size, BOOL=bool_type[dst]
                )
            )

    # Footer
    print("}")
    if close_conditional:
        print("#endif")


for src in float_types:
    for dst in int_types:
        for size in vector_sizes:
            for mode in rounding_modes:
                for sat in saturation:
                    generate_float_conversion(src, dst, size, mode, sat)


for src in types:
    for dst in float_types:
        for size in vector_sizes:
            for mode in rounding_modes:
                generate_float_conversion(src, dst, size, mode, "")
