def generate(self): # evaluate left operand for line in self.loperand.generate(): yield line if self.roperand is not None: # save left operand to temporary variable # NB: this is (probably) unnecessary of loperand is an ExprNode yield MOVQ_RAX_R10 for line in self.tmp_var.generate(): yield line yield assign('%r10', '%rax') # evaluate right operand for line in self.roperand.generate(): yield line yield MOVQ_RAX_R11 # load temporary variable holding loperand's result for line in self.tmp_var.generate(): yield line yield MOVQ_RAX_R10 # assign (operator loperand roperand) to temporary variable yield assign_op( self.operator, operand1_const=self.loperand.is_const, operand2_const=self.roperand.is_const, ) # always leave %rax pointing to the result # vebose for clarity for line in self.tmp_var.generate(): yield line
def generate(self): yield "# assign to {0} the value of {1}".format( self.var.name, repr(self.expr)) # evaluate expression for line in self.expr.generate(): yield line yield MOVQ_RAX_R10 # load address of variable to be assigned for line in self.var.generate(load_to='%rax'): yield line yield assign('%r10', '%rax', from_const=self.expr.is_const)