2
$Id: paramgr.pas,v 1.74 2004/04/18 15:22:24 florian Exp $
3
Copyright (c) 2002 by Florian Klaempfl
5
Generic calling convention handling
7
This program is free software; you can redistribute it and/or modify
8
it under the terms of the GNU General Public License as published by
9
the Free Software Foundation; either version 2 of the License, or
10
(at your option) any later version.
12
This program is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
GNU General Public License for more details.
17
You should have received a copy of the GNU General Public License
18
along with this program; if not, write to the Free Software
19
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
****************************************************************************
22
{# Parameter passing manager. Used to manage how
23
parameters are passed to routines.
35
symconst,symtype,symdef;
42
tvarargspara = class(tlinkedlist)
43
varargsinfo : set of tvarargsinfo;
46
{# This class defines some methods to take care of routine
47
parameters. It should be overriden for each new processor
50
{# Returns true if the return value is actually a parameter
53
function ret_in_param(def : tdef;calloption : tproccalloption) : boolean;virtual;
55
function push_high_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;virtual;
57
{ Returns true if a parameter is too large to copy and only
60
function push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;virtual;
61
{ return the size of a push }
62
function push_size(varspez:tvarspez;def : tdef;calloption : tproccalloption) : longint;
63
{ Returns true if a parameter needs to be copied on the stack, this
64
is required for cdecl procedures
66
function copy_value_on_stack(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;virtual;
67
{# Returns a structure giving the information on
68
the storage of the parameter (which must be
69
an integer parameter). This is only used when calling
70
internal routines directly, where all parameters must
73
In case the location is a register, this register is allocated.
74
Call freeintparaloc() after the call to free the locations again.
75
Default implementation: don't do anything at all (in case you don't
76
use register parameter passing)
78
@param(list Current assembler list)
79
@param(nr Parameter number of routine, starting from 1)
81
function get_para_align(calloption : tproccalloption):byte;virtual;
82
function get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;virtual;
83
function get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;virtual;
84
function get_volatile_registers_flags(calloption : tproccalloption):tcpuregisterset;virtual;
85
function get_volatile_registers_mm(calloption : tproccalloption):tcpuregisterset;virtual;
86
function getintparaloc(calloption : tproccalloption; nr : longint) : tparalocation;virtual;abstract;
88
{# allocate a parameter location created with create_paraloc_info
90
@param(list Current assembler list)
91
@param(loc Parameter location)
93
procedure allocparaloc(list: taasmoutput; const loc: tparalocation); virtual;
95
{# free a parameter location allocated with allocparaloc
97
@param(list Current assembler list)
98
@param(loc Parameter location)
100
procedure freeparaloc(list: taasmoutput; const loc: tparalocation); virtual;
102
{ This is used to populate the location information on all parameters
103
for the routine as seen in either the caller or the callee. It returns
104
the size allocated on the stack
106
function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;virtual;abstract;
108
{ This is used to populate the location information on all parameters
109
for the routine when it is being inlined. It returns
110
the size allocated on the stack
112
function create_inline_paraloc_info(p : tabstractprocdef):longint;virtual;
114
{ This is used to populate the location information on all parameters
115
for the routine that are passed as varargs. It returns
116
the size allocated on the stack (including the normal parameters)
118
function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargspara):longint;virtual;abstract;
120
{ Return the location of the low and high part of a 64bit parameter }
121
procedure splitparaloc64(const locpara:tparalocation;var loclopara,lochipara:tparalocation);virtual;
123
procedure alloctempregs(list: taasmoutput;var locpara:tparalocation);virtual;
124
procedure alloctempparaloc(list: taasmoutput;calloption : tproccalloption;paraitem : tparaitem;var locpara:tparalocation);virtual;
126
function parseparaloc(paraitem : tparaitem;const s : string) : boolean;virtual;abstract;
131
paramanager : tparamanager;
141
{ true if uses a parameter as return value }
142
function tparamanager.ret_in_param(def : tdef;calloption : tproccalloption) : boolean;
144
ret_in_param:=(def.deftype in [arraydef,recorddef]) or
145
((def.deftype=stringdef) and (tstringdef(def).string_typ in [st_shortstring,st_longstring])) or
146
((def.deftype=procvardef) and (po_methodpointer in tprocvardef(def).procoptions)) or
147
((def.deftype=objectdef) and is_object(def)) or
148
(def.deftype=variantdef) or
149
((def.deftype=setdef) and (tsetdef(def).settype<>smallset));
153
function tparamanager.push_high_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;
155
push_high_param:=not(calloption in [pocall_cdecl,pocall_cppdecl]) and
157
is_open_array(def) or
158
is_open_string(def) or
159
is_array_of_const(def)
164
{ true if a parameter is too large to copy and only the address is pushed }
165
function tparamanager.push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;
168
{ var,out always require address }
169
if varspez in [vs_var,vs_out] then
174
{ Only vs_const, vs_value here }
180
result:=not(calloption in [pocall_cdecl,pocall_cppdecl]) and (def.size>pointer_size);
183
if (calloption in [pocall_cdecl,pocall_cppdecl]) then
185
{ array of const values are pushed on the stack }
186
result:=not is_array_of_const(def);
191
(tarraydef(def).highrange>=tarraydef(def).lowrange) and
192
(def.size>pointer_size)
194
is_open_array(def) or
195
is_array_of_const(def) or
196
is_array_constructor(def);
200
result:=is_object(def);
202
result:=not(calloption in [pocall_cdecl,pocall_cppdecl]) and (tstringdef(def).string_typ in [st_shortstring,st_longstring]);
204
result:=not(calloption in [pocall_cdecl,pocall_cppdecl]) and (po_methodpointer in tprocvardef(def).procoptions);
206
result:=not(calloption in [pocall_cdecl,pocall_cppdecl]) and (tsetdef(def).settype<>smallset);
211
{ true if a parameter is too large to push and needs a concatcopy to get the value on the stack }
212
function tparamanager.copy_value_on_stack(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;
214
copy_value_on_stack:=false;
215
{ this is only for cdecl procedures with vs_const,vs_value }
217
(calloption in [pocall_cdecl,pocall_cppdecl]) and
218
(varspez in [vs_value,vs_const])
224
copy_value_on_stack:=true;
226
copy_value_on_stack:=(def.size>pointer_size);
228
copy_value_on_stack:=(tarraydef(def).highrange>=tarraydef(def).lowrange) and
229
(def.size>pointer_size);
231
copy_value_on_stack:=is_object(def);
233
copy_value_on_stack:=tstringdef(def).string_typ in [st_shortstring,st_longstring];
235
copy_value_on_stack:=(po_methodpointer in tprocvardef(def).procoptions);
237
copy_value_on_stack:=(tsetdef(def).settype<>smallset);
242
{ return the size of a push }
243
function tparamanager.push_size(varspez:tvarspez;def : tdef;calloption : tproccalloption) : longint;
249
push_size:=pointer_size;
253
if push_addr_param(varspez,def,calloption) then
254
push_size:=pointer_size
257
{ special array are normally pushed by addr, only for
258
cdecl array of const it comes here and the pushsize
260
if is_array_of_const(def) then
270
function tparamanager.get_para_align(calloption : tproccalloption):byte;
272
result:=std_param_align;
276
function tparamanager.get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;
282
function tparamanager.get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;
288
function tparamanager.get_volatile_registers_flags(calloption : tproccalloption):tcpuregisterset;
294
function tparamanager.get_volatile_registers_mm(calloption : tproccalloption):tcpuregisterset;
300
procedure tparamanager.allocparaloc(list: taasmoutput; const loc: tparalocation);
310
{ NR_NO means we don't need to allocate the parameter.
311
This is used for inlining parameters which allocates
312
the parameters in gen_alloc_parast (PFV) }
313
if loc.register<>NR_NO then
314
cg.getexplicitregister(list,loc.register);
318
{ do nothing by default, most of the time it's the framepointer }
320
internalerror(200306091);
332
{ NR_NO means we don't need to allocate the parameter.
333
This is used for inlining parameters which allocates
334
the parameters in gen_alloc_parast (PFV) }
335
if loc.registerhigh<>NR_NO then
336
cg.getexplicitregister(list,loc.registerhigh);
339
internalerror(200306091);
344
procedure tparamanager.freeparaloc(list: taasmoutput; const loc: tparalocation);
349
LOC_REGISTER, LOC_CREGISTER:
352
if (loc.size in [OS_64,OS_S64,OS_F64]) then
354
cg.ungetregister(list,loc.registerhigh);
355
cg.ungetregister(list,loc.registerlow);
359
cg.ungetregister(list,loc.register);
361
LOC_MMREGISTER, LOC_CMMREGISTER,
362
LOC_FPUREGISTER, LOC_CFPUREGISTER:
363
cg.ungetregister(list,loc.register);
364
LOC_REFERENCE,LOC_CREFERENCE:
366
{$ifdef cputargethasfixedstack}
367
reference_reset_base(href,loc.reference.index,loc.reference.offset);
368
tg.ungettemp(list,href);
369
{$endif cputargethasfixedstack}
372
internalerror(200306091);
383
cg.ungetregister(list,loc.register);
385
internalerror(200306091);
390
procedure tparamanager.splitparaloc64(const locpara:tparalocation;var loclopara,lochipara:tparalocation);
397
lochipara.size:=OS_S64;
398
loclopara.size:=OS_64;
402
lochipara.size:=OS_64;
403
loclopara.size:=OS_64;
407
lochipara.size:=OS_S32;
408
loclopara.size:=OS_32;
412
lochipara.size:=OS_32;
413
loclopara.size:=OS_32;
416
internalerror(200307023);
418
loclopara.lochigh:=LOC_INVALID;
419
lochipara.lochigh:=LOC_INVALID;
428
if locpara.lochigh=LOC_INVALID then
429
internalerror(200402061);
430
loclopara.register:=locpara.registerlow;
431
lochipara.register:=locpara.registerhigh;
435
if target_info.endian=endian_big then
436
inc(loclopara.reference.offset,tcgsize2size[loclopara.size])
438
inc(lochipara.reference.offset,tcgsize2size[loclopara.size]);
441
internalerror(200307024);
446
procedure tparamanager.alloctempregs(list: taasmoutput;var locpara:tparalocation);
450
if locpara.lochigh<>LOC_INVALID then
453
cgsize:=locpara.size;
456
locpara.register:=cg.getintregister(list,cgsize);
458
locpara.register:=cg.getfpuregister(list,cgsize);
460
locpara.register:=cg.getmmregister(list,cgsize);
462
internalerror(200308123);
464
case locpara.lochigh of
468
locpara.registerhigh:=cg.getintregister(list,cgsize);
470
locpara.registerhigh:=cg.getfpuregister(list,cgsize);
472
locpara.registerhigh:=cg.getmmregister(list,cgsize);
474
internalerror(200308124);
479
procedure tparamanager.alloctempparaloc(list: taasmoutput;calloption : tproccalloption;paraitem : tparaitem;var locpara:tparalocation);
483
tg.gettemp(list,paraitem.paratype.def.size,tt_persistent,href);
484
locpara.loc:=LOC_REFERENCE;
485
locpara.lochigh:=LOC_INVALID;
486
locpara.reference.index:=href.base;
487
locpara.reference.offset:=href.offset;
491
function tparamanager.create_inline_paraloc_info(p : tabstractprocdef):longint;
494
paraloc : tparalocation;
498
hp:=tparaitem(p.para.first);
499
while assigned(hp) do
501
if push_addr_param(hp.paratyp,hp.paratype.def,p.proccalloption) then
502
paraloc.size:=OS_ADDR
504
paraloc.size:=def_cgsize(hp.paratype.def);
505
if paraloc.size=OS_NO then
506
internalerror(200309301);
507
{ Indicate parameter is loaded in register, the register
508
will be allocated when the allocpara is called }
509
paraloc.loc:=LOC_REGISTER;
510
paraloc.register:=NR_NO;
512
paraloc.loc:=LOC_REFERENCE;
513
paraloc.reference.index:=NR_FRAME_POINTER_REG;
514
l:=push_size(hp.paratyp,hp.paratype.def,p.proccalloption);
515
varalign:=size_2_align(l);
516
paraloc.reference.offset:=parasize+target_info.first_parm_offset;
517
varalign:=used_align(varalign,p.paraalign,p.paraalign);
518
parasize:=align(parasize+l,varalign);
520
hp.paraloc[callerside]:=paraloc;
521
hp.paraloc[calleeside]:=paraloc;
522
hp:=tparaitem(hp.next);
524
{ We need to return the size allocated }
536
$Log: paramgr.pas,v $
537
Revision 1.74 2004/04/18 15:22:24 florian
538
+ location support for arguments, currently PowerPC/MorphOS only
540
Revision 1.73 2004/03/07 00:16:59 florian
541
* compilation of arm rtl fixed
543
Revision 1.72 2004/03/06 20:35:19 florian
544
* fixed arm compilation
545
* cleaned up code generation for exported linux procedures
547
Revision 1.71 2004/02/17 19:14:09 florian
548
* temp. fix for lochigh para
550
Revision 1.70 2004/02/09 22:48:45 florian
551
* several fixes to parameter handling on arm
553
Revision 1.69 2004/02/09 22:14:17 peter
554
* more x86_64 parameter fixes
555
* tparalocation.lochigh is now used to indicate if registerhigh
556
is used and what the type is
558
Revision 1.68 2003/12/28 22:09:12 florian
559
+ setting of bit 6 of cr for c var args on ppc implemented
561
Revision 1.67 2003/12/06 01:15:22 florian
562
* reverted Peter's alloctemp patch; hopefully properly
564
Revision 1.66 2003/12/03 23:13:20 peter
565
* delayed paraloc allocation, a_param_*() gets extra parameter
566
if it needs to allocate temp or real paralocation
567
* optimized/simplified int-real loading
569
Revision 1.65 2003/10/29 21:24:14 jonas
570
+ support for fpu temp parameters
571
+ saving/restoring of fpu register before/after a procedure call
573
Revision 1.64 2003/10/17 14:38:32 peter
574
* 64k registers supported
575
* fixed some memory leaks
577
Revision 1.63 2003/10/11 16:06:42 florian
578
* fixed some MMX<->SSE
579
* started to fix ppc, needs an overhaul
580
+ stabs info improve for spilling, not sure if it works correctly/completly
581
- MMX_SUPPORT removed from Makefile.fpc
583
Revision 1.62 2003/10/10 17:48:13 peter
584
* old trgobj moved to x86/rgcpu and renamed to trgx86fpu
585
* tregisteralloctor renamed to trgobj
586
* removed rgobj from a lot of units
587
* moved location_* and reference_* to cgobj
588
* first things for mmx register allocation
590
Revision 1.61 2003/10/09 21:31:37 daniel
591
* Register allocator splitted, ans abstract now
593
Revision 1.60 2003/10/05 21:21:52 peter
594
* c style array of const generates callparanodes
595
* varargs paraloc fixes
597
Revision 1.59 2003/10/03 22:00:33 peter
598
* parameter alignment fixes
600
Revision 1.58 2003/10/01 20:34:49 peter
601
* procinfo unit contains tprocinfo
602
* cginfo renamed to cgbase
603
* moved cgmessage to verbose
604
* fixed ppc and sparc compiles
606
Revision 1.57 2003/09/30 21:02:37 peter
607
* updates for inlining
609
Revision 1.56 2003/09/23 17:56:05 peter
610
* locals and paras are allocated in the code generation
611
* tvarsym.localloc contains the location of para/local when
612
generating code for the current procedure
614
Revision 1.55 2003/09/16 16:17:01 peter
615
* varspez in calls to push_addr_param
617
Revision 1.54 2003/09/10 08:31:47 marco
618
* Patch from Peter for paraloc
620
Revision 1.53 2003/09/07 22:09:35 peter
621
* preparations for different default calling conventions
624
Revision 1.52 2003/09/04 15:39:58 peter
625
* released useparatemp
627
Revision 1.51 2003/09/03 15:55:01 peter
628
* NEWRA branch merged
630
Revision 1.50.2.1 2003/08/29 17:28:59 peter
631
* next batch of updates
633
Revision 1.50 2003/08/11 21:18:20 peter
634
* start of sparc support for newra
636
Revision 1.49 2003/07/08 21:24:59 peter
639
Revision 1.48 2003/07/05 20:11:41 jonas
640
* create_paraloc_info() is now called separately for the caller and
644
Revision 1.47 2003/07/02 22:18:04 peter
645
* paraloc splitted in callerparaloc,calleeparaloc
646
* sparc calling convention updates
648
Revision 1.46 2003/06/17 16:32:03 peter
649
* allocpara/freepara 64bit support
651
Revision 1.45 2003/06/13 21:19:30 peter
652
* current_procdef removed, use current_procinfo.procdef instead
654
Revision 1.44 2003/06/12 21:11:10 peter
655
* ungetregisterfpu gets size parameter
657
Revision 1.43 2003/06/09 14:54:26 jonas
658
* (de)allocation of registers for parameters is now performed properly
659
(and checked on the ppc)
660
- removed obsolete allocation of all parameter registers at the start
661
of a procedure (and deallocation at the end)
663
Revision 1.42 2003/06/08 10:54:41 jonas
664
- disabled changing of LOC_*REGISTER to LOC_C*REGISTER in setparalocs,
665
this is not necessary anymore (doesn't do anything anymore actually,
666
except making sure the interface crc changes)
668
Revision 1.41 2003/06/07 18:57:04 jonas
669
+ added freeintparaloc
670
* ppc get/freeintparaloc now check whether the parameter regs are
671
properly allocated/deallocated (and get an extra list para)
672
* ppc a_call_* now internalerrors if pi_do_call is not yet set
673
* fixed lot of missing pi_do_call's
675
Revision 1.40 2003/05/31 15:05:28 peter
676
* FUNCTION_RESULT64_LOW/HIGH_REG added for int64 results
678
Revision 1.39 2003/05/30 23:57:08 peter
680
* accumulator removed, splitted in function_return_reg (called) and
681
function_result_reg (caller)
683
Revision 1.38 2003/05/13 15:16:13 peter
684
* removed ret_in_acc, it's the reverse of ret_in_param
685
* fixed ret_in_param for win32 cdecl array
687
Revision 1.37 2003/04/30 22:15:59 florian
688
* some 64 bit adaptions in ncgadd
689
* x86-64 now uses ncgadd
690
* tparamanager.ret_in_acc doesn't return true anymore for a void-def
692
Revision 1.36 2003/04/27 11:21:33 peter
693
* aktprocdef renamed to current_procinfo.procdef
694
* procinfo renamed to current_procinfo
695
* procinfo will now be stored in current_module so it can be
697
* gen_main_procsym changed to create_main_proc and release_main_proc
698
to also generate a tprocinfo structure
699
* fixed unit implicit initfinal
701
Revision 1.35 2003/04/27 07:29:50 peter
702
* current_procinfo.procdef cleanup, current_procdef is now always nil when parsing
703
a new procdef declaration
705
* lexlevel removed, use symtable.symtablelevel instead
706
* implicit init/final code uses the normal genentry/genexit
707
* funcret state checking updated for new funcret handling
709
Revision 1.34 2003/04/23 13:15:04 peter
710
* fix push_high_param for cdecl
712
Revision 1.33 2003/04/23 10:14:30 peter
713
* cdecl array of const has no addr push
715
Revision 1.32 2003/04/22 13:47:08 peter
716
* fixed C style array of const
717
* fixed C array passing
718
* fixed left to right with high parameters
720
Revision 1.31 2003/02/02 19:25:54 carl
721
* Several bugfixes for m68k target (register alloc., opcode emission)
723
+ Generic add more complete (still not verified)
725
Revision 1.30 2003/01/08 18:43:56 daniel
726
* Tregister changed into a record
728
Revision 1.29 2002/12/23 20:58:03 peter
729
* remove unused global var
731
Revision 1.28 2002/12/17 22:19:33 peter
732
* fixed pushing of records>8 bytes with stdcall
733
* simplified hightree loading
735
Revision 1.27 2002/12/06 16:56:58 peter
736
* only compile cs_fp_emulation support when cpufpuemu is defined
737
* define cpufpuemu for m68k only
739
Revision 1.26 2002/11/27 20:04:09 peter
740
* tvarsym.get_push_size replaced by paramanager.push_size
742
Revision 1.25 2002/11/27 02:33:19 peter
743
* copy_value_on_stack method added for cdecl record passing
745
Revision 1.24 2002/11/25 17:43:21 peter
746
* splitted defbase in defutil,symutil,defcmp
747
* merged isconvertable and is_equal into compare_defs(_ext)
748
* made operator search faster by walking the list only once
750
Revision 1.23 2002/11/18 17:31:58 peter
751
* pass proccalloption to ret_in_xxx and push_xxx functions
753
Revision 1.22 2002/11/16 18:00:04 peter
754
* only push small arrays on the stack for win32
756
Revision 1.21 2002/10/05 12:43:25 carl
757
* fixes for Delphi 6 compilation
758
(warning : Some features do not work under Delphi)
760
Revision 1.20 2002/09/30 07:07:25 florian
761
* fixes to common code to get the alpha compiler compiled applied
763
Revision 1.19 2002/09/30 07:00:47 florian
764
* fixes to common code to get the alpha compiler compiled applied
766
Revision 1.18 2002/09/09 09:10:51 florian
767
+ added generic tparamanager.getframepointerloc
769
Revision 1.17 2002/09/07 19:40:39 florian
770
* tvarsym.paraitem is set now
772
Revision 1.16 2002/09/01 21:04:48 florian
773
* several powerpc related stuff fixed
775
Revision 1.15 2002/08/25 19:25:19 peter
776
* sym.insert_in_data removed
777
* symtable.insertvardata/insertconstdata added
778
* removed insert_in_data call from symtable.insert, it needs to be
779
called separatly. This allows to deref the address calculation
780
* procedures now calculate the parast addresses after the procedure
781
directives are parsed. This fixes the cdecl parast problem
782
* push_addr_param has an extra argument that specifies if cdecl is used
785
Revision 1.14 2002/08/17 22:09:47 florian
786
* result type handling in tcgcal.pass_2 overhauled
787
* better tnode.dowrite
788
* some ppc stuff fixed
790
Revision 1.13 2002/08/17 09:23:38 florian
791
* first part of procinfo rewrite
793
Revision 1.12 2002/08/16 14:24:58 carl
794
* issameref() to test if two references are the same (then emit no opcodes)
795
+ ret_in_reg to replace ret_in_acc
796
(fix some register allocation bugs at the same time)
797
+ save_std_register now has an extra parameter which is the
800
Revision 1.11 2002/08/12 15:08:40 carl
801
+ stab register indexes for powerpc (moved from gdb to cpubase)
802
+ tprocessor enumeration moved to cpuinfo
803
+ linker in target_info is now a class
804
* many many updates for m68k (will soon start to compile)
805
- removed some ifdef or correct them for correct cpu
807
Revision 1.10 2002/08/10 17:15:20 jonas
808
* register parameters are now LOC_CREGISTER instead of LOC_REGISTER
810
Revision 1.9 2002/08/09 07:33:02 florian
811
* a couple of interface related fixes
813
Revision 1.8 2002/08/06 20:55:21 florian
814
* first part of ppc calling conventions fix
816
Revision 1.7 2002/08/05 18:27:48 carl
817
+ more more more documentation
818
+ first version include/exclude (can't test though, not enough scratch for i386 :()...
820
Revision 1.6 2002/07/30 20:50:43 florian
821
* the code generator knows now if parameters are in registers
823
Revision 1.5 2002/07/26 21:15:39 florian
824
* rewrote the system handling
826
Revision 1.4 2002/07/20 11:57:55 florian
827
* types.pas renamed to defbase.pas because D6 contains a types
828
unit so this would conflicts if D6 programms are compiled
829
+ Willamette/SSE2 instructions to assembler added
831
Revision 1.3 2002/07/13 19:38:43 florian
832
* some more generic calling stuff fixed
834
Revision 1.2 2002/07/13 07:17:15 jonas
835
* fixed memory leak reported by Sergey Korshunoff
837
Revision 1.1 2002/07/11 14:41:28 florian
838
* start of the new generic parameter handling