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

Unified Diff: src/compiler/linkage-impl.h

Issue 426233002: Land the Fan (disabled) (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Review feedback, rebase and "git cl format" Created 6 years, 5 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/compiler/linkage.cc ('k') | src/compiler/lowering-builder.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/linkage-impl.h
diff --git a/src/compiler/linkage-impl.h b/src/compiler/linkage-impl.h
new file mode 100644
index 0000000000000000000000000000000000000000..7159bde59b0d64efdaf4d91b11c83376a81c4838
--- /dev/null
+++ b/src/compiler/linkage-impl.h
@@ -0,0 +1,206 @@
+// Copyright 2014 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_COMPILER_LINKAGE_IMPL_H_
+#define V8_COMPILER_LINKAGE_IMPL_H_
+
+namespace v8 {
+namespace internal {
+namespace compiler {
+
+class LinkageHelper {
+ public:
+ static LinkageLocation TaggedStackSlot(int index) {
+ ASSERT(index < 0);
+ return LinkageLocation(kMachineTagged, index);
+ }
+
+ static LinkageLocation TaggedRegisterLocation(Register reg) {
+ return LinkageLocation(kMachineTagged, Register::ToAllocationIndex(reg));
+ }
+
+ static inline LinkageLocation WordRegisterLocation(Register reg) {
+ return LinkageLocation(MachineOperatorBuilder::pointer_rep(),
+ Register::ToAllocationIndex(reg));
+ }
+
+ static LinkageLocation UnconstrainedRegister(MachineRepresentation rep) {
+ return LinkageLocation(rep, LinkageLocation::ANY_REGISTER);
+ }
+
+ static const RegList kNoCalleeSaved = 0;
+
+ // TODO(turbofan): cache call descriptors for JSFunction calls.
+ template <typename LinkageTraits>
+ static CallDescriptor* GetJSCallDescriptor(Zone* zone, int parameter_count) {
+ const int jsfunction_count = 1;
+ const int context_count = 1;
+ int input_count = jsfunction_count + parameter_count + context_count;
+
+ const int return_count = 1;
+ LinkageLocation* locations =
+ zone->NewArray<LinkageLocation>(return_count + input_count);
+
+ int index = 0;
+ locations[index++] =
+ TaggedRegisterLocation(LinkageTraits::ReturnValueReg());
+ locations[index++] =
+ TaggedRegisterLocation(LinkageTraits::JSCallFunctionReg());
+
+ for (int i = 0; i < parameter_count; i++) {
+ // All parameters to JS calls go on the stack.
+ int spill_slot_index = i - parameter_count;
+ locations[index++] = TaggedStackSlot(spill_slot_index);
+ }
+ locations[index++] = TaggedRegisterLocation(LinkageTraits::ContextReg());
+
+ // TODO(titzer): refactor TurboFan graph to consider context a value input.
+ return new (zone)
+ CallDescriptor(CallDescriptor::kCallJSFunction, // kind
+ return_count, // return_count
+ parameter_count, // parameter_count
+ input_count - context_count, // input_count
+ locations, // locations
+ Operator::kNoProperties, // properties
+ kNoCalleeSaved, // callee-saved registers
+ CallDescriptor::kCanDeoptimize); // deoptimization
+ }
+
+
+ // TODO(turbofan): cache call descriptors for runtime calls.
+ template <typename LinkageTraits>
+ static CallDescriptor* GetRuntimeCallDescriptor(
+ Zone* zone, Runtime::FunctionId function_id, int parameter_count,
+ Operator::Property properties,
+ CallDescriptor::DeoptimizationSupport can_deoptimize) {
+ const int code_count = 1;
+ const int function_count = 1;
+ const int num_args_count = 1;
+ const int context_count = 1;
+ const int input_count = code_count + parameter_count + function_count +
+ num_args_count + context_count;
+
+ const Runtime::Function* function = Runtime::FunctionForId(function_id);
+ const int return_count = function->result_size;
+ LinkageLocation* locations =
+ zone->NewArray<LinkageLocation>(return_count + input_count);
+
+ int index = 0;
+ if (return_count > 0) {
+ locations[index++] =
+ TaggedRegisterLocation(LinkageTraits::ReturnValueReg());
+ }
+ if (return_count > 1) {
+ locations[index++] =
+ TaggedRegisterLocation(LinkageTraits::ReturnValue2Reg());
+ }
+
+ ASSERT_LE(return_count, 2);
+
+ locations[index++] = UnconstrainedRegister(kMachineTagged); // CEntryStub
+
+ for (int i = 0; i < parameter_count; i++) {
+ // All parameters to runtime calls go on the stack.
+ int spill_slot_index = i - parameter_count;
+ locations[index++] = TaggedStackSlot(spill_slot_index);
+ }
+ locations[index++] =
+ TaggedRegisterLocation(LinkageTraits::RuntimeCallFunctionReg());
+ locations[index++] =
+ WordRegisterLocation(LinkageTraits::RuntimeCallArgCountReg());
+ locations[index++] = TaggedRegisterLocation(LinkageTraits::ContextReg());
+
+ // TODO(titzer): refactor TurboFan graph to consider context a value input.
+ return new (zone) CallDescriptor(CallDescriptor::kCallCodeObject, // kind
+ return_count, // return_count
+ parameter_count, // parameter_count
+ input_count, // input_count
+ locations, // locations
+ properties, // properties
+ kNoCalleeSaved, // callee-saved registers
+ can_deoptimize, // deoptimization
+ function->name);
+ }
+
+
+ // TODO(turbofan): cache call descriptors for code stub calls.
+ template <typename LinkageTraits>
+ static CallDescriptor* GetStubCallDescriptor(
+ Zone* zone, CodeStubInterfaceDescriptor* descriptor,
+ int stack_parameter_count) {
+ int register_parameter_count = descriptor->GetEnvironmentParameterCount();
+ int parameter_count = register_parameter_count + stack_parameter_count;
+ const int code_count = 1;
+ const int context_count = 1;
+ int input_count = code_count + parameter_count + context_count;
+
+ const int return_count = 1;
+ LinkageLocation* locations =
+ zone->NewArray<LinkageLocation>(return_count + input_count);
+
+ int index = 0;
+ locations[index++] =
+ TaggedRegisterLocation(LinkageTraits::ReturnValueReg());
+ locations[index++] = UnconstrainedRegister(kMachineTagged); // code
+ for (int i = 0; i < parameter_count; i++) {
+ if (i < register_parameter_count) {
+ // The first parameters to code stub calls go in registers.
+ Register reg = descriptor->GetEnvironmentParameterRegister(i);
+ locations[index++] = TaggedRegisterLocation(reg);
+ } else {
+ // The rest of the parameters go on the stack.
+ int stack_slot = i - register_parameter_count - stack_parameter_count;
+ locations[index++] = TaggedStackSlot(stack_slot);
+ }
+ }
+ locations[index++] = TaggedRegisterLocation(LinkageTraits::ContextReg());
+
+ // TODO(titzer): refactor TurboFan graph to consider context a value input.
+ return new (zone)
+ CallDescriptor(CallDescriptor::kCallCodeObject, // kind
+ return_count, // return_count
+ parameter_count, // parameter_count
+ input_count, // input_count
+ locations, // locations
+ Operator::kNoProperties, // properties
+ kNoCalleeSaved, // callee-saved registers
+ CallDescriptor::kCannotDeoptimize, // deoptimization
+ CodeStub::MajorName(descriptor->MajorKey(), false));
+ // TODO(jarin) should deoptimize!
+ }
+
+
+ template <typename LinkageTraits>
+ static CallDescriptor* GetSimplifiedCDescriptor(
+ Zone* zone, int num_params, MachineRepresentation return_type,
+ const MachineRepresentation* param_types) {
+ LinkageLocation* locations =
+ zone->NewArray<LinkageLocation>(num_params + 2);
+ int index = 0;
+ locations[index++] =
+ TaggedRegisterLocation(LinkageTraits::ReturnValueReg());
+ locations[index++] = LinkageHelper::UnconstrainedRegister(
+ MachineOperatorBuilder::pointer_rep());
+ // TODO(dcarney): test with lots of parameters.
+ int i = 0;
+ for (; i < LinkageTraits::CRegisterParametersLength() && i < num_params;
+ i++) {
+ locations[index++] = LinkageLocation(
+ param_types[i],
+ Register::ToAllocationIndex(LinkageTraits::CRegisterParameter(i)));
+ }
+ for (; i < num_params; i++) {
+ locations[index++] = LinkageLocation(param_types[i], -1 - i);
+ }
+ return new (zone) CallDescriptor(
+ CallDescriptor::kCallAddress, 1, num_params, num_params + 1, locations,
+ Operator::kNoProperties, LinkageTraits::CCalleeSaveRegisters(),
+ CallDescriptor::kCannotDeoptimize); // TODO(jarin) should deoptimize!
+ }
+};
+}
+}
+} // namespace v8::internal::compiler
+
+#endif // V8_COMPILER_LINKAGE_IMPL_H_
« no previous file with comments | « src/compiler/linkage.cc ('k') | src/compiler/lowering-builder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698