Index: src/ia32/lithium-codegen-ia32.cc |
diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
index 6e86d920a26fcea1546ddf6e6a56254b7b59d4e1..3e19c39ba24de278a78f128739f899402e46735a 100644 |
--- a/src/ia32/lithium-codegen-ia32.cc |
+++ b/src/ia32/lithium-codegen-ia32.cc |
@@ -302,7 +302,30 @@ bool LCodeGen::GenerateBody() { |
} |
if (emit_instructions) { |
- Comment(";;; @%d: %s.", current_instruction_, instr->Mnemonic()); |
+ if (FLAG_code_comments) { |
+ HValue* hydrogen = instr->hydrogen_value(); |
+ if (hydrogen != NULL) { |
+ if (hydrogen->IsChange()) { |
+ HValue* changed_value = HChange::cast(hydrogen)->value(); |
+ int use_id = 0; |
+ const char* use_mnemo = "dead"; |
+ if (hydrogen->UseCount() >= 1) { |
+ HValue* use_value = hydrogen->uses().value(); |
+ use_id = use_value->id(); |
+ use_mnemo = use_value->Mnemonic(); |
+ } |
+ Comment(";;; @%d: %s. <of #%d %s for #%d %s>", |
+ current_instruction_, instr->Mnemonic(), |
+ changed_value->id(), changed_value->Mnemonic(), |
+ use_id, use_mnemo); |
+ } else { |
+ Comment(";;; @%d: %s. <#%d>", current_instruction_, |
+ instr->Mnemonic(), hydrogen->id()); |
+ } |
+ } else { |
+ Comment(";;; @%d: %s.", current_instruction_, instr->Mnemonic()); |
+ } |
+ } |
instr->CompileToNative(this); |
} |
} |
@@ -4411,6 +4434,7 @@ void LCodeGen::DoDeferredTaggedToI(LTaggedToI* instr) { |
// Check for undefined. Undefined is converted to zero for truncating |
// conversions. |
__ cmp(input_reg, factory()->undefined_value()); |
+ __ RecordComment("Deferred TaggedToI: cannot truncate"); |
DeoptimizeIf(not_equal, instr->environment()); |
__ mov(input_reg, 0); |
__ jmp(&done, Label::kNear); |
@@ -4431,6 +4455,7 @@ void LCodeGen::DoDeferredTaggedToI(LTaggedToI* instr) { |
__ j(less, &convert, Label::kNear); |
// Pop FPU stack before deoptimizing. |
__ fstp(0); |
+ __ RecordComment("Deferred TaggedToI: exponent too big"); |
DeoptimizeIf(no_condition, instr->environment()); |
// Reserve space for 64 bit answer. |
@@ -4456,6 +4481,7 @@ void LCodeGen::DoDeferredTaggedToI(LTaggedToI* instr) { |
} |
} else { |
// Deoptimize if we don't have a heap number. |
+ __ RecordComment("Deferred TaggedToI: not a heap number"); |
DeoptimizeIf(not_equal, instr->environment()); |
XMMRegister xmm_temp = ToDoubleRegister(instr->temp()); |
@@ -4463,13 +4489,16 @@ void LCodeGen::DoDeferredTaggedToI(LTaggedToI* instr) { |
__ cvttsd2si(input_reg, Operand(xmm0)); |
__ cvtsi2sd(xmm_temp, Operand(input_reg)); |
__ ucomisd(xmm0, xmm_temp); |
+ __ RecordComment("Deferred TaggedToI: lost precision"); |
DeoptimizeIf(not_equal, instr->environment()); |
+ __ RecordComment("Deferred TaggedToI: NaN"); |
DeoptimizeIf(parity_even, instr->environment()); // NaN. |
if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { |
__ test(input_reg, Operand(input_reg)); |
__ j(not_zero, &done); |
__ movmskpd(input_reg, xmm0); |
__ and_(input_reg, 1); |
+ __ RecordComment("Deferred TaggedToI: minus zero"); |
DeoptimizeIf(not_zero, instr->environment()); |
} |
} |