From 1c638f2952f6c32eac4a527aa7fbd2a81ccaacb0 Mon Sep 17 00:00:00 2001 From: florian Date: Wed, 15 Sep 1999 20:35:37 +0000 Subject: [PATCH] * small fix to operator overloading when in MMX mode + the compiler uses now fldz and fld1 if possible + some fixes to floating point registers + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined * .... ??? --- compiler/aasm.pas | 13 ++- compiler/cg386flw.pas | 15 +++- compiler/cg386inl.pas | 76 ++++++++++++++++- compiler/cgai386.pas | 11 ++- compiler/cpubase.pas | 11 ++- compiler/innr.inc | 17 +++- compiler/new/alpha/cgcpu.pas | 20 ++--- compiler/new/i386/cgcpu.pas | 15 +++- compiler/new/i386/tgcpu.pas | 11 ++- compiler/new/nmem.pas | 15 +++- compiler/new/powerpc/cgcpu.pas | 11 ++- compiler/new/powerpc/cpubase.pas | 27 ++++--- compiler/options.pas | 11 ++- compiler/pass_2.pas | 36 +++++++-- compiler/pexpr.pas | 19 ++++- compiler/psub.pas | 13 ++- compiler/ra386int.pas | 11 ++- compiler/symdef.inc | 125 +++++++++++++++------------- compiler/tcadd.pas | 13 ++- compiler/tcinl.pas | 135 ++++++++++++++++++++++++++++++- 20 files changed, 488 insertions(+), 117 deletions(-) diff --git a/compiler/aasm.pas b/compiler/aasm.pas index b9d9f8ea9c..b453cc6910 100644 --- a/compiler/aasm.pas +++ b/compiler/aasm.pas @@ -694,7 +694,7 @@ uses begin inherited init; typ:=ait_align; - if b in [1,2,4,8,16] then + if b in [1,2,4,8,16,32] then aligntype := b else aligntype := 1; @@ -709,7 +709,7 @@ uses begin inherited init; typ:=ait_align; - if b in [1,2,4,8,16] then + if b in [1,2,4,8,16,32] then aligntype := b else aligntype := 1; @@ -985,7 +985,14 @@ uses end. { $Log$ - Revision 1.61 1999-09-08 15:01:29 jonas + Revision 1.62 1999-09-15 20:35:37 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.61 1999/09/08 15:01:29 jonas * some small changes so the noew optimizer is again compilable Revision 1.60 1999/08/06 15:30:17 florian diff --git a/compiler/cg386flw.pas b/compiler/cg386flw.pas index df266b9b99..52d8978925 100644 --- a/compiler/cg386flw.pas +++ b/compiler/cg386flw.pas @@ -44,7 +44,7 @@ interface implementation uses - cobjects,verbose,globals,systems, + cobjects,verbose,globtype,globals,systems, symconst,symtable,aasm,types, hcodegen,temp_gen,pass_2, cpubase,cpuasm, @@ -280,6 +280,10 @@ implementation if not(omitfirstcomp) or temptovalue then emitjmp(hcond,aktbreaklabel); + { align loop target } + if not(cs_littlesize in aktglobalswitches) then + exprasmlist^.concat(new(pai_align,init_op(16,$90))); + emitlab(l3); { help register must not be in instruction block } @@ -804,7 +808,14 @@ do_jmp: end. { $Log$ - Revision 1.48 1999-09-07 07:56:37 peter + Revision 1.49 1999-09-15 20:35:37 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.48 1999/09/07 07:56:37 peter * reload esi in except block to allow virtual methods Revision 1.47 1999/08/25 11:59:42 jonas diff --git a/compiler/cg386inl.pas b/compiler/cg386inl.pas index 1863415ea4..7ee40f0d31 100644 --- a/compiler/cg386inl.pas +++ b/compiler/cg386inl.pas @@ -843,7 +843,7 @@ implementation l : longint; ispushed : boolean; hregister : tregister; - otlabel,oflabel : pasmlabel; + otlabel,oflabel,l1 : pasmlabel; oldpushedparasize : longint; begin @@ -1310,6 +1310,71 @@ implementation end; end; end; + in_pi: + emit_none(A_FLDPI,S_NO); + in_sin_extended, + in_arctan_extended, + in_abs_extended, + in_sqr_extended, + in_sqrt_extended, + in_ln_extended, + in_cos_extended: + begin + secondpass(p^.left); + case p^.left^.location.loc of + LOC_FPU: + ; + LOC_CFPUREGISTER: + begin + emit_reg(A_FLD,S_NO, + correct_fpuregister(p^.left^.location.register,fpuvaroffset)); + inc(fpuvaroffset); + end; + LOC_REFERENCE,LOC_MEM: + floatload(pfloatdef(p^.left^.resulttype)^.typ,p^.left^.location.reference); + else + internalerror(309991); + end; + case p^.inlinenumber of + in_sin_extended, + in_cos_extended: + begin + getlabel(l1); + if p^.inlinenumber=in_sin_extended then + emit_none(A_FSIN,S_NO) + else + emit_none(A_FCOS,S_NO); + { + emit_reg(A_FNSTSW,S_NO,R_AX); + emit_none(A_SAHF,S_NO); + emitjmp(C_NP,l1); + emit_reg(A_FSTP,S_NO,R_ST0); + emit_none(A_FLDZ,S_NO); + emitlab(l1); + } + end; + in_arctan_extended: + begin + emit_none(A_FLD1,S_NO); + emit_none(A_FPATAN,S_NO); + end; + in_abs_extended: + emit_none(A_FABS,S_NO); + in_sqr_extended: + begin + emit_reg(A_FLD,S_NO,R_ST0); + emit_none(A_FMULP,S_NO); + end; + in_sqrt_extended: + emit_none(A_FSQRT,S_NO); + in_ln_extended: + begin + emit_none(A_FLDLN2,S_NO); + emit_none(A_FXCH,S_NO); + emit_none(A_FYL2X,S_NO); + end; + end; + end; {$ifdef SUPPORT_MMX} in_mmx_pcmpeqb..in_mmx_pcmpgtw: begin @@ -1336,7 +1401,14 @@ implementation end. { $Log$ - Revision 1.69 1999-08-28 15:34:16 florian + Revision 1.70 1999-09-15 20:35:38 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.69 1999/08/28 15:34:16 florian * bug 519 fixed Revision 1.68 1999/08/19 13:08:47 pierre diff --git a/compiler/cgai386.pas b/compiler/cgai386.pas index b52a6607e3..f24d84e183 100644 --- a/compiler/cgai386.pas +++ b/compiler/cgai386.pas @@ -3063,7 +3063,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister); exprasmlist^.insert(new(pai_align,init_op(16,$90))) else if not(cs_littlesize in aktglobalswitches) then - exprasmlist^.insert(new(pai_align,init(4))); + exprasmlist^.insert(new(pai_align,init_op(32,$90))); end; exprasmlist:=oldexprasmlist; end; @@ -3349,7 +3349,14 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister); end. { $Log$ - Revision 1.42 1999-09-14 07:59:47 florian + Revision 1.43 1999-09-15 20:35:38 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.42 1999/09/14 07:59:47 florian * finally!? fixed with do My last and also Peter's fix before were wrong :( diff --git a/compiler/cpubase.pas b/compiler/cpubase.pas index 908f7be011..f36731b3a3 100644 --- a/compiler/cpubase.pas +++ b/compiler/cpubase.pas @@ -769,8 +769,8 @@ const frame_pointer = R_EBP; self_pointer = R_ESI; accumulator = R_EAX; - { the register where the vmt offset is passed to the destructor } + { helper routine } vmt_offset_reg = R_EDI; scratch_regs : array[1..1] of tregister = (R_EDI); @@ -1091,7 +1091,14 @@ end; end. { $Log$ - Revision 1.12 1999-09-10 18:48:01 florian + Revision 1.13 1999-09-15 20:35:39 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.12 1999/09/10 18:48:01 florian * some bug fixes (e.g. must_be_valid and procinfo.funcret_is_valid) * most things for stored properties fixed diff --git a/compiler/innr.inc b/compiler/innr.inc index 431418b105..5b77ece92b 100644 --- a/compiler/innr.inc +++ b/compiler/innr.inc @@ -73,6 +73,14 @@ const in_const_sin = 116; in_lo_qword = 117; in_hi_qword = 118; + in_cos_extended = 119; + in_pi = 121; + in_abs_extended = 122; + in_sqr_extended = 123; + in_sqrt_extended = 124; + in_arctan_extended = 125; + in_ln_extended = 126; + in_sin_extended = 127; { MMX functions } { these contants are used by the mmx unit } @@ -91,7 +99,14 @@ const { $Log$ - Revision 1.13 1999-08-28 15:34:19 florian + Revision 1.14 1999-09-15 20:35:40 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.13 1999/08/28 15:34:19 florian * bug 519 fixed Revision 1.12 1999/07/01 15:49:14 florian diff --git a/compiler/new/alpha/cgcpu.pas b/compiler/new/alpha/cgcpu.pas index c052c7b4a6..3203aa8114 100644 --- a/compiler/new/alpha/cgcpu.pas +++ b/compiler/new/alpha/cgcpu.pas @@ -200,7 +200,14 @@ end; end. { $Log$ - Revision 1.7 1999-08-25 12:00:17 jonas + Revision 1.8 1999-09-15 20:35:47 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.7 1999/08/25 12:00:17 jonas * changed pai386, paippc and paiapha (same for tai*) to paicpu (taicpu) Revision 1.6 1999/08/06 18:05:57 florian @@ -229,15 +236,4 @@ end. Revision 1.1 1999/08/01 22:08:26 florian * reorganisation of directory structure - - Revision 1.3 1999/08/01 18:22:31 florian - * made it again compilable - - Revision 1.2 1999/01/23 23:29:43 florian - * first running version of the new code generator - * when compiling exceptions under Linux fixed - - Revision 1.1 1998/12/15 22:17:02 florian - * first version - } diff --git a/compiler/new/i386/cgcpu.pas b/compiler/new/i386/cgcpu.pas index 90515ea977..108c044953 100644 --- a/compiler/new/i386/cgcpu.pas +++ b/compiler/new/i386/cgcpu.pas @@ -49,7 +49,12 @@ unit cgcpu; implementation uses +<<<<<<< cgcpu.pas + globtype,globals,cpuasm,symconst,symtable,cgbase, + verbose; +======= globtype,globals,cpuasm,symconst,symtable,cgbase,verbose; +>>>>>>> 1.6 constructor tcg386.init; @@ -140,7 +145,14 @@ unit cgcpu; end. { $Log$ - Revision 1.6 1999-09-10 18:48:11 florian + Revision 1.7 1999-09-15 20:35:47 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.6 1999/09/10 18:48:11 florian * some bug fixes (e.g. must_be_valid and procinfo.funcret_is_valid) * most things for stored properties fixed @@ -171,5 +183,4 @@ end. Revision 1.1 1998/12/15 22:17:02 florian * first version - } diff --git a/compiler/new/i386/tgcpu.pas b/compiler/new/i386/tgcpu.pas index d853366984..9e0d6c83ea 100644 --- a/compiler/new/i386/tgcpu.pas +++ b/compiler/new/i386/tgcpu.pas @@ -68,7 +68,14 @@ begin end. { $Log$ - Revision 1.4 1999-09-10 18:48:11 florian + Revision 1.5 1999-09-15 20:35:47 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.4 1999/09/10 18:48:11 florian * some bug fixes (e.g. must_be_valid and procinfo.funcret_is_valid) * most things for stored properties fixed @@ -80,4 +87,4 @@ end. Revision 1.1 1999/08/02 17:14:14 florian + changed the temp. generator to an object -} \ No newline at end of file +} diff --git a/compiler/new/nmem.pas b/compiler/new/nmem.pas index ceae69c48e..42628d26c8 100644 --- a/compiler/new/nmem.pas +++ b/compiler/new/nmem.pas @@ -146,7 +146,7 @@ unit nmem; {$ifdef dummy} { DLL variable, DLL variables are only available on the win32 target } { maybe we've to add this later for the alpha WinNT } - else if (pvarsym(symtableentry)^.var_options and vo_is_dll_var)<>0 then + else if vo_is_dll_var in pvarsym(symtableentry)^.varoptions then begin hregister:=tg.getregisterint; location.reference.symbol:=newasmsymbol(symtableentry^.mangledname); @@ -162,7 +162,7 @@ unit nmem; { in case it is a register variable: } if pvarsym(symtableentry)^.reg<>R_NO then begin - if pvarsym(p^.symtableentry)^.reg in fpureg then + if pvarsym(symtableentry)^.reg in fpuregs then begin location.loc:=LOC_CFPUREGISTER; tg.unusedregsfpu:=tg.unusedregsfpu-[pvarsym(symtableentry)^.reg]; @@ -221,7 +221,7 @@ unit nmem; end; objectsymtable: begin - if (pvarsym(symtableentry)^.properties and sp_static)<>0 then + if sp_static in pvarsym(symtableentry)^.symoptions then begin location.reference.symbol:=newasmsymbol(symtableentry^.mangledname); end @@ -711,7 +711,14 @@ unit nmem; end. { $Log$ - Revision 1.12 1999-09-14 11:16:09 florian + Revision 1.13 1999-09-15 20:35:46 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.12 1999/09/14 11:16:09 florian * only small updates to work with the current compiler Revision 1.11 1999/08/25 12:00:12 jonas diff --git a/compiler/new/powerpc/cgcpu.pas b/compiler/new/powerpc/cgcpu.pas index 8c953c9851..2ea5c83196 100644 --- a/compiler/new/powerpc/cgcpu.pas +++ b/compiler/new/powerpc/cgcpu.pas @@ -569,13 +569,20 @@ const var p: paicpu; begin p := new(paicpu,op_sym(op,newasmsymbol(l^.name))); - p^.condition := create_cond_norm(c,0); + create_cond_norm(c,0,p^.condition); list^.concat(p) end; end. { $Log$ - Revision 1.5 1999-09-03 13:14:11 jonas + Revision 1.6 1999-09-15 20:35:47 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.5 1999/09/03 13:14:11 jonas + implemented some parameter passing methods, but they require\n some more helper routines\n * fix for loading symbol addresses (still needs to be done in a_loadaddress)\n * several changes to the way conditional branches are handled Revision 1.4 1999/08/26 14:53:41 jonas diff --git a/compiler/new/powerpc/cpubase.pas b/compiler/new/powerpc/cpubase.pas index 978f3bc932..8242cd6ca8 100644 --- a/compiler/new/powerpc/cpubase.pas +++ b/compiler/new/powerpc/cpubase.pas @@ -428,9 +428,9 @@ const function is_calljmp(o:tasmop):boolean; - function inverse_cond(c: TAsmCond): TAsmCond; - function create_cond_imm(BO,BI:byte): TAsmCond; - function create_cond_norm(cond: TAsmCondFlags; cr: byte): TasmCond; + procedure inverse_cond(c: TAsmCond;var r : TAsmCond); + procedure create_cond_imm(BO,BI:byte;var r : TAsmCond); + procedure create_cond_norm(cond: TAsmCondFlags; cr: byte;var r : TasmCond); {***************************************************************************** Init/Done @@ -499,26 +499,26 @@ implementation end; - function inverse_cond(c: TAsmCond): TAsmCond; + procedure inverse_cond(c: TAsmCond;var r : TAsmCond); const inv_condflags:array[TAsmCondFlags] of TAsmCondFlags=(CF_None, CF_GE,CF_GT,CF_NE,CF_LT,CF_LE,CF_LT,CF_EQ,CF_GT,CF_NS,CF_SO,CF_NU,CF_UN, CF_F,CF_T,CF_DNZ,CF_DNZF,CF_DNZT,CF_DZ,CF_DZF,CF_DZT); begin c.cond := inv_condflags[c.cond]; - inverse_cond := c; + r := c; end; - function create_cond_imm(BO,BI:byte): TAsmCond; + procedure create_cond_imm(BO,BI:byte;var r : TAsmCond); var c: tasmcond; begin c.simple := false; c.bo := bo; c.bi := bi; - create_cond_imm := c + r := c end; - function create_cond_norm(cond: TAsmCondFlags; cr: byte): TasmCond; + procedure create_cond_norm(cond: TAsmCondFlags; cr: byte;var r : TasmCond); const cr2reg: array[0..7] of tregister = (R_CR0,R_CR1,R_CR2,R_CR3,R_CR4,R_CR5,R_CR6,R_CR7); var c: tasmcond; @@ -530,7 +530,7 @@ implementation CF_T..CF_DZF: c.crbit := cr else c.cr := cr2reg[cr]; end; - create_cond_norm := c; + r := c; end; {***************************************************************************** @@ -548,7 +548,14 @@ implementation end. { $Log$ - Revision 1.6 1999-09-03 13:11:59 jonas + Revision 1.7 1999-09-15 20:35:47 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.6 1999/09/03 13:11:59 jonas * several changes to the way conditional branches are handled\n * some typos fixed Revision 1.5 1999/08/23 23:27:54 pierre diff --git a/compiler/options.pas b/compiler/options.pas index 258325b15f..bfc3cbf39f 100644 --- a/compiler/options.pas +++ b/compiler/options.pas @@ -1037,7 +1037,7 @@ begin def_symbol('HASRESOURCESTRINGS'); def_symbol('HASSAVEREGISTERS'); def_symbol('NEWVMTOFFSET'); - + def_symbol('HASINTERNMATH'); { some stuff for TP compatibility } {$ifdef i386} def_symbol('CPU86'); @@ -1217,7 +1217,14 @@ end; end. { $Log$ - Revision 1.20 1999-09-03 09:31:22 peter + Revision 1.21 1999-09-15 20:35:40 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.20 1999/09/03 09:31:22 peter * reading of search paths fixed to work as expected Revision 1.19 1999/09/01 22:07:20 peter diff --git a/compiler/pass_2.pas b/compiler/pass_2.pas index b38a252529..8ae4ec2f14 100644 --- a/compiler/pass_2.pas +++ b/compiler/pass_2.pas @@ -474,6 +474,7 @@ implementation end; end; *) +{ $ifdef dummy} if (p^.registers32<4) then begin for i:=1 to maxvarregs do @@ -590,7 +591,8 @@ implementation end; end; end; - if (p^.registersfpu0 then + begin + for i:=maxfpuvarregs downto 2 do + regvars[i]:=nil; + end + else + begin + for i:=maxfpuvarregs downto maxfpuvarregs-p^.registersfpu do + regvars[i]:=nil; + end; { now assign register } - for i:=1 to maxfpuvarregs-p^.registersfpu do + for i:=1 to maxfpuvarregs do begin if assigned(regvars[i]) then begin regvars[i]^.reg:=correct_fpuregister(R_ST0,i-1); + { reserve place on the FPU stack } +{$ifdef i386} + procinfo.aktentrycode^.concat(new(paicpu,op_none(A_FLDZ,S_NO))); + { ... and clean it up } + procinfo.aktexitcode^.concat(new(paicpu,op_reg(A_FSTP,S_NO,R_ST0))); +{$endif i386} {$ifdef dummy} { parameter must be load } if regvars_para[i] then @@ -672,7 +691,14 @@ implementation end. { $Log$ - Revision 1.36 1999-09-07 14:12:35 jonas + Revision 1.37 1999-09-15 20:35:41 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.36 1999/09/07 14:12:35 jonas * framepointer cannot be changed to esp for methods Revision 1.35 1999/08/27 10:46:26 pierre diff --git a/compiler/pexpr.pas b/compiler/pexpr.pas index acb74f53b4..a2fe901b41 100644 --- a/compiler/pexpr.pas +++ b/compiler/pexpr.pas @@ -1787,9 +1787,17 @@ _KLAMMERAFFE : begin consume(_LKLAMMER); p1:=factor(true); consume(_RKLAMMER); + if token in [_CARET,_POINT,_LECKKLAMMER] then + begin + { we need the resulttype } + { of the expression in pd } + do_firstpass(p1); + pd:=p1^.resulttype; + again:=true; + postfixoperators; + end; end else - p1:=factor(true); got_addrn:=false; p1:=gensinglenode(addrn,p1); @@ -2092,7 +2100,14 @@ _LECKKLAMMER : begin end. { $Log$ - Revision 1.142 1999-09-13 16:26:32 peter + Revision 1.143 1999-09-15 20:35:41 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.142 1999/09/13 16:26:32 peter * fix crash with empty object as childs Revision 1.141 1999/09/11 19:47:26 florian diff --git a/compiler/psub.pas b/compiler/psub.pas index 48f486e56a..24d1e5c8f8 100644 --- a/compiler/psub.pas +++ b/compiler/psub.pas @@ -1045,7 +1045,7 @@ const handler : {$ifndef TP}@{$endif}pd_intern; pocall : [pocall_internconst]; pooption : []; - mutexclpocall : [pocall_internproc]; + mutexclpocall : []; mutexclpotype : [potype_operator]; mutexclpo : [] ),( @@ -1054,7 +1054,7 @@ const handler : {$ifndef TP}@{$endif}pd_intern; pocall : [pocall_internproc]; pooption : []; - mutexclpocall : [pocall_internconst,pocall_inline,pocall_clearstack,pocall_leftright,pocall_cdecl]; + mutexclpocall : [pocall_inline,pocall_clearstack,pocall_leftright,pocall_cdecl]; mutexclpotype : [potype_constructor,potype_destructor,potype_operator]; mutexclpo : [po_exports,po_external,po_interrupt,po_assembler,po_iocheck] ),( @@ -2053,7 +2053,14 @@ end. { $Log$ - Revision 1.20 1999-09-10 18:48:09 florian + Revision 1.21 1999-09-15 20:35:42 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.20 1999/09/10 18:48:09 florian * some bug fixes (e.g. must_be_valid and procinfo.funcret_is_valid) * most things for stored properties fixed diff --git a/compiler/ra386int.pas b/compiler/ra386int.pas index 6e564d7e42..435bc96dd7 100644 --- a/compiler/ra386int.pas +++ b/compiler/ra386int.pas @@ -337,7 +337,7 @@ begin Begin actasmpattern:=actasmpattern+c; c:=current_scanner^.asmgetchar; - if c in ['0'..'9'] then + if c in ['0'..'7'] then actasmpattern:=actasmpattern + c else Message(asmr_e_invalid_fpu_register); @@ -1752,7 +1752,14 @@ begin end. { $Log$ - Revision 1.46 1999-09-08 16:04:03 peter + Revision 1.47 1999-09-15 20:35:43 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.46 1999/09/08 16:04:03 peter * better support for object fields and more error checks for field accesses which create buggy code diff --git a/compiler/symdef.inc b/compiler/symdef.inc index c4a8656310..7c74475906 100644 --- a/compiler/symdef.inc +++ b/compiler/symdef.inc @@ -3008,64 +3008,68 @@ Const local_symtable_index : longint = $8001; pdc, pdc2, pdcbefore : pdefcoll; methodkind, paracount, paraspec : byte; begin - { write method id and name } - rttilist^.concat(new(pai_const,init_8bit(tkmethod))); - write_rtti_name; - - { write kind of method (can only be function or procedure)} - if retdef = pdef(voiddef) then { ### typecast shoudln't be necessary! (sg) } - methodkind := mkProcedure - else - methodkind := mkFunction; - rttilist^.concat(new(pai_const,init_8bit(methodkind))); - - { get # of parameters } - paracount:=0; - pdc:=para1; - while assigned(pdc) do + if po_methodpointer in procoptions then begin - inc(paracount); - pdc:=pdc^.next; + { write method id and name } + rttilist^.concat(new(pai_const,init_8bit(tkmethod))); + write_rtti_name; + + { write kind of method (can only be function or procedure)} + if retdef = pdef(voiddef) then { ### typecast shoudln't be necessary! (sg) } + methodkind := mkProcedure + else + methodkind := mkFunction; + rttilist^.concat(new(pai_const,init_8bit(methodkind))); + + { get # of parameters } + paracount:=0; + pdc:=para1; + while assigned(pdc) do + begin + inc(paracount); + pdc:=pdc^.next; + end; + rttilist^.concat(new(pai_const,init_8bit(paracount))); + + { write parameter info. The parameters must be written in reverse order + if this method uses right to left parameter pushing! } + pdc:=para1; + if assigned(pdc) and not (pocall_leftright in proccalloptions) then + while assigned(pdc^.next) do pdc := pdc^.next; + + while assigned(pdc) do + begin + case pdc^.paratyp of + vs_value: paraspec := 0; + vs_const: paraspec := pfConst; + vs_var : paraspec := pfVar; + end; + { write flags for current parameter } + rttilist^.concat(new(pai_const,init_8bit(paraspec))); + { write name of current parameter ### how can I get this??? (sg)} + rttilist^.concat(new(pai_const,init_8bit(0))); + + { write name of type of current parameter } + pdc^.data^.write_rtti_name; + if pocall_leftright in proccalloptions then + pdc:=pdc^.next + else + begin + { find previous argument } + pdcbefore := nil; + pdc2 := para1; + while pdc2 <> pdc do + begin + pdcbefore := pdc2; + pdc2 := pdc2^.next; + end; + pdc := pdcbefore; + end; + end; + + { write name of result type } + retdef^.write_rtti_name; end; - rttilist^.concat(new(pai_const,init_8bit(paracount))); - - { write parameter info. The parameters must be written in reverse order - if this method uses right to left parameter pushing! } - pdc:=para1; - if assigned(pdc) and not (pocall_leftright in proccalloptions) then - while assigned(pdc^.next) do pdc := pdc^.next; - - while assigned(pdc) do - begin - case pdc^.paratyp of - vs_value: paraspec := 0; - vs_const: paraspec := pfConst; - vs_var : paraspec := pfVar; - end; - { write flags for current parameter } - rttilist^.concat(new(pai_const,init_8bit(paraspec))); - { write name of current parameter ### how can I get this??? (sg)} - rttilist^.concat(new(pai_const,init_8bit(0))); - { write name of type of current parameter } - pdc^.data^.write_rtti_name; - if pocall_leftright in proccalloptions then - pdc:=pdc^.next - else - begin - { find previous argument } - pdcbefore := nil; - pdc2 := para1; - while pdc2 <> pdc do - begin - pdcbefore := pdc2; - pdc2 := pdc2^.next; - end; - pdc := pdcbefore; - end; - end; - - { write name of result type } - retdef^.write_rtti_name; end; @@ -3746,7 +3750,14 @@ Const local_symtable_index : longint = $8001; { $Log$ - Revision 1.162 1999-09-12 08:48:09 florian + Revision 1.163 1999-09-15 20:35:44 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.162 1999/09/12 08:48:09 florian * bugs 593 and 607 fixed * some other potential bugs with array constructors fixed * for classes compiled in $M+ and it's childs, the default access method diff --git a/compiler/tcadd.pas b/compiler/tcadd.pas index 856ff03829..d0d0b509dd 100644 --- a/compiler/tcadd.pas +++ b/compiler/tcadd.pas @@ -104,6 +104,8 @@ implementation if (p^.treetype=starstarn) or (ld^.deftype=recorddef) or ((ld^.deftype=arraydef) and + not((cs_mmx in aktlocalswitches) and + is_mmx_able_array(ld)) and (not (rd^.deftype in [setdef,orddef])) and (not is_chararray(ld)) ) or @@ -115,6 +117,8 @@ implementation ) or (rd^.deftype=recorddef) or ((rd^.deftype=arraydef) and + not((cs_mmx in aktlocalswitches) and + is_mmx_able_array(rd)) and (not (ld^.deftype in [setdef,orddef])) and (not is_chararray(rd)) ) or @@ -1135,7 +1139,14 @@ implementation end. { $Log$ - Revision 1.47 1999-09-13 16:28:05 peter + Revision 1.48 1999-09-15 20:35:45 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.47 1999/09/13 16:28:05 peter * typo in previous commit open_array -> chararray :( Revision 1.46 1999/09/10 15:40:46 peter diff --git a/compiler/tcinl.pas b/compiler/tcinl.pas index 3a9650651d..299706268b 100644 --- a/compiler/tcinl.pas +++ b/compiler/tcinl.pas @@ -94,6 +94,49 @@ implementation end; end; + function getconstrealvalue : bestreal; + + begin + case p^.left^.treetype of + ordconstn: + getconstrealvalue:=p^.left^.value; + realconstn: + getconstrealvalue:=p^.left^.value_real; + else + internalerror(309992); + end; + end; + + procedure setconstrealvalue(r : bestreal); + + var + hp : ptree; + + begin + hp:=genrealconstnode(r,bestrealdef^); + disposetree(p); + p:=hp; + firstpass(p); + end; + + procedure handleextendedfunction; + + begin + p^.location.loc:=LOC_FPU; + p^.resulttype:=s80floatdef; + if (p^.left^.resulttype^.deftype<>floatdef) or + (pfloatdef(p^.left^.resulttype)^.typ<>s80real) then + begin + p^.left:=gentypeconvnode(p^.left,s80floatdef); + firstpass(p^.left); + end; + p^.registers32:=p^.left^.registers32; + p^.registersfpu:=p^.left^.registersfpu; +{$ifdef SUPPORT_MMX} + p^.registersmmx:=p^.left^.registersmmx; +{$endif SUPPORT_MMX} + end; + begin store_valid:=must_be_valid; store_count_ref:=count_ref; @@ -1079,6 +1122,89 @@ implementation CGMessage(type_e_varid_or_typeid_expected); end; + in_cos_extended: + begin + if p^.left^.treetype in [ordconstn,realconstn] then + setconstrealvalue(cos(getconstrealvalue)) + else + handleextendedfunction; + end; + + in_sin_extended: + begin + if p^.left^.treetype in [ordconstn,realconstn] then + setconstrealvalue(sin(getconstrealvalue)) + else + handleextendedfunction; + end; + + in_arctan_extended: + begin + if p^.left^.treetype in [ordconstn,realconstn] then + setconstrealvalue(arctan(getconstrealvalue)) + else + handleextendedfunction; + end; + + in_pi: + if block_type=bt_const then + setconstrealvalue(pi) + else + begin + p^.location.loc:=LOC_FPU; + p^.resulttype:=s80floatdef; + end; + + in_abs_extended: + begin + if p^.left^.treetype in [ordconstn,realconstn] then + setconstrealvalue(abs(getconstrealvalue)) + else + handleextendedfunction; + end; + + in_sqr_extended: + begin + if p^.left^.treetype in [ordconstn,realconstn] then + setconstrealvalue(sqr(getconstrealvalue)) + else + handleextendedfunction; + end; + + in_sqrt_extended: + begin + if p^.left^.treetype in [ordconstn,realconstn] then + begin + vr:=getconstrealvalue; + if vr<0.0 then + begin + CGMessage(type_e_wrong_math_argument); + setconstrealvalue(0); + end + else + setconstrealvalue(sqrt(vr)); + end + else + handleextendedfunction; + end; + + in_ln_extended: + begin + if p^.left^.treetype in [ordconstn,realconstn] then + begin + vr:=getconstrealvalue; + if vr<=0.0 then + begin + CGMessage(type_e_wrong_math_argument); + setconstrealvalue(0); + end + else + setconstrealvalue(ln(vr)); + end + else + handleextendedfunction; + end; + {$ifdef SUPPORT_MMX} in_mmx_pcmpeqb..in_mmx_pcmpgtw: begin @@ -1124,7 +1250,14 @@ implementation end. { $Log$ - Revision 1.50 1999-09-07 14:05:11 pierre + Revision 1.51 1999-09-15 20:35:46 florian + * small fix to operator overloading when in MMX mode + + the compiler uses now fldz and fld1 if possible + + some fixes to floating point registers + + some math. functions (arctan, ln, sin, cos, sqrt, sqr, pi) are now inlined + * .... ??? + + Revision 1.50 1999/09/07 14:05:11 pierre * halt removed in do_lowhigh Revision 1.49 1999/08/28 15:34:21 florian