| Index: src/x64/lithium-codegen-x64.cc
|
| diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc
|
| index 38a8c18be39b58ed82e1c2fede1aa80411fd41f9..028f2a0c1bedca9da4ef2a0a838e7e6a5a9a99cf 100644
|
| --- a/src/x64/lithium-codegen-x64.cc
|
| +++ b/src/x64/lithium-codegen-x64.cc
|
| @@ -1680,6 +1680,31 @@ void LCodeGen::DoIsObjectAndBranch(LIsObjectAndBranch* instr) {
|
| }
|
|
|
|
|
| +Condition LCodeGen::EmitIsString(Register input,
|
| + Label* is_not_string,
|
| + Label* is_string) {
|
| +
|
| + __ JumpIfSmi(input, is_not_string);
|
| + __ CmpObjectType(input, FIRST_NONSTRING_TYPE, rcx);
|
| +
|
| + return below;
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoIsStringAndBranch(LIsStringAndBranch* instr) {
|
| + Register reg = ToRegister(instr->InputAt(0));
|
| +
|
| + int true_block = chunk_->LookupDestination(instr->true_block_id());
|
| + int false_block = chunk_->LookupDestination(instr->false_block_id());
|
| + Label* true_label = chunk_->GetAssemblyLabel(true_block);
|
| + Label* false_label = chunk_->GetAssemblyLabel(false_block);
|
| +
|
| + Condition true_cond = EmitIsString(reg, false_label, true_label);
|
| +
|
| + EmitBranch(true_block, false_block, true_cond);
|
| +}
|
| +
|
| +
|
| void LCodeGen::DoIsSmiAndBranch(LIsSmiAndBranch* instr) {
|
| int true_block = chunk_->LookupDestination(instr->true_block_id());
|
| int false_block = chunk_->LookupDestination(instr->false_block_id());
|
| @@ -1711,6 +1736,21 @@ void LCodeGen::DoIsUndetectableAndBranch(LIsUndetectableAndBranch* instr) {
|
| }
|
|
|
|
|
| +void LCodeGen::DoCompareGenericAndBranch(LCompareGenericAndBranch* instr) {
|
| + Token::Value op = instr->op();
|
| + int true_block = chunk_->LookupDestination(instr->true_block_id());
|
| + int false_block = chunk_->LookupDestination(instr->false_block_id());
|
| +
|
| + Handle<Code> ic = CompareIC::GetUninitialized(op);
|
| + CallCode(ic, RelocInfo::CODE_TARGET, instr);
|
| +
|
| + Condition condition = TokenToCondition(op, false);
|
| + __ testq(rax, rax);
|
| +
|
| + EmitBranch(true_block, false_block, condition);
|
| +}
|
| +
|
| +
|
| static InstanceType TestType(HHasInstanceTypeAndBranch* instr) {
|
| InstanceType from = instr->from();
|
| InstanceType to = instr->to();
|
|
|