blob: 30da9e7ee5ff8605ed90aefc3520c71e3e570857 [file] [log] [blame]
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* vim: set ts=8 sts=4 et sw=4 tw=99:
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef jit_shared_CodeGenerator_shared_inl_h
#define jit_shared_CodeGenerator_shared_inl_h
namespace js {
namespace jit {
static inline int32_t
ToInt32(const LAllocation *a)
{
if (a->isConstantValue())
return a->toConstant()->toInt32();
if (a->isConstantIndex())
return a->toConstantIndex()->index();
JS_NOT_REACHED("this is not a constant!");
return -1;
}
static inline double
ToDouble(const LAllocation *a)
{
return a->toConstant()->toNumber();
}
static inline Register
ToRegister(const LAllocation &a)
{
JS_ASSERT(a.isGeneralReg());
return a.toGeneralReg()->reg();
}
static inline Register
ToRegister(const LAllocation *a)
{
return ToRegister(*a);
}
static inline Register
ToRegister(const LDefinition *def)
{
return ToRegister(*def->output());
}
static inline Register
ToTempUnboxRegister(const LDefinition *def)
{
if (def->isBogusTemp())
return InvalidReg;
return ToRegister(def);
}
static inline Register
ToRegisterOrInvalid(const LAllocation *a)
{
return a ? ToRegister(*a) : InvalidReg;
}
static inline FloatRegister
ToFloatRegister(const LAllocation &a)
{
JS_ASSERT(a.isFloatReg());
return a.toFloatReg()->reg();
}
static inline FloatRegister
ToFloatRegister(const LAllocation *a)
{
return ToFloatRegister(*a);
}
static inline FloatRegister
ToFloatRegister(const LDefinition *def)
{
return ToFloatRegister(*def->output());
}
static inline AnyRegister
ToAnyRegister(const LAllocation &a)
{
JS_ASSERT(a.isGeneralReg() || a.isFloatReg());
if (a.isGeneralReg())
return AnyRegister(ToRegister(a));
return AnyRegister(ToFloatRegister(a));
}
static inline AnyRegister
ToAnyRegister(const LAllocation *a)
{
return ToAnyRegister(*a);
}
static inline AnyRegister
ToAnyRegister(const LDefinition *def)
{
return ToAnyRegister(def->output());
}
static inline Int32Key
ToInt32Key(const LAllocation *a)
{
if (a->isConstant())
return Int32Key(ToInt32(a));
return Int32Key(ToRegister(a));
}
static inline ValueOperand
GetValueOutput(LInstruction *ins)
{
#if defined(JS_NUNBOX32)
return ValueOperand(ToRegister(ins->getDef(TYPE_INDEX)),
ToRegister(ins->getDef(PAYLOAD_INDEX)));
#elif defined(JS_PUNBOX64)
return ValueOperand(ToRegister(ins->getDef(0)));
#else
#error "Unknown"
#endif
}
static inline ValueOperand
GetTempValue(const Register &type, const Register &payload)
{
#if defined(JS_NUNBOX32)
return ValueOperand(type, payload);
#elif defined(JS_PUNBOX64)
(void)type;
return ValueOperand(payload);
#else
#error "Unknown"
#endif
}
void
CodeGeneratorShared::saveLive(LInstruction *ins)
{
JS_ASSERT(!ins->isCall());
LSafepoint *safepoint = ins->safepoint();
masm.PushRegsInMask(safepoint->liveRegs());
}
void
CodeGeneratorShared::restoreLive(LInstruction *ins)
{
JS_ASSERT(!ins->isCall());
LSafepoint *safepoint = ins->safepoint();
masm.PopRegsInMask(safepoint->liveRegs());
}
void
CodeGeneratorShared::restoreLiveIgnore(LInstruction *ins, RegisterSet ignore)
{
JS_ASSERT(!ins->isCall());
LSafepoint *safepoint = ins->safepoint();
masm.PopRegsInMaskIgnore(safepoint->liveRegs(), ignore);
}
} // ion
} // js
#endif /* jit_shared_CodeGenerator_shared_inl_h */