From 2b4ef762ca5b06f329c938b12ea575eddcb76322 Mon Sep 17 00:00:00 2001 From: Lawrence Mitchell Date: Tue, 14 Nov 2017 13:57:16 +0000 Subject: [PATCH] codegen: Add mappers for bitwise operations --- loopy/target/c/codegen/expression.py | 31 ++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/loopy/target/c/codegen/expression.py b/loopy/target/c/codegen/expression.py index 8f924d3ae..5d269a8bc 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 -- GitLab