Remove quickened bytecode support from interpreters.
We no longer generate them, so mark them as unused.
Bug: 170086509
Test: m test-art-host-gtest
Test: test.py -r -b --host
Change-Id: I71f81e5923f745b8f6efa80db16e978635ed65c4
diff --git a/runtime/interpreter/interpreter_common.h b/runtime/interpreter/interpreter_common.h
index ad6ceae..65bff8e 100644
--- a/runtime/interpreter/interpreter_common.h
+++ b/runtime/interpreter/interpreter_common.h
@@ -228,7 +228,7 @@
// Handles all invoke-XXX/range instructions except for invoke-polymorphic[/range].
// Returns true on success, otherwise throws an exception and returns false.
-template<InvokeType type, bool is_range, bool do_access_check, bool is_mterp, bool is_quick = false>
+template<InvokeType type, bool is_range, bool do_access_check, bool is_mterp>
static ALWAYS_INLINE bool DoInvoke(Thread* self,
ShadowFrame& shadow_frame,
const Instruction* inst,
@@ -250,9 +250,7 @@
InterpreterCache* tls_cache = self->GetInterpreterCache();
size_t tls_value;
ArtMethod* resolved_method;
- if (is_quick) {
- resolved_method = nullptr; // We don't know/care what the original method was.
- } else if (!IsNterpSupported() && LIKELY(tls_cache->Get(inst, &tls_value))) {
+ if (!IsNterpSupported() && LIKELY(tls_cache->Get(inst, &tls_value))) {
resolved_method = reinterpret_cast<ArtMethod*>(tls_value);
} else {
ClassLinker* const class_linker = Runtime::Current()->GetClassLinker();
@@ -274,19 +272,8 @@
ObjPtr<mirror::Object> receiver =
(type == kStatic) ? nullptr : shadow_frame.GetVRegReference(vregC);
ArtMethod* called_method;
- if (is_quick) {
- if (UNLIKELY(receiver == nullptr)) {
- // We lost the reference to the method index so we cannot get a more precise exception.
- ThrowNullPointerExceptionFromDexPC();
- return false;
- }
- DCHECK(receiver->GetClass()->ShouldHaveEmbeddedVTable());
- called_method = receiver->GetClass()->GetEmbeddedVTableEntry(
- /*vtable_idx=*/ method_idx, Runtime::Current()->GetClassLinker()->GetImagePointerSize());
- } else {
- called_method = FindMethodToCall<type, do_access_check>(
- method_idx, resolved_method, &receiver, sf_method, self);
- }
+ called_method = FindMethodToCall<type, do_access_check>(
+ method_idx, resolved_method, &receiver, sf_method, self);
if (UNLIKELY(called_method == nullptr)) {
CHECK(self->IsExceptionPending());
result->SetJ(0);
@@ -566,71 +553,6 @@
return true;
}
-// Handles iget-quick, iget-wide-quick and iget-object-quick instructions.
-// Returns true on success, otherwise throws an exception and returns false.
-template<Primitive::Type field_type>
-ALWAYS_INLINE bool DoIGetQuick(ShadowFrame& shadow_frame, const Instruction* inst,
- uint16_t inst_data) REQUIRES_SHARED(Locks::mutator_lock_) {
- ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegB_22c(inst_data));
- if (UNLIKELY(obj == nullptr)) {
- // We lost the reference to the field index so we cannot get a more
- // precised exception message.
- ThrowNullPointerExceptionFromDexPC();
- return false;
- }
- MemberOffset field_offset(inst->VRegC_22c());
- // Report this field access to instrumentation if needed. Since we only have the offset of
- // the field from the base of the object, we need to look for it first.
- instrumentation::Instrumentation* instrumentation = Runtime::Current()->GetInstrumentation();
- if (UNLIKELY(instrumentation->HasFieldReadListeners())) {
- ArtField* f = ArtField::FindInstanceFieldWithOffset(obj->GetClass(),
- field_offset.Uint32Value());
- DCHECK(f != nullptr);
- DCHECK(!f->IsStatic());
- Thread* self = Thread::Current();
- StackHandleScope<1> hs(self);
- // Save obj in case the instrumentation event has thread suspension.
- HandleWrapperObjPtr<mirror::Object> h = hs.NewHandleWrapper(&obj);
- instrumentation->FieldReadEvent(self,
- obj,
- shadow_frame.GetMethod(),
- shadow_frame.GetDexPC(),
- f);
- if (UNLIKELY(self->IsExceptionPending())) {
- return false;
- }
- }
- // Note: iget-x-quick instructions are only for non-volatile fields.
- const uint32_t vregA = inst->VRegA_22c(inst_data);
- switch (field_type) {
- case Primitive::kPrimInt:
- shadow_frame.SetVReg(vregA, static_cast<int32_t>(obj->GetField32(field_offset)));
- break;
- case Primitive::kPrimBoolean:
- shadow_frame.SetVReg(vregA, static_cast<int32_t>(obj->GetFieldBoolean(field_offset)));
- break;
- case Primitive::kPrimByte:
- shadow_frame.SetVReg(vregA, static_cast<int32_t>(obj->GetFieldByte(field_offset)));
- break;
- case Primitive::kPrimChar:
- shadow_frame.SetVReg(vregA, static_cast<int32_t>(obj->GetFieldChar(field_offset)));
- break;
- case Primitive::kPrimShort:
- shadow_frame.SetVReg(vregA, static_cast<int32_t>(obj->GetFieldShort(field_offset)));
- break;
- case Primitive::kPrimLong:
- shadow_frame.SetVRegLong(vregA, static_cast<int64_t>(obj->GetField64(field_offset)));
- break;
- case Primitive::kPrimNot:
- shadow_frame.SetVRegReference(vregA, obj->GetFieldObject<mirror::Object>(field_offset));
- break;
- default:
- LOG(FATAL) << "Unreachable: " << field_type;
- UNREACHABLE();
- }
- return true;
-}
-
static inline bool CheckWriteConstraint(Thread* self, ObjPtr<mirror::Object> obj)
REQUIRES_SHARED(Locks::mutator_lock_) {
Runtime* runtime = Runtime::Current();
@@ -706,81 +628,6 @@
value);
}
-// Handles iput-quick, iput-wide-quick and iput-object-quick instructions.
-// Returns true on success, otherwise throws an exception and returns false.
-template<Primitive::Type field_type, bool transaction_active>
-ALWAYS_INLINE bool DoIPutQuick(const ShadowFrame& shadow_frame, const Instruction* inst,
- uint16_t inst_data) REQUIRES_SHARED(Locks::mutator_lock_) {
- ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegB_22c(inst_data));
- if (UNLIKELY(obj == nullptr)) {
- // We lost the reference to the field index so we cannot get a more
- // precised exception message.
- ThrowNullPointerExceptionFromDexPC();
- return false;
- }
- MemberOffset field_offset(inst->VRegC_22c());
- const uint32_t vregA = inst->VRegA_22c(inst_data);
- // Report this field modification to instrumentation if needed. Since we only have the offset of
- // the field from the base of the object, we need to look for it first.
- instrumentation::Instrumentation* instrumentation = Runtime::Current()->GetInstrumentation();
- if (UNLIKELY(instrumentation->HasFieldWriteListeners())) {
- ArtField* f = ArtField::FindInstanceFieldWithOffset(obj->GetClass(),
- field_offset.Uint32Value());
- DCHECK(f != nullptr);
- DCHECK(!f->IsStatic());
- JValue field_value = GetFieldValue<field_type>(shadow_frame, vregA);
- Thread* self = Thread::Current();
- StackHandleScope<2> hs(self);
- // Save obj in case the instrumentation event has thread suspension.
- HandleWrapperObjPtr<mirror::Object> h = hs.NewHandleWrapper(&obj);
- mirror::Object* fake_root = nullptr;
- HandleWrapper<mirror::Object> ret(hs.NewHandleWrapper<mirror::Object>(
- field_type == Primitive::kPrimNot ? field_value.GetGCRoot() : &fake_root));
- instrumentation->FieldWriteEvent(self,
- obj,
- shadow_frame.GetMethod(),
- shadow_frame.GetDexPC(),
- f,
- field_value);
- if (UNLIKELY(self->IsExceptionPending())) {
- return false;
- }
- if (UNLIKELY(shadow_frame.GetForcePopFrame())) {
- // Don't actually set the field. The next instruction will force us to pop.
- DCHECK(Runtime::Current()->AreNonStandardExitsEnabled());
- return true;
- }
- }
- // Note: iput-x-quick instructions are only for non-volatile fields.
- switch (field_type) {
- case Primitive::kPrimBoolean:
- obj->SetFieldBoolean<transaction_active>(field_offset, shadow_frame.GetVReg(vregA));
- break;
- case Primitive::kPrimByte:
- obj->SetFieldByte<transaction_active>(field_offset, shadow_frame.GetVReg(vregA));
- break;
- case Primitive::kPrimChar:
- obj->SetFieldChar<transaction_active>(field_offset, shadow_frame.GetVReg(vregA));
- break;
- case Primitive::kPrimShort:
- obj->SetFieldShort<transaction_active>(field_offset, shadow_frame.GetVReg(vregA));
- break;
- case Primitive::kPrimInt:
- obj->SetField32<transaction_active>(field_offset, shadow_frame.GetVReg(vregA));
- break;
- case Primitive::kPrimLong:
- obj->SetField64<transaction_active>(field_offset, shadow_frame.GetVRegLong(vregA));
- break;
- case Primitive::kPrimNot:
- obj->SetFieldObject<transaction_active>(field_offset, shadow_frame.GetVRegReference(vregA));
- break;
- default:
- LOG(FATAL) << "Unreachable: " << field_type;
- UNREACHABLE();
- }
- return true;
-}
-
// Handles string resolution for const-string and const-string-jumbo instructions. Also ensures the
// java.lang.String class is initialized.
static inline ObjPtr<mirror::String> ResolveString(Thread* self,
diff --git a/runtime/interpreter/interpreter_switch_impl-inl.h b/runtime/interpreter/interpreter_switch_impl-inl.h
index 0467239..4b3f8c6 100644
--- a/runtime/interpreter/interpreter_switch_impl-inl.h
+++ b/runtime/interpreter/interpreter_switch_impl-inl.h
@@ -323,26 +323,15 @@
Self(), shadow_frame_, inst_, inst_data_);
}
- template<Primitive::Type field_type>
- HANDLER_ATTRIBUTES bool HandleGetQuick() {
- return DoIGetQuick<field_type>(shadow_frame_, inst_, inst_data_);
- }
-
template<FindFieldType find_type, Primitive::Type field_type>
HANDLER_ATTRIBUTES bool HandlePut() {
return DoFieldPut<find_type, field_type, do_access_check, transaction_active>(
Self(), shadow_frame_, inst_, inst_data_);
}
- template<Primitive::Type field_type>
- HANDLER_ATTRIBUTES bool HandlePutQuick() {
- return DoIPutQuick<field_type, transaction_active>(
- shadow_frame_, inst_, inst_data_);
- }
-
- template<InvokeType type, bool is_range, bool is_quick = false>
+ template<InvokeType type, bool is_range>
HANDLER_ATTRIBUTES bool HandleInvoke() {
- bool success = DoInvoke<type, is_range, do_access_check, /*is_mterp=*/ false, is_quick>(
+ bool success = DoInvoke<type, is_range, do_access_check, /*is_mterp=*/ false>(
Self(), shadow_frame_, inst_, inst_data_, ResultRegister());
return PossiblyHandlePendingExceptionOnInvoke(!success);
}
@@ -929,31 +918,31 @@
}
HANDLER_ATTRIBUTES bool IGET_QUICK() {
- return HandleGetQuick<Primitive::kPrimInt>();
+ return HandleUnused();
}
HANDLER_ATTRIBUTES bool IGET_WIDE_QUICK() {
- return HandleGetQuick<Primitive::kPrimLong>();
+ return HandleUnused();
}
HANDLER_ATTRIBUTES bool IGET_OBJECT_QUICK() {
- return HandleGetQuick<Primitive::kPrimNot>();
+ return HandleUnused();
}
HANDLER_ATTRIBUTES bool IGET_BOOLEAN_QUICK() {
- return HandleGetQuick<Primitive::kPrimBoolean>();
+ return HandleUnused();
}
HANDLER_ATTRIBUTES bool IGET_BYTE_QUICK() {
- return HandleGetQuick<Primitive::kPrimByte>();
+ return HandleUnused();
}
HANDLER_ATTRIBUTES bool IGET_CHAR_QUICK() {
- return HandleGetQuick<Primitive::kPrimChar>();
+ return HandleUnused();
}
HANDLER_ATTRIBUTES bool IGET_SHORT_QUICK() {
- return HandleGetQuick<Primitive::kPrimShort>();
+ return HandleUnused();
}
HANDLER_ATTRIBUTES bool SGET_BOOLEAN() {
@@ -1013,31 +1002,31 @@
}
HANDLER_ATTRIBUTES bool IPUT_QUICK() {
- return HandlePutQuick<Primitive::kPrimInt>();
+ return HandleUnused();
}
HANDLER_ATTRIBUTES bool IPUT_BOOLEAN_QUICK() {
- return HandlePutQuick<Primitive::kPrimBoolean>();
+ return HandleUnused();
}
HANDLER_ATTRIBUTES bool IPUT_BYTE_QUICK() {
- return HandlePutQuick<Primitive::kPrimByte>();
+ return HandleUnused();
}
HANDLER_ATTRIBUTES bool IPUT_CHAR_QUICK() {
- return HandlePutQuick<Primitive::kPrimChar>();
+ return HandleUnused();
}
HANDLER_ATTRIBUTES bool IPUT_SHORT_QUICK() {
- return HandlePutQuick<Primitive::kPrimShort>();
+ return HandleUnused();
}
HANDLER_ATTRIBUTES bool IPUT_WIDE_QUICK() {
- return HandlePutQuick<Primitive::kPrimLong>();
+ return HandleUnused();
}
HANDLER_ATTRIBUTES bool IPUT_OBJECT_QUICK() {
- return HandlePutQuick<Primitive::kPrimNot>();
+ return HandleUnused();
}
HANDLER_ATTRIBUTES bool SPUT_BOOLEAN() {
@@ -1109,11 +1098,11 @@
}
HANDLER_ATTRIBUTES bool INVOKE_VIRTUAL_QUICK() {
- return HandleInvoke<kVirtual, /*is_range=*/ false, /*is_quick=*/ true>();
+ return HandleUnused();
}
HANDLER_ATTRIBUTES bool INVOKE_VIRTUAL_RANGE_QUICK() {
- return HandleInvoke<kVirtual, /*is_range=*/ true, /*is_quick=*/ true>();
+ return HandleUnused();
}
HANDLER_ATTRIBUTES bool INVOKE_POLYMORPHIC() {
diff --git a/runtime/interpreter/mterp/arm/invoke.S b/runtime/interpreter/mterp/arm/invoke.S
index 08fd1bb..8e5ecd0 100644
--- a/runtime/interpreter/mterp/arm/invoke.S
+++ b/runtime/interpreter/mterp/arm/invoke.S
@@ -112,10 +112,10 @@
/* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
%def op_invoke_virtual_quick():
-% invoke(helper="MterpInvokeVirtualQuick")
+% unused()
%def op_invoke_virtual_range():
% invoke(helper="MterpInvokeVirtualRange")
%def op_invoke_virtual_range_quick():
-% invoke(helper="MterpInvokeVirtualQuickRange")
+% unused()
diff --git a/runtime/interpreter/mterp/arm/object.S b/runtime/interpreter/mterp/arm/object.S
index a044d91..adbd405 100644
--- a/runtime/interpreter/mterp/arm/object.S
+++ b/runtime/interpreter/mterp/arm/object.S
@@ -88,80 +88,40 @@
% op_iget(load="ldrb", helper="MterpIGetU8")
%def op_iget_boolean_quick():
-% op_iget_quick(load="ldrb")
+% unused()
%def op_iget_byte():
% op_iget(load="ldrsb", helper="MterpIGetI8")
%def op_iget_byte_quick():
-% op_iget_quick(load="ldrsb")
+% unused()
%def op_iget_char():
% op_iget(load="ldrh", helper="MterpIGetU16")
%def op_iget_char_quick():
-% op_iget_quick(load="ldrh")
+% unused()
%def op_iget_object():
% op_iget(is_object=True, helper="MterpIGetObj")
%def op_iget_object_quick():
- /* For: iget-object-quick */
- /* op vA, vB, offset@CCCC */
- mov r2, rINST, lsr #12 @ r2<- B
- FETCH r1, 1 @ r1<- field byte offset
- EXPORT_PC
- GET_VREG r0, r2 @ r0<- object we're operating on
- bl artIGetObjectFromMterp @ (obj, offset)
- ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
- ubfx r2, rINST, #8, #4 @ r2<- A
- PREFETCH_INST 2
- cmp r3, #0
- bne MterpPossibleException @ bail out
- SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
- ADVANCE 2 @ advance rPC
- GET_INST_OPCODE ip @ extract opcode from rINST
- GOTO_OPCODE ip @ jump to next instruction
+% unused()
%def op_iget_quick(load="ldr"):
- /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
- /* op vA, vB, offset@CCCC */
- mov r2, rINST, lsr #12 @ r2<- B
- FETCH r1, 1 @ r1<- field byte offset
- GET_VREG r3, r2 @ r3<- object we're operating on
- ubfx r2, rINST, #8, #4 @ r2<- A
- cmp r3, #0 @ check object for null
- beq common_errNullObject @ object was null
- $load r0, [r3, r1] @ r0<- obj.field
- FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
- SET_VREG r0, r2 @ fp[A]<- r0
- GET_INST_OPCODE ip @ extract opcode from rINST
- GOTO_OPCODE ip @ jump to next instruction
+% unused()
%def op_iget_short():
% op_iget(load="ldrsh", helper="MterpIGetI16")
%def op_iget_short_quick():
-% op_iget_quick(load="ldrsh")
+% unused()
%def op_iget_wide():
% op_iget(is_wide=True, helper="MterpIGetU64")
%def op_iget_wide_quick():
- /* iget-wide-quick vA, vB, offset@CCCC */
- mov r2, rINST, lsr #12 @ r2<- B
- FETCH ip, 1 @ ip<- field byte offset
- GET_VREG r3, r2 @ r3<- object we're operating on
- ubfx r2, rINST, #8, #4 @ r2<- A
- cmp r3, #0 @ check object for null
- beq common_errNullObject @ object was null
- ldrd r0, [r3, ip] @ r0<- obj.field (64 bits, aligned)
- FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
- VREG_INDEX_TO_ADDR r3, r2 @ r3<- &fp[A]
- CLEAR_SHADOW_PAIR r2, ip, lr @ Zero out the shadow regs
- GET_INST_OPCODE ip @ extract opcode from rINST
- SET_VREG_WIDE_BY_ADDR r0, r1, r3 @ fp[A]<- r0/r1
- GOTO_OPCODE ip @ jump to next instruction
+% unused()
%def op_instance_of():
/*
@@ -195,73 +155,40 @@
% op_iput(helper="MterpIPutU8")
%def op_iput_boolean_quick():
-% op_iput_quick(store="strb")
+% unused()
%def op_iput_byte():
% op_iput(helper="MterpIPutI8")
%def op_iput_byte_quick():
-% op_iput_quick(store="strb")
+% unused()
%def op_iput_char():
% op_iput(helper="MterpIPutU16")
%def op_iput_char_quick():
-% op_iput_quick(store="strh")
+% unused()
%def op_iput_object():
% op_iput(helper="MterpIPutObj")
%def op_iput_object_quick():
- EXPORT_PC
- add r0, rFP, #OFF_FP_SHADOWFRAME
- mov r1, rPC
- mov r2, rINST
- bl MterpIputObjectQuick
- cmp r0, #0
- beq MterpException
- FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
- GET_INST_OPCODE ip @ extract opcode from rINST
- GOTO_OPCODE ip @ jump to next instruction
+% unused()
%def op_iput_quick(store="str"):
- /* For: iput-quick, iput-object-quick */
- /* op vA, vB, offset@CCCC */
- mov r2, rINST, lsr #12 @ r2<- B
- FETCH r1, 1 @ r1<- field byte offset
- GET_VREG r3, r2 @ r3<- fp[B], the object pointer
- ubfx r2, rINST, #8, #4 @ r2<- A
- cmp r3, #0 @ check object for null
- beq common_errNullObject @ object was null
- GET_VREG r0, r2 @ r0<- fp[A]
- FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
- $store r0, [r3, r1] @ obj.field<- r0
- GET_INST_OPCODE ip @ extract opcode from rINST
- GOTO_OPCODE ip @ jump to next instruction
+% unused()
%def op_iput_short():
% op_iput(helper="MterpIPutI16")
%def op_iput_short_quick():
-% op_iput_quick(store="strh")
+% unused()
%def op_iput_wide():
% op_iput(helper="MterpIPutU64")
%def op_iput_wide_quick():
- /* iput-wide-quick vA, vB, offset@CCCC */
- mov r2, rINST, lsr #12 @ r2<- B
- FETCH r3, 1 @ r3<- field byte offset
- GET_VREG r2, r2 @ r2<- fp[B], the object pointer
- ubfx r0, rINST, #8, #4 @ r0<- A
- cmp r2, #0 @ check object for null
- beq common_errNullObject @ object was null
- VREG_INDEX_TO_ADDR r0, r0 @ r0<- &fp[A]
- GET_VREG_WIDE_BY_ADDR r0, r1, r0 @ r0/r1<- fp[A]/fp[A+1]
- FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
- strd r0, [r2, r3] @ obj.field<- r0/r1
- GET_INST_OPCODE ip @ extract opcode from rINST
- GOTO_OPCODE ip @ jump to next instruction
+% unused()
%def op_new_instance():
/*
diff --git a/runtime/interpreter/mterp/arm64/invoke.S b/runtime/interpreter/mterp/arm64/invoke.S
index 4844213..2348608 100644
--- a/runtime/interpreter/mterp/arm64/invoke.S
+++ b/runtime/interpreter/mterp/arm64/invoke.S
@@ -101,10 +101,10 @@
/* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
%def op_invoke_virtual_quick():
-% invoke(helper="MterpInvokeVirtualQuick")
+% unused()
%def op_invoke_virtual_range():
% invoke(helper="MterpInvokeVirtualRange")
%def op_invoke_virtual_range_quick():
-% invoke(helper="MterpInvokeVirtualQuickRange")
+% unused()
diff --git a/runtime/interpreter/mterp/arm64/object.S b/runtime/interpreter/mterp/arm64/object.S
index 3cc688e..73ce5e0 100644
--- a/runtime/interpreter/mterp/arm64/object.S
+++ b/runtime/interpreter/mterp/arm64/object.S
@@ -84,76 +84,40 @@
% op_iget(load="ldrb", helper="MterpIGetU8")
%def op_iget_boolean_quick():
-% op_iget_quick(load="ldrb")
+% unused()
%def op_iget_byte():
% op_iget(load="ldrsb", helper="MterpIGetI8")
%def op_iget_byte_quick():
-% op_iget_quick(load="ldrsb")
+% unused()
%def op_iget_char():
% op_iget(load="ldrh", helper="MterpIGetU16")
%def op_iget_char_quick():
-% op_iget_quick(load="ldrh")
+% unused()
%def op_iget_object():
% op_iget(is_object=True, helper="MterpIGetObj")
%def op_iget_object_quick():
- /* For: iget-object-quick */
- /* op vA, vB, offset//CCCC */
- lsr w2, wINST, #12 // w2<- B
- FETCH w1, 1 // w1<- field byte offset
- EXPORT_PC
- GET_VREG w0, w2 // w0<- object we're operating on
- bl artIGetObjectFromMterp // (obj, offset)
- ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
- ubfx w2, wINST, #8, #4 // w2<- A
- PREFETCH_INST 2
- cbnz w3, MterpPossibleException // bail out
- SET_VREG_OBJECT w0, w2 // fp[A]<- w0
- ADVANCE 2 // advance rPC
- GET_INST_OPCODE ip // extract opcode from wINST
- GOTO_OPCODE ip // jump to next instruction
+% unused()
%def op_iget_quick(load="ldr", extend=""):
- /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
- /* op vA, vB, offset//CCCC */
- lsr w2, wINST, #12 // w2<- B
- FETCH w1, 1 // w1<- field byte offset
- GET_VREG w3, w2 // w3<- object we're operating on
- ubfx w2, wINST, #8, #4 // w2<- A
- cbz w3, common_errNullObject // object was null
- $load w0, [x3, x1] // w0<- obj.field
- FETCH_ADVANCE_INST 2 // advance rPC, load rINST
- $extend
- SET_VREG w0, w2 // fp[A]<- w0
- GET_INST_OPCODE ip // extract opcode from rINST
- GOTO_OPCODE ip // jump to next instruction
+% unused()
%def op_iget_short():
% op_iget(load="ldrsh", helper="MterpIGetI16")
%def op_iget_short_quick():
-% op_iget_quick(load="ldrsh")
+% unused()
%def op_iget_wide():
% op_iget(is_wide=True, helper="MterpIGetU64")
%def op_iget_wide_quick():
- /* iget-wide-quick vA, vB, offset//CCCC */
- lsr w2, wINST, #12 // w2<- B
- FETCH w4, 1 // w4<- field byte offset
- GET_VREG w3, w2 // w3<- object we're operating on
- ubfx w2, wINST, #8, #4 // w2<- A
- cbz w3, common_errNullObject // object was null
- ldr x0, [x3, x4] // x0<- obj.field
- FETCH_ADVANCE_INST 2 // advance rPC, load wINST
- SET_VREG_WIDE x0, w2
- GET_INST_OPCODE ip // extract opcode from wINST
- GOTO_OPCODE ip // jump to next instruction
+% unused()
%def op_instance_of():
/*
@@ -186,69 +150,40 @@
% op_iput(helper="MterpIPutU8")
%def op_iput_boolean_quick():
-% op_iput_quick(store="strb")
+% unused()
%def op_iput_byte():
% op_iput(helper="MterpIPutI8")
%def op_iput_byte_quick():
-% op_iput_quick(store="strb")
+% unused()
%def op_iput_char():
% op_iput(helper="MterpIPutU16")
%def op_iput_char_quick():
-% op_iput_quick(store="strh")
+% unused()
%def op_iput_object():
% op_iput(helper="MterpIPutObj")
%def op_iput_object_quick():
- EXPORT_PC
- add x0, xFP, #OFF_FP_SHADOWFRAME
- mov x1, xPC
- mov w2, wINST
- bl MterpIputObjectQuick
- cbz w0, MterpException
- FETCH_ADVANCE_INST 2 // advance rPC, load rINST
- GET_INST_OPCODE ip // extract opcode from rINST
- GOTO_OPCODE ip // jump to next instruction
+% unused()
%def op_iput_quick(store="str"):
- /* For: iput-quick, iput-object-quick */
- /* op vA, vB, offset//CCCC */
- lsr w2, wINST, #12 // w2<- B
- FETCH w1, 1 // w1<- field byte offset
- GET_VREG w3, w2 // w3<- fp[B], the object pointer
- ubfx w2, wINST, #8, #4 // w2<- A
- cbz w3, common_errNullObject // object was null
- GET_VREG w0, w2 // w0<- fp[A]
- FETCH_ADVANCE_INST 2 // advance rPC, load rINST
- $store w0, [x3, x1] // obj.field<- w0
- GET_INST_OPCODE ip // extract opcode from rINST
- GOTO_OPCODE ip // jump to next instruction
+% unused()
%def op_iput_short():
% op_iput(helper="MterpIPutI16")
%def op_iput_short_quick():
-% op_iput_quick(store="strh")
+% unused()
%def op_iput_wide():
% op_iput(helper="MterpIPutU64")
%def op_iput_wide_quick():
- /* iput-wide-quick vA, vB, offset//CCCC */
- lsr w2, wINST, #12 // w2<- B
- FETCH w3, 1 // w3<- field byte offset
- GET_VREG w2, w2 // w2<- fp[B], the object pointer
- ubfx w0, wINST, #8, #4 // w0<- A
- cbz w2, common_errNullObject // object was null
- GET_VREG_WIDE x0, w0 // x0<- fp[A]
- FETCH_ADVANCE_INST 2 // advance rPC, load wINST
- str x0, [x2, x3] // obj.field<- x0
- GET_INST_OPCODE ip // extract opcode from wINST
- GOTO_OPCODE ip // jump to next instruction
+% unused()
%def op_new_instance():
/*
diff --git a/runtime/interpreter/mterp/arm64ng/invoke.S b/runtime/interpreter/mterp/arm64ng/invoke.S
index ac45a35..4983201 100644
--- a/runtime/interpreter/mterp/arm64ng/invoke.S
+++ b/runtime/interpreter/mterp/arm64ng/invoke.S
@@ -172,23 +172,8 @@
%def op_invoke_virtual_range():
% invoke_virtual(helper="NterpCommonInvokeInstanceRange", range="1")
-%def invoke_virtual_quick(helper="", range=""):
- EXPORT_PC
- FETCH w2, 1 // offset
- // First argument is the 'this' pointer.
- FETCH w1, 2 // arguments
- .if !$range
- and w1, w1, #0xf
- .endif
- GET_VREG w1, w1
- // Note: if w1 is null, this will be handled by our SIGSEGV handler.
- ldr w0, [x1, #MIRROR_OBJECT_CLASS_OFFSET]
- add w0, w0, #MIRROR_CLASS_VTABLE_OFFSET_64
- ldr x0, [x0, w2, uxtw #3]
- b $helper
-
%def op_invoke_virtual_quick():
-% invoke_virtual_quick(helper="NterpCommonInvokeInstance", range="0")
+% unused()
%def op_invoke_virtual_range_quick():
-% invoke_virtual_quick(helper="NterpCommonInvokeInstanceRange", range="1")
+% unused()
diff --git a/runtime/interpreter/mterp/arm64ng/object.S b/runtime/interpreter/mterp/arm64ng/object.S
index a66dab1..fafc2d2 100644
--- a/runtime/interpreter/mterp/arm64ng/object.S
+++ b/runtime/interpreter/mterp/arm64ng/object.S
@@ -130,59 +130,25 @@
% op_iget(load="ldr", volatile_load="ldar", maybe_extend="", wide="0", is_object="1")
%def op_iget_boolean_quick():
-% op_iget_quick(load="ldrb")
+% unused()
%def op_iget_byte_quick():
-% op_iget_quick(load="ldrsb")
+% unused()
%def op_iget_char_quick():
-% op_iget_quick(load="ldrh")
+% unused()
%def op_iget_object_quick():
- /* For: iget-object-quick */
- /* op vA, vB, offset//CCCC */
- lsr w2, wINST, #12 // w2<- B
- FETCH w1, 1 // w1<- field byte offset
- GET_VREG w0, w2 // w0<- object we're operating on
- cbz x0, common_errNullObject // bail if null object.
- ldr w0, [x0, x1]
- cbnz wMR, 2f
-1:
- ubfx w2, wINST, #8, #4 // w2<- A
- PREFETCH_INST 2
- SET_VREG_OBJECT w0, w2 // fp[A]<- w0
- ADVANCE 2 // advance rPC
- GET_INST_OPCODE ip // extract opcode from wINST
- GOTO_OPCODE ip // jump to next instruction
-2:
- bl art_quick_read_barrier_mark_reg00
- b 1b
+% unused()
%def op_iget_quick(load="ldr", wide="0"):
- /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick, iget-wide-quick */
- /* op vA, vB, offset@CCCC */
- lsr w2, wINST, #12 // w2<- B
- FETCH w1, 1 // w1<- field byte offset
- GET_VREG w0, w2 // w0<- object we're operating on
- cbz x0, common_errNullObject // bail if null object.
- ubfx w2, wINST, #8, #4 // w2<- A
- PREFETCH_INST 2
- .if $wide
- ${load} x0, [x0, x1]
- SET_VREG_WIDE x0, w2 // fp[A]<- x0
- .else
- ${load} w0, [x0, x1]
- SET_VREG w0, w2 // fp[A]<- w0
- .endif
- ADVANCE 2 // advance rPC
- GET_INST_OPCODE ip // extract opcode from wINST
- GOTO_OPCODE ip // jump to next instruction
+% unused()
%def op_iget_short_quick():
-% op_iget_quick(load="ldrsh")
+% unused()
%def op_iget_wide_quick():
-% op_iget_quick(load="ldr", wide="1")
+% unused()
%def op_iput_boolean():
% op_iput(store="strb", volatile_store="stlrb", wide="0", is_object="0")
@@ -262,42 +228,25 @@
% op_iput(store="str", volatile_store="stlr", wide="0", is_object="1")
%def op_iput_boolean_quick():
-% op_iput_quick(store="strb")
+% unused()
%def op_iput_byte_quick():
-% op_iput_quick(store="strb")
+% unused()
%def op_iput_char_quick():
-% op_iput_quick(store="strh")
+% unused()
%def op_iput_quick(store="str", wide="0", is_object="0"):
- /* op vA, vB, offset@CCCC */
- lsr w2, wINST, #12 // w2<- B
- FETCH w1, 1 // w1<- field byte offset
- GET_VREG w3, w2 // w3<- fp[B], the object pointer
- ubfx w2, wINST, #8, #4 // w2<- A
- cbz w3, common_errNullObject // object was null
- .if $wide
- GET_VREG_WIDE x0, w2 // x0<- fp[A]
- FETCH_ADVANCE_INST 2 // advance rPC, load rINST
- $store x0, [x3, x1] // obj.field<- x0
- .else
- GET_VREG w0, w2 // w0<- fp[A]
- FETCH_ADVANCE_INST 2 // advance rPC, load rINST
- $store w0, [x3, x1] // obj.field<- w0
- WRITE_BARRIER_IF_OBJECT $is_object, w0, w3, .L${opcode}_skip_write_barrier
- .endif
- GET_INST_OPCODE ip // extract opcode from rINST
- GOTO_OPCODE ip // jump to next instruction
+% unused()
%def op_iput_object_quick():
-% op_iput_quick(store="str", wide="0", is_object="1")
+% unused()
%def op_iput_short_quick():
-% op_iput_quick(store="strh")
+% unused()
%def op_iput_wide_quick():
-% op_iput_quick(store="str", wide="1", is_object="0")
+% unused()
%def op_sget_boolean():
% op_sget(load="ldrb", volatile_load="ldarb", maybe_extend="", wide="0", is_object="0")
diff --git a/runtime/interpreter/mterp/armng/invoke.S b/runtime/interpreter/mterp/armng/invoke.S
index 3dfdab1..6163322 100644
--- a/runtime/interpreter/mterp/armng/invoke.S
+++ b/runtime/interpreter/mterp/armng/invoke.S
@@ -179,23 +179,8 @@
%def op_invoke_virtual_range():
% invoke_virtual(helper="NterpCommonInvokeInstanceRange", range="1")
-%def invoke_virtual_quick(helper="", range=""):
- EXPORT_PC
- FETCH r2, 1 // offset
- // First argument is the 'this' pointer.
- FETCH r1, 2 // arguments
- .if !$range
- and r1, r1, #0xf
- .endif
- GET_VREG r1, r1
- // Note: if r1 is null, this will be handled by our SIGSEGV handler.
- ldr r0, [r1, #MIRROR_OBJECT_CLASS_OFFSET]
- add r0, r0, #MIRROR_CLASS_VTABLE_OFFSET_32
- ldr r0, [r0, r2, lsl #2]
- b $helper
-
%def op_invoke_virtual_quick():
-% invoke_virtual_quick(helper="NterpCommonInvokeInstance", range="0")
+% unused()
%def op_invoke_virtual_range_quick():
-% invoke_virtual_quick(helper="NterpCommonInvokeInstanceRange", range="1")
+% unused()
diff --git a/runtime/interpreter/mterp/armng/object.S b/runtime/interpreter/mterp/armng/object.S
index ee382d5..992feeb 100644
--- a/runtime/interpreter/mterp/armng/object.S
+++ b/runtime/interpreter/mterp/armng/object.S
@@ -146,65 +146,25 @@
% op_iget(load="ldr", wide="0", is_object="1")
%def op_iget_boolean_quick():
-% op_iget_quick(load="ldrb")
+% unused()
%def op_iget_byte_quick():
-% op_iget_quick(load="ldrsb")
+% unused()
%def op_iget_char_quick():
-% op_iget_quick(load="ldrh")
+% unused()
%def op_iget_object_quick():
- /* For: iget-object-quick */
- /* op vA, vB, offset@CCCC */
- mov r2, rINST, lsr #12 @ r2<- B
- FETCH r1, 1 @ r1<- field byte offset
- EXPORT_PC
- GET_VREG r0, r2 @ r0<- object we're operating on
- cmp r0, #0
- beq common_errNullObject
- ldr r0, [r0, r1]
- cmp rMR, #0
- bne 2f
-1:
- ubfx r2, rINST, #8, #4 @ r2<- A
- FETCH_ADVANCE_INST 2
- SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
- GET_INST_OPCODE ip @ extract opcode from rINST
- GOTO_OPCODE ip @ jump to next instruction
-2:
- bl art_quick_read_barrier_mark_reg00
- b 1b
+% unused()
%def op_iget_quick(load="ldr", wide="0"):
- /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick,
- * iget-wide-quick */
- /* op vA, vB, offset@CCCC */
- mov r2, rINST, lsr #12 @ r2<- B
- FETCH r1, 1 @ r1<- field byte offset
- GET_VREG r3, r2 @ r3<- object we're operating on
- ubfx r2, rINST, #8, #4 @ r2<- A
- cmp r3, #0 @ check object for null
- beq common_errNullObject @ object was null
- FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
- .if $wide
- ldrd r0, [r3, r1] @ r0<- obj.field (64 bits, aligned)
- VREG_INDEX_TO_ADDR r3, r2 @ r3<- &fp[A]
- CLEAR_SHADOW_PAIR r2, ip, lr @ Zero out the shadow regs
- GET_INST_OPCODE ip @ extract opcode from rINST
- SET_VREG_WIDE_BY_ADDR r0, r1, r3 @ fp[A]<- r0/r1
- .else
- $load r0, [r3, r1] @ r0<- obj.field
- SET_VREG r0, r2 @ fp[A]<- r0
- GET_INST_OPCODE ip @ extract opcode from rINST
- .endif
- GOTO_OPCODE ip @ jump to next instruction
+% unused()
%def op_iget_short_quick():
-% op_iget_quick(load="ldrsh")
+% unused()
%def op_iget_wide_quick():
-% op_iget_quick(load="ldr", wide="1")
+% unused()
%def op_iput_boolean():
% op_iput(store="strb", wide="0", is_object="0")
@@ -300,45 +260,25 @@
% op_iput(store="str", wide="0", is_object="1")
%def op_iput_boolean_quick():
-% op_iput_quick(store="strb")
+% unused()
%def op_iput_byte_quick():
-% op_iput_quick(store="strb")
+% unused()
%def op_iput_char_quick():
-% op_iput_quick(store="strh")
+% unused()
%def op_iput_object_quick():
-% op_iput_quick(store="str", wide="0", is_object="1")
+% unused()
%def op_iput_quick(store="str", wide="0", is_object="0"):
- /* For: iput-quick, iput-object-quick */
- /* op vA, vB, offset@CCCC */
- mov r2, rINST, lsr #12 @ r2<- B
- FETCH ip, 1 @ r1<- field byte offset
- GET_VREG r3, r2 @ r3<- fp[B], the object pointer
- ubfx r2, rINST, #8, #4 @ r2<- A
- cmp r3, #0 @ check object for null
- beq common_errNullObject @ object was null
- .if $wide
- VREG_INDEX_TO_ADDR r0, r2 @ r0<- &fp[A]
- GET_VREG_WIDE_BY_ADDR r0, r1, r0 @ r0/r1<- fp[A]/fp[A+1]
- FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
- strd r0, [r3, ip] @ obj.field<- r0/r1
- .else
- GET_VREG r0, r2 @ r0<- fp[A]
- FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
- $store r0, [r3, ip] @ obj.field<- r0
- .endif
- WRITE_BARRIER_IF_OBJECT $is_object, r0, r3, .L${opcode}_skip_write_barrier, r2
- GET_INST_OPCODE ip @ extract opcode from rINST
- GOTO_OPCODE ip @ jump to next instruction
+% unused()
%def op_iput_short_quick():
-% op_iput_quick(store="strh")
+% unused()
%def op_iput_wide_quick():
-% op_iput_quick(store="str", wide="1", is_object="0")
+% unused()
%def op_sget_boolean():
% op_sget(load="ldrb", wide="0", is_object="0")
diff --git a/runtime/interpreter/mterp/mterp.cc b/runtime/interpreter/mterp/mterp.cc
index 5927c92..ae5e470 100644
--- a/runtime/interpreter/mterp/mterp.cc
+++ b/runtime/interpreter/mterp/mterp.cc
@@ -243,28 +243,6 @@
self, *shadow_frame, inst, inst_data, result_register) ? 1u : 0u;
}
-extern "C" size_t MterpInvokeVirtualQuick(Thread* self,
- ShadowFrame* shadow_frame,
- uint16_t* dex_pc_ptr,
- uint16_t inst_data)
- REQUIRES_SHARED(Locks::mutator_lock_) {
- JValue* result_register = shadow_frame->GetResultRegister();
- const Instruction* inst = Instruction::At(dex_pc_ptr);
- return DoInvoke<kVirtual, /*is_range=*/ false, /*do_access_check=*/ false, /*is_mterp=*/ true,
- /*is_quick=*/ true>(self, *shadow_frame, inst, inst_data, result_register) ? 1u : 0u;
-}
-
-extern "C" size_t MterpInvokeVirtualQuickRange(Thread* self,
- ShadowFrame* shadow_frame,
- uint16_t* dex_pc_ptr,
- uint16_t inst_data)
- REQUIRES_SHARED(Locks::mutator_lock_) {
- JValue* result_register = shadow_frame->GetResultRegister();
- const Instruction* inst = Instruction::At(dex_pc_ptr);
- return DoInvoke<kVirtual, /*is_range=*/ true, /*do_access_check=*/ false, /*is_mterp=*/ true,
- /*is_quick=*/ true>(self, *shadow_frame, inst, inst_data, result_register) ? 1u : 0u;
-}
-
extern "C" void MterpThreadFenceForConstructor() {
QuasiAtomic::ThreadFenceForConstructor();
}
@@ -400,14 +378,6 @@
return 1u;
}
-extern "C" size_t MterpIputObjectQuick(ShadowFrame* shadow_frame,
- uint16_t* dex_pc_ptr,
- uint32_t inst_data)
- REQUIRES_SHARED(Locks::mutator_lock_) {
- const Instruction* inst = Instruction::At(dex_pc_ptr);
- return DoIPutQuick<Primitive::kPrimNot, false>(*shadow_frame, inst, inst_data) ? 1u : 0u;
-}
-
extern "C" size_t MterpAputObject(ShadowFrame* shadow_frame,
uint16_t* dex_pc_ptr,
uint32_t inst_data)
diff --git a/runtime/interpreter/mterp/x86/invoke.S b/runtime/interpreter/mterp/x86/invoke.S
index 06cd904..ec4f8f9 100644
--- a/runtime/interpreter/mterp/x86/invoke.S
+++ b/runtime/interpreter/mterp/x86/invoke.S
@@ -112,10 +112,10 @@
/* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
%def op_invoke_virtual_quick():
-% invoke(helper="MterpInvokeVirtualQuick")
+% unused()
%def op_invoke_virtual_range():
% invoke(helper="MterpInvokeVirtualRange")
%def op_invoke_virtual_range_quick():
-% invoke(helper="MterpInvokeVirtualQuickRange")
+% unused()
diff --git a/runtime/interpreter/mterp/x86/object.S b/runtime/interpreter/mterp/x86/object.S
index a47fa3a..e8f1dba 100644
--- a/runtime/interpreter/mterp/x86/object.S
+++ b/runtime/interpreter/mterp/x86/object.S
@@ -43,77 +43,40 @@
% op_iget(helper="MterpIGetU8")
%def op_iget_boolean_quick():
-% op_iget_quick(load="movsbl")
+% unused()
%def op_iget_byte():
% op_iget(helper="MterpIGetI8")
%def op_iget_byte_quick():
-% op_iget_quick(load="movsbl")
+% unused()
%def op_iget_char():
% op_iget(helper="MterpIGetU16")
%def op_iget_char_quick():
-% op_iget_quick(load="movzwl")
+% unused()
%def op_iget_object():
% op_iget(is_object="1", helper="MterpIGetObj")
%def op_iget_object_quick():
- /* For: iget-object-quick */
- /* op vA, vB, offset@CCCC */
- movzbl rINSTbl, %ecx # ecx <- BA
- sarl $$4, %ecx # ecx <- B
- GET_VREG %ecx, %ecx # vB (object we're operating on)
- movzwl 2(rPC), %eax # eax <- field byte offset
- movl %ecx, OUT_ARG0(%esp)
- movl %eax, OUT_ARG1(%esp)
- EXPORT_PC
- call SYMBOL(artIGetObjectFromMterp) # (obj, offset)
- movl rSELF, %ecx
- RESTORE_IBASE_FROM_SELF %ecx
- cmpl $$0, THREAD_EXCEPTION_OFFSET(%ecx)
- jnz MterpException # bail out
- andb $$0xf,rINSTbl # rINST <- A
- SET_VREG_OBJECT %eax, rINST # fp[A] <- value
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
+% unused()
%def op_iget_quick(load="movl"):
- /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
- /* op vA, vB, offset@CCCC */
- movzbl rINSTbl, %ecx # ecx <- BA
- sarl $$4, %ecx # ecx <- B
- GET_VREG %ecx, %ecx # vB (object we're operating on)
- movzwl 2(rPC), %eax # eax <- field byte offset
- testl %ecx, %ecx # is object null?
- je common_errNullObject
- ${load} (%ecx,%eax,1), %eax
- andb $$0xf,rINSTbl # rINST <- A
- SET_VREG %eax, rINST # fp[A] <- value
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
+% unused()
%def op_iget_short():
% op_iget(helper="MterpIGetI16")
%def op_iget_short_quick():
-% op_iget_quick(load="movswl")
+% unused()
%def op_iget_wide():
% op_iget(helper="MterpIGetU64")
%def op_iget_wide_quick():
- /* iget-wide-quick vA, vB, offset@CCCC */
- movzbl rINSTbl, %ecx # ecx <- BA
- sarl $$4, %ecx # ecx <- B
- GET_VREG %ecx, %ecx # vB (object we're operating on)
- movzwl 2(rPC), %eax # eax <- field byte offset
- testl %ecx, %ecx # is object null?
- je common_errNullObject
- movq (%ecx,%eax,1), %xmm0
- andb $$0xf, rINSTbl # rINST <- A
- SET_WIDE_FP_VREG %xmm0, rINST
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
+% unused()
%def op_instance_of():
/*
@@ -150,72 +113,40 @@
% op_iput(helper="MterpIPutU8")
%def op_iput_boolean_quick():
-% op_iput_quick(reg="rINSTbl", store="movb")
+% unused()
%def op_iput_byte():
% op_iput(helper="MterpIPutI8")
%def op_iput_byte_quick():
-% op_iput_quick(reg="rINSTbl", store="movb")
+% unused()
%def op_iput_char():
% op_iput(helper="MterpIPutU16")
%def op_iput_char_quick():
-% op_iput_quick(reg="rINSTw", store="movw")
+% unused()
%def op_iput_object():
% op_iput(is_object="1", helper="MterpIPutObj")
%def op_iput_object_quick():
- EXPORT_PC
- leal OFF_FP_SHADOWFRAME(rFP), %eax
- movl %eax, OUT_ARG0(%esp)
- movl rPC, OUT_ARG1(%esp)
- REFRESH_INST ${opnum}
- movl rINST, OUT_ARG2(%esp)
- call SYMBOL(MterpIputObjectQuick)
- testb %al, %al
- jz MterpException
- RESTORE_IBASE
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
+% unused()
%def op_iput_quick(reg="rINST", store="movl"):
- /* For: iput-quick, iput-object-quick */
- /* op vA, vB, offset@CCCC */
- movzbl rINSTbl, %ecx # ecx <- BA
- sarl $$4, %ecx # ecx <- B
- GET_VREG %ecx, %ecx # vB (object we're operating on)
- testl %ecx, %ecx # is object null?
- je common_errNullObject
- andb $$0xf, rINSTbl # rINST <- A
- GET_VREG rINST, rINST # rINST <- v[A]
- movzwl 2(rPC), %eax # eax <- field byte offset
- ${store} ${reg}, (%ecx,%eax,1)
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
+% unused()
%def op_iput_short():
% op_iput(helper="MterpIPutI16")
%def op_iput_short_quick():
-% op_iput_quick(reg="rINSTw", store="movw")
+% unused()
%def op_iput_wide():
% op_iput(helper="MterpIPutU64")
%def op_iput_wide_quick():
- /* iput-wide-quick vA, vB, offset@CCCC */
- movzbl rINSTbl, %ecx # ecx<- BA
- sarl $$4, %ecx # ecx<- B
- GET_VREG %ecx, %ecx # vB (object we're operating on)
- testl %ecx, %ecx # is object null?
- je common_errNullObject
- movzwl 2(rPC), %eax # eax<- field byte offset
- leal (%ecx,%eax,1), %ecx # ecx<- Address of 64-bit target
- andb $$0xf, rINSTbl # rINST<- A
- GET_WIDE_FP_VREG %xmm0, rINST # xmm0<- fp[A]/fp[A+1]
- movq %xmm0, (%ecx) # obj.field<- r0/r1
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
+% unused()
%def op_new_instance():
/*
diff --git a/runtime/interpreter/mterp/x86_64/invoke.S b/runtime/interpreter/mterp/x86_64/invoke.S
index 15b48c9..35fdbcd 100644
--- a/runtime/interpreter/mterp/x86_64/invoke.S
+++ b/runtime/interpreter/mterp/x86_64/invoke.S
@@ -106,10 +106,10 @@
/* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
%def op_invoke_virtual_quick():
-% invoke(helper="MterpInvokeVirtualQuick")
+% unused()
%def op_invoke_virtual_range():
% invoke(helper="MterpInvokeVirtualRange")
%def op_invoke_virtual_range_quick():
-% invoke(helper="MterpInvokeVirtualQuickRange")
+% unused()
diff --git a/runtime/interpreter/mterp/x86_64/object.S b/runtime/interpreter/mterp/x86_64/object.S
index fa85f69..afbcb50 100644
--- a/runtime/interpreter/mterp/x86_64/object.S
+++ b/runtime/interpreter/mterp/x86_64/object.S
@@ -35,70 +35,40 @@
% op_iget(helper="MterpIGetU8")
%def op_iget_boolean_quick():
-% op_iget_quick(load="movsbl")
+% unused()
%def op_iget_byte():
% op_iget(helper="MterpIGetI8")
%def op_iget_byte_quick():
-% op_iget_quick(load="movsbl")
+% unused()
%def op_iget_char():
% op_iget(helper="MterpIGetU16")
%def op_iget_char_quick():
-% op_iget_quick(load="movzwl")
+% unused()
%def op_iget_object():
% op_iget(is_object="1", helper="MterpIGetObj")
%def op_iget_object_quick():
- /* For: iget-object-quick */
- /* op vA, vB, offset@CCCC */
- .extern artIGetObjectFromMterp
- movzbq rINSTbl, %rcx # rcx <- BA
- sarl $$4, %ecx # ecx <- B
- GET_VREG OUT_32_ARG0, %rcx # vB (object we're operating on)
- movzwl 2(rPC), OUT_32_ARG1 # eax <- field byte offset
- EXPORT_PC
- callq SYMBOL(artIGetObjectFromMterp) # (obj, offset)
- movq rSELF, %rcx
- cmpq $$0, THREAD_EXCEPTION_OFFSET(%rcx)
- jnz MterpException # bail out
- andb $$0xf, rINSTbl # rINST <- A
- SET_VREG_OBJECT %eax, rINSTq # fp[A] <- value
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
+% unused()
%def op_iget_quick(load="movl", wide="0"):
- /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick, iget-wide-quick */
- /* op vA, vB, offset@CCCC */
- movl rINST, %ecx # rcx <- BA
- sarl $$4, %ecx # ecx <- B
- GET_VREG %ecx, %rcx # vB (object we're operating on)
- movzwq 2(rPC), %rax # eax <- field byte offset
- testl %ecx, %ecx # is object null?
- je common_errNullObject
- andb $$0xf,rINSTbl # rINST <- A
- .if $wide
- movq (%rcx,%rax,1), %rax
- SET_WIDE_VREG %rax, rINSTq # fp[A] <- value
- .else
- ${load} (%rcx,%rax,1), %eax
- SET_VREG %eax, rINSTq # fp[A] <- value
- .endif
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
+% unused()
%def op_iget_short():
% op_iget(helper="MterpIGetI16")
%def op_iget_short_quick():
-% op_iget_quick(load="movswl")
+% unused()
%def op_iget_wide():
% op_iget(helper="MterpIGetU64")
%def op_iget_wide_quick():
-% op_iget_quick(load="movswl", wide="1")
+% unused()
%def op_instance_of():
/*
@@ -131,70 +101,40 @@
% op_iput(helper="MterpIPutU8")
%def op_iput_boolean_quick():
-% op_iput_quick(reg="rINSTbl", store="movb")
+% unused()
%def op_iput_byte():
% op_iput(helper="MterpIPutI8")
%def op_iput_byte_quick():
-% op_iput_quick(reg="rINSTbl", store="movb")
+% unused()
%def op_iput_char():
% op_iput(helper="MterpIPutU16")
%def op_iput_char_quick():
-% op_iput_quick(reg="rINSTw", store="movw")
+% unused()
%def op_iput_object():
% op_iput(is_object="1", helper="MterpIPutObj")
%def op_iput_object_quick():
- EXPORT_PC
- leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG0
- movq rPC, OUT_ARG1
- REFRESH_INST ${opnum}
- movl rINST, OUT_32_ARG2
- call SYMBOL(MterpIputObjectQuick)
- testb %al, %al
- jz MterpException
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
+% unused()
%def op_iput_quick(reg="rINST", store="movl"):
- /* For: iput-quick, iput-object-quick */
- /* op vA, vB, offset@CCCC */
- movzbq rINSTbl, %rcx # rcx <- BA
- sarl $$4, %ecx # ecx <- B
- GET_VREG %ecx, %rcx # vB (object we're operating on)
- testl %ecx, %ecx # is object null?
- je common_errNullObject
- andb $$0xf, rINSTbl # rINST <- A
- GET_VREG rINST, rINSTq # rINST <- v[A]
- movzwq 2(rPC), %rax # rax <- field byte offset
- ${store} ${reg}, (%rcx,%rax,1)
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
+% unused()
%def op_iput_short():
% op_iput(helper="MterpIPutI16")
%def op_iput_short_quick():
-% op_iput_quick(reg="rINSTw", store="movw")
+% unused()
%def op_iput_wide():
% op_iput(helper="MterpIPutU64")
%def op_iput_wide_quick():
- /* iput-wide-quick vA, vB, offset@CCCC */
- movzbq rINSTbl, %rcx # rcx<- BA
- sarl $$4, %ecx # ecx<- B
- GET_VREG %ecx, %rcx # vB (object we're operating on)
- testl %ecx, %ecx # is object null?
- je common_errNullObject
- movzwq 2(rPC), %rax # rax<- field byte offset
- leaq (%rcx,%rax,1), %rcx # ecx<- Address of 64-bit target
- andb $$0xf, rINSTbl # rINST<- A
- GET_WIDE_VREG %rax, rINSTq # rax<- fp[A]/fp[A+1]
- movq %rax, (%rcx) # obj.field<- r0/r1
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
+% unused()
%def op_new_instance():
/*
diff --git a/runtime/interpreter/mterp/x86_64ng/invoke.S b/runtime/interpreter/mterp/x86_64ng/invoke.S
index ebe2fcf..6ae43c9 100644
--- a/runtime/interpreter/mterp/x86_64ng/invoke.S
+++ b/runtime/interpreter/mterp/x86_64ng/invoke.S
@@ -172,27 +172,10 @@
% invoke_virtual(helper="NterpCommonInvokeInstance", range="0")
%def op_invoke_virtual_quick():
- EXPORT_PC
- movzwl 2(rPC), %eax // offset
- // First argument is the 'this' pointer.
- movzwl 4(rPC), %r11d // arguments
- andq $$0xf, %r11
- movl (rFP, %r11, 4), %esi
- // Note: if esi is null, this will be handled by our SIGSEGV handler.
- movl MIRROR_OBJECT_CLASS_OFFSET(%esi), %edx
- movq MIRROR_CLASS_VTABLE_OFFSET_64(%edx, %eax, 8), %rdi
- jmp NterpCommonInvokeInstance
+% unused()
%def op_invoke_virtual_range():
% invoke_virtual(helper="NterpCommonInvokeInstanceRange", range="1")
%def op_invoke_virtual_range_quick():
- EXPORT_PC
- movzwl 2(rPC), %eax // offset
- // First argument is the 'this' pointer.
- movzwl 4(rPC), %r11d // arguments
- movl (rFP, %r11, 4), %esi
- // Note: if esi is null, this will be handled by our SIGSEGV handler.
- movl MIRROR_OBJECT_CLASS_OFFSET(%esi), %edx
- movq MIRROR_CLASS_VTABLE_OFFSET_64(%edx, %eax, 8), %rdi
- jmp NterpCommonInvokeInstanceRange
+% unused()
diff --git a/runtime/interpreter/mterp/x86_64ng/object.S b/runtime/interpreter/mterp/x86_64ng/object.S
index cb231e3..cb81a91 100644
--- a/runtime/interpreter/mterp/x86_64ng/object.S
+++ b/runtime/interpreter/mterp/x86_64ng/object.S
@@ -5,72 +5,40 @@
jmp NterpGetBooleanInstanceField
%def op_iget_boolean_quick():
-% op_iget_quick(load="movsbl")
+% unused()
%def op_iget_byte():
jmp NterpGetByteInstanceField
%def op_iget_byte_quick():
-% op_iget_quick(load="movsbl")
+% unused()
%def op_iget_char():
jmp NterpGetCharInstanceField
%def op_iget_char_quick():
-% op_iget_quick(load="movzwl")
+% unused()
%def op_iget_object():
jmp NterpGetObjectInstanceField
%def op_iget_object_quick():
- movzwq 2(rPC), %rax # eax <- field byte offset
- movl rINST, %ecx # rcx <- BA
- sarl $$4, %ecx # ecx <- B
- GET_VREG %ecx, %rcx # vB (object we're operating on)
- testl %ecx, %ecx # is object null?
- je common_errNullObject
- testb $$READ_BARRIER_TEST_VALUE, GRAY_BYTE_OFFSET(%ecx)
- movl (%rcx,%rax,1), %eax
- jnz 2f
-1:
- andb $$0xf,rINSTbl # rINST <- A
- SET_VREG_OBJECT %eax, rINSTq # fp[A] <- value
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
-2:
- // reg00 is eax
- call art_quick_read_barrier_mark_reg00
- jmp 1b
+% unused()
%def op_iget_quick(load="movl", wide="0"):
- /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick, iget-wide-quick */
- /* op vA, vB, offset@CCCC */
- movl rINST, %ecx # rcx <- BA
- sarl $$4, %ecx # ecx <- B
- GET_VREG %ecx, %rcx # vB (object we're operating on)
- movzwq 2(rPC), %rax # eax <- field byte offset
- testl %ecx, %ecx # is object null?
- je common_errNullObject
- andb $$0xf,rINSTbl # rINST <- A
- .if $wide
- movq (%rcx,%rax,1), %rax
- SET_WIDE_VREG %rax, rINSTq # fp[A] <- value
- .else
- ${load} (%rcx,%rax,1), %eax
- SET_VREG %eax, rINSTq # fp[A] <- value
- .endif
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
+% unused()
%def op_iget_short():
jmp NterpGetShortInstanceField
%def op_iget_short_quick():
-% op_iget_quick(load="movswl")
+% unused()
%def op_iget_wide():
jmp NterpGetWideInstanceField
%def op_iget_wide_quick():
-% op_iget_quick(load="movq", wide="1")
+% unused()
%def op_instance_of():
jmp NterpInstanceOf
@@ -85,77 +53,40 @@
jmp NterpPutBooleanInstanceField
%def op_iput_boolean_quick():
-% op_iput_quick(reg="rINSTbl", store="movb")
+% unused()
%def op_iput_byte():
jmp NterpPutByteInstanceField
%def op_iput_byte_quick():
-% op_iput_quick(reg="rINSTbl", store="movb")
+% unused()
%def op_iput_char():
jmp NterpPutCharInstanceField
%def op_iput_char_quick():
-% op_iput_quick(reg="rINSTw", store="movw")
+% unused()
%def op_iput_object():
jmp NterpPutObjectInstanceField
%def op_iput_object_quick():
- movzwq 2(rPC), %rax # eax <- field byte offset
- movzbq rINSTbl, %rcx # rcx <- BA
- sarl $$4, %ecx # ecx <- B
- GET_VREG %ecx, %rcx # vB (object we're operating on)
- testl %ecx, %ecx # is object null?
- je common_errNullObject
- andb $$0xf, rINSTbl # rINST <- A
- GET_VREG rINST, rINSTq # rINST <- v[A]
- movl rINST, (%rcx,%rax,1)
- testl rINST, rINST
- je 1f
- movq rSELF:THREAD_CARD_TABLE_OFFSET, %rax
- shrq $$CARD_TABLE_CARD_SHIFT, %rcx
- movb %al, (%rcx, %rax, 1)
-1:
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
+% unused()
%def op_iput_quick(reg="rINST", store="movl"):
- /* For: iput-quick, iput-object-quick */
- /* op vA, vB, offset@CCCC */
- movzbq rINSTbl, %rcx # rcx <- BA
- sarl $$4, %ecx # ecx <- B
- GET_VREG %ecx, %rcx # vB (object we're operating on)
- testl %ecx, %ecx # is object null?
- je common_errNullObject
- andb $$0xf, rINSTbl # rINST <- A
- GET_VREG rINST, rINSTq # rINST <- v[A]
- movzwq 2(rPC), %rax # rax <- field byte offset
- ${store} ${reg}, (%rcx,%rax,1)
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
+% unused()
%def op_iput_short():
jmp NterpPutShortInstanceField
%def op_iput_short_quick():
-% op_iput_quick(reg="rINSTw", store="movw")
+% unused()
%def op_iput_wide():
jmp NterpPutWideInstanceField
%def op_iput_wide_quick():
- /* iput-wide-quick vA, vB, offset@CCCC */
- movzbq rINSTbl, %rcx # rcx<- BA
- sarl $$4, %ecx # ecx<- B
- GET_VREG %ecx, %rcx # vB (object we're operating on)
- testl %ecx, %ecx # is object null?
- je common_errNullObject
- movzwq 2(rPC), %rax # rax<- field byte offset
- leaq (%rcx,%rax,1), %rcx # ecx<- Address of 64-bit target
- andb $$0xf, rINSTbl # rINST<- A
- GET_WIDE_VREG %rax, rINSTq # rax<- fp[A]/fp[A+1]
- movq %rax, (%rcx) # obj.field<- r0/r1
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
+% unused()
%def op_sget(load="movl", wide="0"):
jmp NterpGetIntStaticField