* symtab.c (skip_prologue_using_sal): Treat two consecutive lines
[deliverable/binutils-gdb.git] / opcodes / i386-dis.c
index 164b4575e1d6c1e36e6e95232e6b79fc97a516ba..6207ac4f136939da5b039b646d01a315cf700f08 100644 (file)
@@ -1,6 +1,7 @@
 /* Print i386 instructions for GDB, the GNU debugger.
    Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+   Free Software Foundation, Inc.
 
    This file is part of the GNU opcodes library.
 
@@ -92,8 +93,10 @@ static void OP_MS (int, int);
 static void OP_XS (int, int);
 static void OP_M (int, int);
 static void OP_VEX (int, int);
+static void OP_VEX_FMA (int, int);
 static void OP_EX_Vex (int, int);
 static void OP_EX_VexW (int, int);
+static void OP_EX_VexImmW (int, int);
 static void OP_XMM_Vex (int, int);
 static void OP_XMM_VexW (int, int);
 static void OP_REG_VexI4 (int, int);
@@ -119,6 +122,7 @@ static void OP_DREX4 (int, int);
 static void OP_DREX3 (int, int);
 static void OP_DREX_ICMP (int, int);
 static void OP_DREX_FCMP (int, int);
+static void MOVBE_Fixup (int, int);
 
 struct dis_private {
   /* Points to first byte not fetched.  */
@@ -252,6 +256,7 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr)
 #define Ma { OP_M, a_mode }
 #define Mb { OP_M, b_mode }
 #define Md { OP_M, d_mode }
+#define Mo { OP_M, o_mode }
 #define Mp { OP_M, f_mode }            /* 32 or 48 bit memory operand for LDS, LES etc */
 #define Mq { OP_M, q_mode }
 #define Mx { OP_M, x_mode }
@@ -371,11 +376,14 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr)
 #define Vex128 { OP_VEX, vex128_mode }
 #define Vex256 { OP_VEX, vex256_mode }
 #define VexI4 { VEXI4_Fixup, 0}
+#define VexFMA { OP_VEX_FMA, vex_mode }
+#define Vex128FMA { OP_VEX_FMA, vex128_mode }
 #define EXdVex { OP_EX_Vex, d_mode }
 #define EXqVex { OP_EX_Vex, q_mode }
 #define EXVexW { OP_EX_VexW, x_mode }
 #define EXdVexW { OP_EX_VexW, d_mode }
 #define EXqVexW { OP_EX_VexW, q_mode }
+#define EXVexImmW { OP_EX_VexImmW, x_mode }
 #define XMVex { OP_XMM_Vex, 0 }
 #define XMVexW { OP_XMM_VexW, 0 }
 #define XMVexI4 { OP_REG_VexI4, x_mode }
@@ -740,7 +748,9 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr)
 #define PREFIX_0F383F          (PREFIX_0F383E + 1)
 #define PREFIX_0F3840          (PREFIX_0F383F + 1)
 #define PREFIX_0F3841          (PREFIX_0F3840 + 1)
-#define PREFIX_0F38DB          (PREFIX_0F3841 + 1)
+#define PREFIX_0F3880          (PREFIX_0F3841 + 1)
+#define PREFIX_0F3881          (PREFIX_0F3880 + 1)
+#define PREFIX_0F38DB          (PREFIX_0F3881 + 1)
 #define PREFIX_0F38DC          (PREFIX_0F38DB + 1)
 #define PREFIX_0F38DD          (PREFIX_0F38DC + 1)
 #define PREFIX_0F38DE          (PREFIX_0F38DD + 1)
@@ -875,112 +885,118 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr)
 #define PREFIX_VEX_FC          (PREFIX_VEX_FB + 1)
 #define PREFIX_VEX_FD          (PREFIX_VEX_FC + 1)
 #define PREFIX_VEX_FE          (PREFIX_VEX_FD + 1)
-#define PREFIX_VEX_3800        (PREFIX_VEX_FE + 1)
-#define PREFIX_VEX_3801        (PREFIX_VEX_3800 + 1)
-#define PREFIX_VEX_3802        (PREFIX_VEX_3801 + 1)
-#define PREFIX_VEX_3803        (PREFIX_VEX_3802 + 1)
-#define PREFIX_VEX_3804        (PREFIX_VEX_3803 + 1)
-#define PREFIX_VEX_3805        (PREFIX_VEX_3804 + 1)
-#define PREFIX_VEX_3806        (PREFIX_VEX_3805 + 1)
-#define PREFIX_VEX_3807        (PREFIX_VEX_3806 + 1)
-#define PREFIX_VEX_3808        (PREFIX_VEX_3807 + 1)
-#define PREFIX_VEX_3809        (PREFIX_VEX_3808 + 1)
-#define PREFIX_VEX_380A        (PREFIX_VEX_3809 + 1)
-#define PREFIX_VEX_380B        (PREFIX_VEX_380A + 1)
-#define PREFIX_VEX_380C        (PREFIX_VEX_380B + 1)
-#define PREFIX_VEX_380D        (PREFIX_VEX_380C + 1)
-#define PREFIX_VEX_380E        (PREFIX_VEX_380D + 1)
-#define PREFIX_VEX_380F        (PREFIX_VEX_380E + 1)
-#define PREFIX_VEX_3817        (PREFIX_VEX_380F + 1)
-#define PREFIX_VEX_3818        (PREFIX_VEX_3817 + 1)
-#define PREFIX_VEX_3819        (PREFIX_VEX_3818 + 1)
-#define PREFIX_VEX_381A        (PREFIX_VEX_3819 + 1)
-#define PREFIX_VEX_381C        (PREFIX_VEX_381A + 1)
-#define PREFIX_VEX_381D        (PREFIX_VEX_381C + 1)
-#define PREFIX_VEX_381E        (PREFIX_VEX_381D + 1)
-#define PREFIX_VEX_3820        (PREFIX_VEX_381E + 1)
-#define PREFIX_VEX_3821        (PREFIX_VEX_3820 + 1)
-#define PREFIX_VEX_3822        (PREFIX_VEX_3821 + 1)
-#define PREFIX_VEX_3823        (PREFIX_VEX_3822 + 1)
-#define PREFIX_VEX_3824        (PREFIX_VEX_3823 + 1)
-#define PREFIX_VEX_3825        (PREFIX_VEX_3824 + 1)
-#define PREFIX_VEX_3828        (PREFIX_VEX_3825 + 1)
-#define PREFIX_VEX_3829        (PREFIX_VEX_3828 + 1)
-#define PREFIX_VEX_382A        (PREFIX_VEX_3829 + 1)
-#define PREFIX_VEX_382B        (PREFIX_VEX_382A + 1)
-#define PREFIX_VEX_382C        (PREFIX_VEX_382B + 1)
-#define PREFIX_VEX_382D        (PREFIX_VEX_382C + 1)
-#define PREFIX_VEX_382E        (PREFIX_VEX_382D + 1)
-#define PREFIX_VEX_382F        (PREFIX_VEX_382E + 1)
-#define PREFIX_VEX_3830        (PREFIX_VEX_382F + 1)
-#define PREFIX_VEX_3831        (PREFIX_VEX_3830 + 1)
-#define PREFIX_VEX_3832        (PREFIX_VEX_3831 + 1)
-#define PREFIX_VEX_3833        (PREFIX_VEX_3832 + 1)
-#define PREFIX_VEX_3834        (PREFIX_VEX_3833 + 1)
-#define PREFIX_VEX_3835        (PREFIX_VEX_3834 + 1)
-#define PREFIX_VEX_3837        (PREFIX_VEX_3835 + 1)
-#define PREFIX_VEX_3838        (PREFIX_VEX_3837 + 1)
-#define PREFIX_VEX_3839        (PREFIX_VEX_3838 + 1)
-#define PREFIX_VEX_383A        (PREFIX_VEX_3839 + 1)
-#define PREFIX_VEX_383B        (PREFIX_VEX_383A + 1)
-#define PREFIX_VEX_383C        (PREFIX_VEX_383B + 1)
-#define PREFIX_VEX_383D        (PREFIX_VEX_383C + 1)
-#define PREFIX_VEX_383E        (PREFIX_VEX_383D + 1)
-#define PREFIX_VEX_383F        (PREFIX_VEX_383E + 1)
-#define PREFIX_VEX_3840        (PREFIX_VEX_383F + 1)
-#define PREFIX_VEX_3841        (PREFIX_VEX_3840 + 1)
-#define PREFIX_VEX_3A04        (PREFIX_VEX_3841 + 1)
-#define PREFIX_VEX_3A05        (PREFIX_VEX_3A04 + 1)
-#define PREFIX_VEX_3A06        (PREFIX_VEX_3A05 + 1)
-#define PREFIX_VEX_3A08        (PREFIX_VEX_3A06 + 1)
-#define PREFIX_VEX_3A09        (PREFIX_VEX_3A08 + 1)
-#define PREFIX_VEX_3A0A        (PREFIX_VEX_3A09 + 1)
-#define PREFIX_VEX_3A0B        (PREFIX_VEX_3A0A + 1)
-#define PREFIX_VEX_3A0C        (PREFIX_VEX_3A0B + 1)
-#define PREFIX_VEX_3A0D        (PREFIX_VEX_3A0C + 1)
-#define PREFIX_VEX_3A0E        (PREFIX_VEX_3A0D + 1)
-#define PREFIX_VEX_3A0F        (PREFIX_VEX_3A0E + 1)
-#define PREFIX_VEX_3A14        (PREFIX_VEX_3A0F + 1)
-#define PREFIX_VEX_3A15        (PREFIX_VEX_3A14 + 1)
-#define PREFIX_VEX_3A16        (PREFIX_VEX_3A15 + 1)
-#define PREFIX_VEX_3A17        (PREFIX_VEX_3A16 + 1)
-#define PREFIX_VEX_3A18        (PREFIX_VEX_3A17 + 1)
-#define PREFIX_VEX_3A19        (PREFIX_VEX_3A18 + 1)
-#define PREFIX_VEX_3A20        (PREFIX_VEX_3A19 + 1)
-#define PREFIX_VEX_3A21        (PREFIX_VEX_3A20 + 1)
-#define PREFIX_VEX_3A22        (PREFIX_VEX_3A21 + 1)
-#define PREFIX_VEX_3A40        (PREFIX_VEX_3A22 + 1)
-#define PREFIX_VEX_3A41        (PREFIX_VEX_3A40 + 1)
-#define PREFIX_VEX_3A42        (PREFIX_VEX_3A41 + 1)
-#define PREFIX_VEX_3A48        (PREFIX_VEX_3A42 + 1)
-#define PREFIX_VEX_3A49        (PREFIX_VEX_3A48 + 1)
-#define PREFIX_VEX_3A4A        (PREFIX_VEX_3A49 + 1)
-#define PREFIX_VEX_3A4B        (PREFIX_VEX_3A4A + 1)
-#define PREFIX_VEX_3A4C        (PREFIX_VEX_3A4B + 1)
-#define PREFIX_VEX_3A5C        (PREFIX_VEX_3A4C + 1)
-#define PREFIX_VEX_3A5D        (PREFIX_VEX_3A5C + 1)
-#define PREFIX_VEX_3A5E        (PREFIX_VEX_3A5D + 1)
-#define PREFIX_VEX_3A5F        (PREFIX_VEX_3A5E + 1)
-#define PREFIX_VEX_3A60        (PREFIX_VEX_3A5F + 1)
-#define PREFIX_VEX_3A61        (PREFIX_VEX_3A60 + 1)
-#define PREFIX_VEX_3A62        (PREFIX_VEX_3A61 + 1)
-#define PREFIX_VEX_3A63        (PREFIX_VEX_3A62 + 1)
-#define PREFIX_VEX_3A68        (PREFIX_VEX_3A63 + 1)
-#define PREFIX_VEX_3A69        (PREFIX_VEX_3A68 + 1)
-#define PREFIX_VEX_3A6A        (PREFIX_VEX_3A69 + 1)
-#define PREFIX_VEX_3A6B        (PREFIX_VEX_3A6A + 1)
-#define PREFIX_VEX_3A6C        (PREFIX_VEX_3A6B + 1)
-#define PREFIX_VEX_3A6D        (PREFIX_VEX_3A6C + 1)
-#define PREFIX_VEX_3A6E        (PREFIX_VEX_3A6D + 1)
-#define PREFIX_VEX_3A6F        (PREFIX_VEX_3A6E + 1)
-#define PREFIX_VEX_3A78        (PREFIX_VEX_3A6F + 1)
-#define PREFIX_VEX_3A79        (PREFIX_VEX_3A78 + 1)
-#define PREFIX_VEX_3A7A        (PREFIX_VEX_3A79 + 1)
-#define PREFIX_VEX_3A7B        (PREFIX_VEX_3A7A + 1)
-#define PREFIX_VEX_3A7C        (PREFIX_VEX_3A7B + 1)
-#define PREFIX_VEX_3A7D        (PREFIX_VEX_3A7C + 1)
-#define PREFIX_VEX_3A7E        (PREFIX_VEX_3A7D + 1)
-#define PREFIX_VEX_3A7F        (PREFIX_VEX_3A7E + 1)
+#define PREFIX_VEX_3800                (PREFIX_VEX_FE + 1)
+#define PREFIX_VEX_3801                (PREFIX_VEX_3800 + 1)
+#define PREFIX_VEX_3802                (PREFIX_VEX_3801 + 1)
+#define PREFIX_VEX_3803                (PREFIX_VEX_3802 + 1)
+#define PREFIX_VEX_3804                (PREFIX_VEX_3803 + 1)
+#define PREFIX_VEX_3805                (PREFIX_VEX_3804 + 1)
+#define PREFIX_VEX_3806                (PREFIX_VEX_3805 + 1)
+#define PREFIX_VEX_3807                (PREFIX_VEX_3806 + 1)
+#define PREFIX_VEX_3808                (PREFIX_VEX_3807 + 1)
+#define PREFIX_VEX_3809                (PREFIX_VEX_3808 + 1)
+#define PREFIX_VEX_380A                (PREFIX_VEX_3809 + 1)
+#define PREFIX_VEX_380B                (PREFIX_VEX_380A + 1)
+#define PREFIX_VEX_380C                (PREFIX_VEX_380B + 1)
+#define PREFIX_VEX_380D                (PREFIX_VEX_380C + 1)
+#define PREFIX_VEX_380E                (PREFIX_VEX_380D + 1)
+#define PREFIX_VEX_380F                (PREFIX_VEX_380E + 1)
+#define PREFIX_VEX_3817                (PREFIX_VEX_380F + 1)
+#define PREFIX_VEX_3818                (PREFIX_VEX_3817 + 1)
+#define PREFIX_VEX_3819                (PREFIX_VEX_3818 + 1)
+#define PREFIX_VEX_381A                (PREFIX_VEX_3819 + 1)
+#define PREFIX_VEX_381C                (PREFIX_VEX_381A + 1)
+#define PREFIX_VEX_381D                (PREFIX_VEX_381C + 1)
+#define PREFIX_VEX_381E                (PREFIX_VEX_381D + 1)
+#define PREFIX_VEX_3820                (PREFIX_VEX_381E + 1)
+#define PREFIX_VEX_3821                (PREFIX_VEX_3820 + 1)
+#define PREFIX_VEX_3822                (PREFIX_VEX_3821 + 1)
+#define PREFIX_VEX_3823                (PREFIX_VEX_3822 + 1)
+#define PREFIX_VEX_3824                (PREFIX_VEX_3823 + 1)
+#define PREFIX_VEX_3825                (PREFIX_VEX_3824 + 1)
+#define PREFIX_VEX_3828                (PREFIX_VEX_3825 + 1)
+#define PREFIX_VEX_3829                (PREFIX_VEX_3828 + 1)
+#define PREFIX_VEX_382A                (PREFIX_VEX_3829 + 1)
+#define PREFIX_VEX_382B                (PREFIX_VEX_382A + 1)
+#define PREFIX_VEX_382C                (PREFIX_VEX_382B + 1)
+#define PREFIX_VEX_382D                (PREFIX_VEX_382C + 1)
+#define PREFIX_VEX_382E                (PREFIX_VEX_382D + 1)
+#define PREFIX_VEX_382F                (PREFIX_VEX_382E + 1)
+#define PREFIX_VEX_3830                (PREFIX_VEX_382F + 1)
+#define PREFIX_VEX_3831                (PREFIX_VEX_3830 + 1)
+#define PREFIX_VEX_3832                (PREFIX_VEX_3831 + 1)
+#define PREFIX_VEX_3833                (PREFIX_VEX_3832 + 1)
+#define PREFIX_VEX_3834                (PREFIX_VEX_3833 + 1)
+#define PREFIX_VEX_3835                (PREFIX_VEX_3834 + 1)
+#define PREFIX_VEX_3837                (PREFIX_VEX_3835 + 1)
+#define PREFIX_VEX_3838                (PREFIX_VEX_3837 + 1)
+#define PREFIX_VEX_3839                (PREFIX_VEX_3838 + 1)
+#define PREFIX_VEX_383A                (PREFIX_VEX_3839 + 1)
+#define PREFIX_VEX_383B                (PREFIX_VEX_383A + 1)
+#define PREFIX_VEX_383C                (PREFIX_VEX_383B + 1)
+#define PREFIX_VEX_383D                (PREFIX_VEX_383C + 1)
+#define PREFIX_VEX_383E                (PREFIX_VEX_383D + 1)
+#define PREFIX_VEX_383F                (PREFIX_VEX_383E + 1)
+#define PREFIX_VEX_3840                (PREFIX_VEX_383F + 1)
+#define PREFIX_VEX_3841                (PREFIX_VEX_3840 + 1)
+#define PREFIX_VEX_38DB                (PREFIX_VEX_3841 + 1)
+#define PREFIX_VEX_38DC                (PREFIX_VEX_38DB + 1)
+#define PREFIX_VEX_38DD                (PREFIX_VEX_38DC + 1)
+#define PREFIX_VEX_38DE                (PREFIX_VEX_38DD + 1)
+#define PREFIX_VEX_38DF                (PREFIX_VEX_38DE + 1)
+#define PREFIX_VEX_3A04                (PREFIX_VEX_38DF + 1)
+#define PREFIX_VEX_3A05                (PREFIX_VEX_3A04 + 1)
+#define PREFIX_VEX_3A06                (PREFIX_VEX_3A05 + 1)
+#define PREFIX_VEX_3A08                (PREFIX_VEX_3A06 + 1)
+#define PREFIX_VEX_3A09                (PREFIX_VEX_3A08 + 1)
+#define PREFIX_VEX_3A0A                (PREFIX_VEX_3A09 + 1)
+#define PREFIX_VEX_3A0B                (PREFIX_VEX_3A0A + 1)
+#define PREFIX_VEX_3A0C                (PREFIX_VEX_3A0B + 1)
+#define PREFIX_VEX_3A0D                (PREFIX_VEX_3A0C + 1)
+#define PREFIX_VEX_3A0E                (PREFIX_VEX_3A0D + 1)
+#define PREFIX_VEX_3A0F                (PREFIX_VEX_3A0E + 1)
+#define PREFIX_VEX_3A14                (PREFIX_VEX_3A0F + 1)
+#define PREFIX_VEX_3A15                (PREFIX_VEX_3A14 + 1)
+#define PREFIX_VEX_3A16                (PREFIX_VEX_3A15 + 1)
+#define PREFIX_VEX_3A17                (PREFIX_VEX_3A16 + 1)
+#define PREFIX_VEX_3A18                (PREFIX_VEX_3A17 + 1)
+#define PREFIX_VEX_3A19                (PREFIX_VEX_3A18 + 1)
+#define PREFIX_VEX_3A20                (PREFIX_VEX_3A19 + 1)
+#define PREFIX_VEX_3A21                (PREFIX_VEX_3A20 + 1)
+#define PREFIX_VEX_3A22                (PREFIX_VEX_3A21 + 1)
+#define PREFIX_VEX_3A40                (PREFIX_VEX_3A22 + 1)
+#define PREFIX_VEX_3A41                (PREFIX_VEX_3A40 + 1)
+#define PREFIX_VEX_3A42                (PREFIX_VEX_3A41 + 1)
+#define PREFIX_VEX_3A48                (PREFIX_VEX_3A42 + 1)
+#define PREFIX_VEX_3A49                (PREFIX_VEX_3A48 + 1)
+#define PREFIX_VEX_3A4A                (PREFIX_VEX_3A49 + 1)
+#define PREFIX_VEX_3A4B                (PREFIX_VEX_3A4A + 1)
+#define PREFIX_VEX_3A4C                (PREFIX_VEX_3A4B + 1)
+#define PREFIX_VEX_3A5C                (PREFIX_VEX_3A4C + 1)
+#define PREFIX_VEX_3A5D                (PREFIX_VEX_3A5C + 1)
+#define PREFIX_VEX_3A5E                (PREFIX_VEX_3A5D + 1)
+#define PREFIX_VEX_3A5F                (PREFIX_VEX_3A5E + 1)
+#define PREFIX_VEX_3A60                (PREFIX_VEX_3A5F + 1)
+#define PREFIX_VEX_3A61                (PREFIX_VEX_3A60 + 1)
+#define PREFIX_VEX_3A62                (PREFIX_VEX_3A61 + 1)
+#define PREFIX_VEX_3A63                (PREFIX_VEX_3A62 + 1)
+#define PREFIX_VEX_3A68                (PREFIX_VEX_3A63 + 1)
+#define PREFIX_VEX_3A69                (PREFIX_VEX_3A68 + 1)
+#define PREFIX_VEX_3A6A                (PREFIX_VEX_3A69 + 1)
+#define PREFIX_VEX_3A6B                (PREFIX_VEX_3A6A + 1)
+#define PREFIX_VEX_3A6C                (PREFIX_VEX_3A6B + 1)
+#define PREFIX_VEX_3A6D                (PREFIX_VEX_3A6C + 1)
+#define PREFIX_VEX_3A6E                (PREFIX_VEX_3A6D + 1)
+#define PREFIX_VEX_3A6F                (PREFIX_VEX_3A6E + 1)
+#define PREFIX_VEX_3A78                (PREFIX_VEX_3A6F + 1)
+#define PREFIX_VEX_3A79                (PREFIX_VEX_3A78 + 1)
+#define PREFIX_VEX_3A7A                (PREFIX_VEX_3A79 + 1)
+#define PREFIX_VEX_3A7B                (PREFIX_VEX_3A7A + 1)
+#define PREFIX_VEX_3A7C                (PREFIX_VEX_3A7B + 1)
+#define PREFIX_VEX_3A7D                (PREFIX_VEX_3A7C + 1)
+#define PREFIX_VEX_3A7E                (PREFIX_VEX_3A7D + 1)
+#define PREFIX_VEX_3A7F                (PREFIX_VEX_3A7E + 1)
+#define PREFIX_VEX_3ADF                (PREFIX_VEX_3A7F + 1)
 
 #define X86_64_06              0
 #define X86_64_07              (X86_64_06 + 1)
@@ -1190,7 +1206,12 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr)
 #define VEX_LEN_383F_P_2       (VEX_LEN_383E_P_2 + 1)
 #define VEX_LEN_3840_P_2       (VEX_LEN_383F_P_2 + 1)
 #define VEX_LEN_3841_P_2       (VEX_LEN_3840_P_2 + 1)
-#define VEX_LEN_3A06_P_2       (VEX_LEN_3841_P_2 + 1)
+#define VEX_LEN_38DB_P_2       (VEX_LEN_3841_P_2 + 1)
+#define VEX_LEN_38DC_P_2       (VEX_LEN_38DB_P_2 + 1)
+#define VEX_LEN_38DD_P_2       (VEX_LEN_38DC_P_2 + 1)
+#define VEX_LEN_38DE_P_2       (VEX_LEN_38DD_P_2 + 1)
+#define VEX_LEN_38DF_P_2       (VEX_LEN_38DE_P_2 + 1)
+#define VEX_LEN_3A06_P_2       (VEX_LEN_38DF_P_2 + 1)
 #define VEX_LEN_3A0A_P_2       (VEX_LEN_3A06_P_2 + 1)
 #define VEX_LEN_3A0B_P_2       (VEX_LEN_3A0A_P_2 + 1)
 #define VEX_LEN_3A0E_P_2       (VEX_LEN_3A0B_P_2 + 1)
@@ -1219,6 +1240,7 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr)
 #define VEX_LEN_3A7B_P_2       (VEX_LEN_3A7A_P_2 + 1)
 #define VEX_LEN_3A7E_P_2       (VEX_LEN_3A7B_P_2 + 1)
 #define VEX_LEN_3A7F_P_2       (VEX_LEN_3A7E_P_2 + 1)
+#define VEX_LEN_3ADF_P_2       (VEX_LEN_3A7F_P_2 + 1)
 
 typedef void (*op_rtn) (int bytemode, int sizeflag);
 
@@ -1508,8 +1530,8 @@ static const struct dis386 dis386[] = {
   /* c8 */
   { "enterT",          { Iw, Ib } },
   { "leaveT",          { XX } },
-  { "lretP",           { Iw } },
-  { "lretP",           { XX } },
+  { "Jret{|f}P",       { Iw } },
+  { "Jret{|f}P",       { XX } },
   { "int3",            { XX } },
   { "int",             { Ib } },
   { X86_64_TABLE (X86_64_CE) },
@@ -1644,23 +1666,23 @@ static const struct dis386 dis386_twobyte[] = {
   { "(bad)",           { XX } },
   { "(bad)",           { XX } },
   /* 40 */
-  { "cmovo",           { Gv, Ev } },
-  { "cmovno",          { Gv, Ev } },
-  { "cmovb",           { Gv, Ev } },
-  { "cmovae",          { Gv, Ev } },
-  { "cmove",           { Gv, Ev } },
-  { "cmovne",          { Gv, Ev } },
-  { "cmovbe",          { Gv, Ev } },
-  { "cmova",           { Gv, Ev } },
+  { "cmovoS",          { Gv, Ev } },
+  { "cmovnoS",         { Gv, Ev } },
+  { "cmovbS",          { Gv, Ev } },
+  { "cmovaeS",         { Gv, Ev } },
+  { "cmoveS",          { Gv, Ev } },
+  { "cmovneS",         { Gv, Ev } },
+  { "cmovbeS",         { Gv, Ev } },
+  { "cmovaS",          { Gv, Ev } },
   /* 48 */
-  { "cmovs",           { Gv, Ev } },
-  { "cmovns",          { Gv, Ev } },
-  { "cmovp",           { Gv, Ev } },
-  { "cmovnp",          { Gv, Ev } },
-  { "cmovl",           { Gv, Ev } },
-  { "cmovge",          { Gv, Ev } },
-  { "cmovle",          { Gv, Ev } },
-  { "cmovg",           { Gv, Ev } },
+  { "cmovsS",          { Gv, Ev } },
+  { "cmovnsS",         { Gv, Ev } },
+  { "cmovpS",          { Gv, Ev } },
+  { "cmovnpS",         { Gv, Ev } },
+  { "cmovlS",          { Gv, Ev } },
+  { "cmovgeS",         { Gv, Ev } },
+  { "cmovleS",         { Gv, Ev } },
+  { "cmovgS",          { Gv, Ev } },
   /* 50 */
   { MOD_TABLE (MOD_0F51) },
   { PREFIX_TABLE (PREFIX_0F51) },
@@ -1937,7 +1959,7 @@ static struct
 vex;
 static unsigned char need_vex;
 static unsigned char need_vex_reg;
-static unsigned char vex_i4_done;
+static unsigned char vex_w_done;
 
 /* If we are accessing mod/rm/reg without need_modrm set, then the
    values are stale.  Hitting this abort likely indicates that you
@@ -2998,6 +3020,22 @@ static const struct dis386 prefix_table[][4] = {
     { "(bad)", { XX } },
   },
 
+  /* PREFIX_0F3880 */
+  {
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
+    { "invept",        { Gm, Mo } },
+    { "(bad)", { XX } },
+  },
+
+  /* PREFIX_0F3881 */
+  {
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
+    { "invvpid", { Gm, Mo } },
+    { "(bad)", { XX } },
+  },
+
   /* PREFIX_0F38DB */
   {
     { "(bad)", { XX } },
@@ -3040,17 +3078,17 @@ static const struct dis386 prefix_table[][4] = {
 
   /* PREFIX_0F38F0 */
   {
+    { "movbeS",        { Gv, { MOVBE_Fixup, v_mode } } },
     { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "movbeS",        { Gv, { MOVBE_Fixup, v_mode } } },
     { "crc32", { Gdq, { CRC32_Fixup, b_mode } } },     
   },
 
   /* PREFIX_0F38F1 */
   {
+    { "movbeS",        { { MOVBE_Fixup, v_mode }, Gv } },
     { "(bad)", { XX } },
-    { "(bad)", { XX } },
-    { "(bad)", { XX } },
+    { "movbeS",        { { MOVBE_Fixup, v_mode }, Gv } },
     { "crc32", { Gdq, { CRC32_Fixup, v_mode } } },     
   },
 
@@ -4510,6 +4548,46 @@ static const struct dis386 prefix_table[][4] = {
     { "(bad)", { XX } },
   },
 
+  /* PREFIX_VEX_38DB */
+  {
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
+    { VEX_LEN_TABLE (VEX_LEN_38DB_P_2) },
+    { "(bad)", { XX } },
+  },
+
+  /* PREFIX_VEX_38DC */
+  {
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
+    { VEX_LEN_TABLE (VEX_LEN_38DC_P_2) },
+    { "(bad)", { XX } },
+  },
+
+  /* PREFIX_VEX_38DD */
+  {
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
+    { VEX_LEN_TABLE (VEX_LEN_38DD_P_2) },
+    { "(bad)", { XX } },
+  },
+
+  /* PREFIX_VEX_38DE */
+  {
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
+    { VEX_LEN_TABLE (VEX_LEN_38DE_P_2) },
+    { "(bad)", { XX } },
+  },
+
+  /* PREFIX_VEX_38DF */
+  {
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
+    { VEX_LEN_TABLE (VEX_LEN_38DF_P_2) },
+    { "(bad)", { XX } },
+  },
+
   /* PREFIX_VEX_3A04 */
   {
     { "(bad)", { XX } },
@@ -4698,7 +4776,7 @@ static const struct dis386 prefix_table[][4] = {
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { "vpermil2ps", { XMVexW, Vex, EXVexW, EXVexW, VPERMIL2 } },
+    { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, VPERMIL2 } },
     { "(bad)", { XX } },
   },
 
@@ -4706,7 +4784,7 @@ static const struct dis386 prefix_table[][4] = {
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { "vpermil2pd", { XMVexW, Vex, EXVexW, EXVexW, VPERMIL2 } },
+    { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, VPERMIL2 } },
     { "(bad)", { XX } },
   },
 
@@ -4738,7 +4816,7 @@ static const struct dis386 prefix_table[][4] = {
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
+    { "vfmaddsubps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
     { "(bad)", { XX } },
   },
 
@@ -4746,7 +4824,7 @@ static const struct dis386 prefix_table[][4] = {
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
+    { "vfmaddsubpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
     { "(bad)", { XX } },
   },
 
@@ -4754,7 +4832,7 @@ static const struct dis386 prefix_table[][4] = {
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
+    { "vfmsubaddps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
     { "(bad)", { XX } },
   },
 
@@ -4762,7 +4840,7 @@ static const struct dis386 prefix_table[][4] = {
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
+    { "vfmsubaddpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
     { "(bad)", { XX } },
   },
 
@@ -4802,7 +4880,7 @@ static const struct dis386 prefix_table[][4] = {
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
+    { "vfmaddps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
     { "(bad)", { XX } },
   },
 
@@ -4810,7 +4888,7 @@ static const struct dis386 prefix_table[][4] = {
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
+    { "vfmaddpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
     { "(bad)", { XX } },
   },
 
@@ -4834,7 +4912,7 @@ static const struct dis386 prefix_table[][4] = {
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
+    { "vfmsubps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
     { "(bad)", { XX } },
   },
 
@@ -4842,7 +4920,7 @@ static const struct dis386 prefix_table[][4] = {
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
+    { "vfmsubpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
     { "(bad)", { XX } },
   },
 
@@ -4866,7 +4944,7 @@ static const struct dis386 prefix_table[][4] = {
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
+    { "vfnmaddps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
     { "(bad)", { XX } },
   },
 
@@ -4874,7 +4952,7 @@ static const struct dis386 prefix_table[][4] = {
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
+    { "vfnmaddpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
     { "(bad)", { XX } },
   },
 
@@ -4898,7 +4976,7 @@ static const struct dis386 prefix_table[][4] = {
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
+    { "vfnmsubps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
     { "(bad)", { XX } },
   },
 
@@ -4906,7 +4984,7 @@ static const struct dis386 prefix_table[][4] = {
   {
     { "(bad)", { XX } },
     { "(bad)", { XX } },
-    { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
+    { "vfnmsubpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
     { "(bad)", { XX } },
   },
 
@@ -4925,6 +5003,14 @@ static const struct dis386 prefix_table[][4] = {
     { VEX_LEN_TABLE (VEX_LEN_3A7F_P_2) },
     { "(bad)", { XX } },
   },
+
+  /* PREFIX_VEX_3ADF */
+  {
+    { "(bad)", { XX } },
+    { "(bad)", { XX } },
+    { VEX_LEN_TABLE (VEX_LEN_3ADF_P_2) },
+    { "(bad)", { XX } },
+  },
 };
 
 static const struct dis386 x86_64_table[][2] = {
@@ -5827,8 +5913,8 @@ static const struct dis386 three_byte_table[][256] = {
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
     /* 80 */
-    { "(bad)",         { XX } },
-    { "(bad)",         { XX } },
+    { PREFIX_TABLE (PREFIX_0F3880) },
+    { PREFIX_TABLE (PREFIX_0F3881) },
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
@@ -7387,11 +7473,11 @@ static const struct dis386 vex_table[][256] = {
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
-    { "(bad)",         { XX } },
-    { "(bad)",         { XX } },
-    { "(bad)",         { XX } },
-    { "(bad)",         { XX } },
-    { "(bad)",         { XX } },
+    { PREFIX_TABLE (PREFIX_VEX_38DB) },
+    { PREFIX_TABLE (PREFIX_VEX_38DC) },
+    { PREFIX_TABLE (PREFIX_VEX_38DD) },
+    { PREFIX_TABLE (PREFIX_VEX_38DE) },
+    { PREFIX_TABLE (PREFIX_VEX_38DF) },
     /* e0 */
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
@@ -7682,7 +7768,7 @@ static const struct dis386 vex_table[][256] = {
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
-    { "(bad)",         { XX } },
+    { PREFIX_TABLE (PREFIX_VEX_3ADF) },
     /* e0 */
     { "(bad)",         { XX } },
     { "(bad)",         { XX } },
@@ -8731,6 +8817,36 @@ static const struct dis386 vex_len_table[][2] = {
     { "(bad)",         { XX } },
   },
 
+  /* VEX_LEN_38DB_P_2 */
+  {
+    { "vaesimc",       { XM, EXx } },
+    { "(bad)",         { XX } },
+  },
+
+  /* VEX_LEN_38DC_P_2 */
+  {
+    { "vaesenc",       { XM, Vex128, EXx } },
+    { "(bad)",         { XX } },
+  },
+
+  /* VEX_LEN_38DD_P_2 */
+  {
+    { "vaesenclast",   { XM, Vex128, EXx } },
+    { "(bad)",         { XX } },
+  },
+
+  /* VEX_LEN_38DE_P_2 */
+  {
+    { "vaesdec",       { XM, Vex128, EXx } },
+    { "(bad)",         { XX } },
+  },
+
+  /* VEX_LEN_38DF_P_2 */
+  {
+    { "vaesdeclast",   { XM, Vex128, EXx } },
+    { "(bad)",         { XX } },
+  },
+
   /* VEX_LEN_3A06_P_2 */
   {
     { "(bad)",         { XX } },
@@ -8859,49 +8975,55 @@ static const struct dis386 vex_len_table[][2] = {
 
   /* VEX_LEN_3A6A_P_2 */
   {
-    { "vfmaddss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
+    { "vfmaddss",      { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
     { "(bad)",         { XX } },
   },
 
   /* VEX_LEN_3A6B_P_2 */
   {
-    { "vfmaddsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
+    { "vfmaddsd",      { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
     { "(bad)",         { XX } },
   },
 
   /* VEX_LEN_3A6E_P_2 */
   {
-    { "vfmsubss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
+    { "vfmsubss",      { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
     { "(bad)",         { XX } },
   },
 
   /* VEX_LEN_3A6F_P_2 */
   {
-    { "vfmsubsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
+    { "vfmsubsd",      { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
     { "(bad)",         { XX } },
   },
 
   /* VEX_LEN_3A7A_P_2 */
   {
-    { "vfnmaddss",     { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
+    { "vfnmaddss",     { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
     { "(bad)",         { XX } },
   },
 
   /* VEX_LEN_3A7B_P_2 */
   {
-    { "vfnmaddsd",     { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
+    { "vfnmaddsd",     { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
     { "(bad)",         { XX } },
   },
 
   /* VEX_LEN_3A7E_P_2 */
   {
-    { "vfnmsubss",     { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
+    { "vfnmsubss",     { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
     { "(bad)",         { XX } },
   },
 
   /* VEX_LEN_3A7F_P_2 */
   {
-    { "vfnmsubsd",     { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
+    { "vfnmsubsd",     { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
+    { "(bad)",         { XX } },
+  },
+
+  /* VEX_LEN_3ADF_P_2 */
+  {
+    { "vaeskeygenassist", { XM, EXx, Ib } },
     { "(bad)",         { XX } },
   },
 };
@@ -10184,7 +10306,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
     {
       need_vex = 0;
       need_vex_reg = 0;
-      vex_i4_done = 0;
+      vex_w_done = 0;
       dp = get_valid_dis386 (dp, info);
       if (dp != NULL && putop (dp->name, sizeflag) == 0)
         {
@@ -11209,7 +11331,7 @@ print_displacement (char *buf, bfd_vma disp)
   buf[j++] = '0';
   buf[j++] = 'x';
 
-  sprintf_vma (tmp, val);
+  sprintf_vma (tmp, (bfd_vma) val);
   for (i = 0; tmp[i] == '0'; i++)
     continue;
   if (tmp[i] == '\0')
@@ -13276,88 +13398,79 @@ OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
   oappend (scratchbuf + intel_syntax);
 }
 
-static void
-OP_EX_VexW (int bytemode, int sizeflag)
-{
-  int reg = -1;
-  static unsigned char vex_i4;
+/* Get the VEX immediate byte without moving codep.  */
 
-  if (!vex_i4_done)
-    {
-      int bytes_before_imm = 0;
+static unsigned char
+get_vex_imm8 (int sizeflag)
+{
+  int bytes_before_imm = 0;
 
-      /* Skip mod/rm byte once. We will be called twice. */
-      MODRM_CHECK;
-      codep++;
+  /* Skip mod/rm byte.   */
+  MODRM_CHECK;
+  codep++;
 
-      if (modrm.mod != 3)
+  if (modrm.mod != 3)
+    {
+      /* There are SIB/displacement bytes.  */
+      if ((sizeflag & AFLAG) || address_mode == mode_64bit)
        {
-         /* There are SIB/displacement bytes.  */
-         if ((sizeflag & AFLAG) || address_mode == mode_64bit)
-           {
-             /* 32/64 bit address mode */
-             int base = modrm.rm;
+         /* 32/64 bit address mode */
+         int base = modrm.rm;
 
-             /* Check SIB byte.  */
-             if (base == 4)
-               {
-                 FETCH_DATA (the_info, codep + 1);
-                 base = *codep & 7;
-                 bytes_before_imm++;
-               }
+         /* Check SIB byte.  */
+         if (base == 4)
+           {
+             FETCH_DATA (the_info, codep + 1);
+             base = *codep & 7;
+             bytes_before_imm++;
+           }
 
-             switch (modrm.mod)
-               {
-               case 0:
-                 /* When modrm.rm == 5 or modrm.rm == 4 and base in
-                    SIB == 5, there is a 4 byte displacement.  */
-                 if (base != 5)
-                   /* No displacement. */
-                   break;
-               case 2:
-                 /* 4 byte displacement.  */
-                 bytes_before_imm += 4;
-                 break;
-               case 1:
-                 /* 1 byte displacement.  */
-                 bytes_before_imm++;
-                 break;
-               }
+         switch (modrm.mod)
+           {
+           case 0:
+             /* When modrm.rm == 5 or modrm.rm == 4 and base in
+                SIB == 5, there is a 4 byte displacement.  */
+             if (base != 5)
+               /* No displacement. */
+               break;
+           case 2:
+             /* 4 byte displacement.  */
+             bytes_before_imm += 4;
+             break;
+           case 1:
+             /* 1 byte displacement.  */
+             bytes_before_imm++;
+             break;
            }
-         else
-           { /* 16 bit address mode */
-             switch (modrm.mod)
-               {
-               case 0:
-                 /* When modrm.rm == 6, there is a 2 byte
-                    displacement.  */
-                 if (modrm.rm != 6)
-                   /* No displacement. */
-                   break;
-               case 2:
-                 /* 2 byte displacement.  */
-                 bytes_before_imm += 2;
-                 break;
-               case 1:
-                 /* 1 byte displacement.  */
-                 bytes_before_imm++;
-                 break;
-               }
+       }
+      else
+       { /* 16 bit address mode */
+         switch (modrm.mod)
+           {
+           case 0:
+             /* When modrm.rm == 6, there is a 2 byte displacement.  */
+             if (modrm.rm != 6)
+               /* No displacement. */
+               break;
+           case 2:
+             /* 2 byte displacement.  */
+             bytes_before_imm += 2;
+             break;
+           case 1:
+             /* 1 byte displacement.  */
+             bytes_before_imm++;
+             break;
            }
        }
-
-      FETCH_DATA (the_info, codep + bytes_before_imm + 1);
-      vex_i4 = codep [bytes_before_imm];
-      vex_i4_done = 1;
-      if (vex.w)
-       reg = vex_i4 >> 4;
-    }
-  else
-    {
-      if (!vex.w)
-       reg = vex_i4 >> 4;
     }
 
+  FETCH_DATA (the_info, codep + bytes_before_imm + 1);
+  return codep [bytes_before_imm];
+}
+
+static void
+OP_EX_VexReg (int bytemode, int sizeflag, int reg)
+{
   if (reg == -1 && modrm.mod != 3)
     {
       OP_E_memory (bytemode, sizeflag, 0);
@@ -13390,6 +13503,89 @@ OP_EX_VexW (int bytemode, int sizeflag)
   oappend (scratchbuf + intel_syntax);
 }
 
+static void
+OP_EX_VexImmW (int bytemode, int sizeflag)
+{
+  int reg = -1;
+  static unsigned char vex_imm8;
+
+  if (!vex_w_done)
+    {
+      vex_imm8 = get_vex_imm8 (sizeflag);
+      if (vex.w)
+       reg = vex_imm8 >> 4;
+      vex_w_done = 1;
+    }
+  else
+    {
+      if (!vex.w)
+       reg = vex_imm8 >> 4;
+    }
+
+  OP_EX_VexReg (bytemode, sizeflag, reg);
+}
+
+static void
+OP_EX_VexW (int bytemode, int sizeflag)
+{
+  int reg = -1;
+
+  if (!vex_w_done)
+    {
+      vex_w_done = 1;
+      if (vex.w)
+       reg = vex.register_specifier;
+    }
+  else
+    {
+      if (!vex.w)
+       reg = vex.register_specifier;
+    }
+
+  OP_EX_VexReg (bytemode, sizeflag, reg);
+}
+
+static void
+OP_VEX_FMA (int bytemode, int sizeflag)
+{
+  int reg = get_vex_imm8 (sizeflag) >> 4;
+
+  if (reg > 7 && address_mode != mode_64bit)
+    BadOp ();
+
+  switch (vex.length)
+    {
+    case 128:
+      switch (bytemode)
+       {
+       case vex_mode:
+       case vex128_mode:
+         break;
+       default:
+         abort ();
+         return;
+       }
+
+      sprintf (scratchbuf, "%%xmm%d", reg);
+      break;
+    case 256:
+      switch (bytemode)
+       {
+       case vex_mode:
+         break;
+       default:
+         abort ();
+         return;
+       }
+
+      sprintf (scratchbuf, "%%ymm%d", reg);
+      break;
+    default:
+      abort ();
+    }
+  oappend (scratchbuf + intel_syntax);
+}
+
 static void
 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
             int sizeflag ATTRIBUTE_UNUSED)
@@ -13414,6 +13610,9 @@ OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
       BadOp ();
 
   reg >>= 4;
+  if (reg > 7 && address_mode != mode_64bit)
+    BadOp ();
+
   switch (vex.length)
     {
     case 128:
@@ -13618,3 +13817,36 @@ VPERMIL2_Fixup (int bytemode ATTRIBUTE_UNUSED,
       scratchbuf[0] = '\0';
     }
 }
+
+static void
+MOVBE_Fixup (int bytemode, int sizeflag)
+{
+  /* Add proper suffix to "movbe".  */
+  char *p = obuf + strlen (obuf);
+
+  switch (bytemode)
+    {
+    case v_mode:
+      if (intel_syntax)
+       break;
+
+      USED_REX (REX_W);
+      if (sizeflag & SUFFIX_ALWAYS)
+       {
+         if (rex & REX_W)
+           *p++ = 'q';
+         else if (sizeflag & DFLAG)
+           *p++ = 'l';
+         else
+           *p++ = 'w';
+       }
+      used_prefixes |= (prefixes & PREFIX_DATA);
+      break;
+    default:
+      oappend (INTERNAL_DISASSEMBLER_ERROR);
+      break;
+    }
+  *p = '\0';
+
+  OP_M (bytemode, sizeflag);
+}
This page took 0.040447 seconds and 4 git commands to generate.