Bug 1072927: Use macros for specifying which ops are valid for which SIMD type; r=luke

This commit is contained in:
Benjamin Bouvier 2014-09-29 16:54:14 +02:00
parent ce04a8cf49
commit 388cc90c2b
4 changed files with 58 additions and 126 deletions

View File

@ -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");

View File

@ -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

View File

@ -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;
}

View File

@ -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