mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-27 16:30:41 +02:00
* more fixes for the ppc
+ wrappers for the tcnvnode.first_* stuff introduced
This commit is contained in:
parent
102ba3a098
commit
e7a6cd18dd
@ -106,7 +106,7 @@ implementation
|
|||||||
second_TypeInfo;
|
second_TypeInfo;
|
||||||
end;
|
end;
|
||||||
in_assigned_x :
|
in_assigned_x :
|
||||||
begin
|
begin
|
||||||
second_Assigned;
|
second_Assigned;
|
||||||
end;
|
end;
|
||||||
in_include_x_y,
|
in_include_x_y,
|
||||||
@ -583,7 +583,11 @@ end.
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.5 2002-07-28 20:45:22 florian
|
Revision 1.6 2002-07-29 21:23:42 florian
|
||||||
|
* more fixes for the ppc
|
||||||
|
+ wrappers for the tcnvnode.first_* stuff introduced
|
||||||
|
|
||||||
|
Revision 1.5 2002/07/28 20:45:22 florian
|
||||||
+ added direct assembler reader for PowerPC
|
+ added direct assembler reader for PowerPC
|
||||||
|
|
||||||
Revision 1.4 2002/07/26 09:45:20 florian
|
Revision 1.4 2002/07/26 09:45:20 florian
|
||||||
@ -597,4 +601,4 @@ end.
|
|||||||
|
|
||||||
Revision 1.1 2002/07/24 04:07:49 carl
|
Revision 1.1 2002/07/24 04:07:49 carl
|
||||||
+ first revision (incomplete)
|
+ first revision (incomplete)
|
||||||
}
|
}
|
@ -1071,6 +1071,30 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure gen_exception_frame(list : taasmoutput);
|
||||||
|
var
|
||||||
|
tempbuf : treference;
|
||||||
|
tmpreg : tregister;
|
||||||
|
begin
|
||||||
|
include(rg.usedinproc,accumulator);
|
||||||
|
|
||||||
|
{ allocate exception frame buffer }
|
||||||
|
{ this isn't generic, several APIs doesn't }
|
||||||
|
{ allow to change the stack pointer inside }
|
||||||
|
{ a procedure }
|
||||||
|
{ we should allocate a persistent temp. }
|
||||||
|
{ instead }
|
||||||
|
cg.a_op_const_reg(list,OP_SUB,36,STACK_POINTER_REG);
|
||||||
|
tmpreg:=rg.getaddressregister(list);
|
||||||
|
cg.a_load_reg_reg(list,OS_ADDR,STACK_POINTER_REG,tmpreg);
|
||||||
|
reference_reset_base(tempbuf,tmpreg,0);
|
||||||
|
cg.g_push_exception(list,tempbuf,1,aktexitlabel);
|
||||||
|
reference_release(list,tempbuf);
|
||||||
|
|
||||||
|
{ probably we've to reload self here }
|
||||||
|
cg.g_maybe_loadself(list);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure genentrycode(list : TAAsmoutput;
|
procedure genentrycode(list : TAAsmoutput;
|
||||||
make_global:boolean;
|
make_global:boolean;
|
||||||
stackframe:longint;
|
stackframe:longint;
|
||||||
@ -1080,7 +1104,6 @@ implementation
|
|||||||
hs : string;
|
hs : string;
|
||||||
href : treference;
|
href : treference;
|
||||||
p : tsymtable;
|
p : tsymtable;
|
||||||
tempbuf : treference;
|
|
||||||
tmpreg : tregister;
|
tmpreg : tregister;
|
||||||
begin
|
begin
|
||||||
{ Insert alignment and assembler names }
|
{ Insert alignment and assembler names }
|
||||||
@ -1160,11 +1183,11 @@ implementation
|
|||||||
{ for the save all registers we can simply use a pusha,popa which
|
{ for the save all registers we can simply use a pusha,popa which
|
||||||
push edi,esi,ebp,esp(ignored),ebx,edx,ecx,eax }
|
push edi,esi,ebp,esp(ignored),ebx,edx,ecx,eax }
|
||||||
if (po_saveregisters in aktprocdef.procoptions) then
|
if (po_saveregisters in aktprocdef.procoptions) then
|
||||||
cg.g_save_all_registers(list)
|
cg.g_save_all_registers(list)
|
||||||
else
|
else
|
||||||
{ should we save edi,esi,ebx like C ? }
|
{ should we save edi,esi,ebx like C ? }
|
||||||
if (po_savestdregs in aktprocdef.procoptions) then
|
if (po_savestdregs in aktprocdef.procoptions) then
|
||||||
cg.g_save_standard_registers(list);
|
cg.g_save_standard_registers(list);
|
||||||
|
|
||||||
{ a constructor needs a help procedure }
|
{ a constructor needs a help procedure }
|
||||||
if (aktprocdef.proctypeoption=potype_constructor) then
|
if (aktprocdef.proctypeoption=potype_constructor) then
|
||||||
@ -1253,20 +1276,7 @@ implementation
|
|||||||
if ((procinfo^.flags and pi_needs_implicit_finally)<>0) and
|
if ((procinfo^.flags and pi_needs_implicit_finally)<>0) and
|
||||||
{ but it's useless in init/final code of units }
|
{ but it's useless in init/final code of units }
|
||||||
not(aktprocdef.proctypeoption in [potype_unitfinalize,potype_unitinit]) then
|
not(aktprocdef.proctypeoption in [potype_unitfinalize,potype_unitinit]) then
|
||||||
begin
|
gen_exception_frame(list);
|
||||||
include(rg.usedinproc,accumulator);
|
|
||||||
|
|
||||||
{ allocate exception frame buffer }
|
|
||||||
cg.a_op_const_reg(list,OP_SUB,36,STACK_POINTER_REG);
|
|
||||||
tmpreg:=rg.getaddressregister(list);
|
|
||||||
cg.a_load_reg_reg(list,OS_ADDR,STACK_POINTER_REG,tmpreg);
|
|
||||||
reference_reset_base(tempbuf,tmpreg,0);
|
|
||||||
cg.g_push_exception(list,tempbuf,1,aktexitlabel);
|
|
||||||
reference_release(list,tempbuf);
|
|
||||||
|
|
||||||
{ probably we've to reload self here }
|
|
||||||
cg.g_maybe_loadself(list);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{$ifdef GDB}
|
{$ifdef GDB}
|
||||||
if (cs_debuginfo in aktmoduleswitches) then
|
if (cs_debuginfo in aktmoduleswitches) then
|
||||||
@ -1628,7 +1638,11 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.27 2002-07-28 15:59:57 jonas
|
Revision 1.28 2002-07-29 21:23:42 florian
|
||||||
|
* more fixes for the ppc
|
||||||
|
+ wrappers for the tcnvnode.first_* stuff introduced
|
||||||
|
|
||||||
|
Revision 1.27 2002/07/28 15:59:57 jonas
|
||||||
* fixed bug in location_force_reg32() when converting smaller values to
|
* fixed bug in location_force_reg32() when converting smaller values to
|
||||||
64 bit locations
|
64 bit locations
|
||||||
* use cg.op_const_reg_reg() instead of a move and then cg.op_const_reg()
|
* use cg.op_const_reg_reg() instead of a move and then cg.op_const_reg()
|
||||||
@ -1762,4 +1776,4 @@ end.
|
|||||||
Revision 1.2 2002/03/04 19:10:11 peter
|
Revision 1.2 2002/03/04 19:10:11 peter
|
||||||
* removed compiler warnings
|
* removed compiler warnings
|
||||||
|
|
||||||
}
|
}
|
@ -81,6 +81,30 @@ interface
|
|||||||
function first_char_to_char : tnode;virtual;
|
function first_char_to_char : tnode;virtual;
|
||||||
function first_call_helper(c : tconverttype) : tnode;
|
function first_call_helper(c : tconverttype) : tnode;
|
||||||
|
|
||||||
|
{ these wrapper are necessary, because the first_* stuff is called }
|
||||||
|
{ through a table. Without the wrappers override wouldn't have }
|
||||||
|
{ any effect }
|
||||||
|
function _first_int_to_int : tnode;
|
||||||
|
function _first_cstring_to_pchar : tnode;
|
||||||
|
function _first_string_to_chararray : tnode;
|
||||||
|
function _first_char_to_string : tnode;
|
||||||
|
function _first_nothing : tnode;
|
||||||
|
function _first_array_to_pointer : tnode;
|
||||||
|
function _first_int_to_real : tnode;
|
||||||
|
function _first_real_to_real : tnode;
|
||||||
|
function _first_pointer_to_array : tnode;
|
||||||
|
function _first_cchar_to_pchar : tnode;
|
||||||
|
function _first_bool_to_int : tnode;
|
||||||
|
function _first_int_to_bool : tnode;
|
||||||
|
function _first_bool_to_bool : tnode;
|
||||||
|
function _first_proc_to_procvar : tnode;
|
||||||
|
function _first_load_smallset : tnode;
|
||||||
|
function _first_cord_to_pointer : tnode;
|
||||||
|
function _first_ansistring_to_pchar : tnode;
|
||||||
|
function _first_arrayconstructor_to_set : tnode;
|
||||||
|
function _first_class_to_intf : tnode;
|
||||||
|
function _first_char_to_char : tnode;
|
||||||
|
|
||||||
procedure second_int_to_int;virtual;abstract;
|
procedure second_int_to_int;virtual;abstract;
|
||||||
procedure second_string_to_string;virtual;abstract;
|
procedure second_string_to_string;virtual;abstract;
|
||||||
procedure second_cstring_to_pchar;virtual;abstract;
|
procedure second_cstring_to_pchar;virtual;abstract;
|
||||||
@ -1485,40 +1509,139 @@ implementation
|
|||||||
registers32:=1;
|
registers32:=1;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_int_to_int : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_int_to_int;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_cstring_to_pchar : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_cstring_to_pchar;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_string_to_chararray : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_string_to_chararray;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_char_to_string : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_char_to_string;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_nothing : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_nothing;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_array_to_pointer : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_array_to_pointer;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_int_to_real : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_int_to_real;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_real_to_real : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_real_to_real;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_pointer_to_array : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_pointer_to_array;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_cchar_to_pchar : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_cchar_to_pchar;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_bool_to_int : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_bool_to_int;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_int_to_bool : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_int_to_bool;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_bool_to_bool : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_bool_to_bool;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_proc_to_procvar : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_proc_to_procvar;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_load_smallset : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_load_smallset;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_cord_to_pointer : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_cord_to_pointer;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_ansistring_to_pchar : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_ansistring_to_pchar;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_arrayconstructor_to_set : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_arrayconstructor_to_set;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_class_to_intf : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_class_to_intf;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode._first_char_to_char : tnode;
|
||||||
|
begin
|
||||||
|
result:=first_char_to_char;
|
||||||
|
end;
|
||||||
|
|
||||||
function ttypeconvnode.first_call_helper(c : tconverttype) : tnode;
|
function ttypeconvnode.first_call_helper(c : tconverttype) : tnode;
|
||||||
|
|
||||||
const
|
const
|
||||||
firstconvert : array[tconverttype] of pointer = (
|
firstconvert : array[tconverttype] of pointer = (
|
||||||
@ttypeconvnode.first_nothing, {equal}
|
@ttypeconvnode._first_nothing, {equal}
|
||||||
@ttypeconvnode.first_nothing, {not_possible}
|
@ttypeconvnode._first_nothing, {not_possible}
|
||||||
nil, { removed in resulttype_string_to_string }
|
nil, { removed in resulttype_string_to_string }
|
||||||
@ttypeconvnode.first_char_to_string,
|
@ttypeconvnode._first_char_to_string,
|
||||||
@ttypeconvnode.first_nothing, { char_2_chararray, needs nothing extra }
|
@ttypeconvnode._first_nothing, { char_2_chararray, needs nothing extra }
|
||||||
nil, { removed in resulttype_chararray_to_string }
|
nil, { removed in resulttype_chararray_to_string }
|
||||||
@ttypeconvnode.first_cchar_to_pchar,
|
@ttypeconvnode._first_cchar_to_pchar,
|
||||||
@ttypeconvnode.first_cstring_to_pchar,
|
@ttypeconvnode._first_cstring_to_pchar,
|
||||||
@ttypeconvnode.first_ansistring_to_pchar,
|
@ttypeconvnode._first_ansistring_to_pchar,
|
||||||
@ttypeconvnode.first_string_to_chararray,
|
@ttypeconvnode._first_string_to_chararray,
|
||||||
nil, { removed in resulttype_chararray_to_string }
|
nil, { removed in resulttype_chararray_to_string }
|
||||||
@ttypeconvnode.first_array_to_pointer,
|
@ttypeconvnode._first_array_to_pointer,
|
||||||
@ttypeconvnode.first_pointer_to_array,
|
@ttypeconvnode._first_pointer_to_array,
|
||||||
@ttypeconvnode.first_int_to_int,
|
@ttypeconvnode._first_int_to_int,
|
||||||
@ttypeconvnode.first_int_to_bool,
|
@ttypeconvnode._first_int_to_bool,
|
||||||
@ttypeconvnode.first_bool_to_bool,
|
@ttypeconvnode._first_bool_to_bool,
|
||||||
@ttypeconvnode.first_bool_to_int,
|
@ttypeconvnode._first_bool_to_int,
|
||||||
@ttypeconvnode.first_real_to_real,
|
@ttypeconvnode._first_real_to_real,
|
||||||
@ttypeconvnode.first_int_to_real,
|
@ttypeconvnode._first_int_to_real,
|
||||||
@ttypeconvnode.first_proc_to_procvar,
|
@ttypeconvnode._first_proc_to_procvar,
|
||||||
@ttypeconvnode.first_arrayconstructor_to_set,
|
@ttypeconvnode._first_arrayconstructor_to_set,
|
||||||
@ttypeconvnode.first_load_smallset,
|
@ttypeconvnode._first_load_smallset,
|
||||||
@ttypeconvnode.first_cord_to_pointer,
|
@ttypeconvnode._first_cord_to_pointer,
|
||||||
@ttypeconvnode.first_nothing,
|
@ttypeconvnode._first_nothing,
|
||||||
@ttypeconvnode.first_nothing,
|
@ttypeconvnode._first_nothing,
|
||||||
@ttypeconvnode.first_class_to_intf,
|
@ttypeconvnode._first_class_to_intf,
|
||||||
@ttypeconvnode.first_char_to_char,
|
@ttypeconvnode._first_char_to_char,
|
||||||
@ttypeconvnode.first_nothing,
|
@ttypeconvnode._first_nothing,
|
||||||
@ttypeconvnode.first_nothing
|
@ttypeconvnode._first_nothing
|
||||||
);
|
);
|
||||||
type
|
type
|
||||||
tprocedureofobject = function : tnode of object;
|
tprocedureofobject = function : tnode of object;
|
||||||
@ -1770,7 +1893,11 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.64 2002-07-23 12:34:30 daniel
|
Revision 1.65 2002-07-29 21:23:42 florian
|
||||||
|
* more fixes for the ppc
|
||||||
|
+ wrappers for the tcnvnode.first_* stuff introduced
|
||||||
|
|
||||||
|
Revision 1.64 2002/07/23 12:34:30 daniel
|
||||||
* Readded old set code. To use it define 'oldset'. Activated by default
|
* Readded old set code. To use it define 'oldset'. Activated by default
|
||||||
for ppc.
|
for ppc.
|
||||||
|
|
||||||
|
@ -2259,94 +2259,94 @@ implementation
|
|||||||
begin
|
begin
|
||||||
{ create the call to the helper }
|
{ create the call to the helper }
|
||||||
first_pi := ccallnode.createintern('fpc_pi',nil);
|
first_pi := ccallnode.createintern('fpc_pi',nil);
|
||||||
{ now left is nil, nothing left, so no second pass
|
{ now left is nil, nothing left, so no second pass
|
||||||
required.
|
required.
|
||||||
}
|
}
|
||||||
left := nil;
|
left := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
function tinlinenode.first_arctan_real : tnode;
|
function tinlinenode.first_arctan_real : tnode;
|
||||||
begin
|
begin
|
||||||
{ create the call to the helper }
|
{ create the call to the helper }
|
||||||
{ on entry left node contains the parameter }
|
{ on entry left node contains the parameter }
|
||||||
first_arctan_real := ccallnode.createintern('fpc_arctan_real',
|
first_arctan_real := ccallnode.createintern('fpc_arctan_real',
|
||||||
ccallparanode.create(left,nil));
|
ccallparanode.create(left,nil));
|
||||||
{ now left is nil, nothing left, so no second pass
|
{ now left is nil, nothing left, so no second pass
|
||||||
required.
|
required.
|
||||||
}
|
}
|
||||||
left := nil;
|
left := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function tinlinenode.first_abs_real : tnode;
|
function tinlinenode.first_abs_real : tnode;
|
||||||
begin
|
begin
|
||||||
{ create the call to the helper }
|
{ create the call to the helper }
|
||||||
{ on entry left node contains the parameter }
|
{ on entry left node contains the parameter }
|
||||||
first_abs_real := ccallnode.createintern('fpc_abs_real',
|
first_abs_real := ccallnode.createintern('fpc_abs_real',
|
||||||
ccallparanode.create(left,nil));
|
ccallparanode.create(left,nil));
|
||||||
{ now left is nil, nothing left, so no second pass
|
{ now left is nil, nothing left, so no second pass
|
||||||
required.
|
required.
|
||||||
}
|
}
|
||||||
left := nil;
|
left := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function tinlinenode.first_sqr_real : tnode;
|
function tinlinenode.first_sqr_real : tnode;
|
||||||
begin
|
begin
|
||||||
{ create the call to the helper }
|
{ create the call to the helper }
|
||||||
{ on entry left node contains the parameter }
|
{ on entry left node contains the parameter }
|
||||||
first_sqr_real := ccallnode.createintern('fpc_sqr_real',
|
first_sqr_real := ccallnode.createintern('fpc_sqr_real',
|
||||||
ccallparanode.create(left,nil));
|
ccallparanode.create(left,nil));
|
||||||
{ now left is nil, nothing left, so no second pass
|
{ now left is nil, nothing left, so no second pass
|
||||||
required.
|
required.
|
||||||
}
|
}
|
||||||
left := nil;
|
left := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function tinlinenode.first_sqrt_real : tnode;
|
function tinlinenode.first_sqrt_real : tnode;
|
||||||
begin
|
begin
|
||||||
{ create the call to the helper }
|
{ create the call to the helper }
|
||||||
{ on entry left node contains the parameter }
|
{ on entry left node contains the parameter }
|
||||||
first_sqrt_real := ccallnode.createintern('fpc_sqrt_real',
|
first_sqrt_real := ccallnode.createintern('fpc_sqrt_real',
|
||||||
ccallparanode.create(left,nil));
|
ccallparanode.create(left,nil));
|
||||||
{ now left is nil, nothing left, so no second pass
|
{ now left is nil, nothing left, so no second pass
|
||||||
required.
|
required.
|
||||||
}
|
}
|
||||||
left := nil;
|
left := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function tinlinenode.first_ln_real : tnode;
|
function tinlinenode.first_ln_real : tnode;
|
||||||
begin
|
begin
|
||||||
{ create the call to the helper }
|
{ create the call to the helper }
|
||||||
{ on entry left node contains the parameter }
|
{ on entry left node contains the parameter }
|
||||||
first_ln_real := ccallnode.createintern('fpc_ln_real',
|
first_ln_real := ccallnode.createintern('fpc_ln_real',
|
||||||
ccallparanode.create(left,nil));
|
ccallparanode.create(left,nil));
|
||||||
{ now left is nil, nothing left, so no second pass
|
{ now left is nil, nothing left, so no second pass
|
||||||
required.
|
required.
|
||||||
}
|
}
|
||||||
left := nil;
|
left := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function tinlinenode.first_cos_real : tnode;
|
function tinlinenode.first_cos_real : tnode;
|
||||||
begin
|
begin
|
||||||
{ create the call to the helper }
|
{ create the call to the helper }
|
||||||
{ on entry left node contains the parameter }
|
{ on entry left node contains the parameter }
|
||||||
first_cos_real := ccallnode.createintern('fpc_cos_real',
|
first_cos_real := ccallnode.createintern('fpc_cos_real',
|
||||||
ccallparanode.create(left,nil));
|
ccallparanode.create(left,nil));
|
||||||
{ now left is nil, nothing left, so no second pass
|
{ now left is nil, nothing left, so no second pass
|
||||||
required.
|
required.
|
||||||
}
|
}
|
||||||
left := nil;
|
left := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function tinlinenode.first_sin_real : tnode;
|
function tinlinenode.first_sin_real : tnode;
|
||||||
begin
|
begin
|
||||||
{ create the call to the helper }
|
{ create the call to the helper }
|
||||||
{ on entry left node contains the parameter }
|
{ on entry left node contains the parameter }
|
||||||
first_sin_real := ccallnode.createintern('fpc_sin_real',
|
first_sin_real := ccallnode.createintern('fpc_sin_real',
|
||||||
ccallparanode.create(left,nil));
|
ccallparanode.create(left,nil));
|
||||||
{ now left is nil, nothing left, so no second pass
|
{ now left is nil, nothing left, so no second pass
|
||||||
required.
|
required.
|
||||||
}
|
}
|
||||||
left := nil;
|
left := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -2356,7 +2356,11 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.81 2002-07-26 12:28:50 jonas
|
Revision 1.82 2002-07-29 21:23:43 florian
|
||||||
|
* more fixes for the ppc
|
||||||
|
+ wrappers for the tcnvnode.first_* stuff introduced
|
||||||
|
|
||||||
|
Revision 1.81 2002/07/26 12:28:50 jonas
|
||||||
* don't always convert the second argument of inc/dec to a longint, but
|
* don't always convert the second argument of inc/dec to a longint, but
|
||||||
to a type based on the first argument
|
to a type based on the first argument
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ implementation
|
|||||||
{ aasm }
|
{ aasm }
|
||||||
aasmbase,aasmtai,aasmcpu,fmodule,
|
aasmbase,aasmtai,aasmcpu,fmodule,
|
||||||
{ symtable }
|
{ symtable }
|
||||||
symconst,symbase,symtype,symdef,symtable,
|
symconst,symbase,symtype,symdef,symtable,paramgr,
|
||||||
{ pass 1 }
|
{ pass 1 }
|
||||||
nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,nobj,
|
nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,nobj,
|
||||||
{ parser }
|
{ parser }
|
||||||
@ -215,6 +215,7 @@ implementation
|
|||||||
end;
|
end;
|
||||||
{ add default calling convention }
|
{ add default calling convention }
|
||||||
handle_calling_convention(nil,tabstractprocdef(tt.def));
|
handle_calling_convention(nil,tabstractprocdef(tt.def));
|
||||||
|
paramanager.create_param_loc_info(tabstractprocdef(tt.def));
|
||||||
end;
|
end;
|
||||||
if not skipequal then
|
if not skipequal then
|
||||||
begin
|
begin
|
||||||
@ -472,6 +473,7 @@ implementation
|
|||||||
consume(_SEMICOLON);
|
consume(_SEMICOLON);
|
||||||
parse_var_proc_directives(tsym(newtype));
|
parse_var_proc_directives(tsym(newtype));
|
||||||
end;
|
end;
|
||||||
|
paramanager.create_param_loc_info(tabstractprocdef(tt.def));
|
||||||
end;
|
end;
|
||||||
objectdef,
|
objectdef,
|
||||||
recorddef :
|
recorddef :
|
||||||
@ -611,7 +613,11 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.48 2002-07-01 18:46:25 peter
|
Revision 1.49 2002-07-29 21:23:43 florian
|
||||||
|
* more fixes for the ppc
|
||||||
|
+ wrappers for the tcnvnode.first_* stuff introduced
|
||||||
|
|
||||||
|
Revision 1.48 2002/07/01 18:46:25 peter
|
||||||
* internal linker
|
* internal linker
|
||||||
* reorganized aasm layer
|
* reorganized aasm layer
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ implementation
|
|||||||
globtype,globals,tokens,verbose,
|
globtype,globals,tokens,verbose,
|
||||||
systems,
|
systems,
|
||||||
{ symtable }
|
{ symtable }
|
||||||
symconst,symbase,symtype,symdef,symsym,symtable,defbase,fmodule,
|
symconst,symbase,symtype,symdef,symsym,symtable,defbase,fmodule,paramgr,
|
||||||
{ pass 1 }
|
{ pass 1 }
|
||||||
node,
|
node,
|
||||||
nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,
|
nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,
|
||||||
@ -334,6 +334,7 @@ implementation
|
|||||||
begin
|
begin
|
||||||
newtype:=ttypesym.create('unnamed',tt);
|
newtype:=ttypesym.create('unnamed',tt);
|
||||||
parse_var_proc_directives(tsym(newtype));
|
parse_var_proc_directives(tsym(newtype));
|
||||||
|
paramanager.create_param_loc_info(tabstractprocdef(tt.def));
|
||||||
newtype.restype.def:=nil;
|
newtype.restype.def:=nil;
|
||||||
tt.def.typesym:=nil;
|
tt.def.typesym:=nil;
|
||||||
newtype.free;
|
newtype.free;
|
||||||
@ -583,7 +584,11 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.29 2002-07-26 21:15:40 florian
|
Revision 1.30 2002-07-29 21:23:44 florian
|
||||||
|
* more fixes for the ppc
|
||||||
|
+ wrappers for the tcnvnode.first_* stuff introduced
|
||||||
|
|
||||||
|
Revision 1.29 2002/07/26 21:15:40 florian
|
||||||
* rewrote the system handling
|
* rewrote the system handling
|
||||||
|
|
||||||
Revision 1.28 2002/07/20 11:57:55 florian
|
Revision 1.28 2002/07/20 11:57:55 florian
|
||||||
|
@ -44,6 +44,7 @@ unit cgcpu;
|
|||||||
|
|
||||||
|
|
||||||
procedure a_call_name(list : taasmoutput;const s : string);override;
|
procedure a_call_name(list : taasmoutput;const s : string);override;
|
||||||
|
procedure a_call_ref(list : taasmoutput;const ref : treference);override;
|
||||||
|
|
||||||
procedure a_op_const_reg(list : taasmoutput; Op: TOpCG; a: AWord; reg: TRegister); override;
|
procedure a_op_const_reg(list : taasmoutput; Op: TOpCG; a: AWord; reg: TRegister); override;
|
||||||
procedure a_op_reg_reg(list : taasmoutput; Op: TOpCG; size: TCGSize; src, dst: TRegister); override;
|
procedure a_op_reg_reg(list : taasmoutput; Op: TOpCG; size: TCGSize; src, dst: TRegister); override;
|
||||||
@ -91,6 +92,13 @@ unit cgcpu;
|
|||||||
{ that's the case, we can use rlwinm to do an AND operation }
|
{ that's the case, we can use rlwinm to do an AND operation }
|
||||||
function get_rlwi_const(a: longint; var l1, l2: longint): boolean;
|
function get_rlwi_const(a: longint; var l1, l2: longint): boolean;
|
||||||
|
|
||||||
|
procedure g_push_exception(list : taasmoutput;const exceptbuf:treference;l:AWord; exceptlabel:TAsmLabel);override;
|
||||||
|
procedure g_pop_exception(list : taasmoutput;endexceptlabel:tasmlabel);override;
|
||||||
|
|
||||||
|
procedure g_save_standard_registers(list : taasmoutput);override;
|
||||||
|
procedure g_restore_standard_registers(list : taasmoutput);override;
|
||||||
|
procedure g_save_all_registers(list : taasmoutput);override;
|
||||||
|
procedure g_restore_all_registers(list : taasmoutput;selfused,accused,acchiused:boolean);override;
|
||||||
private
|
private
|
||||||
|
|
||||||
procedure a_jmp_cond(list : taasmoutput;cond : TOpCmp;l: tasmlabel);
|
procedure a_jmp_cond(list : taasmoutput;cond : TOpCmp;l: tasmlabel);
|
||||||
@ -201,7 +209,11 @@ const
|
|||||||
internalerror(2002072801);
|
internalerror(2002072801);
|
||||||
end;
|
end;
|
||||||
else
|
else
|
||||||
internalerror(2002081103);
|
begin
|
||||||
|
runerror(216);
|
||||||
|
writeln(ord(locpara.loc));
|
||||||
|
internalerror(2002081103);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
if locpara.sp_fixup<>0 then
|
if locpara.sp_fixup<>0 then
|
||||||
internalerror(2002081104);
|
internalerror(2002081104);
|
||||||
@ -231,15 +243,14 @@ const
|
|||||||
{$endif para_sizes_known}
|
{$endif para_sizes_known}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ calling a code fragment by name }
|
{ calling a code fragment by name }
|
||||||
|
|
||||||
procedure tcgppc.a_call_name(list : taasmoutput;const s : string);
|
procedure tcgppc.a_call_name(list : taasmoutput;const s : string);
|
||||||
|
|
||||||
var
|
var
|
||||||
href : treference;
|
href : treference;
|
||||||
begin
|
begin
|
||||||
{ save our RTOC register value. Only necessary when doing pointer based }
|
{ save our RTOC register value. Only necessary when doing pointer based }
|
||||||
{ calls or cross TOC calls, but currently done always }
|
{ calls or cross TOC calls, but currently done always }
|
||||||
reference_reset_base(href,STACK_POINTER_REG,LA_RTOC);
|
reference_reset_base(href,STACK_POINTER_REG,LA_RTOC);
|
||||||
list.concat(taicpu.op_reg_ref(A_STW,R_TOC,href));
|
list.concat(taicpu.op_reg_ref(A_STW,R_TOC,href));
|
||||||
list.concat(taicpu.op_sym(A_BL,newasmsymbol(s)));
|
list.concat(taicpu.op_sym(A_BL,newasmsymbol(s)));
|
||||||
@ -247,6 +258,12 @@ const
|
|||||||
list.concat(taicpu.op_reg_ref(A_LWZ,R_TOC,href));
|
list.concat(taicpu.op_reg_ref(A_LWZ,R_TOC,href));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ calling a code fragment through a reference }
|
||||||
|
procedure tcgppc.a_call_ref(list : taasmoutput;const ref : treference);
|
||||||
|
begin
|
||||||
|
{$warning FIX ME}
|
||||||
|
end;
|
||||||
|
|
||||||
{********************** load instructions ********************}
|
{********************** load instructions ********************}
|
||||||
|
|
||||||
procedure tcgppc.a_load_const_reg(list : taasmoutput; size: TCGSize; a : aword; reg : TRegister);
|
procedure tcgppc.a_load_const_reg(list : taasmoutput; size: TCGSize; a : aword; reg : TRegister);
|
||||||
@ -626,6 +643,36 @@ const
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure tcgppc.g_push_exception(list : taasmoutput;const exceptbuf:treference;l:AWord; exceptlabel:TAsmLabel);
|
||||||
|
begin
|
||||||
|
{$warning FIX ME}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure tcgppc.g_pop_exception(list : taasmoutput;endexceptlabel:tasmlabel);
|
||||||
|
begin
|
||||||
|
{$warning FIX ME}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure tcgppc.g_save_standard_registers(list : taasmoutput);
|
||||||
|
begin
|
||||||
|
{$warning FIX ME}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure tcgppc.g_restore_standard_registers(list : taasmoutput);
|
||||||
|
begin
|
||||||
|
{$warning FIX ME}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure tcgppc.g_save_all_registers(list : taasmoutput);
|
||||||
|
begin
|
||||||
|
{$warning FIX ME}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure tcgppc.g_restore_all_registers(list : taasmoutput;selfused,accused,acchiused:boolean);
|
||||||
|
begin
|
||||||
|
{$warning FIX ME}
|
||||||
|
end;
|
||||||
|
|
||||||
procedure tcgppc.a_jmp_cond(list : taasmoutput;cond : TOpCmp;l: tasmlabel);
|
procedure tcgppc.a_jmp_cond(list : taasmoutput;cond : TOpCmp;l: tasmlabel);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@ -1410,7 +1457,11 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.29 2002-07-28 21:38:30 florian
|
Revision 1.30 2002-07-29 21:23:44 florian
|
||||||
|
* more fixes for the ppc
|
||||||
|
+ wrappers for the tcnvnode.first_* stuff introduced
|
||||||
|
|
||||||
|
Revision 1.29 2002/07/28 21:38:30 florian
|
||||||
- removed debug code which was commited by accident
|
- removed debug code which was commited by accident
|
||||||
|
|
||||||
Revision 1.28 2002/07/28 21:34:31 florian
|
Revision 1.28 2002/07/28 21:34:31 florian
|
||||||
|
@ -85,6 +85,7 @@ implementation
|
|||||||
fname := 'fpc_qword_to_double';
|
fname := 'fpc_qword_to_double';
|
||||||
result := ccallnode.createintern(fname,ccallparanode.create(
|
result := ccallnode.createintern(fname,ccallparanode.create(
|
||||||
left,nil));
|
left,nil));
|
||||||
|
left:=nil;
|
||||||
firstpass(result);
|
firstpass(result);
|
||||||
exit;
|
exit;
|
||||||
end
|
end
|
||||||
@ -416,7 +417,11 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.18 2002-07-29 09:20:20 jonas
|
Revision 1.19 2002-07-29 21:23:44 florian
|
||||||
|
* more fixes for the ppc
|
||||||
|
+ wrappers for the tcnvnode.first_* stuff introduced
|
||||||
|
|
||||||
|
Revision 1.18 2002/07/29 09:20:20 jonas
|
||||||
+ second_int_to_int implementation which is almost the same as the
|
+ second_int_to_int implementation which is almost the same as the
|
||||||
generic implementation, but it avoids some unnecessary type conversions
|
generic implementation, but it avoids some unnecessary type conversions
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user