diff --git a/loopy/target/c/codegen/expression.py b/loopy/target/c/codegen/expression.py index 8f924d3aee3b9f2982006fdb7b558cccac6785e3..5d269a8bcbfb07405f76a5ac1821500b87212c2a 100644 --- a/loopy/target/c/codegen/expression.py +++ b/loopy/target/c/codegen/expression.py @@ -29,8 +29,10 @@ import numpy as np from pymbolic.mapper import RecursiveMapper, IdentityMapper from pymbolic.mapper.stringifier import (PREC_NONE, PREC_CALL, PREC_PRODUCT, - PREC_POWER, - PREC_UNARY, PREC_LOGICAL_OR, PREC_LOGICAL_AND) + PREC_POWER, PREC_SHIFT, + PREC_UNARY, PREC_LOGICAL_OR, PREC_LOGICAL_AND, + PREC_BITWISE_AND, PREC_BITWISE_OR) + import islpy as isl import pymbolic.primitives as p from pymbolic import var @@ -782,6 +784,16 @@ class CExpressionToCodeMapper(RecursiveMapper): def map_literal(self, expr, enclosing_prec): return expr.s + def map_left_shift(self, expr, enclosing_prec): + return self.parenthesize_if_needed( + self.join_rec(" << ", (expr.shiftee, expr.shift), PREC_SHIFT), + enclosing_prec, PREC_SHIFT) + + def map_right_shift(self, expr, enclosing_prec): + return self.parenthesize_if_needed( + self.join_rec(" >> ", (expr.shiftee, expr.shift), PREC_SHIFT), + enclosing_prec, PREC_SHIFT) + def map_logical_not(self, expr, enclosing_prec): return self.parenthesize_if_needed( "!" + self.rec(expr.child, PREC_UNARY), @@ -807,6 +819,21 @@ class CExpressionToCodeMapper(RecursiveMapper): result = "(%s)" % result return result + def map_bitwise_not(self, expr, enclosing_prec): + return self.parenthesize_if_needed( + "~" + self.rec(expr.child, PREC_UNARY), + enclosing_prec, PREC_UNARY) + + def map_bitwise_and(self, expr, enclosing_prec): + return self.parenthesize_if_needed( + self.join_rec(" & ", expr.children, PREC_BITWISE_AND), + enclosing_prec, PREC_BITWISE_AND) + + def map_bitwise_or(self, expr, enclosing_prec): + return self.parenthesize_if_needed( + self.join_rec(" | ", expr.children, PREC_BITWISE_OR), + enclosing_prec, PREC_BITWISE_OR) + def map_sum(self, expr, enclosing_prec): from pymbolic.mapper.stringifier import PREC_SUM