diff --git a/loopy/codegen/__init__.py b/loopy/codegen/__init__.py index cf5a0ed69adb89925d206bbc246ac1b4384f48d0..e653feb93ff50331c62fb4a8d5138e03683a8aeb 100644 --- a/loopy/codegen/__init__.py +++ b/loopy/codegen/__init__.py @@ -313,25 +313,6 @@ def generate_code(kernel, with_annotation=False, Value("void", kernel.name), args))), body)) - gen_code_str = str(gen_code) - - from cgen import LiteralLines - if "int_floor_div" in gen_code_str: - mod.extend(LiteralLines(""" - #define int_floor_div(a,b) \ - (( (a) - \ - ( ( (a)<0 ) != ( (b)<0 )) \ - *( (b) + ( (b)<0 ) - ( (b)>=0 ) )) \ - / (b) ) - """)) - - if "int_floor_div_pos_b" in gen_code_str: - mod.extend(LiteralLines(""" - #define int_floor_div_pos_b(a,b) ( \ - ( (a) - ( ((a)<0) ? ((b)-1) : 0 ) ) / (b) \ - ) - """)) - from loopy.check import check_implemented_domains assert check_implemented_domains(kernel, gen_code.implemented_domains) diff --git a/loopy/codegen/expression.py b/loopy/codegen/expression.py index da323a79444e8a3b1d28beb7f19776e3e2db0e9d..870843aaa0bc80fbeb62100e467739fa50943f5f 100644 --- a/loopy/codegen/expression.py +++ b/loopy/codegen/expression.py @@ -318,19 +318,25 @@ class LoopyCCodeMapper(RecursiveMapper): num_nonneg = is_nonnegative(expr.numerator, domain) den_nonneg = is_nonnegative(expr.denominator, domain) + def seen_func(name): + idt = self.kernel.index_dtype + self.seen_functions.add((name, name, (idt, idt))) + if den_nonneg: if num_nonneg: return self.parenthesize_if_needed( - "%s // %s" % ( + "%s / %s" % ( self.rec(expr.numerator, PREC_PRODUCT, type_context), # analogous to ^{-1} self.rec(expr.denominator, PREC_POWER, type_context)), enclosing_prec, PREC_PRODUCT) else: + seen_func("int_floor_div_pos_b") return ("int_floor_div_pos_b(%s, %s)" % (self.rec(expr.numerator, PREC_NONE, 'i'), self.rec(expr.denominator, PREC_NONE, 'i'))) else: + seen_func("int_floor_div") return ("int_floor_div(%s, %s)" % (self.rec(expr.numerator, PREC_NONE, 'i'), self.rec(expr.denominator, PREC_NONE, 'i'))) diff --git a/loopy/kernel.py b/loopy/kernel.py index 4ac55c12a0160a0319322ea28d6adf731f8b3f7a..6fea7bfaca4b3dba748b6a292b64badfc39642a2 100644 --- a/loopy/kernel.py +++ b/loopy/kernel.py @@ -513,6 +513,24 @@ def default_preamble_generator(seen_dtypes, seen_functions): #include <pyopencl-complex.h> """) + c_funcs = set(c_name for name, c_name, arg_dtypes in seen_functions) + if "int_floor_div" in c_funcs: + yield ("05_int_floor_div", """ + #define int_floor_div(a,b) \ + (( (a) - \ + ( ( (a)<0 ) != ( (b)<0 )) \ + *( (b) + ( (b)<0 ) - ( (b)>=0 ) )) \ + / (b) ) + """) + + if "int_floor_div_pos_b" in c_funcs: + yield ("05_int_floor_div_pos_b", """ + #define int_floor_div_pos_b(a,b) ( \ + ( (a) - ( ((a)<0) ? ((b)-1) : 0 ) ) / (b) \ + ) + """) + + # }}} # {{{ loop kernel object