Blame src/libmpg123/getcpuflags_x86_64.S

Packit c32a2d
/*
Packit c32a2d
	getcpuflags_x86_64: get cpuflags for x86-64
Packit c32a2d
Packit c32a2d
	copyright 1995-2013 by the mpg123 project - free software under the terms of the LGPL 2.1
Packit c32a2d
	see COPYING and AUTHORS files in distribution or http://mpg123.org
Packit c32a2d
	initially written by Taihei Monma
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
#include "mangle.h"
Packit c32a2d
Packit c32a2d
	.text
Packit c32a2d
	ALIGN4
Packit c32a2d
	.globl ASM_NAME(getcpuflags)
Packit c32a2d
ASM_NAME(getcpuflags):
Packit c32a2d
	push	%rbp
Packit c32a2d
	mov		%rsp, %rbp
Packit c32a2d
	push	%rbx
Packit c32a2d
	
Packit c32a2d
#ifdef IS_MSABI
Packit c32a2d
	push	%rdi
Packit c32a2d
	mov		%rcx, %rdi
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
	movl	$0, 12(%rdi)
Packit c32a2d
	movl	$0, 16(%rdi)
Packit c32a2d
Packit c32a2d
	mov		$0x80000000, %eax
Packit c32a2d
	cpuid
Packit c32a2d
	cmp		$0x80000001, %eax
Packit c32a2d
	jb		1f
Packit c32a2d
	mov		$0x80000001, %eax
Packit c32a2d
	cpuid
Packit c32a2d
	movl	%edx, 12(%rdi)
Packit c32a2d
1:
Packit c32a2d
	mov		$0x00000001, %eax
Packit c32a2d
	cpuid
Packit c32a2d
	movl	%eax, (%rdi)
Packit c32a2d
	movl	%ecx, 4(%rdi)
Packit c32a2d
	movl	%edx, 8(%rdi)
Packit c32a2d
	test	$0x04000000, %ecx
Packit c32a2d
	jz		2f
Packit c32a2d
	test	$0x08000000, %ecx
Packit c32a2d
	jz		2f
Packit c32a2d
	xor		%ecx, %ecx
Packit c32a2d
	.byte	0x0f, 0x01, 0xd0 /* xgetbv instruction */
Packit c32a2d
	movl	%eax, 16(%rdi)
Packit c32a2d
	movl	(%rdi), %eax
Packit c32a2d
2:
Packit c32a2d
#ifdef IS_MSABI
Packit c32a2d
	pop		%rdi
Packit c32a2d
#endif
Packit c32a2d
	pop		%rbx
Packit c32a2d
	mov		%rbp, %rsp
Packit c32a2d
	pop		%rbp
Packit c32a2d
	ret
Packit c32a2d
	
Packit c32a2d
NONEXEC_STACK