From 240d818bb80189ad184afba498918e78af651320 Mon Sep 17 00:00:00 2001 From: "ager@chromium.org" Date: Mon, 3 Nov 2008 15:21:46 +0000 Subject: [PATCH] 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 --- src/codegen-arm.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/codegen-arm.cc b/src/codegen-arm.cc index 5bf0637..4c2f465 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]); } -- 2.7.4