x86_64cpuid.S revision 325337
1/* $FreeBSD: stable/11/secure/lib/libcrypto/amd64/x86_64cpuid.S 325337 2017-11-02 18:30:41Z jkim $ */ 2/* Do not modify. This file is auto-generated from x86_64cpuid.pl. */ 3 4.hidden OPENSSL_cpuid_setup 5.section .init 6 call OPENSSL_cpuid_setup 7 8.hidden OPENSSL_ia32cap_P 9.comm OPENSSL_ia32cap_P,16,4 10 11.text 12 13.globl OPENSSL_atomic_add 14.type OPENSSL_atomic_add,@function 15.align 16 16OPENSSL_atomic_add: 17 movl (%rdi),%eax 18.Lspin: leaq (%rsi,%rax,1),%r8 19.byte 0xf0 20 cmpxchgl %r8d,(%rdi) 21 jne .Lspin 22 movl %r8d,%eax 23.byte 0x48,0x98 24 .byte 0xf3,0xc3 25.size OPENSSL_atomic_add,.-OPENSSL_atomic_add 26 27.globl OPENSSL_rdtsc 28.type OPENSSL_rdtsc,@function 29.align 16 30OPENSSL_rdtsc: 31 rdtsc 32 shlq $32,%rdx 33 orq %rdx,%rax 34 .byte 0xf3,0xc3 35.size OPENSSL_rdtsc,.-OPENSSL_rdtsc 36 37.globl OPENSSL_ia32_cpuid 38.type OPENSSL_ia32_cpuid,@function 39.align 16 40OPENSSL_ia32_cpuid: 41 movq %rbx,%r8 42 43 xorl %eax,%eax 44 movl %eax,8(%rdi) 45 cpuid 46 movl %eax,%r11d 47 48 xorl %eax,%eax 49 cmpl $0x756e6547,%ebx 50 setne %al 51 movl %eax,%r9d 52 cmpl $0x49656e69,%edx 53 setne %al 54 orl %eax,%r9d 55 cmpl $0x6c65746e,%ecx 56 setne %al 57 orl %eax,%r9d 58 jz .Lintel 59 60 cmpl $0x68747541,%ebx 61 setne %al 62 movl %eax,%r10d 63 cmpl $0x69746E65,%edx 64 setne %al 65 orl %eax,%r10d 66 cmpl $0x444D4163,%ecx 67 setne %al 68 orl %eax,%r10d 69 jnz .Lintel 70 71 72 movl $0x80000000,%eax 73 cpuid 74 cmpl $0x80000001,%eax 75 jb .Lintel 76 movl %eax,%r10d 77 movl $0x80000001,%eax 78 cpuid 79 orl %ecx,%r9d 80 andl $0x00000801,%r9d 81 82 cmpl $0x80000008,%r10d 83 jb .Lintel 84 85 movl $0x80000008,%eax 86 cpuid 87 movzbq %cl,%r10 88 incq %r10 89 90 movl $1,%eax 91 cpuid 92 btl $28,%edx 93 jnc .Lgeneric 94 shrl $16,%ebx 95 cmpb %r10b,%bl 96 ja .Lgeneric 97 andl $0xefffffff,%edx 98 jmp .Lgeneric 99 100.Lintel: 101 cmpl $4,%r11d 102 movl $-1,%r10d 103 jb .Lnocacheinfo 104 105 movl $4,%eax 106 movl $0,%ecx 107 cpuid 108 movl %eax,%r10d 109 shrl $14,%r10d 110 andl $0xfff,%r10d 111 112.Lnocacheinfo: 113 movl $1,%eax 114 cpuid 115 andl $0xbfefffff,%edx 116 cmpl $0,%r9d 117 jne .Lnotintel 118 orl $0x40000000,%edx 119 andb $15,%ah 120 cmpb $15,%ah 121 jne .LnotP4 122 orl $0x00100000,%edx 123.LnotP4: 124 cmpb $6,%ah 125 jne .Lnotintel 126 andl $0x0fff0ff0,%eax 127 cmpl $0x00050670,%eax 128 je .Lknights 129 cmpl $0x00080650,%eax 130 jne .Lnotintel 131.Lknights: 132 andl $0xfbffffff,%ecx 133 134.Lnotintel: 135 btl $28,%edx 136 jnc .Lgeneric 137 andl $0xefffffff,%edx 138 cmpl $0,%r10d 139 je .Lgeneric 140 141 orl $0x10000000,%edx 142 shrl $16,%ebx 143 cmpb $1,%bl 144 ja .Lgeneric 145 andl $0xefffffff,%edx 146.Lgeneric: 147 andl $0x00000800,%r9d 148 andl $0xfffff7ff,%ecx 149 orl %ecx,%r9d 150 151 movl %edx,%r10d 152 153 cmpl $7,%r11d 154 jb .Lno_extended_info 155 movl $7,%eax 156 xorl %ecx,%ecx 157 cpuid 158 btl $26,%r9d 159 jc .Lnotknights 160 andl $0xfff7ffff,%ebx 161.Lnotknights: 162 movl %ebx,8(%rdi) 163.Lno_extended_info: 164 165 btl $27,%r9d 166 jnc .Lclear_avx 167 xorl %ecx,%ecx 168.byte 0x0f,0x01,0xd0 169 andl $6,%eax 170 cmpl $6,%eax 171 je .Ldone 172.Lclear_avx: 173 movl $0xefffe7ff,%eax 174 andl %eax,%r9d 175 andl $0xffffffdf,8(%rdi) 176.Ldone: 177 shlq $32,%r9 178 movl %r10d,%eax 179 movq %r8,%rbx 180 orq %r9,%rax 181 .byte 0xf3,0xc3 182.size OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid 183 184.globl OPENSSL_cleanse 185.type OPENSSL_cleanse,@function 186.align 16 187OPENSSL_cleanse: 188 xorq %rax,%rax 189 cmpq $15,%rsi 190 jae .Lot 191 cmpq $0,%rsi 192 je .Lret 193.Little: 194 movb %al,(%rdi) 195 subq $1,%rsi 196 leaq 1(%rdi),%rdi 197 jnz .Little 198.Lret: 199 .byte 0xf3,0xc3 200.align 16 201.Lot: 202 testq $7,%rdi 203 jz .Laligned 204 movb %al,(%rdi) 205 leaq -1(%rsi),%rsi 206 leaq 1(%rdi),%rdi 207 jmp .Lot 208.Laligned: 209 movq %rax,(%rdi) 210 leaq -8(%rsi),%rsi 211 testq $-8,%rsi 212 leaq 8(%rdi),%rdi 213 jnz .Laligned 214 cmpq $0,%rsi 215 jne .Little 216 .byte 0xf3,0xc3 217.size OPENSSL_cleanse,.-OPENSSL_cleanse 218.globl OPENSSL_wipe_cpu 219.type OPENSSL_wipe_cpu,@function 220.align 16 221OPENSSL_wipe_cpu: 222 pxor %xmm0,%xmm0 223 pxor %xmm1,%xmm1 224 pxor %xmm2,%xmm2 225 pxor %xmm3,%xmm3 226 pxor %xmm4,%xmm4 227 pxor %xmm5,%xmm5 228 pxor %xmm6,%xmm6 229 pxor %xmm7,%xmm7 230 pxor %xmm8,%xmm8 231 pxor %xmm9,%xmm9 232 pxor %xmm10,%xmm10 233 pxor %xmm11,%xmm11 234 pxor %xmm12,%xmm12 235 pxor %xmm13,%xmm13 236 pxor %xmm14,%xmm14 237 pxor %xmm15,%xmm15 238 xorq %rcx,%rcx 239 xorq %rdx,%rdx 240 xorq %rsi,%rsi 241 xorq %rdi,%rdi 242 xorq %r8,%r8 243 xorq %r9,%r9 244 xorq %r10,%r10 245 xorq %r11,%r11 246 leaq 8(%rsp),%rax 247 .byte 0xf3,0xc3 248.size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu 249.globl OPENSSL_ia32_rdrand 250.type OPENSSL_ia32_rdrand,@function 251.align 16 252OPENSSL_ia32_rdrand: 253 movl $8,%ecx 254.Loop_rdrand: 255.byte 72,15,199,240 256 jc .Lbreak_rdrand 257 loop .Loop_rdrand 258.Lbreak_rdrand: 259 cmpq $0,%rax 260 cmoveq %rcx,%rax 261 .byte 0xf3,0xc3 262.size OPENSSL_ia32_rdrand,.-OPENSSL_ia32_rdrand 263 264.globl OPENSSL_ia32_rdseed 265.type OPENSSL_ia32_rdseed,@function 266.align 16 267OPENSSL_ia32_rdseed: 268 movl $8,%ecx 269.Loop_rdseed: 270.byte 72,15,199,248 271 jc .Lbreak_rdseed 272 loop .Loop_rdseed 273.Lbreak_rdseed: 274 cmpq $0,%rax 275 cmoveq %rcx,%rax 276 .byte 0xf3,0xc3 277.size OPENSSL_ia32_rdseed,.-OPENSSL_ia32_rdseed 278