| 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
|
|
|