Пример #1
0
    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
Пример #2
0
    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)