Bug 1136221 - SIMD (interpreter): relax type requirement for Int32x4Bool. r=bbouvier

This commit is contained in:
ProgramFOX 2015-02-27 17:31:05 +01:00
parent 68fa1740c1
commit 981c6f6c23
2 changed files with 67 additions and 7 deletions

View File

@ -919,16 +919,10 @@ static bool
Int32x4Bool(JSContext *cx, unsigned argc, Value *vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
if (args.length() != 4 ||
!args[0].isBoolean() || !args[1].isBoolean() ||
!args[2].isBoolean() || !args[3].isBoolean())
{
return ErrorBadArgs(cx);
}
int32_t result[Int32x4::lanes];
for (unsigned i = 0; i < Int32x4::lanes; i++)
result[i] = args[i].toBoolean() ? 0xFFFFFFFF : 0x0;
result[i] = ToBoolean(args.get(i)) ? -1 : 0;
return StoreResult<Int32x4>(cx, args, result);
}

View File

@ -9,6 +9,12 @@ var summary = 'int32x4 bool';
* https://creativecommons.org/publicdomain/zero/1.0/
*/
function tryEmulateUndefined() {
if (typeof objectEmulatingUndefined !== 'undefined')
return objectEmulatingUndefined();
return undefined;
}
function test() {
print(BUGNUMBER + ": " + summary);
@ -18,6 +24,66 @@ function test() {
assertEq(a.z, -1);
assertEq(a.w, 0);
var b = int32x4.bool(5, 0, 1, -2);
assertEq(b.x, -1);
assertEq(b.y, 0);
assertEq(b.z, -1);
assertEq(b.w, -1);
var c = int32x4.bool(1.23, 13.37, 42.99999999, 0.000001);
assertEq(c.x, -1);
assertEq(c.y, -1);
assertEq(c.z, -1);
assertEq(c.w, -1);
var d = int32x4.bool("string", "", "1", "0");
assertEq(d.x, -1);
assertEq(d.y, 0);
assertEq(d.z, -1);
assertEq(d.w, -1);
var e = int32x4.bool([], [1, 2, 3], SIMD.int32x4(1, 2, 3, 4), function() { return 0; });
assertEq(e.x, -1);
assertEq(e.y, -1);
assertEq(e.z, -1);
assertEq(e.w, -1);
var f = int32x4.bool(undefined, null, {}, tryEmulateUndefined());
assertEq(f.x, 0);
assertEq(f.y, 0);
assertEq(f.z, -1);
assertEq(f.w, 0);
var g = int32x4.bool();
assertEq(g.x, 0);
assertEq(g.y, 0);
assertEq(g.z, 0);
assertEq(g.w, 0);
var h = int32x4.bool(true);
assertEq(h.x, -1);
assertEq(h.y, 0);
assertEq(h.z, 0);
assertEq(h.w, 0);
var i = int32x4.bool(true, true);
assertEq(i.x, -1);
assertEq(i.y, -1);
assertEq(i.z, 0);
assertEq(i.w, 0);
var j = int32x4.bool(true, true, true);
assertEq(j.x, -1);
assertEq(j.y, -1);
assertEq(j.z, -1);
assertEq(j.w, 0);
var k = int32x4.bool(true, true, true, true, true);
assertEq(k.x, -1);
assertEq(k.y, -1);
assertEq(k.z, -1);
assertEq(k.w, -1);
if (typeof reportCompare === "function")
reportCompare(true, true);
}