OLD | NEW |
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 #include "src/crankshaft/x87/lithium-x87.h" | 5 #include "src/crankshaft/x87/lithium-x87.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #if V8_TARGET_ARCH_X87 | 9 #if V8_TARGET_ARCH_X87 |
10 | 10 |
(...skipping 1035 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1046 | 1046 |
1047 LInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { | 1047 LInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { |
1048 LOperand* context = UseFixed(instr->context(), esi); | 1048 LOperand* context = UseFixed(instr->context(), esi); |
1049 return MarkAsCall(new(zone()) LDeclareGlobals(context), instr); | 1049 return MarkAsCall(new(zone()) LDeclareGlobals(context), instr); |
1050 } | 1050 } |
1051 | 1051 |
1052 | 1052 |
1053 LInstruction* LChunkBuilder::DoCallWithDescriptor( | 1053 LInstruction* LChunkBuilder::DoCallWithDescriptor( |
1054 HCallWithDescriptor* instr) { | 1054 HCallWithDescriptor* instr) { |
1055 CallInterfaceDescriptor descriptor = instr->descriptor(); | 1055 CallInterfaceDescriptor descriptor = instr->descriptor(); |
| 1056 DCHECK_EQ(descriptor.GetParameterCount() + |
| 1057 LCallWithDescriptor::kImplicitRegisterParameterCount, |
| 1058 instr->OperandCount()); |
| 1059 |
1056 LOperand* target = UseRegisterOrConstantAtStart(instr->target()); | 1060 LOperand* target = UseRegisterOrConstantAtStart(instr->target()); |
1057 ZoneList<LOperand*> ops(instr->OperandCount(), zone()); | 1061 ZoneList<LOperand*> ops(instr->OperandCount(), zone()); |
1058 // Target | 1062 // Target |
1059 ops.Add(target, zone()); | 1063 ops.Add(target, zone()); |
1060 // Context | 1064 // Context |
1061 LOperand* op = UseFixed(instr->OperandAt(1), esi); | 1065 LOperand* op = UseFixed(instr->OperandAt(1), esi); |
1062 ops.Add(op, zone()); | 1066 ops.Add(op, zone()); |
1063 // Other register parameters | 1067 // Load register parameters. |
1064 for (int i = LCallWithDescriptor::kImplicitRegisterParameterCount; | 1068 int i = 0; |
1065 i < instr->OperandCount(); i++) { | 1069 for (; i < descriptor.GetRegisterParameterCount(); i++) { |
1066 op = | 1070 op = UseFixed(instr->OperandAt( |
1067 UseFixed(instr->OperandAt(i), | 1071 i + LCallWithDescriptor::kImplicitRegisterParameterCount), |
1068 descriptor.GetRegisterParameter( | 1072 descriptor.GetRegisterParameter(i)); |
1069 i - LCallWithDescriptor::kImplicitRegisterParameterCount)); | |
1070 ops.Add(op, zone()); | 1073 ops.Add(op, zone()); |
1071 } | 1074 } |
| 1075 // Push stack parameters. |
| 1076 for (; i < descriptor.GetParameterCount(); i++) { |
| 1077 op = UseAny(instr->OperandAt( |
| 1078 i + LCallWithDescriptor::kImplicitRegisterParameterCount)); |
| 1079 AddInstruction(new (zone()) LPushArgument(op), instr); |
| 1080 } |
1072 | 1081 |
1073 LCallWithDescriptor* result = new(zone()) LCallWithDescriptor( | 1082 LCallWithDescriptor* result = new(zone()) LCallWithDescriptor( |
1074 descriptor, ops, zone()); | 1083 descriptor, ops, zone()); |
1075 if (instr->syntactic_tail_call_mode() == TailCallMode::kAllow) { | 1084 if (instr->syntactic_tail_call_mode() == TailCallMode::kAllow) { |
1076 result->MarkAsSyntacticTailCall(); | 1085 result->MarkAsSyntacticTailCall(); |
1077 } | 1086 } |
1078 return MarkAsCall(DefineFixed(result, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY); | 1087 return MarkAsCall(DefineFixed(result, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY); |
1079 } | 1088 } |
1080 | 1089 |
1081 | 1090 |
(...skipping 1431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2513 LOperand* index = UseTempRegister(instr->index()); | 2522 LOperand* index = UseTempRegister(instr->index()); |
2514 LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index); | 2523 LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index); |
2515 LInstruction* result = DefineSameAsFirst(load); | 2524 LInstruction* result = DefineSameAsFirst(load); |
2516 return AssignPointerMap(result); | 2525 return AssignPointerMap(result); |
2517 } | 2526 } |
2518 | 2527 |
2519 } // namespace internal | 2528 } // namespace internal |
2520 } // namespace v8 | 2529 } // namespace v8 |
2521 | 2530 |
2522 #endif // V8_TARGET_ARCH_X87 | 2531 #endif // V8_TARGET_ARCH_X87 |
OLD | NEW |