diff options
author | Nicolas Geoffray <ngeoffray@google.com> | 2014-07-23 16:04:16 +0100 |
---|---|---|
committer | Nicolas Geoffray <ngeoffray@google.com> | 2014-07-28 15:44:28 +0100 |
commit | 3c7bb98698f77af10372cf31824d3bb115d9bf0f (patch) | |
tree | 1cd4cc18babfbb16ab908f23929fa88d7678f06b /compiler/utils | |
parent | 98cc1e552c2ccbe5d51bc81d49e79119280f5416 (diff) | |
download | art-3c7bb98698f77af10372cf31824d3bb115d9bf0f.zip art-3c7bb98698f77af10372cf31824d3bb115d9bf0f.tar.gz art-3c7bb98698f77af10372cf31824d3bb115d9bf0f.tar.bz2 |
Implement array get and array put in optimizing.
Also fix a couple of assembler/disassembler issues.
Change-Id: I705c8572988c1a9c4df3172b304678529636d5f6
Diffstat (limited to 'compiler/utils')
-rw-r--r-- | compiler/utils/arm/assembler_thumb2.cc | 4 | ||||
-rw-r--r-- | compiler/utils/assembler_thumb_test.cc | 6 | ||||
-rw-r--r-- | compiler/utils/assembler_thumb_test_expected.cc.inc | 4 |
3 files changed, 14 insertions, 0 deletions
diff --git a/compiler/utils/arm/assembler_thumb2.cc b/compiler/utils/arm/assembler_thumb2.cc index 78ff31a..4904428 100644 --- a/compiler/utils/arm/assembler_thumb2.cc +++ b/compiler/utils/arm/assembler_thumb2.cc @@ -659,6 +659,10 @@ bool Thumb2Assembler::Is32BitDataProcessing(Condition cond, if (so.IsImmediate()) { return true; } + + if (!can_contain_high_register) { + return true; + } } if (so.IsRegister() && IsHighRegister(so.GetRegister()) && !can_contain_high_register) { diff --git a/compiler/utils/assembler_thumb_test.cc b/compiler/utils/assembler_thumb_test.cc index 3312f8f..891a287 100644 --- a/compiler/utils/assembler_thumb_test.cc +++ b/compiler/utils/assembler_thumb_test.cc @@ -312,6 +312,9 @@ TEST(Thumb2AssemblerTest, DataProcessingRegister) { __ movs(R0, ShifterOperand(R1)); __ mvns(R0, ShifterOperand(R1)); + // 32 bit variants. + __ add(R12, R1, ShifterOperand(R0)); + size_t cs = __ CodeSize(); std::vector<uint8_t> managed_code(cs); MemoryRegion code(&managed_code[0], managed_code.size()); @@ -868,6 +871,9 @@ TEST(Thumb2AssemblerTest, StoreToOffset) { __ StoreToOffset(kStoreWord, R2, R4, 12); // Simple __ StoreToOffset(kStoreWord, R2, R4, 0x2000); // Offset too big. + __ StoreToOffset(kStoreWord, R0, R12, 12); + __ StoreToOffset(kStoreHalfword, R0, R12, 12); + __ StoreToOffset(kStoreByte, R2, R12, 12); size_t cs = __ CodeSize(); std::vector<uint8_t> managed_code(cs); diff --git a/compiler/utils/assembler_thumb_test_expected.cc.inc b/compiler/utils/assembler_thumb_test_expected.cc.inc index 18035f3..3f2641c 100644 --- a/compiler/utils/assembler_thumb_test_expected.cc.inc +++ b/compiler/utils/assembler_thumb_test_expected.cc.inc @@ -43,6 +43,7 @@ const char* DataProcessingRegisterResults[] = { " 3e: 42c8 cmn r0, r1\n", " 40: 0008 movs r0, r1\n", " 42: 43c8 mvns r0, r1\n", + " 44: eb01 0c00 add.w ip, r1, r0\n", nullptr }; const char* DataProcessingImmediateResults[] = { @@ -355,6 +356,9 @@ const char* StoreToOffsetResults[] = { " 2: f44f 5c00 mov.w ip, #8192 ; 0x2000\n", " 6: 44a4 add ip, r4\n", " 8: f8cc 2000 str.w r2, [ip]\n", + " c: f8cc 000c str.w r0, [ip, #12]\n", + " 10: f8ac 000c strh.w r0, [ip, #12]\n", + " 14: f88c 200c strb.w r2, [ip, #12]\n", nullptr }; const char* IfThenResults[] = { |