yading@11: ;***************************************************************************** yading@11: ;* Copyright (C) 2005-2010 x264 project yading@11: ;* yading@11: ;* Authors: Loren Merritt yading@11: ;* Jason Garrett-Glaser yading@11: ;* yading@11: ;* This file is part of FFmpeg. yading@11: ;* yading@11: ;* FFmpeg is free software; you can redistribute it and/or yading@11: ;* modify it under the terms of the GNU Lesser General Public yading@11: ;* License as published by the Free Software Foundation; either yading@11: ;* version 2.1 of the License, or (at your option) any later version. yading@11: ;* yading@11: ;* FFmpeg is distributed in the hope that it will be useful, yading@11: ;* but WITHOUT ANY WARRANTY; without even the implied warranty of yading@11: ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@11: ;* Lesser General Public License for more details. yading@11: ;* yading@11: ;* You should have received a copy of the GNU Lesser General Public yading@11: ;* License along with FFmpeg; if not, write to the Free Software yading@11: ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@11: ;****************************************************************************** yading@11: yading@11: %include "x86util.asm" yading@11: yading@11: SECTION .text yading@11: yading@11: ;----------------------------------------------------------------------------- yading@11: ; void ff_cpu_cpuid(int index, int *eax, int *ebx, int *ecx, int *edx) yading@11: ;----------------------------------------------------------------------------- yading@11: cglobal cpu_cpuid, 5,7 yading@11: push rbx yading@11: push r4 yading@11: push r3 yading@11: push r2 yading@11: push r1 yading@11: mov eax, r0d yading@11: xor ecx, ecx yading@11: cpuid yading@11: pop r4 yading@11: mov [r4], eax yading@11: pop r4 yading@11: mov [r4], ebx yading@11: pop r4 yading@11: mov [r4], ecx yading@11: pop r4 yading@11: mov [r4], edx yading@11: pop rbx yading@11: RET yading@11: yading@11: ;----------------------------------------------------------------------------- yading@11: ; void ff_cpu_xgetbv(int op, int *eax, int *edx) yading@11: ;----------------------------------------------------------------------------- yading@11: cglobal cpu_xgetbv, 3,7 yading@11: push r2 yading@11: push r1 yading@11: mov ecx, r0d yading@11: xgetbv yading@11: pop r4 yading@11: mov [r4], eax yading@11: pop r4 yading@11: mov [r4], edx yading@11: RET yading@11: yading@11: %if ARCH_X86_64 == 0 yading@11: ;----------------------------------------------------------------------------- yading@11: ; int ff_cpu_cpuid_test(void) yading@11: ; return 0 if unsupported yading@11: ;----------------------------------------------------------------------------- yading@11: cglobal cpu_cpuid_test yading@11: pushfd yading@11: push ebx yading@11: push ebp yading@11: push esi yading@11: push edi yading@11: pushfd yading@11: pop eax yading@11: mov ebx, eax yading@11: xor eax, 0x200000 yading@11: push eax yading@11: popfd yading@11: pushfd yading@11: pop eax yading@11: xor eax, ebx yading@11: pop edi yading@11: pop esi yading@11: pop ebp yading@11: pop ebx yading@11: popfd yading@11: ret yading@11: %endif