Skip to content
Snippets Groups Projects
Commit 777ab888 authored by Richard Angersbach's avatar Richard Angersbach
Browse files

Use literals for C macros used for the numeric limits

parent 3e0daa67
1 merge request!438Reduction Support
...@@ -4,6 +4,7 @@ from typing import Sequence ...@@ -4,6 +4,7 @@ from typing import Sequence
from pystencils.backend.ast.expressions import PsCall from pystencils.backend.ast.expressions import PsCall
from ..functions import CFunction, PsMathFunction, MathFunctions, NumericLimitsFunctions from ..functions import CFunction, PsMathFunction, MathFunctions, NumericLimitsFunctions
from ..literals import PsLiteral
from ...types import PsIntegerType, PsIeeeFloatType, PsScalarType from ...types import PsIntegerType, PsIeeeFloatType, PsScalarType
from .platform import Platform from .platform import Platform
...@@ -25,7 +26,7 @@ from ..ast.expressions import ( ...@@ -25,7 +26,7 @@ from ..ast.expressions import (
PsLookup, PsLookup,
PsGe, PsGe,
PsLe, PsLe,
PsTernary, PsTernary, PsLiteralExpr,
) )
from ..ast.vector import PsVecMemAcc from ..ast.vector import PsVecMemAcc
from ...types import PsVectorType, PsCustomType from ...types import PsVectorType, PsCustomType
...@@ -43,7 +44,7 @@ class GenericCpu(Platform): ...@@ -43,7 +44,7 @@ class GenericCpu(Platform):
@property @property
def required_headers(self) -> set[str]: def required_headers(self) -> set[str]:
return {"<math.h>", "<limits.h>"} return {"<math.h>", "<limits.h>", "<float.h>"}
def materialize_iteration_space( def materialize_iteration_space(
self, body: PsBlock, ispace: IterationSpace self, body: PsBlock, ispace: IterationSpace
...@@ -63,12 +64,25 @@ class GenericCpu(Platform): ...@@ -63,12 +64,25 @@ class GenericCpu(Platform):
arg_types = (dtype,) * func.num_args arg_types = (dtype,) * func.num_args
if isinstance(dtype, PsScalarType) and func in (NumericLimitsFunctions.Min, NumericLimitsFunctions.Max): if isinstance(dtype, PsScalarType) and func in (NumericLimitsFunctions.Min, NumericLimitsFunctions.Max):
cfunc: CFunction # get type prefix for macro
cfunc = CFunction(f"{dtype.c_string()}_{func.function_name}".capitalize(), arg_types, dtype) # TODO: there must be a better way...
call.function = cfunc tpe = ""
return call match dtype:
case PsIeeeFloatType():
match dtype.width:
case 32:
tpe = "FLT"
case 64:
tpe = "DBL"
case _:
raise MaterializationError(
f"No implementation available for function {func} on data type {dtype}"
)
return PsLiteralExpr(PsLiteral(f"{tpe}_{func.function_name}".upper(), dtype))
if isinstance(dtype, PsIeeeFloatType) and dtype.width in (32, 64): if isinstance(dtype, PsIeeeFloatType) and dtype.width in (32, 64):
cfunc: CFunction
match func: match func:
case ( case (
MathFunctions.Exp MathFunctions.Exp
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment