You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
2.3 KiB

/*
* Copyright 2002-2019 Intel Corporation.
*
* This software is provided to you as Sample Source Code as defined in the accompanying
* End User License Agreement for the Intel(R) Software Development Products ("Agreement")
* section 1.L.
*
* This software and the related documents are provided as is, with no express or implied
* warranties, other than those that are expressly stated in the License.
*/
#include <cstring>
#include <cstdio>
#ifdef TARGET_WINDOWS
# define ASMNAME(name)
# define ALIGN64 __declspec(align(64))
#else
# define ASMNAME(name) asm(name)
# define ALIGN64 __attribute__ ((aligned (64)))
#endif
#ifdef TARGET_IA32
typedef long ADDRINT;
#define ADDRINT_FORMAT "%lx"
#else
typedef long long ADDRINT;
#define ADDRINT_FORMAT "%llx"
#endif
/////////////////////
// EXTERNAL FUNCTIONS
/////////////////////
extern "C" void DoXsave() ASMNAME("DoXsave");
extern "C" void DoXsaveOpt() ASMNAME("DoXsaveOpt");
extern "C" void DoXrstor() ASMNAME("DoXrstor");
/////////////////////
// GLOBAL VARIABLES
/////////////////////
extern "C"
{
// the current size is large enough for avx512
unsigned char ALIGN64 xsaveArea[2688] ASMNAME("xsaveArea");
ADDRINT flags ASMNAME("flags");
}
ADDRINT checkedFlags [10] = {
0x00, /* none */
0x03, /* only legacy */
0x04, /* only avx */
0x07, /* combo1 legacy + AVX */
0x18, /* only BND */
0x1c, /* combo2 BND + AVX */
0xc4, /* combo3 some AVX512 + AVX */
0xd5, /* combo4 some AVX512 + some BND + AVX + some legacy */
0xe0, /* only AVX512 */
0xff /* all */
};
int main(int argc, const char* argv[])
{
memset(xsaveArea, 0, sizeof(xsaveArea));
for (int i=0; i<4; i++) {
flags = checkedFlags[i];
DoXsave(); // get the register value before the change
printf("XSAVE on 0x" ADDRINT_FORMAT "\n", (ADDRINT)xsaveArea);
DoXsaveOpt(); // get the register value before the change
printf("XSAVEOPT on 0x" ADDRINT_FORMAT "\n", (ADDRINT)xsaveArea);
DoXrstor(); // restor the register value
printf("XRSTOR on 0x" ADDRINT_FORMAT "\n", (ADDRINT)xsaveArea);
}
return 0;
}