Skip to content

Instantly share code, notes, and snippets.

@cjhanks
Created January 25, 2015 17:24
Show Gist options
  • Save cjhanks/970f294660dc41c70179 to your computer and use it in GitHub Desktop.
Save cjhanks/970f294660dc41c70179 to your computer and use it in GitHub Desktop.
Found this,didn't want to lose it
#!/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