mirror of
https://github.com/KhronosGroup/OpenCL-CTS.git
synced 2026-03-25 08:19:02 +00:00
math_brute_force: consider all types for extension pragmas (#1705)
When generating the kernel code, consider the return type(s) and the types of all parameters, instead of only the first parameter type. This fixes a missing extension pragma for certain cases (such as `nan`). Signed-off-by: Sven van Haastregt <sven.vanhaastregt@arm.com>
This commit is contained in:
committed by
GitHub
parent
20afedbd4a
commit
8272c83c6f
@@ -67,22 +67,28 @@ void EmitDefineUndef(std::ostringstream &kernel, const char *name,
|
|||||||
kernel << "#define " << name << " " << GetUndefValue(type) << '\n';
|
kernel << "#define " << name << " " << GetUndefValue(type) << '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitEnableExtension(std::ostringstream &kernel, ParameterType type)
|
void EmitEnableExtension(std::ostringstream &kernel,
|
||||||
|
const std::initializer_list<ParameterType> &types)
|
||||||
{
|
{
|
||||||
switch (type)
|
bool needsFp64 = false;
|
||||||
{
|
|
||||||
case ParameterType::Double:
|
|
||||||
kernel << "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ParameterType::Float:
|
for (const auto &type : types)
|
||||||
case ParameterType::Int:
|
{
|
||||||
case ParameterType::UInt:
|
switch (type)
|
||||||
case ParameterType::Long:
|
{
|
||||||
case ParameterType::ULong:
|
case ParameterType::Double: needsFp64 = true; break;
|
||||||
// No extension required.
|
|
||||||
break;
|
case ParameterType::Float:
|
||||||
|
case ParameterType::Int:
|
||||||
|
case ParameterType::UInt:
|
||||||
|
case ParameterType::Long:
|
||||||
|
case ParameterType::ULong:
|
||||||
|
// No extension required.
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (needsFp64) kernel << "#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string GetBuildOptions(bool relaxed_mode)
|
std::string GetBuildOptions(bool relaxed_mode)
|
||||||
@@ -123,7 +129,7 @@ std::string GetUnaryKernel(const std::string &kernel_name, const char *builtin,
|
|||||||
EmitDefineType(kernel, "RETTYPE", retType, vector_size_index);
|
EmitDefineType(kernel, "RETTYPE", retType, vector_size_index);
|
||||||
EmitDefineType(kernel, "TYPE1", type1, vector_size_index);
|
EmitDefineType(kernel, "TYPE1", type1, vector_size_index);
|
||||||
EmitDefineUndef(kernel, "UNDEF1", type1);
|
EmitDefineUndef(kernel, "UNDEF1", type1);
|
||||||
EmitEnableExtension(kernel, type1);
|
EmitEnableExtension(kernel, { retType, type1 });
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
const char *kernel_nonvec3[] = { R"(
|
const char *kernel_nonvec3[] = { R"(
|
||||||
@@ -199,7 +205,7 @@ std::string GetUnaryKernel(const std::string &kernel_name, const char *builtin,
|
|||||||
EmitDefineType(kernel, "TYPE1", type1, vector_size_index);
|
EmitDefineType(kernel, "TYPE1", type1, vector_size_index);
|
||||||
EmitDefineUndef(kernel, "UNDEF1", type1);
|
EmitDefineUndef(kernel, "UNDEF1", type1);
|
||||||
EmitDefineUndef(kernel, "UNDEFR2", retType2);
|
EmitDefineUndef(kernel, "UNDEFR2", retType2);
|
||||||
EmitEnableExtension(kernel, type1);
|
EmitEnableExtension(kernel, { retType1, retType2, type1 });
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
const char *kernel_nonvec3[] = { R"(
|
const char *kernel_nonvec3[] = { R"(
|
||||||
@@ -282,7 +288,7 @@ std::string GetBinaryKernel(const std::string &kernel_name, const char *builtin,
|
|||||||
EmitDefineType(kernel, "TYPE2", type2, vector_size_index);
|
EmitDefineType(kernel, "TYPE2", type2, vector_size_index);
|
||||||
EmitDefineUndef(kernel, "UNDEF1", type1);
|
EmitDefineUndef(kernel, "UNDEF1", type1);
|
||||||
EmitDefineUndef(kernel, "UNDEF2", type2);
|
EmitDefineUndef(kernel, "UNDEF2", type2);
|
||||||
EmitEnableExtension(kernel, type1);
|
EmitEnableExtension(kernel, { retType, type1, type2 });
|
||||||
|
|
||||||
const bool is_vec3 = sizeValues[vector_size_index] == 3;
|
const bool is_vec3 = sizeValues[vector_size_index] == 3;
|
||||||
|
|
||||||
@@ -384,7 +390,7 @@ std::string GetBinaryKernel(const std::string &kernel_name, const char *builtin,
|
|||||||
EmitDefineUndef(kernel, "UNDEF1", type1);
|
EmitDefineUndef(kernel, "UNDEF1", type1);
|
||||||
EmitDefineUndef(kernel, "UNDEF2", type2);
|
EmitDefineUndef(kernel, "UNDEF2", type2);
|
||||||
EmitDefineUndef(kernel, "UNDEFR2", retType2);
|
EmitDefineUndef(kernel, "UNDEFR2", retType2);
|
||||||
EmitEnableExtension(kernel, type1);
|
EmitEnableExtension(kernel, { retType1, retType2, type1, type2 });
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
const char *kernel_nonvec3[] = { R"(
|
const char *kernel_nonvec3[] = { R"(
|
||||||
@@ -476,7 +482,7 @@ std::string GetTernaryKernel(const std::string &kernel_name,
|
|||||||
EmitDefineUndef(kernel, "UNDEF1", type1);
|
EmitDefineUndef(kernel, "UNDEF1", type1);
|
||||||
EmitDefineUndef(kernel, "UNDEF2", type2);
|
EmitDefineUndef(kernel, "UNDEF2", type2);
|
||||||
EmitDefineUndef(kernel, "UNDEF3", type3);
|
EmitDefineUndef(kernel, "UNDEF3", type3);
|
||||||
EmitEnableExtension(kernel, type1);
|
EmitEnableExtension(kernel, { retType, type1, type2, type3 });
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
const char *kernel_nonvec3[] = { R"(
|
const char *kernel_nonvec3[] = { R"(
|
||||||
|
|||||||
Reference in New Issue
Block a user