def _cast_to_bit(self, value_ref): ty = llvm_rffi.LLVMTypeOf(value_ref) if ty == self.cpu.ty_bit: return value_ref else: return llvm_rffi.LLVMBuildTrunc(self.builder, value_ref, self.cpu.ty_bit, "")
def _cast_to_int(self, value_ref): ty = llvm_rffi.LLVMTypeOf(value_ref) if ty == self.cpu.ty_int: return value_ref else: return llvm_rffi.LLVMBuildZExt(self.builder, value_ref, self.cpu.ty_int, "")
def _cast_to_unichar(self, value_ref): ty = llvm_rffi.LLVMTypeOf(value_ref) if ty == self.cpu.ty_unichar: return value_ref elif ty == self.cpu.ty_int: return llvm_rffi.LLVMBuildTrunc(self.builder, value_ref, self.cpu.ty_char, "") elif ty == self.cpu.ty_bit or ty == self.cpu.ty_char: return llvm_rffi.LLVMBuildZExt(self.builder, value_ref, self.cpu.ty_char, "") else: raise AssertionError("type is not an int nor a bit")
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 getptrarg(self, v): try: value_ref = self.vars[v] except KeyError: return self.cpu._make_const(v.getaddr(self.cpu), self.cpu.ty_char_ptr) else: ty = llvm_rffi.LLVMTypeOf(value_ref) if ty == self.cpu.ty_int: value_ref = llvm_rffi.LLVMBuildIntToPtr( self.builder, value_ref, self.cpu.ty_char_ptr, "") else: assert (ty != self.cpu.ty_bit and ty != self.cpu.ty_char and ty != self.cpu.ty_unichar) return value_ref