Skip to content
⌘ NSIS Forum Archive

CPUFeatures plug-in

11 posts

LoRd_MuldeR#

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:


Testing on different CPU's would be appreciated, so I have attached test app 😉
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:


(3DNow! support is completely untested, as my last AMD machine died a while ago)
LoRd_MuldeR#
Originally Posted by LoRd_MuldeR View Post
Okay, I hacked in support for 3DNow! and 3DNow!Ex. And I also added a function to get the no. of CPU cores:


(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.
LoRd_MuldeR#
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.
MSG#
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. :-)
LoRd_MuldeR#
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)
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.

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..
LoRd_MuldeR#
Originally Posted by MSG View Post
!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 View Post
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.
LoRd_MuldeR#
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: