зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1090957 - IonMonkey: MIPS64: Implement atomics in MacroAssembler. r=lth
--- js/src/jit/mips64/MacroAssembler-mips64.cpp | 99 +++++++++ js/src/jit/mips64/MacroAssembler-mips64.h | 303 +++++++++++++++++++--------- 2 files changed, 302 insertions(+), 100 deletions(-)
This commit is contained in:
Родитель
75053668d4
Коммит
3d7202f2e8
|
@ -2529,6 +2529,105 @@ MacroAssemblerMIPS64Compat::handleFailureWithHandlerTail(void* handler)
|
|||
jump(a1);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void
|
||||
MacroAssemblerMIPS64Compat::compareExchangeToTypedIntArray(Scalar::Type arrayType, const T& mem,
|
||||
Register oldval, Register newval,
|
||||
Register temp, Register valueTemp,
|
||||
Register offsetTemp, Register maskTemp,
|
||||
AnyRegister output)
|
||||
{
|
||||
switch (arrayType) {
|
||||
case Scalar::Int8:
|
||||
compareExchange8SignExtend(mem, oldval, newval, valueTemp, offsetTemp, maskTemp, output.gpr());
|
||||
break;
|
||||
case Scalar::Uint8:
|
||||
compareExchange8ZeroExtend(mem, oldval, newval, valueTemp, offsetTemp, maskTemp, output.gpr());
|
||||
break;
|
||||
case Scalar::Uint8Clamped:
|
||||
compareExchange8ZeroExtend(mem, oldval, newval, valueTemp, offsetTemp, maskTemp, output.gpr());
|
||||
break;
|
||||
case Scalar::Int16:
|
||||
compareExchange16SignExtend(mem, oldval, newval, valueTemp, offsetTemp, maskTemp, output.gpr());
|
||||
break;
|
||||
case Scalar::Uint16:
|
||||
compareExchange16ZeroExtend(mem, oldval, newval, valueTemp, offsetTemp, maskTemp, output.gpr());
|
||||
break;
|
||||
case Scalar::Int32:
|
||||
compareExchange32(mem, oldval, newval, valueTemp, offsetTemp, maskTemp, output.gpr());
|
||||
break;
|
||||
case Scalar::Uint32:
|
||||
// At the moment, the code in MCallOptimize.cpp requires the output
|
||||
// type to be double for uint32 arrays. See bug 1077305.
|
||||
MOZ_ASSERT(output.isFloat());
|
||||
compareExchange32(mem, oldval, newval, valueTemp, offsetTemp, maskTemp, temp);
|
||||
convertUInt32ToDouble(temp, output.fpu());
|
||||
break;
|
||||
default:
|
||||
MOZ_CRASH("Invalid typed array type");
|
||||
}
|
||||
}
|
||||
|
||||
template void
|
||||
MacroAssemblerMIPS64Compat::compareExchangeToTypedIntArray(Scalar::Type arrayType, const Address& mem,
|
||||
Register oldval, Register newval, Register temp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp,
|
||||
AnyRegister output);
|
||||
template void
|
||||
MacroAssemblerMIPS64Compat::compareExchangeToTypedIntArray(Scalar::Type arrayType, const BaseIndex& mem,
|
||||
Register oldval, Register newval, Register temp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp,
|
||||
AnyRegister output);
|
||||
|
||||
template<typename T>
|
||||
void
|
||||
MacroAssemblerMIPS64Compat::atomicExchangeToTypedIntArray(Scalar::Type arrayType, const T& mem,
|
||||
Register value, Register temp, Register valueTemp,
|
||||
Register offsetTemp, Register maskTemp,
|
||||
AnyRegister output)
|
||||
{
|
||||
switch (arrayType) {
|
||||
case Scalar::Int8:
|
||||
atomicExchange8SignExtend(mem, value, valueTemp, offsetTemp, maskTemp, output.gpr());
|
||||
break;
|
||||
case Scalar::Uint8:
|
||||
atomicExchange8ZeroExtend(mem, value, valueTemp, offsetTemp, maskTemp, output.gpr());
|
||||
break;
|
||||
case Scalar::Uint8Clamped:
|
||||
atomicExchange8ZeroExtend(mem, value, valueTemp, offsetTemp, maskTemp, output.gpr());
|
||||
break;
|
||||
case Scalar::Int16:
|
||||
atomicExchange16SignExtend(mem, value, valueTemp, offsetTemp, maskTemp, output.gpr());
|
||||
break;
|
||||
case Scalar::Uint16:
|
||||
atomicExchange16ZeroExtend(mem, value, valueTemp, offsetTemp, maskTemp, output.gpr());
|
||||
break;
|
||||
case Scalar::Int32:
|
||||
atomicExchange32(mem, value, valueTemp, offsetTemp, maskTemp, output.gpr());
|
||||
break;
|
||||
case Scalar::Uint32:
|
||||
// At the moment, the code in MCallOptimize.cpp requires the output
|
||||
// type to be double for uint32 arrays. See bug 1077305.
|
||||
MOZ_ASSERT(output.isFloat());
|
||||
atomicExchange32(mem, value, valueTemp, offsetTemp, maskTemp, temp);
|
||||
convertUInt32ToDouble(temp, output.fpu());
|
||||
break;
|
||||
default:
|
||||
MOZ_CRASH("Invalid typed array type");
|
||||
}
|
||||
}
|
||||
|
||||
template void
|
||||
MacroAssemblerMIPS64Compat::atomicExchangeToTypedIntArray(Scalar::Type arrayType, const Address& mem,
|
||||
Register value, Register temp, Register valueTemp,
|
||||
Register offsetTemp, Register maskTemp,
|
||||
AnyRegister output);
|
||||
template void
|
||||
MacroAssemblerMIPS64Compat::atomicExchangeToTypedIntArray(Scalar::Type arrayType, const BaseIndex& mem,
|
||||
Register value, Register temp, Register valueTemp,
|
||||
Register offsetTemp, Register maskTemp,
|
||||
AnyRegister output);
|
||||
|
||||
CodeOffsetLabel
|
||||
MacroAssemblerMIPS64Compat::toggledJump(Label* label)
|
||||
{
|
||||
|
|
|
@ -772,219 +772,322 @@ class MacroAssemblerMIPS64Compat : public MacroAssemblerMIPS64
|
|||
// The following functions are exposed for use in platform-shared code.
|
||||
|
||||
template<typename T>
|
||||
void compareExchange8SignExtend(const T& mem, Register oldval, Register newval, Register output)
|
||||
void compareExchange8SignExtend(const T& mem, Register oldval, Register newval, Register valueTemp,
|
||||
Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
MOZ_CRASH("NYI");
|
||||
compareExchange(1, true, mem, oldval, newval, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T>
|
||||
void compareExchange8ZeroExtend(const T& mem, Register oldval, Register newval, Register output)
|
||||
void compareExchange8ZeroExtend(const T& mem, Register oldval, Register newval, Register valueTemp,
|
||||
Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
MOZ_CRASH("NYI");
|
||||
compareExchange(1, false, mem, oldval, newval, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T>
|
||||
void compareExchange16SignExtend(const T& mem, Register oldval, Register newval, Register output)
|
||||
void compareExchange16SignExtend(const T& mem, Register oldval, Register newval, Register valueTemp,
|
||||
Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
MOZ_CRASH("NYI");
|
||||
compareExchange(2, true, mem, oldval, newval, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T>
|
||||
void compareExchange16ZeroExtend(const T& mem, Register oldval, Register newval, Register output)
|
||||
void compareExchange16ZeroExtend(const T& mem, Register oldval, Register newval, Register valueTemp,
|
||||
Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
MOZ_CRASH("NYI");
|
||||
compareExchange(2, false, mem, oldval, newval, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T>
|
||||
void compareExchange32(const T& mem, Register oldval, Register newval, Register output)
|
||||
void compareExchange32(const T& mem, Register oldval, Register newval, Register valueTemp,
|
||||
Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
MOZ_CRASH("NYI");
|
||||
compareExchange(4, false, mem, oldval, newval, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void atomicExchange8SignExtend(const T& mem, Register value, Register output)
|
||||
void atomicExchange8SignExtend(const T& mem, Register value, Register valueTemp,
|
||||
Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
MOZ_CRASH("NYI");
|
||||
atomicExchange(1, true, mem, value, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T>
|
||||
void atomicExchange8ZeroExtend(const T& mem, Register value, Register output)
|
||||
void atomicExchange8ZeroExtend(const T& mem, Register value, Register valueTemp,
|
||||
Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
MOZ_CRASH("NYI");
|
||||
atomicExchange(1, false, mem, value, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T>
|
||||
void atomicExchange16SignExtend(const T& mem, Register value, Register output)
|
||||
void atomicExchange16SignExtend(const T& mem, Register value, Register valueTemp,
|
||||
Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
MOZ_CRASH("NYI");
|
||||
atomicExchange(2, true, mem, value, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T>
|
||||
void atomicExchange16ZeroExtend(const T& mem, Register value, Register output)
|
||||
void atomicExchange16ZeroExtend(const T& mem, Register value, Register valueTemp,
|
||||
Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
MOZ_CRASH("NYI");
|
||||
atomicExchange(2, false, mem, value, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T>
|
||||
void atomicExchange32(const T& mem, Register value, Register output)
|
||||
void atomicExchange32(const T& mem, Register value, Register valueTemp,
|
||||
Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
MOZ_CRASH("NYI");
|
||||
atomicExchange(4, false, mem, value, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
|
||||
template<typename T, typename S>
|
||||
void atomicFetchAdd8SignExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchAdd8SignExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(1, true, AtomicFetchAddOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchAdd8ZeroExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchAdd8ZeroExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(1, false, AtomicFetchAddOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchAdd16SignExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchAdd16SignExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(2, true, AtomicFetchAddOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchAdd16ZeroExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchAdd16ZeroExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(2, false, AtomicFetchAddOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchAdd32(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchAdd32(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(4, false, AtomicFetchAddOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template <typename T, typename S>
|
||||
void atomicAdd8(const T& value, const S& mem) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicAdd8(const T& value, const S& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp)
|
||||
{
|
||||
atomicEffectOp(1, AtomicFetchAddOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp);
|
||||
}
|
||||
template <typename T, typename S>
|
||||
void atomicAdd16(const T& value, const S& mem) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicAdd16(const T& value, const S& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp)
|
||||
{
|
||||
atomicEffectOp(2, AtomicFetchAddOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp);
|
||||
}
|
||||
template <typename T, typename S>
|
||||
void atomicAdd32(const T& value, const S& mem) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicAdd32(const T& value, const S& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp)
|
||||
{
|
||||
atomicEffectOp(4, AtomicFetchAddOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp);
|
||||
}
|
||||
|
||||
template<typename T, typename S>
|
||||
void atomicFetchSub8SignExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchSub8SignExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(1, true, AtomicFetchSubOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchSub8ZeroExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchSub8ZeroExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(1, false, AtomicFetchSubOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchSub16SignExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchSub16SignExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(2, true, AtomicFetchSubOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchSub16ZeroExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchSub16ZeroExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(2, false, AtomicFetchSubOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchSub32(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchSub32(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(4, false, AtomicFetchSubOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template <typename T, typename S> void atomicSub8(const T& value, const S& mem) {
|
||||
MOZ_CRASH("NYI");
|
||||
template <typename T, typename S>
|
||||
void atomicSub8(const T& value, const S& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp)
|
||||
{
|
||||
atomicEffectOp(1, AtomicFetchSubOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp);
|
||||
}
|
||||
template <typename T, typename S> void atomicSub16(const T& value, const S& mem) {
|
||||
MOZ_CRASH("NYI");
|
||||
template <typename T, typename S>
|
||||
void atomicSub16(const T& value, const S& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp)
|
||||
{
|
||||
atomicEffectOp(2, AtomicFetchSubOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp);
|
||||
}
|
||||
template <typename T, typename S> void atomicSub32(const T& value, const S& mem) {
|
||||
MOZ_CRASH("NYI");
|
||||
template <typename T, typename S>
|
||||
void atomicSub32(const T& value, const S& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp)
|
||||
{
|
||||
atomicEffectOp(4, AtomicFetchSubOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp);
|
||||
}
|
||||
|
||||
template<typename T, typename S>
|
||||
void atomicFetchAnd8SignExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchAnd8SignExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(1, true, AtomicFetchAndOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchAnd8ZeroExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchAnd8ZeroExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(1, false, AtomicFetchAndOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchAnd16SignExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchAnd16SignExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(2, true, AtomicFetchAndOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchAnd16ZeroExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchAnd16ZeroExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(2, false, AtomicFetchAndOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchAnd32(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchAnd32(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(4, false, AtomicFetchAndOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template <typename T, typename S>
|
||||
void atomicAnd8(const T& value, const S& mem) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicAnd8(const T& value, const S& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp)
|
||||
{
|
||||
atomicEffectOp(1, AtomicFetchAndOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp);
|
||||
}
|
||||
template <typename T, typename S>
|
||||
void atomicAnd16(const T& value, const S& mem) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicAnd16(const T& value, const S& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp)
|
||||
{
|
||||
atomicEffectOp(2, AtomicFetchAndOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp);
|
||||
}
|
||||
template <typename T, typename S>
|
||||
void atomicAnd32(const T& value, const S& mem) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicAnd32(const T& value, const S& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp)
|
||||
{
|
||||
atomicEffectOp(4, AtomicFetchAndOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp);
|
||||
}
|
||||
|
||||
template<typename T, typename S>
|
||||
void atomicFetchOr8SignExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchOr8SignExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(1, true, AtomicFetchOrOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchOr8ZeroExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchOr8ZeroExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(1, false, AtomicFetchOrOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchOr16SignExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchOr16SignExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(2, true, AtomicFetchOrOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchOr16ZeroExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchOr16ZeroExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(2, false, AtomicFetchOrOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchOr32(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchOr32(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(4, false, AtomicFetchOrOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template <typename T, typename S>
|
||||
void atomicOr8(const T& value, const S& mem) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicOr8(const T& value, const S& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp)
|
||||
{
|
||||
atomicEffectOp(1, AtomicFetchOrOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp);
|
||||
}
|
||||
template <typename T, typename S>
|
||||
void atomicOr16(const T& value, const S& mem) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicOr16(const T& value, const S& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp)
|
||||
{
|
||||
atomicEffectOp(2, AtomicFetchOrOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp);
|
||||
}
|
||||
template <typename T, typename S>
|
||||
void atomicOr32(const T& value, const S& mem) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicOr32(const T& value, const S& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp)
|
||||
{
|
||||
atomicEffectOp(4, AtomicFetchOrOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp);
|
||||
}
|
||||
|
||||
template<typename T, typename S>
|
||||
void atomicFetchXor8SignExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchXor8SignExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(1, true, AtomicFetchXorOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchXor8ZeroExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchXor8ZeroExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(1, false, AtomicFetchXorOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchXor16SignExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchXor16SignExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(2, true, AtomicFetchXorOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchXor16ZeroExtend(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchXor16ZeroExtend(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(2, false, AtomicFetchXorOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template<typename T, typename S>
|
||||
void atomicFetchXor32(const S& value, const T& mem, Register temp, Register output) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicFetchXor32(const S& value, const T& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp, Register output)
|
||||
{
|
||||
atomicFetchOp(4, false, AtomicFetchXorOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp, output);
|
||||
}
|
||||
template <typename T, typename S>
|
||||
void atomicXor8(const T& value, const S& mem) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicXor8(const T& value, const S& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp)
|
||||
{
|
||||
atomicEffectOp(1, AtomicFetchXorOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp);
|
||||
}
|
||||
template <typename T, typename S>
|
||||
void atomicXor16(const T& value, const S& mem) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicXor16(const T& value, const S& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp)
|
||||
{
|
||||
atomicEffectOp(2, AtomicFetchXorOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp);
|
||||
}
|
||||
template <typename T, typename S>
|
||||
void atomicXor32(const T& value, const S& mem) {
|
||||
MOZ_CRASH("NYI");
|
||||
void atomicXor32(const T& value, const S& mem, Register flagTemp,
|
||||
Register valueTemp, Register offsetTemp, Register maskTemp)
|
||||
{
|
||||
atomicEffectOp(4, AtomicFetchXorOp, value, mem, flagTemp, valueTemp, offsetTemp, maskTemp);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void compareExchangeToTypedIntArray(Scalar::Type arrayType, const T& mem, Register oldval, Register newval,
|
||||
Register temp, Register valueTemp, Register offsetTemp, Register maskTemp,
|
||||
AnyRegister output);
|
||||
|
||||
template<typename T>
|
||||
void atomicExchangeToTypedIntArray(Scalar::Type arrayType, const T& mem, Register value,
|
||||
Register temp, Register valueTemp, Register offsetTemp, Register maskTemp,
|
||||
AnyRegister output);
|
||||
|
||||
void add32(Register src, Register dest);
|
||||
void add32(Imm32 imm, Register dest);
|
||||
void add32(Imm32 imm, const Address& dest);
|
||||
|
|
Загрузка…
Ссылка в новой задаче