| Index: test/cctest/test-assembler-x87.cc
|
| diff --git a/test/cctest/test-assembler-x87.cc b/test/cctest/test-assembler-x87.cc
|
| index a831a0b2f1a8658f14c995029354eeb649ed70c5..2655e3447ddad7e7623e86cef2dba2146b85836e 100644
|
| --- a/test/cctest/test-assembler-x87.cc
|
| +++ b/test/cctest/test-assembler-x87.cc
|
| @@ -407,4 +407,45 @@ TEST(AssemblerIa32JumpTables2) {
|
| }
|
| }
|
|
|
| +TEST(Regress621926) {
|
| + // Bug description:
|
| + // The opcodes for cmpw r/m16, r16 and cmpw r16, r/m16 were swapped.
|
| + // This was causing non-commutative comparisons to produce the wrong result.
|
| + CcTest::InitializeVM();
|
| + Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate());
|
| + HandleScope scope(isolate);
|
| + Assembler assm(isolate, nullptr, 0);
|
| +
|
| + int16_t a = 42;
|
| +
|
| + Label fail;
|
| + __ push(ebx);
|
| + __ mov(ebx, Immediate(reinterpret_cast<intptr_t>(&a)));
|
| + __ mov(eax, Immediate(41));
|
| + __ cmpw(eax, Operand(ebx));
|
| + __ j(above_equal, &fail);
|
| + __ cmpw(Operand(ebx), eax);
|
| + __ j(below_equal, &fail);
|
| + __ mov(eax, 1);
|
| + __ pop(ebx);
|
| + __ ret(0);
|
| + __ bind(&fail);
|
| + __ mov(eax, 0);
|
| + __ pop(ebx);
|
| + __ ret(0);
|
| +
|
| + CodeDesc desc;
|
| + assm.GetCode(&desc);
|
| + Handle<Code> code = isolate->factory()->NewCode(
|
| + desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
|
| +
|
| +#ifdef OBJECT_PRINT
|
| + OFStream os(stdout);
|
| + code->Print(os);
|
| +#endif
|
| +
|
| + F0 f = FUNCTION_CAST<F0>(code->entry());
|
| + CHECK_EQ(f(), 1);
|
| +}
|
| +
|
| #undef __
|
|
|