@@ -1899,7 +1899,7 @@ void cdlngsht(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
18991899 codelem(cgstate,cdb,e.E1 ,retregs,false );
19001900 bool isOff = e.Eoper == OPoffset;
19011901 if (isOff || e.Eoper == OP128_64 )
1902- retregs &= mLSW ; // want LSW only
1902+ retregs &= INSTR . LSW ; // want LSW only
19031903 }
19041904 }
19051905
@@ -2012,7 +2012,48 @@ void cdpopcnt(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
20122012 fixresult(cdb,e,retregs,pretregs);
20132013}
20142014
2015- // cdpair
2015+ /* ******************************************
2016+ * Generate code for OPpair, OPrpair.
2017+ */
2018+ @trusted
2019+ void cdpair (ref CGstate cg, ref CodeBuilder cdb, elem* e, ref regm_t pretregs)
2020+ {
2021+ assert (pretregs);
2022+
2023+ // printf("cdpair(e = %p, pretregs = %s)\n", e, regm_str(pretregs));
2024+ // elem_print(e);
2025+
2026+ regm_t retregs = pretregs;
2027+
2028+ regm_t regs1;
2029+ regm_t regs2;
2030+
2031+ retregs &= cgstate.allregs | INSTR .FLOATREGS ;
2032+ if (! retregs)
2033+ retregs = cgstate.allregs | INSTR .FLOATREGS ;
2034+ regs1 = retregs & INSTR .LSW ;
2035+ regs2 = retregs & INSTR .MSW ;
2036+
2037+ if (e.Eoper == OPrpair)
2038+ {
2039+ // swap
2040+ regs1 ^= regs2;
2041+ regs2 ^= regs1;
2042+ regs1 ^= regs2;
2043+ }
2044+ // printf("1: regs1 = %s, regs2 = %s\n", regm_str(regs1), regm_str(regs2));
2045+
2046+ codelem(cgstate,cdb,e.E1 , regs1, false );
2047+ scodelem(cgstate,cdb,e.E2 , regs2, regs1, false );
2048+
2049+ if (e.E1 .Ecount)
2050+ getregs(cdb,regs1);
2051+ if (e.E2 .Ecount)
2052+ getregs(cdb,regs2);
2053+
2054+ fixresult(cdb,e,regs1 | regs2,pretregs);
2055+ }
2056+
20162057// cdcmpxchg
20172058// cdprefetch
20182059// opAssLoadReg
0 commit comments