Index: src/arm/lithium-codegen-arm.cc |
=================================================================== |
--- src/arm/lithium-codegen-arm.cc (revision 6216) |
+++ src/arm/lithium-codegen-arm.cc (working copy) |
@@ -2081,7 +2081,13 @@ |
void LCodeGen::DoSmiUntag(LSmiUntag* instr) { |
- Abort("DoSmiUntag unimplemented."); |
+ LOperand* input = instr->input(); |
+ ASSERT(input->IsRegister() && input->Equals(instr->result())); |
+ if (instr->needs_check()) { |
+ __ tst(ToRegister(input), Operand(kSmiTagMask)); |
+ DeoptimizeIf(ne, instr->environment()); |
+ } |
+ __ SmiUntag(ToRegister(input)); |
} |
@@ -2455,12 +2461,27 @@ |
void LCodeGen::DoTypeof(LTypeof* instr) { |
- Abort("DoTypeof unimplemented."); |
+ Register input = ToRegister(instr->input()); |
+ __ push(input); |
+ CallRuntime(Runtime::kTypeof, 1, instr); |
} |
void LCodeGen::DoTypeofIs(LTypeofIs* instr) { |
- Abort("DoTypeofIs unimplemented."); |
+ Register input = ToRegister(instr->input()); |
+ Register result = ToRegister(instr->result()); |
+ Label true_label; |
+ Label false_label; |
+ Label done; |
+ |
+ Condition final_branch_condition = EmitTypeofIs(&true_label, |
+ &false_label, |
+ input, |
+ instr->type_literal()); |
+ |
+ __ LoadRoot(result, Heap::kTrueValueRootIndex, final_branch_condition); |
+ __ LoadRoot(result, Heap::kFalseValueRootIndex, |
+ NegateCondition(final_branch_condition)); |
} |