Improve interpreter to interpreter invokes.
The interpreter constructs a shadow frame instead of arg array to make
interpreter to interpreter transitions faster. This adds a pointer to
an entry for the interpreter to each method.
Change-Id: If48911d3aa3470847b8548a9e92090b829f4f254
diff --git a/src/invoke_arg_array_builder.h b/src/invoke_arg_array_builder.h
index a6e99a5..b57d60a 100644
--- a/src/invoke_arg_array_builder.h
+++ b/src/invoke_arg_array_builder.h
@@ -162,60 +162,10 @@
}
}
- void BuildArgArray(const ShadowFrame& shadow_frame, mirror::Object* receiver, uint32_t range_start)
- SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
- // Set receiver if non-null (method is not static)
- if (receiver != NULL) {
- Append(reinterpret_cast<int32_t>(receiver));
- }
- for (size_t i = 1, reg_offset = 0; i < shorty_len_; ++i, ++reg_offset) {
- switch (shorty_[i]) {
- case 'Z':
- case 'B':
- case 'C':
- case 'S':
- case 'I':
- case 'F':
- Append(shadow_frame.GetVReg(range_start + reg_offset));
- break;
- case 'L':
- Append(reinterpret_cast<int32_t>(shadow_frame.GetVRegReference(range_start + reg_offset)));
- break;
- case 'D':
- case 'J':
- AppendWide(shadow_frame.GetVRegLong(range_start + reg_offset));
- reg_offset++;
- break;
- }
- }
- }
-
- void BuildArgArray(const ShadowFrame& shadow_frame, mirror::Object* receiver, const uint32_t* arg_regs)
- SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
- // Set receiver if non-null (method is not static)
- if (receiver != NULL) {
- Append(reinterpret_cast<int32_t>(receiver));
- }
- for (size_t i = 1, reg_offset = 0; i < shorty_len_; ++i, ++reg_offset) {
- switch (shorty_[i]) {
- case 'Z':
- case 'B':
- case 'C':
- case 'S':
- case 'I':
- case 'F':
- Append(shadow_frame.GetVReg(arg_regs[reg_offset]));
- break;
- case 'L':
- Append(reinterpret_cast<int32_t>(shadow_frame.GetVRegReference(arg_regs[reg_offset])));
- break;
- case 'D':
- case 'J':
- AppendWide(shadow_frame.GetVRegLong(arg_regs[reg_offset]));
- reg_offset++;
- break;
- }
- }
+ void BuildArgArray(ShadowFrame* shadow_frame, uint32_t arg_offset)
+ SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
+ arg_array_ = shadow_frame->GetVRegArgs(arg_offset);
+ num_bytes_ = (shadow_frame->NumberOfVRegs() - arg_offset) * 4;
}
private: