From f95d5e0de6dcfdb3b6e3c28dc1c764cd87ff9b5c Mon Sep 17 00:00:00 2001 From: florian <florian@freepascal.org> Date: Fri, 10 Apr 2015 20:33:11 +0000 Subject: [PATCH] + support 8 locations in gen_load_cgpara_loc git-svn-id: trunk@30534 - --- compiler/ncgutil.pas | 49 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/compiler/ncgutil.pas b/compiler/ncgutil.pas index 50fdf3c64c..005c4ad155 100644 --- a/compiler/ncgutil.pas +++ b/compiler/ncgutil.pas @@ -790,6 +790,9 @@ implementation {$ifndef cpu64bitalu} tempreg : tregister; reg64 : tregister64; +{$if defined(cpu8bitalu)} + curparaloc : PCGParaLocation; +{$endif defined(cpu8bitalu)} {$endif not cpu64bitalu} begin paraloc:=para.location; @@ -894,6 +897,52 @@ implementation LOC_REGISTER: begin case para.locations_count of +{$if defined(cpu8bitalu)} + { 8 paralocs? } + 8: + if (target_info.endian=ENDIAN_BIG) then + begin + { is there any big endian 8 bit ALU/16 bit Addr CPU? } + internalerror(2015041003); + { paraloc^ -> high + paraloc^.next^.next^.next^.next -> low } + unget_para(paraloc^); + gen_alloc_regloc(list,destloc); + { reg->reg, alignment is irrelevant } + cg.a_load_cgparaloc_anyreg(list,OS_16,paraloc^,GetNextReg(destloc.register64.reghi),1); + unget_para(paraloc^.next^); + cg.a_load_cgparaloc_anyreg(list,OS_16,paraloc^.next^,destloc.register64.reghi,1); + unget_para(paraloc^.next^.next^); + cg.a_load_cgparaloc_anyreg(list,OS_16,paraloc^.next^.next^,GetNextReg(destloc.register64.reglo),1); + unget_para(paraloc^.next^.next^.next^); + cg.a_load_cgparaloc_anyreg(list,OS_16,paraloc^.next^.next^.next^,destloc.register64.reglo,1); + end + else + begin + { paraloc^ -> low + paraloc^.next^.next^.next^.next -> high } + curparaloc:=paraloc; + unget_para(curparaloc^); + gen_alloc_regloc(list,destloc); + cg.a_load_cgparaloc_anyreg(list,OS_8,curparaloc^,destloc.register64.reglo,2); + unget_para(curparaloc^.next^); + cg.a_load_cgparaloc_anyreg(list,OS_8,curparaloc^.next^,GetNextReg(destloc.register64.reglo),1); + unget_para(curparaloc^.next^.next^); + cg.a_load_cgparaloc_anyreg(list,OS_8,curparaloc^.next^.next^,GetNextReg(GetNextReg(destloc.register64.reglo)),1); + unget_para(curparaloc^.next^.next^.next^); + cg.a_load_cgparaloc_anyreg(list,OS_8,curparaloc^.next^.next^,GetNextReg(GetNextReg(GetNextReg(destloc.register64.reglo))),1); + + curparaloc:=paraloc^.next^.next^.next^.next; + unget_para(curparaloc^); + cg.a_load_cgparaloc_anyreg(list,OS_8,curparaloc^,destloc.register64.reghi,2); + unget_para(curparaloc^.next^); + cg.a_load_cgparaloc_anyreg(list,OS_8,curparaloc^.next^,GetNextReg(destloc.register64.reghi),1); + unget_para(curparaloc^.next^.next^); + cg.a_load_cgparaloc_anyreg(list,OS_8,curparaloc^.next^.next^,GetNextReg(GetNextReg(destloc.register64.reghi)),1); + unget_para(curparaloc^.next^.next^.next^); + cg.a_load_cgparaloc_anyreg(list,OS_8,curparaloc^.next^.next^.next^,GetNextReg(GetNextReg(GetNextReg(destloc.register64.reghi))),1); + end; +{$endif defined(cpu8bitalu)} {$if defined(cpu16bitalu) or defined(cpu8bitalu)} { 4 paralocs? } 4: