On Thu, 15 Nov 2012, Zoltán Herczeg wrote:
Hi Daniel,
Could you split the patch into two:
Okay, I'll work on that.
1) Older solaris support
I think an #if based soultion could work here:
#if defined(old_solaris)
asm for old solaris
#else
original code
#endif
Only problem is, it's not clear how the assembly should refer to local
variables ("from" and "to"). I was reviewing this article...
http://dsc.sun.com/solaris/articles/x86_assembly_lang.html
...which describes different approaches, and their caveats (e.g.
optimization). Search for occurrences of "local" in the text to find these
quickly.
Or it would be even better, if you could find a system call for cache
flush, and get rid the assembly code in the old solaris case.
I looked and looked, but Solaris does not appear to provide this.
This may be supported there:
http://man-wiki.net/index.php/2:cacheflush
"This system call is only available on MIPS based systems." :-(
(The typos could be added to this patch, it should be the smaller)
Got it.
2) Intel C compiler
The cpuid on 64 bit should be look like this:
#if defined (__MSC_VER)
#if _MSC_VER >= 1400
__cpuid();
#else
#error An implementation of CPUID is required.
#endif
#elif GCC, IntelC etc.
AT&T syntax with __asm__
#endif
Why not provide an Intel-syntax equivalent of the AT&T assembly instead of
an error? There may be other 64-bit compilers that aren't handled by the
above cases.
The ABI is the Application Binary Interface. It tells how a binary
function calls another. Which registers are saved, which are not, how
the arguments are passed (these are called calling conventions).
On x86/32 many calling conventions are used. stdcall, ccall, fastcall.
SLJIT supports two types: the stdcall and the GCC style fastcall (when
SLJIT_X86_32_FASTCALL is defined), which is also used by msvc. E.g.
borland C compiler uses another type of fastcall, but it supports MS
style fast calls, so SLJIT_CALL is defined as __msfastcall, and
SLJIT_X86_32_FASTCALL is defined as 1. (Fast call is usually faster than
standard call, since it passes the first two arguments in ecx:edx).
Thus, getting rid of __stdcall just cause crashes. You need to find
which calling types are supported by ICC, and use either the standard or
the GCC style fastcall type.
ICC supports at least cdecl and stdcall, according to
http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011Update/compiler_c/bldaps_cls/common/bldaps_calling_conv.htm
In what instances should __stdcall be used? At the very least, this
keyword appears to be Win32-specific, so it should probably not appear
outside the defined(_WIN32) cpp case.
Anyway, I still get segfaults on 32-bit (x86) Linux with the Intel
compiler whether I use stdcall or cdecl (but not as badly as fastcall).
Would it help if I provided you with built code from this compiler, so you
can see exactly what it's putting out?
--Daniel
--
Daniel Richard G. || [email protected] || Software Developer
Teragram Linguistic Technologies (a division of SAS)
http://www.teragram.com/
--
## List details at https://lists.exim.org/mailman/listinfo/pcre-dev