示例#1
0
 def genop_cmp(self, op, arglocs, result_loc):
     if isinstance(op.args[0], Const):
         self.mc.CMP(arglocs[1], arglocs[0])
         self.mc.MOV(result_loc, imm8(0))
         getattr(self.mc, 'SET' + rev_cond)(lower_byte(result_loc))
     else:
         self.mc.CMP(arglocs[0], arglocs[1])
         self.mc.MOV(result_loc, imm8(0))
         getattr(self.mc, 'SET' + cond)(lower_byte(result_loc))
示例#2
0
 def genop_cmp(self, op, arglocs, result_loc):
     if isinstance(op.args[0], Const):
         self.mc.CMP(arglocs[1], arglocs[0])
         self.mc.MOV(result_loc, imm8(0))
         getattr(self.mc, "SET" + rev_cond)(lower_byte(result_loc))
     else:
         self.mc.CMP(arglocs[0], arglocs[1])
         self.mc.MOV(result_loc, imm8(0))
         getattr(self.mc, "SET" + cond)(lower_byte(result_loc))
示例#3
0
 def genop_discard_strsetitem(self, op, arglocs):
     base_loc, ofs_loc, val_loc = arglocs
     basesize, itemsize, ofs_length = symbolic.get_array_token(
         rstr.STR, self.cpu.translate_support_code)
     assert itemsize == 1
     self.mc.MOV(addr8_add(base_loc, ofs_loc, basesize),
                 lower_byte(val_loc))
示例#4
0
 def genop_discard_setfield_gc(self, op, arglocs):
     base_loc, ofs_loc, size_loc, value_loc = arglocs
     assert isinstance(size_loc, IMM32)
     size = size_loc.value
     if size == WORD * 2:
         self.mc.MOVSD(addr64_add(base_loc, ofs_loc), value_loc)
     elif size == WORD:
         self.mc.MOV(addr_add(base_loc, ofs_loc), value_loc)
     elif size == 2:
         self.mc.MOV16(addr_add(base_loc, ofs_loc), value_loc)
     elif size == 1:
         self.mc.MOV(addr8_add(base_loc, ofs_loc), lower_byte(value_loc))
     else:
         print "[asmgen]setfield addr size %d" % size
         raise NotImplementedError("Addr size %d" % size)
示例#5
0
 def genop_discard_setfield_gc(self, op, arglocs):
     base_loc, ofs_loc, size_loc, value_loc = arglocs
     assert isinstance(size_loc, IMM32)
     size = size_loc.value
     if size == WORD * 2:
         self.mc.MOVSD(addr64_add(base_loc, ofs_loc), value_loc)
     elif size == WORD:
         self.mc.MOV(addr_add(base_loc, ofs_loc), value_loc)
     elif size == 2:
         self.mc.MOV16(addr_add(base_loc, ofs_loc), value_loc)
     elif size == 1:
         self.mc.MOV(addr8_add(base_loc, ofs_loc), lower_byte(value_loc))
     else:
         print "[asmgen]setfield addr size %d" % size
         raise NotImplementedError("Addr size %d" % size)
示例#6
0
 def genop_discard_setarrayitem_gc(self, op, arglocs):
     base_loc, ofs_loc, value_loc, scale_loc, baseofs = arglocs
     assert isinstance(baseofs, IMM32)
     assert isinstance(scale_loc, IMM32)
     if op.args[2].type == FLOAT:
         self.mc.MOVSD(
             addr64_add(base_loc, ofs_loc, baseofs.value, scale_loc.value),
             value_loc)
     else:
         if scale_loc.value == 2:
             self.mc.MOV(
                 addr_add(base_loc, ofs_loc, baseofs.value,
                          scale_loc.value), value_loc)
         elif scale_loc.value == 0:
             self.mc.MOV(
                 addr8_add(base_loc, ofs_loc, baseofs.value,
                           scale_loc.value), lower_byte(value_loc))
         else:
             raise NotImplementedError("scale = %d" % scale_loc.value)
示例#7
0
 def genop_ooisnull(self, op, arglocs, resloc):
     self.mc.CMP(arglocs[0], imm8(0))
     self.mc.MOV(resloc, imm8(0))
     self.mc.SETE(lower_byte(resloc))
示例#8
0
 def genop_float_is_true(self, op, arglocs, resloc):
     loc0, loc1 = arglocs
     self.mc.XORPD(loc0, loc0)
     self.mc.UCOMISD(loc0, loc1)
     self.mc.SETNE(lower_byte(resloc))
     self.mc.MOVZX(resloc, lower_byte(resloc))
示例#9
0
 def genop_cmp(self, op, arglocs, result_loc):
     self.mc.UCOMISD(arglocs[0], arglocs[1])
     self.mc.MOV(result_loc, imm8(0))
     getattr(self.mc, 'SET' + cond)(lower_byte(result_loc))
示例#10
0
 def genop_discard_strsetitem(self, op, arglocs):
     base_loc, ofs_loc, val_loc = arglocs
     basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR, self.cpu.translate_support_code)
     assert itemsize == 1
     self.mc.MOV(addr8_add(base_loc, ofs_loc, basesize), lower_byte(val_loc))
示例#11
0
 def genop_discard_setarrayitem_gc(self, op, arglocs):
     base_loc, ofs_loc, value_loc, scale_loc, baseofs = arglocs
     assert isinstance(baseofs, IMM32)
     assert isinstance(scale_loc, IMM32)
     if op.args[2].type == FLOAT:
         self.mc.MOVSD(addr64_add(base_loc, ofs_loc, baseofs.value, scale_loc.value), value_loc)
     else:
         if scale_loc.value == 2:
             self.mc.MOV(addr_add(base_loc, ofs_loc, baseofs.value, scale_loc.value), value_loc)
         elif scale_loc.value == 0:
             self.mc.MOV(addr8_add(base_loc, ofs_loc, baseofs.value, scale_loc.value), lower_byte(value_loc))
         else:
             raise NotImplementedError("scale = %d" % scale_loc.value)
示例#12
0
 def genop_ooisnull(self, op, arglocs, resloc):
     self.mc.CMP(arglocs[0], imm8(0))
     self.mc.MOV(resloc, imm8(0))
     self.mc.SETE(lower_byte(resloc))
示例#13
0
 def genop_float_is_true(self, op, arglocs, resloc):
     loc0, loc1 = arglocs
     self.mc.XORPD(loc0, loc0)
     self.mc.UCOMISD(loc0, loc1)
     self.mc.SETNE(lower_byte(resloc))
     self.mc.MOVZX(resloc, lower_byte(resloc))
示例#14
0
 def genop_cmp(self, op, arglocs, result_loc):
     self.mc.UCOMISD(arglocs[0], arglocs[1])
     self.mc.MOV(result_loc, imm8(0))
     getattr(self.mc, "SET" + cond)(lower_byte(result_loc))