Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(360)

Side by Side Diff: src/x64/macro-assembler-x64.cc

Issue 1455293004: Simplify MacroAssembler::InvokePrologue a bit. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix MIPS64 compilation. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/x64/macro-assembler-x64.h ('k') | src/x87/macro-assembler-x87.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #if V8_TARGET_ARCH_X64 5 #if V8_TARGET_ARCH_X64
6 6
7 #include "src/base/bits.h" 7 #include "src/base/bits.h"
8 #include "src/base/division-by-constant.h" 8 #include "src/base/division-by-constant.h"
9 #include "src/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/codegen.h" 10 #include "src/codegen.h"
(...skipping 4006 matching lines...) Expand 10 before | Expand all | Expand 10 after
4017 const ParameterCount& actual, 4017 const ParameterCount& actual,
4018 InvokeFlag flag, 4018 InvokeFlag flag,
4019 const CallWrapper& call_wrapper) { 4019 const CallWrapper& call_wrapper) {
4020 // You can't call a function without a valid frame. 4020 // You can't call a function without a valid frame.
4021 DCHECK(flag == JUMP_FUNCTION || has_frame()); 4021 DCHECK(flag == JUMP_FUNCTION || has_frame());
4022 4022
4023 Label done; 4023 Label done;
4024 bool definitely_mismatches = false; 4024 bool definitely_mismatches = false;
4025 InvokePrologue(expected, 4025 InvokePrologue(expected,
4026 actual, 4026 actual,
4027 Handle<Code>::null(),
4028 code,
4029 &done, 4027 &done,
4030 &definitely_mismatches, 4028 &definitely_mismatches,
4031 flag, 4029 flag,
4032 Label::kNear, 4030 Label::kNear,
4033 call_wrapper); 4031 call_wrapper);
4034 if (!definitely_mismatches) { 4032 if (!definitely_mismatches) {
4035 if (flag == CALL_FUNCTION) { 4033 if (flag == CALL_FUNCTION) {
4036 call_wrapper.BeforeCall(CallSize(code)); 4034 call_wrapper.BeforeCall(CallSize(code));
4037 call(code); 4035 call(code);
4038 call_wrapper.AfterCall(); 4036 call_wrapper.AfterCall();
4039 } else { 4037 } else {
4040 DCHECK(flag == JUMP_FUNCTION); 4038 DCHECK(flag == JUMP_FUNCTION);
4041 jmp(code); 4039 jmp(code);
4042 } 4040 }
4043 bind(&done); 4041 bind(&done);
4044 } 4042 }
4045 } 4043 }
4046 4044
4047 4045
4048 void MacroAssembler::InvokePrologue(const ParameterCount& expected, 4046 void MacroAssembler::InvokePrologue(const ParameterCount& expected,
4049 const ParameterCount& actual, 4047 const ParameterCount& actual,
4050 Handle<Code> code_constant,
4051 Register code_register,
4052 Label* done, 4048 Label* done,
4053 bool* definitely_mismatches, 4049 bool* definitely_mismatches,
4054 InvokeFlag flag, 4050 InvokeFlag flag,
4055 Label::Distance near_jump, 4051 Label::Distance near_jump,
4056 const CallWrapper& call_wrapper) { 4052 const CallWrapper& call_wrapper) {
4057 bool definitely_matches = false; 4053 bool definitely_matches = false;
4058 *definitely_mismatches = false; 4054 *definitely_mismatches = false;
4059 Label invoke; 4055 Label invoke;
4060 if (expected.is_immediate()) { 4056 if (expected.is_immediate()) {
4061 DCHECK(actual.is_immediate()); 4057 DCHECK(actual.is_immediate());
(...skipping 29 matching lines...) Expand all
4091 j(equal, &invoke, Label::kNear); 4087 j(equal, &invoke, Label::kNear);
4092 DCHECK(actual.reg().is(rax)); 4088 DCHECK(actual.reg().is(rax));
4093 DCHECK(expected.reg().is(rbx)); 4089 DCHECK(expected.reg().is(rbx));
4094 } else { 4090 } else {
4095 Move(rax, actual.reg()); 4091 Move(rax, actual.reg());
4096 } 4092 }
4097 } 4093 }
4098 4094
4099 if (!definitely_matches) { 4095 if (!definitely_matches) {
4100 Handle<Code> adaptor = isolate()->builtins()->ArgumentsAdaptorTrampoline(); 4096 Handle<Code> adaptor = isolate()->builtins()->ArgumentsAdaptorTrampoline();
4101 if (!code_constant.is_null()) {
4102 Move(rdx, code_constant, RelocInfo::EMBEDDED_OBJECT);
4103 addp(rdx, Immediate(Code::kHeaderSize - kHeapObjectTag));
4104 } else if (!code_register.is(rdx)) {
4105 movp(rdx, code_register);
4106 }
4107
4108 if (flag == CALL_FUNCTION) { 4097 if (flag == CALL_FUNCTION) {
4109 call_wrapper.BeforeCall(CallSize(adaptor)); 4098 call_wrapper.BeforeCall(CallSize(adaptor));
4110 Call(adaptor, RelocInfo::CODE_TARGET); 4099 Call(adaptor, RelocInfo::CODE_TARGET);
4111 call_wrapper.AfterCall(); 4100 call_wrapper.AfterCall();
4112 if (!*definitely_mismatches) { 4101 if (!*definitely_mismatches) {
4113 jmp(done, near_jump); 4102 jmp(done, near_jump);
4114 } 4103 }
4115 } else { 4104 } else {
4116 Jump(adaptor, RelocInfo::CODE_TARGET); 4105 Jump(adaptor, RelocInfo::CODE_TARGET);
4117 } 4106 }
(...skipping 1395 matching lines...) Expand 10 before | Expand all | Expand 10 after
5513 movl(rax, dividend); 5502 movl(rax, dividend);
5514 shrl(rax, Immediate(31)); 5503 shrl(rax, Immediate(31));
5515 addl(rdx, rax); 5504 addl(rdx, rax);
5516 } 5505 }
5517 5506
5518 5507
5519 } // namespace internal 5508 } // namespace internal
5520 } // namespace v8 5509 } // namespace v8
5521 5510
5522 #endif // V8_TARGET_ARCH_X64 5511 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/x64/macro-assembler-x64.h ('k') | src/x87/macro-assembler-x87.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698