git: c8dbef44ffbe - main - xregs_sig: Add avx registers to test

From: Dmitry Chagin <dchagin_at_FreeBSD.org>
Date: Sun, 04 Jun 2023 09:08:37 UTC
The branch main has been updated by dchagin:

URL: https://cgit.FreeBSD.org/src/commit/?id=c8dbef44ffbe8d8acf33a5f20e20ca6b48beb4fa

commit c8dbef44ffbe8d8acf33a5f20e20ca6b48beb4fa
Author:     Dmitry Chagin <dchagin@FreeBSD.org>
AuthorDate: 2023-06-04 09:07:02 +0000
Commit:     Dmitry Chagin <dchagin@FreeBSD.org>
CommitDate: 2023-06-04 09:07:02 +0000

    xregs_sig: Add avx registers to test
    
    Reviewed by:            kib
    Differential Revision:  https://reviews.freebsd.org/D40384
---
 tools/test/xregs_sig/c2x2c_aarch64.S |  9 ++++
 tools/test/xregs_sig/c2x2c_amd64.S   | 85 ++++++++++++++++++++++++++++++++++++
 tools/test/xregs_sig/xregs_sig.c     | 14 +++++-
 3 files changed, 107 insertions(+), 1 deletion(-)

diff --git a/tools/test/xregs_sig/c2x2c_aarch64.S b/tools/test/xregs_sig/c2x2c_aarch64.S
index f53550b867fd..ef29cac8a087 100644
--- a/tools/test/xregs_sig/c2x2c_aarch64.S
+++ b/tools/test/xregs_sig/c2x2c_aarch64.S
@@ -7,6 +7,15 @@
 
 	.text
 
+	.globl xregs_banks_max
+	.type xregs_banks_max, @function
+xregs_banks_max:
+	mov  x0, #0
+	ret
+
+	.size xregs_banks_max, . - xregs_banks_max
+
+
 	.globl cpu_to_vfp
 	.type cpu_to_vfp, @function
 cpu_to_vfp:
diff --git a/tools/test/xregs_sig/c2x2c_amd64.S b/tools/test/xregs_sig/c2x2c_amd64.S
index 7348e4871d53..bdc0d782e5c8 100644
--- a/tools/test/xregs_sig/c2x2c_amd64.S
+++ b/tools/test/xregs_sig/c2x2c_amd64.S
@@ -5,8 +5,45 @@
  * $FreeBSD$
  */
 
+#if defined(__FreeBSD__)
+#include <machine/specialreg.h>
+#else
+#define	CPUID2_OSXSAVE			0x08000000
+#define	CPUID2_AVX			0x10000000
+#define	XFEATURE_ENABLED_X87		0x00000001
+#define	XFEATURE_ENABLED_SSE		0x00000002
+#define	XFEATURE_ENABLED_AVX		0x00000004
+#define	XFEATURE_AVX					\
+    (XFEATURE_ENABLED_X87 | XFEATURE_ENABLED_SSE | XFEATURE_ENABLED_AVX)
+#endif
+
 	.text
 
+	.globl xregs_banks_max
+	.type xregs_banks_max, @function
+xregs_banks_max:
+	pushq	%rbx
+	movl	$1, %eax
+	cpuid
+	andl	$(CPUID2_AVX|CPUID2_OSXSAVE), %ecx
+	cmpl	$(CPUID2_AVX|CPUID2_OSXSAVE), %ecx
+	jne	sse
+	xorl	%ecx, %ecx
+	xgetbv
+	andl	$XFEATURE_AVX, %eax
+	cmpl	$XFEATURE_AVX, %eax
+	jne	sse
+	movl	$1, %eax
+	jmp	out
+sse:
+	xorl	%eax, %eax
+out:
+	popq	%rbx
+	retq
+
+	.size xregs_banks_max, . - xregs_banks_max
+
+
 	.globl cpu_to_xmm
 	.type cpu_to_xmm, @function
 cpu_to_xmm:
@@ -54,4 +91,52 @@ xmm_to_cpu:
 
 	.size xmm_to_cpu, . - xmm_to_cpu
 
+
+	.globl cpu_to_avx
+	.type cpu_to_avx, @function
+cpu_to_avx:
+	vmovdqu	%ymm0, (%rdi)
+	vmovdqu	%ymm1, 1 * 32(%rdi)
+	vmovdqu	%ymm2, 2 * 32(%rdi)
+	vmovdqu	%ymm3, 3 * 32(%rdi)
+	vmovdqu	%ymm4, 4 * 32(%rdi)
+	vmovdqu	%ymm5, 5 * 32(%rdi)
+	vmovdqu	%ymm6, 6 * 32(%rdi)
+	vmovdqu	%ymm7, 7 * 32(%rdi)
+	vmovdqu	%ymm8, 8 * 32(%rdi)
+	vmovdqu	%ymm9, 9 * 32(%rdi)
+	vmovdqu	%ymm10, 10 * 32(%rdi)
+	vmovdqu	%ymm11, 11 * 32(%rdi)
+	vmovdqu	%ymm12, 12 * 32(%rdi)
+	vmovdqu	%ymm13, 13 * 32(%rdi)
+	vmovdqu	%ymm14, 14 * 32(%rdi)
+	vmovdqu	%ymm15, 15 * 32(%rdi)
+	retq
+
+	.size cpu_to_avx, . - cpu_to_avx
+
+
+	.globl avx_to_cpu
+	.type avx_to_cpu, @function
+avx_to_cpu:
+	vmovdqu	(%rdi), %ymm0
+	vmovdqu	1 * 32(%rdi), %ymm1
+	vmovdqu	2 * 32(%rdi), %ymm2
+	vmovdqu	3 * 32(%rdi), %ymm3
+	vmovdqu	4 * 32(%rdi), %ymm4
+	vmovdqu	5 * 32(%rdi), %ymm5
+	vmovdqu	6 * 32(%rdi), %ymm6
+	vmovdqu	7 * 32(%rdi), %ymm7
+	vmovdqu	8 * 32(%rdi), %ymm8
+	vmovdqu	9 * 32(%rdi), %ymm9
+	vmovdqu	10 * 32(%rdi), %ymm10
+	vmovdqu	11 * 32(%rdi), %ymm11
+	vmovdqu	12 * 32(%rdi), %ymm12
+	vmovdqu	13 * 32(%rdi), %ymm13
+	vmovdqu	14 * 32(%rdi), %ymm14
+	vmovdqu	15 * 32(%rdi), %ymm15
+	retq
+
+	.size avx_to_cpu, . - avx_to_cpu
+
 	.section        .note.GNU-stack,"",@progbits
diff --git a/tools/test/xregs_sig/xregs_sig.c b/tools/test/xregs_sig/xregs_sig.c
index 4e29165d39e2..2ed47b4eb3bc 100644
--- a/tools/test/xregs_sig/xregs_sig.c
+++ b/tools/test/xregs_sig/xregs_sig.c
@@ -54,9 +54,13 @@ struct xregs_bank {
 	void		(*c2x)(uint8_t *);
 };
 
+int xregs_banks_max(void);
+
 #if defined(__amd64__)
 void cpu_to_xmm(uint8_t *);
 void xmm_to_cpu(uint8_t *);
+void cpu_to_avx(uint8_t *);
+void avx_to_cpu(uint8_t *);
 
 static const struct xregs_bank xregs_banks[] = {
 	{
@@ -67,6 +71,14 @@ static const struct xregs_bank xregs_banks[] = {
 		.x2c	= xmm_to_cpu,
 		.c2x	= cpu_to_xmm,
 	},
+	{
+		.b_name	= "AVX",
+		.r_name	= "ymm",
+		.regs	= 16,
+		.bytes	= 32,
+		.x2c	= avx_to_cpu,
+		.c2x	= cpu_to_avx,
+	},
 };
 #elif defined(__aarch64__)
 void cpu_to_vfp(uint8_t *);
@@ -199,7 +211,7 @@ main(void)
 	struct sigaction sa;
 	int error, i, ncpu, bank;
 
-	max_bank_idx = 0;
+	max_bank_idx = xregs_banks_max();
 
 	bzero(&sa, sizeof(sa));
 	sa.sa_handler = sigalrm_handler;