i386: Add syscall to enable AMX for latest kernels

gcc/testsuite/ChangeLog:

	* gcc.target/i386/amx-check.h (request_perm_xtile_data):
	New function to check if AMX is usable and enable AMX.
	(main): Run test if AMX is usable.
This commit is contained in:
Haochen Jiang 2022-06-16 00:15:53 -07:00 committed by Hongyu Wang
parent ec532b47f1
commit 5e377d21f1
1 changed files with 30 additions and 0 deletions

View File

@ -4,11 +4,24 @@
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
#ifdef __linux__
#include <sys/syscall.h>
#endif
#ifdef DEBUG
#include <stdio.h>
#endif
#include "cpuid.h"
#define XFEATURE_XTILECFG 17
#define XFEATURE_XTILEDATA 18
#define XFEATURE_MASK_XTILECFG (1 << XFEATURE_XTILECFG)
#define XFEATURE_MASK_XTILEDATA (1 << XFEATURE_XTILEDATA)
#define XFEATURE_MASK_XTILE (XFEATURE_MASK_XTILECFG | XFEATURE_MASK_XTILEDATA)
#define ARCH_GET_XCOMP_PERM 0x1022
#define ARCH_REQ_XCOMP_PERM 0x1023
/* TODO: The tmm emulation is temporary for current
AMX implementation with no tmm regclass, should
be changed in the future. */
@ -44,6 +57,20 @@ typedef struct __tile
/* Stride (colum width in byte) used for tileload/store */
#define _STRIDE 64
#ifdef __linux__
/* We need syscall to use amx functions */
int request_perm_xtile_data()
{
unsigned long bitmask;
if (syscall (SYS_arch_prctl, ARCH_REQ_XCOMP_PERM, XFEATURE_XTILEDATA) ||
syscall (SYS_arch_prctl, ARCH_GET_XCOMP_PERM, &bitmask))
return 0;
return (bitmask & XFEATURE_MASK_XTILE) != 0;
}
#endif
/* Initialize tile config by setting all tmm size to 16x64 */
void init_tile_config (__tilecfg_u *dst)
{
@ -185,6 +212,9 @@ main ()
#endif
#ifdef AMX_BF16
&& __builtin_cpu_supports ("amx-bf16")
#endif
#ifdef __linux__
&& request_perm_xtile_data ()
#endif
)
{