From: ager@chromium.org Date: Mon, 3 Nov 2008 15:21:46 +0000 (+0000) Subject: Smi ranges are not symmetrical. -kMinSmiValue is not a Smi. X-Git-Tag: upstream/4.7.83~25050 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=240d818bb80189ad184afba498918e78af651320;p=platform%2Fupstream%2Fv8.git Smi ranges are not symmetrical. -kMinSmiValue is not a Smi. Review URL: http://codereview.chromium.org/9041 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@680 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/codegen-arm.cc b/src/codegen-arm.cc index 5bf0637ca..4c2f465d3 100644 --- a/src/codegen-arm.cc +++ b/src/codegen-arm.cc @@ -1261,9 +1261,15 @@ void CodeGenerator::GenerateFastCaseSwitchJumpTable( __ bind(&is_smi); if (min_index != 0) { - // small positive numbers can be immediate operands. + // Small positive numbers can be immediate operands. if (min_index < 0) { - __ add(r0, r0, Operand(Smi::FromInt(-min_index))); + // If min_index is Smi::kMinValue, -min_index is not a Smi. + if (Smi::IsValid(-min_index)) { + __ add(r0, r0, Operand(Smi::FromInt(-min_index))); + } else { + __ add(r0, r0, Operand(Smi::FromInt(-min_index - 1))); + __ add(r0, r0, Operand(Smi::FromInt(1))); + } } else { __ sub(r0, r0, Operand(Smi::FromInt(min_index))); } @@ -1277,7 +1283,7 @@ void CodeGenerator::GenerateFastCaseSwitchJumpTable( // the pc-register at the above add. __ stop("Unreachable: Switch table alignment"); - // table containing branch operations. + // Table containing branch operations. for (int i = 0; i < range; i++) { __ b(case_targets[i]); }