37 #define DEFINE_COMPILE(type) \
38 void L##type::CompileToNative(LCodeGen* generator) { \
39 generator->Do##type(this); \
46 register_spills_[i] =
NULL;
49 double_register_spills_[i] =
NULL;
56 ASSERT(spill_operand->IsStackSlot());
57 ASSERT(register_spills_[allocation_index] ==
NULL);
58 register_spills_[allocation_index] = spill_operand;
63 void LInstruction::VerifyCall() {
71 for (UseIterator it(
this); !it.Done(); it.Advance()) {
76 for (TempIterator it(
this); !it.Done(); it.Advance()) {
78 ASSERT(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy());
86 ASSERT(spill_operand->IsDoubleStackSlot());
87 ASSERT(double_register_spills_[allocation_index] ==
NULL);
88 double_register_spills_[allocation_index] = spill_operand;
114 if (i > 0) stream->
Add(
" ");
129 stream->
Add(
" Dead block replaced with B%d", rep->
block_id());
135 for (
int i = 0; i < 4; i++) {
136 if (parallel_moves_[i] !=
NULL && !parallel_moves_[i]->
IsRedundant()) {
146 for (
int i = 0; i < 4; i++) {
148 if (parallel_moves_[i] !=
NULL) {
162 case Token::MOD:
return "mod-d";
175 case Token::MOD:
return "mod-t";
177 case Token::BIT_AND:
return "bit-and-t";
178 case Token::BIT_OR:
return "bit-or-t";
179 case Token::BIT_XOR:
return "bit-xor-t";
180 case Token::SHL:
return "shl-t";
181 case Token::SAR:
return "sar-t";
182 case Token::SHR:
return "shr-t";
220 stream->
Add(
"if is_object(");
227 stream->
Add(
"if is_string(");
234 stream->
Add(
"if is_smi(");
241 stream->
Add(
"if is_undetectable(");
248 stream->
Add(
"if string_compare(");
256 stream->
Add(
"if has_instance_type(");
263 stream->Add(
"if has_cached_array_index(");
270 stream->Add(
"if class_of_test(");
272 stream->Add(
", \"%o\") then B%d else B%d",
273 *hydrogen()->class_name(),
280 stream->
Add(
"if typeof ");
282 stream->
Add(
" == \"%s\" then B%d else B%d",
294 stream->
Add(
"/%s ", hydrogen()->OpName());
320 stream->
Add(
"[r2] #%d / ",
arity());
326 stream->
Add(
"%s #%d / ", *name_string,
arity());
332 stream->
Add(
"%s #%d / ", *name_string,
arity());
351 stream->
Add(
" length ");
354 stream->
Add(
" index ");
381 stream->
Add(
"] <- ");
390 stream->Add(
"] <- ");
399 stream->
Add(
"] <- ");
411 : spill_slot_count_(0),
414 instructions_(32, graph->zone()),
415 pointer_maps_(8, graph->zone()),
416 inlined_closures_(1, graph->zone()) {
422 if (is_double) spill_slot_count_++;
423 return spill_slot_count_++;
438 HPhase phase(
"L_Mark empty blocks",
this);
439 for (
int i = 0; i <
graph()->
blocks()->length(); ++i) {
447 if (last_instr->IsGoto()) {
448 LGoto* goto_instr = LGoto::cast(last_instr);
451 bool can_eliminate =
true;
452 for (
int i = first + 1; i < last && can_eliminate; ++i) {
457 can_eliminate =
false;
460 can_eliminate =
false;
477 instructions_.Add(gap,
zone());
478 index = instructions_.length();
479 instructions_.Add(instr,
zone());
481 index = instructions_.length();
482 instructions_.Add(instr,
zone());
483 instructions_.Add(gap,
zone());
502 int result = index -
info()->scope()->num_parameters() - 1;
510 return (1 +
info()->scope()->num_parameters() - index) *
521 return instructions_[index]->IsGap();
526 while (!
IsGapAt(index)) index--;
548 LChunk* LChunkBuilder::Build() {
550 chunk_ =
new(zone())
LChunk(info(), graph());
551 HPhase phase(
"L_Building chunk", chunk_);
554 for (
int i = 0; i < blocks->length(); i++) {
556 if (i < blocks->length() - 1) next = blocks->
at(i + 1);
557 DoBasicBlock(blocks->
at(i), next);
558 if (is_aborted())
return NULL;
565 void LChunkBuilder::Abort(
const char* format, ...) {
566 if (FLAG_trace_bailout) {
567 SmartArrayPointer<char>
name(
568 info()->shared_info()->DebugName()->
ToCString());
569 PrintF(
"Aborting LChunk building in @\"%s\": ", *
name);
571 va_start(arguments, format);
580 LUnallocated* LChunkBuilder::ToUnallocated(Register reg) {
592 LOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) {
593 return Use(value, ToUnallocated(fixed_register));
597 LOperand* LChunkBuilder::UseFixedDouble(HValue* value,
DoubleRegister reg) {
598 return Use(value, ToUnallocated(reg));
602 LOperand* LChunkBuilder::UseRegister(HValue* value) {
607 LOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) {
614 LOperand* LChunkBuilder::UseTempRegister(HValue* value) {
619 LOperand* LChunkBuilder::Use(HValue* value) {
624 LOperand* LChunkBuilder::UseAtStart(HValue* value) {
630 LOperand* LChunkBuilder::UseOrConstant(HValue* value) {
631 return value->IsConstant()
637 LOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) {
638 return value->IsConstant()
644 LOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) {
645 return value->IsConstant()
647 : UseRegister(value);
651 LOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) {
652 return value->IsConstant()
654 : UseRegisterAtStart(value);
658 LOperand* LChunkBuilder::UseAny(HValue* value) {
659 return value->IsConstant()
665 LOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) {
666 if (value->EmitAtUses()) {
668 VisitInstruction(instr);
670 operand->set_virtual_register(value->id());
675 template<
int I,
int T>
676 LInstruction* LChunkBuilder::Define(LTemplateInstruction<1, I, T>* instr,
677 LUnallocated* result) {
678 result->set_virtual_register(current_instruction_->id());
679 instr->set_result(result);
684 template<
int I,
int T>
685 LInstruction* LChunkBuilder::DefineAsRegister(
686 LTemplateInstruction<1, I, T>* instr) {
692 template<
int I,
int T>
693 LInstruction* LChunkBuilder::DefineAsSpilled(
694 LTemplateInstruction<1, I, T>* instr,
int index) {
700 template<
int I,
int T>
701 LInstruction* LChunkBuilder::DefineSameAsFirst(
702 LTemplateInstruction<1, I, T>* instr) {
708 template<
int I,
int T>
709 LInstruction* LChunkBuilder::DefineFixed(
710 LTemplateInstruction<1, I, T>* instr, Register reg) {
711 return Define(instr, ToUnallocated(reg));
715 template<
int I,
int T>
716 LInstruction* LChunkBuilder::DefineFixedDouble(
718 return Define(instr, ToUnallocated(reg));
722 LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) {
723 HEnvironment* hydrogen_env = current_block_->last_environment();
724 int argument_index_accumulator = 0;
725 instr->set_environment(CreateEnvironment(hydrogen_env,
726 &argument_index_accumulator));
731 LInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr,
732 HInstruction* hinstr,
733 CanDeoptimize can_deoptimize) {
738 instr = AssignPointerMap(instr);
740 if (hinstr->HasObservableSideEffects()) {
741 ASSERT(hinstr->next()->IsSimulate());
743 ASSERT(instruction_pending_deoptimization_environment_ ==
NULL);
745 instruction_pending_deoptimization_environment_ = instr;
746 pending_deoptimization_ast_id_ = sim->ast_id();
753 bool needs_environment =
754 (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) ||
755 !hinstr->HasObservableSideEffects();
756 if (needs_environment && !instr->HasEnvironment()) {
757 instr = AssignEnvironment(instr);
764 LInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) {
765 ASSERT(!instr->HasPointerMap());
766 instr->set_pointer_map(
new(zone()) LPointerMap(position_, zone()));
771 LUnallocated* LChunkBuilder::TempRegister() {
772 LUnallocated* operand =
774 operand->set_virtual_register(allocator_->GetVirtualRegister());
775 if (!allocator_->AllocationOk()) Abort(
"Not enough virtual registers.");
780 LOperand* LChunkBuilder::FixedTemp(Register reg) {
781 LUnallocated* operand = ToUnallocated(reg);
782 ASSERT(operand->HasFixedPolicy());
788 LUnallocated* operand = ToUnallocated(reg);
789 ASSERT(operand->HasFixedPolicy());
794 LInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) {
795 return new(zone()) LLabel(instr->block());
799 LInstruction* LChunkBuilder::DoSoftDeoptimize(HSoftDeoptimize* instr) {
800 return AssignEnvironment(
new(zone()) LDeoptimize);
804 LInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) {
805 return AssignEnvironment(
new(zone()) LDeoptimize);
810 HBitwiseBinaryOperation* instr) {
811 if (instr->representation().IsTagged()) {
812 ASSERT(instr->left()->representation().IsTagged());
813 ASSERT(instr->right()->representation().IsTagged());
815 LOperand* left = UseFixed(instr->left(),
r1);
816 LOperand* right = UseFixed(instr->right(),
r0);
817 LArithmeticT* result =
new(zone()) LArithmeticT(op, left, right);
818 return MarkAsCall(DefineFixed(result,
r0), instr);
821 ASSERT(instr->representation().IsInteger32());
822 ASSERT(instr->left()->representation().IsInteger32());
823 ASSERT(instr->right()->representation().IsInteger32());
824 LOperand* left = UseRegisterAtStart(instr->left());
826 HValue* right_value = instr->right();
827 LOperand* right =
NULL;
828 int constant_value = 0;
829 if (right_value->IsConstant()) {
831 right = chunk_->DefineConstantOperand(constant);
832 constant_value = constant->Integer32Value() & 0x1f;
834 right = UseRegisterAtStart(right_value);
839 bool may_deopt = (op == Token::SHR && constant_value == 0);
840 bool does_deopt =
false;
842 for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) {
850 LInstruction* result =
851 DefineAsRegister(
new(zone()) LShiftI(op, left, right, does_deopt));
852 return does_deopt ? AssignEnvironment(result) : result;
856 LInstruction* LChunkBuilder::DoArithmeticD(
Token::Value op,
857 HArithmeticBinaryOperation* instr) {
858 ASSERT(instr->representation().IsDouble());
859 ASSERT(instr->left()->representation().IsDouble());
860 ASSERT(instr->right()->representation().IsDouble());
862 LOperand* left = UseRegisterAtStart(instr->left());
863 LOperand* right = UseRegisterAtStart(instr->right());
864 LArithmeticD* result =
new(zone()) LArithmeticD(op, left, right);
865 return DefineAsRegister(result);
869 LInstruction* LChunkBuilder::DoArithmeticT(
Token::Value op,
870 HArithmeticBinaryOperation* instr) {
876 HValue* left = instr->left();
877 HValue* right = instr->right();
878 ASSERT(left->representation().IsTagged());
879 ASSERT(right->representation().IsTagged());
880 LOperand* left_operand = UseFixed(left,
r1);
881 LOperand* right_operand = UseFixed(right,
r0);
882 LArithmeticT* result =
883 new(zone()) LArithmeticT(op, left_operand, right_operand);
884 return MarkAsCall(DefineFixed(result,
r0), instr);
888 void LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) {
890 current_block_ = block;
891 next_block_ = next_block;
892 if (block->IsStartBlock()) {
893 block->UpdateEnvironment(graph_->start_environment());
895 }
else if (block->predecessors()->length() == 1) {
898 ASSERT(block->phis()->length() == 0);
899 HBasicBlock* pred = block->predecessors()->at(0);
900 HEnvironment* last_environment = pred->last_environment();
903 if (pred->end()->SecondSuccessor() ==
NULL) {
904 ASSERT(pred->end()->FirstSuccessor() == block);
906 if (pred->end()->FirstSuccessor()->block_id() > block->block_id() ||
907 pred->end()->SecondSuccessor()->block_id() > block->block_id()) {
908 last_environment = last_environment->Copy();
911 block->UpdateEnvironment(last_environment);
912 ASSERT(pred->argument_count() >= 0);
913 argument_count_ = pred->argument_count();
916 HBasicBlock* pred = block->predecessors()->at(0);
918 HEnvironment* last_environment = pred->last_environment();
919 for (
int i = 0; i < block->phis()->length(); ++i) {
920 HPhi* phi = block->phis()->at(i);
921 last_environment->SetValueAt(phi->merged_index(), phi);
923 for (
int i = 0; i < block->deleted_phis()->length(); ++i) {
924 last_environment->SetValueAt(block->deleted_phis()->at(i),
925 graph_->GetConstantUndefined());
927 block->UpdateEnvironment(last_environment);
929 argument_count_ = pred->argument_count();
931 HInstruction* current = block->first();
932 int start = chunk_->instructions()->length();
933 while (current !=
NULL && !is_aborted()) {
935 if (!current->EmitAtUses()) {
936 VisitInstruction(current);
938 current = current->next();
940 int end = chunk_->instructions()->length() - 1;
942 block->set_first_instruction_index(start);
943 block->set_last_instruction_index(end);
945 block->set_argument_count(argument_count_);
947 current_block_ =
NULL;
951 void LChunkBuilder::VisitInstruction(HInstruction* current) {
952 HInstruction* old_current = current_instruction_;
953 current_instruction_ = current;
954 if (current->has_position()) position_ = current->position();
955 LInstruction* instr = current->CompileToLithium(
this);
958 if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) {
959 instr = AssignPointerMap(instr);
961 if (FLAG_stress_environments && !instr->HasEnvironment()) {
962 instr = AssignEnvironment(instr);
964 instr->set_hydrogen_value(current);
965 chunk_->AddInstruction(instr, current_block_);
967 current_instruction_ = old_current;
971 LEnvironment* LChunkBuilder::CreateEnvironment(
972 HEnvironment* hydrogen_env,
973 int* argument_index_accumulator) {
974 if (hydrogen_env ==
NULL)
return NULL;
976 LEnvironment* outer =
977 CreateEnvironment(hydrogen_env->outer(), argument_index_accumulator);
978 int ast_id = hydrogen_env->ast_id();
981 int value_count = hydrogen_env->length();
982 LEnvironment* result =
new(zone()) LEnvironment(
983 hydrogen_env->closure(),
984 hydrogen_env->frame_type(),
986 hydrogen_env->parameter_count(),
991 int argument_index = *argument_index_accumulator;
992 for (
int i = 0; i < value_count; ++i) {
993 if (hydrogen_env->is_special_index(i))
continue;
995 HValue* value = hydrogen_env->values()->at(i);
997 if (value->IsArgumentsObject()) {
999 }
else if (value->IsPushArgument()) {
1000 op =
new(zone()) LArgument(argument_index++);
1004 result->AddValue(op, value->representation());
1008 *argument_index_accumulator = argument_index;
1015 LInstruction* LChunkBuilder::DoGoto(HGoto* instr) {
1016 return new(zone()) LGoto(instr->FirstSuccessor()->block_id());
1020 LInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
1021 HValue* value = instr->value();
1022 if (value->EmitAtUses()) {
1024 ? instr->FirstSuccessor()
1025 : instr->SecondSuccessor();
1026 return new(zone()) LGoto(successor->block_id());
1029 LBranch* result =
new(zone()) LBranch(UseRegister(value));
1033 HType
type = value->type();
1034 if (rep.IsTagged() && !type.IsSmi() && !type.IsBoolean()) {
1035 return AssignEnvironment(result);
1042 LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) {
1043 ASSERT(instr->value()->representation().IsTagged());
1044 LOperand* value = UseRegisterAtStart(instr->value());
1045 LOperand* temp = TempRegister();
1046 return new(zone()) LCmpMapAndBranch(value, temp);
1050 LInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* instr) {
1051 LOperand* value = UseRegister(instr->value());
1052 return DefineAsRegister(
new(zone()) LArgumentsLength(value));
1056 LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) {
1057 return DefineAsRegister(
new(zone()) LArgumentsElements);
1061 LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) {
1062 LInstanceOf* result =
1063 new(zone()) LInstanceOf(UseFixed(instr->left(),
r0),
1064 UseFixed(instr->right(),
r1));
1065 return MarkAsCall(DefineFixed(result,
r0), instr);
1069 LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
1070 HInstanceOfKnownGlobal* instr) {
1071 LInstanceOfKnownGlobal* result =
1072 new(zone()) LInstanceOfKnownGlobal(UseFixed(instr->left(),
r0),
1074 return MarkAsCall(DefineFixed(result,
r0), instr);
1078 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) {
1079 LOperand* receiver = UseRegisterAtStart(instr->receiver());
1080 LOperand*
function = UseRegisterAtStart(instr->function());
1081 LWrapReceiver* result =
new(zone()) LWrapReceiver(receiver,
function);
1082 return AssignEnvironment(DefineSameAsFirst(result));
1086 LInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) {
1087 LOperand*
function = UseFixed(instr->function(),
r1);
1088 LOperand* receiver = UseFixed(instr->receiver(),
r0);
1089 LOperand* length = UseFixed(instr->length(),
r2);
1090 LOperand* elements = UseFixed(instr->elements(),
r3);
1091 LApplyArguments* result =
new(zone()) LApplyArguments(
function,
1095 return MarkAsCall(DefineFixed(result,
r0), instr, CAN_DEOPTIMIZE_EAGERLY);
1099 LInstruction* LChunkBuilder::DoPushArgument(HPushArgument* instr) {
1101 LOperand* argument = Use(instr->argument());
1102 return new(zone()) LPushArgument(argument);
1106 LInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) {
1107 return instr->HasNoUses()
1109 : DefineAsRegister(
new(zone()) LThisFunction);
1113 LInstruction* LChunkBuilder::DoContext(HContext* instr) {
1114 return instr->HasNoUses() ?
NULL : DefineAsRegister(
new(zone()) LContext);
1118 LInstruction* LChunkBuilder::DoOuterContext(HOuterContext* instr) {
1119 LOperand* context = UseRegisterAtStart(instr->value());
1120 return DefineAsRegister(
new(zone()) LOuterContext(context));
1124 LInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) {
1125 return MarkAsCall(
new(zone()) LDeclareGlobals, instr);
1129 LInstruction* LChunkBuilder::DoGlobalObject(HGlobalObject* instr) {
1130 LOperand* context = UseRegisterAtStart(instr->value());
1131 return DefineAsRegister(
new(zone()) LGlobalObject(context));
1135 LInstruction* LChunkBuilder::DoGlobalReceiver(HGlobalReceiver* instr) {
1136 LOperand* global_object = UseRegisterAtStart(instr->value());
1137 return DefineAsRegister(
new(zone()) LGlobalReceiver(global_object));
1141 LInstruction* LChunkBuilder::DoCallConstantFunction(
1142 HCallConstantFunction* instr) {
1143 argument_count_ -= instr->argument_count();
1144 return MarkAsCall(DefineFixed(
new(zone()) LCallConstantFunction,
r0), instr);
1148 LInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) {
1149 LOperand*
function = UseFixed(instr->function(),
r1);
1150 argument_count_ -= instr->argument_count();
1151 LInvokeFunction* result =
new(zone()) LInvokeFunction(
function);
1152 return MarkAsCall(DefineFixed(result,
r0), instr, CANNOT_DEOPTIMIZE_EAGERLY);
1156 LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) {
1158 if (op == kMathLog || op == kMathSin || op == kMathCos || op == kMathTan) {
1159 LOperand* input = UseFixedDouble(instr->value(),
d2);
1160 LUnaryMathOperation* result =
new(zone()) LUnaryMathOperation(input,
NULL);
1161 return MarkAsCall(DefineFixedDouble(result,
d2), instr);
1163 LOperand* input = UseFixedDouble(instr->value(),
d2);
1164 LOperand* temp = FixedTemp(
d3);
1165 LUnaryMathOperation* result =
new(zone()) LUnaryMathOperation(input, temp);
1166 return DefineFixedDouble(result,
d2);
1168 LOperand* input = UseRegisterAtStart(instr->value());
1169 LOperand* temp = (op == kMathFloor) ? TempRegister() :
NULL;
1170 LUnaryMathOperation* result =
new(zone()) LUnaryMathOperation(input, temp);
1173 return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
1175 return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
1177 return DefineAsRegister(result);
1179 return AssignEnvironment(DefineAsRegister(result));
1188 LInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) {
1189 ASSERT(instr->key()->representation().IsTagged());
1190 argument_count_ -= instr->argument_count();
1191 LOperand* key = UseFixed(instr->key(),
r2);
1192 return MarkAsCall(DefineFixed(
new(zone()) LCallKeyed(key),
r0), instr);
1196 LInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) {
1197 argument_count_ -= instr->argument_count();
1198 return MarkAsCall(DefineFixed(
new(zone()) LCallNamed,
r0), instr);
1202 LInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) {
1203 argument_count_ -= instr->argument_count();
1204 return MarkAsCall(DefineFixed(
new(zone()) LCallGlobal,
r0), instr);
1208 LInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) {
1209 argument_count_ -= instr->argument_count();
1210 return MarkAsCall(DefineFixed(
new(zone()) LCallKnownGlobal,
r0), instr);
1214 LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) {
1215 LOperand* constructor = UseFixed(instr->constructor(),
r1);
1216 argument_count_ -= instr->argument_count();
1217 LCallNew* result =
new(zone()) LCallNew(constructor);
1218 return MarkAsCall(DefineFixed(result,
r0), instr);
1222 LInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) {
1223 LOperand*
function = UseFixed(instr->function(),
r1);
1224 argument_count_ -= instr->argument_count();
1225 return MarkAsCall(DefineFixed(
new(zone()) LCallFunction(
function),
r0),
1230 LInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) {
1231 argument_count_ -= instr->argument_count();
1232 return MarkAsCall(DefineFixed(
new(zone()) LCallRuntime,
r0), instr);
1236 LInstruction* LChunkBuilder::DoShr(HShr* instr) {
1237 return DoShift(Token::SHR, instr);
1241 LInstruction* LChunkBuilder::DoSar(HSar* instr) {
1242 return DoShift(Token::SAR, instr);
1246 LInstruction* LChunkBuilder::DoShl(HShl* instr) {
1247 return DoShift(Token::SHL, instr);
1251 LInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) {
1252 if (instr->representation().IsInteger32()) {
1253 ASSERT(instr->left()->representation().IsInteger32());
1254 ASSERT(instr->right()->representation().IsInteger32());
1256 LOperand* left = UseRegisterAtStart(instr->LeastConstantOperand());
1257 LOperand* right = UseOrConstantAtStart(instr->MostConstantOperand());
1258 return DefineAsRegister(
new(zone()) LBitI(left, right));
1260 ASSERT(instr->representation().IsTagged());
1261 ASSERT(instr->left()->representation().IsTagged());
1262 ASSERT(instr->right()->representation().IsTagged());
1264 LOperand* left = UseFixed(instr->left(),
r1);
1265 LOperand* right = UseFixed(instr->right(),
r0);
1266 LArithmeticT* result =
new(zone()) LArithmeticT(instr->op(), left, right);
1267 return MarkAsCall(DefineFixed(result,
r0), instr);
1272 LInstruction* LChunkBuilder::DoBitNot(HBitNot* instr) {
1273 ASSERT(instr->value()->representation().IsInteger32());
1274 ASSERT(instr->representation().IsInteger32());
1275 if (instr->HasNoUses())
return NULL;
1276 LOperand* value = UseRegisterAtStart(instr->value());
1277 return DefineAsRegister(
new(zone()) LBitNotI(value));
1281 LInstruction* LChunkBuilder::DoDiv(HDiv* instr) {
1282 if (instr->representation().IsDouble()) {
1284 }
else if (instr->representation().IsInteger32()) {
1290 LOperand* dividend = UseFixed(instr->left(),
r0);
1291 LOperand* divisor = UseFixed(instr->right(),
r1);
1292 return AssignEnvironment(AssignPointerMap(
1293 DefineFixed(
new(zone()) LDivI(dividend, divisor),
r0)));
1300 bool LChunkBuilder::HasMagicNumberForDivisor(
int32_t divisor) {
1301 uint32_t divisor_abs = abs(divisor);
1318 CompilerIntrinsics::CountTrailingZeros(divisor_abs);
1319 DivMagicNumbers magic_numbers =
1327 HValue* LChunkBuilder::SimplifiedDividendForMathFloorOfDiv(HValue* dividend) {
1329 if (dividend->representation().IsInteger32()) {
1332 }
else if (dividend->IsChange() &&
1340 HValue* LChunkBuilder::SimplifiedDivisorForMathFloorOfDiv(HValue* divisor) {
1344 if (divisor->IsConstant() &&
1347 int32_t int32_val = constant_val->Integer32Value();
1348 if (LChunkBuilder::HasMagicNumberForDivisor(int32_val)) {
1350 divisor->block()->zone());
1357 LInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) {
1358 HValue* right = instr->right();
1359 LOperand* dividend = UseRegister(instr->left());
1360 LOperand* divisor = UseRegisterOrConstant(right);
1361 LOperand* remainder = TempRegister();
1362 ASSERT(right->IsConstant() &&
1365 return AssignEnvironment(DefineAsRegister(
1366 new(zone()) LMathFloorOfDiv(dividend, divisor, remainder)));
1370 LInstruction* LChunkBuilder::DoMod(HMod* instr) {
1371 if (instr->representation().IsInteger32()) {
1372 ASSERT(instr->left()->representation().IsInteger32());
1373 ASSERT(instr->right()->representation().IsInteger32());
1376 if (instr->HasPowerOf2Divisor()) {
1378 LOperand* value = UseRegisterAtStart(instr->left());
1379 mod =
new(zone()) LModI(value, UseOrConstant(instr->right()));
1381 LOperand* dividend = UseRegister(instr->left());
1382 LOperand* divisor = UseRegister(instr->right());
1383 mod =
new(zone()) LModI(dividend,
1392 return AssignEnvironment(DefineAsRegister(mod));
1394 return DefineAsRegister(mod);
1396 }
else if (instr->representation().IsTagged()) {
1397 return DoArithmeticT(Token::MOD, instr);
1399 ASSERT(instr->representation().IsDouble());
1403 LOperand* left = UseFixedDouble(instr->left(),
d1);
1404 LOperand* right = UseFixedDouble(instr->right(),
d2);
1405 LArithmeticD* result =
new(zone()) LArithmeticD(Token::MOD, left, right);
1406 return MarkAsCall(DefineFixedDouble(result,
d1), instr);
1411 LInstruction* LChunkBuilder::DoMul(HMul* instr) {
1412 if (instr->representation().IsInteger32()) {
1413 ASSERT(instr->left()->representation().IsInteger32());
1414 ASSERT(instr->right()->representation().IsInteger32());
1416 LOperand* right = UseOrConstant(instr->MostConstantOperand());
1417 LOperand* temp =
NULL;
1420 !right->IsConstantOperand())) {
1421 left = UseRegister(instr->LeastConstantOperand());
1422 temp = TempRegister();
1424 left = UseRegisterAtStart(instr->LeastConstantOperand());
1426 LMulI* mul =
new(zone()) LMulI(left, right, temp);
1429 AssignEnvironment(mul);
1431 return DefineAsRegister(mul);
1433 }
else if (instr->representation().IsDouble()) {
1442 LInstruction* LChunkBuilder::DoSub(HSub* instr) {
1443 if (instr->representation().IsInteger32()) {
1444 ASSERT(instr->left()->representation().IsInteger32());
1445 ASSERT(instr->right()->representation().IsInteger32());
1446 LOperand* left = UseRegisterAtStart(instr->left());
1447 LOperand* right = UseOrConstantAtStart(instr->right());
1448 LSubI* sub =
new(zone()) LSubI(left, right);
1449 LInstruction* result = DefineAsRegister(sub);
1451 result = AssignEnvironment(result);
1454 }
else if (instr->representation().IsDouble()) {
1462 LInstruction* LChunkBuilder::DoAdd(HAdd* instr) {
1463 if (instr->representation().IsInteger32()) {
1464 ASSERT(instr->left()->representation().IsInteger32());
1465 ASSERT(instr->right()->representation().IsInteger32());
1466 LOperand* left = UseRegisterAtStart(instr->LeastConstantOperand());
1467 LOperand* right = UseOrConstantAtStart(instr->MostConstantOperand());
1468 LAddI* add =
new(zone()) LAddI(left, right);
1469 LInstruction* result = DefineAsRegister(add);
1471 result = AssignEnvironment(result);
1474 }
else if (instr->representation().IsDouble()) {
1477 ASSERT(instr->representation().IsTagged());
1483 LInstruction* LChunkBuilder::DoPower(HPower* instr) {
1484 ASSERT(instr->representation().IsDouble());
1487 Representation exponent_type = instr->right()->representation();
1488 ASSERT(instr->left()->representation().IsDouble());
1489 LOperand* left = UseFixedDouble(instr->left(),
d1);
1490 LOperand* right = exponent_type.IsDouble() ?
1491 UseFixedDouble(instr->right(),
d2) :
1492 UseFixed(instr->right(),
r2);
1493 LPower* result =
new(zone()) LPower(left, right);
1494 return MarkAsCall(DefineFixedDouble(result,
d3),
1496 CAN_DEOPTIMIZE_EAGERLY);
1500 LInstruction* LChunkBuilder::DoRandom(HRandom* instr) {
1501 ASSERT(instr->representation().IsDouble());
1502 ASSERT(instr->global_object()->representation().IsTagged());
1503 LOperand* global_object = UseFixed(instr->global_object(),
r0);
1504 LRandom* result =
new(zone()) LRandom(global_object);
1505 return MarkAsCall(DefineFixedDouble(result,
d7), instr);
1509 LInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) {
1510 ASSERT(instr->left()->representation().IsTagged());
1511 ASSERT(instr->right()->representation().IsTagged());
1512 LOperand* left = UseFixed(instr->left(),
r1);
1513 LOperand* right = UseFixed(instr->right(),
r0);
1514 LCmpT* result =
new(zone()) LCmpT(left, right);
1515 return MarkAsCall(DefineFixed(result,
r0), instr);
1519 LInstruction* LChunkBuilder::DoCompareIDAndBranch(
1520 HCompareIDAndBranch* instr) {
1521 Representation r = instr->GetInputRepresentation();
1522 if (r.IsInteger32()) {
1523 ASSERT(instr->left()->representation().IsInteger32());
1524 ASSERT(instr->right()->representation().IsInteger32());
1525 LOperand* left = UseRegisterOrConstantAtStart(instr->left());
1526 LOperand* right = UseRegisterOrConstantAtStart(instr->right());
1527 return new(zone()) LCmpIDAndBranch(left, right);
1530 ASSERT(instr->left()->representation().IsDouble());
1531 ASSERT(instr->right()->representation().IsDouble());
1532 LOperand* left = UseRegisterAtStart(instr->left());
1533 LOperand* right = UseRegisterAtStart(instr->right());
1534 return new(zone()) LCmpIDAndBranch(left, right);
1539 LInstruction* LChunkBuilder::DoCompareObjectEqAndBranch(
1540 HCompareObjectEqAndBranch* instr) {
1541 LOperand* left = UseRegisterAtStart(instr->left());
1542 LOperand* right = UseRegisterAtStart(instr->right());
1543 return new(zone()) LCmpObjectEqAndBranch(left, right);
1547 LInstruction* LChunkBuilder::DoCompareConstantEqAndBranch(
1548 HCompareConstantEqAndBranch* instr) {
1549 LOperand* value = UseRegisterAtStart(instr->value());
1550 return new(zone()) LCmpConstantEqAndBranch(value);
1554 LInstruction* LChunkBuilder::DoIsNilAndBranch(HIsNilAndBranch* instr) {
1555 ASSERT(instr->value()->representation().IsTagged());
1556 return new(zone()) LIsNilAndBranch(UseRegisterAtStart(instr->value()));
1560 LInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) {
1561 ASSERT(instr->value()->representation().IsTagged());
1562 LOperand* value = UseRegisterAtStart(instr->value());
1563 LOperand* temp = TempRegister();
1564 return new(zone()) LIsObjectAndBranch(value, temp);
1568 LInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) {
1569 ASSERT(instr->value()->representation().IsTagged());
1570 LOperand* value = UseRegisterAtStart(instr->value());
1571 LOperand* temp = TempRegister();
1572 return new(zone()) LIsStringAndBranch(value, temp);
1576 LInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) {
1577 ASSERT(instr->value()->representation().IsTagged());
1578 return new(zone()) LIsSmiAndBranch(Use(instr->value()));
1582 LInstruction* LChunkBuilder::DoIsUndetectableAndBranch(
1583 HIsUndetectableAndBranch* instr) {
1584 ASSERT(instr->value()->representation().IsTagged());
1585 LOperand* value = UseRegisterAtStart(instr->value());
1586 return new(zone()) LIsUndetectableAndBranch(value, TempRegister());
1590 LInstruction* LChunkBuilder::DoStringCompareAndBranch(
1591 HStringCompareAndBranch* instr) {
1592 ASSERT(instr->left()->representation().IsTagged());
1593 ASSERT(instr->right()->representation().IsTagged());
1594 LOperand* left = UseFixed(instr->left(),
r1);
1595 LOperand* right = UseFixed(instr->right(),
r0);
1596 LStringCompareAndBranch* result =
1597 new(zone()) LStringCompareAndBranch(left, right);
1598 return MarkAsCall(result, instr);
1602 LInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch(
1603 HHasInstanceTypeAndBranch* instr) {
1604 ASSERT(instr->value()->representation().IsTagged());
1605 LOperand* value = UseRegisterAtStart(instr->value());
1606 return new(zone()) LHasInstanceTypeAndBranch(value);
1610 LInstruction* LChunkBuilder::DoGetCachedArrayIndex(
1611 HGetCachedArrayIndex* instr) {
1612 ASSERT(instr->value()->representation().IsTagged());
1613 LOperand* value = UseRegisterAtStart(instr->value());
1615 return DefineAsRegister(
new(zone()) LGetCachedArrayIndex(value));
1619 LInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch(
1620 HHasCachedArrayIndexAndBranch* instr) {
1621 ASSERT(instr->value()->representation().IsTagged());
1622 return new(zone()) LHasCachedArrayIndexAndBranch(
1623 UseRegisterAtStart(instr->value()));
1627 LInstruction* LChunkBuilder::DoClassOfTestAndBranch(
1628 HClassOfTestAndBranch* instr) {
1629 ASSERT(instr->value()->representation().IsTagged());
1630 LOperand* value = UseRegister(instr->value());
1631 return new(zone()) LClassOfTestAndBranch(value, TempRegister());
1635 LInstruction* LChunkBuilder::DoJSArrayLength(HJSArrayLength* instr) {
1636 LOperand* array = UseRegisterAtStart(instr->value());
1637 return DefineAsRegister(
new(zone()) LJSArrayLength(array));
1641 LInstruction* LChunkBuilder::DoFixedArrayBaseLength(
1642 HFixedArrayBaseLength* instr) {
1643 LOperand* array = UseRegisterAtStart(instr->value());
1644 return DefineAsRegister(
new(zone()) LFixedArrayBaseLength(array));
1648 LInstruction* LChunkBuilder::DoElementsKind(HElementsKind* instr) {
1649 LOperand*
object = UseRegisterAtStart(instr->value());
1650 return DefineAsRegister(
new(zone()) LElementsKind(
object));
1654 LInstruction* LChunkBuilder::DoValueOf(HValueOf* instr) {
1655 LOperand*
object = UseRegister(instr->value());
1656 LValueOf* result =
new(zone()) LValueOf(
object, TempRegister());
1657 return DefineAsRegister(result);
1661 LInstruction* LChunkBuilder::DoDateField(HDateField* instr) {
1662 LOperand*
object = UseFixed(instr->value(),
r0);
1663 LDateField* result =
1664 new(zone()) LDateField(
object, FixedTemp(
r1), instr->index());
1665 return MarkAsCall(DefineFixed(result,
r0), instr);
1669 LInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) {
1670 LOperand* value = UseRegisterAtStart(instr->index());
1671 LOperand* length = UseRegister(instr->length());
1672 return AssignEnvironment(
new(zone()) LBoundsCheck(value, length));
1676 LInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) {
1683 LInstruction* LChunkBuilder::DoThrow(HThrow* instr) {
1684 LOperand* value = UseFixed(instr->value(),
r0);
1685 return MarkAsCall(
new(zone()) LThrow(value), instr);
1689 LInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) {
1694 LInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) {
1702 LInstruction* LChunkBuilder::DoChange(HChange* instr) {
1703 Representation from = instr->from();
1704 Representation to = instr->to();
1705 if (from.IsTagged()) {
1706 if (to.IsDouble()) {
1707 LOperand* value = UseRegister(instr->value());
1708 LNumberUntagD* res =
new(zone()) LNumberUntagD(value);
1709 return AssignEnvironment(DefineAsRegister(res));
1711 ASSERT(to.IsInteger32());
1712 LOperand* value = UseRegisterAtStart(instr->value());
1713 LInstruction* res =
NULL;
1714 if (instr->value()->type().IsSmi()) {
1715 res = DefineAsRegister(
new(zone()) LSmiUntag(value,
false));
1717 LOperand* temp1 = TempRegister();
1718 LOperand* temp2 = instr->CanTruncateToInt32() ? TempRegister()
1720 LOperand* temp3 = instr->CanTruncateToInt32() ? FixedTemp(
d11)
1722 res = DefineSameAsFirst(
new(zone()) LTaggedToI(value,
1726 res = AssignEnvironment(res);
1730 }
else if (from.IsDouble()) {
1731 if (to.IsTagged()) {
1732 LOperand* value = UseRegister(instr->value());
1733 LOperand* temp1 = TempRegister();
1734 LOperand* temp2 = TempRegister();
1738 LUnallocated* result_temp = TempRegister();
1739 LNumberTagD* result =
new(zone()) LNumberTagD(value, temp1, temp2);
1740 Define(result, result_temp);
1741 return AssignPointerMap(result);
1743 ASSERT(to.IsInteger32());
1744 LOperand* value = UseRegister(instr->value());
1745 LOperand* temp1 = TempRegister();
1746 LOperand* temp2 = instr->CanTruncateToInt32() ? TempRegister() :
NULL;
1747 LDoubleToI* res =
new(zone()) LDoubleToI(value, temp1, temp2);
1748 return AssignEnvironment(DefineAsRegister(res));
1750 }
else if (from.IsInteger32()) {
1751 if (to.IsTagged()) {
1752 HValue* val = instr->value();
1753 LOperand* value = UseRegisterAtStart(val);
1754 if (val->HasRange() && val->range()->IsInSmiRange()) {
1755 return DefineAsRegister(
new(zone()) LSmiTag(value));
1757 LNumberTagI* result =
new(zone()) LNumberTagI(value);
1758 return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
1762 LOperand* value = Use(instr->value());
1763 return DefineAsRegister(
new(zone()) LInteger32ToDouble(value));
1771 LInstruction* LChunkBuilder::DoCheckNonSmi(HCheckNonSmi* instr) {
1772 LOperand* value = UseRegisterAtStart(instr->value());
1773 return AssignEnvironment(
new(zone()) LCheckNonSmi(value));
1777 LInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) {
1778 LOperand* value = UseRegisterAtStart(instr->value());
1779 LInstruction* result =
new(zone()) LCheckInstanceType(value);
1780 return AssignEnvironment(result);
1784 LInstruction* LChunkBuilder::DoCheckPrototypeMaps(HCheckPrototypeMaps* instr) {
1785 LOperand* temp1 = TempRegister();
1786 LOperand* temp2 = TempRegister();
1787 LInstruction* result =
new(zone()) LCheckPrototypeMaps(temp1, temp2);
1788 return AssignEnvironment(result);
1792 LInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) {
1793 LOperand* value = UseRegisterAtStart(instr->value());
1794 return AssignEnvironment(
new(zone()) LCheckSmi(value));
1798 LInstruction* LChunkBuilder::DoCheckFunction(HCheckFunction* instr) {
1799 LOperand* value = UseRegisterAtStart(instr->value());
1800 return AssignEnvironment(
new(zone()) LCheckFunction(value));
1804 LInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) {
1805 LOperand* value = UseRegisterAtStart(instr->value());
1806 LInstruction* result =
new(zone()) LCheckMaps(value);
1807 return AssignEnvironment(result);
1811 LInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) {
1812 HValue* value = instr->value();
1813 Representation input_rep = value->representation();
1814 LOperand* reg = UseRegister(value);
1815 if (input_rep.IsDouble()) {
1816 return DefineAsRegister(
new(zone()) LClampDToUint8(reg, FixedTemp(
d11)));
1817 }
else if (input_rep.IsInteger32()) {
1818 return DefineAsRegister(
new(zone()) LClampIToUint8(reg));
1820 ASSERT(input_rep.IsTagged());
1823 LClampTToUint8* result =
new(zone()) LClampTToUint8(reg, FixedTemp(
d11));
1824 return AssignEnvironment(DefineAsRegister(result));
1829 LInstruction* LChunkBuilder::DoReturn(HReturn* instr) {
1830 return new(zone()) LReturn(UseFixed(instr->value(),
r0));
1834 LInstruction* LChunkBuilder::DoConstant(HConstant* instr) {
1835 Representation r = instr->representation();
1836 if (r.IsInteger32()) {
1837 return DefineAsRegister(
new(zone()) LConstantI);
1838 }
else if (r.IsDouble()) {
1839 return DefineAsRegister(
new(zone()) LConstantD);
1840 }
else if (r.IsTagged()) {
1841 return DefineAsRegister(
new(zone()) LConstantT);
1849 LInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) {
1850 LLoadGlobalCell* result =
new(zone()) LLoadGlobalCell;
1851 return instr->RequiresHoleCheck()
1852 ? AssignEnvironment(DefineAsRegister(result))
1853 : DefineAsRegister(result);
1857 LInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) {
1858 LOperand* global_object = UseFixed(instr->global_object(),
r0);
1859 LLoadGlobalGeneric* result =
new(zone()) LLoadGlobalGeneric(global_object);
1860 return MarkAsCall(DefineFixed(result,
r0), instr);
1864 LInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) {
1865 LOperand* value = UseRegister(instr->value());
1868 return instr->RequiresHoleCheck()
1869 ? AssignEnvironment(
new(zone()) LStoreGlobalCell(value, TempRegister()))
1870 : new(zone()) LStoreGlobalCell(value,
NULL);
1874 LInstruction* LChunkBuilder::DoStoreGlobalGeneric(HStoreGlobalGeneric* instr) {
1875 LOperand* global_object = UseFixed(instr->global_object(),
r1);
1876 LOperand* value = UseFixed(instr->value(),
r0);
1877 LStoreGlobalGeneric* result =
1878 new(zone()) LStoreGlobalGeneric(global_object, value);
1879 return MarkAsCall(result, instr);
1883 LInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) {
1884 LOperand* context = UseRegisterAtStart(instr->value());
1885 LInstruction* result =
1886 DefineAsRegister(
new(zone()) LLoadContextSlot(context));
1887 return instr->RequiresHoleCheck() ? AssignEnvironment(result) : result;
1891 LInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) {
1894 if (instr->NeedsWriteBarrier()) {
1895 context = UseTempRegister(instr->context());
1896 value = UseTempRegister(instr->value());
1898 context = UseRegister(instr->context());
1899 value = UseRegister(instr->value());
1901 LInstruction* result =
new(zone()) LStoreContextSlot(context, value);
1902 return instr->RequiresHoleCheck() ? AssignEnvironment(result) : result;
1906 LInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
1907 return DefineAsRegister(
1908 new(zone()) LLoadNamedField(UseRegisterAtStart(instr->object())));
1912 LInstruction* LChunkBuilder::DoLoadNamedFieldPolymorphic(
1913 HLoadNamedFieldPolymorphic* instr) {
1914 ASSERT(instr->representation().IsTagged());
1915 if (instr->need_generic()) {
1916 LOperand* obj = UseFixed(instr->object(),
r0);
1917 LLoadNamedFieldPolymorphic* result =
1918 new(zone()) LLoadNamedFieldPolymorphic(obj);
1919 return MarkAsCall(DefineFixed(result,
r0), instr);
1921 LOperand* obj = UseRegisterAtStart(instr->object());
1922 LLoadNamedFieldPolymorphic* result =
1923 new(zone()) LLoadNamedFieldPolymorphic(obj);
1924 return AssignEnvironment(DefineAsRegister(result));
1929 LInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) {
1930 LOperand*
object = UseFixed(instr->object(),
r0);
1931 LInstruction* result = DefineFixed(
new(zone()) LLoadNamedGeneric(
object),
r0);
1932 return MarkAsCall(result, instr);
1936 LInstruction* LChunkBuilder::DoLoadFunctionPrototype(
1937 HLoadFunctionPrototype* instr) {
1938 return AssignEnvironment(DefineAsRegister(
1939 new(zone()) LLoadFunctionPrototype(UseRegister(instr->function()))));
1943 LInstruction* LChunkBuilder::DoLoadElements(HLoadElements* instr) {
1944 LOperand* input = UseRegisterAtStart(instr->value());
1945 return DefineAsRegister(
new(zone()) LLoadElements(input));
1949 LInstruction* LChunkBuilder::DoLoadExternalArrayPointer(
1950 HLoadExternalArrayPointer* instr) {
1951 LOperand* input = UseRegisterAtStart(instr->value());
1952 return DefineAsRegister(
new(zone()) LLoadExternalArrayPointer(input));
1956 LInstruction* LChunkBuilder::DoLoadKeyedFastElement(
1957 HLoadKeyedFastElement* instr) {
1958 ASSERT(instr->representation().IsTagged());
1959 ASSERT(instr->key()->representation().IsInteger32());
1960 LOperand* obj = UseRegisterAtStart(instr->object());
1961 LOperand* key = UseRegisterAtStart(instr->key());
1962 LLoadKeyedFastElement* result =
new(zone()) LLoadKeyedFastElement(obj, key);
1963 if (instr->RequiresHoleCheck()) AssignEnvironment(result);
1964 return DefineAsRegister(result);
1968 LInstruction* LChunkBuilder::DoLoadKeyedFastDoubleElement(
1969 HLoadKeyedFastDoubleElement* instr) {
1970 ASSERT(instr->representation().IsDouble());
1971 ASSERT(instr->key()->representation().IsInteger32());
1972 LOperand* elements = UseTempRegister(instr->elements());
1973 LOperand* key = UseRegisterOrConstantAtStart(instr->key());
1974 LLoadKeyedFastDoubleElement* result =
1975 new(zone()) LLoadKeyedFastDoubleElement(elements, key);
1976 return AssignEnvironment(DefineAsRegister(result));
1980 LInstruction* LChunkBuilder::DoLoadKeyedSpecializedArrayElement(
1981 HLoadKeyedSpecializedArrayElement* instr) {
1984 (instr->representation().IsInteger32() &&
1987 (instr->representation().IsDouble() &&
1990 ASSERT(instr->key()->representation().IsInteger32());
1991 LOperand* external_pointer = UseRegister(instr->external_pointer());
1992 LOperand* key = UseRegisterOrConstant(instr->key());
1993 LLoadKeyedSpecializedArrayElement* result =
1994 new(zone()) LLoadKeyedSpecializedArrayElement(external_pointer, key);
1995 LInstruction* load_instr = DefineAsRegister(result);
1999 AssignEnvironment(load_instr) : load_instr;
2003 LInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) {
2004 LOperand*
object = UseFixed(instr->object(),
r1);
2005 LOperand* key = UseFixed(instr->key(),
r0);
2007 LInstruction* result =
2008 DefineFixed(
new(zone()) LLoadKeyedGeneric(
object, key),
r0);
2009 return MarkAsCall(result, instr);
2013 LInstruction* LChunkBuilder::DoStoreKeyedFastElement(
2014 HStoreKeyedFastElement* instr) {
2015 bool needs_write_barrier = instr->NeedsWriteBarrier();
2016 ASSERT(instr->value()->representation().IsTagged());
2017 ASSERT(instr->object()->representation().IsTagged());
2018 ASSERT(instr->key()->representation().IsInteger32());
2020 LOperand* obj = UseTempRegister(instr->object());
2021 LOperand* val = needs_write_barrier
2022 ? UseTempRegister(instr->value())
2023 : UseRegisterAtStart(instr->value());
2024 LOperand* key = needs_write_barrier
2025 ? UseTempRegister(instr->key())
2026 : UseRegisterOrConstantAtStart(instr->key());
2027 return new(zone()) LStoreKeyedFastElement(obj, key, val);
2031 LInstruction* LChunkBuilder::DoStoreKeyedFastDoubleElement(
2032 HStoreKeyedFastDoubleElement* instr) {
2033 ASSERT(instr->value()->representation().IsDouble());
2034 ASSERT(instr->elements()->representation().IsTagged());
2035 ASSERT(instr->key()->representation().IsInteger32());
2037 LOperand* elements = UseRegisterAtStart(instr->elements());
2038 LOperand* val = UseTempRegister(instr->value());
2039 LOperand* key = UseRegisterOrConstantAtStart(instr->key());
2041 return new(zone()) LStoreKeyedFastDoubleElement(elements, key, val);
2045 LInstruction* LChunkBuilder::DoStoreKeyedSpecializedArrayElement(
2046 HStoreKeyedSpecializedArrayElement* instr) {
2049 (instr->value()->representation().IsInteger32() &&
2052 (instr->value()->representation().IsDouble() &&
2055 ASSERT(instr->external_pointer()->representation().IsExternal());
2056 ASSERT(instr->key()->representation().IsInteger32());
2058 LOperand* external_pointer = UseRegister(instr->external_pointer());
2059 bool val_is_temp_register =
2062 LOperand* val = val_is_temp_register
2063 ? UseTempRegister(instr->value())
2064 : UseRegister(instr->value());
2065 LOperand* key = UseRegisterOrConstant(instr->key());
2067 return new(zone()) LStoreKeyedSpecializedArrayElement(external_pointer,
2073 LInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) {
2074 LOperand* obj = UseFixed(instr->object(),
r2);
2075 LOperand* key = UseFixed(instr->key(),
r1);
2076 LOperand* val = UseFixed(instr->value(),
r0);
2078 ASSERT(instr->object()->representation().IsTagged());
2079 ASSERT(instr->key()->representation().IsTagged());
2080 ASSERT(instr->value()->representation().IsTagged());
2082 return MarkAsCall(
new(zone()) LStoreKeyedGeneric(obj, key, val), instr);
2086 LInstruction* LChunkBuilder::DoTransitionElementsKind(
2087 HTransitionElementsKind* instr) {
2088 ElementsKind from_kind = instr->original_map()->elements_kind();
2089 ElementsKind to_kind = instr->transitioned_map()->elements_kind();
2091 LOperand*
object = UseRegister(instr->object());
2092 LOperand* new_map_reg = TempRegister();
2093 LTransitionElementsKind* result =
2094 new(zone()) LTransitionElementsKind(
object, new_map_reg,
NULL);
2095 return DefineSameAsFirst(result);
2097 LOperand*
object = UseFixed(instr->object(),
r0);
2098 LOperand* fixed_object_reg = FixedTemp(
r2);
2099 LOperand* new_map_reg = FixedTemp(
r3);
2100 LTransitionElementsKind* result =
2101 new(zone()) LTransitionElementsKind(
object,
2104 return MarkAsCall(DefineFixed(result,
r0), instr);
2109 LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
2110 bool needs_write_barrier = instr->NeedsWriteBarrier();
2111 bool needs_write_barrier_for_map = !instr->transition().is_null() &&
2112 instr->NeedsWriteBarrierForMap();
2115 if (needs_write_barrier) {
2116 obj = instr->is_in_object()
2117 ? UseRegister(instr->object())
2118 : UseTempRegister(instr->object());
2120 obj = needs_write_barrier_for_map
2121 ? UseRegister(instr->object())
2122 : UseRegisterAtStart(instr->object());
2125 LOperand* val = needs_write_barrier
2126 ? UseTempRegister(instr->value())
2127 : UseRegister(instr->value());
2130 LOperand* temp = needs_write_barrier_for_map ? TempRegister() :
NULL;
2132 return new(zone()) LStoreNamedField(obj, val, temp);
2136 LInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) {
2137 LOperand* obj = UseFixed(instr->object(),
r1);
2138 LOperand* val = UseFixed(instr->value(),
r0);
2140 LInstruction* result =
new(zone()) LStoreNamedGeneric(obj, val);
2141 return MarkAsCall(result, instr);
2145 LInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) {
2146 LOperand* left = UseRegisterAtStart(instr->left());
2147 LOperand* right = UseRegisterAtStart(instr->right());
2148 return MarkAsCall(DefineFixed(
new(zone()) LStringAdd(left, right),
r0),
2153 LInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) {
2154 LOperand*
string = UseTempRegister(instr->string());
2155 LOperand* index = UseTempRegister(instr->index());
2156 LStringCharCodeAt* result =
new(zone()) LStringCharCodeAt(
string, index);
2157 return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
2161 LInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) {
2162 LOperand* char_code = UseRegister(instr->value());
2163 LStringCharFromCode* result =
new(zone()) LStringCharFromCode(char_code);
2164 return AssignPointerMap(DefineAsRegister(result));
2168 LInstruction* LChunkBuilder::DoStringLength(HStringLength* instr) {
2169 LOperand*
string = UseRegisterAtStart(instr->value());
2170 return DefineAsRegister(
new(zone()) LStringLength(
string));
2174 LInstruction* LChunkBuilder::DoAllocateObject(HAllocateObject* instr) {
2175 LAllocateObject* result =
2176 new(zone()) LAllocateObject(TempRegister(), TempRegister());
2177 return AssignPointerMap(DefineAsRegister(result));
2181 LInstruction* LChunkBuilder::DoFastLiteral(HFastLiteral* instr) {
2182 return MarkAsCall(DefineFixed(
new(zone()) LFastLiteral,
r0), instr);
2186 LInstruction* LChunkBuilder::DoArrayLiteral(HArrayLiteral* instr) {
2187 return MarkAsCall(DefineFixed(
new(zone()) LArrayLiteral,
r0), instr);
2191 LInstruction* LChunkBuilder::DoObjectLiteral(HObjectLiteral* instr) {
2192 return MarkAsCall(DefineFixed(
new(zone()) LObjectLiteral,
r0), instr);
2196 LInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) {
2197 return MarkAsCall(DefineFixed(
new(zone()) LRegExpLiteral,
r0), instr);
2201 LInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) {
2202 return MarkAsCall(DefineFixed(
new(zone()) LFunctionLiteral,
r0), instr);
2206 LInstruction* LChunkBuilder::DoDeleteProperty(HDeleteProperty* instr) {
2207 LOperand*
object = UseFixed(instr->object(),
r0);
2208 LOperand* key = UseFixed(instr->key(),
r1);
2209 LDeleteProperty* result =
new(zone()) LDeleteProperty(
object, key);
2210 return MarkAsCall(DefineFixed(result,
r0), instr);
2214 LInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) {
2215 allocator_->MarkAsOsrEntry();
2216 current_block_->last_environment()->set_ast_id(instr->ast_id());
2217 return AssignEnvironment(
new(zone()) LOsrEntry);
2221 LInstruction* LChunkBuilder::DoParameter(HParameter* instr) {
2222 int spill_index = chunk()->GetParameterStackSlot(instr->index());
2223 return DefineAsSpilled(
new(zone()) LParameter, spill_index);
2227 LInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
2228 int spill_index = chunk()->GetNextSpillIndex(
false);
2230 Abort(
"Too many spill slots needed for OSR");
2233 return DefineAsSpilled(
new(zone()) LUnknownOSRValue, spill_index);
2237 LInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) {
2238 argument_count_ -= instr->argument_count();
2239 return MarkAsCall(DefineFixed(
new(zone()) LCallStub,
r0), instr);
2243 LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
2252 LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
2253 LOperand* arguments = UseRegister(instr->arguments());
2254 LOperand* length = UseTempRegister(instr->length());
2255 LOperand* index = UseRegister(instr->index());
2256 LAccessArgumentsAt* result =
2257 new(zone()) LAccessArgumentsAt(arguments, length, index);
2258 return AssignEnvironment(DefineAsRegister(result));
2262 LInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) {
2263 LOperand*
object = UseFixed(instr->value(),
r0);
2264 LToFastProperties* result =
new(zone()) LToFastProperties(
object);
2265 return MarkAsCall(DefineFixed(result,
r0), instr);
2269 LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) {
2270 LTypeof* result =
new(zone()) LTypeof(UseFixed(instr->value(),
r0));
2271 return MarkAsCall(DefineFixed(result,
r0), instr);
2275 LInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) {
2276 return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value()));
2280 LInstruction* LChunkBuilder::DoIsConstructCallAndBranch(
2281 HIsConstructCallAndBranch* instr) {
2282 return new(zone()) LIsConstructCallAndBranch(TempRegister());
2286 LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
2287 HEnvironment* env = current_block_->last_environment();
2290 env->set_ast_id(instr->ast_id());
2292 env->Drop(instr->pop_count());
2293 for (
int i = 0; i < instr->values()->length(); ++i) {
2294 HValue* value = instr->values()->at(i);
2295 if (instr->HasAssignedIndexAt(i)) {
2296 env->Bind(instr->GetAssignedIndexAt(i), value);
2304 if (pending_deoptimization_ast_id_ == instr->ast_id()) {
2305 LInstruction* result =
new(zone()) LLazyBailout;
2306 result = AssignEnvironment(result);
2309 instruction_pending_deoptimization_environment_->
2310 SetDeferredLazyDeoptimizationEnvironment(result->environment());
2311 instruction_pending_deoptimization_environment_ =
NULL;
2320 LInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) {
2321 if (instr->is_function_entry()) {
2322 return MarkAsCall(
new(zone()) LStackCheck, instr);
2324 ASSERT(instr->is_backwards_branch());
2325 return AssignEnvironment(AssignPointerMap(
new(zone()) LStackCheck));
2330 LInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
2331 HEnvironment* outer = current_block_->last_environment();
2332 HConstant* undefined = graph()->GetConstantUndefined();
2333 HEnvironment* inner = outer->CopyForInlining(instr->closure(),
2334 instr->arguments_count(),
2338 instr->is_construct());
2339 if (instr->arguments_var() !=
NULL) {
2340 inner->Bind(instr->arguments_var(), graph()->GetArgumentsObject());
2342 current_block_->UpdateEnvironment(inner);
2343 chunk_->AddInlinedClosure(instr->closure());
2348 LInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) {
2349 LInstruction* pop =
NULL;
2351 HEnvironment* env = current_block_->last_environment();
2353 if (instr->arguments_pushed()) {
2354 int argument_count = env->arguments_environment()->parameter_count();
2355 pop =
new(zone()) LDrop(argument_count);
2356 argument_count_ -= argument_count;
2359 HEnvironment* outer = current_block_->last_environment()->
2360 DiscardInlined(
false);
2361 current_block_->UpdateEnvironment(outer);
2367 LInstruction* LChunkBuilder::DoIn(HIn* instr) {
2368 LOperand* key = UseRegisterAtStart(instr->key());
2369 LOperand*
object = UseRegisterAtStart(instr->object());
2370 LIn* result =
new(zone()) LIn(key,
object);
2371 return MarkAsCall(DefineFixed(result,
r0), instr);
2375 LInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) {
2376 LOperand*
object = UseFixed(instr->enumerable(),
r0);
2377 LForInPrepareMap* result =
new(zone()) LForInPrepareMap(
object);
2378 return MarkAsCall(DefineFixed(result,
r0), instr, CAN_DEOPTIMIZE_EAGERLY);
2382 LInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) {
2383 LOperand* map = UseRegister(instr->map());
2384 return AssignEnvironment(DefineAsRegister(
2385 new(zone()) LForInCacheArray(map)));
2389 LInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) {
2390 LOperand* value = UseRegisterAtStart(instr->value());
2391 LOperand* map = UseRegisterAtStart(instr->map());
2392 return AssignEnvironment(
new(zone()) LCheckMapValue(value, map));
2396 LInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) {
2397 LOperand*
object = UseRegister(instr->object());
2398 LOperand* index = UseRegister(instr->index());
2399 return DefineAsRegister(
new(zone()) LLoadFieldByIndex(
object, index));
HValue * LookupValue(int id) const
#define DEFINE_COMPILE(type)
static LUnallocated * cast(LOperand *op)
static LGap * cast(LInstruction *instr)
static LConstantOperand * Create(int index, Zone *zone)
Handle< Map > transitioned_map()
virtual void PrintDataTo(StringStream *stream)
virtual void PrintDataTo(StringStream *stream)
Handle< Object > name() const
const char * ToCString(const v8::String::Utf8Value &value)
virtual LOperand * InputAt(int i)=0
int GetParameterStackSlot(int index) const
const DivMagicNumbers DivMagicNumberFor(int32_t divisor)
void PrintF(const char *format,...)
static String * cast(Object *obj)
virtual void PrintOutputOperandTo(StringStream *stream)
void MarkSpilledDoubleRegister(int allocation_index, LOperand *spill_operand)
LParallelMove * GetOrCreateParallelMove(InnerPosition pos, Zone *zone)
virtual void PrintDataTo(StringStream *stream)
int ParameterAt(int index)
value format" "after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false, "print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false, "print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false, "report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true, "garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true, "flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true, "use incremental marking") DEFINE_bool(incremental_marking_steps, true, "do incremental marking steps") DEFINE_bool(trace_incremental_marking, false, "trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true, "Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false, "Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true, "use inline caching") DEFINE_bool(native_code_counters, false, "generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false, "Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true, "Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false, "Never perform compaction on full GC-testing only") DEFINE_bool(compact_code_space, true, "Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true, "Flush inline caches prior to mark compact collection and" "flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0, "Default seed for initializing random generator" "(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true, "allows verbose printing") DEFINE_bool(allow_natives_syntax, false, "allow natives syntax") DEFINE_bool(trace_sim, false, "Trace simulator execution") DEFINE_bool(check_icache, false, "Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0, "Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8, "Stack alingment in bytes in simulator(4 or 8, 8 is default)") DEFINE_bool(trace_exception, false, "print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false, "preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true, "randomize hashes to avoid predictable hash collisions" "(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0, "Fixed seed to use to hash property keys(0 means random)" "(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false, "activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true, "generate optimized regexp code") DEFINE_bool(testing_bool_flag, true, "testing_bool_flag") DEFINE_int(testing_int_flag, 13, "testing_int_flag") DEFINE_float(testing_float_flag, 2.5, "float-flag") DEFINE_string(testing_string_flag, "Hello, world!", "string-flag") DEFINE_int(testing_prng_seed, 42, "Seed used for threading test randomness") DEFINE_string(testing_serialization_file, "/tmp/serdes", "file in which to serialize heap") DEFINE_bool(help, false, "Print usage message, including flags, on console") DEFINE_bool(dump_counters, false, "Dump counters on exit") DEFINE_string(map_counters, "", "Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT, "Pass all remaining arguments to the script.Alias for\"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#43"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2#define FLAG_MODE_DEFINE_DEFAULTS#1"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flag-definitions.h"1#define FLAG_FULL(ftype, ctype, nam, def, cmt)#define FLAG_READONLY(ftype, ctype, nam, def, cmt)#define DEFINE_implication(whenflag, thenflag)#define DEFINE_bool(nam, def, cmt)#define DEFINE_int(nam, def, cmt)#define DEFINE_float(nam, def, cmt)#define DEFINE_string(nam, def, cmt)#define DEFINE_args(nam, def, cmt)#define FLAG DEFINE_bool(use_strict, false,"enforce strict mode") DEFINE_bool(es5_readonly, false,"activate correct semantics for inheriting readonliness") DEFINE_bool(es52_globals, false,"activate new semantics for global var declarations") DEFINE_bool(harmony_typeof, false,"enable harmony semantics for typeof") DEFINE_bool(harmony_scoping, false,"enable harmony block scoping") DEFINE_bool(harmony_modules, false,"enable harmony modules (implies block scoping)") DEFINE_bool(harmony_proxies, false,"enable harmony proxies") DEFINE_bool(harmony_collections, false,"enable harmony collections (sets, maps, and weak maps)") DEFINE_bool(harmony, false,"enable all harmony features (except typeof)") DEFINE_implication(harmony, harmony_scoping) DEFINE_implication(harmony, harmony_modules) DEFINE_implication(harmony, harmony_proxies) DEFINE_implication(harmony, harmony_collections) DEFINE_implication(harmony_modules, harmony_scoping) DEFINE_bool(packed_arrays, false,"optimizes arrays that have no holes") DEFINE_bool(smi_only_arrays, true,"tracks arrays with only smi values") DEFINE_bool(clever_optimizations, true,"Optimize object size, Array shift, DOM strings and string +") DEFINE_bool(unbox_double_arrays, true,"automatically unbox arrays of doubles") DEFINE_bool(string_slices, true,"use string slices") DEFINE_bool(crankshaft, true,"use crankshaft") DEFINE_string(hydrogen_filter,"","optimization filter") DEFINE_bool(use_range, true,"use hydrogen range analysis") DEFINE_bool(eliminate_dead_phis, true,"eliminate dead phis") DEFINE_bool(use_gvn, true,"use hydrogen global value numbering") DEFINE_bool(use_canonicalizing, true,"use hydrogen instruction canonicalizing") DEFINE_bool(use_inlining, true,"use function inlining") DEFINE_int(max_inlined_source_size, 600,"maximum source size in bytes considered for a single inlining") DEFINE_int(max_inlined_nodes, 196,"maximum number of AST nodes considered for a single inlining") DEFINE_int(max_inlined_nodes_cumulative, 196,"maximum cumulative number of AST nodes considered for inlining") DEFINE_bool(loop_invariant_code_motion, true,"loop invariant code motion") DEFINE_bool(collect_megamorphic_maps_from_stub_cache, true,"crankshaft harvests type feedback from stub cache") DEFINE_bool(hydrogen_stats, false,"print statistics for hydrogen") DEFINE_bool(trace_hydrogen, false,"trace generated hydrogen to file") DEFINE_string(trace_phase,"Z","trace generated IR for specified phases") DEFINE_bool(trace_inlining, false,"trace inlining decisions") DEFINE_bool(trace_alloc, false,"trace register allocator") DEFINE_bool(trace_all_uses, false,"trace all use positions") DEFINE_bool(trace_range, false,"trace range analysis") DEFINE_bool(trace_gvn, false,"trace global value numbering") DEFINE_bool(trace_representation, false,"trace representation types") DEFINE_bool(stress_pointer_maps, false,"pointer map for every instruction") DEFINE_bool(stress_environments, false,"environment for every instruction") DEFINE_int(deopt_every_n_times, 0,"deoptimize every n times a deopt point is passed") DEFINE_bool(trap_on_deopt, false,"put a break point before deoptimizing") DEFINE_bool(deoptimize_uncommon_cases, true,"deoptimize uncommon cases") DEFINE_bool(polymorphic_inlining, true,"polymorphic inlining") DEFINE_bool(use_osr, true,"use on-stack replacement") DEFINE_bool(array_bounds_checks_elimination, false,"perform array bounds checks elimination") DEFINE_bool(array_index_dehoisting, false,"perform array index dehoisting") DEFINE_bool(trace_osr, false,"trace on-stack replacement") DEFINE_int(stress_runs, 0,"number of stress runs") DEFINE_bool(optimize_closures, true,"optimize closures") DEFINE_bool(inline_construct, true,"inline constructor calls") DEFINE_bool(inline_arguments, true,"inline functions with arguments object") DEFINE_int(loop_weight, 1,"loop weight for representation inference") DEFINE_bool(optimize_for_in, true,"optimize functions containing for-in loops") DEFINE_bool(experimental_profiler, true,"enable all profiler experiments") DEFINE_bool(watch_ic_patching, false,"profiler considers IC stability") DEFINE_int(frame_count, 1,"number of stack frames inspected by the profiler") DEFINE_bool(self_optimization, false,"primitive functions trigger their own optimization") DEFINE_bool(direct_self_opt, false,"call recompile stub directly when self-optimizing") DEFINE_bool(retry_self_opt, false,"re-try self-optimization if it failed") DEFINE_bool(count_based_interrupts, false,"trigger profiler ticks based on counting instead of timing") DEFINE_bool(interrupt_at_exit, false,"insert an interrupt check at function exit") DEFINE_bool(weighted_back_edges, false,"weight back edges by jump distance for interrupt triggering") DEFINE_int(interrupt_budget, 5900,"execution budget before interrupt is triggered") DEFINE_int(type_info_threshold, 15,"percentage of ICs that must have type info to allow optimization") DEFINE_int(self_opt_count, 130,"call count before self-optimization") DEFINE_implication(experimental_profiler, watch_ic_patching) DEFINE_implication(experimental_profiler, self_optimization) DEFINE_implication(experimental_profiler, retry_self_opt) DEFINE_implication(experimental_profiler, count_based_interrupts) DEFINE_implication(experimental_profiler, interrupt_at_exit) DEFINE_implication(experimental_profiler, weighted_back_edges) DEFINE_bool(trace_opt_verbose, false,"extra verbose compilation tracing") DEFINE_implication(trace_opt_verbose, trace_opt) DEFINE_bool(debug_code, false,"generate extra code (assertions) for debugging") DEFINE_bool(code_comments, false,"emit comments in code disassembly") DEFINE_bool(enable_sse2, true,"enable use of SSE2 instructions if available") DEFINE_bool(enable_sse3, true,"enable use of SSE3 instructions if available") DEFINE_bool(enable_sse4_1, true,"enable use of SSE4.1 instructions if available") DEFINE_bool(enable_cmov, true,"enable use of CMOV instruction if available") DEFINE_bool(enable_rdtsc, true,"enable use of RDTSC instruction if available") DEFINE_bool(enable_sahf, true,"enable use of SAHF instruction if available (X64 only)") DEFINE_bool(enable_vfp3, true,"enable use of VFP3 instructions if available - this implies ""enabling ARMv7 instructions (ARM only)") DEFINE_bool(enable_armv7, true,"enable use of ARMv7 instructions if available (ARM only)") DEFINE_bool(enable_fpu, true,"enable use of MIPS FPU instructions if available (MIPS only)") DEFINE_string(expose_natives_as, NULL,"expose natives in global object") DEFINE_string(expose_debug_as, NULL,"expose debug in global object") DEFINE_bool(expose_gc, false,"expose gc extension") DEFINE_bool(expose_externalize_string, false,"expose externalize string extension") DEFINE_int(stack_trace_limit, 10,"number of stack frames to capture") DEFINE_bool(builtins_in_stack_traces, false,"show built-in functions in stack traces") DEFINE_bool(disable_native_files, false,"disable builtin natives files") DEFINE_bool(inline_new, true,"use fast inline allocation") DEFINE_bool(stack_trace_on_abort, true,"print a stack trace if an assertion failure occurs") DEFINE_bool(trace, false,"trace function calls") DEFINE_bool(mask_constants_with_cookie, true,"use random jit cookie to mask large constants") DEFINE_bool(lazy, true,"use lazy compilation") DEFINE_bool(trace_opt, false,"trace lazy optimization") DEFINE_bool(trace_opt_stats, false,"trace lazy optimization statistics") DEFINE_bool(opt, true,"use adaptive optimizations") DEFINE_bool(always_opt, false,"always try to optimize functions") DEFINE_bool(prepare_always_opt, false,"prepare for turning on always opt") DEFINE_bool(trace_deopt, false,"trace deoptimization") DEFINE_int(min_preparse_length, 1024,"minimum length for automatic enable preparsing") DEFINE_bool(always_full_compiler, false,"try to use the dedicated run-once backend for all code") DEFINE_bool(trace_bailout, false,"print reasons for falling back to using the classic V8 backend") DEFINE_bool(compilation_cache, true,"enable compilation cache") DEFINE_bool(cache_prototype_transitions, true,"cache prototype transitions") DEFINE_bool(trace_debug_json, false,"trace debugging JSON request/response") DEFINE_bool(debugger_auto_break, true,"automatically set the debug break flag when debugger commands are ""in the queue") DEFINE_bool(enable_liveedit, true,"enable liveedit experimental feature") DEFINE_bool(break_on_abort, true,"always cause a debug break before aborting") DEFINE_int(stack_size, kPointerSize *123,"default size of stack region v8 is allowed to use (in kBytes)") DEFINE_int(max_stack_trace_source_length, 300,"maximum length of function source code printed in a stack trace.") DEFINE_bool(always_inline_smi_code, false,"always inline smi code in non-opt code") DEFINE_int(max_new_space_size, 0,"max size of the new generation (in kBytes)") DEFINE_int(max_old_space_size, 0,"max size of the old generation (in Mbytes)") DEFINE_int(max_executable_size, 0,"max size of executable memory (in Mbytes)") DEFINE_bool(gc_global, false,"always perform global GCs") DEFINE_int(gc_interval,-1,"garbage collect after <n> allocations") DEFINE_bool(trace_gc, false,"print one trace line following each garbage collection") DEFINE_bool(trace_gc_nvp, false,"print one detailed trace line in name=value format ""after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false,"print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false,"print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false,"report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true,"garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true,"flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true,"use incremental marking") DEFINE_bool(incremental_marking_steps, true,"do incremental marking steps") DEFINE_bool(trace_incremental_marking, false,"trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true,"Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false,"Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true,"use inline caching") DEFINE_bool(native_code_counters, false,"generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false,"Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true,"Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false,"Never perform compaction on full GC - testing only") DEFINE_bool(compact_code_space, true,"Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true,"Flush inline caches prior to mark compact collection and ""flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0,"Default seed for initializing random generator ""(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true,"allows verbose printing") DEFINE_bool(allow_natives_syntax, false,"allow natives syntax") DEFINE_bool(trace_sim, false,"Trace simulator execution") DEFINE_bool(check_icache, false,"Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0,"Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8,"Stack alingment in bytes in simulator (4 or 8, 8 is default)") DEFINE_bool(trace_exception, false,"print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false,"preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true,"randomize hashes to avoid predictable hash collisions ""(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0,"Fixed seed to use to hash property keys (0 means random)""(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false,"activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true,"generate optimized regexp code") DEFINE_bool(testing_bool_flag, true,"testing_bool_flag") DEFINE_int(testing_int_flag, 13,"testing_int_flag") DEFINE_float(testing_float_flag, 2.5,"float-flag") DEFINE_string(testing_string_flag,"Hello, world!","string-flag") DEFINE_int(testing_prng_seed, 42,"Seed used for threading test randomness") DEFINE_string(testing_serialization_file,"/tmp/serdes","file in which to serialize heap") DEFINE_bool(help, false,"Print usage message, including flags, on console") DEFINE_bool(dump_counters, false,"Dump counters on exit") DEFINE_string(map_counters,"","Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT,"Pass all remaining arguments to the script. Alias for \"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#47"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2 namespace{struct Flag{enum FlagType{TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS} name
virtual void PrintDataTo(StringStream *stream)
static Representation Integer32()
Handle< String > name() const
static const int kNoNumber
static const int kNumAllocatableRegisters
Handle< Object > name() const
LEnvironment * environment() const
#define ASSERT(condition)
virtual const char * Mnemonic() const =0
virtual void PrintDataTo(StringStream *stream)
void PrintTo(StringStream *stream)
bool IsSimpleMapChangeTransition(ElementsKind from_kind, ElementsKind to_kind)
#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V)
LChunk(CompilationInfo *info, HGraph *graph)
Representation representation() const
EqualityKind kind() const
int last_instruction_index() const
LGap * GetGapAt(int index) const
void Add(Vector< const char > format, Vector< FmtElm > elms)
virtual void PrintDataTo(StringStream *stream)
virtual void PrintDataTo(StringStream *stream)
virtual void PrintDataTo(StringStream *stream)
virtual bool HasResult() const =0
virtual void PrintDataTo(StringStream *stream)
DwVfpRegister DoubleRegister
int GetNextSpillIndex(bool is_double)
void PrintTo(StringStream *stream)
LLabel * replacement() const
static HUnaryOperation * cast(HValue *value)
virtual const char * Mnemonic() const
virtual void PrintDataTo(StringStream *stream)
virtual void PrintDataTo(StringStream *stream)
bool is_loop_header() const
void MarkSpilledRegister(int allocation_index, LOperand *spill_operand)
LOperand * GetNextSpillSlot(bool is_double)
void AddMove(LOperand *from, LOperand *to, Zone *zone)
static const char * String(Value tok)
static LDoubleStackSlot * Create(int index, Zone *zone)
LOperand * InputAt(int i)
virtual void PrintDataTo(StringStream *stream)
bool HasEnvironment() const
static void VPrint(const char *format, va_list args)
virtual void PrintDataTo(StringStream *stream)
virtual LOperand * result()=0
virtual void PrintDataTo(StringStream *stream)
static int ToAllocationIndex(Register reg)
virtual void PrintDataTo(StringStream *stream)
virtual void PrintTo(StringStream *stream)
virtual void PrintDataTo(StringStream *stream)
static LStackSlot * Create(int index, Zone *zone)
virtual void PrintDataTo(StringStream *stream)
static const int kMaxFixedIndex
bool IsGapAt(int index) const
virtual bool IsControl() const
LPointerMap * pointer_map() const
const ZoneList< HBasicBlock * > * blocks() const
int first_instruction_index() const
virtual void PrintDataTo(StringStream *stream)
LLabel * GetLabel(int block_id) const
virtual DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch,"string-compare-and-branch") Token void PrintDataTo(StringStream *stream)
virtual bool IsGap() const
void AddInstruction(LInstruction *instruction, HBasicBlock *block)
virtual void PrintDataTo(StringStream *stream)
void PrintDataTo(StringStream *stream) const
virtual const char * Mnemonic() const
CompilationInfo * info() const
static int ToAllocationIndex(DwVfpRegister reg)
static const int kNumAllocatableRegisters
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination trace on stack replacement optimize closures functions with arguments object optimize functions containing for in loops profiler considers IC stability primitive functions trigger their own optimization re try self optimization if it failed insert an interrupt check at function exit execution budget before interrupt is triggered call count before self optimization self_optimization count_based_interrupts weighted_back_edges trace_opt emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 enable use of ARMv7 instructions if enable use of MIPS FPU instructions if NULL
void AddGapMove(int index, LOperand *from, LOperand *to)
virtual void PrintDataTo(StringStream *stream)
virtual void PrintDataTo(StringStream *stream)
Handle< String > name() const
LConstantOperand * DefineConstantOperand(HConstant *constant)
bool HasFixedPolicy() const
virtual void PrintDataTo(StringStream *stream)
void set_replacement(LLabel *label)
Representation LookupLiteralRepresentation(LConstantOperand *operand) const
bool HasPointerMap() const
int NearestGapPos(int index) const
virtual void PrintDataTo(StringStream *stream)
virtual int InputCount()=0
const DivMagicNumbers InvalidDivMagicNumber
void set_lithium_position(int pos)
static HValue * cast(HValue *value)
Handle< String > type_literal()
void PrintTo(StringStream *stream)
Handle< Object > LookupLiteral(LConstantOperand *operand) const
virtual void PrintDataTo(StringStream *stream)
Handle< Map > original_map()
const ZoneList< LInstruction * > * instructions() const
virtual void PrintDataTo(StringStream *stream)