112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov/* 212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov * Copyright (C) 2016 The Android Open Source Project 312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov * 412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov * Licensed under the Apache License, Version 2.0 (the "License"); 512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov * you may not use this file except in compliance with the License. 612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov * You may obtain a copy of the License at 712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov * 812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov * http://www.apache.org/licenses/LICENSE-2.0 912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov * 1012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov * Unless required by applicable law or agreed to in writing, software 1112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov * distributed under the License is distributed on an "AS IS" BASIS, 1212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov * See the License for the specific language governing permissions and 1412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov * limitations under the License. 1512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov */ 1612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 1712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov#ifndef ART_COMPILER_UTILS_ARM_JNI_MACRO_ASSEMBLER_ARM_VIXL_H_ 1812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov#define ART_COMPILER_UTILS_ARM_JNI_MACRO_ASSEMBLER_ARM_VIXL_H_ 1912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 2012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov#include "base/arena_containers.h" 2112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov#include "base/logging.h" 2212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov#include "constants_arm.h" 2312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov#include "offsets.h" 2412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov#include "utils/arm/assembler_arm_shared.h" 2512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov#include "utils/arm/assembler_arm_vixl.h" 2612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov#include "utils/arm/managed_register_arm.h" 2712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov#include "utils/assembler.h" 2812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov#include "utils/jni_macro_assembler.h" 2912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 3012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serovnamespace art { 3112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serovnamespace arm { 3212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 3312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serovclass ArmVIXLJNIMacroAssembler FINAL 3412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov : public JNIMacroAssemblerFwd<ArmVIXLAssembler, PointerSize::k32> { 3512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov private: 3612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov class ArmException; 3712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov public: 3812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov explicit ArmVIXLJNIMacroAssembler(ArenaAllocator* arena) 3912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov : JNIMacroAssemblerFwd(arena), 4012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov exception_blocks_(arena->Adapter(kArenaAllocAssembler)) {} 4112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 4212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov virtual ~ArmVIXLJNIMacroAssembler() {} 4312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void FinalizeCode() OVERRIDE; 4412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 4512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // 4612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // Overridden common assembler high-level functionality 4712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // 4812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 4912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // Emit code that will create an activation on the stack. 5012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void BuildFrame(size_t frame_size, 5112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ManagedRegister method_reg, 5212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ArrayRef<const ManagedRegister> callee_save_regs, 5312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov const ManagedRegisterEntrySpills& entry_spills) OVERRIDE; 5412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 5512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // Emit code that will remove an activation from the stack. 5612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void RemoveFrame(size_t frame_size, 5712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ArrayRef<const ManagedRegister> callee_save_regs) OVERRIDE; 5812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 5912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void IncreaseFrameSize(size_t adjust) OVERRIDE; 6012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void DecreaseFrameSize(size_t adjust) OVERRIDE; 6112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 6212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // Store routines. 6312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void Store(FrameOffset offs, ManagedRegister src, size_t size) OVERRIDE; 6412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void StoreRef(FrameOffset dest, ManagedRegister src) OVERRIDE; 6512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void StoreRawPtr(FrameOffset dest, ManagedRegister src) OVERRIDE; 6612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 6712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void StoreImmediateToFrame(FrameOffset dest, uint32_t imm, ManagedRegister scratch) OVERRIDE; 6812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 6912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void StoreStackOffsetToThread(ThreadOffset32 thr_offs, 7012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov FrameOffset fr_offs, 7112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ManagedRegister scratch) OVERRIDE; 7212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 7312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void StoreStackPointerToThread(ThreadOffset32 thr_offs) OVERRIDE; 7412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 7512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void StoreSpanning(FrameOffset dest, 7612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ManagedRegister src, 7712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov FrameOffset in_off, 7812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ManagedRegister scratch) OVERRIDE; 7912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 8012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // Load routines. 8112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void Load(ManagedRegister dest, FrameOffset src, size_t size) OVERRIDE; 8212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 8312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void LoadFromThread(ManagedRegister dest, 8412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ThreadOffset32 src, 8512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov size_t size) OVERRIDE; 8612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 8712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void LoadRef(ManagedRegister dest, FrameOffset src) OVERRIDE; 8812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 8912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void LoadRef(ManagedRegister dest, 9012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ManagedRegister base, 9112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov MemberOffset offs, 9212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov bool unpoison_reference) OVERRIDE; 9312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 9412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void LoadRawPtr(ManagedRegister dest, ManagedRegister base, Offset offs) OVERRIDE; 9512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 9612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void LoadRawPtrFromThread(ManagedRegister dest, ThreadOffset32 offs) OVERRIDE; 9712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 9812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // Copying routines. 9912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void Move(ManagedRegister dest, ManagedRegister src, size_t size) OVERRIDE; 10012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 10112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void CopyRawPtrFromThread(FrameOffset fr_offs, 10212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ThreadOffset32 thr_offs, 10312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ManagedRegister scratch) OVERRIDE; 10412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 10512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void CopyRawPtrToThread(ThreadOffset32 thr_offs, 10612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov FrameOffset fr_offs, 10712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ManagedRegister scratch) OVERRIDE; 10812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 10912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void CopyRef(FrameOffset dest, FrameOffset src, ManagedRegister scratch) OVERRIDE; 11012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 11112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void Copy(FrameOffset dest, FrameOffset src, ManagedRegister scratch, size_t size) OVERRIDE; 11212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 11312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void Copy(FrameOffset dest, 11412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ManagedRegister src_base, 11512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov Offset src_offset, 11612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ManagedRegister scratch, 11712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov size_t size) OVERRIDE; 11812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 11912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void Copy(ManagedRegister dest_base, 12012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov Offset dest_offset, 12112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov FrameOffset src, 12212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ManagedRegister scratch, 12312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov size_t size) OVERRIDE; 12412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 12512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void Copy(FrameOffset dest, 12612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov FrameOffset src_base, 12712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov Offset src_offset, 12812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ManagedRegister scratch, 12912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov size_t size) OVERRIDE; 13012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 13112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void Copy(ManagedRegister dest, 13212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov Offset dest_offset, 13312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ManagedRegister src, 13412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov Offset src_offset, 13512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ManagedRegister scratch, 13612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov size_t size) OVERRIDE; 13712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 13812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void Copy(FrameOffset dest, 13912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov Offset dest_offset, 14012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov FrameOffset src, 14112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov Offset src_offset, 14212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ManagedRegister scratch, 14312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov size_t size) OVERRIDE; 14412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 14512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // Sign extension. 14612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void SignExtend(ManagedRegister mreg, size_t size) OVERRIDE; 14712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 14812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // Zero extension. 14912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void ZeroExtend(ManagedRegister mreg, size_t size) OVERRIDE; 15012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 15112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // Exploit fast access in managed code to Thread::Current(). 15212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void GetCurrentThread(ManagedRegister mtr) OVERRIDE; 15312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void GetCurrentThread(FrameOffset dest_offset, 15412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ManagedRegister scratch) OVERRIDE; 15512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 15612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // Set up out_reg to hold a Object** into the handle scope, or to be null if the 15712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // value is null and null_allowed. in_reg holds a possibly stale reference 15812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // that can be used to avoid loading the handle scope entry to see if the value is 15912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // null. 16012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void CreateHandleScopeEntry(ManagedRegister out_reg, 16112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov FrameOffset handlescope_offset, 16212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ManagedRegister in_reg, 16312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov bool null_allowed) OVERRIDE; 16412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 16512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // Set up out_off to hold a Object** into the handle scope, or to be null if the 16612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // value is null and null_allowed. 16712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void CreateHandleScopeEntry(FrameOffset out_off, 16812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov FrameOffset handlescope_offset, 16912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ManagedRegister scratch, 17012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov bool null_allowed) OVERRIDE; 17112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 17212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // src holds a handle scope entry (Object**) load this into dst. 17312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void LoadReferenceFromHandleScope(ManagedRegister dst, 17412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ManagedRegister src) OVERRIDE; 17512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 17612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // Heap::VerifyObject on src. In some cases (such as a reference to this) we 17712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // know that src may not be null. 17812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void VerifyObject(ManagedRegister src, bool could_be_null) OVERRIDE; 17912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void VerifyObject(FrameOffset src, bool could_be_null) OVERRIDE; 18012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 18112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // Call to address held at [base+offset]. 18212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void Call(ManagedRegister base, Offset offset, ManagedRegister scratch) OVERRIDE; 18312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void Call(FrameOffset base, Offset offset, ManagedRegister scratch) OVERRIDE; 18412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void CallFromThread(ThreadOffset32 offset, ManagedRegister scratch) OVERRIDE; 18512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 18612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // Generate code to check if Thread::Current()->exception_ is non-null 18712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // and branch to a ExceptionSlowPath if it is. 18812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void ExceptionPoll(ManagedRegister scratch, size_t stack_adjust); 18912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 190ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkin // Create a new label that can be used with Jump/Bind calls. 191ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkin std::unique_ptr<JNIMacroLabel> CreateLabel() OVERRIDE; 192ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkin // Emit an unconditional jump to the label. 193ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkin void Jump(JNIMacroLabel* label) OVERRIDE; 194ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkin // Emit a conditional jump to the label by applying a unary condition test to the register. 195ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkin void Jump(JNIMacroLabel* label, JNIMacroUnaryCondition cond, ManagedRegister test) OVERRIDE; 196ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkin // Code at this offset will serve as the target for the Jump call. 197ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkin void Bind(JNIMacroLabel* label) OVERRIDE; 198ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkin 19912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void MemoryBarrier(ManagedRegister scratch) OVERRIDE; 20012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 20112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void EmitExceptionPoll(ArmVIXLJNIMacroAssembler::ArmException *exception); 20212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov void Load(ArmManagedRegister dest, vixl32::Register base, int32_t offset, size_t size); 20312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 20412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov private: 20512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov class ArmException { 20612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov private: 20712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ArmException(ArmManagedRegister scratch, size_t stack_adjust) 20812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov : scratch_(scratch), stack_adjust_(stack_adjust) {} 20912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 21012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov vixl32::Label* Entry() { return &exception_entry_; } 21112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 21212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // Register used for passing Thread::Current()->exception_ . 21312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov const ArmManagedRegister scratch_; 21412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 21512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // Stack adjust for ExceptionPool. 21612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov const size_t stack_adjust_; 21712e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 21812e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov vixl32::Label exception_entry_; 21912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 22012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov friend class ArmVIXLJNIMacroAssembler; 22112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov DISALLOW_COPY_AND_ASSIGN(ArmException); 22212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov }; 22312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 22412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // List of exception blocks to generate at the end of the code cache. 22512e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov ArenaVector<std::unique_ptr<ArmVIXLJNIMacroAssembler::ArmException>> exception_blocks_; 22612e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov // Used for testing. 2270e851e2fb55773e2ad5f06b89ed5e655ca3eb846Vladimir Marko friend class ArmVIXLAssemblerTest_VixlLoadFromOffset_Test; 2280e851e2fb55773e2ad5f06b89ed5e655ca3eb846Vladimir Marko friend class ArmVIXLAssemblerTest_VixlStoreToOffset_Test; 22912e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov}; 23012e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 231ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkinclass ArmVIXLJNIMacroLabel FINAL 232ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkin : public JNIMacroLabelCommon<ArmVIXLJNIMacroLabel, 233ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkin vixl32::Label, 234ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkin kArm> { 235ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkin public: 236ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkin vixl32::Label* AsArm() { 237ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkin return AsPlatformLabel(); 238ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkin } 239ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkin}; 240ae7ff92c430aa12484ff8258ee4ed13421ac7934Igor Murashkin 24112e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov} // namespace arm 24212e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov} // namespace art 24312e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov 24412e097c84cef710fa4f254b1811ff70b876e9e9aArtem Serov#endif // ART_COMPILER_UTILS_ARM_JNI_MACRO_ASSEMBLER_ARM_VIXL_H_ 245