mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-29 13:15:47 +00:00
Merge mozilla-central to fx-team
This commit is contained in:
commit
7d59046438
@ -1,4 +1,4 @@
|
||||
{
|
||||
"revision": "c8f56fb9f9888d4f4e7f55a52a639b9271b8d207",
|
||||
"revision": "6c2b33c8f522e2fa419011bc2de456c11e76b29f",
|
||||
"repo_path": "/integration/gaia-central"
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
[DEFAULT]
|
||||
support-files =
|
||||
file_bug944407.xml
|
||||
file_bug950909.xml
|
||||
|
||||
[test_bug378518.xul]
|
||||
[test_bug398135.xul]
|
||||
@ -9,3 +10,4 @@ support-files =
|
||||
[test_bug723676.xul]
|
||||
[test_bug772966.xul]
|
||||
[test_bug944407.xul]
|
||||
[test_bug950909.xul]
|
||||
|
8
content/xbl/test/file_bug950909.html
Normal file
8
content/xbl/test/file_bug950909.html
Normal file
@ -0,0 +1,8 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
</head>
|
||||
<body>
|
||||
<div style="-moz-binding: url(chrome://mochitests/content/chrome/content/xbl/test/file_bug950909.xml#testBinding"></div>
|
||||
</body>
|
||||
</html>
|
37
content/xbl/test/file_bug950909.xml
Normal file
37
content/xbl/test/file_bug950909.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<?xml version="1.0"?>
|
||||
<bindings id="chromeTestBindings" xmlns="http://www.mozilla.org/xbl">
|
||||
<binding id="testBinding">
|
||||
<implementation implements="nsIObserver">
|
||||
<constructor>
|
||||
<![CDATA[
|
||||
// This binding gets applied to a content object, and thus is actually
|
||||
// running in a content XBL scope.
|
||||
var win = XPCNativeWrapper.unwrap(window);
|
||||
var SpecialPowers = win.SpecialPowers;
|
||||
var ok = SpecialPowers.unwrap(SpecialPowers.wrap(window).parent.ok);
|
||||
ok(win != window, "Should be running in an XBL scope with Xrays");
|
||||
|
||||
// Generate an XPCWrappedJS for the reflector. We need to do this
|
||||
// explicitly with a testing helper, because we're converging on
|
||||
// removing XPConnect from the web, which means that it won't be
|
||||
// possible to generate an XPCWrappedJS from content (or XBL) code.
|
||||
var scope = {};
|
||||
var holder = SpecialPowers.Cu.generateXPCWrappedJS(this, scope);
|
||||
|
||||
// Now, QI |this|, which will generate an aggregated native.
|
||||
this.QueryInterface(Components.interfaces.nsIObserver);
|
||||
|
||||
ok(true, "Didn't assert or crash");
|
||||
|
||||
SpecialPowers.wrap(window).parent.SimpleTest.finish();
|
||||
]]>
|
||||
</constructor>
|
||||
<method name="observe">
|
||||
<parameter name="aSubject"/>
|
||||
<parameter name="aTopic"/>
|
||||
<parameter name="aData"/>
|
||||
<body><![CDATA[]]></body>
|
||||
</method>
|
||||
</implementation>
|
||||
</binding>
|
||||
</bindings>
|
@ -14,6 +14,7 @@ support-files =
|
||||
file_bug844783.xhtml
|
||||
file_bug944407.html
|
||||
file_bug944407.xml
|
||||
file_bug950909.html
|
||||
|
||||
[test_bug310107.html]
|
||||
[test_bug366770.html]
|
||||
|
36
content/xbl/test/test_bug950909.xul
Normal file
36
content/xbl/test/test_bug950909.xul
Normal file
@ -0,0 +1,36 @@
|
||||
<?xml version="1.0"?>
|
||||
<?xml-stylesheet type="text/css" href="chrome://global/skin"?>
|
||||
<?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
|
||||
<!--
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=950909
|
||||
-->
|
||||
<window title="Mozilla Bug 950909"
|
||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
||||
|
||||
<!-- test results are displayed in the html:body -->
|
||||
<body xmlns="http://www.w3.org/1999/xhtml">
|
||||
<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=950909"
|
||||
target="_blank">Mozilla Bug 950909</a>
|
||||
</body>
|
||||
|
||||
<!-- test code goes here -->
|
||||
<script type="application/javascript">
|
||||
<![CDATA[
|
||||
|
||||
/*
|
||||
* Test for bug 950909. This has to be a chrome tests because content needs
|
||||
* to apply a chrome binding (file_bug950909.xml), which will only be registered
|
||||
* as a chrome:// URI during mochitest-chrome runs. And the binding has to be
|
||||
* served from a chrome origin, because otherwise implements="nsIFoo" attributes
|
||||
* are ignored. So this test needs 3 files, all told. Ugh.
|
||||
*/
|
||||
|
||||
// Just wait. When the iframe loads, it'll apply the binding, which will
|
||||
// trigger the constructor for the binding.
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
]]>
|
||||
</script>
|
||||
<iframe src="http://example.com/tests/content/xbl/test/file_bug950909.html"/>
|
||||
</window>
|
@ -1365,6 +1365,7 @@ void
|
||||
nsGlobalWindow::DropOuterWindowDocs()
|
||||
{
|
||||
MOZ_ASSERT(IsOuterWindow());
|
||||
MOZ_ASSERT_IF(mDoc, !mDoc->EventHandlingSuppressed());
|
||||
mDoc = nullptr;
|
||||
mSuspendedDoc = nullptr;
|
||||
}
|
||||
@ -1547,7 +1548,7 @@ nsGlobalWindow::FreeInnerObjects()
|
||||
mDocumentURI = mDoc->GetDocumentURI();
|
||||
mDocBaseURI = mDoc->GetDocBaseURI();
|
||||
|
||||
if (mDoc->EventHandlingSuppressed()) {
|
||||
while (mDoc->EventHandlingSuppressed()) {
|
||||
mDoc->UnsuppressEventHandlingAndFireEvents(false);
|
||||
}
|
||||
}
|
||||
|
@ -242,8 +242,7 @@ CallbackObjectHolderBase::ToXPCOMCallback(CallbackObject* aCallback,
|
||||
JSAutoCompartment ac(cx, callback);
|
||||
nsRefPtr<nsXPCWrappedJS> wrappedJS;
|
||||
nsresult rv =
|
||||
nsXPCWrappedJS::GetNewOrUsed(callback, aIID,
|
||||
nullptr, getter_AddRefs(wrappedJS));
|
||||
nsXPCWrappedJS::GetNewOrUsed(callback, aIID, getter_AddRefs(wrappedJS));
|
||||
if (NS_FAILED(rv) || !wrappedJS) {
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -3299,13 +3299,14 @@ for (uint32_t i = 0; i < length; ++i) {
|
||||
holderType = CGTemplatedType("Maybe", holderType)
|
||||
|
||||
# If we're isOptional and not nullable the normal optional handling will
|
||||
# handle lazy construction of our holder. If we're nullable we do it
|
||||
# all by hand because we do not want our holder constructed if we're
|
||||
# null.
|
||||
# handle lazy construction of our holder. If we're nullable and not
|
||||
# isMember we do it all by hand because we do not want our holder
|
||||
# constructed if we're null. But if we're isMember we don't have a
|
||||
# holder anyway, so we can do the normal Optional codepath.
|
||||
declLoc = "${declName}"
|
||||
constructDecl = None
|
||||
if nullable:
|
||||
if isOptional:
|
||||
if isOptional and not isMember:
|
||||
holderArgs = "${declName}.Value().SetValue()"
|
||||
declType = CGTemplatedType("Optional", declType)
|
||||
constructDecl = CGGeneric("${declName}.Construct();")
|
||||
@ -3374,7 +3375,7 @@ for (uint32_t i = 0; i < length; ++i) {
|
||||
declType=declType,
|
||||
holderType=holderType,
|
||||
holderArgs=holderArgs,
|
||||
dealWithOptional=isOptional and not nullable)
|
||||
dealWithOptional=isOptional and (not nullable or isMember))
|
||||
|
||||
if type.isGeckoInterface():
|
||||
assert not isEnforceRange and not isClamp
|
||||
|
@ -791,6 +791,7 @@ dictionary Dict : ParentDict {
|
||||
#ifdef DEBUG
|
||||
(EventInit or long) eventInitOrLong;
|
||||
(EventInit or long)? nullableEventInitOrLong;
|
||||
(Node or long)? nullableNodeOrLong;
|
||||
// CustomEventInit is useful to test because it needs rooting.
|
||||
(CustomEventInit or long) eventInitOrLong2;
|
||||
(CustomEventInit or long)? nullableEventInitOrLong2;
|
||||
|
@ -103,7 +103,12 @@ this.Keyboard = {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mm.assertPermission("input")) {
|
||||
let testing = false;
|
||||
try {
|
||||
testing = Services.prefs.getBoolPref("dom.mozInputMethod.testing");
|
||||
} catch (e) {
|
||||
}
|
||||
if (!testing && !mm.assertPermission("input")) {
|
||||
dump("Keyboard message " + msg.name +
|
||||
" from a content process with no 'input' privileges.");
|
||||
return;
|
||||
@ -180,11 +185,9 @@ this.Keyboard = {
|
||||
handleFocusChange: function keyboardHandleFocusChange(msg) {
|
||||
this.forwardEvent('Keyboard:FocusChange', msg);
|
||||
|
||||
let browser = Services.wm.getMostRecentWindow("navigator:browser");
|
||||
|
||||
// Chrome event, used also to render value selectors; that's why we need
|
||||
// the info about choices / min / max here as well...
|
||||
browser.shell.sendChromeEvent({
|
||||
this.sendChromeEvent({
|
||||
type: 'inputmethod-contextchange',
|
||||
inputType: msg.data.type,
|
||||
value: msg.data.value,
|
||||
@ -219,15 +222,13 @@ this.Keyboard = {
|
||||
},
|
||||
|
||||
showInputMethodPicker: function keyboardShowInputMethodPicker() {
|
||||
let browser = Services.wm.getMostRecentWindow("navigator:browser");
|
||||
browser.shell.sendChromeEvent({
|
||||
this.sendChromeEvent({
|
||||
type: "inputmethod-showall"
|
||||
});
|
||||
},
|
||||
|
||||
switchToNextInputMethod: function keyboardSwitchToNextInputMethod() {
|
||||
let browser = Services.wm.getMostRecentWindow("navigator:browser");
|
||||
browser.shell.sendChromeEvent({
|
||||
this.sendChromeEvent({
|
||||
type: "inputmethod-next"
|
||||
});
|
||||
},
|
||||
@ -267,6 +268,13 @@ this.Keyboard = {
|
||||
this._layouts = layouts;
|
||||
|
||||
ppmm.broadcastAsyncMessage('Keyboard:LayoutsChange', layouts);
|
||||
},
|
||||
|
||||
sendChromeEvent: function(event) {
|
||||
let browser = Services.wm.getMostRecentWindow("navigator:browser");
|
||||
if (browser && browser.shell) {
|
||||
browser.shell.sendChromeEvent(event);;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
10
dom/inputmethod/mochitest/file_test_app.html
Normal file
10
dom/inputmethod/mochitest/file_test_app.html
Normal file
@ -0,0 +1,10 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<body>
|
||||
<input id="test-input" type="text" value="Yuan" x-inputmode="verbatim" lang="zh"/>
|
||||
<script type="application/javascript;version=1.7">
|
||||
let input = document.getElementById('test-input');
|
||||
input.focus();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
32
dom/inputmethod/mochitest/inputmethod_common.js
Normal file
32
dom/inputmethod/mochitest/inputmethod_common.js
Normal file
@ -0,0 +1,32 @@
|
||||
function inputmethod_setup(callback) {
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
let appInfo = SpecialPowers.Cc['@mozilla.org/xre/app-info;1']
|
||||
.getService(SpecialPowers.Ci.nsIXULAppInfo);
|
||||
if (appInfo.name != 'B2G') {
|
||||
SpecialPowers.Cu.import("resource://gre/modules/Keyboard.jsm", this);
|
||||
}
|
||||
|
||||
let permissions = [];
|
||||
['input-manage', 'browser'].forEach(function(name) {
|
||||
permissions.push({
|
||||
type: name,
|
||||
allow: true,
|
||||
context: document
|
||||
});
|
||||
});
|
||||
|
||||
SpecialPowers.pushPermissions(permissions, function() {
|
||||
let prefs = [
|
||||
['dom.mozBrowserFramesEnabled', true],
|
||||
// Enable navigator.mozInputMethod.
|
||||
['dom.mozInputMethod.enabled', true],
|
||||
// Bypass the permission check for mozInputMethod API.
|
||||
['dom.mozInputMethod.testing', true]
|
||||
];
|
||||
SpecialPowers.pushPrefEnv({set: prefs}, callback);
|
||||
});
|
||||
}
|
||||
|
||||
function inputmethod_cleanup() {
|
||||
SimpleTest.finish();
|
||||
}
|
7
dom/inputmethod/mochitest/mochitest.ini
Normal file
7
dom/inputmethod/mochitest/mochitest.ini
Normal file
@ -0,0 +1,7 @@
|
||||
[DEFAULT]
|
||||
support-files =
|
||||
inputmethod_common.js
|
||||
file_test_app.html
|
||||
|
||||
[test_basic.html]
|
||||
|
8
dom/inputmethod/mochitest/moz.build
Normal file
8
dom/inputmethod/mochitest/moz.build
Normal file
@ -0,0 +1,8 @@
|
||||
# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
|
||||
# vim: set filetype=python:
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
MOCHITEST_MANIFESTS += ['mochitest.ini']
|
||||
|
137
dom/inputmethod/mochitest/test_basic.html
Normal file
137
dom/inputmethod/mochitest/test_basic.html
Normal file
@ -0,0 +1,137 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<!--
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=932145
|
||||
-->
|
||||
<head>
|
||||
<title>Basic test for InputMethod API.</title>
|
||||
<script type="application/javascript;version=1.7" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<script type="application/javascript;version=1.7" src="inputmethod_common.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
||||
</head>
|
||||
<body>
|
||||
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=932145">Mozilla Bug 932145</a>
|
||||
<p id="display"></p>
|
||||
<pre id="test">
|
||||
<script class="testbody" type="application/javascript;version=1.7">
|
||||
|
||||
// The input context.
|
||||
var gContext = null;
|
||||
|
||||
inputmethod_setup(function() {
|
||||
runTest();
|
||||
});
|
||||
|
||||
function runTest() {
|
||||
let im = navigator.mozInputMethod;
|
||||
|
||||
im.oninputcontextchange = function() {
|
||||
ok(true, 'inputcontextchange event was fired.');
|
||||
im.oninputcontextchange = null;
|
||||
|
||||
gContext = im.inputcontext;
|
||||
if (!gContext) {
|
||||
ok(false, 'Should have a non-null inputcontext.');
|
||||
inputmethod_cleanup();
|
||||
return;
|
||||
}
|
||||
|
||||
todo_is(gContext.type, 'input', 'The input context type should match.');
|
||||
is(gContext.inputType, 'text', 'The inputType should match.');
|
||||
is(gContext.inputMode, 'verbatim', 'The input mode should match.');
|
||||
is(gContext.lang, 'zh', 'The language should match.');
|
||||
is(gContext.textBeforeCursor + gContext.textAfterCursor, 'Yuan',
|
||||
'Should get the text around the cursor.');
|
||||
|
||||
test_setSelectionRange();
|
||||
};
|
||||
|
||||
// Set current page as an input method.
|
||||
SpecialPowers.wrap(im).setActive(true);
|
||||
|
||||
let iframe = document.createElement('iframe');
|
||||
iframe.src = 'file_test_app.html';
|
||||
iframe.setAttribute('mozbrowser', true);
|
||||
document.body.appendChild(iframe);
|
||||
}
|
||||
|
||||
function test_setSelectionRange() {
|
||||
// Move cursor position to 2.
|
||||
gContext.setSelectionRange(2, 0).then(function() {
|
||||
is(gContext.selectionStart, 2, 'selectionStart was set successfully.');
|
||||
is(gContext.selectionEnd, 2, 'selectionEnd was set successfully.');
|
||||
test_sendKey();
|
||||
}, function(e) {
|
||||
ok(false, 'setSelectionRange failed:' + e.name);
|
||||
inputmethod_cleanup();
|
||||
});
|
||||
}
|
||||
|
||||
function test_sendKey() {
|
||||
// Add '-' to current cursor posistion and move the cursor position to 3.
|
||||
gContext.sendKey(0, '-'.charCodeAt(0), 0).then(function() {
|
||||
is(gContext.textBeforeCursor + gContext.textAfterCursor, 'Yu-an',
|
||||
'sendKey should changed the input field correctly.');
|
||||
test_deleteSurroundingText();
|
||||
}, function(e) {
|
||||
ok(false, 'sendKey failed:' + e.name);
|
||||
inputmethod_cleanup();
|
||||
});
|
||||
}
|
||||
|
||||
function test_deleteSurroundingText() {
|
||||
// Remove one character before current cursor position and move the cursor
|
||||
// position back to 2.
|
||||
gContext.deleteSurroundingText(1, 0).then(function() {
|
||||
ok(true, 'deleteSurroundingText finished');
|
||||
is(gContext.textBeforeCursor + gContext.textAfterCursor, 'Yuan',
|
||||
'deleteSurroundingText should changed the input field correctly.');
|
||||
test_replaceSurroundingText();
|
||||
}, function(e) {
|
||||
ok(false, 'deleteSurroundingText failed:' + e.name);
|
||||
inputmethod_cleanup();
|
||||
});
|
||||
}
|
||||
|
||||
function test_replaceSurroundingText() {
|
||||
// Replace 'Yuan' with 'Xulei'.
|
||||
gContext.replaceSurroundingText('Xulei', 2, 2).then(function() {
|
||||
ok(true, 'replaceSurroundingText finished');
|
||||
is(gContext.textBeforeCursor + gContext.textAfterCursor, 'Xulei',
|
||||
'replaceSurroundingText changed the input field correctly.');
|
||||
test_setComposition();
|
||||
}, function(e) {
|
||||
ok(false, 'replaceSurroundingText failed: ' + e.name);
|
||||
inputmethod_cleanup();
|
||||
});
|
||||
}
|
||||
|
||||
function test_setComposition() {
|
||||
gContext.setComposition('XXX').then(function() {
|
||||
ok(true, 'setComposition finished');
|
||||
test_endComposition();
|
||||
}, function(e) {
|
||||
ok(false, 'setComposition failed: ' + e.name);
|
||||
inputmethod_cleanup();
|
||||
});
|
||||
}
|
||||
|
||||
function test_endComposition() {
|
||||
gContext.endComposition('2013').then(function() {
|
||||
if (gContext.textBeforeCursor + gContext.textAfterCursor == 'Xulei2013') {
|
||||
ok(true, 'endComposition changed the input field correctly.');
|
||||
} else {
|
||||
todo(false, 'endComposition changed the input field incorrectly.');
|
||||
}
|
||||
inputmethod_cleanup();
|
||||
}, function (e) {
|
||||
ok(false, 'endComposition failed: ' + e.name);
|
||||
inputmethod_cleanup();
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -4,6 +4,8 @@
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
TEST_DIRS += ['mochitest']
|
||||
|
||||
XPIDL_SOURCES += [
|
||||
'nsIB2GKeyboard.idl',
|
||||
]
|
||||
|
@ -74,6 +74,7 @@ var ecmaGlobals =
|
||||
"ReferenceError",
|
||||
"RegExp",
|
||||
"Set",
|
||||
{name: "SIMD", nightly: true},
|
||||
"StopIteration",
|
||||
"String",
|
||||
"SyntaxError",
|
||||
|
@ -568,7 +568,7 @@ struct JSClass {
|
||||
// with the following flags. Failure to use JSCLASS_GLOBAL_FLAGS was
|
||||
// previously allowed, but is now an ES5 violation and thus unsupported.
|
||||
//
|
||||
#define JSCLASS_GLOBAL_SLOT_COUNT (3 + JSProto_LIMIT * 3 + 27)
|
||||
#define JSCLASS_GLOBAL_SLOT_COUNT (3 + JSProto_LIMIT * 3 + 29)
|
||||
#define JSCLASS_GLOBAL_FLAGS_WITH_SLOTS(n) \
|
||||
(JSCLASS_IS_GLOBAL | JSCLASS_HAS_RESERVED_SLOTS(JSCLASS_GLOBAL_SLOT_COUNT + (n)))
|
||||
#define JSCLASS_GLOBAL_FLAGS \
|
||||
|
952
js/src/builtin/SIMD.cpp
Normal file
952
js/src/builtin/SIMD.cpp
Normal file
@ -0,0 +1,952 @@
|
||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
* vim: set ts=8 sts=4 et sw=4 tw=99:
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/*
|
||||
* JS SIMD pseudo-module.
|
||||
* Specification matches polyfill:
|
||||
* https://github.com/johnmccutchan/ecmascript_simd/blob/master/src/ecmascript_simd.js
|
||||
* The objects float32x4 and int32x4 are installed on the SIMD pseudo-module.
|
||||
*/
|
||||
|
||||
#include "builtin/SIMD.h"
|
||||
#include "jsapi.h"
|
||||
#include "jsfriendapi.h"
|
||||
#include "builtin/TypedObject.h"
|
||||
#include "jsobjinlines.h"
|
||||
|
||||
using namespace js;
|
||||
|
||||
using mozilla::ArrayLength;
|
||||
using mozilla::IsFinite;
|
||||
using mozilla::IsNaN;
|
||||
|
||||
namespace js {
|
||||
extern const JSFunctionSpec Float32x4Methods[];
|
||||
extern const JSFunctionSpec Int32x4Methods[];
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// X4
|
||||
|
||||
namespace js {
|
||||
struct Float32x4 {
|
||||
typedef float Elem;
|
||||
static const int32_t lanes = 4;
|
||||
static const X4TypeRepresentation::Type type =
|
||||
X4TypeRepresentation::TYPE_FLOAT32;
|
||||
|
||||
static JSObject &GetTypeObject(GlobalObject &global) {
|
||||
return global.float32x4TypeObject();
|
||||
}
|
||||
static Elem toType(Elem a) {
|
||||
return a;
|
||||
}
|
||||
static void toType2(JSContext *cx, JS::Handle<JS::Value> v, Elem *out) {
|
||||
*out = v.toNumber();
|
||||
}
|
||||
static void setReturn(CallArgs &args, float value) {
|
||||
args.rval().setDouble(value);
|
||||
}
|
||||
};
|
||||
|
||||
struct Int32x4 {
|
||||
typedef int32_t Elem;
|
||||
static const int32_t lanes = 4;
|
||||
static const X4TypeRepresentation::Type type =
|
||||
X4TypeRepresentation::TYPE_INT32;
|
||||
|
||||
static JSObject &GetTypeObject(GlobalObject &global) {
|
||||
return global.int32x4TypeObject();
|
||||
}
|
||||
static Elem toType(Elem a) {
|
||||
return ToInt32(a);
|
||||
}
|
||||
static void toType2(JSContext *cx, JS::Handle<JS::Value> v, Elem *out) {
|
||||
ToInt32(cx,v,out);
|
||||
}
|
||||
static void setReturn(CallArgs &args, int32_t value) {
|
||||
args.rval().setInt32(value);
|
||||
}
|
||||
};
|
||||
} // namespace js
|
||||
|
||||
#define LANE_ACCESSOR(Type32x4, lane) \
|
||||
bool Type32x4##Lane##lane(JSContext *cx, unsigned argc, Value *vp) { \
|
||||
static const char *laneNames[] = {"lane 0", "lane 1", "lane 2", "lane3"}; \
|
||||
CallArgs args = CallArgsFromVp(argc, vp); \
|
||||
if(!args.thisv().isObject() || !IsTypedDatum(args.thisv().toObject())) { \
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_INCOMPATIBLE_PROTO, \
|
||||
X4Type::class_.name, laneNames[lane], \
|
||||
InformalValueTypeName(args.thisv())); \
|
||||
return false; \
|
||||
} \
|
||||
TypedDatum &datum = AsTypedDatum(args.thisv().toObject()); \
|
||||
TypeRepresentation *typeRepr = datum.datumTypeRepresentation(); \
|
||||
if (typeRepr->kind() != TypeRepresentation::X4 || typeRepr->asX4()->type() != Type32x4::type) { \
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_INCOMPATIBLE_PROTO, \
|
||||
X4Type::class_.name, laneNames[lane], \
|
||||
InformalValueTypeName(args.thisv())); \
|
||||
return false; \
|
||||
} \
|
||||
Type32x4::Elem *data = reinterpret_cast<Type32x4::Elem *>(datum.typedMem()); \
|
||||
Type32x4::setReturn(args, data[lane]); \
|
||||
return true; \
|
||||
}
|
||||
LANE_ACCESSOR(Float32x4, 0);
|
||||
LANE_ACCESSOR(Float32x4, 1);
|
||||
LANE_ACCESSOR(Float32x4, 2);
|
||||
LANE_ACCESSOR(Float32x4, 3);
|
||||
LANE_ACCESSOR(Int32x4, 0);
|
||||
LANE_ACCESSOR(Int32x4, 1);
|
||||
LANE_ACCESSOR(Int32x4, 2);
|
||||
LANE_ACCESSOR(Int32x4, 3);
|
||||
#undef LANE_ACCESSOR
|
||||
|
||||
#define SIGN_MASK(Type32x4) \
|
||||
bool Type32x4##SignMask(JSContext *cx, unsigned argc, Value *vp) { \
|
||||
CallArgs args = CallArgsFromVp(argc, vp); \
|
||||
if(!args.thisv().isObject() || !IsTypedDatum(args.thisv().toObject())) { \
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_INCOMPATIBLE_PROTO, \
|
||||
X4Type::class_.name, "signMask", \
|
||||
InformalValueTypeName(args.thisv())); \
|
||||
return false; \
|
||||
} \
|
||||
TypedDatum &datum = AsTypedDatum(args.thisv().toObject()); \
|
||||
TypeRepresentation *typeRepr = datum.datumTypeRepresentation(); \
|
||||
if (typeRepr->kind() != TypeRepresentation::X4 || typeRepr->asX4()->type() != Type32x4::type) { \
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_INCOMPATIBLE_PROTO, \
|
||||
X4Type::class_.name, "signMask", \
|
||||
InformalValueTypeName(args.thisv())); \
|
||||
return false; \
|
||||
} \
|
||||
Type32x4::Elem *data = reinterpret_cast<Type32x4::Elem *>(datum.typedMem()); \
|
||||
int32_t mx = data[0] < 0.0 ? 1 : 0; \
|
||||
int32_t my = data[1] < 0.0 ? 1 : 0; \
|
||||
int32_t mz = data[2] < 0.0 ? 1 : 0; \
|
||||
int32_t mw = data[3] < 0.0 ? 1 : 0; \
|
||||
int32_t result = mx | my << 1 | mz << 2 | mw << 3; \
|
||||
args.rval().setInt32(result); \
|
||||
return true; \
|
||||
}
|
||||
SIGN_MASK(Float32x4);
|
||||
SIGN_MASK(Int32x4);
|
||||
#undef SIGN_MASK
|
||||
|
||||
const Class X4Type::class_ = {
|
||||
"X4",
|
||||
JSCLASS_HAS_RESERVED_SLOTS(JS_TYPEOBJ_X4_SLOTS),
|
||||
JS_PropertyStub, /* addProperty */
|
||||
JS_DeletePropertyStub, /* delProperty */
|
||||
JS_PropertyStub, /* getProperty */
|
||||
JS_StrictPropertyStub, /* setProperty */
|
||||
JS_EnumerateStub,
|
||||
JS_ResolveStub,
|
||||
JS_ConvertStub,
|
||||
nullptr, /* finalize */
|
||||
nullptr, /* checkAccess */
|
||||
call, /* call */
|
||||
nullptr, /* hasInstance */
|
||||
nullptr, /* construct */
|
||||
nullptr
|
||||
};
|
||||
|
||||
// These classes just exist to group together various properties and so on.
|
||||
namespace js {
|
||||
class Int32x4Defn {
|
||||
public:
|
||||
static const X4TypeRepresentation::Type type = X4TypeRepresentation::TYPE_INT32;
|
||||
static const JSFunctionSpec TypeDescriptorMethods[];
|
||||
static const JSPropertySpec TypeObjectProperties[];
|
||||
static const JSFunctionSpec TypeObjectMethods[];
|
||||
};
|
||||
class Float32x4Defn {
|
||||
public:
|
||||
static const X4TypeRepresentation::Type type = X4TypeRepresentation::TYPE_FLOAT32;
|
||||
static const JSFunctionSpec TypeDescriptorMethods[];
|
||||
static const JSPropertySpec TypeObjectProperties[];
|
||||
static const JSFunctionSpec TypeObjectMethods[];
|
||||
};
|
||||
} // namespace js
|
||||
|
||||
const JSFunctionSpec js::Float32x4Defn::TypeDescriptorMethods[] = {
|
||||
JS_FN("toSource", TypeObjectToSource, 0, 0),
|
||||
JS_SELF_HOSTED_FN("handle", "HandleCreate", 2, 0),
|
||||
JS_SELF_HOSTED_FN("array", "ArrayShorthand", 1, 0),
|
||||
JS_SELF_HOSTED_FN("equivalent", "TypeObjectEquivalent", 1, 0),
|
||||
JS_FS_END
|
||||
};
|
||||
|
||||
const JSPropertySpec js::Float32x4Defn::TypeObjectProperties[] = {
|
||||
JS_PSG("x", Float32x4Lane0, JSPROP_PERMANENT),
|
||||
JS_PSG("y", Float32x4Lane1, JSPROP_PERMANENT),
|
||||
JS_PSG("z", Float32x4Lane2, JSPROP_PERMANENT),
|
||||
JS_PSG("w", Float32x4Lane3, JSPROP_PERMANENT),
|
||||
JS_PSG("signMask", Float32x4SignMask, JSPROP_PERMANENT),
|
||||
JS_PS_END
|
||||
};
|
||||
|
||||
const JSFunctionSpec js::Float32x4Defn::TypeObjectMethods[] = {
|
||||
JS_SELF_HOSTED_FN("toSource", "X4ToSource", 0, 0),
|
||||
JS_FS_END
|
||||
};
|
||||
|
||||
const JSFunctionSpec js::Int32x4Defn::TypeDescriptorMethods[] = {
|
||||
JS_FN("toSource", TypeObjectToSource, 0, 0),
|
||||
JS_SELF_HOSTED_FN("handle", "HandleCreate", 2, 0),
|
||||
JS_SELF_HOSTED_FN("array", "ArrayShorthand", 1, 0),
|
||||
JS_SELF_HOSTED_FN("equivalent", "TypeObjectEquivalent", 1, 0),
|
||||
JS_FS_END,
|
||||
};
|
||||
|
||||
const JSPropertySpec js::Int32x4Defn::TypeObjectProperties[] = {
|
||||
JS_PSG("x", Int32x4Lane0, JSPROP_PERMANENT),
|
||||
JS_PSG("y", Int32x4Lane1, JSPROP_PERMANENT),
|
||||
JS_PSG("z", Int32x4Lane2, JSPROP_PERMANENT),
|
||||
JS_PSG("w", Int32x4Lane3, JSPROP_PERMANENT),
|
||||
JS_PSG("signMask", Int32x4SignMask, JSPROP_PERMANENT),
|
||||
JS_PS_END
|
||||
};
|
||||
|
||||
const JSFunctionSpec js::Int32x4Defn::TypeObjectMethods[] = {
|
||||
JS_SELF_HOSTED_FN("toSource", "X4ToSource", 0, 0),
|
||||
JS_FS_END
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
static JSObject *
|
||||
CreateX4Class(JSContext *cx, Handle<GlobalObject*> global)
|
||||
{
|
||||
RootedObject funcProto(cx, global->getOrCreateFunctionPrototype(cx));
|
||||
if (!funcProto)
|
||||
return nullptr;
|
||||
|
||||
// Create type representation.
|
||||
|
||||
RootedObject typeReprObj(cx);
|
||||
typeReprObj = X4TypeRepresentation::Create(cx, T::type);
|
||||
if (!typeReprObj)
|
||||
return nullptr;
|
||||
|
||||
// Create prototype property, which inherits from Object.prototype.
|
||||
|
||||
RootedObject objProto(cx, global->getOrCreateObjectPrototype(cx));
|
||||
if (!objProto)
|
||||
return nullptr;
|
||||
RootedObject proto(cx);
|
||||
proto = NewObjectWithGivenProto(cx, &JSObject::class_, objProto, global, SingletonObject);
|
||||
if (!proto)
|
||||
return nullptr;
|
||||
|
||||
// Create type constructor itself.
|
||||
|
||||
RootedObject x4(cx);
|
||||
x4 = NewObjectWithClassProto(cx, &X4Type::class_, funcProto, global);
|
||||
if (!x4 ||
|
||||
!InitializeCommonTypeDescriptorProperties(cx, x4, typeReprObj) ||
|
||||
!DefinePropertiesAndBrand(cx, proto, nullptr, nullptr))
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Link type constructor to the type representation.
|
||||
|
||||
x4->initReservedSlot(JS_TYPEOBJ_SLOT_TYPE_REPR, ObjectValue(*typeReprObj));
|
||||
|
||||
// Link constructor to prototype and install properties.
|
||||
|
||||
if (!JS_DefineFunctions(cx, x4, T::TypeDescriptorMethods))
|
||||
return nullptr;
|
||||
|
||||
if (!LinkConstructorAndPrototype(cx, x4, proto) ||
|
||||
!DefinePropertiesAndBrand(cx, proto, T::TypeObjectProperties,
|
||||
T::TypeObjectMethods))
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return x4;
|
||||
}
|
||||
|
||||
bool
|
||||
X4Type::call(JSContext *cx, unsigned argc, Value *vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
const uint32_t LANES = 4;
|
||||
|
||||
if (args.length() < LANES) {
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_MORE_ARGS_NEEDED,
|
||||
args.callee().getClass()->name, "3", "s");
|
||||
return false;
|
||||
}
|
||||
|
||||
double values[LANES];
|
||||
for (uint32_t i = 0; i < LANES; i++) {
|
||||
if (!ToNumber(cx, args[i], &values[i]))
|
||||
return false;
|
||||
}
|
||||
|
||||
RootedObject typeObj(cx, &args.callee());
|
||||
Rooted<TypedObject*> result(cx, TypedObject::createZeroed(cx, typeObj, 0));
|
||||
if (!result)
|
||||
return false;
|
||||
|
||||
X4TypeRepresentation *typeRepr = typeRepresentation(*typeObj)->asX4();
|
||||
switch (typeRepr->type()) {
|
||||
#define STORE_LANES(_constant, _type, _name) \
|
||||
case _constant: \
|
||||
{ \
|
||||
_type *mem = reinterpret_cast<_type*>(result->typedMem()); \
|
||||
for (uint32_t i = 0; i < LANES; i++) { \
|
||||
mem[i] = ConvertScalar<_type>(values[i]); \
|
||||
} \
|
||||
break; \
|
||||
}
|
||||
JS_FOR_EACH_X4_TYPE_REPR(STORE_LANES)
|
||||
#undef STORE_LANES
|
||||
}
|
||||
args.rval().setObject(*result);
|
||||
return true;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// SIMD class
|
||||
|
||||
const Class SIMDObject::class_ = {
|
||||
"SIMD",
|
||||
JSCLASS_HAS_CACHED_PROTO(JSProto_SIMD),
|
||||
JS_PropertyStub, /* addProperty */
|
||||
JS_DeletePropertyStub, /* delProperty */
|
||||
JS_PropertyStub, /* getProperty */
|
||||
JS_StrictPropertyStub, /* setProperty */
|
||||
JS_EnumerateStub,
|
||||
JS_ResolveStub,
|
||||
JS_ConvertStub,
|
||||
nullptr, /* finalize */
|
||||
nullptr, /* checkAccess */
|
||||
nullptr, /* call */
|
||||
nullptr, /* hasInstance */
|
||||
nullptr, /* construct */
|
||||
nullptr
|
||||
};
|
||||
|
||||
JSObject *
|
||||
SIMDObject::initClass(JSContext *cx, Handle<GlobalObject *> global)
|
||||
{
|
||||
// Create SIMD Object.
|
||||
RootedObject objProto(cx, global->getOrCreateObjectPrototype(cx));
|
||||
if(!objProto)
|
||||
return nullptr;
|
||||
RootedObject SIMD(cx, NewObjectWithGivenProto(cx, &SIMDObject::class_, objProto,
|
||||
global, SingletonObject));
|
||||
if (!SIMD)
|
||||
return nullptr;
|
||||
|
||||
// float32x4
|
||||
|
||||
RootedObject float32x4Object(cx, CreateX4Class<Float32x4Defn>(cx, global));
|
||||
if (!float32x4Object)
|
||||
return nullptr;
|
||||
|
||||
// Define float32x4 functions and install as a property of the SIMD object.
|
||||
global->setFloat32x4TypeObject(*float32x4Object);
|
||||
RootedValue float32x4Value(cx, ObjectValue(*float32x4Object));
|
||||
if (!JS_DefineFunctions(cx, float32x4Object, Float32x4Methods) ||
|
||||
!JSObject::defineProperty(cx, SIMD, cx->names().float32x4,
|
||||
float32x4Value, nullptr, nullptr,
|
||||
JSPROP_READONLY | JSPROP_PERMANENT))
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// int32x4
|
||||
|
||||
RootedObject int32x4Object(cx, CreateX4Class<Int32x4Defn>(cx, global));
|
||||
if (!int32x4Object)
|
||||
return nullptr;
|
||||
|
||||
// Define int32x4 functions and install as a property of the SIMD object.
|
||||
global->setInt32x4TypeObject(*int32x4Object);
|
||||
RootedValue int32x4Value(cx, ObjectValue(*int32x4Object));
|
||||
if (!JS_DefineFunctions(cx, int32x4Object, Int32x4Methods) ||
|
||||
!JSObject::defineProperty(cx, SIMD, cx->names().int32x4,
|
||||
int32x4Value, nullptr, nullptr,
|
||||
JSPROP_READONLY | JSPROP_PERMANENT))
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
RootedValue SIMDValue(cx, ObjectValue(*SIMD));
|
||||
global->setConstructor(JSProto_SIMD, SIMDValue);
|
||||
|
||||
// Everything is set up, install SIMD on the global object.
|
||||
if (!JSObject::defineProperty(cx, global, cx->names().SIMD, SIMDValue, nullptr, nullptr, 0)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return SIMD;
|
||||
}
|
||||
|
||||
JSObject *
|
||||
js_InitSIMDClass(JSContext *cx, HandleObject obj)
|
||||
{
|
||||
JS_ASSERT(obj->is<GlobalObject>());
|
||||
Rooted<GlobalObject *> global(cx, &obj->as<GlobalObject>());
|
||||
return SIMDObject::initClass(cx, global);
|
||||
}
|
||||
|
||||
template<typename V>
|
||||
static bool
|
||||
ObjectIsVector(JSObject &obj) {
|
||||
if (!IsTypedDatum(obj))
|
||||
return false;
|
||||
TypeRepresentation *typeRepr = AsTypedDatum(obj).datumTypeRepresentation();
|
||||
if (typeRepr->kind() != TypeRepresentation::X4)
|
||||
return false;
|
||||
return typeRepr->asX4()->type() == V::type;
|
||||
}
|
||||
|
||||
template<typename V>
|
||||
static JSObject *
|
||||
Create(JSContext *cx, typename V::Elem *data)
|
||||
{
|
||||
RootedObject typeObj(cx, &V::GetTypeObject(*cx->global()));
|
||||
JS_ASSERT(typeObj);
|
||||
|
||||
Rooted<TypedObject *> result(cx, TypedObject::createZeroed(cx, typeObj, 0));
|
||||
if (!result)
|
||||
return nullptr;
|
||||
|
||||
typename V::Elem *resultMem = reinterpret_cast<typename V::Elem *>(result->typedMem());
|
||||
memcpy(resultMem, data, sizeof(typename V::Elem) * V::lanes);
|
||||
return result;
|
||||
}
|
||||
|
||||
namespace js {
|
||||
template<typename T, typename V>
|
||||
struct Abs {
|
||||
static inline T apply(T x, T zero) {return V::toType(x < 0 ? -1 * x : x);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct Neg {
|
||||
static inline T apply(T x, T zero) {return V::toType(-1 * x);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct Not {
|
||||
static inline T apply(T x, T zero) {return V::toType(~x);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct Rec {
|
||||
static inline T apply(T x, T zero) {return V::toType(1 / x);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct RecSqrt {
|
||||
static inline T apply(T x, T zero) {return V::toType(1 / sqrt(x));}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct Sqrt {
|
||||
static inline T apply(T x, T zero) {return V::toType(sqrt(x));}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct Add {
|
||||
static inline T apply(T l, T r) {return V::toType(l + r);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct Sub {
|
||||
static inline T apply(T l, T r) {return V::toType(l - r);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct Div {
|
||||
static inline T apply(T l, T r) {return V::toType(l / r);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct Mul {
|
||||
static inline T apply(T l, T r) {return V::toType(l * r);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct Minimum {
|
||||
static inline T apply(T l, T r) {return V::toType(l < r ? l : r);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct Maximum {
|
||||
static inline T apply(T l, T r) {return V::toType(l > r ? l : r);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct LessThan {
|
||||
static inline T apply(T l, T r) {return V::toType(l < r ? 0xFFFFFFFF: 0x0);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct LessThanOrEqual {
|
||||
static inline T apply(T l, T r) {return V::toType(l <= r ? 0xFFFFFFFF: 0x0);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct GreaterThan {
|
||||
static inline T apply(T l, T r) {return V::toType(l > r ? 0xFFFFFFFF: 0x0);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct GreaterThanOrEqual {
|
||||
static inline T apply(T l, T r) {return V::toType(l >= r ? 0xFFFFFFFF: 0x0);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct Equal {
|
||||
static inline T apply(T l, T r) {return V::toType(l == r ? 0xFFFFFFFF: 0x0);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct NotEqual {
|
||||
static inline T apply(T l, T r) {return V::toType(l != r ? 0xFFFFFFFF: 0x0);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct Xor {
|
||||
static inline T apply(T l, T r) {return V::toType(l ^ r);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct And {
|
||||
static inline T apply(T l, T r) {return V::toType(l & r);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct Or {
|
||||
static inline T apply(T l, T r) {return V::toType(l | r);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct Scale {
|
||||
static inline T apply(int32_t lane, T scalar, T x) {return V::toType(scalar * x);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct WithX {
|
||||
static inline T apply(int32_t lane, T scalar, T x) {return V::toType(lane == 0 ? scalar : x);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct WithY {
|
||||
static inline T apply(int32_t lane, T scalar, T x) {return V::toType(lane == 1 ? scalar : x);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct WithZ {
|
||||
static inline T apply(int32_t lane, T scalar, T x) {return V::toType(lane == 2 ? scalar : x);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct WithW {
|
||||
static inline T apply(int32_t lane, T scalar, T x) {return V::toType(lane == 3 ? scalar : x);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct WithFlagX {
|
||||
static inline T apply(T l, T f, T x) { return V::toType(l == 0 ? (f ? 0xFFFFFFFF : 0x0) : x);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct WithFlagY {
|
||||
static inline T apply(T l, T f, T x) { return V::toType(l == 1 ? (f ? 0xFFFFFFFF : 0x0) : x);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct WithFlagZ {
|
||||
static inline T apply(T l, T f, T x) { return V::toType(l == 2 ? (f ? 0xFFFFFFFF : 0x0) : x);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct WithFlagW {
|
||||
static inline T apply(T l, T f, T x) { return V::toType(l == 3 ? (f ? 0xFFFFFFFF : 0x0) : x);}
|
||||
};
|
||||
template<typename T, typename V>
|
||||
struct Shuffle {
|
||||
static inline int32_t apply(int32_t l, int32_t mask) {return V::toType((mask >> l) & 0x3);}
|
||||
};
|
||||
}
|
||||
|
||||
template<typename V, typename Op, typename Vret>
|
||||
static bool
|
||||
Func(JSContext *cx, unsigned argc, Value *vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
|
||||
if (argc == 1) {
|
||||
if((!args[0].isObject() || !ObjectIsVector<V>(args[0].toObject()))) {
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_TYPED_ARRAY_BAD_ARGS);
|
||||
return false;
|
||||
}
|
||||
typename V::Elem *val =
|
||||
reinterpret_cast<typename V::Elem *>(AsTypedDatum(args[0].toObject()).typedMem());
|
||||
typename Vret::Elem result[Vret::lanes];
|
||||
for (int32_t i = 0; i < Vret::lanes; i++)
|
||||
result[i] = Op::apply(val[i], 0);
|
||||
|
||||
RootedObject obj(cx, Create<Vret>(cx, result));
|
||||
if (!obj)
|
||||
return false;
|
||||
|
||||
args.rval().setObject(*obj);
|
||||
return true;
|
||||
|
||||
} else if (argc == 2) {
|
||||
if((!args[0].isObject() || !ObjectIsVector<V>(args[0].toObject())) ||
|
||||
(!args[1].isObject() || !ObjectIsVector<V>(args[1].toObject())))
|
||||
{
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_TYPED_ARRAY_BAD_ARGS);
|
||||
return false;
|
||||
}
|
||||
|
||||
typename V::Elem *left =
|
||||
reinterpret_cast<typename V::Elem *>(AsTypedDatum(args[0].toObject()).typedMem());
|
||||
typename V::Elem *right =
|
||||
reinterpret_cast<typename V::Elem *>(AsTypedDatum(args[1].toObject()).typedMem());
|
||||
|
||||
typename Vret::Elem result[Vret::lanes];
|
||||
for (int32_t i = 0; i < Vret::lanes; i++)
|
||||
result[i] = Op::apply(left[i], right[i]);
|
||||
|
||||
RootedObject obj(cx, Create<Vret>(cx, result));
|
||||
if (!obj)
|
||||
return false;
|
||||
|
||||
args.rval().setObject(*obj);
|
||||
return true;
|
||||
} else {
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_TYPED_ARRAY_BAD_ARGS);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename V, typename OpWith, typename Vret>
|
||||
static bool
|
||||
FuncWith(JSContext *cx, unsigned argc, Value *vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
|
||||
if ((argc != 2) ||
|
||||
(!args[0].isObject() || !ObjectIsVector<V>(args[0].toObject())) ||
|
||||
(!args[1].isNumber() && !args[1].isBoolean()))
|
||||
{
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_TYPED_ARRAY_BAD_ARGS);
|
||||
return false;
|
||||
}
|
||||
|
||||
typename V::Elem *val =
|
||||
reinterpret_cast<typename V::Elem *>(AsTypedDatum(args[0].toObject()).typedMem());
|
||||
|
||||
typename Vret::Elem result[Vret::lanes];
|
||||
for (int32_t i = 0; i < Vret::lanes; i++) {
|
||||
if(args[1].isNumber()) {
|
||||
typename Vret::Elem arg1;
|
||||
Vret::toType2(cx, args[1], &arg1);
|
||||
result[i] = OpWith::apply(i, arg1, val[i]);
|
||||
} else if (args[1].isBoolean()) {
|
||||
result[i] = OpWith::apply(i, args[1].toBoolean(), val[i]);
|
||||
}
|
||||
}
|
||||
RootedObject obj(cx, Create<Vret>(cx, result));
|
||||
if (!obj)
|
||||
return false;
|
||||
|
||||
args.rval().setObject(*obj);
|
||||
return true;
|
||||
}
|
||||
|
||||
template<typename V, typename OpShuffle, typename Vret>
|
||||
static bool
|
||||
FuncShuffle(JSContext *cx, unsigned argc, Value *vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
|
||||
if(argc == 2){
|
||||
if ((!args[0].isObject() || !ObjectIsVector<V>(args[0].toObject())) ||
|
||||
(!args[1].isNumber()))
|
||||
{
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_TYPED_ARRAY_BAD_ARGS);
|
||||
return false;
|
||||
}
|
||||
|
||||
typename V::Elem *val =
|
||||
reinterpret_cast<typename V::Elem *>(AsTypedDatum(args[0].toObject()).typedMem());
|
||||
typename Vret::Elem result[Vret::lanes];
|
||||
for (int32_t i = 0; i < Vret::lanes; i++) {
|
||||
typename Vret::Elem arg1;
|
||||
Vret::toType2(cx, args[1], &arg1);
|
||||
result[i] = val[OpShuffle::apply(i * 2, arg1)];
|
||||
}
|
||||
RootedObject obj(cx, Create<Vret>(cx, result));
|
||||
if (!obj)
|
||||
return false;
|
||||
|
||||
args.rval().setObject(*obj);
|
||||
return true;
|
||||
} else if (argc == 3){
|
||||
if ((!args[0].isObject() || !ObjectIsVector<V>(args[0].toObject())) ||
|
||||
(!args[1].isObject() || !ObjectIsVector<V>(args[1].toObject())) ||
|
||||
(!args[2].isNumber()))
|
||||
{
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_TYPED_ARRAY_BAD_ARGS);
|
||||
return false;
|
||||
}
|
||||
typename V::Elem *val1 =
|
||||
reinterpret_cast<typename V::Elem *>(AsTypedDatum(args[0].toObject()).typedMem());
|
||||
typename V::Elem *val2 =
|
||||
reinterpret_cast<typename V::Elem *>(AsTypedDatum(args[1].toObject()).typedMem());
|
||||
typename Vret::Elem result[Vret::lanes];
|
||||
for (int32_t i = 0; i < Vret::lanes; i++) {
|
||||
typename Vret::Elem arg2;
|
||||
Vret::toType2(cx, args[2], &arg2);
|
||||
if(i < Vret::lanes / 2) {
|
||||
result[i] = val1[OpShuffle::apply(i * 2, arg2)];
|
||||
} else {
|
||||
result[i] = val2[OpShuffle::apply(i * 2, arg2)];
|
||||
}
|
||||
}
|
||||
RootedObject obj(cx, Create<Vret>(cx, result));
|
||||
if (!obj)
|
||||
return false;
|
||||
|
||||
args.rval().setObject(*obj);
|
||||
return true;
|
||||
} else {
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_TYPED_ARRAY_BAD_ARGS);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename V, typename Vret>
|
||||
static bool
|
||||
FuncConvert(JSContext *cx, unsigned argc, Value *vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
|
||||
if ((argc != 1) ||
|
||||
(!args[0].isObject() || !ObjectIsVector<V>(args[0].toObject())))
|
||||
{
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_TYPED_ARRAY_BAD_ARGS);
|
||||
return false;
|
||||
}
|
||||
typename V::Elem *val =
|
||||
reinterpret_cast<typename V::Elem *>(AsTypedDatum(args[0].toObject()).typedMem());
|
||||
typename Vret::Elem result[Vret::lanes];
|
||||
for (int32_t i = 0; i < Vret::lanes; i++)
|
||||
result[i] = static_cast<typename Vret::Elem>(val[i]);
|
||||
|
||||
RootedObject obj(cx, Create<Vret>(cx, result));
|
||||
if (!obj)
|
||||
return false;
|
||||
|
||||
args.rval().setObject(*obj);
|
||||
return true;
|
||||
}
|
||||
|
||||
template<typename V, typename Vret>
|
||||
static bool
|
||||
FuncConvertBits(JSContext *cx, unsigned argc, Value *vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
|
||||
if ((argc != 1) ||
|
||||
(!args[0].isObject() || !ObjectIsVector<V>(args[0].toObject())))
|
||||
{
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_TYPED_ARRAY_BAD_ARGS);
|
||||
return false;
|
||||
}
|
||||
typename Vret::Elem *val =
|
||||
reinterpret_cast<typename Vret::Elem *>(AsTypedDatum(args[0].toObject()).typedMem());
|
||||
|
||||
RootedObject obj(cx, Create<Vret>(cx, val));
|
||||
if (!obj)
|
||||
return false;
|
||||
|
||||
args.rval().setObject(*obj);
|
||||
return true;
|
||||
}
|
||||
|
||||
template<typename Vret>
|
||||
static bool
|
||||
FuncZero(JSContext *cx, unsigned argc, Value *vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
|
||||
if (argc != 0) {
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_TYPED_ARRAY_BAD_ARGS);
|
||||
return false;
|
||||
}
|
||||
typename Vret::Elem result[Vret::lanes];
|
||||
for (int32_t i = 0; i < Vret::lanes; i++)
|
||||
result[i] = static_cast<typename Vret::Elem>(0);
|
||||
|
||||
RootedObject obj(cx, Create<Vret>(cx, result));
|
||||
if (!obj)
|
||||
return false;
|
||||
|
||||
args.rval().setObject(*obj);
|
||||
return true;
|
||||
}
|
||||
|
||||
template<typename Vret>
|
||||
static bool
|
||||
FuncSplat(JSContext *cx, unsigned argc, Value *vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
|
||||
if ((argc != 1) || (!args[0].isNumber())) {
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_TYPED_ARRAY_BAD_ARGS);
|
||||
return false;
|
||||
}
|
||||
typename Vret::Elem result[Vret::lanes];
|
||||
for (int32_t i = 0; i < Vret::lanes; i++) {
|
||||
typename Vret::Elem arg0;
|
||||
Vret::toType2(cx, args[0], &arg0);
|
||||
result[i] = static_cast<typename Vret::Elem>(arg0);
|
||||
}
|
||||
|
||||
RootedObject obj(cx, Create<Vret>(cx, result));
|
||||
if (!obj)
|
||||
return false;
|
||||
|
||||
args.rval().setObject(*obj);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
Int32x4Bool(JSContext *cx, unsigned argc, Value *vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
|
||||
if ((argc != 4) ||
|
||||
(!args[0].isBoolean()) || !args[1].isBoolean() ||
|
||||
(!args[2].isBoolean()) || !args[3].isBoolean())
|
||||
{
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_TYPED_ARRAY_BAD_ARGS);
|
||||
return false;
|
||||
}
|
||||
int32_t result[Int32x4::lanes];
|
||||
for (int32_t i = 0; i < Int32x4::lanes; i++)
|
||||
result[i] = args[i].toBoolean() ? 0xFFFFFFFF : 0x0;
|
||||
|
||||
RootedObject obj(cx, Create<Int32x4>(cx, result));
|
||||
if (!obj)
|
||||
return false;
|
||||
|
||||
args.rval().setObject(*obj);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
Float32x4Clamp(JSContext *cx, unsigned argc, Value *vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
|
||||
if ((argc != 3) ||
|
||||
(!args[0].isObject() || !ObjectIsVector<Float32x4>(args[0].toObject())) ||
|
||||
(!args[1].isObject() || !ObjectIsVector<Float32x4>(args[1].toObject())) ||
|
||||
(!args[2].isObject() || !ObjectIsVector<Float32x4>(args[2].toObject())))
|
||||
{
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_TYPED_ARRAY_BAD_ARGS);
|
||||
return false;
|
||||
}
|
||||
float *val = reinterpret_cast<float *>(AsTypedDatum(args[0].toObject()).typedMem());
|
||||
float *lowerLimit = reinterpret_cast<float *>(AsTypedDatum(args[1].toObject()).typedMem());
|
||||
float *upperLimit = reinterpret_cast<float *>(AsTypedDatum(args[2].toObject()).typedMem());
|
||||
|
||||
float result[Float32x4::lanes];
|
||||
result[0] = val[0] < lowerLimit[0] ? lowerLimit[0] : val[0];
|
||||
result[1] = val[1] < lowerLimit[1] ? lowerLimit[1] : val[1];
|
||||
result[2] = val[2] < lowerLimit[2] ? lowerLimit[2] : val[2];
|
||||
result[3] = val[3] < lowerLimit[3] ? lowerLimit[3] : val[3];
|
||||
result[0] = result[0] > upperLimit[0] ? upperLimit[0] : result[0];
|
||||
result[1] = result[1] > upperLimit[1] ? upperLimit[1] : result[1];
|
||||
result[2] = result[2] > upperLimit[2] ? upperLimit[2] : result[2];
|
||||
result[3] = result[3] > upperLimit[3] ? upperLimit[3] : result[3];
|
||||
RootedObject obj(cx, Create<Float32x4>(cx, result));
|
||||
if (!obj)
|
||||
return false;
|
||||
|
||||
args.rval().setObject(*obj);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
Int32x4Select(JSContext *cx, unsigned argc, Value *vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
|
||||
if ((argc != 3) ||
|
||||
(!args[0].isObject() || !ObjectIsVector<Int32x4>(args[0].toObject())) ||
|
||||
(!args[1].isObject() || !ObjectIsVector<Float32x4>(args[1].toObject())) ||
|
||||
(!args[2].isObject() || !ObjectIsVector<Float32x4>(args[2].toObject())))
|
||||
{
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_TYPED_ARRAY_BAD_ARGS);
|
||||
return false;
|
||||
}
|
||||
int32_t *val = reinterpret_cast<int32_t *>(AsTypedDatum(args[0].toObject()).typedMem());
|
||||
int32_t *tv = reinterpret_cast<int32_t *>(AsTypedDatum(args[1].toObject()).typedMem());
|
||||
int32_t *fv = reinterpret_cast<int32_t *>(AsTypedDatum(args[2].toObject()).typedMem());
|
||||
int32_t tr[Int32x4::lanes];
|
||||
for (int32_t i = 0; i < Int32x4::lanes; i++)
|
||||
tr[i] = And<int32_t, Int32x4>::apply(val[i], tv[i]);
|
||||
int32_t fr[Int32x4::lanes];
|
||||
for (int32_t i = 0; i < Int32x4::lanes; i++)
|
||||
fr[i] = And<int32_t, Int32x4>::apply(Not<int32_t, Int32x4>::apply(val[i], 0), fv[i]);
|
||||
int32_t orInt[Int32x4::lanes];
|
||||
for (int32_t i = 0; i < Int32x4::lanes; i++)
|
||||
orInt[i] = Or<int32_t, Int32x4>::apply(tr[i], fr[i]);
|
||||
float *result[Float32x4::lanes];
|
||||
*result = reinterpret_cast<float *>(&orInt);
|
||||
RootedObject obj(cx, Create<Float32x4>(cx, *result));
|
||||
if (!obj)
|
||||
return false;
|
||||
|
||||
args.rval().setObject(*obj);
|
||||
return true;
|
||||
}
|
||||
|
||||
const JSFunctionSpec js::Float32x4Methods[] = {
|
||||
JS_FN("abs", (Func<Float32x4, Abs<float, Float32x4>, Float32x4>), 1, 0),
|
||||
JS_FN("neg", (Func<Float32x4, Neg<float, Float32x4>, Float32x4>), 1, 0),
|
||||
JS_FN("reciprocal", (Func<Float32x4, Rec<float, Float32x4>, Float32x4>), 1, 0),
|
||||
JS_FN("reciprocalSqrt", (Func<Float32x4, RecSqrt<float, Float32x4>, Float32x4>), 1, 0),
|
||||
JS_FN("sqrt", (Func<Float32x4, Sqrt<float, Float32x4>, Float32x4>), 1, 0),
|
||||
JS_FN("add", (Func<Float32x4, Add<float, Float32x4>, Float32x4>), 2, 0),
|
||||
JS_FN("sub", (Func<Float32x4, Sub<float, Float32x4>, Float32x4>), 2, 0),
|
||||
JS_FN("div", (Func<Float32x4, Div<float, Float32x4>, Float32x4>), 2, 0),
|
||||
JS_FN("mul", (Func<Float32x4, Mul<float, Float32x4>, Float32x4>), 2, 0),
|
||||
JS_FN("max", (Func<Float32x4, Maximum<float, Float32x4>, Float32x4>), 2, 0),
|
||||
JS_FN("min", (Func<Float32x4, Minimum<float, Float32x4>, Float32x4>), 2, 0),
|
||||
JS_FN("lessThan", (Func<Float32x4, LessThan<float, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("lessThanOrEqual", (Func<Float32x4, LessThanOrEqual<float, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("greaterThan", (Func<Float32x4, GreaterThan<float, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("greaterThanOrEqual", (Func<Float32x4, GreaterThanOrEqual<float, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("equal", (Func<Float32x4, Equal<float, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("notEqual", (Func<Float32x4, NotEqual<float, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("withX", (FuncWith<Float32x4, WithX<float, Float32x4>, Float32x4>), 2, 0),
|
||||
JS_FN("withY", (FuncWith<Float32x4, WithY<float, Float32x4>, Float32x4>), 2, 0),
|
||||
JS_FN("withZ", (FuncWith<Float32x4, WithZ<float, Float32x4>, Float32x4>), 2, 0),
|
||||
JS_FN("withW", (FuncWith<Float32x4, WithW<float, Float32x4>, Float32x4>), 2, 0),
|
||||
JS_FN("shuffle", (FuncShuffle<Float32x4, Shuffle<float, Float32x4>, Float32x4>), 2, 0),
|
||||
JS_FN("shuffleMix", (FuncShuffle<Float32x4, Shuffle<float, Float32x4>, Float32x4>), 3, 0),
|
||||
JS_FN("scale", (FuncWith<Float32x4, Scale<float, Float32x4>, Float32x4>), 2, 0),
|
||||
JS_FN("clamp", Float32x4Clamp, 3, 0),
|
||||
JS_FN("toInt32x4", (FuncConvert<Float32x4, Int32x4>), 1, 0),
|
||||
JS_FN("bitsToInt32x4", (FuncConvertBits<Float32x4, Int32x4>), 1, 0),
|
||||
JS_FN("zero", (FuncZero<Float32x4>), 0, 0),
|
||||
JS_FN("splat", (FuncSplat<Float32x4>), 0, 0),
|
||||
JS_FS_END
|
||||
};
|
||||
|
||||
const JSFunctionSpec js::Int32x4Methods[] = {
|
||||
JS_FN("not", (Func<Int32x4, Not<int32_t, Int32x4>, Int32x4>), 1, 0),
|
||||
JS_FN("neg", (Func<Int32x4, Neg<int32_t, Int32x4>, Int32x4>), 1, 0),
|
||||
JS_FN("add", (Func<Int32x4, Add<int32_t, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("sub", (Func<Int32x4, Sub<int32_t, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("mul", (Func<Int32x4, Mul<int32_t, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("xor", (Func<Int32x4, Xor<int32_t, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("and", (Func<Int32x4, And<int32_t, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("or", (Func<Int32x4, Or<int32_t, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("withX", (FuncWith<Int32x4, WithX<int32_t, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("withY", (FuncWith<Int32x4, WithY<int32_t, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("withZ", (FuncWith<Int32x4, WithZ<int32_t, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("withW", (FuncWith<Int32x4, WithW<int32_t, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("withFlagX", (FuncWith<Int32x4, WithFlagX<int32_t, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("withFlagY", (FuncWith<Int32x4, WithFlagY<int32_t, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("withFlagZ", (FuncWith<Int32x4, WithFlagZ<int32_t, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("withFlagW", (FuncWith<Int32x4, WithFlagW<int32_t, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("shuffle", (FuncShuffle<Int32x4, Shuffle<int32_t, Int32x4>, Int32x4>), 2, 0),
|
||||
JS_FN("shuffleMix", (FuncShuffle<Int32x4, Shuffle<int32_t, Int32x4>, Int32x4>), 3, 0),
|
||||
JS_FN("toFloat32x4", (FuncConvert<Int32x4, Float32x4>), 1, 0),
|
||||
JS_FN("bitsToFloat32x4", (FuncConvertBits<Int32x4, Float32x4>), 1, 0),
|
||||
JS_FN("zero", (FuncZero<Int32x4>), 0, 0),
|
||||
JS_FN("splat", (FuncSplat<Int32x4>), 0, 0),
|
||||
JS_FN("select", Int32x4Select, 3, 0),
|
||||
JS_FN("bool", Int32x4Bool, 4, 0),
|
||||
JS_FS_END
|
||||
};
|
34
js/src/builtin/SIMD.h
Normal file
34
js/src/builtin/SIMD.h
Normal file
@ -0,0 +1,34 @@
|
||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
* vim: set ts=8 sts=4 et sw=4 tw=99:
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#ifndef builtin_SIMD_h
|
||||
#define builtin_SIMD_h
|
||||
|
||||
#include "jsapi.h"
|
||||
#include "jsobj.h"
|
||||
|
||||
/*
|
||||
* JS SIMD functions.
|
||||
* Spec matching polyfill:
|
||||
* https://github.com/johnmccutchan/ecmascript_simd/blob/master/src/ecmascript_simd.js
|
||||
*/
|
||||
|
||||
namespace js {
|
||||
|
||||
class SIMDObject : public JSObject
|
||||
{
|
||||
public:
|
||||
static const Class class_;
|
||||
static JSObject* initClass(JSContext *cx, Handle<GlobalObject *> global);
|
||||
static bool toString(JSContext *cx, unsigned int argc, jsval *vp);
|
||||
};
|
||||
|
||||
} /* namespace js */
|
||||
|
||||
JSObject *
|
||||
js_InitSIMDClass(JSContext *cx, js::HandleObject obj);
|
||||
|
||||
#endif /* builtin_SIMD_h */
|
@ -367,15 +367,13 @@ TypeRepresentation::addToTableOrFree(JSContext *cx,
|
||||
Rooted<GlobalObject*> global(cx, cx->global());
|
||||
JSCompartment *comp = cx->compartment();
|
||||
|
||||
// First, try to create the typed object to associate with this
|
||||
// First, try to create the TI type object to associate with this
|
||||
// type representation. Since nothing is in the table yet, if this
|
||||
// fails we can just return and pretend this whole endeavor was
|
||||
// just a bad dream.
|
||||
RootedObject proto(cx);
|
||||
const Class *clasp;
|
||||
if (!global->getTypedObjectModule().getSuitableClaspAndProto(cx, kind(),
|
||||
&clasp, &proto))
|
||||
{
|
||||
if (!TypedObjectModuleObject::getSuitableClaspAndProto(cx, kind(), &clasp, &proto)) {
|
||||
return nullptr;
|
||||
}
|
||||
RootedTypeObject typeObject(cx, comp->types.newTypeObject(cx, clasp, proto));
|
||||
|
@ -63,88 +63,72 @@ ToObjectIfObject(HandleValue value)
|
||||
return &value.toObject();
|
||||
}
|
||||
|
||||
static inline bool
|
||||
IsTypedDatum(JSObject &obj)
|
||||
{
|
||||
return obj.is<TypedObject>() || obj.is<TypedHandle>();
|
||||
}
|
||||
|
||||
static inline uint8_t *
|
||||
TypedMem(JSObject &val)
|
||||
TypedMem(const JSObject &val)
|
||||
{
|
||||
JS_ASSERT(IsTypedDatum(val));
|
||||
return (uint8_t*) val.getPrivate();
|
||||
}
|
||||
|
||||
static inline bool IsTypeObject(JSObject &type);
|
||||
static inline bool IsTypeObject(const JSObject &type);
|
||||
|
||||
/*
|
||||
* Given a user-visible type descriptor object, returns the
|
||||
* owner object for the TypeRepresentation* that we use internally.
|
||||
*/
|
||||
static JSObject *
|
||||
typeRepresentationOwnerObj(JSObject &typeObj)
|
||||
JSObject *
|
||||
js::typeRepresentationOwnerObj(const JSObject &typeObj)
|
||||
{
|
||||
JS_ASSERT(IsTypeObject(typeObj));
|
||||
return &typeObj.getReservedSlot(JS_TYPEOBJ_SLOT_TYPE_REPR).toObject();
|
||||
}
|
||||
|
||||
/*
|
||||
* Given a user-visible type descriptor object, returns the
|
||||
* TypeRepresentation* that we use internally.
|
||||
*
|
||||
* Note: this pointer is valid only so long as `typeObj` remains rooted.
|
||||
*/
|
||||
static TypeRepresentation *
|
||||
typeRepresentation(JSObject &typeObj)
|
||||
TypeRepresentation *
|
||||
js::typeRepresentation(const JSObject &typeObj)
|
||||
{
|
||||
return TypeRepresentation::fromOwnerObject(*typeRepresentationOwnerObj(typeObj));
|
||||
}
|
||||
|
||||
static inline bool
|
||||
IsScalarTypeObject(JSObject &type)
|
||||
IsScalarTypeObject(const JSObject &type)
|
||||
{
|
||||
return type.hasClass(&ScalarType::class_);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
IsReferenceTypeObject(JSObject &type)
|
||||
IsReferenceTypeObject(const JSObject &type)
|
||||
{
|
||||
return type.hasClass(&ReferenceType::class_);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
IsSimpleTypeObject(JSObject &type)
|
||||
IsSimpleTypeObject(const JSObject &type)
|
||||
{
|
||||
return IsScalarTypeObject(type) || IsReferenceTypeObject(type);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
IsArrayTypeObject(JSObject &type)
|
||||
IsArrayTypeObject(const JSObject &type)
|
||||
{
|
||||
return type.hasClass(&ArrayType::class_);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
IsStructTypeObject(JSObject &type)
|
||||
IsStructTypeObject(const JSObject &type)
|
||||
{
|
||||
return type.hasClass(&StructType::class_);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
IsX4TypeObject(JSObject &type)
|
||||
IsX4TypeObject(const JSObject &type)
|
||||
{
|
||||
return type.hasClass(&X4Type::class_);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
IsComplexTypeObject(JSObject &type)
|
||||
IsComplexTypeObject(const JSObject &type)
|
||||
{
|
||||
return IsArrayTypeObject(type) || IsStructTypeObject(type);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
IsTypeObject(JSObject &type)
|
||||
IsTypeObject(const JSObject &type)
|
||||
{
|
||||
return IsScalarTypeObject(type) ||
|
||||
IsReferenceTypeObject(type) ||
|
||||
@ -171,14 +155,14 @@ IsSizedTypeObject(JSObject &type)
|
||||
}
|
||||
|
||||
static inline JSObject *
|
||||
GetType(JSObject &datum)
|
||||
GetType(const JSObject &datum)
|
||||
{
|
||||
JS_ASSERT(IsTypedDatum(datum));
|
||||
return &datum.getReservedSlot(JS_DATUM_SLOT_TYPE_OBJ).toObject();
|
||||
}
|
||||
|
||||
static bool
|
||||
TypeObjectToSource(JSContext *cx, unsigned int argc, Value *vp)
|
||||
bool
|
||||
js::TypeObjectToSource(JSContext *cx, unsigned int argc, Value *vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
|
||||
@ -404,20 +388,6 @@ const JSFunctionSpec js::ScalarType::typeObjectMethods[] = {
|
||||
JS_FS_END
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
static T ConvertScalar(double d)
|
||||
{
|
||||
if (TypeIsFloatingPoint<T>()) {
|
||||
return T(d);
|
||||
} else if (TypeIsUnsigned<T>()) {
|
||||
uint32_t n = ToUint32(d);
|
||||
return T(n);
|
||||
} else {
|
||||
int32_t n = ToInt32(d);
|
||||
return T(n);
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
ScalarType::call(JSContext *cx, unsigned argc, Value *vp)
|
||||
{
|
||||
@ -631,10 +601,10 @@ ArrayElementType(JSObject &array)
|
||||
return &array.getReservedSlot(JS_TYPEOBJ_SLOT_ARRAY_ELEM_TYPE).toObject();
|
||||
}
|
||||
|
||||
static bool
|
||||
InitializeCommonTypeDescriptorProperties(JSContext *cx,
|
||||
HandleObject obj,
|
||||
HandleObject typeReprOwnerObj)
|
||||
bool
|
||||
js::InitializeCommonTypeDescriptorProperties(JSContext *cx,
|
||||
HandleObject obj,
|
||||
HandleObject typeReprOwnerObj)
|
||||
{
|
||||
TypeRepresentation *typeRepr =
|
||||
TypeRepresentation::fromOwnerObject(*typeReprOwnerObj);
|
||||
@ -1174,183 +1144,6 @@ DefineSimpleTypeObject(JSContext *cx,
|
||||
return true;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// X4
|
||||
|
||||
const Class X4Type::class_ = {
|
||||
"X4",
|
||||
JSCLASS_HAS_RESERVED_SLOTS(JS_TYPEOBJ_X4_SLOTS),
|
||||
JS_PropertyStub,
|
||||
JS_DeletePropertyStub,
|
||||
JS_PropertyStub,
|
||||
JS_StrictPropertyStub,
|
||||
JS_EnumerateStub,
|
||||
JS_ResolveStub,
|
||||
JS_ConvertStub,
|
||||
nullptr,
|
||||
nullptr,
|
||||
call,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr
|
||||
};
|
||||
|
||||
// These classes just exist to group together various properties and so on.
|
||||
namespace js {
|
||||
class Int32x4Defn {
|
||||
public:
|
||||
static const X4TypeRepresentation::Type type = X4TypeRepresentation::TYPE_INT32;
|
||||
static const JSFunctionSpec TypeDescriptorMethods[];
|
||||
static const JSPropertySpec TypedObjectProperties[];
|
||||
static const JSFunctionSpec TypedObjectMethods[];
|
||||
};
|
||||
class Float32x4Defn {
|
||||
public:
|
||||
static const X4TypeRepresentation::Type type = X4TypeRepresentation::TYPE_FLOAT32;
|
||||
static const JSFunctionSpec TypeDescriptorMethods[];
|
||||
static const JSPropertySpec TypedObjectProperties[];
|
||||
static const JSFunctionSpec TypedObjectMethods[];
|
||||
};
|
||||
} // namespace js
|
||||
|
||||
const JSFunctionSpec js::Int32x4Defn::TypeDescriptorMethods[] = {
|
||||
JS_FN("toSource", TypeObjectToSource, 0, 0),
|
||||
{"handle", {nullptr, nullptr}, 2, 0, "HandleCreate"},
|
||||
{"array", {nullptr, nullptr}, 1, 0, "ArrayShorthand"},
|
||||
{"equivalent", {nullptr, nullptr}, 1, 0, "TypeObjectEquivalent"},
|
||||
JS_FS_END
|
||||
};
|
||||
|
||||
const JSPropertySpec js::Int32x4Defn::TypedObjectProperties[] = {
|
||||
JS_SELF_HOSTED_GET("x", "Int32x4Lane0", JSPROP_PERMANENT),
|
||||
JS_SELF_HOSTED_GET("y", "Int32x4Lane1", JSPROP_PERMANENT),
|
||||
JS_SELF_HOSTED_GET("z", "Int32x4Lane2", JSPROP_PERMANENT),
|
||||
JS_SELF_HOSTED_GET("w", "Int32x4Lane3", JSPROP_PERMANENT),
|
||||
JS_PS_END
|
||||
};
|
||||
|
||||
const JSFunctionSpec js::Int32x4Defn::TypedObjectMethods[] = {
|
||||
JS_SELF_HOSTED_FN("toSource", "X4ToSource", 0, 0),
|
||||
JS_FS_END
|
||||
};
|
||||
|
||||
const JSFunctionSpec js::Float32x4Defn::TypeDescriptorMethods[] = {
|
||||
JS_FN("toSource", TypeObjectToSource, 0, 0),
|
||||
{"handle", {nullptr, nullptr}, 2, 0, "HandleCreate"},
|
||||
{"array", {nullptr, nullptr}, 1, 0, "ArrayShorthand"},
|
||||
{"equivalent", {nullptr, nullptr}, 1, 0, "TypeObjectEquivalent"},
|
||||
JS_FS_END
|
||||
};
|
||||
|
||||
const JSPropertySpec js::Float32x4Defn::TypedObjectProperties[] = {
|
||||
JS_SELF_HOSTED_GET("x", "Float32x4Lane0", JSPROP_PERMANENT),
|
||||
JS_SELF_HOSTED_GET("y", "Float32x4Lane1", JSPROP_PERMANENT),
|
||||
JS_SELF_HOSTED_GET("z", "Float32x4Lane2", JSPROP_PERMANENT),
|
||||
JS_SELF_HOSTED_GET("w", "Float32x4Lane3", JSPROP_PERMANENT),
|
||||
JS_PS_END
|
||||
};
|
||||
|
||||
const JSFunctionSpec js::Float32x4Defn::TypedObjectMethods[] = {
|
||||
JS_SELF_HOSTED_FN("toSource", "X4ToSource", 0, 0),
|
||||
JS_FS_END
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
static JSObject *
|
||||
CreateX4Class(JSContext *cx, Handle<GlobalObject*> global)
|
||||
{
|
||||
RootedObject funcProto(cx, global->getOrCreateFunctionPrototype(cx));
|
||||
if (!funcProto)
|
||||
return nullptr;
|
||||
|
||||
// Create type representation
|
||||
|
||||
RootedObject typeReprObj(cx);
|
||||
typeReprObj = X4TypeRepresentation::Create(cx, T::type);
|
||||
if (!typeReprObj)
|
||||
return nullptr;
|
||||
|
||||
// Create prototype property, which inherits from Object.prototype
|
||||
|
||||
RootedObject objProto(cx, global->getOrCreateObjectPrototype(cx));
|
||||
if (!objProto)
|
||||
return nullptr;
|
||||
RootedObject proto(cx);
|
||||
proto = NewObjectWithGivenProto(cx, &JSObject::class_, objProto, global, SingletonObject);
|
||||
if (!proto)
|
||||
return nullptr;
|
||||
|
||||
// Create type constructor itself
|
||||
|
||||
RootedObject x4(cx);
|
||||
x4 = NewObjectWithClassProto(cx, &X4Type::class_, funcProto, global);
|
||||
if (!x4 ||
|
||||
!InitializeCommonTypeDescriptorProperties(cx, x4, typeReprObj) ||
|
||||
!DefinePropertiesAndBrand(cx, proto, nullptr, nullptr))
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Link type constructor to the type representation
|
||||
|
||||
x4->initReservedSlot(JS_TYPEOBJ_SLOT_TYPE_REPR, ObjectValue(*typeReprObj));
|
||||
|
||||
// Link constructor to prototype and install properties
|
||||
|
||||
if (!JS_DefineFunctions(cx, x4, T::TypeDescriptorMethods))
|
||||
return nullptr;
|
||||
|
||||
if (!LinkConstructorAndPrototype(cx, x4, proto) ||
|
||||
!DefinePropertiesAndBrand(cx, proto, T::TypedObjectProperties,
|
||||
T::TypedObjectMethods))
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return x4;
|
||||
}
|
||||
|
||||
bool
|
||||
X4Type::call(JSContext *cx, unsigned argc, Value *vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
const uint32_t LANES = 4;
|
||||
|
||||
if (args.length() < LANES) {
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_MORE_ARGS_NEEDED,
|
||||
args.callee().getClass()->name, "3", "s");
|
||||
return false;
|
||||
}
|
||||
|
||||
double values[LANES];
|
||||
for (uint32_t i = 0; i < LANES; i++) {
|
||||
if (!ToNumber(cx, args[i], &values[i]))
|
||||
return false;
|
||||
}
|
||||
|
||||
RootedObject typeObj(cx, &args.callee());
|
||||
RootedObject result(cx, TypedObject::createZeroed(cx, typeObj, 0));
|
||||
if (!result)
|
||||
return false;
|
||||
|
||||
X4TypeRepresentation *typeRepr = typeRepresentation(*typeObj)->asX4();
|
||||
switch (typeRepr->type()) {
|
||||
#define STORE_LANES(_constant, _type, _name) \
|
||||
case _constant: \
|
||||
{ \
|
||||
_type *mem = (_type*) TypedMem(*result); \
|
||||
for (uint32_t i = 0; i < LANES; i++) { \
|
||||
mem[i] = values[i]; \
|
||||
} \
|
||||
break; \
|
||||
}
|
||||
JS_FOR_EACH_X4_TYPE_REPR(STORE_LANES)
|
||||
#undef STORE_LANES
|
||||
}
|
||||
args.rval().setObject(*result);
|
||||
return true;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<typename T>
|
||||
@ -1417,6 +1210,12 @@ DefineMetaTypeObject(JSContext *cx,
|
||||
return ctor;
|
||||
}
|
||||
|
||||
/* The initialization strategy for TypedObjects is mildly unusual
|
||||
* compared to other classes. Because all of the types are members
|
||||
* of a single global, `TypedObject`, we basically make the
|
||||
* initializer for the `TypedObject` class populate the
|
||||
* `TypedObject` global (which is referred to as "module" herein).
|
||||
*/
|
||||
bool
|
||||
GlobalObject::initTypedObjectModule(JSContext *cx, Handle<GlobalObject*> global)
|
||||
{
|
||||
@ -1432,34 +1231,6 @@ GlobalObject::initTypedObjectModule(JSContext *cx, Handle<GlobalObject*> global)
|
||||
if (!JS_DefineFunctions(cx, module, TypedObjectMethods))
|
||||
return false;
|
||||
|
||||
RootedValue moduleValue(cx, ObjectValue(*module));
|
||||
|
||||
global->setConstructor(JSProto_TypedObject, moduleValue);
|
||||
return true;
|
||||
}
|
||||
|
||||
JSObject *
|
||||
js_InitTypedObjectModuleObject(JSContext *cx, HandleObject obj)
|
||||
{
|
||||
/*
|
||||
* The initialization strategy for TypedObjects is mildly unusual
|
||||
* compared to other classes. Because all of the types are members
|
||||
* of a single global, `TypedObject`, we basically make the
|
||||
* initialized for the `TypedObject` class populate the
|
||||
* `TypedObject` global (which is referred to as "module" herein).
|
||||
*/
|
||||
|
||||
JS_ASSERT(obj->is<GlobalObject>());
|
||||
Rooted<GlobalObject *> global(cx, &obj->as<GlobalObject>());
|
||||
|
||||
RootedObject module(cx, global->getOrCreateTypedObjectModule(cx));
|
||||
if (!module)
|
||||
return nullptr;
|
||||
|
||||
// Define TypedObject global.
|
||||
|
||||
RootedValue moduleValue(cx, ObjectValue(*module));
|
||||
|
||||
// uint8, uint16, any, etc
|
||||
|
||||
#define BINARYDATA_SCALAR_DEFINE(constant_, type_, name_) \
|
||||
@ -1476,38 +1247,6 @@ js_InitTypedObjectModuleObject(JSContext *cx, HandleObject obj)
|
||||
JS_FOR_EACH_REFERENCE_TYPE_REPR(BINARYDATA_REFERENCE_DEFINE)
|
||||
#undef BINARYDATA_REFERENCE_DEFINE
|
||||
|
||||
// float32x4
|
||||
|
||||
RootedObject float32x4Object(cx);
|
||||
float32x4Object = CreateX4Class<Float32x4Defn>(cx, global);
|
||||
if (!float32x4Object)
|
||||
return nullptr;
|
||||
|
||||
RootedValue float32x4Value(cx, ObjectValue(*float32x4Object));
|
||||
if (!JSObject::defineProperty(cx, module, cx->names().float32x4,
|
||||
float32x4Value,
|
||||
nullptr, nullptr,
|
||||
JSPROP_READONLY | JSPROP_PERMANENT))
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// int32x4
|
||||
|
||||
RootedObject int32x4Object(cx);
|
||||
int32x4Object = CreateX4Class<Int32x4Defn>(cx, global);
|
||||
if (!int32x4Object)
|
||||
return nullptr;
|
||||
|
||||
RootedValue int32x4Value(cx, ObjectValue(*int32x4Object));
|
||||
if (!JSObject::defineProperty(cx, module, cx->names().int32x4,
|
||||
int32x4Value,
|
||||
nullptr, nullptr,
|
||||
JSPROP_READONLY | JSPROP_PERMANENT))
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// ArrayType.
|
||||
|
||||
RootedObject arrayType(cx);
|
||||
@ -1557,15 +1296,27 @@ js_InitTypedObjectModuleObject(JSContext *cx, HandleObject obj)
|
||||
}
|
||||
|
||||
// Everything is setup, install module on the global object:
|
||||
RootedValue moduleValue(cx, ObjectValue(*module));
|
||||
global->setConstructor(JSProto_TypedObject, moduleValue);
|
||||
if (!JSObject::defineProperty(cx, global, cx->names().TypedObject,
|
||||
moduleValue,
|
||||
nullptr, nullptr,
|
||||
0))
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return module;
|
||||
}
|
||||
|
||||
JSObject *
|
||||
js_InitTypedObjectModuleObject(JSContext *cx, HandleObject obj)
|
||||
{
|
||||
JS_ASSERT(obj->is<GlobalObject>());
|
||||
Rooted<GlobalObject *> global(cx, &obj->as<GlobalObject>());
|
||||
return global->getOrCreateTypedObjectModule(cx);
|
||||
}
|
||||
|
||||
JSObject *
|
||||
js_InitTypedObjectDummy(JSContext *cx, HandleObject obj)
|
||||
{
|
||||
@ -1578,41 +1329,56 @@ js_InitTypedObjectDummy(JSContext *cx, HandleObject obj)
|
||||
MOZ_ASSUME_UNREACHABLE("shouldn't be initializing TypedObject via the JSProtoKey initializer mechanism");
|
||||
}
|
||||
|
||||
bool
|
||||
/*
|
||||
* Each type repr has an associated TI type object (these will
|
||||
* eventually be used as the TI type objects for type objects, though
|
||||
* they are not now). To create these TI type objects, we need to know
|
||||
* the clasp/proto of the type object for a particular kind. This
|
||||
* accessor function returns those. In the case of the predefined type
|
||||
* objects, like scalars/references/x4s, this is invoked while
|
||||
* creating the typed object module, and thus does not require that
|
||||
* the typed object module is fully initialized. For array types and
|
||||
* struct types, it is invoked when the user creates an instance of
|
||||
* those types (and hence requires that the typed object module is
|
||||
* already initialized).
|
||||
*/
|
||||
/*static*/ bool
|
||||
TypedObjectModuleObject::getSuitableClaspAndProto(JSContext *cx,
|
||||
TypeRepresentation::Kind kind,
|
||||
const Class **clasp,
|
||||
MutableHandleObject proto)
|
||||
{
|
||||
Rooted<GlobalObject *> global(cx, cx->global());
|
||||
JS_ASSERT(global);
|
||||
switch (kind) {
|
||||
case TypeRepresentation::Scalar:
|
||||
*clasp = &ScalarType::class_;
|
||||
proto.set(global().getOrCreateFunctionPrototype(cx));
|
||||
proto.set(global->getOrCreateFunctionPrototype(cx));
|
||||
break;
|
||||
|
||||
case TypeRepresentation::Reference:
|
||||
*clasp = &ReferenceType::class_;
|
||||
proto.set(global().getOrCreateFunctionPrototype(cx));
|
||||
proto.set(global->getOrCreateFunctionPrototype(cx));
|
||||
break;
|
||||
|
||||
case TypeRepresentation::X4:
|
||||
*clasp = &X4Type::class_;
|
||||
proto.set(global().getOrCreateFunctionPrototype(cx));
|
||||
proto.set(global->getOrCreateFunctionPrototype(cx));
|
||||
break;
|
||||
|
||||
case TypeRepresentation::Struct:
|
||||
*clasp = &StructType::class_;
|
||||
proto.set(&getSlot(StructTypePrototype).toObject());
|
||||
proto.set(&global->getTypedObjectModule().getSlot(StructTypePrototype).toObject());
|
||||
break;
|
||||
|
||||
case TypeRepresentation::SizedArray:
|
||||
*clasp = &ArrayType::class_;
|
||||
proto.set(&getSlot(ArrayTypePrototype).toObject());
|
||||
proto.set(&global->getTypedObjectModule().getSlot(ArrayTypePrototype).toObject());
|
||||
break;
|
||||
|
||||
case TypeRepresentation::UnsizedArray:
|
||||
*clasp = &ArrayType::class_;
|
||||
proto.set(&getSlot(ArrayTypePrototype).toObject());
|
||||
proto.set(&global->getTypedObjectModule().getSlot(ArrayTypePrototype).toObject());
|
||||
break;
|
||||
}
|
||||
|
||||
@ -2454,6 +2220,18 @@ TypedDatum::dataOffset()
|
||||
return JSObject::getPrivateDataOffset(JS_DATUM_SLOTS);
|
||||
}
|
||||
|
||||
TypeRepresentation *
|
||||
TypedDatum::datumTypeRepresentation() const
|
||||
{
|
||||
return typeRepresentation(*GetType(*this));
|
||||
}
|
||||
|
||||
uint8_t *
|
||||
TypedDatum::typedMem() const
|
||||
{
|
||||
return TypedMem(*this);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Typed Objects
|
||||
*/
|
||||
@ -2854,10 +2632,31 @@ js::GetTypedObjectModule(JSContext *cx, unsigned argc, Value *vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
Rooted<GlobalObject*> global(cx, cx->global());
|
||||
JS_ASSERT(global);
|
||||
args.rval().setObject(global->getTypedObjectModule());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
js::GetFloat32x4TypeObject(JSContext *cx, unsigned argc, Value *vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
Rooted<GlobalObject*> global(cx, cx->global());
|
||||
JS_ASSERT(global);
|
||||
args.rval().setObject(global->float32x4TypeObject());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
js::GetInt32x4TypeObject(JSContext *cx, unsigned argc, Value *vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
Rooted<GlobalObject*> global(cx, cx->global());
|
||||
JS_ASSERT(global);
|
||||
args.rval().setObject(global->int32x4TypeObject());
|
||||
return true;
|
||||
}
|
||||
|
||||
#define JS_STORE_SCALAR_CLASS_IMPL(_constant, T, _name) \
|
||||
bool \
|
||||
js::StoreScalar##T::Func(ThreadSafeContext *, unsigned argc, Value *vp) \
|
||||
|
@ -111,12 +111,52 @@ class TypedObjectModuleObject : public JSObject {
|
||||
|
||||
static const Class class_;
|
||||
|
||||
bool getSuitableClaspAndProto(JSContext *cx,
|
||||
TypeRepresentation::Kind kind,
|
||||
const Class **clasp,
|
||||
MutableHandleObject proto);
|
||||
static bool getSuitableClaspAndProto(JSContext *cx,
|
||||
TypeRepresentation::Kind kind,
|
||||
const Class **clasp,
|
||||
MutableHandleObject proto);
|
||||
};
|
||||
|
||||
/*
|
||||
* Helper method for converting a double into other scalar
|
||||
* types in the same way that JavaScript would. In particular,
|
||||
* simple C casting from double to int32_t gets things wrong
|
||||
* for values like 0xF0000000.
|
||||
*/
|
||||
template <typename T>
|
||||
static T ConvertScalar(double d)
|
||||
{
|
||||
if (TypeIsFloatingPoint<T>()) {
|
||||
return T(d);
|
||||
} else if (TypeIsUnsigned<T>()) {
|
||||
uint32_t n = ToUint32(d);
|
||||
return T(n);
|
||||
} else {
|
||||
int32_t n = ToInt32(d);
|
||||
return T(n);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Given a user-visible type descriptor object, returns the
|
||||
* owner object for the TypeRepresentation* that we use internally.
|
||||
*/
|
||||
JSObject *typeRepresentationOwnerObj(const JSObject &typeObj);
|
||||
|
||||
/*
|
||||
* Given a user-visible type descriptor object, returns the
|
||||
* TypeRepresentation* that we use internally.
|
||||
*
|
||||
* Note: this pointer is valid only so long as `typeObj` remains rooted.
|
||||
*/
|
||||
TypeRepresentation *typeRepresentation(const JSObject &typeObj);
|
||||
|
||||
bool TypeObjectToSource(JSContext *cx, unsigned int argc, Value *vp);
|
||||
|
||||
bool InitializeCommonTypeDescriptorProperties(JSContext *cx,
|
||||
HandleObject obj,
|
||||
HandleObject typeReprOwnerObj);
|
||||
|
||||
// Type for scalar type constructors like `uint8`. All such type
|
||||
// constructors share a common js::Class and JSFunctionSpec. Scalar
|
||||
// types are non-opaque (their storage is visible unless combined with
|
||||
@ -154,6 +194,7 @@ class X4Type : public JSObject
|
||||
static const Class class_;
|
||||
|
||||
static bool call(JSContext *cx, unsigned argc, Value *vp);
|
||||
static bool is(const Value &v);
|
||||
};
|
||||
|
||||
/*
|
||||
@ -356,6 +397,9 @@ class TypedDatum : public JSObject
|
||||
|
||||
// Otherwise, use this to attach to memory referenced by another datum.
|
||||
void attach(JSObject &datum, uint32_t offset);
|
||||
|
||||
TypeRepresentation *datumTypeRepresentation() const;
|
||||
uint8_t *typedMem() const;
|
||||
};
|
||||
|
||||
class TypedObject : public TypedDatum
|
||||
@ -381,6 +425,21 @@ class TypedHandle : public TypedDatum
|
||||
static const JSFunctionSpec handleStaticMethods[];
|
||||
};
|
||||
|
||||
/*
|
||||
* Because TypedDatum is a supertype of two concrete
|
||||
* classes, we can't use JSObject.is() and JSObject.as(),
|
||||
* so create two concrete casting operations.
|
||||
*/
|
||||
|
||||
inline bool IsTypedDatum(const JSObject &obj) {
|
||||
return obj.is<TypedObject>() || obj.is<TypedHandle>();
|
||||
}
|
||||
|
||||
inline TypedDatum &AsTypedDatum(JSObject &obj) {
|
||||
JS_ASSERT(IsTypedDatum(obj));
|
||||
return *static_cast<TypedDatum *>(&obj);
|
||||
}
|
||||
|
||||
/*
|
||||
* Usage: NewTypedHandle(typeObj)
|
||||
*
|
||||
@ -485,6 +544,22 @@ extern const JSJitInfo MemcpyJitInfo;
|
||||
*/
|
||||
bool GetTypedObjectModule(JSContext *cx, unsigned argc, Value *vp);
|
||||
|
||||
/*
|
||||
* Usage: GetFloat32x4TypeObject()
|
||||
*
|
||||
* Returns the float32x4 type object. SIMD pseudo-module must have
|
||||
* been initialized for this to be safe.
|
||||
*/
|
||||
bool GetFloat32x4TypeObject(JSContext *cx, unsigned argc, Value *vp);
|
||||
|
||||
/*
|
||||
* Usage: GetInt32x4TypeObject()
|
||||
*
|
||||
* Returns the int32x4 type object. SIMD pseudo-module must have
|
||||
* been initialized for this to be safe.
|
||||
*/
|
||||
bool GetInt32x4TypeObject(JSContext *cx, unsigned argc, Value *vp);
|
||||
|
||||
/*
|
||||
* Usage: Store_int8(targetDatum, targetOffset, value)
|
||||
* ...
|
||||
@ -573,5 +648,8 @@ JS_FOR_EACH_REFERENCE_TYPE_REPR(JS_LOAD_REFERENCE_CLASS_DEFN)
|
||||
|
||||
} // namespace js
|
||||
|
||||
JSObject *
|
||||
js_InitTypedObjectModuleObject(JSContext *cx, JS::HandleObject obj);
|
||||
|
||||
#endif /* builtin_TypedObject_h */
|
||||
|
||||
|
@ -282,21 +282,20 @@ TypedObjectPointer.prototype.getReference = function() {
|
||||
|
||||
TypedObjectPointer.prototype.getX4 = function() {
|
||||
var type = REPR_TYPE(this.typeRepr);
|
||||
var T = GetTypedObjectModule();
|
||||
switch (type) {
|
||||
case JS_X4TYPEREPR_FLOAT32:
|
||||
var x = Load_float32(this.datum, this.offset + 0);
|
||||
var y = Load_float32(this.datum, this.offset + 4);
|
||||
var z = Load_float32(this.datum, this.offset + 8);
|
||||
var w = Load_float32(this.datum, this.offset + 12);
|
||||
return T.float32x4(x, y, z, w);
|
||||
return GetFloat32x4TypeObject()(x, y, z, w);
|
||||
|
||||
case JS_X4TYPEREPR_INT32:
|
||||
var x = Load_int32(this.datum, this.offset + 0);
|
||||
var y = Load_int32(this.datum, this.offset + 4);
|
||||
var z = Load_int32(this.datum, this.offset + 8);
|
||||
var w = Load_int32(this.datum, this.offset + 12);
|
||||
return T.int32x4(x, y, z, w);
|
||||
return GetInt32x4TypeObject()(x, y, z, w);
|
||||
}
|
||||
|
||||
assert(false, "Unhandled x4 type: " + type);
|
||||
@ -721,42 +720,6 @@ function X4ProtoString(type) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
var X4LaneStrings = ["x", "y", "z", "w"];
|
||||
|
||||
// Generalized handler for the various properties for accessing a
|
||||
// single lane of an X4 vector value. Note that this is the slow path;
|
||||
// the fast path will be inlined into ion code.
|
||||
function X4GetLane(datum, type, lane) {
|
||||
if (!IsObject(datum) || !ObjectIsTypedDatum(datum))
|
||||
ThrowError(JSMSG_INCOMPATIBLE_PROTO, X4ProtoString(type),
|
||||
X4LaneStrings[lane], typeof this);
|
||||
|
||||
var repr = DATUM_TYPE_REPR(datum);
|
||||
if (REPR_KIND(repr) != JS_TYPEREPR_X4_KIND || REPR_TYPE(repr) != type)
|
||||
ThrowError(JSMSG_INCOMPATIBLE_PROTO, X4ProtoString(type),
|
||||
X4LaneStrings[lane], typeof this);
|
||||
|
||||
switch (type) {
|
||||
case JS_X4TYPEREPR_INT32:
|
||||
return Load_int32(datum, lane * 4);
|
||||
case JS_X4TYPEREPR_FLOAT32:
|
||||
return Load_float32(datum, lane * 4);
|
||||
}
|
||||
|
||||
assert(false, "Unhandled type constant");
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function Float32x4Lane0() { return X4GetLane(this, JS_X4TYPEREPR_FLOAT32, 0); }
|
||||
function Float32x4Lane1() { return X4GetLane(this, JS_X4TYPEREPR_FLOAT32, 1); }
|
||||
function Float32x4Lane2() { return X4GetLane(this, JS_X4TYPEREPR_FLOAT32, 2); }
|
||||
function Float32x4Lane3() { return X4GetLane(this, JS_X4TYPEREPR_FLOAT32, 3); }
|
||||
|
||||
function Int32x4Lane0() { return X4GetLane(this, JS_X4TYPEREPR_INT32, 0); }
|
||||
function Int32x4Lane1() { return X4GetLane(this, JS_X4TYPEREPR_INT32, 1); }
|
||||
function Int32x4Lane2() { return X4GetLane(this, JS_X4TYPEREPR_INT32, 2); }
|
||||
function Int32x4Lane3() { return X4GetLane(this, JS_X4TYPEREPR_INT32, 3); }
|
||||
|
||||
function X4ToSource() {
|
||||
if (!IsObject(this) || !ObjectIsTypedDatum(this))
|
||||
ThrowError(JSMSG_INCOMPATIBLE_PROTO, "X4", "toSource", typeof this);
|
||||
|
@ -53,7 +53,10 @@
|
||||
#include "builtin/Intl.h"
|
||||
#include "builtin/MapObject.h"
|
||||
#include "builtin/RegExp.h"
|
||||
#ifdef ENABLE_BINARYDATA
|
||||
#include "builtin/SIMD.h"
|
||||
#include "builtin/TypedObject.h"
|
||||
#endif
|
||||
#include "frontend/BytecodeCompiler.h"
|
||||
#include "frontend/FullParseHandler.h" // for JS_BufferIsCompileableUnit
|
||||
#include "frontend/Parser.h" // for JS_BufferIsCompileableUnit
|
||||
@ -1219,6 +1222,10 @@ static const JSStdName builtin_property_names[] = {
|
||||
#if JS_HAS_UNEVAL
|
||||
{js_InitStringClass, EAGER_ATOM(uneval), OCLASP(String)},
|
||||
#endif
|
||||
#ifdef ENABLE_BINARYDATA
|
||||
{js_InitSIMDClass, EAGER_ATOM(SIMD), OCLASP(SIMD)},
|
||||
{js_InitTypedObjectModuleObject, EAGER_ATOM(TypedObject), OCLASP(TypedObjectModule)},
|
||||
#endif
|
||||
|
||||
{nullptr, 0, nullptr}
|
||||
};
|
||||
|
@ -5561,12 +5561,19 @@ JS::GetGCNumber()
|
||||
}
|
||||
|
||||
JS::AutoAssertNoGC::AutoAssertNoGC()
|
||||
: runtime(nullptr)
|
||||
: runtime(nullptr), gcNumber(0)
|
||||
{
|
||||
js::PerThreadData *data = js::TlsPerThreadData.get();
|
||||
if (data) {
|
||||
runtime = data->runtimeFromMainThread();
|
||||
gcNumber = runtime->gcNumber;
|
||||
/*
|
||||
* GC's from off-thread will always assert, so off-thread is implicitly
|
||||
* AutoAssertNoGC. We still need to allow AutoAssertNoGC to be used in
|
||||
* code that works from both threads, however. We also use this to
|
||||
* annotate the off thread run loops.
|
||||
*/
|
||||
runtime = data->runtimeIfOnOwnerThread();
|
||||
if (runtime)
|
||||
gcNumber = runtime->gcNumber;
|
||||
}
|
||||
}
|
||||
|
||||
@ -5579,7 +5586,5 @@ JS::AutoAssertNoGC::~AutoAssertNoGC()
|
||||
{
|
||||
if (runtime)
|
||||
MOZ_ASSERT(gcNumber == runtime->gcNumber, "GC ran inside an AutoAssertNoGC scope.");
|
||||
else
|
||||
MOZ_ASSERT(!js::TlsPerThreadData.get(), "Runtime created within AutoAssertNoGC scope?");
|
||||
}
|
||||
#endif
|
||||
|
@ -94,6 +94,7 @@
|
||||
IF_INTL(real,imaginary) (Intl, 36, js_InitIntlClass, CLASP(Intl)) \
|
||||
IF_BDATA(real,imaginary)(TypedObject, 37, js_InitTypedObjectModuleObject, OCLASP(TypedObjectModule)) \
|
||||
imaginary(GeneratorFunction, 38, js_InitIteratorClasses, dummy) \
|
||||
IF_BDATA(real,imaginary)(SIMD, 39, js_InitSIMDClass, OCLASP(SIMD)) \
|
||||
|
||||
#define JS_FOR_EACH_PROTOTYPE(macro) JS_FOR_PROTOTYPES(macro,macro)
|
||||
|
||||
|
@ -982,6 +982,7 @@ ScriptSource::getOffThreadCompressionChars(ExclusiveContext *cx)
|
||||
void
|
||||
WorkerThread::threadLoop()
|
||||
{
|
||||
JS::AutoAssertNoGC nogc;
|
||||
WorkerThreadState &state = *runtime->workerThreadState;
|
||||
AutoLockWorkerThreadState lock(state);
|
||||
|
||||
|
@ -97,6 +97,7 @@ UNIFIED_SOURCES += [
|
||||
'builtin/MapObject.cpp',
|
||||
'builtin/Object.cpp',
|
||||
'builtin/Profilers.cpp',
|
||||
'builtin/SIMD.cpp',
|
||||
'builtin/TestingFunctions.cpp',
|
||||
'builtin/TypedObject.cpp',
|
||||
'builtin/TypeRepresentation.cpp',
|
||||
|
24
js/src/tests/ecma_6/TypedObject/simd/float32x4abs.js
Normal file
24
js/src/tests/ecma_6/TypedObject/simd/float32x4abs.js
Normal file
@ -0,0 +1,24 @@
|
||||
//) |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 abs';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(-1, 2, -3, 4);
|
||||
var c = SIMD.float32x4.abs(a);
|
||||
assertEq(c.x, 1);
|
||||
assertEq(c.y, 2);
|
||||
assertEq(c.z, 3);
|
||||
assertEq(c.w, 4);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
25
js/src/tests/ecma_6/TypedObject/simd/float32x4add.js
Normal file
25
js/src/tests/ecma_6/TypedObject/simd/float32x4add.js
Normal file
@ -0,0 +1,25 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 add';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 2, 3, 4);
|
||||
var b = float32x4(10, 20, 30, 40);
|
||||
var c = SIMD.float32x4.add(a, b);
|
||||
assertEq(c.x, 11);
|
||||
assertEq(c.y, 22);
|
||||
assertEq(c.z, 33);
|
||||
assertEq(c.w, 44);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
@ -1,5 +1,7 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 938728;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
var summary = 'float32x4 alignment';
|
||||
|
||||
/*
|
||||
@ -9,7 +11,6 @@ var summary = 'float32x4 alignment';
|
||||
|
||||
var StructType = TypedObject.StructType;
|
||||
var uint8 = TypedObject.uint8;
|
||||
var float32x4 = TypedObject.float32x4;
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
@ -24,7 +25,6 @@ function test() {
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
print("Tests complete");
|
||||
}
|
||||
|
||||
test();
|
||||
|
@ -0,0 +1,25 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 bitsToInt32x4';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 2, 3, 4);
|
||||
var c = SIMD.float32x4.bitsToInt32x4(a);
|
||||
assertEq(c.x, 1065353216);
|
||||
assertEq(c.y, 1073741824);
|
||||
assertEq(c.z, 1077936128);
|
||||
assertEq(c.w, 1082130432);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
26
js/src/tests/ecma_6/TypedObject/simd/float32x4clamp.js
Normal file
26
js/src/tests/ecma_6/TypedObject/simd/float32x4clamp.js
Normal file
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 add';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 2, 3, 4);
|
||||
var b = float32x4(10, 20, 30, 40);
|
||||
var c = SIMD.float32x4.add(a, b);
|
||||
assertEq(c.x, 11);
|
||||
assertEq(c.y, 22);
|
||||
assertEq(c.z, 33);
|
||||
assertEq(c.w, 44);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
26
js/src/tests/ecma_6/TypedObject/simd/float32x4div.js
Normal file
26
js/src/tests/ecma_6/TypedObject/simd/float32x4div.js
Normal file
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 div';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 2, 3, 4);
|
||||
var b = float32x4(10, 20, 30, 40);
|
||||
var c = SIMD.float32x4.div(b,a);
|
||||
assertEq(c.x, 10);
|
||||
assertEq(c.y, 10);
|
||||
assertEq(c.z, 10);
|
||||
assertEq(c.w, 10);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
26
js/src/tests/ecma_6/TypedObject/simd/float32x4equal.js
Normal file
26
js/src/tests/ecma_6/TypedObject/simd/float32x4equal.js
Normal file
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 equal';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 20, 30, 40);
|
||||
var b = float32x4(10, 20, 30, 4);
|
||||
var c = SIMD.float32x4.equal(a, b);
|
||||
assertEq(c.x, 0);
|
||||
assertEq(c.y, -1);
|
||||
assertEq(c.z, -1);
|
||||
assertEq(c.w, 0);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
@ -1,5 +1,7 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 938728;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
var summary = 'float32x4 getters';
|
||||
|
||||
/*
|
||||
@ -7,8 +9,6 @@ var summary = 'float32x4 getters';
|
||||
* http://creativecommons.org/licenses/publicdomain/
|
||||
*/
|
||||
|
||||
var float32x4 = TypedObject.float32x4;
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
@ -39,13 +39,12 @@ function test() {
|
||||
g.call(v)
|
||||
}, TypeError, "Getter applicable to structs");
|
||||
assertThrowsInstanceOf(function() {
|
||||
var t = new TypedObject.int32x4(1, 2, 3, 4);
|
||||
var t = new int32x4(1, 2, 3, 4);
|
||||
g.call(t)
|
||||
}, TypeError, "Getter applicable to int32x4");
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
print("Tests complete");
|
||||
}
|
||||
|
||||
test();
|
||||
|
26
js/src/tests/ecma_6/TypedObject/simd/float32x4greaterthan.js
Normal file
26
js/src/tests/ecma_6/TypedObject/simd/float32x4greaterthan.js
Normal file
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 greaterThan';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 20, 3, 40);
|
||||
var b = float32x4(10, 2, 30, 4);
|
||||
var c = SIMD.float32x4.greaterThan(b,a);
|
||||
assertEq(c.x, -1);
|
||||
assertEq(c.y, 0);
|
||||
assertEq(c.z, -1);
|
||||
assertEq(c.w, 0);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 greaterThanOrEqual';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 20, 30, 40);
|
||||
var b = float32x4(10, 20, 30, 4);
|
||||
var c = SIMD.float32x4.greaterThanOrEqual(b,a);
|
||||
assertEq(c.x, -1);
|
||||
assertEq(c.y, -1);
|
||||
assertEq(c.z, -1);
|
||||
assertEq(c.w, 0);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
@ -1,5 +1,7 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 938728;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
var summary = 'float32x4 handles';
|
||||
|
||||
/*
|
||||
@ -8,7 +10,7 @@ var summary = 'float32x4 handles';
|
||||
*/
|
||||
|
||||
var ArrayType = TypedObject.ArrayType;
|
||||
var float32x4 = TypedObject.float32x4;
|
||||
|
||||
var float32 = TypedObject.float32;
|
||||
var Handle = TypedObject.Handle;
|
||||
|
||||
@ -43,7 +45,6 @@ function test() {
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
print("Tests complete");
|
||||
}
|
||||
|
||||
test();
|
||||
|
26
js/src/tests/ecma_6/TypedObject/simd/float32x4lessthan.js
Normal file
26
js/src/tests/ecma_6/TypedObject/simd/float32x4lessthan.js
Normal file
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 lessThan';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 20, 3, 40);
|
||||
var b = float32x4(10, 2, 30, 4);
|
||||
var c = SIMD.float32x4.lessThan(a, b);
|
||||
assertEq(c.x, -1);
|
||||
assertEq(c.y, 0);
|
||||
assertEq(c.z, -1);
|
||||
assertEq(c.w, 0);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 lessThanOrEqual';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 20, 30, 40);
|
||||
var b = float32x4(10, 20, 30, 4);
|
||||
var c = SIMD.float32x4.lessThanOrEqual(a, b);
|
||||
assertEq(c.x, -1);
|
||||
assertEq(c.y, -1);
|
||||
assertEq(c.z, -1);
|
||||
assertEq(c.w, 0);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
26
js/src/tests/ecma_6/TypedObject/simd/float32x4max.js
Normal file
26
js/src/tests/ecma_6/TypedObject/simd/float32x4max.js
Normal file
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 max';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 20, 30, 4);
|
||||
var b = float32x4(10, 2, 3, 40);
|
||||
var c = SIMD.float32x4.max(a, b);
|
||||
assertEq(c.x, 10);
|
||||
assertEq(c.y, 20);
|
||||
assertEq(c.z, 30);
|
||||
assertEq(c.w, 40);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
26
js/src/tests/ecma_6/TypedObject/simd/float32x4min.js
Normal file
26
js/src/tests/ecma_6/TypedObject/simd/float32x4min.js
Normal file
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 min';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 20, 3, 40);
|
||||
var b = float32x4(10, 2, 30, 4);
|
||||
var c = SIMD.float32x4.min(a, b);
|
||||
assertEq(c.x, 1);
|
||||
assertEq(c.y, 2);
|
||||
assertEq(c.z, 3);
|
||||
assertEq(c.w, 4);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
26
js/src/tests/ecma_6/TypedObject/simd/float32x4mul.js
Normal file
26
js/src/tests/ecma_6/TypedObject/simd/float32x4mul.js
Normal file
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 add';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 2, 3, 4);
|
||||
var b = float32x4(10, 20, 30, 40);
|
||||
var c = SIMD.float32x4.mul(a, b);
|
||||
assertEq(c.x, 10);
|
||||
assertEq(c.y, 40);
|
||||
assertEq(c.z, 90);
|
||||
assertEq(c.w, 160);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
25
js/src/tests/ecma_6/TypedObject/simd/float32x4neg.js
Normal file
25
js/src/tests/ecma_6/TypedObject/simd/float32x4neg.js
Normal file
@ -0,0 +1,25 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 neg';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 2, 3, 4);
|
||||
var c = SIMD.float32x4.neg(a);
|
||||
assertEq(c.x, -1);
|
||||
assertEq(c.y, -2);
|
||||
assertEq(c.z, -3);
|
||||
assertEq(c.w, -4);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
26
js/src/tests/ecma_6/TypedObject/simd/float32x4notequal.js
Normal file
26
js/src/tests/ecma_6/TypedObject/simd/float32x4notequal.js
Normal file
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 notEqual';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 20, 30, 40);
|
||||
var b = float32x4(10, 20, 30, 4);
|
||||
var c = SIMD.float32x4.notEqual(a, b);
|
||||
assertEq(c.x, -1);
|
||||
assertEq(c.y, 0);
|
||||
assertEq(c.z, 0);
|
||||
assertEq(c.w, -1);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
25
js/src/tests/ecma_6/TypedObject/simd/float32x4reciprocal.js
Normal file
25
js/src/tests/ecma_6/TypedObject/simd/float32x4reciprocal.js
Normal file
@ -0,0 +1,25 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 reciprocal';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 0.5, 0.25, 0.125);
|
||||
var c = SIMD.float32x4.reciprocal(a);
|
||||
assertEq(c.x, 1);
|
||||
assertEq(c.y, 2);
|
||||
assertEq(c.z, 4);
|
||||
assertEq(c.w, 8);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
@ -0,0 +1,25 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 reciprocalSqrt';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 1, 0.25, 0.25);
|
||||
var c = SIMD.float32x4.reciprocalSqrt(a);
|
||||
assertEq(c.x, 1);
|
||||
assertEq(c.y, 1);
|
||||
assertEq(c.z, 2);
|
||||
assertEq(c.w, 2);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
@ -1,5 +1,7 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 938728;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
var summary = 'float32x4 reify';
|
||||
|
||||
/*
|
||||
@ -8,7 +10,6 @@ var summary = 'float32x4 reify';
|
||||
*/
|
||||
|
||||
var ArrayType = TypedObject.ArrayType;
|
||||
var float32x4 = TypedObject.float32x4;
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
@ -30,7 +31,6 @@ function test() {
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
print("Tests complete");
|
||||
}
|
||||
|
||||
test();
|
||||
|
25
js/src/tests/ecma_6/TypedObject/simd/float32x4scale.js
Normal file
25
js/src/tests/ecma_6/TypedObject/simd/float32x4scale.js
Normal file
@ -0,0 +1,25 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 scale';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 2, 3, 4);
|
||||
var c = SIMD.float32x4.scale(a, 2);
|
||||
assertEq(c.x, 2);
|
||||
assertEq(c.y, 4);
|
||||
assertEq(c.z, 6);
|
||||
assertEq(c.w, 8);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
@ -1,5 +1,7 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 938728;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
var summary = 'float32x4 setting';
|
||||
|
||||
/*
|
||||
@ -8,7 +10,6 @@ var summary = 'float32x4 setting';
|
||||
*/
|
||||
|
||||
var ArrayType = TypedObject.ArrayType;
|
||||
var float32x4 = TypedObject.float32x4;
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
@ -39,7 +40,6 @@ function test() {
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
print("Tests complete");
|
||||
}
|
||||
|
||||
test();
|
||||
|
25
js/src/tests/ecma_6/TypedObject/simd/float32x4shuffle.js
Normal file
25
js/src/tests/ecma_6/TypedObject/simd/float32x4shuffle.js
Normal file
@ -0,0 +1,25 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 shuffle';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 2, 3, 4);
|
||||
var c = SIMD.float32x4.shuffle(a, 0x1B);
|
||||
assertEq(c.x, 4);
|
||||
assertEq(c.y, 3);
|
||||
assertEq(c.z, 2);
|
||||
assertEq(c.w, 1);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
26
js/src/tests/ecma_6/TypedObject/simd/float32x4shufflemix.js
Normal file
26
js/src/tests/ecma_6/TypedObject/simd/float32x4shufflemix.js
Normal file
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 shuffleMix';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 2, 3, 4);
|
||||
var b = float32x4(10, 20, 30, 40);
|
||||
var c = SIMD.float32x4.shuffleMix(a,b, 0x1B);
|
||||
assertEq(c.x, 4);
|
||||
assertEq(c.y, 3);
|
||||
assertEq(c.z, 20);
|
||||
assertEq(c.w, 10);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
25
js/src/tests/ecma_6/TypedObject/simd/float32x4sqrt.js
Normal file
25
js/src/tests/ecma_6/TypedObject/simd/float32x4sqrt.js
Normal file
@ -0,0 +1,25 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 sqrt';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 4, 9, 16);
|
||||
var c = SIMD.float32x4.sqrt(a);
|
||||
assertEq(c.x, 1);
|
||||
assertEq(c.y, 2);
|
||||
assertEq(c.z, 3);
|
||||
assertEq(c.w, 4);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
26
js/src/tests/ecma_6/TypedObject/simd/float32x4sub.js
Normal file
26
js/src/tests/ecma_6/TypedObject/simd/float32x4sub.js
Normal file
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 sub';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 2, 3, 4);
|
||||
var b = float32x4(10, 20, 30, 40);
|
||||
var c = SIMD.float32x4.sub(b,a);
|
||||
assertEq(c.x, 9);
|
||||
assertEq(c.y, 18);
|
||||
assertEq(c.z, 27);
|
||||
assertEq(c.w, 36);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
25
js/src/tests/ecma_6/TypedObject/simd/float32x4toint32x4.js
Normal file
25
js/src/tests/ecma_6/TypedObject/simd/float32x4toint32x4.js
Normal file
@ -0,0 +1,25 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 toInt32x4';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1.1, 2.2, 3.3, 4.6);
|
||||
var c = SIMD.float32x4.toInt32x4(a);
|
||||
assertEq(c.x, 1);
|
||||
assertEq(c.y, 2);
|
||||
assertEq(c.z, 3);
|
||||
assertEq(c.w, 4);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
28
js/src/tests/ecma_6/TypedObject/simd/float32x4with.js
Normal file
28
js/src/tests/ecma_6/TypedObject/simd/float32x4with.js
Normal file
@ -0,0 +1,28 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'float32x4 with';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(1, 2, 3, 4);
|
||||
var x = SIMD.float32x4.withX(a, 5);
|
||||
var y = SIMD.float32x4.withY(a, 5);
|
||||
var z = SIMD.float32x4.withZ(a, 5);
|
||||
var w = SIMD.float32x4.withW(a, 5);
|
||||
assertEq(x.x, 5);
|
||||
assertEq(y.y, 5);
|
||||
assertEq(z.z, 5);
|
||||
assertEq(w.w, 5);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
26
js/src/tests/ecma_6/TypedObject/simd/int32x4add.js
Normal file
26
js/src/tests/ecma_6/TypedObject/simd/int32x4add.js
Normal file
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'int32x4 add';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = int32x4(1, 2, 3, 4);
|
||||
var b = int32x4(10, 20, 30, 40);
|
||||
var c = SIMD.int32x4.add(a, b);
|
||||
assertEq(c.x, 11);
|
||||
assertEq(c.y, 22);
|
||||
assertEq(c.z, 33);
|
||||
assertEq(c.w, 44);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
@ -1,5 +1,7 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 938728;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
var summary = 'int32x4 alignment';
|
||||
|
||||
/*
|
||||
@ -9,7 +11,6 @@ var summary = 'int32x4 alignment';
|
||||
|
||||
var StructType = TypedObject.StructType;
|
||||
var uint8 = TypedObject.uint8;
|
||||
var int32x4 = TypedObject.int32x4;
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
@ -24,7 +25,6 @@ function test() {
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
print("Tests complete");
|
||||
}
|
||||
|
||||
test();
|
||||
|
26
js/src/tests/ecma_6/TypedObject/simd/int32x4and.js
Normal file
26
js/src/tests/ecma_6/TypedObject/simd/int32x4and.js
Normal file
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'int32x4 and';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = int32x4(1, 2, 3, 4);
|
||||
var b = int32x4(10, 20, 30, 40);
|
||||
var c = SIMD.int32x4.and(a, b);
|
||||
assertEq(c.x, 0);
|
||||
assertEq(c.y, 0);
|
||||
assertEq(c.z, 2);
|
||||
assertEq(c.w, 0);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
@ -0,0 +1,25 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'int32x4 bitsToFloat32x4';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = int32x4(100, 200, 300, 400);
|
||||
var c = SIMD.int32x4.bitsToFloat32x4(a);
|
||||
assertEq(c.x, 1.401298464324817e-43);
|
||||
assertEq(c.y, 2.802596928649634e-43);
|
||||
assertEq(c.z, 4.203895392974451e-43);
|
||||
assertEq(c.w, 5.605193857299268e-43);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
@ -1,5 +1,8 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 938728;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
var {StructType, int32} = TypedObject;
|
||||
var summary = 'int32x4 getters';
|
||||
|
||||
/*
|
||||
@ -7,8 +10,6 @@ var summary = 'int32x4 getters';
|
||||
* http://creativecommons.org/licenses/publicdomain/
|
||||
*/
|
||||
|
||||
var int32x4 = TypedObject.int32x4;
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
@ -31,21 +32,17 @@ function test() {
|
||||
g.call(0xDEADBEEF)
|
||||
}, TypeError, "Getter applicable to integers");
|
||||
assertThrowsInstanceOf(function() {
|
||||
var T = new TypedObject.StructType({x: TypedObject.int32,
|
||||
y: TypedObject.int32,
|
||||
z: TypedObject.int32,
|
||||
w: TypedObject.int32});
|
||||
var T = new StructType({x: int32, y: int32, z: int32, w: int32});
|
||||
var v = new T({x: 11, y: 22, z: 33, w: 44});
|
||||
g.call(v)
|
||||
}, TypeError, "Getter applicable to structs");
|
||||
assertThrowsInstanceOf(function() {
|
||||
var t = new TypedObject.float32x4(1, 2, 3, 4);
|
||||
var t = new float32x4(1, 2, 3, 4);
|
||||
g.call(t)
|
||||
}, TypeError, "Getter applicable to float32x4");
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
print("Tests complete");
|
||||
}
|
||||
|
||||
test();
|
||||
|
@ -1,5 +1,7 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 938728;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
var summary = 'int32x4 handles';
|
||||
|
||||
/*
|
||||
@ -8,7 +10,6 @@ var summary = 'int32x4 handles';
|
||||
*/
|
||||
|
||||
var ArrayType = TypedObject.ArrayType;
|
||||
var int32x4 = TypedObject.int32x4;
|
||||
var int32 = TypedObject.int32;
|
||||
var Handle = TypedObject.Handle;
|
||||
|
||||
@ -43,7 +44,6 @@ function test() {
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
print("Tests complete");
|
||||
}
|
||||
|
||||
test();
|
||||
|
26
js/src/tests/ecma_6/TypedObject/simd/int32x4mul.js
Normal file
26
js/src/tests/ecma_6/TypedObject/simd/int32x4mul.js
Normal file
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'int32x4 mul';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = int32x4(1, 2, 3, 4);
|
||||
var b = int32x4(10, 20, 30, 40);
|
||||
var c = SIMD.int32x4.mul(a, b);
|
||||
assertEq(c.x, 10);
|
||||
assertEq(c.y, 40);
|
||||
assertEq(c.z, 90);
|
||||
assertEq(c.w, 160);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
25
js/src/tests/ecma_6/TypedObject/simd/int32x4neg.js
Normal file
25
js/src/tests/ecma_6/TypedObject/simd/int32x4neg.js
Normal file
@ -0,0 +1,25 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'int32x4 neg';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = int32x4(1, 2, 3, 4);
|
||||
var c = SIMD.int32x4.neg(a);
|
||||
assertEq(c.x, -1);
|
||||
assertEq(c.y, -2);
|
||||
assertEq(c.z, -3);
|
||||
assertEq(c.w, -4);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
25
js/src/tests/ecma_6/TypedObject/simd/int32x4not.js
Normal file
25
js/src/tests/ecma_6/TypedObject/simd/int32x4not.js
Normal file
@ -0,0 +1,25 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'int32x4 not';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = int32x4(1, 2, 3, 4);
|
||||
var c = SIMD.int32x4.not(a);
|
||||
assertEq(c.x, -2);
|
||||
assertEq(c.y, -3);
|
||||
assertEq(c.z, -4);
|
||||
assertEq(c.w, -5);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
26
js/src/tests/ecma_6/TypedObject/simd/int32x4or.js
Normal file
26
js/src/tests/ecma_6/TypedObject/simd/int32x4or.js
Normal file
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'int32x4 or';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = int32x4(1, 2, 3, 4);
|
||||
var b = int32x4(10, 20, 30, 40);
|
||||
var c = SIMD.int32x4.or(a, b);
|
||||
assertEq(c.x, 11);
|
||||
assertEq(c.y, 22);
|
||||
assertEq(c.z, 31);
|
||||
assertEq(c.w, 44);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
@ -1,5 +1,7 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 938728;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
var summary = 'int32x4 reify';
|
||||
|
||||
/*
|
||||
@ -8,7 +10,6 @@ var summary = 'int32x4 reify';
|
||||
*/
|
||||
|
||||
var ArrayType = TypedObject.ArrayType;
|
||||
var int32x4 = TypedObject.int32x4;
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
@ -30,7 +31,6 @@ function test() {
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
print("Tests complete");
|
||||
}
|
||||
|
||||
test();
|
||||
|
27
js/src/tests/ecma_6/TypedObject/simd/int32x4select.js
Normal file
27
js/src/tests/ecma_6/TypedObject/simd/int32x4select.js
Normal file
@ -0,0 +1,27 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'int32x4 select';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = float32x4(0.0,4.0,9.0,16.0)
|
||||
var b = float32x4(1.0,2.0,3.0,4.0)
|
||||
var sel_ttff = int32x4.bool(true, true, false, false);
|
||||
var c = SIMD.int32x4.select(sel_ttff,a,b);
|
||||
assertEq(c.x, 0);
|
||||
assertEq(c.y, 4);
|
||||
assertEq(c.z, 3);
|
||||
assertEq(c.w, 4);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
@ -1,5 +1,7 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 938728;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
var summary = 'int32x4 setting';
|
||||
|
||||
/*
|
||||
@ -8,7 +10,6 @@ var summary = 'int32x4 setting';
|
||||
*/
|
||||
|
||||
var ArrayType = TypedObject.ArrayType;
|
||||
var int32x4 = TypedObject.int32x4;
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
@ -39,7 +40,6 @@ function test() {
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
print("Tests complete");
|
||||
}
|
||||
|
||||
test();
|
||||
|
25
js/src/tests/ecma_6/TypedObject/simd/int32x4shuffle.js
Normal file
25
js/src/tests/ecma_6/TypedObject/simd/int32x4shuffle.js
Normal file
@ -0,0 +1,25 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'int32x4 shuffle';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = int32x4(1, 2, 3, 4);
|
||||
var c = SIMD.int32x4.shuffle(a, 0x1B);
|
||||
assertEq(c.x, 4);
|
||||
assertEq(c.y, 3);
|
||||
assertEq(c.z, 2);
|
||||
assertEq(c.w, 1);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
26
js/src/tests/ecma_6/TypedObject/simd/int32x4shufflemix.js
Normal file
26
js/src/tests/ecma_6/TypedObject/simd/int32x4shufflemix.js
Normal file
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'int32x4 shuffleMix';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = int32x4(1, 2, 3, 4);
|
||||
var b = int32x4(10, 20, 30, 40);
|
||||
var c = SIMD.int32x4.shuffleMix(a,b, 0x1B);
|
||||
assertEq(c.x, 4);
|
||||
assertEq(c.y, 3);
|
||||
assertEq(c.z, 20);
|
||||
assertEq(c.w, 10);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
26
js/src/tests/ecma_6/TypedObject/simd/int32x4sub.js
Normal file
26
js/src/tests/ecma_6/TypedObject/simd/int32x4sub.js
Normal file
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'int32x4 sub';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = int32x4(1, 2, 3, 4);
|
||||
var b = int32x4(10, 20, 30, 40);
|
||||
var c = SIMD.int32x4.sub(b,a);
|
||||
assertEq(c.x, 9);
|
||||
assertEq(c.y, 18);
|
||||
assertEq(c.z, 27);
|
||||
assertEq(c.w, 36);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
25
js/src/tests/ecma_6/TypedObject/simd/int32x4tofloat32x4.js
Normal file
25
js/src/tests/ecma_6/TypedObject/simd/int32x4tofloat32x4.js
Normal file
@ -0,0 +1,25 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'int32x4 toFloat32x4';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = int32x4(1, 2, 3, 4);
|
||||
var c = SIMD.int32x4.toFloat32x4(a);
|
||||
assertEq(c.x, 1);
|
||||
assertEq(c.y, 2);
|
||||
assertEq(c.z, 3);
|
||||
assertEq(c.w, 4);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
28
js/src/tests/ecma_6/TypedObject/simd/int32x4with.js
Normal file
28
js/src/tests/ecma_6/TypedObject/simd/int32x4with.js
Normal file
@ -0,0 +1,28 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'int32x4 with';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = int32x4(1, 2, 3, 4);
|
||||
var x = SIMD.int32x4.withX(a, 5);
|
||||
var y = SIMD.int32x4.withY(a, 5);
|
||||
var z = SIMD.int32x4.withZ(a, 5);
|
||||
var w = SIMD.int32x4.withW(a, 5);
|
||||
assertEq(x.x, 5);
|
||||
assertEq(y.y, 5);
|
||||
assertEq(z.z, 5);
|
||||
assertEq(w.w, 5);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
28
js/src/tests/ecma_6/TypedObject/simd/int32x4withflag.js
Normal file
28
js/src/tests/ecma_6/TypedObject/simd/int32x4withflag.js
Normal file
@ -0,0 +1,28 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'int32x4 with';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = int32x4(1, 2, 3, 4);
|
||||
var x = SIMD.int32x4.withFlagX(a, true);
|
||||
var y = SIMD.int32x4.withFlagY(a, false);
|
||||
var z = SIMD.int32x4.withFlagZ(a, false);
|
||||
var w = SIMD.int32x4.withFlagW(a, true);
|
||||
assertEq(x.x, -1);
|
||||
assertEq(y.y, 0);
|
||||
assertEq(z.z, 0);
|
||||
assertEq(w.w, -1);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
26
js/src/tests/ecma_6/TypedObject/simd/int32x4xor.js
Normal file
26
js/src/tests/ecma_6/TypedObject/simd/int32x4xor.js
Normal file
@ -0,0 +1,26 @@
|
||||
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||
var BUGNUMBER = 946042;
|
||||
var float32x4 = SIMD.float32x4;
|
||||
var int32x4 = SIMD.int32x4;
|
||||
|
||||
var summary = 'int32x4 xor';
|
||||
|
||||
function test() {
|
||||
print(BUGNUMBER + ": " + summary);
|
||||
|
||||
// FIXME -- Bug 948379: Amend to check for correctness of border cases.
|
||||
|
||||
var a = int32x4(1, 2, 3, 4);
|
||||
var b = int32x4(10, 20, 30, 40);
|
||||
var c = SIMD.int32x4.xor(a, b);
|
||||
assertEq(c.x, 11);
|
||||
assertEq(c.y, 22);
|
||||
assertEq(c.z, 29);
|
||||
assertEq(c.w, 44);
|
||||
|
||||
if (typeof reportCompare === "function")
|
||||
reportCompare(true, true);
|
||||
}
|
||||
|
||||
test();
|
||||
|
@ -26,9 +26,6 @@ js_InitFunctionClass(JSContext *cx, js::HandleObject obj);
|
||||
extern JSObject *
|
||||
js_InitTypedArrayClasses(JSContext *cx, js::HandleObject obj);
|
||||
|
||||
extern JSObject *
|
||||
js_InitTypedObjectModuleObject(JSContext *cx, js::HandleObject obj);
|
||||
|
||||
namespace js {
|
||||
|
||||
class Debugger;
|
||||
@ -111,9 +108,11 @@ class GlobalObject : public JSObject
|
||||
static const unsigned RUNTIME_CODEGEN_ENABLED = WARNED_WATCH_DEPRECATED + 1;
|
||||
static const unsigned DEBUGGERS = RUNTIME_CODEGEN_ENABLED + 1;
|
||||
static const unsigned INTRINSICS = DEBUGGERS + 1;
|
||||
static const unsigned FLOAT32X4_TYPE_OBJECT = INTRINSICS + 1;
|
||||
static const unsigned INT32X4_TYPE_OBJECT = FLOAT32X4_TYPE_OBJECT + 1;
|
||||
|
||||
/* Total reserved-slot count for global objects. */
|
||||
static const unsigned RESERVED_SLOTS = INTRINSICS + 1;
|
||||
static const unsigned RESERVED_SLOTS = INT32X4_TYPE_OBJECT + 1;
|
||||
|
||||
/*
|
||||
* The slot count must be in the public API for JSCLASS_GLOBAL_FLAGS, and
|
||||
@ -416,6 +415,26 @@ class GlobalObject : public JSObject
|
||||
return getOrCreateObject(cx, APPLICATION_SLOTS + JSProto_TypedObject, initTypedObjectModule);
|
||||
}
|
||||
|
||||
void setFloat32x4TypeObject(JSObject &obj) {
|
||||
JS_ASSERT(getSlotRef(FLOAT32X4_TYPE_OBJECT).isUndefined());
|
||||
setSlot(FLOAT32X4_TYPE_OBJECT, ObjectValue(obj));
|
||||
}
|
||||
|
||||
JSObject &float32x4TypeObject() {
|
||||
JS_ASSERT(getSlotRef(FLOAT32X4_TYPE_OBJECT).isObject());
|
||||
return getSlotRef(FLOAT32X4_TYPE_OBJECT).toObject();
|
||||
}
|
||||
|
||||
void setInt32x4TypeObject(JSObject &obj) {
|
||||
JS_ASSERT(getSlotRef(INT32X4_TYPE_OBJECT).isUndefined());
|
||||
setSlot(INT32X4_TYPE_OBJECT, ObjectValue(obj));
|
||||
}
|
||||
|
||||
JSObject &int32x4TypeObject() {
|
||||
JS_ASSERT(getSlotRef(INT32X4_TYPE_OBJECT).isObject());
|
||||
return getSlotRef(INT32X4_TYPE_OBJECT).toObject();
|
||||
}
|
||||
|
||||
TypedObjectModuleObject &getTypedObjectModule() const;
|
||||
|
||||
JSObject *getIteratorPrototype() {
|
||||
|
@ -657,6 +657,8 @@ static const JSFunctionSpec intrinsic_functions[] = {
|
||||
JSNativeThreadSafeWrapper<js::Memcpy>,
|
||||
&js::MemcpyJitInfo, 5, 0),
|
||||
JS_FN("GetTypedObjectModule", js::GetTypedObjectModule, 0, 0),
|
||||
JS_FN("GetFloat32x4TypeObject", js::GetFloat32x4TypeObject, 0, 0),
|
||||
JS_FN("GetInt32x4TypeObject", js::GetInt32x4TypeObject, 0, 0),
|
||||
|
||||
#define LOAD_AND_STORE_SCALAR_FN_DECLS(_constant, _type, _name) \
|
||||
JS_FNINFO("Store_" #_name, \
|
||||
|
@ -120,7 +120,7 @@ interface ScheduledGCCallback : nsISupports
|
||||
/**
|
||||
* interface of Components.utils
|
||||
*/
|
||||
[scriptable, uuid(e14f588b-63aa-4091-be82-a459a52f8ca6)]
|
||||
[scriptable, uuid(ae292d08-cfb0-4862-a2b6-4779e5ef7e72)]
|
||||
interface nsIXPCComponents_Utils : nsISupports
|
||||
{
|
||||
|
||||
@ -519,6 +519,17 @@ interface nsIXPCComponents_Utils : nsISupports
|
||||
[implicit_jscontext]
|
||||
jsval getIncumbentGlobal([optional] in jsval callback);
|
||||
|
||||
/**
|
||||
* Forces the generation of an XPCWrappedJS for a given object. For internal
|
||||
* and testing use only. This is only useful to set up wrapper map conditions
|
||||
* for a testcase. The return value is not an XPCWrappedJS itself, but an
|
||||
* opaque nsISupports holder that keeps the underlying XPCWrappedJS alive.
|
||||
*
|
||||
* if |scope| is passed, the XPCWrappedJS is generated in the scope of that object.
|
||||
*/
|
||||
[implicit_jscontext]
|
||||
nsISupports generateXPCWrappedJS(in jsval obj, [optional] in jsval scope);
|
||||
|
||||
/**
|
||||
* Retrieve the last time, in microseconds since epoch, that a given
|
||||
* watchdog-related event occured.
|
||||
|
@ -3514,6 +3514,46 @@ nsXPCComponents_Utils::GetIncumbentGlobal(const Value &aCallback,
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Below is a bunch of awkward junk to allow JS test code to trigger the
|
||||
* creation of an XPCWrappedJS, such that it ends up in the map. We need to
|
||||
* hand the caller some sort of reference to hold onto (to prevent the
|
||||
* refcount from dropping to zero as soon as the function returns), but trying
|
||||
* to return a bonafide XPCWrappedJS to script causes all sorts of trouble. So
|
||||
* we create a benign holder class instead, which acts as an opaque reference
|
||||
* that script can use to keep the XPCWrappedJS alive and in the map.
|
||||
*/
|
||||
|
||||
class WrappedJSHolder : public nsISupports
|
||||
{
|
||||
NS_DECL_ISUPPORTS
|
||||
WrappedJSHolder() {}
|
||||
virtual ~WrappedJSHolder() {}
|
||||
|
||||
nsRefPtr<nsXPCWrappedJS> mWrappedJS;
|
||||
};
|
||||
NS_IMPL_ISUPPORTS0(WrappedJSHolder);
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsXPCComponents_Utils::GenerateXPCWrappedJS(const Value &aObj, const Value &aScope,
|
||||
JSContext *aCx, nsISupports **aOut)
|
||||
{
|
||||
if (!aObj.isObject())
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
RootedObject obj(aCx, &aObj.toObject());
|
||||
RootedObject scope(aCx, aScope.isObject() ? js::UncheckedUnwrap(&aScope.toObject())
|
||||
: CurrentGlobalOrNull(aCx));
|
||||
JSAutoCompartment ac(aCx, scope);
|
||||
if (!JS_WrapObject(aCx, &obj))
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
nsRefPtr<WrappedJSHolder> holder = new WrappedJSHolder();
|
||||
nsresult rv = nsXPCWrappedJS::GetNewOrUsed(obj, NS_GET_IID(nsISupports),
|
||||
getter_AddRefs(holder->mWrappedJS));
|
||||
holder.forget(aOut);
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsXPCComponents_Utils::GetWatchdogTimestamp(const nsAString& aCategory, PRTime *aOut)
|
||||
{
|
||||
|
@ -1028,10 +1028,16 @@ XPCConvert::JSObject2NativeInterface(void** dest, HandleObject src,
|
||||
// else...
|
||||
|
||||
nsXPCWrappedJS* wrapper;
|
||||
nsresult rv = nsXPCWrappedJS::GetNewOrUsed(src, *iid, aOuter, &wrapper);
|
||||
nsresult rv = nsXPCWrappedJS::GetNewOrUsed(src, *iid, &wrapper);
|
||||
if (pErr)
|
||||
*pErr = rv;
|
||||
if (NS_SUCCEEDED(rv) && wrapper) {
|
||||
// If the caller wanted to aggregate this JS object to a native,
|
||||
// attach it to the wrapper. Note that we allow a maximum of one
|
||||
// aggregated native for a given XPCWrappedJS.
|
||||
if (aOuter)
|
||||
wrapper->SetAggregatedNativeObject(aOuter);
|
||||
|
||||
// We need to go through the QueryInterface logic to make this return
|
||||
// the right thing for the various 'special' interfaces; e.g.
|
||||
// nsIPropertyBag. We must use AggregatedQueryInterface in cases where
|
||||
@ -1184,8 +1190,7 @@ XPCConvert::JSValToXPCException(MutableHandleValue s,
|
||||
// lets try to build a wrapper around the JSObject
|
||||
nsXPCWrappedJS* jswrapper;
|
||||
nsresult rv =
|
||||
nsXPCWrappedJS::GetNewOrUsed(obj, NS_GET_IID(nsIException),
|
||||
nullptr, &jswrapper);
|
||||
nsXPCWrappedJS::GetNewOrUsed(obj, NS_GET_IID(nsIException), &jswrapper);
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
|
@ -43,7 +43,6 @@ nsresult xpcJSWeakReference::Init(JSContext* cx, const JS::Value& object)
|
||||
nsRefPtr<nsXPCWrappedJS> wrapped;
|
||||
nsresult rv = nsXPCWrappedJS::GetNewOrUsed(obj,
|
||||
NS_GET_IID(nsISupports),
|
||||
nullptr,
|
||||
getter_AddRefs(wrapped));
|
||||
if (!wrapped) {
|
||||
NS_ERROR("can't get nsISupportsWeakReference wrapper for obj");
|
||||
|
@ -735,8 +735,7 @@ xpc_qsUnwrapArgImpl(JSContext *cx,
|
||||
}
|
||||
|
||||
nsRefPtr<nsXPCWrappedJS> wrappedJS;
|
||||
rv = nsXPCWrappedJS::GetNewOrUsed(src, iid, nullptr,
|
||||
getter_AddRefs(wrappedJS));
|
||||
rv = nsXPCWrappedJS::GetNewOrUsed(src, iid, getter_AddRefs(wrappedJS));
|
||||
if (NS_FAILED(rv) || !wrappedJS) {
|
||||
*ppArgRef = nullptr;
|
||||
return rv;
|
||||
|
@ -320,7 +320,6 @@ nsXPCWrappedJS::GetJSObject()
|
||||
nsresult
|
||||
nsXPCWrappedJS::GetNewOrUsed(JS::HandleObject jsObj,
|
||||
REFNSIID aIID,
|
||||
nsISupports* aOuter,
|
||||
nsXPCWrappedJS** wrapperResult)
|
||||
{
|
||||
// Do a release-mode assert against accessing nsXPCWrappedJS off-main-thread.
|
||||
@ -364,8 +363,7 @@ nsXPCWrappedJS::GetNewOrUsed(JS::HandleObject jsObj,
|
||||
// build the root wrapper
|
||||
if (rootJSObj == jsObj) {
|
||||
// the root will do double duty as the interface wrapper
|
||||
wrapper = root = new nsXPCWrappedJS(cx, jsObj, clazz, nullptr,
|
||||
aOuter);
|
||||
wrapper = root = new nsXPCWrappedJS(cx, jsObj, clazz, nullptr);
|
||||
if (!root)
|
||||
goto return_wrapper;
|
||||
|
||||
@ -380,7 +378,7 @@ nsXPCWrappedJS::GetNewOrUsed(JS::HandleObject jsObj,
|
||||
if (!rootClazz)
|
||||
goto return_wrapper;
|
||||
|
||||
root = new nsXPCWrappedJS(cx, rootJSObj, rootClazz, nullptr, aOuter);
|
||||
root = new nsXPCWrappedJS(cx, rootJSObj, rootClazz, nullptr);
|
||||
NS_RELEASE(rootClazz);
|
||||
|
||||
if (!root)
|
||||
@ -397,7 +395,7 @@ nsXPCWrappedJS::GetNewOrUsed(JS::HandleObject jsObj,
|
||||
MOZ_ASSERT(clazz,"bad clazz");
|
||||
|
||||
if (!wrapper) {
|
||||
wrapper = new nsXPCWrappedJS(cx, jsObj, clazz, root, aOuter);
|
||||
wrapper = new nsXPCWrappedJS(cx, jsObj, clazz, root);
|
||||
if (!wrapper)
|
||||
goto return_wrapper;
|
||||
}
|
||||
@ -422,13 +420,12 @@ return_wrapper:
|
||||
nsXPCWrappedJS::nsXPCWrappedJS(JSContext* cx,
|
||||
JSObject* aJSObj,
|
||||
nsXPCWrappedJSClass* aClass,
|
||||
nsXPCWrappedJS* root,
|
||||
nsISupports* aOuter)
|
||||
nsXPCWrappedJS* root)
|
||||
: mJSObj(aJSObj),
|
||||
mClass(aClass),
|
||||
mRoot(root ? root : MOZ_THIS_IN_INITIALIZER_LIST()),
|
||||
mNext(nullptr),
|
||||
mOuter(root ? nullptr : aOuter)
|
||||
mOuter(nullptr)
|
||||
{
|
||||
InitStub(GetClass()->GetIID());
|
||||
|
||||
@ -439,7 +436,6 @@ nsXPCWrappedJS::nsXPCWrappedJS(JSContext* cx,
|
||||
NS_ADDREF_THIS();
|
||||
|
||||
NS_ADDREF(aClass);
|
||||
NS_IF_ADDREF(mOuter);
|
||||
|
||||
if (!IsRootWrapper())
|
||||
NS_ADDREF(mRoot);
|
||||
|
@ -700,8 +700,7 @@ nsXPCWrappedJSClass::DelegatedQueryInterface(nsXPCWrappedJS* self,
|
||||
// XPConvert::JSObject2NativeInterface() here to make sure we
|
||||
// get a new (or used) nsXPCWrappedJS.
|
||||
nsXPCWrappedJS* wrapper;
|
||||
nsresult rv = nsXPCWrappedJS::GetNewOrUsed(jsobj, aIID, nullptr,
|
||||
&wrapper);
|
||||
nsresult rv = nsXPCWrappedJS::GetNewOrUsed(jsobj, aIID, &wrapper);
|
||||
if (NS_SUCCEEDED(rv) && wrapper) {
|
||||
// We need to go through the QueryInterface logic to make
|
||||
// this return the right thing for the various 'special'
|
||||
|
@ -2474,7 +2474,6 @@ public:
|
||||
static nsresult
|
||||
GetNewOrUsed(JS::HandleObject aJSObj,
|
||||
REFNSIID aIID,
|
||||
nsISupports* aOuter,
|
||||
nsXPCWrappedJS** wrapper);
|
||||
|
||||
nsISomeInterface* GetXPTCStub() { return mXPTCStub; }
|
||||
@ -2509,6 +2508,15 @@ public:
|
||||
|
||||
bool IsAggregatedToNative() const {return mRoot->mOuter != nullptr;}
|
||||
nsISupports* GetAggregatedNativeObject() const {return mRoot->mOuter;}
|
||||
void SetAggregatedNativeObject(nsISupports *aNative) {
|
||||
MOZ_ASSERT(aNative);
|
||||
if (mRoot->mOuter) {
|
||||
MOZ_ASSERT(mRoot->mOuter == aNative,
|
||||
"Only one aggregated native can be set");
|
||||
return;
|
||||
}
|
||||
NS_ADDREF(mRoot->mOuter = aNative);
|
||||
}
|
||||
|
||||
void TraceJS(JSTracer* trc);
|
||||
static void GetTraceName(JSTracer* trc, char *buf, size_t bufsize);
|
||||
@ -2519,8 +2527,7 @@ protected:
|
||||
nsXPCWrappedJS(JSContext* cx,
|
||||
JSObject* aJSObj,
|
||||
nsXPCWrappedJSClass* aClass,
|
||||
nsXPCWrappedJS* root,
|
||||
nsISupports* aOuter);
|
||||
nsXPCWrappedJS* root);
|
||||
|
||||
bool CanSkip();
|
||||
void Destroy();
|
||||
|
@ -0,0 +1,38 @@
|
||||
<!DOCTYPE html>
|
||||
<!--
|
||||
Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||
<meta charset="utf-8">
|
||||
<style>
|
||||
.container {
|
||||
width: 100px;
|
||||
height: 20px;
|
||||
border: 5px solid black;
|
||||
}
|
||||
.container > * {
|
||||
height: 18px;
|
||||
float: left;
|
||||
}
|
||||
.itemA {
|
||||
width: 38px;
|
||||
background: purple;
|
||||
border: 1px solid indigo;
|
||||
}
|
||||
.itemB {
|
||||
width: 58px;
|
||||
background: teal;
|
||||
border: 1px solid lightblue;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="itemA"></div>
|
||||
<div class="itemB"></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,37 @@
|
||||
<!DOCTYPE html>
|
||||
<!--
|
||||
Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
<title>CSS Test: Testing a horizontal flex container with box-sizing:border-box</title>
|
||||
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||
<meta charset="utf-8">
|
||||
<style>
|
||||
.container {
|
||||
display: flex;
|
||||
width: 110px;
|
||||
height: 30px;
|
||||
border: 5px solid black;
|
||||
-moz-box-sizing: border-box;
|
||||
}
|
||||
.itemA {
|
||||
flex: 1 28px;
|
||||
background: purple;
|
||||
border: 1px solid indigo;
|
||||
}
|
||||
.itemB {
|
||||
flex: 1 48px;
|
||||
background: teal;
|
||||
border: 1px solid lightblue;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="itemA"></div>
|
||||
<div class="itemB"></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,37 @@
|
||||
<!DOCTYPE html>
|
||||
<!--
|
||||
Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||
<meta charset="utf-8">
|
||||
<style>
|
||||
.container {
|
||||
width: 20px;
|
||||
height: 100px;
|
||||
border: 5px solid black;
|
||||
}
|
||||
.container > * {
|
||||
width: 18px;
|
||||
}
|
||||
.itemA {
|
||||
height: 38px;
|
||||
background: purple;
|
||||
border: 1px solid indigo;
|
||||
}
|
||||
.itemB {
|
||||
height: 58px;
|
||||
background: teal;
|
||||
border: 1px solid lightblue;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="itemA"></div>
|
||||
<div class="itemB"></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,38 @@
|
||||
<!DOCTYPE html>
|
||||
<!--
|
||||
Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
<title>CSS Test: Testing a horizontal flex container with box-sizing:border-box</title>
|
||||
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||
<meta charset="utf-8">
|
||||
<style>
|
||||
.container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 30px;
|
||||
height: 110px;
|
||||
border: 5px solid black;
|
||||
-moz-box-sizing: border-box;
|
||||
}
|
||||
.itemA {
|
||||
flex: 1 28px;
|
||||
background: purple;
|
||||
border: 1px solid indigo;
|
||||
}
|
||||
.itemB {
|
||||
flex: 1 48px;
|
||||
background: teal;
|
||||
border: 1px solid lightblue;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="itemA"></div>
|
||||
<div class="itemB"></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,60 @@
|
||||
<!DOCTYPE html>
|
||||
<!--
|
||||
Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||
<meta charset="utf-8">
|
||||
<style>
|
||||
.container {
|
||||
width: 100px;
|
||||
height: 30px;
|
||||
border: 1px solid black;
|
||||
float: left;
|
||||
margin: 2px;
|
||||
}
|
||||
.container > * {
|
||||
float: left; /* emulate the testcase's horizontal lineup of flex items */
|
||||
}
|
||||
.itemA {
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
background: purple;
|
||||
border: 4px solid indigo;
|
||||
}
|
||||
.itemB {
|
||||
width: 40px;
|
||||
height: 20px;
|
||||
background: teal;
|
||||
border: 5px solid lightblue;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- FIRST ROW -->
|
||||
<!-- 1 inflexible item -->
|
||||
<div class="container">
|
||||
<div class="itemA"></div>
|
||||
</div>
|
||||
<!-- 1 flexible item -->
|
||||
<div class="container">
|
||||
<div class="itemA" style="width: 92px"></div>
|
||||
</div>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
|
||||
<!-- SECOND ROW -->
|
||||
<!-- 2 inflexible items -->
|
||||
<div class="container">
|
||||
<div class="itemA"></div>
|
||||
<div class="itemB"></div>
|
||||
</div>
|
||||
<!-- 2 flexible items -->
|
||||
<div class="container">
|
||||
<div class="itemA" style="width: 32px"></div>
|
||||
<div class="itemB" style="width: 50px"></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,60 @@
|
||||
<!DOCTYPE html>
|
||||
<!--
|
||||
Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
<title>CSS Test: Testing a horizontal flex container with box-sizing:border-box on its flex items</title>
|
||||
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||
<meta charset="utf-8">
|
||||
<style>
|
||||
.container {
|
||||
display: flex;
|
||||
width: 100px;
|
||||
height: 30px;
|
||||
border: 1px solid black;
|
||||
float: left;
|
||||
margin: 2px;
|
||||
}
|
||||
.container > * {
|
||||
-moz-box-sizing: border-box;
|
||||
}
|
||||
.itemA {
|
||||
width: 30px;
|
||||
background: purple;
|
||||
border: 4px solid indigo;
|
||||
}
|
||||
.itemB {
|
||||
width: 50px;
|
||||
background: teal;
|
||||
border: 5px solid lightblue;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- FIRST ROW -->
|
||||
<!-- 1 inflexible item -->
|
||||
<div class="container">
|
||||
<div class="itemA"></div>
|
||||
</div>
|
||||
<!-- 1 flexible item -->
|
||||
<div class="container">
|
||||
<div class="itemA" style="flex-grow: 1"></div>
|
||||
</div>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
|
||||
<!-- SECOND ROW -->
|
||||
<!-- 2 inflexible items -->
|
||||
<div class="container">
|
||||
<div class="itemA"></div>
|
||||
<div class="itemB"></div>
|
||||
</div>
|
||||
<!-- 2 flexible items -->
|
||||
<div class="container">
|
||||
<div class="itemA" style="flex-grow: 1"></div>
|
||||
<div class="itemB" style="flex-grow: 1"></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,60 @@
|
||||
<!DOCTYPE html>
|
||||
<!--
|
||||
Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
<title>CSS Test: Testing a horizontal flex container with box-sizing:border-box on its flex items</title>
|
||||
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||
<meta charset="utf-8">
|
||||
<style>
|
||||
.container {
|
||||
display: flex;
|
||||
width: 100px;
|
||||
height: 30px;
|
||||
border: 1px solid black;
|
||||
float: left;
|
||||
margin: 2px;
|
||||
}
|
||||
.container > * {
|
||||
-moz-box-sizing: border-box;
|
||||
}
|
||||
.itemA {
|
||||
flex-basis: 30px;
|
||||
background: purple;
|
||||
border: 4px solid indigo;
|
||||
}
|
||||
.itemB {
|
||||
flex-basis: 50px;
|
||||
background: teal;
|
||||
border: 5px solid lightblue;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- FIRST ROW -->
|
||||
<!-- 1 inflexible item -->
|
||||
<div class="container">
|
||||
<div class="itemA"></div>
|
||||
</div>
|
||||
<!-- 1 flexible item -->
|
||||
<div class="container">
|
||||
<div class="itemA" style="flex-grow: 1"></div>
|
||||
</div>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
|
||||
<!-- SECOND ROW -->
|
||||
<!-- 2 inflexible items -->
|
||||
<div class="container">
|
||||
<div class="itemA"></div>
|
||||
<div class="itemB"></div>
|
||||
</div>
|
||||
<!-- 2 flexible items -->
|
||||
<div class="container">
|
||||
<div class="itemA" style="flex-grow: 1"></div>
|
||||
<div class="itemB" style="flex-grow: 1"></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,57 @@
|
||||
<!DOCTYPE html>
|
||||
<!--
|
||||
Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||
<meta charset="utf-8">
|
||||
<style>
|
||||
.container {
|
||||
width: 30px;
|
||||
height: 100px;
|
||||
border: 1px solid black;
|
||||
float: left;
|
||||
margin: 2px;
|
||||
}
|
||||
.itemA {
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
background: purple;
|
||||
border: 4px solid indigo;
|
||||
}
|
||||
.itemB {
|
||||
width: 20px;
|
||||
height: 40px;
|
||||
background: teal;
|
||||
border: 5px solid lightblue;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- FIRST ROW -->
|
||||
<!-- 1 inflexible item -->
|
||||
<div class="container">
|
||||
<div class="itemA"></div>
|
||||
</div>
|
||||
<!-- 1 flexible item -->
|
||||
<div class="container">
|
||||
<div class="itemA" style="height: 92px"></div>
|
||||
</div>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
|
||||
<!-- SECOND ROW -->
|
||||
<!-- 2 inflexible items -->
|
||||
<div class="container">
|
||||
<div class="itemA"></div>
|
||||
<div class="itemB"></div>
|
||||
</div>
|
||||
<!-- 2 flexible items -->
|
||||
<div class="container">
|
||||
<div class="itemA" style="height: 32px"></div>
|
||||
<div class="itemB" style="height: 50px"></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,61 @@
|
||||
<!DOCTYPE html>
|
||||
<!--
|
||||
Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
<title>CSS Test: Testing a vertical flex container with box-sizing:border-box on its flex items</title>
|
||||
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||
<meta charset="utf-8">
|
||||
<style>
|
||||
.container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 30px;
|
||||
height: 100px;
|
||||
border: 1px solid black;
|
||||
float: left;
|
||||
margin: 2px;
|
||||
}
|
||||
.container > * {
|
||||
-moz-box-sizing: border-box;
|
||||
}
|
||||
.itemA {
|
||||
height: 30px;
|
||||
background: purple;
|
||||
border: 4px solid indigo;
|
||||
}
|
||||
.itemB {
|
||||
height: 50px;
|
||||
background: teal;
|
||||
border: 5px solid lightblue;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- FIRST ROW -->
|
||||
<!-- 1 inflexible item -->
|
||||
<div class="container">
|
||||
<div class="itemA"></div>
|
||||
</div>
|
||||
<!-- 1 flexible item -->
|
||||
<div class="container">
|
||||
<div class="itemA" style="flex-grow: 1"></div>
|
||||
</div>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
|
||||
<!-- SECOND ROW -->
|
||||
<!-- 2 inflexible items -->
|
||||
<div class="container">
|
||||
<div class="itemA"></div>
|
||||
<div class="itemB"></div>
|
||||
</div>
|
||||
<!-- 2 flexible items -->
|
||||
<div class="container">
|
||||
<div class="itemA" style="flex-grow: 1"></div>
|
||||
<div class="itemB" style="flex-grow: 1"></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,61 @@
|
||||
<!DOCTYPE html>
|
||||
<!--
|
||||
Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
<title>CSS Test: Testing a vertical flex container with box-sizing:border-box on its flex items</title>
|
||||
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
|
||||
<meta charset="utf-8">
|
||||
<style>
|
||||
.container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 30px;
|
||||
height: 100px;
|
||||
border: 1px solid black;
|
||||
float: left;
|
||||
margin: 2px;
|
||||
}
|
||||
.container > * {
|
||||
-moz-box-sizing: border-box;
|
||||
}
|
||||
.itemA {
|
||||
flex-basis: 30px;
|
||||
background: purple;
|
||||
border: 4px solid indigo;
|
||||
}
|
||||
.itemB {
|
||||
flex-basis: 50px;
|
||||
background: teal;
|
||||
border: 5px solid lightblue;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- FIRST ROW -->
|
||||
<!-- 1 inflexible item -->
|
||||
<div class="container">
|
||||
<div class="itemA"></div>
|
||||
</div>
|
||||
<!-- 1 flexible item -->
|
||||
<div class="container">
|
||||
<div class="itemA" style="flex-grow: 1"></div>
|
||||
</div>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
|
||||
<!-- SECOND ROW -->
|
||||
<!-- 2 inflexible items -->
|
||||
<div class="container">
|
||||
<div class="itemA"></div>
|
||||
<div class="itemB"></div>
|
||||
</div>
|
||||
<!-- 2 flexible items -->
|
||||
<div class="container">
|
||||
<div class="itemA" style="flex-grow: 1"></div>
|
||||
<div class="itemB" style="flex-grow: 1"></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -47,6 +47,14 @@ fuzzy-if(B2G,10,3) random-if(winWidget) == flexbox-align-self-baseline-horiz-3.x
|
||||
# fail until bug 794660 is fixed:
|
||||
== flexbox-basic-video-vert-2.xhtml flexbox-basic-video-vert-2-ref.xhtml
|
||||
|
||||
# Tests for box-sizing on flex containers and flex items.
|
||||
== flexbox-box-sizing-on-container-horiz-1.html flexbox-box-sizing-on-container-horiz-1-ref.html
|
||||
== flexbox-box-sizing-on-container-vert-1.html flexbox-box-sizing-on-container-vert-1-ref.html
|
||||
== flexbox-box-sizing-on-items-horiz-1a.html flexbox-box-sizing-on-items-horiz-1-ref.html
|
||||
== flexbox-box-sizing-on-items-horiz-1b.html flexbox-box-sizing-on-items-horiz-1-ref.html
|
||||
== flexbox-box-sizing-on-items-vert-1a.html flexbox-box-sizing-on-items-vert-1-ref.html
|
||||
== flexbox-box-sizing-on-items-vert-1b.html flexbox-box-sizing-on-items-vert-1-ref.html
|
||||
|
||||
# Tests for dynamic modifications of content inside/around a flex container
|
||||
== flexbox-dyn-changeFrameWidth-1.xhtml flexbox-dyn-changeFrameWidth-1-ref.xhtml
|
||||
== flexbox-dyn-changeFrameWidth-2.xhtml flexbox-dyn-changeFrameWidth-2-ref.xhtml
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user