def compile(self, module: ll.Module, builder: ll.IRBuilder): inputs = [] for i in range(self.num_inputs): path = self.get_pin(f'in{i}') inputs.append(module.get_global(path)) output = module.get_global(self.get_pin('out')) output_v = ll.Constant(INT_TYPE, 0) if self.kind == 'and': output_v = builder.not_(output_v) for inp in inputs: v = builder.load(inp) if self.kind == 'and': output_v = builder.and_(output_v, v) elif self.kind == 'or': output_v = builder.or_(output_v, v) elif self.kind == 'xor': output_v = builder.xor(output_v, v) if self.negated: output_v = builder.not_(output_v) builder.store(output_v, output)
def compile(self, module: ll.Module, builder: ll.IRBuilder): pin_in = self.get_pin('in') pin_out = self.get_pin('out') pin_in = module.get_global(pin_in) pin_out = module.get_global(pin_out) v = builder.load(pin_in) v = builder.not_(v) builder.store(v, pin_out)
def compile(self, module: ir.Module, builder: ir.IRBuilder, symbols: SymbolTable) -> ir.Value: uop = self.prefix expr = self.expr.compile(module, builder, symbols) if uop == '-': return builder.neg(expr) if uop in ['~', '!']: return builder.not_(expr) # if uop in ['+', '++', '-', '--', '~', '!', 'alignof', 'sizeof']: # return "({}{})".format(uop, expr) # if uop == 'typeof': # return "({}.getClassName())".format(expr) WappaException( "FATAL", "Unhandled Prefix Operator {}".format(uop), self.tok) return uop