예제 #1
0
파일: compile.py 프로젝트: xx312022850/pypy
 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, "")
예제 #2
0
파일: compile.py 프로젝트: xx312022850/pypy
 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, "")
예제 #3
0
파일: compile.py 프로젝트: xx312022850/pypy
 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")
예제 #4
0
파일: compile.py 프로젝트: njues/Sypy
 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
예제 #5
0
파일: compile.py 프로젝트: njues/Sypy
 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
예제 #6
0
파일: compile.py 프로젝트: njues/Sypy
 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