summaryrefslogtreecommitdiff
path: root/compiler/utils/x86
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/utils/x86')
-rw-r--r--compiler/utils/x86/assembler_x86.cc2
-rw-r--r--compiler/utils/x86/assembler_x86.h2
-rw-r--r--compiler/utils/x86/assembler_x86_test.cc3
-rw-r--r--compiler/utils/x86/constants_x86.h2
-rw-r--r--compiler/utils/x86/jni_macro_assembler_x86.cc209
-rw-r--r--compiler/utils/x86/jni_macro_assembler_x86.h87
-rw-r--r--compiler/utils/x86/managed_register_x86.cc2
-rw-r--r--compiler/utils/x86/managed_register_x86.h3
-rw-r--r--compiler/utils/x86/managed_register_x86_test.cc3
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) {