From a3aea23c2e3be0bb7448a200071d00cce79d7bcc Mon Sep 17 00:00:00 2001 From: mazen Date: Mon, 6 Jan 2003 22:51:47 +0000 Subject: [PATCH] * fixing bugs related to load_reg_ref --- compiler/sparc/cgcpu.pas | 65 ++++++++++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 15 deletions(-) diff --git a/compiler/sparc/cgcpu.pas b/compiler/sparc/cgcpu.pas index 6081515472..f65efeb89e 100644 --- a/compiler/sparc/cgcpu.pas +++ b/compiler/sparc/cgcpu.pas @@ -78,6 +78,7 @@ specific processor ABI. It is overriden for each CPU target. procedure g_flags2reg(list:TAasmOutput;Size:TCgSize;CONST f:tresflags;reg:TRegister);override; procedure g_overflowCheck(List:TAasmOutput;const p:TNode);override; procedure g_stackframe_entry(list:TAasmOutput;localsize:LongInt);override; + procedure g_restore_all_registers(list:TAasmOutput;selfused,accused,acchiused:boolean);override; procedure g_restore_frame_pointer(list:TAasmOutput);override; procedure g_return_from_proc(list:TAasmOutput;parasize:aword);override; procedure g_save_all_registers(list : taasmoutput);override; @@ -252,28 +253,55 @@ procedure TCgSparc.a_load_const_ref(list:TAasmOutput;size:tcgsize;a:aword;CONST WITH List DO IF a=0 THEN - Concat(taicpu.op_reg_ref(A_ST,R_G0,ref)) + Concat(taicpu.op_reg_ref(A_ST,R_G0,Ref)) ELSE BEGIN a_load_const_reg(list,size,a,R_G1); - case size of - OS_32,OS_S32: - Concat(taicpu.op_reg_ref(A_ST,R_G1,ref)); - OS_64,OS_S64: - Concat(taicpu.op_reg_ref(A_STD,R_G1,ref)); - else - InternalError(2002102100); - end; + a_load_reg_ref(list,size,R_G1,Ref); END; END; -procedure TCgSparc.a_load_reg_ref(list:TAasmOutput;size:TCGSize;reg:tregister;CONST ref:TReference); - BEGIN - list.concat(taicpu.op_reg_ref(A_ST,reg,ref)); - END; +procedure TCgSparc.a_load_reg_ref(list:TAasmOutput;size:TCGSize;reg:tregister;const Ref:TReference); + var + op:tasmop; + begin + case size of + { signed integer registers } + OS_S8: + Op:=A_STB;{Store Signed Byte} + OS_S16: + Op:=A_STH;{Store Signed Halfword} + OS_S32: + Op:=A_ST;{Store Word} + OS_S64: + Op:=A_STD;{Store Double Word} + { unsigned integer registers } + //A_STSTUB;{Store-Store Unsigned Byte} + OS_8: + Op:=A_STB;{Store Unsigned Bye} + OS_16: + Op:=A_STH;{Store Unsigned Halfword} + OS_32: + Op:=A_ST;{Store Word} + OS_64: + Op:=A_STD;{Store Double Word} + { floating-point real registers } + OS_F32: + Op:=A_STF;{Store Floating-point word} + //A_STFSR + OS_F64: + Op:=A_STDF;{Store Double Floating-point word} + //A_STC;{Store Coprocessor} + //A_STCSR; + //A_STDC;{Store Double Coprocessor} + else + InternalError(2002122100); + end; + with list do + concat(taicpu.op_reg_ref(op,reg,ref)); + end; procedure TCgSparc.a_load_ref_reg(list:TAasmOutput;size:TCgSize;const ref:TReference;reg:tregister); var op:tasmop; - s:topsize; begin case size of { signed integer registers } @@ -907,6 +935,10 @@ after execution of that instruction is the called function stack pointer} with list do concat(Taicpu.Op_reg_const_reg(A_SAVE,Stack_Pointer_Reg,-LocalSize,Stack_Pointer_Reg)); end; +procedure TCgSparc.g_restore_all_registers(list:TaasmOutput;selfused,accused,acchiused:boolean); + begin + {$warning FIX ME TCgSparc.g_restore_all_registers} + end; procedure TCgSparc.g_restore_frame_pointer(list:TAasmOutput); begin {This function intontionally does nothing as frame pointer is restored in the @@ -1345,7 +1377,10 @@ BEGIN END. { $Log$ - Revision 1.31 2003-01-05 21:32:35 mazen + Revision 1.32 2003-01-06 22:51:47 mazen + * fixing bugs related to load_reg_ref + + Revision 1.31 2003/01/05 21:32:35 mazen * fixing several bugs compiling the RTL Revision 1.30 2003/01/05 13:36:53 florian