Lines Matching refs:insn

47 			/* these are not used in stack insn */
55 /* determine what this insn does to the stack */
56 static void ia32_stack_mod(x86_insn_t *insn) {
59 if (! insn || ! insn->operands ) {
63 dest = &insn->operands->op;
65 src = &insn->operands->next->op;
68 insn->stack_mod = 0;
69 insn->stack_mod_val = 0;
71 switch ( insn->type ) {
74 insn->stack_mod = 1;
75 insn->stack_mod_val = insn->addr_size * -1;
78 insn->stack_mod = 1;
79 insn->stack_mod_val = insn->addr_size * -1;
82 insn->stack_mod = 1;
83 insn->stack_mod_val = insn->addr_size;
88 insn->stack_mod = 1;
90 insn->stack_mod_val = insn->op_size;
94 insn->stack_mod = 1;
95 insn->stack_mod_val = 0; /* TODO : FIX */
98 insn->stack_mod = 1;
99 insn->stack_mod_val = 0; /* TODO : FIX */
102 insn->stack_mod = 1;
103 insn->stack_mod_val = 0; /* TODO : FIX */
106 insn->stack_mod = 1;
107 insn->stack_mod_val = 0; /* TODO : FIX */
110 insn->stack_mod = 1;
111 insn->stack_mod_val = 0; /* TODO : FIX */
114 insn->stack_mod = 1;
115 insn->stack_mod_val = 0; /* TODO : FIX */
119 insn->stack_mod = 1;
120 insn->stack_mod_val = long_from_operand( src );
125 insn->stack_mod = 1;
126 insn->stack_mod_val = long_from_operand( src );
127 insn->stack_mod_val *= -1;
132 insn->stack_mod = 1;
133 insn->stack_mod_val = 1;
138 insn->stack_mod = 1;
139 insn->stack_mod_val = 1;
151 insn->stack_mod = 1;
157 if (! strcmp("enter", insn->mnemonic) ) {
158 insn->stack_mod = 1;
159 } else if (! strcmp("leave", insn->mnemonic) ) {
160 insn->stack_mod = 1;
168 /* get the cpu details for this insn from cpu flags int */
169 static void ia32_handle_cpu( x86_insn_t *insn, unsigned int cpu ) {
170 insn->cpu = (enum x86_insn_cpu) CPU_MODEL(cpu);
171 insn->isa = (enum x86_insn_isa) (ISA_SUBSET(cpu)) >> 16;
176 static void ia32_handle_mnemtype(x86_insn_t *insn, unsigned int mnemtype) {
178 insn->group = (enum x86_insn_group) (INS_GROUP(type)) >> 12;
179 insn->type = (enum x86_insn_type) INS_TYPE(type);
184 static void ia32_handle_notes(x86_insn_t *insn, unsigned int notes) {
185 insn->note = (enum x86_insn_note) notes;
189 static void ia32_handle_eflags( x86_insn_t *insn, unsigned int eflags) {
209 insn->flags_tested = (enum x86_flag_status) flags;
211 insn->flags_set = (enum x86_flag_status) INS_FLAGS_SET(eflags) >> 16;
216 static void ia32_handle_prefix( x86_insn_t *insn, unsigned int prefixes ) {
218 insn->prefix = (enum x86_insn_prefix) prefixes & PREFIX_MASK; // >> 20;
219 if (! (insn->prefix & PREFIX_PRINT_MASK) ) {
221 insn->prefix = insn_no_prefix;
225 if ( (unsigned int)insn->prefix & PREFIX_LOCK ) {
226 strncat(insn->prefix_string, "lock ", 32 -
227 strlen(insn->prefix_string));
230 if ( (unsigned int)insn->prefix & PREFIX_REPNZ ) {
231 strncat(insn->prefix_string, "repnz ", 32 -
232 strlen(insn->prefix_string));
233 } else if ( (unsigned int)insn->prefix & PREFIX_REPZ ) {
234 strncat(insn->prefix_string, "repz ", 32 -
235 strlen(insn->prefix_string));
242 static void reg_32_to_16( x86_op_t *op, x86_insn_t *insn, void *arg ) {
253 static void handle_insn_metadata( x86_insn_t *insn, ia32_insn_t *raw_insn ) {
254 ia32_handle_mnemtype( insn, raw_insn->mnem_flag );
255 ia32_handle_notes( insn, raw_insn->notes );
256 ia32_handle_eflags( insn, raw_insn->flags_effected );
257 ia32_handle_cpu( insn, raw_insn->cpu );
258 ia32_stack_mod( insn );
262 ia32_insn_t *raw_insn, x86_insn_t *insn,
273 insn->op_size = ( prefixes & PREFIX_OP_SIZE ) ? 4 : 2;
274 insn->addr_size = ( prefixes & PREFIX_ADDR_SIZE ) ? 4 : 2;
276 insn->op_size = ( prefixes & PREFIX_OP_SIZE ) ? 2 : 4;
277 insn->addr_size = ( prefixes & PREFIX_ADDR_SIZE ) ? 2 : 4;
283 strncpy( insn->mnemonic, raw_insn->mnemonic_att, 16 );
286 strncpy( insn->mnemonic, raw_insn->mnemonic, 16 );
288 ia32_handle_prefix( insn, prefixes );
290 handle_insn_metadata( insn, raw_insn );
306 op_size = ia32_decode_operand( buf, buf_len, insn, raw_insn->dest,
313 op_size = ia32_decode_operand( buf, buf_len, insn, raw_insn->src,
319 op_size = ia32_decode_operand( buf, buf_len, insn, raw_insn->aux,
326 ia32_insn_implicit_ops( insn, raw_insn->implicit_ops );
331 ia32_insn_implicit_ops( insn, IDX_IMPLICIT_REP );
336 if ( insn->op_size == 2 ) {
337 x86_operand_foreach( insn, reg_32_to_16, NULL, op_any );
371 * prefixes: output integer that is encoded with prefixes in insn
432 /* NOTE: if insn is a prefix and has a subtable, then we
464 * lookup returned a valid insn, then we have encountered
470 /* this is a prefix, not an SSE insn :
476 /* this is either a subtable (two-byte) insn
477 * or an invalid insn: either way, set prefix
480 // short-circuit lookup on invalid insn
496 // short-circuit lookup on invalid insn
540 ia32_insn_t *raw_insn, x86_insn_t * insn ) {
551 strncpy( insn->mnemonic, sfx_insn->mnemonic, 16 );
552 handle_insn_metadata( insn, sfx_insn );
558 * function, setting the size of the insn to 1 byte, and copying
559 * the byte at the start of the invalid insn into the x86_insn_t.
571 * insn points to a code structure to be filled by instr_decode
574 x86_insn_t *insn ) {
585 MAKE_INVALID( insn, buf );
592 MAKE_INVALID( insn, buf );
599 size += ia32_decode_insn( &buf[size], buf_len - size, raw_insn, insn,
604 raw_insn, insn );
607 MAKE_INVALID( insn, buf );
615 /* invalid insn */
616 MAKE_INVALID( insn, buf );
621 insn->size = size;