]> granicus.if.org Git - libass/commitdiff
Fix crash when the OS doesn't support AVX2
authorRodger Combs <rodger.combs@gmail.com>
Mon, 27 Jul 2015 22:53:21 +0000 (17:53 -0500)
committerRodger Combs <rodger.combs@gmail.com>
Mon, 27 Jul 2015 22:53:21 +0000 (17:53 -0500)
libass/ass_utils.c
libass/x86/cpuid.asm
libass/x86/cpuid.h

index a6a063b1d0613d2f622e00029eaec7836ad495a1..94edf8054653c363a7f23a169deaa0d32124508f 100644 (file)
@@ -48,6 +48,9 @@ int has_avx(void)
     if(!(ecx & (1 << 27))) // not OSXSAVE
         return 0;
     uint32_t misc = ecx;
+    ass_get_xgetbv(0, &eax, &edx);
+    if((eax & 0x6) != 0x6)
+        return 0;
     eax = 0;
     ass_get_cpuid(&eax, &ebx, &ecx, &edx);
     return (ecx & 0x6) == 0x6 ? (misc >> 28) & 0x1 : 0; // check high bits are relevant, then AVX support
index 13b2a2df6e9140c37d76948de5032c6d275d2adc..9ecf8358fd95b83ad337c89bd729654ab0177a57 100644 (file)
@@ -46,3 +46,19 @@ cglobal get_cpuid, 4, 5, 0
     mov [r4], edx
     pop rbx
     RET
+
+;-----------------------------------------------------------------------------
+; void get_xgetbv( uint32_t op, uint32_t *eax, uint32_t *edx )
+;-----------------------------------------------------------------------------
+
+INIT_XMM
+cglobal get_xgetbv, 3, 7, 0
+    push  r2
+    push  r1
+    mov  ecx, r0d
+    xgetbv
+    pop   r4
+    mov [r4], eax
+    pop   r4
+    mov [r4], edx
+    RET
index 34e4b191372dbb51bda8b70eaf881044ab8c2f85..4dc0e2287a60d40c2cd39ea87b6244df06182983 100644 (file)
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
+
 #ifndef INTEL_CPUID_H
 #define INTEL_CPUID_H
+
 void ass_get_cpuid( uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx);
+void ass_get_xgetbv( uint32_t op, uint32_t *eax, uint32_t *edx );
+
 #endif