29 EXCEPT_SOFT_BP = (1 << 1)
30 EXCEPT_INT_XX = (1 << 2)
32 EXCEPT_BREAKPOINT_INTERN = (1 << 10)
34 EXCEPT_NUM_UPDT_EIP = (1 << 11)
36 EXCEPT_UNK_MEM_AD = (1 << 12)
37 EXCEPT_THROW_SEH = (1 << 13)
38 EXCEPT_UNK_EIP = (1 << 14)
39 EXCEPT_ACCESS_VIOL = (1 << 14)
40 EXCEPT_INT_DIV_BY_ZERO = (1 << 16)
41 EXCEPT_PRIV_INSN = (1 << 17)
42 EXCEPT_ILLEGAL_INSN = (1 << 18)
43 EXCEPT_UNK_MNEMO = (1 << 19)
47 http://www.emulators.com/docs/nx11_flags.htm
49 CF(A+B) = (((A XOR B) XOR D) < 0) XOR (((A XOR D) AND NOT (A XOR B)) < 0)
50 CF(A-B) = (((A XOR B) XOR D) < 0) XOR (((A XOR D) AND (A XOR B)) < 0)
52 OF(A+B) = ((A XOR D) AND NOT (A XOR B)) < 0
53 OF(A-B) = ((A XOR D) AND (A XOR B)) < 0
62 return [m2_expr.ExprAff(zf, m2_expr.ExprCond(a, m2_expr.ExprInt_from(zf, 0),
63 m2_expr.ExprInt_from(zf, 1)))]
67 return [m2_expr.ExprAff(nf, a.msb())]
71 return [m2_expr.ExprAff(pf,
72 m2_expr.ExprOp(
'parity',
73 a & m2_expr.ExprInt_from(a, 0xFF)))]
77 return [m2_expr.ExprAff(af,
78 m2_expr.ExprCond((a & m2_expr.ExprInt_from(a,0x10)),
79 m2_expr.ExprInt_from(af, 1),
80 m2_expr.ExprInt_from(af, 0)))]
94 e.append(m2_expr.ExprAff(of, m2_expr.ExprInt_from(of, 0)))
95 e.append(m2_expr.ExprAff(cf, m2_expr.ExprInt_from(cf, 0)))
106 if not a
or not b
or not c
or a != b
or a != c:
107 raise ValueError(
'bad ops size %s %s %s' % (a, b, c))
111 a_s, b_s, c_s = a.size, b.size, c.size
113 a_s, b_s, c_s = a.msb(), b.msb(), c.msb()
119 "Compute cf in @res = @op1 + @op2"
120 ret = (((op1 ^ op2) ^ res) ^ ((op1 ^ res) & (~(op1 ^ op2)))).msb()
121 return m2_expr.ExprAff(cf, ret)
125 "Compute of in @res = @op1 + @op2"
126 return m2_expr.ExprAff(of, (((op1 ^ res) & (~(op1 ^ op2)))).msb())
131 "Compote CF in @res = @op1 - @op2"
132 ret = (((op1 ^ op2) ^ res) ^ ((op1 ^ res) & (op1 ^ op2))).msb()
133 return m2_expr.ExprAff(cf, ret)
137 "Compote OF in @res = @op1 - @op2"
138 return m2_expr.ExprAff(of, (((op1 ^ res) & (op1 ^ op2))).msb())
162 e.append(m2_expr.ExprAff(float_eip,
163 m2_expr.ExprInt_from(float_eip, instr.offset)))
164 e.append(m2_expr.ExprAff(float_cs, CS))
169 Add float convertion if argument is an ExprMem
170 @arg: argument to tranform
172 if isinstance(arg, m2_expr.ExprMem):
174 raise NotImplementedError(
'float to long')
175 return m2_expr.ExprOp(
'mem_%.2d_to_double' % arg.size, arg)
181 Generate full float operators if one argument is implicit (float_st0)
191 Macro to generate jcc semantic
194 @cond: condtion of the jcc
195 @dst: the dstination if jcc is taken
196 @jmp_if: jump if/notif cond
200 meip = mRIP[instr.mode]
201 next_lbl = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
203 dstA, dstB = dst, next_lbl
205 dstA, dstB = next_lbl, dst
206 mn_dst = m2_expr.ExprCond(cond,
207 dstA.zeroExtend(instr.mode),
208 dstB.zeroExtend(instr.mode))
209 e.append(m2_expr.ExprAff(meip, mn_dst))
210 e.append(m2_expr.ExprAff(ir.IRDst, mn_dst))
217 @instr: instruction instance
219 @mov_if: invert condition if False"""
221 lbl_do = m2_expr.ExprId(ir.gen_label(), instr.mode)
222 lbl_skip = m2_expr.ExprId(ir.get_next_label(instr), instr.mode)
224 dstA, dstB = lbl_do, lbl_skip
226 dstA, dstB = lbl_skip, lbl_do
228 e_do, extra_irs = [m2_expr.ExprAff(arg1, arg2)], []
229 e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip))
230 e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(cond, dstA, dstB)))
231 return e, [
irbloc(lbl_do.name, [e_do])]
237 @instr: instruction instance
239 @mov_if: invert condition if False"""
241 lbl_do = m2_expr.ExprId(ir.gen_label(), instr.mode)
242 lbl_skip = m2_expr.ExprId(ir.get_next_label(instr), instr.mode)
244 dstA, dstB = lbl_do, lbl_skip
246 dstA, dstB = lbl_skip, lbl_do
248 e_do, extra_irs =
mov(ir, instr, arg1, arg2)
249 e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip))
250 e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(cond, dstA, dstB)))
251 return e, [
irbloc(lbl_do.name, [e_do])]
255 if a
in [ES, CS, SS, DS, FS, GS]:
257 if b
in [ES, CS, SS, DS, FS, GS]:
258 b = b.zeroExtend(a.size)
259 e = [m2_expr.ExprAff(a, b)]
265 e.append(m2_expr.ExprAff(a, b))
266 e.append(m2_expr.ExprAff(b, a))
271 e = [m2_expr.ExprAff(a, b.zeroExtend(a.size))]
275 e = [m2_expr.ExprAff(a, b.signExtend(a.size))]
281 if src.size > a.size:
283 e = [m2_expr.ExprAff(a, src.zeroExtend(a.size))]
293 e.append(m2_expr.ExprAff(a, c))
303 e.append(m2_expr.ExprAff(b, a))
304 e.append(m2_expr.ExprAff(a, c))
310 c = a + (b + m2_expr.ExprCompose([(m2_expr.ExprInt(0, a.size - 1),
316 e.append(m2_expr.ExprAff(a, c))
326 e.append(m2_expr.ExprAff(a, c))
334 c = a - (b + m2_expr.ExprCompose([(m2_expr.ExprInt(0, a.size - 1),
340 e.append(m2_expr.ExprAff(a, c))
346 a = m2_expr.ExprInt_from(b, 0)
352 e.append(m2_expr.ExprAff(b, c))
359 e.append(m2_expr.ExprAff(b, c))
376 e.append(m2_expr.ExprAff(a, c))
383 e.append(m2_expr.ExprAff(a, c))
390 e.append(m2_expr.ExprAff(a, c))
398 e.append(m2_expr.ExprAff(a, c))
412 b = b.zeroExtend(a.size)
414 shift = b & m2_expr.ExprInt_from(b, 0x3f)
416 shift = b & m2_expr.ExprInt_from(b, 0x1f)
424 c = m2_expr.ExprOp(
'<<<', a, shifter)
427 e.append(m2_expr.ExprAff(cf, new_cf))
429 e.append(m2_expr.ExprAff(of, c.msb() ^ new_cf))
430 e.append(m2_expr.ExprAff(a, c))
437 c = m2_expr.ExprOp(
'>>>', a, shifter)
439 e.append(m2_expr.ExprAff(cf, c.msb()))
441 e.append(m2_expr.ExprAff(of, (c ^ a).msb()))
442 e.append(m2_expr.ExprAff(a, c))
449 c = m2_expr.ExprOp(
'<<<c_rez', a, shifter, cf.zeroExtend(a.size))
450 new_cf = m2_expr.ExprOp(
'<<<c_cf', a, shifter, cf.zeroExtend(a.size))[:1]
452 e.append(m2_expr.ExprAff(cf, new_cf))
454 e.append(m2_expr.ExprAff(of, c.msb() ^ new_cf))
455 e.append(m2_expr.ExprAff(a, c))
462 c = m2_expr.ExprOp(
'>>>c_rez', a, shifter, cf.zeroExtend(a.size))
463 new_cf = m2_expr.ExprOp(
'>>>c_cf', a, shifter, cf.zeroExtend(a.size))[:1]
465 e.append(m2_expr.ExprAff(cf, new_cf))
467 e.append(m2_expr.ExprAff(of, (a ^ c).msb()))
468 e.append(m2_expr.ExprAff(a, c))
476 c = m2_expr.ExprOp(
'a>>', a, shifter)
478 lbl_do = m2_expr.ExprId(ir.gen_label(), instr.mode)
479 lbl_skip = m2_expr.ExprId(ir.get_next_label(instr), instr.mode)
481 new_cf = m2_expr.ExprOp(
'a>>', a,(shifter - m2_expr.ExprInt_from(a, 1)))[:1]
484 m2_expr.ExprAff(cf, new_cf),
485 m2_expr.ExprAff(of, m2_expr.ExprInt_from(of, 0)),
486 m2_expr.ExprAff(a, c),
492 if isinstance(shifter, m2_expr.ExprInt):
493 if int(shifter.arg) != 0:
498 e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip))
501 e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(shifter, lbl_do,
503 return e, [
irbloc(lbl_do.name, [e_do])]
509 c = m2_expr.ExprOp(
'>>', a, shifter)
511 lbl_do = m2_expr.ExprId(ir.gen_label(), instr.mode)
512 lbl_skip = m2_expr.ExprId(ir.get_next_label(instr), instr.mode)
514 new_cf = m2_expr.ExprOp(
'>>', a, (shifter - m2_expr.ExprInt_from(a, 1)))[:1]
517 m2_expr.ExprAff(cf, new_cf),
518 m2_expr.ExprAff(of, m2_expr.ExprInt_from(of, 0)),
519 m2_expr.ExprAff(a, c),
525 if isinstance(shifter, m2_expr.ExprInt):
526 if int(shifter.arg) != 0:
531 e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip))
534 e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(shifter, lbl_do,
536 return e, [
irbloc(lbl_do.name, [e_do])]
541 opmode, admode = s, instr.v_admode()
542 shifter = mRCX[instr.mode][:8].zeroExtend(a.size)
543 shifter &= m2_expr.ExprInt_from(a, 0x1f)
544 c = (a >> shifter) | (b << (m2_expr.ExprInt_from(a, a.size) - shifter))
545 new_cf = (a >> (shifter - m2_expr.ExprInt_from(a, 1)))[:1]
546 e.append(m2_expr.ExprAff(cf, m2_expr.ExprCond(shifter,
551 e.append(m2_expr.ExprAff(of, a.msb()))
553 e.append(m2_expr.ExprAff(a, c))
561 d = (a >> shifter) | (b << (m2_expr.ExprInt_from(a, a.size) - shifter))
562 new_cf = (a >> (shifter - m2_expr.ExprInt_from(a, 1)))[:1]
563 e.append(m2_expr.ExprAff(cf, m2_expr.ExprCond(shifter,
568 e.append(m2_expr.ExprAff(of, a.msb()))
570 e.append(m2_expr.ExprAff(a, d))
577 c = m2_expr.ExprOp(
'a<<', a, shifter)
578 new_cf = (a >> (m2_expr.ExprInt_from(a, a.size) - shifter))[:1]
579 e.append(m2_expr.ExprAff(cf, m2_expr.ExprCond(shifter,
585 e.append(m2_expr.ExprAff(of, c.msb() ^ new_cf))
586 e.append(m2_expr.ExprAff(a, c))
594 new_cf = (a >> (m2_expr.ExprInt_from(a, a.size) - shifter))[:1]
595 e.append(m2_expr.ExprAff(cf, m2_expr.ExprCond(shifter,
601 e.append(m2_expr.ExprAff(of, c.msb() ^ new_cf))
602 e.append(m2_expr.ExprAff(a, c))
607 return shld(ir, instr, a, b, ecx)
612 shifter = c.zeroExtend(a.size) & m2_expr.ExprInt_from(a, 0x1f)
613 c = m2_expr.ExprOp(
'|',
615 b >> (m2_expr.ExprInt_from(a, a.size) - shifter)
618 new_cf = (a >> (m2_expr.ExprInt_from(a, a.size) - shifter))[:1]
619 e.append(m2_expr.ExprAff(cf, m2_expr.ExprCond(shifter,
626 e.append(m2_expr.ExprAff(of, c.msb() ^ new_cf))
627 e.append(m2_expr.ExprAff(a, m2_expr.ExprCond(shifter,
635 e = [m2_expr.ExprAff(cf, m2_expr.ExprCond(cf, m2_expr.ExprInt_from(cf, 0),
636 m2_expr.ExprInt_from(cf, 1)))]
641 e = [m2_expr.ExprAff(cf, m2_expr.ExprInt_from(cf, 0))]
646 e = [m2_expr.ExprAff(cf, m2_expr.ExprInt_from(cf, 1))]
651 e = [m2_expr.ExprAff(df, m2_expr.ExprInt_from(df, 0))]
656 e = [m2_expr.ExprAff(df, m2_expr.ExprInt_from(df, 1))]
661 e = [m2_expr.ExprAff(i_f, m2_expr.ExprInt_from(i_f, 0))]
666 e = [m2_expr.ExprAff(exception_flags, m2_expr.ExprInt32(EXCEPT_PRIV_INSN))]
673 b = m2_expr.ExprInt_from(a, 1)
679 e.append(m2_expr.ExprAff(a, c))
684 b = m2_expr.ExprInt_from(a, -1)
690 e.append(m2_expr.ExprAff(a, c))
696 if not size
in [16, 32, 64]:
697 raise ValueError(
'bad size stacker!')
699 a = a.zeroExtend(size)
703 raise ValueError(
'strange arg size')
705 sp = mRSP[instr.mode]
706 new_sp = sp - m2_expr.ExprInt_from(sp, size / 8)
707 e.append(m2_expr.ExprAff(sp, new_sp))
709 new_sp = m2_expr.ExprOp(
'segm', SS, new_sp)
710 e.append(m2_expr.ExprAff(m2_expr.ExprMem(new_sp, size), a))
714 return push_gen(ir, instr, a, instr.mode)
722 if not size
in [16, 32, 64]:
723 raise ValueError(
'bad size stacker!')
725 sp = mRSP[instr.mode]
726 new_sp = sp + m2_expr.ExprInt_from(sp, size / 8)
729 e.append(m2_expr.ExprAff(sp, new_sp))
731 if isinstance(a, m2_expr.ExprMem):
732 a = a.replace_expr({sp: new_sp})
735 c = m2_expr.ExprOp(
'segm', SS, c)
736 e.append(m2_expr.ExprAff(a, m2_expr.ExprMem(c, a.size)))
740 return pop_gen(ir, instr, a, instr.mode)
743 return pop_gen(ir, instr, a, 16)
748 e.append(m2_expr.ExprAff(a, m2_expr.ExprCond(zf, m2_expr.ExprInt_from(a, 1),
749 m2_expr.ExprInt_from(a, 0))))
755 e.append(m2_expr.ExprAff(a, m2_expr.ExprCond(zf, m2_expr.ExprInt_from(a, 0),
756 m2_expr.ExprInt_from(a, 1))))
763 m2_expr.ExprAff(a, m2_expr.ExprCond(nf - of, m2_expr.ExprInt_from(a, 1),
764 m2_expr.ExprInt_from(a, 0))))
770 a0 = m2_expr.ExprInt_from(a, 0)
771 a1 = m2_expr.ExprInt_from(a, 1)
772 ret = m2_expr.ExprCond(zf, a0, a1) & m2_expr.ExprCond(nf - of, a0, a1)
773 e.append(m2_expr.ExprAff(a, ret))
780 m2_expr.ExprAff(a, m2_expr.ExprCond(nf - of, m2_expr.ExprInt_from(a, 0),
781 m2_expr.ExprInt_from(a, 1))))
787 e.append(m2_expr.ExprAff(a, m2_expr.ExprCond(cf | zf,
788 m2_expr.ExprInt_from(a, 0),
789 m2_expr.ExprInt_from(a, 1))))
796 e.append(m2_expr.ExprAff(a, m2_expr.ExprCond(cf, m2_expr.ExprInt_from(a, 0),
797 m2_expr.ExprInt_from(a, 1))))
803 e.append(m2_expr.ExprAff(a, m2_expr.ExprCond(cf, m2_expr.ExprInt_from(a, 1),
804 m2_expr.ExprInt_from(a, 0))))
810 e.append(m2_expr.ExprAff(a, m2_expr.ExprCond(cf | zf,
811 m2_expr.ExprInt_from(a, 1),
812 m2_expr.ExprInt_from(a, 0)))
819 e.append(m2_expr.ExprAff(a, m2_expr.ExprCond(nf, m2_expr.ExprInt_from(a, 0),
820 m2_expr.ExprInt_from(a, 1))))
826 e.append(m2_expr.ExprAff(a, m2_expr.ExprCond(nf, m2_expr.ExprInt_from(a, 1),
827 m2_expr.ExprInt_from(a, 0))))
833 e.append(m2_expr.ExprAff(a, m2_expr.ExprCond(of, m2_expr.ExprInt_from(a, 1),
834 m2_expr.ExprInt_from(a, 0))))
840 e.append(m2_expr.ExprAff(a, m2_expr.ExprCond(pf, m2_expr.ExprInt_from(a, 1),
841 m2_expr.ExprInt_from(a, 0))))
847 e.append(m2_expr.ExprAff(a, m2_expr.ExprCond(pf, m2_expr.ExprInt_from(a, 0),
848 m2_expr.ExprInt_from(a, 1))))
854 a0 = m2_expr.ExprInt_from(a, 0)
855 a1 = m2_expr.ExprInt_from(a, 1)
856 ret = m2_expr.ExprCond(zf, a1, a0) | m2_expr.ExprCond(nf ^ of, a1, a0)
857 e.append(m2_expr.ExprAff(a, ret))
863 a0 = m2_expr.ExprInt_from(a, 0)
864 a1 = m2_expr.ExprInt_from(a, 1)
865 ret = m2_expr.ExprCond(cf, a1, a0) & m2_expr.ExprCond(zf, a1, a0)
866 e.append(m2_expr.ExprAff(a, ret))
872 e.append(m2_expr.ExprAff(a, m2_expr.ExprCond(cf | zf,
873 m2_expr.ExprInt_from(a, 0),
874 m2_expr.ExprInt_from(a, 1)))
881 e.append(m2_expr.ExprAff(a, m2_expr.ExprCond(of, m2_expr.ExprInt_from(a, 0),
882 m2_expr.ExprInt_from(a, 1))))
888 e.append(m2_expr.ExprAff(a, m2_expr.ExprCond(cf, m2_expr.ExprInt_from(a, 0),
889 m2_expr.ExprInt_from(a, 1))))
894 a = mRAX[instr.mode][0:8]
897 m2_expr.ExprAff(a, m2_expr.ExprCond(cf, m2_expr.ExprInt_from(a, 0xff),
898 m2_expr.ExprInt_from(a, 0))))
905 c = m2_expr.ExprCompose([(a[:8], 8, 16),
909 c = m2_expr.ExprCompose([(a[:8], 24, 32),
915 c = m2_expr.ExprCompose([(a[:8], 56, 64),
925 raise ValueError(
'the size DOES matter')
926 e.append(m2_expr.ExprAff(a, c))
931 lbl_cmp = m2_expr.ExprId(ir.gen_label(), instr.mode)
932 lbl_df_0 = m2_expr.ExprId(ir.gen_label(), instr.mode)
933 lbl_df_1 = m2_expr.ExprId(ir.gen_label(), instr.mode)
934 lbl_next = m2_expr.ExprId(ir.get_next_label(instr), instr.mode)
937 a = m2_expr.ExprMem(mRDI[instr.mode][:s], size)
938 b = m2_expr.ExprMem(mRSI[instr.mode][:s], size)
940 e, extra =
l_cmp(ir, instr, a, b)
943 e0.append(m2_expr.ExprAff(a.arg,
944 a.arg + m2_expr.ExprInt_from(a.arg, size / 8)))
945 e0.append(m2_expr.ExprAff(b.arg,
946 b.arg + m2_expr.ExprInt_from(b.arg, size / 8)))
947 e0.append(m2_expr.ExprAff(ir.IRDst, lbl_next))
948 e0 =
irbloc(lbl_df_0.name, [e0])
951 e1.append(m2_expr.ExprAff(a.arg,
952 a.arg - m2_expr.ExprInt_from(a.arg, size / 8)))
953 e1.append(m2_expr.ExprAff(b.arg,
954 b.arg - m2_expr.ExprInt_from(b.arg, size / 8)))
955 e1.append(m2_expr.ExprAff(ir.IRDst, lbl_next))
956 e1 =
irbloc(lbl_df_1.name, [e1])
958 e.append(m2_expr.ExprAff(ir.IRDst,
959 m2_expr.ExprCond(df, lbl_df_1, lbl_df_0)))
964 lbl_cmp = m2_expr.ExprId(ir.gen_label(), instr.mode)
965 lbl_df_0 = m2_expr.ExprId(ir.gen_label(), instr.mode)
966 lbl_df_1 = m2_expr.ExprId(ir.gen_label(), instr.mode)
967 lbl_next = m2_expr.ExprId(ir.get_next_label(instr), instr.mode)
970 a = m2_expr.ExprMem(mRDI[instr.mode][:s], size)
972 e, extra =
l_cmp(ir, instr, mRAX[instr.mode][:size], a)
975 e0.append(m2_expr.ExprAff(a.arg,
976 a.arg + m2_expr.ExprInt_from(a.arg, size / 8)))
977 e0.append(m2_expr.ExprAff(ir.IRDst, lbl_next))
978 e0 =
irbloc(lbl_df_0.name, [e0])
981 e1.append(m2_expr.ExprAff(a.arg,
982 a.arg - m2_expr.ExprInt_from(a.arg, size / 8)))
983 e1.append(m2_expr.ExprAff(ir.IRDst, lbl_next))
984 e1 =
irbloc(lbl_df_1.name, [e1])
986 e.append(m2_expr.ExprAff(ir.IRDst,
987 m2_expr.ExprCond(df, lbl_df_1, lbl_df_0)))
995 regs = [cf, m2_expr.ExprInt1(1), pf, m2_expr.ExprInt1(
996 0), af, m2_expr.ExprInt1(0), zf, nf, tf, i_f, df, of]
997 for i
in xrange(len(regs)):
998 args.append((regs[i], i, i + 1))
1000 args.append((iopl, 12, 14))
1003 regs = [nt, m2_expr.ExprInt1(0), rf, vm, ac, vif, vip, i_d]
1005 regs = [nt, m2_expr.ExprInt1(0)]
1007 raise ValueError(
'unk size')
1008 for i
in xrange(len(regs)):
1009 args.append((regs[i], i + 14, i + 15))
1011 args.append((m2_expr.ExprInt(0, 10), 22, 32))
1012 return m2_expr.ExprCompose(args)
1026 tmp = m2_expr.ExprMem(mRSP[instr.mode])
1028 e.append(m2_expr.ExprAff(cf, m2_expr.ExprSlice(tmp, 0, 1)))
1029 e.append(m2_expr.ExprAff(pf, m2_expr.ExprSlice(tmp, 2, 3)))
1030 e.append(m2_expr.ExprAff(af, m2_expr.ExprSlice(tmp, 4, 5)))
1031 e.append(m2_expr.ExprAff(zf, m2_expr.ExprSlice(tmp, 6, 7)))
1032 e.append(m2_expr.ExprAff(nf, m2_expr.ExprSlice(tmp, 7, 8)))
1033 e.append(m2_expr.ExprAff(tf, m2_expr.ExprSlice(tmp, 8, 9)))
1034 e.append(m2_expr.ExprAff(i_f, m2_expr.ExprSlice(tmp, 9, 10)))
1035 e.append(m2_expr.ExprAff(df, m2_expr.ExprSlice(tmp, 10, 11)))
1036 e.append(m2_expr.ExprAff(of, m2_expr.ExprSlice(tmp, 11, 12)))
1037 e.append(m2_expr.ExprAff(iopl, m2_expr.ExprSlice(tmp, 12, 14)))
1038 e.append(m2_expr.ExprAff(nt, m2_expr.ExprSlice(tmp, 14, 15)))
1039 e.append(m2_expr.ExprAff(rf, m2_expr.ExprSlice(tmp, 16, 17)))
1040 e.append(m2_expr.ExprAff(vm, m2_expr.ExprSlice(tmp, 17, 18)))
1041 e.append(m2_expr.ExprAff(ac, m2_expr.ExprSlice(tmp, 18, 19)))
1042 e.append(m2_expr.ExprAff(vif, m2_expr.ExprSlice(tmp, 19, 20)))
1043 e.append(m2_expr.ExprAff(vip, m2_expr.ExprSlice(tmp, 20, 21)))
1044 e.append(m2_expr.ExprAff(i_d, m2_expr.ExprSlice(tmp, 21, 22)))
1045 e.append(m2_expr.ExprAff(mRSP[instr.mode],
1046 mRSP[instr.mode] + m2_expr.ExprInt_from(mRSP[instr.mode], instr.mode/8)))
1047 e.append(m2_expr.ExprAff(exception_flags,
1048 m2_expr.ExprCond(m2_expr.ExprSlice(tmp, 8, 9),
1049 m2_expr.ExprInt32(EXCEPT_SOFT_BP),
1058 tmp = m2_expr.ExprMem(mRSP[instr.mode])
1060 e.append(m2_expr.ExprAff(cf, m2_expr.ExprSlice(tmp, 0, 1)))
1061 e.append(m2_expr.ExprAff(pf, m2_expr.ExprSlice(tmp, 2, 3)))
1062 e.append(m2_expr.ExprAff(af, m2_expr.ExprSlice(tmp, 4, 5)))
1063 e.append(m2_expr.ExprAff(zf, m2_expr.ExprSlice(tmp, 6, 7)))
1064 e.append(m2_expr.ExprAff(nf, m2_expr.ExprSlice(tmp, 7, 8)))
1065 e.append(m2_expr.ExprAff(tf, m2_expr.ExprSlice(tmp, 8, 9)))
1066 e.append(m2_expr.ExprAff(i_f, m2_expr.ExprSlice(tmp, 9, 10)))
1067 e.append(m2_expr.ExprAff(df, m2_expr.ExprSlice(tmp, 10, 11)))
1068 e.append(m2_expr.ExprAff(of, m2_expr.ExprSlice(tmp, 11, 12)))
1069 e.append(m2_expr.ExprAff(iopl, m2_expr.ExprSlice(tmp, 12, 14)))
1070 e.append(m2_expr.ExprAff(nt, m2_expr.ExprSlice(tmp, 14, 15)))
1071 e.append(m2_expr.ExprAff(mRSP[instr.mode], mRSP[instr.mode] + m2_expr.ExprInt(2, mRSP[instr.mode].size)))
1077 s = instr.v_opmode()
1078 opmode, admode = s, instr.v_admode()
1079 if not s
in [16, 32, 64]:
1080 raise ValueError(
'bad size stacker!')
1083 mRAX[instr.mode][:s], mRCX[instr.mode][
1084 :s], mRDX[instr.mode][:s], mRBX[instr.mode][:s],
1085 mRSP[instr.mode][:s], mRBP[instr.mode][:s],
1086 mRSI[instr.mode][:s], mRDI[instr.mode][:s]]
1088 for i
in xrange(len(regs)):
1089 c = mRSP[instr.mode][:s] + m2_expr.ExprInt(-(s / 8) * (i + 1), s)
1090 e.append(m2_expr.ExprAff(m2_expr.ExprMem(c, s), regs[i]))
1091 e.append(m2_expr.ExprAff(mRSP[instr.mode][:s], c))
1097 s = instr.v_opmode()
1098 opmode, admode = s, instr.v_admode()
1099 if not s
in [16, 32, 64]:
1100 raise ValueError(
'bad size stacker!')
1102 mRAX[instr.mode][:s], mRCX[instr.mode][
1103 :s], mRDX[instr.mode][:s], mRBX[instr.mode][:s],
1104 mRSP[instr.mode][:s], mRBP[instr.mode][:s],
1105 mRSI[instr.mode][:s], mRDI[instr.mode][:s]]
1106 myesp = mRSP[instr.mode][:s]
1108 for i
in xrange(len(regs)):
1109 if regs[i] == myesp:
1111 c = myesp + m2_expr.ExprInt_from(myesp, ((s / 8) * i))
1112 e.append(m2_expr.ExprAff(regs[i], m2_expr.ExprMem(c, s)))
1114 c = myesp + m2_expr.ExprInt_from(myesp, ((s / 8) * (i + 1)))
1115 e.append(m2_expr.ExprAff(myesp, c))
1124 meip = mRIP[instr.mode]
1125 opmode, admode = s, instr.v_admode()
1126 myesp = mRSP[instr.mode][:opmode]
1127 n = m2_expr.ExprId(ir.get_next_label(instr), instr.mode)
1130 if (isinstance(dst, m2_expr.ExprOp)
and dst.op ==
"segm"):
1132 if instr.mode != 16:
1133 raise NotImplementedError(
'add 32 bit support!')
1136 m1 = segm.zeroExtend(CS.size)
1137 m2 = base.zeroExtend(meip.size)
1138 e.append(m2_expr.ExprAff(CS, m1))
1139 e.append(m2_expr.ExprAff(meip, m2))
1141 e.append(m2_expr.ExprAff(ir.IRDst, m2))
1143 c = myesp + m2_expr.ExprInt(-s/8, s)
1144 e.append(m2_expr.ExprAff(m2_expr.ExprMem(c, size=s).zeroExtend(s),
1147 c = myesp + m2_expr.ExprInt(-2*s/8, s)
1148 e.append(m2_expr.ExprAff(m2_expr.ExprMem(c, size=s).zeroExtend(s),
1149 meip.zeroExtend(s)))
1151 c = myesp + m2_expr.ExprInt((-2*s) / 8, s)
1152 e.append(m2_expr.ExprAff(myesp, c))
1156 c = myesp + m2_expr.ExprInt((-s / 8), s)
1157 e.append(m2_expr.ExprAff(myesp, c))
1159 c = m2_expr.ExprOp(
'segm', SS, c)
1160 e.append(m2_expr.ExprAff(m2_expr.ExprMem(c, size=s), n))
1161 e.append(m2_expr.ExprAff(meip, dst.zeroExtend(instr.mode)))
1162 e.append(m2_expr.ExprAff(ir.IRDst, dst.zeroExtend(instr.mode)))
1171 meip = mRIP[instr.mode]
1172 opmode, admode = instr.v_opmode(), instr.v_admode()
1174 myesp = mRSP[instr.mode][:s]
1177 a = m2_expr.ExprInt(0, s)
1178 value = (myesp + (m2_expr.ExprInt((s / 8), s)))
1181 value = (myesp + (m2_expr.ExprInt((s / 8), s) + a))
1183 e.append(m2_expr.ExprAff(myesp, value))
1186 c = m2_expr.ExprOp(
'segm', SS, c)
1187 e.append(m2_expr.ExprAff(meip, m2_expr.ExprMem(c, size=s).zeroExtend(s)))
1188 e.append(m2_expr.ExprAff(ir.IRDst,
1189 m2_expr.ExprMem(c, size=s).zeroExtend(s)))
1196 meip = mRIP[instr.mode]
1197 opmode, admode = instr.v_opmode(), instr.v_admode()
1199 a = m2_expr.ExprInt(0, s)
1201 myesp = mRSP[instr.mode][:s]
1207 c = m2_expr.ExprOp(
'segm', SS, c)
1208 e.append(m2_expr.ExprAff(meip, m2_expr.ExprMem(c, size=s).zeroExtend(s)))
1209 e.append(m2_expr.ExprAff(ir.IRDst,
1210 m2_expr.ExprMem(c, size=s).zeroExtend(s)))
1212 c = myesp + m2_expr.ExprInt(s / 8, s)
1214 c = m2_expr.ExprOp(
'segm', SS, c)
1215 e.append(m2_expr.ExprAff(CS, m2_expr.ExprMem(c, size=16)))
1217 value = myesp + (m2_expr.ExprInt((2*s) / 8, s) + a)
1218 e.append(m2_expr.ExprAff(myesp, value))
1223 opmode, admode = instr.v_opmode(), instr.v_admode()
1227 e.append(m2_expr.ExprAff(mRBP[size],
1228 m2_expr.ExprMem(mRBP[size], size=size)))
1229 e.append(m2_expr.ExprAff(myesp,
1230 m2_expr.ExprInt(size / 8, size) + mRBP[size]))
1235 opmode, admode = instr.v_opmode(), instr.v_admode()
1237 myesp = mRSP[instr.mode][:s]
1238 myebp = mRBP[instr.mode][:s]
1243 esp_tmp = myesp - m2_expr.ExprInt(s / 8, s)
1244 e.append(m2_expr.ExprAff(m2_expr.ExprMem(esp_tmp,
1247 e.append(m2_expr.ExprAff(myebp, esp_tmp))
1248 e.append(m2_expr.ExprAff(myesp,
1249 myesp - (a + m2_expr.ExprInt(s / 8, s))))
1255 meip = mRIP[instr.mode]
1256 e.append(m2_expr.ExprAff(meip, dst))
1257 e.append(m2_expr.ExprAff(ir.IRDst, dst))
1259 if isinstance(dst, m2_expr.ExprMem):
1266 meip = mRIP[instr.mode]
1268 if (isinstance(a, m2_expr.ExprOp)
and a.op ==
"segm"):
1271 m1 = segm.zeroExtend(CS.size)
1272 m2 = base.zeroExtend(meip.size)
1274 m1 = m2_expr.ExprMem(a, 16)
1275 m2 = m2_expr.ExprMem(a + m2_expr.ExprInt_from(a, 2), meip.size)
1277 e.append(m2_expr.ExprAff(CS, m1))
1278 e.append(m2_expr.ExprAff(meip, m2))
1279 e.append(m2_expr.ExprAff(ir.IRDst, m2))
1284 return gen_jcc(ir, instr, zf, dst,
True)
1288 return gen_jcc(ir, instr, mRCX[instr.mode][:16], dst,
False)
1292 return gen_jcc(ir, instr, mRCX[instr.mode][:32], dst,
False)
1296 return gen_jcc(ir, instr, mRCX[instr.mode], dst,
False)
1300 return gen_jcc(ir, instr, zf, dst,
False)
1304 return gen_jcc(ir, instr, pf, dst,
True)
1308 return gen_jcc(ir, instr, pf, dst,
False)
1312 return gen_jcc(ir, instr, cf|zf, dst,
False)
1316 return gen_jcc(ir, instr, cf, dst,
False)
1320 return gen_jcc(ir, instr, cf, dst,
True)
1324 return gen_jcc(ir, instr, cf|zf, dst,
True)
1328 return gen_jcc(ir, instr, nf-of, dst,
False)
1332 return gen_jcc(ir, instr, zf|(nf-of), dst,
False)
1336 return gen_jcc(ir, instr, nf-of, dst,
True)
1340 return gen_jcc(ir, instr, zf|(nf-of), dst,
True)
1344 return gen_jcc(ir, instr, nf, dst,
True)
1348 return gen_jcc(ir, instr, nf, dst,
False)
1352 return gen_jcc(ir, instr, of, dst,
True)
1356 return gen_jcc(ir, instr, of, dst,
False)
1361 meip = mRIP[instr.mode]
1362 s = instr.v_opmode()
1363 opmode, admode = s, instr.v_admode()
1364 myecx = mRCX[instr.mode][:admode]
1366 n = m2_expr.ExprId(ir.get_next_label(instr), instr.mode)
1367 c = myecx - m2_expr.ExprInt_from(myecx, 1)
1368 dst_o = m2_expr.ExprCond(c,
1369 dst.zeroExtend(instr.mode),
1370 n.zeroExtend(instr.mode))
1371 e.append(m2_expr.ExprAff(myecx, c))
1372 e.append(m2_expr.ExprAff(meip, dst_o))
1373 e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
1379 meip = mRIP[instr.mode]
1380 s = instr.v_opmode()
1381 opmode, admode = s, instr.v_admode()
1382 myecx = mRCX[instr.mode][:admode]
1384 n = m2_expr.ExprId(ir.get_next_label(instr), instr.mode)
1386 c = m2_expr.ExprCond(mRCX[instr.mode][:s] - m2_expr.ExprInt(1, s),
1387 m2_expr.ExprInt1(1),
1388 m2_expr.ExprInt1(0))
1389 c &= zf ^ m2_expr.ExprInt1(1)
1391 e.append(m2_expr.ExprAff(myecx, myecx - m2_expr.ExprInt_from(myecx, 1)))
1392 dst_o = m2_expr.ExprCond(c,
1393 dst.zeroExtend(instr.mode),
1394 n.zeroExtend(instr.mode))
1395 e.append(m2_expr.ExprAff(meip, dst_o))
1396 e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
1402 meip = mRIP[instr.mode]
1403 s = instr.v_opmode()
1404 opmode, admode = s, instr.v_admode()
1405 myecx = mRCX[instr.mode][:admode]
1407 n = m2_expr.ExprId(ir.get_next_label(instr), instr.mode)
1408 c = m2_expr.ExprCond(mRCX[instr.mode][:s] - m2_expr.ExprInt(1, s),
1409 m2_expr.ExprInt1(1),
1410 m2_expr.ExprInt1(0))
1412 e.append(m2_expr.ExprAff(myecx, myecx - m2_expr.ExprInt_from(myecx, 1)))
1413 dst_o = m2_expr.ExprCond(c,
1414 dst.zeroExtend(instr.mode),
1415 n.zeroExtend(instr.mode))
1416 e.append(m2_expr.ExprAff(meip, dst_o))
1417 e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
1426 b = mRAX[instr.mode][:16]
1427 elif size
in [16, 32, 64]:
1428 s1, s2 = mRDX[size], mRAX[size]
1429 b = m2_expr.ExprCompose([(s2, 0, size),
1430 (s1, size, size*2)])
1432 raise ValueError(
'div arg not impl', a)
1434 c_d = m2_expr.ExprOp(
'udiv', b, a.zeroExtend(b.size))
1435 c_r = m2_expr.ExprOp(
'umod', b, a.zeroExtend(b.size))
1439 e.append(m2_expr.ExprAff(b, m2_expr.ExprCompose([(c_d[:8], 0, 8),
1440 (c_r[:8], 8, 16)])))
1442 e.append(m2_expr.ExprAff(s1, c_r[:size]))
1443 e.append(m2_expr.ExprAff(s2, c_d[:size]))
1454 b = mRAX[instr.mode][:16]
1455 elif size
in [16, 32]:
1456 s1, s2 = mRDX[size], mRAX[size]
1457 b = m2_expr.ExprCompose([(s2, 0, size),
1458 (s1, size, size*2)])
1460 raise ValueError(
'div arg not impl', a)
1462 c_d = m2_expr.ExprOp(
'idiv', b, a.signExtend(b.size))
1463 c_r = m2_expr.ExprOp(
'imod', b, a.signExtend(b.size))
1467 e.append(m2_expr.ExprAff(b, m2_expr.ExprCompose([(c_d[:8], 0, 8),
1468 (c_r[:8], 8, 16)])))
1470 e.append(m2_expr.ExprAff(s1, c_r[:size]))
1471 e.append(m2_expr.ExprAff(s2, c_d[:size]))
1480 if a.size
in [16, 32, 64]:
1481 result = m2_expr.ExprOp(
'*',
1482 mRAX[size].zeroExtend(size * 2),
1483 a.zeroExtend(size * 2))
1484 e.append(m2_expr.ExprAff(mRAX[size], result[:size]))
1485 e.append(m2_expr.ExprAff(mRDX[size], result[size:size * 2]))
1488 result = m2_expr.ExprOp(
'*',
1489 mRAX[instr.mode][:8].zeroExtend(16),
1491 e.append(m2_expr.ExprAff(mRAX[instr.mode][:16], result))
1493 raise ValueError(
'unknow size')
1495 e.append(m2_expr.ExprAff(of, m2_expr.ExprCond(result[size:size * 2],
1496 m2_expr.ExprInt1(1),
1497 m2_expr.ExprInt1(0))))
1498 e.append(m2_expr.ExprAff(cf, m2_expr.ExprCond(result[size:size * 2],
1499 m2_expr.ExprInt1(1),
1500 m2_expr.ExprInt1(0))))
1505 def imul(ir, instr, a, b=None, c=None):
1509 if size
in [16, 32, 64]:
1510 result = m2_expr.ExprOp(
'*',
1511 mRAX[size].signExtend(size * 2),
1512 a.signExtend(size * 2))
1513 e.append(m2_expr.ExprAff(mRAX[size], result[:size]))
1514 e.append(m2_expr.ExprAff(mRDX[size], result[size:size * 2]))
1516 dst = mRAX[instr.mode][:16]
1517 result = m2_expr.ExprOp(
'*',
1518 mRAX[instr.mode][:8].signExtend(16),
1521 e.append(m2_expr.ExprAff(dst, result))
1522 value = m2_expr.ExprCond(result - result[:size].signExtend(size * 2),
1523 m2_expr.ExprInt1(1),
1524 m2_expr.ExprInt1(0))
1525 e.append(m2_expr.ExprAff(cf, value))
1526 value = m2_expr.ExprCond(result - result[:size].signExtend(size * 2),
1527 m2_expr.ExprInt1(1),
1528 m2_expr.ExprInt1(0))
1529 e.append(m2_expr.ExprAff(of, value))
1535 result = m2_expr.ExprOp(
'*',
1536 b.signExtend(size * 2),
1537 c.signExtend(size * 2))
1538 e.append(m2_expr.ExprAff(a, result[:size]))
1540 value = m2_expr.ExprCond(result - result[:size].signExtend(size * 2),
1541 m2_expr.ExprInt1(1),
1542 m2_expr.ExprInt1(0))
1543 e.append(m2_expr.ExprAff(cf, value))
1544 value = m2_expr.ExprCond(result - result[:size].signExtend(size * 2),
1545 m2_expr.ExprInt1(1),
1546 m2_expr.ExprInt1(0))
1547 e.append(m2_expr.ExprAff(of, value))
1553 tempAL = mRAX[instr.mode][:8]
1554 tempAX = mRAX[instr.mode][:16]
1555 e.append(m2_expr.ExprAff(tempAX, tempAL.signExtend(16)))
1561 tempAX = mRAX[instr.mode][:16]
1562 tempEAX = mRAX[instr.mode][:32]
1563 e.append(m2_expr.ExprAff(tempEAX, tempAX.signExtend(32)))
1569 tempEAX = mRAX[instr.mode][:32]
1570 tempRAX = mRAX[instr.mode][:64]
1571 e.append(m2_expr.ExprAff(tempRAX, tempEAX.signExtend(64)))
1577 tempAX = mRAX[instr.mode][:16]
1578 tempDX = mRDX[instr.mode][:16]
1579 c = tempAX.signExtend(32)
1580 e.append(m2_expr.ExprAff(tempAX, c[:16]))
1581 e.append(m2_expr.ExprAff(tempDX, c[16:32]))
1587 tempEAX = mRAX[instr.mode][:32]
1588 tempEDX = mRDX[instr.mode][:32]
1589 c = tempEAX.signExtend(64)
1590 e.append(m2_expr.ExprAff(tempEAX, c[:32]))
1591 e.append(m2_expr.ExprAff(tempEDX, c[32:64]))
1597 tempRAX = mRAX[instr.mode][:64]
1598 tempRDX = mRDX[instr.mode][:64]
1599 c = tempRAX.signExtend(128)
1600 e.append(m2_expr.ExprAff(tempRAX, c[:64]))
1601 e.append(m2_expr.ExprAff(tempRDX, c[64:128]))
1606 lbl_df_0 = m2_expr.ExprId(ir.gen_label(), instr.mode)
1607 lbl_df_1 = m2_expr.ExprId(ir.gen_label(), instr.mode)
1608 lbl_next = m2_expr.ExprId(ir.get_next_label(instr), instr.mode)
1610 s = instr.v_admode()
1612 addr_o = mRDI[instr.mode][:s]
1614 addr_p = addr + m2_expr.ExprInt_from(addr, size / 8)
1615 addr_m = addr - m2_expr.ExprInt_from(addr, size / 8)
1618 if instr.additional_info.g2.value:
1619 raise NotImplementedError(
"add segm support")
1620 addr = m2_expr.ExprOp(
'segm', mss, addr)
1622 b = mRAX[instr.mode][:size]
1625 e0.append(m2_expr.ExprAff(addr_o, addr_p))
1626 e0.append(m2_expr.ExprAff(ir.IRDst, lbl_next))
1627 e0 =
irbloc(lbl_df_0.name, [e0])
1630 e1.append(m2_expr.ExprAff(addr_o, addr_m))
1631 e1.append(m2_expr.ExprAff(ir.IRDst, lbl_next))
1632 e1 =
irbloc(lbl_df_1.name, [e1])
1635 e.append(m2_expr.ExprAff(m2_expr.ExprMem(addr, size), b))
1636 e.append(m2_expr.ExprAff(ir.IRDst,
1637 m2_expr.ExprCond(df, lbl_df_1, lbl_df_0)))
1642 lbl_df_0 = m2_expr.ExprId(ir.gen_label(), instr.mode)
1643 lbl_df_1 = m2_expr.ExprId(ir.gen_label(), instr.mode)
1644 lbl_next = m2_expr.ExprId(ir.get_next_label(instr), instr.mode)
1646 s = instr.v_admode()
1648 addr_o = mRSI[instr.mode][:s]
1650 addr_p = addr + m2_expr.ExprInt_from(addr, size / 8)
1651 addr_m = addr - m2_expr.ExprInt_from(addr, size / 8)
1654 if instr.additional_info.g2.value:
1655 raise NotImplementedError(
"add segm support")
1656 addr = m2_expr.ExprOp(
'segm', mss, addr)
1658 b = mRAX[instr.mode][:size]
1661 e0.append(m2_expr.ExprAff(addr_o, addr_p))
1662 e0.append(m2_expr.ExprAff(ir.IRDst, lbl_next))
1663 e0 =
irbloc(lbl_df_0.name, [e0])
1666 e1.append(m2_expr.ExprAff(addr_o, addr_m))
1667 e1.append(m2_expr.ExprAff(ir.IRDst, lbl_next))
1668 e1 =
irbloc(lbl_df_1.name, [e1])
1671 e.append(m2_expr.ExprAff(b, m2_expr.ExprMem(addr, size)))
1673 e.append(m2_expr.ExprAff(ir.IRDst,
1674 m2_expr.ExprCond(df, lbl_df_1, lbl_df_0)))
1679 lbl_df_0 = m2_expr.ExprId(ir.gen_label(), instr.mode)
1680 lbl_df_1 = m2_expr.ExprId(ir.gen_label(), instr.mode)
1681 lbl_next = m2_expr.ExprId(ir.get_next_label(instr), instr.mode)
1683 s = instr.v_admode()
1687 a = mRDI[instr.mode][:s]
1688 b = mRSI[instr.mode][:s]
1694 if instr.additional_info.g2.value:
1695 raise NotImplementedError(
"add segm support")
1696 src = m2_expr.ExprOp(
'segm', DS, src)
1697 dst = m2_expr.ExprOp(
'segm', ES, dst)
1698 e.append(m2_expr.ExprAff(m2_expr.ExprMem(dst, size),
1699 m2_expr.ExprMem(src, size)))
1702 e0.append(m2_expr.ExprAff(a, a + m2_expr.ExprInt_from(a, size / 8)))
1703 e0.append(m2_expr.ExprAff(b, b + m2_expr.ExprInt_from(b, size / 8)))
1704 e0.append(m2_expr.ExprAff(ir.IRDst, lbl_next))
1705 e0 =
irbloc(lbl_df_0.name, [e0])
1708 e1.append(m2_expr.ExprAff(a, a - m2_expr.ExprInt_from(a, size / 8)))
1709 e1.append(m2_expr.ExprAff(b, b - m2_expr.ExprInt_from(b, size / 8)))
1710 e1.append(m2_expr.ExprAff(ir.IRDst, lbl_next))
1711 e1 =
irbloc(lbl_df_1.name, [e1])
1713 e.append(m2_expr.ExprAff(ir.IRDst,
1714 m2_expr.ExprCond(df, lbl_df_1, lbl_df_0)))
1719 if isinstance(a, m2_expr.ExprId)
and isinstance(b, m2_expr.ExprMem):
1720 b = m2_expr.ExprMem(b.arg, a.size)
1721 elif isinstance(a, m2_expr.ExprMem)
and isinstance(b, m2_expr.ExprId):
1722 a = m2_expr.ExprMem(a.arg, b.size)
1724 e.append(m2_expr.ExprAff(a, b))
1728 if a
is None and b
is None:
1729 return movs(ir, instr, 32)
1731 return movsd(ir, instr, a, b)
1735 if not flt
in float_list:
1737 i = float_list.index(flt)
1739 raise ValueError(
'broken index')
1740 flt = float_list[i - popcount]
1746 Generate floatpop semantic (@popcount times), avoiding the avoid_flt@ float
1747 @avoid_flt: float avoided in the generated semantic
1748 @popcount: pop count
1752 for i
in xrange(8-popcount):
1753 if avoid_flt != float_list[i]:
1754 e.append(m2_expr.ExprAff(float_list[i],
1755 float_list[i+popcount]))
1756 for i
in xrange(8-popcount, 8):
1757 e.append(m2_expr.ExprAff(float_list[i],
1758 m2_expr.ExprInt_from(float_list[i], 0)))
1760 m2_expr.ExprAff(float_stack_ptr,
1761 float_stack_ptr - m2_expr.ExprInt(popcount, 3)))
1767 def fcom(ir, instr, a=None, b=None):
1769 if a
is None and b
is None:
1770 a, b = float_st0, float_st1
1778 e.append(m2_expr.ExprAff(float_c0, m2_expr.ExprOp(
'fcom_c0', a, b)))
1779 e.append(m2_expr.ExprAff(float_c1, m2_expr.ExprOp(
'fcom_c1', a, b)))
1780 e.append(m2_expr.ExprAff(float_c2, m2_expr.ExprOp(
'fcom_c2', a, b)))
1781 e.append(m2_expr.ExprAff(float_c3, m2_expr.ExprOp(
'fcom_c3', a, b)))
1791 b = m2_expr.ExprOp(
'int_32_to_double', m2_expr.ExprInt32(0))
1792 e.append(m2_expr.ExprAff(float_c0, m2_expr.ExprOp(
'fcom_c0', a, b)))
1793 e.append(m2_expr.ExprAff(float_c1, m2_expr.ExprOp(
'fcom_c1', a, b)))
1794 e.append(m2_expr.ExprAff(float_c2, m2_expr.ExprOp(
'fcom_c2', a, b)))
1795 e.append(m2_expr.ExprAff(float_c3, m2_expr.ExprOp(
'fcom_c3', a, b)))
1805 e.append(m2_expr.ExprAff(float_c0, m2_expr.ExprOp(
'fxam_c0', a)))
1806 e.append(m2_expr.ExprAff(float_c2, m2_expr.ExprOp(
'fxam_c2', a)))
1807 e.append(m2_expr.ExprAff(float_c3, m2_expr.ExprOp(
'fxam_c3', a)))
1819 e.append(m2_expr.ExprAff(float_c0,
1820 m2_expr.ExprOp(
'fcom_c0', a,
1821 b.zeroExtend(a.size))))
1822 e.append(m2_expr.ExprAff(float_c1,
1823 m2_expr.ExprOp(
'fcom_c1', a,
1824 b.zeroExtend(a.size))))
1825 e.append(m2_expr.ExprAff(float_c2,
1826 m2_expr.ExprOp(
'fcom_c2', a,
1827 b.zeroExtend(a.size))))
1828 e.append(m2_expr.ExprAff(float_c3,
1829 m2_expr.ExprOp(
'fcom_c3', a,
1830 b.zeroExtend(a.size))))
1839 if a
is None and b
is None:
1840 a, b = float_st0, float_st1
1847 e.append(m2_expr.ExprAff(cf, m2_expr.ExprOp(
'fcom_c0', a, b)))
1848 e.append(m2_expr.ExprAff(pf, m2_expr.ExprOp(
'fcom_c2', a, b)))
1849 e.append(m2_expr.ExprAff(zf, m2_expr.ExprOp(
'fcom_c3', a, b)))
1851 e.append(m2_expr.ExprAff(of, m2_expr.ExprInt1(0)))
1852 e.append(m2_expr.ExprAff(nf, m2_expr.ExprInt1(0)))
1853 e.append(m2_expr.ExprAff(af, m2_expr.ExprInt1(0)))
1860 e, extra =
fcomi(ir, instr, a, b)
1868 return fcomi(ir, instr, a, b)
1872 return fcomip(ir, instr, a, b)
1876 e, extra =
fcom(ir, instr, a, b)
1883 e, extra =
fcom(ir, instr, a, b)
1890 e, extra =
ficom(ir, instr, a, b)
1898 return fcom(ir, instr, a, b)
1903 return fcomp(ir, instr, a, b)
1908 return fcompp(ir, instr, a, b)
1916 a = m2_expr.ExprOp(
'int_32_to_float', a[:32])
1917 b = m2_expr.ExprOp(
'int_32_to_float', b[:32])
1919 e.append(m2_expr.ExprAff(cf, m2_expr.ExprOp(
'fcom_c0', a, b)))
1920 e.append(m2_expr.ExprAff(pf, m2_expr.ExprOp(
'fcom_c2', a, b)))
1921 e.append(m2_expr.ExprAff(zf, m2_expr.ExprOp(
'fcom_c3', a, b)))
1923 e.append(m2_expr.ExprAff(of, m2_expr.ExprInt1(0)))
1924 e.append(m2_expr.ExprAff(nf, m2_expr.ExprInt1(0)))
1925 e.append(m2_expr.ExprAff(af, m2_expr.ExprInt1(0)))
1936 a = m2_expr.ExprOp(
'int_64_to_double', a[:64])
1937 b = m2_expr.ExprOp(
'int_64_to_double', b[:64])
1939 e.append(m2_expr.ExprAff(cf, m2_expr.ExprOp(
'fcom_c0', a, b)))
1940 e.append(m2_expr.ExprAff(pf, m2_expr.ExprOp(
'fcom_c2', a, b)))
1941 e.append(m2_expr.ExprAff(zf, m2_expr.ExprOp(
'fcom_c3', a, b)))
1943 e.append(m2_expr.ExprAff(of, m2_expr.ExprInt1(0)))
1944 e.append(m2_expr.ExprAff(nf, m2_expr.ExprInt1(0)))
1945 e.append(m2_expr.ExprAff(af, m2_expr.ExprInt1(0)))
1955 e.append(m2_expr.ExprAff(float_st7, float_st6))
1956 e.append(m2_expr.ExprAff(float_st6, float_st5))
1957 e.append(m2_expr.ExprAff(float_st5, float_st4))
1958 e.append(m2_expr.ExprAff(float_st4, float_st3))
1959 e.append(m2_expr.ExprAff(float_st3, float_st2))
1960 e.append(m2_expr.ExprAff(float_st2, float_st1))
1961 e.append(m2_expr.ExprAff(float_st1, float_st0))
1962 e.append(m2_expr.ExprAff(float_st0, src))
1964 m2_expr.ExprAff(float_stack_ptr,
1965 float_stack_ptr + m2_expr.ExprInt(1, 3)))
1974 if isinstance(a, m2_expr.ExprMem):
1976 raise NotImplementedError(
'float to long')
1977 src = m2_expr.ExprOp(
'double_to_mem_%.2d' % a.size, a)
1981 e.append(m2_expr.ExprAff(a, src))
1987 e, extra =
fst(ir, instr, a)
1994 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'double_to_int_%d' % a.size,
2001 e, extra =
fist(ir, instr, a)
2005 def fist(ir, instr, a):
2007 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'double_to_int_%d' % a.size,
2015 e.append(m2_expr.ExprAff(a,
2016 m2_expr.ExprOp(
'double_trunc_to_int_%d' % a.size,
2026 src = m2_expr.ExprOp(
'int_%.2d_to_double' % a.size, a)
2029 e_fld, extra =
fld(ir, instr, src)
2035 return fld(ir, instr, m2_expr.ExprOp(
'int_32_to_double',
2036 m2_expr.ExprInt32(0)))
2040 return fld(ir, instr, m2_expr.ExprOp(
'int_32_to_double',
2041 m2_expr.ExprInt32(1)))
2045 value_f = math.log(10)/math.log(2)
2046 value = struct.unpack(
'I', struct.pack(
'f', value_f))[0]
2047 return fld(ir, instr, m2_expr.ExprOp(
'int_32_to_double',
2048 m2_expr.ExprInt32(value)))
2053 value = struct.unpack(
'I', struct.pack(
'f', value_f))[0]
2054 return fld(ir, instr, m2_expr.ExprOp(
'int_32_to_double',
2055 m2_expr.ExprInt32(value)))
2059 value_f = math.log(2)
2060 value = struct.unpack(
'I', struct.pack(
'f', value_f))[0]
2061 return fld(ir, instr, m2_expr.ExprOp(
'int_32_to_double',
2062 m2_expr.ExprInt32(value)))
2066 x = struct.pack(
'd', 1 / math.log(2))
2067 x = struct.unpack(
'Q', x)[0]
2068 return fld(ir, instr, m2_expr.ExprOp(
'mem_64_to_double',
2069 m2_expr.ExprInt64(x)))
2073 x = struct.pack(
'd', math.log10(2))
2074 x = struct.unpack(
'Q', x)[0]
2075 return fld(ir, instr, m2_expr.ExprOp(
'mem_64_to_double',
2076 m2_expr.ExprInt64(x)))
2083 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'fadd', a, src)))
2092 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'fiadd', a, src)))
2101 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'fisub', a, src)))
2110 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'fisub', src, a)))
2118 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'fpatan', float_st0, float_st1)))
2126 e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp(
'fprem', float_st0, float_st1)))
2133 e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp(
'fprem1', float_st0, float_st1)))
2142 e.append(m2_expr.ExprAff(
float_prev(a), m2_expr.ExprOp(
'fadd', a, src)))
2157 e.append(m2_expr.ExprAff(
float_prev(a), m2_expr.ExprOp(
'fyl2x', float_st0, float_st1)))
2166 status_word = m2_expr.ExprCompose([(m2_expr.ExprInt8(0), 0, 8),
2170 (float_stack_ptr, 11, 14),
2172 (m2_expr.ExprInt1(0), 15, 16),
2179 ad = m2_expr.ExprMem(a.arg, size=16)
2180 e.append(m2_expr.ExprAff(ad, float_control))
2181 ad = m2_expr.ExprMem(a.arg + m2_expr.ExprInt_from(a.arg, s / 8 * 1),
2183 e.append(m2_expr.ExprAff(ad, status_word))
2184 ad = m2_expr.ExprMem(a.arg + m2_expr.ExprInt_from(a.arg, s / 8 * 3),
2186 e.append(m2_expr.ExprAff(ad, float_eip[:s]))
2187 ad = m2_expr.ExprMem(a.arg + m2_expr.ExprInt_from(a.arg, s / 8 * 4),
2189 e.append(m2_expr.ExprAff(ad, float_cs))
2190 ad = m2_expr.ExprMem(a.arg + m2_expr.ExprInt_from(a.arg, s / 8 * 5),
2192 e.append(m2_expr.ExprAff(ad, float_address[:s]))
2193 ad = m2_expr.ExprMem(a.arg + m2_expr.ExprInt_from(a.arg, s / 8 * 6),
2195 e.append(m2_expr.ExprAff(ad, float_ds))
2203 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'fsub', a, src)))
2211 e.append(m2_expr.ExprAff(
float_prev(a), m2_expr.ExprOp(
'fsub', a, src)))
2221 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'fsub', src, a)))
2230 e.append(m2_expr.ExprAff(
float_prev(a), m2_expr.ExprOp(
'fsub', src, a)))
2240 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'fmul', a, src)))
2248 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'fimul', a, src)))
2257 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'fdiv', a, src)))
2265 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'fdiv', src, a)))
2274 e.append(m2_expr.ExprAff(
float_prev(a), m2_expr.ExprOp(
'fdiv', src, a)))
2284 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'fidiv', a, src)))
2293 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'fidiv', src, a)))
2303 e.append(m2_expr.ExprAff(
float_prev(a), m2_expr.ExprOp(
'fdiv', a, src)))
2314 e.append(m2_expr.ExprAff(
float_prev(a), m2_expr.ExprOp(
'fmul', a, src)))
2323 e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp(
'ftan', src)))
2331 e.append(m2_expr.ExprAff(float_st0, src))
2332 e.append(m2_expr.ExprAff(src, float_st0))
2339 e.append(m2_expr.ExprAff(float_st7, float_st6))
2340 e.append(m2_expr.ExprAff(float_st6, float_st5))
2341 e.append(m2_expr.ExprAff(float_st5, float_st4))
2342 e.append(m2_expr.ExprAff(float_st4, float_st3))
2343 e.append(m2_expr.ExprAff(float_st3, float_st2))
2344 e.append(m2_expr.ExprAff(float_st2, float_st1))
2345 e.append(m2_expr.ExprAff(float_st1, m2_expr.ExprOp(
'ftan', float_st0)))
2346 e.append(m2_expr.ExprAff(float_st0,
2347 m2_expr.ExprOp(
'int_32_to_double',
2348 m2_expr.ExprInt32(1))))
2350 m2_expr.ExprAff(float_stack_ptr,
2351 float_stack_ptr + m2_expr.ExprInt(1, 3)))
2357 e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp(
'frndint', float_st0)))
2364 e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp(
'fsin', float_st0)))
2371 e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp(
'fcos', float_st0)))
2378 e.append(m2_expr.ExprAff(float_st7, float_st6))
2379 e.append(m2_expr.ExprAff(float_st6, float_st5))
2380 e.append(m2_expr.ExprAff(float_st5, float_st4))
2381 e.append(m2_expr.ExprAff(float_st4, float_st3))
2382 e.append(m2_expr.ExprAff(float_st3, float_st2))
2383 e.append(m2_expr.ExprAff(float_st2, float_st1))
2384 e.append(m2_expr.ExprAff(float_st1, m2_expr.ExprOp(
'fsin', float_st0)))
2385 e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp(
'fcos', float_st0)))
2387 m2_expr.ExprAff(float_stack_ptr,
2388 float_stack_ptr + m2_expr.ExprInt(1, 3)))
2394 e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp(
'fscale', float_st0,
2402 e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp(
'f2xm1', float_st0)))
2408 e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp(
'fchs', float_st0)))
2415 e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp(
'fsqrt', float_st0)))
2422 e.append(m2_expr.ExprAff(float_st0, m2_expr.ExprOp(
'fabs', float_st0)))
2428 args = [(m2_expr.ExprInt8(0), 0, 8),
2432 (float_stack_ptr, 11, 14),
2434 (m2_expr.ExprInt1(0), 15, 16)]
2435 e = [m2_expr.ExprAff(dst, m2_expr.ExprCompose(args))]
2441 e.append(m2_expr.ExprAff(a, float_control))
2447 e.append(m2_expr.ExprAff(float_control, a))
2456 return gen_fcmov(ir, instr, cf, arg1, arg2,
True)
2460 return gen_fcmov(ir, instr, zf, arg1, arg2,
True)
2464 return gen_fcmov(ir, instr, cf|zf, arg1, arg2,
True)
2468 return gen_fcmov(ir, instr, pf, arg1, arg2,
True)
2472 return gen_fcmov(ir, instr, cf, arg1, arg2,
False)
2476 return gen_fcmov(ir, instr, zf, arg1, arg2,
False)
2480 return gen_fcmov(ir, instr, cf|zf, arg1, arg2,
False)
2484 return gen_fcmov(ir, instr, pf, arg1, arg2,
False)
2493 except_int = EXCEPT_PRIV_INSN
2494 e.append(m2_expr.ExprAff(exception_flags, m2_expr.ExprInt32(except_int)))
2500 e.append(m2_expr.ExprAff(tsc1, tsc1 + m2_expr.ExprInt32(1)))
2501 e.append(m2_expr.ExprAff(mRAX[32], tsc1))
2502 e.append(m2_expr.ExprAff(mRDX[32], tsc2))
2508 r_al = mRAX[instr.mode][:8]
2510 cond1 =
expr_cmpu(r_al[:4], m2_expr.ExprInt(0x9, 4)) | af
2511 e.append(m2_expr.ExprAff(af, cond1))
2514 cond2 =
expr_cmpu(m2_expr.ExprInt8(6), r_al)
2515 cond3 =
expr_cmpu(r_al, m2_expr.ExprInt8(0x99)) | cf
2518 cf_c1 = m2_expr.ExprCond(cond1,
2520 m2_expr.ExprInt1(0))
2521 new_cf = m2_expr.ExprCond(cond3,
2522 m2_expr.ExprInt1(1),
2523 m2_expr.ExprInt1(0))
2524 e.append(m2_expr.ExprAff(cf, new_cf))
2526 al_c1 = m2_expr.ExprCond(cond1,
2527 r_al + m2_expr.ExprInt8(6),
2530 new_al = m2_expr.ExprCond(cond3,
2531 al_c1 + m2_expr.ExprInt8(0x60),
2533 e.append(m2_expr.ExprAff(r_al, new_al))
2538 r_al = mRAX[instr.mode][:8]
2540 cond1 =
expr_cmpu(r_al[:4], m2_expr.ExprInt(0x9, 4)) | af
2541 e.append(m2_expr.ExprAff(af, cond1))
2544 cond2 =
expr_cmpu(m2_expr.ExprInt8(6), r_al)
2545 cond3 =
expr_cmpu(r_al, m2_expr.ExprInt8(0x99)) | cf
2548 cf_c1 = m2_expr.ExprCond(cond1,
2550 m2_expr.ExprInt1(0))
2551 new_cf = m2_expr.ExprCond(cond3,
2552 m2_expr.ExprInt1(1),
2554 e.append(m2_expr.ExprAff(cf, new_cf))
2556 al_c1 = m2_expr.ExprCond(cond1,
2557 r_al - m2_expr.ExprInt8(6),
2560 new_al = m2_expr.ExprCond(cond3,
2561 al_c1 - m2_expr.ExprInt8(0x60),
2563 e.append(m2_expr.ExprAff(r_al, new_al))
2569 tempAL = mRAX[instr.mode][0:8]
2570 newEAX = m2_expr.ExprCompose([
2572 (tempAL / a, 8, 16),
2573 (mRAX[instr.mode][16:], 16, mRAX[instr.mode].size),
2575 e += [m2_expr.ExprAff(mRAX[instr.mode], newEAX)]
2582 tempAL = mRAX[instr.mode][0:8]
2583 tempAH = mRAX[instr.mode][8:16]
2584 newEAX = m2_expr.ExprCompose([
2585 ((tempAL + (tempAH * a)) & m2_expr.ExprInt8(0xFF), 0, 8),
2586 (m2_expr.ExprInt8(0), 8, 16),
2587 (mRAX[instr.mode][16:],
2588 16, mRAX[instr.mode].size),
2590 e += [m2_expr.ExprAff(mRAX[instr.mode], newEAX)]
2597 c = (mRAX[instr.mode][:8] & m2_expr.ExprInt8(0xf)) - m2_expr.ExprInt8(9)
2599 c = m2_expr.ExprCond(c.msb(),
2600 m2_expr.ExprInt1(0),
2601 m2_expr.ExprInt1(1)) & \
2603 m2_expr.ExprInt1(1),
2604 m2_expr.ExprInt1(0))
2606 c |= af & m2_expr.ExprInt1(1)
2608 m_al = m2_expr.ExprCond(c,
2609 (mRAX[instr.mode][:8] + m2_expr.ExprInt8(6)) & \
2610 m2_expr.ExprInt8(0xF),
2611 mRAX[instr.mode][:8] & m2_expr.ExprInt8(0xF))
2612 m_ah = m2_expr.ExprCond(c,
2613 mRAX[instr.mode][8:16] + m2_expr.ExprInt8(1),
2614 mRAX[instr.mode][8:16])
2616 e.append(m2_expr.ExprAff(mRAX[instr.mode], m2_expr.ExprCompose([
2617 (m_al, 0, 8), (m_ah, 8, 16),
2618 (mRAX[instr.mode][16:], 16, mRAX[instr.mode].size)])))
2619 e.append(m2_expr.ExprAff(af, c))
2620 e.append(m2_expr.ExprAff(cf, c))
2626 c = (mRAX[instr.mode][:8] & m2_expr.ExprInt8(0xf)) - m2_expr.ExprInt8(9)
2628 c = m2_expr.ExprCond(c.msb(),
2629 m2_expr.ExprInt1(0),
2630 m2_expr.ExprInt1(1)) & \
2632 m2_expr.ExprInt1(1),
2633 m2_expr.ExprInt1(0))
2635 c |= af & m2_expr.ExprInt1(1)
2637 m_al = m2_expr.ExprCond(c,
2638 (mRAX[instr.mode][:8] - m2_expr.ExprInt8(6)) & \
2639 m2_expr.ExprInt8(0xF),
2640 mRAX[instr.mode][:8] & m2_expr.ExprInt8(0xF))
2641 m_ah = m2_expr.ExprCond(c,
2642 mRAX[instr.mode][8:16] - m2_expr.ExprInt8(1),
2643 mRAX[instr.mode][8:16])
2645 e.append(m2_expr.ExprAff(mRAX[instr.mode], m2_expr.ExprCompose([
2646 (m_al, 0, 8), (m_ah, 8, 16),
2647 (mRAX[instr.mode][16:], 16, mRAX[instr.mode].size)])))
2648 e.append(m2_expr.ExprAff(af, c))
2649 e.append(m2_expr.ExprAff(cf, c))
2657 DEST is left unchanged
2660 DEST = @op_name(SRC)
2662 lbl_src_null = m2_expr.ExprId(ir.gen_label(), instr.mode)
2663 lbl_src_not_null = m2_expr.ExprId(ir.gen_label(), instr.mode)
2664 lbl_next = m2_expr.ExprId(ir.get_next_label(instr), instr.mode)
2666 aff_dst = m2_expr.ExprAff(ir.IRDst, lbl_next)
2667 e = [m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(b,
2671 e_src_null.append(m2_expr.ExprAff(zf, m2_expr.ExprInt_from(zf, 1)))
2673 e_src_null.append(aff_dst)
2676 e_src_not_null.append(m2_expr.ExprAff(zf, m2_expr.ExprInt_from(zf, 0)))
2677 e_src_not_null.append(m2_expr.ExprAff(a, m2_expr.ExprOp(op_name, b)))
2678 e_src_not_null.append(aff_dst)
2680 return e, [
irbloc(lbl_src_null.name, [e_src_null]),
2681 irbloc(lbl_src_not_null.name, [e_src_not_null])]
2684 return bsr_bsf(ir, instr, a, b,
"bsf")
2687 return bsr_bsf(ir, instr, a, b,
"bsr")
2692 e.append(m2_expr.ExprAff(exception_flags, m2_expr.ExprInt32(1 << 7)))
2698 e.append(m2_expr.ExprAff(exception_flags, m2_expr.ExprInt32(1 << 7)))
2704 if not isinstance(a, m2_expr.ExprMem)
or a.size != 32:
2705 raise ValueError(
'not exprmem 32bit instance!!')
2707 print "DEFAULT SIDT ADDRESS %s!!" % str(a)
2708 e.append(m2_expr.ExprAff(m2_expr.ExprMem(b, 32),
2709 m2_expr.ExprInt32(0xe40007ff)))
2711 m2_expr.ExprAff(m2_expr.ExprMem(m2_expr.ExprOp(
"+", b,
2712 m2_expr.ExprInt_from(b, 4)), 16), m2_expr.ExprInt16(0x8245)))
2718 e = [m2_expr.ExprAff(exception_flags, m2_expr.ExprInt32(EXCEPT_PRIV_INSN))]
2723 return gen_cmov(ir, instr, zf, arg1, arg2,
True)
2726 return gen_cmov(ir, instr, zf, arg1, arg2,
False)
2730 return gen_cmov(ir, instr, pf, arg1, arg2,
True)
2734 return gen_cmov(ir, instr, pf, arg1, arg2,
False)
2738 return gen_cmov(ir, instr, nf^of, arg1, arg2,
False)
2742 return gen_cmov(ir, instr, zf|(nf^of), arg1, arg2,
False)
2746 return gen_cmov(ir, instr, nf^of, arg1, arg2,
True)
2750 return gen_cmov(ir, instr, zf|(nf^of), arg1, arg2,
True)
2754 return gen_cmov(ir, instr, cf|zf, arg1, arg2,
False)
2758 return gen_cmov(ir, instr, cf, arg1, arg2,
False)
2762 return gen_cmov(ir, instr, cf|zf, arg1, arg2,
True)
2766 return gen_cmov(ir, instr, cf, arg1, arg2,
True)
2770 return gen_cmov(ir, instr, of, arg1, arg2,
True)
2774 return gen_cmov(ir, instr, of, arg1, arg2,
False)
2778 return gen_cmov(ir, instr, nf, arg1, arg2,
True)
2782 return gen_cmov(ir, instr, nf, arg1, arg2,
False)
2787 e.append(m2_expr.ExprAff(exception_flags,
2788 m2_expr.ExprInt32(EXCEPT_PRIV_INSN)))
2797 except_int = EXCEPT_SOFT_BP
2799 except_int = EXCEPT_INT_XX
2800 e.append(m2_expr.ExprAff(exception_flags,
2801 m2_expr.ExprInt32(except_int)))
2807 e.append(m2_expr.ExprAff(exception_flags,
2808 m2_expr.ExprInt32(EXCEPT_PRIV_INSN)))
2816 e.append(m2_expr.ExprAff(exception_flags,
2817 m2_expr.ExprInt32(EXCEPT_PRIV_INSN)))
2825 e.append(m2_expr.ExprAff(exception_flags,
2826 m2_expr.ExprInt32(EXCEPT_PRIV_INSN)))
2834 a = m2_expr.ExprCompose([(m2_expr.ExprInt(0, 24), 8, 32),
2835 (mRAX[instr.mode][0:8], 0, 8)])
2836 b = m2_expr.ExprMem(m2_expr.ExprOp(
'+', mRBX[instr.mode], a), 8)
2837 e.append(m2_expr.ExprAff(mRAX[instr.mode][0:8], b))
2844 m2_expr.ExprAff(mRAX[instr.mode],
2845 m2_expr.ExprOp(
'cpuid', mRAX[instr.mode], m2_expr.ExprInt(0, instr.mode))))
2847 m2_expr.ExprAff(mRBX[instr.mode],
2848 m2_expr.ExprOp(
'cpuid', mRAX[instr.mode], m2_expr.ExprInt(1, instr.mode))))
2850 m2_expr.ExprAff(mRCX[instr.mode],
2851 m2_expr.ExprOp(
'cpuid', mRAX[instr.mode], m2_expr.ExprInt(2, instr.mode))))
2853 m2_expr.ExprAff(mRDX[instr.mode],
2854 m2_expr.ExprOp(
'cpuid', mRAX[instr.mode], m2_expr.ExprInt(3, instr.mode))))
2859 b = b.zeroExtend(a.size)
2860 if isinstance(a, m2_expr.ExprMem):
2861 b_mask = {16:4, 32:5, 64:6}
2862 b_decal = {16:1, 32:3, 64:7}
2864 off_bit = b.zeroExtend(a.size) & m2_expr.ExprInt((1<<b_mask[a.size])-1,
2866 off_byte = ((b.zeroExtend(ptr.size) >> m2_expr.ExprInt_from(ptr, 3)) &
2867 m2_expr.ExprInt_from(ptr,
2868 ((1<<a.size)-1) ^ b_decal[a.size]))
2870 d = m2_expr.ExprMem(ptr + off_byte, a.size)
2872 off_bit = m2_expr.ExprOp(
'&', b, m2_expr.ExprInt_from(a, a.size - 1))
2879 b = b.zeroExtend(a.size)
2882 e.append(m2_expr.ExprAff(cf, d[:1]))
2889 e.append(m2_expr.ExprAff(cf, (d >> off_bit)[:1]))
2891 m = m2_expr.ExprInt_from(a, 1) << off_bit
2892 e.append(m2_expr.ExprAff(d, d ^ m))
2900 e.append(m2_expr.ExprAff(cf, (d >> off_bit)[:1]))
2901 m = m2_expr.ExprInt_from(a, 1) << off_bit
2902 e.append(m2_expr.ExprAff(d, d | m))
2910 e.append(m2_expr.ExprAff(cf, (d >> off_bit)[:1]))
2911 m = ~(m2_expr.ExprInt_from(a, 1) << off_bit)
2912 e.append(m2_expr.ExprAff(d, d & m))
2923 e.append(m2_expr.ExprAff(exception_flags,
2924 m2_expr.ExprInt32(EXCEPT_PRIV_INSN)))
2931 c = mRAX[instr.mode][:a.size]
2935 m2_expr.ExprCond(cond,
2936 m2_expr.ExprInt_from(zf, 0),
2937 m2_expr.ExprInt_from(zf, 1))))
2938 e.append(m2_expr.ExprAff(a, m2_expr.ExprCond(cond,
2942 e.append(m2_expr.ExprAff(c, m2_expr.ExprCond(cond,
2951 e.append(m2_expr.ExprAff(a, m2_expr.ExprMem(b.arg, size=a.size)))
2952 DS_value = m2_expr.ExprMem(b.arg + m2_expr.ExprInt_from(b.arg, a.size/8),
2954 e.append(m2_expr.ExprAff(DS, DS_value))
2960 e.append(m2_expr.ExprAff(a, m2_expr.ExprMem(b.arg, size=a.size)))
2961 ES_value = m2_expr.ExprMem(b.arg + m2_expr.ExprInt_from(b.arg, a.size/8),
2963 e.append(m2_expr.ExprAff(ES, ES_value))
2969 e.append(m2_expr.ExprAff(a, m2_expr.ExprMem(b.arg, size=a.size)))
2970 SS_value = m2_expr.ExprMem(b.arg + m2_expr.ExprInt_from(b.arg, a.size/8),
2972 e.append(m2_expr.ExprAff(SS, SS_value))
2977 e.append(m2_expr.ExprAff(a, m2_expr.ExprMem(b.arg, size=a.size)))
2978 FS_value = m2_expr.ExprMem(b.arg + m2_expr.ExprInt_from(b.arg, a.size/8),
2980 e.append(m2_expr.ExprAff(FS, FS_value))
2985 e.append(m2_expr.ExprAff(a, m2_expr.ExprMem(b.arg, size=a.size)))
2986 GS_value = m2_expr.ExprMem(b.arg + m2_expr.ExprInt_from(b.arg, a.size/8),
2988 e.append(m2_expr.ExprAff(GS, GS_value))
2995 regs = [cf, m2_expr.ExprInt1(1), pf, m2_expr.ExprInt1(0), af,
2996 m2_expr.ExprInt1(0), zf, nf]
2997 for i
in xrange(len(regs)):
2998 args.append((regs[i], i, i + 1))
2999 e.append(m2_expr.ExprAff(mRAX[instr.mode][8:16], m2_expr.ExprCompose(args)))
3004 tmp = mRAX[instr.mode][8:16]
3006 e.append(m2_expr.ExprAff(cf, tmp[0:1]))
3007 e.append(m2_expr.ExprAff(pf, tmp[2:3]))
3008 e.append(m2_expr.ExprAff(af, tmp[4:5]))
3009 e.append(m2_expr.ExprAff(zf, tmp[6:7]))
3010 e.append(m2_expr.ExprAff(nf, tmp[7:8]))
3016 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'access_segment', b)))
3017 e.append(m2_expr.ExprAff(zf, m2_expr.ExprOp(
'access_segment_ok', b)))
3023 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'load_segment_limit', b)))
3024 e.append(m2_expr.ExprAff(zf, m2_expr.ExprOp(
'load_segment_limit_ok', b)))
3040 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'load_tr_segment_selector',
3041 m2_expr.ExprInt32(0))))
3047 if a
in regs_mm_expr:
3048 e.append(m2_expr.ExprAff(a, m2_expr.ExprCompose([(b, 0, 32),
3049 (m2_expr.ExprInt32(0), 32, 64)])))
3050 elif a
in regs_xmm_expr:
3051 e.append(m2_expr.ExprAff(a, m2_expr.ExprCompose([(b, 0, 32),
3052 (m2_expr.ExprInt(0, 96), 32, 128)])))
3054 e.append(m2_expr.ExprAff(a, b[:32]))
3059 return [m2_expr.ExprAff(a, b)], []
3064 return [m2_expr.ExprAff(a, b)], []
3069 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'&', a, b)))
3075 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'|', a, b)))
3081 e.append(m2_expr.ExprAff(a, m2_expr.ExprOp(
'^', a, b)))
3086 msr_addr = m2_expr.ExprId(
'MSR') + m2_expr.ExprInt32(8) * mRCX[instr.mode][:32]
3088 e.append(m2_expr.ExprAff(mRAX[instr.mode][:32], m2_expr.ExprMem(msr_addr, 32)))
3089 e.append(m2_expr.ExprAff(mRDX[instr.mode][:32], m2_expr.ExprMem(msr_addr + m2_expr.ExprInt_from(msr_addr, 4), 32)))
3093 msr_addr = m2_expr.ExprId(
'MSR') + m2_expr.ExprInt32(8) * mRCX[instr.mode][:32]
3095 src = m2_expr.ExprCompose([(mRAX[instr.mode][:32], 0, 32),
3096 (mRDX[instr.mode][:32], 32, 64)])
3097 e.append(m2_expr.ExprAff(m2_expr.ExprMem(msr_addr, 64), src))
3105 Generate simd operations
3107 @size: size of an element
3109 def vec_op_clip_instr(ir, instr, a, b):
3111 return [m2_expr.ExprAff(a[:size], a[:size] - b[:size])], []
3113 return [m2_expr.ExprAff(a[:size], m2_expr.ExprOp(op, a[:size], b[:size]))], []
3114 return vec_op_clip_instr
3118 assert(reg_size % elt_size == 0)
3119 n = reg_size/elt_size
3121 ops = [((a[i*elt_size:(i+1)*elt_size] - b[i*elt_size:(i+1)*elt_size]),
3122 i*elt_size, (i+1)*elt_size)
for i
in xrange(0, n)]
3124 ops = [(m2_expr.ExprOp(op, a[i*elt_size:(i+1)*elt_size],
3125 b[i*elt_size:(i+1)*elt_size]),
3127 (i+1)*elt_size)
for i
in xrange(0, n)]
3129 return m2_expr.ExprCompose(ops)
3132 assert(reg_size % elt_size == 0)
3133 n = reg_size/elt_size
3135 x_to_int, int_to_x = {32: (
'float_to_int_%d',
'int_%d_to_float'),
3136 64: (
'double_to_int_%d',
'int_%d_to_double')}[elt_size]
3138 ops = [(m2_expr.ExprOp(x_to_int % elt_size,
3139 m2_expr.ExprOp(int_to_x % elt_size, a[i*elt_size:(i+1)*elt_size]) -
3140 m2_expr.ExprOp(int_to_x % elt_size, b[i*elt_size:(i+1)*elt_size])),
3141 i*elt_size, (i+1)*elt_size)
for i
in xrange(0, n)]
3143 ops = [(m2_expr.ExprOp(x_to_int % elt_size,
3145 m2_expr.ExprOp(int_to_x % elt_size, a[i*elt_size:(i+1)*elt_size]),
3146 m2_expr.ExprOp(int_to_x % elt_size, b[i*elt_size:(i+1)*elt_size]))),
3147 i*elt_size, (i+1)*elt_size)
for i
in xrange(0, n)]
3149 return m2_expr.ExprCompose(ops)
3152 def vec_instr(ir, instr, a, b):
3154 if isinstance(b, m2_expr.ExprMem):
3155 b = m2_expr.ExprMem(b.arg, a.size)
3157 e.append(m2_expr.ExprAff(a, sem(op, elt_size, reg_size, a, b)))
3217 e.append(m2_expr.ExprAff(a, c))
3224 e.append(m2_expr.ExprAff(a, c))
3230 e.append(m2_expr.ExprAff(a, m2_expr.ExprCond((a - b).msb(), a, b)))
3235 e.append(m2_expr.ExprAff(a[:64], m2_expr.ExprOp(
'int_32_to_double', b[:32])))
3236 e.append(m2_expr.ExprAff(a[64:128], m2_expr.ExprOp(
'int_32_to_double', b[32:64])))
3241 e.append(m2_expr.ExprAff(a[:32], m2_expr.ExprOp(
'int_32_to_float', b[:32])))
3242 e.append(m2_expr.ExprAff(a[32:64], m2_expr.ExprOp(
'int_32_to_float', b[32:64])))
3243 e.append(m2_expr.ExprAff(a[64:96], m2_expr.ExprOp(
'int_32_to_float', b[64:96])))
3244 e.append(m2_expr.ExprAff(a[96:128], m2_expr.ExprOp(
'int_32_to_float', b[96:128])))
3249 e.append(m2_expr.ExprAff(a[:32], m2_expr.ExprOp(
'double_to_int_32', b[:64])))
3250 e.append(m2_expr.ExprAff(a[32:64], m2_expr.ExprOp(
'double_to_int_32', b[64:128])))
3251 e.append(m2_expr.ExprAff(a[64:128], m2_expr.ExprInt64(0)))
3256 e.append(m2_expr.ExprAff(a[:32], m2_expr.ExprOp(
'double_to_int_32', b[:64])))
3257 e.append(m2_expr.ExprAff(a[32:64], m2_expr.ExprOp(
'double_to_int_32', b[64:128])))
3262 e.append(m2_expr.ExprAff(a[:32], m2_expr.ExprOp(
'double_to_float', b[:64])))
3263 e.append(m2_expr.ExprAff(a[32:64], m2_expr.ExprOp(
'double_to_float', b[64:128])))
3264 e.append(m2_expr.ExprAff(a[64:128], m2_expr.ExprInt64(0)))
3269 e.append(m2_expr.ExprAff(a[:64], m2_expr.ExprOp(
'int_32_to_double', b[:32])))
3270 e.append(m2_expr.ExprAff(a[64:128], m2_expr.ExprOp(
'int_32_to_double', b[32:64])))
3275 e.append(m2_expr.ExprAff(a[:32], m2_expr.ExprOp(
'int_32_to_float', b[:32])))
3276 e.append(m2_expr.ExprAff(a[32:64], m2_expr.ExprOp(
'int_32_to_float', b[32:64])))
3281 e.append(m2_expr.ExprAff(a[:32], m2_expr.ExprOp(
'float_to_int_32', b[:32])))
3282 e.append(m2_expr.ExprAff(a[32:64], m2_expr.ExprOp(
'float_to_int_32', b[32:64])))
3283 e.append(m2_expr.ExprAff(a[64:96], m2_expr.ExprOp(
'float_to_int_32', b[64:96])))
3284 e.append(m2_expr.ExprAff(a[96:128], m2_expr.ExprOp(
'float_to_int_32', b[96:128])))
3289 e.append(m2_expr.ExprAff(a[:64], m2_expr.ExprOp(
'float_to_double', b[:32])))
3290 e.append(m2_expr.ExprAff(a[64:128], m2_expr.ExprOp(
'float_to_double', b[32:64])))
3295 e.append(m2_expr.ExprAff(a[:32], m2_expr.ExprOp(
'float_to_int_32', b[:32])))
3296 e.append(m2_expr.ExprAff(a[32:64], m2_expr.ExprOp(
'float_to_int_32', b[32:64])))
3301 e.append(m2_expr.ExprAff(a[:32], m2_expr.ExprOp(
'double_to_int_32', b[:64])))
3306 e.append(m2_expr.ExprAff(a[:32], m2_expr.ExprOp(
'double_to_float', b[:64])))
3311 e.append(m2_expr.ExprAff(a[:64], m2_expr.ExprOp(
'int_32_to_double', b[:32])))
3316 e.append(m2_expr.ExprAff(a[:32], m2_expr.ExprOp(
'int_32_to_float', b[:32])))
3321 e.append(m2_expr.ExprAff(a[:64], m2_expr.ExprOp(
'float_to_double', b[:32])))
3326 e.append(m2_expr.ExprAff(a[:32], m2_expr.ExprOp(
'float_to_int_32', b[:32])))
3331 e.append(m2_expr.ExprAff(a[:32], m2_expr.ExprOp(
'double_trunc_to_int_32', b[:64])))
3332 e.append(m2_expr.ExprAff(a[32:64], m2_expr.ExprOp(
'double_trunc_to_int_32', b[64:128])))
3337 e.append(m2_expr.ExprAff(a[:32], m2_expr.ExprOp(
'double_trunc_to_int_32', b[:64])))
3338 e.append(m2_expr.ExprAff(a[32:64], m2_expr.ExprOp(
'double_trunc_to_int_32', b[64:128])))
3339 e.append(m2_expr.ExprAff(a[64:128], m2_expr.ExprInt64(0)))
3344 e.append(m2_expr.ExprAff(a[:32], m2_expr.ExprOp(
'float_trunc_to_int_32', b[:32])))
3345 e.append(m2_expr.ExprAff(a[32:64], m2_expr.ExprOp(
'float_trunc_to_int_32', b[32:64])))
3346 e.append(m2_expr.ExprAff(a[64:96], m2_expr.ExprOp(
'float_trunc_to_int_32', b[64:96])))
3347 e.append(m2_expr.ExprAff(a[96:128], m2_expr.ExprOp(
'float_trunc_to_int_32', b[96:128])))
3352 e.append(m2_expr.ExprAff(a[:32], m2_expr.ExprOp(
'float_trunc_to_int_32', b[:32])))
3353 e.append(m2_expr.ExprAff(a[32:64], m2_expr.ExprOp(
'float_trunc_to_int_32', b[32:64])))
3358 e.append(m2_expr.ExprAff(a[:32], m2_expr.ExprOp(
'double_trunc_to_int_32', b[:64])))
3363 e.append(m2_expr.ExprAff(a[:32], m2_expr.ExprOp(
'float_trunc_to_int_32', b[:32])))
3368 if not isinstance(a, m2_expr.ExprMem)
and not isinstance(b, m2_expr.ExprMem):
3370 e.append(m2_expr.ExprAff(a[:32], b[:32]))
3371 elif not isinstance(b, m2_expr.ExprMem)
and isinstance(a, m2_expr.ExprMem):
3373 e.append(m2_expr.ExprAff(a, b[:32]))
3376 e.append(m2_expr.ExprAff(a, m2_expr.ExprCompose([(b, 0, 32),
3377 (m2_expr.ExprInt(0, 96), 32, 128)])))
3383 e.append(m2_expr.ExprAff(zf, m2_expr.ExprOp(
'ucomiss_zf', a[:32], b[:32])))
3384 e.append(m2_expr.ExprAff(pf, m2_expr.ExprOp(
'ucomiss_pf', a[:32], b[:32])))
3385 e.append(m2_expr.ExprAff(cf, m2_expr.ExprOp(
'ucomiss_cf', a[:32], b[:32])))
3387 e.append(m2_expr.ExprAff(of, m2_expr.ExprInt1(0)))
3388 e.append(m2_expr.ExprAff(af, m2_expr.ExprInt1(0)))
3389 e.append(m2_expr.ExprAff(nf, m2_expr.ExprInt1(0)))
3393 mnemo_func = {
'mov': mov,
3470 'cmpsb':
lambda ir, instr:
cmps(ir, instr, 8),
3471 'cmpsw':
lambda ir, instr:
cmps(ir, instr, 16),
3472 'cmpsd':
lambda ir, instr:
cmps(ir, instr, 32),
3473 'scasb':
lambda ir, instr:
scas(ir, instr, 8),
3474 'scasw':
lambda ir, instr:
scas(ir, instr, 16),
3475 'scasd':
lambda ir, instr:
scas(ir, instr, 32),
3538 'stosb':
lambda ir, instr:
stos(ir, instr, 8),
3539 'stosw':
lambda ir, instr:
stos(ir, instr, 16),
3540 'stosd':
lambda ir, instr:
stos(ir, instr, 32),
3541 'stosq':
lambda ir, instr:
stos(ir, instr, 64),
3543 'lodsb':
lambda ir, instr:
lods(ir, instr, 8),
3544 'lodsw':
lambda ir, instr:
lods(ir, instr, 16),
3545 'lodsd':
lambda ir, instr:
lods(ir, instr, 32),
3546 'lodsq':
lambda ir, instr:
lods(ir, instr, 64),
3548 'movsb':
lambda ir, instr:
movs(ir, instr, 8),
3549 'movsw':
lambda ir, instr:
movs(ir, instr, 16),
3550 'movsd': movsd_dispatch,
3551 'movsq':
lambda ir, instr:
movs(ir, instr, 64),
3624 'fcmovnbe': fcmovnbe,
3664 'insb':
lambda ir, instr:
ins(ir, instr, 8),
3665 'insw':
lambda ir, instr:
ins(ir, instr, 16),
3666 'insd':
lambda ir, instr:
ins(ir, instr, 32),
3672 'outsb':
lambda ir, instr:
l_outs(ir, instr, 8),
3673 'outsw':
lambda ir, instr:
l_outs(ir, instr, 16),
3674 'outsd':
lambda ir, instr:
l_outs(ir, instr, 32),
3677 "sysenter": l_sysenter,
3706 "cvtdq2pd": cvtdq2pd,
3707 "cvtdq2ps": cvtdq2ps,
3708 "cvtpd2dq": cvtpd2dq,
3709 "cvtpd2pi": cvtpd2pi,
3710 "cvtpd2ps": cvtpd2ps,
3711 "cvtpi2pd": cvtpi2pd,
3712 "cvtpi2ps": cvtpi2ps,
3713 "cvtps2dq": cvtps2dq,
3714 "cvtps2pd": cvtps2pd,
3715 "cvtps2pi": cvtps2pi,
3716 "cvtsd2si": cvtsd2si,
3717 "cvtsd2ss": cvtsd2ss,
3718 "cvtsi2sd": cvtsi2sd,
3719 "cvtsi2ss": cvtsi2ss,
3720 "cvtss2sd": cvtss2sd,
3721 "cvtss2si": cvtss2si,
3722 "cvttpd2pi": cvttpd2pi,
3723 "cvttpd2dq": cvttpd2dq,
3724 "cvttps2dq": cvttps2dq,
3725 "cvttps2pi": cvttps2pi,
3726 "cvttsd2si": cvttsd2si,
3727 "cvttss2si": cvttss2si,
3807 ir.__init__(self, mn_x86, 16, symbol_pool)
3814 self.
IRDst = m2_expr.ExprId(
'IRDst', 16)
3820 args = instr.args[:]
3821 args = [arg.replace_expr(float_replace)
for arg
in args]
3825 if self.do_all_segm
and instr.additional_info.g2.value:
3826 my_ss = {1: CS, 2: SS, 3: DS, 4: ES, 5: FS, 6: GS}[
3827 instr.additional_info.g2.value]
3828 if my_ss
is not None:
3829 for i, a
in enumerate(args):
3830 if isinstance(a, m2_expr.ExprMem)
and not a.is_op_segm():
3831 args[i] = m2_expr.ExprMem(m2_expr.ExprOp(
'segm', my_ss,
3834 if not instr.name.lower()
in mnemo_func:
3835 raise NotImplementedError(
"Mnemonic %s not implemented" % instr.name)
3837 instr_ir, extra_ir = mnemo_func[
3838 instr.name.lower()](self, instr, *args)
3839 self.mod_pc(instr, instr_ir, extra_ir)
3841 self.mod_pc(instr, instr_ir, extra_ir)
3842 instr.additional_info.except_on_instr =
False
3843 if instr.additional_info.g1.value & 6 == 0
or \
3844 not instr.name
in repeat_mn:
3845 return instr_ir, extra_ir
3846 if instr.name ==
"MOVSD" and len(instr.args) == 2:
3847 return instr_ir, extra_ir
3849 instr.additional_info.except_on_instr =
True
3851 s = {
"B": 8,
"W": 16,
"D": 32,
'Q': 64}[instr.name[-1]]
3852 size = instr.v_opmode()
3853 c_reg = mRCX[instr.mode][:size]
3861 cond_dec = m2_expr.ExprCond(c_reg - m2_expr.ExprInt_from(c_reg, 1),
3862 m2_expr.ExprInt1(0), m2_expr.ExprInt1(1))
3866 elif instr.additional_info.g1.value & 2:
3867 c_cond = cond_dec | zf
3868 elif instr.additional_info.g1.value & 4:
3869 c_cond = cond_dec | (zf ^ m2_expr.ExprInt1(1))
3872 lbl_do = m2_expr.ExprId(self.gen_label(), instr.mode)
3873 lbl_end = m2_expr.ExprId(self.gen_label(), instr.mode)
3874 lbl_skip = m2_expr.ExprId(self.get_next_label(instr), instr.mode)
3875 lbl_next = m2_expr.ExprId(self.get_next_label(instr), instr.mode)
3879 for i, e
in enumerate(ir):
3880 src = e.src.replace_expr({lbl_next: lbl_end})
3881 ir[i] = m2_expr.ExprAff(e.dst, src)
3883 cond_bloc.append(m2_expr.ExprAff(c_reg,
3884 c_reg - m2_expr.ExprInt_from(c_reg,
3886 cond_bloc.append(m2_expr.ExprAff(self.IRDst, m2_expr.ExprCond(c_cond,
3889 cond_bloc = irbloc(lbl_end.name, [cond_bloc])
3892 c = irbloc(lbl_do.name, [e_do])
3893 c.except_automod =
False
3894 e_n = [m2_expr.ExprAff(self.IRDst, m2_expr.ExprCond(c_reg, lbl_do,
3896 return e_n, [cond_bloc, c] + extra_ir
3899 return e.replace_expr(replace_regs[mode])
3904 return m2_expr.ExprAff(dst, src)
3907 for irs
in irbloc.irs:
3908 for i, e
in enumerate(irs):
3910 special case for 64 bits:
3911 if destination is a 32 bit reg, zero extend the 64 bit reg
3914 if (isinstance(e.dst, m2_expr.ExprId)
and \
3915 e.dst.size == 32
and \
3916 e.dst
in replace_regs[64]):
3918 dst = replace_regs[64][e.dst].arg
3919 e = m2_expr.ExprAff(dst, src.zeroExtend(64))
3927 ir.__init__(self, mn_x86, 32, symbol_pool)
3934 self.
IRDst = m2_expr.ExprId(
'IRDst', 32)
3940 ir.__init__(self, mn_x86, 64, symbol_pool)
3947 self.
IRDst = m2_expr.ExprId(
'IRDst', 64)
3951 for i, expr
in enumerate(instr_ir):
3952 dst, src = expr.dst, expr.src
3954 dst = dst.replace_expr(
3955 {self.
pc: m2_expr.ExprInt64(instr.offset + instr.l)})
3956 src = src.replace_expr(
3957 {self.
pc: m2_expr.ExprInt64(instr.offset + instr.l)})
3958 instr_ir[i] = m2_expr.ExprAff(dst, src)
3961 for i, expr
in enumerate(irs):
3962 dst, src = expr.dst, expr.src
3964 new_pc = m2_expr.ExprInt64(instr.offset + instr.l)
3965 dst = dst.replace_expr({self.
pc: new_pc})
3966 src = src.replace_expr(
3967 {self.
pc: m2_expr.ExprInt64(instr.offset + instr.l)})
3968 irs[i] = m2_expr.ExprAff(dst, src)
def vec_op_clip
MMX/SSE/AVX operations.
def float_vec_vertical_instr
def __vec_vertical_instr_gen
def pand
Logical (floating-point)
def expraff_fix_regs_for_mode
def expr_fix_regs_for_mode
def float_vec_vertical_sem
def irbloc_fix_regs_for_mode