Chromium Code Reviews| Index: src/arm/lithium-codegen-arm.cc |
| diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
| index 76c8443e7c30cc422154eab202c61dba16e5941e..49d95b36602d66cd090e1efef434c3fe57bcc8c1 100644 |
| --- a/src/arm/lithium-codegen-arm.cc |
| +++ b/src/arm/lithium-codegen-arm.cc |
| @@ -3928,7 +3928,9 @@ void LCodeGen::EmitNumberUntagD(Register input_reg, |
| Label load_smi, heap_number, done; |
| // Smi check. |
| - __ JumpIfSmi(input_reg, &load_smi); |
| + STATIC_CHECK(kSmiTagSize == 1 && kSmiTag == 0); |
|
ulan
2012/01/27 13:19:11
UntagAndJumpIfSmi
|
| + __ mov(scratch, Operand(input_reg, ASR, kSmiTagSize), SetCC); |
| + __ b(cc, &load_smi); // Shifter carry is not set for a smi. |
| // Heap number map check. |
| __ ldr(scratch, FieldMemOperand(input_reg, HeapObject::kMapOffset)); |
| @@ -3967,10 +3969,9 @@ void LCodeGen::EmitNumberUntagD(Register input_reg, |
| // Smi to double register conversion |
| __ bind(&load_smi); |
| - __ SmiUntag(input_reg); // Untag smi before converting to float. |
| - __ vmov(flt_scratch, input_reg); |
| + // scratch: untagged value of input_reg |
| + __ vmov(flt_scratch, scratch); |
| __ vcvt_f64_s32(result_reg, flt_scratch); |
| - __ SmiTag(input_reg); // Retag smi. |
| __ bind(&done); |
| } |
| @@ -4256,7 +4257,9 @@ void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) { |
| Label is_smi, done, heap_number; |
| // Both smi and heap number cases are handled. |
| - __ JumpIfSmi(input_reg, &is_smi); |
| + STATIC_ASSERT(kSmiTagSize == 1 && kSmiTag == 0); |
| + __ mov(result_reg, Operand(input_reg, ASR, kSmiTagSize), SetCC); |
| + __ b(cc, &is_smi); // Shifter carry is not set for a smi. |
| // Check for heap number |
| __ ldr(scratch, FieldMemOperand(input_reg, HeapObject::kMapOffset)); |
| @@ -4279,7 +4282,6 @@ void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) { |
| // smi |
| __ bind(&is_smi); |
| - __ SmiUntag(result_reg, input_reg); |
| __ ClampUint8(result_reg, result_reg); |
| __ bind(&done); |