Imported Upstream version 3.0.1
[platform/upstream/libjpeg-turbo.git] / simd / x86_64 / jsimdcpu.asm
1 ;
2 ; jsimdcpu.asm - SIMD instruction support check
3 ;
4 ; Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
5 ; Copyright (C) 2016, D. R. Commander.
6 ; Copyright (C) 2023, Aliaksiej Kandracienka.
7 ;
8 ; Based on
9 ; x86 SIMD extension for IJG JPEG library
10 ; Copyright (C) 1999-2006, MIYASAKA Masaru.
11 ; For conditions of distribution and use, see copyright notice in jsimdext.inc
12 ;
13 ; This file should be assembled with NASM (Netwide Assembler),
14 ; can *not* be assembled with Microsoft's MASM or any compatible
15 ; assembler (including Borland's Turbo Assembler).
16 ; NASM is available from http://nasm.sourceforge.net/ or
17 ; http://sourceforge.net/project/showfiles.php?group_id=6208
18
19 %include "jsimdext.inc"
20
21 ; --------------------------------------------------------------------------
22     SECTION     SEG_TEXT
23     BITS        64
24 ;
25 ; Check if the CPU supports SIMD instructions
26 ;
27 ; GLOBAL(unsigned int)
28 ; jpeg_simd_cpu_support(void)
29 ;
30
31     align       32
32     GLOBAL_FUNCTION(jpeg_simd_cpu_support)
33
34 EXTN(jpeg_simd_cpu_support):
35     push        rbp
36     mov         rbp, rsp
37     push        rbx
38     push        rdi
39
40     xor         rdi, rdi                ; simd support flag
41
42     ; Assume that all x86-64 processors support SSE & SSE2 instructions
43     or          rdi, JSIMD_SSE2
44     or          rdi, JSIMD_SSE
45
46     ; Check whether CPUID leaf 07H is supported
47     ; (leaf 07H is used to check for AVX2 instruction support)
48     mov         rax, 0
49     cpuid
50     cmp         rax, 7
51     jl          short .return           ; Maximum leaf < 07H
52
53     ; Check for AVX2 instruction support
54     mov         rax, 7
55     xor         rcx, rcx
56     cpuid
57     mov         rax, rbx                ; rax = Extended feature flags
58
59     test        rax, 1<<5               ; bit5:AVX2
60     jz          short .return
61
62     ; Check for AVX2 O/S support
63     mov         rax, 1
64     xor         rcx, rcx
65     cpuid
66     test        rcx, 1<<27
67     jz          short .return           ; O/S does not support XSAVE
68     test        rcx, 1<<28
69     jz          short .return           ; CPU does not support AVX2
70
71     xor         rcx, rcx
72     xgetbv
73     and         rax, 6
74     cmp         rax, 6                  ; O/S does not manage XMM/YMM state
75                                         ; using XSAVE
76     jnz         short .return
77
78     or          rdi, JSIMD_AVX2
79
80 .return:
81     mov         rax, rdi
82
83     pop         rdi
84     pop         rbx
85     pop         rbp
86     ret
87
88 ; For some reason, the OS X linker does not honor the request to align the
89 ; segment unless we do this.
90     align       32