Add AVX512 registers support to GDB and GDBserver.
This patch adds support for the Intel(R) Advanced Vector
Extensions 512 (Intel(R) AVX-512) registers. Native and remote
debugging are covered by this patch.
Intel(R) AVX-512 is an extension to AVX to support 512-bit wide
SIMD registers in 64-bit mode (XMM0-XMM31, YMM0-YMM31, ZMM0-ZMM31).
The number of available registers in 32-bit mode is still 8
(XMM0-7, YMM0-7, ZMM0-7). The lower 256-bits of the ZMM registers
are aliased to the respective 256-bit YMM registers. The lower
128-bits are aliased to the respective 128-bit XMM registers.
There are also 8 new, dedicated mask registers (K0-K7) in both 32-bit
mode and 64-bit mode.
For more information please see
Intel(R) Developer Zone: Intel(R) AVX
http://software.intel.com/en-us/intel-isa-extensions#pid-16007-1495
Intel(R) Architecture Instruction Set Extensions Programming Reference:
http://software.intel.com/en-us/file/319433-017pdf
2014-04-24 Michael Sturm <michael.sturm@mintel.com>
Walfred Tedeschi <walfred.tedeschi@intel.com>
* amd64-linux-nat.c (amd64_linux_gregset32_reg_offset): Add
AVX512 registers.
(amd64_linux_read_description): Add code to handle AVX512 xstate
mask and return respective tdesc.
* amd64-linux-tdep.c: Include features/i386/amd64-avx512-linux.c
and features/i386/x32-avx512-linux.c.
(amd64_linux_gregset_reg_offset): Add AVX512 registers.
(amd64_linux_core_read_description): Add code to handle AVX512
xstate mask and return respective tdesc.
(_initialize_amd64_linux_tdep): Initialize AVX512 tdesc.
* amd64-linux-tdep.h (AMD64_LINUX_ORIG_RAX_REGNUM): Adjust regnum
calculation.
(AMD64_LINUX_NUM_REGS): Adjust to new number of registers.
(tdesc_amd64_avx512_linux): New prototype.
(tdesc_x32_avx512_linux): Likewise.
* amd64-tdep.c: Include features/i386/amd64-avx512.c and
features/i386/x32-avx512.c.
(amd64_ymm_avx512_names): New register names for pseudo
registers YMM16-31.
(amd64_ymmh_avx512_names): New register names for raw registers
YMMH16-31.
(amd64_k_names): New register names for K registers.
(amd64_zmmh_names): New register names for ZMM raw registers.
(amd64_zmm_names): New registers names for ZMM pseudo registers.
(amd64_xmm_avx512_names): New register names for XMM16-31
registers.
(amd64_pseudo_register_name): Add code to return AVX512 pseudo
registers.
(amd64_init_abi): Add code to intitialize AVX512 tdep variables
if feature is present.
(_initialize_amd64_tdep): Call AVX512 tdesc initializers.
* amd64-tdep.h (enum amd64_regnum): Add AVX512 registers.
(AMD64_NUM_REGS): Adjust to new number of registers.
* i386-linux-nat.c (GETXSTATEREGS_SUPPLIES): Extend range of
registers supplied via XSTATE by AVX512 registers.
(i386_linux_read_description): Add case for AVX512.
* i386-linux-tdep.c: Include i386-avx512-linux.c.
(i386_linux_gregset_reg_offset): Add AVX512 registers.
(i386_linux_core_read_description): Add case for AVX512.
(i386_linux_init_abi): Install supported register note section
for AVX512.
(_initialize_i386_linux_tdep): Add call to tdesc init function for
AVX512.
* i386-linux-tdep.h (I386_LINUX_NUM_REGS): Set number of
registers to be number of zmm7h + 1.
(tdesc_i386_avx512_linux): Add tdesc for AVX512 registers.
* i386-tdep.c: Include features/i386/i386-avx512.c.
(i386_zmm_names): Add ZMM pseudo register names array.
(i386_zmmh_names): Add ZMM raw register names array.
(i386_k_names): Add K raw register names array.
(num_lower_zmm_regs): Add constant for the number of lower ZMM
registers. AVX512 has 16 more ZMM registers than there are YMM
registers.
(i386_zmmh_regnum_p): Add function to look up register number of
ZMM raw registers.
(i386_zmm_regnum_p): Likewise for ZMM pseudo registers.
(i386_k_regnum_p): Likewise for K raw registers.
(i386_ymmh_avx512_regnum_p): Likewise for additional YMM raw
registers added by AVX512.
(i386_ymm_avx512_regnum_p): Likewise for additional YMM pseudo
registers added by AVX512.
(i386_xmm_avx512_regnum_p): Likewise for additional XMM registers
added by AVX512.
(i386_register_name): Add code to hide YMMH16-31 and ZMMH0-31.
(i386_pseudo_register_name): Add ZMM pseudo registers.
(i386_zmm_type): Construct and return vector registers type for ZMM
registers.
(i386_pseudo_register_type): Return appropriate type for YMM16-31,
ZMM0-31 pseudo registers and K registers.
(i386_pseudo_register_read_into_value): Add code to read K, ZMM
and YMM16-31 registers from register cache.
(i386_pseudo_register_write): Add code to write K, ZMM and
YMM16-31 registers.
(i386_register_reggroup_p): Add code to include/exclude AVX512
registers in/from respective register groups.
(i386_validate_tdesc_p): Handle AVX512 feature, add AVX512
registers if feature is present in xcr0.
(i386_gdbarch_init): Add code to initialize AVX512 feature
variables in tdep structure, wire in pseudo registers and call
initialize_tdesc_i386_avx512.
* i386-tdep.h (struct gdbarch_tdep): Add AVX512 related
variables.
(i386_regnum): Add AVX512 registers.
(I386_SSE_NUM_REGS): New define for number of SSE registers.
(I386_AVX_NUM_REGS): Likewise for AVX registers.
(I386_AVX512_NUM_REGS): Likewise for AVX512 registers.
(I386_MAX_REGISTER_SIZE): Change to 64 bytes, ZMM registers are
512 bits wide.
(i386_xmm_avx512_regnum_p): New prototype for register look up.
(i386_ymm_avx512_regnum_p): Likewise.
(i386_k_regnum_p): Likewise.
(i386_zmm_regnum_p): Likewise.
(i386_zmmh_regnum_p): Likewise.
* i387-tdep.c : Update year in copyright notice.
(xsave_ymm_avx512_offset): New table for YMM16-31 offsets in
XSAVE buffer.
(XSAVE_YMM_AVX512_ADDR): New macro.
(xsave_xmm_avx512_offset): New table for XMM16-31 offsets in
XSAVE buffer.
(XSAVE_XMM_AVX512_ADDR): New macro.
(xsave_avx512_k_offset): New table for K register offsets in
XSAVE buffer.
(XSAVE_AVX512_K_ADDR): New macro.
(xsave_avx512_zmm_h_offset): New table for ZMM register offsets
in XSAVE buffer.
(XSAVE_AVX512_ZMM_H_ADDR): New macro.
(i387_supply_xsave): Add code to supply AVX512 registers to XSAVE
buffer.
(i387_collect_xsave): Add code to collect AVX512 registers from
XSAVE buffer.
* i387-tdep.h (I387_NUM_XMM_AVX512_REGS): New define for number
of XMM16-31 registers.
(I387_NUM_K_REGS): New define for number of K registers.
(I387_K0_REGNUM): New define for K0 register number.
(I387_NUM_ZMMH_REGS): New define for number of ZMMH registers.
(I387_ZMM0H_REGNUM): New define for ZMM0H register number.
(I387_NUM_YMM_AVX512_REGS): New define for number of YMM16-31
registers.
(I387_YMM16H_REGNUM): New define for YMM16H register number.
(I387_XMM16_REGNUM): New define for XMM16 register number.
(I387_YMM0_REGNUM): New define for YMM0 register number.
(I387_KEND_REGNUM): New define for last K register number.
(I387_ZMMENDH_REGNUM): New define for last ZMMH register number.
(I387_YMMH_AVX512_END_REGNUM): New define for YMM31 register
number.
(I387_XMM_AVX512_END_REGNUM): New define for XMM31 register
number.
* common/i386-xstate.h: Add AVX 3.1 feature bits, mask and XSTATE
size.
* features/Makefile: Add AVX512 related files.
* features/i386/32bit-avx512.xml: New file.
* features/i386/64bit-avx512.xml: Likewise.
* features/i386/amd64-avx512-linux.c: Likewise.
* features/i386/amd64-avx512-linux.xml: Likewise.
* features/i386/amd64-avx512.c: Likewise.
* features/i386/amd64-avx512.xml: Likewise.
* features/i386/i386-avx512-linux.c: Likewise.
* features/i386/i386-avx512-linux.xml: Likewise.
* features/i386/i386-avx512.c: Likewise.
* features/i386/i386-avx512.xml: Likewise.
* features/i386/x32-avx512-linux.c: Likewise.
* features/i386/x32-avx512-linux.xml: Likewise.
* features/i386/x32-avx512.c: Likewise.
* features/i386/x32-avx512.xml: Likewise.
* regformats/i386/amd64-avx512-linux.dat: New file.
* regformats/i386/amd64-avx512.dat: Likewise.
* regformats/i386/i386-avx512-linux.dat: Likewise.
* regformats/i386/i386-avx512.dat: Likewise.
* regformats/i386/x32-avx512-linux.dat: Likewise.
* regformats/i386/x32-avx512.dat: Likewise.
* NEWS: Add note about new support for AVX512.
testsuite/
* Makefile.in (EXECUTABLES): Added i386-avx512.
* gdb.arch/i386-avx512.c: New file.
* gdb.arch/i386-avx512.exp: Likewise.
gdbserver/
* Makefile.in: Added rules to handle new files
i386-avx512.c i386-avx512-linux.c amd64-avx512.c
amd64-avx512-linux.c x32-avx512.c x32-avx512-linux.c.
* configure.srv (srv_i386_regobj): Add i386-avx512.o.
(srv_i386_linux_regobj): Add i386-avx512-linux.o.
(srv_amd64_regobj): Add amd64-avx512.o and x32-avx512.o.
(srv_amd64_linux_regobj): Add amd64-avx512-linux.o and
x32-avx512-linux.o.
(srv_i386_32bit_xmlfiles): Add i386/32bit-avx512.xml.
(srv_i386_64bit_xmlfiles): Add i386/64bit-avx512.xml.
(srv_amd64_xmlfiles): Add i386/amd64-avx512.xml and
i386/x32-avx512.xml.
(srv_i386_linux_xmlfiles): Add i386/i386-avx512-linux.xml.
(srv_amd64_linux_xmlfiles): Add i386/amd64-avx512-linux.xml and
i386/x32-avx512-linux.xml.
* i387-fp.c (num_avx512_k_registers): New constant for number
of K registers.
(num_avx512_zmmh_low_registers): New constant for number of
lower ZMM registers (0-15).
(num_avx512_zmmh_high_registers): New constant for number of
higher ZMM registers (16-31).
(num_avx512_ymmh_registers): New contant for number of higher
YMM registers (ymm16-31 added by avx521 on x86_64).
(num_avx512_xmm_registers): New constant for number of higher
XMM registers (xmm16-31 added by AVX512 on x86_64).
(struct i387_xsave): Add space for AVX512 registers.
(i387_cache_to_xsave): Change raw buffer size to 64 characters.
Add code to handle AVX512 registers.
(i387_xsave_to_cache): Add code to handle AVX512 registers.
* linux-x86-low.c (init_registers_amd64_avx512_linux): New
prototypei from generated file.
(tdesc_amd64_avx512_linux): Likewise.
(init_registers_x32_avx512_linux): Likewise.
(tdesc_x32_avx512_linux): Likewise.
(init_registers_i386_avx512_linux): Likewise.
(tdesc_i386_avx512_linux): Likewise.
(x86_64_regmap): Add AVX512 registers.
(x86_linux_read_description): Add code to handle AVX512 XSTATE
mask.
(initialize_low_arch): Add code to initialize AVX512 registers.
doc/
* gdb.texinfo (i386 Features): Add description of AVX512
registers.
Change-Id: Ifc4c08c76b85dbec18d02efdbe6182e851584438
Signed-off-by: Michael Sturm <michael.sturm@intel.com>
2013-12-16 15:43:05 +00:00
|
|
|
/* Test program for AVX 512 registers.
|
|
|
|
|
|
|
|
Copyright 2014 Free Software Foundation, Inc.
|
|
|
|
|
|
|
|
This file is part of GDB.
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
|
2014-06-19 13:46:38 +00:00
|
|
|
#include "nat/i386-cpuid.h"
|
Add AVX512 registers support to GDB and GDBserver.
This patch adds support for the Intel(R) Advanced Vector
Extensions 512 (Intel(R) AVX-512) registers. Native and remote
debugging are covered by this patch.
Intel(R) AVX-512 is an extension to AVX to support 512-bit wide
SIMD registers in 64-bit mode (XMM0-XMM31, YMM0-YMM31, ZMM0-ZMM31).
The number of available registers in 32-bit mode is still 8
(XMM0-7, YMM0-7, ZMM0-7). The lower 256-bits of the ZMM registers
are aliased to the respective 256-bit YMM registers. The lower
128-bits are aliased to the respective 128-bit XMM registers.
There are also 8 new, dedicated mask registers (K0-K7) in both 32-bit
mode and 64-bit mode.
For more information please see
Intel(R) Developer Zone: Intel(R) AVX
http://software.intel.com/en-us/intel-isa-extensions#pid-16007-1495
Intel(R) Architecture Instruction Set Extensions Programming Reference:
http://software.intel.com/en-us/file/319433-017pdf
2014-04-24 Michael Sturm <michael.sturm@mintel.com>
Walfred Tedeschi <walfred.tedeschi@intel.com>
* amd64-linux-nat.c (amd64_linux_gregset32_reg_offset): Add
AVX512 registers.
(amd64_linux_read_description): Add code to handle AVX512 xstate
mask and return respective tdesc.
* amd64-linux-tdep.c: Include features/i386/amd64-avx512-linux.c
and features/i386/x32-avx512-linux.c.
(amd64_linux_gregset_reg_offset): Add AVX512 registers.
(amd64_linux_core_read_description): Add code to handle AVX512
xstate mask and return respective tdesc.
(_initialize_amd64_linux_tdep): Initialize AVX512 tdesc.
* amd64-linux-tdep.h (AMD64_LINUX_ORIG_RAX_REGNUM): Adjust regnum
calculation.
(AMD64_LINUX_NUM_REGS): Adjust to new number of registers.
(tdesc_amd64_avx512_linux): New prototype.
(tdesc_x32_avx512_linux): Likewise.
* amd64-tdep.c: Include features/i386/amd64-avx512.c and
features/i386/x32-avx512.c.
(amd64_ymm_avx512_names): New register names for pseudo
registers YMM16-31.
(amd64_ymmh_avx512_names): New register names for raw registers
YMMH16-31.
(amd64_k_names): New register names for K registers.
(amd64_zmmh_names): New register names for ZMM raw registers.
(amd64_zmm_names): New registers names for ZMM pseudo registers.
(amd64_xmm_avx512_names): New register names for XMM16-31
registers.
(amd64_pseudo_register_name): Add code to return AVX512 pseudo
registers.
(amd64_init_abi): Add code to intitialize AVX512 tdep variables
if feature is present.
(_initialize_amd64_tdep): Call AVX512 tdesc initializers.
* amd64-tdep.h (enum amd64_regnum): Add AVX512 registers.
(AMD64_NUM_REGS): Adjust to new number of registers.
* i386-linux-nat.c (GETXSTATEREGS_SUPPLIES): Extend range of
registers supplied via XSTATE by AVX512 registers.
(i386_linux_read_description): Add case for AVX512.
* i386-linux-tdep.c: Include i386-avx512-linux.c.
(i386_linux_gregset_reg_offset): Add AVX512 registers.
(i386_linux_core_read_description): Add case for AVX512.
(i386_linux_init_abi): Install supported register note section
for AVX512.
(_initialize_i386_linux_tdep): Add call to tdesc init function for
AVX512.
* i386-linux-tdep.h (I386_LINUX_NUM_REGS): Set number of
registers to be number of zmm7h + 1.
(tdesc_i386_avx512_linux): Add tdesc for AVX512 registers.
* i386-tdep.c: Include features/i386/i386-avx512.c.
(i386_zmm_names): Add ZMM pseudo register names array.
(i386_zmmh_names): Add ZMM raw register names array.
(i386_k_names): Add K raw register names array.
(num_lower_zmm_regs): Add constant for the number of lower ZMM
registers. AVX512 has 16 more ZMM registers than there are YMM
registers.
(i386_zmmh_regnum_p): Add function to look up register number of
ZMM raw registers.
(i386_zmm_regnum_p): Likewise for ZMM pseudo registers.
(i386_k_regnum_p): Likewise for K raw registers.
(i386_ymmh_avx512_regnum_p): Likewise for additional YMM raw
registers added by AVX512.
(i386_ymm_avx512_regnum_p): Likewise for additional YMM pseudo
registers added by AVX512.
(i386_xmm_avx512_regnum_p): Likewise for additional XMM registers
added by AVX512.
(i386_register_name): Add code to hide YMMH16-31 and ZMMH0-31.
(i386_pseudo_register_name): Add ZMM pseudo registers.
(i386_zmm_type): Construct and return vector registers type for ZMM
registers.
(i386_pseudo_register_type): Return appropriate type for YMM16-31,
ZMM0-31 pseudo registers and K registers.
(i386_pseudo_register_read_into_value): Add code to read K, ZMM
and YMM16-31 registers from register cache.
(i386_pseudo_register_write): Add code to write K, ZMM and
YMM16-31 registers.
(i386_register_reggroup_p): Add code to include/exclude AVX512
registers in/from respective register groups.
(i386_validate_tdesc_p): Handle AVX512 feature, add AVX512
registers if feature is present in xcr0.
(i386_gdbarch_init): Add code to initialize AVX512 feature
variables in tdep structure, wire in pseudo registers and call
initialize_tdesc_i386_avx512.
* i386-tdep.h (struct gdbarch_tdep): Add AVX512 related
variables.
(i386_regnum): Add AVX512 registers.
(I386_SSE_NUM_REGS): New define for number of SSE registers.
(I386_AVX_NUM_REGS): Likewise for AVX registers.
(I386_AVX512_NUM_REGS): Likewise for AVX512 registers.
(I386_MAX_REGISTER_SIZE): Change to 64 bytes, ZMM registers are
512 bits wide.
(i386_xmm_avx512_regnum_p): New prototype for register look up.
(i386_ymm_avx512_regnum_p): Likewise.
(i386_k_regnum_p): Likewise.
(i386_zmm_regnum_p): Likewise.
(i386_zmmh_regnum_p): Likewise.
* i387-tdep.c : Update year in copyright notice.
(xsave_ymm_avx512_offset): New table for YMM16-31 offsets in
XSAVE buffer.
(XSAVE_YMM_AVX512_ADDR): New macro.
(xsave_xmm_avx512_offset): New table for XMM16-31 offsets in
XSAVE buffer.
(XSAVE_XMM_AVX512_ADDR): New macro.
(xsave_avx512_k_offset): New table for K register offsets in
XSAVE buffer.
(XSAVE_AVX512_K_ADDR): New macro.
(xsave_avx512_zmm_h_offset): New table for ZMM register offsets
in XSAVE buffer.
(XSAVE_AVX512_ZMM_H_ADDR): New macro.
(i387_supply_xsave): Add code to supply AVX512 registers to XSAVE
buffer.
(i387_collect_xsave): Add code to collect AVX512 registers from
XSAVE buffer.
* i387-tdep.h (I387_NUM_XMM_AVX512_REGS): New define for number
of XMM16-31 registers.
(I387_NUM_K_REGS): New define for number of K registers.
(I387_K0_REGNUM): New define for K0 register number.
(I387_NUM_ZMMH_REGS): New define for number of ZMMH registers.
(I387_ZMM0H_REGNUM): New define for ZMM0H register number.
(I387_NUM_YMM_AVX512_REGS): New define for number of YMM16-31
registers.
(I387_YMM16H_REGNUM): New define for YMM16H register number.
(I387_XMM16_REGNUM): New define for XMM16 register number.
(I387_YMM0_REGNUM): New define for YMM0 register number.
(I387_KEND_REGNUM): New define for last K register number.
(I387_ZMMENDH_REGNUM): New define for last ZMMH register number.
(I387_YMMH_AVX512_END_REGNUM): New define for YMM31 register
number.
(I387_XMM_AVX512_END_REGNUM): New define for XMM31 register
number.
* common/i386-xstate.h: Add AVX 3.1 feature bits, mask and XSTATE
size.
* features/Makefile: Add AVX512 related files.
* features/i386/32bit-avx512.xml: New file.
* features/i386/64bit-avx512.xml: Likewise.
* features/i386/amd64-avx512-linux.c: Likewise.
* features/i386/amd64-avx512-linux.xml: Likewise.
* features/i386/amd64-avx512.c: Likewise.
* features/i386/amd64-avx512.xml: Likewise.
* features/i386/i386-avx512-linux.c: Likewise.
* features/i386/i386-avx512-linux.xml: Likewise.
* features/i386/i386-avx512.c: Likewise.
* features/i386/i386-avx512.xml: Likewise.
* features/i386/x32-avx512-linux.c: Likewise.
* features/i386/x32-avx512-linux.xml: Likewise.
* features/i386/x32-avx512.c: Likewise.
* features/i386/x32-avx512.xml: Likewise.
* regformats/i386/amd64-avx512-linux.dat: New file.
* regformats/i386/amd64-avx512.dat: Likewise.
* regformats/i386/i386-avx512-linux.dat: Likewise.
* regformats/i386/i386-avx512.dat: Likewise.
* regformats/i386/x32-avx512-linux.dat: Likewise.
* regformats/i386/x32-avx512.dat: Likewise.
* NEWS: Add note about new support for AVX512.
testsuite/
* Makefile.in (EXECUTABLES): Added i386-avx512.
* gdb.arch/i386-avx512.c: New file.
* gdb.arch/i386-avx512.exp: Likewise.
gdbserver/
* Makefile.in: Added rules to handle new files
i386-avx512.c i386-avx512-linux.c amd64-avx512.c
amd64-avx512-linux.c x32-avx512.c x32-avx512-linux.c.
* configure.srv (srv_i386_regobj): Add i386-avx512.o.
(srv_i386_linux_regobj): Add i386-avx512-linux.o.
(srv_amd64_regobj): Add amd64-avx512.o and x32-avx512.o.
(srv_amd64_linux_regobj): Add amd64-avx512-linux.o and
x32-avx512-linux.o.
(srv_i386_32bit_xmlfiles): Add i386/32bit-avx512.xml.
(srv_i386_64bit_xmlfiles): Add i386/64bit-avx512.xml.
(srv_amd64_xmlfiles): Add i386/amd64-avx512.xml and
i386/x32-avx512.xml.
(srv_i386_linux_xmlfiles): Add i386/i386-avx512-linux.xml.
(srv_amd64_linux_xmlfiles): Add i386/amd64-avx512-linux.xml and
i386/x32-avx512-linux.xml.
* i387-fp.c (num_avx512_k_registers): New constant for number
of K registers.
(num_avx512_zmmh_low_registers): New constant for number of
lower ZMM registers (0-15).
(num_avx512_zmmh_high_registers): New constant for number of
higher ZMM registers (16-31).
(num_avx512_ymmh_registers): New contant for number of higher
YMM registers (ymm16-31 added by avx521 on x86_64).
(num_avx512_xmm_registers): New constant for number of higher
XMM registers (xmm16-31 added by AVX512 on x86_64).
(struct i387_xsave): Add space for AVX512 registers.
(i387_cache_to_xsave): Change raw buffer size to 64 characters.
Add code to handle AVX512 registers.
(i387_xsave_to_cache): Add code to handle AVX512 registers.
* linux-x86-low.c (init_registers_amd64_avx512_linux): New
prototypei from generated file.
(tdesc_amd64_avx512_linux): Likewise.
(init_registers_x32_avx512_linux): Likewise.
(tdesc_x32_avx512_linux): Likewise.
(init_registers_i386_avx512_linux): Likewise.
(tdesc_i386_avx512_linux): Likewise.
(x86_64_regmap): Add AVX512 registers.
(x86_linux_read_description): Add code to handle AVX512 XSTATE
mask.
(initialize_low_arch): Add code to initialize AVX512 registers.
doc/
* gdb.texinfo (i386 Features): Add description of AVX512
registers.
Change-Id: Ifc4c08c76b85dbec18d02efdbe6182e851584438
Signed-off-by: Michael Sturm <michael.sturm@intel.com>
2013-12-16 15:43:05 +00:00
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
double f[8];
|
|
|
|
} v8sd_t;
|
|
|
|
|
|
|
|
short k_data[] =
|
|
|
|
{
|
|
|
|
0x1211,
|
|
|
|
0x2221,
|
|
|
|
0x3231,
|
|
|
|
0x4241,
|
|
|
|
0x5251,
|
|
|
|
0x6261,
|
|
|
|
0x7271
|
|
|
|
};
|
|
|
|
|
|
|
|
v8sd_t zmm_data[] =
|
|
|
|
{
|
|
|
|
{ { 0.0, 0.125, 0.25, 0.375, 0.50, 0.625, 0.75, 0.875 } },
|
|
|
|
{ { 1.0, 1.125, 1.25, 1.375, 1.50, 1.625, 1.75, 1.875 } },
|
|
|
|
{ { 2.0, 2.125, 2.25, 2.375, 2.50, 2.625, 2.75, 2.875 } },
|
|
|
|
{ { 3.0, 3.125, 3.25, 3.375, 3.50, 3.625, 3.75, 3.875 } },
|
|
|
|
{ { 4.0, 4.125, 4.25, 4.375, 4.50, 4.625, 4.75, 4.875 } },
|
|
|
|
{ { 5.0, 5.125, 5.25, 5.375, 5.50, 5.625, 5.75, 5.875 } },
|
|
|
|
{ { 6.0, 6.125, 6.25, 6.375, 6.50, 6.625, 6.75, 6.875 } },
|
|
|
|
{ { 7.0, 7.125, 7.25, 7.375, 7.50, 7.625, 7.75, 7.875 } },
|
|
|
|
#ifdef __x86_64__
|
|
|
|
{ { 8.0, 8.125, 8.25, 8.375, 8.50, 8.625, 8.75, 8.875 } },
|
|
|
|
{ { 9.0, 9.125, 9.25, 9.375, 9.50, 9.625, 9.75, 9.875 } },
|
|
|
|
{ { 10.0, 10.125, 10.25, 10.375, 10.50, 10.625, 10.75, 10.875 } },
|
|
|
|
{ { 11.0, 11.125, 11.25, 11.375, 11.50, 11.625, 11.75, 11.875 } },
|
|
|
|
{ { 12.0, 12.125, 12.25, 12.375, 12.50, 12.625, 12.75, 12.875 } },
|
|
|
|
{ { 13.0, 13.125, 13.25, 13.375, 13.50, 13.625, 13.75, 13.875 } },
|
|
|
|
{ { 14.0, 14.125, 14.25, 14.375, 14.50, 14.625, 14.75, 14.875 } },
|
|
|
|
{ { 15.0, 15.125, 15.25, 15.375, 15.50, 15.625, 15.75, 15.875 } },
|
|
|
|
{ { 16.0, 16.125, 16.25, 16.375, 16.50, 16.625, 16.75, 16.875 } },
|
|
|
|
{ { 17.0, 17.125, 17.25, 17.375, 17.50, 17.625, 17.75, 17.875 } },
|
|
|
|
{ { 18.0, 18.125, 18.25, 18.375, 18.50, 18.625, 18.75, 18.875 } },
|
|
|
|
{ { 19.0, 19.125, 19.25, 19.375, 19.50, 19.625, 19.75, 19.875 } },
|
|
|
|
{ { 20.0, 20.125, 20.25, 20.375, 20.50, 20.625, 20.75, 20.875 } },
|
|
|
|
{ { 21.0, 21.125, 21.25, 21.375, 21.50, 21.625, 21.75, 21.875 } },
|
|
|
|
{ { 22.0, 22.125, 22.25, 22.375, 22.50, 22.625, 22.75, 22.875 } },
|
|
|
|
{ { 23.0, 23.125, 23.25, 23.375, 23.50, 23.625, 23.75, 23.875 } },
|
|
|
|
{ { 24.0, 24.125, 24.25, 24.375, 24.50, 24.625, 24.75, 24.875 } },
|
|
|
|
{ { 25.0, 25.125, 25.25, 25.375, 25.50, 25.625, 25.75, 25.875 } },
|
|
|
|
{ { 26.0, 26.125, 26.25, 26.375, 26.50, 26.625, 26.75, 26.875 } },
|
|
|
|
{ { 27.0, 27.125, 27.25, 27.375, 27.50, 27.625, 27.75, 27.875 } },
|
|
|
|
{ { 28.0, 28.125, 28.25, 28.375, 28.50, 28.625, 28.75, 28.875 } },
|
|
|
|
{ { 29.0, 29.125, 29.25, 29.375, 29.50, 29.625, 29.75, 29.875 } },
|
|
|
|
{ { 30.0, 30.125, 30.25, 30.375, 30.50, 30.625, 30.75, 30.875 } },
|
|
|
|
{ { 31.0, 31.125, 31.25, 31.375, 31.50, 31.625, 31.75, 31.875 } },
|
|
|
|
{ { 32.0, 32.125, 32.25, 32.375, 32.50, 32.625, 32.75, 32.875 } },
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
int
|
|
|
|
have_avx512 (void)
|
|
|
|
{
|
|
|
|
unsigned int eax, ebx, ecx, edx, max_level, vendor, has_osxsave, has_avx512f;
|
|
|
|
|
|
|
|
max_level = __get_cpuid_max (0, &vendor);
|
|
|
|
__cpuid (1, eax, ebx, ecx, edx);
|
|
|
|
|
|
|
|
has_osxsave = ecx & bit_OSXSAVE;
|
|
|
|
|
|
|
|
if (max_level >= 7)
|
|
|
|
{
|
|
|
|
__cpuid_count (7, 0, eax, ebx, ecx, edx);
|
|
|
|
has_avx512f = ebx & bit_AVX512F;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (has_osxsave && has_avx512f)
|
|
|
|
return 1;
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
move_k_data_to_reg (void)
|
|
|
|
{
|
|
|
|
asm ("kmovw 0(%0), %%k1\n\t"
|
|
|
|
"kmovw 2(%0), %%k2\n\t"
|
|
|
|
"kmovw 4(%0), %%k3\n\t"
|
|
|
|
"kmovw 6(%0), %%k4\n\t"
|
|
|
|
"kmovw 8(%0), %%k5\n\t"
|
|
|
|
"kmovw 10(%0), %%k6\n\t"
|
|
|
|
"kmovw 12(%0), %%k7\n\t"
|
|
|
|
: /* no output operands */
|
|
|
|
: "r" (k_data));
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
move_k_data_to_memory (void)
|
|
|
|
{
|
|
|
|
asm ("kmovw %%k1, 0(%0) \n\t"
|
|
|
|
"kmovw %%k2, 2(%0) \n\t"
|
|
|
|
"kmovw %%k3, 4(%0) \n\t"
|
|
|
|
"kmovw %%k4, 6(%0) \n\t"
|
|
|
|
"kmovw %%k5, 8(%0) \n\t"
|
|
|
|
"kmovw %%k6, 10(%0) \n\t"
|
|
|
|
"kmovw %%k7, 12(%0) \n\t"
|
|
|
|
: /* no output operands */
|
|
|
|
: "r" (k_data));
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
move_zmm_data_to_reg (void)
|
|
|
|
{
|
|
|
|
asm ("vmovaps 0(%0), %%zmm0\n\t"
|
|
|
|
"vmovaps 64(%0), %%zmm1\n\t"
|
|
|
|
"vmovaps 128(%0), %%zmm2\n\t"
|
|
|
|
"vmovaps 192(%0), %%zmm3\n\t"
|
|
|
|
"vmovaps 256(%0), %%zmm4\n\t"
|
|
|
|
"vmovaps 320(%0), %%zmm5\n\t"
|
|
|
|
"vmovaps 384(%0), %%zmm6\n\t"
|
|
|
|
"vmovaps 448(%0), %%zmm7\n\t"
|
|
|
|
: /* no output operands */
|
|
|
|
: "r" (zmm_data));
|
|
|
|
#ifdef __x86_64__
|
|
|
|
asm ("vmovaps 512(%0), %%zmm8\n\t"
|
|
|
|
"vmovaps 576(%0), %%zmm9\n\t"
|
|
|
|
"vmovaps 640(%0), %%zmm10\n\t"
|
|
|
|
"vmovaps 704(%0), %%zmm11\n\t"
|
|
|
|
"vmovaps 768(%0), %%zmm12\n\t"
|
|
|
|
"vmovaps 832(%0), %%zmm13\n\t"
|
|
|
|
"vmovaps 896(%0), %%zmm14\n\t"
|
|
|
|
"vmovaps 960(%0), %%zmm15\n\t"
|
|
|
|
: /* no output operands */
|
|
|
|
: "r" (zmm_data));
|
|
|
|
|
|
|
|
asm ("vmovaps 1024(%0), %%zmm16\n\t"
|
|
|
|
"vmovaps 1088(%0), %%zmm17\n\t"
|
|
|
|
"vmovaps 1152(%0), %%zmm18\n\t"
|
|
|
|
"vmovaps 1216(%0), %%zmm19\n\t"
|
|
|
|
"vmovaps 1280(%0), %%zmm20\n\t"
|
|
|
|
"vmovaps 1344(%0), %%zmm21\n\t"
|
|
|
|
"vmovaps 1408(%0), %%zmm22\n\t"
|
|
|
|
"vmovaps 1472(%0), %%zmm23\n\t"
|
|
|
|
"vmovaps 1536(%0), %%zmm24\n\t"
|
|
|
|
"vmovaps 1600(%0), %%zmm25\n\t"
|
|
|
|
"vmovaps 1664(%0), %%zmm26\n\t"
|
|
|
|
"vmovaps 1728(%0), %%zmm27\n\t"
|
|
|
|
"vmovaps 1792(%0), %%zmm28\n\t"
|
|
|
|
"vmovaps 1856(%0), %%zmm29\n\t"
|
|
|
|
"vmovaps 1920(%0), %%zmm30\n\t"
|
|
|
|
"vmovaps 1984(%0), %%zmm31\n\t"
|
|
|
|
: /* no output operands */
|
|
|
|
: "r" (zmm_data));
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
move_zmm_data_to_memory (void)
|
|
|
|
{
|
|
|
|
asm ("vmovaps %%zmm0, 0(%0)\n\t"
|
|
|
|
"vmovaps %%zmm1, 64(%0)\n\t"
|
|
|
|
"vmovaps %%zmm2, 128(%0)\n\t"
|
|
|
|
"vmovaps %%zmm3, 192(%0)\n\t"
|
|
|
|
"vmovaps %%zmm4, 256(%0)\n\t"
|
|
|
|
"vmovaps %%zmm5, 320(%0)\n\t"
|
|
|
|
"vmovaps %%zmm6, 384(%0)\n\t"
|
|
|
|
"vmovaps %%zmm7, 448(%0)\n\t"
|
|
|
|
: /* no output operands */
|
|
|
|
: "r" (zmm_data));
|
|
|
|
#ifdef __x86_64__
|
|
|
|
asm ("vmovaps %%zmm8, 512(%0)\n\t"
|
|
|
|
"vmovaps %%zmm9, 576(%0)\n\t"
|
|
|
|
"vmovaps %%zmm10, 640(%0)\n\t"
|
|
|
|
"vmovaps %%zmm11, 704(%0)\n\t"
|
|
|
|
"vmovaps %%zmm12, 768(%0)\n\t"
|
|
|
|
"vmovaps %%zmm13, 832(%0)\n\t"
|
|
|
|
"vmovaps %%zmm14, 896(%0)\n\t"
|
|
|
|
"vmovaps %%zmm15, 960(%0)\n\t"
|
|
|
|
: /* no output operands */
|
|
|
|
: "r" (zmm_data));
|
|
|
|
|
|
|
|
asm ("vmovaps %%zmm16, 1024(%0)\n\t"
|
|
|
|
"vmovaps %%zmm17, 1088(%0)\n\t"
|
|
|
|
"vmovaps %%zmm18, 1152(%0)\n\t"
|
|
|
|
"vmovaps %%zmm19, 1216(%0)\n\t"
|
|
|
|
"vmovaps %%zmm20, 1280(%0)\n\t"
|
|
|
|
"vmovaps %%zmm21, 1344(%0)\n\t"
|
|
|
|
"vmovaps %%zmm22, 1408(%0)\n\t"
|
|
|
|
"vmovaps %%zmm23, 1472(%0)\n\t"
|
|
|
|
"vmovaps %%zmm24, 1536(%0)\n\t"
|
|
|
|
"vmovaps %%zmm25, 1600(%0)\n\t"
|
|
|
|
"vmovaps %%zmm26, 1664(%0)\n\t"
|
|
|
|
"vmovaps %%zmm27, 1728(%0)\n\t"
|
|
|
|
"vmovaps %%zmm28, 1792(%0)\n\t"
|
|
|
|
"vmovaps %%zmm29, 1856(%0)\n\t"
|
|
|
|
"vmovaps %%zmm30, 1920(%0)\n\t"
|
|
|
|
"vmovaps %%zmm31, 1984(%0)\n\t"
|
|
|
|
: /* no output operands */
|
|
|
|
: "r" (zmm_data));
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
main (int argc, char **argv)
|
|
|
|
{
|
|
|
|
if (have_avx512 ())
|
|
|
|
{
|
|
|
|
/* Test for K registers. */
|
|
|
|
move_k_data_to_reg ();
|
|
|
|
asm ("nop"); /* first breakpoint here */
|
|
|
|
|
|
|
|
move_k_data_to_memory ();
|
|
|
|
asm ("nop"); /* second breakpoint here */
|
|
|
|
|
|
|
|
/* Test for ZMM registers. */
|
|
|
|
/* Move initial values from array to registers and read from ZMM regs. */
|
|
|
|
move_zmm_data_to_reg ();
|
|
|
|
asm ("nop"); /* third breakpoint here */
|
|
|
|
|
|
|
|
/* Test script incremented values,
|
|
|
|
move back to array and check values. */
|
|
|
|
move_zmm_data_to_memory ();
|
|
|
|
asm ("nop"); /* fourth breakpoint here */
|
|
|
|
|
|
|
|
/* Test for YMM registers. */
|
|
|
|
/* Test script incremented YMM values,
|
|
|
|
move back to array and check values. */
|
|
|
|
move_zmm_data_to_memory ();
|
|
|
|
asm ("nop"); /* fifth breakpoint here */
|
|
|
|
|
|
|
|
/* Test for XMM registers. */
|
|
|
|
/* Test script incremented XMM values,
|
|
|
|
move back to array and check values. */
|
|
|
|
move_zmm_data_to_memory ();
|
|
|
|
asm ("nop"); /* sixth breakpoint here */
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|