summaryrefslogtreecommitdiff
path: root/devel/perlasm/cpuid-x86_64.pl
blob: b821a49f0d343bd7ba1024dd40cebd74194bcae9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/env perl
#
# ====================================================================
# Written by Nikos Mavrogiannopoulos
# Based on e_padlock-x86_64
# ====================================================================
#

$flavour = shift;
$output  = shift;
if ($flavour =~ /\./) { $output = $flavour; undef $flavour; }

$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/);

$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or
( $xlate="${dir}../../crypto/perlasm/x86_64-xlate.pl" and -f $xlate) or
die "can't locate x86_64-xlate.pl";

open STDOUT,"| $^X $xlate $flavour $output";

$code=".text\n";

($arg1,$arg2,$arg3,$arg4)=$win64?("%rcx","%rdx","%r8", "%r9") : # Win64 order
                                 ("%rdi","%rsi","%rdx","%rcx"); # Unix order


$code.=<<___;
.globl _gnutls_cpuid
.type _gnutls_cpuid,\@abi-omnipotent
.align	16
_gnutls_cpuid:
	pushq	%rbp
	movq	%rsp, %rbp
	pushq	%rbx
	movl	%edi, -12(%rbp)
	movq	%rsi, -24(%rbp)
	movq	%rdx, -32(%rbp)
	movq	%rcx, -40(%rbp)
	movq	%r8, -48(%rbp)
	movl	-12(%rbp), %eax
	movl	%eax, -60(%rbp)
	movl	-60(%rbp), %eax
	cpuid
	movl	%edx, -56(%rbp)
	movl	%ecx, %esi
	movl	%eax, -52(%rbp)
	movq	-24(%rbp), %rax
	movl	-52(%rbp), %edx
	movl	%edx, (%rax)
	movq	-32(%rbp), %rax
	movl	%ebx, (%rax)
	movq	-40(%rbp), %rax
	movl	%esi, (%rax)
	movq	-48(%rbp), %rax
	movl	-56(%rbp), %ecx
	movl	%ecx, (%rax)
	popq	%rbx
	leave
	ret
.size _gnutls_cpuid,.-_gnutls_cpuid
___

$code =~ s/\`([^\`]*)\`/eval($1)/gem;

print $code;

close STDOUT;