Created
January 25, 2015 17:24
-
-
Save cjhanks/970f294660dc41c70179 to your computer and use it in GitHub Desktop.
Found this,didn't want to lose it
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
# coding: utf-8 | |
""" analyze-x86.py | |
Copyright (C) 2010 Aleksey Frolov <atommixz@gmail.com> | |
This program is free software: you can redistribute it and/or modify | |
it under the terms of the GNU General Public License as published by | |
the Free Software Foundation, either version 3 of the License, or | |
(at your option) any later version. | |
This program is distributed in the hope that it will be useful, | |
but WITHOUT ANY WARRANTY; without even the implied warranty of | |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
GNU General Public License for more details. | |
You should have received a copy of the GNU General Public License | |
along with this program. If not, see <http://www.gnu.org/licenses/>. | |
""" | |
from sys import argv | |
from subprocess import Popen, PIPE | |
from io import StringIO | |
# in i86 | |
setCALL = set(b'call callq'.split()) | |
# in i86 | |
setNOP = set(b'nop nopl nopw'.split()) | |
# call nop | |
set86 = set(b'aaa aad aam aas adc add and cbw clc cld cli cmc cmp cmpsb \ | |
cmpsw cwd daa das dec div esc hlt idiv imul in inc int into iret \ | |
ja jae jb jbe jc jcxz je jg jge jl jle jna jnae jnb jnbe jnc jne jng \ | |
jnge jnl jnle jno jnp jns jnz jo jp jpe jpo js jz \ | |
jmp lahf lds lea les lock lodsb lodsw \ | |
loop loope loopne loopnz loopz \ | |
mov movsb movsw mul neg not or out pop popf push pushf rcl rcr \ | |
rep repe repne repnz repz \ | |
ret retn retf rol ror sahf sal sar sbb scasb scasw shl shr stc std sti stosb \ | |
stosw sub test wait xchg xlat xor'.split()) | |
set87 = set(b'f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcom fcomp fcompp \ | |
fdecstp fdisi fdiv fdivp fdivr fdivrp feni ffree fiadd ficom ficomp fidiv \ | |
fidivr fild fimul fincstp finit fist fistp fisub fisubr fld fld1 fldcw \ | |
fldenv fldenvw fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex \ | |
fndisi fneni fninit fnop fnsave fnsavew fnstcw fnstenv fnstenvw fnstsw fpatan \ | |
fprem fptan frndint frstor frstorw fsave fsavew fscale fsqrt fst fstcw fstenv \ | |
fstenvw fstp fstsw fsub fsubp fsubr fsubrp ftst fwait fxam fxch fxtract fyl2x \ | |
fyl2xp1'.split()) | |
set186 = set(b'bound enter ins leave outs popa pusha'.split()) | |
set286 = set(b'arpl clts lar lgdt lidt lldt lmsw loadall lsl ltr sgdt sidt \ | |
sldt smsw str verr verw'.split()) | |
set287 = set(b'fsetpm'.split()) | |
# *cmpsd movsd in (386, sse2). wtf? delete from here | |
set386 = set(b'bsf bsr bt btc btr bts cdq cwde insb insw insd \ | |
iretd iretf jcxz jecxz lfs lgs lss lodsd \ | |
loopw loopd loopew looped loopzw loopzd loopnew loopned loopnzw loopnzd \ | |
movsw movsx movzx popad popfd pushad pushfd scasd \ | |
seta setae setb setbe setc sete setg setge setl setle setna setnae setnb \ | |
setnbe setnc setne setng setnge setnl setnle setno setnp setns setnz seto \ | |
setp setpe setpo sets setz shld shrd stosb stosd stosw'.split()) | |
set387 = set(b'fcos fldenvd fnsaved fnstenvd fprem1 frstord fsaved fsin \ | |
fsincos fstenvd fucom fucomp fucompp'.split()) | |
set486 = set(b'bswap cmpxchg invd invlpg wbinvd xadd'.split()) | |
#rdpmc in (586 or 686)? | |
set586 = set(b'cmpxchg8b rdmsr rdtsc wrmsr rsm rdpmc'.split()) | |
# Pentium Pro. | |
# amdk6-2(syscall sysret) = i686(sysenter sysexit) | |
set686 = set(b'cmova cmovae cmovb cmovbe cmovc cmove cmovg cmovge cmovl \ | |
cmovle cmovna cmovnae cmovnb cmovnbe cmovnc cmovne cmovng cmovnge \ | |
cmovnl cmovnle cmovno cmovnp cmovns cmovnz cmovo cmovp cmovpe cmovpo \ | |
cmovs cmovz ud2 sysenter sysexit syscall sysret \ | |
fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcomi \ | |
fcomip fucomi fucomip'.split()) | |
setMMX = set(b'emms movd movq packssdw packsswb packuswb paddb \ | |
paddd paddsb paddsw paddusb paddusw paddw pand pandn pcmpeqb \ | |
pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pmaddwd pmulhw pmullw \ | |
por pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd \ | |
psubsb psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd \ | |
punpcklbw punpckldq punpcklwd pxor'.split()) | |
# remove 'pmulhrw' because it in 3DNow! too | |
setEMMX = set('paveb paddsiw pmagw pdistib psubsiw pmvzb pmvnzb \ | |
pmvlzb pmvgezb pmulhriw pmachriw'.split()) | |
setSSE = set(b'addps addss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss \ | |
cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss \ | |
movaps movhlps movhps movlhps movlps movmskps movntps movss movups mulps \ | |
mulss rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss \ | |
ucomiss unpckhps unpcklps \ | |
andnps andps orps pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub \ | |
pmovmskb pmulhuw psadbw pshufw xorps \ | |
prefetchnta prefetch0 prefetch1 prefetch2 ldmxcsr sfence movntq maskmovq \ | |
fxrstor fxsave'.split()) | |
setSSE2 = set(b'clflush lfence maskmovdqu mfence movntdq movnti movntpd pause \ | |
addpd addsd andnpd andpd cmppd cmpsd comisd cvtdq2pd \ | |
cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd \ | |
cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2dq cvttpd2pi cvttps2dq \ | |
cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd \ | |
movmskpd movsd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd \ | |
subsd ucomisd unpckhpd unpcklpd xorpd \ | |
movdq2q movdqa movdqu movq2dq paddq psubq pmuludq pshufhw pshuflw \ | |
pshufd pslldq psrldq punpckhqdq punpcklqdq'.split()) | |
setSSE3 = set(b'lddqu monitor mwait addsubpd addsubps fisttp fisttpl fisttpll \ | |
haddpd haddps hsubpd hsubps movddup movshdup movsldup'.split()) | |
setSSE41 = set(b'mpsadbw phminposuw pmulld pmuldq dpps dppd blendps \ | |
blendpd blendvps blendvpd pblendvb pblendw pminsb pmaxsb pminuw \ | |
pmaxuw pminud pmaxud pminsd pmaxsd roundps roundss roundpd roundsd \ | |
insertps pinsrb pinsrd pinsrq extractps pextrb pextrw pextrd pextrq \ | |
pmovsxbw pmovzxbw pmovsxbd pmovzxbd pmovsxbq pmovzxbq pmovsxwd \ | |
pmovzxwd pmovsxwq pmovzxwq pmovsxdq pmovzxdq ptest pcmpeqq packusdw \ | |
movntdqa'.split()) | |
setSSE42 = set(b'crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq \ | |
'.split()) | |
setSSE4a = set(b'lzcnt popcnt extrq insertq movntsd movntss'.split()) | |
setSSSE3 = set(b'psignw psignd psignb pshufb pmulhrsw pmaddubsw phsubw \ | |
phsubsw phsubd phaddw phaddsw phaddd palignr pabsw pabsd pabsb'.split()) | |
set3DNow = set(b'femms pavgusb pf2id pfacc pfadd pfcmpeq pfcmpge \ | |
pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt \ | |
pfsub pfsubr pi2fd pmulhrw prefetch prefetchw'.split()) | |
set3DNowExt = set(b'pf2iw pfnacc pfpnacc pi2fw pswapd pfrsqrtv pfrcpv'.split()) | |
setx86_64 = set(b'cmpxchg16b rdtscp'.split()) | |
setAMD_V = set(b'clgi skinit stgi vmload vmmcall vmrun vmsave'.split()) | |
setVT_x = set(b'vmptrld vmptrst vmclear vmread vmwrite vmcall vmlaunch \ | |
vmresume vmxoff vmxon'.split()) | |
setAES = set(b'''aesdec aesdeclast aesenc aesenclast aesimc | |
aeskeygenassist '''.split()) | |
setAVX = set(b'''vaddpd vaddps vaddsd vaddss | |
vaddsubpd vaddsubps vaesdec vaesdeclast vaesenc vaesenclast vaesimc | |
vaeskeygenassist vandnpd vandnps vandpd vandps vblendpd vblendps vblendvpd | |
vblendvps vbroadcastf128 vbroadcastsd vbroadcastss vcmpeq_ospd vcmpeq_osps | |
vcmpeq_ossd vcmpeq_osss vcmpeq_uqpd vcmpeq_uqps vcmpeq_uqsd vcmpeq_uqss | |
vcmpeq_uspd vcmpeq_usps vcmpeq_ussd vcmpeq_usss vcmpeqpd vcmpeqps vcmpeqsd | |
vcmpeqss vcmpfalse_ospd vcmpfalse_osps vcmpfalse_ossd vcmpfalse_osss | |
vcmpfalsepd vcmpfalseps vcmpfalsesd vcmpfalsess vcmpge_oqpd vcmpge_oqps | |
vcmpge_oqsd vcmpge_oqss vcmpgepd vcmpgeps vcmpgesd vcmpgess vcmpgt_oqpd | |
vcmpgt_oqps vcmpgt_oqsd vcmpgt_oqss vcmpgtpd vcmpgtps vcmpgtsd vcmpgtss | |
vcmple_oqpd vcmple_oqps vcmple_oqsd vcmple_oqss vcmplepd vcmpleps vcmplesd | |
vcmpless vcmplt_oqpd vcmplt_oqps vcmplt_oqsd vcmplt_oqss vcmpltpd vcmpltps | |
vcmpltsd vcmpltss vcmpneq_oqpd vcmpneq_oqps vcmpneq_oqsd vcmpneq_oqss | |
vcmpneq_ospd vcmpneq_osps vcmpneq_ossd vcmpneq_osss vcmpneq_uspd | |
vcmpneq_usps vcmpneq_ussd vcmpneq_usss vcmpneqpd vcmpneqps vcmpneqsd | |
vcmpneqss vcmpnge_uqpd vcmpnge_uqps vcmpnge_uqsd vcmpnge_uqss vcmpngepd | |
vcmpngeps vcmpngesd vcmpngess vcmpngt_uqpd vcmpngt_uqps vcmpngt_uqsd | |
vcmpngt_uqss vcmpngtpd vcmpngtps vcmpngtsd vcmpngtss vcmpnle_uqpd | |
vcmpnle_uqps vcmpnle_uqsd vcmpnle_uqss vcmpnlepd vcmpnleps vcmpnlesd | |
vcmpnless vcmpnlt_uqpd vcmpnlt_uqps vcmpnlt_uqsd vcmpnlt_uqss vcmpnltpd | |
vcmpnltps vcmpnltsd vcmpnltss vcmpord_spd vcmpord_sps vcmpord_ssd | |
vcmpord_sss vcmpordpd vcmpordps vcmpordsd vcmpordss vcmptrue_uspd | |
vcmptrue_usps vcmptrue_ussd vcmptrue_usss vcmptruepd vcmptrueps vcmptruesd | |
vcmptruess vcmpunord_spd vcmpunord_sps vcmpunord_ssd vcmpunord_sss | |
vcmpunordpd vcmpunordps vcmpunordsd vcmpunordss vcomisd vcomiss vcvtdq2pd | |
vcvtdq2ps vcvtpd2dq vcvtpd2dqx vcvtpd2dqy vcvtpd2ps vcvtpd2psx vcvtpd2psy | |
vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2sdl vcvtsi2ss | |
vcvtsi2ssl vcvtss2sd vcvtss2si vcvttpd2dq vcvttpd2dqx vcvttpd2dqy | |
vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps | |
vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 | |
vinsertps vlddqu vldmxcsr vmaskmovdqu vmaskmovpd vmaskmovps vmaxpd | |
vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd | |
vmovddup vmovdqa vmovdqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps | |
vmovmskpd vmovmskps vmovntdq vmovntdqa vmovntpd vmovntps vmovq vmovsd | |
vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd | |
vmulss vorpd vorps vpabsb vpabsd vpabsw vpackssdw vpacksswb vpackusdw | |
vpackuswb vpaddb vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpaddw | |
vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpclmulhqhqdq | |
vpclmulhqlqdq vpclmullqhqdq vpclmullqlqdq vpclmulqdq vpcmpeqb vpcmpeqd | |
vpcmpeqq vpcmpeqw vpcmpestri vpcmpestrm vpcmpgtb vpcmpgtd vpcmpgtq | |
vpcmpgtw vpcmpistri vpcmpistrm vperm2f128 vpermilpd vpermilps vpextrb | |
vpextrd vpextrw vphaddd vphaddsw vphaddw vphminposuw vphsubd vphsubsw | |
vphsubw vpinsrb vpinsrw vpmaddubsw vpmaddwd vpmaxsb vpmaxsd vpmaxsw | |
vpmaxub vpmaxud vpmaxuw vpminsb vpminsd vpminsw vpminub vpminud vpminuw | |
vpmovmskb vpmovsxbd vpmovsxbq vpmovsxbw vpmovsxdq vpmovsxwd vpmovsxwq | |
vpmovzxbd vpmovzxbq vpmovzxbw vpmovzxdq vpmovzxwd vpmovzxwq vpmuldq | |
vpmulhrsw vpmulhuw vpmulhw vpmulld vpmullw vpmuludq vpor vpsadbw vpshufb | |
vpshufd vpshufhw vpshuflw vpsignb vpsignd vpsignw vpslld vpslldq vpsllq | |
vpsllw vpsrad vpsraw vpsrld vpsrldq vpsrlq vpsrlw vpsubb vpsubd vpsubq | |
vpsubsb vpsubsw vpsubusb vpsubusw vpsubw vptest vpunpckhbw vpunpckhdq | |
vpunpckhqdq vpunpckhwd vpunpcklbw vpunpckldq vpunpcklqdq vpunpcklwd | |
vpxor vrcpps vrcpss vroundpd vroundps vroundsd vroundss vrsqrtps vrsqrtss | |
vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps | |
vsubsd vsubss vtestpd vtestps vucomisd vucomiss vunpckhpd vunpckhps | |
vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper'''.split()) | |
count=cpuid=nop=call= \ | |
i86=i87=i186=i286=i287=i386=i387=i486=i586=i686= \ | |
iMMX=iEMMX= \ | |
iSSE=iSSE2=iSSE3=iSSSE3=iSSE41=iSSE42=iSSE4a= \ | |
i3DNow=i3DNowExt= \ | |
ix86_64= \ | |
iVT_x=iAMD_V= \ | |
iAES=iAVX=0 | |
iUNKNOWN = [] | |
p1 = Popen(['objdump', '-d', argv[1]], stdout=PIPE) | |
p2 = Popen(['cut', '-f3'], stdin=p1.stdout, stdout=PIPE) | |
p3 = Popen(['cut', '-d ', '-f1'],stdin=p2.stdout, stdout=PIPE) | |
cStr = p3.communicate()[0] | |
cStr = cStr.split() | |
a_z = set(range(ord('a'), ord('z') + 1)) | |
for i in range(0, len(cStr)): | |
if cStr[i][0] in a_z: | |
count += 1 | |
if cStr[i] == b'cpuid': cpuid += 1; i586 += 1; continue | |
if cStr[i] in setNOP: nop += 1; i86 += 1; continue | |
if cStr[i] in setCALL: call += 1; i86 += 1; continue | |
if cStr[i] in set86: i86 += 1; continue | |
if cStr[i] in set87: i87 += 1; continue | |
if cStr[i] in set186: i186 += 1; continue | |
if cStr[i] in set286: i286 += 1; continue | |
if cStr[i] in set287: i287 += 1; continue | |
if cStr[i] in set386: i386 += 1; continue | |
if cStr[i] in set486: i486 += 1; continue | |
if cStr[i] in set586: i586 += 1; continue | |
if cStr[i] in set686: i686 += 1; continue | |
if cStr[i] in setMMX: iMMX += 1; continue | |
if cStr[i] in setEMMX: iEMMX += 1; continue | |
if cStr[i] in setSSE: iSSE += 1; continue | |
if cStr[i] in setSSE2: iSSE2 += 1; continue | |
if cStr[i] in setSSE3: iSSE3 += 1; continue | |
if cStr[i] in setSSE41: iSSE41 += 1; continue | |
if cStr[i] in setSSE42: iSSE42 += 1; continue | |
if cStr[i] in setSSE4a: iSSE4a += 1; continue | |
if cStr[i] in setSSSE3: iSSSE3 += 1; continue | |
if cStr[i] in set3DNow: i3DNow += 1; continue | |
if cStr[i] in set3DNowExt: i3DNowExt += 1; continue | |
if cStr[i] in setx86_64: ix86_64 += 1; continue | |
if cStr[i] in setVT_x: iVT_x += 1; continue | |
if cStr[i] in setAMD_V: iAMD_V += 1; continue | |
if cStr[i] in setAES: iAES += 1; continue | |
if cStr[i] in setAVX: iAVX += 1; continue | |
if cStr[i] not in iUNKNOWN: iUNKNOWN.append(cStr[i]) | |
print ('cpuid:\t%i\tnop: %i\tcall: %i' % (cpuid, nop, call)) | |
if i86: print('i86\t%i' % i86) | |
if i87: print('i87\t%i' % i87) | |
if i186: print('i186\t%i' % i186) | |
if i286: print('i286\t%i' % i286) | |
if i287: print('i287\t%i' % i287) | |
if i386: print('i386\t%i' % i386) | |
if i387: print('i387\t%i' % i387) | |
if i486: print('i486\t%i' % i486) | |
if i586: print('i586\t%i' % i586) | |
if i686: print('i686\t%i' % i686) | |
if iMMX: print('MMX\t%i' % iMMX) | |
if iEMMX: print('EMMX\t%i' % iEMMX) | |
if iSSE: print('SSE\t%i' % iSSE) | |
if iSSE2: print('SSE2\t%i' % iSSE2) | |
if iSSE3: print('SSE3\t%i' % iSSE3) | |
if iSSE41: print('SSE4.1\t%i' % iSSE41) | |
if iSSE42: print('SSE4.2\t%i' % iSSE42) | |
if iSSE4a: print('SSE4a\t%i' % iSSE4a) | |
if iSSSE3: print('SSSE3\t%i' % iSSSE3) | |
if i3DNow: print('3DNow!\t%i' % i3DNow) | |
if i3DNowExt: print('3DNow+\t%i' % i3DNowExt) | |
if ix86_64: print('x86-64\t%i' % ix86_64) | |
if iVT_x: print('VT-x\t%i' % iVT_x) | |
if iAMD_V: print('AMD-V\t%i' % iAMD_V) | |
if iAES: print('AES\t%i' % iAES) | |
if iAVX: print('AVX\t%i' % iAVX) | |
print('\nall\t%i' % count) | |
if iUNKNOWN: | |
print('unknown\t%i' % len(iUNKNOWN)) | |
iUNKNOWN.sort() | |
for i in range(0, len(iUNKNOWN)): | |
print(iUNKNOWN[i].decode(), end=' ') | |
print('') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment