The branch main has been updated by dchagin:

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

commit c8dbef44ffbe8d8acf33a5f20e20ca6b48beb4fa
Author:     Dmitry Chagin <[email protected]>
AuthorDate: 2023-06-04 09:07:02 +0000
Commit:     Dmitry Chagin <[email protected]>
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;

Reply via email to