x86_64cpuid.S revision 1.1
1.text
2
3.globl	OPENSSL_atomic_add
4.type	OPENSSL_atomic_add,@function
5.align	16
6OPENSSL_atomic_add:
7	movl	(%rdi),%eax
8.Lspin:	leaq	(%rsi,%rax,1),%r8
9.byte	0xf0
10	cmpxchgl	%r8d,(%rdi)
11	jne	.Lspin
12	movl	%r8d,%eax
13.byte	0x48,0x98
14	.byte	0xf3,0xc3
15.size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
16
17.globl	OPENSSL_rdtsc
18.type	OPENSSL_rdtsc,@function
19.align	16
20OPENSSL_rdtsc:
21	rdtsc
22	shlq	$32,%rdx
23	orq	%rdx,%rax
24	.byte	0xf3,0xc3
25.size	OPENSSL_rdtsc,.-OPENSSL_rdtsc
26
27.globl	OPENSSL_ia32_cpuid
28.type	OPENSSL_ia32_cpuid,@function
29.align	16
30OPENSSL_ia32_cpuid:
31	movq	%rbx,%r8
32
33	xorl	%eax,%eax
34	cpuid
35	movl	%eax,%r11d
36
37	xorl	%eax,%eax
38	cmpl	$1970169159,%ebx
39	setne	%al
40	movl	%eax,%r9d
41	cmpl	$1231384169,%edx
42	setne	%al
43	orl	%eax,%r9d
44	cmpl	$1818588270,%ecx
45	setne	%al
46	orl	%eax,%r9d
47	jz	.Lintel
48
49	cmpl	$1752462657,%ebx
50	setne	%al
51	movl	%eax,%r10d
52	cmpl	$1769238117,%edx
53	setne	%al
54	orl	%eax,%r10d
55	cmpl	$1145913699,%ecx
56	setne	%al
57	orl	%eax,%r10d
58	jnz	.Lintel
59
60
61	movl	$2147483648,%eax
62	cpuid
63	cmpl	$2147483656,%eax
64	jb	.Lintel
65
66	movl	$2147483656,%eax
67	cpuid
68	movzbq	%cl,%r10
69	incq	%r10
70
71	movl	$1,%eax
72	cpuid
73	btl	$28,%edx
74	jnc	.Ldone
75	shrl	$16,%ebx
76	cmpb	%r10b,%bl
77	ja	.Ldone
78	andl	$4026531839,%edx
79	jmp	.Ldone
80
81.Lintel:
82	cmpl	$4,%r11d
83	movl	$-1,%r10d
84	jb	.Lnocacheinfo
85
86	movl	$4,%eax
87	movl	$0,%ecx
88	cpuid
89	movl	%eax,%r10d
90	shrl	$14,%r10d
91	andl	$4095,%r10d
92
93.Lnocacheinfo:
94	movl	$1,%eax
95	cpuid
96	cmpl	$0,%r9d
97	jne	.Lnotintel
98	orl	$1048576,%edx
99	andb	$15,%ah
100	cmpb	$15,%ah
101	je	.Lnotintel
102	orl	$1073741824,%edx
103.Lnotintel:
104	btl	$28,%edx
105	jnc	.Ldone
106	andl	$4026531839,%edx
107	cmpl	$0,%r10d
108	je	.Ldone
109
110	orl	$268435456,%edx
111	shrl	$16,%ebx
112	cmpb	$1,%bl
113	ja	.Ldone
114	andl	$4026531839,%edx
115.Ldone:
116	shlq	$32,%rcx
117	movl	%edx,%eax
118	movq	%r8,%rbx
119	orq	%rcx,%rax
120	.byte	0xf3,0xc3
121.size	OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid
122
123.globl	OPENSSL_cleanse
124.type	OPENSSL_cleanse,@function
125.align	16
126OPENSSL_cleanse:
127	xorq	%rax,%rax
128	cmpq	$15,%rsi
129	jae	.Lot
130	cmpq	$0,%rsi
131	je	.Lret
132.Little:
133	movb	%al,(%rdi)
134	subq	$1,%rsi
135	leaq	1(%rdi),%rdi
136	jnz	.Little
137.Lret:
138	.byte	0xf3,0xc3
139.align	16
140.Lot:
141	testq	$7,%rdi
142	jz	.Laligned
143	movb	%al,(%rdi)
144	leaq	-1(%rsi),%rsi
145	leaq	1(%rdi),%rdi
146	jmp	.Lot
147.Laligned:
148	movq	%rax,(%rdi)
149	leaq	-8(%rsi),%rsi
150	testq	$-8,%rsi
151	leaq	8(%rdi),%rdi
152	jnz	.Laligned
153	cmpq	$0,%rsi
154	jne	.Little
155	.byte	0xf3,0xc3
156.size	OPENSSL_cleanse,.-OPENSSL_cleanse
157.globl	OPENSSL_wipe_cpu
158.type	OPENSSL_wipe_cpu,@function
159.align	16
160OPENSSL_wipe_cpu:
161	pxor	%xmm0,%xmm0
162	pxor	%xmm1,%xmm1
163	pxor	%xmm2,%xmm2
164	pxor	%xmm3,%xmm3
165	pxor	%xmm4,%xmm4
166	pxor	%xmm5,%xmm5
167	pxor	%xmm6,%xmm6
168	pxor	%xmm7,%xmm7
169	pxor	%xmm8,%xmm8
170	pxor	%xmm9,%xmm9
171	pxor	%xmm10,%xmm10
172	pxor	%xmm11,%xmm11
173	pxor	%xmm12,%xmm12
174	pxor	%xmm13,%xmm13
175	pxor	%xmm14,%xmm14
176	pxor	%xmm15,%xmm15
177	xorq	%rcx,%rcx
178	xorq	%rdx,%rdx
179	xorq	%rsi,%rsi
180	xorq	%rdi,%rdi
181	xorq	%r8,%r8
182	xorq	%r9,%r9
183	xorq	%r10,%r10
184	xorq	%r11,%r11
185	leaq	8(%rsp),%rax
186	.byte	0xf3,0xc3
187.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
188