From bccc2f686381b08d9651e72f36e61e363044feb4 Mon Sep 17 00:00:00 2001 From: florian <florian@freepascal.org> Date: Sun, 9 Jul 2017 21:33:24 +0000 Subject: [PATCH] + tcg.a_loadfpu_intreg_reg, make use of it in tcg.a_load_cgparaloc_anyreg git-svn-id: trunk@36717 - --- compiler/cgobj.pas | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/compiler/cgobj.pas b/compiler/cgobj.pas index 9cf439b43c..8325a6088b 100644 --- a/compiler/cgobj.pas +++ b/compiler/cgobj.pas @@ -264,6 +264,8 @@ unit cgobj; procedure a_loadfpu_reg_cgpara(list : TAsmList;size : tcgsize;const r : tregister;const cgpara : TCGPara);virtual; procedure a_loadfpu_ref_cgpara(list : TAsmList;size : tcgsize;const ref : treference;const cgpara : TCGPara);virtual; + procedure a_loadfpu_intreg_reg(list: TAsmList; fromsize, tosize : tcgsize; intreg, fpureg: tregister); virtual; + { vector register move instructions } procedure a_loadmm_reg_reg(list: TAsmList; fromsize, tosize : tcgsize;reg1, reg2: tregister;shuffle : pmmshuffle); virtual; procedure a_loadmm_ref_reg(list: TAsmList; fromsize, tosize : tcgsize;const ref: treference; reg: tregister;shuffle : pmmshuffle); virtual; @@ -1158,6 +1160,8 @@ implementation a_load_reg_reg(list,paraloc.size,regsize,paraloc.register,reg); R_MMREGISTER: a_loadmm_intreg_reg(list,paraloc.size,regsize,paraloc.register,reg,mms_movescalar); + R_FPUREGISTER: + a_loadfpu_intreg_reg(list,paraloc.size,regsize,paraloc.register,reg); else internalerror(2009112422); end; @@ -1689,6 +1693,21 @@ implementation end; + procedure tcg.a_loadfpu_intreg_reg(list : TAsmList; fromsize,tosize : tcgsize; intreg,fpureg : tregister); + var + tmpref: treference; + begin + if not(tcgsize2size[fromsize] in [4,8]) or + not(tcgsize2size[tosize] in [4,8]) or + (tcgsize2size[fromsize]<>tcgsize2size[tosize]) then + internalerror(2017070902); + tg.gettemp(list,tcgsize2size[fromsize],tcgsize2size[fromsize],tt_normal,tmpref); + a_load_reg_ref(list,fromsize,fromsize,intreg,tmpref); + a_loadfpu_ref_reg(list,tosize,tosize,tmpref,fpureg); + tg.ungettemp(list,tmpref); + end; + + procedure tcg.a_op_const_ref(list : TAsmList; Op: TOpCG; size: TCGSize; a: tcgint; const ref: TReference); var tmpreg : tregister;