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))
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))
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))
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)
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)
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))
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))
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))
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))
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)
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))