mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-26 06:11:37 +00:00
Bug 1200809 part 7 - Convert SIMD natives to new InlinableNatives system. r=nbp
This commit is contained in:
parent
3a3a37d452
commit
34f74c8efb
@ -21,6 +21,7 @@
|
|||||||
#include "jsprf.h"
|
#include "jsprf.h"
|
||||||
|
|
||||||
#include "builtin/TypedObject.h"
|
#include "builtin/TypedObject.h"
|
||||||
|
#include "jit/InlinableNatives.h"
|
||||||
#include "js/Value.h"
|
#include "js/Value.h"
|
||||||
|
|
||||||
#include "jsobjinlines.h"
|
#include "jsobjinlines.h"
|
||||||
@ -244,7 +245,7 @@ const JSFunctionSpec Float32x4Defn::TypedObjectMethods[] = {
|
|||||||
|
|
||||||
const JSFunctionSpec Float32x4Defn::Methods[] = {
|
const JSFunctionSpec Float32x4Defn::Methods[] = {
|
||||||
#define SIMD_FLOAT32X4_FUNCTION_ITEM(Name, Func, Operands) \
|
#define SIMD_FLOAT32X4_FUNCTION_ITEM(Name, Func, Operands) \
|
||||||
JS_FN(#Name, js::simd_float32x4_##Name, Operands, 0),
|
JS_INLINABLE_FN(#Name, js::simd_float32x4_##Name, Operands, 0, SimdFloat32x4),
|
||||||
FLOAT32X4_FUNCTION_LIST(SIMD_FLOAT32X4_FUNCTION_ITEM)
|
FLOAT32X4_FUNCTION_LIST(SIMD_FLOAT32X4_FUNCTION_ITEM)
|
||||||
#undef SIMD_FLOAT32x4_FUNCTION_ITEM
|
#undef SIMD_FLOAT32x4_FUNCTION_ITEM
|
||||||
JS_FS_END
|
JS_FS_END
|
||||||
@ -344,7 +345,7 @@ const JSFunctionSpec Int32x4Defn::TypedObjectMethods[] = {
|
|||||||
|
|
||||||
const JSFunctionSpec Int32x4Defn::Methods[] = {
|
const JSFunctionSpec Int32x4Defn::Methods[] = {
|
||||||
#define SIMD_INT32X4_FUNCTION_ITEM(Name, Func, Operands) \
|
#define SIMD_INT32X4_FUNCTION_ITEM(Name, Func, Operands) \
|
||||||
JS_FN(#Name, js::simd_int32x4_##Name, Operands, 0),
|
JS_INLINABLE_FN(#Name, js::simd_int32x4_##Name, Operands, 0, SimdInt32x4),
|
||||||
INT32X4_FUNCTION_LIST(SIMD_INT32X4_FUNCTION_ITEM)
|
INT32X4_FUNCTION_LIST(SIMD_INT32X4_FUNCTION_ITEM)
|
||||||
#undef SIMD_INT32X4_FUNCTION_ITEM
|
#undef SIMD_INT32X4_FUNCTION_ITEM
|
||||||
JS_FS_END
|
JS_FS_END
|
||||||
|
@ -79,6 +79,9 @@
|
|||||||
\
|
\
|
||||||
_(CallBoundFunction) \
|
_(CallBoundFunction) \
|
||||||
\
|
\
|
||||||
|
_(SimdInt32x4) \
|
||||||
|
_(SimdFloat32x4) \
|
||||||
|
\
|
||||||
_(TestBailout) \
|
_(TestBailout) \
|
||||||
_(TestAssertFloat32) \
|
_(TestAssertFloat32) \
|
||||||
_(TestAssertRecoveredOnBailout) \
|
_(TestAssertRecoveredOnBailout) \
|
||||||
|
@ -842,6 +842,9 @@ class IonBuilder
|
|||||||
IonBuilder::InliningStatus boxSimd(CallInfo& callInfo, MInstruction* ins,
|
IonBuilder::InliningStatus boxSimd(CallInfo& callInfo, MInstruction* ins,
|
||||||
InlineTypedObject* templateObj);
|
InlineTypedObject* templateObj);
|
||||||
|
|
||||||
|
InliningStatus inlineSimdInt32x4(CallInfo& callInfo, JSNative native);
|
||||||
|
InliningStatus inlineSimdFloat32x4(CallInfo& callInfo, JSNative native);
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
InliningStatus inlineBinarySimd(CallInfo& callInfo, JSNative native,
|
InliningStatus inlineBinarySimd(CallInfo& callInfo, JSNative native,
|
||||||
typename T::Operation op, SimdTypeDescr::Type type);
|
typename T::Operation op, SimdTypeDescr::Type type);
|
||||||
|
@ -39,7 +39,6 @@ IonBuilder::InliningStatus
|
|||||||
IonBuilder::inlineNativeCall(CallInfo& callInfo, JSFunction* target)
|
IonBuilder::inlineNativeCall(CallInfo& callInfo, JSFunction* target)
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(target->isNative());
|
MOZ_ASSERT(target->isNative());
|
||||||
JSNative native = target->native();
|
|
||||||
|
|
||||||
if (!optimizationInfo().inlineNative()) {
|
if (!optimizationInfo().inlineNative()) {
|
||||||
trackOptimizationOutcome(TrackedOutcome::CantInlineDisabledIon);
|
trackOptimizationOutcome(TrackedOutcome::CantInlineDisabledIon);
|
||||||
@ -56,151 +55,6 @@ IonBuilder::inlineNativeCall(CallInfo& callInfo, JSFunction* target)
|
|||||||
return InliningStatus_NotInlined;
|
return InliningStatus_NotInlined;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Simd functions
|
|
||||||
#define INLINE_FLOAT32X4_SIMD_ARITH_(OP) \
|
|
||||||
if (native == js::simd_float32x4_##OP) \
|
|
||||||
return inlineBinarySimd<MSimdBinaryArith>(callInfo, native, MSimdBinaryArith::Op_##OP, \
|
|
||||||
SimdTypeDescr::Float32x4);
|
|
||||||
|
|
||||||
#define INLINE_INT32X4_SIMD_ARITH_(OP) \
|
|
||||||
if (native == js::simd_int32x4_##OP) \
|
|
||||||
return inlineBinarySimd<MSimdBinaryArith>(callInfo, native, MSimdBinaryArith::Op_##OP, \
|
|
||||||
SimdTypeDescr::Int32x4);
|
|
||||||
|
|
||||||
ARITH_COMMONX4_SIMD_OP(INLINE_INT32X4_SIMD_ARITH_)
|
|
||||||
ARITH_COMMONX4_SIMD_OP(INLINE_FLOAT32X4_SIMD_ARITH_)
|
|
||||||
BINARY_ARITH_FLOAT32X4_SIMD_OP(INLINE_FLOAT32X4_SIMD_ARITH_)
|
|
||||||
#undef INLINE_SIMD_ARITH_
|
|
||||||
#undef INLINE_FLOAT32X4_SIMD_ARITH_
|
|
||||||
|
|
||||||
#define INLINE_SIMD_BITWISE_(OP) \
|
|
||||||
if (native == js::simd_int32x4_##OP) \
|
|
||||||
return inlineBinarySimd<MSimdBinaryBitwise>(callInfo, native, MSimdBinaryBitwise::OP##_, \
|
|
||||||
SimdTypeDescr::Int32x4); \
|
|
||||||
if (native == js::simd_float32x4_##OP) \
|
|
||||||
return inlineBinarySimd<MSimdBinaryBitwise>(callInfo, native, MSimdBinaryBitwise::OP##_, \
|
|
||||||
SimdTypeDescr::Float32x4);
|
|
||||||
|
|
||||||
BITWISE_COMMONX4_SIMD_OP(INLINE_SIMD_BITWISE_)
|
|
||||||
#undef INLINE_SIMD_BITWISE_
|
|
||||||
|
|
||||||
if (native == js::simd_int32x4_shiftLeftByScalar)
|
|
||||||
return inlineBinarySimd<MSimdShift>(callInfo, native, MSimdShift::lsh, SimdTypeDescr::Int32x4);
|
|
||||||
if (native == js::simd_int32x4_shiftRightArithmeticByScalar)
|
|
||||||
return inlineBinarySimd<MSimdShift>(callInfo, native, MSimdShift::rsh, SimdTypeDescr::Int32x4);
|
|
||||||
if (native == js::simd_int32x4_shiftRightLogicalByScalar)
|
|
||||||
return inlineBinarySimd<MSimdShift>(callInfo, native, MSimdShift::ursh, SimdTypeDescr::Int32x4);
|
|
||||||
|
|
||||||
#define INLINE_SIMD_COMPARISON_(OP) \
|
|
||||||
if (native == js::simd_int32x4_##OP) \
|
|
||||||
return inlineCompSimd(callInfo, native, MSimdBinaryComp::OP, SimdTypeDescr::Int32x4); \
|
|
||||||
if (native == js::simd_float32x4_##OP) \
|
|
||||||
return inlineCompSimd(callInfo, native, MSimdBinaryComp::OP, SimdTypeDescr::Float32x4);
|
|
||||||
|
|
||||||
COMP_COMMONX4_TO_INT32X4_SIMD_OP(INLINE_SIMD_COMPARISON_)
|
|
||||||
#undef INLINE_SIMD_COMPARISON_
|
|
||||||
|
|
||||||
if (native == js::simd_int32x4_extractLane)
|
|
||||||
return inlineSimdExtractLane(callInfo, native, SimdTypeDescr::Int32x4);
|
|
||||||
if (native == js::simd_float32x4_extractLane)
|
|
||||||
return inlineSimdExtractLane(callInfo, native, SimdTypeDescr::Float32x4);
|
|
||||||
|
|
||||||
if (native == js::simd_int32x4_replaceLane)
|
|
||||||
return inlineSimdReplaceLane(callInfo, native, SimdTypeDescr::Int32x4);
|
|
||||||
if (native == js::simd_float32x4_replaceLane)
|
|
||||||
return inlineSimdReplaceLane(callInfo, native, SimdTypeDescr::Float32x4);
|
|
||||||
|
|
||||||
if (native == js::simd_int32x4_not)
|
|
||||||
return inlineUnarySimd(callInfo, native, MSimdUnaryArith::not_, SimdTypeDescr::Int32x4);
|
|
||||||
if (native == js::simd_int32x4_neg)
|
|
||||||
return inlineUnarySimd(callInfo, native, MSimdUnaryArith::neg, SimdTypeDescr::Int32x4);
|
|
||||||
|
|
||||||
#define INLINE_SIMD_FLOAT32X4_UNARY_(OP) \
|
|
||||||
if (native == js::simd_float32x4_##OP) \
|
|
||||||
return inlineUnarySimd(callInfo, native, MSimdUnaryArith::OP, SimdTypeDescr::Float32x4);
|
|
||||||
|
|
||||||
UNARY_ARITH_FLOAT32X4_SIMD_OP(INLINE_SIMD_FLOAT32X4_UNARY_)
|
|
||||||
INLINE_SIMD_FLOAT32X4_UNARY_(neg)
|
|
||||||
#undef INLINE_SIMD_FLOAT32X4_UNARY_
|
|
||||||
|
|
||||||
if (native == js::simd_float32x4_not)
|
|
||||||
return inlineUnarySimd(callInfo, native, MSimdUnaryArith::not_, SimdTypeDescr::Float32x4);
|
|
||||||
|
|
||||||
typedef bool IsCast;
|
|
||||||
if (native == js::simd_float32x4_fromInt32x4)
|
|
||||||
return inlineSimdConvert(callInfo, native, IsCast(false), SimdTypeDescr::Int32x4, SimdTypeDescr::Float32x4);
|
|
||||||
if (native == js::simd_int32x4_fromFloat32x4)
|
|
||||||
return inlineSimdConvert(callInfo, native, IsCast(false), SimdTypeDescr::Float32x4, SimdTypeDescr::Int32x4);
|
|
||||||
if (native == js::simd_float32x4_fromInt32x4Bits)
|
|
||||||
return inlineSimdConvert(callInfo, native, IsCast(true), SimdTypeDescr::Int32x4, SimdTypeDescr::Float32x4);
|
|
||||||
if (native == js::simd_int32x4_fromFloat32x4Bits)
|
|
||||||
return inlineSimdConvert(callInfo, native, IsCast(true), SimdTypeDescr::Float32x4, SimdTypeDescr::Int32x4);
|
|
||||||
|
|
||||||
if (native == js::simd_int32x4_splat)
|
|
||||||
return inlineSimdSplat(callInfo, native, SimdTypeDescr::Int32x4);
|
|
||||||
if (native == js::simd_float32x4_splat)
|
|
||||||
return inlineSimdSplat(callInfo, native, SimdTypeDescr::Float32x4);
|
|
||||||
|
|
||||||
if (native == js::simd_int32x4_check)
|
|
||||||
return inlineSimdCheck(callInfo, native, SimdTypeDescr::Int32x4);
|
|
||||||
if (native == js::simd_float32x4_check)
|
|
||||||
return inlineSimdCheck(callInfo, native, SimdTypeDescr::Float32x4);
|
|
||||||
|
|
||||||
typedef bool IsElementWise;
|
|
||||||
if (native == js::simd_int32x4_select)
|
|
||||||
return inlineSimdSelect(callInfo, native, IsElementWise(true), SimdTypeDescr::Int32x4);
|
|
||||||
if (native == js::simd_int32x4_selectBits)
|
|
||||||
return inlineSimdSelect(callInfo, native, IsElementWise(false), SimdTypeDescr::Int32x4);
|
|
||||||
if (native == js::simd_float32x4_select)
|
|
||||||
return inlineSimdSelect(callInfo, native, IsElementWise(true), SimdTypeDescr::Float32x4);
|
|
||||||
|
|
||||||
if (native == js::simd_int32x4_swizzle)
|
|
||||||
return inlineSimdShuffle(callInfo, native, SimdTypeDescr::Int32x4, 1, 4);
|
|
||||||
if (native == js::simd_float32x4_swizzle)
|
|
||||||
return inlineSimdShuffle(callInfo, native, SimdTypeDescr::Float32x4, 1, 4);
|
|
||||||
if (native == js::simd_int32x4_shuffle)
|
|
||||||
return inlineSimdShuffle(callInfo, native, SimdTypeDescr::Int32x4, 2, 4);
|
|
||||||
if (native == js::simd_float32x4_shuffle)
|
|
||||||
return inlineSimdShuffle(callInfo, native, SimdTypeDescr::Float32x4, 2, 4);
|
|
||||||
|
|
||||||
if (native == js::simd_int32x4_load)
|
|
||||||
return inlineSimdLoad(callInfo, native, SimdTypeDescr::Int32x4, 4);
|
|
||||||
if (native == js::simd_int32x4_load1)
|
|
||||||
return inlineSimdLoad(callInfo, native, SimdTypeDescr::Int32x4, 1);
|
|
||||||
if (native == js::simd_int32x4_load2)
|
|
||||||
return inlineSimdLoad(callInfo, native, SimdTypeDescr::Int32x4, 2);
|
|
||||||
if (native == js::simd_int32x4_load3)
|
|
||||||
return inlineSimdLoad(callInfo, native, SimdTypeDescr::Int32x4, 3);
|
|
||||||
|
|
||||||
if (native == js::simd_float32x4_load)
|
|
||||||
return inlineSimdLoad(callInfo, native, SimdTypeDescr::Float32x4, 4);
|
|
||||||
if (native == js::simd_float32x4_load1)
|
|
||||||
return inlineSimdLoad(callInfo, native, SimdTypeDescr::Float32x4, 1);
|
|
||||||
if (native == js::simd_float32x4_load2)
|
|
||||||
return inlineSimdLoad(callInfo, native, SimdTypeDescr::Float32x4, 2);
|
|
||||||
if (native == js::simd_float32x4_load3)
|
|
||||||
return inlineSimdLoad(callInfo, native, SimdTypeDescr::Float32x4, 3);
|
|
||||||
|
|
||||||
if (native == js::simd_int32x4_store)
|
|
||||||
return inlineSimdStore(callInfo, native, SimdTypeDescr::Int32x4, 4);
|
|
||||||
if (native == js::simd_int32x4_store1)
|
|
||||||
return inlineSimdStore(callInfo, native, SimdTypeDescr::Int32x4, 1);
|
|
||||||
if (native == js::simd_int32x4_store2)
|
|
||||||
return inlineSimdStore(callInfo, native, SimdTypeDescr::Int32x4, 2);
|
|
||||||
if (native == js::simd_int32x4_store3)
|
|
||||||
return inlineSimdStore(callInfo, native, SimdTypeDescr::Int32x4, 3);
|
|
||||||
if (native == js::simd_float32x4_store)
|
|
||||||
return inlineSimdStore(callInfo, native, SimdTypeDescr::Float32x4, 4);
|
|
||||||
if (native == js::simd_float32x4_store1)
|
|
||||||
return inlineSimdStore(callInfo, native, SimdTypeDescr::Float32x4, 1);
|
|
||||||
if (native == js::simd_float32x4_store2)
|
|
||||||
return inlineSimdStore(callInfo, native, SimdTypeDescr::Float32x4, 2);
|
|
||||||
if (native == js::simd_float32x4_store3)
|
|
||||||
return inlineSimdStore(callInfo, native, SimdTypeDescr::Float32x4, 3);
|
|
||||||
|
|
||||||
if (native == js::simd_int32x4_bool)
|
|
||||||
return inlineSimdBool(callInfo, native, SimdTypeDescr::Int32x4);
|
|
||||||
|
|
||||||
if (!target->jitInfo() || target->jitInfo()->type() != JSJitInfo::InlinableNative) {
|
if (!target->jitInfo() || target->jitInfo()->type() != JSJitInfo::InlinableNative) {
|
||||||
// Reaching here means we tried to inline a native for which there is no
|
// Reaching here means we tried to inline a native for which there is no
|
||||||
// Ion specialization.
|
// Ion specialization.
|
||||||
@ -347,6 +201,12 @@ IonBuilder::inlineNativeCall(CallInfo& callInfo, JSFunction* target)
|
|||||||
case InlinableNative::CallBoundFunction:
|
case InlinableNative::CallBoundFunction:
|
||||||
return inlineBoundFunction(callInfo, target);
|
return inlineBoundFunction(callInfo, target);
|
||||||
|
|
||||||
|
// SIMD natives.
|
||||||
|
case InlinableNative::SimdInt32x4:
|
||||||
|
return inlineSimdInt32x4(callInfo, target->native());
|
||||||
|
case InlinableNative::SimdFloat32x4:
|
||||||
|
return inlineSimdFloat32x4(callInfo, target->native());
|
||||||
|
|
||||||
// Testing functions.
|
// Testing functions.
|
||||||
case InlinableNative::TestBailout:
|
case InlinableNative::TestBailout:
|
||||||
return inlineBailout(callInfo);
|
return inlineBailout(callInfo);
|
||||||
@ -3163,6 +3023,182 @@ IonBuilder::inlineConstructTypedObject(CallInfo& callInfo, TypeDescr* descr)
|
|||||||
return InliningStatus_Inlined;
|
return InliningStatus_Inlined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IonBuilder::InliningStatus
|
||||||
|
IonBuilder::inlineSimdInt32x4(CallInfo& callInfo, JSNative native)
|
||||||
|
{
|
||||||
|
#define INLINE_INT32X4_SIMD_ARITH_(OP) \
|
||||||
|
if (native == js::simd_int32x4_##OP) \
|
||||||
|
return inlineBinarySimd<MSimdBinaryArith>(callInfo, native, MSimdBinaryArith::Op_##OP, \
|
||||||
|
SimdTypeDescr::Int32x4);
|
||||||
|
|
||||||
|
ARITH_COMMONX4_SIMD_OP(INLINE_INT32X4_SIMD_ARITH_)
|
||||||
|
#undef INLINE_INT32X4_SIMD_ARITH_
|
||||||
|
|
||||||
|
#define INLINE_SIMD_BITWISE_(OP) \
|
||||||
|
if (native == js::simd_int32x4_##OP) \
|
||||||
|
return inlineBinarySimd<MSimdBinaryBitwise>(callInfo, native, MSimdBinaryBitwise::OP##_, \
|
||||||
|
SimdTypeDescr::Int32x4);
|
||||||
|
|
||||||
|
BITWISE_COMMONX4_SIMD_OP(INLINE_SIMD_BITWISE_)
|
||||||
|
#undef INLINE_SIMD_BITWISE_
|
||||||
|
|
||||||
|
if (native == js::simd_int32x4_shiftLeftByScalar)
|
||||||
|
return inlineBinarySimd<MSimdShift>(callInfo, native, MSimdShift::lsh, SimdTypeDescr::Int32x4);
|
||||||
|
if (native == js::simd_int32x4_shiftRightArithmeticByScalar)
|
||||||
|
return inlineBinarySimd<MSimdShift>(callInfo, native, MSimdShift::rsh, SimdTypeDescr::Int32x4);
|
||||||
|
if (native == js::simd_int32x4_shiftRightLogicalByScalar)
|
||||||
|
return inlineBinarySimd<MSimdShift>(callInfo, native, MSimdShift::ursh, SimdTypeDescr::Int32x4);
|
||||||
|
|
||||||
|
#define INLINE_SIMD_COMPARISON_(OP) \
|
||||||
|
if (native == js::simd_int32x4_##OP) \
|
||||||
|
return inlineCompSimd(callInfo, native, MSimdBinaryComp::OP, SimdTypeDescr::Int32x4);
|
||||||
|
|
||||||
|
COMP_COMMONX4_TO_INT32X4_SIMD_OP(INLINE_SIMD_COMPARISON_)
|
||||||
|
#undef INLINE_SIMD_COMPARISON_
|
||||||
|
|
||||||
|
if (native == js::simd_int32x4_extractLane)
|
||||||
|
return inlineSimdExtractLane(callInfo, native, SimdTypeDescr::Int32x4);
|
||||||
|
if (native == js::simd_int32x4_replaceLane)
|
||||||
|
return inlineSimdReplaceLane(callInfo, native, SimdTypeDescr::Int32x4);
|
||||||
|
|
||||||
|
if (native == js::simd_int32x4_not)
|
||||||
|
return inlineUnarySimd(callInfo, native, MSimdUnaryArith::not_, SimdTypeDescr::Int32x4);
|
||||||
|
if (native == js::simd_int32x4_neg)
|
||||||
|
return inlineUnarySimd(callInfo, native, MSimdUnaryArith::neg, SimdTypeDescr::Int32x4);
|
||||||
|
|
||||||
|
typedef bool IsCast;
|
||||||
|
if (native == js::simd_int32x4_fromFloat32x4)
|
||||||
|
return inlineSimdConvert(callInfo, native, IsCast(false), SimdTypeDescr::Float32x4, SimdTypeDescr::Int32x4);
|
||||||
|
if (native == js::simd_int32x4_fromFloat32x4Bits)
|
||||||
|
return inlineSimdConvert(callInfo, native, IsCast(true), SimdTypeDescr::Float32x4, SimdTypeDescr::Int32x4);
|
||||||
|
|
||||||
|
if (native == js::simd_int32x4_splat)
|
||||||
|
return inlineSimdSplat(callInfo, native, SimdTypeDescr::Int32x4);
|
||||||
|
|
||||||
|
if (native == js::simd_int32x4_check)
|
||||||
|
return inlineSimdCheck(callInfo, native, SimdTypeDescr::Int32x4);
|
||||||
|
|
||||||
|
typedef bool IsElementWise;
|
||||||
|
if (native == js::simd_int32x4_select)
|
||||||
|
return inlineSimdSelect(callInfo, native, IsElementWise(true), SimdTypeDescr::Int32x4);
|
||||||
|
if (native == js::simd_int32x4_selectBits)
|
||||||
|
return inlineSimdSelect(callInfo, native, IsElementWise(false), SimdTypeDescr::Int32x4);
|
||||||
|
|
||||||
|
if (native == js::simd_int32x4_swizzle)
|
||||||
|
return inlineSimdShuffle(callInfo, native, SimdTypeDescr::Int32x4, 1, 4);
|
||||||
|
if (native == js::simd_int32x4_shuffle)
|
||||||
|
return inlineSimdShuffle(callInfo, native, SimdTypeDescr::Int32x4, 2, 4);
|
||||||
|
|
||||||
|
if (native == js::simd_int32x4_load)
|
||||||
|
return inlineSimdLoad(callInfo, native, SimdTypeDescr::Int32x4, 4);
|
||||||
|
if (native == js::simd_int32x4_load1)
|
||||||
|
return inlineSimdLoad(callInfo, native, SimdTypeDescr::Int32x4, 1);
|
||||||
|
if (native == js::simd_int32x4_load2)
|
||||||
|
return inlineSimdLoad(callInfo, native, SimdTypeDescr::Int32x4, 2);
|
||||||
|
if (native == js::simd_int32x4_load3)
|
||||||
|
return inlineSimdLoad(callInfo, native, SimdTypeDescr::Int32x4, 3);
|
||||||
|
|
||||||
|
if (native == js::simd_int32x4_store)
|
||||||
|
return inlineSimdStore(callInfo, native, SimdTypeDescr::Int32x4, 4);
|
||||||
|
if (native == js::simd_int32x4_store1)
|
||||||
|
return inlineSimdStore(callInfo, native, SimdTypeDescr::Int32x4, 1);
|
||||||
|
if (native == js::simd_int32x4_store2)
|
||||||
|
return inlineSimdStore(callInfo, native, SimdTypeDescr::Int32x4, 2);
|
||||||
|
if (native == js::simd_int32x4_store3)
|
||||||
|
return inlineSimdStore(callInfo, native, SimdTypeDescr::Int32x4, 3);
|
||||||
|
|
||||||
|
if (native == js::simd_int32x4_bool)
|
||||||
|
return inlineSimdBool(callInfo, native, SimdTypeDescr::Int32x4);
|
||||||
|
|
||||||
|
return InliningStatus_NotInlined;
|
||||||
|
}
|
||||||
|
|
||||||
|
IonBuilder::InliningStatus
|
||||||
|
IonBuilder::inlineSimdFloat32x4(CallInfo& callInfo, JSNative native)
|
||||||
|
{
|
||||||
|
// Simd functions
|
||||||
|
#define INLINE_FLOAT32X4_SIMD_ARITH_(OP) \
|
||||||
|
if (native == js::simd_float32x4_##OP) \
|
||||||
|
return inlineBinarySimd<MSimdBinaryArith>(callInfo, native, MSimdBinaryArith::Op_##OP, \
|
||||||
|
SimdTypeDescr::Float32x4);
|
||||||
|
|
||||||
|
ARITH_COMMONX4_SIMD_OP(INLINE_FLOAT32X4_SIMD_ARITH_)
|
||||||
|
BINARY_ARITH_FLOAT32X4_SIMD_OP(INLINE_FLOAT32X4_SIMD_ARITH_)
|
||||||
|
#undef INLINE_FLOAT32X4_SIMD_ARITH_
|
||||||
|
|
||||||
|
#define INLINE_SIMD_BITWISE_(OP) \
|
||||||
|
if (native == js::simd_float32x4_##OP) \
|
||||||
|
return inlineBinarySimd<MSimdBinaryBitwise>(callInfo, native, MSimdBinaryBitwise::OP##_, \
|
||||||
|
SimdTypeDescr::Float32x4);
|
||||||
|
|
||||||
|
BITWISE_COMMONX4_SIMD_OP(INLINE_SIMD_BITWISE_)
|
||||||
|
#undef INLINE_SIMD_BITWISE_
|
||||||
|
|
||||||
|
#define INLINE_SIMD_COMPARISON_(OP) \
|
||||||
|
if (native == js::simd_float32x4_##OP) \
|
||||||
|
return inlineCompSimd(callInfo, native, MSimdBinaryComp::OP, SimdTypeDescr::Float32x4);
|
||||||
|
|
||||||
|
COMP_COMMONX4_TO_INT32X4_SIMD_OP(INLINE_SIMD_COMPARISON_)
|
||||||
|
#undef INLINE_SIMD_COMPARISON_
|
||||||
|
|
||||||
|
if (native == js::simd_float32x4_extractLane)
|
||||||
|
return inlineSimdExtractLane(callInfo, native, SimdTypeDescr::Float32x4);
|
||||||
|
if (native == js::simd_float32x4_replaceLane)
|
||||||
|
return inlineSimdReplaceLane(callInfo, native, SimdTypeDescr::Float32x4);
|
||||||
|
|
||||||
|
#define INLINE_SIMD_FLOAT32X4_UNARY_(OP) \
|
||||||
|
if (native == js::simd_float32x4_##OP) \
|
||||||
|
return inlineUnarySimd(callInfo, native, MSimdUnaryArith::OP, SimdTypeDescr::Float32x4);
|
||||||
|
|
||||||
|
UNARY_ARITH_FLOAT32X4_SIMD_OP(INLINE_SIMD_FLOAT32X4_UNARY_)
|
||||||
|
INLINE_SIMD_FLOAT32X4_UNARY_(neg)
|
||||||
|
#undef INLINE_SIMD_FLOAT32X4_UNARY_
|
||||||
|
|
||||||
|
if (native == js::simd_float32x4_not)
|
||||||
|
return inlineUnarySimd(callInfo, native, MSimdUnaryArith::not_, SimdTypeDescr::Float32x4);
|
||||||
|
|
||||||
|
typedef bool IsCast;
|
||||||
|
if (native == js::simd_float32x4_fromInt32x4)
|
||||||
|
return inlineSimdConvert(callInfo, native, IsCast(false), SimdTypeDescr::Int32x4, SimdTypeDescr::Float32x4);
|
||||||
|
if (native == js::simd_float32x4_fromInt32x4Bits)
|
||||||
|
return inlineSimdConvert(callInfo, native, IsCast(true), SimdTypeDescr::Int32x4, SimdTypeDescr::Float32x4);
|
||||||
|
|
||||||
|
if (native == js::simd_float32x4_splat)
|
||||||
|
return inlineSimdSplat(callInfo, native, SimdTypeDescr::Float32x4);
|
||||||
|
|
||||||
|
if (native == js::simd_float32x4_check)
|
||||||
|
return inlineSimdCheck(callInfo, native, SimdTypeDescr::Float32x4);
|
||||||
|
|
||||||
|
typedef bool IsElementWise;
|
||||||
|
if (native == js::simd_float32x4_select)
|
||||||
|
return inlineSimdSelect(callInfo, native, IsElementWise(true), SimdTypeDescr::Float32x4);
|
||||||
|
|
||||||
|
if (native == js::simd_float32x4_swizzle)
|
||||||
|
return inlineSimdShuffle(callInfo, native, SimdTypeDescr::Float32x4, 1, 4);
|
||||||
|
if (native == js::simd_float32x4_shuffle)
|
||||||
|
return inlineSimdShuffle(callInfo, native, SimdTypeDescr::Float32x4, 2, 4);
|
||||||
|
|
||||||
|
if (native == js::simd_float32x4_load)
|
||||||
|
return inlineSimdLoad(callInfo, native, SimdTypeDescr::Float32x4, 4);
|
||||||
|
if (native == js::simd_float32x4_load1)
|
||||||
|
return inlineSimdLoad(callInfo, native, SimdTypeDescr::Float32x4, 1);
|
||||||
|
if (native == js::simd_float32x4_load2)
|
||||||
|
return inlineSimdLoad(callInfo, native, SimdTypeDescr::Float32x4, 2);
|
||||||
|
if (native == js::simd_float32x4_load3)
|
||||||
|
return inlineSimdLoad(callInfo, native, SimdTypeDescr::Float32x4, 3);
|
||||||
|
|
||||||
|
if (native == js::simd_float32x4_store)
|
||||||
|
return inlineSimdStore(callInfo, native, SimdTypeDescr::Float32x4, 4);
|
||||||
|
if (native == js::simd_float32x4_store1)
|
||||||
|
return inlineSimdStore(callInfo, native, SimdTypeDescr::Float32x4, 1);
|
||||||
|
if (native == js::simd_float32x4_store2)
|
||||||
|
return inlineSimdStore(callInfo, native, SimdTypeDescr::Float32x4, 2);
|
||||||
|
if (native == js::simd_float32x4_store3)
|
||||||
|
return inlineSimdStore(callInfo, native, SimdTypeDescr::Float32x4, 3);
|
||||||
|
|
||||||
|
return InliningStatus_NotInlined;
|
||||||
|
}
|
||||||
|
|
||||||
IonBuilder::InliningStatus
|
IonBuilder::InliningStatus
|
||||||
IonBuilder::inlineConstructSimdObject(CallInfo& callInfo, SimdTypeDescr* descr)
|
IonBuilder::inlineConstructSimdObject(CallInfo& callInfo, SimdTypeDescr* descr)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user