| Index: src/compiler/ia32/code-generator-ia32.cc
|
| diff --git a/src/compiler/ia32/code-generator-ia32.cc b/src/compiler/ia32/code-generator-ia32.cc
|
| index 37ad39dd4eb79fb7be5d0b93c25d2aef58f60b37..d96c8c1d5f7dd8338fb8946a1b0a49f36906e1c7 100644
|
| --- a/src/compiler/ia32/code-generator-ia32.cc
|
| +++ b/src/compiler/ia32/code-generator-ia32.cc
|
| @@ -464,6 +464,12 @@ void CodeGenerator::AssembleArchBranch(Instruction* instr,
|
| case kUnsignedGreaterThan:
|
| __ j(above, tlabel);
|
| break;
|
| + case kOverflow:
|
| + __ j(overflow, tlabel);
|
| + break;
|
| + case kNotOverflow:
|
| + __ j(no_overflow, tlabel);
|
| + break;
|
| }
|
| if (!fallthru) __ jmp(flabel, flabel_distance); // no fallthru to flabel.
|
| __ bind(&done);
|
| @@ -476,9 +482,11 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr,
|
| IA32OperandConverter i(this, instr);
|
| Label done;
|
|
|
| - // Materialize a full 32-bit 1 or 0 value.
|
| + // Materialize a full 32-bit 1 or 0 value. The result register is always the
|
| + // last output of the instruction.
|
| Label check;
|
| - Register reg = i.OutputRegister();
|
| + ASSERT_NE(0, instr->OutputCount());
|
| + Register reg = i.OutputRegister(instr->OutputCount() - 1);
|
| Condition cc = no_condition;
|
| switch (condition) {
|
| case kUnorderedEqual:
|
| @@ -541,6 +549,12 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr,
|
| case kUnsignedGreaterThan:
|
| cc = above;
|
| break;
|
| + case kOverflow:
|
| + cc = overflow;
|
| + break;
|
| + case kNotOverflow:
|
| + cc = no_overflow;
|
| + break;
|
| }
|
| __ bind(&check);
|
| if (reg.is_byte_register()) {
|
|
|