OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 void LClassOfTestAndBranch::PrintDataTo(StringStream* stream) { | 260 void LClassOfTestAndBranch::PrintDataTo(StringStream* stream) { |
261 stream->Add("if class_of_test("); | 261 stream->Add("if class_of_test("); |
262 InputAt(0)->PrintTo(stream); | 262 InputAt(0)->PrintTo(stream); |
263 stream->Add(", \"%o\") then B%d else B%d", | 263 stream->Add(", \"%o\") then B%d else B%d", |
264 *hydrogen()->class_name(), | 264 *hydrogen()->class_name(), |
265 true_block_id(), | 265 true_block_id(), |
266 false_block_id()); | 266 false_block_id()); |
267 } | 267 } |
268 | 268 |
269 | 269 |
270 void LTypeofIs::PrintDataTo(StringStream* stream) { | |
271 InputAt(0)->PrintTo(stream); | |
272 stream->Add(" == \"%s\"", *hydrogen()->type_literal()->ToCString()); | |
273 } | |
274 | |
275 | |
276 void LTypeofIsAndBranch::PrintDataTo(StringStream* stream) { | 270 void LTypeofIsAndBranch::PrintDataTo(StringStream* stream) { |
277 stream->Add("if typeof "); | 271 stream->Add("if typeof "); |
278 InputAt(0)->PrintTo(stream); | 272 InputAt(0)->PrintTo(stream); |
279 stream->Add(" == \"%s\" then B%d else B%d", | 273 stream->Add(" == \"%s\" then B%d else B%d", |
280 *hydrogen()->type_literal()->ToCString(), | 274 *hydrogen()->type_literal()->ToCString(), |
281 true_block_id(), false_block_id()); | 275 true_block_id(), false_block_id()); |
282 } | 276 } |
283 | 277 |
284 | 278 |
285 void LCallConstantFunction::PrintDataTo(StringStream* stream) { | 279 void LCallConstantFunction::PrintDataTo(StringStream* stream) { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 } | 331 } |
338 | 332 |
339 | 333 |
340 void LCallNew::PrintDataTo(StringStream* stream) { | 334 void LCallNew::PrintDataTo(StringStream* stream) { |
341 stream->Add("= "); | 335 stream->Add("= "); |
342 InputAt(0)->PrintTo(stream); | 336 InputAt(0)->PrintTo(stream); |
343 stream->Add(" #%d / ", arity()); | 337 stream->Add(" #%d / ", arity()); |
344 } | 338 } |
345 | 339 |
346 | 340 |
347 void LClassOfTest::PrintDataTo(StringStream* stream) { | |
348 stream->Add("= class_of_test("); | |
349 InputAt(0)->PrintTo(stream); | |
350 stream->Add(", \"%o\")", *hydrogen()->class_name()); | |
351 } | |
352 | |
353 | |
354 void LAccessArgumentsAt::PrintDataTo(StringStream* stream) { | 341 void LAccessArgumentsAt::PrintDataTo(StringStream* stream) { |
355 arguments()->PrintTo(stream); | 342 arguments()->PrintTo(stream); |
356 | 343 |
357 stream->Add(" length "); | 344 stream->Add(" length "); |
358 length()->PrintTo(stream); | 345 length()->PrintTo(stream); |
359 | 346 |
360 stream->Add(" index "); | 347 stream->Add(" index "); |
361 index()->PrintTo(stream); | 348 index()->PrintTo(stream); |
362 } | 349 } |
363 | 350 |
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
978 if (current->has_position()) position_ = current->position(); | 965 if (current->has_position()) position_ = current->position(); |
979 LInstruction* instr = current->CompileToLithium(this); | 966 LInstruction* instr = current->CompileToLithium(this); |
980 | 967 |
981 if (instr != NULL) { | 968 if (instr != NULL) { |
982 if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { | 969 if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { |
983 instr = AssignPointerMap(instr); | 970 instr = AssignPointerMap(instr); |
984 } | 971 } |
985 if (FLAG_stress_environments && !instr->HasEnvironment()) { | 972 if (FLAG_stress_environments && !instr->HasEnvironment()) { |
986 instr = AssignEnvironment(instr); | 973 instr = AssignEnvironment(instr); |
987 } | 974 } |
988 if (current->IsTest() && !instr->IsGoto()) { | 975 instr->set_hydrogen_value(current); |
989 ASSERT(instr->IsControl()); | |
990 HTest* test = HTest::cast(current); | |
991 instr->set_hydrogen_value(test->value()); | |
992 HBasicBlock* first = test->FirstSuccessor(); | |
993 HBasicBlock* second = test->SecondSuccessor(); | |
994 ASSERT(first != NULL && second != NULL); | |
995 instr->SetBranchTargets(first->block_id(), second->block_id()); | |
996 } else { | |
997 instr->set_hydrogen_value(current); | |
998 } | |
999 | |
1000 chunk_->AddInstruction(instr, current_block_); | 976 chunk_->AddInstruction(instr, current_block_); |
1001 } | 977 } |
1002 current_instruction_ = old_current; | 978 current_instruction_ = old_current; |
1003 } | 979 } |
1004 | 980 |
1005 | 981 |
1006 LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) { | 982 LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) { |
1007 if (hydrogen_env == NULL) return NULL; | 983 if (hydrogen_env == NULL) return NULL; |
1008 | 984 |
1009 LEnvironment* outer = CreateEnvironment(hydrogen_env->outer()); | 985 LEnvironment* outer = CreateEnvironment(hydrogen_env->outer()); |
(...skipping 24 matching lines...) Expand all Loading... |
1034 | 1010 |
1035 return result; | 1011 return result; |
1036 } | 1012 } |
1037 | 1013 |
1038 | 1014 |
1039 LInstruction* LChunkBuilder::DoGoto(HGoto* instr) { | 1015 LInstruction* LChunkBuilder::DoGoto(HGoto* instr) { |
1040 return new LGoto(instr->FirstSuccessor()->block_id()); | 1016 return new LGoto(instr->FirstSuccessor()->block_id()); |
1041 } | 1017 } |
1042 | 1018 |
1043 | 1019 |
1044 LInstruction* LChunkBuilder::DoTest(HTest* instr) { | 1020 LInstruction* LChunkBuilder::DoBranch(HBranch* instr) { |
1045 HValue* v = instr->value(); | 1021 HValue* v = instr->value(); |
1046 if (!v->EmitAtUses()) return new LBranch(UseRegisterAtStart(v)); | 1022 if (v->EmitAtUses()) { |
1047 ASSERT(!v->HasSideEffects()); | 1023 ASSERT(v->IsConstant()); |
1048 if (v->IsClassOfTest()) { | 1024 ASSERT(!v->representation().IsDouble()); |
1049 HClassOfTest* compare = HClassOfTest::cast(v); | |
1050 ASSERT(compare->value()->representation().IsTagged()); | |
1051 return new LClassOfTestAndBranch(UseTempRegister(compare->value()), | |
1052 TempRegister(), | |
1053 TempRegister()); | |
1054 } else if (v->IsCompare()) { | |
1055 HCompare* compare = HCompare::cast(v); | |
1056 HValue* left = compare->left(); | |
1057 HValue* right = compare->right(); | |
1058 Representation r = compare->GetInputRepresentation(); | |
1059 if (r.IsInteger32()) { | |
1060 ASSERT(left->representation().IsInteger32()); | |
1061 ASSERT(right->representation().IsInteger32()); | |
1062 return new LCmpIDAndBranch(UseRegisterAtStart(left), | |
1063 UseOrConstantAtStart(right)); | |
1064 } else { | |
1065 ASSERT(r.IsDouble()); | |
1066 ASSERT(left->representation().IsDouble()); | |
1067 ASSERT(right->representation().IsDouble()); | |
1068 return new LCmpIDAndBranch(UseRegisterAtStart(left), | |
1069 UseRegisterAtStart(right)); | |
1070 } | |
1071 } else if (v->IsIsSmi()) { | |
1072 HIsSmi* compare = HIsSmi::cast(v); | |
1073 ASSERT(compare->value()->representation().IsTagged()); | |
1074 return new LIsSmiAndBranch(Use(compare->value())); | |
1075 } else if (v->IsIsUndetectable()) { | |
1076 HIsUndetectable* compare = HIsUndetectable::cast(v); | |
1077 ASSERT(compare->value()->representation().IsTagged()); | |
1078 return new LIsUndetectableAndBranch(UseRegisterAtStart(compare->value()), | |
1079 TempRegister()); | |
1080 } else if (v->IsHasInstanceType()) { | |
1081 HHasInstanceType* compare = HHasInstanceType::cast(v); | |
1082 ASSERT(compare->value()->representation().IsTagged()); | |
1083 return new LHasInstanceTypeAndBranch(UseRegisterAtStart(compare->value()), | |
1084 TempRegister()); | |
1085 } else if (v->IsHasCachedArrayIndex()) { | |
1086 HHasCachedArrayIndex* compare = HHasCachedArrayIndex::cast(v); | |
1087 ASSERT(compare->value()->representation().IsTagged()); | |
1088 return new LHasCachedArrayIndexAndBranch( | |
1089 UseRegisterAtStart(compare->value())); | |
1090 } else if (v->IsIsNull()) { | |
1091 HIsNull* compare = HIsNull::cast(v); | |
1092 ASSERT(compare->value()->representation().IsTagged()); | |
1093 // We only need a temp register for non-strict compare. | |
1094 LOperand* temp = compare->is_strict() ? NULL : TempRegister(); | |
1095 return new LIsNullAndBranch(UseRegisterAtStart(compare->value()), temp); | |
1096 } else if (v->IsIsObject()) { | |
1097 HIsObject* compare = HIsObject::cast(v); | |
1098 ASSERT(compare->value()->representation().IsTagged()); | |
1099 LOperand* temp = TempRegister(); | |
1100 return new LIsObjectAndBranch(UseRegister(compare->value()), temp); | |
1101 } else if (v->IsCompareObjectEq()) { | |
1102 HCompareObjectEq* compare = HCompareObjectEq::cast(v); | |
1103 return new LCmpObjectEqAndBranch(UseRegisterAtStart(compare->left()), | |
1104 UseRegisterAtStart(compare->right())); | |
1105 } else if (v->IsCompareConstantEq()) { | |
1106 HCompareConstantEq* compare = HCompareConstantEq::cast(v); | |
1107 return new LCmpConstantEqAndBranch(UseRegisterAtStart(compare->value())); | |
1108 } else if (v->IsTypeofIs()) { | |
1109 HTypeofIs* typeof_is = HTypeofIs::cast(v); | |
1110 return new LTypeofIsAndBranch(UseTempRegister(typeof_is->value())); | |
1111 } else if (v->IsIsConstructCall()) { | |
1112 return new LIsConstructCallAndBranch(TempRegister()); | |
1113 } else if (v->IsConstant()) { | |
1114 HBasicBlock* successor = HConstant::cast(v)->ToBoolean() | 1025 HBasicBlock* successor = HConstant::cast(v)->ToBoolean() |
1115 ? instr->FirstSuccessor() | 1026 ? instr->FirstSuccessor() |
1116 : instr->SecondSuccessor(); | 1027 : instr->SecondSuccessor(); |
1117 return new LGoto(successor->block_id()); | 1028 return new LGoto(successor->block_id()); |
1118 } else { | |
1119 Abort("Undefined compare before branch"); | |
1120 return NULL; | |
1121 } | 1029 } |
| 1030 return new LBranch(UseRegisterAtStart(v)); |
1122 } | 1031 } |
1123 | 1032 |
1124 | 1033 |
1125 LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { | 1034 LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { |
1126 ASSERT(instr->value()->representation().IsTagged()); | 1035 ASSERT(instr->value()->representation().IsTagged()); |
1127 LOperand* value = UseRegisterAtStart(instr->value()); | 1036 LOperand* value = UseRegisterAtStart(instr->value()); |
1128 return new LCmpMapAndBranch(value); | 1037 return new LCmpMapAndBranch(value); |
1129 } | 1038 } |
1130 | 1039 |
1131 | 1040 |
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1482 LOperand* left = UseFixedDouble(instr->left(), xmm1); | 1391 LOperand* left = UseFixedDouble(instr->left(), xmm1); |
1483 LOperand* right = exponent_type.IsDouble() ? | 1392 LOperand* right = exponent_type.IsDouble() ? |
1484 UseFixedDouble(instr->right(), xmm2) : | 1393 UseFixedDouble(instr->right(), xmm2) : |
1485 UseFixed(instr->right(), eax); | 1394 UseFixed(instr->right(), eax); |
1486 LPower* result = new LPower(left, right); | 1395 LPower* result = new LPower(left, right); |
1487 return MarkAsCall(DefineFixedDouble(result, xmm3), instr, | 1396 return MarkAsCall(DefineFixedDouble(result, xmm3), instr, |
1488 CAN_DEOPTIMIZE_EAGERLY); | 1397 CAN_DEOPTIMIZE_EAGERLY); |
1489 } | 1398 } |
1490 | 1399 |
1491 | 1400 |
1492 LInstruction* LChunkBuilder::DoCompare(HCompare* instr) { | 1401 LInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { |
1493 Token::Value op = instr->token(); | 1402 Token::Value op = instr->token(); |
| 1403 ASSERT(instr->left()->representation().IsTagged()); |
| 1404 ASSERT(instr->right()->representation().IsTagged()); |
| 1405 bool reversed = (op == Token::GT || op == Token::LTE); |
| 1406 LOperand* left = UseFixed(instr->left(), reversed ? eax : edx); |
| 1407 LOperand* right = UseFixed(instr->right(), reversed ? edx : eax); |
| 1408 LCmpT* result = new LCmpT(left, right); |
| 1409 return MarkAsCall(DefineFixed(result, eax), instr); |
| 1410 } |
| 1411 |
| 1412 |
| 1413 LInstruction* LChunkBuilder::DoCompareIDAndBranch( |
| 1414 HCompareIDAndBranch* instr) { |
1494 Representation r = instr->GetInputRepresentation(); | 1415 Representation r = instr->GetInputRepresentation(); |
1495 if (r.IsInteger32()) { | 1416 if (r.IsInteger32()) { |
1496 ASSERT(instr->left()->representation().IsInteger32()); | 1417 ASSERT(instr->left()->representation().IsInteger32()); |
1497 ASSERT(instr->right()->representation().IsInteger32()); | 1418 ASSERT(instr->right()->representation().IsInteger32()); |
1498 LOperand* left = UseRegisterAtStart(instr->left()); | 1419 LOperand* left = UseRegisterAtStart(instr->left()); |
1499 LOperand* right = UseOrConstantAtStart(instr->right()); | 1420 LOperand* right = UseOrConstantAtStart(instr->right()); |
1500 return DefineAsRegister(new LCmpID(left, right)); | 1421 return new LCmpIDAndBranch(left, right); |
1501 } else if (r.IsDouble()) { | 1422 } else { |
| 1423 ASSERT(r.IsDouble()); |
1502 ASSERT(instr->left()->representation().IsDouble()); | 1424 ASSERT(instr->left()->representation().IsDouble()); |
1503 ASSERT(instr->right()->representation().IsDouble()); | 1425 ASSERT(instr->right()->representation().IsDouble()); |
1504 LOperand* left = UseRegisterAtStart(instr->left()); | 1426 LOperand* left = UseRegisterAtStart(instr->left()); |
1505 LOperand* right = UseRegisterAtStart(instr->right()); | 1427 LOperand* right = UseRegisterAtStart(instr->right()); |
1506 return DefineAsRegister(new LCmpID(left, right)); | 1428 return new LCmpIDAndBranch(left, right); |
1507 } else { | |
1508 ASSERT(instr->left()->representation().IsTagged()); | |
1509 ASSERT(instr->right()->representation().IsTagged()); | |
1510 bool reversed = (op == Token::GT || op == Token::LTE); | |
1511 LOperand* left = UseFixed(instr->left(), reversed ? eax : edx); | |
1512 LOperand* right = UseFixed(instr->right(), reversed ? edx : eax); | |
1513 LCmpT* result = new LCmpT(left, right); | |
1514 return MarkAsCall(DefineFixed(result, eax), instr); | |
1515 } | 1429 } |
1516 } | 1430 } |
1517 | 1431 |
1518 | 1432 |
1519 LInstruction* LChunkBuilder::DoCompareObjectEq(HCompareObjectEq* instr) { | 1433 LInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( |
| 1434 HCompareObjectEqAndBranch* instr) { |
1520 LOperand* left = UseRegisterAtStart(instr->left()); | 1435 LOperand* left = UseRegisterAtStart(instr->left()); |
1521 LOperand* right = UseRegisterAtStart(instr->right()); | 1436 LOperand* right = UseRegisterAtStart(instr->right()); |
1522 LCmpObjectEq* result = new LCmpObjectEq(left, right); | 1437 return new LCmpObjectEqAndBranch(left, right); |
1523 return DefineAsRegister(result); | |
1524 } | 1438 } |
1525 | 1439 |
1526 | 1440 |
1527 LInstruction* LChunkBuilder::DoCompareConstantEq( | 1441 LInstruction* LChunkBuilder::DoCompareConstantEqAndBranch( |
1528 HCompareConstantEq* instr) { | 1442 HCompareConstantEqAndBranch* instr) { |
1529 LOperand* left = UseRegisterAtStart(instr->value()); | 1443 return new LCmpConstantEqAndBranch(UseRegisterAtStart(instr->value())); |
1530 return DefineAsRegister(new LCmpConstantEq(left)); | |
1531 } | 1444 } |
1532 | 1445 |
1533 | 1446 |
1534 LInstruction* LChunkBuilder::DoIsNull(HIsNull* instr) { | 1447 LInstruction* LChunkBuilder::DoIsNullAndBranch(HIsNullAndBranch* instr) { |
1535 ASSERT(instr->value()->representation().IsTagged()); | 1448 // We only need a temp register for non-strict compare. |
1536 LOperand* value = UseRegisterAtStart(instr->value()); | 1449 LOperand* temp = instr->is_strict() ? NULL : TempRegister(); |
1537 | 1450 return new LIsNullAndBranch(UseRegisterAtStart(instr->value()), temp); |
1538 return DefineAsRegister(new LIsNull(value)); | |
1539 } | 1451 } |
1540 | 1452 |
1541 | 1453 |
1542 LInstruction* LChunkBuilder::DoIsObject(HIsObject* instr) { | 1454 LInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) { |
1543 ASSERT(instr->value()->representation().IsTagged()); | 1455 ASSERT(instr->value()->representation().IsTagged()); |
1544 LOperand* value = UseRegister(instr->value()); | 1456 LOperand* temp = TempRegister(); |
1545 | 1457 return new LIsObjectAndBranch(UseRegister(instr->value()), temp); |
1546 return DefineAsRegister(new LIsObject(value)); | |
1547 } | 1458 } |
1548 | 1459 |
1549 | 1460 |
1550 LInstruction* LChunkBuilder::DoIsSmi(HIsSmi* instr) { | 1461 LInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) { |
1551 ASSERT(instr->value()->representation().IsTagged()); | 1462 ASSERT(instr->value()->representation().IsTagged()); |
1552 LOperand* value = UseAtStart(instr->value()); | 1463 return new LIsSmiAndBranch(Use(instr->value())); |
1553 | |
1554 return DefineAsRegister(new LIsSmi(value)); | |
1555 } | 1464 } |
1556 | 1465 |
1557 | 1466 |
1558 LInstruction* LChunkBuilder::DoIsUndetectable(HIsUndetectable* instr) { | 1467 LInstruction* LChunkBuilder::DoIsUndetectableAndBranch( |
1559 ASSERT(instr->value()->representation().IsTagged()); | 1468 HIsUndetectableAndBranch* instr) { |
1560 LOperand* value = UseRegisterAtStart(instr->value()); | 1469 ASSERT(instr ->value()->representation().IsTagged()); |
1561 | 1470 return new LIsUndetectableAndBranch(UseRegisterAtStart(instr->value()), |
1562 return DefineAsRegister(new LIsUndetectable(value)); | 1471 TempRegister()); |
1563 } | 1472 } |
1564 | 1473 |
1565 | 1474 |
1566 LInstruction* LChunkBuilder::DoHasInstanceType(HHasInstanceType* instr) { | 1475 LInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch( |
| 1476 HHasInstanceTypeAndBranch* instr) { |
1567 ASSERT(instr->value()->representation().IsTagged()); | 1477 ASSERT(instr->value()->representation().IsTagged()); |
1568 LOperand* value = UseRegisterAtStart(instr->value()); | 1478 return new LHasInstanceTypeAndBranch(UseRegisterAtStart(instr->value()), |
1569 | 1479 TempRegister()); |
1570 return DefineAsRegister(new LHasInstanceType(value)); | |
1571 } | 1480 } |
1572 | 1481 |
1573 | 1482 |
1574 LInstruction* LChunkBuilder::DoGetCachedArrayIndex( | 1483 LInstruction* LChunkBuilder::DoGetCachedArrayIndex( |
1575 HGetCachedArrayIndex* instr) { | 1484 HGetCachedArrayIndex* instr) { |
1576 ASSERT(instr->value()->representation().IsTagged()); | 1485 ASSERT(instr->value()->representation().IsTagged()); |
1577 LOperand* value = UseRegisterAtStart(instr->value()); | 1486 LOperand* value = UseRegisterAtStart(instr->value()); |
1578 | 1487 |
1579 return DefineAsRegister(new LGetCachedArrayIndex(value)); | 1488 return DefineAsRegister(new LGetCachedArrayIndex(value)); |
1580 } | 1489 } |
1581 | 1490 |
1582 | 1491 |
1583 LInstruction* LChunkBuilder::DoHasCachedArrayIndex( | 1492 LInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch( |
1584 HHasCachedArrayIndex* instr) { | 1493 HHasCachedArrayIndexAndBranch* instr) { |
1585 ASSERT(instr->value()->representation().IsTagged()); | 1494 ASSERT(instr->value()->representation().IsTagged()); |
1586 LOperand* value = UseRegister(instr->value()); | 1495 return new LHasCachedArrayIndexAndBranch( |
1587 | 1496 UseRegisterAtStart(instr->value())); |
1588 return DefineAsRegister(new LHasCachedArrayIndex(value)); | |
1589 } | 1497 } |
1590 | 1498 |
1591 | 1499 |
1592 LInstruction* LChunkBuilder::DoClassOfTest(HClassOfTest* instr) { | 1500 LInstruction* LChunkBuilder::DoClassOfTestAndBranch( |
| 1501 HClassOfTestAndBranch* instr) { |
1593 ASSERT(instr->value()->representation().IsTagged()); | 1502 ASSERT(instr->value()->representation().IsTagged()); |
1594 LOperand* value = UseTempRegister(instr->value()); | 1503 return new LClassOfTestAndBranch(UseTempRegister(instr->value()), |
1595 | 1504 TempRegister(), |
1596 return DefineSameAsFirst(new LClassOfTest(value, TempRegister())); | 1505 TempRegister()); |
1597 } | 1506 } |
1598 | 1507 |
1599 | 1508 |
1600 LInstruction* LChunkBuilder::DoJSArrayLength(HJSArrayLength* instr) { | 1509 LInstruction* LChunkBuilder::DoJSArrayLength(HJSArrayLength* instr) { |
1601 LOperand* array = UseRegisterAtStart(instr->value()); | 1510 LOperand* array = UseRegisterAtStart(instr->value()); |
1602 return DefineAsRegister(new LJSArrayLength(array)); | 1511 return DefineAsRegister(new LJSArrayLength(array)); |
1603 } | 1512 } |
1604 | 1513 |
1605 | 1514 |
1606 LInstruction* LChunkBuilder::DoFixedArrayLength(HFixedArrayLength* instr) { | 1515 LInstruction* LChunkBuilder::DoFixedArrayLength(HFixedArrayLength* instr) { |
(...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2200 return MarkAsCall(DefineFixed(result, eax), instr); | 2109 return MarkAsCall(DefineFixed(result, eax), instr); |
2201 } | 2110 } |
2202 | 2111 |
2203 | 2112 |
2204 LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { | 2113 LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { |
2205 LTypeof* result = new LTypeof(UseAtStart(instr->value())); | 2114 LTypeof* result = new LTypeof(UseAtStart(instr->value())); |
2206 return MarkAsCall(DefineFixed(result, eax), instr); | 2115 return MarkAsCall(DefineFixed(result, eax), instr); |
2207 } | 2116 } |
2208 | 2117 |
2209 | 2118 |
2210 LInstruction* LChunkBuilder::DoTypeofIs(HTypeofIs* instr) { | 2119 LInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { |
2211 return DefineSameAsFirst(new LTypeofIs(UseRegister(instr->value()))); | 2120 return new LTypeofIsAndBranch(UseTempRegister(instr->value())); |
2212 } | 2121 } |
2213 | 2122 |
2214 | 2123 |
2215 LInstruction* LChunkBuilder::DoIsConstructCall(HIsConstructCall* instr) { | 2124 LInstruction* LChunkBuilder::DoIsConstructCallAndBranch( |
2216 return DefineAsRegister(new LIsConstructCall); | 2125 HIsConstructCallAndBranch* instr) { |
| 2126 return new LIsConstructCallAndBranch(TempRegister()); |
2217 } | 2127 } |
2218 | 2128 |
2219 | 2129 |
2220 LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { | 2130 LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { |
2221 HEnvironment* env = current_block_->last_environment(); | 2131 HEnvironment* env = current_block_->last_environment(); |
2222 ASSERT(env != NULL); | 2132 ASSERT(env != NULL); |
2223 | 2133 |
2224 env->set_ast_id(instr->ast_id()); | 2134 env->set_ast_id(instr->ast_id()); |
2225 | 2135 |
2226 env->Drop(instr->pop_count()); | 2136 env->Drop(instr->pop_count()); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2283 LOperand* key = UseOrConstantAtStart(instr->key()); | 2193 LOperand* key = UseOrConstantAtStart(instr->key()); |
2284 LOperand* object = UseOrConstantAtStart(instr->object()); | 2194 LOperand* object = UseOrConstantAtStart(instr->object()); |
2285 LIn* result = new LIn(key, object); | 2195 LIn* result = new LIn(key, object); |
2286 return MarkAsCall(DefineFixed(result, eax), instr); | 2196 return MarkAsCall(DefineFixed(result, eax), instr); |
2287 } | 2197 } |
2288 | 2198 |
2289 | 2199 |
2290 } } // namespace v8::internal | 2200 } } // namespace v8::internal |
2291 | 2201 |
2292 #endif // V8_TARGET_ARCH_IA32 | 2202 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |