mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-15 06:15:43 +00:00
Bug 1072927: Use macros for specifying which ops are valid for which SIMD type; r=luke
This commit is contained in:
parent
ce04a8cf49
commit
388cc90c2b
@ -348,68 +348,31 @@ ValidateSimdOperation(JSContext *cx, AsmJSModule::Global &global, HandleValue gl
|
||||
|
||||
Native native = nullptr;
|
||||
switch (global.simdOperationType()) {
|
||||
#define SET_NATIVE_INT32X4(op) case AsmJSSimdOperation_##op: native = simd_int32x4_##op; break;
|
||||
#define SET_NATIVE_FLOAT32X4(op) case AsmJSSimdOperation_##op: native = simd_float32x4_##op; break;
|
||||
#define FALLTHROUGH(op) case AsmJSSimdOperation_##op:
|
||||
case AsmJSSimdType_int32x4:
|
||||
switch (global.simdOperation()) {
|
||||
case AsmJSSimdOperation_add: native = simd_int32x4_add; break;
|
||||
case AsmJSSimdOperation_sub: native = simd_int32x4_sub; break;
|
||||
case AsmJSSimdOperation_lessThan: native = simd_int32x4_lessThan; break;
|
||||
case AsmJSSimdOperation_greaterThan: native = simd_int32x4_greaterThan; break;
|
||||
case AsmJSSimdOperation_equal: native = simd_int32x4_equal; break;
|
||||
case AsmJSSimdOperation_and: native = simd_int32x4_and; break;
|
||||
case AsmJSSimdOperation_or: native = simd_int32x4_or; break;
|
||||
case AsmJSSimdOperation_xor: native = simd_int32x4_xor; break;
|
||||
case AsmJSSimdOperation_select: native = simd_int32x4_select; break;
|
||||
case AsmJSSimdOperation_splat: native = simd_int32x4_splat; break;
|
||||
case AsmJSSimdOperation_withX: native = simd_int32x4_withX; break;
|
||||
case AsmJSSimdOperation_withY: native = simd_int32x4_withY; break;
|
||||
case AsmJSSimdOperation_withZ: native = simd_int32x4_withZ; break;
|
||||
case AsmJSSimdOperation_withW: native = simd_int32x4_withW; break;
|
||||
case AsmJSSimdOperation_fromFloat32x4: native = simd_int32x4_fromFloat32x4; break;
|
||||
case AsmJSSimdOperation_fromFloat32x4Bits: native = simd_int32x4_fromFloat32x4Bits; break;
|
||||
case AsmJSSimdOperation_lessThanOrEqual:
|
||||
case AsmJSSimdOperation_greaterThanOrEqual:
|
||||
case AsmJSSimdOperation_notEqual:
|
||||
case AsmJSSimdOperation_mul:
|
||||
case AsmJSSimdOperation_div:
|
||||
case AsmJSSimdOperation_max:
|
||||
case AsmJSSimdOperation_min:
|
||||
case AsmJSSimdOperation_fromInt32x4:
|
||||
case AsmJSSimdOperation_fromInt32x4Bits:
|
||||
FOREACH_INT32X4_SIMD_OP(SET_NATIVE_INT32X4)
|
||||
FOREACH_COMMONX4_SIMD_OP(SET_NATIVE_INT32X4)
|
||||
FOREACH_FLOAT32X4_SIMD_OP(FALLTHROUGH)
|
||||
MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE("shouldn't have been validated in the first "
|
||||
"place");
|
||||
}
|
||||
break;
|
||||
case AsmJSSimdType_float32x4:
|
||||
switch (global.simdOperation()) {
|
||||
case AsmJSSimdOperation_add: native = simd_float32x4_add; break;
|
||||
case AsmJSSimdOperation_sub: native = simd_float32x4_sub; break;
|
||||
case AsmJSSimdOperation_mul: native = simd_float32x4_mul; break;
|
||||
case AsmJSSimdOperation_div: native = simd_float32x4_div; break;
|
||||
case AsmJSSimdOperation_max: native = simd_float32x4_max; break;
|
||||
case AsmJSSimdOperation_min: native = simd_float32x4_min; break;
|
||||
case AsmJSSimdOperation_lessThan: native = simd_float32x4_lessThan ; break;
|
||||
case AsmJSSimdOperation_lessThanOrEqual: native = simd_float32x4_lessThanOrEqual; break;
|
||||
case AsmJSSimdOperation_equal: native = simd_float32x4_equal; break;
|
||||
case AsmJSSimdOperation_notEqual: native = simd_float32x4_notEqual ; break;
|
||||
case AsmJSSimdOperation_greaterThan: native = simd_float32x4_greaterThan; break;
|
||||
case AsmJSSimdOperation_greaterThanOrEqual: native = simd_float32x4_greaterThanOrEqual ; break;
|
||||
case AsmJSSimdOperation_and: native = simd_float32x4_and; break;
|
||||
case AsmJSSimdOperation_or: native = simd_float32x4_or; break;
|
||||
case AsmJSSimdOperation_xor: native = simd_float32x4_xor; break;
|
||||
case AsmJSSimdOperation_select: native = simd_float32x4_select; break;
|
||||
case AsmJSSimdOperation_splat: native = simd_float32x4_splat; break;
|
||||
case AsmJSSimdOperation_withX: native = simd_float32x4_withX; break;
|
||||
case AsmJSSimdOperation_withY: native = simd_float32x4_withY; break;
|
||||
case AsmJSSimdOperation_withZ: native = simd_float32x4_withZ; break;
|
||||
case AsmJSSimdOperation_withW: native = simd_float32x4_withW; break;
|
||||
case AsmJSSimdOperation_fromInt32x4: native = simd_float32x4_fromInt32x4; break;
|
||||
case AsmJSSimdOperation_fromInt32x4Bits: native = simd_float32x4_fromInt32x4Bits; break;
|
||||
case AsmJSSimdOperation_fromFloat32x4:
|
||||
case AsmJSSimdOperation_fromFloat32x4Bits:
|
||||
FOREACH_FLOAT32X4_SIMD_OP(SET_NATIVE_FLOAT32X4)
|
||||
FOREACH_COMMONX4_SIMD_OP(SET_NATIVE_FLOAT32X4)
|
||||
FOREACH_INT32X4_SIMD_OP(FALLTHROUGH)
|
||||
MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE("shouldn't have been validated in the first "
|
||||
"place");
|
||||
}
|
||||
break;
|
||||
#undef FALLTHROUGH
|
||||
#undef SET_NATIVE_FLOAT32X4
|
||||
#undef SET_NATIVE_INT32X4
|
||||
#undef SET_NATIVE
|
||||
}
|
||||
if (!native || !IsNativeFunction(v, native))
|
||||
return LinkFail(cx, "bad SIMD.type.* operation");
|
||||
|
@ -76,31 +76,9 @@ enum AsmJSSimdType
|
||||
// Set of known operations, for a given SIMD type (int32x4, float32x4,...)
|
||||
enum AsmJSSimdOperation
|
||||
{
|
||||
AsmJSSimdOperation_add,
|
||||
AsmJSSimdOperation_sub,
|
||||
AsmJSSimdOperation_mul,
|
||||
AsmJSSimdOperation_div,
|
||||
AsmJSSimdOperation_max,
|
||||
AsmJSSimdOperation_min,
|
||||
AsmJSSimdOperation_lessThan,
|
||||
AsmJSSimdOperation_lessThanOrEqual,
|
||||
AsmJSSimdOperation_equal,
|
||||
AsmJSSimdOperation_notEqual,
|
||||
AsmJSSimdOperation_greaterThan,
|
||||
AsmJSSimdOperation_greaterThanOrEqual,
|
||||
AsmJSSimdOperation_and,
|
||||
AsmJSSimdOperation_or,
|
||||
AsmJSSimdOperation_xor,
|
||||
AsmJSSimdOperation_select,
|
||||
AsmJSSimdOperation_splat,
|
||||
AsmJSSimdOperation_withX,
|
||||
AsmJSSimdOperation_withY,
|
||||
AsmJSSimdOperation_withZ,
|
||||
AsmJSSimdOperation_withW,
|
||||
AsmJSSimdOperation_fromInt32x4,
|
||||
AsmJSSimdOperation_fromFloat32x4,
|
||||
AsmJSSimdOperation_fromInt32x4Bits,
|
||||
AsmJSSimdOperation_fromFloat32x4Bits
|
||||
#define ASMJSSIMDOPERATION(op) AsmJSSimdOperation_##op,
|
||||
FORALL_SIMD_OP(ASMJSSIMDOPERATION)
|
||||
#undef ASMJSSIMDOPERATION
|
||||
};
|
||||
|
||||
// These labels describe positions in the prologue/epilogue of functions while
|
||||
|
@ -1406,35 +1406,13 @@ class MOZ_STACK_CLASS ModuleCompiler
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!standardLibrarySimdOpNames_.init() ||
|
||||
!addStandardLibrarySimdOpName("add", AsmJSSimdOperation_add) ||
|
||||
!addStandardLibrarySimdOpName("sub", AsmJSSimdOperation_sub) ||
|
||||
!addStandardLibrarySimdOpName("mul", AsmJSSimdOperation_mul) ||
|
||||
!addStandardLibrarySimdOpName("div", AsmJSSimdOperation_div) ||
|
||||
!addStandardLibrarySimdOpName("lessThanOrEqual", AsmJSSimdOperation_lessThanOrEqual) ||
|
||||
!addStandardLibrarySimdOpName("lessThan", AsmJSSimdOperation_lessThan) ||
|
||||
!addStandardLibrarySimdOpName("equal", AsmJSSimdOperation_equal) ||
|
||||
!addStandardLibrarySimdOpName("notEqual", AsmJSSimdOperation_notEqual) ||
|
||||
!addStandardLibrarySimdOpName("greaterThan", AsmJSSimdOperation_greaterThan) ||
|
||||
!addStandardLibrarySimdOpName("greaterThanOrEqual", AsmJSSimdOperation_greaterThanOrEqual) ||
|
||||
!addStandardLibrarySimdOpName("and", AsmJSSimdOperation_and) ||
|
||||
!addStandardLibrarySimdOpName("or", AsmJSSimdOperation_or) ||
|
||||
!addStandardLibrarySimdOpName("xor", AsmJSSimdOperation_xor) ||
|
||||
!addStandardLibrarySimdOpName("select", AsmJSSimdOperation_select) ||
|
||||
!addStandardLibrarySimdOpName("splat", AsmJSSimdOperation_splat) ||
|
||||
!addStandardLibrarySimdOpName("max", AsmJSSimdOperation_max) ||
|
||||
!addStandardLibrarySimdOpName("min", AsmJSSimdOperation_min) ||
|
||||
!addStandardLibrarySimdOpName("withX", AsmJSSimdOperation_withX) ||
|
||||
!addStandardLibrarySimdOpName("withY", AsmJSSimdOperation_withY) ||
|
||||
!addStandardLibrarySimdOpName("withZ", AsmJSSimdOperation_withZ) ||
|
||||
!addStandardLibrarySimdOpName("withW", AsmJSSimdOperation_withW) ||
|
||||
!addStandardLibrarySimdOpName("fromFloat32x4", AsmJSSimdOperation_fromFloat32x4) ||
|
||||
!addStandardLibrarySimdOpName("fromInt32x4", AsmJSSimdOperation_fromInt32x4) ||
|
||||
!addStandardLibrarySimdOpName("fromFloat32x4Bits", AsmJSSimdOperation_fromFloat32x4Bits) ||
|
||||
!addStandardLibrarySimdOpName("fromInt32x4Bits", AsmJSSimdOperation_fromInt32x4Bits))
|
||||
#define ADDSTDLIBSIMDOPNAME(op) || !addStandardLibrarySimdOpName(#op, AsmJSSimdOperation_##op)
|
||||
if (!standardLibrarySimdOpNames_.init()
|
||||
FORALL_SIMD_OP(ADDSTDLIBSIMDOPNAME))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#undef ADDSTDLIBSIMDOPNAME
|
||||
|
||||
uint32_t srcStart = parser_.pc->maybeFunction->pn_body->pn_pos.begin;
|
||||
uint32_t srcBodyStart = tokenStream().currentToken().pos.end;
|
||||
@ -3589,34 +3567,14 @@ static bool
|
||||
IsSimdValidOperationType(AsmJSSimdType type, AsmJSSimdOperation op)
|
||||
{
|
||||
switch (op) {
|
||||
case AsmJSSimdOperation_add:
|
||||
case AsmJSSimdOperation_sub:
|
||||
case AsmJSSimdOperation_lessThan:
|
||||
case AsmJSSimdOperation_equal:
|
||||
case AsmJSSimdOperation_greaterThan:
|
||||
case AsmJSSimdOperation_and:
|
||||
case AsmJSSimdOperation_or:
|
||||
case AsmJSSimdOperation_xor:
|
||||
case AsmJSSimdOperation_select:
|
||||
case AsmJSSimdOperation_splat:
|
||||
case AsmJSSimdOperation_withX:
|
||||
case AsmJSSimdOperation_withY:
|
||||
case AsmJSSimdOperation_withZ:
|
||||
case AsmJSSimdOperation_withW:
|
||||
#define CASE(op) case AsmJSSimdOperation_##op:
|
||||
FOREACH_COMMONX4_SIMD_OP(CASE)
|
||||
return true;
|
||||
case AsmJSSimdOperation_fromFloat32x4:
|
||||
case AsmJSSimdOperation_fromFloat32x4Bits:
|
||||
FOREACH_INT32X4_SIMD_OP(CASE)
|
||||
return type == AsmJSSimdType_int32x4;
|
||||
case AsmJSSimdOperation_mul:
|
||||
case AsmJSSimdOperation_div:
|
||||
case AsmJSSimdOperation_max:
|
||||
case AsmJSSimdOperation_min:
|
||||
case AsmJSSimdOperation_lessThanOrEqual:
|
||||
case AsmJSSimdOperation_notEqual:
|
||||
case AsmJSSimdOperation_greaterThanOrEqual:
|
||||
case AsmJSSimdOperation_fromInt32x4:
|
||||
case AsmJSSimdOperation_fromInt32x4Bits:
|
||||
FOREACH_FLOAT32X4_SIMD_OP(CASE)
|
||||
return type == AsmJSSimdType_float32x4;
|
||||
#undef CASE
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -113,6 +113,39 @@
|
||||
INT32X4_TERNARY_FUNCTION_LIST(V) \
|
||||
INT32X4_QUARTERNARY_FUNCTION_LIST(V)
|
||||
|
||||
#define FOREACH_INT32X4_SIMD_OP(_) \
|
||||
_(fromFloat32x4) \
|
||||
_(fromFloat32x4Bits)
|
||||
#define FOREACH_FLOAT32X4_SIMD_OP(_) \
|
||||
_(fromInt32x4) \
|
||||
_(fromInt32x4Bits) \
|
||||
_(mul) \
|
||||
_(div) \
|
||||
_(max) \
|
||||
_(min) \
|
||||
_(lessThanOrEqual) \
|
||||
_(notEqual) \
|
||||
_(greaterThanOrEqual)
|
||||
#define FOREACH_COMMONX4_SIMD_OP(_) \
|
||||
_(add) \
|
||||
_(sub) \
|
||||
_(lessThan) \
|
||||
_(equal) \
|
||||
_(greaterThan) \
|
||||
_(and) \
|
||||
_(or) \
|
||||
_(xor) \
|
||||
_(select) \
|
||||
_(splat) \
|
||||
_(withX) \
|
||||
_(withY) \
|
||||
_(withZ) \
|
||||
_(withW)
|
||||
#define FORALL_SIMD_OP(_) \
|
||||
FOREACH_INT32X4_SIMD_OP(_) \
|
||||
FOREACH_FLOAT32X4_SIMD_OP(_) \
|
||||
FOREACH_COMMONX4_SIMD_OP(_)
|
||||
|
||||
namespace js {
|
||||
|
||||
class SIMDObject : public JSObject
|
||||
|
Loading…
Reference in New Issue
Block a user