(reg) = ((reg) & ~((1UL << (_width << 3)) - 1)) | \
(((reg) + _inc) & ((1UL << (_width << 3)) - 1)); \
} while (0)
-#define register_address_increment(reg, inc) \
- _register_address_increment((reg), (inc), ad_bytes)
+#define register_address_adjust(reg, adj) \
+ _register_address_increment(reg, \
+ _regs.eflags & EFLG_DF ? -(adj) : (adj), \
+ ad_bytes)
#define sp_pre_dec(dec) ({ \
_register_address_increment(_regs.esp, -(dec), ctxt->sp_size/8); \
dst.type = OP_MEM;
nr_reps = 1;
}
- register_address_increment(
- _regs.edi,
- nr_reps * ((_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes));
+ register_address_adjust(_regs.edi, nr_reps * dst.bytes);
put_rep_prefix(nr_reps);
break;
}
goto done;
nr_reps = 1;
}
- register_address_increment(
- _regs.esi,
- nr_reps * ((_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes));
+ register_address_adjust(_regs.esi, nr_reps * dst.bytes);
put_rep_prefix(nr_reps);
break;
}
dst.type = OP_MEM;
nr_reps = 1;
}
- register_address_increment(
- _regs.esi,
- nr_reps * ((_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes));
- register_address_increment(
- _regs.edi,
- nr_reps * ((_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes));
+ register_address_adjust(_regs.esi, nr_reps * dst.bytes);
+ register_address_adjust(_regs.edi, nr_reps * dst.bytes);
put_rep_prefix(nr_reps);
break;
}
(rc = read_ulong(x86_seg_es, truncate_ea(_regs.edi),
&src.val, src.bytes, ctxt, ops)) )
goto done;
- register_address_increment(
- _regs.esi, (_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes);
- register_address_increment(
- _regs.edi, (_regs.eflags & EFLG_DF) ? -src.bytes : src.bytes);
+ register_address_adjust(_regs.esi, dst.bytes);
+ register_address_adjust(_regs.edi, src.bytes);
put_rep_prefix(1);
/* cmp: dst - src ==> src=*%%edi,dst=*%%esi ==> *%%esi - *%%edi */
emulate_2op_SrcV("cmp", src, dst, _regs.eflags);
}
else if ( rc != X86EMUL_OKAY )
goto done;
- register_address_increment(
- _regs.edi,
- nr_reps * ((_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes));
+ register_address_adjust(_regs.edi, nr_reps * dst.bytes);
put_rep_prefix(nr_reps);
break;
}
if ( (rc = read_ulong(ea.mem.seg, truncate_ea(_regs.esi),
&dst.val, dst.bytes, ctxt, ops)) != 0 )
goto done;
- register_address_increment(
- _regs.esi, (_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes);
+ register_address_adjust(_regs.esi, dst.bytes);
put_rep_prefix(1);
break;
if ( (rc = read_ulong(x86_seg_es, truncate_ea(_regs.edi),
&dst.val, src.bytes, ctxt, ops)) != 0 )
goto done;
- register_address_increment(
- _regs.edi, (_regs.eflags & EFLG_DF) ? -src.bytes : src.bytes);
+ register_address_adjust(_regs.edi, src.bytes);
put_rep_prefix(1);
/* cmp: %%eax - *%%edi ==> src=%%eax,dst=*%%edi ==> src - dst */
dst.bytes = src.bytes;