Skip to content

Commit e7c34c1

Browse files
authored
adjust allocregs() for complex types (dlang#22537)
1 parent fad4417 commit e7c34c1

File tree

1 file changed

+22
-10
lines changed
  • compiler/src/dmd/backend/x86

1 file changed

+22
-10
lines changed

compiler/src/dmd/backend/x86/cgcod.d

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1680,23 +1680,35 @@ static if (0)
16801680
if ((retregs & cgstate.regcon.mvar) == retregs) // if exactly in reg vars
16811681
{
16821682
reg_t outreg;
1683-
if (size <= REGSIZE || (retregs & XMMREGS) || (retregs & INSTR.FLOATREGS))
1684-
{
1685-
outreg = findreg(retregs);
1686-
assert(retregs == mask(outreg)); /* no more bits are set */
1687-
}
1688-
else if (size <= 2 * REGSIZE)
1683+
if (AArch64)
16891684
{
1690-
if (AArch64)
1685+
if (tycomplex(tym))
16911686
{
16921687
outreg = findreg(retregs & INSTR.MSW);
16931688
assert(retregs & INSTR.LSW);
16941689
}
1695-
else
1690+
else if (size <= REGSIZE || (retregs & INSTR.FLOATREGS))
1691+
{
1692+
outreg = findreg(retregs);
1693+
assert(retregs == mask(outreg));
1694+
}
1695+
else if (size <= 2 * REGSIZE)
16961696
{
1697-
outreg = findregmsw(retregs);
1698-
assert(retregs & mLSW);
1697+
outreg = findreg(retregs & INSTR.MSW);
1698+
assert(retregs & INSTR.LSW);
16991699
}
1700+
else
1701+
assert(0);
1702+
}
1703+
else if (size <= REGSIZE || (retregs & XMMREGS))
1704+
{
1705+
outreg = findreg(retregs);
1706+
assert(retregs == mask(outreg)); /* no more bits are set */
1707+
}
1708+
else if (size <= 2 * REGSIZE)
1709+
{
1710+
outreg = findregmsw(retregs);
1711+
assert(retregs & mLSW);
17001712
}
17011713
else
17021714
assert(0);

0 commit comments

Comments
 (0)