aboutsummaryrefslogtreecommitdiff
path: root/opcodes/i386-dis.c
diff options
context:
space:
mode:
authorIlya Tocar <ilya.tocar@intel.com>2014-07-18 14:59:54 +0400
committerH.J. Lu <hjl.tools@gmail.com>2014-07-22 10:23:40 -0700
commitb28d1bda54728d10ae189a323c343b6d76f94b8e (patch)
treeef86cf68b866cdf2df5f404221c7cefb9d155e71 /opcodes/i386-dis.c
parent50d13ae760ccae7ba30244985397240dfb67a431 (diff)
downloadfsf-binutils-gdb-b28d1bda54728d10ae189a323c343b6d76f94b8e.zip
fsf-binutils-gdb-b28d1bda54728d10ae189a323c343b6d76f94b8e.tar.gz
fsf-binutils-gdb-b28d1bda54728d10ae189a323c343b6d76f94b8e.tar.bz2
Add support for AVX512VL. Add AVX512VL versions of AVX512F instructions.
gas/ * config/tc-i386.c (cpu_arch): Add .avx512vl, CPU_AVX512VL_FLAGS. (build_vex_prefix): Don't abort on VEX.W. (check_VecOperands): Support BROADCAST_1TO4 and BROADCAST_1TO2. (check_VecOperations): Ditto. * doc/c-i386.texi: Document avx512vl/.avx512vl. gas/testsuite/ * gas/i386/avx512f_vl-intel.d: New. * gas/i386/avx512f_vl-opts-intel.d: New. * gas/i386/avx512f_vl-opts.d: New. * gas/i386/avx512f_vl-opts.s: New. * gas/i386/avx512f_vl-wig.s: New. * gas/i386/avx512f_vl-wig1-intel.d: New. * gas/i386/avx512f_vl-wig1.d: New. * gas/i386/avx512f_vl.d: New. * gas/i386/avx512f_vl.s: New. * gas/i386/i386.exp: Run new AVX-512 tests. * gas/i386/x86-64-avx512f_vl-intel.d: New. * gas/i386/x86-64-avx512f_vl-opts-intel.d: New. * gas/i386/x86-64-avx512f_vl-opts.d: New. * gas/i386/x86-64-avx512f_vl-opts.s: New. * gas/i386/x86-64-avx512f_vl-wig.s: New. * gas/i386/x86-64-avx512f_vl-wig1-intel.d: New. * gas/i386/x86-64-avx512f_vl-wig1.d: New. * gas/i386/x86-64-avx512f_vl.d: New. * gas/i386/x86-64-avx512f_vl.s: New. opcodes/ * i386-dis.c (intel_operand_size): Support 128/256 length in vex_vsib_q_w_dq_mode. (OP_E_memory): Add ymmq_mode handling, handle new broadcast. * i386-gen.c (cpu_flag_init): Add CPU_AVX512VL_FLAGS. (cpu_flags): Add CpuAVX512VL. * i386-init.h: Regenerated. * i386-opc.h (CpuAVX512VL): New. (i386_cpu_flags): Add cpuavx512vl. (BROADCAST_1TO4, BROADCAST_1TO2): Define. * i386-opc.tbl: Add AVX512VL instructions. * i386-tbl.h: Regenerate.
Diffstat (limited to 'opcodes/i386-dis.c')
-rw-r--r--opcodes/i386-dis.c70
1 files changed, 63 insertions, 7 deletions
diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c
index 24406f3..e9d8cb1 100644
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -14114,17 +14114,41 @@ intel_operand_size (int bytemode, int sizeflag)
}
else
{
- if (vex.length != 512)
- abort ();
- oappend ("ZMMWORD PTR ");
+ switch (vex.length)
+ {
+ case 128:
+ oappend ("XMMWORD PTR ");
+ break;
+ case 256:
+ oappend ("YMMWORD PTR ");
+ break;
+ case 512:
+ oappend ("ZMMWORD PTR ");
+ break;
+ default:
+ abort ();
+ }
}
break;
case vex_vsib_q_w_d_mode:
case vex_vsib_d_w_d_mode:
- if (!need_vex || !vex.evex || vex.length != 512)
+ if (!need_vex || !vex.evex)
abort ();
- oappend ("YMMWORD PTR ");
+ switch (vex.length)
+ {
+ case 128:
+ oappend ("QWORD PTR ");
+ break;
+ case 256:
+ oappend ("XMMWORD PTR ");
+ break;
+ case 512:
+ oappend ("YMMWORD PTR ");
+ break;
+ default:
+ abort ();
+ }
break;
case mask_mode:
@@ -14324,6 +14348,8 @@ OP_E_memory (int bytemode, int sizeflag)
shift -= 2;
else if (bytemode == xmmdw_mode)
shift -= 3;
+ else if (bytemode == ymmq_mode && vex.length == 128)
+ shift -= 1;
}
else
shift = 0;
@@ -14621,9 +14647,39 @@ OP_E_memory (int bytemode, int sizeflag)
|| bytemode == evex_half_bcst_xmmq_mode))
{
if (vex.w || bytemode == evex_half_bcst_xmmq_mode)
- oappend ("{1to8}");
+ {
+ switch (vex.length)
+ {
+ case 128:
+ oappend ("{1to2}");
+ break;
+ case 256:
+ oappend ("{1to4}");
+ break;
+ case 512:
+ oappend ("{1to8}");
+ break;
+ default:
+ abort ();
+ }
+ }
else
- oappend ("{1to16}");
+ {
+ switch (vex.length)
+ {
+ case 128:
+ oappend ("{1to4}");
+ break;
+ case 256:
+ oappend ("{1to8}");
+ break;
+ case 512:
+ oappend ("{1to16}");
+ break;
+ default:
+ abort ();
+ }
+ }
}
}