@@ -1371,6 +1371,7 @@ void fixresult(ref CodeBuilder cdb, elem* e, regm_t retregs, ref regm_t outretre
13711371 regm_t forccs = outretregs & mPSW;
13721372 regm_t forregs = outretregs & (INSTR .ALLREGS | INSTR .FLOATREGS );
13731373 tym_t tym = tybasic(e.Ety);
1374+ bool isPair = isRegisterPair(true , tym, 0 );
13741375
13751376 if (tym == TYstruct)
13761377 {
@@ -1388,8 +1389,32 @@ void fixresult(ref CodeBuilder cdb, elem* e, regm_t retregs, ref regm_t outretre
13881389 outretregs = retregs;
13891390 else if (forregs) // if return the result in registers
13901391 {
1391- bool opsflag = false ;
1392- if (tyfloating(tym))
1392+ if (isPair)
1393+ {
1394+ sz /= 2 ;
1395+ reg_t msreg = findreg(retregs & INSTR .MSW );
1396+ reg_t lsreg = findreg(retregs & INSTR .LSW );
1397+
1398+ allocreg(cdb, outretregs, tym); // allocate return regs
1399+ reg_t msrreg = findreg(outretregs & INSTR .MSW );
1400+ reg_t lsrreg = findreg(outretregs & INSTR .LSW );
1401+
1402+ // should fix genmovreg() to do this work
1403+ if (tyfloating(tym))
1404+ {
1405+ const uint ftype = INSTR .szToFtype(sz);
1406+ assert ((msreg & lsreg & msrreg & lsrreg) & 32 ); // ensure all fp registers
1407+ cdb.gen1(INSTR .fmov(ftype,msreg,msrreg)); // FMOV msrreg,msreg
1408+ cdb.gen1(INSTR .fmov(ftype,lsreg,lsrreg)); // FMOV lsrreg,lsreg
1409+ }
1410+ else
1411+ {
1412+ assert (((msreg | lsreg | msrreg | lsrreg) & 32 ) == 0 ); // ensure all gp registers
1413+ cdb.gen1(INSTR .mov_register(sz == 8 ,msreg,msrreg)); // MOV msrreg,msreg
1414+ cdb.gen1(INSTR .mov_register(sz == 8 ,lsreg,lsrreg)); // MOV lsrreg,lsreg
1415+ }
1416+ }
1417+ else if (tyfloating(tym))
13931418 {
13941419 assert (outretregs & INSTR .FLOATREGS );
13951420 reg_t Vn = findreg(retregs);
@@ -1405,25 +1430,13 @@ void fixresult(ref CodeBuilder cdb, elem* e, regm_t retregs, ref regm_t outretre
14051430 cdb.gen1(INSTR .fmov(ftype,Vn,Vd)); // FMOV Vd,Vn
14061431 }
14071432 }
1408- else if (sz > REGSIZE )
1409- {
1410- reg_t msreg = findreg(retregs & INSTR .MSW );
1411- reg_t lsreg = findreg(retregs & INSTR .LSW );
1412-
1413- allocreg(cdb, outretregs, tym); // allocate return regs
1414- reg_t msrreg = findreg(outretregs & INSTR .MSW );
1415- reg_t lsrreg = findreg(outretregs & INSTR .LSW );
1416-
1417- cdb.gen1(INSTR .mov_register(sz == 8 ,msreg,msrreg)); // MOV msrreg,msreg
1418- cdb.gen1(INSTR .mov_register(sz == 8 ,lsreg,lsrreg)); // MOV lsrreg,lsreg
1419- }
14201433 else
14211434 {
14221435 reg_t reg = findreg(retregs & INSTR .ALLREGS );
14231436 reg_t rreg = allocreg(cdb, outretregs, tym); // allocate return regs
14241437 cdb.gen1(INSTR .mov_register(sz == 8 ,reg,rreg)); // MOV rreg,reg
14251438 }
1426- cssave(e,retregs | outretregs,opsflag );
1439+ cssave(e,retregs | outretregs,false );
14271440 // Commented out due to Bugzilla 8840
14281441 // forregs = 0; // don't care about result in reg cuz real result is in rreg
14291442 retregs = outretregs & ~ mPSW;
0 commit comments