gecko/js/src/methodjit/nunbox/FastOps.cpp

109 lines
3.7 KiB
C++
Raw Normal View History

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* vim: set ts=4 sw=4 et tw=99:
*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla SpiderMonkey JavaScript 1.9 code, released
* May 28, 2008.
*
* The Initial Developer of the Original Code is
* Brendan Eich <brendan@mozilla.org>
*
* Contributor(s):
* David Anderson <danderson@mozilla.com>
* David Mandelin <dmandelin@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "methodjit/MethodJIT.h"
#include "methodjit/Compiler.h"
#include "methodjit/StubCalls.h"
#include "methodjit/FrameState-inl.h"
#include "jsautooplen.h"
using namespace js;
using namespace js::mjit;
void
mjit::Compiler::jsop_bindname(uint32 index)
{
2010-05-25 22:31:08 -07:00
RegisterID reg = frame.allocReg();
masm.loadPtr(Address(Assembler::FpReg, offsetof(JSStackFrame, scopeChain)), reg);
2010-05-25 22:31:08 -07:00
Address address(reg, offsetof(JSObject, fslots) + JSSLOT_PARENT * sizeof(jsval));
Jump j = masm.branch32(Assembler::NotEqual, masm.payloadOf(address), Imm32(0));
2010-05-25 22:31:08 -07:00
stubcc.linkExit(j);
stubcc.leave();
stubcc.call(stubs::BindName);
2010-05-25 22:31:08 -07:00
frame.pushTypedPayload(JSVAL_MASK32_NONFUNOBJ, reg);
stubcc.rejoin(1);
}
void
mjit::Compiler::jsop_bitop(JSOp op)
{
FrameEntry *rhs = frame.peek(-1);
FrameEntry *lhs = frame.peek(-2);
/* We only want to handle integers here. */
if ((rhs->isTypeKnown() && rhs->getTypeTag() != JSVAL_MASK32_INT32) ||
(lhs->isTypeKnown() && lhs->getTypeTag() != JSVAL_MASK32_INT32)) {
prepareStubCall();
stubCall(stubs::BitAnd, Uses(2), Defs(1));
frame.popn(2);
frame.pushSyncedType(JSVAL_MASK32_INT32);
return;
}
/* Test the types. */
if (!rhs->isTypeKnown()) {
RegisterID reg = frame.tempRegForType(rhs);
Jump rhsFail = masm.branch32(Assembler::NotEqual, reg, Imm32(JSVAL_MASK32_INT32));
stubcc.linkExit(rhsFail);
if (lhs->isTypeKnown())
stubcc.leave();
frame.freeReg(reg);
//rhs->setTypeTag(JSVAL_MASK32_INT32);
}
if (!lhs->isTypeKnown()) {
RegisterID reg = frame.tempRegForType(lhs);
Jump lhsFail = masm.branch32(Assembler::NotEqual, reg, Imm32(JSVAL_MASK32_INT32));
stubcc.linkExit(lhsFail);
stubcc.leave();
frame.freeReg(reg);
}
stubcc.call(stubs::BitAnd);
frame.pop();
frame.pop();
}