Chromium Code Reviews| 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..12ec982b52455d2a8ebdedbb5a71da0fc239cf25 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); |
|
fschneider
2011/11/08 10:14:37
Here you need to use a temp register like on the o
|
| + |
| + 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::DoStringCompareAndBranch(LStringCompareAndBranch* 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(); |