@@ -1904,23 +1904,11 @@ void cdfunc(ref CGstate cg, ref CodeBuilder cdb, elem* e, ref regm_t pretregs)
19041904
19051905 movParams(cg, cdbparams, ep, p.offset, sz);
19061906
1907- regm_t tosave = keepmsk & ~ cg.msavereg;
1907+ regm_t tosave = keepmsk & ~ cg.msavereg; // registers to save and restore
19081908 cg.msavereg &= ~ keepmsk | overlap;
1909-
1910- // tosave is the mask to save and restore
1911- for (reg_t j = 0 ; tosave; j++ )
1912- {
1913- regm_t mi = mask(j);
1914- if (mi & tosave)
1915- {
1916- uint idx;
1917- cg.regsave.save(cdbsave, j, idx);
1918- cg.regsave.restore(cdbrestore, j, idx);
1919- saved |= mi;
1920- keepmsk &= ~ mi; // don't need to keep these for rest of params
1921- tosave &= ~ mi;
1922- }
1923- }
1909+ saved |= tosave;
1910+ keepmsk &= ~ tosave; // don't need to keep these for rest of params
1911+ gensaverestore(tosave,cdbsave,cdbrestore);
19241912
19251913 cdb.append(cdbsave);
19261914 cdb.append(cdbparams);
@@ -1954,21 +1942,9 @@ void cdfunc(ref CGstate cg, ref CodeBuilder cdb, elem* e, ref regm_t pretregs)
19541942 if (keepmsk & retregs)
19551943 {
19561944 regm_t tosave = keepmsk & retregs;
1957-
1958- // tosave is the mask to save and restore
1959- for (reg_t j = 0 ; tosave; j++ )
1960- {
1961- regm_t mi = mask(j);
1962- if (mi & tosave)
1963- {
1964- uint idx;
1965- cg.regsave.save(cdbsave, j, idx);
1966- cg.regsave.restore(cdbrestore, j, idx);
1967- saved |= mi;
1968- keepmsk &= ~ mi; // don't need to keep these for rest of params
1969- tosave &= ~ mi;
1970- }
1971- }
1945+ saved |= tosave;
1946+ keepmsk &= ~ tosave; // don't need to keep these for rest of params
1947+ gensaverestore(tosave,cdbsave,cdbrestore);
19721948 }
19731949 cdb.append(cdbsave);
19741950
0 commit comments