def generate_GUARD_CLASS(self, op): loc = self._generate_field_gep(op.args[0], self.cpu.fielddescr_vtable) cls = llvm_rffi.LLVMBuildLoad(self.builder, loc, "") equal = llvm_rffi.LLVMBuildICmp(self.builder, llvm_rffi.Predicate.EQ, cls, self.getintarg(op.args[1]), "") self._generate_guard(op, equal, False)
def generate_GUARD_NO_EXCEPTION(self, op): # etype: ty_char_ptr etype = llvm_rffi.LLVMBuildLoad(self.builder, self.cpu.const_exc_type, "") eisnull = llvm_rffi.LLVMBuildICmp(self.builder, llvm_rffi.Predicate.EQ, etype, self.cpu.const_null_charptr, "") self._generate_guard(op, eisnull, False, exc=True)
def generate_GUARD_VALUE(self, op): if op.args[0].type == INT: arg0 = self.getintarg(op.args[0]) arg1 = self.getintarg(op.args[1]) else: arg0 = self.getptrarg(op.args[0]) arg1 = self.getptrarg(op.args[1]) equal = llvm_rffi.LLVMBuildICmp(self.builder, llvm_rffi.Predicate.EQ, arg0, arg1, "") self._generate_guard(op, equal, False)
def generate_GUARD_EXCEPTION(self, op): v = op.args[0] assert isinstance(v, Const) # etype, expectedtype: ty_char_ptr expectedtype = self.cpu._make_const(v.getint(), self.cpu.ty_char_ptr) etype = llvm_rffi.LLVMBuildLoad(self.builder, self.cpu.const_exc_type, "") eisequal = llvm_rffi.LLVMBuildICmp(self.builder, llvm_rffi.Predicate.EQ, etype, expectedtype, "") self._generate_guard(op, eisequal, False, exc=True) self.vars[op.result] = llvm_rffi.LLVMBuildLoad( self.builder, self.cpu.const_exc_value, "")
def generate_INT_IS_TRUE(self, op): v = op.args[0] try: value_ref = self.vars[v] if llvm_rffi.LLVMTypeOf(value_ref) != self.cpu.ty_bit: raise KeyError except KeyError: res = llvm_rffi.LLVMBuildICmp(self.builder, llvm_rffi.Predicate.NE, self.getintarg(op.args[0]), self.cpu.const_zero, "") else: res = value_ref # value_ref: ty_bit. this is a no-op self.vars[op.result] = res
def generate_BOOL_NOT(self, op): v = op.args[0] try: value_ref = self.vars[v] if llvm_rffi.LLVMTypeOf(value_ref) != self.cpu.ty_bit: raise KeyError except KeyError: res = llvm_rffi.LLVMBuildICmp(self.builder, llvm_rffi.Predicate.EQ, self.getintarg(op.args[0]), self.cpu.const_zero, "") else: # value_ref: ty_bit res = llvm_rffi.LLVMBuildNot(self.builder, value_ref, "") self.vars[op.result] = res
def generate_OONONNULL(self, op): self.vars[op.result] = llvm_rffi.LLVMBuildICmp( self.builder, llvm_rffi.Predicate.NE, self.getptrarg(op.args[0]), self.cpu.const_null_charptr, "")
def generate_OOISNOT(self, op): self.vars[op.result] = llvm_rffi.LLVMBuildICmp( self.builder, llvm_rffi.Predicate.NE, self.getptrarg(op.args[0]), self.getptrarg(op.args[1]), "")