| //===-- HasAVX.s ---------------------------------------*- x86 Assembly -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #if defined (__i386__) || defined (__x86_64__) |
| |
| .globl _HasAVX |
| |
| _HasAVX: |
| #if defined (__x86_64__) |
| pushq %rbp |
| movq %rsp, %rbp |
| pushq %rbx |
| #else |
| pushl %ebp |
| movl %esp, %ebp |
| pushl %ebx |
| #endif |
| mov $1, %eax |
| cpuid // clobbers ebx |
| and $0x018000000, %ecx |
| cmp $0x018000000, %ecx |
| jne not_supported |
| mov $0, %ecx |
| .byte 0x0f, 0x01, 0xd0 // xgetbv, for those assemblers that don't know it |
| and $0x06, %eax |
| cmp $0x06, %eax |
| jne not_supported |
| mov $1, %eax |
| jmp done |
| not_supported: |
| mov $0, %eax |
| done: |
| #if defined (__x86_64__) |
| popq %rbx |
| movq %rbp, %rsp |
| popq %rbp |
| #else |
| popl %ebx |
| movl %ebp, %esp |
| popl %ebp |
| #endif |
| ret // return |
| |
| #endif |