Archive: CPUFeatures plug-in


CPUFeatures plug-in
Hi!

I recently created a plug-in to detect the CPU features (MMX, SSE, AVX, etc) at runtime. Since I didn't want to re-invent the wheel, I simply created a wrapper-library around the CPU detection code from x264 and then built the NSIS plug-in on top. This was mainly created for my own needs, but I though it might be useful for others too.

Note: Some CPU features are not currently detected, such as "3DNow!", because it probably was never relevant for x264. I maybe will hack that in at a later time, if anybody still needs that nowadays. Also there are some x264-specifc flags you can simply ignore...

Wiki page:
http://nsis.sourceforge.net/CPUFeatures_plug-in

Testing on different CPU's would be appreciated, so I have attached test app ;)


As a matter of fact I was in need of a 3DNow CPU just two weeks ago. Thanks for sharing!


Okay, I hacked in support for 3DNow! and 3DNow!Ex. And I also added a function to get the no. of CPU cores:
http://nsis.sourceforge.net/CPUFeatures_plug-in

(3DNow! support is completely untested, as my last AMD machine died a while ago)


Originally posted by LoRd_MuldeR
Okay, I hacked in support for 3DNow! and 3DNow!Ex. And I also added a function to get the no. of CPU cores:
http://nsis.sourceforge.net/CPUFeatures_plug-in

(3DNow! support is completely untested, as my last AMD machine died a while ago)
Okay, I ask a friend to test the new version on his AMD and 3DNow!(Ex) detection seems to work as expected.

This is going to be really helpful to some people, thank you.


You're welcome.

I just added another function to check for multiple features at once. Might simplify things a bit in some situations, I think.


If you feel crazy, you could maybe write wrapper macros for ${If} ${Supports3DNow!} or ${If} ${CPUSupports} "MMX" or something. But only if you feel crazy. :-)


Unfortunately I'm not enough crazy to understand LogicLib ;)

(I mean that I understand how to use it, actually I use it extensively, but I have not been able to follow its code)


!macro _CPUSupports _a _b _t _f
!insertmacro _LOGICLIB_TEMP
push `${_b}`
CPUFeatures::CheckCPUFeature /NOUNLOAD
Pop $_LOGICLIB_TEMP
!insertmacro _= $_LOGICLIB_TEMP `yes` `${_t}` `${_f}`
!macroend
!define CPUSupports `"" _CPUSupports`


Didn't test this, but it looks ok to me.

By the way, I see you're still using /NOUNLOAD. If you're still using the old plugin model, you might want to update it..

Originally posted by MSG
!macro _CPUSupports _a _b _t _f
!insertmacro _LOGICLIB_TEMP
push `${_b}`
CPUFeatures::CheckCPUFeature /NOUNLOAD
Pop $_LOGICLIB_TEMP
!insertmacro _= $_LOGICLIB_TEMP `yes` `${_t}` `${_f}`
!macroend
!define CPUSupports `"" _CPUSupports`


Didn't test this, but it looks ok to me.
Okay, thanks! I will give that code a try. And if it works, I will commit.

Originally posted by MSG
By the way, I see you're still using /NOUNLOAD. If you're still using the old plugin model, you might want to update it..
Actually I think I do use the new model (with callback function), so I might be able to simply drop the /NOUNLOAD.

Okay, I added the LogicLib support macros, as suggested.

But in the last line it must be _== instead of _=. That gave me quite a headache! ;)

New version here:
http://nsis.sourceforge.net/CPUFeatures_plug-in