This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: revised x86_64-pc-mingw32 patch
- From: Kai Tietz <Kai dot Tietz at onevision dot com>
- To: Richard Henderson <rth at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Tue, 27 Mar 2007 17:59:01 +0200
- Subject: Re: revised x86_64-pc-mingw32 patch
Richard Henderson <rth@redhat.com> wrote on 27.03.2007 16:56:40:
> On Tue, Mar 27, 2007 at 12:50:06PM +0200, Kai Tietz wrote:
> > I tried your patch with a mingw64 runtime and had especially problems
on
> > floatings. Therefore I suggest the following code as replacement for
> > yours. I built as cross on i386-linux and i386-cygwin and it seems to
work
> > fine.
>
> You need to tell me *what* problems you had.
Problem one the @GOTPCREL issue as I wrote
>> The use of pic seems to be producing problems by the @GOTPCREL prefix,
which the coff version of gas does not understand. But
>> AFAIS we need not producing pic code, because coff (PE) is by
architecture position independent. Just the patch in i386.md is
>> necessary for having memonics with size to be relocated by PE loader.
Second one is the floating point issue while compiling libgcc as I wrote.
>> The register calling convention is may easier than my suggested code
looks like. May this can be eased dramatically, but this
>> adopted code of existing x86_64 ABI code solved all the floating point
failures I had.
> I certainly cannot accept your wholesale copying of the Unix
> x86_64 code, which is *vastly* different to the MS ABI.
AFAIK, uses the x86_64 abi of MS the following general rules:
a) Any function uses 4 general registers [RCX,RDX,R8,R9] (and do
stack-safe too for them) as fast call.
b) Any argument passed not having the size 1,2,4,8 have to be
passed by memory reference.
c) There is no splitting of larger values to multiple registers.
d) The x87 register set is not used for passing.
e) Floating point arguments are using XMM0L,XMM1L,XMM2L,XMM3L
registers for fast call.
For va_arg sake they are shadowed in the 4 general registers
and shadow stack is reserved.
f) Any parameter after the 4th is passed on stack.
AFAIK, MS does not have vector-types as a non structure type, nor does it
have a TFmode "long double" type. My idea was just to provide these
non-interferring types to gcc, to have faster code and easier support for
allready existing gcc libraries. By the win32 and mingw32 header-set
(beside of the non-MS complex and extended-doubles allready *very* gcc
specific) no method passes a structure or a type bigger than 1,2,4, or 8
bytes size.
Therefore I did not made out a good reason to fullfil the points b) and
c). But may you can give me a hint, where this is so important ?
BTW what you call unix x86_64 code is more a reflection of the AMD x86_64
abi from http://www.x86-64.org AFAICS.
Regards,
i.A. Kai Tietz
------------------------------------------------------------------------------------------
OneVision Software Entwicklungs GmbH & Co. KG
Dr.-Leo-Ritter-StraÃe 9 - 93049 Regensburg
Tel: +49.(0)941.78004.0 - Fax: +49.(0)941.78004.489 - www.OneVision.com
Commerzbank Regensburg - BLZ 750 400 62 - Konto 6011050
Handelsregister: HRA 6744, Amtsgericht Regensburg
KomplementÃrin: OneVision Software Entwicklungs Verwaltungs GmbH
Dr.-Leo-Ritter-StraÃe 9 â 93049 Regensburg
Handelsregister: HRB 8932, Amtsgericht Regensburg - GeschÃftsfÃhrer:
Ulrike DÃhler, Manuela Kluger