diff options
Diffstat (limited to 'compiler/utils')
| -rw-r--r-- | compiler/utils/arm/jni_macro_assembler_arm.cc | 35 | ||||
| -rw-r--r-- | compiler/utils/arm/jni_macro_assembler_arm.h | 17 | ||||
| -rw-r--r-- | compiler/utils/arm/jni_macro_assembler_arm_vixl.cc | 4 |
3 files changed, 56 insertions, 0 deletions
diff --git a/compiler/utils/arm/jni_macro_assembler_arm.cc b/compiler/utils/arm/jni_macro_assembler_arm.cc index cf7a4d1b72..3f425dfaf5 100644 --- a/compiler/utils/arm/jni_macro_assembler_arm.cc +++ b/compiler/utils/arm/jni_macro_assembler_arm.cc @@ -594,6 +594,41 @@ void ArmJNIMacroAssembler::ExceptionPoll(ManagedRegister mscratch, size_t stack_ __ b(slow->Entry(), NE); } +std::unique_ptr<JNIMacroLabel> ArmJNIMacroAssembler::CreateLabel() { + return std::unique_ptr<JNIMacroLabel>(new ArmJNIMacroLabel()); +} + +void ArmJNIMacroAssembler::Jump(JNIMacroLabel* label) { + CHECK(label != nullptr); + __ b(ArmJNIMacroLabel::Cast(label)->AsArm()); +} + +void ArmJNIMacroAssembler::Jump(JNIMacroLabel* label, + JNIMacroUnaryCondition condition, + ManagedRegister test) { + CHECK(label != nullptr); + + arm::Condition arm_cond; + switch (condition) { + case JNIMacroUnaryCondition::kZero: + arm_cond = EQ; + break; + case JNIMacroUnaryCondition::kNotZero: + arm_cond = NE; + break; + default: + LOG(FATAL) << "Not implemented condition: " << static_cast<int>(condition); + UNREACHABLE(); + } + __ cmp(test.AsArm().AsCoreRegister(), ShifterOperand(0)); + __ b(ArmJNIMacroLabel::Cast(label)->AsArm(), arm_cond); +} + +void ArmJNIMacroAssembler::Bind(JNIMacroLabel* label) { + CHECK(label != nullptr); + __ Bind(ArmJNIMacroLabel::Cast(label)->AsArm()); +} + #undef __ void ArmExceptionSlowPath::Emit(Assembler* sasm) { diff --git a/compiler/utils/arm/jni_macro_assembler_arm.h b/compiler/utils/arm/jni_macro_assembler_arm.h index 4471906c27..809ac8be94 100644 --- a/compiler/utils/arm/jni_macro_assembler_arm.h +++ b/compiler/utils/arm/jni_macro_assembler_arm.h @@ -25,6 +25,7 @@ #include "base/enums.h" #include "base/macros.h" #include "utils/jni_macro_assembler.h" +#include "utils/label.h" #include "offsets.h" namespace art { @@ -159,10 +160,26 @@ class ArmJNIMacroAssembler : public JNIMacroAssembler<PointerSize::k32> { void MemoryBarrier(ManagedRegister scratch) OVERRIDE; + // Create a new label that can be used with Jump/Bind calls. + std::unique_ptr<JNIMacroLabel> CreateLabel() OVERRIDE; + // Emit an unconditional jump to the label. + void Jump(JNIMacroLabel* label) OVERRIDE; + // Emit a conditional jump to the label by applying a unary condition test to the register. + void Jump(JNIMacroLabel* label, JNIMacroUnaryCondition cond, ManagedRegister test) OVERRIDE; + // Code at this offset will serve as the target for the Jump call. + void Bind(JNIMacroLabel* label) OVERRIDE; + private: std::unique_ptr<ArmAssembler> asm_; }; +class ArmJNIMacroLabel FINAL : public JNIMacroLabelCommon<ArmJNIMacroLabel, art::Label, kArm> { + public: + art::Label* AsArm() { + return AsPlatformLabel(); + } +}; + } // namespace arm } // namespace art diff --git a/compiler/utils/arm/jni_macro_assembler_arm_vixl.cc b/compiler/utils/arm/jni_macro_assembler_arm_vixl.cc index f20ed0a0d0..fb6f172cb0 100644 --- a/compiler/utils/arm/jni_macro_assembler_arm_vixl.cc +++ b/compiler/utils/arm/jni_macro_assembler_arm_vixl.cc @@ -564,6 +564,8 @@ void ArmVIXLJNIMacroAssembler::CallFromThread(ThreadOffset32 offset ATTRIBUTE_UN } void ArmVIXLJNIMacroAssembler::GetCurrentThread(ManagedRegister mtr) { + UseScratchRegisterScope temps(asm_.GetVIXLAssembler()); + temps.Exclude(mtr.AsArm().AsVIXLRegister()); ___ Mov(mtr.AsArm().AsVIXLRegister(), tr); } @@ -608,6 +610,8 @@ void ArmVIXLJNIMacroAssembler::Jump(JNIMacroLabel* label, ManagedRegister test) { CHECK(label != nullptr); + UseScratchRegisterScope temps(asm_.GetVIXLAssembler()); + temps.Exclude(test.AsArm().AsVIXLRegister()); switch (condition) { case JNIMacroUnaryCondition::kZero: ___ CompareAndBranchIfZero(test.AsArm().AsVIXLRegister(), |