diff options
| -rw-r--r-- | compiler/dex/frontend.cc | 69 | ||||
| -rw-r--r-- | compiler/dex/quick/arm64/call_arm64.cc | 6 | ||||
| -rw-r--r-- | compiler/dex/quick/arm64/utility_arm64.cc | 1 |
3 files changed, 39 insertions, 37 deletions
diff --git a/compiler/dex/frontend.cc b/compiler/dex/frontend.cc index d5443972c9..8218cf12e8 100644 --- a/compiler/dex/frontend.cc +++ b/compiler/dex/frontend.cc @@ -147,6 +147,7 @@ int arm64_support_list[] = { Instruction::RETURN_VOID, Instruction::RETURN, Instruction::RETURN_WIDE, + Instruction::RETURN_OBJECT, Instruction::CONST_4, Instruction::CONST_16, Instruction::CONST, @@ -226,6 +227,39 @@ int arm64_support_list[] = { Instruction::SHL_INT_LIT8, Instruction::SHR_INT_LIT8, Instruction::USHR_INT_LIT8, + Instruction::SGET, + Instruction::SGET_BOOLEAN, + Instruction::SGET_BYTE, + Instruction::SGET_CHAR, + Instruction::SGET_SHORT, + Instruction::SGET_OBJECT, + Instruction::SPUT, + Instruction::SPUT_OBJECT, + Instruction::SPUT_BOOLEAN, + Instruction::SPUT_BYTE, + Instruction::SPUT_CHAR, + Instruction::SPUT_SHORT, + Instruction::MOVE_WIDE, + Instruction::MOVE_WIDE_FROM16, + Instruction::MOVE_WIDE_16, + Instruction::MOVE_OBJECT, + Instruction::MOVE_OBJECT_FROM16, + Instruction::MOVE_OBJECT_16, + Instruction::CMPL_FLOAT, + Instruction::CMPG_FLOAT, + Instruction::IGET, + Instruction::IGET_OBJECT, + Instruction::IGET_BOOLEAN, + Instruction::IGET_BYTE, + Instruction::IGET_CHAR, + Instruction::IGET_SHORT, + Instruction::IPUT, + Instruction::IPUT_OBJECT, + Instruction::IPUT_BOOLEAN, + Instruction::IPUT_BYTE, + Instruction::IPUT_CHAR, + Instruction::IPUT_SHORT, + // TODO(Arm64): Enable compiler pass // ----- ExtendedMIROpcode ----- kMirOpPhi, @@ -244,16 +278,9 @@ int arm64_support_list[] = { kMirOpSelect, #if ARM64_USE_EXPERIMENTAL_OPCODES - Instruction::MOVE_WIDE, - Instruction::MOVE_WIDE_FROM16, - Instruction::MOVE_WIDE_16, - Instruction::MOVE_OBJECT, - Instruction::MOVE_OBJECT_FROM16, - Instruction::MOVE_OBJECT_16, // Instruction::MOVE_RESULT, // Instruction::MOVE_RESULT_WIDE, // Instruction::MOVE_RESULT_OBJECT, - // Instruction::RETURN_OBJECT, // Instruction::CONST_HIGH16, // Instruction::CONST_WIDE_16, // Instruction::CONST_WIDE_32, @@ -269,8 +296,6 @@ int arm64_support_list[] = { // Instruction::FILLED_NEW_ARRAY, // Instruction::FILLED_NEW_ARRAY_RANGE, // Instruction::FILL_ARRAY_DATA, - Instruction::CMPL_FLOAT, - Instruction::CMPG_FLOAT, Instruction::CMPL_DOUBLE, Instruction::CMPG_DOUBLE, Instruction::CMP_LONG, @@ -294,34 +319,10 @@ int arm64_support_list[] = { // Instruction::APUT_BYTE, // Instruction::APUT_CHAR, // Instruction::APUT_SHORT, - // Instruction::IGET, - // Instruction::IGET_WIDE, - // Instruction::IGET_OBJECT, - // Instruction::IGET_BOOLEAN, - // Instruction::IGET_BYTE, - // Instruction::IGET_CHAR, - // Instruction::IGET_SHORT, - // Instruction::IPUT, // Instruction::IPUT_WIDE, - // Instruction::IPUT_OBJECT, - // Instruction::IPUT_BOOLEAN, - // Instruction::IPUT_BYTE, - // Instruction::IPUT_CHAR, - // Instruction::IPUT_SHORT, - Instruction::SGET, + // Instruction::IGET_WIDE, // Instruction::SGET_WIDE, - Instruction::SGET_OBJECT, - // Instruction::SGET_BOOLEAN, - // Instruction::SGET_BYTE, - // Instruction::SGET_CHAR, - // Instruction::SGET_SHORT, - Instruction::SPUT, // Instruction::SPUT_WIDE, - // Instruction::SPUT_OBJECT, - // Instruction::SPUT_BOOLEAN, - // Instruction::SPUT_BYTE, - // Instruction::SPUT_CHAR, - // Instruction::SPUT_SHORT, Instruction::INVOKE_VIRTUAL, Instruction::INVOKE_SUPER, Instruction::INVOKE_DIRECT, diff --git a/compiler/dex/quick/arm64/call_arm64.cc b/compiler/dex/quick/arm64/call_arm64.cc index b85f5694d6..bf9a39c12c 100644 --- a/compiler/dex/quick/arm64/call_arm64.cc +++ b/compiler/dex/quick/arm64/call_arm64.cc @@ -301,12 +301,14 @@ void Arm64Mir2Lir::GenMoveException(RegLocation rl_dest) { * Mark garbage collection card. Skip if the value we're storing is null. */ void Arm64Mir2Lir::MarkGCCard(RegStorage val_reg, RegStorage tgt_addr_reg) { - RegStorage reg_card_base = AllocTemp(); + RegStorage reg_card_base = AllocTempWide(); RegStorage reg_card_no = AllocTemp(); LIR* branch_over = OpCmpImmBranch(kCondEq, val_reg, 0, NULL); LoadWordDisp(rs_rA64_SELF, Thread::CardTableOffset<8>().Int32Value(), reg_card_base); OpRegRegImm(kOpLsr, reg_card_no, tgt_addr_reg, gc::accounting::CardTable::kCardShift); - StoreBaseIndexed(reg_card_base, reg_card_no, reg_card_base, 0, kUnsignedByte); + // TODO(Arm64): generate "strb wB, [xB, wC, uxtw]" rather than "strb wB, [xB, xC]"? + StoreBaseIndexed(reg_card_base, As64BitReg(reg_card_no), As32BitReg(reg_card_base), + 0, kUnsignedByte); LIR* target = NewLIR0(kPseudoTargetLabel); branch_over->target = target; FreeTemp(reg_card_base); diff --git a/compiler/dex/quick/arm64/utility_arm64.cc b/compiler/dex/quick/arm64/utility_arm64.cc index 4f0d7bc7d1..7ddfdb97c8 100644 --- a/compiler/dex/quick/arm64/utility_arm64.cc +++ b/compiler/dex/quick/arm64/utility_arm64.cc @@ -526,7 +526,6 @@ LIR* Arm64Mir2Lir::OpRegRegImm(OpKind op, RegStorage r_dest, RegStorage r_src1, ArmOpcode alt_opcode = kA64Brk1d; int32_t log_imm = -1; bool is_wide = r_dest.Is64Bit(); - CHECK_EQ(r_dest.Is64Bit(), r_src1.Is64Bit()); ArmOpcode wide = (is_wide) ? WIDE(0) : UNWIDE(0); switch (op) { |