From 56ca64e98cb984cdaf4b6bba1b4c632fe06b2fa1 Mon Sep 17 00:00:00 2001 From: "verwaest@chromium.org" Date: Wed, 7 Aug 2013 17:22:17 +0000 Subject: [PATCH] Revert "mod does not rely on a fixed register anymore, the arguments are passed via the stack." Due to buildbot failures. BUG= R=danno@chromium.org Review URL: https://chromiumcodereview.appspot.com/22474007 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16110 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/ia32/lithium-ia32.cc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ia32/lithium-ia32.cc b/src/ia32/lithium-ia32.cc index 5aa1a95..ef3f64d 100644 --- a/src/ia32/lithium-ia32.cc +++ b/src/ia32/lithium-ia32.cc @@ -809,11 +809,10 @@ LInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, ASSERT(instr->representation().IsDouble()); ASSERT(instr->left()->representation().IsDouble()); ASSERT(instr->right()->representation().IsDouble()); + ASSERT(op != Token::MOD); LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); LOperand* right = UseRegisterAtStart(instr->BetterRightOperand()); LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); - // We call a C function for double modulo. It can't trigger a GC. - if (op == Token::MOD) return MarkAsCall(DefineAsRegister(result), instr); return DefineSameAsFirst(result); } @@ -1564,7 +1563,13 @@ LInstruction* LChunkBuilder::DoMod(HMod* instr) { return DoArithmeticT(Token::MOD, instr); } else { ASSERT(instr->representation().IsDouble()); - return DoArithmeticD(Token::MOD, instr); + // 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. + LArithmeticD* mod = new(zone()) LArithmeticD(Token::MOD, + UseFixedDouble(left, xmm2), + UseFixedDouble(right, xmm1)); + return MarkAsCall(DefineFixedDouble(mod, xmm1), instr); } } -- 2.7.4