From a526b0e5d69ce47edc97adeb2f7402324e2f0bd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A1roly=20Balogh?= Date: Sun, 8 Feb 2015 10:26:47 +0000 Subject: [PATCH] m68k: implemented some missing bits of FPU cgpara handling, functions with float arguments seem to work much better now git-svn-id: trunk@29650 - --- compiler/m68k/cgcpu.pas | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/compiler/m68k/cgcpu.pas b/compiler/m68k/cgcpu.pas index 91881a3dd4..cee1a6535a 100644 --- a/compiler/m68k/cgcpu.pas +++ b/compiler/m68k/cgcpu.pas @@ -58,6 +58,7 @@ unit cgcpu; procedure a_loadfpu_reg_reg(list: TAsmList; fromsize, tosize: tcgsize; reg1, reg2: tregister); override; procedure a_loadfpu_ref_reg(list: TAsmList; fromsize, tosize: tcgsize; const ref: treference; reg: tregister); override; procedure a_loadfpu_reg_ref(list: TAsmList; fromsize, tosize: tcgsize; reg: tregister; const ref: treference); override; + procedure a_loadfpu_reg_cgpara(list : TAsmList; size : tcgsize;const reg : tregister;const cgpara : TCGPara); override; procedure a_loadfpu_ref_cgpara(list : TAsmList; size : tcgsize;const ref : treference;const cgpara : TCGPara);override; procedure a_op_const_reg(list : TAsmList; Op: TOpCG; size: tcgsize; a: tcgint; reg: TRegister); override; @@ -1007,8 +1008,28 @@ unit cgcpu; list.concat(taicpu.op_reg_ref(A_FMOVE,opsize,reg,href)); end; + procedure tcg68k.a_loadfpu_reg_cgpara(list : TAsmList;size : tcgsize;const reg : tregister;const cgpara : tcgpara); + var + ref : treference; + begin + if use_push(cgpara) and (current_settings.fputype in [fpu_68881]) then + begin + cgpara.check_simple_location; + { FIXME: 68k cg really needs to support 2 byte stack alignment, otherwise the "Extended" + floating point type cannot work (KB) } + reference_reset_base(ref, NR_STACK_POINTER_REG, 0, cgpara.alignment); + ref.direction := dir_dec; + list.concat(taicpu.op_reg_ref(A_FMOVE,tcgsize2opsize[cgpara.location^.size],reg,ref)); + end + else + inherited a_loadfpu_reg_cgpara(list,size,reg,cgpara); + end; procedure tcg68k.a_loadfpu_ref_cgpara(list : TAsmList; size : tcgsize;const ref : treference;const cgpara : TCGPara); + var + href : treference; + fref : treference; + freg : tregister; begin if current_settings.fputype = fpu_soft then case cgpara.location^.loc of @@ -1027,7 +1048,22 @@ unit cgcpu; inherited a_loadfpu_ref_cgpara(list,size,ref,cgpara); end else - inherited a_loadfpu_ref_cgpara(list,size,ref,cgpara); + if use_push(cgpara) and (current_settings.fputype in [fpu_68881]) then + begin + fref:=ref; + fixref(list,fref); + { fmove can't do -> , so move it to an fpreg first } + freg:=getfpuregister(list,size); + a_loadfpu_ref_reg(list,size,size,fref,freg); + reference_reset_base(href, NR_STACK_POINTER_REG, 0, cgpara.alignment); + href.direction := dir_dec; + list.concat(taicpu.op_reg_ref(A_FMOVE,tcgsize2opsize[cgpara.location^.size],freg,href)); + end + else + begin + //list.concat(tai_comment.create(strpnew('a_loadfpu_ref_cgpara inherited'))); + inherited a_loadfpu_ref_cgpara(list,size,ref,cgpara); + end; end;