Example #1
0
bool
RSimdBox::recover(JSContext* cx, SnapshotIterator& iter) const
{
    JSObject* resultObject = nullptr;
    RValueAllocation a = iter.readAllocation();
    MOZ_ASSERT(iter.allocationReadable(a));
    const FloatRegisters::RegisterContent* raw = iter.floatAllocationPointer(a);
    switch (SimdTypeDescr::Type(type_)) {
      case SimdTypeDescr::Bool32x4:
        MOZ_ASSERT_IF(a.mode() == RValueAllocation::ANY_FLOAT_REG,
                      a.fpuReg().isSimd128());
        resultObject = js::CreateSimd<Bool32x4>(cx, (const Bool32x4::Elem*) raw);
        break;
      case SimdTypeDescr::Int32x4:
        MOZ_ASSERT_IF(a.mode() == RValueAllocation::ANY_FLOAT_REG,
                      a.fpuReg().isSimd128());
        resultObject = js::CreateSimd<Int32x4>(cx, (const Int32x4::Elem*) raw);
        break;
      case SimdTypeDescr::Float32x4:
        MOZ_ASSERT_IF(a.mode() == RValueAllocation::ANY_FLOAT_REG,
                      a.fpuReg().isSimd128());
        resultObject = js::CreateSimd<Float32x4>(cx, (const Float32x4::Elem*) raw);
        break;
      case SimdTypeDescr::Float64x2:
        MOZ_CRASH("NYI, RSimdBox of Float64x2");
        break;
      case SimdTypeDescr::Int8x16:
        MOZ_CRASH("NYI, RSimdBox of Int8x16");
        break;
      case SimdTypeDescr::Int16x8:
        MOZ_CRASH("NYI, RSimdBox of Int16x8");
        break;
      case SimdTypeDescr::Uint8x16:
        MOZ_CRASH("NYI, RSimdBox of UInt8x16");
        break;
      case SimdTypeDescr::Uint16x8:
        MOZ_CRASH("NYI, RSimdBox of UInt16x8");
        break;
      case SimdTypeDescr::Uint32x4:
        MOZ_CRASH("NYI, RSimdBox of UInt32x4");
        break;
      case SimdTypeDescr::Bool8x16:
        MOZ_CRASH("NYI, RSimdBox of Bool8x16");
        break;
      case SimdTypeDescr::Bool16x8:
        MOZ_CRASH("NYI, RSimdBox of Bool16x8");
        break;
      case SimdTypeDescr::Bool64x2:
        MOZ_CRASH("NYI, RSimdBox of Bool64x2");
        break;
    }

    if (!resultObject)
        return false;

    RootedValue result(cx);
    result.setObject(*resultObject);
    iter.storeInstructionResult(result);
    return true;
}