diff options
author | florian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2013-04-25 20:23:51 +0000 |
---|---|---|
committer | florian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2013-04-25 20:23:51 +0000 |
commit | 8728e095105c989b760ccd6aba8655f6f44e1285 (patch) | |
tree | 519c6c43af90e6eedb0755412a5dd5ca4e2ed930 /compiler/ncgutil.pas | |
parent | 0f33efaa8fe401d95fa11b53b3bfbb7315060051 (diff) | |
parent | 0980e6ba55dee5179db444146b682a72a70763f7 (diff) | |
download | fpc-8728e095105c989b760ccd6aba8655f6f44e1285.tar.gz |
* merge i8086 branch by Nikolay Nikolov
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@24324 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/ncgutil.pas')
-rw-r--r-- | compiler/ncgutil.pas | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/compiler/ncgutil.pas b/compiler/ncgutil.pas index 5a34501726..b88d1103c0 100644 --- a/compiler/ncgutil.pas +++ b/compiler/ncgutil.pas @@ -408,6 +408,14 @@ implementation procedure new_exception(list:TAsmList;const t:texceptiontemps;exceptlabel:tasmlabel); + const +{$ifdef cpu16bitaddr} + pushexceptaddr_frametype_cgsize = OS_S16; + setjmp_result_cgsize = OS_S16; +{$else cpu16bitaddr} + pushexceptaddr_frametype_cgsize = OS_S32; + setjmp_result_cgsize = OS_S32; +{$endif cpu16bitaddr} var paraloc1,paraloc2,paraloc3 : tcgpara; pd: tprocdef; @@ -419,10 +427,20 @@ implementation paramanager.getintparaloc(pd,1,paraloc1); paramanager.getintparaloc(pd,2,paraloc2); paramanager.getintparaloc(pd,3,paraloc3); - cg.a_loadaddr_ref_cgpara(list,t.envbuf,paraloc3); - cg.a_loadaddr_ref_cgpara(list,t.jmpbuf,paraloc2); - { push type of exceptionframe } - cg.a_load_const_cgpara(list,OS_S32,1,paraloc1); + if pd.is_pushleftright then + begin + { push type of exceptionframe } + cg.a_load_const_cgpara(list,pushexceptaddr_frametype_cgsize,1,paraloc1); + cg.a_loadaddr_ref_cgpara(list,t.jmpbuf,paraloc2); + cg.a_loadaddr_ref_cgpara(list,t.envbuf,paraloc3); + end + else + begin + cg.a_loadaddr_ref_cgpara(list,t.envbuf,paraloc3); + cg.a_loadaddr_ref_cgpara(list,t.jmpbuf,paraloc2); + { push type of exceptionframe } + cg.a_load_const_cgpara(list,pushexceptaddr_frametype_cgsize,1,paraloc1); + end; paramanager.freecgpara(list,paraloc3); paramanager.freecgpara(list,paraloc2); paramanager.freecgpara(list,paraloc1); @@ -440,7 +458,7 @@ implementation cg.alloccpuregisters(list,R_INTREGISTER,[RS_FUNCTION_RESULT_REG]); cg.g_exception_reason_save(list, t.reasonbuf); - cg.a_cmp_const_reg_label(list,OS_S32,OC_NE,0,cg.makeregsize(list,NR_FUNCTION_RESULT_REG,OS_S32),exceptlabel); + cg.a_cmp_const_reg_label(list,setjmp_result_cgsize,OC_NE,0,cg.makeregsize(list,NR_FUNCTION_RESULT_REG,setjmp_result_cgsize),exceptlabel); cg.dealloccpuregisters(list,R_INTREGISTER,[RS_FUNCTION_RESULT_REG]); paraloc1.done; paraloc2.done; @@ -1027,10 +1045,14 @@ implementation begin unget_para(paraloc^); gen_alloc_regloc(list,destloc); - cg.a_load_cgparaloc_anyreg(list,OS_32,paraloc^,destloc.register,sizeof(aint)); + cg.a_load_cgparaloc_anyreg(list,OS_INT,paraloc^,destloc.register,sizeof(aint)); unget_para(paraloc^.Next^); gen_alloc_regloc(list,destloc); - cg.a_load_cgparaloc_anyreg(list,OS_32,paraloc^.Next^,destloc.registerhi,sizeof(aint)); + {$if defined(cpu16bitalu) or defined(cpu8bitalu)} + cg.a_load_cgparaloc_anyreg(list,OS_INT,paraloc^.Next^,GetNextReg(destloc.register),sizeof(aint)); + {$else} + cg.a_load_cgparaloc_anyreg(list,OS_INT,paraloc^.Next^,destloc.registerhi,sizeof(aint)); + {$endif} end else internalerror(200410105); |