+ // masm doesn't understand IDA's float/xmm types
+ if (cmd.itype == NN_fld || cmd.itype == NN_fst
+ || cmd.itype == NN_movapd || cmd.itype == NN_movlpd)
+ {
+ for (o = 0; o < UA_MAXOP; o++) {
+ if (cmd.Operands[o].type == o_void)
+ break;
+
+ if (cmd.Operands[o].type == o_mem) {
+ tmp_ea = cmd.Operands[o].addr;
+ flags_t tmp_ea_flags = get_flags_novalue(tmp_ea);
+ if (!isUnknown(tmp_ea_flags)) {
+ buf[0] = 0;
+ get_name(ea, tmp_ea, buf, sizeof(buf));
+ msg("%x: undefining %x '%s'\n", ea, tmp_ea, buf);
+ do_unknown(tmp_ea, DOUNK_EXPAND);
+ }
+ }
+ }
+ }
+ else if (cmd.itype == NN_lea) {
+ // detect code alignment
+ if (cmd.Operands[0].reg == cmd.Operands[1].reg
+ && cmd.Operands[1].type == o_displ
+ && cmd.Operands[1].addr == 0)
+ {
+ tmp_ea = next_head(ea, inf.maxEA);
+ if ((tmp_ea & 0x03) == 0) {
+ n = calc_max_align(tmp_ea);
+ if (n > 4) // masm doesn't like more..
+ n = 4;
+ msg("%x: align %d\n", ea, 1 << n);
+ do_unknown(ea, DOUNK_SIMPLE);
+ doAlign(ea, tmp_ea - ea, n);
+ }
+ }
+ else if (!isDefArg1(ea_flags)
+ && cmd.Operands[1].type == o_mem // why o_mem?
+ && cmd.Operands[1].dtyp == dt_dword)
+ {
+ if (inf.minEA <= cmd.Operands[1].addr
+ && cmd.Operands[1].addr < inf.maxEA)
+ {
+ // lea to segments, like ds:58D6A8h[edx*8]
+ msg("%x: lea offset to %x\n", ea, cmd.Operands[1].addr);
+ op_offset(ea, 1, REF_OFF32);
+ }
+ else
+ {
+ // ds:0[eax*8] -> [eax*8+0]
+ msg("%x: dropping ds: for %x\n", ea, cmd.Operands[1].addr);
+ op_hex(ea, 1);
+ }
+ }
+ }
+