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); |