} else if (String::Equals(type_name, factory->string_string())) {
__ JumpIfSmi(input, false_label);
__ CompareObjectType(input, scratch, no_reg, FIRST_NONSTRING_TYPE);
- __ b(ge, false_label);
- __ ldrb(scratch, FieldMemOperand(scratch, Map::kBitFieldOffset));
- __ tst(scratch, Operand(1 << Map::kIsUndetectable));
- final_branch_condition = eq;
+ final_branch_condition = lt;
} else if (String::Equals(type_name, factory->symbol_string())) {
__ JumpIfSmi(input, false_label);
Register scratch = ToRegister(instr->temp2());
__ JumpIfSmi(value, false_label);
- __ JumpIfObjectType(
- value, map, scratch, FIRST_NONSTRING_TYPE, false_label, ge);
- __ Ldrb(scratch, FieldMemOperand(map, Map::kBitFieldOffset));
- EmitTestAndBranch(instr, eq, scratch, 1 << Map::kIsUndetectable);
+ __ CompareObjectType(value, map, scratch, FIRST_NONSTRING_TYPE);
+ EmitBranch(instr, lt);
} else if (String::Equals(type_name, factory->symbol_string())) {
DCHECK((instr->temp1() != NULL) && (instr->temp2() != NULL));
}
-bool ToBooleanStub::Types::CanBeUndetectable() const {
- return Contains(ToBooleanStub::SPEC_OBJECT)
- || Contains(ToBooleanStub::STRING);
-}
-
-
void StubFailureTrampolineStub::GenerateAheadOfTime(Isolate* isolate) {
StubFailureTrampolineStub stub1(isolate, NOT_JS_FUNCTION_STUB_MODE);
StubFailureTrampolineStub stub2(isolate, JS_FUNCTION_STUB_MODE);
bool UpdateStatus(Handle<Object> object);
bool NeedsMap() const;
- bool CanBeUndetectable() const;
+ bool CanBeUndetectable() const {
+ return Contains(ToBooleanStub::SPEC_OBJECT);
+ }
bool IsGeneric() const { return ToIntegral() == Generic().ToIntegral(); }
static Types Generic() { return Types((1 << NUMBER_OF_TYPES) - 1); }
Split(eq, if_true, if_false, fall_through);
} else if (String::Equals(check, factory->string_string())) {
__ JumpIfSmi(r0, if_false);
- // Check for undetectable objects => false.
__ CompareObjectType(r0, r0, r1, FIRST_NONSTRING_TYPE);
- __ b(ge, if_false);
- __ ldrb(r1, FieldMemOperand(r0, Map::kBitFieldOffset));
- __ tst(r1, Operand(1 << Map::kIsUndetectable));
- Split(eq, if_true, if_false, fall_through);
+ Split(lt, if_true, if_false, fall_through);
} else if (String::Equals(check, factory->symbol_string())) {
__ JumpIfSmi(r0, if_false);
__ CompareObjectType(r0, r0, r1, SYMBOL_TYPE);
} else if (String::Equals(check, factory->string_string())) {
ASM_LOCATION("FullCodeGenerator::EmitLiteralCompareTypeof string_string");
__ JumpIfSmi(x0, if_false);
- // Check for undetectable objects => false.
- __ JumpIfObjectType(x0, x0, x1, FIRST_NONSTRING_TYPE, if_false, ge);
- __ Ldrb(x1, FieldMemOperand(x0, Map::kBitFieldOffset));
- __ TestAndSplit(x1, 1 << Map::kIsUndetectable, if_true, if_false,
- fall_through);
+ __ CompareObjectType(x0, x0, x1, FIRST_NONSTRING_TYPE);
+ Split(lt, if_true, if_false, fall_through);
} else if (String::Equals(check, factory->symbol_string())) {
ASM_LOCATION("FullCodeGenerator::EmitLiteralCompareTypeof symbol_string");
__ JumpIfSmi(x0, if_false);
} else if (String::Equals(check, factory->string_string())) {
__ JumpIfSmi(eax, if_false);
__ CmpObjectType(eax, FIRST_NONSTRING_TYPE, edx);
- __ j(above_equal, if_false);
- // Check for undetectable objects => false.
- __ test_b(FieldOperand(edx, Map::kBitFieldOffset),
- 1 << Map::kIsUndetectable);
- Split(zero, if_true, if_false, fall_through);
+ Split(below, if_true, if_false, fall_through);
} else if (String::Equals(check, factory->symbol_string())) {
__ JumpIfSmi(eax, if_false);
__ CmpObjectType(eax, SYMBOL_TYPE, edx);
Split(eq, v0, Operand(at), if_true, if_false, fall_through);
} else if (String::Equals(check, factory->string_string())) {
__ JumpIfSmi(v0, if_false);
- // Check for undetectable objects => false.
__ GetObjectType(v0, v0, a1);
- __ Branch(if_false, ge, a1, Operand(FIRST_NONSTRING_TYPE));
- __ lbu(a1, FieldMemOperand(v0, Map::kBitFieldOffset));
- __ And(a1, a1, Operand(1 << Map::kIsUndetectable));
- Split(eq, a1, Operand(zero_reg),
- if_true, if_false, fall_through);
+ Split(lt, a1, Operand(FIRST_NONSTRING_TYPE), if_true, if_false,
+ fall_through);
} else if (String::Equals(check, factory->symbol_string())) {
__ JumpIfSmi(v0, if_false);
__ GetObjectType(v0, v0, a1);
Split(eq, v0, Operand(at), if_true, if_false, fall_through);
} else if (String::Equals(check, factory->string_string())) {
__ JumpIfSmi(v0, if_false);
- // Check for undetectable objects => false.
__ GetObjectType(v0, v0, a1);
- __ Branch(if_false, ge, a1, Operand(FIRST_NONSTRING_TYPE));
- __ lbu(a1, FieldMemOperand(v0, Map::kBitFieldOffset));
- __ And(a1, a1, Operand(1 << Map::kIsUndetectable));
- Split(eq, a1, Operand(zero_reg),
- if_true, if_false, fall_through);
+ Split(lt, a1, Operand(FIRST_NONSTRING_TYPE), if_true, if_false,
+ fall_through);
} else if (String::Equals(check, factory->symbol_string())) {
__ JumpIfSmi(v0, if_false);
__ GetObjectType(v0, v0, a1);
Split(equal, if_true, if_false, fall_through);
} else if (String::Equals(check, factory->string_string())) {
__ JumpIfSmi(rax, if_false);
- // Check for undetectable objects => false.
__ CmpObjectType(rax, FIRST_NONSTRING_TYPE, rdx);
- __ j(above_equal, if_false);
- __ testb(FieldOperand(rdx, Map::kBitFieldOffset),
- Immediate(1 << Map::kIsUndetectable));
- Split(zero, if_true, if_false, fall_through);
+ Split(below, if_true, if_false, fall_through);
} else if (String::Equals(check, factory->symbol_string())) {
__ JumpIfSmi(rax, if_false);
__ CmpObjectType(rax, SYMBOL_TYPE, rdx);
} else if (String::Equals(type_name, factory()->string_string())) {
__ JumpIfSmi(input, false_label, false_distance);
__ CmpObjectType(input, FIRST_NONSTRING_TYPE, input);
- __ j(above_equal, false_label, false_distance);
- __ test_b(FieldOperand(input, Map::kBitFieldOffset),
- 1 << Map::kIsUndetectable);
- final_branch_condition = zero;
+ final_branch_condition = below;
} else if (String::Equals(type_name, factory()->symbol_string())) {
__ JumpIfSmi(input, false_label, false_distance);
} else if (String::Equals(type_name, factory->string_string())) {
__ JumpIfSmi(input, false_label);
__ GetObjectType(input, input, scratch);
- __ Branch(USE_DELAY_SLOT, false_label,
- ge, scratch, Operand(FIRST_NONSTRING_TYPE));
- // input is an object so we can load the BitFieldOffset even if we take the
- // other branch.
- __ lbu(at, FieldMemOperand(input, Map::kBitFieldOffset));
- __ And(at, at, 1 << Map::kIsUndetectable);
- *cmp1 = at;
- *cmp2 = Operand(zero_reg);
- final_branch_condition = eq;
+ *cmp1 = scratch;
+ *cmp2 = Operand(FIRST_NONSTRING_TYPE);
+ final_branch_condition = lt;
} else if (String::Equals(type_name, factory->symbol_string())) {
__ JumpIfSmi(input, false_label);
} else if (String::Equals(type_name, factory->string_string())) {
__ JumpIfSmi(input, false_label);
__ GetObjectType(input, input, scratch);
- __ Branch(USE_DELAY_SLOT, false_label,
- ge, scratch, Operand(FIRST_NONSTRING_TYPE));
- // input is an object so we can load the BitFieldOffset even if we take the
- // other branch.
- __ lbu(at, FieldMemOperand(input, Map::kBitFieldOffset));
- __ And(at, at, 1 << Map::kIsUndetectable);
- *cmp1 = at;
- *cmp2 = Operand(zero_reg);
- final_branch_condition = eq;
+ *cmp1 = scratch;
+ *cmp2 = Operand(FIRST_NONSTRING_TYPE);
+ final_branch_condition = lt;
} else if (String::Equals(type_name, factory->symbol_string())) {
__ JumpIfSmi(input, false_label);
} else if (String::Equals(type_name, factory->string_string())) {
__ JumpIfSmi(input, false_label, false_distance);
__ CmpObjectType(input, FIRST_NONSTRING_TYPE, input);
- __ j(above_equal, false_label, false_distance);
- __ testb(FieldOperand(input, Map::kBitFieldOffset),
- Immediate(1 << Map::kIsUndetectable));
- final_branch_condition = zero;
+ final_branch_condition = below;
} else if (String::Equals(type_name, factory->symbol_string())) {
__ JumpIfSmi(input, false_label, false_distance);