[AArch64] Stop violating the AAPCS64 so much.

This commit is contained in:
Ryan Houdek
2015-03-02 11:21:15 -06:00
parent fad46729b0
commit f1a9db9bdc
3 changed files with 44 additions and 44 deletions

View File

@ -2874,7 +2874,7 @@ void ARM64FloatEmitter::FMUL(u8 size, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm, u8
EmitVectorxElement(0, 2 | (size >> 6), L, 0b1001, H, Rd, Rn, Rm);
}
void ARM64FloatEmitter::ABI_PushRegisters(BitSet32 registers)
void ARM64FloatEmitter::ABI_PushRegisters(BitSet32 registers, ARM64Reg tmp)
{
bool bundled_loadstore = false;
int num_regs = registers.Count();
@ -2904,15 +2904,10 @@ void ARM64FloatEmitter::ABI_PushRegisters(BitSet32 registers)
}
}
if (!bundled_loadstore)
if (bundled_loadstore && tmp != INVALID_REG)
{
for (auto it : registers)
STR(128, INDEX_PRE, (ARM64Reg)(Q0 + it), SP, -16);
}
else
{
// Violating the AAPCS64 never felt so right.
m_emit->SUB(SP, SP, num_regs * 16);
m_emit->ADD(tmp, SP, 0);
for (int i = 0; i < 32; ++i)
{
if (!registers[i])
@ -2927,14 +2922,18 @@ void ARM64FloatEmitter::ABI_PushRegisters(BitSet32 registers)
// 4 < 4 && registers[i + 4] false!
while (++count < 4 && (i + count) < 32 && registers[i + count]) {}
ST1(64, count, INDEX_POST, (ARM64Reg)(Q0 + i), SP);
ST1(64, count, INDEX_POST, (ARM64Reg)(Q0 + i), tmp);
i += count - 1;
}
m_emit->SUB(SP, SP, num_regs * 16);
}
else
{
for (auto it : registers)
STR(128, INDEX_PRE, (ARM64Reg)(Q0 + it), SP, -16);
}
}
void ARM64FloatEmitter::ABI_PopRegisters(BitSet32 registers)
void ARM64FloatEmitter::ABI_PopRegisters(BitSet32 registers, ARM64Reg tmp)
{
bool bundled_loadstore = false;
int num_regs = registers.Count();
@ -2964,18 +2963,9 @@ void ARM64FloatEmitter::ABI_PopRegisters(BitSet32 registers)
}
}
if (!bundled_loadstore)
{
for (int i = 31; i >= 0; --i)
{
if (!registers[i])
continue;
LDR(128, INDEX_POST, (ARM64Reg)(Q0 + i), SP, 16);
}
}
else
if (bundled_loadstore && tmp != INVALID_REG)
{
// The temporary register is only used to indicate that we can use this code path
for (int i = 0; i < 32; ++i)
{
if (!registers[i])
@ -2989,6 +2979,16 @@ void ARM64FloatEmitter::ABI_PopRegisters(BitSet32 registers)
i += count - 1;
}
}
else
{
for (int i = 31; i >= 0; --i)
{
if (!registers[i])
continue;
LDR(128, INDEX_POST, (ARM64Reg)(Q0 + i), SP, 16);
}
}
}
}