Merge m-i to m-c.
authorMs2ger <ms2ger@gmail.com>
Sun, 09 Feb 2014 10:31:55 +0100
changeset 184956 7133bb431ebaab7171d7937df79d3ca9f8c47dc9
parent 184942 31b47238bd5dd354b6fb916de0b92be643194e12 (current diff)
parent 184955 41b171702ded1b0d99fd0d569ee636bfbf8e4151 (diff)
child 184957 b7e7180113da13fb4ded33e2e713fef03faa7cc7
child 184976 3993618b1a34dd63ddb1a79e09576c38e972b698
child 185008 d130046321ceb9f6850f1a24d4f0933a326c75da
push id3503
push userraliiev@mozilla.com
push dateMon, 28 Apr 2014 18:51:11 +0000
treeherdermozilla-beta@c95ac01e332e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone30.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge m-i to m-c.
browser/base/content/browser.js
--- a/accessible/src/atk/AccessibleWrap.cpp
+++ b/accessible/src/atk/AccessibleWrap.cpp
@@ -1121,65 +1121,77 @@ AccessibleWrap::HandleAccEvent(AccEvent*
     case nsIAccessibleEvent::EVENT_SECTION_CHANGED:
         g_signal_emit_by_name(atkObj, "visible_data_changed");
         break;
 
     case nsIAccessibleEvent::EVENT_SHOW:
         return FireAtkShowHideEvent(aEvent, atkObj, true);
 
     case nsIAccessibleEvent::EVENT_HIDE:
+        // XXX - Handle native dialog accessibles.
+        if (!accessible->IsRoot() && accessible->HasARIARole() &&
+            accessible->ARIARole() == roles::DIALOG) {
+          guint id = g_signal_lookup("deactivate", MAI_TYPE_ATK_OBJECT);
+          g_signal_emit(atkObj, id, 0);
+        }
         return FireAtkShowHideEvent(aEvent, atkObj, false);
 
         /*
          * Because dealing with menu is very different between nsIAccessible
          * and ATK, and the menu activity is important, specially transfer the
          * following two event.
          * Need more verification by AT test.
          */
     case nsIAccessibleEvent::EVENT_MENU_START:
     case nsIAccessibleEvent::EVENT_MENU_END:
         break;
 
     case nsIAccessibleEvent::EVENT_WINDOW_ACTIVATE:
       {
         accessible->AsRoot()->mActivated = true;
-        guint id = g_signal_lookup ("activate", MAI_TYPE_ATK_OBJECT);
+        guint id = g_signal_lookup("activate", MAI_TYPE_ATK_OBJECT);
         g_signal_emit(atkObj, id, 0);
 
         // Always fire a current focus event after activation.
         FocusMgr()->ForceFocusEvent();
       } break;
 
     case nsIAccessibleEvent::EVENT_WINDOW_DEACTIVATE:
       {
         accessible->AsRoot()->mActivated = false;
-        guint id = g_signal_lookup ("deactivate", MAI_TYPE_ATK_OBJECT);
+        guint id = g_signal_lookup("deactivate", MAI_TYPE_ATK_OBJECT);
         g_signal_emit(atkObj, id, 0);
       } break;
 
     case nsIAccessibleEvent::EVENT_WINDOW_MAXIMIZE:
       {
-        guint id = g_signal_lookup ("maximize", MAI_TYPE_ATK_OBJECT);
+        guint id = g_signal_lookup("maximize", MAI_TYPE_ATK_OBJECT);
         g_signal_emit(atkObj, id, 0);
       } break;
 
     case nsIAccessibleEvent::EVENT_WINDOW_MINIMIZE:
       {
-        guint id = g_signal_lookup ("minimize", MAI_TYPE_ATK_OBJECT);
+        guint id = g_signal_lookup("minimize", MAI_TYPE_ATK_OBJECT);
         g_signal_emit(atkObj, id, 0);
       } break;
 
     case nsIAccessibleEvent::EVENT_WINDOW_RESTORE:
       {
-        guint id = g_signal_lookup ("restore", MAI_TYPE_ATK_OBJECT);
+        guint id = g_signal_lookup("restore", MAI_TYPE_ATK_OBJECT);
         g_signal_emit(atkObj, id, 0);
       } break;
 
     case nsIAccessibleEvent::EVENT_DOCUMENT_LOAD_COMPLETE:
         g_signal_emit_by_name (atkObj, "load_complete");
+        // XXX - Handle native dialog accessibles.
+        if (!accessible->IsRoot() && accessible->HasARIARole() &&
+            accessible->ARIARole() == roles::DIALOG) {
+          guint id = g_signal_lookup("activate", MAI_TYPE_ATK_OBJECT);
+          g_signal_emit(atkObj, id, 0);
+        }
       break;
 
     case nsIAccessibleEvent::EVENT_DOCUMENT_RELOAD:
         g_signal_emit_by_name (atkObj, "reload");
       break;
 
     case nsIAccessibleEvent::EVENT_DOCUMENT_LOAD_STOPPED:
         g_signal_emit_by_name (atkObj, "load_stopped");
--- a/browser/base/content/browser-feeds.js
+++ b/browser/base/content/browser-feeds.js
@@ -147,19 +147,17 @@ var FeedHandler = {
     } else {
       this._feedMenuitem.setAttribute("feed", feeds[0].href);
       this._feedMenuitem.removeAttribute("disabled");
       this._feedMenuitem.removeAttribute("hidden");
       this._feedMenupopup.setAttribute("hidden", "true");
     }
   },
 
-  addFeed: function(link, targetDoc) {
-    // find which tab this is for, and set the attribute on the browser
-    var browserForLink = gBrowser.getBrowserForDocument(targetDoc);
+  addFeed: function(link, browserForLink) {
     if (!browserForLink) {
       // ignore feeds loaded in subframes (see bug 305472)
       return;
     }
 
     if (!browserForLink.feeds)
       browserForLink.feeds = [];
 
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -797,17 +797,17 @@ var gBrowserInit = {
     window.QueryInterface(Ci.nsIDOMChromeWindow).browserDOMWindow =
       new nsBrowserAccess();
 
     // hook up UI through progress listener
     gBrowser.addProgressListener(window.XULBrowserWindow);
     gBrowser.addTabsProgressListener(window.TabsProgressListener);
 
     // setup our common DOMLinkAdded listener
-    gBrowser.addEventListener("DOMLinkAdded", DOMLinkHandler, false);
+    DOMLinkHandler.init();
 
     // setup simple gestures support
     gGestureSupport.init(true);
 
     // setup history swipe animation
     gHistorySwipeAnimation.init();
 
     if (window.opener && !window.opener.closed &&
@@ -2759,157 +2759,78 @@ var newWindowButtonObserver = {
         // allow third-party services to fixup this URL
         openNewWindowWith(data.url, null, data.postData, true);
       }
     });
   }
 }
 
 const DOMLinkHandler = {
-  handleEvent: function (event) {
-    switch (event.type) {
-      case "DOMLinkAdded":
-        this.onLinkAdded(event);
+  init: function() {
+    let mm = window.messageManager;
+    mm.addMessageListener("Link:AddFeed", this);
+    mm.addMessageListener("Link:AddIcon", this);
+    mm.addMessageListener("Link:AddSearch", this);
+  },
+
+  receiveMessage: function (aMsg) {
+    switch (aMsg.name) {
+      case "Link:AddFeed":
+        let link = {type: aMsg.data.type, href: aMsg.data.href, title: aMsg.data.title};
+        FeedHandler.addFeed(link, aMsg.target);
+        break;
+
+      case "Link:AddIcon":
+        return this.addIcon(aMsg.target, aMsg.data.url);
+        break;
+
+      case "Link:AddSearch":
+        this.addSearch(aMsg.target, aMsg.data.engine, aMsg.data.url);
         break;
     }
   },
-  getLinkIconURI: function(aLink) {
-    let targetDoc = aLink.ownerDocument;
-    var uri = makeURI(aLink.href, targetDoc.characterSet);
-
-    // Verify that the load of this icon is legal.
-    // Some error or special pages can load their favicon.
-    // To be on the safe side, only allow chrome:// favicons.
-    var isAllowedPage = [
-      /^about:neterror\?/,
-      /^about:blocked\?/,
-      /^about:certerror\?/,
-      /^about:home$/,
-    ].some(function (re) re.test(targetDoc.documentURI));
-
-    if (!isAllowedPage || !uri.schemeIs("chrome")) {
-      var ssm = Services.scriptSecurityManager;
-      try {
-        ssm.checkLoadURIWithPrincipal(targetDoc.nodePrincipal, uri,
-                                      Ci.nsIScriptSecurityManager.DISALLOW_SCRIPT);
-      } catch(e) {
-        return null;
-      }
-    }
-
-    try {
-      var contentPolicy = Cc["@mozilla.org/layout/content-policy;1"].
-                          getService(Ci.nsIContentPolicy);
-    } catch(e) {
-      return null; // Refuse to load if we can't do a security check.
-    }
-
-    // Security says okay, now ask content policy
-    if (contentPolicy.shouldLoad(Ci.nsIContentPolicy.TYPE_IMAGE,
-                                 uri, targetDoc.documentURIObject,
-                                 aLink, aLink.type, null)
-                                 != Ci.nsIContentPolicy.ACCEPT)
-      return null;
-
-    try {
-      uri.userPass = "";
-    } catch(e) {
-      // some URIs are immutable
-    }
-    return uri;
-  },
-  onLinkAdded: function (event) {
-    var link = event.originalTarget;
-    var rel = link.rel && link.rel.toLowerCase();
-    if (!link || !link.ownerDocument || !rel || !link.href)
-      return;
-
-    var feedAdded = false;
-    var iconAdded = false;
-    var searchAdded = false;
-    var rels = {};
-    for (let relString of rel.split(/\s+/))
-      rels[relString] = true;
-
-    for (let relVal in rels) {
-      switch (relVal) {
-        case "feed":
-        case "alternate":
-          if (!feedAdded) {
-            if (!rels.feed && rels.alternate && rels.stylesheet)
-              break;
-
-            if (isValidFeed(link, link.ownerDocument.nodePrincipal, "feed" in rels)) {
-              FeedHandler.addFeed(link, link.ownerDocument);
-              feedAdded = true;
-            }
-          }
-          break;
-        case "icon":
-          if (!iconAdded) {
-            if (!gPrefService.getBoolPref("browser.chrome.site_icons"))
-              break;
-
-            var uri = this.getLinkIconURI(link);
-            if (!uri)
-              break;
-
-            if (gBrowser.isFailedIcon(uri))
-              break;
-
-            var browserIndex = gBrowser.getBrowserIndexForDocument(link.ownerDocument);
-            // no browser? no favicon.
-            if (browserIndex == -1)
-              break;
-
-            let tab = gBrowser.tabs[browserIndex];
-            gBrowser.setIcon(tab, uri.spec);
-            iconAdded = true;
-          }
-          break;
-        case "search":
-          if (!searchAdded) {
-            var type = link.type && link.type.toLowerCase();
-            type = type.replace(/^\s+|\s*(?:;.*)?$/g, "");
-
-            if (type == "application/opensearchdescription+xml" && link.title &&
-                /^(?:https?|ftp):/i.test(link.href)) {
-              var engine = { title: link.title, href: link.href };
-              BrowserSearch.addEngine(engine, link.ownerDocument);
-              searchAdded = true;
-            }
-          }
-          break;
-      }
-    }
-  }
+
+  addIcon: function(aBrowser, aURL) {
+    if (gBrowser.isFailedIcon(aURL))
+      return false;
+
+    let tab = gBrowser._getTabForBrowser(aBrowser);
+    if (!tab)
+      return false;
+
+    gBrowser.setIcon(tab, aURL);
+    return true;
+  },
+
+  addSearch: function(aBrowser, aEngine, aURL) {
+    let tab = gBrowser._getTabForBrowser(aBrowser);
+    if (!tab)
+      return false;
+
+    BrowserSearch.addEngine(aBrowser, aEngine, makeURI(aURL));
+  },
 }
 
 const BrowserSearch = {
-  addEngine: function(engine, targetDoc) {
+  addEngine: function(browser, engine, uri) {
     if (!this.searchBar)
       return;
 
-    var browser = gBrowser.getBrowserForDocument(targetDoc);
-    // ignore search engines from subframes (see bug 479408)
-    if (!browser)
-      return;
-
     // Check to see whether we've already added an engine with this title
     if (browser.engines) {
       if (browser.engines.some(function (e) e.title == engine.title))
         return;
     }
 
     // Append the URI and an appropriate title to the browser data.
     // Use documentURIObject in the check for shouldLoadFavIcon so that we
     // do the right thing with about:-style error pages.  Bug 453442
     var iconURL = null;
-    if (gBrowser.shouldLoadFavIcon(targetDoc.documentURIObject))
-      iconURL = targetDoc.documentURIObject.prePath + "/favicon.ico";
+    if (gBrowser.shouldLoadFavIcon(uri))
+      iconURL = uri.prePath + "/favicon.ico";
 
     var hidden = false;
     // If this engine (identified by title) is already in the list, add it
     // to the list of hidden engines rather than to the main list.
     // XXX This will need to be changed when engines are identified by URL;
     // see bug 335102.
     if (Services.search.getEngineByName(engine.title))
       hidden = true;
--- a/browser/base/content/content.js
+++ b/browser/base/content/content.js
@@ -4,20 +4,22 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 let Cc = Components.classes;
 let Ci = Components.interfaces;
 let Cu = Components.utils;
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 
-XPCOMUtils.defineLazyModuleGetter(this,
-  "LoginManagerContent", "resource://gre/modules/LoginManagerContent.jsm");
-XPCOMUtils.defineLazyModuleGetter(this,
-  "InsecurePasswordUtils", "resource://gre/modules/InsecurePasswordUtils.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "ContentLinkHandler",
+  "resource:///modules/ContentLinkHandler.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "LoginManagerContent",
+  "resource://gre/modules/LoginManagerContent.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "InsecurePasswordUtils",
+  "resource://gre/modules/InsecurePasswordUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
   "resource://gre/modules/PrivateBrowsingUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "UITour",
   "resource:///modules/UITour.jsm");
 
 // Creates a new nsIURI object.
 function makeURI(uri, originCharset, baseURI) {
   return Services.io.newURI(uri, originCharset, baseURI);
@@ -278,11 +280,13 @@ let ClickEventHandler = {
     // In case of XLink, we don't return the node we got href from since
     // callers expect <a>-like elements.
     // Note: makeURI() will throw if aUri is not a valid URI.
     return [href ? makeURI(href, null, baseURI).spec : null, null];
   }
 };
 ClickEventHandler.init();
 
+ContentLinkHandler.init(this);
+
 addEventListener("DOMWebNotificationClicked", function(event) {
   sendAsyncMessage("DOMWebNotificationClicked", {});
 }, false);
--- a/browser/base/content/pageinfo/feeds.js
+++ b/browser/base/content/pageinfo/feeds.js
@@ -1,13 +1,16 @@
 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* 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/. */
 
+XPCOMUtils.defineLazyModuleGetter(this, "Feeds",
+  "resource:///modules/Feeds.jsm");
+
 function initFeedTab()
 {
   const feedTypes = {
     "application/rss+xml": gBundle.getString("feedRss"),
     "application/atom+xml": gBundle.getString("feedAtom"),
     "text/xml": gBundle.getString("feedXML"),
     "application/xml": gBundle.getString("feedXML"),
     "application/rdf+xml": gBundle.getString("feedXML")
@@ -24,17 +27,17 @@ function initFeedTab()
     var rel = link.rel && link.rel.toLowerCase();
     var rels = {};
     if (rel) {
       for each (let relVal in rel.split(/\s+/))
         rels[relVal] = true;
     }
 
     if (rels.feed || (link.type && rels.alternate && !rels.stylesheet)) {
-      var type = isValidFeed(link, gDocument.nodePrincipal, "feed" in rels);
+      var type = Feeds.isValidFeed(link, gDocument.nodePrincipal, "feed" in rels);
       if (type) {
         type = feedTypes[type] || feedTypes["application/rss+xml"];
         addRow(link.title, type, link.href);
       }
     }
   }
 
   var feedListbox = document.getElementById("feedListbox");
--- a/browser/base/content/socialchat.xml
+++ b/browser/base/content/socialchat.xml
@@ -232,17 +232,18 @@
         // this sets the presence icon for a chat user, we simply use favicon style updating
         let link = event.originalTarget;
         let rel = link.rel && link.rel.toLowerCase();
         if (!link || !link.ownerDocument || !rel || !link.href)
           return;
         if (link.rel.indexOf("icon") < 0)
           return;
 
-        let uri = DOMLinkHandler.getLinkIconURI(link);
+        let ContentLinkHandler = Cu.import("resource:///modules/ContentLinkHandler.jsm", {}).ContentLinkHandler;
+        let uri = ContentLinkHandler.getLinkIconURI(link);
         if (!uri)
           return;
 
         // we made it this far, use it
         this.setAttribute('image', uri.spec);
         if (this.chatbar)
           this.chatbar.updateTitlebar(this);
       ]]></handler>
--- a/browser/base/content/socialmarks.xml
+++ b/browser/base/content/socialmarks.xml
@@ -302,17 +302,18 @@
             // updating
             let link = aEvent.originalTarget;
             let rel = link.rel && link.rel.toLowerCase();
             if (!link || !link.ownerDocument || !rel || !link.href)
               return;
             if (link.rel.indexOf("icon") < 0)
               return;
 
-            let uri = DOMLinkHandler.getLinkIconURI(link);
+            let ContentLinkHandler = Cu.import("resource:///modules/ContentLinkHandler.jsm", {}).ContentLinkHandler;
+            let uri = ContentLinkHandler.getLinkIconURI(link);
             if (!uri)
               return;
 
             // we cannot size the image when we apply it via listStyleImage, so
             // use the toolbar image
             this.setAttribute("image", uri.spec);
             }
             break;
--- a/browser/base/content/test/general/browser_bug413915.js
+++ b/browser/base/content/test/general/browser_bug413915.js
@@ -1,16 +1,19 @@
+XPCOMUtils.defineLazyModuleGetter(this, "Feeds",
+  "resource:///modules/Feeds.jsm");
+
 function test() {
   var exampleUri = makeURI("http://example.com/");
   var secman = Cc["@mozilla.org/scriptsecuritymanager;1"].getService(Ci.nsIScriptSecurityManager);
   var principal = secman.getSimpleCodebasePrincipal(exampleUri);
 
   function testIsFeed(aTitle, aHref, aType, aKnown) {
     var link = { title: aTitle, href: aHref, type: aType };
-    return isValidFeed(link, principal, aKnown);
+    return Feeds.isValidFeed(link, principal, aKnown);
   }
 
   var href = "http://example.com/feed/";
   var atomType = "application/atom+xml";
   var funkyAtomType = " aPPLICAtion/Atom+XML ";
   var rssType = "application/rss+xml";
   var funkyRssType = " Application/RSS+XML  ";
   var rdfType = "application/rdf+xml";
--- a/browser/base/content/utilityOverlay.js
+++ b/browser/base/content/utilityOverlay.js
@@ -644,51 +644,16 @@ function openNewWindowWith(aURL, aDocume
 
   openLinkIn(aURL, "window",
              { charset: originCharset,
                postData: aPostData,
                allowThirdPartyFixup: aAllowThirdPartyFixup,
                referrerURI: aDocument ? aDocument.documentURIObject : aReferrer });
 }
 
-/**
- * isValidFeed: checks whether the given data represents a valid feed.
- *
- * @param  aLink
- *         An object representing a feed with title, href and type.
- * @param  aPrincipal
- *         The principal of the document, used for security check.
- * @param  aIsFeed
- *         Whether this is already a known feed or not, if true only a security
- *         check will be performed.
- */ 
-function isValidFeed(aLink, aPrincipal, aIsFeed)
-{
-  if (!aLink || !aPrincipal)
-    return false;
-
-  var type = aLink.type.toLowerCase().replace(/^\s+|\s*(?:;.*)?$/g, "");
-  if (!aIsFeed) {
-    aIsFeed = (type == "application/rss+xml" ||
-               type == "application/atom+xml");
-  }
-
-  if (aIsFeed) {
-    try {
-      urlSecurityCheck(aLink.href, aPrincipal,
-                       Components.interfaces.nsIScriptSecurityManager.DISALLOW_INHERIT_PRINCIPAL);
-      return type || "application/rss+xml";
-    }
-    catch(ex) {
-    }
-  }
-
-  return null;
-}
-
 // aCalledFromModal is optional
 function openHelpLink(aHelpTopic, aCalledFromModal, aWhere) {
   var url = Components.classes["@mozilla.org/toolkit/URLFormatterService;1"]
                       .getService(Components.interfaces.nsIURLFormatter)
                       .formatURLPref("app.support.baseURL");
   url += aHelpTopic;
 
   var where = aWhere;
new file mode 100644
--- /dev/null
+++ b/browser/modules/ContentLinkHandler.jsm
@@ -0,0 +1,136 @@
+/* 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/. */
+
+"use strict";
+
+let Cc = Components.classes;
+let Ci = Components.interfaces;
+let Cu = Components.utils;
+
+this.EXPORTED_SYMBOLS = [ "ContentLinkHandler" ];
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+XPCOMUtils.defineLazyModuleGetter(this, "Feeds",
+  "resource:///modules/Feeds.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "BrowserUtils",
+  "resource://gre/modules/BrowserUtils.jsm");
+
+this.ContentLinkHandler = {
+  init: function(chromeGlobal) {
+    chromeGlobal.addEventListener("DOMLinkAdded", (event) => {
+      this.onLinkAdded(event, chromeGlobal);
+    }, false);
+  },
+
+  onLinkAdded: function(event, chromeGlobal) {
+    var link = event.originalTarget;
+    var rel = link.rel && link.rel.toLowerCase();
+    if (!link || !link.ownerDocument || !rel || !link.href)
+      return;
+
+    var feedAdded = false;
+    var iconAdded = false;
+    var searchAdded = false;
+    var rels = {};
+    for (let relString of rel.split(/\s+/))
+      rels[relString] = true;
+
+    for (let relVal in rels) {
+      switch (relVal) {
+        case "feed":
+        case "alternate":
+          if (!feedAdded) {
+            if (!rels.feed && rels.alternate && rels.stylesheet)
+              break;
+
+            if (Feeds.isValidFeed(link, link.ownerDocument.nodePrincipal, "feed" in rels)) {
+              chromeGlobal.sendAsyncMessage("Link:AddFeed",
+                                            {type: link.type,
+                                             href: link.href,
+                                             title: link.title});
+              feedAdded = true;
+            }
+          }
+          break;
+        case "icon":
+          if (!iconAdded) {
+            if (!Services.prefs.getBoolPref("browser.chrome.site_icons"))
+              break;
+
+            var uri = this.getLinkIconURI(link);
+            if (!uri)
+              break;
+
+            [iconAdded] = chromeGlobal.sendSyncMessage("Link:AddIcon", {url: uri.spec});
+          }
+          break;
+        case "search":
+          if (!searchAdded) {
+            var type = link.type && link.type.toLowerCase();
+            type = type.replace(/^\s+|\s*(?:;.*)?$/g, "");
+
+            let re = /^(?:https?|ftp):/i;
+            if (type == "application/opensearchdescription+xml" && link.title &&
+                re.test(link.href))
+            {
+              let engine = { title: link.title, href: link.href };
+              chromeGlobal.sendAsyncMessage("Link:AddSearch",
+                                            {engine: engine,
+                                             url: link.ownerDocument.documentURI});
+              searchAdded = true;
+            }
+          }
+          break;
+      }
+    }
+  },
+
+  getLinkIconURI: function(aLink) {
+    let targetDoc = aLink.ownerDocument;
+    var uri = BrowserUtils.makeURI(aLink.href, targetDoc.characterSet);
+
+    // Verify that the load of this icon is legal.
+    // Some error or special pages can load their favicon.
+    // To be on the safe side, only allow chrome:// favicons.
+    var isAllowedPage = [
+      /^about:neterror\?/,
+      /^about:blocked\?/,
+      /^about:certerror\?/,
+      /^about:home$/,
+    ].some(function (re) re.test(targetDoc.documentURI));
+
+    if (!isAllowedPage || !uri.schemeIs("chrome")) {
+      var ssm = Services.scriptSecurityManager;
+      try {
+        ssm.checkLoadURIWithPrincipal(targetDoc.nodePrincipal, uri,
+                                      Ci.nsIScriptSecurityManager.DISALLOW_SCRIPT);
+      } catch(e) {
+        return null;
+      }
+    }
+
+    try {
+      var contentPolicy = Cc["@mozilla.org/layout/content-policy;1"].
+                          getService(Ci.nsIContentPolicy);
+    } catch(e) {
+      return null; // Refuse to load if we can't do a security check.
+    }
+
+    // Security says okay, now ask content policy
+    if (contentPolicy.shouldLoad(Ci.nsIContentPolicy.TYPE_IMAGE,
+                                 uri, targetDoc.documentURIObject,
+                                 aLink, aLink.type, null)
+                                 != Ci.nsIContentPolicy.ACCEPT)
+      return null;
+
+    try {
+      uri.userPass = "";
+    } catch(e) {
+      // some URIs are immutable
+    }
+    return uri;
+  },
+};
new file mode 100644
--- /dev/null
+++ b/browser/modules/Feeds.jsm
@@ -0,0 +1,52 @@
+/* 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/. */
+
+"use strict";
+
+this.EXPORTED_SYMBOLS = [ "Feeds" ];
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
+XPCOMUtils.defineLazyModuleGetter(this, "BrowserUtils",
+                                  "resource://gre/modules/BrowserUtils.jsm");
+
+const Ci = Components.interfaces;
+
+this.Feeds = {
+
+  /**
+   * isValidFeed: checks whether the given data represents a valid feed.
+   *
+   * @param  aLink
+   *         An object representing a feed with title, href and type.
+   * @param  aPrincipal
+   *         The principal of the document, used for security check.
+   * @param  aIsFeed
+   *         Whether this is already a known feed or not, if true only a security
+   *         check will be performed.
+   */
+  isValidFeed: function(aLink, aPrincipal, aIsFeed) {
+    if (!aLink || !aPrincipal)
+      return false;
+
+    var type = aLink.type.toLowerCase().replace(/^\s+|\s*(?:;.*)?$/g, "");
+    if (!aIsFeed) {
+      aIsFeed = (type == "application/rss+xml" ||
+                 type == "application/atom+xml");
+    }
+
+    if (aIsFeed) {
+      try {
+        BrowserUtils.urlSecurityCheck(aLink.href, aPrincipal,
+                                      Ci.nsIScriptSecurityManager.DISALLOW_INHERIT_PRINCIPAL);
+        return type || "application/rss+xml";
+      }
+      catch(ex) {
+      }
+    }
+
+    return null;
+  },
+
+};
--- a/browser/modules/moz.build
+++ b/browser/modules/moz.build
@@ -5,16 +5,18 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 TEST_DIRS += ['test']
 
 EXTRA_JS_MODULES += [
     'BrowserNewTabPreloader.jsm',
     'BrowserUITelemetry.jsm',
     'ContentClick.jsm',
+    'ContentLinkHandler.jsm',
+    'Feeds.jsm',
     'NetworkPrioritizer.jsm',
     'offlineAppCache.jsm',
     'SharedFrame.jsm',
     'SignInToWebsite.jsm',
     'SitePermissions.jsm',
     'Social.jsm',
     'TabCrashReporter.jsm',
     'UITour.jsm',
--- a/content/base/src/nsFrameLoader.cpp
+++ b/content/base/src/nsFrameLoader.cpp
@@ -1775,18 +1775,31 @@ nsFrameLoader::CheckForRecursiveLoad(nsI
 
       return NS_ERROR_UNEXPECTED; // Too deep, give up!  (silently?)
     }
 
     nsCOMPtr<nsIDocShellTreeItem> temp;
     temp.swap(parentAsItem);
     temp->GetSameTypeParent(getter_AddRefs(parentAsItem));
   }
-  
-  // Bug 136580: Check for recursive frame loading
+
+  // Bug 136580: Check for recursive frame loading excluding about:srcdoc URIs.
+  // srcdoc URIs require their contents to be specified inline, so it isn't
+  // possible for undesirable recursion to occur without the aid of a
+  // non-srcdoc URI,  which this method will block normally.
+  // Besides, URI is not enough to guarantee uniqueness of srcdoc documents.
+  nsAutoCString buffer;
+  rv = aURI->GetScheme(buffer);
+  if (NS_SUCCEEDED(rv) && buffer.EqualsLiteral("about")) {
+    rv = aURI->GetPath(buffer);
+    if (NS_SUCCEEDED(rv) && buffer.EqualsLiteral("srcdoc")) {
+      // Duplicates allowed up to depth limits
+      return NS_OK;
+    }
+  }
   int32_t matchCount = 0;
   mDocShell->GetSameTypeParent(getter_AddRefs(parentAsItem));
   while (parentAsItem) {
     // Check the parent URI with the URI we're loading
     nsCOMPtr<nsIWebNavigation> parentAsNav(do_QueryInterface(parentAsItem));
     if (parentAsNav) {
       // Does the URI match the one we're about to load?
       nsCOMPtr<nsIURI> parentURI;
--- a/content/html/content/test/mochitest.ini
+++ b/content/html/content/test/mochitest.ini
@@ -373,16 +373,17 @@ support-files =
 [test_bug841466.html]
 [test_bug845057.html]
 [test_bug869040.html]
 [test_bug870787.html]
 [test_bug874758.html]
 [test_bug879319.html]
 [test_bug885024.html]
 [test_bug893537.html]
+[test_bug969346.html]
 [test_change_crossorigin.html]
 [test_checked.html]
 [test_dir_attributes_reflection.html]
 [test_dl_attributes_reflection.html]
 [test_element_prototype.html]
 [test_embed_attributes_reflection.html]
 [test_formData.html]
 [test_formSubmission.html]
new file mode 100644
--- /dev/null
+++ b/content/html/content/test/test_bug969346.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=969346
+-->
+<head>
+<title>Nesting of srcdoc iframes is permitted</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=969349">Mozilla Bug 969346</a>
+
+<iframe id="pframe" srcdoc="<iframe id='iframe' srcdoc='I am nested'></iframe"></iframe>
+
+<pre id="test">
+<script>
+
+    SimpleTest.waitForExplicitFinish();
+    addLoadEvent(function () {
+        var pframe = $("pframe");
+        var pframeDoc = pframe.contentDocument;
+        var iframe = pframeDoc.getElementById("iframe");
+        var innerDoc = iframe.contentDocument;
+
+        is(innerDoc.body.innerHTML, "I am nested", "Nesting not working?");
+        SimpleTest.finish();
+    });
+
+</script>
+</pre>
+</body>
+</html>
--- a/content/media/directshow/DirectShowReader.cpp
+++ b/content/media/directshow/DirectShowReader.cpp
@@ -273,17 +273,17 @@ public:
       }
     } else if (mBytesPerSample == 2) {
       for (uint32_t i = 0; i < maxSamples; ++i) {
         int16_t *sample = reinterpret_cast<int16_t *>(mSource + byteOffset);
         aBuffer[i] = AudioSampleToFloat(*sample);
         byteOffset += mBytesPerSample;
       }
     }
-    mNextSample = maxSamples;
+    mNextSample += maxSamples;
     return frames;
   }
 
 private:
   uint8_t * const mSource;
   const uint32_t mBytesPerSample;
   const uint32_t mSamples;
   const uint32_t mChannels;
--- a/content/media/plugins/MPAPI.h
+++ b/content/media/plugins/MPAPI.h
@@ -130,17 +130,17 @@ struct AudioFrame {
 struct Decoder;
 
 struct PluginHost {
   bool (*Read)(Decoder *aDecoder, char *aBuffer, int64_t aOffset, uint32_t aCount, uint32_t* aBytes);
   uint64_t (*GetLength)(Decoder *aDecoder);
   void (*SetMetaDataReadMode)(Decoder *aDecoder);
   void (*SetPlaybackReadMode)(Decoder *aDecoder);
   bool (*GetIntPref)(const char *aPref, int32_t *aResult);
-  bool (*GetSystemInfoString)(const char *aKey, char *aResult, uint32_t aResultLen);
+  bool (*GetSystemInfoString)(const char *aKey, char *aResult, size_t aResultLen);
 };
 
 struct Decoder {
   void *mResource;
   void *mPrivate;
 
   Decoder();
 
--- a/content/media/plugins/MediaPluginHost.cpp
+++ b/content/media/plugins/MediaPluginHost.cpp
@@ -15,19 +15,17 @@
 #include "gfxCrashReporterUtils.h"
 #include "prmem.h"
 #include "prlink.h"
 #include "MediaResourceServer.h"
 #include "nsServiceManagerUtils.h"
 
 #include "MPAPI.h"
 
-#if defined(ANDROID) && !defined(MOZ_WIDGET_GONK)
 #include "nsIPropertyBag2.h"
-#endif
 
 #if defined(ANDROID) || defined(MOZ_WIDGET_GONK)
 #include "android/log.h"
 #define ALOG(args...)  __android_log_print(ANDROID_LOG_INFO, "MediaPluginHost" , ## args)
 #else
 #define ALOG(args...) /* do nothing */
 #endif
 
@@ -89,17 +87,17 @@ GetSystemInfoString(const char *aKey, ch
 }
 
 static PluginHost sPluginHost = {
   nullptr,
   nullptr,
   nullptr,
   nullptr,
   GetIntPref,
-  GetSystemInfoString,
+  GetSystemInfoString
 };
 
 // Return true if Omx decoding is supported on the device. This checks the
 // built in whitelist/blacklist and preferences to see if that is overridden.
 static bool IsOmxSupported()
 {
   bool forceEnabled =
       Preferences::GetBool("stagefright.force-enabled", false);
--- a/dom/ipc/Blob.cpp
+++ b/dom/ipc/Blob.cpp
@@ -950,16 +950,18 @@ private:
     void
     RunInternal(bool aNotify)
     {
       MOZ_ASSERT(NS_IsMainThread());
       MOZ_ASSERT(mActor);
       MOZ_ASSERT(!mSlice);
       MOZ_ASSERT(!mDone);
 
+      NS_ENSURE_TRUE_VOID(mActor->Manager());
+
       NormalBlobConstructorParams normalParams;
       normalParams.contentType() = mContentType;
       normalParams.length() = mLength;
 
       typename ActorType::ConstructorParamsType params;
       ActorType::BaseType::SetBlobConstructorParams(params, normalParams);
 
       ActorType* newActor = ActorType::Create(mActor->Manager(), params);
@@ -1347,16 +1349,18 @@ Blob<ActorFlavor>::ActorDestroy(ActorDes
 
   if (mRemoteBlob) {
     mRemoteBlob->SetActor(nullptr);
   }
 
   if (mBlob && mOwnsBlob) {
     mBlob->Release();
   }
+
+  mManager = nullptr;
 }
 
 template <ActorFlavorEnum ActorFlavor>
 bool
 Blob<ActorFlavor>::RecvResolveMystery(const ResolveMysteryParams& aParams)
 {
   MOZ_ASSERT(NS_IsMainThread());
   MOZ_ASSERT(mBlob);
--- a/gfx/gl/GLContext.cpp
+++ b/gfx/gl/GLContext.cpp
@@ -1701,41 +1701,41 @@ GLContext::DeletedProgram(GLContext *aOr
 
 void
 GLContext::DeletedShader(GLContext *aOrigin, GLuint aName)
 {
     RemoveNamesFromArray(aOrigin, 1, &aName, mTrackedShaders);
 }
 
 void
-GLContext::DeletedBuffers(GLContext *aOrigin, GLsizei aCount, GLuint *aNames)
+GLContext::DeletedBuffers(GLContext *aOrigin, GLsizei aCount, const GLuint *aNames)
 {
     RemoveNamesFromArray(aOrigin, aCount, aNames, mTrackedBuffers);
 }
 
 void
 GLContext::DeletedQueries(GLContext *aOrigin, GLsizei aCount, const GLuint *aNames)
 {
     RemoveNamesFromArray(aOrigin, aCount, aNames, mTrackedQueries);
 }
 
 void
-GLContext::DeletedTextures(GLContext *aOrigin, GLsizei aCount, GLuint *aNames)
+GLContext::DeletedTextures(GLContext *aOrigin, GLsizei aCount, const GLuint *aNames)
 {
     RemoveNamesFromArray(aOrigin, aCount, aNames, mTrackedTextures);
 }
 
 void
-GLContext::DeletedFramebuffers(GLContext *aOrigin, GLsizei aCount, GLuint *aNames)
+GLContext::DeletedFramebuffers(GLContext *aOrigin, GLsizei aCount, const GLuint *aNames)
 {
     RemoveNamesFromArray(aOrigin, aCount, aNames, mTrackedFramebuffers);
 }
 
 void
-GLContext::DeletedRenderbuffers(GLContext *aOrigin, GLsizei aCount, GLuint *aNames)
+GLContext::DeletedRenderbuffers(GLContext *aOrigin, GLsizei aCount, const GLuint *aNames)
 {
     RemoveNamesFromArray(aOrigin, aCount, aNames, mTrackedRenderbuffers);
 }
 
 static void
 MarkContextDestroyedInArray(GLContext *aContext, nsTArray<GLContext::NamedResource>& aArray)
 {
     for (uint32_t i = 0; i < aArray.Length(); ++i) {
--- a/gfx/gl/GLContext.h
+++ b/gfx/gl/GLContext.h
@@ -1036,17 +1036,17 @@ public:
     }
 
     void fGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders) {
         BEFORE_GL_CALL;
         mSymbols.fGetAttachedShaders(program, maxCount, count, shaders);
         AFTER_GL_CALL;
     }
 
-    GLint fGetAttribLocation (GLuint program, const GLchar* name) {
+    GLint fGetAttribLocation(GLuint program, const GLchar* name) {
         BEFORE_GL_CALL;
         GLint retval = mSymbols.fGetAttribLocation(program, name);
         AFTER_GL_CALL;
         return retval;
     }
 
 private:
     void raw_fGetIntegerv(GLenum pname, GLint *params) {
@@ -1945,35 +1945,35 @@ private:
     }
 
     void GLAPIENTRY raw_fDeleteShader(GLuint shader) {
         BEFORE_GL_CALL;
         mSymbols.fDeleteShader(shader);
         AFTER_GL_CALL;
     }
 
-    void GLAPIENTRY raw_fDeleteBuffers(GLsizei n, GLuint *names) {
+    void GLAPIENTRY raw_fDeleteBuffers(GLsizei n, const GLuint* names) {
         BEFORE_GL_CALL;
         mSymbols.fDeleteBuffers(n, names);
         AFTER_GL_CALL;
     }
 
-    void GLAPIENTRY raw_fDeleteFramebuffers(GLsizei n, GLuint *names) {
+    void GLAPIENTRY raw_fDeleteFramebuffers(GLsizei n, const GLuint* names) {
         BEFORE_GL_CALL;
         mSymbols.fDeleteFramebuffers(n, names);
         AFTER_GL_CALL;
     }
 
-    void GLAPIENTRY raw_fDeleteRenderbuffers(GLsizei n, GLuint *names) {
+    void GLAPIENTRY raw_fDeleteRenderbuffers(GLsizei n, const GLuint* names) {
         BEFORE_GL_CALL;
         mSymbols.fDeleteRenderbuffers(n, names);
         AFTER_GL_CALL;
     }
 
-    void GLAPIENTRY raw_fDeleteTextures(GLsizei n, GLuint *names) {
+    void GLAPIENTRY raw_fDeleteTextures(GLsizei n, const GLuint* names) {
         BEFORE_GL_CALL;
         mSymbols.fDeleteTextures(n, names);
         AFTER_GL_CALL;
     }
 
 public:
 
     void fDeleteProgram(GLuint program) {
@@ -1981,44 +1981,44 @@ public:
         TRACKING_CONTEXT(DeletedProgram(this, program));
     }
 
     void fDeleteShader(GLuint shader) {
         raw_fDeleteShader(shader);
         TRACKING_CONTEXT(DeletedShader(this, shader));
     }
 
-    void fDeleteBuffers(GLsizei n, GLuint *names) {
+    void fDeleteBuffers(GLsizei n, const GLuint* names) {
         raw_fDeleteBuffers(n, names);
         TRACKING_CONTEXT(DeletedBuffers(this, n, names));
     }
 
-    void fDeleteFramebuffers(GLsizei n, GLuint *names) {
+    void fDeleteFramebuffers(GLsizei n, const GLuint* names) {
         if (mScreen) {
             // Notify mScreen which framebuffers we're deleting.
             // Otherwise, we will get framebuffer binding mispredictions.
             for (int i = 0; i < n; i++) {
                 mScreen->DeletingFB(names[i]);
             }
         }
 
         if (n == 1 && *names == 0) {
             // Deleting framebuffer 0 causes hangs on the DROID. See bug 623228.
         } else {
             raw_fDeleteFramebuffers(n, names);
         }
         TRACKING_CONTEXT(DeletedFramebuffers(this, n, names));
     }
 
-    void fDeleteRenderbuffers(GLsizei n, GLuint *names) {
+    void fDeleteRenderbuffers(GLsizei n, const GLuint* names) {
         raw_fDeleteRenderbuffers(n, names);
         TRACKING_CONTEXT(DeletedRenderbuffers(this, n, names));
     }
 
-    void fDeleteTextures(GLsizei n, GLuint *names) {
+    void fDeleteTextures(GLsizei n, const GLuint* names) {
         raw_fDeleteTextures(n, names);
         TRACKING_CONTEXT(DeletedTextures(this, n, names));
     }
 
     GLenum GLAPIENTRY fGetGraphicsResetStatus() {
         MOZ_ASSERT(mHasRobustness);
 
         BEFORE_GL_CALL;
@@ -2858,21 +2858,21 @@ public:
     void CreatedShader(GLContext *aOrigin, GLuint aName);
     void CreatedBuffers(GLContext *aOrigin, GLsizei aCount, GLuint *aNames);
     void CreatedQueries(GLContext *aOrigin, GLsizei aCount, GLuint *aNames);
     void CreatedTextures(GLContext *aOrigin, GLsizei aCount, GLuint *aNames);
     void CreatedFramebuffers(GLContext *aOrigin, GLsizei aCount, GLuint *aNames);
     void CreatedRenderbuffers(GLContext *aOrigin, GLsizei aCount, GLuint *aNames);
     void DeletedProgram(GLContext *aOrigin, GLuint aName);
     void DeletedShader(GLContext *aOrigin, GLuint aName);
-    void DeletedBuffers(GLContext *aOrigin, GLsizei aCount, GLuint *aNames);
+    void DeletedBuffers(GLContext *aOrigin, GLsizei aCount, const GLuint *aNames);
     void DeletedQueries(GLContext *aOrigin, GLsizei aCount, const GLuint *aNames);
-    void DeletedTextures(GLContext *aOrigin, GLsizei aCount, GLuint *aNames);
-    void DeletedFramebuffers(GLContext *aOrigin, GLsizei aCount, GLuint *aNames);
-    void DeletedRenderbuffers(GLContext *aOrigin, GLsizei aCount, GLuint *aNames);
+    void DeletedTextures(GLContext *aOrigin, GLsizei aCount, const GLuint *aNames);
+    void DeletedFramebuffers(GLContext *aOrigin, GLsizei aCount, const GLuint *aNames);
+    void DeletedRenderbuffers(GLContext *aOrigin, GLsizei aCount, const GLuint *aNames);
 
     void SharedContextDestroyed(GLContext *aChild);
     void ReportOutstandingNames();
 
     struct NamedResource {
         NamedResource()
             : origin(nullptr), name(0), originDeleted(false)
         { }
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/asm.js/testBug965767.js
@@ -0,0 +1,2098 @@
+var buffer = new ArrayBuffer(4096);
+
+function testmod (glob, env, b) {
+    'use asm';
+    var f32=new glob.Float32Array(b)
+    function fn1() {
+	f32[0 >> 2]=2.0
+	f32[4 >> 2]=2.125
+	f32[8 >> 2]=2.25
+	f32[12 >> 2]=2.375
+	f32[16 >> 2]=2.5
+	f32[20 >> 2]=2.625
+	f32[24 >> 2]=2.75
+	f32[28 >> 2]=2.875
+	f32[32 >> 2]=3.0
+	f32[36 >> 2]=3.125
+	f32[40 >> 2]=3.25
+	f32[44 >> 2]=3.375
+	f32[48 >> 2]=3.5
+	f32[52 >> 2]=3.625
+	f32[56 >> 2]=3.75
+	f32[60 >> 2]=3.875
+	f32[64 >> 2]=4.0
+	f32[68 >> 2]=4.25
+	f32[72 >> 2]=4.5
+	f32[76 >> 2]=4.75
+	f32[80 >> 2]=5.0
+	f32[84 >> 2]=5.25
+	f32[88 >> 2]=5.5
+	f32[92 >> 2]=5.75
+	f32[96 >> 2]=6.0
+	f32[100 >> 2]=6.25
+	f32[104 >> 2]=6.5
+	f32[108 >> 2]=6.75
+	f32[112 >> 2]=7.0
+	f32[116 >> 2]=7.25
+	f32[120 >> 2]=7.5
+	f32[124 >> 2]=7.75
+	f32[128 >> 2]=8.0
+	f32[132 >> 2]=8.5
+	f32[136 >> 2]=9.0
+	f32[140 >> 2]=9.5
+	f32[144 >> 2]=10.0
+	f32[148 >> 2]=10.5
+	f32[152 >> 2]=11.0
+	f32[156 >> 2]=11.5
+	f32[160 >> 2]=12.0
+	f32[164 >> 2]=12.5
+	f32[168 >> 2]=13.0
+	f32[172 >> 2]=13.5
+	f32[176 >> 2]=14.0
+	f32[180 >> 2]=14.5
+	f32[184 >> 2]=15.0
+	f32[188 >> 2]=15.5
+	f32[192 >> 2]=16.0
+	f32[196 >> 2]=17.0
+	f32[200 >> 2]=18.0
+	f32[204 >> 2]=19.0
+	f32[208 >> 2]=20.0
+	f32[212 >> 2]=21.0
+	f32[216 >> 2]=22.0
+	f32[220 >> 2]=23.0
+	f32[224 >> 2]=24.0
+	f32[228 >> 2]=25.0
+	f32[232 >> 2]=26.0
+	f32[236 >> 2]=27.0
+	f32[240 >> 2]=28.0
+	f32[244 >> 2]=29.0
+	f32[248 >> 2]=30.0
+	f32[252 >> 2]=31.0
+	f32[256 >> 2]=0.125
+	f32[260 >> 2]=0.1328125
+	f32[264 >> 2]=0.140625
+	f32[268 >> 2]=0.1484375
+	f32[272 >> 2]=0.15625
+	f32[276 >> 2]=0.1640625
+	f32[280 >> 2]=0.171875
+	f32[284 >> 2]=0.1796875
+	f32[288 >> 2]=0.1875
+	f32[292 >> 2]=0.1953125
+	f32[296 >> 2]=0.203125
+	f32[300 >> 2]=0.2109375
+	f32[304 >> 2]=0.21875
+	f32[308 >> 2]=0.2265625
+	f32[312 >> 2]=0.234375
+	f32[316 >> 2]=0.2421875
+	f32[320 >> 2]=0.25
+	f32[324 >> 2]=0.265625
+	f32[328 >> 2]=0.28125
+	f32[332 >> 2]=0.296875
+	f32[336 >> 2]=0.3125
+	f32[340 >> 2]=0.328125
+	f32[344 >> 2]=0.34375
+	f32[348 >> 2]=0.359375
+	f32[352 >> 2]=0.375
+	f32[356 >> 2]=0.390625
+	f32[360 >> 2]=0.40625
+	f32[364 >> 2]=0.421875
+	f32[368 >> 2]=0.4375
+	f32[368 >> 2]=0.4375
+	f32[372 >> 2]=0.453125
+	f32[376 >> 2]=0.46875
+	f32[380 >> 2]=0.484375
+	f32[384 >> 2]=0.5
+	f32[388 >> 2]=0.53125
+	f32[392 >> 2]=0.5625
+	f32[396 >> 2]=0.59375
+	f32[400 >> 2]=0.625
+	f32[404 >> 2]=0.65625
+	f32[408 >> 2]=0.6875
+	f32[412 >> 2]=0.71875
+	f32[416 >> 2]=0.75
+	f32[420 >> 2]=0.78125
+	f32[424 >> 2]=0.8125
+	f32[428 >> 2]=0.84375
+	f32[432 >> 2]=0.875
+	f32[436 >> 2]=0.90625
+	f32[440 >> 2]=0.9375
+	f32[444 >> 2]=0.96875
+	f32[448 >> 2]=1.0
+	f32[452 >> 2]=1.0625
+	f32[456 >> 2]=1.125
+	f32[460 >> 2]=1.1875
+	f32[464 >> 2]=1.25
+	f32[468 >> 2]=1.3125
+	f32[472 >> 2]=1.375
+	f32[476 >> 2]=1.4375
+	f32[480 >> 2]=1.5
+	f32[484 >> 2]=1.5625
+	f32[488 >> 2]=1.625
+	f32[492 >> 2]=1.6875
+	f32[496 >> 2]=1.75
+	f32[500 >> 2]=1.8125
+	f32[504 >> 2]=1.875
+	f32[508 >> 2]=1.9375
+	f32[512 >> 2]=-2.0
+	f32[516 >> 2]=-2.125
+	f32[520 >> 2]=-2.25
+	f32[524 >> 2]=-2.375
+	f32[528 >> 2]=-2.5
+	f32[532 >> 2]=-2.625
+	f32[536 >> 2]=-2.75
+	f32[540 >> 2]=-2.875
+	f32[544 >> 2]=-3.0
+	f32[548 >> 2]=-3.125
+	f32[552 >> 2]=-3.25
+	f32[556 >> 2]=-3.375
+	f32[560 >> 2]=-3.5
+	f32[564 >> 2]=-3.625
+	f32[568 >> 2]=-3.75
+	f32[572 >> 2]=-3.875
+	f32[576 >> 2]=-4.0
+	f32[580 >> 2]=-4.25
+	f32[584 >> 2]=-4.5
+	f32[588 >> 2]=-4.75
+	f32[592 >> 2]=-5.0
+	f32[596 >> 2]=-5.25
+	f32[600 >> 2]=-5.5
+	f32[604 >> 2]=-5.75
+	f32[608 >> 2]=-6.0
+	f32[612 >> 2]=-6.25
+	f32[616 >> 2]=-6.5
+	f32[620 >> 2]=-6.75
+	f32[624 >> 2]=-7.0
+	f32[628 >> 2]=-7.25
+	f32[632 >> 2]=-7.5
+	f32[636 >> 2]=-7.75
+	f32[640 >> 2]=-8.0
+	f32[644 >> 2]=-8.5
+	f32[648 >> 2]=-9.0
+	f32[652 >> 2]=-9.5
+	f32[656 >> 2]=-10.0
+	f32[660 >> 2]=-10.5
+	f32[664 >> 2]=-11.0
+	f32[668 >> 2]=-11.5
+	f32[672 >> 2]=-12.0
+	f32[676 >> 2]=-12.5
+	f32[680 >> 2]=-13.0
+	f32[684 >> 2]=-13.5
+	f32[688 >> 2]=-14.0
+	f32[692 >> 2]=-14.5
+	f32[696 >> 2]=-15.0
+	f32[700 >> 2]=-15.5
+	f32[704 >> 2]=-16.0
+	f32[708 >> 2]=-17.0
+	f32[712 >> 2]=-18.0
+	f32[716 >> 2]=-19.0
+	f32[720 >> 2]=-20.0
+	f32[724 >> 2]=-21.0
+	f32[728 >> 2]=-22.0
+	f32[732 >> 2]=-23.0
+	f32[736 >> 2]=-24.0
+	f32[740 >> 2]=-25.0
+	f32[744 >> 2]=-26.0
+	f32[748 >> 2]=-27.0
+	f32[752 >> 2]=-28.0
+	f32[756 >> 2]=-29.0
+	f32[760 >> 2]=-30.0
+	f32[764 >> 2]=-31.0
+	f32[768 >> 2]=-0.125
+	f32[768 >> 2]=-0.125
+	f32[772 >> 2]=-0.1328125
+	f32[776 >> 2]=-0.140625
+	f32[780 >> 2]=-0.1484375
+	f32[784 >> 2]=-0.15625
+	f32[788 >> 2]=-0.1640625
+	f32[792 >> 2]=-0.171875
+	f32[796 >> 2]=-0.1796875
+	f32[800 >> 2]=-0.1875
+	f32[804 >> 2]=-0.1953125
+	f32[808 >> 2]=-0.203125
+	f32[812 >> 2]=-0.2109375
+	f32[816 >> 2]=-0.21875
+	f32[820 >> 2]=-0.2265625
+	f32[824 >> 2]=-0.234375
+	f32[828 >> 2]=-0.2421875
+	f32[832 >> 2]=-0.25
+	f32[836 >> 2]=-0.265625
+	f32[840 >> 2]=-0.28125
+	f32[844 >> 2]=-0.296875
+	f32[848 >> 2]=-0.3125
+	f32[852 >> 2]=-0.328125
+	f32[856 >> 2]=-0.34375
+	f32[860 >> 2]=-0.359375
+	f32[864 >> 2]=-0.375
+	f32[868 >> 2]=-0.390625
+	f32[872 >> 2]=-0.40625
+	f32[876 >> 2]=-0.421875
+	f32[880 >> 2]=-0.4375
+	f32[884 >> 2]=-0.453125
+	f32[888 >> 2]=-0.46875
+	f32[892 >> 2]=-0.484375
+	f32[896 >> 2]=-0.5
+	f32[900 >> 2]=-0.53125
+	f32[904 >> 2]=-0.5625
+	f32[908 >> 2]=-0.59375
+	f32[912 >> 2]=-0.625
+	f32[916 >> 2]=-0.65625
+	f32[920 >> 2]=-0.6875
+	f32[924 >> 2]=-0.71875
+	f32[928 >> 2]=-0.75
+	f32[932 >> 2]=-0.78125
+	f32[936 >> 2]=-0.8125
+	f32[940 >> 2]=-0.84375
+	f32[944 >> 2]=-0.875
+	f32[948 >> 2]=-0.90625
+	f32[952 >> 2]=-0.9375
+	f32[956 >> 2]=-0.96875
+	f32[960 >> 2]=-1.0
+	f32[964 >> 2]=-1.0625
+	f32[968 >> 2]=-1.125
+	f32[972 >> 2]=-1.1875
+	f32[976 >> 2]=-1.25
+	f32[980 >> 2]=-1.3125
+	f32[984 >> 2]=-1.375
+	f32[988 >> 2]=-1.4375
+	f32[992 >> 2]=-1.5
+	f32[996 >> 2]=-1.5625
+	f32[1000 >> 2]=-1.625
+	f32[1004 >> 2]=-1.6875
+	f32[1008 >> 2]=-1.75
+	f32[1012 >> 2]=-1.8125
+	f32[1016 >> 2]=-1.875
+	f32[1020 >> 2]=-1.9375
+
+	// Some cases that should not be encoded as an immediate on the ARM.
+
+	// All the low zero bits set.
+	f32[1024 >> 2]=2.1249998
+	f32[1028 >> 2]=2.2499998
+	f32[1032 >> 2]=2.3749998
+	f32[1036 >> 2]=2.4999998
+	f32[1040 >> 2]=2.6249998
+	f32[1044 >> 2]=2.7499998
+	f32[1048 >> 2]=2.8749998
+	f32[1052 >> 2]=2.9999998
+	f32[1056 >> 2]=3.1249998
+	f32[1060 >> 2]=3.2499998
+	f32[1064 >> 2]=3.3749998
+	f32[1068 >> 2]=3.4999998
+	f32[1072 >> 2]=3.6249998
+	f32[1076 >> 2]=3.7499998
+	f32[1080 >> 2]=3.8749998
+	f32[1084 >> 2]=3.9999998
+	f32[1088 >> 2]=4.2499995
+	f32[1092 >> 2]=4.4999995
+	f32[1096 >> 2]=4.7499995
+	f32[1100 >> 2]=4.9999995
+	f32[1104 >> 2]=5.2499995
+	f32[1108 >> 2]=5.4999995
+	f32[1112 >> 2]=5.7499995
+	f32[1116 >> 2]=5.9999995
+	f32[1120 >> 2]=6.2499995
+	f32[1124 >> 2]=6.4999995
+	f32[1128 >> 2]=6.7499995
+	f32[1132 >> 2]=6.9999995
+	f32[1136 >> 2]=7.2499995
+	f32[1140 >> 2]=7.4999995
+	f32[1144 >> 2]=7.7499995
+	f32[1148 >> 2]=7.9999995
+	f32[1152 >> 2]=8.499999
+	f32[1156 >> 2]=8.999999
+	f32[1160 >> 2]=9.499999
+	f32[1164 >> 2]=9.999999
+	f32[1168 >> 2]=10.499999
+	f32[1172 >> 2]=10.999999
+	f32[1176 >> 2]=11.499999
+	f32[1180 >> 2]=11.999999
+	f32[1184 >> 2]=12.499999
+	f32[1188 >> 2]=12.999999
+	f32[1192 >> 2]=13.499999
+	f32[1196 >> 2]=13.999999
+	f32[1200 >> 2]=14.499999
+	f32[1204 >> 2]=14.999999
+	f32[1208 >> 2]=15.499999
+	f32[1212 >> 2]=15.999999
+	f32[1216 >> 2]=16.999998
+	f32[1220 >> 2]=17.999998
+	f32[1224 >> 2]=18.999998
+	f32[1228 >> 2]=19.999998
+	f32[1232 >> 2]=20.999998
+	f32[1236 >> 2]=21.999998
+	f32[1240 >> 2]=22.999998
+	f32[1244 >> 2]=23.999998
+	f32[1248 >> 2]=24.999998
+	f32[1252 >> 2]=25.999998
+	f32[1256 >> 2]=26.999998
+	f32[1260 >> 2]=27.999998
+	f32[1264 >> 2]=28.999998
+	f32[1268 >> 2]=29.999998
+	f32[1272 >> 2]=30.999998
+	f32[1276 >> 2]=31.999998
+	f32[1280 >> 2]=0.13281249
+	f32[1284 >> 2]=0.14062499
+	f32[1288 >> 2]=0.14843749
+	f32[1292 >> 2]=0.15624999
+	f32[1296 >> 2]=0.16406249
+	f32[1300 >> 2]=0.17187499
+	f32[1304 >> 2]=0.17968749
+	f32[1308 >> 2]=0.18749999
+	f32[1312 >> 2]=0.19531249
+	f32[1316 >> 2]=0.20312499
+	f32[1320 >> 2]=0.21093749
+	f32[1324 >> 2]=0.21874999
+	f32[1328 >> 2]=0.22656249
+	f32[1332 >> 2]=0.23437499
+	f32[1336 >> 2]=0.24218749
+	f32[1340 >> 2]=0.24999999
+	f32[1344 >> 2]=0.26562497
+	f32[1348 >> 2]=0.28124997
+	f32[1352 >> 2]=0.29687497
+	f32[1356 >> 2]=0.31249997
+	f32[1360 >> 2]=0.32812497
+	f32[1364 >> 2]=0.34374997
+	f32[1368 >> 2]=0.35937497
+	f32[1372 >> 2]=0.37499997
+	f32[1376 >> 2]=0.39062497
+	f32[1380 >> 2]=0.40624997
+	f32[1384 >> 2]=0.42187497
+	f32[1388 >> 2]=0.43749997
+	f32[1392 >> 2]=0.45312497
+	f32[1396 >> 2]=0.46874997
+	f32[1400 >> 2]=0.48437497
+	f32[1404 >> 2]=0.49999997
+	f32[1408 >> 2]=0.53124994
+	f32[1412 >> 2]=0.56249994
+	f32[1416 >> 2]=0.59374994
+	f32[1420 >> 2]=0.62499994
+	f32[1424 >> 2]=0.65624994
+	f32[1428 >> 2]=0.68749994
+	f32[1432 >> 2]=0.71874994
+	f32[1436 >> 2]=0.74999994
+	f32[1440 >> 2]=0.78124994
+	f32[1444 >> 2]=0.81249994
+	f32[1448 >> 2]=0.84374994
+	f32[1452 >> 2]=0.87499994
+	f32[1456 >> 2]=0.90624994
+	f32[1460 >> 2]=0.93749994
+	f32[1464 >> 2]=0.96874994
+	f32[1468 >> 2]=0.99999994
+	f32[1472 >> 2]=1.0624999
+	f32[1476 >> 2]=1.1249999
+	f32[1480 >> 2]=1.1874999
+	f32[1484 >> 2]=1.2499999
+	f32[1488 >> 2]=1.3124999
+	f32[1488 >> 2]=1.3124999
+	f32[1492 >> 2]=1.3749999
+	f32[1496 >> 2]=1.4374999
+	f32[1500 >> 2]=1.4999999
+	f32[1504 >> 2]=1.5624999
+	f32[1508 >> 2]=1.6249999
+	f32[1512 >> 2]=1.6874999
+	f32[1516 >> 2]=1.7499999
+	f32[1520 >> 2]=1.8124999
+	f32[1524 >> 2]=1.8749999
+	f32[1528 >> 2]=1.9374999
+	f32[1532 >> 2]=1.9999999
+	f32[1536 >> 2]=-2.1249998
+	f32[1540 >> 2]=-2.2499998
+	f32[1544 >> 2]=-2.3749998
+	f32[1548 >> 2]=-2.4999998
+	f32[1552 >> 2]=-2.6249998
+	f32[1556 >> 2]=-2.7499998
+	f32[1560 >> 2]=-2.8749998
+	f32[1564 >> 2]=-2.9999998
+	f32[1568 >> 2]=-3.1249998
+	f32[1572 >> 2]=-3.2499998
+	f32[1576 >> 2]=-3.3749998
+	f32[1580 >> 2]=-3.4999998
+	f32[1584 >> 2]=-3.6249998
+	f32[1588 >> 2]=-3.7499998
+	f32[1592 >> 2]=-3.8749998
+	f32[1596 >> 2]=-3.9999998
+	f32[1600 >> 2]=-4.2499995
+	f32[1604 >> 2]=-4.4999995
+	f32[1608 >> 2]=-4.7499995
+	f32[1612 >> 2]=-4.9999995
+	f32[1616 >> 2]=-5.2499995
+	f32[1620 >> 2]=-5.4999995
+	f32[1624 >> 2]=-5.7499995
+	f32[1628 >> 2]=-5.9999995
+	f32[1632 >> 2]=-6.2499995
+	f32[1636 >> 2]=-6.4999995
+	f32[1640 >> 2]=-6.7499995
+	f32[1644 >> 2]=-6.9999995
+	f32[1648 >> 2]=-7.2499995
+	f32[1652 >> 2]=-7.4999995
+	f32[1656 >> 2]=-7.7499995
+	f32[1660 >> 2]=-7.9999995
+	f32[1664 >> 2]=-8.499999
+	f32[1668 >> 2]=-8.999999
+	f32[1672 >> 2]=-9.499999
+	f32[1676 >> 2]=-9.999999
+	f32[1680 >> 2]=-10.499999
+	f32[1684 >> 2]=-10.999999
+	f32[1688 >> 2]=-11.499999
+	f32[1692 >> 2]=-11.999999
+	f32[1696 >> 2]=-12.499999
+	f32[1700 >> 2]=-12.999999
+	f32[1704 >> 2]=-13.499999
+	f32[1708 >> 2]=-13.999999
+	f32[1712 >> 2]=-14.499999
+	f32[1716 >> 2]=-14.999999
+	f32[1720 >> 2]=-15.499999
+	f32[1724 >> 2]=-15.999999
+	f32[1728 >> 2]=-16.999998
+	f32[1732 >> 2]=-17.999998
+	f32[1736 >> 2]=-18.999998
+	f32[1740 >> 2]=-19.999998
+	f32[1744 >> 2]=-20.999998
+	f32[1748 >> 2]=-21.999998
+	f32[1752 >> 2]=-22.999998
+	f32[1756 >> 2]=-23.999998
+	f32[1760 >> 2]=-24.999998
+	f32[1764 >> 2]=-25.999998
+	f32[1768 >> 2]=-26.999998
+	f32[1772 >> 2]=-27.999998
+	f32[1776 >> 2]=-28.999998
+	f32[1780 >> 2]=-29.999998
+	f32[1784 >> 2]=-30.999998
+	f32[1788 >> 2]=-31.999998
+	f32[1792 >> 2]=-0.13281249
+	f32[1796 >> 2]=-0.14062499
+	f32[1800 >> 2]=-0.14843749
+	f32[1804 >> 2]=-0.15624999
+	f32[1808 >> 2]=-0.16406249
+	f32[1812 >> 2]=-0.17187499
+	f32[1816 >> 2]=-0.17968749
+	f32[1820 >> 2]=-0.18749999
+	f32[1824 >> 2]=-0.19531249
+	f32[1828 >> 2]=-0.20312499
+	f32[1832 >> 2]=-0.21093749
+	f32[1836 >> 2]=-0.21874999
+	f32[1840 >> 2]=-0.22656249
+	f32[1844 >> 2]=-0.23437499
+	f32[1848 >> 2]=-0.24218749
+	f32[1852 >> 2]=-0.24999999
+	f32[1856 >> 2]=-0.26562497
+	f32[1860 >> 2]=-0.28124997
+	f32[1864 >> 2]=-0.29687497
+	f32[1868 >> 2]=-0.31249997
+	f32[1872 >> 2]=-0.32812497
+	f32[1876 >> 2]=-0.34374997
+	f32[1880 >> 2]=-0.35937497
+	f32[1884 >> 2]=-0.37499997
+	f32[1888 >> 2]=-0.39062497
+	f32[1888 >> 2]=-0.39062497
+	f32[1892 >> 2]=-0.40624997
+	f32[1896 >> 2]=-0.42187497
+	f32[1900 >> 2]=-0.43749997
+	f32[1904 >> 2]=-0.45312497
+	f32[1908 >> 2]=-0.46874997
+	f32[1912 >> 2]=-0.48437497
+	f32[1916 >> 2]=-0.49999997
+	f32[1920 >> 2]=-0.53124994
+	f32[1924 >> 2]=-0.56249994
+	f32[1928 >> 2]=-0.59374994
+	f32[1932 >> 2]=-0.62499994
+	f32[1936 >> 2]=-0.65624994
+	f32[1940 >> 2]=-0.68749994
+	f32[1944 >> 2]=-0.71874994
+	f32[1948 >> 2]=-0.74999994
+	f32[1952 >> 2]=-0.78124994
+	f32[1956 >> 2]=-0.81249994
+	f32[1960 >> 2]=-0.84374994
+	f32[1964 >> 2]=-0.87499994
+	f32[1968 >> 2]=-0.90624994
+	f32[1972 >> 2]=-0.93749994
+	f32[1976 >> 2]=-0.96874994
+	f32[1980 >> 2]=-0.99999994
+	f32[1984 >> 2]=-1.0624999
+	f32[1988 >> 2]=-1.1249999
+	f32[1992 >> 2]=-1.1874999
+	f32[1996 >> 2]=-1.2499999
+	f32[2000 >> 2]=-1.3124999
+	f32[2004 >> 2]=-1.3749999
+	f32[2008 >> 2]=-1.4374999
+	f32[2012 >> 2]=-1.4999999
+	f32[2016 >> 2]=-1.5624999
+	f32[2020 >> 2]=-1.6249999
+	f32[2024 >> 2]=-1.6874999
+	f32[2028 >> 2]=-1.7499999
+	f32[2032 >> 2]=-1.8124999
+	f32[2036 >> 2]=-1.8749999
+	f32[2040 >> 2]=-1.9374999
+	f32[2044 >> 2]=-1.9999999
+
+	// Just the lowest zero bit set.
+	f32[2048 >> 2]=2.0000002
+	f32[2052 >> 2]=2.1250002
+	f32[2056 >> 2]=2.2500002
+	f32[2060 >> 2]=2.3750002
+	f32[2064 >> 2]=2.5000002
+	f32[2068 >> 2]=2.6250002
+	f32[2072 >> 2]=2.7500002
+	f32[2076 >> 2]=2.8750002
+	f32[2080 >> 2]=3.0000002
+	f32[2084 >> 2]=3.1250002
+	f32[2088 >> 2]=3.2500002
+	f32[2092 >> 2]=3.3750002
+	f32[2096 >> 2]=3.5000002
+	f32[2100 >> 2]=3.6250002
+	f32[2104 >> 2]=3.7500002
+	f32[2108 >> 2]=3.8750002
+	f32[2112 >> 2]=4.0000005
+	f32[2116 >> 2]=4.2500005
+	f32[2120 >> 2]=4.5000005
+	f32[2124 >> 2]=4.7500005
+	f32[2128 >> 2]=5.0000005
+	f32[2132 >> 2]=5.2500005
+	f32[2136 >> 2]=5.5000005
+	f32[2140 >> 2]=5.7500005
+	f32[2140 >> 2]=5.7500005
+	f32[2144 >> 2]=6.0000005
+	f32[2148 >> 2]=6.2500005
+	f32[2152 >> 2]=6.5000005
+	f32[2156 >> 2]=6.7500005
+	f32[2160 >> 2]=7.0000005
+	f32[2164 >> 2]=7.2500005
+	f32[2168 >> 2]=7.5000005
+	f32[2172 >> 2]=7.7500005
+	f32[2176 >> 2]=8.000001
+	f32[2180 >> 2]=8.500001
+	f32[2184 >> 2]=9.000001
+	f32[2188 >> 2]=9.500001
+	f32[2192 >> 2]=10.000001
+	f32[2196 >> 2]=10.500001
+	f32[2200 >> 2]=11.000001
+	f32[2204 >> 2]=11.500001
+	f32[2208 >> 2]=12.000001
+	f32[2212 >> 2]=12.500001
+	f32[2216 >> 2]=13.000001
+	f32[2220 >> 2]=13.500001
+	f32[2224 >> 2]=14.000001
+	f32[2228 >> 2]=14.500001
+	f32[2232 >> 2]=15.000001
+	f32[2236 >> 2]=15.500001
+	f32[2240 >> 2]=16.000002
+	f32[2244 >> 2]=17.000002
+	f32[2248 >> 2]=18.000002
+	f32[2252 >> 2]=19.000002
+	f32[2256 >> 2]=20.000002
+	f32[2260 >> 2]=21.000002
+	f32[2264 >> 2]=22.000002
+	f32[2268 >> 2]=23.000002
+	f32[2272 >> 2]=24.000002
+	f32[2276 >> 2]=25.000002
+	f32[2280 >> 2]=26.000002
+	f32[2284 >> 2]=27.000002
+	f32[2288 >> 2]=28.000002
+	f32[2292 >> 2]=29.000002
+	f32[2296 >> 2]=30.000002
+	f32[2300 >> 2]=31.000002
+	f32[2304 >> 2]=0.12500001
+	f32[2308 >> 2]=0.13281251
+	f32[2312 >> 2]=0.14062501
+	f32[2316 >> 2]=0.14843751
+	f32[2320 >> 2]=0.15625001
+	f32[2324 >> 2]=0.16406251
+	f32[2328 >> 2]=0.17187501
+	f32[2332 >> 2]=0.17968751
+	f32[2336 >> 2]=0.18750001
+	f32[2340 >> 2]=0.19531251
+	f32[2344 >> 2]=0.20312501
+	f32[2348 >> 2]=0.21093751
+	f32[2352 >> 2]=0.21875001
+	f32[2356 >> 2]=0.22656251
+	f32[2360 >> 2]=0.23437501
+	f32[2364 >> 2]=0.24218751
+	f32[2368 >> 2]=0.25000003
+	f32[2372 >> 2]=0.26562503
+	f32[2376 >> 2]=0.28125003
+	f32[2380 >> 2]=0.29687503
+	f32[2384 >> 2]=0.31250003
+	f32[2388 >> 2]=0.32812503
+	f32[2392 >> 2]=0.34375003
+	f32[2396 >> 2]=0.35937503
+	f32[2400 >> 2]=0.37500003
+	f32[2404 >> 2]=0.39062503
+	f32[2408 >> 2]=0.40625003
+	f32[2412 >> 2]=0.42187503
+	f32[2416 >> 2]=0.43750003
+	f32[2420 >> 2]=0.45312503
+	f32[2424 >> 2]=0.46875003
+	f32[2428 >> 2]=0.48437503
+	f32[2432 >> 2]=0.50000006
+	f32[2436 >> 2]=0.53125006
+	f32[2440 >> 2]=0.56250006
+	f32[2444 >> 2]=0.59375006
+	f32[2448 >> 2]=0.62500006
+	f32[2452 >> 2]=0.65625006
+	f32[2456 >> 2]=0.68750006
+	f32[2460 >> 2]=0.71875006
+	f32[2464 >> 2]=0.75000006
+	f32[2468 >> 2]=0.78125006
+	f32[2472 >> 2]=0.81250006
+	f32[2476 >> 2]=0.84375006
+	f32[2480 >> 2]=0.87500006
+	f32[2484 >> 2]=0.90625006
+	f32[2488 >> 2]=0.93750006
+	f32[2492 >> 2]=0.96875006
+	f32[2496 >> 2]=1.0000001
+	f32[2500 >> 2]=1.0625001
+	f32[2504 >> 2]=1.1250001
+	f32[2508 >> 2]=1.1875001
+	f32[2512 >> 2]=1.2500001
+	f32[2516 >> 2]=1.3125001
+	f32[2520 >> 2]=1.3750001
+	f32[2524 >> 2]=1.4375001
+	f32[2528 >> 2]=1.5000001
+	f32[2532 >> 2]=1.5625001
+	f32[2536 >> 2]=1.6250001
+	f32[2540 >> 2]=1.6875001
+	f32[2540 >> 2]=1.6875001
+	f32[2544 >> 2]=1.7500001
+	f32[2548 >> 2]=1.8125001
+	f32[2552 >> 2]=1.8750001
+	f32[2556 >> 2]=1.9375001
+	f32[2560 >> 2]=-2.0000002
+	f32[2564 >> 2]=-2.1250002
+	f32[2568 >> 2]=-2.2500002
+	f32[2572 >> 2]=-2.3750002
+	f32[2576 >> 2]=-2.5000002
+	f32[2580 >> 2]=-2.6250002
+	f32[2584 >> 2]=-2.7500002
+	f32[2588 >> 2]=-2.8750002
+	f32[2592 >> 2]=-3.0000002
+	f32[2596 >> 2]=-3.1250002
+	f32[2600 >> 2]=-3.2500002
+	f32[2604 >> 2]=-3.3750002
+	f32[2608 >> 2]=-3.5000002
+	f32[2612 >> 2]=-3.6250002
+	f32[2616 >> 2]=-3.7500002
+	f32[2620 >> 2]=-3.8750002
+	f32[2624 >> 2]=-4.0000005
+	f32[2628 >> 2]=-4.2500005
+	f32[2632 >> 2]=-4.5000005
+	f32[2636 >> 2]=-4.7500005
+	f32[2640 >> 2]=-5.0000005
+	f32[2644 >> 2]=-5.2500005
+	f32[2648 >> 2]=-5.5000005
+	f32[2652 >> 2]=-5.7500005
+	f32[2656 >> 2]=-6.0000005
+	f32[2660 >> 2]=-6.2500005
+	f32[2664 >> 2]=-6.5000005
+	f32[2668 >> 2]=-6.7500005
+	f32[2672 >> 2]=-7.0000005
+	f32[2676 >> 2]=-7.2500005
+	f32[2680 >> 2]=-7.5000005
+	f32[2684 >> 2]=-7.7500005
+	f32[2688 >> 2]=-8.000001
+	f32[2692 >> 2]=-8.500001
+	f32[2696 >> 2]=-9.000001
+	f32[2700 >> 2]=-9.500001
+	f32[2704 >> 2]=-10.000001
+	f32[2708 >> 2]=-10.500001
+	f32[2712 >> 2]=-11.000001
+	f32[2716 >> 2]=-11.500001
+	f32[2720 >> 2]=-12.000001
+	f32[2724 >> 2]=-12.500001
+	f32[2728 >> 2]=-13.000001
+	f32[2732 >> 2]=-13.500001
+	f32[2736 >> 2]=-14.000001
+	f32[2740 >> 2]=-14.500001
+	f32[2744 >> 2]=-15.000001
+	f32[2748 >> 2]=-15.500001
+	f32[2752 >> 2]=-16.000002
+	f32[2756 >> 2]=-17.000002
+	f32[2760 >> 2]=-18.000002
+	f32[2764 >> 2]=-19.000002
+	f32[2768 >> 2]=-20.000002
+	f32[2772 >> 2]=-21.000002
+	f32[2776 >> 2]=-22.000002
+	f32[2780 >> 2]=-23.000002
+	f32[2784 >> 2]=-24.000002
+	f32[2788 >> 2]=-25.000002
+	f32[2792 >> 2]=-26.000002
+	f32[2796 >> 2]=-27.000002
+	f32[2800 >> 2]=-28.000002
+	f32[2804 >> 2]=-29.000002
+	f32[2808 >> 2]=-30.000002
+	f32[2812 >> 2]=-31.000002
+	f32[2816 >> 2]=-0.12500001
+	f32[2820 >> 2]=-0.13281251
+	f32[2824 >> 2]=-0.14062501
+	f32[2828 >> 2]=-0.14843751
+	f32[2832 >> 2]=-0.15625001
+	f32[2836 >> 2]=-0.16406251
+	f32[2840 >> 2]=-0.17187501
+	f32[2844 >> 2]=-0.17968751
+	f32[2848 >> 2]=-0.18750001
+	f32[2852 >> 2]=-0.19531251
+	f32[2856 >> 2]=-0.20312501
+	f32[2860 >> 2]=-0.21093751
+	f32[2864 >> 2]=-0.21875001
+	f32[2868 >> 2]=-0.22656251
+	f32[2872 >> 2]=-0.23437501
+	f32[2876 >> 2]=-0.24218751
+	f32[2880 >> 2]=-0.25000003
+	f32[2884 >> 2]=-0.26562503
+	f32[2888 >> 2]=-0.28125003
+	f32[2892 >> 2]=-0.29687503
+	f32[2896 >> 2]=-0.31250003
+	f32[2900 >> 2]=-0.32812503
+	f32[2904 >> 2]=-0.34375003
+	f32[2908 >> 2]=-0.35937503
+	f32[2912 >> 2]=-0.37500003
+	f32[2916 >> 2]=-0.39062503
+	f32[2920 >> 2]=-0.40625003
+	f32[2924 >> 2]=-0.42187503
+	f32[2928 >> 2]=-0.43750003
+	f32[2932 >> 2]=-0.45312503
+	f32[2936 >> 2]=-0.46875003
+	f32[2940 >> 2]=-0.48437503
+	f32[2940 >> 2]=-0.48437503
+	f32[2944 >> 2]=-0.50000006
+	f32[2948 >> 2]=-0.53125006
+	f32[2952 >> 2]=-0.56250006
+	f32[2956 >> 2]=-0.59375006
+	f32[2960 >> 2]=-0.62500006
+	f32[2964 >> 2]=-0.65625006
+	f32[2968 >> 2]=-0.68750006
+	f32[2972 >> 2]=-0.71875006
+	f32[2976 >> 2]=-0.75000006
+	f32[2980 >> 2]=-0.78125006
+	f32[2984 >> 2]=-0.81250006
+	f32[2988 >> 2]=-0.84375006
+	f32[2992 >> 2]=-0.87500006
+	f32[2996 >> 2]=-0.90625006
+	f32[3000 >> 2]=-0.93750006
+	f32[3004 >> 2]=-0.96875006
+	f32[3008 >> 2]=-1.0000001
+	f32[3012 >> 2]=-1.0625001
+	f32[3016 >> 2]=-1.1250001
+	f32[3020 >> 2]=-1.1875001
+	f32[3024 >> 2]=-1.2500001
+	f32[3028 >> 2]=-1.3125001
+	f32[3032 >> 2]=-1.3750001
+	f32[3036 >> 2]=-1.4375001
+	f32[3040 >> 2]=-1.5000001
+	f32[3044 >> 2]=-1.5625001
+	f32[3048 >> 2]=-1.6250001
+	f32[3052 >> 2]=-1.6875001
+	f32[3056 >> 2]=-1.7500001
+	f32[3060 >> 2]=-1.8125001
+	f32[3064 >> 2]=-1.8750001
+	f32[3068 >> 2]=-1.9375001
+
+	// Just the highest zero bit set.
+	f32[3073 >> 2]=2.0625
+	f32[3073 >> 2]=2.0625
+	f32[3077 >> 2]=2.1875
+	f32[3081 >> 2]=2.3125
+	f32[3085 >> 2]=2.4375
+	f32[3089 >> 2]=2.5625
+	f32[3093 >> 2]=2.6875
+	f32[3097 >> 2]=2.8125
+	f32[3101 >> 2]=2.9375
+	f32[3105 >> 2]=3.0625
+	f32[3109 >> 2]=3.1875
+	f32[3113 >> 2]=3.3125
+	f32[3117 >> 2]=3.4375
+	f32[3121 >> 2]=3.5625
+	f32[3125 >> 2]=3.6875
+	f32[3129 >> 2]=3.8125
+	f32[3133 >> 2]=3.9375
+	f32[3137 >> 2]=4.125
+	f32[3141 >> 2]=4.375
+	f32[3145 >> 2]=4.625
+	f32[3149 >> 2]=4.875
+	f32[3153 >> 2]=5.125
+	f32[3157 >> 2]=5.375
+	f32[3161 >> 2]=5.625
+	f32[3165 >> 2]=5.875
+	f32[3169 >> 2]=6.125
+	f32[3173 >> 2]=6.375
+	f32[3177 >> 2]=6.625
+	f32[3181 >> 2]=6.875
+	f32[3185 >> 2]=7.125
+	f32[3189 >> 2]=7.375
+	f32[3193 >> 2]=7.625
+	f32[3197 >> 2]=7.875
+	f32[3201 >> 2]=8.25
+	f32[3205 >> 2]=8.75
+	f32[3209 >> 2]=9.25
+	f32[3213 >> 2]=9.75
+	f32[3217 >> 2]=10.25
+	f32[3221 >> 2]=10.75
+	f32[3225 >> 2]=11.25
+	f32[3229 >> 2]=11.75
+	f32[3233 >> 2]=12.25
+	f32[3237 >> 2]=12.75
+	f32[3241 >> 2]=13.25
+	f32[3245 >> 2]=13.75
+	f32[3249 >> 2]=14.25
+	f32[3253 >> 2]=14.75
+	f32[3257 >> 2]=15.25
+	f32[3261 >> 2]=15.75
+	f32[3265 >> 2]=16.5
+	f32[3269 >> 2]=17.5
+	f32[3273 >> 2]=18.5
+	f32[3277 >> 2]=19.5
+	f32[3281 >> 2]=20.5
+	f32[3285 >> 2]=21.5
+	f32[3289 >> 2]=22.5
+	f32[3293 >> 2]=23.5
+	f32[3297 >> 2]=24.5
+	f32[3301 >> 2]=25.5
+	f32[3305 >> 2]=26.5
+	f32[3309 >> 2]=27.5
+	f32[3313 >> 2]=28.5
+	f32[3317 >> 2]=29.5
+	f32[3321 >> 2]=30.5
+	f32[3325 >> 2]=31.5
+	f32[3329 >> 2]=0.12890625
+	f32[3333 >> 2]=0.13671875
+	f32[3337 >> 2]=0.14453125
+	f32[3341 >> 2]=0.15234375
+	f32[3345 >> 2]=0.16015625
+	f32[3349 >> 2]=0.16796875
+	f32[3353 >> 2]=0.17578125
+	f32[3357 >> 2]=0.18359375
+	f32[3361 >> 2]=0.19140625
+	f32[3365 >> 2]=0.19921875
+	f32[3369 >> 2]=0.20703125
+	f32[3373 >> 2]=0.21484375
+	f32[3377 >> 2]=0.22265625
+	f32[3381 >> 2]=0.23046875
+	f32[3385 >> 2]=0.23828125
+	f32[3389 >> 2]=0.24609375
+	f32[3393 >> 2]=0.2578125
+	f32[3397 >> 2]=0.2734375
+	f32[3401 >> 2]=0.2890625
+	f32[3405 >> 2]=0.3046875
+	f32[3409 >> 2]=0.3203125
+	f32[3413 >> 2]=0.3359375
+	f32[3417 >> 2]=0.3515625
+	f32[3421 >> 2]=0.3671875
+	f32[3425 >> 2]=0.3828125
+	f32[3429 >> 2]=0.3984375
+	f32[3433 >> 2]=0.4140625
+	f32[3437 >> 2]=0.4296875
+	f32[3441 >> 2]=0.4453125
+	f32[3445 >> 2]=0.4609375
+	f32[3449 >> 2]=0.4765625
+	f32[3453 >> 2]=0.4921875
+	f32[3457 >> 2]=0.515625
+	f32[3461 >> 2]=0.546875
+	f32[3465 >> 2]=0.578125
+	f32[3469 >> 2]=0.609375
+	f32[3473 >> 2]=0.640625
+	f32[3473 >> 2]=0.640625
+	f32[3477 >> 2]=0.671875
+	f32[3481 >> 2]=0.703125
+	f32[3485 >> 2]=0.734375
+	f32[3489 >> 2]=0.765625
+	f32[3493 >> 2]=0.796875
+	f32[3497 >> 2]=0.828125
+	f32[3501 >> 2]=0.859375
+	f32[3505 >> 2]=0.890625
+	f32[3509 >> 2]=0.921875
+	f32[3513 >> 2]=0.953125
+	f32[3517 >> 2]=0.984375
+	f32[3521 >> 2]=1.03125
+	f32[3525 >> 2]=1.09375
+	f32[3529 >> 2]=1.15625
+	f32[3533 >> 2]=1.21875
+	f32[3537 >> 2]=1.28125
+	f32[3541 >> 2]=1.34375
+	f32[3545 >> 2]=1.40625
+	f32[3549 >> 2]=1.46875
+	f32[3553 >> 2]=1.53125
+	f32[3557 >> 2]=1.59375
+	f32[3561 >> 2]=1.65625
+	f32[3565 >> 2]=1.71875
+	f32[3569 >> 2]=1.78125
+	f32[3573 >> 2]=1.84375
+	f32[3577 >> 2]=1.90625
+	f32[3581 >> 2]=1.96875
+	f32[3585 >> 2]=-2.0625
+	f32[3589 >> 2]=-2.1875
+	f32[3593 >> 2]=-2.3125
+	f32[3597 >> 2]=-2.4375
+	f32[3601 >> 2]=-2.5625
+	f32[3605 >> 2]=-2.6875
+	f32[3609 >> 2]=-2.8125
+	f32[3613 >> 2]=-2.9375
+	f32[3617 >> 2]=-3.0625
+	f32[3621 >> 2]=-3.1875
+	f32[3625 >> 2]=-3.3125
+	f32[3629 >> 2]=-3.4375
+	f32[3633 >> 2]=-3.5625
+	f32[3637 >> 2]=-3.6875
+	f32[3641 >> 2]=-3.8125
+	f32[3645 >> 2]=-3.9375
+	f32[3649 >> 2]=-4.125
+	f32[3653 >> 2]=-4.375
+	f32[3657 >> 2]=-4.625
+	f32[3661 >> 2]=-4.875
+	f32[3665 >> 2]=-5.125
+	f32[3669 >> 2]=-5.375
+	f32[3673 >> 2]=-5.625
+	f32[3677 >> 2]=-5.875
+	f32[3681 >> 2]=-6.125
+	f32[3685 >> 2]=-6.375
+	f32[3689 >> 2]=-6.625
+	f32[3693 >> 2]=-6.875
+	f32[3697 >> 2]=-7.125
+	f32[3701 >> 2]=-7.375
+	f32[3705 >> 2]=-7.625
+	f32[3709 >> 2]=-7.875
+	f32[3713 >> 2]=-8.25
+	f32[3717 >> 2]=-8.75
+	f32[3721 >> 2]=-9.25
+	f32[3725 >> 2]=-9.75
+	f32[3729 >> 2]=-10.25
+	f32[3733 >> 2]=-10.75
+	f32[3737 >> 2]=-11.25
+	f32[3741 >> 2]=-11.75
+	f32[3745 >> 2]=-12.25
+	f32[3749 >> 2]=-12.75
+	f32[3753 >> 2]=-13.25
+	f32[3757 >> 2]=-13.75
+	f32[3761 >> 2]=-14.25
+	f32[3765 >> 2]=-14.75
+	f32[3769 >> 2]=-15.25
+	f32[3773 >> 2]=-15.75
+	f32[3777 >> 2]=-16.5
+	f32[3781 >> 2]=-17.5
+	f32[3785 >> 2]=-18.5
+	f32[3789 >> 2]=-19.5
+	f32[3793 >> 2]=-20.5
+	f32[3797 >> 2]=-21.5
+	f32[3801 >> 2]=-22.5
+	f32[3805 >> 2]=-23.5
+	f32[3809 >> 2]=-24.5
+	f32[3813 >> 2]=-25.5
+	f32[3817 >> 2]=-26.5
+	f32[3821 >> 2]=-27.5
+	f32[3825 >> 2]=-28.5
+	f32[3829 >> 2]=-29.5
+	f32[3833 >> 2]=-30.5
+	f32[3837 >> 2]=-31.5
+	f32[3841 >> 2]=-0.12890625
+	f32[3845 >> 2]=-0.13671875
+	f32[3849 >> 2]=-0.14453125
+	f32[3853 >> 2]=-0.15234375
+	f32[3857 >> 2]=-0.16015625
+	f32[3861 >> 2]=-0.16796875
+	f32[3865 >> 2]=-0.17578125
+	f32[3869 >> 2]=-0.18359375
+	f32[3873 >> 2]=-0.19140625
+	f32[3873 >> 2]=-0.19140625
+	f32[3877 >> 2]=-0.19921875
+	f32[3881 >> 2]=-0.20703125
+	f32[3885 >> 2]=-0.21484375
+	f32[3889 >> 2]=-0.22265625
+	f32[3893 >> 2]=-0.23046875
+	f32[3897 >> 2]=-0.23828125
+	f32[3901 >> 2]=-0.24609375
+	f32[3905 >> 2]=-0.2578125
+	f32[3909 >> 2]=-0.2734375
+	f32[3913 >> 2]=-0.2890625
+	f32[3917 >> 2]=-0.3046875
+	f32[3921 >> 2]=-0.3203125
+	f32[3925 >> 2]=-0.3359375
+	f32[3929 >> 2]=-0.3515625
+	f32[3933 >> 2]=-0.3671875
+	f32[3937 >> 2]=-0.3828125
+	f32[3941 >> 2]=-0.3984375
+	f32[3945 >> 2]=-0.4140625
+	f32[3949 >> 2]=-0.4296875
+	f32[3953 >> 2]=-0.4453125
+	f32[3957 >> 2]=-0.4609375
+	f32[3961 >> 2]=-0.4765625
+	f32[3965 >> 2]=-0.4921875
+	f32[3969 >> 2]=-0.515625
+	f32[3973 >> 2]=-0.546875
+	f32[3977 >> 2]=-0.578125
+	f32[3981 >> 2]=-0.609375
+	f32[3985 >> 2]=-0.640625
+	f32[3989 >> 2]=-0.671875
+	f32[3993 >> 2]=-0.703125
+	f32[3997 >> 2]=-0.734375
+	f32[4001 >> 2]=-0.765625
+	f32[4005 >> 2]=-0.796875
+	f32[4009 >> 2]=-0.828125
+	f32[4013 >> 2]=-0.859375
+	f32[4017 >> 2]=-0.890625
+	f32[4021 >> 2]=-0.921875
+	f32[4025 >> 2]=-0.953125
+	f32[4029 >> 2]=-0.984375
+	f32[4033 >> 2]=-1.03125
+	f32[4037 >> 2]=-1.09375
+	f32[4041 >> 2]=-1.15625
+	f32[4045 >> 2]=-1.21875
+	f32[4049 >> 2]=-1.28125
+	f32[4053 >> 2]=-1.34375
+	f32[4057 >> 2]=-1.40625
+	f32[4061 >> 2]=-1.46875
+	f32[4065 >> 2]=-1.53125
+	f32[4069 >> 2]=-1.59375
+	f32[4073 >> 2]=-1.65625
+	f32[4077 >> 2]=-1.71875
+	f32[4081 >> 2]=-1.78125
+	f32[4085 >> 2]=-1.84375
+	f32[4089 >> 2]=-1.90625
+	f32[4093 >> 2]=-1.96875
+    };
+
+    return {
+	fn1: fn1
+    };
+};
+
+var asm = testmod(this, {}, buffer);
+
+asm.fn1()
+
+var f32=new Float32Array(buffer);
+assertEq(f32[0 >> 2], 2.0)
+assertEq(f32[4 >> 2], 2.125)
+assertEq(f32[8 >> 2], 2.25)
+assertEq(f32[12 >> 2], 2.375)
+assertEq(f32[16 >> 2], 2.5)
+assertEq(f32[20 >> 2], 2.625)
+assertEq(f32[24 >> 2], 2.75)
+assertEq(f32[28 >> 2], 2.875)
+assertEq(f32[32 >> 2], 3.0)
+assertEq(f32[36 >> 2], 3.125)
+assertEq(f32[40 >> 2], 3.25)
+assertEq(f32[44 >> 2], 3.375)
+assertEq(f32[48 >> 2], 3.5)
+assertEq(f32[52 >> 2], 3.625)
+assertEq(f32[56 >> 2], 3.75)
+assertEq(f32[60 >> 2], 3.875)
+assertEq(f32[64 >> 2], 4.0)
+assertEq(f32[68 >> 2], 4.25)
+assertEq(f32[72 >> 2], 4.5)
+assertEq(f32[76 >> 2], 4.75)
+assertEq(f32[80 >> 2], 5.0)
+assertEq(f32[84 >> 2], 5.25)
+assertEq(f32[88 >> 2], 5.5)
+assertEq(f32[92 >> 2], 5.75)
+assertEq(f32[96 >> 2], 6.0)
+assertEq(f32[100 >> 2], 6.25)
+assertEq(f32[104 >> 2], 6.5)
+assertEq(f32[108 >> 2], 6.75)
+assertEq(f32[112 >> 2], 7.0)
+assertEq(f32[116 >> 2], 7.25)
+assertEq(f32[120 >> 2], 7.5)
+assertEq(f32[124 >> 2], 7.75)
+assertEq(f32[128 >> 2], 8.0)
+assertEq(f32[132 >> 2], 8.5)
+assertEq(f32[136 >> 2], 9.0)
+assertEq(f32[140 >> 2], 9.5)
+assertEq(f32[144 >> 2], 10.0)
+assertEq(f32[148 >> 2], 10.5)
+assertEq(f32[152 >> 2], 11.0)
+assertEq(f32[156 >> 2], 11.5)
+assertEq(f32[160 >> 2], 12.0)
+assertEq(f32[164 >> 2], 12.5)
+assertEq(f32[168 >> 2], 13.0)
+assertEq(f32[172 >> 2], 13.5)
+assertEq(f32[176 >> 2], 14.0)
+assertEq(f32[180 >> 2], 14.5)
+assertEq(f32[184 >> 2], 15.0)
+assertEq(f32[188 >> 2], 15.5)
+assertEq(f32[192 >> 2], 16.0)
+assertEq(f32[196 >> 2], 17.0)
+assertEq(f32[200 >> 2], 18.0)
+assertEq(f32[204 >> 2], 19.0)
+assertEq(f32[208 >> 2], 20.0)
+assertEq(f32[212 >> 2], 21.0)
+assertEq(f32[216 >> 2], 22.0)
+assertEq(f32[220 >> 2], 23.0)
+assertEq(f32[224 >> 2], 24.0)
+assertEq(f32[228 >> 2], 25.0)
+assertEq(f32[232 >> 2], 26.0)
+assertEq(f32[236 >> 2], 27.0)
+assertEq(f32[240 >> 2], 28.0)
+assertEq(f32[244 >> 2], 29.0)
+assertEq(f32[248 >> 2], 30.0)
+assertEq(f32[252 >> 2], 31.0)
+assertEq(f32[256 >> 2], 0.125)
+assertEq(f32[260 >> 2], 0.1328125)
+assertEq(f32[264 >> 2], 0.140625)
+assertEq(f32[268 >> 2], 0.1484375)
+assertEq(f32[272 >> 2], 0.15625)
+assertEq(f32[276 >> 2], 0.1640625)
+assertEq(f32[280 >> 2], 0.171875)
+assertEq(f32[284 >> 2], 0.1796875)
+assertEq(f32[288 >> 2], 0.1875)
+assertEq(f32[292 >> 2], 0.1953125)
+assertEq(f32[296 >> 2], 0.203125)
+assertEq(f32[300 >> 2], 0.2109375)
+assertEq(f32[304 >> 2], 0.21875)
+assertEq(f32[308 >> 2], 0.2265625)
+assertEq(f32[312 >> 2], 0.234375)
+assertEq(f32[316 >> 2], 0.2421875)
+assertEq(f32[320 >> 2], 0.25)
+assertEq(f32[324 >> 2], 0.265625)
+assertEq(f32[328 >> 2], 0.28125)
+assertEq(f32[332 >> 2], 0.296875)
+assertEq(f32[336 >> 2], 0.3125)
+assertEq(f32[340 >> 2], 0.328125)
+assertEq(f32[344 >> 2], 0.34375)
+assertEq(f32[348 >> 2], 0.359375)
+assertEq(f32[348 >> 2], 0.359375)
+assertEq(f32[352 >> 2], 0.375)
+assertEq(f32[356 >> 2], 0.390625)
+assertEq(f32[360 >> 2], 0.40625)
+assertEq(f32[364 >> 2], 0.421875)
+assertEq(f32[368 >> 2], 0.4375)
+assertEq(f32[372 >> 2], 0.453125)
+assertEq(f32[376 >> 2], 0.46875)
+assertEq(f32[380 >> 2], 0.484375)
+assertEq(f32[384 >> 2], 0.5)
+assertEq(f32[388 >> 2], 0.53125)
+assertEq(f32[392 >> 2], 0.5625)
+assertEq(f32[396 >> 2], 0.59375)
+assertEq(f32[400 >> 2], 0.625)
+assertEq(f32[404 >> 2], 0.65625)
+assertEq(f32[408 >> 2], 0.6875)
+assertEq(f32[412 >> 2], 0.71875)
+assertEq(f32[416 >> 2], 0.75)
+assertEq(f32[420 >> 2], 0.78125)
+assertEq(f32[424 >> 2], 0.8125)
+assertEq(f32[428 >> 2], 0.84375)
+assertEq(f32[432 >> 2], 0.875)
+assertEq(f32[436 >> 2], 0.90625)
+assertEq(f32[440 >> 2], 0.9375)
+assertEq(f32[444 >> 2], 0.96875)
+assertEq(f32[448 >> 2], 1.0)
+assertEq(f32[452 >> 2], 1.0625)
+assertEq(f32[456 >> 2], 1.125)
+assertEq(f32[460 >> 2], 1.1875)
+assertEq(f32[464 >> 2], 1.25)
+assertEq(f32[468 >> 2], 1.3125)
+assertEq(f32[472 >> 2], 1.375)
+assertEq(f32[476 >> 2], 1.4375)
+assertEq(f32[480 >> 2], 1.5)
+assertEq(f32[484 >> 2], 1.5625)
+assertEq(f32[488 >> 2], 1.625)
+assertEq(f32[492 >> 2], 1.6875)
+assertEq(f32[496 >> 2], 1.75)
+assertEq(f32[500 >> 2], 1.8125)
+assertEq(f32[504 >> 2], 1.875)
+assertEq(f32[508 >> 2], 1.9375)
+assertEq(f32[512 >> 2], -2.0)
+assertEq(f32[516 >> 2], -2.125)
+assertEq(f32[520 >> 2], -2.25)
+assertEq(f32[524 >> 2], -2.375)
+assertEq(f32[528 >> 2], -2.5)
+assertEq(f32[532 >> 2], -2.625)
+assertEq(f32[536 >> 2], -2.75)
+assertEq(f32[540 >> 2], -2.875)
+assertEq(f32[544 >> 2], -3.0)
+assertEq(f32[548 >> 2], -3.125)
+assertEq(f32[552 >> 2], -3.25)
+assertEq(f32[556 >> 2], -3.375)
+assertEq(f32[560 >> 2], -3.5)
+assertEq(f32[564 >> 2], -3.625)
+assertEq(f32[568 >> 2], -3.75)
+assertEq(f32[572 >> 2], -3.875)
+assertEq(f32[576 >> 2], -4.0)
+assertEq(f32[580 >> 2], -4.25)
+assertEq(f32[584 >> 2], -4.5)
+assertEq(f32[588 >> 2], -4.75)
+assertEq(f32[592 >> 2], -5.0)
+assertEq(f32[596 >> 2], -5.25)
+assertEq(f32[600 >> 2], -5.5)
+assertEq(f32[604 >> 2], -5.75)
+assertEq(f32[608 >> 2], -6.0)
+assertEq(f32[612 >> 2], -6.25)
+assertEq(f32[616 >> 2], -6.5)
+assertEq(f32[620 >> 2], -6.75)
+assertEq(f32[624 >> 2], -7.0)
+assertEq(f32[628 >> 2], -7.25)
+assertEq(f32[632 >> 2], -7.5)
+assertEq(f32[636 >> 2], -7.75)
+assertEq(f32[640 >> 2], -8.0)
+assertEq(f32[644 >> 2], -8.5)
+assertEq(f32[648 >> 2], -9.0)
+assertEq(f32[652 >> 2], -9.5)
+assertEq(f32[656 >> 2], -10.0)
+assertEq(f32[660 >> 2], -10.5)
+assertEq(f32[664 >> 2], -11.0)
+assertEq(f32[668 >> 2], -11.5)
+assertEq(f32[672 >> 2], -12.0)
+assertEq(f32[676 >> 2], -12.5)
+assertEq(f32[680 >> 2], -13.0)
+assertEq(f32[684 >> 2], -13.5)
+assertEq(f32[688 >> 2], -14.0)
+assertEq(f32[692 >> 2], -14.5)
+assertEq(f32[696 >> 2], -15.0)
+assertEq(f32[700 >> 2], -15.5)
+assertEq(f32[704 >> 2], -16.0)
+assertEq(f32[708 >> 2], -17.0)
+assertEq(f32[712 >> 2], -18.0)
+assertEq(f32[716 >> 2], -19.0)
+assertEq(f32[720 >> 2], -20.0)
+assertEq(f32[724 >> 2], -21.0)
+assertEq(f32[728 >> 2], -22.0)
+assertEq(f32[732 >> 2], -23.0)
+assertEq(f32[736 >> 2], -24.0)
+assertEq(f32[740 >> 2], -25.0)
+assertEq(f32[744 >> 2], -26.0)
+assertEq(f32[748 >> 2], -27.0)
+assertEq(f32[748 >> 2], -27.0)
+assertEq(f32[752 >> 2], -28.0)
+assertEq(f32[756 >> 2], -29.0)
+assertEq(f32[760 >> 2], -30.0)
+assertEq(f32[764 >> 2], -31.0)
+assertEq(f32[768 >> 2], -0.125)
+assertEq(f32[772 >> 2], -0.1328125)
+assertEq(f32[776 >> 2], -0.140625)
+assertEq(f32[780 >> 2], -0.1484375)
+assertEq(f32[784 >> 2], -0.15625)
+assertEq(f32[788 >> 2], -0.1640625)
+assertEq(f32[792 >> 2], -0.171875)
+assertEq(f32[796 >> 2], -0.1796875)
+assertEq(f32[800 >> 2], -0.1875)
+assertEq(f32[804 >> 2], -0.1953125)
+assertEq(f32[808 >> 2], -0.203125)
+assertEq(f32[812 >> 2], -0.2109375)
+assertEq(f32[816 >> 2], -0.21875)
+assertEq(f32[820 >> 2], -0.2265625)
+assertEq(f32[824 >> 2], -0.234375)
+assertEq(f32[828 >> 2], -0.2421875)
+assertEq(f32[832 >> 2], -0.25)
+assertEq(f32[836 >> 2], -0.265625)
+assertEq(f32[840 >> 2], -0.28125)
+assertEq(f32[844 >> 2], -0.296875)
+assertEq(f32[848 >> 2], -0.3125)
+assertEq(f32[852 >> 2], -0.328125)
+assertEq(f32[856 >> 2], -0.34375)
+assertEq(f32[860 >> 2], -0.359375)
+assertEq(f32[864 >> 2], -0.375)
+assertEq(f32[868 >> 2], -0.390625)
+assertEq(f32[872 >> 2], -0.40625)
+assertEq(f32[876 >> 2], -0.421875)
+assertEq(f32[880 >> 2], -0.4375)
+assertEq(f32[884 >> 2], -0.453125)
+assertEq(f32[888 >> 2], -0.46875)
+assertEq(f32[892 >> 2], -0.484375)
+assertEq(f32[896 >> 2], -0.5)
+assertEq(f32[900 >> 2], -0.53125)
+assertEq(f32[904 >> 2], -0.5625)
+assertEq(f32[908 >> 2], -0.59375)
+assertEq(f32[912 >> 2], -0.625)
+assertEq(f32[916 >> 2], -0.65625)
+assertEq(f32[920 >> 2], -0.6875)
+assertEq(f32[924 >> 2], -0.71875)
+assertEq(f32[928 >> 2], -0.75)
+assertEq(f32[932 >> 2], -0.78125)
+assertEq(f32[936 >> 2], -0.8125)
+assertEq(f32[940 >> 2], -0.84375)
+assertEq(f32[944 >> 2], -0.875)
+assertEq(f32[948 >> 2], -0.90625)
+assertEq(f32[952 >> 2], -0.9375)
+assertEq(f32[956 >> 2], -0.96875)
+assertEq(f32[960 >> 2], -1.0)
+assertEq(f32[964 >> 2], -1.0625)
+assertEq(f32[968 >> 2], -1.125)
+assertEq(f32[972 >> 2], -1.1875)
+assertEq(f32[976 >> 2], -1.25)
+assertEq(f32[980 >> 2], -1.3125)
+assertEq(f32[984 >> 2], -1.375)
+assertEq(f32[988 >> 2], -1.4375)
+assertEq(f32[992 >> 2], -1.5)
+assertEq(f32[996 >> 2], -1.5625)
+assertEq(f32[1000 >> 2], -1.625)
+assertEq(f32[1004 >> 2], -1.6875)
+assertEq(f32[1008 >> 2], -1.75)
+assertEq(f32[1012 >> 2], -1.8125)
+assertEq(f32[1016 >> 2], -1.875)
+assertEq(f32[1020 >> 2], -1.9375)
+
+assertEq(f32[1024 >> 2], 2.124999761581421)
+assertEq(f32[1028 >> 2], 2.249999761581421)
+assertEq(f32[1032 >> 2], 2.374999761581421)
+assertEq(f32[1036 >> 2], 2.499999761581421)
+assertEq(f32[1040 >> 2], 2.624999761581421)
+assertEq(f32[1044 >> 2], 2.749999761581421)
+assertEq(f32[1048 >> 2], 2.874999761581421)
+assertEq(f32[1052 >> 2], 2.999999761581421)
+assertEq(f32[1056 >> 2], 3.124999761581421)
+assertEq(f32[1060 >> 2], 3.249999761581421)
+assertEq(f32[1064 >> 2], 3.374999761581421)
+assertEq(f32[1068 >> 2], 3.499999761581421)
+assertEq(f32[1072 >> 2], 3.624999761581421)
+assertEq(f32[1076 >> 2], 3.749999761581421)
+assertEq(f32[1080 >> 2], 3.874999761581421)
+assertEq(f32[1084 >> 2], 3.999999761581421)
+assertEq(f32[1088 >> 2], 4.249999523162842)
+assertEq(f32[1092 >> 2], 4.499999523162842)
+assertEq(f32[1096 >> 2], 4.749999523162842)
+assertEq(f32[1100 >> 2], 4.999999523162842)
+assertEq(f32[1104 >> 2], 5.249999523162842)
+assertEq(f32[1108 >> 2], 5.499999523162842)
+assertEq(f32[1112 >> 2], 5.749999523162842)
+assertEq(f32[1116 >> 2], 5.999999523162842)
+assertEq(f32[1120 >> 2], 6.249999523162842)
+assertEq(f32[1124 >> 2], 6.499999523162842)
+assertEq(f32[1128 >> 2], 6.749999523162842)
+assertEq(f32[1132 >> 2], 6.999999523162842)
+assertEq(f32[1136 >> 2], 7.249999523162842)
+assertEq(f32[1140 >> 2], 7.499999523162842)
+assertEq(f32[1144 >> 2], 7.749999523162842)
+assertEq(f32[1148 >> 2], 7.999999523162842)
+assertEq(f32[1152 >> 2], 8.499999046325684)
+assertEq(f32[1156 >> 2], 8.999999046325684)
+assertEq(f32[1160 >> 2], 9.499999046325684)
+assertEq(f32[1164 >> 2], 9.999999046325684)
+assertEq(f32[1168 >> 2], 10.499999046325684)
+assertEq(f32[1172 >> 2], 10.999999046325684)
+assertEq(f32[1176 >> 2], 11.499999046325684)
+assertEq(f32[1180 >> 2], 11.999999046325684)
+assertEq(f32[1184 >> 2], 12.499999046325684)
+assertEq(f32[1184 >> 2], 12.499999046325684)
+assertEq(f32[1188 >> 2], 12.999999046325684)
+assertEq(f32[1192 >> 2], 13.499999046325684)
+assertEq(f32[1196 >> 2], 13.999999046325684)
+assertEq(f32[1200 >> 2], 14.499999046325684)
+assertEq(f32[1204 >> 2], 14.999999046325684)
+assertEq(f32[1208 >> 2], 15.499999046325684)
+assertEq(f32[1212 >> 2], 15.999999046325684)
+assertEq(f32[1216 >> 2], 16.999998092651367)
+assertEq(f32[1220 >> 2], 17.999998092651367)
+assertEq(f32[1224 >> 2], 18.999998092651367)
+assertEq(f32[1228 >> 2], 19.999998092651367)
+assertEq(f32[1232 >> 2], 20.999998092651367)
+assertEq(f32[1236 >> 2], 21.999998092651367)
+assertEq(f32[1240 >> 2], 22.999998092651367)
+assertEq(f32[1244 >> 2], 23.999998092651367)
+assertEq(f32[1248 >> 2], 24.999998092651367)
+assertEq(f32[1252 >> 2], 25.999998092651367)
+assertEq(f32[1256 >> 2], 26.999998092651367)
+assertEq(f32[1260 >> 2], 27.999998092651367)
+assertEq(f32[1264 >> 2], 28.999998092651367)
+assertEq(f32[1268 >> 2], 29.999998092651367)
+assertEq(f32[1272 >> 2], 30.999998092651367)
+assertEq(f32[1276 >> 2], 31.999998092651367)
+assertEq(f32[1280 >> 2], 0.1328124850988388)
+assertEq(f32[1284 >> 2], 0.1406249850988388)
+assertEq(f32[1288 >> 2], 0.1484374850988388)
+assertEq(f32[1292 >> 2], 0.1562499850988388)
+assertEq(f32[1296 >> 2], 0.1640624850988388)
+assertEq(f32[1300 >> 2], 0.1718749850988388)
+assertEq(f32[1304 >> 2], 0.1796874850988388)
+assertEq(f32[1308 >> 2], 0.1874999850988388)
+assertEq(f32[1312 >> 2], 0.1953124850988388)
+assertEq(f32[1316 >> 2], 0.2031249850988388)
+assertEq(f32[1320 >> 2], 0.2109374850988388)
+assertEq(f32[1324 >> 2], 0.2187499850988388)
+assertEq(f32[1328 >> 2], 0.2265624850988388)
+assertEq(f32[1332 >> 2], 0.2343749850988388)
+assertEq(f32[1336 >> 2], 0.2421874850988388)
+assertEq(f32[1340 >> 2], 0.2499999850988388)
+assertEq(f32[1344 >> 2], 0.2656249701976776)
+assertEq(f32[1348 >> 2], 0.2812499701976776)
+assertEq(f32[1352 >> 2], 0.2968749701976776)
+assertEq(f32[1356 >> 2], 0.3124999701976776)
+assertEq(f32[1360 >> 2], 0.3281249701976776)
+assertEq(f32[1364 >> 2], 0.3437499701976776)
+assertEq(f32[1368 >> 2], 0.3593749701976776)
+assertEq(f32[1372 >> 2], 0.3749999701976776)
+assertEq(f32[1376 >> 2], 0.3906249701976776)
+assertEq(f32[1380 >> 2], 0.4062499701976776)
+assertEq(f32[1384 >> 2], 0.4218749701976776)
+assertEq(f32[1388 >> 2], 0.4374999701976776)
+assertEq(f32[1392 >> 2], 0.4531249701976776)
+assertEq(f32[1396 >> 2], 0.4687499701976776)
+assertEq(f32[1400 >> 2], 0.4843749701976776)
+assertEq(f32[1404 >> 2], 0.4999999701976776)
+assertEq(f32[1408 >> 2], 0.5312499403953552)
+assertEq(f32[1412 >> 2], 0.5624999403953552)
+assertEq(f32[1416 >> 2], 0.5937499403953552)
+assertEq(f32[1420 >> 2], 0.6249999403953552)
+assertEq(f32[1424 >> 2], 0.6562499403953552)
+assertEq(f32[1428 >> 2], 0.6874999403953552)
+assertEq(f32[1432 >> 2], 0.7187499403953552)
+assertEq(f32[1436 >> 2], 0.7499999403953552)
+assertEq(f32[1440 >> 2], 0.7812499403953552)
+assertEq(f32[1444 >> 2], 0.8124999403953552)
+assertEq(f32[1448 >> 2], 0.8437499403953552)
+assertEq(f32[1452 >> 2], 0.8749999403953552)
+assertEq(f32[1456 >> 2], 0.9062499403953552)
+assertEq(f32[1460 >> 2], 0.9374999403953552)
+assertEq(f32[1464 >> 2], 0.9687499403953552)
+assertEq(f32[1468 >> 2], 0.9999999403953552)
+assertEq(f32[1472 >> 2], 1.0624998807907104)
+assertEq(f32[1476 >> 2], 1.1249998807907104)
+assertEq(f32[1480 >> 2], 1.1874998807907104)
+assertEq(f32[1484 >> 2], 1.2499998807907104)
+assertEq(f32[1488 >> 2], 1.3124998807907104)
+assertEq(f32[1492 >> 2], 1.3749998807907104)
+assertEq(f32[1496 >> 2], 1.4374998807907104)
+assertEq(f32[1500 >> 2], 1.4999998807907104)
+assertEq(f32[1504 >> 2], 1.5624998807907104)
+assertEq(f32[1508 >> 2], 1.6249998807907104)
+assertEq(f32[1512 >> 2], 1.6874998807907104)
+assertEq(f32[1516 >> 2], 1.7499998807907104)
+assertEq(f32[1520 >> 2], 1.8124998807907104)
+assertEq(f32[1524 >> 2], 1.8749998807907104)
+assertEq(f32[1528 >> 2], 1.9374998807907104)
+assertEq(f32[1532 >> 2], 1.9999998807907104)
+assertEq(f32[1536 >> 2], -2.124999761581421)
+assertEq(f32[1540 >> 2], -2.249999761581421)
+assertEq(f32[1544 >> 2], -2.374999761581421)
+assertEq(f32[1548 >> 2], -2.499999761581421)
+assertEq(f32[1552 >> 2], -2.624999761581421)
+assertEq(f32[1556 >> 2], -2.749999761581421)
+assertEq(f32[1560 >> 2], -2.874999761581421)
+assertEq(f32[1564 >> 2], -2.999999761581421)
+assertEq(f32[1568 >> 2], -3.124999761581421)
+assertEq(f32[1572 >> 2], -3.249999761581421)
+assertEq(f32[1576 >> 2], -3.374999761581421)
+assertEq(f32[1580 >> 2], -3.499999761581421)
+assertEq(f32[1584 >> 2], -3.624999761581421)
+assertEq(f32[1584 >> 2], -3.624999761581421)
+assertEq(f32[1588 >> 2], -3.749999761581421)
+assertEq(f32[1592 >> 2], -3.874999761581421)
+assertEq(f32[1596 >> 2], -3.999999761581421)
+assertEq(f32[1600 >> 2], -4.249999523162842)
+assertEq(f32[1604 >> 2], -4.499999523162842)
+assertEq(f32[1608 >> 2], -4.749999523162842)
+assertEq(f32[1612 >> 2], -4.999999523162842)
+assertEq(f32[1616 >> 2], -5.249999523162842)
+assertEq(f32[1620 >> 2], -5.499999523162842)
+assertEq(f32[1624 >> 2], -5.749999523162842)
+assertEq(f32[1628 >> 2], -5.999999523162842)
+assertEq(f32[1632 >> 2], -6.249999523162842)
+assertEq(f32[1636 >> 2], -6.499999523162842)
+assertEq(f32[1640 >> 2], -6.749999523162842)
+assertEq(f32[1644 >> 2], -6.999999523162842)
+assertEq(f32[1648 >> 2], -7.249999523162842)
+assertEq(f32[1652 >> 2], -7.499999523162842)
+assertEq(f32[1656 >> 2], -7.749999523162842)
+assertEq(f32[1660 >> 2], -7.999999523162842)
+assertEq(f32[1664 >> 2], -8.499999046325684)
+assertEq(f32[1668 >> 2], -8.999999046325684)
+assertEq(f32[1672 >> 2], -9.499999046325684)
+assertEq(f32[1676 >> 2], -9.999999046325684)
+assertEq(f32[1680 >> 2], -10.499999046325684)
+assertEq(f32[1684 >> 2], -10.999999046325684)
+assertEq(f32[1688 >> 2], -11.499999046325684)
+assertEq(f32[1692 >> 2], -11.999999046325684)
+assertEq(f32[1696 >> 2], -12.499999046325684)
+assertEq(f32[1700 >> 2], -12.999999046325684)
+assertEq(f32[1704 >> 2], -13.499999046325684)
+assertEq(f32[1708 >> 2], -13.999999046325684)
+assertEq(f32[1712 >> 2], -14.499999046325684)
+assertEq(f32[1716 >> 2], -14.999999046325684)
+assertEq(f32[1720 >> 2], -15.499999046325684)
+assertEq(f32[1724 >> 2], -15.999999046325684)
+assertEq(f32[1728 >> 2], -16.999998092651367)
+assertEq(f32[1732 >> 2], -17.999998092651367)
+assertEq(f32[1736 >> 2], -18.999998092651367)
+assertEq(f32[1740 >> 2], -19.999998092651367)
+assertEq(f32[1744 >> 2], -20.999998092651367)
+assertEq(f32[1748 >> 2], -21.999998092651367)
+assertEq(f32[1752 >> 2], -22.999998092651367)
+assertEq(f32[1756 >> 2], -23.999998092651367)
+assertEq(f32[1760 >> 2], -24.999998092651367)
+assertEq(f32[1764 >> 2], -25.999998092651367)
+assertEq(f32[1768 >> 2], -26.999998092651367)
+assertEq(f32[1772 >> 2], -27.999998092651367)
+assertEq(f32[1776 >> 2], -28.999998092651367)
+assertEq(f32[1780 >> 2], -29.999998092651367)
+assertEq(f32[1784 >> 2], -30.999998092651367)
+assertEq(f32[1788 >> 2], -31.999998092651367)
+assertEq(f32[1792 >> 2], -0.1328124850988388)
+assertEq(f32[1796 >> 2], -0.1406249850988388)
+assertEq(f32[1800 >> 2], -0.1484374850988388)
+assertEq(f32[1804 >> 2], -0.1562499850988388)
+assertEq(f32[1808 >> 2], -0.1640624850988388)
+assertEq(f32[1812 >> 2], -0.1718749850988388)
+assertEq(f32[1816 >> 2], -0.1796874850988388)
+assertEq(f32[1820 >> 2], -0.1874999850988388)
+assertEq(f32[1824 >> 2], -0.1953124850988388)
+assertEq(f32[1828 >> 2], -0.2031249850988388)
+assertEq(f32[1832 >> 2], -0.2109374850988388)
+assertEq(f32[1836 >> 2], -0.2187499850988388)
+assertEq(f32[1840 >> 2], -0.2265624850988388)
+assertEq(f32[1844 >> 2], -0.2343749850988388)
+assertEq(f32[1848 >> 2], -0.2421874850988388)
+assertEq(f32[1852 >> 2], -0.2499999850988388)
+assertEq(f32[1856 >> 2], -0.2656249701976776)
+assertEq(f32[1860 >> 2], -0.2812499701976776)
+assertEq(f32[1864 >> 2], -0.2968749701976776)
+assertEq(f32[1868 >> 2], -0.3124999701976776)
+assertEq(f32[1872 >> 2], -0.3281249701976776)
+assertEq(f32[1876 >> 2], -0.3437499701976776)
+assertEq(f32[1880 >> 2], -0.3593749701976776)
+assertEq(f32[1884 >> 2], -0.3749999701976776)
+assertEq(f32[1888 >> 2], -0.3906249701976776)
+assertEq(f32[1892 >> 2], -0.4062499701976776)
+assertEq(f32[1896 >> 2], -0.4218749701976776)
+assertEq(f32[1900 >> 2], -0.4374999701976776)
+assertEq(f32[1904 >> 2], -0.4531249701976776)
+assertEq(f32[1908 >> 2], -0.4687499701976776)
+assertEq(f32[1912 >> 2], -0.4843749701976776)
+assertEq(f32[1916 >> 2], -0.4999999701976776)
+assertEq(f32[1920 >> 2], -0.5312499403953552)
+assertEq(f32[1924 >> 2], -0.5624999403953552)
+assertEq(f32[1928 >> 2], -0.5937499403953552)
+assertEq(f32[1932 >> 2], -0.6249999403953552)
+assertEq(f32[1936 >> 2], -0.6562499403953552)
+assertEq(f32[1940 >> 2], -0.6874999403953552)
+assertEq(f32[1944 >> 2], -0.7187499403953552)
+assertEq(f32[1948 >> 2], -0.7499999403953552)
+assertEq(f32[1952 >> 2], -0.7812499403953552)
+assertEq(f32[1956 >> 2], -0.8124999403953552)
+assertEq(f32[1960 >> 2], -0.8437499403953552)
+assertEq(f32[1964 >> 2], -0.8749999403953552)
+assertEq(f32[1968 >> 2], -0.9062499403953552)
+assertEq(f32[1972 >> 2], -0.9374999403953552)
+assertEq(f32[1976 >> 2], -0.9687499403953552)
+assertEq(f32[1980 >> 2], -0.9999999403953552)
+assertEq(f32[1984 >> 2], -1.0624998807907104)
+assertEq(f32[1984 >> 2], -1.0624998807907104)
+assertEq(f32[1988 >> 2], -1.1249998807907104)
+assertEq(f32[1992 >> 2], -1.1874998807907104)
+assertEq(f32[1996 >> 2], -1.2499998807907104)
+assertEq(f32[2000 >> 2], -1.3124998807907104)
+assertEq(f32[2004 >> 2], -1.3749998807907104)
+assertEq(f32[2008 >> 2], -1.4374998807907104)
+assertEq(f32[2012 >> 2], -1.4999998807907104)
+assertEq(f32[2016 >> 2], -1.5624998807907104)
+assertEq(f32[2020 >> 2], -1.6249998807907104)
+assertEq(f32[2024 >> 2], -1.6874998807907104)
+assertEq(f32[2028 >> 2], -1.7499998807907104)
+assertEq(f32[2032 >> 2], -1.8124998807907104)
+assertEq(f32[2036 >> 2], -1.8749998807907104)
+assertEq(f32[2040 >> 2], -1.9374998807907104)
+assertEq(f32[2044 >> 2], -1.9999998807907104)
+
+assertEq(f32[2048 >> 2], 2.000000238418579)
+assertEq(f32[2052 >> 2], 2.125000238418579)
+assertEq(f32[2056 >> 2], 2.250000238418579)
+assertEq(f32[2060 >> 2], 2.375000238418579)
+assertEq(f32[2064 >> 2], 2.500000238418579)
+assertEq(f32[2068 >> 2], 2.625000238418579)
+assertEq(f32[2072 >> 2], 2.750000238418579)
+assertEq(f32[2076 >> 2], 2.875000238418579)
+assertEq(f32[2080 >> 2], 3.000000238418579)
+assertEq(f32[2084 >> 2], 3.125000238418579)
+assertEq(f32[2088 >> 2], 3.250000238418579)
+assertEq(f32[2092 >> 2], 3.375000238418579)
+assertEq(f32[2096 >> 2], 3.500000238418579)
+assertEq(f32[2100 >> 2], 3.625000238418579)
+assertEq(f32[2104 >> 2], 3.750000238418579)
+assertEq(f32[2108 >> 2], 3.875000238418579)
+assertEq(f32[2112 >> 2], 4.000000476837158)
+assertEq(f32[2116 >> 2], 4.250000476837158)
+assertEq(f32[2120 >> 2], 4.500000476837158)
+assertEq(f32[2124 >> 2], 4.750000476837158)
+assertEq(f32[2128 >> 2], 5.000000476837158)
+assertEq(f32[2132 >> 2], 5.250000476837158)
+assertEq(f32[2136 >> 2], 5.500000476837158)
+assertEq(f32[2140 >> 2], 5.750000476837158)
+assertEq(f32[2144 >> 2], 6.000000476837158)
+assertEq(f32[2148 >> 2], 6.250000476837158)
+assertEq(f32[2152 >> 2], 6.500000476837158)
+assertEq(f32[2156 >> 2], 6.750000476837158)
+assertEq(f32[2160 >> 2], 7.000000476837158)
+assertEq(f32[2164 >> 2], 7.250000476837158)
+assertEq(f32[2168 >> 2], 7.500000476837158)
+assertEq(f32[2172 >> 2], 7.750000476837158)
+assertEq(f32[2176 >> 2], 8.000000953674316)
+assertEq(f32[2180 >> 2], 8.500000953674316)
+assertEq(f32[2184 >> 2], 9.000000953674316)
+assertEq(f32[2188 >> 2], 9.500000953674316)
+assertEq(f32[2192 >> 2], 10.000000953674316)
+assertEq(f32[2196 >> 2], 10.500000953674316)
+assertEq(f32[2200 >> 2], 11.000000953674316)
+assertEq(f32[2204 >> 2], 11.500000953674316)
+assertEq(f32[2208 >> 2], 12.000000953674316)
+assertEq(f32[2212 >> 2], 12.500000953674316)
+assertEq(f32[2216 >> 2], 13.000000953674316)
+assertEq(f32[2220 >> 2], 13.500000953674316)
+assertEq(f32[2224 >> 2], 14.000000953674316)
+assertEq(f32[2228 >> 2], 14.500000953674316)
+assertEq(f32[2228 >> 2], 14.500000953674316)
+assertEq(f32[2232 >> 2], 15.000000953674316)
+assertEq(f32[2236 >> 2], 15.500000953674316)
+assertEq(f32[2240 >> 2], 16.000001907348633)
+assertEq(f32[2244 >> 2], 17.000001907348633)
+assertEq(f32[2248 >> 2], 18.000001907348633)
+assertEq(f32[2252 >> 2], 19.000001907348633)
+assertEq(f32[2256 >> 2], 20.000001907348633)
+assertEq(f32[2260 >> 2], 21.000001907348633)
+assertEq(f32[2264 >> 2], 22.000001907348633)
+assertEq(f32[2268 >> 2], 23.000001907348633)
+assertEq(f32[2272 >> 2], 24.000001907348633)
+assertEq(f32[2276 >> 2], 25.000001907348633)
+assertEq(f32[2280 >> 2], 26.000001907348633)
+assertEq(f32[2284 >> 2], 27.000001907348633)
+assertEq(f32[2288 >> 2], 28.000001907348633)
+assertEq(f32[2292 >> 2], 29.000001907348633)
+assertEq(f32[2296 >> 2], 30.000001907348633)
+assertEq(f32[2300 >> 2], 31.000001907348633)
+assertEq(f32[2304 >> 2], 0.1250000149011612)
+assertEq(f32[2308 >> 2], 0.1328125149011612)
+assertEq(f32[2312 >> 2], 0.1406250149011612)
+assertEq(f32[2316 >> 2], 0.1484375149011612)
+assertEq(f32[2320 >> 2], 0.1562500149011612)
+assertEq(f32[2324 >> 2], 0.1640625149011612)
+assertEq(f32[2328 >> 2], 0.1718750149011612)
+assertEq(f32[2332 >> 2], 0.1796875149011612)
+assertEq(f32[2336 >> 2], 0.1875000149011612)
+assertEq(f32[2340 >> 2], 0.1953125149011612)
+assertEq(f32[2344 >> 2], 0.2031250149011612)
+assertEq(f32[2348 >> 2], 0.2109375149011612)
+assertEq(f32[2352 >> 2], 0.2187500149011612)
+assertEq(f32[2356 >> 2], 0.2265625149011612)
+assertEq(f32[2360 >> 2], 0.2343750149011612)
+assertEq(f32[2364 >> 2], 0.2421875149011612)
+assertEq(f32[2368 >> 2], 0.2500000298023224)
+assertEq(f32[2372 >> 2], 0.2656250298023224)
+assertEq(f32[2376 >> 2], 0.2812500298023224)
+assertEq(f32[2380 >> 2], 0.2968750298023224)
+assertEq(f32[2384 >> 2], 0.3125000298023224)
+assertEq(f32[2388 >> 2], 0.3281250298023224)
+assertEq(f32[2392 >> 2], 0.3437500298023224)
+assertEq(f32[2396 >> 2], 0.3593750298023224)
+assertEq(f32[2400 >> 2], 0.3750000298023224)
+assertEq(f32[2404 >> 2], 0.3906250298023224)
+assertEq(f32[2408 >> 2], 0.4062500298023224)
+assertEq(f32[2412 >> 2], 0.4218750298023224)
+assertEq(f32[2416 >> 2], 0.4375000298023224)
+assertEq(f32[2420 >> 2], 0.4531250298023224)
+assertEq(f32[2424 >> 2], 0.4687500298023224)
+assertEq(f32[2428 >> 2], 0.4843750298023224)
+assertEq(f32[2432 >> 2], 0.5000000596046448)
+assertEq(f32[2436 >> 2], 0.5312500596046448)
+assertEq(f32[2440 >> 2], 0.5625000596046448)
+assertEq(f32[2444 >> 2], 0.5937500596046448)
+assertEq(f32[2448 >> 2], 0.6250000596046448)
+assertEq(f32[2452 >> 2], 0.6562500596046448)
+assertEq(f32[2456 >> 2], 0.6875000596046448)
+assertEq(f32[2460 >> 2], 0.7187500596046448)
+assertEq(f32[2464 >> 2], 0.7500000596046448)
+assertEq(f32[2468 >> 2], 0.7812500596046448)
+assertEq(f32[2472 >> 2], 0.8125000596046448)
+assertEq(f32[2476 >> 2], 0.8437500596046448)
+assertEq(f32[2480 >> 2], 0.8750000596046448)
+assertEq(f32[2484 >> 2], 0.9062500596046448)
+assertEq(f32[2488 >> 2], 0.9375000596046448)
+assertEq(f32[2492 >> 2], 0.9687500596046448)
+assertEq(f32[2496 >> 2], 1.0000001192092896)
+assertEq(f32[2500 >> 2], 1.0625001192092896)
+assertEq(f32[2504 >> 2], 1.1250001192092896)
+assertEq(f32[2508 >> 2], 1.1875001192092896)
+assertEq(f32[2512 >> 2], 1.2500001192092896)
+assertEq(f32[2516 >> 2], 1.3125001192092896)
+assertEq(f32[2520 >> 2], 1.3750001192092896)
+assertEq(f32[2524 >> 2], 1.4375001192092896)
+assertEq(f32[2528 >> 2], 1.5000001192092896)
+assertEq(f32[2532 >> 2], 1.5625001192092896)
+assertEq(f32[2536 >> 2], 1.6250001192092896)
+assertEq(f32[2540 >> 2], 1.6875001192092896)
+assertEq(f32[2544 >> 2], 1.7500001192092896)
+assertEq(f32[2548 >> 2], 1.8125001192092896)
+assertEq(f32[2552 >> 2], 1.8750001192092896)
+assertEq(f32[2556 >> 2], 1.9375001192092896)
+assertEq(f32[2560 >> 2], -2.000000238418579)
+assertEq(f32[2564 >> 2], -2.125000238418579)
+assertEq(f32[2568 >> 2], -2.250000238418579)
+assertEq(f32[2572 >> 2], -2.375000238418579)
+assertEq(f32[2576 >> 2], -2.500000238418579)
+assertEq(f32[2580 >> 2], -2.625000238418579)
+assertEq(f32[2584 >> 2], -2.750000238418579)
+assertEq(f32[2588 >> 2], -2.875000238418579)
+assertEq(f32[2592 >> 2], -3.000000238418579)
+assertEq(f32[2596 >> 2], -3.125000238418579)
+assertEq(f32[2600 >> 2], -3.250000238418579)
+assertEq(f32[2604 >> 2], -3.375000238418579)
+assertEq(f32[2608 >> 2], -3.500000238418579)
+assertEq(f32[2612 >> 2], -3.625000238418579)
+assertEq(f32[2616 >> 2], -3.750000238418579)
+assertEq(f32[2620 >> 2], -3.875000238418579)
+assertEq(f32[2624 >> 2], -4.000000476837158)
+assertEq(f32[2628 >> 2], -4.250000476837158)
+assertEq(f32[2628 >> 2], -4.250000476837158)
+assertEq(f32[2632 >> 2], -4.500000476837158)
+assertEq(f32[2636 >> 2], -4.750000476837158)
+assertEq(f32[2640 >> 2], -5.000000476837158)
+assertEq(f32[2644 >> 2], -5.250000476837158)
+assertEq(f32[2648 >> 2], -5.500000476837158)
+assertEq(f32[2652 >> 2], -5.750000476837158)
+assertEq(f32[2656 >> 2], -6.000000476837158)
+assertEq(f32[2660 >> 2], -6.250000476837158)
+assertEq(f32[2664 >> 2], -6.500000476837158)
+assertEq(f32[2668 >> 2], -6.750000476837158)
+assertEq(f32[2672 >> 2], -7.000000476837158)
+assertEq(f32[2676 >> 2], -7.250000476837158)
+assertEq(f32[2680 >> 2], -7.500000476837158)
+assertEq(f32[2684 >> 2], -7.750000476837158)
+assertEq(f32[2688 >> 2], -8.000000953674316)
+assertEq(f32[2692 >> 2], -8.500000953674316)
+assertEq(f32[2696 >> 2], -9.000000953674316)
+assertEq(f32[2700 >> 2], -9.500000953674316)
+assertEq(f32[2704 >> 2], -10.000000953674316)
+assertEq(f32[2708 >> 2], -10.500000953674316)
+assertEq(f32[2712 >> 2], -11.000000953674316)
+assertEq(f32[2716 >> 2], -11.500000953674316)
+assertEq(f32[2720 >> 2], -12.000000953674316)
+assertEq(f32[2724 >> 2], -12.500000953674316)
+assertEq(f32[2728 >> 2], -13.000000953674316)
+assertEq(f32[2732 >> 2], -13.500000953674316)
+assertEq(f32[2736 >> 2], -14.000000953674316)
+assertEq(f32[2740 >> 2], -14.500000953674316)
+assertEq(f32[2744 >> 2], -15.000000953674316)
+assertEq(f32[2748 >> 2], -15.500000953674316)
+assertEq(f32[2752 >> 2], -16.000001907348633)
+assertEq(f32[2756 >> 2], -17.000001907348633)
+assertEq(f32[2760 >> 2], -18.000001907348633)
+assertEq(f32[2764 >> 2], -19.000001907348633)
+assertEq(f32[2768 >> 2], -20.000001907348633)
+assertEq(f32[2772 >> 2], -21.000001907348633)
+assertEq(f32[2776 >> 2], -22.000001907348633)
+assertEq(f32[2780 >> 2], -23.000001907348633)
+assertEq(f32[2784 >> 2], -24.000001907348633)
+assertEq(f32[2788 >> 2], -25.000001907348633)
+assertEq(f32[2792 >> 2], -26.000001907348633)
+assertEq(f32[2796 >> 2], -27.000001907348633)
+assertEq(f32[2800 >> 2], -28.000001907348633)
+assertEq(f32[2804 >> 2], -29.000001907348633)
+assertEq(f32[2808 >> 2], -30.000001907348633)
+assertEq(f32[2812 >> 2], -31.000001907348633)
+assertEq(f32[2816 >> 2], -0.1250000149011612)
+assertEq(f32[2820 >> 2], -0.1328125149011612)
+assertEq(f32[2824 >> 2], -0.1406250149011612)
+assertEq(f32[2828 >> 2], -0.1484375149011612)
+assertEq(f32[2832 >> 2], -0.1562500149011612)
+assertEq(f32[2836 >> 2], -0.1640625149011612)
+assertEq(f32[2840 >> 2], -0.1718750149011612)
+assertEq(f32[2844 >> 2], -0.1796875149011612)
+assertEq(f32[2848 >> 2], -0.1875000149011612)
+assertEq(f32[2852 >> 2], -0.1953125149011612)
+assertEq(f32[2856 >> 2], -0.2031250149011612)
+assertEq(f32[2860 >> 2], -0.2109375149011612)
+assertEq(f32[2864 >> 2], -0.2187500149011612)
+assertEq(f32[2868 >> 2], -0.2265625149011612)
+assertEq(f32[2872 >> 2], -0.2343750149011612)
+assertEq(f32[2876 >> 2], -0.2421875149011612)
+assertEq(f32[2880 >> 2], -0.2500000298023224)
+assertEq(f32[2884 >> 2], -0.2656250298023224)
+assertEq(f32[2888 >> 2], -0.2812500298023224)
+assertEq(f32[2892 >> 2], -0.2968750298023224)
+assertEq(f32[2896 >> 2], -0.3125000298023224)
+assertEq(f32[2900 >> 2], -0.3281250298023224)
+assertEq(f32[2904 >> 2], -0.3437500298023224)
+assertEq(f32[2908 >> 2], -0.3593750298023224)
+assertEq(f32[2912 >> 2], -0.3750000298023224)
+assertEq(f32[2916 >> 2], -0.3906250298023224)
+assertEq(f32[2920 >> 2], -0.4062500298023224)
+assertEq(f32[2924 >> 2], -0.4218750298023224)
+assertEq(f32[2928 >> 2], -0.4375000298023224)
+assertEq(f32[2932 >> 2], -0.4531250298023224)
+assertEq(f32[2936 >> 2], -0.4687500298023224)
+assertEq(f32[2940 >> 2], -0.4843750298023224)
+assertEq(f32[2944 >> 2], -0.5000000596046448)
+assertEq(f32[2948 >> 2], -0.5312500596046448)
+assertEq(f32[2952 >> 2], -0.5625000596046448)
+assertEq(f32[2956 >> 2], -0.5937500596046448)
+assertEq(f32[2960 >> 2], -0.6250000596046448)
+assertEq(f32[2964 >> 2], -0.6562500596046448)
+assertEq(f32[2968 >> 2], -0.6875000596046448)
+assertEq(f32[2972 >> 2], -0.7187500596046448)
+assertEq(f32[2976 >> 2], -0.7500000596046448)
+assertEq(f32[2980 >> 2], -0.7812500596046448)
+assertEq(f32[2984 >> 2], -0.8125000596046448)
+assertEq(f32[2988 >> 2], -0.8437500596046448)
+assertEq(f32[2992 >> 2], -0.8750000596046448)
+assertEq(f32[2996 >> 2], -0.9062500596046448)
+assertEq(f32[3000 >> 2], -0.9375000596046448)
+assertEq(f32[3004 >> 2], -0.9687500596046448)
+assertEq(f32[3008 >> 2], -1.0000001192092896)
+assertEq(f32[3012 >> 2], -1.0625001192092896)
+assertEq(f32[3016 >> 2], -1.1250001192092896)
+assertEq(f32[3020 >> 2], -1.1875001192092896)
+assertEq(f32[3024 >> 2], -1.2500001192092896)
+assertEq(f32[3028 >> 2], -1.3125001192092896)
+assertEq(f32[3028 >> 2], -1.3125001192092896)
+assertEq(f32[3032 >> 2], -1.3750001192092896)
+assertEq(f32[3036 >> 2], -1.4375001192092896)
+assertEq(f32[3040 >> 2], -1.5000001192092896)
+assertEq(f32[3044 >> 2], -1.5625001192092896)
+assertEq(f32[3048 >> 2], -1.6250001192092896)
+assertEq(f32[3052 >> 2], -1.6875001192092896)
+assertEq(f32[3056 >> 2], -1.7500001192092896)
+assertEq(f32[3060 >> 2], -1.8125001192092896)
+assertEq(f32[3064 >> 2], -1.8750001192092896)
+assertEq(f32[3068 >> 2], -1.9375001192092896)
+
+assertEq(f32[3072 >> 2], 2.0625)
+assertEq(f32[3076 >> 2], 2.1875)
+assertEq(f32[3080 >> 2], 2.3125)
+assertEq(f32[3084 >> 2], 2.4375)
+assertEq(f32[3088 >> 2], 2.5625)
+assertEq(f32[3092 >> 2], 2.6875)
+assertEq(f32[3096 >> 2], 2.8125)
+assertEq(f32[3100 >> 2], 2.9375)
+assertEq(f32[3104 >> 2], 3.0625)
+assertEq(f32[3108 >> 2], 3.1875)
+assertEq(f32[3112 >> 2], 3.3125)
+assertEq(f32[3116 >> 2], 3.4375)
+assertEq(f32[3120 >> 2], 3.5625)
+assertEq(f32[3124 >> 2], 3.6875)
+assertEq(f32[3128 >> 2], 3.8125)
+assertEq(f32[3132 >> 2], 3.9375)
+assertEq(f32[3136 >> 2], 4.125)
+assertEq(f32[3140 >> 2], 4.375)
+assertEq(f32[3144 >> 2], 4.625)
+assertEq(f32[3148 >> 2], 4.875)
+assertEq(f32[3152 >> 2], 5.125)
+assertEq(f32[3156 >> 2], 5.375)
+assertEq(f32[3160 >> 2], 5.625)
+assertEq(f32[3164 >> 2], 5.875)
+assertEq(f32[3168 >> 2], 6.125)
+assertEq(f32[3172 >> 2], 6.375)
+assertEq(f32[3176 >> 2], 6.625)
+assertEq(f32[3180 >> 2], 6.875)
+assertEq(f32[3184 >> 2], 7.125)
+assertEq(f32[3188 >> 2], 7.375)
+assertEq(f32[3192 >> 2], 7.625)
+assertEq(f32[3196 >> 2], 7.875)
+assertEq(f32[3200 >> 2], 8.25)
+assertEq(f32[3204 >> 2], 8.75)
+assertEq(f32[3208 >> 2], 9.25)
+assertEq(f32[3212 >> 2], 9.75)
+assertEq(f32[3216 >> 2], 10.25)
+assertEq(f32[3220 >> 2], 10.75)
+assertEq(f32[3224 >> 2], 11.25)
+assertEq(f32[3224 >> 2], 11.25)
+assertEq(f32[3228 >> 2], 11.75)
+assertEq(f32[3232 >> 2], 12.25)
+assertEq(f32[3236 >> 2], 12.75)
+assertEq(f32[3240 >> 2], 13.25)
+assertEq(f32[3244 >> 2], 13.75)
+assertEq(f32[3248 >> 2], 14.25)
+assertEq(f32[3252 >> 2], 14.75)
+assertEq(f32[3256 >> 2], 15.25)
+assertEq(f32[3260 >> 2], 15.75)
+assertEq(f32[3264 >> 2], 16.5)
+assertEq(f32[3268 >> 2], 17.5)
+assertEq(f32[3272 >> 2], 18.5)
+assertEq(f32[3276 >> 2], 19.5)
+assertEq(f32[3280 >> 2], 20.5)
+assertEq(f32[3284 >> 2], 21.5)
+assertEq(f32[3288 >> 2], 22.5)
+assertEq(f32[3292 >> 2], 23.5)
+assertEq(f32[3296 >> 2], 24.5)
+assertEq(f32[3300 >> 2], 25.5)
+assertEq(f32[3304 >> 2], 26.5)
+assertEq(f32[3308 >> 2], 27.5)
+assertEq(f32[3312 >> 2], 28.5)
+assertEq(f32[3316 >> 2], 29.5)
+assertEq(f32[3320 >> 2], 30.5)
+assertEq(f32[3324 >> 2], 31.5)
+assertEq(f32[3328 >> 2], 0.12890625)
+assertEq(f32[3332 >> 2], 0.13671875)
+assertEq(f32[3336 >> 2], 0.14453125)
+assertEq(f32[3340 >> 2], 0.15234375)
+assertEq(f32[3344 >> 2], 0.16015625)
+assertEq(f32[3348 >> 2], 0.16796875)
+assertEq(f32[3352 >> 2], 0.17578125)
+assertEq(f32[3356 >> 2], 0.18359375)
+assertEq(f32[3360 >> 2], 0.19140625)
+assertEq(f32[3364 >> 2], 0.19921875)
+assertEq(f32[3368 >> 2], 0.20703125)
+assertEq(f32[3372 >> 2], 0.21484375)
+assertEq(f32[3376 >> 2], 0.22265625)
+assertEq(f32[3380 >> 2], 0.23046875)
+assertEq(f32[3384 >> 2], 0.23828125)
+assertEq(f32[3388 >> 2], 0.24609375)
+assertEq(f32[3392 >> 2], 0.2578125)
+assertEq(f32[3396 >> 2], 0.2734375)
+assertEq(f32[3400 >> 2], 0.2890625)
+assertEq(f32[3404 >> 2], 0.3046875)
+assertEq(f32[3408 >> 2], 0.3203125)
+assertEq(f32[3412 >> 2], 0.3359375)
+assertEq(f32[3416 >> 2], 0.3515625)
+assertEq(f32[3420 >> 2], 0.3671875)
+assertEq(f32[3424 >> 2], 0.3828125)
+assertEq(f32[3428 >> 2], 0.3984375)
+assertEq(f32[3432 >> 2], 0.4140625)
+assertEq(f32[3436 >> 2], 0.4296875)
+assertEq(f32[3440 >> 2], 0.4453125)
+assertEq(f32[3444 >> 2], 0.4609375)
+assertEq(f32[3448 >> 2], 0.4765625)
+assertEq(f32[3452 >> 2], 0.4921875)
+assertEq(f32[3456 >> 2], 0.515625)
+assertEq(f32[3460 >> 2], 0.546875)
+assertEq(f32[3464 >> 2], 0.578125)
+assertEq(f32[3468 >> 2], 0.609375)
+assertEq(f32[3472 >> 2], 0.640625)
+assertEq(f32[3476 >> 2], 0.671875)
+assertEq(f32[3480 >> 2], 0.703125)
+assertEq(f32[3484 >> 2], 0.734375)
+assertEq(f32[3488 >> 2], 0.765625)
+assertEq(f32[3492 >> 2], 0.796875)
+assertEq(f32[3496 >> 2], 0.828125)
+assertEq(f32[3500 >> 2], 0.859375)
+assertEq(f32[3504 >> 2], 0.890625)
+assertEq(f32[3508 >> 2], 0.921875)
+assertEq(f32[3512 >> 2], 0.953125)
+assertEq(f32[3516 >> 2], 0.984375)
+assertEq(f32[3520 >> 2], 1.03125)
+assertEq(f32[3524 >> 2], 1.09375)
+assertEq(f32[3528 >> 2], 1.15625)
+assertEq(f32[3532 >> 2], 1.21875)
+assertEq(f32[3536 >> 2], 1.28125)
+assertEq(f32[3540 >> 2], 1.34375)
+assertEq(f32[3544 >> 2], 1.40625)
+assertEq(f32[3548 >> 2], 1.46875)
+assertEq(f32[3552 >> 2], 1.53125)
+assertEq(f32[3556 >> 2], 1.59375)
+assertEq(f32[3560 >> 2], 1.65625)
+assertEq(f32[3564 >> 2], 1.71875)
+assertEq(f32[3568 >> 2], 1.78125)
+assertEq(f32[3572 >> 2], 1.84375)
+assertEq(f32[3576 >> 2], 1.90625)
+assertEq(f32[3580 >> 2], 1.96875)
+assertEq(f32[3584 >> 2], -2.0625)
+assertEq(f32[3588 >> 2], -2.1875)
+assertEq(f32[3592 >> 2], -2.3125)
+assertEq(f32[3596 >> 2], -2.4375)
+assertEq(f32[3600 >> 2], -2.5625)
+assertEq(f32[3604 >> 2], -2.6875)
+assertEq(f32[3608 >> 2], -2.8125)
+assertEq(f32[3612 >> 2], -2.9375)
+assertEq(f32[3616 >> 2], -3.0625)
+assertEq(f32[3620 >> 2], -3.1875)
+assertEq(f32[3624 >> 2], -3.3125)
+assertEq(f32[3624 >> 2], -3.3125)
+assertEq(f32[3628 >> 2], -3.4375)
+assertEq(f32[3632 >> 2], -3.5625)
+assertEq(f32[3636 >> 2], -3.6875)
+assertEq(f32[3640 >> 2], -3.8125)
+assertEq(f32[3644 >> 2], -3.9375)
+assertEq(f32[3648 >> 2], -4.125)
+assertEq(f32[3652 >> 2], -4.375)
+assertEq(f32[3656 >> 2], -4.625)
+assertEq(f32[3660 >> 2], -4.875)
+assertEq(f32[3664 >> 2], -5.125)
+assertEq(f32[3668 >> 2], -5.375)
+assertEq(f32[3672 >> 2], -5.625)
+assertEq(f32[3676 >> 2], -5.875)
+assertEq(f32[3680 >> 2], -6.125)
+assertEq(f32[3684 >> 2], -6.375)
+assertEq(f32[3688 >> 2], -6.625)
+assertEq(f32[3692 >> 2], -6.875)
+assertEq(f32[3696 >> 2], -7.125)
+assertEq(f32[3700 >> 2], -7.375)
+assertEq(f32[3704 >> 2], -7.625)
+assertEq(f32[3708 >> 2], -7.875)
+assertEq(f32[3712 >> 2], -8.25)
+assertEq(f32[3716 >> 2], -8.75)
+assertEq(f32[3720 >> 2], -9.25)
+assertEq(f32[3724 >> 2], -9.75)
+assertEq(f32[3728 >> 2], -10.25)
+assertEq(f32[3732 >> 2], -10.75)
+assertEq(f32[3736 >> 2], -11.25)
+assertEq(f32[3740 >> 2], -11.75)
+assertEq(f32[3744 >> 2], -12.25)
+assertEq(f32[3748 >> 2], -12.75)
+assertEq(f32[3752 >> 2], -13.25)
+assertEq(f32[3756 >> 2], -13.75)
+assertEq(f32[3760 >> 2], -14.25)
+assertEq(f32[3764 >> 2], -14.75)
+assertEq(f32[3768 >> 2], -15.25)
+assertEq(f32[3772 >> 2], -15.75)
+assertEq(f32[3776 >> 2], -16.5)
+assertEq(f32[3780 >> 2], -17.5)
+assertEq(f32[3784 >> 2], -18.5)
+assertEq(f32[3788 >> 2], -19.5)
+assertEq(f32[3792 >> 2], -20.5)
+assertEq(f32[3796 >> 2], -21.5)
+assertEq(f32[3800 >> 2], -22.5)
+assertEq(f32[3804 >> 2], -23.5)
+assertEq(f32[3808 >> 2], -24.5)
+assertEq(f32[3812 >> 2], -25.5)
+assertEq(f32[3816 >> 2], -26.5)
+assertEq(f32[3820 >> 2], -27.5)
+assertEq(f32[3824 >> 2], -28.5)
+assertEq(f32[3828 >> 2], -29.5)
+assertEq(f32[3832 >> 2], -30.5)
+assertEq(f32[3836 >> 2], -31.5)
+assertEq(f32[3840 >> 2], -0.12890625)
+assertEq(f32[3844 >> 2], -0.13671875)
+assertEq(f32[3848 >> 2], -0.14453125)
+assertEq(f32[3852 >> 2], -0.15234375)
+assertEq(f32[3856 >> 2], -0.16015625)
+assertEq(f32[3860 >> 2], -0.16796875)
+assertEq(f32[3864 >> 2], -0.17578125)
+assertEq(f32[3868 >> 2], -0.18359375)
+assertEq(f32[3872 >> 2], -0.19140625)
+assertEq(f32[3876 >> 2], -0.19921875)
+assertEq(f32[3880 >> 2], -0.20703125)
+assertEq(f32[3884 >> 2], -0.21484375)
+assertEq(f32[3888 >> 2], -0.22265625)
+assertEq(f32[3892 >> 2], -0.23046875)
+assertEq(f32[3896 >> 2], -0.23828125)
+assertEq(f32[3900 >> 2], -0.24609375)
+assertEq(f32[3904 >> 2], -0.2578125)
+assertEq(f32[3908 >> 2], -0.2734375)
+assertEq(f32[3912 >> 2], -0.2890625)
+assertEq(f32[3916 >> 2], -0.3046875)
+assertEq(f32[3920 >> 2], -0.3203125)
+assertEq(f32[3924 >> 2], -0.3359375)
+assertEq(f32[3928 >> 2], -0.3515625)
+assertEq(f32[3932 >> 2], -0.3671875)
+assertEq(f32[3936 >> 2], -0.3828125)
+assertEq(f32[3940 >> 2], -0.3984375)
+assertEq(f32[3944 >> 2], -0.4140625)
+assertEq(f32[3948 >> 2], -0.4296875)
+assertEq(f32[3952 >> 2], -0.4453125)
+assertEq(f32[3956 >> 2], -0.4609375)
+assertEq(f32[3960 >> 2], -0.4765625)
+assertEq(f32[3964 >> 2], -0.4921875)
+assertEq(f32[3968 >> 2], -0.515625)
+assertEq(f32[3972 >> 2], -0.546875)
+assertEq(f32[3976 >> 2], -0.578125)
+assertEq(f32[3980 >> 2], -0.609375)
+assertEq(f32[3984 >> 2], -0.640625)
+assertEq(f32[3988 >> 2], -0.671875)
+assertEq(f32[3992 >> 2], -0.703125)
+assertEq(f32[3996 >> 2], -0.734375)
+assertEq(f32[4000 >> 2], -0.765625)
+assertEq(f32[4004 >> 2], -0.796875)
+assertEq(f32[4008 >> 2], -0.828125)
+assertEq(f32[4012 >> 2], -0.859375)
+assertEq(f32[4016 >> 2], -0.890625)
+assertEq(f32[4020 >> 2], -0.921875)
+assertEq(f32[4024 >> 2], -0.953125)
+assertEq(f32[4024 >> 2], -0.953125)
+assertEq(f32[4028 >> 2], -0.984375)
+assertEq(f32[4032 >> 2], -1.03125)
+assertEq(f32[4036 >> 2], -1.09375)
+assertEq(f32[4040 >> 2], -1.15625)
+assertEq(f32[4044 >> 2], -1.21875)
+assertEq(f32[4048 >> 2], -1.28125)
+assertEq(f32[4052 >> 2], -1.34375)
+assertEq(f32[4056 >> 2], -1.40625)
+assertEq(f32[4060 >> 2], -1.46875)
+assertEq(f32[4064 >> 2], -1.53125)
+assertEq(f32[4068 >> 2], -1.59375)
+assertEq(f32[4072 >> 2], -1.65625)
+assertEq(f32[4076 >> 2], -1.71875)
+assertEq(f32[4080 >> 2], -1.78125)
+assertEq(f32[4084 >> 2], -1.84375)
+assertEq(f32[4088 >> 2], -1.90625)
+assertEq(f32[4092 >> 2], -1.96875)
--- a/js/src/jit/arm/MacroAssembler-arm.cpp
+++ b/js/src/jit/arm/MacroAssembler-arm.cpp
@@ -1523,20 +1523,29 @@ MacroAssemblerARM::ma_vimm_f32(float val
     if (hasVFPv3()) {
         if (Float32Word(value) == 0) {
             // To zero a register, load 1.0, then execute sN <- sN - sN
             as_vimm(vd, VFPImm::one, cc);
             as_vsub(vd, vd, vd, cc);
             return;
         }
 
-        VFPImm enc(DoubleHighWord(double(value)));
-        if (enc.isValid()) {
-            as_vimm(vd, enc, cc);
-            return;
+        // Note that the vimm immediate float32 instruction encoding differs from the
+        // vimm immediate double encoding, but this difference matches the difference
+        // in the floating point formats, so it is possible to convert the float32 to
+        // a double and then use the double encoding paths.  It is still necessary to
+        // firstly check that the double low word is zero because some float32
+        // numbers set these bits and this can not be ignored.
+        double doubleValue = value;
+        if (DoubleLowWord(value) == 0) {
+            VFPImm enc(DoubleHighWord(doubleValue));
+            if (enc.isValid()) {
+                as_vimm(vd, enc, cc);
+                return;
+            }
         }
     }
     // Fall back to putting the value in a pool.
     as_FImm32Pool(vd, value, nullptr, cc);
 }
 
 void
 MacroAssemblerARM::ma_vcmp(FloatRegister src1, FloatRegister src2, Condition cc)
--- a/mobile/android/base/GeckoApp.java
+++ b/mobile/android/base/GeckoApp.java
@@ -107,18 +107,16 @@ import java.io.BufferedOutputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.HttpURLConnection;
 import java.net.URL;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -213,17 +211,17 @@ public abstract class GeckoApp
     private Telemetry.Timer mGeckoReadyStartupTimer;
 
     private String mPrivateBrowsingSession;
 
     private volatile HealthRecorder mHealthRecorder = null;
 
     private int mSignalStrenth;
     private PhoneStateListener mPhoneStateListener = null;
-    private boolean mShouldReportGeoData = false;
+    private boolean mShouldReportGeoData;
 
     abstract public int getLayout();
     abstract public boolean hasTabsSideBar();
     abstract protected String getDefaultProfileName();
 
     private static final String RESTARTER_ACTION = "org.mozilla.gecko.restart";
     private static final String RESTARTER_CLASS = "org.mozilla.gecko.Restarter";
 
@@ -2431,101 +2429,84 @@ public abstract class GeckoApp
                     obj.put("asu", nci.getRssi());
                     cellInfo.put(obj);
                 } catch(JSONException jsonex) {}
             }
         }
         return tm.getPhoneType();
     }
 
-
-    // copied from http://code.google.com/p/sensor-data-collection-library/source/browse/src/main/java/TextFileSensorLog.java#223,
-    // which is apache licensed
-    private static final Set<Character> AD_HOC_HEX_VALUES =
-      new HashSet<Character>(Arrays.asList('2','6', 'a', 'e', 'A', 'E'));
-    private static final String OPTOUT_SSID_SUFFIX = "_nomap";
-
     private static boolean shouldLog(final ScanResult sr) {
-        // We filter out any ad-hoc devices.  Ad-hoc devices are identified by having a
-        // 2,6,a or e in the second nybble.
-        // See http://en.wikipedia.org/wiki/MAC_address -- ad hoc networks
-        // have the last two bits of the second nybble set to 10.
-        // Only apply this test if we have exactly 17 character long BSSID which should
-        // be the case.
-        final char secondNybble = sr.BSSID.length() == 17 ? sr.BSSID.charAt(1) : ' ';
-
-        if(AD_HOC_HEX_VALUES.contains(secondNybble)) {
-            return false;
-
-        } else if (sr.SSID != null && sr.SSID.endsWith(OPTOUT_SSID_SUFFIX)) {
-            return false;
-        } else {
-            return true;
-        }
+        return sr.SSID == null || !sr.SSID.endsWith("_nomap");
     }
 
     private void collectAndReportLocInfo(Location location) {
         final JSONObject locInfo = new JSONObject();
         WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
         wm.startScan();
         try {
             JSONArray cellInfo = new JSONArray();
 
             String radioType = getRadioTypeName(getCellInfo(cellInfo));
             if (radioType != null) {
                 locInfo.put("radio", radioType);
             }
 
             locInfo.put("lon", location.getLongitude());
             locInfo.put("lat", location.getLatitude());
-            locInfo.put("accuracy", (int)location.getAccuracy());
-            locInfo.put("altitude", (int)location.getAltitude());
-            DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
+
+            // If we have an accuracy, round it up to the next meter.
+            if (location.hasAccuracy()) {
+                locInfo.put("accuracy", (int) Math.ceil(location.getAccuracy()));
+            }
+
+            // If we have an altitude, round it to the nearest meter.
+            if (location.hasAltitude()) {
+                locInfo.put("altitude", Math.round(location.getAltitude()));
+            }
+
+            // Reduce timestamp precision so as to expose less PII.
+            DateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
             locInfo.put("time", df.format(new Date(location.getTime())));
             locInfo.put("cell", cellInfo);
 
-            MessageDigest digest = MessageDigest.getInstance("SHA-1");
-
             JSONArray wifiInfo = new JSONArray();
             List<ScanResult> aps = wm.getScanResults();
             if (aps != null) {
                 for (ScanResult ap : aps) {
                     if (!shouldLog(ap))
                         continue;
-                    StringBuilder sb = new StringBuilder();
-                    try {
-                        byte[] result = digest.digest((ap.BSSID + ap.SSID).getBytes("UTF-8"));
-                        for (byte b : result) sb.append(String.format("%02X", b));
-
-                        JSONObject obj = new JSONObject();
-
-                        obj.put("key", sb.toString());
-                        obj.put("frequency", ap.frequency);
-                        obj.put("signal", ap.level);
-                        wifiInfo.put(obj);
-                    } catch (UnsupportedEncodingException uee) {
-                        Log.w(LOGTAG, "can't encode the key", uee);
-                    }
+
+                    JSONObject obj = new JSONObject();
+                    obj.put("key", ap.BSSID);
+                    obj.put("frequency", ap.frequency);
+                    obj.put("signal", ap.level);
+                    wifiInfo.put(obj);
                 }
             }
             locInfo.put("wifi", wifiInfo);
         } catch (JSONException jsonex) {
             Log.w(LOGTAG, "json exception", jsonex);
             return;
-        } catch (NoSuchAlgorithmException nsae) {
-            Log.w(LOGTAG, "can't create a SHA1", nsae);
         }
 
         ThreadUtils.postToBackgroundThread(new Runnable() {
             public void run() {
                 try {
                     URL url = new URL(LOCATION_URL);
                     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                     try {
                         urlConnection.setDoOutput(true);
+
+                        // Workaround for a bug in Android HttpURLConnection. When the library
+                        // reuses a stale connection, the connection may fail with an EOFException.
+                        if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT <= 18) {
+                            urlConnection.setRequestProperty("Connection", "Close");
+                        }
+
                         JSONArray batch = new JSONArray();
                         batch.put(locInfo);
                         JSONObject wrapper = new JSONObject();
                         wrapper.put("items", batch);
                         byte[] bytes = wrapper.toString().getBytes();
                         urlConnection.setFixedLengthStreamingMode(bytes.length);
                         OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
                         out.write(bytes);
--- a/toolkit/components/crashmonitor/moz.build
+++ b/toolkit/components/crashmonitor/moz.build
@@ -7,13 +7,10 @@
 XPCSHELL_TESTS_MANIFESTS += ['test/unit/xpcshell.ini']
 
 EXTRA_JS_MODULES = [
     'CrashMonitor.jsm',
 ]
 
 EXTRA_COMPONENTS += [
     'crashmonitor.manifest',
-]
-
-EXTRA_PP_COMPONENTS += [
     'nsCrashMonitor.js',
-]
+]
\ No newline at end of file
--- a/toolkit/content/contentAreaUtils.js
+++ b/toolkit/content/contentAreaUtils.js
@@ -1,15 +1,17 @@
 # -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- 
 # 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/.
 
 Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
 
+XPCOMUtils.defineLazyModuleGetter(this, "BrowserUtils",
+                                  "resource://gre/modules/BrowserUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "Downloads",
                                   "resource://gre/modules/Downloads.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "DownloadLastDir",
                                   "resource://gre/modules/DownloadLastDir.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "FileUtils",
                                   "resource://gre/modules/FileUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "OS",
                                   "resource://gre/modules/osfile.jsm");
@@ -30,66 +32,32 @@ var ContentAreaUtils = {
 
   get stringBundle() {
     delete this.stringBundle;
     return this.stringBundle =
       Services.strings.createBundle("chrome://global/locale/contentAreaCommands.properties");
   }
 }
 
-/**
- * urlSecurityCheck: JavaScript wrapper for checkLoadURIWithPrincipal
- * and checkLoadURIStrWithPrincipal.
- * If |aPrincipal| is not allowed to link to |aURL|, this function throws with
- * an error message.
- *
- * @param aURL
- *        The URL a page has linked to. This could be passed either as a string
- *        or as a nsIURI object.
- * @param aPrincipal
- *        The principal of the document from which aURL came.
- * @param aFlags
- *        Flags to be passed to checkLoadURIStr. If undefined,
- *        nsIScriptSecurityManager.STANDARD will be passed.
- */
 function urlSecurityCheck(aURL, aPrincipal, aFlags)
 {
-  var secMan = Services.scriptSecurityManager;
-  if (aFlags === undefined) {
-    aFlags = secMan.STANDARD;
-  }
-
-  try {
-    if (aURL instanceof Components.interfaces.nsIURI)
-      secMan.checkLoadURIWithPrincipal(aPrincipal, aURL, aFlags);
-    else
-      secMan.checkLoadURIStrWithPrincipal(aPrincipal, aURL, aFlags);
-  } catch (e) {
-    let principalStr = "";
-    try {
-      principalStr = " from " + aPrincipal.URI.spec;
-    }
-    catch(e2) { }
-
-    throw "Load of " + aURL + principalStr + " denied.";
-  }
+  return BrowserUtils.urlSecurityCheck(aURL, aPrincipal, aFlags);
 }
 
 /**
  * Determine whether or not a given focused DOMWindow is in the content area.
  **/
 function isContentFrame(aFocusedWindow)
 {
   if (!aFocusedWindow)
     return false;
 
   return (aFocusedWindow.top == window.content);
 }
 
-
 // Clientele: (Make sure you don't break any of these)
 //  - File    ->  Save Page/Frame As...
 //  - Context ->  Save Page/Frame As...
 //  - Context ->  Save Link As...
 //  - Alt-Click links in web pages
 //  - Alt-Click links in the UI
 //
 // Try saving each of these types:
@@ -832,31 +800,24 @@ function getPostData(aDocument)
 
 function makeWebBrowserPersist()
 {
   const persistContractID = "@mozilla.org/embedding/browser/nsWebBrowserPersist;1";
   const persistIID = Components.interfaces.nsIWebBrowserPersist;
   return Components.classes[persistContractID].createInstance(persistIID);
 }
 
-/**
- * Constructs a new URI, using nsIIOService.
- * @param aURL The URI spec.
- * @param aOriginCharset The charset of the URI.
- * @param aBaseURI Base URI to resolve aURL, or null.
- * @return an nsIURI object based on aURL.
- */
 function makeURI(aURL, aOriginCharset, aBaseURI)
 {
-  return Services.io.newURI(aURL, aOriginCharset, aBaseURI);
+  return BrowserUtils.makeURI(aURL, aOriginCharset, aBaseURI);
 }
 
 function makeFileURI(aFile)
 {
-  return Services.io.newFileURI(aFile);
+  return BrowserUtils.makeFileURI(aFile);
 }
 
 function makeFilePicker()
 {
   const fpContractID = "@mozilla.org/filepicker;1";
   const fpIID = Components.interfaces.nsIFilePicker;
   return Components.classes[fpContractID].createInstance(fpIID);
 }
new file mode 100644
--- /dev/null
+++ b/toolkit/modules/BrowserUtils.jsm
@@ -0,0 +1,67 @@
+/* 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/. */
+
+"use strict";
+
+this.EXPORTED_SYMBOLS = [ "BrowserUtils" ];
+
+const {interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+this.BrowserUtils = {
+
+  /**
+   * urlSecurityCheck: JavaScript wrapper for checkLoadURIWithPrincipal
+   * and checkLoadURIStrWithPrincipal.
+   * If |aPrincipal| is not allowed to link to |aURL|, this function throws with
+   * an error message.
+   *
+   * @param aURL
+   *        The URL a page has linked to. This could be passed either as a string
+   *        or as a nsIURI object.
+   * @param aPrincipal
+   *        The principal of the document from which aURL came.
+   * @param aFlags
+   *        Flags to be passed to checkLoadURIStr. If undefined,
+   *        nsIScriptSecurityManager.STANDARD will be passed.
+   */
+  urlSecurityCheck: function(aURL, aPrincipal, aFlags) {
+    var secMan = Services.scriptSecurityManager;
+    if (aFlags === undefined) {
+      aFlags = secMan.STANDARD;
+    }
+
+    try {
+      if (aURL instanceof Ci.nsIURI)
+        secMan.checkLoadURIWithPrincipal(aPrincipal, aURL, aFlags);
+      else
+        secMan.checkLoadURIStrWithPrincipal(aPrincipal, aURL, aFlags);
+    } catch (e) {
+      let principalStr = "";
+      try {
+        principalStr = " from " + aPrincipal.URI.spec;
+      }
+      catch(e2) { }
+
+      throw "Load of " + aURL + principalStr + " denied.";
+    }
+  },
+
+  /**
+   * Constructs a new URI, using nsIIOService.
+   * @param aURL The URI spec.
+   * @param aOriginCharset The charset of the URI.
+   * @param aBaseURI Base URI to resolve aURL, or null.
+   * @return an nsIURI object based on aURL.
+   */
+  makeURI: function(aURL, aOriginCharset, aBaseURI) {
+    return Services.io.newURI(aURL, aOriginCharset, aBaseURI);
+  },
+
+  makeFileURI: function(aFile) {
+    return Services.io.newFileURI(aFile);
+  },
+
+};
--- a/toolkit/modules/moz.build
+++ b/toolkit/modules/moz.build
@@ -6,16 +6,17 @@
 
 XPCSHELL_TESTS_MANIFESTS += ['tests/xpcshell/xpcshell.ini']
 BROWSER_CHROME_MANIFESTS += ['tests/browser/browser.ini']
 MOCHITEST_MANIFESTS += ['tests/mochitest/mochitest.ini']
 MOCHITEST_CHROME_MANIFESTS += ['tests/chrome/chrome.ini']
 
 EXTRA_JS_MODULES += [
     'AsyncShutdown.jsm',
+    'BrowserUtils.jsm',
     'CharsetMenu.jsm',
     'debug.js',
     'DeferredTask.jsm',
     'Deprecated.jsm',
     'Dict.jsm',
     'FileUtils.jsm',
     'Finder.jsm',
     'Geometry.jsm',