diff --git a/compiler/m68k/cgcpu.pas b/compiler/m68k/cgcpu.pas index f2c6264557..406e68598f 100644 --- a/compiler/m68k/cgcpu.pas +++ b/compiler/m68k/cgcpu.pas @@ -66,6 +66,7 @@ unit cgcpu; procedure g_restore_frame_pointer(list : taasmoutput);override; procedure g_return_from_proc(list : taasmoutput;parasize : aword);override; procedure g_restore_standard_registers(list:Taasmoutput);override; + procedure g_save_standard_registers(list:Taasmoutput);override; procedure g_save_all_registers(list : taasmoutput);override; procedure g_restore_all_registers(list : taasmoutput;const funcretparaloc:tparalocation);override; protected @@ -105,7 +106,7 @@ unit cgcpu; uses globtype,globals,verbose,systems,cutils, - symdef,symsym,defutil,paramgr, + symdef,symsym,defutil,paramgr,procinfo, rgobj,tgobj,rgcpu, cgutils; @@ -986,7 +987,7 @@ unit cgcpu; end { endif localsize <> 0 } else begin - reference_reset_base(ref,NR_STACK_POINTER_REG); + reference_reset_base(ref,NR_STACK_POINTER_REG,0); ref.direction:=dir_dec; list.concat(taicpu.op_reg_ref(A_MOVE,S_L,r,ref)); list.concat(taicpu.op_reg_reg(A_MOVE,S_L,rsp,r)); @@ -1038,7 +1039,7 @@ unit cgcpu; { save the PC counter (pop it from the stack) } hregister := getaddressregister(list); - reference_reset_base(ref,NR_STACK_POINTER_REG); + reference_reset_base(ref,NR_STACK_POINTER_REG,0); ref.direction:=dir_inc; list.concat(taicpu.op_ref_reg(A_MOVE,S_L,ref,hregister)); { can we do a quick addition ... } @@ -1049,7 +1050,7 @@ unit cgcpu; list.concat(taicpu.op_const_reg(A_ADD,S_L,parasize,r)); { restore the PC counter (push it on the stack) } - reference_reset_base(ref,NR_STACK_POINTER_REG); + reference_reset_base(ref,NR_STACK_POINTER_REG,0); ref.direction:=dir_dec; list.concat(taicpu.op_reg_ref(A_MOVE,S_L,hregister,ref)); list.concat(taicpu.op_none(A_RTS,S_NO)); @@ -1060,41 +1061,43 @@ unit cgcpu; end; - procedure Tcg68k.g_save_standard_registers(list:Taasmoutput;usedinproc:Tsupregset); + procedure Tcg68k.g_save_standard_registers(list:Taasmoutput); var - tosave:Tsupregset; + tosave : tcpuregisterset; ref : treference; begin + tosave:=std_saved_registers; { only save the registers which are not used and must be saved } - tosave:=tosave*usedinproc; - reference_reset_base(ref,NR_STACK_POINTER_REG); + tosave:=tosave*(rg[R_INTREGISTER].used_in_proc+rg[R_ADDRESSREGISTER].used_in_proc); + reference_reset_base(ref,NR_STACK_POINTER_REG,0); ref.direction:=dir_dec; if tosave<>[] then - list.concat(taicpu.op_reglist_reg(A_MOVEM,S_L,tosave,r)); + list.concat(taicpu.op_regset_ref(A_MOVEM,S_L,tosave,ref)); end; - procedure Tcg68k.g_restore_standard_registers(list:Taasmoutput;usedinproc:Tsupregset); + procedure Tcg68k.g_restore_standard_registers(list:Taasmoutput); var - torestore:Tsupregset; + torestore : tcpuregisterset; r:Tregister; ref : treference; begin torestore:=std_saved_registers; { should be intersected with used regs, no ? } - torestore:=torestore*usedinproc; - reference_reset_base(ref,NR_STACKPOINTER_REG); + torestore:=torestore*(rg[R_INTREGISTER].used_in_proc+rg[R_ADDRESSREGISTER].used_in_proc); + reference_reset_base(ref,NR_STACK_POINTER_REG,0); ref.direction:=dir_inc; if torestore<>[] then - list.concat(taicpu.op_ref_reglist(A_MOVEM,S_L,ref,torestore)); + list.concat(taicpu.op_ref_regset(A_MOVEM,S_L,ref,torestore)); end; + procedure tcg68k.g_save_all_registers(list : taasmoutput); begin end; - procedure tcg68k.g_restore_all_registers(list : taasmoutput;accused,acchiused:boolean); + procedure tcg68k.g_restore_all_registers(list : taasmoutput;const funcretparaloc:tparalocation); begin end; @@ -1273,7 +1276,10 @@ end. { $Log$ - Revision 1.23 2004-04-18 21:13:59 florian + Revision 1.24 2004-04-19 21:15:12 florian + * fixed compilation + + Revision 1.23 2004/04/18 21:13:59 florian * more adaptions for m68k Revision 1.22 2004/03/02 00:36:33 olle