nds = dest - 1;
/* There are 2 kinds of instructions:
- 1. 5 operands: one immediate operand and 4 register
+ 1. 5 operands: one immediate operand and 4 register
operands or 3 register operands plus 1 memory operand.
It must have VexNDS and VexW0 or VexW1. The destination
must be either XMM or YMM register.
&& i.tm.opcode_modifier.vexnds
&& (operand_type_equal (&i.tm.operand_types[dest], ®xmm)
|| operand_type_equal (&i.tm.operand_types[dest], ®ymm))
- && (operand_type_equal (&i.tm.operand_types[nds], ®xmm)
- || operand_type_equal (&i.tm.operand_types[nds], ®ymm))
&& ((dest == 4
&& i.imm_operands == 1
&& i.types[0].bitfield.vex_imm4
&& i.tm.opcode_modifier.veximmext))))
abort ();
- i.vex.register_specifier = i.op[nds].regs;
-
if (i.imm_operands == 0)
{
/* When there is no immediate operand, generate an 8bit
source = 1;
reg = 0;
}
+
+ /* FMA swaps REG and NDS. */
+ if (i.tm.cpu_flags.bitfield.cpufma)
+ {
+ unsigned int tmp;
+ tmp = reg;
+ reg = nds;
+ nds = tmp;
+ }
+
assert (operand_type_equal (&i.tm.operand_types[reg], ®xmm)
|| operand_type_equal (&i.tm.operand_types[reg],
®ymm));
i.types[imm].bitfield.imm8 = 1;
}
+ /* FMA swaps REG and NDS. */
+ if (i.tm.cpu_flags.bitfield.cpufma)
+ {
+ unsigned int tmp;
+ tmp = reg;
+ reg = nds;
+ nds = tmp;
+ }
+
assert (operand_type_equal (&i.tm.operand_types[reg], ®xmm)
|| operand_type_equal (&i.tm.operand_types[reg],
®ymm));
|= ((i.op[reg].regs->reg_num
+ ((i.op[reg].regs->reg_flags & RegRex) ? 8 : 0)) << 4);
}
+
+ assert (operand_type_equal (&i.tm.operand_types[nds], ®xmm)
+ || operand_type_equal (&i.tm.operand_types[nds], ®ymm));
+ i.vex.register_specifier = i.op[nds].regs;
+
}
else
source = dest = 0;