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