6 from pyparsing
import *
8 from collections
import defaultdict
13 log = logging.getLogger(
"x86_arch")
14 console_handler = logging.StreamHandler()
15 console_handler.setFormatter(logging.Formatter(
"%(levelname)-5s: %(message)s"))
16 log.addHandler(console_handler)
17 log.setLevel(logging.WARN)
19 conditional_branch = [
"JO",
"JNO",
"JB",
"JAE",
20 "JZ",
"JNZ",
"JBE",
"JA",
21 "JS",
"JNS",
"JPE",
"JNP",
23 "JL",
"JGE",
"JLE",
"JG",
24 "JCXZ",
"JECXZ",
"JRCXZ"]
26 unconditional_branch = [
'JMP',
'JMPF']
39 f_imm2size = {f_s08: 8, f_s16: 16, f_s32: 32, f_s64: 64,
40 f_u08: 8, f_u16: 16, f_u32: 32, f_u64: 64}
43 size2gpregs = {8: gpregs08, 16: gpregs16,
44 32: gpregs32, 64: gpregs64}
48 AL: RAX[:8], CL: RCX[:8], DL: RDX[:8], BL: RBX[:8],
49 AH: RAX[8:16], CH: RCX[8:16], DH: RDX[8:16], BH: RBX[8:16],
50 SPL: RSP[0:8], BPL: RBP[0:8], SIL: RSI[0:8], DIL: RDI[0:8],
51 R8B: R8[0:8], R9B: R9[0:8], R10B: R10[0:8], R11B: R11[0:8],
52 R12B: R12[0:8], R13B: R13[0:8], R14B: R14[0:8], R15B: R15[0:8],
54 AX: RAX[:16], CX: RCX[:16], DX: RDX[:16], BX: RBX[:16],
55 SP: RSP[:16], BP: RBP[:16], SI: RSI[:16], DI: RDI[:16],
56 R8W: R8[:16], R9W: R9[:16], R10W: R10[:16], R11W: R11[:16],
57 R12W: R12[:16], R13W: R13[:16], R14W: R14[:16], R15W: R15[:16],
59 EAX: RAX[:32], ECX: RCX[:32], EDX: RDX[:32], EBX: RBX[:32],
60 ESP: RSP[:32], EBP: RBP[:32], ESI: RSI[:32], EDI: RDI[:32],
61 R8D: R8[:32], R9D: R9[:32], R10D: R10[:32], R11D: R11[:32],
62 R12D: R12[:32], R13D: R13[:32], R14D: R14[:32], R15D: R15[:32],
64 IP: RIP[:16], EIP: RIP[:32],
66 ExprId(
"ST", 64): float_st0,
67 ExprId(
"ST(0)", 64): float_st0,
68 ExprId(
"ST(1)", 64): float_st1,
69 ExprId(
"ST(2)", 64): float_st2,
70 ExprId(
"ST(3)", 64): float_st3,
71 ExprId(
"ST(4)", 64): float_st4,
72 ExprId(
"ST(5)", 64): float_st5,
73 ExprId(
"ST(6)", 64): float_st6,
74 ExprId(
"ST(7)", 64): float_st7,
79 AL: EAX[:8], CL: ECX[:8], DL: EDX[:8], BL: EBX[:8],
80 AH: EAX[8:16], CH: ECX[8:16], DH: EDX[8:16], BH: EBX[8:16],
82 AX: EAX[:16], CX: ECX[:16], DX: EDX[:16], BX: EBX[:16],
83 SP: ESP[:16], BP: EBP[:16], SI: ESI[:16], DI: EDI[:16],
88 ExprId(
"ST", 64): float_st0,
89 ExprId(
"ST(0)", 64): float_st0,
90 ExprId(
"ST(1)", 64): float_st1,
91 ExprId(
"ST(2)", 64): float_st2,
92 ExprId(
"ST(3)", 64): float_st3,
93 ExprId(
"ST(4)", 64): float_st4,
94 ExprId(
"ST(5)", 64): float_st5,
95 ExprId(
"ST(6)", 64): float_st6,
96 ExprId(
"ST(7)", 64): float_st7,
101 AL: AX[:8], CL: CX[:8], DL: DX[:8], BL: BX[:8],
102 AH: AX[8:16], CH: CX[8:16], DH: DX[8:16], BH: BX[8:16],
104 AX: AX[:16], CX: CX[:16], DX: DX[:16], BX: BX[:16],
105 SP: SP[:16], BP: BP[:16], SI: SI[:16], DI: DI[:16],
108 ExprId(
"ST", 64): float_st0,
109 ExprId(
"ST(0)", 64): float_st0,
110 ExprId(
"ST(1)", 64): float_st1,
111 ExprId(
"ST(2)", 64): float_st2,
112 ExprId(
"ST(3)", 64): float_st3,
113 ExprId(
"ST(4)", 64): float_st4,
114 ExprId(
"ST(5)", 64): float_st5,
115 ExprId(
"ST(6)", 64): float_st6,
116 ExprId(
"ST(7)", 64): float_st7,
120 replace_regs = {16: replace_regs16,
129 COLON = Suppress(
":")
132 LBRACK = Suppress(
"[")
133 RBRACK = Suppress(
"]")
135 dbreg = Group(gpregs16.parser | gpregs32.parser | gpregs64.parser)
136 gpreg = (gpregs08.parser | gpregs08_64.parser | gpregs16.parser |
137 gpregs32.parser | gpregs64.parser | gpregs_xmm.parser |
142 if not r.name
in all_regs_ids_byname:
143 raise ValueError(
'unknown reg')
144 return all_regs_ids_byname[r.name]
166 return t[0][0] + t[1][0]
182 return r1 + (r2 * i1)
191 return r1 + (r2 * i1) + i2
206 return (r1 * i1) + i2
220 return ExprOp(
'segm', t[0], t[1])
227 if not t
in mn_x86.regs.all_regs_ids_byname:
230 r = mn_x86.regs.all_regs_ids_byname[t]
239 base_expr.setParseAction(my_var_parser)
241 int_or_expr = base_expr
243 deref_mem_ad = Group(LBRACK + dbreg + RBRACK).setParseAction(parse_deref_reg)
244 deref_mem_ad |= Group(
245 LBRACK + int_or_expr + RBRACK).setParseAction(parse_deref_int)
246 deref_mem_ad |= Group(
247 LBRACK + dbreg + PLUS +
248 int_or_expr + RBRACK).setParseAction(parse_deref_regint)
249 deref_mem_ad |= Group(
250 LBRACK + dbreg + PLUS +
251 dbreg + RBRACK).setParseAction(parse_deref_regreg)
252 deref_mem_ad |= Group(
253 LBRACK + dbreg + PLUS + dbreg + PLUS +
254 int_or_expr + RBRACK).setParseAction(parse_deref_regregint)
255 deref_mem_ad |= Group(
256 LBRACK + dbreg + PLUS + dbreg + MULT +
257 int_or_expr + RBRACK).setParseAction(parse_deref_reg_intmreg)
258 deref_mem_ad |= Group(
259 LBRACK + dbreg + PLUS + dbreg + MULT + int_or_expr +
260 PLUS + int_or_expr + RBRACK).setParseAction(parse_deref_reg_intmreg_int)
261 deref_mem_ad |= Group(
262 LBRACK + dbreg + MULT +
263 int_or_expr + RBRACK).setParseAction(parse_deref_intmreg)
264 deref_mem_ad |= Group(
265 LBRACK + dbreg + MULT + int_or_expr +
266 PLUS + int_or_expr + RBRACK).setParseAction(parse_deref_intmregint)
269 deref_ptr = Group(int_or_expr + COLON +
270 int_or_expr).setParseAction(parse_deref_segmoff)
273 PTR = Suppress(
'PTR')
276 BYTE = Literal(
'BYTE')
277 WORD = Literal(
'WORD')
278 DWORD = Literal(
'DWORD')
279 QWORD = Literal(
'QWORD')
280 TBYTE = Literal(
'TBYTE')
281 XMMWORD = Literal(
'XMMWORD')
283 MEMPREFIX2SIZE = {
'BYTE': 8,
'WORD': 16,
'DWORD': 32,
284 'QWORD': 64,
'TBYTE': 80,
'XMMWORD': 128}
286 SIZE2MEMPREFIX = dict((x[1], x[0])
for x
in MEMPREFIX2SIZE.items())
292 return ExprMem(ptr, MEMPREFIX2SIZE[s[0]])
295 return ExprMem(
ExprOp(
'segm', segm[0], ptr), MEMPREFIX2SIZE[s[0]])
297 raise ValueError(
'len(t) > 3')
299 mem_size = Group(BYTE | DWORD | QWORD | WORD | TBYTE | XMMWORD)
300 deref_mem = Group(mem_size + PTR + Optional(Group(int_or_expr + COLON))
301 + deref_mem_ad).setParseAction(parse_deref_mem)
304 rmarg = Group(gpregs08.parser |
311 ).setParseAction(getreg)
316 cl_or_imm = Group(r08_ecx.parser).setParseAction(getreg)
317 cl_or_imm |= int_or_expr
322 parser = reg_info.parser
327 parser = reg_info.parser
332 parser = reg_info.parser
337 parser = reg_info.parser
342 parser = reg_info.parser
347 parser = reg_info.parser
350 invmode = {16: 32, 32: 16}
354 size, opmode, admode = mode
365 raise NotImplementedError(
'not fully functional')
369 size, opmode, admode = mode
377 raise NotImplementedError(
'not fully functional')
401 stk = hasattr(p,
'stk')
429 g = re.search(
'(\S+)(\s+)', s)
432 prefix, b = g.groups()
433 return prefix, s[len(prefix) + len(b):]
436 repeat_mn = [
"INS",
"OUTS",
437 "MOVSB",
"MOVSW",
"MOVSD",
"MOVSQ",
438 "SCASB",
"SCASW",
"SCASD",
"SCASQ",
439 "LODSB",
"LODSW",
"LODSD",
"LODSQ",
440 "STOSB",
"STOSW",
"STOSD",
"STOSQ",
441 "CMPSB",
"CMPSW",
"CMPSD",
"CMPSQ",
444 segm2enc = {CS: 1, SS: 2, DS: 3, ES: 4, FS: 5, GS: 6}
445 enc2segm = dict([(x[1], x[0])
for x
in segm2enc.items()])
471 super(instruction_x86, self).
__init__(*args, **kargs)
474 return self.additional_info.v_opmode
477 return self.additional_info.v_admode
480 if self.
name in conditional_branch + unconditional_branch:
482 if self.name.startswith(
'LOOP'):
484 return self.
name in [
'CALL']
487 if self.additional_info.g1.value & 6
and self.
name in repeat_mn:
490 if isinstance(expr, ExprId):
491 if not isinstance(expr.name, asm_label)
and expr
not in all_regs_ids:
492 raise ValueError(
"ExprId must be a label or a register")
493 elif isinstance(expr, ExprInt):
494 ad = expr.arg + int(self.offset)
495 l = symbol_pool.getby_offset_create(ad)
502 if self.
name in conditional_branch + unconditional_branch:
504 if self.name.startswith(
'LOOP'):
506 if self.name.startswith(
'RET'):
508 if self.name.startswith(
'INT'):
510 if self.name.startswith(
'SYS'):
512 return self.
name in [
'CALL',
'HLT',
'IRET',
'IRETD',
'IRETQ',
'ICEBP']
515 if self.
name in conditional_branch:
517 if self.
name in unconditional_branch:
519 if self.name.startswith(
'LOOP'):
521 if self.name.startswith(
'INT'):
523 if self.name.startswith(
'SYS'):
525 return self.
name in [
'CALL']
531 return self.name
in [
'CALL']
534 if self.additional_info.g1.value & 6
and self.
name in repeat_mn:
535 ad = int(self.offset)
536 l = symbol_pool.getby_offset_create(ad)
539 return [self.
args[0]]
546 if self.offset
is None:
547 raise ValueError(
'symbol not resolved %s' % l)
548 if not isinstance(expr, ExprInt):
549 log.warning(
'dynamic dst %r', expr)
554 self.additional_info.g1.value = c.g1.value
555 self.additional_info.g2.value = c.g2.value
556 self.additional_info.stk = hasattr(c,
'stk')
557 self.additional_info.v_opmode = c.v_opmode()
558 self.additional_info.v_admode = c.v_admode()
559 self.additional_info.prefix = c.prefix
560 self.additional_info.prefixed = getattr(c,
"prefixed",
"")
563 o = super(instruction_x86, self).
__str__()
564 if self.additional_info.g1.value & 1:
566 if self.additional_info.g1.value & 2:
567 if getattr(self.additional_info.prefixed,
'default',
"") !=
"\xF2":
569 if self.additional_info.g1.value & 4:
570 if getattr(self.additional_info.prefixed,
'default',
"") !=
"\xF3":
577 a = a.replace_expr(replace_regs[self.
mode])
583 if isinstance(expr, ExprId)
or isinstance(expr, ExprInt):
585 elif isinstance(expr, ExprMem):
586 sz = SIZE2MEMPREFIX[expr.size]
588 if expr.is_op_segm():
589 segm =
"%s:" % expr.arg.args[0]
590 expr = expr.arg.args[1]
593 if isinstance(expr, ExprOp):
594 s = str(expr).replace(
'(',
'').replace(
')',
'')
597 o = sz +
' PTR %s[%s]' % (segm, s)
598 elif isinstance(expr, ExprOp)
and expr.op ==
'segm':
599 o =
"%s:%s" % (expr.args[0], expr.args[1])
601 raise ValueError(
'check this %r' % expr)
608 prefix_op_size =
False
609 prefix_ad_size =
False
612 all_mn_mode = defaultdict(list)
613 all_mn_name = defaultdict(list)
614 all_mn_inst = defaultdict(list)
618 pc = {16: IP, 32: EIP, 64: RIP}
619 sp = {16: SP, 32: ESP, 64: RSP}
620 instruction = instruction_x86
621 max_instruction_len = 15
625 return cls.pc[attrib]
629 return cls.sp[attrib]
632 if hasattr(self,
'stk'):
639 size, opmode, admode = self.mode, self.
opmode, self.
admode
652 info.g1.value = self.g1.value
653 info.g2.value = self.g2.value
654 info.stk = hasattr(self,
'stk')
657 if hasattr(self,
'prefixed'):
658 info.prefixed = self.prefixed.default
671 prefix = [d_g1, d_g2, d_rex_p, d_rex_w, d_rex_r, d_rex_x, d_rex_b]
672 return prefix + fields
677 return [(subcls, name, bases, dct, fields)]
686 elif prefix ==
"REPNE":
689 elif prefix ==
"REPE":
693 c.additional_info.g1.value = pref
699 pre_dis_info = {
'opmode': 0,
712 c = v.getbytes(offset)
714 pre_dis_info[
'opmode'] = 1
716 pre_dis_info[
'admode'] = 1
718 pre_dis_info[
'g1'] = 1
720 pre_dis_info[
'g1'] = 2
722 pre_dis_info[
'g1'] = 4
725 pre_dis_info[
'g2'] = 1
727 pre_dis_info[
'g2'] = 2
729 pre_dis_info[
'g2'] = 3
731 pre_dis_info[
'g2'] = 4
733 pre_dis_info[
'g2'] = 5
735 pre_dis_info[
'g2'] = 6
737 elif mode == 64
and c
in '@ABCDEFGHIJKLMNO':
739 pre_dis_info[
'rex_p'] = 1
740 pre_dis_info[
'rex_w'] = (x >> 3) & 1
741 pre_dis_info[
'rex_r'] = (x >> 2) & 1
742 pre_dis_info[
'rex_x'] = (x >> 1) & 1
743 pre_dis_info[
'rex_b'] = (x >> 0) & 1
749 pre_dis_info[
'prefix'] += c
751 return pre_dis_info, v, mode, offset, offset - offset_o
755 for opmode
in [0, 1]:
756 for admode
in [0, 1]:
767 if not hasattr(c,
'stk')
and hasattr(c,
"fopmode")
and c.fopmode.mode == 64:
774 if not isinstance(a.expr, ExprMem):
778 ExprOp(
'segm', enc2segm[self.g2.value], m.arg), m.size)
779 if self.
name in [
'LEA',
'LDS',
'LES',
'LFS',
'LGS',
'LSS']:
780 if not isinstance(self.
args[1].expr, ExprMem):
785 if infos
is not None:
786 self.g1.value = infos.g1.value
787 self.g2.value = infos.g2.value
791 if hasattr(self,
"opmode"):
793 if hasattr(self,
"admode"):
797 if pre_dis_info
is None:
799 if hasattr(self,
"prefixed")
and self.prefixed.default ==
"\x66":
800 pre_dis_info[
'opmode'] = 0
804 if hasattr(self,
'no_xmm_pref')
and\
805 pre_dis_info[
'prefix']
and\
806 pre_dis_info[
'prefix'][-1]
in '\x66\xf2\xf3':
808 if (hasattr(self,
"prefixed")
and
809 not pre_dis_info[
'prefix'].endswith(self.prefixed.default)):
811 if (self.rex_w.value
is not None and
812 self.rex_w.value != pre_dis_info[
'rex_w']):
815 self.rex_w.value = pre_dis_info[
'rex_w']
816 self.rex_r.value = pre_dis_info[
'rex_r']
817 self.rex_b.value = pre_dis_info[
'rex_b']
818 self.rex_x.value = pre_dis_info[
'rex_x']
819 self.rex_p.value = pre_dis_info[
'rex_p']
820 self.g1.value = pre_dis_info[
'g1']
821 self.g2.value = pre_dis_info[
'g2']
832 if self.g1.value
is None:
834 if self.g2.value
is None:
845 if rex != 0x40
or self.rex_p.value == 1:
848 if hasattr(self,
'prefixed'):
849 v = self.prefixed.default + v
851 if self.g1.value & 1:
853 if self.g1.value & 2:
854 if hasattr(self,
'no_xmm_pref'):
857 if self.g1.value & 4:
858 if hasattr(self,
'no_xmm_pref'):
862 v = {1:
'\x2e', 2:
'\x36', 3:
'\x3e', 4:
863 '\x26', 5:
'\x64', 6:
'\x65'}[self.g2.value] + v
865 if hasattr(self,
"admode")
and self.
admode:
868 if hasattr(self,
"opmode")
and self.
opmode:
869 if hasattr(self,
'no_xmm_pref'):
882 raise NotImplementedError(
'not fully functional')
885 return [
ExprAff(mRIP[self.mode],
894 for c, v
in candidates:
895 if (hasattr(c,
'no_xmm_pref')
and
896 (c.g1.value & 2
or c.g1.value & 4
or c.opmode)):
898 if hasattr(c,
"fopmode")
and v_opmode(c) != c.fopmode.mode:
900 if hasattr(c,
"fadmode")
and v_admode(c) != c.fadmode.mode:
904 if (instr.dstflow()
and
905 instr.name
not in [
"JCXZ",
"JECXZ",
"JRCXZ"]
and
906 len(instr.args) == 1
and
907 isinstance(instr.args[0], ExprInt)
and c.opmode):
912 for c, v
in candidates:
915 for c, v
in candidates:
918 cand_same_mode.sort(key=len)
919 cand_diff_mode.sort(key=len)
920 return cand_same_mode + cand_diff_mode
928 for candidate
in candidates:
929 cls, name, bases, dct, fields = candidate
931 (dct[
'mode'], dct[
'opmode'], dct[
'admode']))
933 size, opmode, admode = dct[
'mode'], dct[
'opmode'], dct[
'admode']
936 if mode
in self.
args[
'name']:
939 f =
bs(
"1", l=0, cls=(bs_fbit,), fname=
"rex_w")
942 nfields = nfields[:-1]
943 args = dict(self.
args)
945 if osize
in self.
args[
'name']:
946 ndct[
'name'] = self.
args[
'name'][osize]
947 out.append((cls, ndct[
'name'], bases, ndct, nfields))
950 nfields = nfields[:-1]
952 f =
bs(
"0", l=0, cls=(bs_fbit,), fname=
"rex_w")
955 args = dict(self.
args)
957 if osize
in self.
args[
'name']:
958 ndct[
'name'] = self.
args[
'name'][osize]
959 out.append((cls, ndct[
'name'], bases, ndct, nfields))
961 l =
opmode_prefix((dct[
'mode'], dct[
'opmode'], dct[
'admode']))
963 nfields = fields[:-1]
964 args = dict(self.
args)
966 if osize
in self.
args[
'name']:
967 ndct[
'name'] = self.
args[
'name'][osize]
968 out.append((cls, ndct[
'name'], bases, ndct, nfields))
977 for candidate
in candidates:
978 cls, name, bases, dct, fields = candidate
980 (dct[
'mode'], dct[
'opmode'], dct[
'admode']))
982 size, opmode, admode = dct[
'mode'], dct[
'opmode'], dct[
'admode']
985 nfields = nfields[:-1]
986 args = dict(self.
args)
990 ndct[
'name'] =
"JECXZ"
992 ndct[
'name'] =
"JRCXZ"
995 ndct[
'name'] =
"JCXZ"
997 ndct[
'name'] =
"JECXZ"
1000 ndct[
'name'] =
"JECXZ"
1002 ndct[
'name'] =
"JCXZ"
1004 raise ValueError(
'unhandled mode')
1005 out.append((cls, ndct[
'name'], bases, ndct, nfields))
1014 for candidate
in candidates:
1015 cls, name, bases, dct, fields = candidate
1017 (dct[
'mode'], dct[
'opmode'], dct[
'admode']))
1018 size, opmode, admode = dct[
'mode'], dct[
'opmode'], dct[
'admode']
1021 l =
opmode_prefix((dct[
'mode'], dct[
'opmode'], dct[
'admode']))
1023 nfields = fields[:-1]
1024 args = dict(self.
args)
1026 if mode == 64
or osize == 32:
1027 ndct[
'name'] = self.
args[
'name'][mode]
1029 ndct[
'name'] = self.
args[
'name'][16]
1030 out.append((cls, ndct[
'name'], bases, ndct, nfields))
1058 intmask = (1 << intsize) - 1
1063 intmask = (1 << intsize) - 1
1068 intmask = (1 << intsize) - 1
1073 intmask = (1 << intsize) - 1
1078 intmask = (1 << intsize) - 1
1086 admode = p.v_admode()
1094 intmask = (1 << intsize) - 1
1099 intmask = (1 << intsize) - 1
1104 intmask = (1 << intsize) - 1
1118 if not isinstance(e, ExprInt):
1121 if v & ~((1 << self.l) - 1) != 0:
1128 if self.parent.v_opmode() == 64:
1131 if (1 << (self.l - 1)) & v:
1137 if not isinstance(self.
expr, ExprInt):
1139 v = int(self.expr.arg)
1140 opmode = self.parent.v_opmode()
1151 self.parent.rex_w.value = 1
1152 opmode = self.parent.v_opmode()
1155 int(v & ((1 << self.
in_size) - 1)),
1162 self.
value = (v & 0xffffffff) & self.lmask
1182 if self.parent.rex_w.value == 1:
1208 reg_info = r_eax_all
1210 parser = reg_info.parser
1215 if hasattr(p,
'w8')
and p.w8.value == 0:
1216 expr = regs08_expr[self.
rindex]
1218 expr = size2gpregs[p.v_opmode()].expr[self.
rindex]
1226 osize = p.v_opmode()
1227 if hasattr(p,
'w8'):
1228 if p.w8.value
is None:
1234 if hasattr(p,
'w8')
and p.w8.value == 0:
1235 return expr == regs08_expr[self.
rindex]
1236 elif p.mode
in [16, 32]:
1237 return expr == size2gpregs[osize].expr[self.
rindex]
1239 if expr == size2gpregs[64].expr[self.
rindex]:
1242 elif expr == size2gpregs[osize].expr[self.
rindex]:
1248 reg_info = r_eax_all
1250 parser = reg_info.parser
1258 return self.
expr == self.reg_info.expr[0]
1262 reg_info = r_edx_all
1264 parser = reg_info.parser
1270 parser = reg_info.parser
1276 parser = reg_info.parser
1282 parser = reg_info.parser
1288 parser = reg_info.parser
1294 parser = reg_info.parser
1300 parser = reg_info.parser
1306 parser = reg_info.parser
1311 parser = reg_info.parser
1315 bsname =
"sib_scale"
1320 for cls, name, bases, dct, fields
in candidates:
1322 (dct[
'mode'], dct[
'opmode'], dct[
'admode'])) != 16
and
1323 'rm' in dct
and dct[
'rm'] == 0b100
and
1324 'mod' in dct
and dct[
'mod'] != 0b11)):
1328 ndct[self.
args[
'fname']] =
None
1329 out.append((cls, ndct[
'name'], bases, ndct, nfields))
1333 args = dict(self.
args)
1337 ndct[self.
args[
'fname']] =
None
1338 out.append((cls, ndct[
'name'], bases, ndct, nfields))
1346 class bs_sib_base(bs_sib_scale):
1355 for cls, name, bases, dct, fields
in candidates:
1359 (dct[
'mode'], dct[
'opmode'], dct[
'admode'])) == 16):
1360 if 'mod' in dct
and dct[
'mod'] == 0b00
and \
1361 'rm' in dct
and dct[
'rm'] == 0b110:
1363 l=16, cls=(x86_16_ne,), fname=self.
args[
'fname'])
1364 ndct[self.
args[
'fname']] =
True
1365 out.append((cls, ndct[
'name'], bases, ndct, nfields))
1367 elif 'mod' in dct
and dct[
'mod'] == 0b01:
1369 l=8, cls=(x86_08_ne,), fname=self.
args[
'fname'])
1370 ndct[self.
args[
'fname']] =
True
1371 out.append((cls, ndct[
'name'], bases, ndct, nfields))
1373 elif 'mod' in dct
and dct[
'mod'] == 0b10:
1375 l=16, cls=(x86_16_ne,), fname=self.
args[
'fname'])
1376 ndct[self.
args[
'fname']] =
True
1377 out.append((cls, ndct[
'name'], bases, ndct, nfields))
1380 if 'mod' in dct
and dct[
'mod'] == 0b00
and \
1381 'rm' in dct
and dct[
'rm'] == 0b101:
1383 l=32, cls=(x86_32_ne,), fname=self.
args[
'fname'])
1384 ndct[self.
args[
'fname']] =
True
1385 out.append((cls, ndct[
'name'], bases, ndct, nfields))
1387 elif 'mod' in dct
and dct[
'mod'] == 0b01:
1389 l=8, cls=(x86_08_ne,), fname=self.
args[
'fname'])
1390 ndct[self.
args[
'fname']] =
True
1391 out.append((cls, ndct[
'name'], bases, ndct, nfields))
1393 elif 'mod' in dct
and dct[
'mod'] == 0b10:
1395 l=32, cls=(x86_32_ne,), fname=self.
args[
'fname'])
1396 ndct[self.
args[
'fname']] =
True
1397 out.append((cls, ndct[
'name'], bases, ndct, nfields))
1401 ndct[self.
args[
'fname']] =
None
1402 out.append((cls, ndct[
'name'], bases, ndct, nfields))
1407 return (c >> 6) & 3, (c >> 3) & 7, c & 7
1411 return ((mod & 3) << 6) | ((re & 7) << 3) | (rm & 7)
1422 global db_afs_64, sib_64_s08_ebp
1425 sib_s08_ebp = [{f_isad:
True}
for i
in range(0x100)]
1426 sib_u32_ebp = [{f_isad:
True}
for i
in range(0x100)]
1427 sib_u32 = [{f_isad:
True}
for i
in range(0x100)]
1430 for rex_x
in xrange(2):
1432 for rex_b
in xrange(2):
1433 x = [{f_isad:
True}
for i
in range(0x100)]
1438 for rex_x
in xrange(2):
1440 for rex_b
in xrange(2):
1441 x = [{f_isad:
True}
for i
in range(0x100)]
1443 sib_u64_ebp.append(o)
1446 for rex_x
in xrange(2):
1448 for rex_b
in xrange(2):
1449 x = [{f_isad:
True}
for i
in range(0x100)]
1451 sib_64_s08_ebp.append(o)
1453 for sib_rez
in [sib_s08_ebp,
1460 for index
in range(0x100):
1464 if sib_rez == sib_s08_ebp:
1465 sib_rez[index][f_imm] = f_s08
1466 sib_rez[index][ebp] = 1
1467 elif sib_rez == sib_u32_ebp:
1468 sib_rez[index][f_imm] = f_u32
1469 sib_rez[index][ebp] = 1
1470 elif sib_rez == sib_u32:
1471 sib_rez[index][f_imm] = f_u32
1472 elif sib_rez == sib_u64_ebp:
1473 for rex_b
in xrange(2):
1474 for rex_x
in xrange(2):
1475 sib_rez[rex_x][rex_b][index][f_imm] = f_u32
1476 sib_rez[rex_x][rex_b][index][ebp + 8 * rex_b] = 1
1477 elif sib_rez == sib_u64:
1478 for rex_b
in xrange(2):
1479 for rex_x
in xrange(2):
1480 sib_rez[rex_x][rex_b][index][f_imm] = f_u32
1481 elif sib_rez == sib_64_s08_ebp:
1482 for rex_b
in xrange(2):
1483 for rex_x
in xrange(2):
1484 sib_rez[rex_x][rex_b][index][f_imm] = f_s08
1485 sib_rez[rex_x][rex_b][index][ebp + 8 * rex_b] = 1
1488 if sib_rez == sib_s08_ebp:
1489 sib_rez[index][b] = 1
1490 sib_rez[index][f_imm] = f_s08
1491 elif sib_rez == sib_u32_ebp:
1492 sib_rez[index][b] = 1
1493 sib_rez[index][f_imm] = f_u32
1494 elif sib_rez == sib_u32:
1495 sib_rez[index][b] = 1
1496 elif sib_rez == sib_u64_ebp:
1497 for rex_b
in xrange(2):
1498 for rex_x
in xrange(2):
1499 sib_rez[rex_x][rex_b][index][b + 8 * rex_b] = 1
1500 sib_rez[rex_x][rex_b][index][f_imm] = f_u32
1501 elif sib_rez == sib_u64:
1502 for rex_b
in xrange(2):
1503 for rex_x
in xrange(2):
1504 sib_rez[rex_x][rex_b][index][b + 8 * rex_b] = 1
1505 elif sib_rez == sib_64_s08_ebp:
1506 for rex_b
in xrange(2):
1507 for rex_x
in xrange(2):
1508 sib_rez[rex_x][rex_b][index][f_imm] = f_s08
1509 sib_rez[rex_x][rex_b][index][b + 8 * rex_b] = 1
1511 if i == 0b100
and sib_rez
in [sib_s08_ebp, sib_u32_ebp, sib_u32]:
1514 if sib_rez
in [sib_s08_ebp, sib_u32_ebp, sib_u32]:
1516 if not tmp
in sib_rez[index]:
1517 sib_rez[index][tmp] = 0
1518 sib_rez[index][tmp] += 1 << ss
1520 for rex_b
in xrange(2):
1521 for rex_x
in xrange(2):
1523 if i == 0b100
and rex_x == 0:
1525 if not tmp
in sib_rez[rex_x][rex_b][index]:
1526 sib_rez[rex_x][rex_b][index][tmp] = 0
1527 sib_rez[rex_x][rex_b][index][tmp] += 1 << ss
1530 db_afs_32 = [
None for i
in range(0x100)]
1531 for i
in range(0x100):
1537 db_afs_32[index] = sib_u32
1539 db_afs_32[index] = {f_isad:
True, f_imm: f_u32}
1541 db_afs_32[index] = {f_isad:
True, rm: 1}
1544 db_afs_32[index] = sib_s08_ebp
1546 tmp = {f_isad:
True, rm: 1, f_imm: f_s08}
1547 db_afs_32[index] = tmp
1551 db_afs_32[index] = sib_u32_ebp
1553 db_afs_32[index] = {f_isad:
True, rm: 1, f_imm: f_u32}
1555 db_afs_32[index] = {f_isad:
False, rm: 1}
1558 db_afs_64 = [
None for i
in range(0x400)]
1559 for i
in range(0x400):
1561 rex_x = (index >> 9) & 1
1562 rex_b = (index >> 8) & 1
1567 db_afs_64[i] = sib_u64[rex_x][rex_b]
1569 db_afs_64[i] = {f_isad:
True, f_imm: f_u32, 16: 1}
1571 db_afs_64[i] = {f_isad:
True, rm + 8 * rex_b: 1}
1574 db_afs_64[i] = sib_64_s08_ebp[rex_x][rex_b]
1576 tmp = {f_isad:
True, rm + 8 * rex_b: 1, f_imm: f_s08}
1581 db_afs_64[i] = sib_u64_ebp[rex_x][rex_b]
1583 db_afs_64[i] = {f_isad:
True, rm + 8 * rex_b: 1, f_imm: f_u32}
1585 db_afs_64[i] = {f_isad:
False, rm + 8 * rex_b: 1}
1588 db_afs_16 = [
None for i
in range(0x100)]
1593 for i
in range(0x100):
1599 db_afs_16[index] = {f_isad:
True, _si: 1}
1601 db_afs_16[index] = {f_isad:
True, _di: 1}
1603 db_afs_16[index] = {
1604 f_isad:
True, f_imm: f_u16}
1606 db_afs_16[index] = {f_isad:
True, _bx: 1}
1608 db_afs_16[index] = {f_isad:
True,
1609 [_si, _di][rm % 2]: 1,
1610 [_bx, _bp][(rm >> 1) % 2]: 1}
1611 elif mod
in [0b01, 0b10]:
1618 db_afs_16[index] = {f_isad:
True, _si: 1, f_imm: my_imm}
1620 db_afs_16[index] = {f_isad:
True, _di: 1, f_imm: my_imm}
1622 db_afs_16[index] = {f_isad:
True, _bp: 1, f_imm: my_imm}
1624 db_afs_16[index] = {f_isad:
True, _bx: 1, f_imm: my_imm}
1626 db_afs_16[index] = {f_isad:
True,
1627 [_si, _di][rm % 2]: 1,
1628 [_bx, _bp][(rm >> 1) % 2]: 1,
1632 db_afs_16[index] = {f_isad:
False, rm: 1}
1635 byte2modrm[16] = db_afs_16
1636 byte2modrm[32] = db_afs_32
1637 byte2modrm[64] = db_afs_64
1639 modrm2byte = {16: defaultdict(list),
1640 32: defaultdict(list),
1641 64: defaultdict(list),
1643 for size, db_afs
in byte2modrm.items():
1644 for i, modrm
in enumerate(db_afs):
1645 if not isinstance(modrm, list):
1646 modrm = modrm.items()
1648 modrm = tuple(modrm)
1649 modrm2byte[size][modrm].append(i)
1651 for j, modrm_f
in enumerate(modrm):
1652 modrm_f = modrm_f.items()
1654 modrm_f = tuple(modrm_f)
1655 modrm2byte[size][modrm_f].append((i, j))
1657 return byte2modrm, modrm2byte
1666 if isinstance(e, ExprInt):
1668 if isinstance(e, ExprId):
1669 i = size2gpregs[e.size].expr.index(e)
1672 elif isinstance(e, ExprOp):
1678 raise ValueError(
'multiple displacement!')
1682 mul = int(e.args[1].arg)
1684 i = size2gpregs[a.size].expr.index(a)
1687 raise ValueError(
'bad op')
1691 if isinstance(ptr, ExprInt):
1692 return ptr.arg < (1 << size)
1694 return ptr.size == size
1696 SIZE2XMMREG = {64:gpregs_mm,
1701 opmode = parent.v_opmode()
1702 if expr.is_op_segm()
and isinstance(expr.arg.args[0], ExprInt):
1703 return None,
None,
False
1705 if expr.is_op_segm():
1706 segm = expr.arg.args[0]
1707 ptr = expr.arg.args[1]
1712 dct_expr[f_isad] =
True
1714 admode = parent.v_admode()
1716 return None,
None,
False
1718 if (w8 == 1
and expr.size != opmode
and not sx
and
1719 not (hasattr(parent,
'sd')
or hasattr(parent,
'wd'))):
1720 return None,
None,
False
1722 if hasattr(parent,
'wd'):
1725 elif expr.size == 32:
1728 return None,
None,
False
1730 if (parent.mode == 64
and ptr.size == 32
and
1731 parent.admode != 1):
1732 return None,
None,
False
1733 dct_expr = {f_isad:
True}
1739 if disp
is not None:
1740 for signed, encoding, cast_int
in [(
True, f_s08, ExprInt8),
1741 (
True, f_s16, ExprInt16),
1742 (
True, f_s32, ExprInt32),
1743 (
False, f_u08, ExprInt8),
1744 (
False, f_u16, ExprInt16),
1745 (
False, f_u32, ExprInt32)]:
1746 value = cast_int(int(disp.arg))
1747 if admode < value.size:
1749 if int(disp.arg) !=
sign_ext(int(value.arg), admode, disp.size):
1752 if int(disp.arg) != int(value.arg):
1755 if int(disp.arg) !=
sign_ext(int(value.arg), value.size, admode):
1758 x1[f_imm] = (encoding, value)
1762 return out, segm,
True
1765 dct_expr = {f_isad :
False}
1768 if mm
and expr.size != 64:
1769 return None,
None,
False
1770 elif xmm
and expr.size != 128:
1771 return None,
None,
False
1773 if isinstance(expr, ExprId):
1774 selreg = SIZE2XMMREG[expr.size]
1775 if not expr
in selreg.expr:
1776 return None,
None,
False
1777 i = selreg.expr.index(expr)
1779 return [dct_expr],
None,
True
1781 return parse_mem(expr, parent, w8, sx, xmm, mm)
1783 elif expr.size == 64
and expr
not in gpregs_mm.expr:
1784 if hasattr(parent,
'sd'):
1786 elif hasattr(parent,
'wd'):
1788 elif hasattr(parent,
'stk'):
1791 parent.rex_w.value = 1
1792 opmode = parent.v_opmode()
1797 if expr.size == 8
and w8 != 0:
1798 return None,
None,
False
1800 if w8 == 0
and expr.size != 8:
1801 return None,
None,
False
1803 if not isinstance(expr, ExprMem):
1804 dct_expr[f_isad] =
False
1806 if expr
in gpregs_xmm.expr:
1807 i = gpregs_xmm.expr.index(expr)
1809 return [dct_expr],
None,
True
1811 return None,
None,
False
1813 if expr
in gpregs_mm.expr:
1814 i = gpregs_mm.expr.index(expr)
1816 return [dct_expr],
None,
True
1818 return None,
None,
False
1820 if parent.mode == 64
and expr
in gpregs08_64.expr:
1822 parent.rex_p.value = 1
1824 parent.rex_p.value = 0
1825 parent.rex_x.value = 0
1827 if not expr
in r.expr:
1828 return None,
None,
False
1829 i = r.expr.index(expr)
1831 return [dct_expr],
None,
True
1832 if opmode != expr.size:
1833 return None,
None,
False
1834 if not expr
in size2gpregs[opmode].expr:
1835 return None,
None,
False
1836 i = size2gpregs[opmode].expr.index(expr)
1838 if parent.mode != 64:
1839 return None,
None,
False
1841 return [dct_expr],
None,
True
1842 return parse_mem(expr, parent, w8, sx, xmm, mm)
1846 if not modrm[f_isad]:
1847 modrm_k = [x[0]
for x
in modrm.iteritems()
if x[1] == 1]
1848 if len(modrm_k) != 1:
1849 raise ValueError(
'strange reg encoding %r' % modrm)
1850 modrm_k = modrm_k[0]
1858 opmode = parent.v_opmode()
1860 expr = gpregs_xmm.expr[modrm_k]
1862 expr = gpregs_mm.expr[modrm_k]
1863 elif opmode == 8
and (parent.v_opmode() == 64
or parent.rex_p.value == 1):
1864 expr = gpregs08_64.expr[modrm_k]
1866 expr = size2gpregs[opmode].expr[modrm_k]
1868 admode = parent.v_admode()
1869 opmode = parent.v_opmode()
1870 for modrm_k, scale
in modrm.items():
1871 if isinstance(modrm_k, (int, long)):
1872 expr = size2gpregs[admode].expr[modrm_k]
1874 expr =
ExprInt(scale, admode) * expr
1877 if parent.disp.value
is None:
1879 o.append(
ExprInt(int(parent.disp.expr.arg), admode))
1892 expr =
ExprMem(expr, size=opmode)
1900 start, stop = super(x86_rm_arg, self).
fromstring(s, parser_result)
1909 admode = p.v_admode()
1911 if not admode
in [16, 32, 64]:
1912 raise ValueError(
'strange admode %r', admode)
1913 v =
setmodrm(p.mod.value, 0, p.rm.value)
1914 v |= p.rex_b.value << 8
1915 v |= p.rex_x.value << 9
1920 xx = byte2modrm[admode][v]
1921 if isinstance(xx, list):
1934 return self.
expr is not None
1937 if not admode
in modrm2byte:
1944 o_rex_x = p.rex_x.value
1945 o_rex_b = p.rex_b.value
1950 new_v_cand.append(v)
1951 if f_imm
in v
and int(v[f_imm][1].arg) == 0:
1954 new_v_cand.append(v)
1964 size, disp = v[f_imm]
1965 disp = int(disp.arg)
1972 if not v
in modrm2byte[admode]:
1974 xx = modrm2byte[admode][v]
1978 if type(x) == tuple:
1985 if (
not sib
is None)
and admode == 16:
1988 if rex
and admode != 64:
1991 p.rex_x.value = (rex >> 1) & 1
1992 p.rex_b.value = rex & 1
1994 if o_rex_x
is not None and p.rex_x.value != o_rex_x:
1996 if o_rex_b
is not None and p.rex_b.value != o_rex_b:
2001 if re != p.reg.value:
2005 s_scale, s_index, s_base =
getmodrm(sib)
2007 s_scale, s_index, s_base =
None,
None,
None
2011 p.sib_scale.value = s_scale
2012 p.sib_index.value = s_index
2013 p.sib_base.value = s_base
2015 if disp
is not None:
2016 p.disp.l = f_imm2size[vo[f_imm]]
2023 if isinstance(self.
expr, ExprInt):
2026 admode = p.v_admode()
2027 mode = self.expr.size
2030 p.g2.value = segm2enc[segm]
2031 for x
in self.
gen_cand(v_cand, admode):
2041 return self.
expr is not None
2044 if isinstance(self.
expr, ExprInt):
2047 if p.w8.value
is None:
2048 if self.expr.size == 8:
2055 p.g2.value = segm2enc[segm]
2056 for x
in self.
gen_cand(v_cand, p.v_admode()):
2066 return self.
expr is not None
2069 if isinstance(self.
expr, ExprInt):
2072 if p.w8.value
is None:
2073 if self.expr.size == 8:
2079 p.g2.value = segm2enc[segm]
2080 for x
in self.
gen_cand(v_cand, p.v_admode()):
2090 return self.
expr is not None
2093 if isinstance(self.
expr, ExprInt):
2098 p.g2.value = segm2enc[segm]
2099 for x
in self.
gen_cand(v_cand, p.v_admode()):
2106 return self.parent.sd.value
2108 self.parent.sd.value = value
2114 if not isinstance(expr, ExprMem):
2121 return self.
expr is not None
2124 if isinstance(self.
expr, ExprInt):
2127 if not self.expr.size
in [32, 64]:
2131 for x
in self.
gen_cand(v_cand, p.v_admode()):
2138 return self.parent.wd.value
2140 self.parent.wd.value = value
2143 if isinstance(self.
expr, ExprInt):
2148 for x
in self.
gen_cand(v_cand, p.v_admode()):
2159 if not isinstance(expr, ExprMem):
2162 return self.
expr is not None
2165 if isinstance(self.
expr, ExprInt):
2169 for x
in self.
gen_cand(v_cand, p.v_admode()):
2177 if isinstance(self.
expr, ExprInt):
2179 if not isinstance(self.
expr, ExprMem)
or self.expr.size != self.
msize:
2187 for x
in self.
gen_cand(v_cand, p.v_admode()):
2198 return self.
expr is not None
2201 if self.expr.size != 8:
2206 for x
in self.
gen_cand(v_cand, p.v_admode()):
2223 if isinstance(expr, ExprMem)
and expr.size != self.
msize:
2231 if isinstance(expr, ExprInt):
2233 if isinstance(expr, ExprMem)
and expr.size != self.
msize:
2239 if isinstance(expr, ExprMem):
2246 for x
in self.
gen_cand(v_cand, p.v_admode()):
2273 prio = default_prio + 1
2278 if not hasattr(self.parent,
'sx')
and hasattr(self.parent,
"w8"):
2279 self.parent.w8.value = 1
2281 e, start, stop = parser_result[self.
parser]
2285 if self.expr.size == 8:
2286 if hasattr(self.parent,
'sx')
or not hasattr(self.parent,
'w8'):
2288 self.parent.w8.value = 0
2291 v, start, stop = self.parser.scanString(s).next()
2292 except StopIteration:
2295 if self.expr.size == 0:
2296 if hasattr(self.parent,
'sx')
or not hasattr(self.parent,
'w8'):
2298 self.parent.w8.value = 0
2303 return self.parent.rex_r.value
2306 self.parent.rex_r.value = v
2311 opmode = p.v_opmode()
2312 if not hasattr(p,
'sx')
and (hasattr(p,
'w8')
and p.w8.value == 0):
2314 r = size2gpregs[opmode]
2317 if p.v_opmode() == 64
or p.rex_p.value == 1:
2318 if not hasattr(p,
'sx')
and (hasattr(p,
'w8')
and p.w8.value == 0):
2320 self.
expr = r.expr[v]
2324 if not isinstance(self.
expr, ExprId):
2326 if self.
expr in gpregs64.expr
and not hasattr(self.parent,
'stk'):
2327 self.parent.rex_w.value = 1
2328 opmode = self.parent.v_opmode()
2329 if not hasattr(self.parent,
'sx')
and hasattr(self.parent,
'w8'):
2330 self.parent.w8.value = 1
2331 if self.expr.size == 8:
2332 if hasattr(self.parent,
'sx')
or not hasattr(self.parent,
'w8'):
2334 self.parent.w8.value = 0
2336 r = size2gpregs[opmode]
2337 if self.
expr in r.expr:
2338 i = r.expr.index(self.
expr)
2339 elif (opmode == 8
and self.parent.mode == 64
and
2340 self.
expr in gpregs08_64.expr):
2341 i = gpregs08_64.expr.index(self.
expr)
2342 self.parent.rex_p.value = 1
2344 log.debug(
"cannot encode reg %r", self.
expr)
2346 if self.parent.v_opmode() == 64:
2350 elif self.parent.mode == 64
and i > 7:
2354 if self.
value > self.lmask:
2355 log.debug(
"cannot encode field value %x %x",
2356 self.
value, self.lmask)
2364 if self.parent.mode == 64
and self.
getrexsize():
2370 if not isinstance(self.
expr, ExprId):
2372 if self.
expr not in self.selreg.expr:
2374 i = self.selreg.expr.index(self.
expr)
2375 if self.parent.mode == 64
and i > 7:
2379 if self.
value > self.lmask:
2380 log.debug(
"cannot encode field value %x %x",
2381 self.
value, self.lmask)
2392 class x86_reg(x86_rm_reg):
2395 return self.parent.rex_b.value
2398 self.parent.rex_b.value = v
2404 return self.parent.rex_b.value
2407 self.parent.rex_b.value = v
2411 prio = default_prio + 1
2413 parser = reg_info.parser
2417 prio = default_prio + 1
2419 parser = reg_info.parser
2423 prio = default_prio + 1
2425 parser = reg_info.parser
2429 prio = default_prio + 1
2431 parser = reg_info.parser
2452 if self.
expr == regs08_expr[1]:
2454 elif isinstance(self.
expr, ExprInt)
and int(self.expr.arg) == 1:
2464 if v[
'mod'] == 0b11:
2466 elif v[
'rm'] == 0b100:
2470 return v[
'rm'] == 0b100
2482 if self.
value is None:
2486 return super(bs_cond_scale, self).
encode()
2507 if v[
'mod'] == 0b00:
2508 if v[
'rm'] == 0b110:
2512 elif v[
'mod'] == 0b01:
2514 elif v[
'mod'] == 0b10:
2518 if 'sib_base' in v
and v[
'sib_base'] == 0b101:
2519 if v[
'mod'] == 0b00:
2521 elif v[
'mod'] == 0b01:
2523 elif v[
'mod'] == 0b10:
2528 if v[
'mod'] == 0b00:
2529 if v[
'rm'] == 0b101:
2533 elif v[
'mod'] == 0b01:
2535 elif v[
'mod'] == 0b10:
2541 if self.
value is None:
2549 admode = self.parent.v_admode()
2559 parser = int_or_expr
2564 expr, start, stop = parser_result[self.
parser]
2567 expr, start, stop = self.parser.scanString(s).next()
2568 except StopIteration:
2572 if len(self.parent.args) > 1:
2573 l = self.parent.args[0].expr.size
2575 l = self.parent.v_opmode()
2576 if isinstance(self.
expr, ExprInt):
2577 v = int(self.expr.arg)
2578 mask = ((1 << l) - 1)
2581 if self.
expr is None:
2582 log.debug(
'cannot fromstring int %r', s)
2588 if 'w8' not in v
or v[
'w8'] == 1:
2589 if 'se' in v
and v[
'se'] == 1:
2593 osize = min(osize, cls.max_size)
2601 if not isinstance(self.
expr, ExprInt):
2603 arg0_expr = self.parent.args[0].expr
2604 self.parent.rex_w.value = 0
2606 if len(self.parent.args) == 1:
2607 v = int(self.expr.arg)
2608 l = self.parent.v_opmode()
2612 mask = ((1 << self.
l) - 1)
2620 if arg0_expr.size == 64:
2621 self.parent.rex_w.value = 1
2623 l = self.parent.v_opmode()
2624 v = int(self.expr.arg)
2625 if arg0_expr.size == 8:
2626 if not hasattr(self.
parent,
'w8'):
2628 self.parent.w8.value = 0
2630 if hasattr(self.
parent,
'se'):
2631 self.parent.se.value = 0
2632 elif hasattr(self.
parent,
'se'):
2633 if hasattr(self.
parent,
'w8'):
2634 self.parent.w8.value = 1
2636 if v ==
sign_ext(v & 0xFF, 8, arg0_expr.size):
2637 self.parent.se.value = 1
2639 self.
value = v & 0xFF
2641 self.parent.se.value = 0
2643 if hasattr(self.
parent,
'w8'):
2644 self.parent.w8.value = 1
2650 mask = ((1 << self.
l) - 1)
2657 opmode = self.parent.v_opmode()
2661 if hasattr(self.
parent,
'w8')
and self.parent.w8.value == 0:
2676 if 'w8' not in v
or v[
'w8'] == 1:
2677 if 'se' in v
and v[
'se'] == 1:
2687 parser = int_or_expr
2691 expr, start, stop = parser_result[self.
parser]
2694 expr, start, stop = self.parser.scanString(s).next()
2695 except StopIteration:
2698 l = self.parent.mode
2699 if isinstance(self.
expr, ExprInt):
2700 v = int(self.expr.arg)
2701 mask = ((1 << l) - 1)
2714 if not isinstance(self.
expr, ExprInt):
2716 arg0_expr = self.parent.args[0].expr
2720 l = self.parent.v_opmode()
2723 prefix = self.parent.gen_prefix()
2724 parent_len = len(prefix) * 8 + self.parent.l + self.
l
2725 assert(parent_len % 8 == 0)
2727 v = int(self.expr.arg - parent_len/8)
2730 mask = ((1 << self.
l) - 1)
2747 parser = int_or_expr
2754 if not isinstance(self.
expr, ExprInt):
2756 arg0_expr = self.parent.args[0].expr
2760 l = self.parent.v_opmode()
2763 v = int(self.expr.arg)
2764 mask = ((1 << self.
l) - 1)
2798 if not hasattr(self.
parent,
"mseg"):
2800 m = self.parent.mseg.expr
2801 if not (isinstance(m, ExprOp)
and m.op ==
'segm'):
2803 if not isinstance(m.args[1], ExprInt):
2805 l = self.parent.v_opmode()
2810 v = int(m.args[1].arg)
2811 mask = ((1 << self.
l) - 1)
2818 opmode = self.parent.v_opmode()
2833 e, start, stop = parser_result[self.
parser]
2836 if not isinstance(e, ExprMem):
2839 if self.
expr is None:
2843 v, start, stop = self.parser.scanString(s).next()
2844 except StopIteration:
2846 if not isinstance(e, ExprMem):
2849 if self.
expr is None:
2850 log.debug(
'cannot fromstring int %r', s)
2866 if not isinstance(self.
expr, ExprMem)
or not isinstance(self.expr.arg, ExprInt):
2868 self.
l = p.v_admode()
2869 v = int(self.expr.arg.arg)
2870 mask = ((1 << self.
l) - 1)
2877 if self.parent.mode == 64:
2878 if self.parent.admode == 1:
2883 l = self.parent.v_admode()
2888 size = self.parent.v_opmode()
2889 if self.parent.w8.value == 0:
2900 e, start, stop = parser_result[self.
parser]
2904 if self.
expr is None:
2908 v, start, stop = self.parser.scanString(s).next()
2909 except StopIteration:
2912 if self.
expr is None:
2913 log.debug(
'cannot fromstring int %r', s)
2918 if not (isinstance(self.
expr, ExprOp)
and self.expr.op ==
'segm'):
2920 if not isinstance(self.expr.args[0], ExprInt):
2922 if not isinstance(self.expr.args[1], ExprInt):
2924 l = self.parent.v_opmode()
2925 v = int(self.expr.args[0].arg)
2926 mask = ((1 << self.l) - 1)
2927 if v !=
sign_ext(v & mask, self.l, l):
2933 opmode = self.parent.v_opmode()
2937 self.
expr =
ExprOp(
'segm', v, self.parent.off.expr)
2941 d_rex_p =
bs(l=0, cls=(bs_fbit,), fname=
"rex_p")
2942 d_rex_w =
bs(l=0, cls=(bs_fbit,), fname=
"rex_w")
2943 d_rex_r =
bs(l=0, cls=(bs_fbit,), fname=
"rex_r")
2944 d_rex_x =
bs(l=0, cls=(bs_fbit,), fname=
"rex_x")
2945 d_rex_b =
bs(l=0, cls=(bs_fbit,), fname=
"rex_b")
2947 d_g1 =
bs(l=0, cls=(bs_fbit,), fname=
"g1")
2948 d_g2 =
bs(l=0, cls=(bs_fbit,), fname=
"g2")
2951 d_cl1 =
bs(l=1, cls=(bs_cl1,), fname=
"cl1")
2958 sxd =
bs(l=0, fname=
"sx")
2961 xmmreg =
bs(l=0, fname=
"xmmreg")
2962 mmreg =
bs(l=0, fname=
"mmreg")
2964 pref_f2 =
bs(l=0, fname=
"prefixed", default=
"\xf2")
2965 pref_f3 =
bs(l=0, fname=
"prefixed", default=
"\xf3")
2966 pref_66 =
bs(l=0, fname=
"prefixed", default=
"\x66")
2967 no_xmm_pref =
bs(l=0, fname=
"no_xmm_pref")
2969 sib_scale =
bs(l=2, cls=(bs_cond_scale,), fname =
"sib_scale")
2970 sib_index =
bs(l=3, cls=(bs_cond_index,), fname =
"sib_index")
2971 sib_base =
bs(l=3, cls=(bs_cond_index,), fname =
"sib_base")
2973 disp =
bs(l=0, cls=(bs_cond_disp,), fname =
"disp")
2975 s08 =
bs(l=8, cls=(bs_s08, ))
2977 u08 =
bs(l=8, cls=(x86_08, m_arg))
2978 u07 =
bs(l=7, cls=(x86_08, m_arg))
2979 u16 =
bs(l=16, cls=(x86_16, m_arg))
2980 u32 =
bs(l=32, cls=(x86_32, m_arg))
2981 s3264 =
bs(l=32, cls=(x86_s32to64, m_arg))
2983 u08_3 =
bs(l=0, cls=(x86_imm_fix, m_arg), ival = 3)
2985 d0 =
bs(
"000", fname=
'reg')
2986 d1 =
bs(
"001", fname=
'reg')
2987 d2 =
bs(
"010", fname=
'reg')
2988 d3 =
bs(
"011", fname=
'reg')
2989 d4 =
bs(
"100", fname=
'reg')
2990 d5 =
bs(
"101", fname=
'reg')
2991 d6 =
bs(
"110", fname=
'reg')
2992 d7 =
bs(
"111", fname=
'reg')
2997 stk =
bs(l=0, fname=
"stk")
3013 return self.
value != 0b11
3019 d_imm64 =
bs(l=0, fname=
"imm64")
3021 d_eax =
bs(l=0, cls=(bs_eax, ), fname=
'eax')
3022 d_edx =
bs(l=0, cls=(bs_edx, ), fname=
'edx')
3023 d_st =
bs(l=0, cls=(x86_reg_st, ), fname=
'st')
3024 d_imm =
bs(l=0, cls=(bs_cond_imm,), fname=
"imm")
3025 d_imm64 =
bs(l=0, cls=(bs_cond_imm64,), fname=
"imm")
3026 d_ax =
bs(l=0, cls=(r_ax, ), fname=
'ax')
3027 d_dx =
bs(l=0, cls=(r_dx, ), fname=
'dx')
3028 d_cl =
bs(l=0, cls=(r_cl, ), fname=
'cl')
3030 d_cs =
bs(l=0, cls=(bs_cs, ), fname=
'cs')
3031 d_ds =
bs(l=0, cls=(bs_ds, ), fname=
'ds')
3032 d_es =
bs(l=0, cls=(bs_es, ), fname=
'es')
3033 d_ss =
bs(l=0, cls=(bs_ss, ), fname=
'ss')
3034 d_fs =
bs(l=0, cls=(bs_fs, ), fname=
'fs')
3035 d_gs =
bs(l=0, cls=(bs_gs, ), fname=
'gs')
3038 rel_off =
bs(l=0, cls=(bs_rel_off,), fname=
"off", order=-1)
3040 rel_off08 =
bs(l=8, cls=(bs_rel_off08,), fname=
"off", order=-1)
3041 moff =
bs(l=0, cls=(bs_moff,), fname=
"off")
3042 msegoff =
bs(l=16, cls=(bs_msegoff,), fname=
"mseg")
3043 movoff =
bs(l=0, cls=(bs_movoff,), fname=
"off")
3044 mod =
bs(l=2, fname=
"mod")
3045 mod_mem =
bs(l=2, cls=(bs_mem,), fname=
"mod")
3047 rmreg =
bs(l=3, cls=(x86_rm_reg, ), order =1, fname =
"reg")
3048 reg =
bs(l=3, cls=(x86_reg, ), order =1, fname =
"reg")
3049 regnoarg =
bs(l=3, default_val=
"000", order=1, fname=
"reg")
3050 segm =
bs(l=3, cls=(x86_rm_segm, ), order =1, fname =
"reg")
3051 crreg =
bs(l=3, cls=(x86_rm_cr, ), order =1, fname =
"reg")
3052 drreg =
bs(l=3, cls=(x86_rm_dr, ), order =1, fname =
"reg")
3055 mm_reg =
bs(l=3, cls=(x86_rm_reg_mm, ), order =1, fname =
"reg")
3056 xmm_reg =
bs(l=3, cls=(x86_rm_reg_xmm, ), order =1, fname =
"reg")
3059 fltreg =
bs(l=3, cls=(x86_rm_flt, ), order =1, fname =
"reg")
3063 rm_arg =
bs(l=0, cls=(x86_rm_arg,), fname=
'rmarg')
3064 rm_arg_w8 =
bs(l=0, cls=(x86_rm_w8,), fname=
'rmarg')
3065 rm_arg_sx =
bs(l=0, cls=(x86_rm_sx,), fname=
'rmarg')
3066 rm_arg_sxd =
bs(l=0, cls=(x86_rm_sxd,), fname=
'rmarg')
3067 rm_arg_sd =
bs(l=0, cls=(x86_rm_sd,), fname=
'rmarg')
3068 rm_arg_wd =
bs(l=0, cls=(x86_rm_wd,), fname=
'rmarg')
3069 rm_arg_m64 =
bs(l=0, cls=(x86_rm_m64,), fname=
'rmarg')
3070 rm_arg_m80 =
bs(l=0, cls=(x86_rm_m80,), fname=
'rmarg')
3071 rm_arg_m08 =
bs(l=0, cls=(x86_rm_m08,), fname=
'rmarg')
3072 rm_arg_m16 =
bs(l=0, cls=(x86_rm_m16,), fname=
'rmarg')
3074 rm_arg_mm =
bs(l=0, cls=(x86_rm_mm,), fname=
'rmarg')
3075 rm_arg_mm_m64 =
bs(l=0, cls=(x86_rm_mm_m64,), fname=
'rmarg')
3077 rm_arg_xmm =
bs(l=0, cls=(x86_rm_xmm,), fname=
'rmarg')
3078 rm_arg_xmm_m32 =
bs(l=0, cls=(x86_rm_xmm_m32,), fname=
'rmarg')
3079 rm_arg_xmm_m64 =
bs(l=0, cls=(x86_rm_xmm_m64,), fname=
'rmarg')
3084 cond_list = [
"O",
"NO",
"B",
"AE",
3085 "Z",
"NZ",
"BE",
"A",
3086 "S",
"NS",
"PE",
"NP",
3088 "L",
"GE",
"LE",
"G"]
3092 def rmmod(r, rm_arg_x=rm_arg, modrm=mod):
3093 return [modrm, r, rm, sib_scale, sib_index, sib_base, disp, rm_arg_x]
3108 def addop(name, fields, args=None, alias=False):
3109 dct = {
"fields": fields}
3110 dct[
"alias"] = alias
3111 if args
is not None:
3113 type(name, (mn_x86,), dct)
3115 class ia32_aaa(mn_x86):
3116 fields = [bs8(0x37)]
3123 addop(
"adc", [
bs(
"0001010"), w8, d_eax, d_imm])
3124 addop(
"adc", [
bs(
"100000"), se, w8] +
rmmod(d2, rm_arg_w8) + [d_imm])
3125 addop(
"adc", [
bs(
"000100"), swapargs, w8] +
3126 rmmod(rmreg, rm_arg_w8), [rm_arg_w8, rmreg])
3128 addop(
"add", [
bs(
"0000010"), w8, d_eax, d_imm])
3129 addop(
"add", [
bs(
"100000"), se, w8] +
rmmod(d0, rm_arg_w8) + [d_imm])
3130 addop(
"add", [
bs(
"000000"), swapargs, w8] +
3131 rmmod(rmreg, rm_arg_w8), [rm_arg_w8, rmreg])
3133 addop(
"and", [
bs(
"0010010"), w8, d_eax, d_imm])
3134 addop(
"and", [
bs(
"100000"), se, w8] +
rmmod(d4, rm_arg_w8) + [d_imm])
3135 addop(
"and", [
bs(
"001000"), swapargs, w8] +
3136 rmmod(rmreg, rm_arg_w8), [rm_arg_w8, rmreg])
3140 rmreg, rm, sib_scale, sib_index, sib_base, disp, rm_arg])
3142 addop(
"bswap", [
bs8(0x0f),
bs(
'11001'), reg])
3155 addop(
"call", [
bs8(0xe8), rel_off])
3158 addop(
"call", [
bs8(0x9a), moff, msegoff])
3164 opmode = self.parent.v_opmode()
3165 return opmode == self.mode
3171 admode = self.parent.v_admode()
3172 return admode == self.mode
3178 if self.parent.mode == 64:
3180 return super(bs_op_mode_no64, self).
encode()
3183 if self.parent.mode == 64:
3185 opmode = self.parent.v_opmode()
3186 return opmode == self.mode
3191 if self.parent.mode != 64:
3193 return super(bs_op_mode64, self).
encode()
3196 if self.parent.mode != 64:
3202 if self.parent.mode == 64:
3204 return super(bs_op_modeno64, self).
encode()
3207 if self.parent.mode == 64:
3213 bs_opmode16 =
bs(l=0, cls=(bs_op_mode,), mode = 16, fname=
"fopmode")
3214 bs_opmode32 =
bs(l=0, cls=(bs_op_mode,), mode = 32, fname=
"fopmode")
3215 bs_opmode64 =
bs(l=0, cls=(bs_op_mode,), mode = 64, fname=
"fopmode")
3218 bs_admode16 =
bs(l=0, cls=(bs_ad_mode,), mode = 16, fname=
"fadmode")
3219 bs_admode32 =
bs(l=0, cls=(bs_ad_mode,), mode = 32, fname=
"fadmode")
3220 bs_admode64 =
bs(l=0, cls=(bs_ad_mode,), mode = 64, fname=
"fadmode")
3222 bs_opmode16_no64 =
bs(l=0, cls=(bs_op_mode_no64,), mode = 16, fname=
"fopmode")
3223 bs_opmode32_no64 =
bs(l=0, cls=(bs_op_mode_no64,), mode = 32, fname=
"fopmode")
3225 bs_mode64 =
bs(l=0, cls=(bs_op_mode64,))
3226 bs_modeno64 =
bs(l=0, cls=(bs_op_modeno64,))
3228 addop(
"cbw", [
bs8(0x98), bs_opmode16])
3229 addop(
"cwde", [
bs8(0x98), bs_opmode32])
3230 addop(
"cdqe", [
bs8(0x98), bs_opmode64])
3240 addop(
"cmp", [
bs(
"0011110"), w8, d_eax, d_imm])
3241 addop(
"cmp", [
bs(
"100000"), se, w8] +
rmmod(d7, rm_arg_w8) + [d_imm])
3242 addop(
"cmp", [
bs(
"001110"), swapargs, w8] +
3243 rmmod(rmreg, rm_arg_w8), [rm_arg_w8, rmreg])
3247 addop(
"cmpsw", [
bs8(0xa7), bs_opmode16])
3248 addop(
"cmpsd", [
bs8(0xa7), bs_opmode32])
3249 addop(
"cmpsq", [
bs8(0xa7), bs_opmode64])
3251 addop(
"cmpxchg", [
bs8(0x0f),
bs(
'1011000'), w8]
3252 +
rmmod(rmreg, rm_arg_w8), [rm_arg_w8, rmreg])
3255 addop(
"comiss", [
bs8(0x0f),
bs8(0x2f), no_xmm_pref] +
3256 rmmod(xmm_reg, rm_arg_xmm_m32), [xmm_reg, rm_arg_xmm_m32])
3258 rmmod(xmm_reg, rm_arg_xmm_m64), [xmm_reg, rm_arg_xmm_m64])
3262 addop(
"cwd", [
bs8(0x99), bs_opmode16])
3263 addop(
"cdq", [
bs8(0x99), bs_opmode32])
3264 addop(
"cqo", [
bs8(0x99), bs_opmode64])
3269 addop(
"dec", [
bs(
'1111111'), w8] +
rmmod(d1, rm_arg_w8))
3270 addop(
"dec", [
bs(
'01001'), reg])
3271 addop(
"div", [
bs(
'1111011'), w8] +
rmmod(d6, rm_arg_w8))
3272 addop(
"enter", [
bs8(0xc8), u16, u08])
3280 addop(
"fadd", [
bs(
"11011"), sd,
bs(
"00")] +
rmmod(d0, rm_arg_sd))
3281 addop(
"fadd", [
bs(
"11011"), swapargs,
bs(
"00"),
3282 bs(
"11000"), d_st, fltreg], [d_st, fltreg])
3283 addop(
"faddp", [
bs8(0xde),
bs(
"11000"), fltreg, d_st])
3284 addop(
"fiadd", [
bs(
"11011"), wd,
bs(
"10")] +
rmmod(d0, rm_arg_wd))
3292 addop(
"fcmovb", [
bs8(0xda),
bs(
"11000"), d_st, fltreg])
3293 addop(
"fcmove", [
bs8(0xda),
bs(
"11001"), d_st, fltreg])
3294 addop(
"fcmovbe", [
bs8(0xda),
bs(
"11010"), d_st, fltreg])
3295 addop(
"fcmovu", [
bs8(0xda),
bs(
"11011"), d_st, fltreg])
3296 addop(
"fcmovnb", [
bs8(0xdb),
bs(
"11000"), d_st, fltreg])
3297 addop(
"fcmovne", [
bs8(0xdb),
bs(
"11001"), d_st, fltreg])
3298 addop(
"fcmovnbe", [
bs8(0xdb),
bs(
"11010"), d_st, fltreg])
3299 addop(
"fcmovnu", [
bs8(0xdb),
bs(
"11011"), d_st, fltreg])
3301 addop(
"fcom", [
bs(
"11011"), sd,
bs(
"00")] +
rmmod(d2, rm_arg_sd))
3302 addop(
"fcom", [
bs(
"11011"), swapargs,
bs(
"00"),
3303 bs(
"11010"), d_st, fltreg], [d_st, fltreg])
3304 addop(
"fcomp", [
bs(
"11011"), sd,
bs(
"00")] +
rmmod(d3, rm_arg_sd))
3306 [
bs(
"11011"), swapargs,
bs(
"00"),
bs(
"11011"),
3307 d_st, fltreg], [d_st, fltreg])
3310 addop(
"fcomi", [
bs8(0xdb),
bs(
"11110"), d_st, fltreg])
3311 addop(
"fcomip", [
bs8(0xdf),
bs(
"11110"), d_st, fltreg])
3312 addop(
"fucomi", [
bs8(0xdb),
bs(
"11101"), d_st, fltreg])
3313 addop(
"fucomip", [
bs8(0xdf),
bs(
"11101"), d_st, fltreg])
3319 addop(
"fdiv", [
bs(
"11011"), sd,
bs(
"00")] +
rmmod(d6, rm_arg_sd))
3320 addop(
"fdiv", [
bs8(0xd8),
bs(
"11110"), d_st, fltreg])
3321 addop(
"fdiv", [
bs8(0xdc),
bs(
"11111"), fltreg, d_st])
3322 addop(
"fdivp", [
bs8(0xde),
bs(
"11111"), fltreg, d_st])
3323 addop(
"fidiv", [
bs(
"11011"), wd,
bs(
"10")] +
rmmod(d6, rm_arg_wd))
3325 addop(
"fdivr", [
bs(
"11011"), sd,
bs(
"00")] +
rmmod(d7, rm_arg_sd))
3326 addop(
"fdivr", [
bs8(0xd8),
bs(
"11111"), d_st, fltreg])
3327 addop(
"fdivr", [
bs8(0xdc),
bs(
"11110"), fltreg, d_st])
3328 addop(
"fdivrp", [
bs8(0xde),
bs(
"11110"), fltreg, d_st])
3329 addop(
"fidivr", [
bs(
"11011"), wd,
bs(
"10")] +
rmmod(d7, rm_arg_wd))
3331 addop(
"ffree", [
bs8(0xdd),
bs(
"11000"), fltreg])
3332 addop(
"ficom", [
bs(
"11011"), wd,
bs(
"10")] +
rmmod(d2, rm_arg_wd))
3333 addop(
"ficomp", [
bs(
"11011"), wd,
bs(
"10")] +
rmmod(d3, rm_arg_wd))
3334 addop(
"fild", [
bs(
"11011"), wd,
bs(
"11")] +
rmmod(d0, rm_arg_wd))
3342 addop(
"fist", [
bs(
"11011"), wd,
bs(
"11")] +
rmmod(d2, rm_arg_wd))
3343 addop(
"fistp", [
bs(
"11011"), wd,
bs(
"11")] +
rmmod(d3, rm_arg_wd))
3346 addop(
"fisttp", [
bs(
"11011"), wd,
bs(
"11")] +
rmmod(d1, rm_arg_wd))
3351 addop(
"fld", [
bs8(0xd9),
bs(
"11000"), fltreg])
3364 addop(
"fmul", [
bs(
"11011"), sd,
bs(
"00")] +
rmmod(d1, rm_arg_sd))
3365 addop(
"fmul", [
bs(
"11011"), swapargs,
bs(
"00"),
3366 bs(
"11001"), d_st, fltreg], [d_st, fltreg])
3367 addop(
"fmulp", [
bs8(0xde),
bs(
"11001"), fltreg, d_st])
3368 addop(
"fimul", [
bs(
"11011"), wd,
bs(
"10")] +
rmmod(d1, rm_arg_wd))
3387 addop(
"fst", [
bs8(0xdd),
bs(
"11010"), fltreg])
3388 addop(
"fstp", [
bs(
"11011"), sd,
bs(
"01")] +
rmmod(d3, rm_arg_sd))
3390 addop(
"fstp", [
bs8(0xdd),
bs(
"11011"), fltreg])
3402 addop(
"fsub", [
bs(
"11011"), sd,
bs(
"00")] +
rmmod(d4, rm_arg_sd))
3403 addop(
"fsub", [
bs8(0xd8),
bs(
"11100"), d_st, fltreg])
3404 addop(
"fsub", [
bs8(0xdc),
bs(
"11101"), fltreg, d_st])
3405 addop(
"fsubp", [
bs8(0xde),
bs(
"11101"), fltreg, d_st])
3406 addop(
"fisub", [
bs(
"11011"), wd,
bs(
"10")] +
rmmod(d4, rm_arg_wd))
3408 addop(
"fsubr", [
bs(
"11011"), sd,
bs(
"00")] +
rmmod(d5, rm_arg_sd))
3409 addop(
"fsubr", [
bs8(0xd8),
bs(
"11101"), d_st, fltreg])
3410 addop(
"fsubr", [
bs8(0xdc),
bs(
"11100"), fltreg, d_st])
3411 addop(
"fsubrp", [
bs8(0xde),
bs(
"11100"), fltreg, d_st])
3412 addop(
"fisubr", [
bs(
"11011"), wd,
bs(
"10")] +
rmmod(d5, rm_arg_wd))
3416 addop(
"fucom", [
bs8(0xdd),
bs(
"11100"), fltreg])
3417 addop(
"fucomp", [
bs8(0xdd),
bs(
"11101"), fltreg])
3421 addop(
"fxch", [
bs8(0xd9),
bs(
"11001"), fltreg])
3423 +
rmmod(d1, rm_arg_m80))
3425 +
rmmod(d0, rm_arg_m80))
3436 addop(
"idiv", [
bs(
'1111011'), w8] +
rmmod(d7, rm_arg_w8))
3438 addop(
"imul", [
bs(
'1111011'), w8] +
rmmod(d5, rm_arg_w8))
3441 addop(
"imul", [
bs(
"011010"), se,
bs(
'1')] +
rmmod(rmreg) + [d_imm])
3443 addop(
"in", [
bs(
"1110010"), w8, d_eax, u08])
3444 addop(
"in", [
bs(
"1110110"), w8, d_eax, d_edx])
3446 addop(
"inc", [
bs(
'1111111'), w8] +
rmmod(d0, rm_arg_w8))
3447 addop(
"inc", [
bs(
'01000'), reg])
3450 addop(
"insw", [
bs8(0x6d), bs_opmode16])
3451 addop(
"insd", [
bs8(0x6d), bs_opmode32])
3452 addop(
"insd", [
bs8(0x6d), bs_opmode64])
3460 addop(
"iret", [
bs8(0xcf), bs_opmode16])
3461 addop(
"iretd", [
bs8(0xcf), bs_opmode32])
3462 addop(
"iretq", [
bs8(0xcf), bs_opmode64])
3464 addop(
"j", [
bs(
'0111'), cond, rel_off08])
3466 addop(
"jcxz", [
bs8(0xe3), rel_off08, bs_admode16])
3467 addop(
"jecxz", [
bs8(0xe3), rel_off08, bs_admode32])
3468 addop(
"jrcxz", [
bs8(0xe3), rel_off08, bs_admode64])
3470 addop(
"j", [
bs8(0x0f),
bs(
'1000'), cond, rel_off])
3471 addop(
"jmp", [
bs8(0xeb), rel_off08])
3475 addop(
"jmpf", [
bs8(0xea), moff, msegoff])
3496 addop(
"lodsw", [
bs8(0xad), bs_opmode16])
3497 addop(
"lodsd", [
bs8(0xad), bs_opmode32])
3498 addop(
"lodsq", [
bs8(0xad), bs_opmode64])
3500 addop(
"loop", [
bs8(0xe2), rel_off08])
3501 addop(
"loope", [
bs8(0xe1), rel_off08])
3502 addop(
"loopne", [
bs8(0xe0), rel_off08])
3506 addop(
"mov", [
bs(
"100010"), swapargs, w8] +
3507 rmmod(rmreg, rm_arg_w8), [rm_arg_w8, rmreg])
3508 addop(
"mov", [
bs(
"100011"), swapargs,
bs(
'0')] +
rmmod(segm), [rm_arg, segm])
3509 addop(
"mov", [
bs(
"101000"), swapargs, w8, d_eax, movoff], [d_eax, movoff])
3510 addop(
"mov", [
bs(
"1011"), w8, reg, d_imm64])
3511 addop(
"mov", [
bs(
"1100011"), w8] +
rmmod(d0, rm_arg_w8) + [d_imm])
3512 addop(
"mov", [
bs8(0x0f),
bs(
"001000"), swapargs,
bs(
'0')]
3513 +
rmmod(crreg), [rm_arg, crreg])
3514 addop(
"mov", [
bs8(0x0f),
bs(
"001000"), swapargs,
bs(
'1')]
3515 +
rmmod(drreg), [rm_arg, drreg])
3517 addop(
"movsw", [
bs8(0xa5), bs_opmode16])
3518 addop(
"movsd", [
bs8(0xa5), bs_opmode32])
3519 addop(
"movsq", [
bs8(0xa5), bs_opmode64])
3521 addop(
"movsx", [
bs8(0x0f),
bs(
"1011111"), w8, sx] +
rmmod(rmreg, rm_arg_sx))
3522 addop(
"movsxd", [
bs8(0x63), sxd, bs_mode64] +
rmmod(rmreg, rm_arg_sxd))
3525 [
bs8(0x0f),
bs8(0x10), no_xmm_pref] +
rmmod(xmm_reg, rm_arg_xmm))
3526 addop(
"movsd", [
bs8(0x0f),
bs(
"0001000"), swapargs, pref_f2]
3527 +
rmmod(xmm_reg, rm_arg_xmm_m64), [xmm_reg, rm_arg_xmm_m64])
3528 addop(
"movss", [
bs8(0x0f),
bs(
"0001000"), swapargs, pref_f3] +
3529 rmmod(xmm_reg, rm_arg_xmm_m32), [xmm_reg, rm_arg_xmm_m32])
3530 addop(
"movupd", [
bs8(0x0f),
bs8(0x10), pref_66] +
rmmod(xmm_reg, rm_arg_xmm))
3533 addop(
"movd", [
bs8(0x0f),
bs(
'011'), swapargs,
bs(
'1110'), no_xmm_pref] +
3534 rmmod(mm_reg, rm_arg), [mm_reg, rm_arg])
3535 addop(
"movd", [
bs8(0x0f),
bs(
'011'), swapargs,
bs(
'1110'), pref_66, bs_opmode32] +
3536 rmmod(xmm_reg, rm_arg), [xmm_reg, rm_arg])
3537 addop(
"movq", [
bs8(0x0f),
bs(
'011'), swapargs,
bs(
'1110'), pref_66, bs_opmode64] +
3538 rmmod(xmm_reg, rm_arg), [xmm_reg, rm_arg])
3540 addop(
"movq", [
bs8(0x0f),
bs(
'011'), swapargs,
bs(
'1111'), no_xmm_pref] +
3541 rmmod(mm_reg, rm_arg_mm_m64), [mm_reg, rm_arg_mm_m64])
3544 rmmod(xmm_reg, rm_arg_xmm_m64), [xmm_reg, rm_arg_xmm_m64])
3546 rmmod(xmm_reg, rm_arg_xmm_m64), [rm_arg_xmm_m64, xmm_reg])
3550 addop(
"addss", [
bs8(0x0f),
bs8(0x58), pref_f3] +
rmmod(xmm_reg, rm_arg_xmm_m32))
3551 addop(
"addsd", [
bs8(0x0f),
bs8(0x58), pref_f2] +
rmmod(xmm_reg, rm_arg_xmm_m64))
3553 addop(
"subss", [
bs8(0x0f),
bs8(0x5c), pref_f3] +
rmmod(xmm_reg, rm_arg_xmm_m32))
3554 addop(
"subsd", [
bs8(0x0f),
bs8(0x5c), pref_f2] +
rmmod(xmm_reg, rm_arg_xmm_m64))
3556 addop(
"mulss", [
bs8(0x0f),
bs8(0x59), pref_f3] +
rmmod(xmm_reg, rm_arg_xmm_m32))
3557 addop(
"mulsd", [
bs8(0x0f),
bs8(0x59), pref_f2] +
rmmod(xmm_reg, rm_arg_xmm_m64))
3559 addop(
"divss", [
bs8(0x0f),
bs8(0x5e), pref_f3] +
rmmod(xmm_reg, rm_arg_xmm_m32))
3560 addop(
"divsd", [
bs8(0x0f),
bs8(0x5e), pref_f2] +
rmmod(xmm_reg, rm_arg_xmm_m64))
3563 addop(
"pminsw", [
bs8(0x0f),
bs8(0xea), no_xmm_pref] +
rmmod(mm_reg, rm_arg_mm))
3564 addop(
"pminsw", [
bs8(0x0f),
bs8(0xea), pref_66] +
rmmod(xmm_reg, rm_arg_xmm))
3566 addop(
"ucomiss", [
bs8(0x0f),
bs8(0x2e), no_xmm_pref] +
rmmod(xmm_reg, rm_arg_xmm_m32))
3567 addop(
"ucomisd", [
bs8(0x0f),
bs8(0x2e), pref_66] +
rmmod(xmm_reg, rm_arg_xmm_m64))
3569 addop(
"maxsd", [
bs8(0x0f),
bs8(0x5f), pref_f2] +
rmmod(xmm_reg, rm_arg_xmm_m64))
3570 addop(
"maxss", [
bs8(0x0f),
bs8(0x5f), pref_f3] +
rmmod(xmm_reg, rm_arg_xmm_m32))
3574 addop(
"movzx", [
bs8(0x0f),
bs(
"1011011"), w8, sx] +
rmmod(rmreg, rm_arg_sx))
3575 addop(
"mul", [
bs(
'1111011'), w8] +
rmmod(d4, rm_arg_w8))
3577 addop(
"neg", [
bs(
'1111011'), w8] +
rmmod(d3, rm_arg_w8))
3579 addop(
"not", [
bs(
'1111011'), w8] +
rmmod(d2, rm_arg_w8))
3580 addop(
"or", [
bs(
"0000110"), w8, d_eax, d_imm])
3581 addop(
"or", [
bs(
"100000"), se, w8] +
rmmod(d1, rm_arg_w8) + [d_imm])
3582 addop(
"or", [
bs(
"000010"), swapargs, w8] +
3583 rmmod(rmreg, rm_arg_w8), [rm_arg_w8, rmreg])
3584 addop(
"out", [
bs(
"1110011"), w8, u08, d_eax])
3585 addop(
"out", [
bs(
"1110111"), w8, d_edx, d_eax])
3588 addop(
"outsw", [
bs8(0x6f), bs_opmode16])
3589 addop(
"outsd", [
bs8(0x6f), bs_opmode32])
3590 addop(
"outsd", [
bs8(0x6f), bs_opmode64])
3596 addop(
"popw", [
bs(
"01011"), stk, reg, bs_opmode16])
3597 addop(
"popw", [
bs8(0x1f), stk, d_ds, bs_opmode16])
3598 addop(
"popw", [
bs8(0x07), stk, d_es, bs_opmode16])
3599 addop(
"popw", [
bs8(0x17), stk, d_ss, bs_opmode16])
3600 addop(
"popw", [
bs8(0x0f), stk,
bs8(0xa1), d_fs, bs_opmode16])
3601 addop(
"popw", [
bs8(0x0f), stk,
bs8(0xa9), d_gs, bs_opmode16])
3604 addop(
"pop", [
bs(
"01011"), stk, reg, bs_opmode32])
3605 addop(
"pop", [
bs8(0x1f), stk, d_ds, bs_opmode32])
3606 addop(
"pop", [
bs8(0x07), stk, d_es, bs_opmode32])
3607 addop(
"pop", [
bs8(0x17), stk, d_ss, bs_opmode32])
3608 addop(
"pop", [
bs8(0x0f), stk,
bs8(0xa1), d_fs, bs_opmode32])
3609 addop(
"pop", [
bs8(0x0f), stk,
bs8(0xa9), d_gs, bs_opmode32])
3612 addop(
"pop", [
bs(
"01011"), stk, reg, bs_opmode64])
3613 addop(
"pop", [
bs8(0x1f), stk, d_ds, bs_opmode64])
3614 addop(
"pop", [
bs8(0x07), stk, d_es, bs_opmode64])
3615 addop(
"pop", [
bs8(0x17), stk, d_ss, bs_opmode64])
3616 addop(
"pop", [
bs8(0x0f), stk,
bs8(0xa1), d_fs, bs_opmode64])
3617 addop(
"pop", [
bs8(0x0f), stk,
bs8(0xa9), d_gs, bs_opmode64])
3620 addop(
"popa", [
bs8(0x61), stk, bs_opmode16])
3621 addop(
"popad", [
bs8(0x61), stk, bs_opmode32])
3623 addop(
"popfw", [
bs8(0x9d), stk, bs_opmode16])
3624 addop(
"popfd", [
bs8(0x9d), stk, bs_opmode32])
3625 addop(
"popfq", [
bs8(0x9d), stk, bs_opmode64])
3633 addop(
"pushw", [
bs(
"01010"), stk, reg, bs_opmode16])
3634 addop(
"pushw", [
bs8(0x6a), s08, stk, bs_opmode16])
3635 addop(
"pushw", [
bs8(0x68), d_imm, stk, bs_opmode16])
3636 addop(
"pushw", [
bs8(0x0e), stk, d_cs, bs_opmode16])
3637 addop(
"pushw", [
bs8(0x16), stk, d_ss, bs_opmode16])
3638 addop(
"pushw", [
bs8(0x1e), stk, d_ds, bs_opmode16])
3639 addop(
"pushw", [
bs8(0x06), stk, d_es, bs_opmode16])
3640 addop(
"pushw", [
bs8(0x0f), stk,
bs8(0xa0), d_fs, bs_opmode16])
3641 addop(
"pushw", [
bs8(0x0f), stk,
bs8(0xa8), d_gs, bs_opmode16])
3644 addop(
"push", [
bs(
"01010"), stk, reg, bs_opmode32])
3645 addop(
"push", [
bs8(0x6a), s08, stk, bs_opmode32])
3646 addop(
"push", [
bs8(0x68), d_imm, stk, bs_opmode32])
3647 addop(
"push", [
bs8(0x0e), stk, d_cs, bs_opmode32])
3648 addop(
"push", [
bs8(0x16), stk, d_ss, bs_opmode32])
3649 addop(
"push", [
bs8(0x1e), stk, d_ds, bs_opmode32])
3650 addop(
"push", [
bs8(0x06), stk, d_es, bs_opmode32])
3651 addop(
"push", [
bs8(0x0f), stk,
bs8(0xa0), d_fs, bs_opmode32])
3652 addop(
"push", [
bs8(0x0f), stk,
bs8(0xa8), d_gs, bs_opmode32])
3655 addop(
"push", [
bs(
"01010"), stk, reg, bs_opmode64])
3656 addop(
"push", [
bs8(0x6a), s08, stk, bs_opmode64])
3657 addop(
"push", [
bs8(0x68), d_imm, stk, bs_opmode64])
3658 addop(
"push", [
bs8(0x0e), stk, d_cs, bs_opmode64])
3659 addop(
"push", [
bs8(0x16), stk, d_ss, bs_opmode64])
3660 addop(
"push", [
bs8(0x1e), stk, d_ds, bs_opmode64])
3661 addop(
"push", [
bs8(0x06), stk, d_es, bs_opmode64])
3662 addop(
"push", [
bs8(0x0f), stk,
bs8(0xa0), d_fs, bs_opmode64])
3663 addop(
"push", [
bs8(0x0f), stk,
bs8(0xa8), d_gs, bs_opmode64])
3665 addop(
"pusha", [
bs8(0x60), stk, bs_opmode16_no64])
3666 addop(
"pushad", [
bs8(0x60), stk, bs_opmode32_no64])
3669 addop(
"pushfw", [
bs8(0x9c), stk, bs_opmode16])
3670 addop(
"pushfd", [
bs8(0x9c), stk, bs_opmode32])
3671 addop(
"pushfq", [
bs8(0x9c), stk, bs_opmode64])
3673 addop(
"rcl", [
bs(
'110100'), d_cl1, w8] +
3674 rmmod(d2, rm_arg_w8), [rm_arg_w8, d_cl1])
3675 addop(
"rcl", [
bs(
'1100000'), w8] +
rmmod(d2, rm_arg_w8) + [u08])
3676 addop(
"rcr", [
bs(
'110100'), d_cl1, w8] +
3677 rmmod(d3, rm_arg_w8), [rm_arg_w8, d_cl1])
3678 addop(
"rcr", [
bs(
'1100000'), w8] +
rmmod(d3, rm_arg_w8) + [u08])
3679 addop(
"rol", [
bs(
'110100'), d_cl1, w8]
3680 +
rmmod(d0, rm_arg_w8), [rm_arg_w8, d_cl1])
3681 addop(
"rol", [
bs(
'1100000'), w8] +
rmmod(d0, rm_arg_w8) + [u08])
3682 addop(
"ror", [
bs(
'110100'), d_cl1, w8]
3683 +
rmmod(d1, rm_arg_w8), [rm_arg_w8, d_cl1])
3684 addop(
"ror", [
bs(
'1100000'), w8] +
rmmod(d1, rm_arg_w8) + [u08])
3690 addop(
"ret", [
bs8(0xc2), stk, u16])
3692 addop(
"retf", [
bs8(0xca), stk, u16])
3698 addop(
"sal", [
bs(
'110100'), d_cl1, w8] +
3699 rmmod(d6, rm_arg_w8), [rm_arg_w8, d_cl1])
3700 addop(
"sal", [
bs(
'1100000'), w8] +
rmmod(d6, rm_arg_w8) + [u08])
3701 addop(
"sar", [
bs(
'110100'), d_cl1, w8] +
3702 rmmod(d7, rm_arg_w8), [rm_arg_w8, d_cl1])
3703 addop(
"sar", [
bs(
'1100000'), w8] +
rmmod(d7, rm_arg_w8) + [u08])
3706 addop(
"scasw", [
bs8(0xaf), bs_opmode16])
3707 addop(
"scasd", [
bs8(0xaf), bs_opmode32])
3708 addop(
"scasq", [
bs8(0xaf), bs_opmode64])
3710 addop(
"shl", [
bs(
'110100'), d_cl1, w8]
3711 +
rmmod(d4, rm_arg_w8), [rm_arg_w8, d_cl1])
3712 addop(
"shl", [
bs(
'1100000'), w8] +
rmmod(d4, rm_arg_w8) + [u08])
3713 addop(
"shr", [
bs(
'110100'), d_cl1, w8]
3714 +
rmmod(d5, rm_arg_w8), [rm_arg_w8, d_cl1])
3715 addop(
"shr", [
bs(
'1100000'), w8] +
rmmod(d5, rm_arg_w8) + [u08])
3717 addop(
"sbb", [
bs(
"0001110"), w8, d_eax, d_imm])
3718 addop(
"sbb", [
bs(
"100000"), se, w8] +
rmmod(d3, rm_arg_w8) + [d_imm])
3719 addop(
"sbb", [
bs(
"000110"), swapargs, w8] +
3720 rmmod(rmreg, rm_arg_w8), [rm_arg_w8, rmreg])
3722 addop(
"set", [
bs8(0x0f),
bs(
'1001'), cond] +
rmmod(regnoarg, rm_arg_m08))
3725 rmmod(rmreg) + [u08], [rm_arg, rmreg, u08])
3727 rmmod(rmreg) + [d_cl], [rm_arg, rmreg, d_cl])
3729 rmmod(rmreg) + [u08], [rm_arg, rmreg, u08])
3731 rmmod(rmreg) + [d_cl], [rm_arg, rmreg, d_cl])
3739 addop(
"stosw", [
bs8(0xab), bs_opmode16])
3740 addop(
"stosd", [
bs8(0xab), bs_opmode32])
3741 addop(
"stosq", [
bs8(0xab), bs_opmode64])
3745 addop(
"sub", [
bs(
"0010110"), w8, d_eax, d_imm])
3746 addop(
"sub", [
bs(
"100000"), se, w8] +
rmmod(d5, rm_arg_w8) + [d_imm])
3747 addop(
"sub", [
bs(
"001010"), swapargs, w8] +
3748 rmmod(rmreg, rm_arg_w8), [rm_arg_w8, rmreg])
3754 addop(
"test", [
bs(
"1010100"), w8, d_eax, d_imm])
3755 addop(
"test", [
bs(
"1111011"), w8] +
rmmod(d0, rm_arg_w8) + [d_imm])
3756 addop(
"test", [
bs(
"1000010"), w8] +
3757 rmmod(rmreg, rm_arg_w8), [rm_arg_w8, rmreg])
3764 +
rmmod(rmreg, rm_arg_w8), [rm_arg_w8, rmreg])
3766 addop(
"nop", [
bs8(0x90)], alias=
True)
3768 addop(
"xchg", [
bs(
'10010'), d_eax, reg])
3769 addop(
"xchg", [
bs(
'1000011'), w8] +
3770 rmmod(rmreg, rm_arg_w8), [rm_arg_w8, rmreg])
3774 addop(
"xor", [
bs(
"0011010"), w8, d_eax, d_imm])
3775 addop(
"xor", [
bs(
"100000"), se, w8] +
rmmod(d6, rm_arg_w8) + [d_imm])
3776 addop(
"xor", [
bs(
"001100"), swapargs, w8] +
3777 rmmod(rmreg, rm_arg_w8), [rm_arg_w8, rmreg])
3793 addop(
"movapd", [
bs8(0x0f),
bs(
"0010100"), swapargs]
3794 +
rmmod(xmm_reg, rm_arg_xmm) + [bs_opmode16], [xmm_reg, rm_arg_xmm])
3795 addop(
"movaps", [
bs8(0x0f),
bs(
"0010100"), swapargs]
3796 +
rmmod(xmm_reg, rm_arg_xmm) + [bs_opmode32], [xmm_reg, rm_arg_xmm])
3797 addop(
"movaps", [
bs8(0x0f),
bs(
"0010100"), swapargs]
3798 +
rmmod(xmm_reg, rm_arg_xmm) + [bs_opmode64], [xmm_reg, rm_arg_xmm])
3799 addop(
"movdqu", [
bs8(0x0f),
bs(
"011"), swapargs,
bs(
"1111"), pref_f3]
3800 +
rmmod(xmm_reg, rm_arg_xmm), [xmm_reg, rm_arg_xmm])
3801 addop(
"movdqa", [
bs8(0x0f),
bs(
"011"), swapargs,
bs(
"1111"), pref_66]
3802 +
rmmod(xmm_reg, rm_arg_xmm), [xmm_reg, rm_arg_xmm])
3808 addop(
"paddb", [
bs8(0x0f),
bs8(0xfc), pref_66] +
rmmod(xmm_reg, rm_arg_xmm))
3809 addop(
"paddw", [
bs8(0x0f),
bs8(0xfd), pref_66] +
rmmod(xmm_reg, rm_arg_xmm))
3810 addop(
"paddd", [
bs8(0x0f),
bs8(0xfe), pref_66] +
rmmod(xmm_reg, rm_arg_xmm))
3811 addop(
"paddq", [
bs8(0x0f),
bs8(0xd4), pref_66] +
rmmod(xmm_reg, rm_arg_xmm))
3813 addop(
"paddb", [
bs8(0x0f),
bs8(0xfc), no_xmm_pref] +
rmmod(mm_reg, rm_arg_mm))
3814 addop(
"paddw", [
bs8(0x0f),
bs8(0xfd), no_xmm_pref] +
rmmod(mm_reg, rm_arg_mm))
3815 addop(
"paddd", [
bs8(0x0f),
bs8(0xfe), no_xmm_pref] +
rmmod(mm_reg, rm_arg_mm))
3816 addop(
"paddq", [
bs8(0x0f),
bs8(0xd4), no_xmm_pref] +
rmmod(mm_reg, rm_arg_mm))
3820 addop(
"psubb", [
bs8(0x0f),
bs8(0xf8), pref_66] +
rmmod(xmm_reg, rm_arg_xmm))
3821 addop(
"psubw", [
bs8(0x0f),
bs8(0xf9), pref_66] +
rmmod(xmm_reg, rm_arg_xmm))
3822 addop(
"psubd", [
bs8(0x0f),
bs8(0xfa), pref_66] +
rmmod(xmm_reg, rm_arg_xmm))
3823 addop(
"psubq", [
bs8(0x0f),
bs8(0xfb), pref_66] +
rmmod(xmm_reg, rm_arg_xmm))
3825 addop(
"psubb", [
bs8(0x0f),
bs8(0xf8), no_xmm_pref] +
rmmod(mm_reg, rm_arg_mm))
3826 addop(
"psubw", [
bs8(0x0f),
bs8(0xf9), no_xmm_pref] +
rmmod(mm_reg, rm_arg_mm))
3827 addop(
"psubd", [
bs8(0x0f),
bs8(0xfa), no_xmm_pref] +
rmmod(mm_reg, rm_arg_mm))
3828 addop(
"psubq", [
bs8(0x0f),
bs8(0xfb), no_xmm_pref] +
rmmod(mm_reg, rm_arg_mm))
3835 addop(
"addps", [
bs8(0x0f),
bs8(0x58), no_xmm_pref] +
rmmod(xmm_reg, rm_arg_xmm))
3836 addop(
"addpd", [
bs8(0x0f),
bs8(0x58), pref_66] +
rmmod(xmm_reg, rm_arg_xmm))
3840 addop(
"subps", [
bs8(0x0f),
bs8(0x5c), no_xmm_pref] +
rmmod(xmm_reg, rm_arg_xmm))
3841 addop(
"subpd", [
bs8(0x0f),
bs8(0x5c), pref_66] +
rmmod(xmm_reg, rm_arg_xmm))
3845 addop(
"mulps", [
bs8(0x0f),
bs8(0x59), no_xmm_pref] +
rmmod(xmm_reg, rm_arg_xmm))
3846 addop(
"mulpd", [
bs8(0x0f),
bs8(0x59), pref_66] +
rmmod(xmm_reg, rm_arg_xmm))
3850 addop(
"divps", [
bs8(0x0f),
bs8(0x5e), no_xmm_pref] +
rmmod(xmm_reg, rm_arg_xmm))
3851 addop(
"divpd", [
bs8(0x0f),
bs8(0x5e), pref_66] +
rmmod(xmm_reg, rm_arg_xmm))
3857 addop(
"xorps", [
bs8(0x0f),
bs8(0x57), no_xmm_pref] +
rmmod(xmm_reg, rm_arg_xmm))
3858 addop(
"xorpd", [
bs8(0x0f),
bs8(0x57), pref_66] +
rmmod(xmm_reg, rm_arg_xmm))
3861 addop(
"andps", [
bs8(0x0f),
bs8(0x54), no_xmm_pref] +
rmmod(xmm_reg, rm_arg_xmm))
3862 addop(
"andpd", [
bs8(0x0f),
bs8(0x54), pref_66] +
rmmod(xmm_reg, rm_arg_xmm))
3865 addop(
"orps", [
bs8(0x0f),
bs8(0x56), no_xmm_pref] +
rmmod(xmm_reg, rm_arg_xmm))
3866 addop(
"orpd", [
bs8(0x0f),
bs8(0x56), pref_66] +
rmmod(xmm_reg, rm_arg_xmm))
3870 addop(
"pand", [
bs8(0x0f),
bs8(0xdb), no_xmm_pref] +
3871 rmmod(mm_reg, rm_arg_mm), [mm_reg, rm_arg_mm])
3874 rmmod(xmm_reg, rm_arg_xmm), [xmm_reg, rm_arg_xmm])
3878 addop(
"por", [
bs8(0x0f),
bs8(0xeb), no_xmm_pref] +
3879 rmmod(mm_reg, rm_arg_mm), [mm_reg, rm_arg_mm])
3882 rmmod(xmm_reg, rm_arg_xmm), [xmm_reg, rm_arg_xmm])
3886 addop(
"pxor", [
bs8(0x0f),
bs8(0xef), no_xmm_pref] +
3887 rmmod(mm_reg, rm_arg_mm))
3890 rmmod(xmm_reg, rm_arg_xmm))
3901 +
rmmod(xmm_reg, rm_arg_xmm_m64))
3902 addop(
"cvtdq2ps", [
bs8(0x0f),
bs8(0x5b), no_xmm_pref]
3903 +
rmmod(xmm_reg, rm_arg_xmm))
3905 +
rmmod(xmm_reg, rm_arg_xmm))
3907 +
rmmod(mm_reg, rm_arg_xmm))
3909 +
rmmod(xmm_reg, rm_arg_xmm))
3911 +
rmmod(xmm_reg, rm_arg_mm_m64))
3912 addop(
"cvtpi2ps", [
bs8(0x0f),
bs8(0x2a), no_xmm_pref]
3913 +
rmmod(xmm_reg, rm_arg_mm_m64))
3915 +
rmmod(xmm_reg, rm_arg_xmm))
3916 addop(
"cvtps2pd", [
bs8(0x0f),
bs8(0x5a), no_xmm_pref]
3917 +
rmmod(xmm_reg, rm_arg_xmm_m64))
3918 addop(
"cvtps2pi", [
bs8(0x0f),
bs8(0x2d), no_xmm_pref]
3919 +
rmmod(mm_reg, rm_arg_xmm_m64))
3921 +
rmmod(reg, rm_arg_xmm_m64))
3923 +
rmmod(xmm_reg, rm_arg_xmm_m64))
3925 +
rmmod(xmm_reg, rm_arg))
3926 addop(
"cvtsi2ss", [
bs8(0x0f),
bs8(0x2a), xmmreg, pref_f3]
3927 +
rmmod(xmm_reg, rm_arg))
3929 +
rmmod(xmm_reg, rm_arg_xmm_m32))
3931 +
rmmod(rmreg, rm_arg_xmm_m32))
3933 +
rmmod(mm_reg, rm_arg_xmm))
3935 +
rmmod(xmm_reg, rm_arg_xmm))
3937 +
rmmod(xmm_reg, rm_arg_xmm))
3938 addop(
"cvttps2pi",[
bs8(0x0f),
bs8(0x2c), no_xmm_pref]
3939 +
rmmod(mm_reg, rm_arg_xmm_m64))
3941 +
rmmod(reg, rm_arg_xmm_m64))
3943 +
rmmod(reg, rm_arg_xmm_m32))
def parse_deref_regregint
def print_size
MMX/SSE/AVX operations  Categories are the same than here: https://software.intel.com/sites/landingpage/IntrinsicsGuide/.
def parse_deref_reg_intmreg_int
def parse_deref_intmregint
def filter_asm_candidates
def parse_deref_reg_intmreg