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