diff options
author | florian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2011-04-19 20:17:52 +0000 |
---|---|---|
committer | florian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2011-04-19 20:17:52 +0000 |
commit | 2dca8fd004f11acbb1d4f5825b8f43645b9438f4 (patch) | |
tree | 60c6228d001e260c8ef3901dc295d55f0ba9425e /compiler/avr/cpupara.pas | |
parent | c38b26532690a89dd936037853fee2fc042b13dd (diff) | |
download | fpc-2dca8fd004f11acbb1d4f5825b8f43645b9438f4.tar.gz |
* reintegrate avr branch into trunk, work on avr is less invasive than I thought so it can be continued in trunk
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@17348 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/avr/cpupara.pas')
-rw-r--r-- | compiler/avr/cpupara.pas | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/compiler/avr/cpupara.pas b/compiler/avr/cpupara.pas index 57d84ffb89..d313d24896 100644 --- a/compiler/avr/cpupara.pas +++ b/compiler/avr/cpupara.pas @@ -84,17 +84,17 @@ unit cpupara; begin size:=OS_INT; { the four first parameters are passed into registers } - if nr<=4 then + if nr<=9 then begin loc:=LOC_REGISTER; - register:=newreg(R_INTREGISTER,RS_R0+nr-1,R_SUBWHOLE); + register:=newreg(R_INTREGISTER,RS_R25-(nr-1)*2,R_SUBWHOLE); end else begin { the other parameters are passed on the stack } loc:=LOC_REFERENCE; reference.index:=NR_STACK_POINTER_REG; - reference.offset:=(nr-5)*4; + reference.offset:=(nr-10)*2; end; end; end; @@ -200,13 +200,14 @@ unit cpupara; procedure tavrparamanager.init_values(var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword); begin - curintreg:=RS_R0; + curintreg:=RS_R25; curfloatreg:=RS_INVALID; curmmreg:=RS_INVALID; cur_stack_offset:=0; end; + { TODO : fix tavrparamanager.create_paraloc_info_intern } function tavrparamanager.create_paraloc_info_intern(p : tabstractprocdef; side: tcallercallee; paras: tparalist; var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword):longint; @@ -225,7 +226,7 @@ unit cpupara; begin { In case of po_delphi_nested_cc, the parent frame pointer is always passed on the stack. } - if (nextintreg<=RS_R3) and + if (nextintreg>RS_R8) and (not(vo_is_parentfp in hp.varoptions) or not(po_delphi_nested_cc in p.procoptions)) then begin @@ -238,7 +239,7 @@ unit cpupara; paraloc^.loc:=LOC_REFERENCE; paraloc^.reference.index:=NR_STACK_POINTER_REG; paraloc^.reference.offset:=stack_offset; - inc(stack_offset,4); + dec(stack_offset,2); end; end; @@ -265,7 +266,7 @@ unit cpupara; paraloc:=hp.paraloc[side].add_location; { hack: the paraloc must be valid, but is not actually used } paraloc^.loc:=LOC_REGISTER; - paraloc^.register:=NR_R0; + paraloc^.register:=NR_R25; paraloc^.size:=OS_ADDR; break; end; @@ -333,11 +334,11 @@ unit cpupara; begin { this is not abi compliant why? (FK) } - if nextintreg<=RS_R3 then + if nextintreg>=RS_R8 then begin paraloc^.loc:=LOC_REGISTER; paraloc^.register:=newreg(R_INTREGISTER,nextintreg,R_SUBWHOLE); - inc(nextintreg); + dec(nextintreg); end else begin @@ -374,7 +375,7 @@ unit cpupara; if paraloc^.loc=LOC_REFERENCE then begin paraloc^.reference.index:=NR_FRAME_POINTER_REG; - inc(paraloc^.reference.offset,4); + inc(paraloc^.reference.offset,2); end; end; dec(paralen,tcgsize2size[paraloc^.size]); @@ -408,6 +409,7 @@ unit cpupara; end; + { TODO : fix tavrparamanager.get_funcretloc } function tavrparamanager.get_funcretloc(p : tabstractprocdef; side: tcallercallee; def: tdef): tcgpara; var retcgsize : tcgsize; |