From 87ff987f70494668790001ea7406a35f79f9b868 Mon Sep 17 00:00:00 2001 From: "svenpanne@chromium.org" Date: Tue, 17 Sep 2013 07:29:26 +0000 Subject: [PATCH] Refactoring only: Make it clear that MOD is special. LArithmeticD should really be 5 different instructions... :-/ R=bmeurer@chromium.org Review URL: https://codereview.chromium.org/23800005 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16745 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/lithium-arm.cc | 15 +++++++-------- src/ia32/lithium-ia32.cc | 16 +++++++++++----- src/mips/lithium-mips.cc | 15 +++++++-------- src/x64/lithium-x64.cc | 13 +++++++------ 4 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/arm/lithium-arm.cc b/src/arm/lithium-arm.cc index ffadada..8d08df4 100644 --- a/src/arm/lithium-arm.cc +++ b/src/arm/lithium-arm.cc @@ -756,21 +756,20 @@ LInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, ASSERT(instr->representation().IsDouble()); ASSERT(instr->left()->representation().IsDouble()); ASSERT(instr->right()->representation().IsDouble()); - LOperand* left = NULL; - LOperand* right = NULL; if (op == Token::MOD) { - left = UseFixedDouble(instr->left(), d1); - right = UseFixedDouble(instr->right(), d2); + LOperand* left = UseFixedDouble(instr->left(), d1); + LOperand* right = UseFixedDouble(instr->right(), d2); LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); // We call a C function for double modulo. It can't trigger a GC. We need // to use fixed result register for the call. // TODO(fschneider): Allow any register as input registers. return MarkAsCall(DefineFixedDouble(result, d1), instr); + } else { + LOperand* left = UseRegisterAtStart(instr->left()); + LOperand* right = UseRegisterAtStart(instr->right()); + LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); + return DefineAsRegister(result); } - left = UseRegisterAtStart(instr->left()); - right = UseRegisterAtStart(instr->right()); - LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); - return DefineAsRegister(result); } diff --git a/src/ia32/lithium-ia32.cc b/src/ia32/lithium-ia32.cc index ebcf1b6..77f5706 100644 --- a/src/ia32/lithium-ia32.cc +++ b/src/ia32/lithium-ia32.cc @@ -808,11 +808,17 @@ LInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, ASSERT(instr->representation().IsDouble()); ASSERT(instr->left()->representation().IsDouble()); ASSERT(instr->right()->representation().IsDouble()); - LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); - LOperand* right = UseRegisterAtStart(instr->BetterRightOperand()); - LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); - if (op == Token::MOD) return MarkAsCall(DefineSameAsFirst(result), instr); - return DefineSameAsFirst(result); + if (op == Token::MOD) { + LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); + LOperand* right = UseRegisterAtStart(instr->BetterRightOperand()); + LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); + return MarkAsCall(DefineSameAsFirst(result), instr); + } else { + LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); + LOperand* right = UseRegisterAtStart(instr->BetterRightOperand()); + LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); + return DefineSameAsFirst(result); + } } diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc index f809120..6bb8bbe 100644 --- a/src/mips/lithium-mips.cc +++ b/src/mips/lithium-mips.cc @@ -761,21 +761,20 @@ LInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, ASSERT(instr->representation().IsDouble()); ASSERT(instr->left()->representation().IsDouble()); ASSERT(instr->right()->representation().IsDouble()); - LOperand* left = NULL; - LOperand* right = NULL; if (op == Token::MOD) { - left = UseFixedDouble(instr->left(), f2); - right = UseFixedDouble(instr->right(), f4); + LOperand* left = UseFixedDouble(instr->left(), f2); + LOperand* right = UseFixedDouble(instr->right(), f4); LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); // We call a C function for double modulo. It can't trigger a GC. We need // to use fixed result register for the call. // TODO(fschneider): Allow any register as input registers. return MarkAsCall(DefineFixedDouble(result, f2), instr); + } else { + LOperand* left = UseRegisterAtStart(instr->left()); + LOperand* right = UseRegisterAtStart(instr->right()); + LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); + return DefineAsRegister(result); } - left = UseRegisterAtStart(instr->left()); - right = UseRegisterAtStart(instr->right()); - LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); - return DefineAsRegister(result); } diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc index 662cfce..3a7366e 100644 --- a/src/x64/lithium-x64.cc +++ b/src/x64/lithium-x64.cc @@ -760,16 +760,17 @@ LInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, ASSERT(instr->representation().IsDouble()); ASSERT(instr->left()->representation().IsDouble()); ASSERT(instr->right()->representation().IsDouble()); - LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); - LOperand* right = NULL; if (op == Token::MOD) { - right = UseFixedDouble(instr->BetterRightOperand(), xmm1); + LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); + LOperand* right = UseFixedDouble(instr->BetterRightOperand(), xmm1); LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); return MarkAsCall(DefineSameAsFirst(result), instr); + } else { + LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); + LOperand* right = UseRegisterAtStart(instr->BetterRightOperand()); + LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); + return DefineSameAsFirst(result); } - right = UseRegisterAtStart(instr->BetterRightOperand()); - LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); - return DefineSameAsFirst(result); } -- 2.7.4