diff options
Diffstat (limited to 'compiler/utils/x86')
| -rw-r--r-- | compiler/utils/x86/assembler_x86.cc | 2 | ||||
| -rw-r--r-- | compiler/utils/x86/assembler_x86.h | 2 | ||||
| -rw-r--r-- | compiler/utils/x86/assembler_x86_test.cc | 3 | ||||
| -rw-r--r-- | compiler/utils/x86/constants_x86.h | 2 | ||||
| -rw-r--r-- | compiler/utils/x86/jni_macro_assembler_x86.cc | 209 | ||||
| -rw-r--r-- | compiler/utils/x86/jni_macro_assembler_x86.h | 87 | ||||
| -rw-r--r-- | compiler/utils/x86/managed_register_x86.cc | 2 | ||||
| -rw-r--r-- | compiler/utils/x86/managed_register_x86.h | 3 | ||||
| -rw-r--r-- | compiler/utils/x86/managed_register_x86_test.cc | 3 |
9 files changed, 73 insertions, 240 deletions
diff --git a/compiler/utils/x86/assembler_x86.cc b/compiler/utils/x86/assembler_x86.cc index 861b27e6af..a6b90114b2 100644 --- a/compiler/utils/x86/assembler_x86.cc +++ b/compiler/utils/x86/assembler_x86.cc @@ -21,7 +21,7 @@ #include "entrypoints/quick/quick_entrypoints.h" #include "thread.h" -namespace art { +namespace art HIDDEN { namespace x86 { std::ostream& operator<<(std::ostream& os, const XmmRegister& reg) { diff --git a/compiler/utils/x86/assembler_x86.h b/compiler/utils/x86/assembler_x86.h index c346ba9235..0f7854dc5c 100644 --- a/compiler/utils/x86/assembler_x86.h +++ b/compiler/utils/x86/assembler_x86.h @@ -32,7 +32,7 @@ #include "offsets.h" #include "utils/assembler.h" -namespace art { +namespace art HIDDEN { namespace x86 { class Immediate : public ValueObject { diff --git a/compiler/utils/x86/assembler_x86_test.cc b/compiler/utils/x86/assembler_x86_test.cc index 89c73c0ade..5da6f04402 100644 --- a/compiler/utils/x86/assembler_x86_test.cc +++ b/compiler/utils/x86/assembler_x86_test.cc @@ -17,11 +17,12 @@ #include "assembler_x86.h" #include "base/arena_allocator.h" +#include "base/macros.h" #include "base/malloc_arena_pool.h" #include "base/stl_util.h" #include "utils/assembler_test.h" -namespace art { +namespace art HIDDEN { TEST(AssemblerX86, CreateBuffer) { MallocArenaPool pool; diff --git a/compiler/utils/x86/constants_x86.h b/compiler/utils/x86/constants_x86.h index 477b915bb9..0c0a7d4133 100644 --- a/compiler/utils/x86/constants_x86.h +++ b/compiler/utils/x86/constants_x86.h @@ -25,7 +25,7 @@ #include "base/globals.h" #include "base/macros.h" -namespace art { +namespace art HIDDEN { namespace x86 { enum ByteRegister { diff --git a/compiler/utils/x86/jni_macro_assembler_x86.cc b/compiler/utils/x86/jni_macro_assembler_x86.cc index 685f5f1b48..154e50b4e4 100644 --- a/compiler/utils/x86/jni_macro_assembler_x86.cc +++ b/compiler/utils/x86/jni_macro_assembler_x86.cc @@ -18,11 +18,12 @@ #include "base/casts.h" #include "entrypoints/quick/quick_entrypoints.h" +#include "indirect_reference_table.h" #include "lock_word.h" #include "thread.h" #include "utils/assembler.h" -namespace art { +namespace art HIDDEN { namespace x86 { static Register GetScratchRegister() { @@ -165,36 +166,24 @@ void X86JNIMacroAssembler::Store(ManagedRegister mbase, } } -void X86JNIMacroAssembler::StoreRef(FrameOffset dest, ManagedRegister msrc) { - X86ManagedRegister src = msrc.AsX86(); - CHECK(src.IsCpuRegister()); - __ movl(Address(ESP, dest), src.AsCpuRegister()); -} - void X86JNIMacroAssembler::StoreRawPtr(FrameOffset dest, ManagedRegister msrc) { X86ManagedRegister src = msrc.AsX86(); CHECK(src.IsCpuRegister()); __ movl(Address(ESP, dest), src.AsCpuRegister()); } -void X86JNIMacroAssembler::StoreImmediateToFrame(FrameOffset dest, uint32_t imm) { - __ movl(Address(ESP, dest), Immediate(imm)); -} - -void X86JNIMacroAssembler::StoreStackOffsetToThread(ThreadOffset32 thr_offs, FrameOffset fr_offs) { - Register scratch = GetScratchRegister(); - __ leal(scratch, Address(ESP, fr_offs)); - __ fs()->movl(Address::Absolute(thr_offs), scratch); -} - -void X86JNIMacroAssembler::StoreStackPointerToThread(ThreadOffset32 thr_offs) { - __ fs()->movl(Address::Absolute(thr_offs), ESP); -} - -void X86JNIMacroAssembler::StoreSpanning(FrameOffset /*dst*/, - ManagedRegister /*src*/, - FrameOffset /*in_off*/) { - UNIMPLEMENTED(FATAL); // this case only currently exists for ARM +void X86JNIMacroAssembler::StoreStackPointerToThread(ThreadOffset32 thr_offs, bool tag_sp) { + if (tag_sp) { + // There is no free register, store contents onto stack and restore back later. + Register scratch = ECX; + __ movl(Address(ESP, -32), scratch); + __ movl(scratch, ESP); + __ orl(scratch, Immediate(0x2)); + __ fs()->movl(Address::Absolute(thr_offs), scratch); + __ movl(scratch, Address(ESP, -32)); + } else { + __ fs()->movl(Address::Absolute(thr_offs), ESP); + } } void X86JNIMacroAssembler::Load(ManagedRegister mdest, FrameOffset src, size_t size) { @@ -233,61 +222,6 @@ void X86JNIMacroAssembler::Load(ManagedRegister mdest, } } -void X86JNIMacroAssembler::LoadFromThread(ManagedRegister mdest, ThreadOffset32 src, size_t size) { - X86ManagedRegister dest = mdest.AsX86(); - if (dest.IsNoRegister()) { - CHECK_EQ(0u, size); - } else if (dest.IsCpuRegister()) { - if (size == 1u) { - __ fs()->movzxb(dest.AsCpuRegister(), Address::Absolute(src)); - } else { - CHECK_EQ(4u, size); - __ fs()->movl(dest.AsCpuRegister(), Address::Absolute(src)); - } - } else if (dest.IsRegisterPair()) { - CHECK_EQ(8u, size); - __ fs()->movl(dest.AsRegisterPairLow(), Address::Absolute(src)); - __ fs()->movl(dest.AsRegisterPairHigh(), Address::Absolute(ThreadOffset32(src.Int32Value()+4))); - } else if (dest.IsX87Register()) { - if (size == 4) { - __ fs()->flds(Address::Absolute(src)); - } else { - __ fs()->fldl(Address::Absolute(src)); - } - } else { - CHECK(dest.IsXmmRegister()); - if (size == 4) { - __ fs()->movss(dest.AsXmmRegister(), Address::Absolute(src)); - } else { - __ fs()->movsd(dest.AsXmmRegister(), Address::Absolute(src)); - } - } -} - -void X86JNIMacroAssembler::LoadRef(ManagedRegister mdest, FrameOffset src) { - X86ManagedRegister dest = mdest.AsX86(); - CHECK(dest.IsCpuRegister()); - __ movl(dest.AsCpuRegister(), Address(ESP, src)); -} - -void X86JNIMacroAssembler::LoadRef(ManagedRegister mdest, ManagedRegister base, MemberOffset offs, - bool unpoison_reference) { - X86ManagedRegister dest = mdest.AsX86(); - CHECK(dest.IsCpuRegister() && dest.IsCpuRegister()); - __ movl(dest.AsCpuRegister(), Address(base.AsX86().AsCpuRegister(), offs)); - if (unpoison_reference) { - __ MaybeUnpoisonHeapReference(dest.AsCpuRegister()); - } -} - -void X86JNIMacroAssembler::LoadRawPtr(ManagedRegister mdest, - ManagedRegister base, - Offset offs) { - X86ManagedRegister dest = mdest.AsX86(); - CHECK(dest.IsCpuRegister() && dest.IsCpuRegister()); - __ movl(dest.AsCpuRegister(), Address(base.AsX86().AsCpuRegister(), offs)); -} - void X86JNIMacroAssembler::LoadRawPtrFromThread(ManagedRegister mdest, ThreadOffset32 offs) { X86ManagedRegister dest = mdest.AsX86(); CHECK(dest.IsCpuRegister()); @@ -402,37 +336,9 @@ void X86JNIMacroAssembler::Move(ManagedRegister mdest, ManagedRegister msrc, siz } } -void X86JNIMacroAssembler::CopyRef(FrameOffset dest, FrameOffset src) { - Register scratch = GetScratchRegister(); - __ movl(scratch, Address(ESP, src)); - __ movl(Address(ESP, dest), scratch); -} - -void X86JNIMacroAssembler::CopyRef(FrameOffset dest, - ManagedRegister base, - MemberOffset offs, - bool unpoison_reference) { - Register scratch = GetScratchRegister(); - __ movl(scratch, Address(base.AsX86().AsCpuRegister(), offs)); - if (unpoison_reference) { - __ MaybeUnpoisonHeapReference(scratch); - } - __ movl(Address(ESP, dest), scratch); -} - -void X86JNIMacroAssembler::CopyRawPtrFromThread(FrameOffset fr_offs, ThreadOffset32 thr_offs) { - Register scratch = GetScratchRegister(); - __ fs()->movl(scratch, Address::Absolute(thr_offs)); - __ movl(Address(ESP, fr_offs), scratch); -} - -void X86JNIMacroAssembler::CopyRawPtrToThread(ThreadOffset32 thr_offs, - FrameOffset fr_offs, - ManagedRegister mscratch) { - X86ManagedRegister scratch = mscratch.AsX86(); - CHECK(scratch.IsCpuRegister()); - Load(scratch, fr_offs, 4); - __ fs()->movl(Address::Absolute(thr_offs), scratch.AsCpuRegister()); +void X86JNIMacroAssembler::Move(ManagedRegister mdest, size_t value) { + X86ManagedRegister dest = mdest.AsX86(); + __ movl(dest.AsCpuRegister(), Immediate(value)); } void X86JNIMacroAssembler::Copy(FrameOffset dest, FrameOffset src, size_t size) { @@ -446,67 +352,6 @@ void X86JNIMacroAssembler::Copy(FrameOffset dest, FrameOffset src, size_t size) } } -void X86JNIMacroAssembler::Copy(FrameOffset /*dst*/, - ManagedRegister /*src_base*/, - Offset /*src_offset*/, - ManagedRegister /*scratch*/, - size_t /*size*/) { - UNIMPLEMENTED(FATAL); -} - -void X86JNIMacroAssembler::Copy(ManagedRegister dest_base, - Offset dest_offset, - FrameOffset src, - ManagedRegister scratch, - size_t size) { - CHECK(scratch.IsNoRegister()); - CHECK_EQ(size, 4u); - __ pushl(Address(ESP, src)); - __ popl(Address(dest_base.AsX86().AsCpuRegister(), dest_offset)); -} - -void X86JNIMacroAssembler::Copy(FrameOffset dest, - FrameOffset src_base, - Offset src_offset, - ManagedRegister mscratch, - size_t size) { - Register scratch = mscratch.AsX86().AsCpuRegister(); - CHECK_EQ(size, 4u); - __ movl(scratch, Address(ESP, src_base)); - __ movl(scratch, Address(scratch, src_offset)); - __ movl(Address(ESP, dest), scratch); -} - -void X86JNIMacroAssembler::Copy(ManagedRegister dest, - Offset dest_offset, - ManagedRegister src, - Offset src_offset, - ManagedRegister scratch, - size_t size) { - CHECK_EQ(size, 4u); - CHECK(scratch.IsNoRegister()); - __ pushl(Address(src.AsX86().AsCpuRegister(), src_offset)); - __ popl(Address(dest.AsX86().AsCpuRegister(), dest_offset)); -} - -void X86JNIMacroAssembler::Copy(FrameOffset dest, - Offset dest_offset, - FrameOffset src, - Offset src_offset, - ManagedRegister mscratch, - size_t size) { - Register scratch = mscratch.AsX86().AsCpuRegister(); - CHECK_EQ(size, 4u); - CHECK_EQ(dest.Int32Value(), src.Int32Value()); - __ movl(scratch, Address(ESP, src)); - __ pushl(Address(scratch, src_offset)); - __ popl(Address(scratch, dest_offset)); -} - -void X86JNIMacroAssembler::MemoryBarrier(ManagedRegister) { - __ mfence(); -} - void X86JNIMacroAssembler::CreateJObject(ManagedRegister mout_reg, FrameOffset spilled_reference_offset, ManagedRegister min_reg, @@ -547,6 +392,20 @@ void X86JNIMacroAssembler::CreateJObject(FrameOffset out_off, __ movl(Address(ESP, out_off), scratch); } +void X86JNIMacroAssembler::DecodeJNITransitionOrLocalJObject(ManagedRegister reg, + JNIMacroLabel* slow_path, + JNIMacroLabel* resume) { + constexpr uint32_t kGlobalOrWeakGlobalMask = + dchecked_integral_cast<uint32_t>(IndirectReferenceTable::GetGlobalOrWeakGlobalMask()); + constexpr uint32_t kIndirectRefKindMask = + dchecked_integral_cast<uint32_t>(IndirectReferenceTable::GetIndirectRefKindMask()); + __ testl(reg.AsX86().AsCpuRegister(), Immediate(kGlobalOrWeakGlobalMask)); + __ j(kNotZero, X86JNIMacroLabel::Cast(slow_path)->AsX86()); + __ andl(reg.AsX86().AsCpuRegister(), Immediate(~kIndirectRefKindMask)); + __ j(kZero, X86JNIMacroLabel::Cast(resume)->AsX86()); // Skip load for null. + __ movl(reg.AsX86().AsCpuRegister(), Address(reg.AsX86().AsCpuRegister(), /*disp=*/ 0)); +} + void X86JNIMacroAssembler::VerifyObject(ManagedRegister /*src*/, bool /*could_be_null*/) { // TODO: not validating references } @@ -724,6 +583,12 @@ void X86JNIMacroAssembler::TestMarkBit(ManagedRegister mref, __ j(UnaryConditionToX86Condition(cond), X86JNIMacroLabel::Cast(label)->AsX86()); } + +void X86JNIMacroAssembler::TestByteAndJumpIfNotZero(uintptr_t address, JNIMacroLabel* label) { + __ cmpb(Address::Absolute(address), Immediate(0)); + __ j(kNotZero, X86JNIMacroLabel::Cast(label)->AsX86()); +} + void X86JNIMacroAssembler::Bind(JNIMacroLabel* label) { CHECK(label != nullptr); __ Bind(X86JNIMacroLabel::Cast(label)->AsX86()); diff --git a/compiler/utils/x86/jni_macro_assembler_x86.h b/compiler/utils/x86/jni_macro_assembler_x86.h index 29fccfd386..6b177f533b 100644 --- a/compiler/utils/x86/jni_macro_assembler_x86.h +++ b/compiler/utils/x86/jni_macro_assembler_x86.h @@ -27,7 +27,7 @@ #include "offsets.h" #include "utils/jni_macro_assembler.h" -namespace art { +namespace art HIDDEN { namespace x86 { class X86JNIMacroLabel; @@ -59,30 +59,14 @@ class X86JNIMacroAssembler final : public JNIMacroAssemblerFwd<X86Assembler, Poi // Store routines void Store(FrameOffset offs, ManagedRegister src, size_t size) override; void Store(ManagedRegister base, MemberOffset offs, ManagedRegister src, size_t size) override; - void StoreRef(FrameOffset dest, ManagedRegister src) override; void StoreRawPtr(FrameOffset dest, ManagedRegister src) override; - void StoreImmediateToFrame(FrameOffset dest, uint32_t imm) override; - - void StoreStackOffsetToThread(ThreadOffset32 thr_offs, FrameOffset fr_offs) override; - - void StoreStackPointerToThread(ThreadOffset32 thr_offs) override; - - void StoreSpanning(FrameOffset dest, ManagedRegister src, FrameOffset in_off) override; + void StoreStackPointerToThread(ThreadOffset32 thr_offs, bool tag_sp) override; // Load routines void Load(ManagedRegister dest, FrameOffset src, size_t size) override; void Load(ManagedRegister dest, ManagedRegister base, MemberOffset offs, size_t size) override; - void LoadFromThread(ManagedRegister dest, ThreadOffset32 src, size_t size) override; - - void LoadRef(ManagedRegister dest, FrameOffset src) override; - - void LoadRef(ManagedRegister dest, ManagedRegister base, MemberOffset offs, - bool unpoison_reference) override; - - void LoadRawPtr(ManagedRegister dest, ManagedRegister base, Offset offs) override; - void LoadRawPtrFromThread(ManagedRegister dest, ThreadOffset32 offs) override; // Copying routines @@ -92,35 +76,7 @@ class X86JNIMacroAssembler final : public JNIMacroAssemblerFwd<X86Assembler, Poi void Move(ManagedRegister dest, ManagedRegister src, size_t size) override; - void CopyRawPtrFromThread(FrameOffset fr_offs, ThreadOffset32 thr_offs) override; - - void CopyRawPtrToThread(ThreadOffset32 thr_offs, FrameOffset fr_offs, ManagedRegister scratch) - override; - - void CopyRef(FrameOffset dest, FrameOffset src) override; - void CopyRef(FrameOffset dest, - ManagedRegister base, - MemberOffset offs, - bool unpoison_reference) override; - - void Copy(FrameOffset dest, FrameOffset src, size_t size) override; - - void Copy(FrameOffset dest, ManagedRegister src_base, Offset src_offset, ManagedRegister scratch, - size_t size) override; - - void Copy(ManagedRegister dest_base, Offset dest_offset, FrameOffset src, ManagedRegister scratch, - size_t size) override; - - void Copy(FrameOffset dest, FrameOffset src_base, Offset src_offset, ManagedRegister scratch, - size_t size) override; - - void Copy(ManagedRegister dest, Offset dest_offset, ManagedRegister src, Offset src_offset, - ManagedRegister scratch, size_t size) override; - - void Copy(FrameOffset dest, Offset dest_offset, FrameOffset src, Offset src_offset, - ManagedRegister scratch, size_t size) override; - - void MemoryBarrier(ManagedRegister) override; + void Move(ManagedRegister dest, size_t value) override; // Sign extension void SignExtend(ManagedRegister mreg, size_t size) override; @@ -132,20 +88,10 @@ class X86JNIMacroAssembler final : public JNIMacroAssemblerFwd<X86Assembler, Poi void GetCurrentThread(ManagedRegister dest) override; void GetCurrentThread(FrameOffset dest_offset) override; - // Set up `out_reg` to hold a `jobject` (`StackReference<Object>*` to a spilled value), - // or to be null if the value is null and `null_allowed`. `in_reg` holds a possibly - // stale reference that can be used to avoid loading the spilled value to - // see if the value is null. - void CreateJObject(ManagedRegister out_reg, - FrameOffset spilled_reference_offset, - ManagedRegister in_reg, - bool null_allowed) override; - - // Set up `out_off` to hold a `jobject` (`StackReference<Object>*` to a spilled value), - // or to be null if the value is null and `null_allowed`. - void CreateJObject(FrameOffset out_off, - FrameOffset spilled_reference_offset, - bool null_allowed) override; + // Decode JNI transition or local `jobject`. For (weak) global `jobject`, jump to slow path. + void DecodeJNITransitionOrLocalJObject(ManagedRegister reg, + JNIMacroLabel* slow_path, + JNIMacroLabel* resume) override; // Heap::VerifyObject on src. In some cases (such as a reference to this) we // know that src may not be null. @@ -189,10 +135,29 @@ class X86JNIMacroAssembler final : public JNIMacroAssemblerFwd<X86Assembler, Poi void TestGcMarking(JNIMacroLabel* label, JNIMacroUnaryCondition cond) override; // Emit a conditional jump to the label by applying a unary condition test to object's mark bit. void TestMarkBit(ManagedRegister ref, JNIMacroLabel* label, JNIMacroUnaryCondition cond) override; + // Emit a conditional jump to label if the loaded value from specified locations is not zero. + void TestByteAndJumpIfNotZero(uintptr_t address, JNIMacroLabel* label) override; // Code at this offset will serve as the target for the Jump call. void Bind(JNIMacroLabel* label) override; private: + void Copy(FrameOffset dest, FrameOffset src, size_t size); + + // Set up `out_reg` to hold a `jobject` (`StackReference<Object>*` to a spilled value), + // or to be null if the value is null and `null_allowed`. `in_reg` holds a possibly + // stale reference that can be used to avoid loading the spilled value to + // see if the value is null. + void CreateJObject(ManagedRegister out_reg, + FrameOffset spilled_reference_offset, + ManagedRegister in_reg, + bool null_allowed); + + // Set up `out_off` to hold a `jobject` (`StackReference<Object>*` to a spilled value), + // or to be null if the value is null and `null_allowed`. + void CreateJObject(FrameOffset out_off, + FrameOffset spilled_reference_offset, + bool null_allowed); + DISALLOW_COPY_AND_ASSIGN(X86JNIMacroAssembler); }; diff --git a/compiler/utils/x86/managed_register_x86.cc b/compiler/utils/x86/managed_register_x86.cc index cc7cedf93e..bef948056f 100644 --- a/compiler/utils/x86/managed_register_x86.cc +++ b/compiler/utils/x86/managed_register_x86.cc @@ -18,7 +18,7 @@ #include "base/globals.h" -namespace art { +namespace art HIDDEN { namespace x86 { // Define register pairs. diff --git a/compiler/utils/x86/managed_register_x86.h b/compiler/utils/x86/managed_register_x86.h index 27555bfd32..def4f68b27 100644 --- a/compiler/utils/x86/managed_register_x86.h +++ b/compiler/utils/x86/managed_register_x86.h @@ -17,10 +17,11 @@ #ifndef ART_COMPILER_UTILS_X86_MANAGED_REGISTER_X86_H_ #define ART_COMPILER_UTILS_X86_MANAGED_REGISTER_X86_H_ +#include "base/macros.h" #include "constants_x86.h" #include "utils/managed_register.h" -namespace art { +namespace art HIDDEN { namespace x86 { // Values for register pairs. diff --git a/compiler/utils/x86/managed_register_x86_test.cc b/compiler/utils/x86/managed_register_x86_test.cc index 28af5313c7..9f5e1970ac 100644 --- a/compiler/utils/x86/managed_register_x86_test.cc +++ b/compiler/utils/x86/managed_register_x86_test.cc @@ -17,9 +17,10 @@ #include "managed_register_x86.h" #include "base/globals.h" +#include "base/macros.h" #include "gtest/gtest.h" -namespace art { +namespace art HIDDEN { namespace x86 { TEST(X86ManagedRegister, NoRegister) { |