From 91cf5f12db93278eb6dd5f7f6a391658dc3368f8 Mon Sep 17 00:00:00 2001 From: Douglas Crosher Date: Fri, 29 Aug 2014 22:42:06 +1000 Subject: [PATCH] Bug 1060087 - OdinMonkey SIMD: add support for signMask; r=luke --- js/src/asmjs/AsmJSValidate.cpp | 20 +++++++++++++++++++- js/src/jit-test/tests/asm.js/testSIMD.js | 15 +++++++++++++++ js/src/vm/CommonPropertyNames.h | 1 + 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/js/src/asmjs/AsmJSValidate.cpp b/js/src/asmjs/AsmJSValidate.cpp index e4b034c9bb5d..b8f25dd6b21c 100644 --- a/js/src/asmjs/AsmJSValidate.cpp +++ b/js/src/asmjs/AsmJSValidate.cpp @@ -2586,6 +2586,17 @@ class FunctionCompiler return ins; } + MDefinition *extractSignMask(MDefinition *base) + { + if (inDeadCode()) + return nullptr; + + JS_ASSERT(IsSimdType(base->type())); + MSimdSignMask *ins = MSimdSignMask::NewAsmJS(alloc(), base); + curBlock_->add(ins); + return ins; + } + template MDefinition *constructSimd(MDefinition *x, MDefinition *y, MDefinition *z, MDefinition *w, MIRType type) @@ -4027,6 +4038,13 @@ CheckDotAccess(FunctionCompiler &f, ParseNode *elem, MDefinition **def, Type *ty SimdLane lane; JSAtomState &names = m.cx()->names(); + + if (field == names.signMask) { + *type = Type::Int; + *def = f.extractSignMask(baseDef); + return true; + } + if (field == names.x) lane = LaneX; else if (field == names.y) @@ -4036,7 +4054,7 @@ CheckDotAccess(FunctionCompiler &f, ParseNode *elem, MDefinition **def, Type *ty else if (field == names.w) lane = LaneW; else - return f.fail(base, "dot access field must be a lane name (x, y, z, w)"); + return f.fail(base, "dot access field must be a lane name (x, y, z, w) or signMask"); *type = baseType.simdToScalarType(); *def = f.extractSimdElement(lane, baseDef, type->toMIRType()); diff --git a/js/src/jit-test/tests/asm.js/testSIMD.js b/js/src/jit-test/tests/asm.js/testSIMD.js index 35f3d1499bc7..eff82d52710d 100644 --- a/js/src/jit-test/tests/asm.js/testSIMD.js +++ b/js/src/jit-test/tests/asm.js/testSIMD.js @@ -161,6 +161,21 @@ CheckF4('', 'var x=f4(' + (INT32_MAX + 1) + ', 2, 3, 4)', [INT32_MAX + 1, 2, 3, CheckF4('', 'var x=f4(1.3, 2.4, 3.5, 98.76)', [1.3, 2.4, 3.5, 98.76]); CheckF4('', 'var x=f4(13.37, 2., 3., -0)', [13.37, 2, 3, -0]); +// signMask +assertAsmTypeFail('glob', USE_ASM + I32 + "function f() {var x=i4(1,2,3,4); var y=0.0; y=x.signMask;} return f"); +assertAsmTypeFail('glob', USE_ASM + I32 + FROUND + "function f() {var x=i4(1,2,3,4); var y=f32(0.0); y=x.signMask;} return f"); + +assertAsmTypeFail('glob', USE_ASM + "function f() {var x=42; return x.signMask;} return f"); +assertAsmTypeFail('glob', USE_ASM + "function f() {var x=42.; return x.signMask;} return f"); +assertAsmTypeFail('glob', USE_ASM + FROUND + "function f() {var x=f32(42.); return x.signMask;} return f"); + +assertEq(asmLink(asmCompile('glob', USE_ASM + I32 + 'function f() { var x=i4(1,2,3,4); return x.signMask | 0 } return f'), this)(), 0b0000); +assertEq(asmLink(asmCompile('glob', USE_ASM + I32 + 'function f() { var x=i4(0,-1, ' + INT32_MAX + ',' + INT32_MIN + '); return x.signMask | 0 } return f'), this)(), 0b1010); + +assertEq(asmLink(asmCompile('glob', USE_ASM + F32 + 'var Infinity = glob.Infinity; function f() { var x=f4(0,0,0,0); x=f4(1, -13.37, 42, -Infinity); return x.signMask | 0 } return f'), this)(), 0b1010); +assertEq(asmLink(asmCompile('glob', USE_ASM + F32 + 'var Infinity = glob.Infinity; function f() { var x=f4(0,0,0,0); x=f4(-1, 0, -0.000001, Infinity); return x.signMask | 0 } return f'), this)(), 0b0101); +assertEq(asmLink(asmCompile('glob', USE_ASM + F32 + 'var NaN = glob.NaN; function f() { var x=f4(0,0,0,0); x=f4(-1, NaN, 3., 4.); return x.signMask | 0 } return f'), this)(), 0b0001); + // 1.3.3. Variable assignments assertAsmTypeFail('glob', USE_ASM + I32 + I32A + "function f() {var x=i4(1,2,3,4); x=i4();} return f"); assertAsmTypeFail('glob', USE_ASM + I32 + I32A + "function f() {var x=i4(1,2,3,4); x=i4(1);} return f"); diff --git a/js/src/vm/CommonPropertyNames.h b/js/src/vm/CommonPropertyNames.h index 5ffe30645ebc..2ec45e86ab41 100644 --- a/js/src/vm/CommonPropertyNames.h +++ b/js/src/vm/CommonPropertyNames.h @@ -166,6 +166,7 @@ macro(sensitivity, sensitivity, "sensitivity") \ macro(set, set, "set") \ macro(shape, shape, "shape") \ + macro(signMask, signMask, "signMask") \ macro(source, source, "source") \ macro(stack, stack, "stack") \ macro(sticky, sticky, "sticky") \