Home | History | Annotate | Download | only in crypto
      1 default	rel
      2 %define XMMWORD
      3 %define YMMWORD
      4 %define ZMMWORD
      5 section	.text code align=64
      6 
      7 
      8 global	OPENSSL_ia32_cpuid
      9 
     10 ALIGN	16
     11 OPENSSL_ia32_cpuid:
     12 	mov	QWORD[8+rsp],rdi	;WIN64 prologue
     13 	mov	QWORD[16+rsp],rsi
     14 	mov	rax,rsp
     15 $L$SEH_begin_OPENSSL_ia32_cpuid:
     16 	mov	rdi,rcx
     17 
     18 
     19 
     20 
     21 	mov	rdi,rcx
     22 	mov	r8,rbx
     23 
     24 	xor	eax,eax
     25 	mov	DWORD[8+rdi],eax
     26 	cpuid
     27 	mov	r11d,eax
     28 
     29 	xor	eax,eax
     30 	cmp	ebx,0x756e6547
     31 	setne	al
     32 	mov	r9d,eax
     33 	cmp	edx,0x49656e69
     34 	setne	al
     35 	or	r9d,eax
     36 	cmp	ecx,0x6c65746e
     37 	setne	al
     38 	or	r9d,eax
     39 	jz	NEAR $L$intel
     40 
     41 	cmp	ebx,0x68747541
     42 	setne	al
     43 	mov	r10d,eax
     44 	cmp	edx,0x69746E65
     45 	setne	al
     46 	or	r10d,eax
     47 	cmp	ecx,0x444D4163
     48 	setne	al
     49 	or	r10d,eax
     50 	jnz	NEAR $L$intel
     51 
     52 
     53 
     54 
     55 	mov	eax,0x80000000
     56 	cpuid
     57 
     58 
     59 	cmp	eax,0x80000001
     60 	jb	NEAR $L$intel
     61 	mov	r10d,eax
     62 	mov	eax,0x80000001
     63 	cpuid
     64 
     65 
     66 	or	r9d,ecx
     67 	and	r9d,0x00000801
     68 
     69 	cmp	r10d,0x80000008
     70 	jb	NEAR $L$intel
     71 
     72 	mov	eax,0x80000008
     73 	cpuid
     74 
     75 	movzx	r10,cl
     76 	inc	r10
     77 
     78 	mov	eax,1
     79 	cpuid
     80 
     81 	bt	edx,28
     82 	jnc	NEAR $L$generic
     83 	shr	ebx,16
     84 	cmp	bl,r10b
     85 	ja	NEAR $L$generic
     86 	and	edx,0xefffffff
     87 	jmp	NEAR $L$generic
     88 
     89 $L$intel:
     90 	cmp	r11d,4
     91 	mov	r10d,-1
     92 	jb	NEAR $L$nocacheinfo
     93 
     94 	mov	eax,4
     95 	mov	ecx,0
     96 	cpuid
     97 	mov	r10d,eax
     98 	shr	r10d,14
     99 	and	r10d,0xfff
    100 
    101 	cmp	r11d,7
    102 	jb	NEAR $L$nocacheinfo
    103 
    104 	mov	eax,7
    105 	xor	ecx,ecx
    106 	cpuid
    107 	mov	DWORD[8+rdi],ebx
    108 
    109 $L$nocacheinfo:
    110 	mov	eax,1
    111 	cpuid
    112 
    113 	and	edx,0xbfefffff
    114 	cmp	r9d,0
    115 	jne	NEAR $L$notintel
    116 	or	edx,0x40000000
    117 $L$notintel:
    118 	bt	edx,28
    119 	jnc	NEAR $L$generic
    120 	and	edx,0xefffffff
    121 	cmp	r10d,0
    122 	je	NEAR $L$generic
    123 
    124 	or	edx,0x10000000
    125 	shr	ebx,16
    126 	cmp	bl,1
    127 	ja	NEAR $L$generic
    128 	and	edx,0xefffffff
    129 $L$generic:
    130 	and	r9d,0x00000800
    131 	and	ecx,0xfffff7ff
    132 	or	r9d,ecx
    133 
    134 	mov	r10d,edx
    135 	bt	r9d,27
    136 	jnc	NEAR $L$clear_avx
    137 	xor	ecx,ecx
    138 DB	0x0f,0x01,0xd0
    139 	and	eax,6
    140 	cmp	eax,6
    141 	je	NEAR $L$done
    142 $L$clear_avx:
    143 	mov	eax,0xefffe7ff
    144 	and	r9d,eax
    145 	and	DWORD[8+rdi],0xffffffdf
    146 $L$done:
    147 	mov	DWORD[4+rdi],r9d
    148 	mov	DWORD[rdi],r10d
    149 	mov	rbx,r8
    150 	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
    151 	mov	rsi,QWORD[16+rsp]
    152 	DB	0F3h,0C3h		;repret
    153 $L$SEH_end_OPENSSL_ia32_cpuid:
    154 
    155