if (cond == lt || cond == gt) {
__ CompareObjectType(r0, r4, r4, FIRST_SPEC_OBJECT_TYPE);
__ b(ge, slow);
- __ CompareObjectType(r0, r4, r4, SYMBOL_TYPE);
+ __ cmp(r4, Operand(SYMBOL_TYPE));
__ b(eq, slow);
} else {
__ CompareObjectType(r0, r4, r4, HEAP_NUMBER_TYPE);
if (cond != eq) {
__ cmp(r4, Operand(FIRST_SPEC_OBJECT_TYPE));
__ b(ge, slow);
+ __ cmp(r4, Operand(SYMBOL_TYPE));
+ __ b(eq, slow);
// Normally here we fall through to return_equal, but undefined is
// special: (undefined == undefined) == true, but
// (undefined <= undefined) == false! See ECMAScript 11.8.5.
// so we do the second best thing - test it ourselves.
// They are both equal and they are not both Smis so both of them are not
// Smis. If it's not a heap number, then return equal.
+ Register right_type = scratch;
if ((cond == lt) || (cond == gt)) {
- __ JumpIfObjectType(right, scratch, scratch, FIRST_SPEC_OBJECT_TYPE, slow,
- ge);
- __ JumpIfObjectType(right, scratch, scratch, SYMBOL_TYPE, slow, eq);
+ __ JumpIfObjectType(right, right_type, right_type, FIRST_SPEC_OBJECT_TYPE,
+ slow, ge);
+ __ Cmp(right_type, SYMBOL_TYPE);
+ __ B(eq, slow);
} else if (cond == eq) {
__ JumpIfHeapNumber(right, &heap_number);
} else {
- Register right_type = scratch;
__ JumpIfObjectType(right, right_type, right_type, HEAP_NUMBER_TYPE,
&heap_number);
// Comparing JS objects with <=, >= is complicated.
__ Cmp(right_type, FIRST_SPEC_OBJECT_TYPE);
__ B(ge, slow);
+ __ Cmp(right_type, SYMBOL_TYPE);
+ __ B(eq, slow);
// Normally here we fall through to return_equal, but undefined is
// special: (undefined == undefined) == true, but
// (undefined <= undefined) == false! See ECMAScript 11.8.5.
// so we do the second best thing - test it ourselves.
// They are both equal and they are not both Smis so both of them are not
// Smis. If it's not a heap number, then return equal.
+ __ GetObjectType(a0, t4, t4);
if (cc == less || cc == greater) {
- __ GetObjectType(a0, t4, t4);
__ Branch(slow, greater, t4, Operand(FIRST_SPEC_OBJECT_TYPE));
__ Branch(slow, eq, t4, Operand(SYMBOL_TYPE));
} else {
- __ GetObjectType(a0, t4, t4);
__ Branch(&heap_number, eq, t4, Operand(HEAP_NUMBER_TYPE));
// Comparing JS objects with <=, >= is complicated.
if (cc != eq) {
__ Branch(slow, greater, t4, Operand(FIRST_SPEC_OBJECT_TYPE));
+ __ Branch(slow, eq, t4, Operand(SYMBOL_TYPE));
// Normally here we fall through to return_equal, but undefined is
// special: (undefined == undefined) == true, but
// (undefined <= undefined) == false! See ECMAScript 11.8.5.
// so we do the second best thing - test it ourselves.
// They are both equal and they are not both Smis so both of them are not
// Smis. If it's not a heap number, then return equal.
+ __ GetObjectType(a0, t0, t0);
if (cc == less || cc == greater) {
- __ GetObjectType(a0, t0, t0);
__ Branch(slow, greater, t0, Operand(FIRST_SPEC_OBJECT_TYPE));
__ Branch(slow, eq, t0, Operand(SYMBOL_TYPE));
} else {
- __ GetObjectType(a0, t0, t0);
__ Branch(&heap_number, eq, t0, Operand(HEAP_NUMBER_TYPE));
// Comparing JS objects with <=, >= is complicated.
if (cc != eq) {
__ Branch(slow, greater, t0, Operand(FIRST_SPEC_OBJECT_TYPE));
+ __ Branch(slow, eq, t0, Operand(SYMBOL_TYPE));
// Normally here we fall through to return_equal, but undefined is
// special: (undefined == undefined) == true, but
// (undefined <= undefined) == false! See ECMAScript 11.8.5.
if (cond == lt || cond == gt) {
__ CompareObjectType(r3, r7, r7, FIRST_SPEC_OBJECT_TYPE);
__ bge(slow);
- __ CompareObjectType(r3, r7, r7, SYMBOL_TYPE);
+ __ cmpi(r7, Operand(SYMBOL_TYPE));
__ beq(slow);
} else {
__ CompareObjectType(r3, r7, r7, HEAP_NUMBER_TYPE);
if (cond != eq) {
__ cmpi(r7, Operand(FIRST_SPEC_OBJECT_TYPE));
__ bge(slow);
+ __ cmpi(r7, Operand(SYMBOL_TYPE));
+ __ beq(slow);
// Normally here we fall through to return_equal, but undefined is
// special: (undefined == undefined) == true, but
// (undefined <= undefined) == false! See ECMAScript 11.8.5.
function TestComparison() {
- function f() {
- var a = Symbol();
- a < a;
- a > a;
- a <= a;
- a >= a;
- }
-
- assertThrows(f, TypeError);
- %OptimizeFunctionOnNextCall(f);
- assertThrows(f, TypeError);
- assertThrows(f, TypeError);
-
- function g() {
- var a = Symbol();
- var b = Symbol();
- a < b;
- a > b;
- a <= b;
- a >= b;
- }
- assertThrows(g, TypeError);
- %OptimizeFunctionOnNextCall(g);
- assertThrows(g, TypeError);
- assertThrows(g, TypeError);
+ function lt() { var a = Symbol(); var b = Symbol(); a < b; }
+ function gt() { var a = Symbol(); var b = Symbol(); a > b; }
+ function le() { var a = Symbol(); var b = Symbol(); a <= b; }
+ function ge() { var a = Symbol(); var b = Symbol(); a >= b; }
+ function lt_same() { var a = Symbol(); a < a; }
+ function gt_same() { var a = Symbol(); a > a; }
+ function le_same() { var a = Symbol(); a <= a; }
+ function ge_same() { var a = Symbol(); a >= a; }
+
+ var throwFuncs = [lt, gt, le, ge, lt_same, gt_same, le_same, ge_same];
+
+ for (var f of throwFuncs) {
+ assertThrows(f, TypeError);
+ %OptimizeFunctionOnNextCall(f);
+ assertThrows(f, TypeError);
+ assertThrows(f, TypeError);
+ }
}
TestComparison();