/deps/openssl/asm/x86-win32-masm/x86cpuid.asm

https://gitlab.com/grayhamster/io.js · Assembly · 321 lines · 320 code · 0 blank · 1 comment · 0 complexity · eb0d15791b1927748d7ebf441242163c MD5 · raw file

  1. TITLE x86cpuid.asm
  2. IF @Version LT 800
  3. ECHO MASM version 8.00 or later is strongly recommended.
  4. ENDIF
  5. .686
  6. .MODEL FLAT
  7. OPTION DOTNAME
  8. IF @Version LT 800
  9. .text$ SEGMENT PAGE 'CODE'
  10. ELSE
  11. .text$ SEGMENT ALIGN(64) 'CODE'
  12. ENDIF
  13. ALIGN 16
  14. _OPENSSL_ia32_cpuid PROC PUBLIC
  15. $L_OPENSSL_ia32_cpuid_begin::
  16. push ebp
  17. push ebx
  18. push esi
  19. push edi
  20. xor edx,edx
  21. pushfd
  22. pop eax
  23. mov ecx,eax
  24. xor eax,2097152
  25. push eax
  26. popfd
  27. pushfd
  28. pop eax
  29. xor ecx,eax
  30. xor eax,eax
  31. bt ecx,21
  32. jnc $L000nocpuid
  33. cpuid
  34. mov edi,eax
  35. xor eax,eax
  36. cmp ebx,1970169159
  37. setne al
  38. mov ebp,eax
  39. cmp edx,1231384169
  40. setne al
  41. or ebp,eax
  42. cmp ecx,1818588270
  43. setne al
  44. or ebp,eax
  45. jz $L001intel
  46. cmp ebx,1752462657
  47. setne al
  48. mov esi,eax
  49. cmp edx,1769238117
  50. setne al
  51. or esi,eax
  52. cmp ecx,1145913699
  53. setne al
  54. or esi,eax
  55. jnz $L001intel
  56. mov eax,2147483648
  57. cpuid
  58. cmp eax,2147483649
  59. jb $L001intel
  60. mov esi,eax
  61. mov eax,2147483649
  62. cpuid
  63. or ebp,ecx
  64. and ebp,2049
  65. cmp esi,2147483656
  66. jb $L001intel
  67. mov eax,2147483656
  68. cpuid
  69. movzx esi,cl
  70. inc esi
  71. mov eax,1
  72. xor ecx,ecx
  73. cpuid
  74. bt edx,28
  75. jnc $L002generic
  76. shr ebx,16
  77. and ebx,255
  78. cmp ebx,esi
  79. ja $L002generic
  80. and edx,4026531839
  81. jmp $L002generic
  82. $L001intel:
  83. cmp edi,4
  84. mov edi,-1
  85. jb $L003nocacheinfo
  86. mov eax,4
  87. mov ecx,0
  88. cpuid
  89. mov edi,eax
  90. shr edi,14
  91. and edi,4095
  92. $L003nocacheinfo:
  93. mov eax,1
  94. xor ecx,ecx
  95. cpuid
  96. and edx,3220176895
  97. cmp ebp,0
  98. jne $L004notintel
  99. or edx,1073741824
  100. and ah,15
  101. cmp ah,15
  102. jne $L004notintel
  103. or edx,1048576
  104. $L004notintel:
  105. bt edx,28
  106. jnc $L002generic
  107. and edx,4026531839
  108. cmp edi,0
  109. je $L002generic
  110. or edx,268435456
  111. shr ebx,16
  112. cmp bl,1
  113. ja $L002generic
  114. and edx,4026531839
  115. $L002generic:
  116. and ebp,2048
  117. and ecx,4294965247
  118. mov esi,edx
  119. or ebp,ecx
  120. bt ecx,27
  121. jnc $L005clear_avx
  122. xor ecx,ecx
  123. DB 15,1,208
  124. and eax,6
  125. cmp eax,6
  126. je $L006done
  127. cmp eax,2
  128. je $L005clear_avx
  129. $L007clear_xmm:
  130. and ebp,4261412861
  131. and esi,4278190079
  132. $L005clear_avx:
  133. and ebp,4026525695
  134. $L006done:
  135. mov eax,esi
  136. mov edx,ebp
  137. $L000nocpuid:
  138. pop edi
  139. pop esi
  140. pop ebx
  141. pop ebp
  142. ret
  143. _OPENSSL_ia32_cpuid ENDP
  144. ;EXTERN _OPENSSL_ia32cap_P:NEAR
  145. ALIGN 16
  146. _OPENSSL_rdtsc PROC PUBLIC
  147. $L_OPENSSL_rdtsc_begin::
  148. xor eax,eax
  149. xor edx,edx
  150. lea ecx,DWORD PTR _OPENSSL_ia32cap_P
  151. bt DWORD PTR [ecx],4
  152. jnc $L008notsc
  153. rdtsc
  154. $L008notsc:
  155. ret
  156. _OPENSSL_rdtsc ENDP
  157. ALIGN 16
  158. _OPENSSL_instrument_halt PROC PUBLIC
  159. $L_OPENSSL_instrument_halt_begin::
  160. lea ecx,DWORD PTR _OPENSSL_ia32cap_P
  161. bt DWORD PTR [ecx],4
  162. jnc $L009nohalt
  163. DD 2421723150
  164. and eax,3
  165. jnz $L009nohalt
  166. pushfd
  167. pop eax
  168. bt eax,9
  169. jnc $L009nohalt
  170. rdtsc
  171. push edx
  172. push eax
  173. hlt
  174. rdtsc
  175. sub eax,DWORD PTR [esp]
  176. sbb edx,DWORD PTR 4[esp]
  177. add esp,8
  178. ret
  179. $L009nohalt:
  180. xor eax,eax
  181. xor edx,edx
  182. ret
  183. _OPENSSL_instrument_halt ENDP
  184. ALIGN 16
  185. _OPENSSL_far_spin PROC PUBLIC
  186. $L_OPENSSL_far_spin_begin::
  187. pushfd
  188. pop eax
  189. bt eax,9
  190. jnc $L010nospin
  191. mov eax,DWORD PTR 4[esp]
  192. mov ecx,DWORD PTR 8[esp]
  193. DD 2430111262
  194. xor eax,eax
  195. mov edx,DWORD PTR [ecx]
  196. jmp $L011spin
  197. ALIGN 16
  198. $L011spin:
  199. inc eax
  200. cmp edx,DWORD PTR [ecx]
  201. je $L011spin
  202. DD 529567888
  203. ret
  204. $L010nospin:
  205. xor eax,eax
  206. xor edx,edx
  207. ret
  208. _OPENSSL_far_spin ENDP
  209. ALIGN 16
  210. _OPENSSL_wipe_cpu PROC PUBLIC
  211. $L_OPENSSL_wipe_cpu_begin::
  212. xor eax,eax
  213. xor edx,edx
  214. lea ecx,DWORD PTR _OPENSSL_ia32cap_P
  215. mov ecx,DWORD PTR [ecx]
  216. bt DWORD PTR [ecx],1
  217. jnc $L012no_x87
  218. DD 4007259865,4007259865,4007259865,4007259865,2430851995
  219. $L012no_x87:
  220. lea eax,DWORD PTR 4[esp]
  221. ret
  222. _OPENSSL_wipe_cpu ENDP
  223. ALIGN 16
  224. _OPENSSL_atomic_add PROC PUBLIC
  225. $L_OPENSSL_atomic_add_begin::
  226. mov edx,DWORD PTR 4[esp]
  227. mov ecx,DWORD PTR 8[esp]
  228. push ebx
  229. nop
  230. mov eax,DWORD PTR [edx]
  231. $L013spin:
  232. lea ebx,DWORD PTR [ecx*1+eax]
  233. nop
  234. DD 447811568
  235. jne $L013spin
  236. mov eax,ebx
  237. pop ebx
  238. ret
  239. _OPENSSL_atomic_add ENDP
  240. ALIGN 16
  241. _OPENSSL_indirect_call PROC PUBLIC
  242. $L_OPENSSL_indirect_call_begin::
  243. push ebp
  244. mov ebp,esp
  245. sub esp,28
  246. mov ecx,DWORD PTR 12[ebp]
  247. mov DWORD PTR [esp],ecx
  248. mov edx,DWORD PTR 16[ebp]
  249. mov DWORD PTR 4[esp],edx
  250. mov eax,DWORD PTR 20[ebp]
  251. mov DWORD PTR 8[esp],eax
  252. mov eax,DWORD PTR 24[ebp]
  253. mov DWORD PTR 12[esp],eax
  254. mov eax,DWORD PTR 28[ebp]
  255. mov DWORD PTR 16[esp],eax
  256. mov eax,DWORD PTR 32[ebp]
  257. mov DWORD PTR 20[esp],eax
  258. mov eax,DWORD PTR 36[ebp]
  259. mov DWORD PTR 24[esp],eax
  260. call DWORD PTR 8[ebp]
  261. mov esp,ebp
  262. pop ebp
  263. ret
  264. _OPENSSL_indirect_call ENDP
  265. ALIGN 16
  266. _OPENSSL_cleanse PROC PUBLIC
  267. $L_OPENSSL_cleanse_begin::
  268. mov edx,DWORD PTR 4[esp]
  269. mov ecx,DWORD PTR 8[esp]
  270. xor eax,eax
  271. cmp ecx,7
  272. jae $L014lot
  273. cmp ecx,0
  274. je $L015ret
  275. $L016little:
  276. mov BYTE PTR [edx],al
  277. sub ecx,1
  278. lea edx,DWORD PTR 1[edx]
  279. jnz $L016little
  280. $L015ret:
  281. ret
  282. ALIGN 16
  283. $L014lot:
  284. test edx,3
  285. jz $L017aligned
  286. mov BYTE PTR [edx],al
  287. lea ecx,DWORD PTR [ecx-1]
  288. lea edx,DWORD PTR 1[edx]
  289. jmp $L014lot
  290. $L017aligned:
  291. mov DWORD PTR [edx],eax
  292. lea ecx,DWORD PTR [ecx-4]
  293. test ecx,-4
  294. lea edx,DWORD PTR 4[edx]
  295. jnz $L017aligned
  296. cmp ecx,0
  297. jne $L016little
  298. ret
  299. _OPENSSL_cleanse ENDP
  300. ALIGN 16
  301. _OPENSSL_ia32_rdrand PROC PUBLIC
  302. $L_OPENSSL_ia32_rdrand_begin::
  303. mov ecx,8
  304. $L018loop:
  305. DB 15,199,240
  306. jc $L019break
  307. loop $L018loop
  308. $L019break:
  309. cmp eax,0
  310. cmove eax,ecx
  311. ret
  312. _OPENSSL_ia32_rdrand ENDP
  313. .text$ ENDS
  314. .bss SEGMENT 'BSS'
  315. COMM _OPENSSL_ia32cap_P:QWORD
  316. .bss ENDS
  317. .CRT$XCU SEGMENT DWORD PUBLIC 'DATA'
  318. EXTERN _OPENSSL_cpuid_setup:NEAR
  319. DD _OPENSSL_cpuid_setup
  320. .CRT$XCU ENDS
  321. END