User Manual
(the manual describes build 1110xx)
Hex-Rays Decompiler - Support for intrinsic functions
The current release of the decompiler supports instrinsic functions.
The instructions that can not be directly mapped to high level languages
very often can be represented by special
intrinsic functions.
All Microsoft and Intel simple instrinsic functions up to SSE4a are supported, with some exceptions.
While everything works automatically, the following points are worth noting:
- SSE intrinsic functions require IDA v5.6 or higher. Older versions of
IDA do not have the necessary functionality and register definitions.
- Some intrinsic functions work with XMM constant values (16 bytes long).
Modern compiler do not accept 16-byte constants yet but the decompiler may
generate them when needed.
- Sometimes it is better to represent SSE code using inline assembly
rather than with intrinsic functions. If the decompiler detects SSE instructions
in the current function, it adds a one more item to the popup menu. This item
allows the user to enable or disable SSE intrinsic functions for the whole database.
This setting is remembered in the database. It can also be modified in the
configuration file for new databases.
- The decompiler knows about all MMX/XMM built-in types. If the current
database does not define these types, they are automatically added to the
local types as soon as a SSE instruction is decompiled.
- Scalar SSE instructions are never converted to intrinsic functions.
Instead, they are directly mapped to floating point operations. This usually
produces much better output, especially for Mac OS X binaries.
- The scalar SSE instructions that can not be mapped into simple floating
point operations (like
sqrtss) are mapped into simple functions from
math.h.
- The decompiler uses intrinsic function names as defined by Microsoft and Intel.
- The decompiler does not track the state of the x87 and mmx registers.
It is assumed that the compiler generated code correctly handles transitions
between x87 and mmx registers.
- Some intrinsic functions are not supported because of their prototype. For
example, the
__cpuid(int a[4], int b) function is not handled because it requires an array of 4 integers.
We assume that most cpuid instructions will be used without any arrays, so adding
such an intrinsic function will obscure things rather than to make the code more readable.
- Feel free to report all anomalies and problems with intrinsic functions
using the Send database command. This will help
us to improve the decompiler and make it more robust. Thank you!
See also: Failures and troubleshooting