From 715f43e1553330bc804cea2951be195473dc343d Mon Sep 17 00:00:00 2001 From: Chris Larsen Date: Mon, 23 Oct 2017 11:00:32 -0700 Subject: MIPS32: Improve stack alignment, use sdc1/ldc1, where possible. - Ensure that SP is a multiple of 16 at all times, and - Use ldc1/sdc1 to load/store FPU registers from/to 8-byte-aligned locations wherever possible. Use `export ART_MIPS32_CHECK_ALIGNMENT=true` when building Android to enable the new runtime alignment checks. Test: Boot & run tests on 32-bit version of QEMU, and CI-20. Test: test/testrunner/testrunner.py --target --optimizing --32 Test: test-art-host-gtest Test: test-art-target-gtest Change-Id: Ia667004573f419fd006098fcfadf5834239cb485 --- compiler/utils/mips/assembler_mips.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'compiler/utils/mips/assembler_mips.cc') diff --git a/compiler/utils/mips/assembler_mips.cc b/compiler/utils/mips/assembler_mips.cc index cbb2c0ea47..9545ca6869 100644 --- a/compiler/utils/mips/assembler_mips.cc +++ b/compiler/utils/mips/assembler_mips.cc @@ -1863,20 +1863,20 @@ void MipsAssembler::Not(Register rd, Register rs) { } void MipsAssembler::Push(Register rs) { - IncreaseFrameSize(kMipsWordSize); + IncreaseFrameSize(kStackAlignment); Sw(rs, SP, 0); } void MipsAssembler::Pop(Register rd) { Lw(rd, SP, 0); - DecreaseFrameSize(kMipsWordSize); + DecreaseFrameSize(kStackAlignment); } void MipsAssembler::PopAndReturn(Register rd, Register rt) { bool reordering = SetReorder(false); Lw(rd, SP, 0); Jr(rt); - DecreaseFrameSize(kMipsWordSize); // Single instruction in delay slot. + DecreaseFrameSize(kStackAlignment); // Single instruction in delay slot. SetReorder(reordering); } @@ -4588,7 +4588,7 @@ void MipsAssembler::EmitBranch(uint32_t branch_id) { Addu(AT, AT, RA); Lw(RA, SP, 0); Jr(AT); - DecreaseFrameSize(kMipsWordSize); + DecreaseFrameSize(kStackAlignment); break; case Branch::kLongCondBranch: // The comment on case 'Branch::kLongUncondBranch' applies here as well. @@ -4608,7 +4608,7 @@ void MipsAssembler::EmitBranch(uint32_t branch_id) { Addu(AT, AT, RA); Lw(RA, SP, 0); Jr(AT); - DecreaseFrameSize(kMipsWordSize); + DecreaseFrameSize(kStackAlignment); break; case Branch::kLongCall: DCHECK_NE(delayed_instruction, Branch::kUnfillableDelaySlot); -- cgit v1.2.3-59-g8ed1b