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 "v8.h" | 5 #include "v8.h" |
6 | 6 |
7 #include "lithium-allocator-inl.h" | 7 #include "lithium-allocator-inl.h" |
8 #include "mips/lithium-mips.h" | 8 #include "mips/lithium-mips.h" |
9 #include "mips/lithium-codegen-mips.h" | 9 #include "mips/lithium-codegen-mips.h" |
10 #include "hydrogen-osr.h" | 10 #include "hydrogen-osr.h" |
(...skipping 615 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
626 int vreg = allocator_->GetVirtualRegister(); | 626 int vreg = allocator_->GetVirtualRegister(); |
627 if (!allocator_->AllocationOk()) { | 627 if (!allocator_->AllocationOk()) { |
628 Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); | 628 Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); |
629 vreg = 0; | 629 vreg = 0; |
630 } | 630 } |
631 operand->set_virtual_register(vreg); | 631 operand->set_virtual_register(vreg); |
632 return operand; | 632 return operand; |
633 } | 633 } |
634 | 634 |
635 | 635 |
| 636 LUnallocated* LChunkBuilder::TempDoubleRegister() { |
| 637 LUnallocated* operand = |
| 638 new(zone()) LUnallocated(LUnallocated::MUST_HAVE_DOUBLE_REGISTER); |
| 639 int vreg = allocator_->GetVirtualRegister(); |
| 640 if (!allocator_->AllocationOk()) { |
| 641 Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); |
| 642 vreg = 0; |
| 643 } |
| 644 operand->set_virtual_register(vreg); |
| 645 return operand; |
| 646 } |
| 647 |
| 648 |
636 LOperand* LChunkBuilder::FixedTemp(Register reg) { | 649 LOperand* LChunkBuilder::FixedTemp(Register reg) { |
637 LUnallocated* operand = ToUnallocated(reg); | 650 LUnallocated* operand = ToUnallocated(reg); |
638 ASSERT(operand->HasFixedPolicy()); | 651 ASSERT(operand->HasFixedPolicy()); |
639 return operand; | 652 return operand; |
640 } | 653 } |
641 | 654 |
642 | 655 |
643 LOperand* LChunkBuilder::FixedTemp(DoubleRegister reg) { | 656 LOperand* LChunkBuilder::FixedTemp(DoubleRegister reg) { |
644 LUnallocated* operand = ToUnallocated(reg); | 657 LUnallocated* operand = ToUnallocated(reg); |
645 ASSERT(operand->HasFixedPolicy()); | 658 ASSERT(operand->HasFixedPolicy()); |
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1127 return DefineAsRegister(result); | 1140 return DefineAsRegister(result); |
1128 } | 1141 } |
1129 | 1142 |
1130 | 1143 |
1131 LInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) { | 1144 LInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) { |
1132 ASSERT(instr->representation().IsDouble()); | 1145 ASSERT(instr->representation().IsDouble()); |
1133 ASSERT(instr->value()->representation().IsDouble()); | 1146 ASSERT(instr->value()->representation().IsDouble()); |
1134 LOperand* input = UseRegister(instr->value()); | 1147 LOperand* input = UseRegister(instr->value()); |
1135 LOperand* temp1 = TempRegister(); | 1148 LOperand* temp1 = TempRegister(); |
1136 LOperand* temp2 = TempRegister(); | 1149 LOperand* temp2 = TempRegister(); |
1137 LOperand* double_temp = FixedTemp(f6); // Chosen by fair dice roll. | 1150 LOperand* double_temp = TempDoubleRegister(); |
1138 LMathExp* result = new(zone()) LMathExp(input, double_temp, temp1, temp2); | 1151 LMathExp* result = new(zone()) LMathExp(input, double_temp, temp1, temp2); |
1139 return DefineAsRegister(result); | 1152 return DefineAsRegister(result); |
1140 } | 1153 } |
1141 | 1154 |
1142 | 1155 |
1143 LInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) { | 1156 LInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) { |
1144 // Input cannot be the same as the result, see LCodeGen::DoMathPowHalf. | 1157 // Input cannot be the same as the result, see LCodeGen::DoMathPowHalf. |
1145 LOperand* input = UseFixedDouble(instr->value(), f8); | 1158 LOperand* input = UseFixedDouble(instr->value(), f8); |
1146 LOperand* temp = FixedTemp(f6); | 1159 LOperand* temp = TempDoubleRegister(); |
1147 LMathPowHalf* result = new(zone()) LMathPowHalf(input, temp); | 1160 LMathPowHalf* result = new(zone()) LMathPowHalf(input, temp); |
1148 return DefineFixedDouble(result, f4); | 1161 return DefineFixedDouble(result, f4); |
1149 } | 1162 } |
1150 | 1163 |
1151 | 1164 |
1152 LInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) { | 1165 LInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) { |
1153 Representation r = instr->value()->representation(); | 1166 Representation r = instr->value()->representation(); |
1154 LOperand* context = (r.IsDouble() || r.IsSmiOrInteger32()) | 1167 LOperand* context = (r.IsDouble() || r.IsSmiOrInteger32()) |
1155 ? NULL | 1168 ? NULL |
1156 : UseFixed(instr->context(), cp); | 1169 : UseFixed(instr->context(), cp); |
(...skipping 16 matching lines...) Expand all Loading... |
1173 | 1186 |
1174 LInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) { | 1187 LInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) { |
1175 LOperand* input = UseRegister(instr->value()); | 1188 LOperand* input = UseRegister(instr->value()); |
1176 LMathSqrt* result = new(zone()) LMathSqrt(input); | 1189 LMathSqrt* result = new(zone()) LMathSqrt(input); |
1177 return DefineAsRegister(result); | 1190 return DefineAsRegister(result); |
1178 } | 1191 } |
1179 | 1192 |
1180 | 1193 |
1181 LInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) { | 1194 LInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) { |
1182 LOperand* input = UseRegister(instr->value()); | 1195 LOperand* input = UseRegister(instr->value()); |
1183 LOperand* temp = FixedTemp(f6); | 1196 LOperand* temp = TempDoubleRegister(); |
1184 LMathRound* result = new(zone()) LMathRound(input, temp); | 1197 LMathRound* result = new(zone()) LMathRound(input, temp); |
1185 return AssignEnvironment(DefineAsRegister(result)); | 1198 return AssignEnvironment(DefineAsRegister(result)); |
1186 } | 1199 } |
1187 | 1200 |
1188 | 1201 |
1189 LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { | 1202 LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { |
1190 LOperand* context = UseFixed(instr->context(), cp); | 1203 LOperand* context = UseFixed(instr->context(), cp); |
1191 LOperand* constructor = UseFixed(instr->constructor(), a1); | 1204 LOperand* constructor = UseFixed(instr->constructor(), a1); |
1192 LCallNew* result = new(zone()) LCallNew(context, constructor); | 1205 LCallNew* result = new(zone()) LCallNew(context, constructor); |
1193 return MarkAsCall(DefineFixed(result, v0), instr); | 1206 return MarkAsCall(DefineFixed(result, v0), instr); |
(...skipping 641 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1835 } | 1848 } |
1836 return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value))); | 1849 return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value))); |
1837 } else { | 1850 } else { |
1838 ASSERT(to.IsInteger32()); | 1851 ASSERT(to.IsInteger32()); |
1839 if (val->type().IsSmi() || val->representation().IsSmi()) { | 1852 if (val->type().IsSmi() || val->representation().IsSmi()) { |
1840 LOperand* value = UseRegisterAtStart(val); | 1853 LOperand* value = UseRegisterAtStart(val); |
1841 return DefineAsRegister(new(zone()) LSmiUntag(value, false)); | 1854 return DefineAsRegister(new(zone()) LSmiUntag(value, false)); |
1842 } else { | 1855 } else { |
1843 LOperand* value = UseRegister(val); | 1856 LOperand* value = UseRegister(val); |
1844 LOperand* temp1 = TempRegister(); | 1857 LOperand* temp1 = TempRegister(); |
1845 LOperand* temp2 = FixedTemp(f22); | 1858 LOperand* temp2 = TempDoubleRegister(); |
1846 LInstruction* result = | 1859 LInstruction* result = |
1847 DefineSameAsFirst(new(zone()) LTaggedToI(value, temp1, temp2)); | 1860 DefineSameAsFirst(new(zone()) LTaggedToI(value, temp1, temp2)); |
1848 if (!val->representation().IsSmi()) result = AssignEnvironment(result); | 1861 if (!val->representation().IsSmi()) result = AssignEnvironment(result); |
1849 return result; | 1862 return result; |
1850 } | 1863 } |
1851 } | 1864 } |
1852 } else if (from.IsDouble()) { | 1865 } else if (from.IsDouble()) { |
1853 if (to.IsTagged()) { | 1866 if (to.IsTagged()) { |
1854 info()->MarkAsDeferredCalling(); | 1867 info()->MarkAsDeferredCalling(); |
1855 LOperand* value = UseRegister(val); | 1868 LOperand* value = UseRegister(val); |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1947 return result; | 1960 return result; |
1948 } | 1961 } |
1949 | 1962 |
1950 | 1963 |
1951 LInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { | 1964 LInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { |
1952 HValue* value = instr->value(); | 1965 HValue* value = instr->value(); |
1953 Representation input_rep = value->representation(); | 1966 Representation input_rep = value->representation(); |
1954 LOperand* reg = UseRegister(value); | 1967 LOperand* reg = UseRegister(value); |
1955 if (input_rep.IsDouble()) { | 1968 if (input_rep.IsDouble()) { |
1956 // Revisit this decision, here and 8 lines below. | 1969 // Revisit this decision, here and 8 lines below. |
1957 return DefineAsRegister(new(zone()) LClampDToUint8(reg, FixedTemp(f22))); | 1970 return DefineAsRegister(new(zone()) LClampDToUint8(reg, |
| 1971 TempDoubleRegister())); |
1958 } else if (input_rep.IsInteger32()) { | 1972 } else if (input_rep.IsInteger32()) { |
1959 return DefineAsRegister(new(zone()) LClampIToUint8(reg)); | 1973 return DefineAsRegister(new(zone()) LClampIToUint8(reg)); |
1960 } else { | 1974 } else { |
1961 ASSERT(input_rep.IsSmiOrTagged()); | 1975 ASSERT(input_rep.IsSmiOrTagged()); |
1962 // Register allocator doesn't (yet) support allocation of double | 1976 LClampTToUint8* result = |
1963 // temps. Reserve f22 explicitly. | 1977 new(zone()) LClampTToUint8(reg, TempDoubleRegister()); |
1964 LClampTToUint8* result = new(zone()) LClampTToUint8(reg, FixedTemp(f22)); | |
1965 return AssignEnvironment(DefineAsRegister(result)); | 1978 return AssignEnvironment(DefineAsRegister(result)); |
1966 } | 1979 } |
1967 } | 1980 } |
1968 | 1981 |
1969 | 1982 |
1970 LInstruction* LChunkBuilder::DoDoubleBits(HDoubleBits* instr) { | 1983 LInstruction* LChunkBuilder::DoDoubleBits(HDoubleBits* instr) { |
1971 HValue* value = instr->value(); | 1984 HValue* value = instr->value(); |
1972 ASSERT(value->representation().IsDouble()); | 1985 ASSERT(value->representation().IsDouble()); |
1973 return DefineAsRegister(new(zone()) LDoubleBits(UseRegister(value))); | 1986 return DefineAsRegister(new(zone()) LDoubleBits(UseRegister(value))); |
1974 } | 1987 } |
(...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2527 LInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { | 2540 LInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { |
2528 LOperand* object = UseRegister(instr->object()); | 2541 LOperand* object = UseRegister(instr->object()); |
2529 LOperand* index = UseTempRegister(instr->index()); | 2542 LOperand* index = UseTempRegister(instr->index()); |
2530 LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index); | 2543 LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index); |
2531 LInstruction* result = DefineSameAsFirst(load); | 2544 LInstruction* result = DefineSameAsFirst(load); |
2532 return AssignPointerMap(result); | 2545 return AssignPointerMap(result); |
2533 } | 2546 } |
2534 | 2547 |
2535 | 2548 |
2536 } } // namespace v8::internal | 2549 } } // namespace v8::internal |
OLD | NEW |