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

Unified Diff: src/compiler/wasm-linkage.cc

Issue 2124023003: [turbofan] Add MachineType to LinkageLocation (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase Created 4 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/simplified-lowering.cc ('k') | src/compiler/x64/instruction-selector-x64.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/wasm-linkage.cc
diff --git a/src/compiler/wasm-linkage.cc b/src/compiler/wasm-linkage.cc
index cfeb6c523f03d5f721d3b260858c82cc6cadc7ed..ee2ae10fcded8fbc309861c230228e2c7f768bfc 100644
--- a/src/compiler/wasm-linkage.cc
+++ b/src/compiler/wasm-linkage.cc
@@ -22,6 +22,7 @@ using compiler::CallDescriptor;
using compiler::LinkageLocation;
namespace {
+
MachineType MachineTypeFor(LocalType type) {
switch (type) {
case kAstI32:
@@ -40,20 +41,16 @@ MachineType MachineTypeFor(LocalType type) {
}
}
-
-// Platform-specific configuration for C calling convention.
-LinkageLocation regloc(Register reg) {
- return LinkageLocation::ForRegister(reg.code());
+LinkageLocation regloc(Register reg, MachineType type) {
+ return LinkageLocation::ForRegister(reg.code(), type);
}
-
-LinkageLocation regloc(DoubleRegister reg) {
- return LinkageLocation::ForRegister(reg.code());
+LinkageLocation regloc(DoubleRegister reg, MachineType type) {
+ return LinkageLocation::ForRegister(reg.code(), type);
}
-
-LinkageLocation stackloc(int i) {
- return LinkageLocation::ForCallerFrameSlot(i);
+LinkageLocation stackloc(int i, MachineType type) {
+ return LinkageLocation::ForCallerFrameSlot(i, type);
}
@@ -187,23 +184,24 @@ struct Allocator {
if (type == kAstF32) {
int float_reg_code = reg.code() * 2;
DCHECK(float_reg_code < RegisterConfiguration::kMaxFPRegisters);
- return regloc(DoubleRegister::from_code(float_reg_code));
+ return regloc(DoubleRegister::from_code(float_reg_code),
+ MachineTypeFor(type));
}
#endif
- return regloc(reg);
+ return regloc(reg, MachineTypeFor(type));
} else {
int offset = -1 - stack_offset;
stack_offset += Words(type);
- return stackloc(offset);
+ return stackloc(offset, MachineTypeFor(type));
}
} else {
// Allocate a general purpose register/stack location.
if (gp_offset < gp_count) {
- return regloc(gp_regs[gp_offset++]);
+ return regloc(gp_regs[gp_offset++], MachineTypeFor(type));
} else {
int offset = -1 - stack_offset;
stack_offset += Words(type);
- return stackloc(offset);
+ return stackloc(offset, MachineTypeFor(type));
}
}
}
@@ -272,8 +270,6 @@ static Allocator GetParameterRegisters() {
// General code uses the above configuration data.
CallDescriptor* ModuleEnv::GetWasmCallDescriptor(Zone* zone,
FunctionSig* fsig) {
- MachineSignature::Builder msig(zone, fsig->return_count(),
- fsig->parameter_count());
LocationSignature::Builder locations(zone, fsig->return_count(),
fsig->parameter_count());
@@ -283,7 +279,6 @@ CallDescriptor* ModuleEnv::GetWasmCallDescriptor(Zone* zone,
const int return_count = static_cast<int>(locations.return_count_);
for (int i = 0; i < return_count; i++) {
LocalType ret = fsig->GetReturn(i);
- msig.AddReturn(MachineTypeFor(ret));
locations.AddReturn(rets.Next(ret));
}
@@ -293,7 +288,6 @@ CallDescriptor* ModuleEnv::GetWasmCallDescriptor(Zone* zone,
const int parameter_count = static_cast<int>(fsig->parameter_count());
for (int i = 0; i < parameter_count; i++) {
LocalType param = fsig->GetParam(i);
- msig.AddParam(MachineTypeFor(param));
locations.AddParam(params.Next(param));
}
@@ -302,13 +296,12 @@ CallDescriptor* ModuleEnv::GetWasmCallDescriptor(Zone* zone,
// The target for WASM calls is always a code object.
MachineType target_type = MachineType::AnyTagged();
- LinkageLocation target_loc = LinkageLocation::ForAnyRegister();
+ LinkageLocation target_loc = LinkageLocation::ForAnyRegister(target_type);
return new (zone) CallDescriptor( // --
CallDescriptor::kCallCodeObject, // kind
target_type, // target MachineType
target_loc, // target location
- msig.Build(), // machine_sig
locations.Build(), // location_sig
params.stack_offset, // stack_parameter_count
compiler::Operator::kNoProperties, // properties
@@ -320,58 +313,52 @@ CallDescriptor* ModuleEnv::GetWasmCallDescriptor(Zone* zone,
CallDescriptor* ModuleEnv::GetI32WasmCallDescriptor(
Zone* zone, CallDescriptor* descriptor) {
- const MachineSignature* signature = descriptor->GetMachineSignature();
- size_t parameter_count = signature->parameter_count();
- size_t return_count = signature->return_count();
- for (size_t i = 0; i < signature->parameter_count(); i++) {
- if (signature->GetParam(i) == MachineType::Int64()) {
+ size_t parameter_count = descriptor->ParameterCount();
+ size_t return_count = descriptor->ReturnCount();
+ for (size_t i = 0; i < descriptor->ParameterCount(); i++) {
+ if (descriptor->GetParameterType(i) == MachineType::Int64()) {
// For each int64 input we get two int32 inputs.
parameter_count++;
}
}
- for (size_t i = 0; i < signature->return_count(); i++) {
- if (signature->GetReturn(i) == MachineType::Int64()) {
+ for (size_t i = 0; i < descriptor->ReturnCount(); i++) {
+ if (descriptor->GetReturnType(i) == MachineType::Int64()) {
// For each int64 return we get two int32 returns.
return_count++;
}
}
- if (parameter_count == signature->parameter_count() &&
- return_count == signature->return_count()) {
+ if (parameter_count == descriptor->ParameterCount() &&
+ return_count == descriptor->ReturnCount()) {
// If there is no int64 parameter or return value, we can just return the
// original descriptor.
return descriptor;
}
- MachineSignature::Builder msig(zone, return_count, parameter_count);
LocationSignature::Builder locations(zone, return_count, parameter_count);
Allocator rets = GetReturnRegisters();
- for (size_t i = 0; i < signature->return_count(); i++) {
- if (signature->GetReturn(i) == MachineType::Int64()) {
+ for (size_t i = 0; i < descriptor->ReturnCount(); i++) {
+ if (descriptor->GetReturnType(i) == MachineType::Int64()) {
// For each int64 return we get two int32 returns.
- msig.AddReturn(MachineType::Int32());
- msig.AddReturn(MachineType::Int32());
locations.AddReturn(rets.Next(MachineRepresentation::kWord32));
locations.AddReturn(rets.Next(MachineRepresentation::kWord32));
} else {
- msig.AddReturn(signature->GetReturn(i));
- locations.AddReturn(rets.Next(signature->GetReturn(i).representation()));
+ locations.AddReturn(
+ rets.Next(descriptor->GetReturnType(i).representation()));
}
}
Allocator params = GetParameterRegisters();
- for (size_t i = 0; i < signature->parameter_count(); i++) {
- if (signature->GetParam(i) == MachineType::Int64()) {
+ for (size_t i = 0; i < descriptor->ParameterCount(); i++) {
+ if (descriptor->GetParameterType(i) == MachineType::Int64()) {
// For each int64 input we get two int32 inputs.
- msig.AddParam(MachineType::Int32());
- msig.AddParam(MachineType::Int32());
locations.AddParam(params.Next(MachineRepresentation::kWord32));
locations.AddParam(params.Next(MachineRepresentation::kWord32));
} else {
- msig.AddParam(signature->GetParam(i));
- locations.AddParam(params.Next(signature->GetParam(i).representation()));
+ locations.AddParam(
+ params.Next(descriptor->GetParameterType(i).representation()));
}
}
@@ -379,7 +366,6 @@ CallDescriptor* ModuleEnv::GetI32WasmCallDescriptor(
descriptor->kind(), // kind
descriptor->GetInputType(0), // target MachineType
descriptor->GetInputLocation(0), // target location
- msig.Build(), // machine_sig
locations.Build(), // location_sig
params.stack_offset, // stack_parameter_count
descriptor->properties(), // properties
« no previous file with comments | « src/compiler/simplified-lowering.cc ('k') | src/compiler/x64/instruction-selector-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698