From bfb2b18a38dac765db7258250be5118237c428ec Mon Sep 17 00:00:00 2001 From: Rmys Date: Mon, 10 Jan 2022 19:02:53 +0300 Subject: [PATCH] firefox-96.0 --- ...preference-to-trigger-context-menu-o.patch | 203 - ...-SystemResourceMonitor.stop-more-res.patch | 117 - ...te-CK_GCM_PARAMS-uses-for-PKCS11-v3..patch | 70 - .../web/firefox/files/0001-bz-1521249.patch | 27006 ---------------- ...ement-browserSettings.contextMenuSho.patch | 254 - ...ate-packed_simd-to-compile-on-Rust-1.patch | 3514 -- ...missing-stub-for-wl_proxy_marshal_fl.patch | 28 - ...te-csd-window-offset-mozilla-1457691.patch | 614 - network/web/firefox/files/ffmpeg4.patch | 13720 -------- .../firefox/files/firefox-install-dir.patch | 13 - network/web/firefox/files/gtk3.patch | 1697 - network/web/firefox/files/icu58.patch | 60 - network/web/firefox/files/llvmversyon.patch | 33 - network/web/firefox/files/rhbz-966424.patch | 23 - network/web/firefox/files/rustc.patch | 12 - network/web/firefox/files/sed43.patch | 21 - network/web/firefox/pspec.xml | 11 +- 17 files changed, 9 insertions(+), 47387 deletions(-) delete mode 100644 network/web/firefox/files/0001-Bug-1360278-Add-preference-to-trigger-context-menu-o.patch delete mode 100755 network/web/firefox/files/0001-Bug-1384062-Make-SystemResourceMonitor.stop-more-res.patch delete mode 100644 network/web/firefox/files/0001-Bug-1624128-Update-CK_GCM_PARAMS-uses-for-PKCS11-v3..patch delete mode 100644 network/web/firefox/files/0001-bz-1521249.patch delete mode 100644 network/web/firefox/files/0002-Bug-1419426-Implement-browserSettings.contextMenuSho.patch delete mode 100644 network/web/firefox/files/0002-Bug-1667736-Update-packed_simd-to-compile-on-Rust-1.patch delete mode 100644 network/web/firefox/files/0002-Bug-1745560-Add-missing-stub-for-wl_proxy_marshal_fl.patch delete mode 100644 network/web/firefox/files/complete-csd-window-offset-mozilla-1457691.patch delete mode 100644 network/web/firefox/files/ffmpeg4.patch delete mode 100644 network/web/firefox/files/firefox-install-dir.patch delete mode 100644 network/web/firefox/files/gtk3.patch delete mode 100644 network/web/firefox/files/icu58.patch delete mode 100644 network/web/firefox/files/llvmversyon.patch delete mode 100644 network/web/firefox/files/rhbz-966424.patch delete mode 100644 network/web/firefox/files/rustc.patch delete mode 100644 network/web/firefox/files/sed43.patch diff --git a/network/web/firefox/files/0001-Bug-1360278-Add-preference-to-trigger-context-menu-o.patch b/network/web/firefox/files/0001-Bug-1360278-Add-preference-to-trigger-context-menu-o.patch deleted file mode 100644 index 4316680bf9..0000000000 --- a/network/web/firefox/files/0001-Bug-1360278-Add-preference-to-trigger-context-menu-o.patch +++ /dev/null @@ -1,203 +0,0 @@ -From 05ec1aa0d5e8806dd0c5c6d08c82846a1389b599 Mon Sep 17 00:00:00 2001 -Message-Id: <05ec1aa0d5e8806dd0c5c6d08c82846a1389b599.1512038840.git.jan.steffens@gmail.com> -From: Robin Grenet -Date: Thu, 16 Nov 2017 13:35:58 +0100 -Subject: [PATCH 1/2] Bug 1360278 - Add preference to trigger context menu on - mouse up for GTK+ and macOS, r=mstange,smaug - -MozReview-Commit-ID: Bg60bD8jIg6 - ---HG-- -extra : rebase_source : cc8bd5796096f49ad4fdab81885a426afd6117e4 ---- - modules/libpref/init/all.js | 4 ++++ - widget/cocoa/nsChildView.mm | 23 +++++++++++++++++++++-- - widget/gtk/nsWindow.cpp | 27 ++++++++++++++++++++------- - widget/gtk/nsWindow.h | 2 ++ - widget/nsBaseWidget.cpp | 16 ++++++++++++++++ - widget/nsBaseWidget.h | 6 ++++++ - 6 files changed, 69 insertions(+), 9 deletions(-) - -diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js -index 9febead1d363d792..7a6e6a20f3cc3fd6 100644 ---- a/modules/libpref/init/all.js -+++ b/modules/libpref/init/all.js -@@ -231,6 +231,10 @@ pref("browser.sessionhistory.max_total_viewers", -1); - - pref("ui.use_native_colors", true); - pref("ui.click_hold_context_menus", false); -+ -+// Pop up context menu on mouseup instead of mousedown, if that's the OS default. -+// Note: ignored on Windows (context menus always use mouseup) -+pref("ui.context_menus.after_mouseup", false); - // Duration of timeout of incremental search in menus (ms). 0 means infinite. - pref("ui.menu.incremental_search.timeout", 1000); - // If true, all popups won't hide automatically on blur -diff --git a/widget/cocoa/nsChildView.mm b/widget/cocoa/nsChildView.mm -index 25b4c1ba7a2d1207..2affd1ef386cbfd0 100644 ---- a/widget/cocoa/nsChildView.mm -+++ b/widget/cocoa/nsChildView.mm -@@ -4719,30 +4719,49 @@ NSEvent* gLastDragMouseDownEvent = nil; - if (!mGeckoChild) - return; - -- // Let the superclass do the context menu stuff. -- [super rightMouseDown:theEvent]; -+ if (!nsBaseWidget::ShowContextMenuAfterMouseUp()) { -+ // Let the superclass do the context menu stuff. -+ [super rightMouseDown:theEvent]; -+ } - - NS_OBJC_END_TRY_ABORT_BLOCK; - } - - - (void)rightMouseUp:(NSEvent *)theEvent - { - NS_OBJC_BEGIN_TRY_ABORT_BLOCK; - - if (!mGeckoChild) - return; - if (mTextInputHandler->OnHandleEvent(theEvent)) { - return; - } - - WidgetMouseEvent geckoEvent(true, eMouseUp, mGeckoChild, - WidgetMouseEvent::eReal); - [self convertCocoaMouseEvent:theEvent toGeckoEvent:&geckoEvent]; - geckoEvent.button = WidgetMouseEvent::eRightButton; - geckoEvent.mClickCount = [theEvent clickCount]; - - nsAutoRetainCocoaObject kungFuDeathGrip(self); - mGeckoChild->DispatchInputEvent(&geckoEvent); -+ if (!mGeckoChild) -+ return; -+ -+ if (nsBaseWidget::ShowContextMenuAfterMouseUp()) { -+ // Let the superclass do the context menu stuff, but pretend it's rightMouseDown. -+ NSEvent *dupeEvent = [NSEvent mouseEventWithType:NSRightMouseDown -+ location:theEvent.locationInWindow -+ modifierFlags:theEvent.modifierFlags -+ timestamp:theEvent.timestamp -+ windowNumber:theEvent.windowNumber -+ context:theEvent.context -+ eventNumber:theEvent.eventNumber -+ clickCount:theEvent.clickCount -+ pressure:theEvent.pressure]; -+ -+ [super rightMouseDown:dupeEvent]; -+ } - - NS_OBJC_END_TRY_ABORT_BLOCK; - } -diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp -index 37b6aae4c3d0b4e7..2b80124538c20ed6 100644 ---- a/widget/gtk/nsWindow.cpp -+++ b/widget/gtk/nsWindow.cpp -@@ -2727,6 +2727,19 @@ static guint ButtonMaskFromGDKButton(guint button) - return GDK_BUTTON1_MASK << (button - 1); - } - -+void -+nsWindow::DispatchContextMenuEventFromMouseEvent(uint16_t domButton, -+ GdkEventButton *aEvent) -+{ -+ if (domButton == WidgetMouseEvent::eRightButton && MOZ_LIKELY(!mIsDestroyed)) { -+ WidgetMouseEvent contextMenuEvent(true, eContextMenu, this, -+ WidgetMouseEvent::eReal); -+ InitButtonEvent(contextMenuEvent, aEvent); -+ contextMenuEvent.pressure = mLastMotionPressure; -+ DispatchInputEvent(&contextMenuEvent); -+ } -+} -+ - void - nsWindow::OnButtonPressEvent(GdkEventButton *aEvent) - { -@@ -2796,13 +2809,8 @@ nsWindow::OnButtonPressEvent(GdkEventButton *aEvent) - DispatchInputEvent(&event); - - // right menu click on linux should also pop up a context menu -- if (domButton == WidgetMouseEvent::eRightButton && -- MOZ_LIKELY(!mIsDestroyed)) { -- WidgetMouseEvent contextMenuEvent(true, eContextMenu, this, -- WidgetMouseEvent::eReal); -- InitButtonEvent(contextMenuEvent, aEvent); -- contextMenuEvent.pressure = mLastMotionPressure; -- DispatchInputEvent(&contextMenuEvent); -+ if (!nsBaseWidget::ShowContextMenuAfterMouseUp()) { -+ DispatchContextMenuEventFromMouseEvent(domButton, aEvent); - } - } - -@@ -2838,6 +2846,11 @@ nsWindow::OnButtonReleaseEvent(GdkEventButton *aEvent) - - DispatchInputEvent(&event); - mLastMotionPressure = pressure; -+ -+ // right menu click on linux should also pop up a context menu -+ if (nsBaseWidget::ShowContextMenuAfterMouseUp()) { -+ DispatchContextMenuEventFromMouseEvent(domButton, aEvent); -+ } - } - - void -diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h -index f7c07d57491b0b83..b969c9db4306ba6a 100644 ---- a/widget/gtk/nsWindow.h -+++ b/widget/gtk/nsWindow.h -@@ -245,6 +245,8 @@ private: - - void UpdateClientOffset(); - -+ void DispatchContextMenuEventFromMouseEvent(uint16_t domButton, -+ GdkEventButton *aEvent); - public: - void ThemeChanged(void); - void OnDPIChanged(void); -diff --git a/widget/nsBaseWidget.cpp b/widget/nsBaseWidget.cpp -index 996409f45db11cc7..de73fe36d27955cd 100644 ---- a/widget/nsBaseWidget.cpp -+++ b/widget/nsBaseWidget.cpp -@@ -1222,6 +1222,22 @@ nsBaseWidget::DispatchEventToAPZOnly(mozilla::WidgetInputEvent* aEvent) - } - } - -+// static -+bool -+nsBaseWidget::ShowContextMenuAfterMouseUp() -+{ -+ static bool gContextMenuAfterMouseUp = false; -+ static bool gContextMenuAfterMouseUpCached = false; -+ if (!gContextMenuAfterMouseUpCached) { -+ Preferences::AddBoolVarCache(&gContextMenuAfterMouseUp, -+ "ui.context_menus.after_mouseup", -+ false); -+ -+ gContextMenuAfterMouseUpCached = true; -+ } -+ return gContextMenuAfterMouseUp; -+} -+ - nsIDocument* - nsBaseWidget::GetDocument() const - { -diff --git a/widget/nsBaseWidget.h b/widget/nsBaseWidget.h -index 6d6b93ea73d64b38..cdc6aa0c87279832 100644 ---- a/widget/nsBaseWidget.h -+++ b/widget/nsBaseWidget.h -@@ -418,6 +418,12 @@ public: - void RecvScreenPixels(mozilla::ipc::Shmem&& aMem, const ScreenIntSize& aSize) override {}; - #endif - -+ /** -+ * Whether context menus should only appear on mouseup instead of mousedown, -+ * on OSes where they normally appear on mousedown (macOS, *nix). -+ */ -+ static bool ShowContextMenuAfterMouseUp(); -+ - protected: - // These are methods for CompositorWidgetWrapper, and should only be - // accessed from that class. Derived widgets can choose which methods to --- -2.15.1 - diff --git a/network/web/firefox/files/0001-Bug-1384062-Make-SystemResourceMonitor.stop-more-res.patch b/network/web/firefox/files/0001-Bug-1384062-Make-SystemResourceMonitor.stop-more-res.patch deleted file mode 100755 index 58d029bde3..0000000000 --- a/network/web/firefox/files/0001-Bug-1384062-Make-SystemResourceMonitor.stop-more-res.patch +++ /dev/null @@ -1,117 +0,0 @@ -From 2874ecd82e9671f774bdfda41fe0857fcb916c13 Mon Sep 17 00:00:00 2001 -Message-Id: <2874ecd82e9671f774bdfda41fe0857fcb916c13.1506634385.git.jan.steffens@gmail.com> -From: Mike Hommey -Date: Wed, 16 Aug 2017 13:16:16 +0900 -Subject: [PATCH] Bug 1384062 - Make SystemResourceMonitor.stop more resilient - to errors. r=ahal,gps - -The poll() call in SystemResourceMonitor.stop might fail even though -there is something to read from the pipe, in some corner cases, and -python won't let us know about it. In that case, an exception is thrown, -leaving the SystemResourceMonitor (and its callers) in a weird state. In -practice, this leads BuildMonitor.__exit__ to recall stop, which then -fails. - -So when poll() throws an exception, we pretend there's still something -to read, and we try to read anyways. If there is something to read, -recv() will return it, otherwise, it will throw an exception of its own, -which we catch, pretending we're done. - -Furthermore, when there is nothing to read from the pipe, poll() simply -returns False, and our loop never sets `done` to True, and we then hit -an assert, which doesn't have its place here, so we remove it. - -Finally, the other end of the pipe might have died at any time, making -sending over the pipe fail, so we also protect against that. - -With all these changes, it feels like the reason to backout bug 1239939 -in bug 1272782 should have been dealt with, and we can drop the timeout -again. - ---HG-- -extra : rebase_source : ac72dd5b2602cf3ffddfb429f95e02380f939893 ---- - .../mozsystemmonitor/resourcemonitor.py | 38 +++++++++++++++------- - 1 file changed, 26 insertions(+), 12 deletions(-) - -diff --git a/testing/mozbase/mozsystemmonitor/mozsystemmonitor/resourcemonitor.py b/testing/mozbase/mozsystemmonitor/mozsystemmonitor/resourcemonitor.py -index 8f2ac95cbe505540..38f9bc986ac2a120 100644 ---- a/testing/mozbase/mozsystemmonitor/mozsystemmonitor/resourcemonitor.py -+++ b/testing/mozbase/mozsystemmonitor/mozsystemmonitor/resourcemonitor.py -@@ -289,47 +289,61 @@ class SystemResourceMonitor(object): - assert self._running - assert not self._stopped - -- self._pipe.send(('terminate',)) -+ try: -+ self._pipe.send(('terminate',)) -+ except Exception: -+ pass - self._running = False - self._stopped = True - - self.measurements = [] - -- done = False -- - # The child process will send each data sample over the pipe - # as a separate data structure. When it has finished sending - # samples, it sends a special "done" message to indicate it - # is finished. -- while self._pipe.poll(1.0): -- start_time, end_time, io_diff, cpu_diff, cpu_percent, virt_mem, \ -- swap_mem = self._pipe.recv() -+ -+ # multiprocessing.Pipe is not actually a pipe on at least Linux. that -+ # has an effect on the expected outcome of reading from it when the -+ # other end of the pipe dies, leading to possibly hanging on revc() -+ # below. So we must poll(). -+ def poll(): -+ try: -+ return self._pipe.poll(0.1) -+ except Exception: -+ # Poll might throw an exception even though there's still -+ # data to read. That happens when the underlying system call -+ # returns both POLLERR and POLLIN, but python doesn't tell us -+ # about it. So assume there is something to read, and we'll -+ # get an exception when trying to read the data. -+ return True -+ while poll(): -+ try: -+ start_time, end_time, io_diff, cpu_diff, cpu_percent, virt_mem, \ -+ swap_mem = self._pipe.recv() -+ except Exception: -+ # Let's assume we're done here -+ break - - # There should be nothing after the "done" message so - # terminate. - if start_time == 'done': -- done = True - break - - io = self._io_type(*io_diff) - virt = self._virt_type(*virt_mem) - swap = self._swap_type(*swap_mem) - cpu_times = [self._cpu_times_type(*v) for v in cpu_diff] - - self.measurements.append(SystemResourceUsage(start_time, end_time, - cpu_times, cpu_percent, io, virt, swap)) - - # We establish a timeout so we don't hang forever if the child - # process has crashed. - self._process.join(10) - if self._process.is_alive(): - self._process.terminate() - self._process.join(10) -- else: -- # We should have received a "done" message from the -- # child indicating it shut down properly. This only -- # happens if the child shuts down cleanly. -- assert done - - if len(self.measurements): - self.start_time = self.measurements[0].start --- -2.14.2 - diff --git a/network/web/firefox/files/0001-Bug-1624128-Update-CK_GCM_PARAMS-uses-for-PKCS11-v3..patch b/network/web/firefox/files/0001-Bug-1624128-Update-CK_GCM_PARAMS-uses-for-PKCS11-v3..patch deleted file mode 100644 index 99c05bb2bb..0000000000 --- a/network/web/firefox/files/0001-Bug-1624128-Update-CK_GCM_PARAMS-uses-for-PKCS11-v3..patch +++ /dev/null @@ -1,70 +0,0 @@ -From c3acffdb8e0cd46561d2c5131227dc92967cf3d2 Mon Sep 17 00:00:00 2001 -From: Kevin Jacobs -Date: Tue, 14 Apr 2020 18:32:19 +0000 -Subject: [PATCH] Bug 1624128 - Update CK_GCM_PARAMS uses for PKCS11 v3.0 - definition r=keeler - -This patch initializes the ulIvBits member of CK_GCM_PARAMS, which is new in PKCS11 v3. - -For libprio, we instead define NSS_PKCS11_2_0_COMPAT, which yields the old struct definition. - -Differential Revision: https://phabricator.services.mozilla.com/D67740 ---- - dom/crypto/WebCryptoTask.cpp | 1 + - netwerk/srtp/src/crypto/cipher/aes_gcm_nss.c | 1 + - security/manager/ssl/OSKeyStore.cpp | 1 + - third_party/prio/moz.build | 5 +++++ - 4 files changed, 8 insertions(+) - -diff --git a/dom/crypto/WebCryptoTask.cpp b/dom/crypto/WebCryptoTask.cpp -index ad0d1432738f..60a265972d21 100644 ---- a/dom/crypto/WebCryptoTask.cpp -+++ b/dom/crypto/WebCryptoTask.cpp -@@ -600,6 +600,7 @@ class AesTask : public ReturnArrayBufferViewTask, public DeferredData { - case CKM_AES_GCM: - gcmParams.pIv = mIv.Elements(); - gcmParams.ulIvLen = mIv.Length(); -+ gcmParams.ulIvBits = gcmParams.ulIvLen * 8; - gcmParams.pAAD = mAad.Elements(); - gcmParams.ulAADLen = mAad.Length(); - gcmParams.ulTagBits = mTagLength; -diff --git a/netwerk/srtp/src/crypto/cipher/aes_gcm_nss.c b/netwerk/srtp/src/crypto/cipher/aes_gcm_nss.c -index e1fdbe36fbf8..2be2ce932ddf 100644 ---- a/netwerk/srtp/src/crypto/cipher/aes_gcm_nss.c -+++ b/netwerk/srtp/src/crypto/cipher/aes_gcm_nss.c -@@ -271,6 +271,7 @@ static srtp_err_status_t srtp_aes_gcm_nss_do_crypto(void *cv, - - c->params.pIv = c->iv; - c->params.ulIvLen = GCM_IV_LEN; -+ c->params.ulIvBits = GCM_IV_LEN * 8; - c->params.pAAD = c->aad; - c->params.ulAADLen = c->aad_size; - -diff --git a/security/manager/ssl/OSKeyStore.cpp b/security/manager/ssl/OSKeyStore.cpp -index 00bc918c5fdd..c83a559d9c1e 100644 ---- a/security/manager/ssl/OSKeyStore.cpp -+++ b/security/manager/ssl/OSKeyStore.cpp -@@ -663,6 +663,7 @@ nsresult AbstractOSKeyStore::DoCipher(const UniquePK11SymKey& aSymKey, - CK_GCM_PARAMS gcm_params; - gcm_params.pIv = const_cast(ivp); - gcm_params.ulIvLen = mIVLength; -+ gcm_params.ulIvBits = gcm_params.ulIvLen * 8; - gcm_params.ulTagBits = 128; - gcm_params.pAAD = nullptr; - gcm_params.ulAADLen = 0; -diff --git a/third_party/prio/moz.build b/third_party/prio/moz.build -index 3e10fe71ce8e..0a6e3c74a269 100644 ---- a/third_party/prio/moz.build -+++ b/third_party/prio/moz.build -@@ -42,3 +42,8 @@ SOURCES += [ - ] - - FINAL_LIBRARY = 'xul' -+ -+# Use PKCS11 v2 struct definitions for now, otherwise NSS requires -+# CK_GCM_PARAMS.ulIvBits to be set. This workaround is only required -+# until NSS 3.52 RTM and upstream correctly initializes the field. -+DEFINES['NSS_PKCS11_2_0_COMPAT'] = True --- -2.26.2 - diff --git a/network/web/firefox/files/0001-bz-1521249.patch b/network/web/firefox/files/0001-bz-1521249.patch deleted file mode 100644 index fa5892b509..0000000000 --- a/network/web/firefox/files/0001-bz-1521249.patch +++ /dev/null @@ -1,27006 +0,0 @@ -From 3b9c2a82009be75797a67293fc70cec81a2ea179 Mon Sep 17 00:00:00 2001 -Message-Id: <3b9c2a82009be75797a67293fc70cec81a2ea179.1558465095.git.jan.steffens@gmail.com> -From: "Jan Alexander Steffens (heftig)" -Date: Tue, 21 May 2019 20:57:25 +0200 -Subject: [PATCH] bz 1521249 - -https://bugzilla.mozilla.org/show_bug.cgi?id=1521249 - -Squashed commit of the following: - -commit e5b0d808797892e60766beb225a2440162fedbb3 -Author: Henri Sivonen -Date: Sat Mar 23 14:17:35 2019 +0000 - - Bug 1521249 part 2 - Make packed_simd compile with Rust 1.32 and later. r=glandium - - This adds the Firefox-required build.rs hack and reverts the commit - that added bitmasks in a way that depends on Rust 1.34 compiler - internals. - - Depends on D20288 - - Differential Revision: https://phabricator.services.mozilla.com/D20289 - -commit 5ec872f24d15a671d36d4bce186fcaebcd27776c -Author: Henri Sivonen -Date: Sat Mar 23 14:17:35 2019 +0000 - - Bug 1521249 part 1 - Update encoding_rs to 0.8.16. r=glandium - - This changeset requires nightly Rust (to be changed in the next part). - - Depends on D21891 - - Differential Revision: https://phabricator.services.mozilla.com/D20288 - -commit d4181e4196f1f971b73a46e7ef814adbe7fa338a -Author: Henri Sivonen -Date: Sat Mar 23 14:17:35 2019 +0000 - - Bug 1521249 part 0 - Remove Rust version cap from --enable-rust-simd. r=glandium - - Differential Revision: https://phabricator.services.mozilla.com/D21891 ---- - .cargo/config.in | 5 + - Cargo.lock | 55 +- - Cargo.toml | 1 + - third_party/rust/cfg-if/.cargo-checksum.json | 2 +- - third_party/rust/cfg-if/Cargo.toml | 30 +- - third_party/rust/cfg-if/README.md | 18 +- - third_party/rust/cfg-if/src/lib.rs | 53 +- - .../rust/encoding_rs/.cargo-checksum.json | 2 +- - third_party/rust/encoding_rs/Cargo.toml | 12 +- - third_party/rust/encoding_rs/README.md | 50 +- - third_party/rust/encoding_rs/build.rs | 8 + - third_party/rust/encoding_rs/src/handles.rs | 2 +- - third_party/rust/encoding_rs/src/lib.rs | 7 +- - third_party/rust/encoding_rs/src/mem.rs | 24 +- - .../rust/encoding_rs/src/simd_funcs.rs | 93 +- - .../rust/encoding_rs/src/x_user_defined.rs | 7 +- - third_party/rust/packed_simd/.appveyor.yml | 59 + - .../rust/packed_simd/.cargo-checksum.json | 1 + - third_party/rust/packed_simd/.travis.yml | 308 ++++ - third_party/rust/packed_simd/Cargo.toml | 42 + - .../rust/{simd => packed_simd}/LICENSE-APACHE | 0 - .../rust/{simd => packed_simd}/LICENSE-MIT | 4 +- - third_party/rust/packed_simd/bors.toml | 3 + - third_party/rust/packed_simd/build.rs | 8 + - third_party/rust/packed_simd/ci/all.sh | 71 + - .../packed_simd/ci/android-install-ndk.sh | 37 + - .../packed_simd/ci/android-install-sdk.sh | 60 + - .../rust/packed_simd/ci/android-sysimage.sh | 56 + - third_party/rust/packed_simd/ci/benchmark.sh | 32 + - .../ci/deploy_and_run_on_ios_simulator.rs | 176 +++ - .../docker/aarch64-linux-android/Dockerfile | 47 + - .../aarch64-unknown-linux-gnu/Dockerfile | 14 + - .../docker/arm-linux-androideabi/Dockerfile | 47 + - .../arm-unknown-linux-gnueabi/Dockerfile | 15 + - .../arm-unknown-linux-gnueabihf/Dockerfile | 13 + - .../armv7-unknown-linux-gnueabihf/Dockerfile | 13 + - .../docker/i586-unknown-linux-gnu/Dockerfile | 7 + - .../docker/i686-unknown-linux-gnu/Dockerfile | 7 + - .../docker/mips-unknown-linux-gnu/Dockerfile | 13 + - .../mips64-unknown-linux-gnuabi64/Dockerfile | 10 + - .../Dockerfile | 10 + - .../mipsel-unknown-linux-musl/Dockerfile | 25 + - .../powerpc-unknown-linux-gnu/Dockerfile | 12 + - .../powerpc64-unknown-linux-gnu/Dockerfile | 17 + - .../powerpc64le-unknown-linux-gnu/Dockerfile | 11 + - .../docker/s390x-unknown-linux-gnu/Dockerfile | 20 + - .../sparc64-unknown-linux-gnu/Dockerfile | 18 + - .../thumbv7neon-linux-androideabi/Dockerfile | 47 + - .../Dockerfile | 13 + - .../docker/wasm32-unknown-unknown/Dockerfile | 37 + - .../ci/docker/x86_64-linux-android/Dockerfile | 29 + - .../Dockerfile | 16 + - .../x86_64-unknown-linux-gnu/Dockerfile | 10 + - third_party/rust/packed_simd/ci/dox.sh | 24 + - .../rust/packed_simd/ci/linux-s390x.sh | 18 + - .../rust/packed_simd/ci/linux-sparc64.sh | 17 + - third_party/rust/packed_simd/ci/lld-shim.rs | 11 + - .../rust/packed_simd/ci/max_line_width.sh | 17 + - third_party/rust/packed_simd/ci/run-docker.sh | 38 + - third_party/rust/packed_simd/ci/run.sh | 96 ++ - .../rust/packed_simd/ci/run_examples.sh | 51 + - .../rust/packed_simd/ci/runtest-android.rs | 45 + - .../rust/packed_simd/ci/setup_benchmarks.sh | 10 + - .../rust/packed_simd/ci/test-runner-linux | 24 + - third_party/rust/packed_simd/contributing.md | 67 + - .../rust/packed_simd/perf-guide/.gitignore | 1 + - .../rust/packed_simd/perf-guide/book.toml | 12 + - .../packed_simd/perf-guide/src/SUMMARY.md | 21 + - .../rust/packed_simd/perf-guide/src/ascii.css | 4 + - .../perf-guide/src/bound_checks.md | 22 + - .../perf-guide/src/float-math/approx.md | 8 + - .../perf-guide/src/float-math/fma.md | 6 + - .../perf-guide/src/float-math/fp.md | 3 + - .../perf-guide/src/float-math/svml.md | 7 + - .../perf-guide/src/introduction.md | 26 + - .../packed_simd/perf-guide/src/prof/linux.md | 107 ++ - .../packed_simd/perf-guide/src/prof/mca.md | 100 ++ - .../perf-guide/src/prof/profiling.md | 14 + - .../src/target-feature/attribute.md | 5 + - .../perf-guide/src/target-feature/features.md | 13 + - .../perf-guide/src/target-feature/inlining.md | 5 + - .../perf-guide/src/target-feature/practice.md | 31 + - .../perf-guide/src/target-feature/runtime.md | 5 + - .../src/target-feature/rustflags.md | 77 + - .../perf-guide/src/vert-hor-ops.md | 76 + - third_party/rust/packed_simd/readme.md | 182 +++ - third_party/rust/packed_simd/rustfmt.toml | 7 + - third_party/rust/packed_simd/src/api.rs | 301 ++++ - .../rust/packed_simd/src/api/bit_manip.rs | 128 ++ - third_party/rust/packed_simd/src/api/cast.rs | 108 ++ - .../rust/packed_simd/src/api/cast/macros.rs | 82 + - .../rust/packed_simd/src/api/cast/v128.rs | 79 + - .../rust/packed_simd/src/api/cast/v16.rs | 17 + - .../rust/packed_simd/src/api/cast/v256.rs | 81 + - .../rust/packed_simd/src/api/cast/v32.rs | 30 + - .../rust/packed_simd/src/api/cast/v512.rs | 68 + - .../rust/packed_simd/src/api/cast/v64.rs | 47 + - third_party/rust/packed_simd/src/api/cmp.rs | 16 + - .../rust/packed_simd/src/api/cmp/eq.rs | 27 + - .../rust/packed_simd/src/api/cmp/ord.rs | 43 + - .../packed_simd/src/api/cmp/partial_eq.rs | 67 + - .../packed_simd/src/api/cmp/partial_ord.rs | 234 +++ - .../rust/packed_simd/src/api/cmp/vertical.rs | 114 ++ - .../rust/packed_simd/src/api/default.rs | 28 + - third_party/rust/packed_simd/src/api/fmt.rs | 12 + - .../rust/packed_simd/src/api/fmt/binary.rs | 56 + - .../rust/packed_simd/src/api/fmt/debug.rs | 62 + - .../rust/packed_simd/src/api/fmt/lower_hex.rs | 56 + - .../rust/packed_simd/src/api/fmt/octal.rs | 56 + - .../rust/packed_simd/src/api/fmt/upper_hex.rs | 56 + - third_party/rust/packed_simd/src/api/from.rs | 7 + - .../packed_simd/src/api/from/from_array.rs | 121 ++ - .../packed_simd/src/api/from/from_vector.rs | 67 + - third_party/rust/packed_simd/src/api/hash.rs | 47 + - .../rust/packed_simd/src/api/into_bits.rs | 59 + - .../src/api/into_bits/arch_specific.rs | 190 +++ - .../packed_simd/src/api/into_bits/macros.rs | 74 + - .../packed_simd/src/api/into_bits/v128.rs | 28 + - .../rust/packed_simd/src/api/into_bits/v16.rs | 9 + - .../packed_simd/src/api/into_bits/v256.rs | 27 + - .../rust/packed_simd/src/api/into_bits/v32.rs | 13 + - .../packed_simd/src/api/into_bits/v512.rs | 27 + - .../rust/packed_simd/src/api/into_bits/v64.rs | 18 + - third_party/rust/packed_simd/src/api/math.rs | 4 + - .../rust/packed_simd/src/api/math/float.rs | 61 + - .../packed_simd/src/api/math/float/abs.rs | 31 + - .../packed_simd/src/api/math/float/consts.rs | 86 + - .../packed_simd/src/api/math/float/cos.rs | 44 + - .../packed_simd/src/api/math/float/exp.rs | 33 + - .../rust/packed_simd/src/api/math/float/ln.rs | 33 + - .../packed_simd/src/api/math/float/mul_add.rs | 44 + - .../src/api/math/float/mul_adde.rs | 48 + - .../packed_simd/src/api/math/float/powf.rs | 36 + - .../packed_simd/src/api/math/float/recpre.rs | 36 + - .../packed_simd/src/api/math/float/rsqrte.rs | 40 + - .../packed_simd/src/api/math/float/sin.rs | 50 + - .../packed_simd/src/api/math/float/sqrt.rs | 35 + - .../packed_simd/src/api/math/float/sqrte.rs | 44 + - .../rust/packed_simd/src/api/minimal.rs | 6 + - .../rust/packed_simd/src/api/minimal/iuf.rs | 167 ++ - .../rust/packed_simd/src/api/minimal/mask.rs | 174 +++ - .../rust/packed_simd/src/api/minimal/ptr.rs | 1385 +++++++++++++++++ - third_party/rust/packed_simd/src/api/ops.rs | 32 + - .../src/api/ops/scalar_arithmetic.rs | 203 +++ - .../packed_simd/src/api/ops/scalar_bitwise.rs | 162 ++ - .../src/api/ops/scalar_mask_bitwise.rs | 140 ++ - .../packed_simd/src/api/ops/scalar_shifts.rs | 107 ++ - .../src/api/ops/vector_arithmetic.rs | 148 ++ - .../packed_simd/src/api/ops/vector_bitwise.rs | 129 ++ - .../src/api/ops/vector_float_min_max.rs | 69 + - .../src/api/ops/vector_int_min_max.rs | 57 + - .../src/api/ops/vector_mask_bitwise.rs | 116 ++ - .../packed_simd/src/api/ops/vector_neg.rs | 43 + - .../packed_simd/src/api/ops/vector_rotates.rs | 90 ++ - .../packed_simd/src/api/ops/vector_shifts.rs | 107 ++ - third_party/rust/packed_simd/src/api/ptr.rs | 4 + - .../packed_simd/src/api/ptr/gather_scatter.rs | 241 +++ - .../rust/packed_simd/src/api/reductions.rs | 12 + - .../packed_simd/src/api/reductions/bitwise.rs | 151 ++ - .../src/api/reductions/float_arithmetic.rs | 312 ++++ - .../src/api/reductions/integer_arithmetic.rs | 197 +++ - .../packed_simd/src/api/reductions/mask.rs | 89 ++ - .../packed_simd/src/api/reductions/min_max.rs | 377 +++++ - .../rust/packed_simd/src/api/select.rs | 75 + - .../rust/packed_simd/src/api/shuffle.rs | 190 +++ - .../rust/packed_simd/src/api/shuffle1_dyn.rs | 159 ++ - third_party/rust/packed_simd/src/api/slice.rs | 7 + - .../packed_simd/src/api/slice/from_slice.rs | 216 +++ - .../src/api/slice/write_to_slice.rs | 211 +++ - .../rust/packed_simd/src/api/swap_bytes.rs | 192 +++ - third_party/rust/packed_simd/src/codegen.rs | 59 + - .../rust/packed_simd/src/codegen/bit_manip.rs | 354 +++++ - .../rust/packed_simd/src/codegen/llvm.rs | 99 ++ - .../rust/packed_simd/src/codegen/math.rs | 3 + - .../packed_simd/src/codegen/math/float.rs | 18 + - .../packed_simd/src/codegen/math/float/abs.rs | 103 ++ - .../packed_simd/src/codegen/math/float/cos.rs | 103 ++ - .../src/codegen/math/float/cos_pi.rs | 87 ++ - .../packed_simd/src/codegen/math/float/exp.rs | 112 ++ - .../packed_simd/src/codegen/math/float/ln.rs | 112 ++ - .../src/codegen/math/float/macros.rs | 559 +++++++ - .../src/codegen/math/float/mul_add.rs | 109 ++ - .../src/codegen/math/float/mul_adde.rs | 66 + - .../src/codegen/math/float/powf.rs | 112 ++ - .../packed_simd/src/codegen/math/float/sin.rs | 103 ++ - .../src/codegen/math/float/sin_cos_pi.rs | 195 +++ - .../src/codegen/math/float/sin_pi.rs | 87 ++ - .../src/codegen/math/float/sqrt.rs | 103 ++ - .../src/codegen/math/float/sqrte.rs | 67 + - .../src/codegen/pointer_sized_int.rs | 28 + - .../packed_simd/src/codegen/reductions.rs | 1 + - .../src/codegen/reductions/mask.rs | 69 + - .../src/codegen/reductions/mask/aarch64.rs | 71 + - .../src/codegen/reductions/mask/arm.rs | 54 + - .../src/codegen/reductions/mask/fallback.rs | 6 + - .../codegen/reductions/mask/fallback_impl.rs | 237 +++ - .../src/codegen/reductions/mask/x86.rs | 194 +++ - .../src/codegen/reductions/mask/x86/avx.rs | 101 ++ - .../src/codegen/reductions/mask/x86/avx2.rs | 35 + - .../src/codegen/reductions/mask/x86/sse.rs | 68 + - .../src/codegen/reductions/mask/x86/sse2.rs | 70 + - .../rust/packed_simd/src/codegen/shuffle.rs | 302 ++++ - .../packed_simd/src/codegen/shuffle1_dyn.rs | 432 +++++ - .../packed_simd/src/codegen/swap_bytes.rs | 189 +++ - .../rust/packed_simd/src/codegen/v128.rs | 46 + - .../rust/packed_simd/src/codegen/v16.rs | 7 + - .../rust/packed_simd/src/codegen/v256.rs | 78 + - .../rust/packed_simd/src/codegen/v32.rs | 11 + - .../rust/packed_simd/src/codegen/v512.rs | 145 ++ - .../rust/packed_simd/src/codegen/v64.rs | 21 + - .../rust/packed_simd/src/codegen/vPtr.rs | 33 + - .../rust/packed_simd/src/codegen/vSize.rs | 43 + - third_party/rust/packed_simd/src/lib.rs | 327 ++++ - third_party/rust/packed_simd/src/masks.rs | 128 ++ - third_party/rust/packed_simd/src/sealed.rs | 41 + - third_party/rust/packed_simd/src/testing.rs | 8 + - .../rust/packed_simd/src/testing/macros.rs | 44 + - .../rust/packed_simd/src/testing/utils.rs | 135 ++ - third_party/rust/packed_simd/src/v128.rs | 80 + - third_party/rust/packed_simd/src/v16.rs | 16 + - third_party/rust/packed_simd/src/v256.rs | 86 + - third_party/rust/packed_simd/src/v32.rs | 29 + - third_party/rust/packed_simd/src/v512.rs | 99 ++ - third_party/rust/packed_simd/src/v64.rs | 66 + - third_party/rust/packed_simd/src/vPtr.rs | 34 + - third_party/rust/packed_simd/src/vSize.rs | 53 + - .../rust/packed_simd/tests/endianness.rs | 262 ++++ - third_party/rust/simd/.cargo-checksum.json | 1 - - third_party/rust/simd/Cargo.toml | 37 - - third_party/rust/simd/README.md | 11 - - third_party/rust/simd/benches/mandelbrot.rs | 117 -- - third_party/rust/simd/benches/matrix.rs | 485 ------ - third_party/rust/simd/build.rs | 3 - - third_party/rust/simd/examples/axpy.rs | 65 - - third_party/rust/simd/examples/convert.rs | 38 - - third_party/rust/simd/examples/dot-product.rs | 60 - - .../simd/examples/fannkuch-redux-nosimd.rs | 156 -- - .../rust/simd/examples/fannkuch-redux.rs | 233 --- - third_party/rust/simd/examples/mandelbrot.rs | 125 -- - .../rust/simd/examples/matrix-inverse.rs | 281 ---- - .../rust/simd/examples/nbody-nosimd.rs | 156 -- - third_party/rust/simd/examples/nbody.rs | 170 -- - third_party/rust/simd/examples/ops.rs | 10 - - .../simd/examples/spectral-norm-nosimd.rs | 106 -- - .../rust/simd/examples/spectral-norm.rs | 74 - - third_party/rust/simd/src/aarch64/mod.rs | 3 - - third_party/rust/simd/src/aarch64/neon.rs | 681 -------- - third_party/rust/simd/src/arm/mod.rs | 4 - - third_party/rust/simd/src/arm/neon.rs | 622 -------- - third_party/rust/simd/src/common.rs | 520 ------- - third_party/rust/simd/src/lib.rs | 804 ---------- - third_party/rust/simd/src/sixty_four.rs | 228 --- - third_party/rust/simd/src/v256.rs | 436 ------ - third_party/rust/simd/src/x86/avx.rs | 290 ---- - third_party/rust/simd/src/x86/avx2.rs | 65 - - third_party/rust/simd/src/x86/mod.rs | 16 - - third_party/rust/simd/src/x86/sse2.rs | 359 ----- - third_party/rust/simd/src/x86/sse3.rs | 57 - - third_party/rust/simd/src/x86/sse4_1.rs | 155 -- - third_party/rust/simd/src/x86/sse4_2.rs | 19 - - third_party/rust/simd/src/x86/ssse3.rs | 172 -- - toolkit/moz.configure | 11 +- - 262 files changed, 17411 insertions(+), 6734 deletions(-) - create mode 100644 third_party/rust/packed_simd/.appveyor.yml - create mode 100644 third_party/rust/packed_simd/.cargo-checksum.json - create mode 100644 third_party/rust/packed_simd/.travis.yml - create mode 100644 third_party/rust/packed_simd/Cargo.toml - rename third_party/rust/{simd => packed_simd}/LICENSE-APACHE (100%) - rename third_party/rust/{simd => packed_simd}/LICENSE-MIT (93%) - create mode 100644 third_party/rust/packed_simd/bors.toml - create mode 100644 third_party/rust/packed_simd/build.rs - create mode 100644 third_party/rust/packed_simd/ci/all.sh - create mode 100644 third_party/rust/packed_simd/ci/android-install-ndk.sh - create mode 100644 third_party/rust/packed_simd/ci/android-install-sdk.sh - create mode 100644 third_party/rust/packed_simd/ci/android-sysimage.sh - create mode 100644 third_party/rust/packed_simd/ci/benchmark.sh - create mode 100644 third_party/rust/packed_simd/ci/deploy_and_run_on_ios_simulator.rs - create mode 100644 third_party/rust/packed_simd/ci/docker/aarch64-linux-android/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/aarch64-unknown-linux-gnu/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/arm-linux-androideabi/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabi/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/i586-unknown-linux-gnu/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/i686-unknown-linux-gnu/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/mips-unknown-linux-gnu/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/mipsel-unknown-linux-musl/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/powerpc-unknown-linux-gnu/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/s390x-unknown-linux-gnu/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/sparc64-unknown-linux-gnu/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/thumbv7neon-linux-androideabi/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/wasm32-unknown-unknown/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/x86_64-linux-android/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu-emulated/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu/Dockerfile - create mode 100644 third_party/rust/packed_simd/ci/dox.sh - create mode 100644 third_party/rust/packed_simd/ci/linux-s390x.sh - create mode 100644 third_party/rust/packed_simd/ci/linux-sparc64.sh - create mode 100644 third_party/rust/packed_simd/ci/lld-shim.rs - create mode 100644 third_party/rust/packed_simd/ci/max_line_width.sh - create mode 100644 third_party/rust/packed_simd/ci/run-docker.sh - create mode 100644 third_party/rust/packed_simd/ci/run.sh - create mode 100644 third_party/rust/packed_simd/ci/run_examples.sh - create mode 100644 third_party/rust/packed_simd/ci/runtest-android.rs - create mode 100644 third_party/rust/packed_simd/ci/setup_benchmarks.sh - create mode 100644 third_party/rust/packed_simd/ci/test-runner-linux - create mode 100644 third_party/rust/packed_simd/contributing.md - create mode 100644 third_party/rust/packed_simd/perf-guide/.gitignore - create mode 100644 third_party/rust/packed_simd/perf-guide/book.toml - create mode 100644 third_party/rust/packed_simd/perf-guide/src/SUMMARY.md - create mode 100644 third_party/rust/packed_simd/perf-guide/src/ascii.css - create mode 100644 third_party/rust/packed_simd/perf-guide/src/bound_checks.md - create mode 100644 third_party/rust/packed_simd/perf-guide/src/float-math/approx.md - create mode 100644 third_party/rust/packed_simd/perf-guide/src/float-math/fma.md - create mode 100644 third_party/rust/packed_simd/perf-guide/src/float-math/fp.md - create mode 100644 third_party/rust/packed_simd/perf-guide/src/float-math/svml.md - create mode 100644 third_party/rust/packed_simd/perf-guide/src/introduction.md - create mode 100644 third_party/rust/packed_simd/perf-guide/src/prof/linux.md - create mode 100644 third_party/rust/packed_simd/perf-guide/src/prof/mca.md - create mode 100644 third_party/rust/packed_simd/perf-guide/src/prof/profiling.md - create mode 100644 third_party/rust/packed_simd/perf-guide/src/target-feature/attribute.md - create mode 100644 third_party/rust/packed_simd/perf-guide/src/target-feature/features.md - create mode 100644 third_party/rust/packed_simd/perf-guide/src/target-feature/inlining.md - create mode 100644 third_party/rust/packed_simd/perf-guide/src/target-feature/practice.md - create mode 100644 third_party/rust/packed_simd/perf-guide/src/target-feature/runtime.md - create mode 100644 third_party/rust/packed_simd/perf-guide/src/target-feature/rustflags.md - create mode 100644 third_party/rust/packed_simd/perf-guide/src/vert-hor-ops.md - create mode 100644 third_party/rust/packed_simd/readme.md - create mode 100644 third_party/rust/packed_simd/rustfmt.toml - create mode 100644 third_party/rust/packed_simd/src/api.rs - create mode 100644 third_party/rust/packed_simd/src/api/bit_manip.rs - create mode 100644 third_party/rust/packed_simd/src/api/cast.rs - create mode 100644 third_party/rust/packed_simd/src/api/cast/macros.rs - create mode 100644 third_party/rust/packed_simd/src/api/cast/v128.rs - create mode 100644 third_party/rust/packed_simd/src/api/cast/v16.rs - create mode 100644 third_party/rust/packed_simd/src/api/cast/v256.rs - create mode 100644 third_party/rust/packed_simd/src/api/cast/v32.rs - create mode 100644 third_party/rust/packed_simd/src/api/cast/v512.rs - create mode 100644 third_party/rust/packed_simd/src/api/cast/v64.rs - create mode 100644 third_party/rust/packed_simd/src/api/cmp.rs - create mode 100644 third_party/rust/packed_simd/src/api/cmp/eq.rs - create mode 100644 third_party/rust/packed_simd/src/api/cmp/ord.rs - create mode 100644 third_party/rust/packed_simd/src/api/cmp/partial_eq.rs - create mode 100644 third_party/rust/packed_simd/src/api/cmp/partial_ord.rs - create mode 100644 third_party/rust/packed_simd/src/api/cmp/vertical.rs - create mode 100644 third_party/rust/packed_simd/src/api/default.rs - create mode 100644 third_party/rust/packed_simd/src/api/fmt.rs - create mode 100644 third_party/rust/packed_simd/src/api/fmt/binary.rs - create mode 100644 third_party/rust/packed_simd/src/api/fmt/debug.rs - create mode 100644 third_party/rust/packed_simd/src/api/fmt/lower_hex.rs - create mode 100644 third_party/rust/packed_simd/src/api/fmt/octal.rs - create mode 100644 third_party/rust/packed_simd/src/api/fmt/upper_hex.rs - create mode 100644 third_party/rust/packed_simd/src/api/from.rs - create mode 100644 third_party/rust/packed_simd/src/api/from/from_array.rs - create mode 100644 third_party/rust/packed_simd/src/api/from/from_vector.rs - create mode 100644 third_party/rust/packed_simd/src/api/hash.rs - create mode 100644 third_party/rust/packed_simd/src/api/into_bits.rs - create mode 100644 third_party/rust/packed_simd/src/api/into_bits/arch_specific.rs - create mode 100644 third_party/rust/packed_simd/src/api/into_bits/macros.rs - create mode 100644 third_party/rust/packed_simd/src/api/into_bits/v128.rs - create mode 100644 third_party/rust/packed_simd/src/api/into_bits/v16.rs - create mode 100644 third_party/rust/packed_simd/src/api/into_bits/v256.rs - create mode 100644 third_party/rust/packed_simd/src/api/into_bits/v32.rs - create mode 100644 third_party/rust/packed_simd/src/api/into_bits/v512.rs - create mode 100644 third_party/rust/packed_simd/src/api/into_bits/v64.rs - create mode 100644 third_party/rust/packed_simd/src/api/math.rs - create mode 100644 third_party/rust/packed_simd/src/api/math/float.rs - create mode 100644 third_party/rust/packed_simd/src/api/math/float/abs.rs - create mode 100644 third_party/rust/packed_simd/src/api/math/float/consts.rs - create mode 100644 third_party/rust/packed_simd/src/api/math/float/cos.rs - create mode 100644 third_party/rust/packed_simd/src/api/math/float/exp.rs - create mode 100644 third_party/rust/packed_simd/src/api/math/float/ln.rs - create mode 100644 third_party/rust/packed_simd/src/api/math/float/mul_add.rs - create mode 100644 third_party/rust/packed_simd/src/api/math/float/mul_adde.rs - create mode 100644 third_party/rust/packed_simd/src/api/math/float/powf.rs - create mode 100644 third_party/rust/packed_simd/src/api/math/float/recpre.rs - create mode 100644 third_party/rust/packed_simd/src/api/math/float/rsqrte.rs - create mode 100644 third_party/rust/packed_simd/src/api/math/float/sin.rs - create mode 100644 third_party/rust/packed_simd/src/api/math/float/sqrt.rs - create mode 100644 third_party/rust/packed_simd/src/api/math/float/sqrte.rs - create mode 100644 third_party/rust/packed_simd/src/api/minimal.rs - create mode 100644 third_party/rust/packed_simd/src/api/minimal/iuf.rs - create mode 100644 third_party/rust/packed_simd/src/api/minimal/mask.rs - create mode 100644 third_party/rust/packed_simd/src/api/minimal/ptr.rs - create mode 100644 third_party/rust/packed_simd/src/api/ops.rs - create mode 100644 third_party/rust/packed_simd/src/api/ops/scalar_arithmetic.rs - create mode 100644 third_party/rust/packed_simd/src/api/ops/scalar_bitwise.rs - create mode 100644 third_party/rust/packed_simd/src/api/ops/scalar_mask_bitwise.rs - create mode 100644 third_party/rust/packed_simd/src/api/ops/scalar_shifts.rs - create mode 100644 third_party/rust/packed_simd/src/api/ops/vector_arithmetic.rs - create mode 100644 third_party/rust/packed_simd/src/api/ops/vector_bitwise.rs - create mode 100644 third_party/rust/packed_simd/src/api/ops/vector_float_min_max.rs - create mode 100644 third_party/rust/packed_simd/src/api/ops/vector_int_min_max.rs - create mode 100644 third_party/rust/packed_simd/src/api/ops/vector_mask_bitwise.rs - create mode 100644 third_party/rust/packed_simd/src/api/ops/vector_neg.rs - create mode 100644 third_party/rust/packed_simd/src/api/ops/vector_rotates.rs - create mode 100644 third_party/rust/packed_simd/src/api/ops/vector_shifts.rs - create mode 100644 third_party/rust/packed_simd/src/api/ptr.rs - create mode 100644 third_party/rust/packed_simd/src/api/ptr/gather_scatter.rs - create mode 100644 third_party/rust/packed_simd/src/api/reductions.rs - create mode 100644 third_party/rust/packed_simd/src/api/reductions/bitwise.rs - create mode 100644 third_party/rust/packed_simd/src/api/reductions/float_arithmetic.rs - create mode 100644 third_party/rust/packed_simd/src/api/reductions/integer_arithmetic.rs - create mode 100644 third_party/rust/packed_simd/src/api/reductions/mask.rs - create mode 100644 third_party/rust/packed_simd/src/api/reductions/min_max.rs - create mode 100644 third_party/rust/packed_simd/src/api/select.rs - create mode 100644 third_party/rust/packed_simd/src/api/shuffle.rs - create mode 100644 third_party/rust/packed_simd/src/api/shuffle1_dyn.rs - create mode 100644 third_party/rust/packed_simd/src/api/slice.rs - create mode 100644 third_party/rust/packed_simd/src/api/slice/from_slice.rs - create mode 100644 third_party/rust/packed_simd/src/api/slice/write_to_slice.rs - create mode 100644 third_party/rust/packed_simd/src/api/swap_bytes.rs - create mode 100644 third_party/rust/packed_simd/src/codegen.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/bit_manip.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/llvm.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/math.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/math/float.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/math/float/abs.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/math/float/cos.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/math/float/cos_pi.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/math/float/exp.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/math/float/ln.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/math/float/macros.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/math/float/mul_add.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/math/float/mul_adde.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/math/float/powf.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/math/float/sin.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/math/float/sin_cos_pi.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/math/float/sin_pi.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/math/float/sqrt.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/math/float/sqrte.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/pointer_sized_int.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/reductions.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/reductions/mask.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/reductions/mask/aarch64.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/reductions/mask/arm.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/reductions/mask/fallback.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/reductions/mask/fallback_impl.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/reductions/mask/x86.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/reductions/mask/x86/avx.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/reductions/mask/x86/avx2.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse2.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/shuffle.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/shuffle1_dyn.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/swap_bytes.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/v128.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/v16.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/v256.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/v32.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/v512.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/v64.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/vPtr.rs - create mode 100644 third_party/rust/packed_simd/src/codegen/vSize.rs - create mode 100644 third_party/rust/packed_simd/src/lib.rs - create mode 100644 third_party/rust/packed_simd/src/masks.rs - create mode 100644 third_party/rust/packed_simd/src/sealed.rs - create mode 100644 third_party/rust/packed_simd/src/testing.rs - create mode 100644 third_party/rust/packed_simd/src/testing/macros.rs - create mode 100644 third_party/rust/packed_simd/src/testing/utils.rs - create mode 100644 third_party/rust/packed_simd/src/v128.rs - create mode 100644 third_party/rust/packed_simd/src/v16.rs - create mode 100644 third_party/rust/packed_simd/src/v256.rs - create mode 100644 third_party/rust/packed_simd/src/v32.rs - create mode 100644 third_party/rust/packed_simd/src/v512.rs - create mode 100644 third_party/rust/packed_simd/src/v64.rs - create mode 100644 third_party/rust/packed_simd/src/vPtr.rs - create mode 100644 third_party/rust/packed_simd/src/vSize.rs - create mode 100644 third_party/rust/packed_simd/tests/endianness.rs - delete mode 100644 third_party/rust/simd/.cargo-checksum.json - delete mode 100644 third_party/rust/simd/Cargo.toml - delete mode 100644 third_party/rust/simd/README.md - delete mode 100755 third_party/rust/simd/benches/mandelbrot.rs - delete mode 100755 third_party/rust/simd/benches/matrix.rs - delete mode 100644 third_party/rust/simd/build.rs - delete mode 100755 third_party/rust/simd/examples/axpy.rs - delete mode 100644 third_party/rust/simd/examples/convert.rs - delete mode 100755 third_party/rust/simd/examples/dot-product.rs - delete mode 100644 third_party/rust/simd/examples/fannkuch-redux-nosimd.rs - delete mode 100755 third_party/rust/simd/examples/fannkuch-redux.rs - delete mode 100755 third_party/rust/simd/examples/mandelbrot.rs - delete mode 100644 third_party/rust/simd/examples/matrix-inverse.rs - delete mode 100644 third_party/rust/simd/examples/nbody-nosimd.rs - delete mode 100755 third_party/rust/simd/examples/nbody.rs - delete mode 100644 third_party/rust/simd/examples/ops.rs - delete mode 100644 third_party/rust/simd/examples/spectral-norm-nosimd.rs - delete mode 100755 third_party/rust/simd/examples/spectral-norm.rs - delete mode 100644 third_party/rust/simd/src/aarch64/mod.rs - delete mode 100644 third_party/rust/simd/src/aarch64/neon.rs - delete mode 100644 third_party/rust/simd/src/arm/mod.rs - delete mode 100644 third_party/rust/simd/src/arm/neon.rs - delete mode 100644 third_party/rust/simd/src/common.rs - delete mode 100644 third_party/rust/simd/src/lib.rs - delete mode 100644 third_party/rust/simd/src/sixty_four.rs - delete mode 100644 third_party/rust/simd/src/v256.rs - delete mode 100644 third_party/rust/simd/src/x86/avx.rs - delete mode 100644 third_party/rust/simd/src/x86/avx2.rs - delete mode 100644 third_party/rust/simd/src/x86/mod.rs - delete mode 100644 third_party/rust/simd/src/x86/sse2.rs - delete mode 100644 third_party/rust/simd/src/x86/sse3.rs - delete mode 100644 third_party/rust/simd/src/x86/sse4_1.rs - delete mode 100644 third_party/rust/simd/src/x86/sse4_2.rs - delete mode 100644 third_party/rust/simd/src/x86/ssse3.rs - -diff --git a/.cargo/config.in b/.cargo/config.in -index 4808857b5b5f..0773d70cf83a 100644 ---- a/.cargo/config.in -+++ b/.cargo/config.in -@@ -22,6 +22,11 @@ git = "https://github.com/glandium/cc-rs" - branch = "1.0.23-clang-cl-aarch64" - replace-with = "vendored-sources" - -+[source."https://github.com/rust-lang-nursery/packed_simd"] -+git = "https://github.com/hsivonen/packed_simd" -+branch = "rust_1_32" -+replace-with = "vendored-sources" -+ - [source.vendored-sources] - directory = '@top_srcdir@/third_party/rust' - -diff --git a/Cargo.lock b/Cargo.lock -index b2e2891dd828..bbbd00fbb5e4 100644 ---- a/Cargo.lock -+++ b/Cargo.lock -@@ -146,7 +146,7 @@ version = "0.3.9" - source = "registry+https://github.com/rust-lang/crates.io-index" - dependencies = [ - "backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)", -- "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (git+https://github.com/froydnj/winapi-rs?branch=aarch64)", -@@ -232,7 +232,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" - dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cexpr 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -- "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "clang-sys 0.26.1 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -@@ -386,7 +386,7 @@ dependencies = [ - - [[package]] - name = "cfg-if" --version = "0.1.2" -+version = "0.1.6" - source = "registry+https://github.com/rust-lang/crates.io-index" - - [[package]] -@@ -589,49 +589,49 @@ version = "0.3.1" - source = "registry+https://github.com/rust-lang/crates.io-index" - dependencies = [ - "arrayvec 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", -- "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - ] - - [[package]] - name = "crossbeam-epoch" - version = "0.4.3" - source = "registry+https://github.com/rust-lang/crates.io-index" - dependencies = [ - "arrayvec 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", -- "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - ] - - [[package]] - name = "crossbeam-utils" - version = "0.2.2" - source = "registry+https://github.com/rust-lang/crates.io-index" - dependencies = [ -- "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - ] - - [[package]] - name = "crossbeam-utils" - version = "0.3.2" - source = "registry+https://github.com/rust-lang/crates.io-index" - dependencies = [ -- "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - ] - - [[package]] - name = "crossbeam-utils" - version = "0.6.3" - source = "registry+https://github.com/rust-lang/crates.io-index" - dependencies = [ -- "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - ] - - [[package]] -@@ -869,25 +869,25 @@ name = "encoding_c" - version = "0.9.0" - source = "registry+https://github.com/rust-lang/crates.io-index" - dependencies = [ -- "encoding_rs 0.8.14 (registry+https://github.com/rust-lang/crates.io-index)", -+ "encoding_rs 0.8.16 (registry+https://github.com/rust-lang/crates.io-index)", - ] - - [[package]] - name = "encoding_glue" - version = "0.1.0" - dependencies = [ -- "encoding_rs 0.8.14 (registry+https://github.com/rust-lang/crates.io-index)", -+ "encoding_rs 0.8.16 (registry+https://github.com/rust-lang/crates.io-index)", - "nserror 0.1.0", - "nsstring 0.1.0", - ] - - [[package]] - name = "encoding_rs" --version = "0.8.14" -+version = "0.8.16" - source = "registry+https://github.com/rust-lang/crates.io-index" - dependencies = [ -- "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -- "simd 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", -+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -+ "packed_simd 0.3.3 (git+https://github.com/hsivonen/packed_simd?branch=rust_1_32)", - ] - - [[package]] -@@ -1524,7 +1524,7 @@ name = "log" - version = "0.4.6" - source = "registry+https://github.com/rust-lang/crates.io-index" - dependencies = [ -- "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - ] - - [[package]] -@@ -1789,7 +1789,7 @@ name = "net2" - version = "0.2.32" - source = "registry+https://github.com/rust-lang/crates.io-index" - dependencies = [ -- "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (git+https://github.com/froydnj/winapi-rs?branch=aarch64)", - ] -@@ -1843,7 +1843,7 @@ name = "nsstring" - version = "0.1.0" - dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", -- "encoding_rs 0.8.14 (registry+https://github.com/rust-lang/crates.io-index)", -+ "encoding_rs 0.8.16 (registry+https://github.com/rust-lang/crates.io-index)", - ] - - [[package]] -@@ -1929,6 +1929,14 @@ dependencies = [ - "stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - ] - -+[[package]] -+name = "packed_simd" -+version = "0.3.3" -+source = "git+https://github.com/hsivonen/packed_simd?branch=rust_1_32#3541e3818fdc7c2a24f87e3459151a4ce955a67a" -+dependencies = [ -+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -+] -+ - [[package]] - name = "parking_lot" - version = "0.6.3" -@@ -2442,11 +2450,6 @@ dependencies = [ - "opaque-debug 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - ] - --[[package]] --name = "simd" --version = "0.2.3" --source = "registry+https://github.com/rust-lang/crates.io-index" -- - [[package]] - name = "siphasher" - version = "0.2.1" -@@ -3040,7 +3043,7 @@ name = "uuid" - version = "0.6.5" - source = "registry+https://github.com/rust-lang/crates.io-index" - dependencies = [ -- "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - ] - -@@ -3125,7 +3128,7 @@ dependencies = [ - "bincode 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", -- "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "core-graphics 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)", - "core-text 13.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -@@ -3365,7 +3368,7 @@ dependencies = [ - "checksum cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "926013f2860c46252efceabb19f4a6b308197505082c609025aa6706c011d427" - "checksum cc 1.0.23 (git+https://github.com/glandium/cc-rs?branch=1.0.23-clang-cl-aarch64)" = "" - "checksum cexpr 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8fc0086be9ca82f7fc89fc873435531cb898b86e850005850de1f820e2db6e9b" --"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" -+"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" - "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" - "checksum clang-sys 0.26.1 (registry+https://github.com/rust-lang/crates.io-index)" = "481e42017c1416b1c0856ece45658ecbb7c93d8a93455f7e5fa77f3b35455557" - "checksum clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0f16b89cbb9ee36d87483dc939fe9f1e13c05898d56d7b230a0d4dff033a536" -@@ -3416,7 +3419,7 @@ dependencies = [ - "checksum either 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18785c1ba806c258137c937e44ada9ee7e69a37e3c72077542cd2f069d78562a" - "checksum ena 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "88dc8393b3c7352f94092497f6b52019643e493b6b890eb417cdb7c46117e621" - "checksum encoding_c 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "769ecb8b33323998e482b218c0d13cd64c267609023b4b7ec3ee740714c318ee" --"checksum encoding_rs 0.8.14 (registry+https://github.com/rust-lang/crates.io-index)" = "a69d152eaa438a291636c1971b0a370212165ca8a75759eb66818c5ce9b538f7" -+"checksum encoding_rs 0.8.16 (registry+https://github.com/rust-lang/crates.io-index)" = "0535f350c60aac0b87ccf28319abc749391e912192255b0c00a2c12c6917bd73" - "checksum env_logger 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0561146661ae44c579e993456bc76d11ce1e0c7d745e57b2fa7146b6e49fa2ad" - "checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3" - "checksum euclid 0.19.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a7698bdda3d7444a79d33bdc96e8b518d44ea3ff101d8492a6ca1207b886ea" -@@ -3502,6 +3505,7 @@ dependencies = [ - "checksum ordered-float 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2f0015e9e8e28ee20c581cfbfe47c650cedeb9ed0721090e0b7ebb10b9cdbcc2" - "checksum ordermap 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063" - "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" -+"checksum packed_simd 0.3.3 (git+https://github.com/hsivonen/packed_simd?branch=rust_1_32)" = "" - "checksum parking_lot 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "69376b761943787ebd5cc85a5bc95958651a22609c5c1c2b65de21786baec72b" - "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" - "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" -@@ -3557,7 +3561,6 @@ dependencies = [ - "checksum serde_json 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "44dd2cfde475037451fa99b7e5df77aa3cfd1536575fa8e7a538ab36dcde49ae" - "checksum sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eb6be24e4c23a84d7184280d2722f7f2731fcdd4a9d886efbfe4413e4847ea0" - "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" --"checksum simd 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0048b17eb9577ac545c61d85c3559b41dfb4cbea41c9bd9ca6a4f73ff05fda84" - "checksum siphasher 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2ffc669b726f2bc9a3bcff66e5e23b56ba6bf70e22a34c3d7b6d0b3450b65b84" - "checksum slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b4fcaed89ab08ef143da37bc52adbcc04d4a69014f4c1208d6b51f0c47bc23" - "checksum slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f9776d6b986f77b35c6cf846c11ad986ff128fe0b2b63a3628e3755e8d3102d" -diff --git a/Cargo.toml b/Cargo.toml -index c63c81e3409d..4a9d9212514a 100644 ---- a/Cargo.toml -+++ b/Cargo.toml -@@ -61,3 +61,4 @@ libudev-sys = { path = "dom/webauthn/libudev-sys" } - serde_derive = { git = "https://github.com/servo/serde", branch = "deserialize_from_enums9" } - winapi = { git = "https://github.com/froydnj/winapi-rs", branch = "aarch64" } - cc = { git = "https://github.com/glandium/cc-rs", branch = "1.0.23-clang-cl-aarch64" } -+packed_simd = { git = "https://github.com/hsivonen/packed_simd", branch = "rust_1_32" } -diff --git a/third_party/rust/cfg-if/.cargo-checksum.json b/third_party/rust/cfg-if/.cargo-checksum.json -index 89b14a227216..b744a21d9fd1 100644 ---- a/third_party/rust/cfg-if/.cargo-checksum.json -+++ b/third_party/rust/cfg-if/.cargo-checksum.json -@@ -1 +1 @@ --{"files":{"Cargo.toml":"764b9ce160653e841430da3919ff968b957ff811f7da42c8483c8bfc2f06be25","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"3fa9368c60bc701dea294fbacae0469188c4be1de79f82e972bb9b321776cd52","src/lib.rs":"6915169e3ca05f28e1cb0e052379d74f2496400de1240b74c56e55c2674a6560","tests/xcrate.rs":"30dcb70fbb9c96fda2b7825592558279f534776f72e2a8a0a3e26df4dedb3caa"},"package":"d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de"} -\ No newline at end of file -+{"files":{"Cargo.toml":"090d983ec20ad09e59f6b7679b48b9b54e9c0841cf2922b81cba485edcd40876","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"1cd0ebc3b30a9c9eddb0fda5515b5a52ec2b85a087328f0ee9f4d68cbb28afc2","src/lib.rs":"f02d6e295109365cf54884e5282a3e7d1e1f62857c700f23cd013e94a56bd803","tests/xcrate.rs":"30dcb70fbb9c96fda2b7825592558279f534776f72e2a8a0a3e26df4dedb3caa"},"package":"082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4"} -\ No newline at end of file -diff --git a/third_party/rust/cfg-if/Cargo.toml b/third_party/rust/cfg-if/Cargo.toml -index 7afa063d1ef5..84c4fc7835ab 100644 ---- a/third_party/rust/cfg-if/Cargo.toml -+++ b/third_party/rust/cfg-if/Cargo.toml -@@ -1,14 +1,24 @@ -+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO -+# -+# When uploading crates to the registry Cargo will automatically -+# "normalize" Cargo.toml files for maximal compatibility -+# with all versions of Cargo and also rewrite `path` dependencies -+# to registry (e.g. crates.io) dependencies -+# -+# If you believe there's an error in this file please file an -+# issue against the rust-lang/cargo repository. If you're -+# editing this file be aware that the upstream Cargo.toml -+# will likely look very different (and much more reasonable) -+ - [package] - name = "cfg-if" --version = "0.1.2" -+version = "0.1.6" - authors = ["Alex Crichton "] --license = "MIT/Apache-2.0" --readme = "README.md" --repository = "https://github.com/alexcrichton/cfg-if" -+description = "A macro to ergonomically define an item depending on a large number of #[cfg]\nparameters. Structured like an if-else chain, the first matching branch is the\nitem that gets emitted.\n" - homepage = "https://github.com/alexcrichton/cfg-if" --documentation = "http://alexcrichton.com/cfg-if" --description = """ --A macro to ergonomically define an item depending on a large number of #[cfg] --parameters. Structured like an if-else chain, the first matching branch is the --item that gets emitted. --""" -+documentation = "https://docs.rs/cfg-if" -+readme = "README.md" -+license = "MIT/Apache-2.0" -+repository = "https://github.com/alexcrichton/cfg-if" -+[badges.travis-ci] -+repository = "alexcrichton/cfg-if" -diff --git a/third_party/rust/cfg-if/README.md b/third_party/rust/cfg-if/README.md -index e9859dadb609..344a946c0487 100644 ---- a/third_party/rust/cfg-if/README.md -+++ b/third_party/rust/cfg-if/README.md -@@ -2,7 +2,7 @@ - - [![Build Status](https://travis-ci.org/alexcrichton/cfg-if.svg?branch=master)](https://travis-ci.org/alexcrichton/cfg-if) - --[Documentation](http://alexcrichton.com/cfg-if) -+[Documentation](https://docs.rs/cfg-if) - - A macro to ergonomically define an item depending on a large number of #[cfg] - parameters. Structured like an if-else chain, the first matching branch is the -@@ -36,9 +36,17 @@ fn main() { - - # License - --`cfg-if` is primarily distributed under the terms of both the MIT license and --the Apache License (Version 2.0), with portions covered by various BSD-like --licenses. -+This project is licensed under either of - --See LICENSE-APACHE, and LICENSE-MIT for details. -+ * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or -+ http://www.apache.org/licenses/LICENSE-2.0) -+ * MIT license ([LICENSE-MIT](LICENSE-MIT) or -+ http://opensource.org/licenses/MIT) - -+at your option. -+ -+### Contribution -+ -+Unless you explicitly state otherwise, any contribution intentionally submitted -+for inclusion in Serde by you, as defined in the Apache-2.0 license, shall be -+dual licensed as above, without any additional terms or conditions. -diff --git a/third_party/rust/cfg-if/src/lib.rs b/third_party/rust/cfg-if/src/lib.rs -index 563cda81f42d..ff144f69f862 100644 ---- a/third_party/rust/cfg-if/src/lib.rs -+++ b/third_party/rust/cfg-if/src/lib.rs -@@ -1,81 +1,90 @@ --//! A macro for defining #[cfg] if-else statements. -+//! A macro for defining `#[cfg]` if-else statements. - //! - //! The macro provided by this crate, `cfg_if`, is similar to the `if/elif` C - //! preprocessor macro by allowing definition of a cascade of `#[cfg]` cases, - //! emitting the implementation which matches first. - //! --//! This allows you to conveniently provide a long list #[cfg]'d blocks of code -+//! This allows you to conveniently provide a long list `#[cfg]`'d blocks of code - //! without having to rewrite each clause multiple times. - //! - //! # Example - //! - //! ``` - //! #[macro_use] - //! extern crate cfg_if; - //! - //! cfg_if! { - //! if #[cfg(unix)] { - //! fn foo() { /* unix specific functionality */ } - //! } else if #[cfg(target_pointer_width = "32")] { - //! fn foo() { /* non-unix, 32-bit functionality */ } - //! } else { - //! fn foo() { /* fallback implementation */ } - //! } - //! } - //! - //! # fn main() {} - //! ``` - - #![no_std] - --#![doc(html_root_url = "http://alexcrichton.com/cfg-if")] -+#![doc(html_root_url = "https://docs.rs/cfg-if")] - #![deny(missing_docs)] - #![cfg_attr(test, deny(warnings))] - --#[macro_export] -+#[macro_export(local_inner_macros)] - macro_rules! cfg_if { -+ // match if/else chains with a final `else` - ($( - if #[cfg($($meta:meta),*)] { $($it:item)* } - ) else * else { - $($it2:item)* - }) => { -- __cfg_if_items! { -+ cfg_if! { -+ @__items - () ; - $( ( ($($meta),*) ($($it)*) ), )* - ( () ($($it2)*) ), - } - }; -+ -+ // match if/else chains lacking a final `else` - ( - if #[cfg($($i_met:meta),*)] { $($i_it:item)* } - $( - else if #[cfg($($e_met:meta),*)] { $($e_it:item)* } - )* - ) => { -- __cfg_if_items! { -+ cfg_if! { -+ @__items - () ; - ( ($($i_met),*) ($($i_it)*) ), - $( ( ($($e_met),*) ($($e_it)*) ), )* - ( () () ), - } -- } --} -+ }; - --#[macro_export] --#[doc(hidden)] --macro_rules! __cfg_if_items { -- (($($not:meta,)*) ; ) => {}; -- (($($not:meta,)*) ; ( ($($m:meta),*) ($($it:item)*) ), $($rest:tt)*) => { -- __cfg_if_apply! { cfg(all($($m,)* not(any($($not),*)))), $($it)* } -- __cfg_if_items! { ($($not,)* $($m,)*) ; $($rest)* } -- } --} -+ // Internal and recursive macro to emit all the items -+ // -+ // Collects all the negated cfgs in a list at the beginning and after the -+ // semicolon is all the remaining items -+ (@__items ($($not:meta,)*) ; ) => {}; -+ (@__items ($($not:meta,)*) ; ( ($($m:meta),*) ($($it:item)*) ), $($rest:tt)*) => { -+ // Emit all items within one block, applying an approprate #[cfg]. The -+ // #[cfg] will require all `$m` matchers specified and must also negate -+ // all previous matchers. -+ cfg_if! { @__apply cfg(all($($m,)* not(any($($not),*)))), $($it)* } - --#[macro_export] --#[doc(hidden)] --macro_rules! __cfg_if_apply { -- ($m:meta, $($it:item)*) => { -+ // Recurse to emit all other items in `$rest`, and when we do so add all -+ // our `$m` matchers to the list of `$not` matchers as future emissions -+ // will have to negate everything we just matched as well. -+ cfg_if! { @__items ($($not,)* $($m,)*) ; $($rest)* } -+ }; -+ -+ // Internal macro to Apply a cfg attribute to a list of items -+ (@__apply $m:meta, $($it:item)*) => { - $(#[$m] $it)* -- } -+ }; - } - - #[cfg(test)] -diff --git a/third_party/rust/encoding_rs/.cargo-checksum.json b/third_party/rust/encoding_rs/.cargo-checksum.json -index c063d4c27534..7c1901dce515 100644 ---- a/third_party/rust/encoding_rs/.cargo-checksum.json -+++ b/third_party/rust/encoding_rs/.cargo-checksum.json -@@ -1 +1 @@ --{"files":{"CONTRIBUTING.md":"06c26277e8dbd3f57be2eb51b5e3285dc1cbbf8c11326df413868ae702e6a61c","COPYRIGHT":"8b98376eb373dcf81950474efe34b5576a8171460dff500cc58a1ed8d160cd57","Cargo.toml":"f4c9b33981fe222ef322d640f5ef680828d75dcd534b8aa2bfdd576598deea64","Ideas.md":"b7452893f500163868d8de52c09addaf91e1632454ed02e892c467ed7ec39dbd","LICENSE-APACHE":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","LICENSE-MIT":"f2ad48641d9c997d9ae3b95d93d1cd6e1ab12ab4c44de89937c7bfabbd076a4a","README.md":"ad140c9178067c8bdba8ae43ddffd0506d70d49474731247a050ff99a3ff7832","build.rs":"f5defca2c68b73e8723f489a9279af4fbe9724abc6e9abf58d32542e8a459e26","doc/Big5.txt":"f73a2edc5cb6c2d140ba6e07f4542e1c4a234950378acde1df93480f0ca0be0b","doc/EUC-JP.txt":"ee2818b907d0137f40a9ab9fd525fc700a44dbdddb6cf0c157a656566bae4bf1","doc/EUC-KR.txt":"71d9e2ccf3b124e8bdfb433c8cf2773fd878077038d0cec3c7237a50f4a78a30","doc/GBK.txt":"c1b522b5a799884e5001da661f42c5a8f4d0acb9ef1d74b206f22b5f65365606","doc/IBM866.txt":"a5a433e804d0f83af785015179fbc1d9b0eaf1f7960efcd04093e136b51fbd0e","doc/ISO-2022-JP.txt":"af86684f5a8f0e2868d7b2c292860140c3d2e5527530ca091f1b28198e8e2fe6","doc/ISO-8859-10.txt":"6d3949ad7c81ca176895101ed81a1db7df1060d64e262880b94bd31bb344ab4d","doc/ISO-8859-13.txt":"3951dd89cf93f7729148091683cf8511f4529388b7dc8dcd0d62eaed55be93fa","doc/ISO-8859-14.txt":"3d330784a0374fd255a38b47949675cc7168c800530534b0a01cac6edc623adc","doc/ISO-8859-15.txt":"24b1084aab5127a85aab99153f86e24694d0a3615f53b5ce23683f97cf66c47a","doc/ISO-8859-16.txt":"ce0272559b92ba76d7a7e476f6424ae4a5cc72e75b183611b08392e44add4d25","doc/ISO-8859-2.txt":"18ceff88c13d1b5ba455a3919b1e3de489045c4c3d2dd7e8527c125c75d54aad","doc/ISO-8859-3.txt":"21798404c68f4f5db59223362f24999da96968c0628427321fccce7d2849a130","doc/ISO-8859-4.txt":"d27f6520c6c5bfbcc19176b71d081cdb3bccde1622bb3e420d5680e812632d53","doc/ISO-8859-5.txt":"a10ec8d6ea7a78ad15da7275f6cb1a3365118527e28f9af6d0d5830501303f3a","doc/ISO-8859-6.txt":"ccda8a2efc96115336bdd77776637b9712425e44fbcf745353b9057fbef144e7","doc/ISO-8859-7.txt":"17900fa1f27a445958f0a77d7d9056be375a6bd7ee4492aa680c7c1500bab85e","doc/ISO-8859-8-I.txt":"8357555646d54265a9b9ffa3e68b08d132312f1561c60108ff9b8b1167b6ecf2","doc/ISO-8859-8.txt":"72cd6f3afb7b4a9c16a66a362473315770b7755d72c86c870e52fc3eba86c8af","doc/KOI8-R.txt":"839cf19a38da994488004ed7814b1f6151640156a9a2af02bf2efca745fb5966","doc/KOI8-U.txt":"0cc76624ed1f024183e2298b7e019957da2c70c8ca06e0fc4e6f353f50a5054f","doc/Shift_JIS.txt":"34c49141818cb9ddbcf59cc858f78a79be8ad148d563f26415108ae1f148443f","doc/UTF-16BE.txt":"e2e280d8acbaa6d2a6b3569d60e17500a285f2baa0df3363dd85537cd5a1ef8f","doc/UTF-16LE.txt":"70bdc170e3fc5298ba68f10125fb5eeb8b077036cc96bb4416c4de396f6d76c1","doc/UTF-8.txt":"ea7bae742e613010ced002cf4b601a737d2203fad65e115611451bc4428f548a","doc/gb18030.txt":"dc71378a8f07a2d8659f69ee81fb8791fef56ba86f124b429978285237bb4a7b","doc/macintosh.txt":"57491e53866711b4672d9b9ff35380b9dac9e0d8e3d6c20bdd6140603687c023","doc/replacement.txt":"4b6c3bbd7999d9d4108a281594bd02d13607e334a95465afff8c2c08d395f0e4","doc/windows-1250.txt":"61296bb6a21cdab602300d32ecfba434cb82de5ac3bc88d58710d2f125e28d39","doc/windows-1251.txt":"7deea1c61dea1485c8ff02db2c7d578db7a9aab63ab1cfd02ec04b515864689e","doc/windows-1252.txt":"933ef3bdddfce5ee132b9f1a1aa8b47423d2587bbe475b19028d0a6d38e180b6","doc/windows-1253.txt":"1a38748b88e99071a5c7b3d5456ead4caedeabab50d50d658be105bc113714de","doc/windows-1254.txt":"f8372f86c6f8d642563cd6ddc025260553292a39423df1683a98670bd7bf2b47","doc/windows-1255.txt":"4e5852494730054e2da258a74e1b9d780abbcdd8ce22ebc218ca2efe9e90493d","doc/windows-1256.txt":"c0879c5172abedead302a406e8f60d9cd9598694a0ffa4fd288ffe4fef7b8ea1","doc/windows-1257.txt":"c28a0c9f964fcb2b46d21f537c402446501a2800670481d6abf9fd9e9018d523","doc/windows-1258.txt":"5019ae4d61805c79aacbf17c93793342dbb098d65a1837783bc3e2c6d6a23602","doc/windows-874.txt":"4ef0e4501c5feba8b17aee1818602ed44b36ca8475db771ce2fc16d392cabecc","doc/x-mac-cyrillic.txt":"58be154d8a888ca3d484b83b44f749823ef339ab27f14d90ca9a856f5050a8bd","doc/x-user-defined.txt":"f9cd07c4321bf5cfb0be4bdddd251072999b04a6cf7a6f5bc63709a84e2c1ffc","generate-encoding-data.py":"92ddec35a834b6bc815fffffe6d07d9938a90d3c4526298637d8624410d83078","rustfmt.toml":"85c1a3b4382fd89e991cbb81b70fb52780472edc064c963943cdaaa56e0a2030","src/ascii.rs":"800cfbe3036d0c97ce27e07a4fd05edbcb7354ebec20903d81c76136d734931c","src/big5.rs":"1c94b35813314775c3fa1b10923cf8e8f8eba8c465d9833ad4293594e16c17f2","src/data.rs":"9544c019c7360a669bd3adaa90b70331124abd1df59841db66e74912bcdb96a5","src/euc_jp.rs":"0842e4f564a36051c6b85c47bbb652efae2f2926e91491daf77e4ceeecb18163","src/euc_kr.rs":"8e68590efa65485583bf57cae44ebf6de535bac1d37232e7f0307a38425fb992","src/gb18030.rs":"d269efb5e5d175f9d2ecf01d5606955a284b6f00749bb0ee23d3412c83aa3d59","src/handles.rs":"71aa7de1c5236a34ea0a8bb85332987751d2466b756fca6b3f6ac0da765cf91e","src/iso_2022_jp.rs":"3adc380736f24a5de36bc1cf81049bbe64473de10e6f12774195e6213c27c322","src/lib.rs":"e786de9e92e5652bc200266cf318753eea869e8971857cc0caa65a3cfe687545","src/macros.rs":"c7a019fd81d31de77569036ac36fd4e404b3f20144bbf79747faf4ea21538d09","src/mem.rs":"f412f60f2d4afb7e32ffba94dc5f93716e6ae9f065799ca17bb1f1b2145f6ee4","src/replacement.rs":"182c2093a6edb162183ca5990554fd7b199d3011924a8d80d894ba98ee7c479e","src/shift_jis.rs":"1c0c69ba6c123fcf720276646074660193bf9e6fa4327fe0d739a3e67874e081","src/simd_funcs.rs":"565ceeffe81173b85700c55c396ab72068751ef809bea8e1cb1e6c7919f5a905","src/single_byte.rs":"383d325dedbf3295acd50d880db1cecc29b69efe332ae2a37367cf40bf138ac4","src/test_data/big5_in.txt":"4c5a8691f8dc717311889c63894026d2fb62725a86c4208ca274a9cc8d42a503","src/test_data/big5_in_ref.txt":"99d399e17750cf9c7cf30bb253dbfe35b81c4fcbdead93cfa48b1429213473c7","src/test_data/big5_out.txt":"6193ca97c297aa20e09396038d18e938bb7ea331c26f0f2454097296723a0b13","src/test_data/big5_out_ref.txt":"36567691f557df144f6cc520015a87038dfa156f296fcf103b56ae9a718be1fc","src/test_data/euc_kr_in.txt":"c86a7224f3215fa0d04e685622a752fdc72763e8ae076230c7fd62de57ec4074","src/test_data/euc_kr_in_ref.txt":"1f419f4ca47d708b54c73c461545a022ae2e20498fdbf8005a483d752a204883","src/test_data/euc_kr_out.txt":"e7f32e026f70be1e1b58e0047baf7d3d2c520269c4f9b9992e158b4decb0a1a3","src/test_data/euc_kr_out_ref.txt":"c9907857980b20b8e9e3b584482ed6567a2be6185d72237b6322f0404944924e","src/test_data/gb18030_in.txt":"ab7231b2d3e9afacdbd7d7f3b9e5361a7ff9f7e1cfdb4f3bd905b9362b309e53","src/test_data/gb18030_in_ref.txt":"dc5069421adca2043c55f5012b55a76fdff651d22e6e699fd0978f8d5706815c","src/test_data/gb18030_out.txt":"f0208d527f5ca63de7d9a0323be8d5cf12d8a104b2943d92c2701f0c3364dac1","src/test_data/gb18030_out_ref.txt":"6819fe47627e4ea01027003fc514b9f21a1322e732d7f1fb92cc6c5455bc6c07","src/test_data/iso_2022_jp_in.txt":"cd24bbdcb1834e25db54646fbf4c41560a13dc7540f6be3dba4f5d97d44513af","src/test_data/iso_2022_jp_in_ref.txt":"3dc4e6a5e06471942d086b16c9440945e78415f6f3f47e43717e4bc2eac2cdf5","src/test_data/iso_2022_jp_out.txt":"9b6f015329dda6c3f9ee5ce6dbd6fa9c89acc21283e886836c78b8d833480c21","src/test_data/iso_2022_jp_out_ref.txt":"78cb260093a20116ad9a42f43b05d1848c5ab100b6b9a850749809e943884b35","src/test_data/jis0208_in.txt":"6df3030553ffb0a6615bb33dc8ea9dca6d9623a9028e2ffec754ce3c3da824cc","src/test_data/jis0208_in_ref.txt":"3dc4e6a5e06471942d086b16c9440945e78415f6f3f47e43717e4bc2eac2cdf5","src/test_data/jis0208_out.txt":"4ec24477e1675ce750733bdc3c5add1cd27b6bd4ce1f09289564646e9654e857","src/test_data/jis0208_out_ref.txt":"c3e1cef5032b2b1d93a406f31ff940c4e2dfe8859b8b17ca2761fee7a75a0e48","src/test_data/jis0212_in.txt":"c011f0dd72bd7c8cd922df9374ef8d2769a77190514c77f6c62b415852eeb9fe","src/test_data/jis0212_in_ref.txt":"7d9458b3d2f73e7092a7f505c08ce1d233dde18aa679fbcf9889256239cc9e06","src/test_data/shift_jis_in.txt":"02e389ccef0dd2122e63f503899402cb7f797912c2444cc80ab93131116c5524","src/test_data/shift_jis_in_ref.txt":"512f985950ca902e643c88682dba9708b7c38d3c5ec2925168ab00ac94ab19f9","src/test_data/shift_jis_out.txt":"5fbc44da7bf639bf6cfe0fa1fd3eba7102b88f81919c9ea991302712f69426fb","src/test_data/shift_jis_out_ref.txt":"466322c6fed8286c64582731755290c2296508efdd258826e6279686649b481f","src/test_labels_names.rs":"c962c7aeac3d9ef2aca70c9e21983b231d4cf998cb06879374b0401e5149d1da","src/testing.rs":"b299d27055f3b068de66cc10a75c024b881c48bc093627c01e0b1f8bd7d94666","src/utf_16.rs":"1ec4e1c8ed7e42e4de401c6d0f64c2835bd80c2a306f358959957d30e6ff1501","src/utf_8.rs":"f639fc5dccd5dcc2458936baa942237d0fd58ac398c83ea3f48e51dceb5b6a81","src/variant.rs":"619a8e604d2febe6a874e3ad73cddf3ef9e6011480aecf86f23708b313415251","src/x_user_defined.rs":"ab26ea900c8f7b7a4d1172872b7ca4bc573bc60b7b1979c93aafdfb86b2c2235"},"package":"a69d152eaa438a291636c1971b0a370212165ca8a75759eb66818c5ce9b538f7"} -\ No newline at end of file -+{"files":{"CONTRIBUTING.md":"06c26277e8dbd3f57be2eb51b5e3285dc1cbbf8c11326df413868ae702e6a61c","COPYRIGHT":"8b98376eb373dcf81950474efe34b5576a8171460dff500cc58a1ed8d160cd57","Cargo.toml":"fd56e8d662553f0cc559f8ef7097effefbc815ac3485799b37dee9df08ec803c","Ideas.md":"b7452893f500163868d8de52c09addaf91e1632454ed02e892c467ed7ec39dbd","LICENSE-APACHE":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","LICENSE-MIT":"f2ad48641d9c997d9ae3b95d93d1cd6e1ab12ab4c44de89937c7bfabbd076a4a","README.md":"8ae2a3548dee23c19e20564a90e2fd0dfa600cf4c2dfcc538f3455f4462d7133","build.rs":"82747097b0bb8999cdaf689a9e46195f6df5d691ee90bcde8a7b79f16bd976f0","doc/Big5.txt":"f73a2edc5cb6c2d140ba6e07f4542e1c4a234950378acde1df93480f0ca0be0b","doc/EUC-JP.txt":"ee2818b907d0137f40a9ab9fd525fc700a44dbdddb6cf0c157a656566bae4bf1","doc/EUC-KR.txt":"71d9e2ccf3b124e8bdfb433c8cf2773fd878077038d0cec3c7237a50f4a78a30","doc/GBK.txt":"c1b522b5a799884e5001da661f42c5a8f4d0acb9ef1d74b206f22b5f65365606","doc/IBM866.txt":"a5a433e804d0f83af785015179fbc1d9b0eaf1f7960efcd04093e136b51fbd0e","doc/ISO-2022-JP.txt":"af86684f5a8f0e2868d7b2c292860140c3d2e5527530ca091f1b28198e8e2fe6","doc/ISO-8859-10.txt":"6d3949ad7c81ca176895101ed81a1db7df1060d64e262880b94bd31bb344ab4d","doc/ISO-8859-13.txt":"3951dd89cf93f7729148091683cf8511f4529388b7dc8dcd0d62eaed55be93fa","doc/ISO-8859-14.txt":"3d330784a0374fd255a38b47949675cc7168c800530534b0a01cac6edc623adc","doc/ISO-8859-15.txt":"24b1084aab5127a85aab99153f86e24694d0a3615f53b5ce23683f97cf66c47a","doc/ISO-8859-16.txt":"ce0272559b92ba76d7a7e476f6424ae4a5cc72e75b183611b08392e44add4d25","doc/ISO-8859-2.txt":"18ceff88c13d1b5ba455a3919b1e3de489045c4c3d2dd7e8527c125c75d54aad","doc/ISO-8859-3.txt":"21798404c68f4f5db59223362f24999da96968c0628427321fccce7d2849a130","doc/ISO-8859-4.txt":"d27f6520c6c5bfbcc19176b71d081cdb3bccde1622bb3e420d5680e812632d53","doc/ISO-8859-5.txt":"a10ec8d6ea7a78ad15da7275f6cb1a3365118527e28f9af6d0d5830501303f3a","doc/ISO-8859-6.txt":"ccda8a2efc96115336bdd77776637b9712425e44fbcf745353b9057fbef144e7","doc/ISO-8859-7.txt":"17900fa1f27a445958f0a77d7d9056be375a6bd7ee4492aa680c7c1500bab85e","doc/ISO-8859-8-I.txt":"8357555646d54265a9b9ffa3e68b08d132312f1561c60108ff9b8b1167b6ecf2","doc/ISO-8859-8.txt":"72cd6f3afb7b4a9c16a66a362473315770b7755d72c86c870e52fc3eba86c8af","doc/KOI8-R.txt":"839cf19a38da994488004ed7814b1f6151640156a9a2af02bf2efca745fb5966","doc/KOI8-U.txt":"0cc76624ed1f024183e2298b7e019957da2c70c8ca06e0fc4e6f353f50a5054f","doc/Shift_JIS.txt":"34c49141818cb9ddbcf59cc858f78a79be8ad148d563f26415108ae1f148443f","doc/UTF-16BE.txt":"e2e280d8acbaa6d2a6b3569d60e17500a285f2baa0df3363dd85537cd5a1ef8f","doc/UTF-16LE.txt":"70bdc170e3fc5298ba68f10125fb5eeb8b077036cc96bb4416c4de396f6d76c1","doc/UTF-8.txt":"ea7bae742e613010ced002cf4b601a737d2203fad65e115611451bc4428f548a","doc/gb18030.txt":"dc71378a8f07a2d8659f69ee81fb8791fef56ba86f124b429978285237bb4a7b","doc/macintosh.txt":"57491e53866711b4672d9b9ff35380b9dac9e0d8e3d6c20bdd6140603687c023","doc/replacement.txt":"4b6c3bbd7999d9d4108a281594bd02d13607e334a95465afff8c2c08d395f0e4","doc/windows-1250.txt":"61296bb6a21cdab602300d32ecfba434cb82de5ac3bc88d58710d2f125e28d39","doc/windows-1251.txt":"7deea1c61dea1485c8ff02db2c7d578db7a9aab63ab1cfd02ec04b515864689e","doc/windows-1252.txt":"933ef3bdddfce5ee132b9f1a1aa8b47423d2587bbe475b19028d0a6d38e180b6","doc/windows-1253.txt":"1a38748b88e99071a5c7b3d5456ead4caedeabab50d50d658be105bc113714de","doc/windows-1254.txt":"f8372f86c6f8d642563cd6ddc025260553292a39423df1683a98670bd7bf2b47","doc/windows-1255.txt":"4e5852494730054e2da258a74e1b9d780abbcdd8ce22ebc218ca2efe9e90493d","doc/windows-1256.txt":"c0879c5172abedead302a406e8f60d9cd9598694a0ffa4fd288ffe4fef7b8ea1","doc/windows-1257.txt":"c28a0c9f964fcb2b46d21f537c402446501a2800670481d6abf9fd9e9018d523","doc/windows-1258.txt":"5019ae4d61805c79aacbf17c93793342dbb098d65a1837783bc3e2c6d6a23602","doc/windows-874.txt":"4ef0e4501c5feba8b17aee1818602ed44b36ca8475db771ce2fc16d392cabecc","doc/x-mac-cyrillic.txt":"58be154d8a888ca3d484b83b44f749823ef339ab27f14d90ca9a856f5050a8bd","doc/x-user-defined.txt":"f9cd07c4321bf5cfb0be4bdddd251072999b04a6cf7a6f5bc63709a84e2c1ffc","generate-encoding-data.py":"92ddec35a834b6bc815fffffe6d07d9938a90d3c4526298637d8624410d83078","rustfmt.toml":"85c1a3b4382fd89e991cbb81b70fb52780472edc064c963943cdaaa56e0a2030","src/ascii.rs":"800cfbe3036d0c97ce27e07a4fd05edbcb7354ebec20903d81c76136d734931c","src/big5.rs":"1c94b35813314775c3fa1b10923cf8e8f8eba8c465d9833ad4293594e16c17f2","src/data.rs":"9544c019c7360a669bd3adaa90b70331124abd1df59841db66e74912bcdb96a5","src/euc_jp.rs":"0842e4f564a36051c6b85c47bbb652efae2f2926e91491daf77e4ceeecb18163","src/euc_kr.rs":"8e68590efa65485583bf57cae44ebf6de535bac1d37232e7f0307a38425fb992","src/gb18030.rs":"d269efb5e5d175f9d2ecf01d5606955a284b6f00749bb0ee23d3412c83aa3d59","src/handles.rs":"0646bd091892ff7a76f34efccda4e5ddabe1e624e890baa9fdc9d48011d2d38b","src/iso_2022_jp.rs":"3adc380736f24a5de36bc1cf81049bbe64473de10e6f12774195e6213c27c322","src/lib.rs":"e2917fb9f605662ec4705d8c0b3c179f2264697a761191c3ec8101748cf717dc","src/macros.rs":"c7a019fd81d31de77569036ac36fd4e404b3f20144bbf79747faf4ea21538d09","src/mem.rs":"5498de31e816f51348b8d298d4fc9568da6b0b9363146f87ca5503131d33397f","src/replacement.rs":"182c2093a6edb162183ca5990554fd7b199d3011924a8d80d894ba98ee7c479e","src/shift_jis.rs":"1c0c69ba6c123fcf720276646074660193bf9e6fa4327fe0d739a3e67874e081","src/simd_funcs.rs":"857e61c1bda9d65286c23a6c3910d6814680bbc3064bf0ff92de5bc4f3edb6f3","src/single_byte.rs":"383d325dedbf3295acd50d880db1cecc29b69efe332ae2a37367cf40bf138ac4","src/test_data/big5_in.txt":"4c5a8691f8dc717311889c63894026d2fb62725a86c4208ca274a9cc8d42a503","src/test_data/big5_in_ref.txt":"99d399e17750cf9c7cf30bb253dbfe35b81c4fcbdead93cfa48b1429213473c7","src/test_data/big5_out.txt":"6193ca97c297aa20e09396038d18e938bb7ea331c26f0f2454097296723a0b13","src/test_data/big5_out_ref.txt":"36567691f557df144f6cc520015a87038dfa156f296fcf103b56ae9a718be1fc","src/test_data/euc_kr_in.txt":"c86a7224f3215fa0d04e685622a752fdc72763e8ae076230c7fd62de57ec4074","src/test_data/euc_kr_in_ref.txt":"1f419f4ca47d708b54c73c461545a022ae2e20498fdbf8005a483d752a204883","src/test_data/euc_kr_out.txt":"e7f32e026f70be1e1b58e0047baf7d3d2c520269c4f9b9992e158b4decb0a1a3","src/test_data/euc_kr_out_ref.txt":"c9907857980b20b8e9e3b584482ed6567a2be6185d72237b6322f0404944924e","src/test_data/gb18030_in.txt":"ab7231b2d3e9afacdbd7d7f3b9e5361a7ff9f7e1cfdb4f3bd905b9362b309e53","src/test_data/gb18030_in_ref.txt":"dc5069421adca2043c55f5012b55a76fdff651d22e6e699fd0978f8d5706815c","src/test_data/gb18030_out.txt":"f0208d527f5ca63de7d9a0323be8d5cf12d8a104b2943d92c2701f0c3364dac1","src/test_data/gb18030_out_ref.txt":"6819fe47627e4ea01027003fc514b9f21a1322e732d7f1fb92cc6c5455bc6c07","src/test_data/iso_2022_jp_in.txt":"cd24bbdcb1834e25db54646fbf4c41560a13dc7540f6be3dba4f5d97d44513af","src/test_data/iso_2022_jp_in_ref.txt":"3dc4e6a5e06471942d086b16c9440945e78415f6f3f47e43717e4bc2eac2cdf5","src/test_data/iso_2022_jp_out.txt":"9b6f015329dda6c3f9ee5ce6dbd6fa9c89acc21283e886836c78b8d833480c21","src/test_data/iso_2022_jp_out_ref.txt":"78cb260093a20116ad9a42f43b05d1848c5ab100b6b9a850749809e943884b35","src/test_data/jis0208_in.txt":"6df3030553ffb0a6615bb33dc8ea9dca6d9623a9028e2ffec754ce3c3da824cc","src/test_data/jis0208_in_ref.txt":"3dc4e6a5e06471942d086b16c9440945e78415f6f3f47e43717e4bc2eac2cdf5","src/test_data/jis0208_out.txt":"4ec24477e1675ce750733bdc3c5add1cd27b6bd4ce1f09289564646e9654e857","src/test_data/jis0208_out_ref.txt":"c3e1cef5032b2b1d93a406f31ff940c4e2dfe8859b8b17ca2761fee7a75a0e48","src/test_data/jis0212_in.txt":"c011f0dd72bd7c8cd922df9374ef8d2769a77190514c77f6c62b415852eeb9fe","src/test_data/jis0212_in_ref.txt":"7d9458b3d2f73e7092a7f505c08ce1d233dde18aa679fbcf9889256239cc9e06","src/test_data/shift_jis_in.txt":"02e389ccef0dd2122e63f503899402cb7f797912c2444cc80ab93131116c5524","src/test_data/shift_jis_in_ref.txt":"512f985950ca902e643c88682dba9708b7c38d3c5ec2925168ab00ac94ab19f9","src/test_data/shift_jis_out.txt":"5fbc44da7bf639bf6cfe0fa1fd3eba7102b88f81919c9ea991302712f69426fb","src/test_data/shift_jis_out_ref.txt":"466322c6fed8286c64582731755290c2296508efdd258826e6279686649b481f","src/test_labels_names.rs":"c962c7aeac3d9ef2aca70c9e21983b231d4cf998cb06879374b0401e5149d1da","src/testing.rs":"b299d27055f3b068de66cc10a75c024b881c48bc093627c01e0b1f8bd7d94666","src/utf_16.rs":"1ec4e1c8ed7e42e4de401c6d0f64c2835bd80c2a306f358959957d30e6ff1501","src/utf_8.rs":"f639fc5dccd5dcc2458936baa942237d0fd58ac398c83ea3f48e51dceb5b6a81","src/variant.rs":"619a8e604d2febe6a874e3ad73cddf3ef9e6011480aecf86f23708b313415251","src/x_user_defined.rs":"da51def859b870ced29cb87987f02d27b220eac0f222876cb72a1dc616f9d8ec"},"package":"0535f350c60aac0b87ccf28319abc749391e912192255b0c00a2c12c6917bd73"} -\ No newline at end of file -diff --git a/third_party/rust/encoding_rs/Cargo.toml b/third_party/rust/encoding_rs/Cargo.toml -index 65fc8e8dffcd..e29f19fb9afe 100644 ---- a/third_party/rust/encoding_rs/Cargo.toml -+++ b/third_party/rust/encoding_rs/Cargo.toml -@@ -12,47 +12,47 @@ - - [package] - name = "encoding_rs" --version = "0.8.14" -+version = "0.8.16" - authors = ["Henri Sivonen "] - description = "A Gecko-oriented implementation of the Encoding Standard" - homepage = "https://docs.rs/encoding_rs/" - documentation = "https://docs.rs/encoding_rs/" - readme = "README.md" - keywords = ["encoding", "web", "unicode", "charset"] - categories = ["text-processing", "encoding", "web-programming", "internationalization"] - license = "MIT/Apache-2.0" - repository = "https://github.com/hsivonen/encoding_rs" - [profile.release] - lto = true - [dependencies.cfg-if] - version = "0.1.0" - --[dependencies.serde] --version = "1.0" -+[dependencies.packed_simd] -+version = "0.3.3" - optional = true - --[dependencies.simd] --version = "0.2.3" -+[dependencies.serde] -+version = "1.0" - optional = true - [dev-dependencies.bincode] - version = "0.8" - - [dev-dependencies.serde_derive] - version = "1.0" - - [dev-dependencies.serde_json] - version = "1.0" - - [features] - fast-big5-hanzi-encode = [] - fast-gb-hanzi-encode = [] - fast-hangul-encode = [] - fast-hanja-encode = [] - fast-kanji-encode = [] - fast-legacy-encode = ["fast-hangul-encode", "fast-hanja-encode", "fast-kanji-encode", "fast-gb-hanzi-encode", "fast-big5-hanzi-encode"] - less-slow-big5-hanzi-encode = [] - less-slow-gb-hanzi-encode = [] - less-slow-kanji-encode = [] --simd-accel = ["simd"] -+simd-accel = ["packed_simd", "packed_simd/into_bits"] - [badges.travis-ci] - repository = "hsivonen/encoding_rs" -diff --git a/third_party/rust/encoding_rs/README.md b/third_party/rust/encoding_rs/README.md -index 3446efd0bb43..8a72b515450e 100644 ---- a/third_party/rust/encoding_rs/README.md -+++ b/third_party/rust/encoding_rs/README.md -@@ -126,17 +126,39 @@ There are currently these optional cargo features: - - ### `simd-accel` - --Enables SSE2 acceleration on x86 and x86_64 and NEON acceleration on Aarch64 --and ARMv7. _Enabling this cargo feature is recommended when building for x86, --x86_64, ARMv7 or Aarch64._ The intention is for the functionality enabled by --this feature to become the normal on-by-default behavior once --[portable SIMD](https://github.com/rust-lang/rfcs/pull/2366) becames part of --stable Rust. -+Enables SIMD acceleration using the nightly-dependent `packed_simd` crate. - --Enabling this feature breaks the build unless the target is x86 with SSE2 --(Rust's default 32-bit x86 target, `i686`, has SSE2, but Linux distros may --use an x86 target without SSE2, i.e. `i586` in `rustup` terms), ARMv7 or --thumbv7 with NEON (`-C target_feature=+neon`), x86_64 or Aarch64. -+This is an opt-in feature, because enabling this feature _opts out_ of Rust's -+guarantees of future compilers compiling old code (aka. "stability story"). -+ -+Currently, this has not been tested to be an improvement except for these -+targets: -+ -+* x86_64 -+* i686 -+* aarch64 -+* thumbv7neon -+ -+If you use nightly Rust, you use targets whose first component is one of the -+above, and you are prepared _to have to revise your configuration when updating -+Rust_, you should enable this feature. Otherwise, please _do not_ enable this -+feature. -+ -+_Note!_ If you are compiling for a target that does not have 128-bit SIMD -+enabled as part of the target definition and you are enabling 128-bit SIMD -+using `-C target_feature`, you need to enable the `core_arch` Cargo feature -+for `packed_simd` to compile a crates.io snapshot of `core_arch` instead of -+using the standard-library copy of `core::arch`, because the `core::arch` -+module of the pre-compiled standard library has been compiled with the -+assumption that the CPU doesn't have 128-bit SIMD. At present this applies -+mainly to 32-bit ARM targets whose first component does not include the -+substring `neon`. -+ -+The encoding_rs side of things has not been properly set up for POWER, -+PowerPC, MIPS, etc., SIMD at this time, so even if you were to follow -+the advice from the previous paragraph, you probably shouldn't use -+the `simd-accel` option on the less mainstream architectures at this -+time. - - Used by Firefox. - -@@ -382,6 +404,14 @@ To regenerate the generated code: - - ## Release Notes - -+### 0.8.16 -+ -+* Switch from the `simd` crate to `packed_simd`. -+ -+### 0.8.15 -+ -+* Adjust documentation for `simd-accel` (README-only release). -+ - ### 0.8.14 - - * Made UTF-16 to UTF-8 encode conversion fill the output buffer as -diff --git a/third_party/rust/encoding_rs/build.rs b/third_party/rust/encoding_rs/build.rs -index 1b7adf780010..e687878081f7 100644 ---- a/third_party/rust/encoding_rs/build.rs -+++ b/third_party/rust/encoding_rs/build.rs -@@ -1,4 +1,12 @@ - fn main() { -+ // This does not enable `RUSTC_BOOTSTRAP=1` for `packed_simd`. -+ // You still need to knowingly have a setup that makes -+ // `packed_simd` compile. Therefore, having this file on -+ // crates.io is harmless in terms of users of `encoding_rs` -+ // accidentally depending on nightly features. Having this -+ // here means that if you knowingly want this, you only -+ // need to maintain a fork of `packed_simd` without _also_ -+ // having to maintain a fork of `encoding_rs`. - #[cfg(feature = "simd-accel")] - println!("cargo:rustc-env=RUSTC_BOOTSTRAP=1"); - } -diff --git a/third_party/rust/encoding_rs/src/handles.rs b/third_party/rust/encoding_rs/src/handles.rs -index d75b65d75ce3..08da62d20051 100644 ---- a/third_party/rust/encoding_rs/src/handles.rs -+++ b/third_party/rust/encoding_rs/src/handles.rs -@@ -34,7 +34,7 @@ use simd_funcs::*; - all(target_endian = "little", target_feature = "neon") - ) - ))] --use simd::u16x8; -+use packed_simd::u16x8; - - use super::DecoderResult; - use super::EncoderResult; -diff --git a/third_party/rust/encoding_rs/src/lib.rs b/third_party/rust/encoding_rs/src/lib.rs -index 912c349a0e25..23069375d6f8 100644 ---- a/third_party/rust/encoding_rs/src/lib.rs -+++ b/third_party/rust/encoding_rs/src/lib.rs -@@ -11,7 +11,7 @@ - feature = "cargo-clippy", - allow(doc_markdown, inline_always, new_ret_no_self) - )] --#![doc(html_root_url = "https://docs.rs/encoding_rs/0.8.14")] -+#![doc(html_root_url = "https://docs.rs/encoding_rs/0.8.16")] - - //! encoding_rs is a Gecko-oriented Free Software / Open Source implementation - //! of the [Encoding Standard](https://encoding.spec.whatwg.org/) in Rust. -@@ -665,20 +665,21 @@ - //! See the section [_UTF-16LE, UTF-16BE and Unicode Encoding Schemes_](#utf-16le-utf-16be-and-unicode-encoding-schemes) - //! for discussion about the UTF-16 family. - --#![cfg_attr(feature = "simd-accel", feature(platform_intrinsics, core_intrinsics))] -+#![cfg_attr(feature = "simd-accel", feature(stdsimd, core_intrinsics))] - - #[macro_use] - extern crate cfg_if; - - #[cfg(all( - feature = "simd-accel", - any( - target_feature = "sse2", - all(target_endian = "little", target_arch = "aarch64"), - all(target_endian = "little", target_feature = "neon") - ) - ))] --extern crate simd; -+#[macro_use(shuffle)] -+extern crate packed_simd; - - #[cfg(feature = "serde")] - extern crate serde; -diff --git a/third_party/rust/encoding_rs/src/mem.rs b/third_party/rust/encoding_rs/src/mem.rs -index 6cd1a4448056..c5ee605c1b13 100644 ---- a/third_party/rust/encoding_rs/src/mem.rs -+++ b/third_party/rust/encoding_rs/src/mem.rs -@@ -228,8 +228,8 @@ macro_rules! by_unit_check_simd { - cfg_if! { - if #[cfg(all(feature = "simd-accel", any(target_feature = "sse2", all(target_endian = "little", target_arch = "aarch64"), all(target_endian = "little", target_feature = "neon"))))] { - use simd_funcs::*; -- use simd::u8x16; -- use simd::u16x8; -+ use packed_simd::u8x16; -+ use packed_simd::u16x8; - - const SIMD_ALIGNMENT: usize = 16; - -@@ -631,47 +631,42 @@ cfg_if! { - /// - /// May read the entire buffer even if it isn't all-ASCII. (I.e. the function - /// is not guaranteed to fail fast.) --#[inline] - pub fn is_ascii(buffer: &[u8]) -> bool { - is_ascii_impl(buffer) - } - - /// Checks whether the buffer is all-Basic Latin (i.e. UTF-16 representing - /// only ASCII characters). - /// - /// May read the entire buffer even if it isn't all-ASCII. (I.e. the function - /// is not guaranteed to fail fast.) --#[inline] - pub fn is_basic_latin(buffer: &[u16]) -> bool { - is_basic_latin_impl(buffer) - } - - /// Checks whether the buffer is valid UTF-8 representing only code points - /// less than or equal to U+00FF. - /// - /// Fails fast. (I.e. returns before having read the whole buffer if UTF-8 - /// invalidity or code points above U+00FF are discovered. --#[inline] - pub fn is_utf8_latin1(buffer: &[u8]) -> bool { - is_utf8_latin1_impl(buffer).is_none() - } - - /// Checks whether the buffer represents only code point less than or equal - /// to U+00FF. - /// - /// Fails fast. (I.e. returns before having read the whole buffer if code - /// points above U+00FF are discovered. --#[inline] - pub fn is_str_latin1(buffer: &str) -> bool { - is_str_latin1_impl(buffer).is_none() - } - - /// Checks whether the buffer represents only code point less than or equal - /// to U+00FF. - /// - /// May read the entire buffer even if it isn't all-Latin1. (I.e. the function - /// is not guaranteed to fail fast.) --#[inline] - pub fn is_utf16_latin1(buffer: &[u16]) -> bool { - is_utf16_latin1_impl(buffer) - } -@@ -1283,7 +1278,6 @@ pub fn is_str_bidi(buffer: &str) -> bool { - /// high surrogate that could be the high half of an RTL character. - /// Returns `false` if the input contains neither RTL characters nor - /// unpaired high surrogates that could be higher halves of RTL characters. --#[inline] - pub fn is_utf16_bidi(buffer: &[u16]) -> bool { - is_utf16_bidi_impl(buffer) - } -@@ -1416,67 +1410,63 @@ pub fn is_utf16_code_unit_bidi(u: u16) -> bool { - /// Returns `Latin1Bidi::Latin1` if `is_utf8_latin1()` would return `true`. - /// Otherwise, returns `Latin1Bidi::Bidi` if `is_utf8_bidi()` would return - /// `true`. Otherwise, returns `Latin1Bidi::LeftToRight`. --#[inline] - pub fn check_utf8_for_latin1_and_bidi(buffer: &[u8]) -> Latin1Bidi { - if let Some(offset) = is_utf8_latin1_impl(buffer) { - if is_utf8_bidi(&buffer[offset..]) { - Latin1Bidi::Bidi - } else { - Latin1Bidi::LeftToRight - } - } else { - Latin1Bidi::Latin1 - } - } - - /// Checks whether a valid UTF-8 buffer contains code points - /// that trigger right-to-left processing or is all-Latin1. - /// - /// Possibly more efficient than performing the checks separately. - /// - /// Returns `Latin1Bidi::Latin1` if `is_str_latin1()` would return `true`. - /// Otherwise, returns `Latin1Bidi::Bidi` if `is_str_bidi()` would return - /// `true`. Otherwise, returns `Latin1Bidi::LeftToRight`. --#[inline] - pub fn check_str_for_latin1_and_bidi(buffer: &str) -> Latin1Bidi { - // The transition from the latin1 check to the bidi check isn't - // optimal but not tweaking it to perfection today. - if let Some(offset) = is_str_latin1_impl(buffer) { - if is_str_bidi(&buffer[offset..]) { - Latin1Bidi::Bidi - } else { - Latin1Bidi::LeftToRight - } - } else { - Latin1Bidi::Latin1 - } - } - - /// Checks whether a potentially invalid UTF-16 buffer contains code points - /// that trigger right-to-left processing or is all-Latin1. - /// - /// Possibly more efficient than performing the checks separately. - /// - /// Returns `Latin1Bidi::Latin1` if `is_utf16_latin1()` would return `true`. - /// Otherwise, returns `Latin1Bidi::Bidi` if `is_utf16_bidi()` would return - /// `true`. Otherwise, returns `Latin1Bidi::LeftToRight`. --#[inline] - pub fn check_utf16_for_latin1_and_bidi(buffer: &[u16]) -> Latin1Bidi { - check_utf16_for_latin1_and_bidi_impl(buffer) - } - - /// Converts potentially-invalid UTF-8 to valid UTF-16 with errors replaced - /// with the REPLACEMENT CHARACTER. - /// - /// The length of the destination buffer must be at least the length of the - /// source buffer _plus one_. - /// - /// Returns the number of `u16`s written. - /// - /// # Panics - /// - /// Panics if the destination buffer is shorter than stated above. --#[inline] - pub fn convert_utf8_to_utf16(src: &[u8], dst: &mut [u16]) -> usize { - // TODO: Can the requirement for dst to be at least one unit longer - // be eliminated? -@@ -1516,7 +1506,6 @@ pub fn convert_utf8_to_utf16(src: &[u8], dst: &mut [u16]) -> usize { - /// # Panics - /// - /// Panics if the destination buffer is shorter than stated above. --#[inline] - pub fn convert_str_to_utf16(src: &str, dst: &mut [u16]) -> usize { - assert!( - dst.len() >= src.len(), -@@ -1683,7 +1672,6 @@ pub fn convert_utf16_to_utf8(src: &[u16], dst: &mut [u8]) -> usize { - /// not allocating memory for the worst case up front. Specifically, - /// if the input starts with or ends with an unpaired surrogate, those are - /// replaced with the REPLACEMENT CHARACTER. --#[inline] - pub fn convert_utf16_to_str_partial(src: &[u16], dst: &mut str) -> (usize, usize) { - let bytes: &mut [u8] = unsafe { dst.as_bytes_mut() }; - let (read, written) = convert_utf16_to_utf8_partial(src, bytes); -@@ -1727,7 +1715,6 @@ pub fn convert_utf16_to_str(src: &[u16], dst: &mut str) -> usize { - /// # Panics - /// - /// Panics if the destination buffer is shorter than stated above. --#[inline] - pub fn convert_latin1_to_utf16(src: &[u8], dst: &mut [u16]) { - assert!( - dst.len() >= src.len(), -@@ -1755,7 +1742,6 @@ pub fn convert_latin1_to_utf16(src: &[u8], dst: &mut [u16]) { - /// indicated by the return value, so using a `&mut str` interpreted as - /// `&mut [u8]` as the destination is not safe. If you want to convert into - /// a `&mut str`, use `convert_utf16_to_str()` instead of this function. --#[inline] - pub fn convert_latin1_to_utf8_partial(src: &[u8], dst: &mut [u8]) -> (usize, usize) { - let src_len = src.len(); - let src_ptr = src.as_ptr(); -@@ -1894,7 +1880,6 @@ pub fn convert_latin1_to_str(src: &[u8], dst: &mut str) -> usize { - /// - /// If debug assertions are enabled (and not fuzzing) and the input is - /// not in the range U+0000 to U+00FF, inclusive. --#[inline] - pub fn convert_utf8_to_latin1_lossy(src: &[u8], dst: &mut [u8]) -> usize { - assert!( - dst.len() >= src.len(), -@@ -1957,7 +1942,6 @@ pub fn convert_utf8_to_latin1_lossy(src: &[u8], dst: &mut [u8]) -> usize { - /// - /// (Probably in future versions if debug assertions are enabled (and not - /// fuzzing) and the input is not in the range U+0000 to U+00FF, inclusive.) --#[inline] - pub fn convert_utf16_to_latin1_lossy(src: &[u16], dst: &mut [u8]) { - assert!( - dst.len() >= src.len(), -@@ -2030,7 +2014,6 @@ pub fn encode_latin1_lossy<'a>(string: &'a str) -> Cow<'a, [u8]> { - - /// Returns the index of the first unpaired surrogate or, if the input is - /// valid UTF-16 in its entirety, the length of the input. --#[inline] - pub fn utf16_valid_up_to(buffer: &[u16]) -> usize { - utf16_valid_up_to_impl(buffer) - } -@@ -2060,61 +2043,58 @@ pub fn ensure_utf16_validity(buffer: &mut [u16]) { - /// # Panics - /// - /// Panics if the destination buffer is shorter than stated above. --#[inline] - pub fn copy_ascii_to_ascii(src: &[u8], dst: &mut [u8]) -> usize { - assert!( - dst.len() >= src.len(), - "Destination must not be shorter than the source." - ); - if let Some((_, consumed)) = - unsafe { ascii_to_ascii(src.as_ptr(), dst.as_mut_ptr(), src.len()) } - { - consumed - } else { - src.len() - } - } - - /// Copies ASCII from source to destination zero-extending it to UTF-16 up to - /// the first non-ASCII byte (or the end of the input if it is ASCII in its - /// entirety). - /// - /// The length of the destination buffer must be at least the length of the - /// source buffer. - /// - /// Returns the number of `u16`s written. - /// - /// # Panics - /// - /// Panics if the destination buffer is shorter than stated above. --#[inline] - pub fn copy_ascii_to_basic_latin(src: &[u8], dst: &mut [u16]) -> usize { - assert!( - dst.len() >= src.len(), - "Destination must not be shorter than the source." - ); - if let Some((_, consumed)) = - unsafe { ascii_to_basic_latin(src.as_ptr(), dst.as_mut_ptr(), src.len()) } - { - consumed - } else { - src.len() - } - } - - /// Copies Basic Latin from source to destination narrowing it to ASCII up to - /// the first non-Basic Latin code unit (or the end of the input if it is - /// Basic Latin in its entirety). - /// - /// The length of the destination buffer must be at least the length of the - /// source buffer. - /// - /// Returns the number of bytes written. - /// - /// # Panics - /// - /// Panics if the destination buffer is shorter than stated above. --#[inline] - pub fn copy_basic_latin_to_ascii(src: &[u16], dst: &mut [u8]) -> usize { - assert!( - dst.len() >= src.len(), -diff --git a/third_party/rust/encoding_rs/src/simd_funcs.rs b/third_party/rust/encoding_rs/src/simd_funcs.rs -index 0cc05baf784d..4e19b0e8a07e 100644 ---- a/third_party/rust/encoding_rs/src/simd_funcs.rs -+++ b/third_party/rust/encoding_rs/src/simd_funcs.rs -@@ -7,9 +7,9 @@ - // option. This file may not be copied, modified, or distributed - // except according to those terms. - --use simd::u16x8; --use simd::u8x16; --use simd::Simd; -+use packed_simd::u16x8; -+use packed_simd::u8x16; -+use packed_simd::FromBits; - - // TODO: Migrate unaligned access to stdlib code if/when the RFC - // https://github.com/rust-lang/rfcs/pull/1725 is implemented. -@@ -62,81 +62,79 @@ pub unsafe fn store8_aligned(ptr: *mut u16, s: u16x8) { - *(ptr as *mut u16x8) = s; - } - --extern "platform-intrinsic" { -- fn simd_shuffle16>(x: T, y: T, idx: [u32; 16]) -> U; -+cfg_if! { -+ if #[cfg(all(target_feature = "sse2", target_arch = "x86_64"))] { -+ use std::arch::x86_64::__m128i; -+ use std::arch::x86_64::_mm_movemask_epi8; -+ use std::arch::x86_64::_mm_packus_epi16; -+ } else if #[cfg(all(target_feature = "sse2", target_arch = "x86"))] { -+ use std::arch::x86::__m128i; -+ use std::arch::x86::_mm_movemask_epi8; -+ use std::arch::x86::_mm_packus_epi16; -+ } else if #[cfg(target_arch = "aarch64")]{ -+ use std::arch::aarch64::uint8x16_t; -+ use std::arch::aarch64::uint16x8_t; -+ use std::arch::aarch64::vmaxvq_u8; -+ use std::arch::aarch64::vmaxvq_u16; -+ } else { -+ -+ } - } - - // #[inline(always)] - // fn simd_byte_swap_u8(s: u8x16) -> u8x16 { - // unsafe { --// simd_shuffle16(s, s, [1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14]) -+// shuffle!(s, s, [1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14]) - // } - // } - - // #[inline(always)] - // pub fn simd_byte_swap(s: u16x8) -> u16x8 { - // to_u16_lanes(simd_byte_swap_u8(to_u8_lanes(s))) - // } - - #[inline(always)] - pub fn simd_byte_swap(s: u16x8) -> u16x8 { - let left = s << 8; - let right = s >> 8; - left | right - } - - #[inline(always)] - pub fn to_u16_lanes(s: u8x16) -> u16x8 { -- unsafe { ::std::mem::transmute(s) } -+ u16x8::from_bits(s) - } - --// #[inline(always)] --// pub fn to_u8_lanes(s: u16x8) -> u8x16 { --// unsafe { ::std::mem::transmute(s) } --// } -- - cfg_if! { - if #[cfg(target_feature = "sse2")] { - -- use simd::i16x8; -- use simd::i8x16; -- extern "platform-intrinsic" { -- fn x86_mm_movemask_epi8(x: i8x16) -> i32; -- } -- - // Expose low-level mask instead of higher-level conclusion, - // because the non-ASCII case would perform less well otherwise. - #[inline(always)] - pub fn mask_ascii(s: u8x16) -> i32 { - unsafe { -- let signed: i8x16 = ::std::mem::transmute_copy(&s); -- x86_mm_movemask_epi8(signed) -+ _mm_movemask_epi8(__m128i::from_bits(s)) - } - } - - } else { - - } - } - - cfg_if! { - if #[cfg(target_feature = "sse2")] { - #[inline(always)] - pub fn simd_is_ascii(s: u8x16) -> bool { - unsafe { -- let signed: i8x16 = ::std::mem::transmute_copy(&s); -- x86_mm_movemask_epi8(signed) == 0 -+ _mm_movemask_epi8(__m128i::from_bits(s)) == 0 - } - } - } else if #[cfg(target_arch = "aarch64")]{ -- extern "platform-intrinsic" { -- fn aarch64_vmaxvq_u8(x: u8x16) -> u8; -- } -- - #[inline(always)] - pub fn simd_is_ascii(s: u8x16) -> bool { - unsafe { -- aarch64_vmaxvq_u8(s) < 0x80 -+ vmaxvq_u8(uint8x16_t::from_bits(s)) < 0x80 - } - } - } else { -@@ -164,35 +162,31 @@ cfg_if! { - #[inline(always)] - pub fn simd_is_str_latin1(s: u8x16) -> bool { - unsafe { -- aarch64_vmaxvq_u8(s) < 0xC4 -+ vmaxvq_u8(uint8x16_t::from_bits(s)) < 0xC4 - } - } - } else { - #[inline(always)] - pub fn simd_is_str_latin1(s: u8x16) -> bool { - let above_str_latin1 = u8x16::splat(0xC4); - s.lt(above_str_latin1).all() - } - } - } - - cfg_if! { - if #[cfg(target_arch = "aarch64")]{ -- extern "platform-intrinsic" { -- fn aarch64_vmaxvq_u16(x: u16x8) -> u16; -- } -- - #[inline(always)] - pub fn simd_is_basic_latin(s: u16x8) -> bool { - unsafe { -- aarch64_vmaxvq_u16(s) < 0x80 -+ vmaxvq_u16(uint16x8_t::from_bits(s)) < 0x80 - } - } - - #[inline(always)] - pub fn simd_is_latin1(s: u16x8) -> bool { - unsafe { -- aarch64_vmaxvq_u16(s) < 0x100 -+ vmaxvq_u16(uint16x8_t::from_bits(s)) < 0x100 - } - } - } else { -@@ -225,7 +219,7 @@ cfg_if! { - macro_rules! aarch64_return_false_if_below_hebrew { - ($s:ident) => ({ - unsafe { -- if aarch64_vmaxvq_u16($s) < 0x0590 { -+ if vmaxvq_u16(uint16x8_t::from_bits($s)) < 0x0590 { - return false; - } - } -@@ -292,47 +286,38 @@ pub fn is_u16x8_bidi(s: u16x8) -> bool { - #[inline(always)] - pub fn simd_unpack(s: u8x16) -> (u16x8, u16x8) { - unsafe { -- let first: u8x16 = simd_shuffle16( -+ let first: u8x16 = shuffle!( - s, - u8x16::splat(0), -- [0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23], -+ [0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23] - ); -- let second: u8x16 = simd_shuffle16( -+ let second: u8x16 = shuffle!( - s, - u8x16::splat(0), -- [8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31], -+ [8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31] - ); -- ( -- ::std::mem::transmute_copy(&first), -- ::std::mem::transmute_copy(&second), -- ) -+ (u16x8::from_bits(first), u16x8::from_bits(second)) - } - } - - cfg_if! { - if #[cfg(target_feature = "sse2")] { -- extern "platform-intrinsic" { -- fn x86_mm_packus_epi16(x: i16x8, y: i16x8) -> u8x16; -- } -- - #[inline(always)] - pub fn simd_pack(a: u16x8, b: u16x8) -> u8x16 { - unsafe { -- let first: i16x8 = ::std::mem::transmute_copy(&a); -- let second: i16x8 = ::std::mem::transmute_copy(&b); -- x86_mm_packus_epi16(first, second) -+ u8x16::from_bits(_mm_packus_epi16(__m128i::from_bits(a), __m128i::from_bits(b))) - } - } - } else { - #[inline(always)] - pub fn simd_pack(a: u16x8, b: u16x8) -> u8x16 { - unsafe { -- let first: u8x16 = ::std::mem::transmute_copy(&a); -- let second: u8x16 = ::std::mem::transmute_copy(&b); -- simd_shuffle16( -+ let first = u8x16::from_bits(a); -+ let second = u8x16::from_bits(b); -+ shuffle!( - first, - second, -- [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30], -+ [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30] - ) - } - } -diff --git a/third_party/rust/encoding_rs/src/x_user_defined.rs b/third_party/rust/encoding_rs/src/x_user_defined.rs -index 6d0d613fa093..2d2076987984 100644 ---- a/third_party/rust/encoding_rs/src/x_user_defined.rs -+++ b/third_party/rust/encoding_rs/src/x_user_defined.rs -@@ -14,15 +14,12 @@ use variant::*; - cfg_if! { - if #[cfg(feature = "simd-accel")] { - use simd_funcs::*; -- use simd::u16x8; -+ use packed_simd::u16x8; - - #[inline(always)] - fn shift_upper(unpacked: u16x8) -> u16x8 { - let highest_ascii = u16x8::splat(0x7F); -- let offset = u16x8::splat(0xF700); -- let mask = unpacked.gt(highest_ascii).to_repr().to_u16(); -- unpacked + (offset & mask) -- } -+ unpacked + unpacked.gt(highest_ascii).select(u16x8::splat(0xF700), u16x8::splat(0)) } - } else { - } - } -diff --git a/third_party/rust/packed_simd/.appveyor.yml b/third_party/rust/packed_simd/.appveyor.yml -new file mode 100644 -index 000000000000..0388cee0a07b ---- /dev/null -+++ b/third_party/rust/packed_simd/.appveyor.yml -@@ -0,0 +1,59 @@ -+matrix: -+ allow_failures: -+ # FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/72 -+ - TARGET: i686-pc-windows-msvc -+ - TARGET: i686-pc-windows-gnu -+ - TARGET: x86_64-pc-windows-gnu -+ fast_finish: true -+ -+environment: -+ matrix: -+ - TARGET: x86_64-pc-windows-msvc -+ MSYSTEM: MINGW64 -+ NOVERIFY: "1" -+ - TARGET: x86_64-pc-windows-msvc -+ MSYSTEM: MINGW64 -+ RUSTFLAGS: "-C target-feature=+sse4.2" -+ NOVERIFY: "1" -+ - TARGET: x86_64-pc-windows-msvc -+ MSYSTEM: MINGW64 -+ RUSTFLAGS: "-C target-feature=+avx" -+ NOVERIFY: "1" -+ - TARGET: x86_64-pc-windows-msvc -+ MSYSTEM: MINGW64 -+ RUSTFLAGS: "-C target-feature=+avx2" -+ NOVERIFY: "1" -+ -+ - TARGET: i686-pc-windows-msvc -+ MSYSTEM: MINGW32 -+ NOVERIFY: "1" -+ - TARGET: i686-pc-windows-msvc -+ MSYSTEM: MINGW32 -+ RUSTFLAGS: "-C target-feature=+sse4.2" -+ NOVERIFY: "1" -+ - TARGET: i686-pc-windows-msvc -+ MSYSTEM: MINGW32 -+ RUSTFLAGS: "-C target-feature=+avx" -+ NOVERIFY: "1" -+ - TARGET: i686-pc-windows-msvc -+ MSYSTEM: MINGW32 -+ RUSTFLAGS: "-C target-feature=+avx2" -+ NOVERIFY: "1" -+ -+ - TARGET: x86_64-pc-windows-gnu -+ MSYSTEM: MINGW64 -+ -+ - TARGET: i686-pc-windows-gnu -+ MSYSTEM: MINGW32 -+ - TARGET: x86_64-pc-windows-gnu -+ MSYSTEM: MINGW64 -+install: -+ - ps: if (ls -r . -fi "*.rs" | sls "`t") { throw "Found tab character" } -+ - ps: Start-FileDownload "https://static.rust-lang.org/dist/rust-nightly-${env:TARGET}.exe" -FileName "rust-install.exe" -+ - ps: .\rust-install.exe /VERYSILENT /NORESTART /DIR="C:\rust" | Out-Null -+ - ps: $env:PATH="$env:PATH;C:\rust\bin" -+ - set PATH=c:\msys64\%MSYSTEM%\bin;c:\msys64\usr\bin;%PATH% -+ - rustc -vV -+ - cargo -vV -+build: false -+test_script: bash -c "ci/run.sh" -diff --git a/third_party/rust/packed_simd/.cargo-checksum.json b/third_party/rust/packed_simd/.cargo-checksum.json -new file mode 100644 -index 000000000000..01afcc1efdac ---- /dev/null -+++ b/third_party/rust/packed_simd/.cargo-checksum.json -@@ -0,0 +1 @@ -+{"files":{".appveyor.yml":"f1ed01850e0d725f9498f52a1a63ddf40702ad6e0bf5b2d7c4c04d76e96794a3",".travis.yml":"e9258d9a54fdaf4cbc12405fe5993ac4497eb2b29021691dbc91b19cb9b52227","Cargo.toml":"089941ba3c89ea111cbea3cc3abdcdcf2b9d0ae0db268d7269ee38226db950e5","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","bors.toml":"dee881dc69b9b7834e4eba5d95c3ed5a416d4628815a167d6a22d4cb4fb064b8","build.rs":"f3baefc5e5bb9b250e762a1466371b922fd7ee4243c217b2d014307603c2f57a","ci/all.sh":"a23d14e10cb26a0eb719e389c30eb955fa53cddcd436890646df09af640bd2eb","ci/android-install-ndk.sh":"0f1746108cc30bf9b9ba45bcde7b19fc1a8bdf5b0258035b4eb8dc69b75efac4","ci/android-install-sdk.sh":"3490432022c5c8f5a115c084f7a9aca1626f96c0c87ffb62019228c4346b47e4","ci/android-sysimage.sh":"ebf4e5daa1f0fe1b2092b79f0f3f161c4c4275cb744e52352c4d81ab451e4c5a","ci/benchmark.sh":"b61d19ef6b90deba8fb79dee74c8b062d94844676293da346da87bb78a9a49a4","ci/deploy_and_run_on_ios_simulator.rs":"ec8ecf82d92072676aa47f0d1a3d021b60a7ae3531153ef12d2ff4541fc294dc","ci/docker/aarch64-linux-android/Dockerfile":"ace2e7d33c87bc0f6d3962a4a3408c04557646f7f51ab99cfbf574906796b016","ci/docker/aarch64-unknown-linux-gnu/Dockerfile":"1ecdac757101d951794fb2ab0deaa278199cf25f2e08a15c7d40ff31a8556184","ci/docker/arm-linux-androideabi/Dockerfile":"370e55d3330a413a3ccf677b3afb3e0ef9018a5fab263faa97ae8ac017fc2286","ci/docker/arm-unknown-linux-gnueabi/Dockerfile":"e25d88f6c0c94aada3d2e3f08243f755feb7e869dc5dc505b3799719cb1af591","ci/docker/arm-unknown-linux-gnueabihf/Dockerfile":"f126f4c7bae8c11ab8b16df06ad997863f0838825a9c08c9899a3eedb6d570bd","ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile":"b647545c158ee480a4c581dbdc1f57833aef056c8d498acc04b573e842bf803c","ci/docker/i586-unknown-linux-gnu/Dockerfile":"0d492759017307ccf74dc2aa4a8cf6623daf3dc728c708dc2b18fa7940800cba","ci/docker/i686-unknown-linux-gnu/Dockerfile":"0d492759017307ccf74dc2aa4a8cf6623daf3dc728c708dc2b18fa7940800cba","ci/docker/mips-unknown-linux-gnu/Dockerfile":"323776469bb7b160385f3621d66e3ee14c75242f8180f916e65af048a29d4ea0","ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile":"c647f6948a9a43b0be695cbed4eac752120d0faf28e5e69c718cb10406921dab","ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile":"77bfd00cc8639509be381b394f077e39b45a00158ad61b4e1656714c714665d1","ci/docker/mipsel-unknown-linux-musl/Dockerfile":"ec5bea6c98a3b626731fdb95f9ff2d1182639c76e8fb16d3271d0fc884901524","ci/docker/powerpc-unknown-linux-gnu/Dockerfile":"4f2b662de66e83d1354f650b7077692309637f786c2ea5516c31b5c2ee10af2d","ci/docker/powerpc64-unknown-linux-gnu/Dockerfile":"a9595402b772bc365982e22a0096a8988825d90b09b5faa97ab192e76072f71d","ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile":"df3c381c157439695ae8cd10ab71664702c061e3b4ab22906a5ad6c2680acfed","ci/docker/s390x-unknown-linux-gnu/Dockerfile":"93fb44df3d7fd31ead158570667c97b5076a05c3d968af4a84bc13819a8f2db8","ci/docker/sparc64-unknown-linux-gnu/Dockerfile":"da1c39a3ff1fe22e41395fa7c8934e90b4c1788e551b9aec6e38bfd94effc437","ci/docker/thumbv7neon-linux-androideabi/Dockerfile":"c2decd5591bd7a09378901bef629cd944acf052eb55e4f35b79eb9cb4d62246a","ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile":"75c0c56161c7382b439de74c00de1c0e3dc9d59560cd6720976a751034b78714","ci/docker/wasm32-unknown-unknown/Dockerfile":"3e5f294bc1e004aa599086c2af49d6f3e7459fa250f5fbdd60cf67d53db78758","ci/docker/x86_64-linux-android/Dockerfile":"685040273cf350d5509e580ac451555efa19790c8723ca2af066adadc6880ad2","ci/docker/x86_64-unknown-linux-gnu-emulated/Dockerfile":"44b6203d9290bfdc53d81219f0937e1110847a23dd982ec8c4de388354f01536","ci/docker/x86_64-unknown-linux-gnu/Dockerfile":"d253c86803b22da428fa9cc671a05f18d3318eca7733b8dccb4f7be1ddf524c5","ci/dox.sh":"5b61711be47a4e3dde0ddd15ba73d256ea95fd75af3897732c24db1dc7e66366","ci/linux-s390x.sh":"d6b732d7795b4ba131326aff893bca6228a7d2eb0e9402f135705413dbbe0dce","ci/linux-sparc64.sh":"c92966838b1ab7ad3b7a344833ee726aba6b647cf5952e56f0ad1ba420b13325","ci/lld-shim.rs":"3d7f71ec23a49e2b67f694a0168786f9a954dda15f5a138815d966643fd3fcc3","ci/max_line_width.sh":"0a1518bba4c9ecaa55694cb2e9930d0e19c265baabf73143f17f9cf285aaa5bb","ci/run-docker.sh":"92e036390ad9b0d16f109579df1b5ced2e72e9afea40c7d011400ebd3a2a90de","ci/run.sh":"63259e22a96ba539f53c06b1b39f53e3a78a71171652e7afc170836110ccd913","ci/run_examples.sh":"d1a23c6c35374a0678ba5114b9b8fefd8be0a79e774872a8bf0898d1baca18d0","ci/runtest-android.rs":"145a8e9799a5223975061fe7e586ade5669ee4877a7d7a4cf6b4ab48e8e36c7c","ci/setup_benchmarks.sh":"73fb981a8fdb1dcd54409d3c0fbbfb8f77a3ceabf8626a6b9bf9d21d6bc8ce72","ci/test-runner-linux":"c8aa6025cff5306f4f31d0c61dc5f9d4dd5a1d189ab613ef8d4c367c694d9ccd","contributing.md":"2cc8c9c560ae17867e69b06d09b758dbf7bc39eb774ada50a743724b10acc0a2","perf-guide/.gitignore":"fe82c7da551079d832cf74200b0b359b4df9828cb4a0416fa7384f07a2ae6a13","perf-guide/book.toml":"115a98284126c6b180178b44713314cc494f08a71662ee2ce15cf67f17a51064","perf-guide/src/SUMMARY.md":"3e03bffc991fdc2050f3d51842d72d9d21ea6abab56a3baf3b2d5973a78b89e1","perf-guide/src/ascii.css":"29afb08833b2fe2250f0412e1fa1161a2432a0820a14953c87124407417c741a","perf-guide/src/bound_checks.md":"5e4991ff58a183ef0cd9fdc1feb4cd12d083b44bdf87393bbb0927808ef3ce7d","perf-guide/src/float-math/approx.md":"8c09032fa2d795a0c5db1775826c850d28eb2627846d0965c60ee72de63735ad","perf-guide/src/float-math/fma.md":"311076ba4b741d604a82e74b83a8d7e8c318fcbd7f64c4392d1cf5af95c60243","perf-guide/src/float-math/fp.md":"04153e775ab6e4f0d7837bcc515230d327b04edfa34c84ce9c9e10ebaeef2be8","perf-guide/src/float-math/svml.md":"0798873b8eedaeda5fed62dc91645b57c20775a02d3cd74d8bd06958f1516506","perf-guide/src/introduction.md":"9f5a19e9e6751f25d2daad39891a0cc600974527ec4c8305843f9618910671bd","perf-guide/src/prof/linux.md":"447731eb5de7d69166728fdbc5ecb0c0c9db678ea493b45a592d67dd002184c0","perf-guide/src/prof/mca.md":"f56d54f3d20e7aa4d32052186e8237b03d65971eb5d112802b442570ff11d344","perf-guide/src/prof/profiling.md":"8a650c0fd6ede0964789bb6577557eeef1d8226a896788602ce61528e260e43c","perf-guide/src/target-feature/attribute.md":"615f88dca0a707b6c416fa605435dd6e1fb5361cc639429cbf68cd87624bd78b","perf-guide/src/target-feature/features.md":"17077760ff24c006b606dd21889c53d87228f4311f3ba3a574f9afdeacd86165","perf-guide/src/target-feature/inlining.md":"7ed1d7068d8173a00d84c16cfe5871cd68b9f04f8d0cca2d01ebc84957ebf2f6","perf-guide/src/target-feature/practice.md":"c4b371842e0086df178488fec97f20def8f0c62ee588bcd25fd948b9b1fa227e","perf-guide/src/target-feature/runtime.md":"835425f5ee597fb3e51d36e725a81ebee29f4561231d19563cd4da81dbb1cfcb","perf-guide/src/target-feature/rustflags.md":"ab49712e9293a65d74d540ba4784fcb57ff1119ec05a575d895c071f1a620f64","perf-guide/src/vert-hor-ops.md":"c6211c0ee91e60552ec592d89d9d957eedc21dee3cbd89e1ad6765ea06a27471","readme.md":"585a8f0e16877fb9abb00cd17a175fcb9d7857840c6c61209f1827ffab095070","rustfmt.toml":"de6101d0670bad65fb3b337d56957d2a024e017e5ab146ec784d77312daaf8ff","src/api.rs":"331a3a4abb19cee2df5f2df4ad7c3e88b45e62cf23fdacfc9bbaa633dc5cf788","src/api/bit_manip.rs":"e68290ee679cc5abc9c73afbe635c1035f8cbfe849e5c751a1680e459244c39e","src/api/cast.rs":"03b94a3d316ac7b7be7068810044911e965e889a0ace7bae762749ca74a92747","src/api/cast/macros.rs":"b0a14d0c83ad2ebb7a275180f6d9e3f2bc312ba57a7d3d6c39fad4e0f20f9408","src/api/cast/v128.rs":"63e28c6a3edf1a7a635f51b8d3c6adbb1d46f884d92a196b3d4a6e743d809416","src/api/cast/v16.rs":"2a584eeb57fd47baad6f3533764301b04aaaac23702b7a8db12598ac02899262","src/api/cast/v256.rs":"b91c15ed8d1536ecd97b4eb79ff9d5aba0552cd9b6f0ea6435b05f2273e23b3a","src/api/cast/v32.rs":"62ec89fcce7fa7f28497ee5770adc8f81d2d3a6b2925b02f7dc06504c40e8f38","src/api/cast/v512.rs":"d855cb943ae7106e9599ef38e30a3afb1c6bd5433178baca54cb128fd9a7d143","src/api/cast/v64.rs":"fe0f7dfaf4fc0c0c1a78c96fcfcdfdc2a1e2845843b11aa797a0c6fb52a8f774","src/api/cmp.rs":"357c3a2a09c6d4611c32dd7fa95be2fae933d513e229026ec9b44451a77b884e","src/api/cmp/eq.rs":"60f70f355bae4cb5b17db53204cacc3890f70670611c17df638d4c04f7cc8075","src/api/cmp/ord.rs":"589f7234761c294fa5df8f525bc4acd5a47cdb602207d524a0d4e19804cd9695","src/api/cmp/partial_eq.rs":"3ed23d2a930b0f9750c3a5309da766b03dc4f9c4d375b42ad3c50fe732693d15","src/api/cmp/partial_ord.rs":"e16b11805c94048acd058c93994b5bc74bb187f8d7e3b86a87df60e1601467f9","src/api/cmp/vertical.rs":"de3d62f38eba817299aa16f1e1939954c9a447e316509397465c2830852ba053","src/api/default.rs":"b61f92fc0e33a2633b3375eb405beba480da071cde03df4d437d8a6058afcd97","src/api/fmt.rs":"67fb804bb86b6cd77cf8cd492b5733ce437071b66fe3297278b8a6552c325dda","src/api/fmt/binary.rs":"35cb5c266197d6224d598fb3d286e5fe48ef0c01ed356c2ff6fe9ba946f96a92","src/api/fmt/debug.rs":"aa18eea443bf353fea3db8b1a025132bbcaf91e747ecfa43b8d9fce9af395a0c","src/api/fmt/lower_hex.rs":"69d5be366631af309f214e8031c8c20267fcc27a695eac6f45c6bc1df72a67e6","src/api/fmt/octal.rs":"9eb11ba3d990213f3c7f1ec25edba7ce997cb1320e16d308c83498ba6b9bfbd9","src/api/fmt/upper_hex.rs":"a4637d085b7bb20e759ce58e08435b510a563ba3dd468af2b03560fdc5511562","src/api/from.rs":"2e599d8329cb05eaf06224cc441355c4b7b51254fc19256619333be8c149d444","src/api/from/from_array.rs":"4151593c7bba7455821fffa5b59867005a77c95d32f1f0cc3fd87294000157d9","src/api/from/from_vector.rs":"9764371aa9e6005aace74dea14f59e5611a095b7cf42707940924749282c52f0","src/api/hash.rs":"562cfa3f1d8eb9a733c035a3665a599c2f1e341ee820d8fbdd102a4398a441bc","src/api/into_bits.rs":"82297f0697d67b5a015e904e7e6e7b2a7066ba825bc54b94b4ff3e22d7a1eefb","src/api/into_bits/arch_specific.rs":"1f925390b0ce7132587d95f2419c6e2ad3e1a9d17eb1d9c120a1c1c4bdf4277e","src/api/into_bits/macros.rs":"d762406de25aedff88d460dec7a80dc8e825a2a419d53218ce007efa6a1d3e04","src/api/into_bits/v128.rs":"ecdc5893664c71d7ab1ff3697c3fbe490d20d8748b9b76881d05e7625e40d74c","src/api/into_bits/v16.rs":"5459ec7dad1ad7bd30dc7e48374580b993abf23701d9c3cb22203fa0a9aabb6d","src/api/into_bits/v256.rs":"90ea351da0380ead1bf0f63b620afd40d01d638d09f7e7be31840bd2c1d9c663","src/api/into_bits/v32.rs":"ee1dc5a430050e16f51154b5fe85b1536f5feddf2ea23dd1d3859b67c4afc6fc","src/api/into_bits/v512.rs":"f72098ed1c9a23944f3d01abaf5e0f2d0e81d35a06fdadd2183e896d41b59867","src/api/into_bits/v64.rs":"6394462facdfe7827349c742b7801f1291e75a720dfb8c0b52100df46f371c98","src/api/math.rs":"8b2a2fc651917a850539f993aa0b9e5bf4da67b11685285b8de8cdca311719ec","src/api/math/float.rs":"61d2794d68262a1090ae473bd30793b5f65cf732f32a6694a3af2ce5d9225616","src/api/math/float/abs.rs":"5b6b2701e2e11135b7ce58a05052ea8120e10e4702c95d046b9d21b827b26bf8","src/api/math/float/consts.rs":"78acba000d3fa527111300b6327c1932de9c4c1e02d4174e1a5615c01463d38c","src/api/math/float/cos.rs":"4c2dd7173728ef189314f1576c9486e03be21b7da98843b2f9011282a7979e31","src/api/math/float/exp.rs":"7c6d5f1e304f498a01cfa23b92380c815d7da0ad94eae3483783bc377d287eef","src/api/math/float/ln.rs":"54c7583f3df793b39ff57534fade27b41bb992439e5dc178252f5ca3190a3e54","src/api/math/float/mul_add.rs":"62cac77660d20159276d4c9ef066eb90c81cbddb808e8e157182c607625ad2eb","src/api/math/float/mul_adde.rs":"bae056ee9f3a70df39ec3c3b2f6437c65303888a7b843ef1a5bcf1f5aca0e602","src/api/math/float/powf.rs":"9ddb938984b36d39d82a82f862f80df8f7fb013f1d222d45698d41d88472f568","src/api/math/float/recpre.rs":"589225794ff1dbf31158dff660e6d4509ecc8befbb57c633900dea5ac0b840d6","src/api/math/float/rsqrte.rs":"a32abdcc318d7ccc8448231f54d75b884b7cbeb03a7d595713ab6243036f4dbf","src/api/math/float/sin.rs":"cbd3622b7df74f19691743001c8cf747a201f8977ad90542fee915f37dcd1e49","src/api/math/float/sqrt.rs":"0c66d5d63fb08e4d99c6b82a8828e41173aff1ac9fa1a2764a11fac217ccf2ac","src/api/math/float/sqrte.rs":"731e1c9f321b662accdd27dacb3aac2e8043b7aecb2f2161dde733bd9f025362","src/api/minimal.rs":"1f22bcc528555444e76de569ec0ae2029b9ae9d04805efeafa93369c8098036b","src/api/minimal/iuf.rs":"c501a6696950cf5e521765f178de548af64fdfb6e10d026616d09fab93ca2d17","src/api/minimal/mask.rs":"42e415f536c5193d0218f5a754b34b87fd7c971bff068009f958712166ff056d","src/api/minimal/ptr.rs":"a9ee482d1dd1c956fb8f3f179e6e620b1de4e9d713961461d4c6923a4ef2e67c","src/api/ops.rs":"3e273b277a0f3019d42c3c59ca94a5afd4885d5ae6d2182e5089bbeec9de42ee","src/api/ops/scalar_arithmetic.rs":"d2d5ad897a59dd0787544f927e0e7ca4072c3e58b0f4a2324083312b0d5a21d7","src/api/ops/scalar_bitwise.rs":"482204e459ca6be79568e1c9f70adbe2d2151412ddf122fb2161be8ebb51c40c","src/api/ops/scalar_mask_bitwise.rs":"c250f52042e37b22d57256c80d4604104cfd2fbe2a2e127c676267270ca5d350","src/api/ops/scalar_shifts.rs":"987f8fdebeedc16e3d77c1b732e7826ef70633c541d16dfa290845d5c6289150","src/api/ops/vector_arithmetic.rs":"ddca15d09ddeef502c2ed66117a62300ca65d87e959e8b622d767bdf1c307910","src/api/ops/vector_bitwise.rs":"b3968f7005b649edcc22a54e2379b14d5ee19045f2e784029805781ae043b5ee","src/api/ops/vector_float_min_max.rs":"f5155dce75219f4ba11275b1f295d2fdcddd49d174a6f1fb2ace7ea42813ce41","src/api/ops/vector_int_min_max.rs":"a378789c6ff9b32a51fbd0a97ffd36ed102cd1fe6a067d2b02017c1df342def6","src/api/ops/vector_mask_bitwise.rs":"5052d18517d765415d40327e6e8e55a312daaca0a5e2aec959bfa54b1675f9c8","src/api/ops/vector_neg.rs":"5c62f6b0221983cdbd23cd0a3af3672e6ba1255f0dfe8b19aae6fbd6503e231b","src/api/ops/vector_rotates.rs":"03cbe8a400fd7c688e4ee771a990a6754f2031b1a59b19ae81158b21471167e5","src/api/ops/vector_shifts.rs":"9bf69d0087268f61009e39aea52e03a90f378910206b6a28e8393178b6a5d0e0","src/api/ptr.rs":"8a793251bed6130dcfb2f1519ceaa18b751bbb15875928d0fb6deb5a5e07523a","src/api/ptr/gather_scatter.rs":"9ddd960365e050674b25b2fd3116e24d94669b4375d74e71c03e3f1469576066","src/api/reductions.rs":"ae5baca81352ecd44526d6c30c0a1feeda475ec73ddd3c3ec6b14e944e5448ee","src/api/reductions/bitwise.rs":"8bf910ae226188bd15fc7e125f058cd2566b6186fcd0cd8fd020f352c39ce139","src/api/reductions/float_arithmetic.rs":"e58c8c87806a95df2b2b5b48ac5991036df024096d9d7c171a480fe9282896a4","src/api/reductions/integer_arithmetic.rs":"47471da1c5f859489680bb5d34ced3d3aa20081c16053a3af121a4496fcb57bf","src/api/reductions/mask.rs":"db83327a950e33a317f37fd33ca4e20c347fb415975ec024f3e23da8509425af","src/api/reductions/min_max.rs":"f27be3aa28e1c1f46de7890198db6e12f00c207085e89ef2de7e57ee443cdb98","src/api/select.rs":"a98e2ccf9fc6bdeed32d337c8675bc96c2fbe2cc34fbf149ad6047fb8e749774","src/api/shuffle.rs":"da58200790868c09659819322a489929a5b6e56c596ed07e6a44293ea02e7d09","src/api/shuffle1_dyn.rs":"bfea5a91905b31444e9ef7ca6eddb7a9606b7e22d3f71bb842eb2795a0346620","src/api/slice.rs":"ee87484e8af329547b9a5d4f2a69e8bed6ea10bbd96270d706083843d4eea2ac","src/api/slice/from_slice.rs":"4d4fe8a329c885fcb4fbcbedf99efb15a95296fe6b3f595056cc37037450d5ac","src/api/slice/write_to_slice.rs":"f5b23b2c4b91cfb26b713a9013a6c0da7f45eaefb79ba06dcbc27f3f23bda679","src/api/swap_bytes.rs":"4a6792a2e49a77475e1b237592b4b2804dbddb79c474331acd0dd71b36934259","src/codegen.rs":"c6eebc3d3665420aa6a2f317977e3c41a4f43e0550ac630cdbe8e4bbed5e2031","src/codegen/bit_manip.rs":"5559e095105a80003e0de35af1d19b0c65c9ab04eb743c7e01c5442d882eb34e","src/codegen/llvm.rs":"d1299c189abb17a6133f047574cffc7a6db4c1be37cb7d4785491cb5e8f8cf54","src/codegen/math.rs":"35f96e37a78fcf0cdb02146b7f27a45108fe06a37fc2a54d8851ce131a326178","src/codegen/math/float.rs":"dd86c0449e576c83b719700962ac017c332987fac08d91f2b7a2b1b883598170","src/codegen/math/float/abs.rs":"f56e2b4b8055ea861c1f5cbc6b6e1d8e7e5af163b62c13574ddee4e09513bfbc","src/codegen/math/float/cos.rs":"ef3b511a24d23045b310315e80348a9b7fedb576fc2de52d74290616a0abeb2a","src/codegen/math/float/cos_pi.rs":"4e7631a5d73dac21531e09ef1802d1180f8997509c2c8fa9f67f322194263a97","src/codegen/math/float/exp.rs":"61b691598c41b5622f24e4320c1bdd08701e612a516438bdddcc728fc3405c8c","src/codegen/math/float/ln.rs":"46b718b1ba8c9d99e1ad40f53d20dfde08a3063ca7bd2a9fdd6698e060da687e","src/codegen/math/float/macros.rs":"dd42135fff13f9aca4fd3a1a4e14c7e6c31aadc6d817d63b0d2fb9e62e062744","src/codegen/math/float/mul_add.rs":"a37bf764345d4b1714f97e83897b7cf0855fc2811704bcbc0012db91825339e1","src/codegen/math/float/mul_adde.rs":"c75702bfcb361de45964a93caf959a695ef2376bd069227600b8c6872665c755","src/codegen/math/float/powf.rs":"642346e982bc4c39203de0864d2149c4179cd7b21cf67a2951687932b4675872","src/codegen/math/float/sin.rs":"9d68164c90cdca6a85155040cdac42e27342ebe0b925273ef1593df721af4258","src/codegen/math/float/sin_cos_pi.rs":"9be02ad48585a1e8d99129382fbffbaed47852f15459256a708850b6b7a75405","src/codegen/math/float/sin_pi.rs":"9890347905b4d4a3c7341c3eb06406e46e60582bcf6960688bd727e5dadc6c57","src/codegen/math/float/sqrt.rs":"e3c60dcfb0c6d2fc62adabcc931b2d4040b83cab294dea36443fb4b89eb79e34","src/codegen/math/float/sqrte.rs":"f0f4ef9eb475ae41bcc7ec6a95ad744ba6b36925faa8b2c2814004396d196b63","src/codegen/pointer_sized_int.rs":"a70697169c28218b56fd2e8d5353f2e00671d1150d0c8cef77d613bdfacd84cb","src/codegen/reductions.rs":"645e2514746d01387ddd07f0aa4ffd8430cc9ab428d4fb13773ea319fa25dd95","src/codegen/reductions/mask.rs":"8f1afe6aabf096a3278e1fc3a30f736e04aa8b9ce96373cee22162d18cfe2702","src/codegen/reductions/mask/aarch64.rs":"cba6e17603d39795dcfe8339b6b7d8714c3e162a1f0a635979f037aa24fe4206","src/codegen/reductions/mask/arm.rs":"9447904818aa2c7c25d0963eead452a639a11ca7dbd6d21eedbfcaade07a0f33","src/codegen/reductions/mask/fallback.rs":"7a0ef9f7fd03ae318b495b95e121350cd61caffc5cc6ee17fabf130d5d933453","src/codegen/reductions/mask/fallback_impl.rs":"76547f396e55ef403327c77c314cf8db8c7a5c9b9819bfb925abeacf130249e5","src/codegen/reductions/mask/x86.rs":"14bd2c482071f2355beebcf7b7ecf950ff2dfcdb08c3ca50993092434a9de717","src/codegen/reductions/mask/x86/avx.rs":"b4913d87844c522903641cbbf10db4551addb1ce5e9e78278e21612fa65c733b","src/codegen/reductions/mask/x86/avx2.rs":"677aed3f056285285daa3adff8bc65e739630b4424defa6d9665e160f027507e","src/codegen/reductions/mask/x86/sse.rs":"226610b4ff88c676d5187114dd57b4a8800de6ce40884675e9198445b1ed0306","src/codegen/reductions/mask/x86/sse2.rs":"bc38e6c31cb4b3d62147eba6cac264e519e2a48e0f7ce9010cfa9ef0cf0ec9fd","src/codegen/shuffle.rs":"0abca97e92cdce49a58a39cc447eb09dc7d7715ef256c8dbd2181a186e61bb64","src/codegen/shuffle1_dyn.rs":"04523e9338133bdedb012dd076c2c564b79ce5593b0fc56d0fb6910e04190a81","src/codegen/swap_bytes.rs":"1d6cdc716eadddc92b4fd506b2445a821caa8dc00860447de09d7ebd69c2087f","src/codegen/v128.rs":"94226b31ec403d18d9d2fe06713f147c9c79e9b5f9105089088266313f843185","src/codegen/v16.rs":"ddec4ffb66b6f7aaffb9a1780c5ddba82557abd74f45073d335047e04cf74924","src/codegen/v256.rs":"6b63917f0444118d6b1595bff2045e59b97c4d24012bd575f69f1f0efc5a0241","src/codegen/v32.rs":"3477b3c5540aed86e61e2f5807dd31db947413cec9181c587d93ed6ec74f0eba","src/codegen/v512.rs":"5854f99d3aabc4cd42b28a20d9ce447756dc2ba024a409a69b6a8ae1f1842fc5","src/codegen/v64.rs":"e9e89caebfe63d10c0cbca61e4dfdba3b7e02ee0989170f80beed23237ddd950","src/codegen/vPtr.rs":"96d609a9eece4dcbbcc01ba0b8744d7f5958be12774176a2945bc676f4e6b5cb","src/codegen/vSize.rs":"eeee9858749aa82142b27bc120d1989bb74a6b82e1e4efbbeaccc9634dc9acfc","src/lib.rs":"1b5d419ff05ee0370d671810423ccc254708cc8d415c1dbac2a7a36be4bf63a8","src/masks.rs":"870f429967b2d7d5133f4d28d6c753fc5cef0570b27b29d4e966a066d22d2d0e","src/sealed.rs":"ff7f0324276408ae8249941cfa32c90b8835a54d750896b683efea857af19db2","src/testing.rs":"1d3a7862ef625e235a5734ad7204e68d350f902c0695182b1f08a0552432416e","src/testing/macros.rs":"6378856d7a40ba5ec5c7c0dad6327d79f0c77266921c24296d10aed6c68e9b98","src/testing/utils.rs":"d6fd5a5017f1f85d9d99585754f8f6ad06fc3d683b34083543e67a7cc6c1772c","src/v128.rs":"18fe263c4aa28cd06461c7070b0269f69f4a2e75749b8f142a83dfdfe4d22bf5","src/v16.rs":"e5c663c9fb3547eaeac78a5f7db9969f4d8b5ec96112bf2954602fff11f0aebd","src/v256.rs":"68732cd688ad12a56d8b4f8ddf279f77bdfe1be2943c7dc0c1b4f1a76798aa0f","src/v32.rs":"785b22a1ccb4a41bb53dfeb0670f624c0ce42e6cdf62d1747e3283777a1c70bd","src/v512.rs":"d1337bfe07f06a8f37f8e8fa7d4315b9307476ee435ad80dd5269eaed564fbfa","src/v64.rs":"3077468d65125b8f085e9454c8b2463a4d5225697464ba6a1300f8799528fd4b","src/vPtr.rs":"c9a53f41f466e17b6648a4ce390fd8f4d3a848d440eb8a9a803a11608d76eb05","src/vSize.rs":"5c46d3e8c3ee5863d9b6e37e681f871386e0efc254d6d84ba711edb529ce7b3c","tests/endianness.rs":"541a144be017e3dd7da7c8ea49d907dc02538245e8c5f3deb5bd43da92c929e1"},"package":null} -\ No newline at end of file -diff --git a/third_party/rust/packed_simd/.travis.yml b/third_party/rust/packed_simd/.travis.yml -new file mode 100644 -index 000000000000..8d8ed54ab737 ---- /dev/null -+++ b/third_party/rust/packed_simd/.travis.yml -@@ -0,0 +1,308 @@ -+language: rust -+sudo: false -+rust: nightly -+ -+stages: -+ - tools -+ - linux-tier1 -+ - osx-tier1 -+ - osx-tier2 -+ - linux-tier2 -+ - android -+ -+matrix: -+ fast_finish: true -+ include: -+ # Android: -+ - env: TARGET=x86_64-linux-android NOVERIFY=1 -+ name: "x86_64-unknown-linux-android + SSE2" -+ stage: android -+ - env: TARGET=arm-linux-androideabi -+ name: "arm-linux-androideabi" -+ stage: android -+ - env: TARGET=arm-linux-androideabi RUSTFLAGS="-C target-feature=+v7,+neon" -+ name: "arm-linux-androideabi + NEON" -+ stage: android -+ - env: TARGET=aarch64-linux-android -+ name: "aarch64-unknown-linux-android" -+ stage: android -+ - env: TARGET=aarch64-linux-android RUSTFLAGS="-C target-feature=+neon" -+ name: "aarch64-unknown-linux-android + NEON" -+ stage: android -+ - env: TARGET="thumbv7neon-linux-androideabi" -+ name: "thumbv7neon-linux-androideabi" -+ stage: android -+ # Linux: -+ - env: TARGET=i586-unknown-linux-gnu -+ name: "i586-unknown-linux-gnu" -+ stage: linux-tier2 -+ - env: TARGET=i586-unknown-linux-gnu RUSTFLAGS="-C target-feature=+sse" -+ name: "i586-unknown-linux-gnu + SSE" -+ stage: linux-tier2 -+ - env: TARGET=i586-unknown-linux-gnu RUSTFLAGS="-C target-feature=+sse2" -+ name: "i586-unknown-linux-gnu + SSE2" -+ stage: linux-tier2 -+ - env: TARGET=i686-unknown-linux-gnu -+ name: "i686-unknown-linux-gnu + SSE2" -+ stage: linux-tier1 -+ - env: TARGET=i686-unknown-linux-gnu RUSTFLAGS="-C target-feature=+sse4.2" -+ name: "i686-unknown-linux-gnu + SSE4.2" -+ stage: linux-tier1 -+ - env: TARGET=i686-unknown-linux-gnu RUSTFLAGS="-C target-feature=+avx2" -+ name: "i686-unknown-linux-gnu + AVX2" -+ stage: linux-tier1 -+ - env: TARGET=x86_64-unknown-linux-gnu -+ name: "x86_64-unknown-linux-gnu + SSE2" -+ install: rustup component add rustfmt-preview -+ stage: linux-tier1 -+ - env: TARGET=x86_64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+sse4.2" -+ name: "x86_64-unknown-linux-gnu + SSE4.2" -+ install: rustup component add rustfmt-preview -+ stage: linux-tier1 -+ - env: TARGET=x86_64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+avx" -+ name: "x86_64-unknown-linux-gnu + AVX" -+ install: rustup component add rustfmt-preview -+ stage: linux-tier1 -+ - env: TARGET=x86_64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+avx2" -+ name: "x86_64-unknown-linux-gnu + AVX2" -+ install: rustup component add rustfmt-preview -+ stage: linux-tier1 -+ - env: TARGET=x86_64-unknown-linux-gnu-emulated -+ name: "Intel SDE + SSE2" -+ install: true -+ stage: linux-tier1 -+ - env: TARGET=x86_64-unknown-linux-gnu-emulated RUSTFLAGS="-C target-feature=+sse4.2" -+ name: "Intel SDE + SSE4.2" -+ install: true -+ stage: linux-tier1 -+ - env: TARGET=x86_64-unknown-linux-gnu-emulated RUSTFLAGS="-C target-feature=+avx" -+ name: "Intel SDE + AVX" -+ install: true -+ stage: linux-tier1 -+ - env: TARGET=x86_64-unknown-linux-gnu-emulated RUSTFLAGS="-C target-feature=+avx2" -+ name: "Intel SDE + AVX2" -+ install: true -+ stage: linux-tier1 -+ - env: TARGET=x86_64-unknown-linux-gnu-emulated RUSTFLAGS="-C target-feature=+avx-512f" -+ name: "Intel SDE + AVX-512" -+ install: true -+ stage: linux-tier1 -+ - env: TARGET=arm-unknown-linux-gnueabi -+ name: "arm-unknown-linux-gnueabi" -+ stage: linux-tier2 -+ - env: TARGET=arm-unknown-linux-gnueabi RUSTFLAGS="-C target-feature=+v7,+neon" -+ name: "arm-unknown-linux-gnueabi + NEON" -+ stage: linux-tier2 -+ - env: TARGET=arm-unknown-linux-gnueabihf -+ name: "arm-unknown-linux-gnueabihf" -+ stage: linux-tier2 -+ - env: TARGET=arm-unknown-linux-gnueabihf RUSTFLAGS="-C target-feature=+v7,+neon" -+ name: "arm-unknown-linux-gnueabihf + NEON" -+ stage: linux-tier2 -+ - env: TARGET=armv7-unknown-linux-gnueabihf -+ name: "armv7-unknown-linux-gnueabihf" -+ stage: linux-tier2 -+ - env: TARGET=armv7-unknown-linux-gnueabihf RUSTFLAGS="-C target-feature=+neon" -+ name: "armv7-unknown-linux-gnueabihf + NEON" -+ stage: linux-tier2 -+ - env: TARGET="thumbv7neon-unknown-linux-gnueabihf" -+ name: "thumbv7neon-unknown-linux-gnueabihf" -+ stage: linux-tier2 -+ - env: TARGET=aarch64-unknown-linux-gnu -+ name: "aarch64-unknown-linux-gnu" -+ stage: linux-tier2 -+ - env: TARGET=aarch64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+neon" -+ name: "aarch64-unknown-linux-gnu + NEON" -+ stage: linux-tier2 -+ - env: TARGET=mips-unknown-linux-gnu -+ name: "mips-unknown-linux-gnu" -+ stage: linux-tier2 -+ - env: TARGET=mipsel-unknown-linux-musl -+ name: "mipsel-unknown-linux-musl" -+ stage: linux-tier2 -+ - env: TARGET=mips64-unknown-linux-gnuabi64 -+ name: "mips64-unknown-linux-gnuabi64" -+ stage: linux-tier2 -+ - env: TARGET=mips64el-unknown-linux-gnuabi64 -+ name: "mips64el-unknown-linux-gnuabi64" -+ stage: linux-tier2 -+ # FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/18 -+ # env: TARGET=mips64el-unknown-linux-gnuabi64 RUSTFLAGS="-C target-feature=+msa -C target-cpu=mips64r6" -+ - env: TARGET=powerpc-unknown-linux-gnu -+ name: "powerpc-unknown-linux-gnu" -+ stage: linux-tier2 -+ - env: TARGET=powerpc64-unknown-linux-gnu -+ name: "powerpc64-unknown-linux-gnu" -+ stage: linux-tier2 -+ - env: TARGET=powerpc64le-unknown-linux-gnu -+ name: "powerpc64le-unknown-linux-gnu" -+ stage: linux-tier2 -+ - env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+altivec" -+ name: "powerpc64le-unknown-linux-gnu + ALTIVEC" -+ stage: linux-tier2 -+ - env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+vsx" -+ name: "powerpc64le-unknown-linux-gnu + VSX" -+ stage: linux-tier2 -+ - env: TARGET=s390x-unknown-linux-gnu -+ name: "s390x-unknown-linux-gnu" -+ stage: linux-tier2 -+ - env: TARGET=sparc64-unknown-linux-gnu -+ name: "sparc64-unknown-linux-gnu" -+ stage: linux-tier2 -+ # WebAssembly: -+ - env: TARGET=wasm32-unknown-unknown -+ name: "wasm32-unknown-unknown" -+ stage: osx-tier1 # For now -+ # MacOSX: -+ - os: osx -+ env: TARGET=i686-apple-darwin -+ name: "i686-apple-darwin + SSE2" -+ script: ci/run.sh -+ osx_image: xcode10 -+ stage: osx-tier1 -+ - os: osx -+ env: TARGET=i686-apple-darwin RUSTFLAGS="-C target-feature=+sse4.2" -+ name: "i686-apple-darwin + SSE4.2" -+ script: ci/run.sh -+ osx_image: xcode10 -+ stage: osx-tier1 -+ # Travis-CI OSX build bots do not support AVX2: -+ - os: osx -+ env: TARGET=i686-apple-darwin RUSTFLAGS="-C target-feature=+avx" -+ name: "i686-apple-darwin + AVX" -+ script: ci/run.sh -+ osx_image: xcode10 -+ stage: osx-tier1 -+ - os: osx -+ env: TARGET=x86_64-apple-darwin -+ name: "x86_64-apple-darwin + SSE2" -+ install: true -+ script: ci/run.sh -+ osx_image: xcode10 -+ stage: osx-tier1 -+ - os: osx -+ env: TARGET=x86_64-apple-darwin RUSTFLAGS="-C target-feature=+sse4.2" -+ name: "x86_64-apple-darwin + SSE4.2" -+ install: true -+ script: ci/run.sh -+ osx_image: xcode10 -+ stage: osx-tier1 -+ # Travis-CI OSX build bots do not support AVX2: -+ - os: osx -+ env: TARGET=x86_64-apple-darwin RUSTFLAGS="-C target-feature=+avx" -+ name: "x86_64-apple-darwin + AVX" -+ install: true -+ script: ci/run.sh -+ osx_image: xcode10 -+ stage: osx-tier1 -+ # *BSDs: -+ #- env: TARGET=i686-unknown-freebsd NORUN=1 -+ # script: ci/run.sh -+ #- env: TARGET=x86_64-unknown-freebsd NORUN=1 -+ # script: ci/run.sh -+ #- env: TARGET=x86_64-unknown-netbsd NORUN=1 -+ # script: ci/run.sh -+ # Solaris: -+ #- env: TARGET=x86_64-sun-solaris NORUN=1 -+ # script: ci/run.sh -+ # iOS: -+ - os: osx -+ env: TARGET=i386-apple-ios -+ name: "i386-apple-ios" -+ script: ci/run.sh -+ osx_image: xcode9.4 -+ stage: osx-tier2 -+ - os: osx -+ env: TARGET=x86_64-apple-ios -+ name: "x86_64-apple-ios + SSE2" -+ script: ci/run.sh -+ osx_image: xcode9.4 -+ stage: osx-tier2 -+ - os: osx -+ env: TARGET=armv7-apple-ios NORUN=1 -+ name: "armv7-apple-ios [Build only]" -+ script: ci/run.sh -+ osx_image: xcode9.4 -+ stage: osx-tier2 -+ - os: osx -+ env: TARGET=aarch64-apple-ios NORUN=1 -+ name: "aarch64-apple-ios [Build only]" -+ script: ci/run.sh -+ osx_image: xcode9.4 -+ stage: osx-tier2 -+ # BENCHMARKS: -+ - name: "Benchmarks - x86_64-unknown-linux-gnu" -+ install: TARGET=x86_64-unknown-linux-gnu ./ci/setup_benchmarks.sh -+ script: PATH=$(pwd):$PATH NORUN=1 VERIFY=1 FEATURES=core_arch,ispc,sleef-sys ci/benchmark.sh -+ stage: tools -+ - name: "Benchmarks - x86_64-apple-darwin" -+ install: TARGET=x86_64-apple-darwin ./ci/setup_benchmarks.sh -+ script: PATH=$(pwd):$PATH NORUN=1 VERIFY=1 FEATURES=core_arch,ispc,sleef-sys ci/benchmark.sh -+ os: osx -+ osx_image: xcode9.4 -+ stage: tools -+ # TOOLS: -+ - name: "Documentation" -+ install: cargo install mdbook -+ script: ci/dox.sh -+ stage: tools -+ - name: "rustfmt" -+ install: true -+ before_script: rustup component add rustfmt-preview -+ script: ci/all.sh check_fmt || true -+ stage: tools -+ - name: "clippy" -+ install: true -+ before_script: rustup component add clippy-preview -+ script: ci/all.sh clippy -+ stage: tools -+ -+ allow_failures: -+ # FIXME: ISPC cannot be found? -+ - name: "Benchmarks - x86_64-apple-darwin" -+ # FIXME: TBD -+ - env: TARGET=powerpc-unknown-linux-gnu -+ - env: TARGET=powerpc64-unknown-linux-gnu -+ - env: TARGET=powerpc64le-unknown-linux-gnu -+ - env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+altivec" -+ - env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+vsx" -+ #- env: TARGET=i686-unknown-freebsd NORUN=1 -+ #- env: TARGET=x86_64-unknown-freebsd NORUN=1 -+ #- env: TARGET=x86_64-unknown-netbsd NORUN=1 -+ #- env: TARGET=x86_64-sun-solaris NORUN=1 -+ -+ # FIXME: TBD -+ - env: TARGET=arm-linux-androideabi -+ - env: TARGET=arm-linux-androideabi RUSTFLAGS="-C target-feature=+v7,+neon" -+ - env: TARGET=aarch64-linux-android -+ - env: TARGET=aarch64-linux-android RUSTFLAGS="-C target-feature=+neon" -+ -+ # FIXME: iOS -+ # https://github.com/rust-lang-nursery/packed_simd/issues/26 -+ - env: TARGET=i386-apple-ios -+ - env: TARGET=x86_64-apple-ios -+ -+ # FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/182 -+ - env: TARGET=arm-unknown-linux-gnueabi RUSTFLAGS="-C target-feature=+v7,+neon" -+ - env: TARGET=arm-unknown-linux-gnueabihf RUSTFLAGS="-C target-feature=+v7,+neon" -+ - env: TARGET=armv7-unknown-linux-gnueabihf RUSTFLAGS="-C target-feature=+neon" -+ -+ # FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/183 -+ - env: TARGET=wasm32-unknown-unknown -+ -+install: travis_retry rustup target add $TARGET -+before_script: cargo generate-lockfile -+script: travis_wait 50 ci/run-docker.sh -+after_script: sleep 5 -+ -+env: -+ global: -+ secure: "lPHv7s6+AxQYNaFncycVFQt++Y1asQmMhOikQU1ztlP8CK7+hn2m98cg/euOJyzIOb2iJ3ZX4cGZkzw4lc59MQBByb1GtDbazQoUOzVDbVfe9BDD2f8JVoIFh1CMfjPKQ7Gg/rJqWlwrUlSd5GNxPCutKjY7qZhJuR6SQbJjlWaGN2Vd4fVCzKXz8fHRXgMEZS+d+CR4Nsrkb83J3Z4s5kSdJmhYxJ61AWjuzJVwUh4l3/HEYlSL5XXpuh5R2i7W16h1PlNdaTUgkZli1lHzO8+6Q8LzX9+XiLIEVX9lw3A2NdIKGz8E/+7Qs5oYOkwYhjROsDQxIK7xkSM30bQuN7cwMBybAVIyOPJkqXQ1dQyp83KSdsOj7JMyDDRvcEDLI6ehRlm5EcdH7YrReuboN81iUo0Sa7VsuUmgj5hjERCt9r30f9aWuitABai7vKRtjglg7Sp5CrEVPA4PQs6PqKCCRogoggbXJ/Z5Dyw/RZaXPeNR9+qIKN1Vjm9Gew1sRN2JK/3+vXTKtyJXH/uBxgJt4jQlbuShOJuF+BSfTF88sMe67a/357SSOIb4JkaCyd0flDCWYE8576kaHPlVVMT2peXee0LeRXm1e13nG3Na0t3LS/orJLPHOShNQGoDj7qAP5aEKggRya896JGwtvlaBHHTmSQh65G7cyNErZo=" -+branches: -+ only: -+ - staging # bors r+ -+ - trying # bors try -+ - master -+notifications: -+ email: -+ on_success: never -diff --git a/third_party/rust/packed_simd/Cargo.toml b/third_party/rust/packed_simd/Cargo.toml -new file mode 100644 -index 000000000000..3db9354c9407 ---- /dev/null -+++ b/third_party/rust/packed_simd/Cargo.toml -@@ -0,0 +1,42 @@ -+[package] -+name = "packed_simd" -+version = "0.3.3" -+authors = ["Gonzalo Brito Gadeschi "] -+description = "Portable Packed SIMD vectors" -+documentation = "https://docs.rs/crate/packed_simd/" -+homepage = "https://github.com/rust-lang-nursery/packed_simd" -+repository = "https://github.com/rust-lang-nursery/packed_simd" -+keywords = ["simd", "vector", "portability"] -+categories = ["hardware-support", "concurrency", "no-std", "data-structures"] -+license = "MIT/Apache-2.0" -+build = "build.rs" -+edition = "2018" -+ -+[badges] -+appveyor = { repository = "rust-lang-nursery/packed_simd" } -+travis-ci = { repository = "rust-lang-nursery/packed_simd" } -+codecov = { repository = "rust-lang-nursery/packed_simd" } -+is-it-maintained-issue-resolution = { repository = "rust-lang-nursery/packed_simd" } -+is-it-maintained-open-issues = { repository = "rust-lang-nursery/packed_simd" } -+maintenance = { status = "experimental" } -+ -+[dependencies] -+cfg-if = "^0.1.6" -+core_arch = { version = "^0.1.3", optional = true } -+ -+[features] -+default = [] -+into_bits = [] -+libcore_neon = [] -+ -+[dev-dependencies] -+paste = "^0.1.3" -+arrayvec = { version = "^0.4", default-features = false } -+ -+[target.'cfg(target_arch = "x86_64")'.dependencies.sleef-sys] -+version = "^0.1.2" -+optional = true -+ -+[target.wasm32-unknown-unknown.dev-dependencies] -+wasm-bindgen = "=0.2.19" -+wasm-bindgen-test = "=0.2.19" -\ No newline at end of file -diff --git a/third_party/rust/simd/LICENSE-APACHE b/third_party/rust/packed_simd/LICENSE-APACHE -similarity index 100% -rename from third_party/rust/simd/LICENSE-APACHE -rename to third_party/rust/packed_simd/LICENSE-APACHE -diff --git a/third_party/rust/simd/LICENSE-MIT b/third_party/rust/packed_simd/LICENSE-MIT -similarity index 93% -rename from third_party/rust/simd/LICENSE-MIT -rename to third_party/rust/packed_simd/LICENSE-MIT -index bf6c304f7774..39d4bdb5acd3 100644 ---- a/third_party/rust/simd/LICENSE-MIT -+++ b/third_party/rust/packed_simd/LICENSE-MIT -@@ -1,25 +1,25 @@ --Copyright (c) 2014 Huon Wilson -+Copyright (c) 2014 The Rust Project Developers - - Permission is hereby granted, free of charge, to any - person obtaining a copy of this software and associated - documentation files (the "Software"), to deal in the - Software without restriction, including without - limitation the rights to use, copy, modify, merge, - publish, distribute, sublicense, and/or sell copies of - the Software, and to permit persons to whom the Software - is furnished to do so, subject to the following - conditions: - - The above copyright notice and this permission notice - shall be included in all copies or substantial portions - of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF - ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED - TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT - SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR - IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER --DEALINGS IN THE SOFTWARE. -\ No newline at end of file -+DEALINGS IN THE SOFTWARE. -diff --git a/third_party/rust/packed_simd/bors.toml b/third_party/rust/packed_simd/bors.toml -new file mode 100644 -index 000000000000..6d302dc85cf6 ---- /dev/null -+++ b/third_party/rust/packed_simd/bors.toml -@@ -0,0 +1,3 @@ -+status = [ -+ "continuous-integration/travis-ci/push" -+] -\ No newline at end of file -diff --git a/third_party/rust/packed_simd/build.rs b/third_party/rust/packed_simd/build.rs -new file mode 100644 -index 000000000000..85639ff9d085 ---- /dev/null -+++ b/third_party/rust/packed_simd/build.rs -@@ -0,0 +1,8 @@ -+fn main() { -+ println!("cargo:rustc-env=RUSTC_BOOTSTRAP=1"); -+ let target = std::env::var("TARGET") -+ .expect("TARGET environment variable not defined"); -+ if target.contains("neon") { -+ println!("cargo:rustc-cfg=libcore_neon"); -+ } -+} -diff --git a/third_party/rust/packed_simd/ci/all.sh b/third_party/rust/packed_simd/ci/all.sh -new file mode 100644 -index 000000000000..273562d4a9bb ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/all.sh -@@ -0,0 +1,71 @@ -+#!/usr/bin/env bash -+# -+# Performs an operation on all targets -+ -+set -ex -+ -+: "${1?The all.sh script requires one argument.}" -+ -+op=$1 -+ -+cargo_clean() { -+ cargo clean -+} -+ -+cargo_check_fmt() { -+ cargo fmt --all -- --check -+} -+ -+cargo_fmt() { -+ cargo fmt --all -+} -+ -+cargo_clippy() { -+ cargo clippy --all -- -D clippy::pedantic -+} -+ -+CMD="-1" -+ -+case $op in -+ clean*) -+ CMD=cargo_clean -+ ;; -+ check_fmt*) -+ CMD=cargo_check_fmt -+ ;; -+ fmt*) -+ CMD=cargo_fmt -+ ;; -+ clippy) -+ CMD=cargo_clippy -+ ;; -+ *) -+ echo "Unknown operation: \"${op}\"" -+ exit 1 -+ ;; -+esac -+ -+echo "Operation is: ${CMD}" -+ -+# On src/ -+$CMD -+ -+# Check examples/ -+for dir in examples/*/ -+do -+ dir=${dir%*/} -+ ( -+ cd "${dir%*/}" -+ $CMD -+ ) -+done -+ -+( -+ cd verify/verify -+ $CMD -+) -+ -+( -+ cd micro_benchmarks -+ $CMD -+) -diff --git a/third_party/rust/packed_simd/ci/android-install-ndk.sh b/third_party/rust/packed_simd/ci/android-install-ndk.sh -new file mode 100644 -index 000000000000..818e78446ae8 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/android-install-ndk.sh -@@ -0,0 +1,37 @@ -+#!/usr/bin/env sh -+# Copyright 2016 The Rust Project Developers. See the COPYRIGHT -+# file at the top-level directory of this distribution and at -+# http://rust-lang.org/COPYRIGHT. -+# -+# Licensed under the Apache License, Version 2.0 or the MIT license -+# , at your -+# option. This file may not be copied, modified, or distributed -+# except according to those terms. -+ -+set -ex -+ -+curl --retry 5 -O https://dl.google.com/android/repository/android-ndk-r15b-linux-x86_64.zip -+unzip -q android-ndk-r15b-linux-x86_64.zip -+ -+case "$1" in -+ aarch64) -+ arch=arm64 -+ ;; -+ -+ i686) -+ arch=x86 -+ ;; -+ -+ *) -+ arch=$1 -+ ;; -+esac; -+ -+android-ndk-r15b/build/tools/make_standalone_toolchain.py \ -+ --unified-headers \ -+ --install-dir "/android/ndk-${1}" \ -+ --arch "${arch}" \ -+ --api 24 -+ -+rm -rf ./android-ndk-r15b-linux-x86_64.zip ./android-ndk-r15b -diff --git a/third_party/rust/packed_simd/ci/android-install-sdk.sh b/third_party/rust/packed_simd/ci/android-install-sdk.sh -new file mode 100644 -index 000000000000..6b5ac09ab04a ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/android-install-sdk.sh -@@ -0,0 +1,60 @@ -+#!/usr/bin/env sh -+# Copyright 2016 The Rust Project Developers. See the COPYRIGHT -+# file at the top-level directory of this distribution and at -+# http://rust-lang.org/COPYRIGHT. -+# -+# Licensed under the Apache License, Version 2.0 or the MIT license -+# , at your -+# option. This file may not be copied, modified, or distributed -+# except according to those terms. -+ -+set -ex -+ -+# Prep the SDK and emulator -+# -+# Note that the update process requires that we accept a bunch of licenses, and -+# we can't just pipe `yes` into it for some reason, so we take the same strategy -+# located in https://github.com/appunite/docker by just wrapping it in a script -+# which apparently magically accepts the licenses. -+ -+mkdir sdk -+curl --retry 5 https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip -O -+unzip -d sdk sdk-tools-linux-3859397.zip -+ -+case "$1" in -+ arm | armv7) -+ abi=armeabi-v7a -+ ;; -+ -+ aarch64) -+ abi=arm64-v8a -+ ;; -+ -+ i686) -+ abi=x86 -+ ;; -+ -+ x86_64) -+ abi=x86_64 -+ ;; -+ -+ *) -+ echo "invalid arch: $1" -+ exit 1 -+ ;; -+esac; -+ -+# --no_https avoids -+ # javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found -+yes | ./sdk/tools/bin/sdkmanager --licenses --no_https -+yes | ./sdk/tools/bin/sdkmanager --no_https \ -+ "emulator" \ -+ "platform-tools" \ -+ "platforms;android-24" \ -+ "system-images;android-24;default;$abi" -+ -+echo "no" | -+ ./sdk/tools/bin/avdmanager create avd \ -+ --name "${1}" \ -+ --package "system-images;android-24;default;$abi" -diff --git a/third_party/rust/packed_simd/ci/android-sysimage.sh b/third_party/rust/packed_simd/ci/android-sysimage.sh -new file mode 100644 -index 000000000000..9eabd7c8d94f ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/android-sysimage.sh -@@ -0,0 +1,56 @@ -+#!/usr/bin/env bash -+ -+# Copyright 2017 The Rust Project Developers. See the COPYRIGHT -+# file at the top-level directory of this distribution and at -+# http://rust-lang.org/COPYRIGHT. -+# -+# Licensed under the Apache License, Version 2.0 or the MIT license -+# , at your -+# option. This file may not be copied, modified, or distributed -+# except according to those terms. -+ -+set -ex -+ -+URL=https://dl.google.com/android/repository/sys-img/android -+ -+main() { -+ local arch="${1}" -+ local name="${2}" -+ local dest=/system -+ local td -+ td="$(mktemp -d)" -+ -+ apt-get install --no-install-recommends e2tools -+ -+ pushd "${td}" -+ curl --retry 5 -O "${URL}/${name}" -+ unzip -q "${name}" -+ -+ local system -+ system="$(find . -name system.img)" -+ mkdir -p ${dest}/{bin,lib,lib64} -+ -+ # Extract android linker and libraries to /system -+ # This allows android executables to be run directly (or with qemu) -+ if [ "${arch}" = "x86_64" ] || [ "${arch}" = "arm64" ]; then -+ e2cp -p "${system}:/bin/linker64" "${dest}/bin/" -+ e2cp -p "${system}:/lib64/libdl.so" "${dest}/lib64/" -+ e2cp -p "${system}:/lib64/libc.so" "${dest}/lib64/" -+ e2cp -p "${system}:/lib64/libm.so" "${dest}/lib64/" -+ else -+ e2cp -p "${system}:/bin/linker" "${dest}/bin/" -+ e2cp -p "${system}:/lib/libdl.so" "${dest}/lib/" -+ e2cp -p "${system}:/lib/libc.so" "${dest}/lib/" -+ e2cp -p "${system}:/lib/libm.so" "${dest}/lib/" -+ fi -+ -+ # clean up -+ apt-get purge --auto-remove -y e2tools -+ -+ popd -+ -+ rm -rf "${td}" -+} -+ -+main "${@}" -diff --git a/third_party/rust/packed_simd/ci/benchmark.sh b/third_party/rust/packed_simd/ci/benchmark.sh -new file mode 100644 -index 000000000000..3635b9e371d1 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/benchmark.sh -@@ -0,0 +1,32 @@ -+#!/usr/bin/env bash -+# -+# Runs all benchmarks. Controlled by the following environment variables: -+# -+# FEATURES={} - cargo features to pass to all benchmarks (e.g. core_arch,sleef-sys,ispc) -+# NORUN={1} - only builds the benchmarks -+ -+set -ex -+ -+if [[ ${NORUN} != 1 ]]; then -+ # Most benchmarks require hyperfine; require it upfront. -+ hash hyperfine 2>/dev/null || { echo >&2 "hyperfine is not in PATH."; exit 1; } -+fi -+ -+ -+# If the ispc benchmark feature is enabled, ispc must be in the path of the -+# benchmarks. -+if echo "$FEATURES" | grep -q "ispc"; then -+ hash ispc 2>/dev/null || { echo >&2 "ispc is not in PATH."; exit 1; } -+fi -+ -+# An example with a benchmark.sh is a benchmark: -+for dir in examples/*/ -+do -+ dir=${dir%*/} -+ cd ${dir%*/} -+ if [ -f "benchmark.sh" ]; then -+ ./benchmark.sh -+ fi -+ cd - -+done -+ -diff --git a/third_party/rust/packed_simd/ci/deploy_and_run_on_ios_simulator.rs b/third_party/rust/packed_simd/ci/deploy_and_run_on_ios_simulator.rs -new file mode 100644 -index 000000000000..c0fe52c35659 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/deploy_and_run_on_ios_simulator.rs -@@ -0,0 +1,176 @@ -+// Copyright 2017 The Rust Project Developers. See the COPYRIGHT -+// file at the top-level directory of this distribution and at -+// http://rust-lang.org/COPYRIGHT. -+// -+// Licensed under the Apache License, Version 2.0 or the MIT license -+// , at your -+// option. This file may not be copied, modified, or distributed -+// except according to those terms. -+ -+// This is a script to deploy and execute a binary on an iOS simulator. -+// The primary use of this is to be able to run unit tests on the simulator and -+// retrieve the results. -+// -+// To do this through Cargo instead, use Dinghy -+// (https://github.com/snipsco/dinghy): cargo dinghy install, then cargo dinghy -+// test. -+ -+use std::env; -+use std::fs::{self, File}; -+use std::io::Write; -+use std::path::Path; -+use std::process; -+use std::process::Command; -+ -+macro_rules! t { -+ ($e:expr) => (match $e { -+ Ok(e) => e, -+ Err(e) => panic!("{} failed with: {}", stringify!($e), e), -+ }) -+} -+ -+// Step one: Wrap as an app -+fn package_as_simulator_app(crate_name: &str, test_binary_path: &Path) { -+ println!("Packaging simulator app"); -+ drop(fs::remove_dir_all("ios_simulator_app")); -+ t!(fs::create_dir("ios_simulator_app")); -+ t!(fs::copy(test_binary_path, -+ Path::new("ios_simulator_app").join(crate_name))); -+ -+ let mut f = t!(File::create("ios_simulator_app/Info.plist")); -+ t!(f.write_all(format!(r#" -+ -+ -+ -+ -+ CFBundleExecutable -+ {} -+ CFBundleIdentifier -+ com.rust.unittests -+ -+ -+ "#, crate_name).as_bytes())); -+} -+ -+// Step two: Start the iOS simulator -+fn start_simulator() { -+ println!("Looking for iOS simulator"); -+ let output = t!(Command::new("xcrun").arg("simctl").arg("list").output()); -+ assert!(output.status.success()); -+ let mut simulator_exists = false; -+ let mut simulator_booted = false; -+ let mut found_rust_sim = false; -+ let stdout = t!(String::from_utf8(output.stdout)); -+ for line in stdout.lines() { -+ if line.contains("rust_ios") { -+ if found_rust_sim { -+ panic!("Duplicate rust_ios simulators found. Please \ -+ double-check xcrun simctl list."); -+ } -+ simulator_exists = true; -+ simulator_booted = line.contains("(Booted)"); -+ found_rust_sim = true; -+ } -+ } -+ -+ if simulator_exists == false { -+ println!("Creating iOS simulator"); -+ Command::new("xcrun") -+ .arg("simctl") -+ .arg("create") -+ .arg("rust_ios") -+ .arg("com.apple.CoreSimulator.SimDeviceType.iPhone-SE") -+ .arg("com.apple.CoreSimulator.SimRuntime.iOS-10-2") -+ .check_status(); -+ } else if simulator_booted == true { -+ println!("Shutting down already-booted simulator"); -+ Command::new("xcrun") -+ .arg("simctl") -+ .arg("shutdown") -+ .arg("rust_ios") -+ .check_status(); -+ } -+ -+ println!("Starting iOS simulator"); -+ // We can't uninstall the app (if present) as that will hang if the -+ // simulator isn't completely booted; just erase the simulator instead. -+ Command::new("xcrun").arg("simctl").arg("erase").arg("rust_ios").check_status(); -+ Command::new("xcrun").arg("simctl").arg("boot").arg("rust_ios").check_status(); -+} -+ -+// Step three: Install the app -+fn install_app_to_simulator() { -+ println!("Installing app to simulator"); -+ Command::new("xcrun") -+ .arg("simctl") -+ .arg("install") -+ .arg("booted") -+ .arg("ios_simulator_app/") -+ .check_status(); -+} -+ -+// Step four: Run the app -+fn run_app_on_simulator() { -+ println!("Running app"); -+ let output = t!(Command::new("xcrun") -+ .arg("simctl") -+ .arg("launch") -+ .arg("--console") -+ .arg("booted") -+ .arg("com.rust.unittests") -+ .output()); -+ -+ println!("stdout --\n{}\n", String::from_utf8_lossy(&output.stdout)); -+ println!("stderr --\n{}\n", String::from_utf8_lossy(&output.stderr)); -+ -+ let stdout = String::from_utf8_lossy(&output.stdout); -+ let failed = stdout.lines() -+ .find(|l| l.contains("FAILED")) -+ .map(|l| l.contains("FAILED")) -+ .unwrap_or(false); -+ -+ let passed = stdout.lines() -+ .find(|l| l.contains("test result: ok")) -+ .map(|l| l.contains("test result: ok")) -+ .unwrap_or(false); -+ -+ println!("Shutting down simulator"); -+ Command::new("xcrun") -+ .arg("simctl") -+ .arg("shutdown") -+ .arg("rust_ios") -+ .check_status(); -+ if !(passed && !failed) { -+ panic!("tests didn't pass"); -+ } -+} -+ -+trait CheckStatus { -+ fn check_status(&mut self); -+} -+ -+impl CheckStatus for Command { -+ fn check_status(&mut self) { -+ println!("\trunning: {:?}", self); -+ assert!(t!(self.status()).success()); -+ } -+} -+ -+fn main() { -+ let args: Vec = env::args().collect(); -+ if args.len() != 2 { -+ println!("Usage: {} ", args[0]); -+ process::exit(-1); -+ } -+ -+ let test_binary_path = Path::new(&args[1]); -+ let crate_name = test_binary_path.file_name().unwrap(); -+ -+ package_as_simulator_app(crate_name.to_str().unwrap(), test_binary_path); -+ start_simulator(); -+ install_app_to_simulator(); -+ run_app_on_simulator(); -+} -diff --git a/third_party/rust/packed_simd/ci/docker/aarch64-linux-android/Dockerfile b/third_party/rust/packed_simd/ci/docker/aarch64-linux-android/Dockerfile -new file mode 100644 -index 000000000000..27bde89c5a8d ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/aarch64-linux-android/Dockerfile -@@ -0,0 +1,47 @@ -+FROM ubuntu:16.04 -+ -+RUN dpkg --add-architecture i386 && \ -+ apt-get update && \ -+ apt-get install -y --no-install-recommends \ -+ file \ -+ make \ -+ curl \ -+ ca-certificates \ -+ python \ -+ unzip \ -+ expect \ -+ openjdk-9-jre \ -+ libstdc++6:i386 \ -+ libpulse0 \ -+ gcc \ -+ libc6-dev -+ -+WORKDIR /android/ -+COPY android* /android/ -+ -+ENV ANDROID_ARCH=aarch64 -+ENV PATH=$PATH:/android/ndk-$ANDROID_ARCH/bin:/android/sdk/tools:/android/sdk/platform-tools -+ -+RUN sh /android/android-install-ndk.sh $ANDROID_ARCH -+RUN sh /android/android-install-sdk.sh $ANDROID_ARCH -+RUN mv /root/.android /tmp -+RUN chmod 777 -R /tmp/.android -+RUN chmod 755 /android/sdk/tools/* /android/sdk/emulator/qemu/linux-x86_64/* -+ -+ENV PATH=$PATH:/rust/bin \ -+ CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=aarch64-linux-android-gcc \ -+ CARGO_TARGET_AARCH64_LINUX_ANDROID_RUNNER=/tmp/runtest \ -+ OBJDUMP=aarch64-linux-android-objdump \ -+ HOME=/tmp -+ -+ADD runtest-android.rs /tmp/runtest.rs -+ENTRYPOINT [ \ -+ "bash", \ -+ "-c", \ -+ # set SHELL so android can detect a 64bits system, see -+ # http://stackoverflow.com/a/41789144 -+ "SHELL=/bin/dash /android/sdk/emulator/emulator @aarch64 -no-window & \ -+ rustc /tmp/runtest.rs -o /tmp/runtest && \ -+ exec \"$@\"", \ -+ "--" \ -+] -diff --git a/third_party/rust/packed_simd/ci/docker/aarch64-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/aarch64-unknown-linux-gnu/Dockerfile -new file mode 100644 -index 000000000000..68261a2f033d ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/aarch64-unknown-linux-gnu/Dockerfile -@@ -0,0 +1,14 @@ -+FROM ubuntu:17.10 -+RUN apt-get update && apt-get install -y --no-install-recommends \ -+ gcc \ -+ ca-certificates \ -+ libc6-dev \ -+ gcc-aarch64-linux-gnu \ -+ libc6-dev-arm64-cross \ -+ qemu-user \ -+ make \ -+ file -+ -+ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc \ -+ CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUNNER="qemu-aarch64 -L /usr/aarch64-linux-gnu" \ -+ OBJDUMP=aarch64-linux-gnu-objdump -diff --git a/third_party/rust/packed_simd/ci/docker/arm-linux-androideabi/Dockerfile b/third_party/rust/packed_simd/ci/docker/arm-linux-androideabi/Dockerfile -new file mode 100644 -index 000000000000..995a9e30e65e ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/arm-linux-androideabi/Dockerfile -@@ -0,0 +1,47 @@ -+FROM ubuntu:16.04 -+ -+RUN dpkg --add-architecture i386 && \ -+ apt-get update && \ -+ apt-get install -y --no-install-recommends \ -+ file \ -+ make \ -+ curl \ -+ ca-certificates \ -+ python \ -+ unzip \ -+ expect \ -+ openjdk-9-jre \ -+ libstdc++6:i386 \ -+ libpulse0 \ -+ gcc \ -+ libc6-dev -+ -+WORKDIR /android/ -+COPY android* /android/ -+ -+ENV ANDROID_ARCH=arm -+ENV PATH=$PATH:/android/ndk-$ANDROID_ARCH/bin:/android/sdk/tools:/android/sdk/platform-tools -+ -+RUN sh /android/android-install-ndk.sh $ANDROID_ARCH -+RUN sh /android/android-install-sdk.sh $ANDROID_ARCH -+RUN mv /root/.android /tmp -+RUN chmod 777 -R /tmp/.android -+RUN chmod 755 /android/sdk/tools/* /android/sdk/emulator/qemu/linux-x86_64/* -+ -+ENV PATH=$PATH:/rust/bin \ -+ CARGO_TARGET_ARM_LINUX_ANDROIDEABI_LINKER=arm-linux-androideabi-gcc \ -+ CARGO_TARGET_ARM_LINUX_ANDROIDEABI_RUNNER=/tmp/runtest \ -+ OBJDUMP=arm-linux-androideabi-objdump \ -+ HOME=/tmp -+ -+ADD runtest-android.rs /tmp/runtest.rs -+ENTRYPOINT [ \ -+ "bash", \ -+ "-c", \ -+ # set SHELL so android can detect a 64bits system, see -+ # http://stackoverflow.com/a/41789144 -+ "SHELL=/bin/dash /android/sdk/emulator/emulator @arm -no-window & \ -+ rustc /tmp/runtest.rs -o /tmp/runtest && \ -+ exec \"$@\"", \ -+ "--" \ -+] -diff --git a/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabi/Dockerfile b/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabi/Dockerfile -new file mode 100644 -index 000000000000..cb4de6a57eaa ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabi/Dockerfile -@@ -0,0 +1,15 @@ -+FROM ubuntu:17.10 -+RUN apt-get update && apt-get install -y --no-install-recommends \ -+ gcc \ -+ ca-certificates \ -+ libc6-dev \ -+ libc6-armel-cross \ -+ libc6-dev-armel-cross \ -+ binutils-arm-linux-gnueabi \ -+ gcc-arm-linux-gnueabi \ -+ qemu-user \ -+ make \ -+ file -+ENV CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABI_LINKER=arm-linux-gnueabi-gcc \ -+ CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABI_RUNNER="qemu-arm -L /usr/arm-linux-gnueabi" \ -+ OBJDUMP=arm-linux-gnueabi-objdump -diff --git a/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile b/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile -new file mode 100644 -index 000000000000..c7bd61f0a796 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile -@@ -0,0 +1,13 @@ -+FROM ubuntu:17.10 -+RUN apt-get update && apt-get install -y --no-install-recommends \ -+ gcc \ -+ ca-certificates \ -+ libc6-dev \ -+ gcc-arm-linux-gnueabihf \ -+ libc6-dev-armhf-cross \ -+ qemu-user \ -+ make \ -+ file -+ENV CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc \ -+ CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_RUNNER="qemu-arm -L /usr/arm-linux-gnueabihf" \ -+ OBJDUMP=arm-linux-gnueabihf-objdump -diff --git a/third_party/rust/packed_simd/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile b/third_party/rust/packed_simd/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile -new file mode 100644 -index 000000000000..e01b87afdf56 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile -@@ -0,0 +1,13 @@ -+FROM ubuntu:17.10 -+RUN apt-get update && apt-get install -y --no-install-recommends \ -+ gcc \ -+ ca-certificates \ -+ libc6-dev \ -+ gcc-arm-linux-gnueabihf \ -+ libc6-dev-armhf-cross \ -+ qemu-user \ -+ make \ -+ file -+ENV CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc \ -+ CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_RUNNER="qemu-arm -L /usr/arm-linux-gnueabihf" \ -+ OBJDUMP=arm-linux-gnueabihf-objdump -diff --git a/third_party/rust/packed_simd/ci/docker/i586-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/i586-unknown-linux-gnu/Dockerfile -new file mode 100644 -index 000000000000..857974a858f1 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/i586-unknown-linux-gnu/Dockerfile -@@ -0,0 +1,7 @@ -+FROM ubuntu:17.10 -+RUN apt-get update && apt-get install -y --no-install-recommends \ -+ gcc-multilib \ -+ libc6-dev \ -+ file \ -+ make \ -+ ca-certificates -diff --git a/third_party/rust/packed_simd/ci/docker/i686-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/i686-unknown-linux-gnu/Dockerfile -new file mode 100644 -index 000000000000..857974a858f1 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/i686-unknown-linux-gnu/Dockerfile -@@ -0,0 +1,7 @@ -+FROM ubuntu:17.10 -+RUN apt-get update && apt-get install -y --no-install-recommends \ -+ gcc-multilib \ -+ libc6-dev \ -+ file \ -+ make \ -+ ca-certificates -diff --git a/third_party/rust/packed_simd/ci/docker/mips-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/mips-unknown-linux-gnu/Dockerfile -new file mode 100644 -index 000000000000..4711cead372a ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/mips-unknown-linux-gnu/Dockerfile -@@ -0,0 +1,13 @@ -+FROM ubuntu:17.10 -+ -+RUN apt-get update && apt-get install -y --no-install-recommends \ -+ gcc libc6-dev qemu-user ca-certificates \ -+ gcc-mips-linux-gnu libc6-dev-mips-cross \ -+ qemu-system-mips \ -+ qemu-user \ -+ make \ -+ file -+ -+ENV CARGO_TARGET_MIPS_UNKNOWN_LINUX_GNU_LINKER=mips-linux-gnu-gcc \ -+ CARGO_TARGET_MIPS_UNKNOWN_LINUX_GNU_RUNNER="qemu-mips -L /usr/mips-linux-gnu" \ -+ OBJDUMP=mips-linux-gnu-objdump -\ No newline at end of file -diff --git a/third_party/rust/packed_simd/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile b/third_party/rust/packed_simd/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile -new file mode 100644 -index 000000000000..1422e8c80924 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile -@@ -0,0 +1,10 @@ -+FROM ubuntu:17.10 -+ -+RUN apt-get update && apt-get install -y --no-install-recommends \ -+ gcc libc6-dev qemu-user ca-certificates \ -+ gcc-mips64-linux-gnuabi64 libc6-dev-mips64-cross \ -+ qemu-system-mips64 qemu-user -+ -+ENV CARGO_TARGET_MIPS64_UNKNOWN_LINUX_GNUABI64_LINKER=mips64-linux-gnuabi64-gcc \ -+ CARGO_TARGET_MIPS64_UNKNOWN_LINUX_GNUABI64_RUNNER="qemu-mips64 -L /usr/mips64-linux-gnuabi64" \ -+ OBJDUMP=mips64-linux-gnuabi64-objdump -\ No newline at end of file -diff --git a/third_party/rust/packed_simd/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile b/third_party/rust/packed_simd/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile -new file mode 100644 -index 000000000000..d94deb5b2013 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile -@@ -0,0 +1,10 @@ -+FROM ubuntu:17.10 -+ -+RUN apt-get update && apt-get install -y --no-install-recommends \ -+ gcc libc6-dev qemu-user ca-certificates \ -+ gcc-mips64el-linux-gnuabi64 libc6-dev-mips64el-cross \ -+ qemu-system-mips64el -+ -+ENV CARGO_TARGET_MIPS64EL_UNKNOWN_LINUX_GNUABI64_LINKER=mips64el-linux-gnuabi64-gcc \ -+ CARGO_TARGET_MIPS64EL_UNKNOWN_LINUX_GNUABI64_RUNNER="qemu-mips64el -L /usr/mips64el-linux-gnuabi64" \ -+ OBJDUMP=mips64el-linux-gnuabi64-objdump -\ No newline at end of file -diff --git a/third_party/rust/packed_simd/ci/docker/mipsel-unknown-linux-musl/Dockerfile b/third_party/rust/packed_simd/ci/docker/mipsel-unknown-linux-musl/Dockerfile -new file mode 100644 -index 000000000000..40ac50675bd9 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/mipsel-unknown-linux-musl/Dockerfile -@@ -0,0 +1,25 @@ -+FROM ubuntu:18.10 -+ -+RUN apt-get update && \ -+ apt-get install -y --no-install-recommends \ -+ ca-certificates \ -+ gcc \ -+ libc6-dev \ -+ make \ -+ qemu-user \ -+ qemu-system-mips \ -+ bzip2 \ -+ curl \ -+ file -+ -+RUN mkdir /toolchain -+ -+# Note that this originally came from: -+# https://downloads.openwrt.org/snapshots/trunk/malta/generic/OpenWrt-Toolchain-malta-le_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2 -+RUN curl -L https://s3-us-west-1.amazonaws.com/rust-lang-ci2/libc/OpenWrt-Toolchain-malta-le_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2 | \ -+ tar xjf - -C /toolchain --strip-components=2 -+ -+ENV PATH=$PATH:/rust/bin:/toolchain/bin \ -+ CC_mipsel_unknown_linux_musl=mipsel-openwrt-linux-gcc \ -+ CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_LINKER=mipsel-openwrt-linux-gcc \ -+ CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_RUNNER="qemu-mipsel -L /toolchain" -\ No newline at end of file -diff --git a/third_party/rust/packed_simd/ci/docker/powerpc-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/powerpc-unknown-linux-gnu/Dockerfile -new file mode 100644 -index 000000000000..43b174ed87fc ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/powerpc-unknown-linux-gnu/Dockerfile -@@ -0,0 +1,12 @@ -+FROM ubuntu:17.10 -+ -+RUN apt-get update && apt-get install -y --no-install-recommends \ -+ gcc libc6-dev qemu-user ca-certificates \ -+ gcc-powerpc-linux-gnu libc6-dev-powerpc-cross \ -+ qemu-system-ppc \ -+ make \ -+ file -+ -+ENV CARGO_TARGET_POWERPC_UNKNOWN_LINUX_GNU_LINKER=powerpc-linux-gnu-gcc \ -+ CARGO_TARGET_POWERPC_UNKNOWN_LINUX_GNU_RUNNER="qemu-ppc -cpu Vger -L /usr/powerpc-linux-gnu" \ -+ OBJDUMP=powerpc-linux-gnu-objdump -diff --git a/third_party/rust/packed_simd/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile -new file mode 100644 -index 000000000000..7757ad28a42d ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile -@@ -0,0 +1,17 @@ -+FROM ubuntu:17.10 -+ -+RUN apt-get update && apt-get install -y --no-install-recommends \ -+ gcc \ -+ ca-certificates \ -+ libc6-dev \ -+ gcc-powerpc64-linux-gnu \ -+ libc6-dev-ppc64-cross \ -+ qemu-user \ -+ qemu-system-ppc \ -+ make \ -+ file -+ -+ENV CARGO_TARGET_POWERPC64_UNKNOWN_LINUX_GNU_LINKER=powerpc64-linux-gnu-gcc \ -+ CARGO_TARGET_POWERPC64_UNKNOWN_LINUX_GNU_RUNNER="qemu-ppc64 -L /usr/powerpc64-linux-gnu" \ -+ CC=powerpc64-linux-gnu-gcc \ -+ OBJDUMP=powerpc64-linux-gnu-objdump -diff --git a/third_party/rust/packed_simd/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile -new file mode 100644 -index 000000000000..0b0c214fdf1b ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile -@@ -0,0 +1,11 @@ -+FROM ubuntu:17.10 -+ -+RUN apt-get update && apt-get install -y --no-install-recommends \ -+ gcc libc6-dev qemu-user ca-certificates \ -+ gcc-powerpc64le-linux-gnu libc6-dev-ppc64el-cross \ -+ qemu-system-ppc file make -+ -+ENV CARGO_TARGET_POWERPC64LE_UNKNOWN_LINUX_GNU_LINKER=powerpc64le-linux-gnu-gcc \ -+ CARGO_TARGET_POWERPC64LE_UNKNOWN_LINUX_GNU_RUNNER="qemu-ppc64le -L /usr/powerpc64le-linux-gnu" \ -+ CC=powerpc64le-linux-gnu-gcc \ -+ OBJDUMP=powerpc64le-linux-gnu-objdump -diff --git a/third_party/rust/packed_simd/ci/docker/s390x-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/s390x-unknown-linux-gnu/Dockerfile -new file mode 100644 -index 000000000000..c645b0bcc2b8 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/s390x-unknown-linux-gnu/Dockerfile -@@ -0,0 +1,20 @@ -+FROM ubuntu:18.10 -+ -+RUN apt-get update && \ -+ apt-get install -y --no-install-recommends \ -+ ca-certificates \ -+ curl \ -+ cmake \ -+ gcc \ -+ libc6-dev \ -+ g++-s390x-linux-gnu \ -+ libc6-dev-s390x-cross \ -+ qemu-user \ -+ make \ -+ file -+ -+ENV CARGO_TARGET_S390X_UNKNOWN_LINUX_GNU_LINKER=s390x-linux-gnu-gcc \ -+ CARGO_TARGET_S390X_UNKNOWN_LINUX_GNU_RUNNER="qemu-s390x -L /usr/s390x-linux-gnu" \ -+ CC_s390x_unknown_linux_gnu=s390x-linux-gnu-gcc \ -+ CXX_s390x_unknown_linux_gnu=s390x-linux-gnu-g++ \ -+ OBJDUMP=s390x-linux-gnu-objdump -\ No newline at end of file -diff --git a/third_party/rust/packed_simd/ci/docker/sparc64-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/sparc64-unknown-linux-gnu/Dockerfile -new file mode 100644 -index 000000000000..fe12af14da6f ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/sparc64-unknown-linux-gnu/Dockerfile -@@ -0,0 +1,18 @@ -+FROM debian:stretch -+ -+RUN apt-get update && apt-get install -y --no-install-recommends \ -+ curl ca-certificates \ -+ gcc libc6-dev \ -+ gcc-sparc64-linux-gnu libc6-dev-sparc64-cross \ -+ qemu-system-sparc64 openbios-sparc seabios ipxe-qemu \ -+ p7zip-full cpio -+ -+COPY linux-sparc64.sh / -+RUN bash /linux-sparc64.sh -+ -+COPY test-runner-linux / -+ -+ENV CARGO_TARGET_SPARC64_UNKNOWN_LINUX_GNU_LINKER=sparc64-linux-gnu-gcc \ -+ CARGO_TARGET_SPARC64_UNKNOWN_LINUX_GNU_RUNNER="/test-runner-linux sparc64" \ -+ CC_sparc64_unknown_linux_gnu=sparc64-linux-gnu-gcc \ -+ PATH=$PATH:/rust/bin -\ No newline at end of file -diff --git a/third_party/rust/packed_simd/ci/docker/thumbv7neon-linux-androideabi/Dockerfile b/third_party/rust/packed_simd/ci/docker/thumbv7neon-linux-androideabi/Dockerfile -new file mode 100644 -index 000000000000..c1da77109c12 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/thumbv7neon-linux-androideabi/Dockerfile -@@ -0,0 +1,47 @@ -+FROM ubuntu:16.04 -+ -+RUN dpkg --add-architecture i386 && \ -+ apt-get update && \ -+ apt-get install -y --no-install-recommends \ -+ file \ -+ make \ -+ curl \ -+ ca-certificates \ -+ python \ -+ unzip \ -+ expect \ -+ openjdk-9-jre \ -+ libstdc++6:i386 \ -+ libpulse0 \ -+ gcc \ -+ libc6-dev -+ -+WORKDIR /android/ -+COPY android* /android/ -+ -+ENV ANDROID_ARCH=arm -+ENV PATH=$PATH:/android/ndk-$ANDROID_ARCH/bin:/android/sdk/tools:/android/sdk/platform-tools -+ -+RUN sh /android/android-install-ndk.sh $ANDROID_ARCH -+RUN sh /android/android-install-sdk.sh $ANDROID_ARCH -+RUN mv /root/.android /tmp -+RUN chmod 777 -R /tmp/.android -+RUN chmod 755 /android/sdk/tools/* /android/sdk/emulator/qemu/linux-x86_64/* -+ -+ENV PATH=$PATH:/rust/bin \ -+ CARGO_TARGET_THUMBV7NEON_LINUX_ANDROIDEABI_LINKER=arm-linux-androideabi-gcc \ -+ CARGO_TARGET_THUMBV7NEON_LINUX_ANDROIDEABI_RUNNER=/tmp/runtest \ -+ OBJDUMP=arm-linux-androideabi-objdump \ -+ HOME=/tmp -+ -+ADD runtest-android.rs /tmp/runtest.rs -+ENTRYPOINT [ \ -+ "bash", \ -+ "-c", \ -+ # set SHELL so android can detect a 64bits system, see -+ # http://stackoverflow.com/a/41789144 -+ "SHELL=/bin/dash /android/sdk/emulator/emulator @arm -no-window & \ -+ rustc /tmp/runtest.rs -o /tmp/runtest && \ -+ exec \"$@\"", \ -+ "--" \ -+] -diff --git a/third_party/rust/packed_simd/ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile b/third_party/rust/packed_simd/ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile -new file mode 100644 -index 000000000000..696cb6c3fb52 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile -@@ -0,0 +1,13 @@ -+FROM ubuntu:17.10 -+RUN apt-get update && apt-get install -y --no-install-recommends \ -+ gcc \ -+ ca-certificates \ -+ libc6-dev \ -+ gcc-arm-linux-gnueabihf \ -+ libc6-dev-armhf-cross \ -+ qemu-user \ -+ make \ -+ file -+ENV CARGO_TARGET_THUMBV7NEON_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc \ -+ CARGO_TARGET_THUMBV7NEON_UNKNOWN_LINUX_GNUEABIHF_RUNNER="qemu-arm -L /usr/arm-linux-gnueabihf" \ -+ OBJDUMP=arm-linux-gnueabihf-objdump -diff --git a/third_party/rust/packed_simd/ci/docker/wasm32-unknown-unknown/Dockerfile b/third_party/rust/packed_simd/ci/docker/wasm32-unknown-unknown/Dockerfile -new file mode 100644 -index 000000000000..f905cf1a36eb ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/wasm32-unknown-unknown/Dockerfile -@@ -0,0 +1,37 @@ -+FROM ubuntu:18.04 -+ -+RUN apt-get update -y && apt-get install -y --no-install-recommends \ -+ ca-certificates \ -+ clang \ -+ cmake \ -+ curl \ -+ git \ -+ libc6-dev \ -+ make \ -+ python \ -+ xz-utils -+ -+# Install `wasm2wat` -+RUN git clone --recursive https://github.com/WebAssembly/wabt -+RUN make -C wabt -j$(nproc) -+ENV PATH=$PATH:/wabt/bin -+ -+# Install `wasm-bindgen-test-runner` -+RUN curl -L https://github.com/rustwasm/wasm-bindgen/releases/download/0.2.19/wasm-bindgen-0.2.19-x86_64-unknown-linux-musl.tar.gz \ -+ | tar xzf - -+ENV PATH=$PATH:/wasm-bindgen-0.2.19-x86_64-unknown-linux-musl -+ENV CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUNNER=wasm-bindgen-test-runner -+ -+# Install `node` -+RUN curl https://nodejs.org/dist/v10.8.0/node-v10.8.0-linux-x64.tar.xz | tar xJf - -+ENV PATH=$PATH:/node-v10.8.0-linux-x64/bin -+ -+# We use a shim linker that removes `--strip-debug` when passed to LLD. While -+# this typically results in invalid debug information in release mode it doesn't -+# result in an invalid names section which is what we're interested in. -+COPY lld-shim.rs / -+ENV CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_LINKER=/tmp/lld-shim -+ -+# Rustc isn't available until this container starts, so defer compilation of the -+# shim. -+ENTRYPOINT /rust/bin/rustc /lld-shim.rs -o /tmp/lld-shim && exec bash "$@" -diff --git a/third_party/rust/packed_simd/ci/docker/x86_64-linux-android/Dockerfile b/third_party/rust/packed_simd/ci/docker/x86_64-linux-android/Dockerfile -new file mode 100644 -index 000000000000..d52dd45b12bf ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/x86_64-linux-android/Dockerfile -@@ -0,0 +1,29 @@ -+FROM ubuntu:16.04 -+ -+RUN apt-get update && \ -+ apt-get install -y --no-install-recommends \ -+ ca-certificates \ -+ curl \ -+ gcc \ -+ libc-dev \ -+ python \ -+ unzip \ -+ file \ -+ make -+ -+WORKDIR /android/ -+ENV ANDROID_ARCH=x86_64 -+COPY android-install-ndk.sh /android/ -+RUN sh /android/android-install-ndk.sh $ANDROID_ARCH -+ -+# We do not run x86_64-linux-android tests on an android emulator. -+# See ci/android-sysimage.sh for informations about how tests are run. -+COPY android-sysimage.sh /android/ -+RUN bash /android/android-sysimage.sh x86_64 x86_64-24_r07.zip -+ -+ENV PATH=$PATH:/rust/bin:/android/ndk-$ANDROID_ARCH/bin \ -+ CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER=x86_64-linux-android-gcc \ -+ CC_x86_64_linux_android=x86_64-linux-android-gcc \ -+ CXX_x86_64_linux_android=x86_64-linux-android-g++ \ -+ OBJDUMP=x86_64-linux-android-objdump \ -+ HOME=/tmp -diff --git a/third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu-emulated/Dockerfile b/third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu-emulated/Dockerfile -new file mode 100644 -index 000000000000..a6bbe6653928 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu-emulated/Dockerfile -@@ -0,0 +1,16 @@ -+FROM ubuntu:18.04 -+RUN apt-get update && apt-get install -y --no-install-recommends \ -+ gcc \ -+ libc6-dev \ -+ file \ -+ make \ -+ ca-certificates \ -+ wget \ -+ bzip2 \ -+ cmake \ -+ libclang-dev \ -+ clang -+ -+RUN wget https://github.com/gnzlbg/intel_sde/raw/master/sde-external-8.16.0-2018-01-30-lin.tar.bz2 -+RUN tar -xjf sde-external-8.16.0-2018-01-30-lin.tar.bz2 -+ENV CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUNNER="/sde-external-8.16.0-2018-01-30-lin/sde64 --" -diff --git a/third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu/Dockerfile -new file mode 100644 -index 000000000000..e6b000d0516e ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu/Dockerfile -@@ -0,0 +1,10 @@ -+FROM ubuntu:17.10 -+RUN apt-get update && apt-get install -y --no-install-recommends \ -+ gcc \ -+ libc6-dev \ -+ file \ -+ make \ -+ ca-certificates \ -+ cmake \ -+ libclang-dev \ -+ clang -diff --git a/third_party/rust/packed_simd/ci/dox.sh b/third_party/rust/packed_simd/ci/dox.sh -new file mode 100644 -index 000000000000..1743366407e3 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/dox.sh -@@ -0,0 +1,24 @@ -+#!/bin/sh -+ -+set -ex -+ -+rm -rf target/doc -+mkdir -p target/doc -+ -+# Build API documentation -+cargo doc --features=into_bits -+ -+# Build Performance Guide -+# FIXME: https://github.com/rust-lang-nursery/mdBook/issues/780 -+# mdbook build perf-guide -d target/doc/perf-guide -+cd perf-guide -+mdbook build -+cd - -+cp -r perf-guide/book target/doc/perf-guide -+ -+# If we're on travis, not a PR, and on the right branch, publish! -+if [ "$TRAVIS_PULL_REQUEST" = "false" ] && [ "$TRAVIS_BRANCH" = "master" ]; then -+ pip install ghp_import --install-option="--prefix=$HOME/.local" -+ $HOME/.local/bin/ghp-import -n target/doc -+ git push -qf https://${GH_PAGES}@github.com/${TRAVIS_REPO_SLUG}.git gh-pages -+fi -diff --git a/third_party/rust/packed_simd/ci/linux-s390x.sh b/third_party/rust/packed_simd/ci/linux-s390x.sh -new file mode 100644 -index 000000000000..972abeec569e ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/linux-s390x.sh -@@ -0,0 +1,18 @@ -+set -ex -+ -+mkdir -m 777 /qemu -+cd /qemu -+ -+curl -LO https://github.com/qemu/qemu/raw/master/pc-bios/s390-ccw.img -+curl -LO http://ftp.debian.org/debian/dists/testing/main/installer-s390x/20170828/images/generic/kernel.debian -+curl -LO http://ftp.debian.org/debian/dists/testing/main/installer-s390x/20170828/images/generic/initrd.debian -+ -+mv kernel.debian kernel -+mv initrd.debian initrd.gz -+ -+mkdir init -+cd init -+gunzip -c ../initrd.gz | cpio -id -+rm ../initrd.gz -+cp /usr/s390x-linux-gnu/lib/libgcc_s.so.1 usr/lib/ -+chmod a+w . -diff --git a/third_party/rust/packed_simd/ci/linux-sparc64.sh b/third_party/rust/packed_simd/ci/linux-sparc64.sh -new file mode 100644 -index 000000000000..4452b120e1b6 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/linux-sparc64.sh -@@ -0,0 +1,17 @@ -+set -ex -+ -+mkdir -m 777 /qemu -+cd /qemu -+ -+curl -LO https://cdimage.debian.org/cdimage/ports/9.0/sparc64/iso-cd/debian-9.0-sparc64-NETINST-1.iso -+7z e debian-9.0-sparc64-NETINST-1.iso boot/initrd.gz -+7z e debian-9.0-sparc64-NETINST-1.iso boot/sparc64 -+mv sparc64 kernel -+rm debian-9.0-sparc64-NETINST-1.iso -+ -+mkdir init -+cd init -+gunzip -c ../initrd.gz | cpio -id -+rm ../initrd.gz -+cp /usr/sparc64-linux-gnu/lib/libgcc_s.so.1 usr/lib/ -+chmod a+w . -diff --git a/third_party/rust/packed_simd/ci/lld-shim.rs b/third_party/rust/packed_simd/ci/lld-shim.rs -new file mode 100644 -index 000000000000..10263869e8dc ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/lld-shim.rs -@@ -0,0 +1,11 @@ -+use std::os::unix::prelude::*; -+use std::process::Command; -+use std::env; -+ -+fn main() { -+ let args = env::args() -+ .skip(1) -+ .filter(|s| s != "--strip-debug") -+ .collect::>(); -+ panic!("failed to exec: {}", Command::new("rust-lld").args(&args).exec()); -+} -diff --git a/third_party/rust/packed_simd/ci/max_line_width.sh b/third_party/rust/packed_simd/ci/max_line_width.sh -new file mode 100644 -index 000000000000..f70639b6f89b ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/max_line_width.sh -@@ -0,0 +1,17 @@ -+#!/usr/bin/env sh -+ -+set -x -+ -+export success=true -+ -+find . -iname '*.rs' | while read -r file; do -+ result=$(grep '.\{79\}' "${file}" | grep --invert 'http') -+ if [ "${result}" = "" ] -+ then -+ : -+ else -+ echo "file \"${file}\": $result" -+ exit 1 -+ fi -+done -+ -diff --git a/third_party/rust/packed_simd/ci/run-docker.sh b/third_party/rust/packed_simd/ci/run-docker.sh -new file mode 100644 -index 000000000000..abdd6852fc3a ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/run-docker.sh -@@ -0,0 +1,38 @@ -+# Small script to run tests for a target (or all targets) inside all the -+# respective docker images. -+ -+set -ex -+ -+run() { -+ echo "Building docker container for TARGET=${TARGET} RUSTFLAGS=${RUSTFLAGS}" -+ docker build -t packed_simd -f ci/docker/${TARGET}/Dockerfile ci/ -+ mkdir -p target -+ target=$(echo "${TARGET}" | sed 's/-emulated//') -+ echo "Running docker" -+ docker run \ -+ --user `id -u`:`id -g` \ -+ --rm \ -+ --init \ -+ --volume $HOME/.cargo:/cargo \ -+ --env CARGO_HOME=/cargo \ -+ --volume `rustc --print sysroot`:/rust:ro \ -+ --env TARGET=$target \ -+ --env NORUN \ -+ --env NOVERIFY \ -+ --env RUSTFLAGS \ -+ --volume `pwd`:/checkout:ro \ -+ --volume `pwd`/target:/checkout/target \ -+ --workdir /checkout \ -+ --privileged \ -+ packed_simd \ -+ bash \ -+ -c 'PATH=$PATH:/rust/bin exec ci/run.sh' -+} -+ -+if [ -z "${TARGET}" ]; then -+ for d in `ls ci/docker/`; do -+ run $d -+ done -+else -+ run ${TARGET} -+fi -diff --git a/third_party/rust/packed_simd/ci/run.sh b/third_party/rust/packed_simd/ci/run.sh -new file mode 100644 -index 000000000000..7bb825883680 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/run.sh -@@ -0,0 +1,96 @@ -+#!/usr/bin/env bash -+ -+set -ex -+ -+: ${TARGET?"The TARGET environment variable must be set."} -+ -+# Tests are all super fast anyway, and they fault often enough on travis that -+# having only one thread increases debuggability to be worth it. -+#export RUST_TEST_THREADS=1 -+#export RUST_BACKTRACE=full -+#export RUST_TEST_NOCAPTURE=1 -+ -+# Some appveyor builds run out-of-memory; this attempts to mitigate that: -+# https://github.com/rust-lang-nursery/packed_simd/issues/39 -+# export RUSTFLAGS="${RUSTFLAGS} -C codegen-units=1" -+# export CARGO_BUILD_JOBS=1 -+ -+export CARGO_SUBCMD=test -+if [[ "${NORUN}" == "1" ]]; then -+ export CARGO_SUBCMD=build -+fi -+ -+if [[ ${TARGET} == "x86_64-apple-ios" ]] || [[ ${TARGET} == "i386-apple-ios" ]]; then -+ export RUSTFLAGS="${RUSTFLAGS} -Clink-arg=-mios-simulator-version-min=7.0" -+ rustc ./ci/deploy_and_run_on_ios_simulator.rs -o $HOME/runtest -+ export CARGO_TARGET_X86_64_APPLE_IOS_RUNNER=$HOME/runtest -+ export CARGO_TARGET_I386_APPLE_IOS_RUNNER=$HOME/runtest -+fi -+ -+# The source directory is read-only. Need to copy internal crates to the target -+# directory for their Cargo.lock to be properly written. -+mkdir target || true -+ -+rustc --version -+cargo --version -+echo "TARGET=${TARGET}" -+echo "HOST=${HOST}" -+echo "RUSTFLAGS=${RUSTFLAGS}" -+echo "NORUN=${NORUN}" -+echo "NOVERIFY=${NOVERIFY}" -+echo "CARGO_SUBCMD=${CARGO_SUBCMD}" -+echo "CARGO_BUILD_JOBS=${CARGO_BUILD_JOBS}" -+echo "CARGO_INCREMENTAL=${CARGO_INCREMENTAL}" -+echo "RUST_TEST_THREADS=${RUST_TEST_THREADS}" -+echo "RUST_BACKTRACE=${RUST_BACKTRACE}" -+echo "RUST_TEST_NOCAPTURE=${RUST_TEST_NOCAPTURE}" -+ -+cargo_test() { -+ cmd="cargo ${CARGO_SUBCMD} --verbose --target=${TARGET} ${@}" -+ if [ "${NORUN}" != "1" ] -+ then -+ if [ "$TARGET" != "wasm32-unknown-unknown" ] -+ then -+ cmd="$cmd -- --quiet" -+ fi -+ fi -+ mkdir target || true -+ ${cmd} 2>&1 | tee > target/output -+ if [[ ${PIPESTATUS[0]} != 0 ]]; then -+ cat target/output -+ return 1 -+ fi -+} -+ -+cargo_test_impl() { -+ ORIGINAL_RUSTFLAGS=${RUSTFLAGS} -+ RUSTFLAGS="${ORIGINAL_RUSTFLAGS} --cfg test_v16 --cfg test_v32 --cfg test_v64" cargo_test ${@} -+ RUSTFLAGS="${ORIGINAL_RUSTFLAGS} --cfg test_v128 --cfg test_v256" cargo_test ${@} -+ RUSTFLAGS="${ORIGINAL_RUSTFLAGS} --cfg test_v512" cargo_test ${@} -+ RUSTFLAGS=${ORIGINAL_RUSTFLAGS} -+} -+ -+# Debug run: -+if [[ "${TARGET}" != "wasm32-unknown-unknown" ]]; then -+ # Run wasm32-unknown-unknown in release mode only -+ cargo_test_impl -+fi -+ -+if [[ "${TARGET}" == "x86_64-unknown-linux-gnu" ]] || [[ "${TARGET}" == "x86_64-pc-windows-msvc" ]]; then -+ # use sleef on linux and windows x86_64 builds -+ cargo_test_impl --release --features=into_bits,core_arch,sleef-sys -+else -+ cargo_test_impl --release --features=into_bits,core_arch -+fi -+ -+# Verify code generation -+if [[ "${NOVERIFY}" != "1" ]]; then -+ cp -r verify/verify target/verify -+ export STDSIMD_ASSERT_INSTR_LIMIT=30 -+ if [[ "${TARGET}" == "i586-unknown-linux-gnu" ]]; then -+ export STDSIMD_ASSERT_INSTR_LIMIT=50 -+ fi -+ cargo_test --release --manifest-path=target/verify/Cargo.toml -+fi -+ -+. ci/run_examples.sh -diff --git a/third_party/rust/packed_simd/ci/run_examples.sh b/third_party/rust/packed_simd/ci/run_examples.sh -new file mode 100644 -index 000000000000..5b26b18afb20 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/run_examples.sh -@@ -0,0 +1,51 @@ -+# Runs all examples. -+ -+# FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/55 -+# All examples fail to build for `armv7-apple-ios`. -+if [[ ${TARGET} == "armv7-apple-ios" ]]; then -+ exit 0 -+fi -+ -+# FIXME: travis exceeds 50 minutes on these targets -+# Skipping the examples is an attempt at preventing travis from timing-out -+if [[ ${TARGET} == "arm-linux-androidabi" ]] || [[ ${TARGET} == "aarch64-linux-androidabi" ]] \ -+ || [[ ${TARGET} == "sparc64-unknown-linux-gnu" ]]; then -+ exit 0 -+fi -+ -+if [[ ${TARGET} == "wasm32-unknown-unknown" ]]; then -+ exit 0 -+fi -+ -+cp -r examples/aobench target/aobench -+cargo_test --manifest-path=target/aobench/Cargo.toml --release --no-default-features -+cargo_test --manifest-path=target/aobench/Cargo.toml --release --features=256bit -+ -+cp -r examples/dot_product target/dot_product -+cargo_test --manifest-path=target/dot_product/Cargo.toml --release -+ -+cp -r examples/fannkuch_redux target/fannkuch_redux -+cargo_test --manifest-path=target/fannkuch_redux/Cargo.toml --release -+ -+# FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/56 -+if [[ ${TARGET} != "i586-unknown-linux-gnu" ]]; then -+ cp -r examples/mandelbrot target/mandelbrot -+ cargo_test --manifest-path=target/mandelbrot/Cargo.toml --release -+fi -+ -+cp -r examples/matrix_inverse target/matrix_inverse -+cargo_test --manifest-path=target/matrix_inverse/Cargo.toml --release -+ -+cp -r examples/nbody target/nbody -+cargo_test --manifest-path=target/nbody/Cargo.toml --release -+ -+cp -r examples/spectral_norm target/spectral_norm -+cargo_test --manifest-path=target/spectral_norm/Cargo.toml --release -+ -+if [[ ${TARGET} != "i586-unknown-linux-gnu" ]]; then -+ cp -r examples/stencil target/stencil -+ cargo_test --manifest-path=target/stencil/Cargo.toml --release -+fi -+ -+cp -r examples/triangle_xform target/triangle_xform -+cargo_test --manifest-path=target/triangle_xform/Cargo.toml --release -diff --git a/third_party/rust/packed_simd/ci/runtest-android.rs b/third_party/rust/packed_simd/ci/runtest-android.rs -new file mode 100644 -index 000000000000..ed1cd80c834a ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/runtest-android.rs -@@ -0,0 +1,45 @@ -+use std::env; -+use std::process::Command; -+use std::path::{Path, PathBuf}; -+ -+fn main() { -+ let args = env::args_os() -+ .skip(1) -+ .filter(|arg| arg != "--quiet") -+ .collect::>(); -+ assert_eq!(args.len(), 1); -+ let test = PathBuf::from(&args[0]); -+ let dst = Path::new("/data/local/tmp").join(test.file_name().unwrap()); -+ -+ let status = Command::new("adb") -+ .arg("wait-for-device") -+ .status() -+ .expect("failed to run: adb wait-for-device"); -+ assert!(status.success()); -+ -+ let status = Command::new("adb") -+ .arg("push") -+ .arg(&test) -+ .arg(&dst) -+ .status() -+ .expect("failed to run: adb pushr"); -+ assert!(status.success()); -+ -+ let output = Command::new("adb") -+ .arg("shell") -+ .arg(&dst) -+ .output() -+ .expect("failed to run: adb shell"); -+ assert!(status.success()); -+ -+ println!("status: {}\nstdout ---\n{}\nstderr ---\n{}", -+ output.status, -+ String::from_utf8_lossy(&output.stdout), -+ String::from_utf8_lossy(&output.stderr)); -+ -+ let stdout = String::from_utf8_lossy(&output.stdout); -+ let mut lines = stdout.lines().filter(|l| l.starts_with("test result")); -+ if !lines.all(|l| l.contains("test result: ok") && l.contains("0 failed")) { -+ panic!("failed to find successful test run"); -+ } -+} -diff --git a/third_party/rust/packed_simd/ci/setup_benchmarks.sh b/third_party/rust/packed_simd/ci/setup_benchmarks.sh -new file mode 100644 -index 000000000000..ddc4765d5ceb ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/setup_benchmarks.sh -@@ -0,0 +1,10 @@ -+#!/usr/bin/env bash -+ -+set -ex -+ -+# Get latest ISPC binary for the target and put it in the path -+git clone https://github.com/gnzlbg/ispc-binaries -+cp ispc-binaries/ispc-${TARGET} ispc -+ -+# Rust-bindgen requires RUSTFMT -+rustup component add rustfmt-preview -diff --git a/third_party/rust/packed_simd/ci/test-runner-linux b/third_party/rust/packed_simd/ci/test-runner-linux -new file mode 100644 -index 000000000000..0654f63bfdb9 ---- /dev/null -+++ b/third_party/rust/packed_simd/ci/test-runner-linux -@@ -0,0 +1,24 @@ -+#!/bin/sh -+ -+set -e -+ -+arch=$1 -+prog=$2 -+ -+cd /qemu/init -+cp -f $2 prog -+find . | cpio --create --format='newc' --quiet | gzip > ../initrd.gz -+cd .. -+ -+timeout 30s qemu-system-$arch \ -+ -m 1024 \ -+ -nographic \ -+ -kernel kernel \ -+ -initrd initrd.gz \ -+ -append init=/prog > output || true -+ -+# remove kernel messages -+tr -d '\r' < output | egrep -v '^\[' -+ -+# if the output contains a failure, return error -+! grep FAILED output > /dev/null -diff --git a/third_party/rust/packed_simd/contributing.md b/third_party/rust/packed_simd/contributing.md -new file mode 100644 -index 000000000000..93fa92783740 ---- /dev/null -+++ b/third_party/rust/packed_simd/contributing.md -@@ -0,0 +1,67 @@ -+# Contributing to `packed_simd` -+ -+Welcome! If you are reading this document, it means you are interested in contributing -+to the `packed_simd` crate. -+ -+## Reporting issues -+ -+All issues with this crate are tracked using GitHub's [Issue Tracker]. -+ -+You can use issues to bring bugs to the attention of the maintainers, to discuss -+certain problems encountered with the crate, or to request new features (although -+feature requests should be limited to things mentioned in the [RFC]). -+ -+One thing to keep in mind is to always use the **latest** nightly toolchain when -+working on this crate. Due to the nature of this project, we use a lot of unstable -+features, meaning breakage happens often. -+ -+[Issue Tracker]: https://github.com/rust-lang-nursery/packed_simd/issues -+[RFC]: https://github.com/rust-lang/rfcs/pull/2366 -+ -+### LLVM issues -+ -+The Rust compiler relies on [LLVM](https://llvm.org/) for machine code generation, -+and quite a few LLVM bugs have been discovered during the development of this project. -+ -+If you encounter issues with incorrect/suboptimal codegen, which you do not encounter -+when using the [SIMD vendor intrinsics](https://doc.rust-lang.org/nightly/std/arch/), -+it is likely the issue is with LLVM, or this crate's interaction with it. -+ -+You should first open an issue **in this repo** to help us track the problem, and we -+will help determine what is the exact cause of the problem. -+If LLVM is indeed the cause, the issue will be reported upstream to the -+[LLVM bugtracker](https://bugs.llvm.org/). -+ -+## Submitting Pull Requests -+ -+New code is submitted to the crate using GitHub's [pull request] mechanism. -+You should first fork this repository, make your changes (preferrably in a new -+branch), then use GitHub's web UI to create a new PR. -+ -+[pull request]: https://help.github.com/articles/about-pull-requests/ -+ -+### Examples -+ -+The `examples` directory contains code showcasing SIMD code written with this crate, -+usually in comparison to scalar or ISPC code. If you have a project / idea which -+uses SIMD, we'd love to add it to the examples list. -+ -+Every example should include a small `README`, describing the example code's purpose. -+If your example could potentially work as a benchmark, then add a `benchmark.sh` -+script to allow running the example benchmark code in CI. See an existing example's -+[`benchmark.sh`](examples/aobench/benchmark.sh) for a sample. -+ -+Don't forget to update the crate's top-level `README` with a link to your example. -+ -+### Perf guide -+ -+The objective of the [performance guide][perf-guide] is to be a comprehensive -+resource detailing the process of optimizing Rust code with SIMD support. -+ -+If you believe a certain section could be reworded, or if you have any tips & tricks -+related to SIMD which you'd like to share, please open a PR. -+ -+[mdBook] is used to manage the formatting of the guide as a book. -+ -+[perf-guide]: https://rust-lang-nursery.github.io/packed_simd/perf-guide/ -+[mdBook]: https://github.com/rust-lang-nursery/mdBook -diff --git a/third_party/rust/packed_simd/perf-guide/.gitignore b/third_party/rust/packed_simd/perf-guide/.gitignore -new file mode 100644 -index 000000000000..5a0bf0317d75 ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/.gitignore -@@ -0,0 +1 @@ -+/book -diff --git a/third_party/rust/packed_simd/perf-guide/book.toml b/third_party/rust/packed_simd/perf-guide/book.toml -new file mode 100644 -index 000000000000..69ba3053ca25 ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/book.toml -@@ -0,0 +1,12 @@ -+[book] -+authors = ["Gonzalo Brito Gadeschi", "Gabriel Majeri"] -+multilingual = false -+src = "src" -+title = "Rust SIMD Performance Guide" -+description = "This book describes how to write performant SIMD code in Rust." -+ -+[build] -+create-missing = false -+ -+[output.html] -+additional-css = ["./src/ascii.css"] -diff --git a/third_party/rust/packed_simd/perf-guide/src/SUMMARY.md b/third_party/rust/packed_simd/perf-guide/src/SUMMARY.md -new file mode 100644 -index 000000000000..1e76898865c5 ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/src/SUMMARY.md -@@ -0,0 +1,21 @@ -+# Summary -+ -+[Introduction](./introduction.md) -+ -+- [Floating-point Math](./float-math/fp.md) -+ - [Short-vector Math Library](./float-math/svml.md) -+ - [Approximate functions](./float-math/approx.md) -+ - [Fused multiply-accumulate](./float-math/fma.md) -+ -+- [Target features](./target-feature/features.md) -+ - [Using `RUSTFLAGS`](./target-feature/rustflags.md) -+ - [Using the `target_feature` attribute](./target-feature/attribute.md) -+ - [Interaction with inlining](./target-feature/inlining.md) -+ - [Detecting features at runtime](./target-feature/runtime.md) -+ -+- [Bounds checking](./bound_checks.md) -+- [Vertical and horizontal operations](./vert-hor-ops.md) -+ -+- [Performance profiling](./prof/profiling.md) -+ - [Profiling on Linux](./prof/linux.md) -+ - [Using machine code analyzers](./prof/mca.md) -diff --git a/third_party/rust/packed_simd/perf-guide/src/ascii.css b/third_party/rust/packed_simd/perf-guide/src/ascii.css -new file mode 100644 -index 000000000000..4c02651195f9 ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/src/ascii.css -@@ -0,0 +1,4 @@ -+code { -+ /* "Source Code Pro" breaks ASCII art */ -+ font-family: Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace; -+} -diff --git a/third_party/rust/packed_simd/perf-guide/src/bound_checks.md b/third_party/rust/packed_simd/perf-guide/src/bound_checks.md -new file mode 100644 -index 000000000000..2eeedb5ac829 ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/src/bound_checks.md -@@ -0,0 +1,22 @@ -+# Bounds checking -+ -+Reading and writing packed vectors to/from slices is checked by default. -+Independently of the configuration options used, the safe functions: -+ -+* `Simd<[T; N]>::from_slice_aligned(& s[..])` -+* `Simd<[T; N]>::write_to_slice_aligned(&mut s[..])` -+ -+always check that: -+ -+* the slice is big enough to hold the vector -+* the slice is suitably aligned to perform an aligned load/store for a `Simd<[T; -+ N]>` (this alignment is often much larger than that of `T`). -+ -+There are `_unaligned` versions that use unaligned load and stores, as well as -+`unsafe` `_unchecked` that do not perform any checks iff `debug-assertions = -+false` / `debug = false`. That is, the `_unchecked` methods do still assert size -+and alignment in debug builds and could also do so in release builds depending -+on the configuration options. -+ -+These assertions do often significantly impact performance and you should be -+aware of them. -diff --git a/third_party/rust/packed_simd/perf-guide/src/float-math/approx.md b/third_party/rust/packed_simd/perf-guide/src/float-math/approx.md -new file mode 100644 -index 000000000000..2237c67ec4b3 ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/src/float-math/approx.md -@@ -0,0 +1,8 @@ -+# Approximate functions -+ -+ -diff --git a/third_party/rust/packed_simd/perf-guide/src/float-math/fma.md b/third_party/rust/packed_simd/perf-guide/src/float-math/fma.md -new file mode 100644 -index 000000000000..357748383d63 ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/src/float-math/fma.md -@@ -0,0 +1,6 @@ -+# Fused Multiply Add -+ -+ -diff --git a/third_party/rust/packed_simd/perf-guide/src/float-math/fp.md b/third_party/rust/packed_simd/perf-guide/src/float-math/fp.md -new file mode 100644 -index 000000000000..711fcc4fd598 ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/src/float-math/fp.md -@@ -0,0 +1,3 @@ -+# Floating-point math -+ -+This chapter contains information pertaining to working with floating-point numbers. -diff --git a/third_party/rust/packed_simd/perf-guide/src/float-math/svml.md b/third_party/rust/packed_simd/perf-guide/src/float-math/svml.md -new file mode 100644 -index 000000000000..266c2531cc04 ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/src/float-math/svml.md -@@ -0,0 +1,7 @@ -+# Short Vector Math Library -+ -+ -diff --git a/third_party/rust/packed_simd/perf-guide/src/introduction.md b/third_party/rust/packed_simd/perf-guide/src/introduction.md -new file mode 100644 -index 000000000000..7243e19c8a54 ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/src/introduction.md -@@ -0,0 +1,26 @@ -+# Introduction -+ -+## What is SIMD -+ -+ -+ -+## History of SIMD in Rust -+ -+ -+ -+## Discover packed_simd -+ -+ -+ -+Writing fast and portable SIMD algorithms using `packed_simd` is, unfortunately, -+not trivial. There are many pitfals that one should be aware of, and some idioms -+that help avoid those pitfalls. -+ -+This book attempts to document these best practices and provides practical examples -+on how to apply the tips to _your_ code. -diff --git a/third_party/rust/packed_simd/perf-guide/src/prof/linux.md b/third_party/rust/packed_simd/perf-guide/src/prof/linux.md -new file mode 100644 -index 000000000000..96c7d67bc476 ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/src/prof/linux.md -@@ -0,0 +1,107 @@ -+# Performance profiling on Linux -+ -+## Using `perf` -+ -+[perf](https://perf.wiki.kernel.org/) is the most powerful performance profiler -+for Linux, featuring support for various hardware Performance Monitoring Units, -+as well as integration with the kernel's performance events framework. -+ -+We will only look at how can the `perf` command can be used to profile SIMD code. -+Full system profiling is outside of the scope of this book. -+ -+### Recording -+ -+The first step is to record a program's execution during an average workload. -+It helps if you can isolate the parts of your program which have performance -+issues, and set up a benchmark which can be easily (re)run. -+ -+Build the benchmark binary in release mode, after having enabled debug info: -+ -+```sh -+$ cargo build --release -+Finished release [optimized + debuginfo] target(s) in 0.02s -+``` -+ -+Then use the `perf record` subcommand: -+ -+```sh -+$ perf record --call-graph=dwarf ./target/release/my-program -+[ perf record: Woken up 10 times to write data ] -+[ perf record: Captured and wrote 2,356 MB perf.data (292 samples) ] -+``` -+ -+Instead of using `--call-graph=dwarf`, which can become pretty slow, you can use -+`--call-graph=lbr` if you have a processor with support for Last Branch Record -+(i.e. Intel Haswell and newer). -+ -+`perf` will, by default, record the count of CPU cycles it takes to execute -+various parts of your program. You can use the `-e` command line option -+to enable other performance events, such as `cache-misses`. Use `perf list` -+to get a list of all hardware counters supported by your CPU. -+ -+### Viewing the report -+ -+The next step is getting a bird's eye view of the program's execution. -+`perf` provides a `ncurses`-based interface which will get you started. -+ -+Use `perf report` to open a visualization of your program's performance: -+ -+```sh -+perf report --hierarchy -M intel -+``` -+ -+`--hierarchy` will display a tree-like structure of where your program spent -+most of its time. `-M intel` enables disassembly output with Intel syntax, which -+is subjectively more readable than the default AT&T syntax. -+ -+Here is the output from profiling the `nbody` benchmark: -+ -+``` -+- 100,00% nbody -+ - 94,18% nbody -+ + 93,48% [.] nbody_lib::simd::advance -+ + 0,70% [.] nbody_lib::run -+ + 5,06% libc-2.28.so -+``` -+ -+If you move with the arrow keys to any node in the tree, you can the press `a` -+to have `perf` _annotate_ that node. This means it will: -+ -+- disassemble the function -+ -+- associate every instruction with the percentage of time which was spent executing it -+ -+- interleaves the disassembly with the source code, -+ assuming it found the debug symbols -+ (you can use `s` to toggle this behaviour) -+ -+`perf` will, by default, open the instruction which it identified as being the -+hottest spot in the function: -+ -+``` -+0,76 │ movapd xmm2,xmm0 -+0,38 │ movhlps xmm2,xmm0 -+ │ addpd xmm2,xmm0 -+ │ unpcklpd xmm1,xmm2 -+12,50 │ sqrtpd xmm0,xmm1 -+1,52 │ mulpd xmm0,xmm1 -+``` -+ -+In this case, `sqrtpd` will be highlighted in red, since that's the instruction -+which the CPU spends most of its time executing. -+ -+## Using Valgrind -+ -+Valgrind is a set of tools which initially helped C/C++ programmers find unsafe -+memory accesses in their code. Nowadays the project also has -+ -+- a heap profiler called `massif` -+ -+- a cache utilization profiler called `cachegrind` -+ -+- a call-graph performance profiler called `callgrind` -+ -+ -diff --git a/third_party/rust/packed_simd/perf-guide/src/prof/mca.md b/third_party/rust/packed_simd/perf-guide/src/prof/mca.md -new file mode 100644 -index 000000000000..65ddf1a4eb3a ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/src/prof/mca.md -@@ -0,0 +1,100 @@ -+# Machine code analysis tools -+ -+## The microarchitecture of modern CPUs -+ -+While you might have heard of Instruction Set Architectures, such as `x86` or -+`arm` or `mips`, the term _microarchitecture_ (also written here as _µ-arch_), -+refers to the internal details of an actual family of CPUs, such as Intel's -+_Haswell_ or AMD's _Jaguar_. -+ -+Replacing scalar code with SIMD code will improve performance on all CPUs -+supporting the required vector extensions. -+However, due to microarchitectural differences, the actual speed-up at -+runtime might vary. -+ -+**Example**: a simple example arises when optimizing for AMD K8 CPUs. -+The assembly generated for an empty function should look like this: -+ -+```asm -+nop -+ret -+``` -+ -+The `nop` is used to align the `ret` instruction for better performance. -+However, the compiler will actually generated the following code: -+ -+```asm -+repz ret -+``` -+ -+The `repz` instruction will repeat the following instruction until a certain -+condition. Of course, in this situation, the function will simply immediately -+return, and the `ret` instruction is still aligned. -+However, AMD K8's branch predictor performs better with the latter code. -+ -+For those looking to absolutely maximize performance for a certain target µ-arch, -+you will have to read some CPU manuals, or ask the compiler to do it for you -+with `-C target-cpu`. -+ -+### Summary of CPU internals -+ -+Modern processors are able to execute instructions out-of-order for better performance, -+by utilizing tricks such as [branch prediction], [instruction pipelining], -+or [superscalar execution]. -+ -+[branch prediction]: https://en.wikipedia.org/wiki/Branch_predictor -+[instruction pipelining]: https://en.wikipedia.org/wiki/Instruction_pipelining -+[superscalar execution]: https://en.wikipedia.org/wiki/Superscalar_processor -+ -+SIMD instructions are also subject to these optimizations, meaning it can get pretty -+difficult to determine where the slowdown happens. -+For example, if the profiler reports a store operation is slow, one of two things -+could be happening: -+ -+- the store is limited by the CPU's memory bandwidth, which is actually an ideal -+ scenario, all things considered; -+ -+- memory bandwidth is nowhere near its peak, but the value to be stored is at the -+ end of a long chain of operations, and this store is where the profiler -+ encountered the pipeline stall; -+ -+Since most profilers are simple tools which don't understand the subtleties of -+instruction scheduling, you -+ -+## Analyzing the machine code -+ -+Certain tools have knowledge of internal CPU microarchitecture, i.e. they know -+ -+- how many physical [register files] a CPU actually has -+ -+- what is the latency / throughtput of an instruction -+ -+- what [µ-ops] are generated for a set of instructions -+ -+and many other architectural details. -+ -+[register files]: https://en.wikipedia.org/wiki/Register_file -+[µ-ops]: https://en.wikipedia.org/wiki/Micro-operation -+ -+These tools are therefore able to provide accurate information as to why some -+instructions are inefficient, and where the bottleneck is. -+ -+The disadvantage is that the output of these tools requires advanced knowledge -+of the target architecture to understand, i.e. they **cannot** point out what -+the cause of the issue is explicitly. -+ -+## Intel's Architecture Code Analyzer (IACA) -+ -+[IACA] is a free tool offered by Intel for analyzing the performance of various -+computational kernels. -+ -+Being a proprietary, closed source tool, it _only_ supports Intel's µ-arches. -+ -+[IACA]: https://software.intel.com/en-us/articles/intel-architecture-code-analyzer -+ -+## llvm-mca -+ -+ -diff --git a/third_party/rust/packed_simd/perf-guide/src/prof/profiling.md b/third_party/rust/packed_simd/perf-guide/src/prof/profiling.md -new file mode 100644 -index 000000000000..02ba78d2f22f ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/src/prof/profiling.md -@@ -0,0 +1,14 @@ -+# Performance profiling -+ -+While the rest of the book provides practical advice on how to improve the performance -+of SIMD code, this chapter is dedicated to [**performance profiling**][profiling]. -+Profiling consists of recording a program's execution in order to identify program -+hotspots. -+ -+**Important**: most profilers require debug information in order to accurately -+link the program hotspots back to the corresponding source code lines. Rust will -+disable debug info generation by default for optimized builds, but you can change -+that [in your `Cargo.toml`][cargo-ref]. -+ -+[profiling]: https://en.wikipedia.org/wiki/Profiling_(computer_programming) -+[cargo-ref]: https://doc.rust-lang.org/cargo/reference/manifest.html#the-profile-sections -diff --git a/third_party/rust/packed_simd/perf-guide/src/target-feature/attribute.md b/third_party/rust/packed_simd/perf-guide/src/target-feature/attribute.md -new file mode 100644 -index 000000000000..ee670fea5bd8 ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/src/target-feature/attribute.md -@@ -0,0 +1,5 @@ -+# The `target_feature` attribute -+ -+ -diff --git a/third_party/rust/packed_simd/perf-guide/src/target-feature/features.md b/third_party/rust/packed_simd/perf-guide/src/target-feature/features.md -new file mode 100644 -index 000000000000..b93030ca6708 ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/src/target-feature/features.md -@@ -0,0 +1,13 @@ -+# Enabling target features -+ -+Not all processors of a certain architecture will have SIMD processing units, -+and using a SIMD instruction which is not supported will trigger undefined behavior. -+ -+To allow building safe, portable programs, the Rust compiler will **not**, by default, -+generate any sort of vector instructions, unless it can statically determine -+they are supported. For example, on AMD64, SSE2 support is architecturally guaranteed. -+The `x86_64-apple-darwin` target enables up to SSSE3. The get a defintive list of -+which features are enabled by default on various platforms, refer to the target -+specifications [in the compiler's source code][targets]. -+ -+[targets]: https://github.com/rust-lang/rust/tree/master/src/librustc_target/spec -diff --git a/third_party/rust/packed_simd/perf-guide/src/target-feature/inlining.md b/third_party/rust/packed_simd/perf-guide/src/target-feature/inlining.md -new file mode 100644 -index 000000000000..86705102a74b ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/src/target-feature/inlining.md -@@ -0,0 +1,5 @@ -+# Inlining -+ -+ -diff --git a/third_party/rust/packed_simd/perf-guide/src/target-feature/practice.md b/third_party/rust/packed_simd/perf-guide/src/target-feature/practice.md -new file mode 100644 -index 000000000000..5b55c61c268a ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/src/target-feature/practice.md -@@ -0,0 +1,31 @@ -+# Target features in practice -+ -+Using `RUSTFLAGS` will allow the crate being compiled, as well as all its -+transitive dependencies to use certain target features. -+ -+A tehnique used to avoid undefined behavior at runtime is to compile and -+ship multiple binaries, each compiled with a certain set of features. -+This might not be feasible in some cases, and can quickly get out of hand -+as more and more vector extensions are added to an architecture. -+ -+Rust can be more flexible: you can build a single binary/library which automatically -+picks the best supported vector instructions depending on the host machine. -+The trick consists of monomorphizing parts of the code during building, and then -+using run-time feature detection to select the right code path when running. -+ -+ -+ -+**NOTE** (x86 specific): because the AVX (256-bit) registers extend the existing -+SSE (128-bit) registers, mixing SSE and AVX instructions in a program can cause -+performance issues. -+ -+The solution is to compile all code, even the code written with 128-bit vectors, -+with the AVX target feature enabled. This will cause the compiler to prefix the -+generated instructions with the [VEX] prefix. -+ -+[VEX]: https://en.wikipedia.org/wiki/VEX_prefix -diff --git a/third_party/rust/packed_simd/perf-guide/src/target-feature/runtime.md b/third_party/rust/packed_simd/perf-guide/src/target-feature/runtime.md -new file mode 100644 -index 000000000000..47ddcc8660db ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/src/target-feature/runtime.md -@@ -0,0 +1,5 @@ -+# Detecting host features at runtime -+ -+ -diff --git a/third_party/rust/packed_simd/perf-guide/src/target-feature/rustflags.md b/third_party/rust/packed_simd/perf-guide/src/target-feature/rustflags.md -new file mode 100644 -index 000000000000..e2e806e085b6 ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/src/target-feature/rustflags.md -@@ -0,0 +1,77 @@ -+# Using RUSTFLAGS -+ -+One of the easiest ways to benefit from SIMD is to allow the compiler -+to generate code using certain vector instruction extensions. -+ -+The environment variable `RUSTFLAGS` can be used to pass options for code -+generation to the Rust compiler. These flags will affect **all** compiled crates. -+ -+There are two flags which can be used to enable specific vector extensions: -+ -+## target-feature -+ -+- Syntax: `-C target-feature=` -+ -+- Provides the compiler with a comma-separated set of instruction extensions -+ to enable. -+ -+ **Example**: Use `-C target-features=+sse3,+avx` to enable generating instructions -+ for [Streaming SIMD Extensions 3](https://en.wikipedia.org/wiki/SSE3) and -+ [Advanced Vector Extensions](https://en.wikipedia.org/wiki/Advanced_Vector_Extensions). -+ -+- To list target triples for all targets supported by Rust, use: -+ -+ ```sh -+ rustc --print target-list -+ ``` -+ -+- To list all support target features for a certain target triple, use: -+ -+ ```sh -+ rustc --target=${TRIPLE} --print target-features -+ ``` -+ -+- Note that all CPU features are independent, and will have to be enabled individually. -+ -+ **Example**: Setting `-C target-features=+avx2` will _not_ enable `fma`, even though -+ all CPUs which support AVX2 also support FMA. To enable both, one has to use -+ `-C target-features=+avx2,+fma` -+ -+- Some features also depend on other features, which need to be enabled for the -+ target instructions to be generated. -+ -+ **Example**: Unless `v7` is specified as the target CPU (see below), to enable -+ NEON on ARM it is necessary to use `-C target-feature=+v7,+neon`. -+ -+## target-cpu -+ -+- Syntax: `-C target-cpu=` -+ -+- Sets the identifier of a CPU family / model for which to build and optimize the code. -+ -+ **Example**: `RUSTFLAGS='-C target-cpu=cortex-a75'` -+ -+- To list all supported target CPUs for a certain target triple, use: -+ -+ ```sh -+ rustc --target=${TRIPLE} --print target-cpus -+ ``` -+ -+ **Example**: -+ -+ ```sh -+ rustc --target=i686-pc-windows-msvc --print target-cpus -+ ``` -+ -+- The compiler will translate this into a list of target features. Therefore, -+ individual feature checks (`#[cfg(target_feature = "...")]`) will still -+ work properly. -+ -+- It will cause the code generator to optimize the generated code for that -+ specific CPU model. -+ -+- Using `native` as the CPU model will cause Rust to generate and optimize code -+ for the CPU running the compiler. It is useful when building programs which you -+ plan to only use locally. This should never be used when the generated programs -+ are meant to be run on other computers, such as when packaging for distribution -+ or cross-compiling. -diff --git a/third_party/rust/packed_simd/perf-guide/src/vert-hor-ops.md b/third_party/rust/packed_simd/perf-guide/src/vert-hor-ops.md -new file mode 100644 -index 000000000000..d0dd1be12a19 ---- /dev/null -+++ b/third_party/rust/packed_simd/perf-guide/src/vert-hor-ops.md -@@ -0,0 +1,76 @@ -+# Vertical and horizontal operations -+ -+In SIMD terminology, each vector has a certain "width" (number of lanes). -+A vector processor is able to perform two kinds of operations on a vector: -+ -+- Vertical operations: -+ operate on two vectors of the same width, result has same width -+ -+**Example**: vertical addition of two `f32x4` vectors -+ -+ %0 == | 2 | -3.5 | 0 | 7 | -+ + + + + -+ %1 == | 4 | 1.5 | -1 | 0 | -+ = = = = -+ %0 + %1 == | 6 | -2 | -1 | 7 | -+ -+- Horizontal operations: -+ reduce the elements of two vectors in some way, -+ the result's elements combine information from the two original ones -+ -+**Example**: horizontal addition of two `u64x2` vectors -+ -+ %0 == | 1 | 3 | -+ └─+───┘ -+ └───────┐ -+ │ -+ %1 == | 4 | -1 | │ -+ └─+──┘ │ -+ └───┐ │ -+ │ │ -+ ┌─────│───┘ -+ ▼ ▼ -+ %0 + %1 == | 4 | 3 | -+ -+## Performance consideration of horizontal operations -+ -+The result of vertical operations, like vector negation: `-a`, for a given lane, -+does not depend on the result of the operation for the other lanes. The result -+of horizontal operations, like the vector `sum` reduction: `a.sum()`, depends on -+the value of all vector lanes. -+ -+In virtually all architectures vertical operations are fast, while horizontal -+operations are, by comparison, very slow. -+ -+Consider the following two functions for computing the sum of all `f32` values -+in a slice: -+ -+```rust -+fn fast_sum(x: &[f32]) -> f32 { -+ assert!(x.len() % 4 == 0); -+ let mut sum = f32x4::splat(0.); // [0., 0., 0., 0.] -+ for i in (0..x.len()).step_by(4) { -+ sum += f32x4::from_slice_unaligned(&x[i..]); -+ } -+ sum.sum() -+} -+ -+fn slow_sum(x: &[f32]) -> f32 { -+ assert!(x.len() % 4 == 0); -+ let mut sum: f32 = 0.; -+ for i in (0..x.len()).step_by(4) { -+ sum += f32x4::from_slice_unaligned(&x[i..]).sum(); -+ } -+ sum -+} -+``` -+ -+The inner loop over the slice is where the bulk of the work actually happens. -+There, the `fast_sum` function perform vertical operations into a vector, doing -+a single horizontal reduction at the end, while the `slow_sum` function performs -+horizontal vector operations inside of the loop. -+ -+On all widely-used architectures, `fast_sum` is a large constant factor faster -+than `slow_sum`. You can run the [slice_sum]() example and see for yourself. On -+the particular machine tested there the algorithm using the horizontal vector -+addition is 2.7x slower than the one using vertical vector operations! -diff --git a/third_party/rust/packed_simd/readme.md b/third_party/rust/packed_simd/readme.md -new file mode 100644 -index 000000000000..3b27a2bba0d6 ---- /dev/null -+++ b/third_party/rust/packed_simd/readme.md -@@ -0,0 +1,182 @@ -+# `Simd<[T; N]>` -+ -+## Implementation of [Rust RFC #2366: `std::simd`][rfc2366] -+ -+[![Travis-CI Status]][travis] [![Appveyor Status]][appveyor] [![Latest Version]][crates.io] [![docs]][master_docs] -+ -+> This aims to be a 100% conforming implementation of Rust RFC 2366 for stabilization. -+ -+**WARNING**: this crate only supports the most recent nightly Rust toolchain. -+ -+## Documentation -+ -+* [API docs (`master` branch)][master_docs] -+* [Performance guide][perf_guide] -+* [API docs (`docs.rs`)][docs.rs]: **CURRENTLY DOWN** due to -+ https://github.com/rust-lang-nursery/packed_simd/issues/110 -+* [RFC2366 `std::simd`][rfc2366]: - contains motivation, design rationale, -+ discussion, etc. -+ -+## Examples -+ -+Most of the examples come with both a scalar and a vectorized implementation. -+ -+* [`aobench`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/aobench) -+* [`fannkuch_redux`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/fannkuch_redux) -+* [`matrix inverse`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/matrix_inverse) -+* [`mandelbrot`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/mandelbrot) -+* [`n-body`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/nbody) -+* [`options_pricing`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/options_pricing) -+* [`spectral_norm`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/spectral_norm) -+* [`triangle transform`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/triangle_xform) -+* [`stencil`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/stencil) -+* [`vector dot product`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/dot_product) -+ -+## Cargo features -+ -+* `into_bits` (default: disabled): enables `FromBits`/`IntoBits` trait -+ implementations for the vector types. These allow reinterpreting the bits of a -+ vector type as those of another vector type safely by just using the -+ `.into_bits()` method. -+ -+* `core_arch` (default: disabled): enable this feature to recompile `core::arch` -+ for the target-features enabled. `packed_simd` includes optimizations for some -+ target feature combinations that are enabled by this feature. Note, however, -+ that this is an unstable dependency, that rustc might break at any time. -+ -+* `sleef-sys` (default: disabled - `x86_64` only): internally uses the [SLEEF] -+ short-vector math library when profitable via the [`sleef-sys`][sleef_sys] -+ crate. [SLEEF] is licensed under the [Boost Software License -+ v1.0][boost_license], an extremely permissive license, and can be statically -+ linked without issues. -+ -+## Performance -+ -+The following [ISPC] examples are also part of `packed_simd`'s -+[`examples/`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/) -+directory, where `packed_simd`+[`rayon`][rayon] are used to emulate [ISPC]'s -+Single-Program-Multiple-Data (SPMD) programming model. The performance results -+on different hardware is shown in the `readme.md` of each example. The following -+table summarizes the performance ranges, where `+` means speed-up and `-` -+slowdown: -+ -+* `aobench`: `[-1.02x, +1.53x]`, -+* `stencil`: `[+1.06x, +1.72x]`, -+* `mandelbrot`: `[-1.74x, +1.2x]`, -+* `options_pricing`: -+ * `black_scholes`: `+1.0x` -+ * `binomial_put`: `+1.4x` -+ -+ While SPMD is not the intended use case for `packed_simd`, it is possible to -+ combine the library with [`rayon`][rayon] to poorly emulate [ISPC]'s SPMD programming -+ model in Rust. Writing performant code is not as straightforward as with -+ [ISPC], but with some care (e.g. see the [Performance Guide][perf_guide]) one -+ can easily match and often out-perform [ISPC]'s "default performance". -+ -+## Platform support -+ -+The following table describes the supported platforms: `build` shows whether the -+library compiles without issues for a given target, while `run` shows whether -+the full testsuite passes on the target. -+ -+| Linux targets: | build | run | -+|-----------------------------------|-----------|---------| -+| `i586-unknown-linux-gnu` | ✓ | ✓ | -+| `i686-unknown-linux-gnu` | ✓ | ✓ | -+| `x86_64-unknown-linux-gnu` | ✓ | ✓ | -+| `arm-unknown-linux-gnueabi` | ✗ | ✗ | -+| `arm-unknown-linux-gnueabihf` | ✓ | ✓ | -+| `armv7-unknown-linux-gnueabi` | ✓ | ✓ | -+| `aarch64-unknown-linux-gnu` | ✓ | ✓ | -+| `mips-unknown-linux-gnu` | ✓ | ✓ | -+| `mipsel-unknown-linux-musl` | ✓ | ✓ | -+| `mips64-unknown-linux-gnuabi64` | ✓ | ✓ | -+| `mips64el-unknown-linux-gnuabi64` | ✓ | ✓ | -+| `powerpc-unknown-linux-gnu` | ✗ | ✗ | -+| `powerpc64-unknown-linux-gnu` | ✗ | ✗ | -+| `powerpc64le-unknown-linux-gnu` | ✗ | ✗ | -+| `s390x-unknown-linux-gnu` | ✓ | ✓* | -+| `sparc64-unknown-linux-gnu` | ✓ | ✓* | -+| `thumbv7neon-unknown-linux-gnueabihf` | ✓ | ✓ | -+| **MacOSX targets:** | **build** | **run** | -+| `x86_64-apple-darwin` | ✓ | ✓ | -+| `i686-apple-darwin` | ✓ | ✓ | -+| **Windows targets:** | **build** | **run** | -+| `x86_64-pc-windows-msvc` | ✓ | ✓ | -+| `i686-pc-windows-msvc` | ✓ | ✓ | -+| `x86_64-pc-windows-gnu` | ✗ | ✗ | -+| `i686-pc-windows-gnu` | ✗ | ✗ | -+| **WebAssembly targets:** | **build** | **run** | -+| `wasm32-unknown-unknown` | ✓ | ✓ | -+| **Android targets:** | **build** | **run** | -+| `x86_64-linux-android` | ✓ | ✓ | -+| `arm-linux-androideabi` | ✓ | ✓ | -+| `aarch64-linux-android` | ✓ | ✗ | -+| `thumbv7neon-linux-androideabi` | ✓ | ✓ | -+| **iOS targets:** | **build** | **run** | -+| `i386-apple-ios` | ✓ | ✗ | -+| `x86_64-apple-ios` | ✓ | ✗ | -+| `armv7-apple-ios` | ✓ | ✗** | -+| `aarch64-apple-ios` | ✓ | ✗** | -+| **xBSD targets:** | **build** | **run** | -+| `i686-unknown-freebsd` | ✗ | ✗** | -+| `x86_64-unknown-freebsd` | ✗ | ✗** | -+| `x86_64-unknown-netbsd` | ✗ | ✗** | -+| **Solaris targets:** | **build** | **run** | -+| `x86_64-sun-solaris` | ✗ | ✗** | -+ -+[*] most of the test suite passes correctly on these platform but -+there are correctness bugs open in the issue tracker. -+ -+[**] it is currently not easily possible to run these platforms on CI. -+ -+## Machine code verification -+ -+The -+[`verify/`](https://github.com/rust-lang-nursery/packed_simd/tree/master/verify) -+crate tests disassembles the portable packed vector APIs at run-time and -+compares the generated machine code against the desired one to make sure that -+this crate remains efficient. -+ -+## License -+ -+This project is licensed under either of -+ -+* [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) -+ ([LICENSE-APACHE](LICENSE-APACHE)) -+ -+* [MIT License](http://opensource.org/licenses/MIT) -+ ([LICENSE-MIT](LICENSE-MIT)) -+ -+at your option. -+ -+## Contributing -+ -+We welcome all people who want to contribute. -+Please see the [contributing instructions] for more information. -+ -+Contributions in any form (issues, pull requests, etc.) to this project -+must adhere to Rust's [Code of Conduct]. -+ -+Unless you explicitly state otherwise, any contribution intentionally submitted -+for inclusion in `packed_simd` by you, as defined in the Apache-2.0 license, shall be -+dual licensed as above, without any additional terms or conditions. -+ -+[travis]: https://travis-ci.org/rust-lang-nursery/packed_simd -+[Travis-CI Status]: https://travis-ci.org/rust-lang-nursery/packed_simd.svg?branch=master -+[appveyor]: https://ci.appveyor.com/project/gnzlbg/packed-simd -+[Appveyor Status]: https://ci.appveyor.com/api/projects/status/hd7v9dvr442hgdix?svg=true -+[Latest Version]: https://img.shields.io/crates/v/packed_simd.svg -+[crates.io]: https://crates.io/crates/packed_simd -+[docs]: https://docs.rs/packed_simd/badge.svg -+[docs.rs]: https://docs.rs/packed_simd/ -+[master_docs]: https://rust-lang-nursery.github.io/packed_simd/packed_simd/ -+[perf_guide]: https://rust-lang-nursery.github.io/packed_simd/perf-guide/ -+[rfc2366]: https://github.com/rust-lang/rfcs/pull/2366 -+[ISPC]: https://ispc.github.io/ -+[rayon]: https://crates.io/crates/rayon -+[boost_license]: https://www.boost.org/LICENSE_1_0.txt -+[SLEEF]: https://sleef.org/ -+[sleef_sys]: https://crates.io/crates/sleef-sys -+[contributing instructions]: contributing.md -+[Code of Conduct]: https://www.rust-lang.org/en-US/conduct.html -diff --git a/third_party/rust/packed_simd/rustfmt.toml b/third_party/rust/packed_simd/rustfmt.toml -new file mode 100644 -index 000000000000..5b400a4ce440 ---- /dev/null -+++ b/third_party/rust/packed_simd/rustfmt.toml -@@ -0,0 +1,7 @@ -+max_width = 79 -+use_small_heuristics = "Max" -+wrap_comments = true -+comment_width = 79 -+fn_args_density = "Compressed" -+edition = "2018" -+error_on_line_overflow = true -\ No newline at end of file -diff --git a/third_party/rust/packed_simd/src/api.rs b/third_party/rust/packed_simd/src/api.rs -new file mode 100644 -index 000000000000..9959a052ae96 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api.rs -@@ -0,0 +1,301 @@ -+//! Implements the Simd<[T; N]> APIs -+ -+crate mod cast; -+#[macro_use] -+mod cmp; -+#[macro_use] -+mod default; -+#[macro_use] -+mod fmt; -+#[macro_use] -+mod from; -+#[macro_use] -+mod hash; -+#[macro_use] -+mod math; -+#[macro_use] -+mod minimal; -+#[macro_use] -+mod ops; -+#[macro_use] -+mod ptr; -+#[macro_use] -+mod reductions; -+#[macro_use] -+mod select; -+#[macro_use] -+mod shuffle; -+#[macro_use] -+mod shuffle1_dyn; -+#[macro_use] -+mod slice; -+#[macro_use] -+mod swap_bytes; -+#[macro_use] -+mod bit_manip; -+ -+#[cfg(feature = "into_bits")] -+crate mod into_bits; -+ -+macro_rules! impl_i { -+ ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident -+ | $ielem_ty:ident | $test_tt:tt | $($elem_ids:ident),* -+ | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => { -+ impl_minimal_iuf!([$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt -+ | $($elem_ids),* | $(#[$doc])*); -+ impl_ops_vector_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_ops_scalar_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_ops_vector_bitwise!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (!(0 as $elem_ty), 0) -+ ); -+ impl_ops_scalar_bitwise!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (!(0 as $elem_ty), 0) -+ ); -+ impl_ops_vector_shifts!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_ops_scalar_shifts!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_ops_vector_rotates!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_ops_vector_neg!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_ops_vector_int_min_max!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt -+ ); -+ impl_reduction_integer_arithmetic!( -+ [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt -+ ); -+ impl_reduction_min_max!( -+ [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt -+ ); -+ impl_reduction_bitwise!( -+ [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt -+ | (|x|{ x as $elem_ty }) | (!(0 as $elem_ty), 0) -+ ); -+ impl_fmt_debug!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_fmt_lower_hex!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_fmt_upper_hex!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_fmt_octal!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_fmt_binary!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_from_array!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (1, 1)); -+ impl_from_vectors!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | $($from_vec_ty),* -+ ); -+ impl_default!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_hash!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_slice_from_slice!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_slice_write_to_slice!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_swap_bytes!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_bit_manip!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_cmp_partial_eq!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1) -+ ); -+ impl_cmp_eq!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1)); -+ impl_cmp_vertical!( -+ [$elem_ty; $elem_n]: $tuple_id, $mask_ty, false, (1, 0) | $test_tt -+ ); -+ impl_cmp_partial_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_cmp_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1)); -+ -+ test_select!($elem_ty, $mask_ty, $tuple_id, (1, 2) | $test_tt); -+ test_cmp_partial_ord_int!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ test_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ } -+} -+ -+macro_rules! impl_u { -+ ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident -+ | $ielem_ty:ident | $test_tt:tt | $($elem_ids:ident),* -+ | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => { -+ impl_minimal_iuf!([$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt -+ | $($elem_ids),* | $(#[$doc])*); -+ impl_ops_vector_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_ops_scalar_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_ops_vector_bitwise!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (!(0 as $elem_ty), 0) -+ ); -+ impl_ops_scalar_bitwise!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (!(0 as $elem_ty), 0) -+ ); -+ impl_ops_vector_shifts!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_ops_scalar_shifts!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_ops_vector_rotates!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_ops_vector_int_min_max!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt -+ ); -+ impl_reduction_integer_arithmetic!( -+ [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt -+ ); -+ impl_reduction_min_max!( -+ [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt -+ ); -+ impl_reduction_bitwise!( -+ [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt -+ | (|x|{ x as $elem_ty }) | (!(0 as $elem_ty), 0) -+ ); -+ impl_fmt_debug!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_fmt_lower_hex!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_fmt_upper_hex!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_fmt_octal!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_fmt_binary!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_from_array!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (1, 1)); -+ impl_from_vectors!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | $($from_vec_ty),* -+ ); -+ impl_default!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_hash!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_slice_from_slice!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_slice_write_to_slice!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_swap_bytes!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_bit_manip!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_cmp_partial_eq!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (1, 0) -+ ); -+ impl_cmp_eq!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1)); -+ impl_cmp_vertical!( -+ [$elem_ty; $elem_n]: $tuple_id, $mask_ty, false, (1, 0) | $test_tt -+ ); -+ impl_cmp_partial_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_cmp_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1)); -+ -+ test_select!($elem_ty, $mask_ty, $tuple_id, (1, 2) | $test_tt); -+ test_cmp_partial_ord_int!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ test_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ } -+} -+ -+macro_rules! impl_f { -+ ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident -+ | $ielem_ty:ident | $test_tt:tt | $($elem_ids:ident),* -+ | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => { -+ impl_minimal_iuf!([$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt -+ | $($elem_ids),* | $(#[$doc])*); -+ impl_ops_vector_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_ops_scalar_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_ops_vector_neg!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_ops_vector_float_min_max!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt -+ ); -+ impl_reduction_float_arithmetic!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_reduction_min_max!( -+ [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt -+ ); -+ impl_fmt_debug!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_from_array!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (1., 1.)); -+ impl_from_vectors!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | $($from_vec_ty),* -+ ); -+ impl_default!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_cmp_partial_eq!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (1., 0.) -+ ); -+ impl_slice_from_slice!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_slice_write_to_slice!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ -+ impl_float_consts!([$elem_ty; $elem_n]: $tuple_id); -+ impl_float_category!([$elem_ty; $elem_n]: $tuple_id, $mask_ty); -+ -+ // floating-point math -+ impl_math_float_abs!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_math_float_cos!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_math_float_exp!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_math_float_ln!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_math_float_mul_add!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_math_float_mul_adde!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_math_float_powf!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_math_float_recpre!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_math_float_rsqrte!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_math_float_sin!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_math_float_sqrt!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_math_float_sqrte!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_cmp_vertical!( -+ [$elem_ty; $elem_n]: $tuple_id, $mask_ty, false, (1., 0.) -+ | $test_tt -+ ); -+ -+ test_select!($elem_ty, $mask_ty, $tuple_id, (1., 2.) | $test_tt); -+ test_reduction_float_min_max!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt -+ ); -+ test_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ } -+} -+ -+macro_rules! impl_m { -+ ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident | $ielem_ty:ident -+ | $test_tt:tt | $($elem_ids:ident),* | From: $($from_vec_ty:ident),* -+ | $(#[$doc:meta])*) => { -+ impl_minimal_mask!( -+ [$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt -+ | $($elem_ids),* | $(#[$doc])* -+ ); -+ impl_ops_vector_mask_bitwise!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (true, false) -+ ); -+ impl_ops_scalar_mask_bitwise!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (true, false) -+ ); -+ impl_reduction_bitwise!( -+ [bool; $elem_n]: $tuple_id | $ielem_ty | $test_tt -+ | (|x|{ x != 0 }) | (true, false) -+ ); -+ impl_reduction_mask!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_fmt_debug!([bool; $elem_n]: $tuple_id | $test_tt); -+ impl_from_array!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt -+ | (crate::$elem_ty::new(true), true) -+ ); -+ impl_from_vectors!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | $($from_vec_ty),* -+ ); -+ impl_default!([bool; $elem_n]: $tuple_id | $test_tt); -+ impl_cmp_partial_eq!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (true, false) -+ ); -+ impl_cmp_eq!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (true, false) -+ ); -+ impl_cmp_vertical!( -+ [$elem_ty; $elem_n]: $tuple_id, $tuple_id, true, (true, false) -+ | $test_tt -+ ); -+ impl_select!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_cmp_partial_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_cmp_ord!( -+ [$elem_ty; $elem_n]: $tuple_id | $test_tt | (false, true) -+ ); -+ impl_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ -+ test_cmp_partial_ord_mask!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ test_shuffle1_dyn_mask!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ } -+} -+ -+macro_rules! impl_const_p { -+ ([$elem_ty:ty; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident, -+ $usize_ty:ident, $isize_ty:ident -+ | $test_tt:tt | $($elem_ids:ident),* -+ | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => { -+ impl_minimal_p!( -+ [$elem_ty; $elem_n]: $tuple_id, $mask_ty, $usize_ty, $isize_ty -+ | ref_ | $test_tt | $($elem_ids),* -+ | (1 as $elem_ty, 0 as $elem_ty) | $(#[$doc])* -+ ); -+ impl_ptr_read!([$elem_ty; $elem_n]: $tuple_id, $mask_ty | $test_tt); -+ } -+} -+ -+macro_rules! impl_mut_p { -+ ([$elem_ty:ty; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident, -+ $usize_ty:ident, $isize_ty:ident -+ | $test_tt:tt | $($elem_ids:ident),* -+ | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => { -+ impl_minimal_p!( -+ [$elem_ty; $elem_n]: $tuple_id, $mask_ty, $usize_ty, $isize_ty -+ | ref_mut_ | $test_tt | $($elem_ids),* -+ | (1 as $elem_ty, 0 as $elem_ty) | $(#[$doc])* -+ ); -+ impl_ptr_read!([$elem_ty; $elem_n]: $tuple_id, $mask_ty | $test_tt); -+ impl_ptr_write!([$elem_ty; $elem_n]: $tuple_id, $mask_ty | $test_tt); -+ } -+} -diff --git a/third_party/rust/packed_simd/src/api/bit_manip.rs b/third_party/rust/packed_simd/src/api/bit_manip.rs -new file mode 100644 -index 000000000000..3d3c4eb8850a ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/bit_manip.rs -@@ -0,0 +1,128 @@ -+//! Bit manipulations. -+ -+macro_rules! impl_bit_manip { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Returns the number of ones in the binary representation of -+ /// the lanes of `self`. -+ #[inline] -+ pub fn count_ones(self) -> Self { -+ super::codegen::bit_manip::BitManip::ctpop(self) -+ } -+ -+ /// Returns the number of zeros in the binary representation of -+ /// the lanes of `self`. -+ #[inline] -+ pub fn count_zeros(self) -> Self { -+ super::codegen::bit_manip::BitManip::ctpop(!self) -+ } -+ -+ /// Returns the number of leading zeros in the binary -+ /// representation of the lanes of `self`. -+ #[inline] -+ pub fn leading_zeros(self) -> Self { -+ super::codegen::bit_manip::BitManip::ctlz(self) -+ } -+ -+ /// Returns the number of trailing zeros in the binary -+ /// representation of the lanes of `self`. -+ #[inline] -+ pub fn trailing_zeros(self) -> Self { -+ super::codegen::bit_manip::BitManip::cttz(self) -+ } -+ } -+ -+ test_if! { -+ $test_tt: -+ paste::item_with_macros! { -+ #[allow(overflowing_literals)] -+ pub mod [<$id _bit_manip>] { -+ use super::*; -+ -+ const LANE_WIDTH: usize = mem::size_of::<$elem_ty>() * 8; -+ -+ macro_rules! test_func { -+ ($x:expr, $func:ident) => {{ -+ let mut actual = $x; -+ for i in 0..$id::lanes() { -+ actual = actual.replace( -+ i, -+ $x.extract(i).$func() as $elem_ty -+ ); -+ } -+ let expected = $x.$func(); -+ assert_eq!(actual, expected); -+ }}; -+ } -+ -+ const BYTES: [u8; 64] = [ -+ 0, 1, 2, 3, 4, 5, 6, 7, -+ 8, 9, 10, 11, 12, 13, 14, 15, -+ 16, 17, 18, 19, 20, 21, 22, 23, -+ 24, 25, 26, 27, 28, 29, 30, 31, -+ 32, 33, 34, 35, 36, 37, 38, 39, -+ 40, 41, 42, 43, 44, 45, 46, 47, -+ 48, 49, 50, 51, 52, 53, 54, 55, -+ 56, 57, 58, 59, 60, 61, 62, 63, -+ ]; -+ -+ fn load_bytes() -> $id { -+ let elems: &mut [$elem_ty] = unsafe { -+ slice::from_raw_parts_mut( -+ BYTES.as_mut_ptr() as *mut $elem_ty, -+ $id::lanes(), -+ ) -+ }; -+ $id::from_slice_unaligned(elems) -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn count_ones() { -+ test_func!($id::splat(0), count_ones); -+ test_func!($id::splat(!0), count_ones); -+ test_func!(load_bytes(), count_ones); -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn count_zeros() { -+ test_func!($id::splat(0), count_zeros); -+ test_func!($id::splat(!0), count_zeros); -+ test_func!(load_bytes(), count_zeros); -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn leading_zeros() { -+ test_func!($id::splat(0), leading_zeros); -+ test_func!($id::splat(1), leading_zeros); -+ // some implementations use `pshufb` which has unique -+ // behavior when the 8th bit is set. -+ test_func!($id::splat(0b1000_0010), leading_zeros); -+ test_func!($id::splat(!0), leading_zeros); -+ test_func!( -+ $id::splat(1 << (LANE_WIDTH - 1)), -+ leading_zeros -+ ); -+ test_func!(load_bytes(), leading_zeros); -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn trailing_zeros() { -+ test_func!($id::splat(0), trailing_zeros); -+ test_func!($id::splat(1), trailing_zeros); -+ test_func!($id::splat(0b1000_0010), trailing_zeros); -+ test_func!($id::splat(!0), trailing_zeros); -+ test_func!( -+ $id::splat(1 << (LANE_WIDTH - 1)), -+ trailing_zeros -+ ); -+ test_func!(load_bytes(), trailing_zeros); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/cast.rs b/third_party/rust/packed_simd/src/api/cast.rs -new file mode 100644 -index 000000000000..f1c32ca1a38b ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/cast.rs -@@ -0,0 +1,108 @@ -+//! Implementation of `FromCast` and `IntoCast`. -+#![allow(clippy::module_name_repetitions)] -+ -+/// Numeric cast from `T` to `Self`. -+/// -+/// > Note: This is a temporary workaround until the conversion traits -+/// specified > in [RFC2484] are implemented. -+/// -+/// Numeric cast between vectors with the same number of lanes, such that: -+/// -+/// * casting integer vectors whose lane types have the same size (e.g. `i32xN` -+/// -> `u32xN`) is a **no-op**, -+/// -+/// * casting from a larger integer to a smaller integer (e.g. `u32xN` -> -+/// `u8xN`) will **truncate**, -+/// -+/// * casting from a smaller integer to a larger integer (e.g. `u8xN` -> -+/// `u32xN`) will: -+/// * **zero-extend** if the source is unsigned, or -+/// * **sign-extend** if the source is signed, -+/// -+/// * casting from a float to an integer will **round the float towards zero**, -+/// -+/// * casting from an integer to float will produce the floating point -+/// representation of the integer, **rounding to nearest, ties to even**, -+/// -+/// * casting from an `f32` to an `f64` is perfect and lossless, -+/// -+/// * casting from an `f64` to an `f32` **rounds to nearest, ties to even**. -+/// -+/// [RFC2484]: https://github.com/rust-lang/rfcs/pull/2484 -+pub trait FromCast: crate::marker::Sized { -+ /// Numeric cast from `T` to `Self`. -+ fn from_cast(_: T) -> Self; -+} -+ -+/// Numeric cast from `Self` to `T`. -+/// -+/// > Note: This is a temporary workaround until the conversion traits -+/// specified > in [RFC2484] are implemented. -+/// -+/// Numeric cast between vectors with the same number of lanes, such that: -+/// -+/// * casting integer vectors whose lane types have the same size (e.g. `i32xN` -+/// -> `u32xN`) is a **no-op**, -+/// -+/// * casting from a larger integer to a smaller integer (e.g. `u32xN` -> -+/// `u8xN`) will **truncate**, -+/// -+/// * casting from a smaller integer to a larger integer (e.g. `u8xN` -> -+/// `u32xN`) will: -+/// * **zero-extend** if the source is unsigned, or -+/// * **sign-extend** if the source is signed, -+/// -+/// * casting from a float to an integer will **round the float towards zero**, -+/// -+/// * casting from an integer to float will produce the floating point -+/// representation of the integer, **rounding to nearest, ties to even**, -+/// -+/// * casting from an `f32` to an `f64` is perfect and lossless, -+/// -+/// * casting from an `f64` to an `f32` **rounds to nearest, ties to even**. -+/// -+/// [RFC2484]: https://github.com/rust-lang/rfcs/pull/2484 -+pub trait Cast: crate::marker::Sized { -+ /// Numeric cast from `self` to `T`. -+ fn cast(self) -> T; -+} -+ -+/// `FromCast` implies `Cast`. -+impl Cast for T -+where -+ U: FromCast, -+{ -+ #[inline] -+ fn cast(self) -> U { -+ U::from_cast(self) -+ } -+} -+ -+/// `FromCast` and `Cast` are reflexive -+impl FromCast for T { -+ #[inline] -+ fn from_cast(t: Self) -> Self { -+ t -+ } -+} -+ -+#[macro_use] -+mod macros; -+ -+mod v16; -+pub use self::v16::*; -+ -+mod v32; -+pub use self::v32::*; -+ -+mod v64; -+pub use self::v64::*; -+ -+mod v128; -+pub use self::v128::*; -+ -+mod v256; -+pub use self::v256::*; -+ -+mod v512; -+pub use self::v512::*; -diff --git a/third_party/rust/packed_simd/src/api/cast/macros.rs b/third_party/rust/packed_simd/src/api/cast/macros.rs -new file mode 100644 -index 000000000000..3bb29f0b80b7 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/cast/macros.rs -@@ -0,0 +1,82 @@ -+//! Macros implementing `FromCast` -+ -+macro_rules! impl_from_cast_ { -+ ($id:ident[$test_tt:tt]: $from_ty:ident) => { -+ impl crate::api::cast::FromCast<$from_ty> for $id { -+ #[inline] -+ fn from_cast(x: $from_ty) -> Self { -+ use crate::llvm::simd_cast; -+ debug_assert_eq!($from_ty::lanes(), $id::lanes()); -+ Simd(unsafe { simd_cast(x.0) }) -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _from_cast_ $from_ty>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn test() { -+ assert_eq!($id::lanes(), $from_ty::lanes()); -+ } -+ } -+ } -+ } -+ }; -+} -+ -+macro_rules! impl_from_cast { -+ ($id:ident[$test_tt:tt]: $($from_ty:ident),*) => { -+ $( -+ impl_from_cast_!($id[$test_tt]: $from_ty); -+ )* -+ } -+} -+ -+macro_rules! impl_from_cast_mask_ { -+ ($id:ident[$test_tt:tt]: $from_ty:ident) => { -+ impl crate::api::cast::FromCast<$from_ty> for $id { -+ #[inline] -+ fn from_cast(x: $from_ty) -> Self { -+ debug_assert_eq!($from_ty::lanes(), $id::lanes()); -+ x.ne($from_ty::default()) -+ .select($id::splat(true), $id::splat(false)) -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _from_cast_ $from_ty>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn test() { -+ assert_eq!($id::lanes(), $from_ty::lanes()); -+ -+ let x = $from_ty::default(); -+ let m: $id = x.cast(); -+ assert!(m.none()); -+ } -+ } -+ } -+ } -+ }; -+} -+ -+macro_rules! impl_from_cast_mask { -+ ($id:ident[$test_tt:tt]: $($from_ty:ident),*) => { -+ $( -+ impl_from_cast_mask_!($id[$test_tt]: $from_ty); -+ )* -+ } -+} -+ -+#[allow(unused)] -+macro_rules! impl_into_cast { -+ ($id:ident[$test_tt:tt]: $($from_ty:ident),*) => { -+ $( -+ impl_from_cast_!($from_ty[$test_tt]: $id); -+ )* -+ } -+} -diff --git a/third_party/rust/packed_simd/src/api/cast/v128.rs b/third_party/rust/packed_simd/src/api/cast/v128.rs -new file mode 100644 -index 000000000000..78c07f3a5597 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/cast/v128.rs -@@ -0,0 +1,79 @@ -+//! `FromCast` and `IntoCast` implementations for portable 128-bit wide vectors -+#![rustfmt::skip] -+ -+use crate::*; -+ -+impl_from_cast!( -+ i8x16[test_v128]: u8x16, m8x16, i16x16, u16x16, m16x16, i32x16, u32x16, f32x16, m32x16 -+); -+impl_from_cast!( -+ u8x16[test_v128]: i8x16, m8x16, i16x16, u16x16, m16x16, i32x16, u32x16, f32x16, m32x16 -+); -+impl_from_cast_mask!( -+ m8x16[test_v128]: i8x16, u8x16, i16x16, u16x16, m16x16, i32x16, u32x16, f32x16, m32x16 -+); -+ -+impl_from_cast!( -+ i16x8[test_v128]: i8x8, u8x8, m8x8, u16x8, m16x8, i32x8, u32x8, f32x8, m32x8, -+ i64x8, u64x8, f64x8, m64x8, isizex8, usizex8, msizex8 -+); -+impl_from_cast!( -+ u16x8[test_v128]: i8x8, u8x8, m8x8, i16x8, m16x8, i32x8, u32x8, f32x8, m32x8, -+ i64x8, u64x8, f64x8, m64x8, isizex8, usizex8, msizex8 -+); -+impl_from_cast_mask!( -+ m16x8[test_v128]: i8x8, u8x8, m8x8, i16x8, u16x8, i32x8, u32x8, f32x8, m32x8, -+ i64x8, u64x8, f64x8, m64x8, isizex8, usizex8, msizex8 -+); -+ -+impl_from_cast!( -+ i32x4[test_v128]: i8x4, u8x4, m8x4, i16x4, u16x4, m16x4, u32x4, f32x4, m32x4, -+ i64x4, u64x4, f64x4, m64x4, i128x4, u128x4, m128x4, isizex4, usizex4, msizex4 -+); -+impl_from_cast!( -+ u32x4[test_v128]: i8x4, u8x4, m8x4, i16x4, u16x4, m16x4, i32x4, f32x4, m32x4, -+ i64x4, u64x4, f64x4, m64x4, i128x4, u128x4, m128x4, isizex4, usizex4, msizex4 -+); -+impl_from_cast!( -+ f32x4[test_v128]: i8x4, u8x4, m8x4, i16x4, u16x4, m16x4, i32x4, u32x4, m32x4, -+ i64x4, u64x4, f64x4, m64x4, i128x4, u128x4, m128x4, isizex4, usizex4, msizex4 -+); -+impl_from_cast_mask!( -+ m32x4[test_v128]: i8x4, u8x4, m8x4, i16x4, u16x4, m16x4, i32x4, u32x4, f32x4, -+ i64x4, u64x4, f64x4, m64x4, i128x4, u128x4, m128x4, isizex4, usizex4, msizex4 -+); -+ -+impl_from_cast!( -+ i64x2[test_v128]: i8x2, u8x2, m8x2, i16x2, u16x2, m16x2, i32x2, u32x2, f32x2, m32x2, -+ u64x2, f64x2, m64x2, i128x2, u128x2, m128x2, isizex2, usizex2, msizex2 -+); -+impl_from_cast!( -+ u64x2[test_v128]: i8x2, u8x2, m8x2, i16x2, u16x2, m16x2, i32x2, u32x2, f32x2, m32x2, -+ i64x2, f64x2, m64x2, i128x2, u128x2, m128x2, isizex2, usizex2, msizex2 -+); -+impl_from_cast!( -+ f64x2[test_v128]: i8x2, u8x2, m8x2, i16x2, u16x2, m16x2, i32x2, u32x2, f32x2, m32x2, -+ i64x2, u64x2, m64x2, i128x2, u128x2, m128x2, isizex2, usizex2, msizex2 -+); -+impl_from_cast_mask!( -+ m64x2[test_v128]: i8x2, u8x2, m8x2, i16x2, u16x2, m16x2, i32x2, u32x2, f32x2, m32x2, -+ i64x2, u64x2, f64x2, i128x2, u128x2, m128x2, isizex2, usizex2, msizex2 -+); -+ -+impl_from_cast!( -+ isizex2[test_v128]: i8x2, u8x2, m8x2, i16x2, u16x2, m16x2, i32x2, u32x2, f32x2, m32x2, -+ i64x2, u64x2, f64x2, m64x2, i128x2, u128x2, m128x2, usizex2, msizex2 -+); -+impl_from_cast!( -+ usizex2[test_v128]: i8x2, u8x2, m8x2, i16x2, u16x2, m16x2, i32x2, u32x2, f32x2, m32x2, -+ i64x2, u64x2, f64x2, m64x2, i128x2, u128x2, m128x2, isizex2, msizex2 -+); -+impl_from_cast_mask!( -+ msizex2[test_v128]: i8x2, u8x2, m8x2, i16x2, u16x2, m16x2, i32x2, u32x2, f32x2, m32x2, -+ i64x2, u64x2, f64x2, m64x2, i128x2, u128x2, m128x2, isizex2, usizex2 -+); -+ -+// FIXME[test_v128]: 64-bit single element vectors into_cast impls -+impl_from_cast!(i128x1[test_v128]: u128x1, m128x1); -+impl_from_cast!(u128x1[test_v128]: i128x1, m128x1); -+impl_from_cast!(m128x1[test_v128]: i128x1, u128x1); -diff --git a/third_party/rust/packed_simd/src/api/cast/v16.rs b/third_party/rust/packed_simd/src/api/cast/v16.rs -new file mode 100644 -index 000000000000..d292936baa41 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/cast/v16.rs -@@ -0,0 +1,17 @@ -+//! `FromCast` and `IntoCast` implementations for portable 16-bit wide vectors -+#![rustfmt::skip] -+ -+use crate::*; -+ -+impl_from_cast!( -+ i8x2[test_v16]: u8x2, m8x2, i16x2, u16x2, m16x2, i32x2, u32x2, f32x2, m32x2, -+ i64x2, u64x2, f64x2, m64x2, i128x2, u128x2, m128x2, isizex2, usizex2, msizex2 -+); -+impl_from_cast!( -+ u8x2[test_v16]: i8x2, m8x2, i16x2, u16x2, m16x2, i32x2, u32x2, f32x2, m32x2, -+ i64x2, u64x2, f64x2, m64x2, i128x2, u128x2, m128x2, isizex2, usizex2, msizex2 -+); -+impl_from_cast_mask!( -+ m8x2[test_v16]: i8x2, u8x2, i16x2, u16x2, m16x2, i32x2, u32x2, f32x2, m32x2, -+ i64x2, u64x2, f64x2, m64x2, i128x2, u128x2, m128x2, isizex2, usizex2, msizex2 -+); -diff --git a/third_party/rust/packed_simd/src/api/cast/v256.rs b/third_party/rust/packed_simd/src/api/cast/v256.rs -new file mode 100644 -index 000000000000..0a669e0beebe ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/cast/v256.rs -@@ -0,0 +1,81 @@ -+//! `FromCast` and `IntoCast` implementations for portable 256-bit wide vectors -+#![rustfmt::skip] -+ -+use crate::*; -+ -+impl_from_cast!(i8x32[test_v256]: u8x32, m8x32, i16x32, u16x32, m16x32); -+impl_from_cast!(u8x32[test_v256]: i8x32, m8x32, i16x32, u16x32, m16x32); -+impl_from_cast_mask!(m8x32[test_v256]: i8x32, u8x32, i16x32, u16x32, m16x32); -+ -+impl_from_cast!( -+ i16x16[test_v256]: i8x16, u8x16, m8x16, u16x16, m16x16, -+ i32x16, u32x16, f32x16, m32x16 -+); -+impl_from_cast!( -+ u16x16[test_v256]: i8x16, u8x16, m8x16, i16x16, m16x16, -+ i32x16, u32x16, f32x16, m32x16 -+); -+impl_from_cast_mask!( -+ m16x16[test_v256]: i8x16, u8x16, m8x16, i16x16, u16x16, -+ i32x16, u32x16, f32x16, m32x16 -+); -+ -+impl_from_cast!( -+ i32x8[test_v256]: i8x8, u8x8, m8x8, i16x8, u16x8, m16x8, u32x8, f32x8, m32x8, -+ i64x8, u64x8, f64x8, m64x8, isizex8, usizex8, msizex8 -+); -+impl_from_cast!( -+ u32x8[test_v256]: i8x8, u8x8, m8x8, i16x8, u16x8, m16x8, i32x8, f32x8, m32x8, -+ i64x8, u64x8, f64x8, m64x8, isizex8, usizex8, msizex8 -+); -+impl_from_cast!( -+ f32x8[test_v256]: i8x8, u8x8, m8x8, i16x8, u16x8, m16x8, i32x8, u32x8, m32x8, -+ i64x8, u64x8, f64x8, m64x8, isizex8, usizex8, msizex8 -+); -+impl_from_cast_mask!( -+ m32x8[test_v256]: i8x8, u8x8, m8x8, i16x8, u16x8, m16x8, i32x8, u32x8, f32x8, -+ i64x8, u64x8, f64x8, m64x8, isizex8, usizex8, msizex8 -+); -+ -+impl_from_cast!( -+ i64x4[test_v256]: i8x4, u8x4, m8x4, i16x4, u16x4, m16x4, i32x4, u32x4, f32x4, m32x4, -+ u64x4, f64x4, m64x4, i128x4, u128x4, m128x4, isizex4, usizex4, msizex4 -+); -+impl_from_cast!( -+ u64x4[test_v256]: i8x4, u8x4, m8x4, i16x4, u16x4, m16x4, i32x4, u32x4, f32x4, m32x4, -+ i64x4, f64x4, m64x4, i128x4, u128x4, m128x4, isizex4, usizex4, msizex4 -+); -+impl_from_cast!( -+ f64x4[test_v256]: i8x4, u8x4, m8x4, i16x4, u16x4, m16x4, i32x4, u32x4, f32x4, m32x4, -+ i64x4, u64x4, m64x4, i128x4, u128x4, m128x4, isizex4, usizex4, msizex4 -+); -+impl_from_cast_mask!( -+ m64x4[test_v256]: i8x4, u8x4, m8x4, i16x4, u16x4, m16x4, i32x4, u32x4, f32x4, m32x4, -+ i64x4, u64x4, f64x4, i128x4, u128x4, m128x4, isizex4, usizex4, msizex4 -+); -+ -+impl_from_cast!( -+ i128x2[test_v256]: i8x2, u8x2, m8x2, i16x2, u16x2, m16x2, i32x2, u32x2, f32x2, m32x2, -+ i64x2, u64x2, f64x2, m64x2, u128x2, m128x2, isizex2, usizex2, msizex2 -+); -+impl_from_cast!( -+ u128x2[test_v256]: i8x2, u8x2, m8x2, i16x2, u16x2, m16x2, i32x2, u32x2, f32x2, m32x2, -+ i64x2, u64x2, f64x2, m64x2, i128x2, m128x2, isizex2, usizex2, msizex2 -+); -+impl_from_cast_mask!( -+ m128x2[test_v256]: i8x2, u8x2, m8x2, i16x2, u16x2, m16x2, i32x2, u32x2, f32x2, m32x2, -+ i64x2, u64x2, m64x2, f64x2, i128x2, u128x2, isizex2, usizex2, msizex2 -+); -+ -+impl_from_cast!( -+ isizex4[test_v256]: i8x4, u8x4, m8x4, i16x4, u16x4, m16x4, i32x4, u32x4, f32x4, m32x4, -+ i64x4, u64x4, f64x4, m64x4, i128x4, u128x4, m128x4, usizex4, msizex4 -+); -+impl_from_cast!( -+ usizex4[test_v256]: i8x4, u8x4, m8x4, i16x4, u16x4, m16x4, i32x4, u32x4, f32x4, m32x4, -+ i64x4, u64x4, f64x4, m64x4, i128x4, u128x4, m128x4, isizex4, msizex4 -+); -+impl_from_cast_mask!( -+ msizex4[test_v256]: i8x4, u8x4, m8x4, i16x4, u16x4, m16x4, i32x4, u32x4, f32x4, m32x4, -+ i64x4, u64x4, f64x4, m64x4, i128x4, u128x4, m128x4, isizex4, usizex4 -+); -diff --git a/third_party/rust/packed_simd/src/api/cast/v32.rs b/third_party/rust/packed_simd/src/api/cast/v32.rs -new file mode 100644 -index 000000000000..65050cdacb4e ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/cast/v32.rs -@@ -0,0 +1,30 @@ -+//! `FromCast` and `IntoCast` implementations for portable 32-bit wide vectors -+#![rustfmt::skip] -+ -+use crate::*; -+ -+impl_from_cast!( -+ i8x4[test_v32]: u8x4, m8x4, i16x4, u16x4, m16x4, i32x4, u32x4, f32x4, m32x4, -+ i64x4, u64x4, f64x4, m64x4, i128x4, u128x4, m128x4, isizex4, usizex4, msizex4 -+); -+impl_from_cast!( -+ u8x4[test_v32]: i8x4, m8x4, i16x4, u16x4, m16x4, i32x4, u32x4, f32x4, m32x4, -+ i64x4, u64x4, f64x4, m64x4, i128x4, u128x4, m128x4, isizex4, usizex4, msizex4 -+); -+impl_from_cast_mask!( -+ m8x4[test_v32]: i8x4, u8x4, i16x4, u16x4, m16x4, i32x4, u32x4, f32x4, m32x4, -+ i64x4, u64x4, f64x4, m64x4, i128x4, u128x4, m128x4, isizex4, usizex4, msizex4 -+); -+ -+impl_from_cast!( -+ i16x2[test_v32]: i8x2, u8x2, m8x2, u16x2, m16x2, i32x2, u32x2, f32x2, m32x2, -+ i64x2, u64x2, f64x2, m64x2, i128x2, u128x2, m128x2, isizex2, usizex2, msizex2 -+); -+impl_from_cast!( -+ u16x2[test_v32]: i8x2, u8x2, m8x2, i16x2, m16x2, i32x2, u32x2, f32x2, m32x2, -+ i64x2, u64x2, f64x2, m64x2, i128x2, u128x2, m128x2, isizex2, usizex2, msizex2 -+); -+impl_from_cast_mask!( -+ m16x2[test_v32]: i8x2, u8x2, m8x2, i16x2, u16x2, i32x2, u32x2, f32x2, m32x2, -+ i64x2, u64x2, f64x2, m64x2, i128x2, u128x2, m128x2, isizex2, usizex2, msizex2 -+); -diff --git a/third_party/rust/packed_simd/src/api/cast/v512.rs b/third_party/rust/packed_simd/src/api/cast/v512.rs -new file mode 100644 -index 000000000000..9ae1caed35e2 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/cast/v512.rs -@@ -0,0 +1,68 @@ -+//! `FromCast` and `IntoCast` implementations for portable 512-bit wide vectors -+#![rustfmt::skip] -+ -+use crate::*; -+ -+impl_from_cast!(i8x64[test_v512]: u8x64, m8x64); -+impl_from_cast!(u8x64[test_v512]: i8x64, m8x64); -+impl_from_cast_mask!(m8x64[test_v512]: i8x64, u8x64); -+ -+impl_from_cast!(i16x32[test_v512]: i8x32, u8x32, m8x32, u16x32, m16x32); -+impl_from_cast!(u16x32[test_v512]: i8x32, u8x32, m8x32, i16x32, m16x32); -+impl_from_cast_mask!(m16x32[test_v512]: i8x32, u8x32, m8x32, i16x32, u16x32); -+ -+impl_from_cast!( -+ i32x16[test_v512]: i8x16, u8x16, m8x16, i16x16, u16x16, m16x16, u32x16, f32x16, m32x16 -+); -+impl_from_cast!( -+ u32x16[test_v512]: i8x16, u8x16, m8x16, i16x16, u16x16, m16x16, i32x16, f32x16, m32x16 -+); -+impl_from_cast!( -+ f32x16[test_v512]: i8x16, u8x16, m8x16, i16x16, u16x16, m16x16, i32x16, u32x16, m32x16 -+); -+impl_from_cast_mask!( -+ m32x16[test_v512]: i8x16, u8x16, m8x16, i16x16, u16x16, m16x16, i32x16, u32x16, f32x16 -+); -+ -+impl_from_cast!( -+ i64x8[test_v512]: i8x8, u8x8, m8x8, i16x8, u16x8, m16x8, i32x8, u32x8, f32x8, m32x8, -+ u64x8, f64x8, m64x8, isizex8, usizex8, msizex8 -+); -+impl_from_cast!( -+ u64x8[test_v512]: i8x8, u8x8, m8x8, i16x8, u16x8, m16x8, i32x8, u32x8, f32x8, m32x8, -+ i64x8, f64x8, m64x8, isizex8, usizex8, msizex8 -+); -+impl_from_cast!( -+ f64x8[test_v512]: i8x8, u8x8, m8x8, i16x8, u16x8, m16x8, i32x8, u32x8, f32x8, m32x8, -+ i64x8, u64x8, m64x8, isizex8, usizex8, msizex8 -+); -+impl_from_cast_mask!( -+ m64x8[test_v512]: i8x8, u8x8, m8x8, i16x8, u16x8, m16x8, i32x8, u32x8, f32x8, m32x8, -+ i64x8, u64x8, f64x8, isizex8, usizex8, msizex8 -+); -+ -+impl_from_cast!( -+ i128x4[test_v512]: i8x4, u8x4, m8x4, i16x4, u16x4, m16x4, i32x4, u32x4, f32x4, m32x4, -+ i64x4, u64x4, f64x4, m64x4, u128x4, m128x4, isizex4, usizex4, msizex4 -+); -+impl_from_cast!( -+ u128x4[test_v512]: i8x4, u8x4, m8x4, i16x4, u16x4, m16x4, i32x4, u32x4, f32x4, m32x4, -+ i64x4, u64x4, f64x4, m64x4, i128x4, m128x4, isizex4, usizex4, msizex4 -+); -+impl_from_cast_mask!( -+ m128x4[test_v512]: i8x4, u8x4, m8x4, i16x4, u16x4, m16x4, i32x4, u32x4, f32x4, m32x4, -+ i64x4, u64x4, m64x4, f64x4, i128x4, u128x4, isizex4, usizex4, msizex4 -+); -+ -+impl_from_cast!( -+ isizex8[test_v512]: i8x8, u8x8, m8x8, i16x8, u16x8, m16x8, i32x8, u32x8, f32x8, m32x8, -+ i64x8, u64x8, f64x8, m64x8, usizex8, msizex8 -+); -+impl_from_cast!( -+ usizex8[test_v512]: i8x8, u8x8, m8x8, i16x8, u16x8, m16x8, i32x8, u32x8, f32x8, m32x8, -+ i64x8, u64x8, f64x8, m64x8, isizex8, msizex8 -+); -+impl_from_cast_mask!( -+ msizex8[test_v512]: i8x8, u8x8, m8x8, i16x8, u16x8, m16x8, i32x8, u32x8, f32x8, m32x8, -+ i64x8, u64x8, f64x8, m64x8, isizex8, usizex8 -+); -diff --git a/third_party/rust/packed_simd/src/api/cast/v64.rs b/third_party/rust/packed_simd/src/api/cast/v64.rs -new file mode 100644 -index 000000000000..0e2f78f7335b ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/cast/v64.rs -@@ -0,0 +1,47 @@ -+//! `FromCast` and `IntoCast` implementations for portable 64-bit wide vectors -+#![rustfmt::skip] -+ -+use crate::*; -+ -+impl_from_cast!( -+ i8x8[test_v64]: u8x8, m8x8, i16x8, u16x8, m16x8, i32x8, u32x8, f32x8, m32x8, -+ i64x8, u64x8, f64x8, m64x8, isizex8, usizex8, msizex8 -+); -+impl_from_cast!( -+ u8x8[test_v64]: i8x8, m8x8, i16x8, u16x8, m16x8, i32x8, u32x8, f32x8, m32x8, -+ i64x8, u64x8, f64x8, m64x8, isizex8, usizex8, msizex8 -+); -+impl_from_cast_mask!( -+ m8x8[test_v64]: i8x8, u8x8, i16x8, u16x8, m16x8, i32x8, u32x8, f32x8, m32x8, -+ i64x8, u64x8, f64x8, m64x8, isizex8, usizex8, msizex8 -+); -+ -+impl_from_cast!( -+ i16x4[test_v64]: i8x4, u8x4, m8x4, u16x4, m16x4, i32x4, u32x4, f32x4, m32x4, -+ i64x4, u64x4, f64x4, m64x4, i128x4, u128x4, m128x4, isizex4, usizex4, msizex4 -+); -+impl_from_cast!( -+ u16x4[test_v64]: i8x4, u8x4, m8x4, i16x4, m16x4, i32x4, u32x4, f32x4, m32x4, -+ i64x4, u64x4, f64x4, m64x4, i128x4, u128x4, m128x4, isizex4, usizex4, msizex4 -+); -+impl_from_cast_mask!( -+ m16x4[test_v64]: i8x4, u8x4, m8x4, i16x4, u16x4, i32x4, u32x4, f32x4, m32x4, -+ i64x4, u64x4, f64x4, m64x4, i128x4, u128x4, m128x4, isizex4, usizex4, msizex4 -+); -+ -+impl_from_cast!( -+ i32x2[test_v64]: i8x2, u8x2, m8x2, i16x2, u16x2, m16x2, u32x2, f32x2, m32x2, -+ i64x2, u64x2, f64x2, m64x2, i128x2, u128x2, m128x2, isizex2, usizex2, msizex2 -+); -+impl_from_cast!( -+ u32x2[test_v64]: i8x2, u8x2, m8x2, i16x2, u16x2, m16x2, i32x2, f32x2, m32x2, -+ i64x2, u64x2, f64x2, m64x2, i128x2, u128x2, m128x2, isizex2, usizex2, msizex2 -+); -+impl_from_cast!( -+ f32x2[test_v64]: i8x2, u8x2, m8x2, i16x2, u16x2, m16x2, i32x2, u32x2, m32x2, -+ i64x2, u64x2, f64x2, m64x2, i128x2, u128x2, m128x2, isizex2, usizex2, msizex2 -+); -+impl_from_cast_mask!( -+ m32x2[test_v64]: i8x2, u8x2, m8x2, i16x2, u16x2, m16x2, i32x2, u32x2, f32x2, -+ i64x2, u64x2, f64x2, m64x2, i128x2, u128x2, m128x2, isizex2, usizex2, msizex2 -+); -diff --git a/third_party/rust/packed_simd/src/api/cmp.rs b/third_party/rust/packed_simd/src/api/cmp.rs -new file mode 100644 -index 000000000000..6d5301ddddbd ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/cmp.rs -@@ -0,0 +1,16 @@ -+//! Implement cmp traits for vector types -+ -+#[macro_use] -+mod partial_eq; -+ -+#[macro_use] -+mod eq; -+ -+#[macro_use] -+mod partial_ord; -+ -+#[macro_use] -+mod ord; -+ -+#[macro_use] -+mod vertical; -diff --git a/third_party/rust/packed_simd/src/api/cmp/eq.rs b/third_party/rust/packed_simd/src/api/cmp/eq.rs -new file mode 100644 -index 000000000000..3c55d0dce57e ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/cmp/eq.rs -@@ -0,0 +1,27 @@ -+//! Implements `Eq` for vector types. -+ -+macro_rules! impl_cmp_eq { -+ ( -+ [$elem_ty:ident; $elem_count:expr]: -+ $id:ident | $test_tt:tt | -+ ($true:expr, $false:expr) -+ ) => { -+ impl crate::cmp::Eq for $id {} -+ impl crate::cmp::Eq for LexicographicallyOrdered<$id> {} -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _cmp_eq>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn eq() { -+ fn foo(_: E) {} -+ let a = $id::splat($false); -+ foo(a); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/cmp/ord.rs b/third_party/rust/packed_simd/src/api/cmp/ord.rs -new file mode 100644 -index 000000000000..e54ba3bfde9a ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/cmp/ord.rs -@@ -0,0 +1,43 @@ -+//! Implements `Ord` for vector types. -+ -+macro_rules! impl_cmp_ord { -+ ( -+ [$elem_ty:ident; $elem_count:expr]: -+ $id:ident | $test_tt:tt | -+ ($true:expr, $false:expr) -+ ) => { -+ impl $id { -+ /// Returns a wrapper that implements `Ord`. -+ #[inline] -+ pub fn lex_ord(&self) -> LexicographicallyOrdered<$id> { -+ LexicographicallyOrdered(*self) -+ } -+ } -+ -+ impl crate::cmp::Ord for LexicographicallyOrdered<$id> { -+ #[inline] -+ fn cmp(&self, other: &Self) -> crate::cmp::Ordering { -+ match self.partial_cmp(other) { -+ Some(x) => x, -+ None => unsafe { crate::hint::unreachable_unchecked() }, -+ } -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _cmp_ord>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn eq() { -+ fn foo(_: E) {} -+ let a = $id::splat($false); -+ foo(a.partial_lex_ord()); -+ foo(a.lex_ord()); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/cmp/partial_eq.rs b/third_party/rust/packed_simd/src/api/cmp/partial_eq.rs -new file mode 100644 -index 000000000000..1712a0de56cb ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/cmp/partial_eq.rs -@@ -0,0 +1,67 @@ -+//! Implements `PartialEq` for vector types. -+ -+macro_rules! impl_cmp_partial_eq { -+ ( -+ [$elem_ty:ident; $elem_count:expr]: -+ $id:ident | $test_tt:tt | -+ ($true:expr, $false:expr) -+ ) => { -+ // FIXME: https://github.com/rust-lang-nursery/rust-clippy/issues/2892 -+ #[allow(clippy::partialeq_ne_impl)] -+ impl crate::cmp::PartialEq<$id> for $id { -+ #[inline] -+ fn eq(&self, other: &Self) -> bool { -+ $id::eq(*self, *other).all() -+ } -+ #[inline] -+ fn ne(&self, other: &Self) -> bool { -+ $id::ne(*self, *other).any() -+ } -+ } -+ -+ // FIXME: https://github.com/rust-lang-nursery/rust-clippy/issues/2892 -+ #[allow(clippy::partialeq_ne_impl)] -+ impl crate::cmp::PartialEq> -+ for LexicographicallyOrdered<$id> -+ { -+ #[inline] -+ fn eq(&self, other: &Self) -> bool { -+ self.0 == other.0 -+ } -+ #[inline] -+ fn ne(&self, other: &Self) -> bool { -+ self.0 != other.0 -+ } -+ } -+ -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _cmp_PartialEq>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn partial_eq() { -+ let a = $id::splat($false); -+ let b = $id::splat($true); -+ -+ assert!(a != b); -+ assert!(!(a == b)); -+ assert!(a == a); -+ assert!(!(a != a)); -+ -+ if $id::lanes() > 1 { -+ let a = $id::splat($false).replace(0, $true); -+ let b = $id::splat($true); -+ -+ assert!(a != b); -+ assert!(!(a == b)); -+ assert!(a == a); -+ assert!(!(a != a)); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/cmp/partial_ord.rs b/third_party/rust/packed_simd/src/api/cmp/partial_ord.rs -new file mode 100644 -index 000000000000..a2292918bae1 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/cmp/partial_ord.rs -@@ -0,0 +1,234 @@ -+//! Implements `PartialOrd` for vector types. -+//! -+//! This implements a lexicographical order. -+ -+macro_rules! impl_cmp_partial_ord { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Returns a wrapper that implements `PartialOrd`. -+ #[inline] -+ pub fn partial_lex_ord(&self) -> LexicographicallyOrdered<$id> { -+ LexicographicallyOrdered(*self) -+ } -+ } -+ -+ impl crate::cmp::PartialOrd> -+ for LexicographicallyOrdered<$id> -+ { -+ #[inline] -+ fn partial_cmp( -+ &self, other: &Self, -+ ) -> Option { -+ if PartialEq::eq(self, other) { -+ Some(crate::cmp::Ordering::Equal) -+ } else if PartialOrd::lt(self, other) { -+ Some(crate::cmp::Ordering::Less) -+ } else if PartialOrd::gt(self, other) { -+ Some(crate::cmp::Ordering::Greater) -+ } else { -+ None -+ } -+ } -+ #[inline] -+ fn lt(&self, other: &Self) -> bool { -+ let m_lt = self.0.lt(other.0); -+ let m_eq = self.0.eq(other.0); -+ for i in 0..$id::lanes() { -+ if m_eq.extract(i) { -+ continue; -+ } -+ return m_lt.extract(i); -+ } -+ false -+ } -+ #[inline] -+ fn le(&self, other: &Self) -> bool { -+ self.lt(other) | PartialEq::eq(self, other) -+ } -+ #[inline] -+ fn ge(&self, other: &Self) -> bool { -+ self.gt(other) | PartialEq::eq(self, other) -+ } -+ #[inline] -+ fn gt(&self, other: &Self) -> bool { -+ let m_gt = self.0.gt(other.0); -+ let m_eq = self.0.eq(other.0); -+ for i in 0..$id::lanes() { -+ if m_eq.extract(i) { -+ continue; -+ } -+ return m_gt.extract(i); -+ } -+ false -+ } -+ } -+ }; -+} -+ -+macro_rules! test_cmp_partial_ord_int { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _cmp_PartialOrd>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn partial_lex_ord() { -+ use crate::testing::utils::{test_cmp}; -+ // constant values -+ let a = $id::splat(0); -+ let b = $id::splat(1); -+ -+ test_cmp(a.partial_lex_ord(), b.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Less)); -+ test_cmp(b.partial_lex_ord(), a.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Greater)); -+ test_cmp(a.partial_lex_ord(), a.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Equal)); -+ test_cmp(b.partial_lex_ord(), b.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Equal)); -+ -+ // variable values: a = [0, 1, 2, 3]; b = [3, 2, 1, 0] -+ let mut a = $id::splat(0); -+ let mut b = $id::splat(0); -+ for i in 0..$id::lanes() { -+ a = a.replace(i, i as $elem_ty); -+ b = b.replace(i, ($id::lanes() - i) as $elem_ty); -+ } -+ test_cmp(a.partial_lex_ord(), b.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Less)); -+ test_cmp(b.partial_lex_ord(), a.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Greater)); -+ test_cmp(a.partial_lex_ord(), a.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Equal)); -+ test_cmp(b.partial_lex_ord(), b.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Equal)); -+ -+ // variable values: a = [0, 1, 2, 3]; b = [0, 1, 2, 4] -+ let mut b = a; -+ b = b.replace( -+ $id::lanes() - 1, -+ a.extract($id::lanes() - 1) + 1 as $elem_ty -+ ); -+ test_cmp(a.partial_lex_ord(), b.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Less)); -+ test_cmp(b.partial_lex_ord(), a.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Greater)); -+ test_cmp(a.partial_lex_ord(), a.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Equal)); -+ test_cmp(b.partial_lex_ord(), b.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Equal)); -+ -+ if $id::lanes() > 2 { -+ // variable values a = [0, 1, 0, 0]; b = [0, 1, 2, 3] -+ let b = a; -+ let mut a = $id::splat(0); -+ a = a.replace(1, 1 as $elem_ty); -+ test_cmp(a.partial_lex_ord(), b.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Less)); -+ test_cmp(b.partial_lex_ord(), a.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Greater)); -+ test_cmp(a.partial_lex_ord(), a.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Equal)); -+ test_cmp(b.partial_lex_ord(), b.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Equal)); -+ -+ // variable values: a = [0, 1, 2, 3]; b = [0, 1, 3, 2] -+ let mut b = a; -+ b = b.replace( -+ 2, a.extract($id::lanes() - 1) + 1 as $elem_ty -+ ); -+ test_cmp(a.partial_lex_ord(), b.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Less)); -+ test_cmp(b.partial_lex_ord(), a.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Greater)); -+ test_cmp(a.partial_lex_ord(), a.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Equal)); -+ test_cmp(b.partial_lex_ord(), b.partial_lex_ord(), -+ Some(crate::cmp::Ordering::Equal)); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -+ -+macro_rules! test_cmp_partial_ord_mask { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _cmp_PartialOrd>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn partial_lex_ord() { -+ use crate::testing::utils::{test_cmp}; -+ use crate::cmp::Ordering; -+ -+ // constant values -+ let a = $id::splat(false); -+ let b = $id::splat(true); -+ -+ test_cmp(a.partial_lex_ord(), b.partial_lex_ord(), -+ Some(Ordering::Less)); -+ test_cmp(b.partial_lex_ord(), a.partial_lex_ord(), -+ Some(Ordering::Greater)); -+ test_cmp(a.partial_lex_ord(), a.partial_lex_ord(), -+ Some(Ordering::Equal)); -+ test_cmp(b.partial_lex_ord(), b.partial_lex_ord(), -+ Some(Ordering::Equal)); -+ -+ // variable values: -+ // a = [false, false, false, false]; -+ // b = [false, false, false, true] -+ let a = $id::splat(false); -+ let mut b = $id::splat(false); -+ b = b.replace($id::lanes() - 1, true); -+ test_cmp(a.partial_lex_ord(), b.partial_lex_ord(), -+ Some(Ordering::Less)); -+ test_cmp(b.partial_lex_ord(), a.partial_lex_ord(), -+ Some(Ordering::Greater)); -+ test_cmp(a.partial_lex_ord(), a.partial_lex_ord(), -+ Some(Ordering::Equal)); -+ test_cmp(b.partial_lex_ord(), b.partial_lex_ord(), -+ Some(Ordering::Equal)); -+ -+ // variable values: -+ // a = [true, true, true, false]; -+ // b = [true, true, true, true] -+ let mut a = $id::splat(true); -+ let b = $id::splat(true); -+ a = a.replace($id::lanes() - 1, false); -+ test_cmp(a.partial_lex_ord(), b.partial_lex_ord(), -+ Some(Ordering::Less)); -+ test_cmp(b.partial_lex_ord(), a.partial_lex_ord(), -+ Some(Ordering::Greater)); -+ test_cmp(a.partial_lex_ord(), a.partial_lex_ord(), -+ Some(Ordering::Equal)); -+ test_cmp(b.partial_lex_ord(), b.partial_lex_ord(), -+ Some(Ordering::Equal)); -+ -+ if $id::lanes() > 2 { -+ // variable values -+ // a = [false, true, false, false]; -+ // b = [false, true, true, true] -+ let mut a = $id::splat(false); -+ let mut b = $id::splat(true); -+ a = a.replace(1, true); -+ b = b.replace(0, false); -+ test_cmp(a.partial_lex_ord(), b.partial_lex_ord(), -+ Some(Ordering::Less)); -+ test_cmp(b.partial_lex_ord(), a.partial_lex_ord(), -+ Some(Ordering::Greater)); -+ test_cmp(a.partial_lex_ord(), a.partial_lex_ord(), -+ Some(Ordering::Equal)); -+ test_cmp(b.partial_lex_ord(), b.partial_lex_ord(), -+ Some(Ordering::Equal)); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/cmp/vertical.rs b/third_party/rust/packed_simd/src/api/cmp/vertical.rs -new file mode 100644 -index 000000000000..ea4a0d1a3467 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/cmp/vertical.rs -@@ -0,0 +1,114 @@ -+//! Vertical (lane-wise) vector comparisons returning vector masks. -+ -+macro_rules! impl_cmp_vertical { -+ ( -+ [$elem_ty:ident; $elem_count:expr]: -+ $id:ident, -+ $mask_ty:ident, -+ $is_mask:expr,($true:expr, $false:expr) | $test_tt:tt -+ ) => { -+ impl $id { -+ /// Lane-wise equality comparison. -+ #[inline] -+ pub fn eq(self, other: Self) -> $mask_ty { -+ use crate::llvm::simd_eq; -+ Simd(unsafe { simd_eq(self.0, other.0) }) -+ } -+ -+ /// Lane-wise inequality comparison. -+ #[inline] -+ pub fn ne(self, other: Self) -> $mask_ty { -+ use crate::llvm::simd_ne; -+ Simd(unsafe { simd_ne(self.0, other.0) }) -+ } -+ -+ /// Lane-wise less-than comparison. -+ #[inline] -+ pub fn lt(self, other: Self) -> $mask_ty { -+ use crate::llvm::{simd_gt, simd_lt}; -+ if $is_mask { -+ Simd(unsafe { simd_gt(self.0, other.0) }) -+ } else { -+ Simd(unsafe { simd_lt(self.0, other.0) }) -+ } -+ } -+ -+ /// Lane-wise less-than-or-equals comparison. -+ #[inline] -+ pub fn le(self, other: Self) -> $mask_ty { -+ use crate::llvm::{simd_ge, simd_le}; -+ if $is_mask { -+ Simd(unsafe { simd_ge(self.0, other.0) }) -+ } else { -+ Simd(unsafe { simd_le(self.0, other.0) }) -+ } -+ } -+ -+ /// Lane-wise greater-than comparison. -+ #[inline] -+ pub fn gt(self, other: Self) -> $mask_ty { -+ use crate::llvm::{simd_gt, simd_lt}; -+ if $is_mask { -+ Simd(unsafe { simd_lt(self.0, other.0) }) -+ } else { -+ Simd(unsafe { simd_gt(self.0, other.0) }) -+ } -+ } -+ -+ /// Lane-wise greater-than-or-equals comparison. -+ #[inline] -+ pub fn ge(self, other: Self) -> $mask_ty { -+ use crate::llvm::{simd_ge, simd_le}; -+ if $is_mask { -+ Simd(unsafe { simd_le(self.0, other.0) }) -+ } else { -+ Simd(unsafe { simd_ge(self.0, other.0) }) -+ } -+ } -+ } -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _cmp_vertical>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn cmp() { -+ let a = $id::splat($false); -+ let b = $id::splat($true); -+ -+ let r = a.lt(b); -+ let e = $mask_ty::splat(true); -+ assert!(r == e); -+ let r = a.le(b); -+ assert!(r == e); -+ -+ let e = $mask_ty::splat(false); -+ let r = a.gt(b); -+ assert!(r == e); -+ let r = a.ge(b); -+ assert!(r == e); -+ let r = a.eq(b); -+ assert!(r == e); -+ -+ let mut a = a; -+ let mut b = b; -+ let mut e = e; -+ for i in 0..$id::lanes() { -+ if i % 2 == 0 { -+ a = a.replace(i, $false); -+ b = b.replace(i, $true); -+ e = e.replace(i, true); -+ } else { -+ a = a.replace(i, $true); -+ b = b.replace(i, $false); -+ e = e.replace(i, false); -+ } -+ } -+ let r = a.lt(b); -+ assert!(r == e); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/default.rs b/third_party/rust/packed_simd/src/api/default.rs -new file mode 100644 -index 000000000000..843d51bcc4bb ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/default.rs -@@ -0,0 +1,28 @@ -+//! Implements `Default` for vector types. -+ -+macro_rules! impl_default { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl Default for $id { -+ #[inline] -+ fn default() -> Self { -+ Self::splat($elem_ty::default()) -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _default>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn default() { -+ let a = $id::default(); -+ for i in 0..$id::lanes() { -+ assert_eq!(a.extract(i), $elem_ty::default()); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/fmt.rs b/third_party/rust/packed_simd/src/api/fmt.rs -new file mode 100644 -index 000000000000..f3f55c401548 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/fmt.rs -@@ -0,0 +1,12 @@ -+//! Implements formatting APIs -+ -+#[macro_use] -+mod debug; -+#[macro_use] -+mod lower_hex; -+#[macro_use] -+mod upper_hex; -+#[macro_use] -+mod octal; -+#[macro_use] -+mod binary; -diff --git a/third_party/rust/packed_simd/src/api/fmt/binary.rs b/third_party/rust/packed_simd/src/api/fmt/binary.rs -new file mode 100644 -index 000000000000..b60769082d51 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/fmt/binary.rs -@@ -0,0 +1,56 @@ -+//! Implement Octal formatting -+ -+macro_rules! impl_fmt_binary { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl crate::fmt::Binary for $id { -+ #[allow(clippy::missing_inline_in_public_items)] -+ fn fmt( -+ &self, f: &mut crate::fmt::Formatter<'_>, -+ ) -> crate::fmt::Result { -+ write!(f, "{}(", stringify!($id))?; -+ for i in 0..$elem_count { -+ if i > 0 { -+ write!(f, ", ")?; -+ } -+ self.extract(i).fmt(f)?; -+ } -+ write!(f, ")") -+ } -+ } -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _fmt_binary>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn binary() { -+ use arrayvec::{ArrayString,ArrayVec}; -+ type TinyString = ArrayString<[u8; 512]>; -+ -+ use crate::fmt::Write; -+ let v = $id::splat($elem_ty::default()); -+ let mut s = TinyString::new(); -+ write!(&mut s, "{:#b}", v).unwrap(); -+ -+ let mut beg = TinyString::new(); -+ write!(&mut beg, "{}(", stringify!($id)).unwrap(); -+ assert!(s.starts_with(beg.as_str())); -+ assert!(s.ends_with(")")); -+ let s: ArrayVec<[TinyString; 64]> -+ = s.replace(beg.as_str(), "") -+ .replace(")", "").split(",") -+ .map(|v| TinyString::from(v.trim()).unwrap()) -+ .collect(); -+ assert_eq!(s.len(), $id::lanes()); -+ for (index, ss) in s.into_iter().enumerate() { -+ let mut e = TinyString::new(); -+ write!(&mut e, "{:#b}", v.extract(index)).unwrap(); -+ assert_eq!(ss, e); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/fmt/debug.rs b/third_party/rust/packed_simd/src/api/fmt/debug.rs -new file mode 100644 -index 000000000000..ad0b8a59a1f0 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/fmt/debug.rs -@@ -0,0 +1,62 @@ -+//! Implement debug formatting -+ -+macro_rules! impl_fmt_debug_tests { -+ ([$elem_ty:ty; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _fmt_debug>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn debug() { -+ use arrayvec::{ArrayString,ArrayVec}; -+ type TinyString = ArrayString<[u8; 512]>; -+ -+ use crate::fmt::Write; -+ let v = $id::default(); -+ let mut s = TinyString::new(); -+ write!(&mut s, "{:?}", v).unwrap(); -+ -+ let mut beg = TinyString::new(); -+ write!(&mut beg, "{}(", stringify!($id)).unwrap(); -+ assert!(s.starts_with(beg.as_str())); -+ assert!(s.ends_with(")")); -+ let s: ArrayVec<[TinyString; 64]> -+ = s.replace(beg.as_str(), "") -+ .replace(")", "").split(",") -+ .map(|v| TinyString::from(v.trim()).unwrap()) -+ .collect(); -+ assert_eq!(s.len(), $id::lanes()); -+ for (index, ss) in s.into_iter().enumerate() { -+ let mut e = TinyString::new(); -+ write!(&mut e, "{:?}", v.extract(index)).unwrap(); -+ assert_eq!(ss, e); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -+ -+macro_rules! impl_fmt_debug { -+ ([$elem_ty:ty; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl crate::fmt::Debug for $id { -+ #[allow(clippy::missing_inline_in_public_items)] -+ fn fmt( -+ &self, f: &mut crate::fmt::Formatter<'_>, -+ ) -> crate::fmt::Result { -+ write!(f, "{}(", stringify!($id))?; -+ for i in 0..$elem_count { -+ if i > 0 { -+ write!(f, ", ")?; -+ } -+ self.extract(i).fmt(f)?; -+ } -+ write!(f, ")") -+ } -+ } -+ impl_fmt_debug_tests!([$elem_ty; $elem_count]: $id | $test_tt); -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/fmt/lower_hex.rs b/third_party/rust/packed_simd/src/api/fmt/lower_hex.rs -new file mode 100644 -index 000000000000..5a7aa14b5b8a ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/fmt/lower_hex.rs -@@ -0,0 +1,56 @@ -+//! Implement `LowerHex` formatting -+ -+macro_rules! impl_fmt_lower_hex { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl crate::fmt::LowerHex for $id { -+ #[allow(clippy::missing_inline_in_public_items)] -+ fn fmt( -+ &self, f: &mut crate::fmt::Formatter<'_>, -+ ) -> crate::fmt::Result { -+ write!(f, "{}(", stringify!($id))?; -+ for i in 0..$elem_count { -+ if i > 0 { -+ write!(f, ", ")?; -+ } -+ self.extract(i).fmt(f)?; -+ } -+ write!(f, ")") -+ } -+ } -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _fmt_lower_hex>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn lower_hex() { -+ use arrayvec::{ArrayString,ArrayVec}; -+ type TinyString = ArrayString<[u8; 512]>; -+ -+ use crate::fmt::Write; -+ let v = $id::splat($elem_ty::default()); -+ let mut s = TinyString::new(); -+ write!(&mut s, "{:#x}", v).unwrap(); -+ -+ let mut beg = TinyString::new(); -+ write!(&mut beg, "{}(", stringify!($id)).unwrap(); -+ assert!(s.starts_with(beg.as_str())); -+ assert!(s.ends_with(")")); -+ let s: ArrayVec<[TinyString; 64]> -+ = s.replace(beg.as_str(), "").replace(")", "") -+ .split(",") -+ .map(|v| TinyString::from(v.trim()).unwrap()) -+ .collect(); -+ assert_eq!(s.len(), $id::lanes()); -+ for (index, ss) in s.into_iter().enumerate() { -+ let mut e = TinyString::new(); -+ write!(&mut e, "{:#x}", v.extract(index)).unwrap(); -+ assert_eq!(ss, e); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/fmt/octal.rs b/third_party/rust/packed_simd/src/api/fmt/octal.rs -new file mode 100644 -index 000000000000..83ac8abc7dae ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/fmt/octal.rs -@@ -0,0 +1,56 @@ -+//! Implement Octal formatting -+ -+macro_rules! impl_fmt_octal { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl crate::fmt::Octal for $id { -+ #[allow(clippy::missing_inline_in_public_items)] -+ fn fmt( -+ &self, f: &mut crate::fmt::Formatter<'_>, -+ ) -> crate::fmt::Result { -+ write!(f, "{}(", stringify!($id))?; -+ for i in 0..$elem_count { -+ if i > 0 { -+ write!(f, ", ")?; -+ } -+ self.extract(i).fmt(f)?; -+ } -+ write!(f, ")") -+ } -+ } -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _fmt_octal>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn octal_hex() { -+ use arrayvec::{ArrayString,ArrayVec}; -+ type TinyString = ArrayString<[u8; 512]>; -+ -+ use crate::fmt::Write; -+ let v = $id::splat($elem_ty::default()); -+ let mut s = TinyString::new(); -+ write!(&mut s, "{:#o}", v).unwrap(); -+ -+ let mut beg = TinyString::new(); -+ write!(&mut beg, "{}(", stringify!($id)).unwrap(); -+ assert!(s.starts_with(beg.as_str())); -+ assert!(s.ends_with(")")); -+ let s: ArrayVec<[TinyString; 64]> -+ = s.replace(beg.as_str(), "").replace(")", "") -+ .split(",") -+ .map(|v| TinyString::from(v.trim()).unwrap()) -+ .collect(); -+ assert_eq!(s.len(), $id::lanes()); -+ for (index, ss) in s.into_iter().enumerate() { -+ let mut e = TinyString::new(); -+ write!(&mut e, "{:#o}", v.extract(index)).unwrap(); -+ assert_eq!(ss, e); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/fmt/upper_hex.rs b/third_party/rust/packed_simd/src/api/fmt/upper_hex.rs -new file mode 100644 -index 000000000000..aa88f673abf0 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/fmt/upper_hex.rs -@@ -0,0 +1,56 @@ -+//! Implement `UpperHex` formatting -+ -+macro_rules! impl_fmt_upper_hex { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl crate::fmt::UpperHex for $id { -+ #[allow(clippy::missing_inline_in_public_items)] -+ fn fmt( -+ &self, f: &mut crate::fmt::Formatter<'_>, -+ ) -> crate::fmt::Result { -+ write!(f, "{}(", stringify!($id))?; -+ for i in 0..$elem_count { -+ if i > 0 { -+ write!(f, ", ")?; -+ } -+ self.extract(i).fmt(f)?; -+ } -+ write!(f, ")") -+ } -+ } -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _fmt_upper_hex>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn upper_hex() { -+ use arrayvec::{ArrayString,ArrayVec}; -+ type TinyString = ArrayString<[u8; 512]>; -+ -+ use crate::fmt::Write; -+ let v = $id::splat($elem_ty::default()); -+ let mut s = TinyString::new(); -+ write!(&mut s, "{:#X}", v).unwrap(); -+ -+ let mut beg = TinyString::new(); -+ write!(&mut beg, "{}(", stringify!($id)).unwrap(); -+ assert!(s.starts_with(beg.as_str())); -+ assert!(s.ends_with(")")); -+ let s: ArrayVec<[TinyString; 64]> -+ = s.replace(beg.as_str(), "").replace(")", "") -+ .split(",") -+ .map(|v| TinyString::from(v.trim()).unwrap()) -+ .collect(); -+ assert_eq!(s.len(), $id::lanes()); -+ for (index, ss) in s.into_iter().enumerate() { -+ let mut e = TinyString::new(); -+ write!(&mut e, "{:#X}", v.extract(index)).unwrap(); -+ assert_eq!(ss, e); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/from.rs b/third_party/rust/packed_simd/src/api/from.rs -new file mode 100644 -index 000000000000..c30c4d6e216d ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/from.rs -@@ -0,0 +1,7 @@ -+//! Implementations of the `From` and `Into` traits -+ -+#[macro_use] -+mod from_array; -+ -+#[macro_use] -+mod from_vector; -diff --git a/third_party/rust/packed_simd/src/api/from/from_array.rs b/third_party/rust/packed_simd/src/api/from/from_array.rs -new file mode 100644 -index 000000000000..964d1501df6a ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/from/from_array.rs -@@ -0,0 +1,121 @@ -+//! Implements `From<[T; N]>` and `Into<[T; N]>` for vector types. -+ -+macro_rules! impl_from_array { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt -+ | ($non_default_array:expr, $non_default_vec:expr)) => { -+ impl From<[$elem_ty; $elem_count]> for $id { -+ #[inline] -+ fn from(array: [$elem_ty; $elem_count]) -> Self { -+ union U { -+ array: [$elem_ty; $elem_count], -+ vec: $id, -+ } -+ unsafe { U { array }.vec } -+ } -+ } -+ -+ impl From<$id> for [$elem_ty; $elem_count] { -+ #[inline] -+ fn from(vec: $id) -> Self { -+ union U { -+ array: [$elem_ty; $elem_count], -+ vec: $id, -+ } -+ unsafe { U { vec }.array } -+ } -+ } -+ -+ // FIXME: `Into::into` is not inline, but due to -+ // the blanket impl in `std`, which is not -+ // marked `default`, we cannot override it here with -+ // specialization. -+ /* -+ impl Into<[$elem_ty; $elem_count]> for $id { -+ #[inline] -+ fn into(self) -> [$elem_ty; $elem_count] { -+ union U { -+ array: [$elem_ty; $elem_count], -+ vec: $id, -+ } -+ unsafe { U { vec: self }.array } -+ } -+ } -+ -+ impl Into<$id> for [$elem_ty; $elem_count] { -+ #[inline] -+ fn into(self) -> $id { -+ union U { -+ array: [$elem_ty; $elem_count], -+ vec: $id, -+ } -+ unsafe { U { array: self }.vec } -+ } -+ } -+ */ -+ -+ test_if! { -+ $test_tt: -+ paste::item! { -+ mod [<$id _from>] { -+ use super::*; -+ #[test] -+ fn array() { -+ let vec: $id = Default::default(); -+ -+ // FIXME: Workaround for arrays with more than 32 -+ // elements. -+ // -+ // Safe because we never take a reference to any -+ // uninitialized element. -+ union W { -+ array: [$elem_ty; $elem_count], -+ other: () -+ } -+ let mut array = W { other: () }; -+ for i in 0..$elem_count { -+ let default: $elem_ty = Default::default(); -+ // note: array.other is the active member and -+ // initialized so we can take a reference to it: -+ let p = unsafe { -+ &mut array.other as *mut () as *mut $elem_ty -+ }; -+ // note: default is a valid bit-pattern for -+ // $elem_ty: -+ unsafe { -+ crate::ptr::write(p.wrapping_add(i), default) -+ }; -+ } -+ // note: the array variant of the union is properly -+ // initialized: -+ let mut array = unsafe { -+ array.array -+ }; -+ -+ array[0] = $non_default_array; -+ let vec = vec.replace(0, $non_default_vec); -+ -+ let vec_from_array = $id::from(array); -+ assert_eq!(vec_from_array, vec); -+ let array_from_vec -+ = <[$elem_ty; $elem_count]>::from(vec); -+ // FIXME: Workaround for arrays with more than 32 -+ // elements. -+ for i in 0..$elem_count { -+ assert_eq!(array_from_vec[i], array[i]); -+ } -+ -+ let vec_from_into_array: $id = array.into(); -+ assert_eq!(vec_from_into_array, vec); -+ let array_from_into_vec: [$elem_ty; $elem_count] -+ = vec.into(); -+ // FIXME: Workaround for arrays with more than 32 -+ // elements. -+ for i in 0..$elem_count { -+ assert_eq!(array_from_into_vec[i], array[i]); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/from/from_vector.rs b/third_party/rust/packed_simd/src/api/from/from_vector.rs -new file mode 100644 -index 000000000000..55f70016d51d ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/from/from_vector.rs -@@ -0,0 +1,67 @@ -+//! Implements `From` and `Into` for vector types. -+ -+macro_rules! impl_from_vector { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt -+ | $source:ident) => { -+ impl From<$source> for $id { -+ #[inline] -+ fn from(source: $source) -> Self { -+ fn static_assert_same_number_of_lanes() -+ where -+ T: crate::sealed::Simd, -+ U: crate::sealed::Simd, -+ { -+ } -+ use crate::llvm::simd_cast; -+ static_assert_same_number_of_lanes::<$id, $source>(); -+ Simd(unsafe { simd_cast(source.0) }) -+ } -+ } -+ -+ // FIXME: `Into::into` is not inline, but due to the blanket impl in -+ // `std`, which is not marked `default`, we cannot override it here -+ // with specialization. -+ -+ /* -+ impl Into<$id> for $source { -+ #[inline] -+ fn into(self) -> $id { -+ unsafe { simd_cast(self) } -+ } -+ } -+ */ -+ -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _from_ $source>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn from() { -+ assert_eq!($id::lanes(), $source::lanes()); -+ let source: $source = Default::default(); -+ let vec: $id = Default::default(); -+ -+ let e = $id::from(source); -+ assert_eq!(e, vec); -+ -+ let e: $id = source.into(); -+ assert_eq!(e, vec); -+ } -+ } -+ } -+ } -+ }; -+} -+ -+macro_rules! impl_from_vectors { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt -+ | $($source:ident),*) => { -+ $( -+ impl_from_vector!( -+ [$elem_ty; $elem_count]: $id | $test_tt | $source -+ ); -+ )* -+ } -+} -diff --git a/third_party/rust/packed_simd/src/api/hash.rs b/third_party/rust/packed_simd/src/api/hash.rs -new file mode 100644 -index 000000000000..08d42496ea8b ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/hash.rs -@@ -0,0 +1,47 @@ -+//! Implements `Hash` for vector types. -+ -+macro_rules! impl_hash { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl crate::hash::Hash for $id { -+ #[inline] -+ fn hash(&self, state: &mut H) { -+ unsafe { -+ union A { -+ data: [$elem_ty; $id::lanes()], -+ vec: $id, -+ } -+ A { vec: *self }.data.hash(state) -+ } -+ } -+ } -+ -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _hash>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn hash() { -+ use crate::hash::{Hash, Hasher}; -+ #[allow(deprecated)] -+ use crate::hash::{SipHasher13}; -+ type A = [$elem_ty; $id::lanes()]; -+ let a: A = [42 as $elem_ty; $id::lanes()]; -+ assert_eq!( -+ crate::mem::size_of::(), -+ crate::mem::size_of::<$id>() -+ ); -+ #[allow(deprecated)] -+ let mut a_hash = SipHasher13::new(); -+ let mut v_hash = a_hash.clone(); -+ a.hash(&mut a_hash); -+ -+ let v = $id::splat(42 as $elem_ty); -+ v.hash(&mut v_hash); -+ assert_eq!(a_hash.finish(), v_hash.finish()); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/into_bits.rs b/third_party/rust/packed_simd/src/api/into_bits.rs -new file mode 100644 -index 000000000000..f2cc1bae5397 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/into_bits.rs -@@ -0,0 +1,59 @@ -+//! Implementation of `FromBits` and `IntoBits`. -+ -+/// Safe lossless bitwise conversion from `T` to `Self`. -+pub trait FromBits: crate::marker::Sized { -+ /// Safe lossless bitwise transmute from `T` to `Self`. -+ fn from_bits(t: T) -> Self; -+} -+ -+/// Safe lossless bitwise conversion from `Self` to `T`. -+pub trait IntoBits: crate::marker::Sized { -+ /// Safe lossless bitwise transmute from `self` to `T`. -+ fn into_bits(self) -> T; -+} -+ -+/// `FromBits` implies `IntoBits`. -+impl IntoBits for T -+where -+ U: FromBits, -+{ -+ #[inline] -+ fn into_bits(self) -> U { -+ debug_assert!( -+ crate::mem::size_of::() == crate::mem::size_of::() -+ ); -+ U::from_bits(self) -+ } -+} -+ -+/// `FromBits` and `IntoBits` are reflexive -+impl FromBits for T { -+ #[inline] -+ fn from_bits(t: Self) -> Self { -+ t -+ } -+} -+ -+#[macro_use] -+mod macros; -+ -+mod v16; -+pub use self::v16::*; -+ -+mod v32; -+pub use self::v32::*; -+ -+mod v64; -+pub use self::v64::*; -+ -+mod v128; -+pub use self::v128::*; -+ -+mod v256; -+pub use self::v256::*; -+ -+mod v512; -+pub use self::v512::*; -+ -+mod arch_specific; -+pub use self::arch_specific::*; -diff --git a/third_party/rust/packed_simd/src/api/into_bits/arch_specific.rs b/third_party/rust/packed_simd/src/api/into_bits/arch_specific.rs -new file mode 100644 -index 000000000000..6cc2fa37b728 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/into_bits/arch_specific.rs -@@ -0,0 +1,190 @@ -+//! `FromBits` and `IntoBits` between portable vector types and the -+//! architecture-specific vector types. -+#![rustfmt::skip] -+ -+// FIXME: MIPS FromBits/IntoBits -+ -+#[allow(unused)] -+use crate::*; -+ -+/// This macro implements FromBits for the portable and the architecture -+/// specific vector types. -+/// -+/// The "leaf" case is at the bottom, and the most generic case is at the top. -+/// The generic case is split into smaller cases recursively. -+macro_rules! impl_arch { -+ ([$arch_head_i:ident[$arch_head_tt:tt]: $($arch_head_ty:ident),*], -+ $([$arch_tail_i:ident[$arch_tail_tt:tt]: $($arch_tail_ty:ident),*]),* | -+ from: $($from_ty:ident),* | into: $($into_ty:ident),* | -+ test: $test_tt:tt) => { -+ impl_arch!( -+ [$arch_head_i[$arch_head_tt]: $($arch_head_ty),*] | -+ from: $($from_ty),* | -+ into: $($into_ty),* | -+ test: $test_tt -+ ); -+ impl_arch!( -+ $([$arch_tail_i[$arch_tail_tt]: $($arch_tail_ty),*]),* | -+ from: $($from_ty),* | -+ into: $($into_ty),* | -+ test: $test_tt -+ ); -+ }; -+ ([$arch:ident[$arch_tt:tt]: $($arch_ty:ident),*] | -+ from: $($from_ty:ident),* | into: $($into_ty:ident),* | -+ test: $test_tt:tt) => { -+ // note: if target is "arm", "+v7,+neon" must be enabled -+ // and the std library must be recompiled with them -+ #[cfg(any( -+ not(target_arch = "arm"), -+ all(target_feature = "v7", target_feature = "neon", -+ any(feature = "core_arch", libcore_neon))) -+ )] -+ // note: if target is "powerpc", "altivec" must be enabled -+ // and the std library must be recompiled with it -+ #[cfg(any( -+ not(target_arch = "powerpc"), -+ all(target_feature = "altivec", feature = "core_arch"), -+ ))] -+ #[cfg(target_arch = $arch_tt)] -+ use crate::arch::$arch::{ -+ $($arch_ty),* -+ }; -+ -+ #[cfg(any( -+ not(target_arch = "arm"), -+ all(target_feature = "v7", target_feature = "neon", -+ any(feature = "core_arch", libcore_neon))) -+ )] -+ #[cfg(any( -+ not(target_arch = "powerpc"), -+ all(target_feature = "altivec", feature = "core_arch"), -+ ))] -+ #[cfg(target_arch = $arch_tt)] -+ impl_arch!($($arch_ty),* | $($from_ty),* | $($into_ty),* | -+ test: $test_tt); -+ }; -+ ($arch_head:ident, $($arch_tail:ident),* | $($from_ty:ident),* -+ | $($into_ty:ident),* | test: $test_tt:tt) => { -+ impl_arch!($arch_head | $($from_ty),* | $($into_ty),* | -+ test: $test_tt); -+ impl_arch!($($arch_tail),* | $($from_ty),* | $($into_ty),* | -+ test: $test_tt); -+ }; -+ ($arch_head:ident | $($from_ty:ident),* | $($into_ty:ident),* | -+ test: $test_tt:tt) => { -+ impl_from_bits!($arch_head[$test_tt]: $($from_ty),*); -+ impl_into_bits!($arch_head[$test_tt]: $($into_ty),*); -+ }; -+} -+ -+//////////////////////////////////////////////////////////////////////////////// -+// Implementations for the 64-bit wide vector types: -+ -+// FIXME: 64-bit single element types -+// FIXME: arm/aarch float16x4_t missing -+impl_arch!( -+ [x86["x86"]: __m64], [x86_64["x86_64"]: __m64], -+ [arm["arm"]: int8x8_t, uint8x8_t, poly8x8_t, int16x4_t, uint16x4_t, -+ poly16x4_t, int32x2_t, uint32x2_t, float32x2_t, int64x1_t, -+ uint64x1_t], -+ [aarch64["aarch64"]: int8x8_t, uint8x8_t, poly8x8_t, int16x4_t, uint16x4_t, -+ poly16x4_t, int32x2_t, uint32x2_t, float32x2_t, int64x1_t, uint64x1_t, -+ float64x1_t] | -+ from: i8x8, u8x8, m8x8, i16x4, u16x4, m16x4, i32x2, u32x2, f32x2, m32x2 | -+ into: i8x8, u8x8, i16x4, u16x4, i32x2, u32x2, f32x2 | -+ test: test_v64 -+); -+ -+//////////////////////////////////////////////////////////////////////////////// -+// Implementations for the 128-bit wide vector types: -+ -+// FIXME: arm/aarch float16x8_t missing -+// FIXME: ppc vector_pixel missing -+// FIXME: ppc64 vector_Float16 missing -+// FIXME: ppc64 vector_signed_long_long missing -+// FIXME: ppc64 vector_unsigned_long_long missing -+// FIXME: ppc64 vector_bool_long_long missing -+// FIXME: ppc64 vector_signed___int128 missing -+// FIXME: ppc64 vector_unsigned___int128 missing -+impl_arch!( -+ [x86["x86"]: __m128, __m128i, __m128d], -+ [x86_64["x86_64"]: __m128, __m128i, __m128d], -+ [arm["arm"]: int8x16_t, uint8x16_t, poly8x16_t, int16x8_t, uint16x8_t, -+ poly16x8_t, int32x4_t, uint32x4_t, float32x4_t, int64x2_t, uint64x2_t], -+ [aarch64["aarch64"]: int8x16_t, uint8x16_t, poly8x16_t, int16x8_t, -+ uint16x8_t, poly16x8_t, int32x4_t, uint32x4_t, float32x4_t, int64x2_t, -+ uint64x2_t, float64x2_t], -+ [powerpc["powerpc"]: vector_signed_char, vector_unsigned_char, -+ vector_signed_short, vector_unsigned_short, vector_signed_int, -+ vector_unsigned_int, vector_float], -+ [powerpc64["powerpc64"]: vector_signed_char, vector_unsigned_char, -+ vector_signed_short, vector_unsigned_short, vector_signed_int, -+ vector_unsigned_int, vector_float, vector_signed_long, -+ vector_unsigned_long, vector_double] | -+ from: i8x16, u8x16, m8x16, i16x8, u16x8, m16x8, i32x4, u32x4, f32x4, m32x4, -+ i64x2, u64x2, f64x2, m64x2, i128x1, u128x1, m128x1 | -+ into: i8x16, u8x16, i16x8, u16x8, i32x4, u32x4, f32x4, i64x2, u64x2, f64x2, -+ i128x1, u128x1 | -+ test: test_v128 -+); -+ -+impl_arch!( -+ [powerpc["powerpc"]: vector_bool_char], -+ [powerpc64["powerpc64"]: vector_bool_char] | -+ from: m8x16, m16x8, m32x4, m64x2, m128x1 | -+ into: i8x16, u8x16, i16x8, u16x8, i32x4, u32x4, f32x4, -+ i64x2, u64x2, f64x2, i128x1, u128x1, -+ // Masks: -+ m8x16 | -+ test: test_v128 -+); -+ -+impl_arch!( -+ [powerpc["powerpc"]: vector_bool_short], -+ [powerpc64["powerpc64"]: vector_bool_short] | -+ from: m16x8, m32x4, m64x2, m128x1 | -+ into: i8x16, u8x16, i16x8, u16x8, i32x4, u32x4, f32x4, -+ i64x2, u64x2, f64x2, i128x1, u128x1, -+ // Masks: -+ m8x16, m16x8 | -+ test: test_v128 -+); -+ -+impl_arch!( -+ [powerpc["powerpc"]: vector_bool_int], -+ [powerpc64["powerpc64"]: vector_bool_int] | -+ from: m32x4, m64x2, m128x1 | -+ into: i8x16, u8x16, i16x8, u16x8, i32x4, u32x4, f32x4, -+ i64x2, u64x2, f64x2, i128x1, u128x1, -+ // Masks: -+ m8x16, m16x8, m32x4 | -+ test: test_v128 -+); -+ -+impl_arch!( -+ [powerpc64["powerpc64"]: vector_bool_long] | -+ from: m64x2, m128x1 | -+ into: i8x16, u8x16, i16x8, u16x8, i32x4, u32x4, f32x4, -+ i64x2, u64x2, f64x2, i128x1, u128x1, -+ // Masks: -+ m8x16, m16x8, m32x4, m64x2 | -+ test: test_v128 -+); -+ -+//////////////////////////////////////////////////////////////////////////////// -+// Implementations for the 256-bit wide vector types -+ -+impl_arch!( -+ [x86["x86"]: __m256, __m256i, __m256d], -+ [x86_64["x86_64"]: __m256, __m256i, __m256d] | -+ from: i8x32, u8x32, m8x32, i16x16, u16x16, m16x16, -+ i32x8, u32x8, f32x8, m32x8, -+ i64x4, u64x4, f64x4, m64x4, i128x2, u128x2, m128x2 | -+ into: i8x32, u8x32, i16x16, u16x16, i32x8, u32x8, f32x8, -+ i64x4, u64x4, f64x4, i128x2, u128x2 | -+ test: test_v256 -+); -+ -+//////////////////////////////////////////////////////////////////////////////// -+// FIXME: Implementations for the 512-bit wide vector types -diff --git a/third_party/rust/packed_simd/src/api/into_bits/macros.rs b/third_party/rust/packed_simd/src/api/into_bits/macros.rs -new file mode 100644 -index 000000000000..8cec5b00479f ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/into_bits/macros.rs -@@ -0,0 +1,74 @@ -+//! Macros implementing `FromBits` -+ -+macro_rules! impl_from_bits_ { -+ ($id:ident[$test_tt:tt]: $from_ty:ident) => { -+ impl crate::api::into_bits::FromBits<$from_ty> for $id { -+ #[inline] -+ fn from_bits(x: $from_ty) -> Self { -+ unsafe { crate::mem::transmute(x) } -+ } -+ } -+ -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _from_bits_ $from_ty>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn test() { -+ use crate::{ -+ ptr::{read_unaligned}, -+ mem::{size_of, zeroed} -+ }; -+ use crate::IntoBits; -+ assert_eq!(size_of::<$id>(), -+ size_of::<$from_ty>()); -+ // This is safe becasue we never create a reference to -+ // uninitialized memory: -+ let a: $from_ty = unsafe { zeroed() }; -+ -+ let b_0: $id = crate::FromBits::from_bits(a); -+ let b_1: $id = a.into_bits(); -+ -+ // Check that these are byte-wise equal, that is, -+ // that the bit patterns are identical: -+ for i in 0..size_of::<$id>() { -+ // This is safe because we only read initialized -+ // memory in bounds. Also, taking a reference to -+ // `b_i` is ok because the fields are initialized. -+ unsafe { -+ let b_0_v: u8 = read_unaligned( -+ (&b_0 as *const $id as *const u8) -+ .wrapping_add(i) -+ ); -+ let b_1_v: u8 = read_unaligned( -+ (&b_1 as *const $id as *const u8) -+ .wrapping_add(i) -+ ); -+ assert_eq!(b_0_v, b_1_v); -+ } -+ } -+ } -+ } -+ } -+ } -+ }; -+} -+ -+macro_rules! impl_from_bits { -+ ($id:ident[$test_tt:tt]: $($from_ty:ident),*) => { -+ $( -+ impl_from_bits_!($id[$test_tt]: $from_ty); -+ )* -+ } -+} -+ -+#[allow(unused)] -+macro_rules! impl_into_bits { -+ ($id:ident[$test_tt:tt]: $($from_ty:ident),*) => { -+ $( -+ impl_from_bits_!($from_ty[$test_tt]: $id); -+ )* -+ } -+} -diff --git a/third_party/rust/packed_simd/src/api/into_bits/v128.rs b/third_party/rust/packed_simd/src/api/into_bits/v128.rs -new file mode 100644 -index 000000000000..804dbf282d53 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/into_bits/v128.rs -@@ -0,0 +1,28 @@ -+//! `FromBits` and `IntoBits` implementations for portable 128-bit wide vectors -+#![rustfmt::skip] -+ -+#[allow(unused)] // wasm_bindgen_test -+use crate::*; -+ -+impl_from_bits!(i8x16[test_v128]: u8x16, m8x16, i16x8, u16x8, m16x8, i32x4, u32x4, f32x4, m32x4, i64x2, u64x2, f64x2, m64x2, i128x1, u128x1, m128x1); -+impl_from_bits!(u8x16[test_v128]: i8x16, m8x16, i16x8, u16x8, m16x8, i32x4, u32x4, f32x4, m32x4, i64x2, u64x2, f64x2, m64x2, i128x1, u128x1, m128x1); -+impl_from_bits!(m8x16[test_v128]: m16x8, m32x4, m64x2, m128x1); -+ -+impl_from_bits!(i16x8[test_v128]: i8x16, u8x16, m8x16, u16x8, m16x8, i32x4, u32x4, f32x4, m32x4, i64x2, u64x2, f64x2, m64x2, i128x1, u128x1, m128x1); -+impl_from_bits!(u16x8[test_v128]: i8x16, u8x16, m8x16, i16x8, m16x8, i32x4, u32x4, f32x4, m32x4, i64x2, u64x2, f64x2, m64x2, i128x1, u128x1, m128x1); -+impl_from_bits!(m16x8[test_v128]: m32x4, m64x2, m128x1); -+ -+impl_from_bits!(i32x4[test_v128]: i8x16, u8x16, m8x16, i16x8, u16x8, m16x8, u32x4, f32x4, m32x4, i64x2, u64x2, f64x2, m64x2, i128x1, u128x1, m128x1); -+impl_from_bits!(u32x4[test_v128]: i8x16, u8x16, m8x16, i16x8, u16x8, m16x8, i32x4, f32x4, m32x4, i64x2, u64x2, f64x2, m64x2, i128x1, u128x1, m128x1); -+impl_from_bits!(f32x4[test_v128]: i8x16, u8x16, m8x16, i16x8, u16x8, m16x8, i32x4, u32x4, m32x4, i64x2, u64x2, f64x2, m64x2, i128x1, u128x1, m128x1); -+impl_from_bits!(m32x4[test_v128]: m64x2, m128x1); -+ -+impl_from_bits!(i64x2[test_v128]: i8x16, u8x16, m8x16, i16x8, u16x8, m16x8, i32x4, u32x4, f32x4, m32x4, u64x2, f64x2, m64x2, i128x1, u128x1, m128x1); -+impl_from_bits!(u64x2[test_v128]: i8x16, u8x16, m8x16, i16x8, u16x8, m16x8, i32x4, u32x4, f32x4, m32x4, i64x2, f64x2, m64x2, i128x1, u128x1, m128x1); -+impl_from_bits!(f64x2[test_v128]: i8x16, u8x16, m8x16, i16x8, u16x8, m16x8, i32x4, u32x4, f32x4, m32x4, i64x2, u64x2, m64x2, i128x1, u128x1, m128x1); -+impl_from_bits!(m64x2[test_v128]: m128x1); -+ -+impl_from_bits!(i128x1[test_v128]: i8x16, u8x16, m8x16, i16x8, u16x8, m16x8, i32x4, u32x4, f32x4, m32x4, i64x2, u64x2, f64x2, m64x2, u128x1, m128x1); -+impl_from_bits!(u128x1[test_v128]: i8x16, u8x16, m8x16, i16x8, u16x8, m16x8, i32x4, u32x4, f32x4, m32x4, i64x2, u64x2, f64x2, m64x2, i128x1, m128x1); -+// note: m128x1 cannot be constructed from all the other masks bit patterns in here -+ -diff --git a/third_party/rust/packed_simd/src/api/into_bits/v16.rs b/third_party/rust/packed_simd/src/api/into_bits/v16.rs -new file mode 100644 -index 000000000000..1162a62e5bd1 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/into_bits/v16.rs -@@ -0,0 +1,9 @@ -+//! `FromBits` and `IntoBits` implementations for portable 16-bit wide vectors -+#![rustfmt::skip] -+ -+#[allow(unused)] // wasm_bindgen_test -+use crate::*; -+ -+impl_from_bits!(i8x2[test_v16]: u8x2, m8x2); -+impl_from_bits!(u8x2[test_v16]: i8x2, m8x2); -+// note: m8x2 cannot be constructed from all i8x2 or u8x2 bit patterns -diff --git a/third_party/rust/packed_simd/src/api/into_bits/v256.rs b/third_party/rust/packed_simd/src/api/into_bits/v256.rs -new file mode 100644 -index 000000000000..cc7a6646b535 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/into_bits/v256.rs -@@ -0,0 +1,27 @@ -+//! `FromBits` and `IntoBits` implementations for portable 256-bit wide vectors -+#![rustfmt::skip] -+ -+#[allow(unused)] // wasm_bindgen_test -+use crate::*; -+ -+impl_from_bits!(i8x32[test_v256]: u8x32, m8x32, i16x16, u16x16, m16x16, i32x8, u32x8, f32x8, m32x8, i64x4, u64x4, f64x4, m64x4, i128x2, u128x2, m128x2); -+impl_from_bits!(u8x32[test_v256]: i8x32, m8x32, i16x16, u16x16, m16x16, i32x8, u32x8, f32x8, m32x8, i64x4, u64x4, f64x4, m64x4, i128x2, u128x2, m128x2); -+impl_from_bits!(m8x32[test_v256]: m16x16, m32x8, m64x4, m128x2); -+ -+impl_from_bits!(i16x16[test_v256]: i8x32, u8x32, m8x32, u16x16, m16x16, i32x8, u32x8, f32x8, m32x8, i64x4, u64x4, f64x4, m64x4, i128x2, u128x2, m128x2); -+impl_from_bits!(u16x16[test_v256]: i8x32, u8x32, m8x32, i16x16, m16x16, i32x8, u32x8, f32x8, m32x8, i64x4, u64x4, f64x4, m64x4, i128x2, u128x2, m128x2); -+impl_from_bits!(m16x16[test_v256]: m32x8, m64x4, m128x2); -+ -+impl_from_bits!(i32x8[test_v256]: i8x32, u8x32, m8x32, i16x16, u16x16, m16x16, u32x8, f32x8, m32x8, i64x4, u64x4, f64x4, m64x4, i128x2, u128x2, m128x2); -+impl_from_bits!(u32x8[test_v256]: i8x32, u8x32, m8x32, i16x16, u16x16, m16x16, i32x8, f32x8, m32x8, i64x4, u64x4, f64x4, m64x4, i128x2, u128x2, m128x2); -+impl_from_bits!(f32x8[test_v256]: i8x32, u8x32, m8x32, i16x16, u16x16, m16x16, i32x8, u32x8, m32x8, i64x4, u64x4, f64x4, m64x4, i128x2, u128x2, m128x2); -+impl_from_bits!(m32x8[test_v256]: m64x4, m128x2); -+ -+impl_from_bits!(i64x4[test_v256]: i8x32, u8x32, m8x32, i16x16, u16x16, m16x16, i32x8, u32x8, f32x8, m32x8, u64x4, f64x4, m64x4, i128x2, u128x2, m128x2); -+impl_from_bits!(u64x4[test_v256]: i8x32, u8x32, m8x32, i16x16, u16x16, m16x16, i32x8, u32x8, f32x8, m32x8, i64x4, f64x4, m64x4, i128x2, u128x2, m128x2); -+impl_from_bits!(f64x4[test_v256]: i8x32, u8x32, m8x32, i16x16, u16x16, m16x16, i32x8, u32x8, f32x8, m32x8, i64x4, u64x4, m64x4, i128x2, u128x2, m128x2); -+impl_from_bits!(m64x4[test_v256]: m128x2); -+ -+impl_from_bits!(i128x2[test_v256]: i8x32, u8x32, m8x32, i16x16, u16x16, m16x16, i32x8, u32x8, f32x8, m32x8, i64x4, u64x4, f64x4, m64x4, u128x2, m128x2); -+impl_from_bits!(u128x2[test_v256]: i8x32, u8x32, m8x32, i16x16, u16x16, m16x16, i32x8, u32x8, f32x8, m32x8, i64x4, u64x4, f64x4, m64x4, i128x2, m128x2); -+// note: m128x2 cannot be constructed from all the other masks bit patterns in here -diff --git a/third_party/rust/packed_simd/src/api/into_bits/v32.rs b/third_party/rust/packed_simd/src/api/into_bits/v32.rs -new file mode 100644 -index 000000000000..2c183ecf1c77 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/into_bits/v32.rs -@@ -0,0 +1,13 @@ -+//! `FromBits` and `IntoBits` implementations for portable 32-bit wide vectors -+#![rustfmt::skip] -+ -+#[allow(unused)] // wasm_bindgen_test -+use crate::*; -+ -+impl_from_bits!(i8x4[test_v32]: u8x4, m8x4, i16x2, u16x2, m16x2); -+impl_from_bits!(u8x4[test_v32]: i8x4, m8x4, i16x2, u16x2, m16x2); -+impl_from_bits!(m8x4[test_v32]: m16x2); -+ -+impl_from_bits!(i16x2[test_v32]: i8x4, u8x4, m8x4, u16x2, m16x2); -+impl_from_bits!(u16x2[test_v32]: i8x4, u8x4, m8x4, i16x2, m16x2); -+// note: m16x2 cannot be constructed from all m8x4 bit patterns -diff --git a/third_party/rust/packed_simd/src/api/into_bits/v512.rs b/third_party/rust/packed_simd/src/api/into_bits/v512.rs -new file mode 100644 -index 000000000000..8dec6a7f63a0 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/into_bits/v512.rs -@@ -0,0 +1,27 @@ -+//! `FromBits` and `IntoBits` implementations for portable 512-bit wide vectors -+#![rustfmt::skip] -+ -+#[allow(unused)] // wasm_bindgen_test -+use crate::*; -+ -+impl_from_bits!(i8x64[test_v512]: u8x64, m8x64, i16x32, u16x32, m16x32, i32x16, u32x16, f32x16, m32x16, i64x8, u64x8, f64x8, m64x8, i128x4, u128x4, m128x4); -+impl_from_bits!(u8x64[test_v512]: i8x64, m8x64, i16x32, u16x32, m16x32, i32x16, u32x16, f32x16, m32x16, i64x8, u64x8, f64x8, m64x8, i128x4, u128x4, m128x4); -+impl_from_bits!(m8x64[test_v512]: m16x32, m32x16, m64x8, m128x4); -+ -+impl_from_bits!(i16x32[test_v512]: i8x64, u8x64, m8x64, u16x32, m16x32, i32x16, u32x16, f32x16, m32x16, i64x8, u64x8, f64x8, m64x8, i128x4, u128x4, m128x4); -+impl_from_bits!(u16x32[test_v512]: i8x64, u8x64, m8x64, i16x32, m16x32, i32x16, u32x16, f32x16, m32x16, i64x8, u64x8, f64x8, m64x8, i128x4, u128x4, m128x4); -+impl_from_bits!(m16x32[test_v512]: m32x16, m64x8, m128x4); -+ -+impl_from_bits!(i32x16[test_v512]: i8x64, u8x64, m8x64, i16x32, u16x32, m16x32, u32x16, f32x16, m32x16, i64x8, u64x8, f64x8, m64x8, i128x4, u128x4, m128x4); -+impl_from_bits!(u32x16[test_v512]: i8x64, u8x64, m8x64, i16x32, u16x32, m16x32, i32x16, f32x16, m32x16, i64x8, u64x8, f64x8, m64x8, i128x4, u128x4, m128x4); -+impl_from_bits!(f32x16[test_v512]: i8x64, u8x64, m8x64, i16x32, u16x32, m16x32, i32x16, u32x16, m32x16, i64x8, u64x8, f64x8, m64x8, i128x4, u128x4, m128x4); -+impl_from_bits!(m32x16[test_v512]: m64x8, m128x4); -+ -+impl_from_bits!(i64x8[test_v512]: i8x64, u8x64, m8x64, i16x32, u16x32, m16x32, i32x16, u32x16, f32x16, m32x16, u64x8, f64x8, m64x8, i128x4, u128x4, m128x4); -+impl_from_bits!(u64x8[test_v512]: i8x64, u8x64, m8x64, i16x32, u16x32, m16x32, i32x16, u32x16, f32x16, m32x16, i64x8, f64x8, m64x8, i128x4, u128x4, m128x4); -+impl_from_bits!(f64x8[test_v512]: i8x64, u8x64, m8x64, i16x32, u16x32, m16x32, i32x16, u32x16, f32x16, m32x16, i64x8, u64x8, m64x8, i128x4, u128x4, m128x4); -+impl_from_bits!(m64x8[test_v512]: m128x4); -+ -+impl_from_bits!(i128x4[test_v512]: i8x64, u8x64, m8x64, i16x32, u16x32, m16x32, i32x16, u32x16, f32x16, m32x16, i64x8, u64x8, f64x8, m64x8, u128x4, m128x4); -+impl_from_bits!(u128x4[test_v512]: i8x64, u8x64, m8x64, i16x32, u16x32, m16x32, i32x16, u32x16, f32x16, m32x16, i64x8, u64x8, f64x8, m64x8, i128x4, m128x4); -+// note: m128x4 cannot be constructed from all the other masks bit patterns in here -diff --git a/third_party/rust/packed_simd/src/api/into_bits/v64.rs b/third_party/rust/packed_simd/src/api/into_bits/v64.rs -new file mode 100644 -index 000000000000..8999d98e13f8 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/into_bits/v64.rs -@@ -0,0 +1,18 @@ -+//! `FromBits` and `IntoBits` implementations for portable 64-bit wide vectors -+#![rustfmt::skip] -+ -+#[allow(unused)] // wasm_bindgen_test -+use crate::*; -+ -+impl_from_bits!(i8x8[test_v64]: u8x8, m8x8, i16x4, u16x4, m16x4, i32x2, u32x2, f32x2, m32x2); -+impl_from_bits!(u8x8[test_v64]: i8x8, m8x8, i16x4, u16x4, m16x4, i32x2, u32x2, f32x2, m32x2); -+impl_from_bits!(m8x8[test_v64]: m16x4, m32x2); -+ -+impl_from_bits!(i16x4[test_v64]: i8x8, u8x8, m8x8, u16x4, m16x4, i32x2, u32x2, f32x2, m32x2); -+impl_from_bits!(u16x4[test_v64]: i8x8, u8x8, m8x8, i16x4, m16x4, i32x2, u32x2, f32x2, m32x2); -+impl_from_bits!(m16x4[test_v64]: m32x2); -+ -+impl_from_bits!(i32x2[test_v64]: i8x8, u8x8, m8x8, i16x4, u16x4, m16x4, u32x2, f32x2, m32x2); -+impl_from_bits!(u32x2[test_v64]: i8x8, u8x8, m8x8, i16x4, u16x4, m16x4, i32x2, f32x2, m32x2); -+impl_from_bits!(f32x2[test_v64]: i8x8, u8x8, m8x8, i16x4, u16x4, m16x4, i32x2, u32x2, m32x2); -+// note: m32x2 cannot be constructed from all m16x4 or m8x8 bit patterns -diff --git a/third_party/rust/packed_simd/src/api/math.rs b/third_party/rust/packed_simd/src/api/math.rs -new file mode 100644 -index 000000000000..e7a8d256baf5 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/math.rs -@@ -0,0 +1,4 @@ -+//! Implements vertical math operations -+ -+#[macro_use] -+mod float; -diff --git a/third_party/rust/packed_simd/src/api/math/float.rs b/third_party/rust/packed_simd/src/api/math/float.rs -new file mode 100644 -index 000000000000..c0ec46e91789 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/math/float.rs -@@ -0,0 +1,61 @@ -+//! Implements vertical floating-point math operations. -+ -+#[macro_use] -+mod abs; -+ -+#[macro_use] -+mod consts; -+ -+#[macro_use] -+mod cos; -+ -+#[macro_use] -+mod exp; -+ -+#[macro_use] -+mod powf; -+ -+#[macro_use] -+mod ln; -+ -+#[macro_use] -+mod mul_add; -+ -+#[macro_use] -+mod mul_adde; -+ -+#[macro_use] -+mod recpre; -+ -+#[macro_use] -+mod rsqrte; -+ -+#[macro_use] -+mod sin; -+ -+#[macro_use] -+mod sqrt; -+ -+#[macro_use] -+mod sqrte; -+ -+macro_rules! impl_float_category { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident, $mask_ty:ident) => { -+ impl $id { -+ #[inline] -+ pub fn is_nan(self) -> $mask_ty { -+ self.ne(self) -+ } -+ -+ #[inline] -+ pub fn is_infinite(self) -> $mask_ty { -+ self.eq(Self::INFINITY) | self.eq(Self::NEG_INFINITY) -+ } -+ -+ #[inline] -+ pub fn is_finite(self) -> $mask_ty { -+ !(self.is_nan() | self.is_infinite()) -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/math/float/abs.rs b/third_party/rust/packed_simd/src/api/math/float/abs.rs -new file mode 100644 -index 000000000000..1865bdb68ec6 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/math/float/abs.rs -@@ -0,0 +1,31 @@ -+//! Implements vertical (lane-wise) floating-point `abs`. -+ -+macro_rules! impl_math_float_abs { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Absolute value. -+ #[inline] -+ pub fn abs(self) -> Self { -+ use crate::codegen::math::float::abs::Abs; -+ Abs::abs(self) -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _math_abs>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn abs() { -+ let o = $id::splat(1 as $elem_ty); -+ assert_eq!(o, o.abs()); -+ -+ let mo = $id::splat(-1 as $elem_ty); -+ assert_eq!(o, mo.abs()); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/math/float/consts.rs b/third_party/rust/packed_simd/src/api/math/float/consts.rs -new file mode 100644 -index 000000000000..89f93a6d692b ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/math/float/consts.rs -@@ -0,0 +1,86 @@ -+macro_rules! impl_float_consts { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident) => { -+ impl $id { -+ /// Machine epsilon value. -+ pub const EPSILON: $id = $id::splat(core::$elem_ty::EPSILON); -+ -+ /// Smallest finite value. -+ pub const MIN: $id = $id::splat(core::$elem_ty::MIN); -+ -+ /// Smallest positive normal value. -+ pub const MIN_POSITIVE: $id = -+ $id::splat(core::$elem_ty::MIN_POSITIVE); -+ -+ /// Largest finite value. -+ pub const MAX: $id = $id::splat(core::$elem_ty::MAX); -+ -+ /// Not a Number (NaN). -+ pub const NAN: $id = $id::splat(core::$elem_ty::NAN); -+ -+ /// Infinity (∞). -+ pub const INFINITY: $id = $id::splat(core::$elem_ty::INFINITY); -+ -+ /// Negative infinity (-∞). -+ pub const NEG_INFINITY: $id = -+ $id::splat(core::$elem_ty::NEG_INFINITY); -+ -+ /// Archimedes' constant (π) -+ pub const PI: $id = $id::splat(core::$elem_ty::consts::PI); -+ -+ /// π/2 -+ pub const FRAC_PI_2: $id = -+ $id::splat(core::$elem_ty::consts::FRAC_PI_2); -+ -+ /// π/3 -+ pub const FRAC_PI_3: $id = -+ $id::splat(core::$elem_ty::consts::FRAC_PI_3); -+ -+ /// π/4 -+ pub const FRAC_PI_4: $id = -+ $id::splat(core::$elem_ty::consts::FRAC_PI_4); -+ -+ /// π/6 -+ pub const FRAC_PI_6: $id = -+ $id::splat(core::$elem_ty::consts::FRAC_PI_6); -+ -+ /// π/8 -+ pub const FRAC_PI_8: $id = -+ $id::splat(core::$elem_ty::consts::FRAC_PI_8); -+ -+ /// 1/π -+ pub const FRAC_1_PI: $id = -+ $id::splat(core::$elem_ty::consts::FRAC_1_PI); -+ -+ /// 2/π -+ pub const FRAC_2_PI: $id = -+ $id::splat(core::$elem_ty::consts::FRAC_2_PI); -+ -+ /// 2/sqrt(π) -+ pub const FRAC_2_SQRT_PI: $id = -+ $id::splat(core::$elem_ty::consts::FRAC_2_SQRT_PI); -+ -+ /// sqrt(2) -+ pub const SQRT_2: $id = $id::splat(core::$elem_ty::consts::SQRT_2); -+ -+ /// 1/sqrt(2) -+ pub const FRAC_1_SQRT_2: $id = -+ $id::splat(core::$elem_ty::consts::FRAC_1_SQRT_2); -+ -+ /// Euler's number (e) -+ pub const E: $id = $id::splat(core::$elem_ty::consts::E); -+ -+ /// log2(e) -+ pub const LOG2_E: $id = $id::splat(core::$elem_ty::consts::LOG2_E); -+ -+ /// log10(e) -+ pub const LOG10_E: $id = -+ $id::splat(core::$elem_ty::consts::LOG10_E); -+ -+ /// ln(2) -+ pub const LN_2: $id = $id::splat(core::$elem_ty::consts::LN_2); -+ -+ /// ln(10) -+ pub const LN_10: $id = $id::splat(core::$elem_ty::consts::LN_10); -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/math/float/cos.rs b/third_party/rust/packed_simd/src/api/math/float/cos.rs -new file mode 100644 -index 000000000000..e5b8f46036c7 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/math/float/cos.rs -@@ -0,0 +1,44 @@ -+//! Implements vertical (lane-wise) floating-point `cos`. -+ -+macro_rules! impl_math_float_cos { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Cosine. -+ #[inline] -+ pub fn cos(self) -> Self { -+ use crate::codegen::math::float::cos::Cos; -+ Cos::cos(self) -+ } -+ -+ /// Cosine of `self * PI`. -+ #[inline] -+ pub fn cos_pi(self) -> Self { -+ use crate::codegen::math::float::cos_pi::CosPi; -+ CosPi::cos_pi(self) -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _math_cos>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn cos() { -+ use crate::$elem_ty::consts::PI; -+ let z = $id::splat(0 as $elem_ty); -+ let o = $id::splat(1 as $elem_ty); -+ let p = $id::splat(PI as $elem_ty); -+ let ph = $id::splat(PI as $elem_ty / 2.); -+ let z_r = $id::splat((PI as $elem_ty / 2.).cos()); -+ let o_r = $id::splat((PI as $elem_ty).cos()); -+ -+ assert_eq!(o, z.cos()); -+ assert_eq!(z_r, ph.cos()); -+ assert_eq!(o_r, p.cos()); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/math/float/exp.rs b/third_party/rust/packed_simd/src/api/math/float/exp.rs -new file mode 100644 -index 000000000000..e3356d853a83 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/math/float/exp.rs -@@ -0,0 +1,33 @@ -+//! Implements vertical (lane-wise) floating-point `exp`. -+ -+macro_rules! impl_math_float_exp { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Returns the exponential function of `self`: `e^(self)`. -+ #[inline] -+ pub fn exp(self) -> Self { -+ use crate::codegen::math::float::exp::Exp; -+ Exp::exp(self) -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _math_exp>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn exp() { -+ let z = $id::splat(0 as $elem_ty); -+ let o = $id::splat(1 as $elem_ty); -+ assert_eq!(o, z.exp()); -+ -+ let e = $id::splat(crate::f64::consts::E as $elem_ty); -+ let tol = $id::splat(2.4e-4 as $elem_ty); -+ assert!((e - o.exp()).abs().le(tol).all()); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/math/float/ln.rs b/third_party/rust/packed_simd/src/api/math/float/ln.rs -new file mode 100644 -index 000000000000..5ceb9173ae05 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/math/float/ln.rs -@@ -0,0 +1,33 @@ -+//! Implements vertical (lane-wise) floating-point `ln`. -+ -+macro_rules! impl_math_float_ln { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Returns the natural logarithm of `self`. -+ #[inline] -+ pub fn ln(self) -> Self { -+ use crate::codegen::math::float::ln::Ln; -+ Ln::ln(self) -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _math_ln>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn ln() { -+ let z = $id::splat(0 as $elem_ty); -+ let o = $id::splat(1 as $elem_ty); -+ assert_eq!(z, o.ln()); -+ -+ let e = $id::splat(crate::f64::consts::E as $elem_ty); -+ let tol = $id::splat(2.4e-4 as $elem_ty); -+ assert!((o - e.ln()).abs().le(tol).all()); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/math/float/mul_add.rs b/third_party/rust/packed_simd/src/api/math/float/mul_add.rs -new file mode 100644 -index 000000000000..4b170ee2b755 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/math/float/mul_add.rs -@@ -0,0 +1,44 @@ -+//! Implements vertical (lane-wise) floating-point `mul_add`. -+ -+macro_rules! impl_math_float_mul_add { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Fused multiply add: `self * y + z` -+ #[inline] -+ pub fn mul_add(self, y: Self, z: Self) -> Self { -+ use crate::codegen::math::float::mul_add::MulAdd; -+ MulAdd::mul_add(self, y, z) -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _math_mul_add>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn mul_add() { -+ let z = $id::splat(0 as $elem_ty); -+ let o = $id::splat(1 as $elem_ty); -+ let t = $id::splat(2 as $elem_ty); -+ let t3 = $id::splat(3 as $elem_ty); -+ let f = $id::splat(4 as $elem_ty); -+ -+ assert_eq!(z, z.mul_add(z, z)); -+ assert_eq!(o, o.mul_add(o, z)); -+ assert_eq!(o, o.mul_add(z, o)); -+ assert_eq!(o, z.mul_add(o, o)); -+ -+ assert_eq!(t, o.mul_add(o, o)); -+ assert_eq!(t, o.mul_add(t, z)); -+ assert_eq!(t, t.mul_add(o, z)); -+ -+ assert_eq!(f, t.mul_add(t, z)); -+ assert_eq!(f, t.mul_add(o, t)); -+ assert_eq!(t3, t.mul_add(o, o)); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/math/float/mul_adde.rs b/third_party/rust/packed_simd/src/api/math/float/mul_adde.rs -new file mode 100644 -index 000000000000..c5b27110f2d7 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/math/float/mul_adde.rs -@@ -0,0 +1,48 @@ -+//! Implements vertical (lane-wise) floating-point `mul_adde`. -+ -+macro_rules! impl_math_float_mul_adde { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Fused multiply add estimate: ~= `self * y + z` -+ /// -+ /// While fused multiply-add (`fma`) has infinite precision, -+ /// `mul_adde` has _at worst_ the same precision of a multiply followed by an add. -+ /// This might be more efficient on architectures that do not have an `fma` instruction. -+ #[inline] -+ pub fn mul_adde(self, y: Self, z: Self) -> Self { -+ use crate::codegen::math::float::mul_adde::MulAddE; -+ MulAddE::mul_adde(self, y, z) -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _math_mul_adde>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn mul_adde() { -+ let z = $id::splat(0 as $elem_ty); -+ let o = $id::splat(1 as $elem_ty); -+ let t = $id::splat(2 as $elem_ty); -+ let t3 = $id::splat(3 as $elem_ty); -+ let f = $id::splat(4 as $elem_ty); -+ -+ assert_eq!(z, z.mul_adde(z, z)); -+ assert_eq!(o, o.mul_adde(o, z)); -+ assert_eq!(o, o.mul_adde(z, o)); -+ assert_eq!(o, z.mul_adde(o, o)); -+ -+ assert_eq!(t, o.mul_adde(o, o)); -+ assert_eq!(t, o.mul_adde(t, z)); -+ assert_eq!(t, t.mul_adde(o, z)); -+ -+ assert_eq!(f, t.mul_adde(t, z)); -+ assert_eq!(f, t.mul_adde(o, t)); -+ assert_eq!(t3, t.mul_adde(o, o)); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/math/float/powf.rs b/third_party/rust/packed_simd/src/api/math/float/powf.rs -new file mode 100644 -index 000000000000..83dc9ff9c05e ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/math/float/powf.rs -@@ -0,0 +1,36 @@ -+//! Implements vertical (lane-wise) floating-point `powf`. -+ -+macro_rules! impl_math_float_powf { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Raises `self` number to the floating point power of `x`. -+ #[inline] -+ pub fn powf(self, x: Self) -> Self { -+ use crate::codegen::math::float::powf::Powf; -+ Powf::powf(self, x) -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _math_powf>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn powf() { -+ let z = $id::splat(0 as $elem_ty); -+ let o = $id::splat(1 as $elem_ty); -+ let t = $id::splat(2 as $elem_ty); -+ assert_eq!(o, o.powf(z)); -+ assert_eq!(o, t.powf(z)); -+ assert_eq!(o, o.powf(o)); -+ assert_eq!(t, t.powf(o)); -+ -+ let f = $id::splat(4 as $elem_ty); -+ assert_eq!(f, t.powf(t)); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/math/float/recpre.rs b/third_party/rust/packed_simd/src/api/math/float/recpre.rs -new file mode 100644 -index 000000000000..127f0b2ff674 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/math/float/recpre.rs -@@ -0,0 +1,36 @@ -+//! Implements vertical (lane-wise) floating-point `recpre`. -+ -+macro_rules! impl_math_float_recpre { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Reciprocal estimate: `~= 1. / self`. -+ /// -+ /// FIXME: The precision of the estimate is currently unspecified. -+ #[inline] -+ pub fn recpre(self) -> Self { -+ $id::splat(1.) / self -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _math_recpre>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn recpre() { -+ let tol = $id::splat(2.4e-4 as $elem_ty); -+ let o = $id::splat(1 as $elem_ty); -+ let error = (o - o.recpre()).abs(); -+ assert!(error.le(tol).all()); -+ -+ let t = $id::splat(2 as $elem_ty); -+ let e = 0.5; -+ let error = (e - t.recpre()).abs(); -+ assert!(error.le(tol).all()); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/math/float/rsqrte.rs b/third_party/rust/packed_simd/src/api/math/float/rsqrte.rs -new file mode 100644 -index 000000000000..c77977f7b1cd ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/math/float/rsqrte.rs -@@ -0,0 +1,40 @@ -+//! Implements vertical (lane-wise) floating-point `rsqrte`. -+ -+macro_rules! impl_math_float_rsqrte { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Reciprocal square-root estimate: `~= 1. / self.sqrt()`. -+ /// -+ /// FIXME: The precision of the estimate is currently unspecified. -+ #[inline] -+ pub fn rsqrte(self) -> Self { -+ unsafe { -+ use crate::llvm::simd_fsqrt; -+ $id::splat(1.) / Simd(simd_fsqrt(self.0)) -+ } -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _math_rsqrte>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn rsqrte() { -+ use crate::$elem_ty::consts::SQRT_2; -+ let tol = $id::splat(2.4e-4 as $elem_ty); -+ let o = $id::splat(1 as $elem_ty); -+ let error = (o - o.rsqrte()).abs(); -+ assert!(error.le(tol).all()); -+ -+ let t = $id::splat(2 as $elem_ty); -+ let e = 1. / SQRT_2; -+ let error = (e - t.rsqrte()).abs(); -+ assert!(error.le(tol).all()); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/math/float/sin.rs b/third_party/rust/packed_simd/src/api/math/float/sin.rs -new file mode 100644 -index 000000000000..49908319b126 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/math/float/sin.rs -@@ -0,0 +1,50 @@ -+//! Implements vertical (lane-wise) floating-point `sin`. -+ -+macro_rules! impl_math_float_sin { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Sine. -+ #[inline] -+ pub fn sin(self) -> Self { -+ use crate::codegen::math::float::sin::Sin; -+ Sin::sin(self) -+ } -+ -+ /// Sine of `self * PI`. -+ #[inline] -+ pub fn sin_pi(self) -> Self { -+ use crate::codegen::math::float::sin_pi::SinPi; -+ SinPi::sin_pi(self) -+ } -+ -+ /// Sine and cosine of `self * PI`. -+ #[inline] -+ pub fn sin_cos_pi(self) -> (Self, Self) { -+ use crate::codegen::math::float::sin_cos_pi::SinCosPi; -+ SinCosPi::sin_cos_pi(self) -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _math_sin>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn sin() { -+ use crate::$elem_ty::consts::PI; -+ let z = $id::splat(0 as $elem_ty); -+ let p = $id::splat(PI as $elem_ty); -+ let ph = $id::splat(PI as $elem_ty / 2.); -+ let o_r = $id::splat((PI as $elem_ty / 2.).sin()); -+ let z_r = $id::splat((PI as $elem_ty).sin()); -+ -+ assert_eq!(z, z.sin()); -+ assert_eq!(o_r, ph.sin()); -+ assert_eq!(z_r, p.sin()); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/math/float/sqrt.rs b/third_party/rust/packed_simd/src/api/math/float/sqrt.rs -new file mode 100644 -index 000000000000..ae624122d0e2 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/math/float/sqrt.rs -@@ -0,0 +1,35 @@ -+//! Implements vertical (lane-wise) floating-point `sqrt`. -+ -+macro_rules! impl_math_float_sqrt { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ #[inline] -+ pub fn sqrt(self) -> Self { -+ use crate::codegen::math::float::sqrt::Sqrt; -+ Sqrt::sqrt(self) -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _math_sqrt>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn sqrt() { -+ use crate::$elem_ty::consts::SQRT_2; -+ let z = $id::splat(0 as $elem_ty); -+ let o = $id::splat(1 as $elem_ty); -+ assert_eq!(z, z.sqrt()); -+ assert_eq!(o, o.sqrt()); -+ -+ let t = $id::splat(2 as $elem_ty); -+ let e = $id::splat(SQRT_2); -+ assert_eq!(e, t.sqrt()); -+ -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/math/float/sqrte.rs b/third_party/rust/packed_simd/src/api/math/float/sqrte.rs -new file mode 100644 -index 000000000000..f7ffad748d9c ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/math/float/sqrte.rs -@@ -0,0 +1,44 @@ -+//! Implements vertical (lane-wise) floating-point `sqrte`. -+ -+macro_rules! impl_math_float_sqrte { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Square-root estimate. -+ /// -+ /// FIXME: The precision of the estimate is currently unspecified. -+ #[inline] -+ pub fn sqrte(self) -> Self { -+ use crate::codegen::math::float::sqrte::Sqrte; -+ Sqrte::sqrte(self) -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _math_sqrte>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn sqrte() { -+ use crate::$elem_ty::consts::SQRT_2; -+ let tol = $id::splat(2.4e-4 as $elem_ty); -+ -+ let z = $id::splat(0 as $elem_ty); -+ let error = (z - z.sqrte()).abs(); -+ assert!(error.le(tol).all()); -+ -+ let o = $id::splat(1 as $elem_ty); -+ let error = (o - o.sqrte()).abs(); -+ assert!(error.le(tol).all()); -+ -+ let t = $id::splat(2 as $elem_ty); -+ let e = $id::splat(SQRT_2 as $elem_ty); -+ let error = (e - t.sqrte()).abs(); -+ -+ assert!(error.le(tol).all()); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/minimal.rs b/third_party/rust/packed_simd/src/api/minimal.rs -new file mode 100644 -index 000000000000..840d9e32585d ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/minimal.rs -@@ -0,0 +1,6 @@ -+#[macro_use] -+mod iuf; -+#[macro_use] -+mod mask; -+#[macro_use] -+mod ptr; -diff --git a/third_party/rust/packed_simd/src/api/minimal/iuf.rs b/third_party/rust/packed_simd/src/api/minimal/iuf.rs -new file mode 100644 -index 000000000000..58ffabab994f ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/minimal/iuf.rs -@@ -0,0 +1,167 @@ -+//! Minimal API of signed integer, unsigned integer, and floating-point -+//! vectors. -+ -+macro_rules! impl_minimal_iuf { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $ielem_ty:ident | -+ $test_tt:tt | $($elem_name:ident),+ | $(#[$doc:meta])*) => { -+ -+ $(#[$doc])* -+ pub type $id = Simd<[$elem_ty; $elem_count]>; -+ -+ impl sealed::Simd for $id { -+ type Element = $elem_ty; -+ const LANES: usize = $elem_count; -+ type LanesType = [u32; $elem_count]; -+ } -+ -+ impl $id { -+ /// Creates a new instance with each vector elements initialized -+ /// with the provided values. -+ #[inline] -+ #[allow(clippy::too_many_arguments)] -+ pub const fn new($($elem_name: $elem_ty),*) -> Self { -+ Simd(codegen::$id($($elem_name as $ielem_ty),*)) -+ } -+ -+ /// Returns the number of vector lanes. -+ #[inline] -+ pub const fn lanes() -> usize { -+ $elem_count -+ } -+ -+ /// Constructs a new instance with each element initialized to -+ /// `value`. -+ #[inline] -+ pub const fn splat(value: $elem_ty) -> Self { -+ Simd(codegen::$id($({ -+ #[allow(non_camel_case_types, dead_code)] -+ struct $elem_name; -+ value as $ielem_ty -+ }),*)) -+ } -+ -+ /// Extracts the value at `index`. -+ /// -+ /// # Panics -+ /// -+ /// If `index >= Self::lanes()`. -+ #[inline] -+ pub fn extract(self, index: usize) -> $elem_ty { -+ assert!(index < $elem_count); -+ unsafe { self.extract_unchecked(index) } -+ } -+ -+ /// Extracts the value at `index`. -+ /// -+ /// # Precondition -+ /// -+ /// If `index >= Self::lanes()` the behavior is undefined. -+ #[inline] -+ pub unsafe fn extract_unchecked(self, index: usize) -> $elem_ty { -+ use crate::llvm::simd_extract; -+ let e: $ielem_ty = simd_extract(self.0, index as u32); -+ e as $elem_ty -+ } -+ -+ /// Returns a new vector where the value at `index` is replaced by `new_value`. -+ /// -+ /// # Panics -+ /// -+ /// If `index >= Self::lanes()`. -+ #[inline] -+ #[must_use = "replace does not modify the original value - \ -+ it returns a new vector with the value at `index` \ -+ replaced by `new_value`d" -+ ] -+ pub fn replace(self, index: usize, new_value: $elem_ty) -> Self { -+ assert!(index < $elem_count); -+ unsafe { self.replace_unchecked(index, new_value) } -+ } -+ -+ /// Returns a new vector where the value at `index` is replaced by `new_value`. -+ /// -+ /// # Precondition -+ /// -+ /// If `index >= Self::lanes()` the behavior is undefined. -+ #[inline] -+ #[must_use = "replace_unchecked does not modify the original value - \ -+ it returns a new vector with the value at `index` \ -+ replaced by `new_value`d" -+ ] -+ pub unsafe fn replace_unchecked( -+ self, -+ index: usize, -+ new_value: $elem_ty, -+ ) -> Self { -+ use crate::llvm::simd_insert; -+ Simd(simd_insert(self.0, index as u32, new_value as $ielem_ty)) -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _minimal>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn minimal() { -+ // lanes: -+ assert_eq!($elem_count, $id::lanes()); -+ -+ // splat and extract / extract_unchecked: -+ const VAL: $elem_ty = 7 as $elem_ty; -+ const VEC: $id = $id::splat(VAL); -+ for i in 0..$id::lanes() { -+ assert_eq!(VAL, VEC.extract(i)); -+ assert_eq!( -+ VAL, unsafe { VEC.extract_unchecked(i) } -+ ); -+ } -+ -+ // replace / replace_unchecked -+ let new_vec = VEC.replace(0, 42 as $elem_ty); -+ for i in 0..$id::lanes() { -+ if i == 0 { -+ assert_eq!(42 as $elem_ty, new_vec.extract(i)); -+ } else { -+ assert_eq!(VAL, new_vec.extract(i)); -+ } -+ } -+ let new_vec = unsafe { -+ VEC.replace_unchecked(0, 42 as $elem_ty) -+ }; -+ for i in 0..$id::lanes() { -+ if i == 0 { -+ assert_eq!(42 as $elem_ty, new_vec.extract(i)); -+ } else { -+ assert_eq!(VAL, new_vec.extract(i)); -+ } -+ } -+ } -+ -+ // FIXME: wasm-bindgen-test does not support #[should_panic] -+ // #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg(not(target_arch = "wasm32"))] -+ #[test] -+ #[should_panic] -+ fn extract_panic_oob() { -+ const VAL: $elem_ty = 7 as $elem_ty; -+ const VEC: $id = $id::splat(VAL); -+ let _ = VEC.extract($id::lanes()); -+ } -+ // FIXME: wasm-bindgen-test does not support #[should_panic] -+ // #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg(not(target_arch = "wasm32"))] -+ #[test] -+ #[should_panic] -+ fn replace_panic_oob() { -+ const VAL: $elem_ty = 7 as $elem_ty; -+ const VEC: $id = $id::splat(VAL); -+ let _ = VEC.replace($id::lanes(), 42 as $elem_ty); -+ } -+ } -+ } -+ } -+ } -+} -diff --git a/third_party/rust/packed_simd/src/api/minimal/mask.rs b/third_party/rust/packed_simd/src/api/minimal/mask.rs -new file mode 100644 -index 000000000000..e65be95db12c ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/minimal/mask.rs -@@ -0,0 +1,174 @@ -+//! Minimal API of mask vectors. -+ -+macro_rules! impl_minimal_mask { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $ielem_ty:ident -+ | $test_tt:tt | $($elem_name:ident),+ | $(#[$doc:meta])*) => { -+ $(#[$doc])* -+ pub type $id = Simd<[$elem_ty; $elem_count]>; -+ -+ impl sealed::Simd for $id { -+ type Element = $elem_ty; -+ const LANES: usize = $elem_count; -+ type LanesType = [u32; $elem_count]; -+ } -+ -+ impl $id { -+ /// Creates a new instance with each vector elements initialized -+ /// with the provided values. -+ #[inline] -+ #[allow(clippy::too_many_arguments)] -+ pub const fn new($($elem_name: bool),*) -> Self { -+ Simd(codegen::$id($(Self::bool_to_internal($elem_name)),*)) -+ } -+ -+ /// Converts a boolean type into the type of the vector lanes. -+ #[inline] -+ #[allow(clippy::indexing_slicing)] -+ const fn bool_to_internal(x: bool) -> $ielem_ty { -+ [0 as $ielem_ty, !(0 as $ielem_ty)][x as usize] -+ } -+ -+ /// Returns the number of vector lanes. -+ #[inline] -+ pub const fn lanes() -> usize { -+ $elem_count -+ } -+ -+ /// Constructs a new instance with each element initialized to -+ /// `value`. -+ #[inline] -+ pub const fn splat(value: bool) -> Self { -+ Simd(codegen::$id($({ -+ #[allow(non_camel_case_types, dead_code)] -+ struct $elem_name; -+ Self::bool_to_internal(value) -+ }),*)) -+ } -+ -+ /// Extracts the value at `index`. -+ /// -+ /// # Panics -+ /// -+ /// If `index >= Self::lanes()`. -+ #[inline] -+ pub fn extract(self, index: usize) -> bool { -+ assert!(index < $elem_count); -+ unsafe { self.extract_unchecked(index) } -+ } -+ -+ /// Extracts the value at `index`. -+ /// -+ /// If `index >= Self::lanes()` the behavior is undefined. -+ #[inline] -+ pub unsafe fn extract_unchecked(self, index: usize) -> bool { -+ use crate::llvm::simd_extract; -+ let x: $ielem_ty = simd_extract(self.0, index as u32); -+ x != 0 -+ } -+ -+ /// Returns a new vector where the value at `index` is replaced by -+ /// `new_value`. -+ /// -+ /// # Panics -+ /// -+ /// If `index >= Self::lanes()`. -+ #[inline] -+ #[must_use = "replace does not modify the original value - \ -+ it returns a new vector with the value at `index` \ -+ replaced by `new_value`d" -+ ] -+ pub fn replace(self, index: usize, new_value: bool) -> Self { -+ assert!(index < $elem_count); -+ unsafe { self.replace_unchecked(index, new_value) } -+ } -+ -+ /// Returns a new vector where the value at `index` is replaced by -+ /// `new_value`. -+ /// -+ /// # Panics -+ /// -+ /// If `index >= Self::lanes()`. -+ #[inline] -+ #[must_use = "replace_unchecked does not modify the original value - \ -+ it returns a new vector with the value at `index` \ -+ replaced by `new_value`d" -+ ] -+ pub unsafe fn replace_unchecked( -+ self, -+ index: usize, -+ new_value: bool, -+ ) -> Self { -+ use crate::llvm::simd_insert; -+ Simd(simd_insert(self.0, index as u32, -+ Self::bool_to_internal(new_value))) -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _minimal>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn minimal() { -+ // TODO: test new -+ -+ // lanes: -+ assert_eq!($elem_count, $id::lanes()); -+ -+ // splat and extract / extract_unchecked: -+ let vec = $id::splat(true); -+ for i in 0..$id::lanes() { -+ assert_eq!(true, vec.extract(i)); -+ assert_eq!(true, -+ unsafe { vec.extract_unchecked(i) } -+ ); -+ } -+ -+ // replace / replace_unchecked -+ let new_vec = vec.replace(0, false); -+ for i in 0..$id::lanes() { -+ if i == 0 { -+ assert_eq!(false, new_vec.extract(i)); -+ } else { -+ assert_eq!(true, new_vec.extract(i)); -+ } -+ } -+ let new_vec = unsafe { -+ vec.replace_unchecked(0, false) -+ }; -+ for i in 0..$id::lanes() { -+ if i == 0 { -+ assert_eq!(false, new_vec.extract(i)); -+ } else { -+ assert_eq!(true, new_vec.extract(i)); -+ } -+ } -+ } -+ -+ // FIXME: wasm-bindgen-test does not support #[should_panic] -+ // #[cfg_attr(not(target_arch = "wasm32"), test)] -+ // #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg(not(target_arch = "wasm32"))] -+ #[test] -+ #[should_panic] -+ fn extract_panic_oob() { -+ let vec = $id::splat(false); -+ let _ = vec.extract($id::lanes()); -+ } -+ // FIXME: wasm-bindgen-test does not support #[should_panic] -+ // #[cfg_attr(not(target_arch = "wasm32"), test)] -+ // #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg(not(target_arch = "wasm32"))] -+ #[test] -+ #[should_panic] -+ fn replace_panic_oob() { -+ let vec = $id::splat(false); -+ let _ = vec.replace($id::lanes(), true); -+ } -+ } -+ } -+ } -+ } -+} -diff --git a/third_party/rust/packed_simd/src/api/minimal/ptr.rs b/third_party/rust/packed_simd/src/api/minimal/ptr.rs -new file mode 100644 -index 000000000000..75e5aad5c065 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/minimal/ptr.rs -@@ -0,0 +1,1385 @@ -+//! Minimal API of pointer vectors. -+ -+macro_rules! impl_minimal_p { -+ ([$elem_ty:ty; $elem_count:expr]: $id:ident, $mask_ty:ident, -+ $usize_ty:ident, $isize_ty:ident | $ref:ident | $test_tt:tt -+ | $($elem_name:ident),+ | ($true:expr, $false:expr) | -+ $(#[$doc:meta])*) => { -+ -+ $(#[$doc])* -+ pub type $id = Simd<[$elem_ty; $elem_count]>; -+ -+ impl sealed::Simd for $id { -+ type Element = $elem_ty; -+ const LANES: usize = $elem_count; -+ type LanesType = [u32; $elem_count]; -+ } -+ -+ impl $id { -+ /// Creates a new instance with each vector elements initialized -+ /// with the provided values. -+ #[inline] -+ #[allow(clippy::too_many_arguments)] -+ pub const fn new($($elem_name: $elem_ty),*) -> Self { -+ Simd(codegen::$id($($elem_name),*)) -+ } -+ -+ /// Returns the number of vector lanes. -+ #[inline] -+ pub const fn lanes() -> usize { -+ $elem_count -+ } -+ -+ /// Constructs a new instance with each element initialized to -+ /// `value`. -+ #[inline] -+ pub const fn splat(value: $elem_ty) -> Self { -+ Simd(codegen::$id($({ -+ #[allow(non_camel_case_types, dead_code)] -+ struct $elem_name; -+ value -+ }),*)) -+ } -+ -+ /// Constructs a new instance with each element initialized to -+ /// `null`. -+ #[inline] -+ pub const fn null() -> Self { -+ Self::splat(crate::ptr::null_mut() as $elem_ty) -+ } -+ -+ /// Returns a mask that selects those lanes that contain `null` -+ /// pointers. -+ #[inline] -+ pub fn is_null(self) -> $mask_ty { -+ self.eq(Self::null()) -+ } -+ -+ /// Extracts the value at `index`. -+ /// -+ /// # Panics -+ /// -+ /// If `index >= Self::lanes()`. -+ #[inline] -+ pub fn extract(self, index: usize) -> $elem_ty { -+ assert!(index < $elem_count); -+ unsafe { self.extract_unchecked(index) } -+ } -+ -+ /// Extracts the value at `index`. -+ /// -+ /// # Precondition -+ /// -+ /// If `index >= Self::lanes()` the behavior is undefined. -+ #[inline] -+ pub unsafe fn extract_unchecked(self, index: usize) -> $elem_ty { -+ use crate::llvm::simd_extract; -+ simd_extract(self.0, index as u32) -+ } -+ -+ /// Returns a new vector where the value at `index` is replaced by -+ /// `new_value`. -+ /// -+ /// # Panics -+ /// -+ /// If `index >= Self::lanes()`. -+ #[inline] -+ #[must_use = "replace does not modify the original value - \ -+ it returns a new vector with the value at `index` \ -+ replaced by `new_value`d" -+ ] -+ #[allow(clippy::not_unsafe_ptr_arg_deref)] -+ pub fn replace(self, index: usize, new_value: $elem_ty) -> Self { -+ assert!(index < $elem_count); -+ unsafe { self.replace_unchecked(index, new_value) } -+ } -+ -+ /// Returns a new vector where the value at `index` is replaced by `new_value`. -+ /// -+ /// # Precondition -+ /// -+ /// If `index >= Self::lanes()` the behavior is undefined. -+ #[inline] -+ #[must_use = "replace_unchecked does not modify the original value - \ -+ it returns a new vector with the value at `index` \ -+ replaced by `new_value`d" -+ ] -+ pub unsafe fn replace_unchecked( -+ self, -+ index: usize, -+ new_value: $elem_ty, -+ ) -> Self { -+ use crate::llvm::simd_insert; -+ Simd(simd_insert(self.0, index as u32, new_value)) -+ } -+ } -+ -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _minimal>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn minimal() { -+ // lanes: -+ assert_eq!($elem_count, $id::::lanes()); -+ -+ // splat and extract / extract_unchecked: -+ let VAL7: <$id as sealed::Simd>::Element -+ = $ref!(7); -+ let VAL42: <$id as sealed::Simd>::Element -+ = $ref!(42); -+ let VEC: $id = $id::splat(VAL7); -+ for i in 0..$id::::lanes() { -+ assert_eq!(VAL7, VEC.extract(i)); -+ assert_eq!( -+ VAL7, unsafe { VEC.extract_unchecked(i) } -+ ); -+ } -+ -+ // replace / replace_unchecked -+ let new_vec = VEC.replace(0, VAL42); -+ for i in 0..$id::::lanes() { -+ if i == 0 { -+ assert_eq!(VAL42, new_vec.extract(i)); -+ } else { -+ assert_eq!(VAL7, new_vec.extract(i)); -+ } -+ } -+ let new_vec = unsafe { -+ VEC.replace_unchecked(0, VAL42) -+ }; -+ for i in 0..$id::::lanes() { -+ if i == 0 { -+ assert_eq!(VAL42, new_vec.extract(i)); -+ } else { -+ assert_eq!(VAL7, new_vec.extract(i)); -+ } -+ } -+ -+ let mut n = $id::::null(); -+ assert_eq!( -+ n, -+ $id::::splat(unsafe { crate::mem::zeroed() }) -+ ); -+ assert!(n.is_null().all()); -+ n = n.replace( -+ 0, unsafe { crate::mem::transmute(1_isize) } -+ ); -+ assert!(!n.is_null().all()); -+ if $id::::lanes() > 1 { -+ assert!(n.is_null().any()); -+ } else { -+ assert!(!n.is_null().any()); -+ } -+ } -+ -+ // FIXME: wasm-bindgen-test does not support #[should_panic] -+ // #[cfg_attr(not(target_arch = "wasm32"), test)] -+ // #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg(not(target_arch = "wasm32"))] -+ #[test] -+ #[should_panic] -+ fn extract_panic_oob() { -+ let VAL: <$id as sealed::Simd>::Element -+ = $ref!(7); -+ let VEC: $id = $id::splat(VAL); -+ let _ = VEC.extract($id::::lanes()); -+ } -+ -+ // FIXME: wasm-bindgen-test does not support #[should_panic] -+ // #[cfg_attr(not(target_arch = "wasm32"), test)] -+ // #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg(not(target_arch = "wasm32"))] -+ #[test] -+ #[should_panic] -+ fn replace_panic_oob() { -+ let VAL: <$id as sealed::Simd>::Element -+ = $ref!(7); -+ let VAL42: <$id as sealed::Simd>::Element -+ = $ref!(42); -+ let VEC: $id = $id::splat(VAL); -+ let _ = VEC.replace($id::::lanes(), VAL42); -+ } -+ } -+ } -+ } -+ -+ impl crate::fmt::Debug for $id { -+ #[allow(clippy::missing_inline_in_public_items)] -+ fn fmt(&self, f: &mut crate::fmt::Formatter<'_>) -+ -> crate::fmt::Result { -+ write!( -+ f, -+ "{}<{}>(", -+ stringify!($id), -+ unsafe { crate::intrinsics::type_name::() } -+ )?; -+ for i in 0..$elem_count { -+ if i > 0 { -+ write!(f, ", ")?; -+ } -+ self.extract(i).fmt(f)?; -+ } -+ write!(f, ")") -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _fmt_debug>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn debug() { -+ use arrayvec::{ArrayString,ArrayVec}; -+ type TinyString = ArrayString<[u8; 512]>; -+ -+ use crate::fmt::Write; -+ let v = $id::::default(); -+ let mut s = TinyString::new(); -+ write!(&mut s, "{:?}", v).unwrap(); -+ -+ let mut beg = TinyString::new(); -+ write!(&mut beg, "{}(", stringify!($id)).unwrap(); -+ assert!( -+ s.starts_with(beg.as_str()), -+ "s = {} (should start with = {})", s, beg -+ ); -+ assert!(s.ends_with(")")); -+ let s: ArrayVec<[TinyString; 64]> -+ = s.replace(beg.as_str(), "") -+ .replace(")", "").split(",") -+ .map(|v| TinyString::from(v.trim()).unwrap()) -+ .collect(); -+ assert_eq!(s.len(), $id::::lanes()); -+ for (index, ss) in s.into_iter().enumerate() { -+ let mut e = TinyString::new(); -+ write!(&mut e, "{:?}", v.extract(index)).unwrap(); -+ assert_eq!(ss, e); -+ } -+ } -+ } -+ } -+ } -+ -+ impl Default for $id { -+ #[inline] -+ fn default() -> Self { -+ // FIXME: ptrs do not implement default -+ Self::null() -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _default>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn default() { -+ let a = $id::::default(); -+ for i in 0..$id::::lanes() { -+ assert_eq!( -+ a.extract(i), unsafe { crate::mem::zeroed() } -+ ); -+ } -+ } -+ } -+ } -+ } -+ -+ impl $id { -+ /// Lane-wise equality comparison. -+ #[inline] -+ pub fn eq(self, other: Self) -> $mask_ty { -+ unsafe { -+ use crate::llvm::simd_eq; -+ let a: $usize_ty = crate::mem::transmute(self); -+ let b: $usize_ty = crate::mem::transmute(other); -+ Simd(simd_eq(a.0, b.0)) -+ } -+ } -+ -+ /// Lane-wise inequality comparison. -+ #[inline] -+ pub fn ne(self, other: Self) -> $mask_ty { -+ unsafe { -+ use crate::llvm::simd_ne; -+ let a: $usize_ty = crate::mem::transmute(self); -+ let b: $usize_ty = crate::mem::transmute(other); -+ Simd(simd_ne(a.0, b.0)) -+ } -+ } -+ -+ /// Lane-wise less-than comparison. -+ #[inline] -+ pub fn lt(self, other: Self) -> $mask_ty { -+ unsafe { -+ use crate::llvm::simd_lt; -+ let a: $usize_ty = crate::mem::transmute(self); -+ let b: $usize_ty = crate::mem::transmute(other); -+ Simd(simd_lt(a.0, b.0)) -+ } -+ } -+ -+ /// Lane-wise less-than-or-equals comparison. -+ #[inline] -+ pub fn le(self, other: Self) -> $mask_ty { -+ unsafe { -+ use crate::llvm::simd_le; -+ let a: $usize_ty = crate::mem::transmute(self); -+ let b: $usize_ty = crate::mem::transmute(other); -+ Simd(simd_le(a.0, b.0)) -+ } -+ } -+ -+ /// Lane-wise greater-than comparison. -+ #[inline] -+ pub fn gt(self, other: Self) -> $mask_ty { -+ unsafe { -+ use crate::llvm::simd_gt; -+ let a: $usize_ty = crate::mem::transmute(self); -+ let b: $usize_ty = crate::mem::transmute(other); -+ Simd(simd_gt(a.0, b.0)) -+ } -+ } -+ -+ /// Lane-wise greater-than-or-equals comparison. -+ #[inline] -+ pub fn ge(self, other: Self) -> $mask_ty { -+ unsafe { -+ use crate::llvm::simd_ge; -+ let a: $usize_ty = crate::mem::transmute(self); -+ let b: $usize_ty = crate::mem::transmute(other); -+ Simd(simd_ge(a.0, b.0)) -+ } -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _cmp_vertical>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn cmp() { -+ let a = $id::::null(); -+ let b = $id::::splat(unsafe { -+ crate::mem::transmute(1_isize) -+ }); -+ -+ let r = a.lt(b); -+ let e = $mask_ty::splat(true); -+ assert!(r == e); -+ let r = a.le(b); -+ assert!(r == e); -+ -+ let e = $mask_ty::splat(false); -+ let r = a.gt(b); -+ assert!(r == e); -+ let r = a.ge(b); -+ assert!(r == e); -+ let r = a.eq(b); -+ assert!(r == e); -+ -+ let mut a = a; -+ let mut b = b; -+ let mut e = e; -+ for i in 0..$id::::lanes() { -+ if i % 2 == 0 { -+ a = a.replace( -+ i, -+ unsafe { crate::mem::transmute(0_isize) } -+ ); -+ b = b.replace( -+ i, -+ unsafe { crate::mem::transmute(1_isize) } -+ ); -+ e = e.replace(i, true); -+ } else { -+ a = a.replace( -+ i, -+ unsafe { crate::mem::transmute(1_isize) } -+ ); -+ b = b.replace( -+ i, -+ unsafe { crate::mem::transmute(0_isize) } -+ ); -+ e = e.replace(i, false); -+ } -+ } -+ let r = a.lt(b); -+ assert!(r == e); -+ } -+ } -+ } -+ } -+ -+ #[allow(clippy::partialeq_ne_impl)] -+ impl crate::cmp::PartialEq<$id> for $id { -+ #[inline] -+ fn eq(&self, other: &Self) -> bool { -+ $id::::eq(*self, *other).all() -+ } -+ #[inline] -+ fn ne(&self, other: &Self) -> bool { -+ $id::::ne(*self, *other).any() -+ } -+ } -+ -+ // FIXME: https://github.com/rust-lang-nursery/rust-clippy/issues/2892 -+ #[allow(clippy::partialeq_ne_impl)] -+ impl crate::cmp::PartialEq>> -+ for LexicographicallyOrdered<$id> -+ { -+ #[inline] -+ fn eq(&self, other: &Self) -> bool { -+ self.0 == other.0 -+ } -+ #[inline] -+ fn ne(&self, other: &Self) -> bool { -+ self.0 != other.0 -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _cmp_PartialEq>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn partial_eq() { -+ let a = $id::::null(); -+ let b = $id::::splat(unsafe { -+ crate::mem::transmute(1_isize) -+ }); -+ -+ assert!(a != b); -+ assert!(!(a == b)); -+ assert!(a == a); -+ assert!(!(a != a)); -+ -+ if $id::::lanes() > 1 { -+ let a = $id::::null().replace(0, unsafe { -+ crate::mem::transmute(1_isize) -+ }); -+ let b = $id::::splat(unsafe { -+ crate::mem::transmute(1_isize) -+ }); -+ -+ assert!(a != b); -+ assert!(!(a == b)); -+ assert!(a == a); -+ assert!(!(a != a)); -+ } -+ } -+ } -+ } -+ } -+ -+ impl crate::cmp::Eq for $id {} -+ impl crate::cmp::Eq for LexicographicallyOrdered<$id> {} -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _cmp_eq>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn eq() { -+ fn foo(_: E) {} -+ let a = $id::::null(); -+ foo(a); -+ } -+ } -+ } -+ } -+ -+ impl From<[$elem_ty; $elem_count]> for $id { -+ #[inline] -+ fn from(array: [$elem_ty; $elem_count]) -> Self { -+ unsafe { -+ // FIXME: unnecessary zeroing; better than UB. -+ let mut u: Self = crate::mem::zeroed(); -+ crate::ptr::copy_nonoverlapping( -+ &array as *const [$elem_ty; $elem_count] as *const u8, -+ &mut u as *mut Self as *mut u8, -+ crate::mem::size_of::() -+ ); -+ u -+ } -+ } -+ } -+ impl Into<[$elem_ty; $elem_count]> for $id { -+ #[inline] -+ fn into(self) -> [$elem_ty; $elem_count] { -+ unsafe { -+ // FIXME: unnecessary zeroing; better than UB. -+ let mut u: [$elem_ty; $elem_count] = crate::mem::zeroed(); -+ crate::ptr::copy_nonoverlapping( -+ &self as *const $id as *const u8, -+ &mut u as *mut [$elem_ty; $elem_count] as *mut u8, -+ crate::mem::size_of::() -+ ); -+ u -+ } -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _from>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn array() { -+ let values = [1_i32; $elem_count]; -+ -+ let mut vec: $id = Default::default(); -+ let mut array = [ -+ $id::::null().extract(0); $elem_count -+ ]; -+ -+ for i in 0..$elem_count { -+ let ptr = unsafe { -+ crate::mem::transmute( -+ &values[i] as *const i32 -+ ) -+ }; -+ vec = vec.replace(i, ptr); -+ array[i] = ptr; -+ } -+ -+ // FIXME: there is no impl of From<$id> for [$elem_ty; N] -+ // let a0 = From::from(vec); -+ // assert_eq!(a0, array); -+ #[allow(unused_assignments)] -+ let mut a1 = array; -+ a1 = vec.into(); -+ assert_eq!(a1, array); -+ -+ let v0: $id = From::from(array); -+ assert_eq!(v0, vec); -+ let v1: $id = array.into(); -+ assert_eq!(v1, vec); -+ } -+ } -+ } -+ } -+ -+ impl $id { -+ /// Instantiates a new vector with the values of the `slice`. -+ /// -+ /// # Panics -+ /// -+ /// If `slice.len() < Self::lanes()` or `&slice[0]` is not aligned -+ /// to an `align_of::()` boundary. -+ #[inline] -+ pub fn from_slice_aligned(slice: &[$elem_ty]) -> Self { -+ unsafe { -+ assert!(slice.len() >= $elem_count); -+ let target_ptr = slice.get_unchecked(0) as *const $elem_ty; -+ assert!( -+ target_ptr.align_offset(crate::mem::align_of::()) -+ == 0 -+ ); -+ Self::from_slice_aligned_unchecked(slice) -+ } -+ } -+ -+ /// Instantiates a new vector with the values of the `slice`. -+ /// -+ /// # Panics -+ /// -+ /// If `slice.len() < Self::lanes()`. -+ #[inline] -+ pub fn from_slice_unaligned(slice: &[$elem_ty]) -> Self { -+ unsafe { -+ assert!(slice.len() >= $elem_count); -+ Self::from_slice_unaligned_unchecked(slice) -+ } -+ } -+ -+ /// Instantiates a new vector with the values of the `slice`. -+ /// -+ /// # Precondition -+ /// -+ /// If `slice.len() < Self::lanes()` or `&slice[0]` is not aligned -+ /// to an `align_of::()` boundary, the behavior is undefined. -+ #[inline] -+ pub unsafe fn from_slice_aligned_unchecked(slice: &[$elem_ty]) -+ -> Self { -+ #[allow(clippy::cast_ptr_alignment)] -+ *(slice.get_unchecked(0) as *const $elem_ty as *const Self) -+ } -+ -+ /// Instantiates a new vector with the values of the `slice`. -+ /// -+ /// # Precondition -+ /// -+ /// If `slice.len() < Self::lanes()` the behavior is undefined. -+ #[inline] -+ pub unsafe fn from_slice_unaligned_unchecked( -+ slice: &[$elem_ty], -+ ) -> Self { -+ use crate::mem::size_of; -+ let target_ptr = -+ slice.get_unchecked(0) as *const $elem_ty as *const u8; -+ let mut x = Self::splat(crate::ptr::null_mut() as $elem_ty); -+ let self_ptr = &mut x as *mut Self as *mut u8; -+ crate::ptr::copy_nonoverlapping( -+ target_ptr, -+ self_ptr, -+ size_of::(), -+ ); -+ x -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _slice_from_slice>] { -+ use super::*; -+ use crate::iter::Iterator; -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn from_slice_unaligned() { -+ let (null, non_null) = ptr_vals!($id); -+ -+ let mut unaligned = [ -+ non_null; $id::::lanes() + 1 -+ ]; -+ unaligned[0] = null; -+ let vec = $id::::from_slice_unaligned( -+ &unaligned[1..] -+ ); -+ for (index, &b) in unaligned.iter().enumerate() { -+ if index == 0 { -+ assert_eq!(b, null); -+ } else { -+ assert_eq!(b, non_null); -+ assert_eq!(b, vec.extract(index - 1)); -+ } -+ } -+ } -+ -+ // FIXME: wasm-bindgen-test does not support #[should_panic] -+ // #[cfg_attr(not(target_arch = "wasm32"), test)] -+ // #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg(not(target_arch = "wasm32"))] -+ #[test] -+ #[should_panic] -+ fn from_slice_unaligned_fail() { -+ let (_null, non_null) = ptr_vals!($id); -+ let unaligned = [non_null; $id::::lanes() + 1]; -+ // the slice is not large enough => panic -+ let _vec = $id::::from_slice_unaligned( -+ &unaligned[2..] -+ ); -+ } -+ -+ union A { -+ data: [<$id as sealed::Simd>::Element; -+ 2 * $id::::lanes()], -+ _vec: $id, -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn from_slice_aligned() { -+ let (null, non_null) = ptr_vals!($id); -+ let mut aligned = A { -+ data: [null; 2 * $id::::lanes()], -+ }; -+ for i in -+ $id::::lanes()..(2 * $id::::lanes()) { -+ unsafe { -+ aligned.data[i] = non_null; -+ } -+ } -+ -+ let vec = unsafe { -+ $id::::from_slice_aligned( -+ &aligned.data[$id::::lanes()..] -+ ) -+ }; -+ for (index, &b) in unsafe { -+ aligned.data.iter().enumerate() -+ } { -+ if index < $id::::lanes() { -+ assert_eq!(b, null); -+ } else { -+ assert_eq!(b, non_null); -+ assert_eq!( -+ b, vec.extract(index - $id::::lanes()) -+ ); -+ } -+ } -+ } -+ -+ // FIXME: wasm-bindgen-test does not support #[should_panic] -+ // #[cfg_attr(not(target_arch = "wasm32"), test)] -+ // #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg(not(target_arch = "wasm32"))] -+ #[test] -+ #[should_panic] -+ fn from_slice_aligned_fail_lanes() { -+ let (_null, non_null) = ptr_vals!($id); -+ let aligned = A { -+ data: [non_null; 2 * $id::::lanes()], -+ }; -+ // the slice is not large enough => panic -+ let _vec = unsafe { -+ $id::::from_slice_aligned( -+ &aligned.data[2 * $id::::lanes()..] -+ ) -+ }; -+ } -+ -+ // FIXME: wasm-bindgen-test does not support #[should_panic] -+ // #[cfg_attr(not(target_arch = "wasm32"), test)] -+ // #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg(not(target_arch = "wasm32"))] -+ #[test] -+ #[should_panic] -+ fn from_slice_aligned_fail_align() { -+ unsafe { -+ let (null, _non_null) = ptr_vals!($id); -+ let aligned = A { -+ data: [null; 2 * $id::::lanes()], -+ }; -+ -+ // get a pointer to the front of data -+ let ptr = aligned.data.as_ptr(); -+ // offset pointer by one element -+ let ptr = ptr.wrapping_add(1); -+ -+ if ptr.align_offset( -+ crate::mem::align_of::<$id>() -+ ) == 0 { -+ // the pointer is properly aligned, so -+ // from_slice_aligned won't fail here (e.g. this -+ // can happen for i128x1). So we panic to make -+ // the "should_fail" test pass: -+ panic!("ok"); -+ } -+ -+ // create a slice - this is safe, because the -+ // elements of the slice exist, are properly -+ // initialized, and properly aligned: -+ let s = slice::from_raw_parts( -+ ptr, $id::::lanes() -+ ); -+ // this should always panic because the slice -+ // alignment does not match the alignment -+ // requirements for the vector type: -+ let _vec = $id::::from_slice_aligned(s); -+ } -+ } -+ } -+ } -+ } -+ -+ impl $id { -+ /// Writes the values of the vector to the `slice`. -+ /// -+ /// # Panics -+ /// -+ /// If `slice.len() < Self::lanes()` or `&slice[0]` is not -+ /// aligned to an `align_of::()` boundary. -+ #[inline] -+ pub fn write_to_slice_aligned(self, slice: &mut [$elem_ty]) { -+ unsafe { -+ assert!(slice.len() >= $elem_count); -+ let target_ptr = -+ slice.get_unchecked_mut(0) as *mut $elem_ty; -+ assert!( -+ target_ptr.align_offset(crate::mem::align_of::()) -+ == 0 -+ ); -+ self.write_to_slice_aligned_unchecked(slice); -+ } -+ } -+ -+ /// Writes the values of the vector to the `slice`. -+ /// -+ /// # Panics -+ /// -+ /// If `slice.len() < Self::lanes()`. -+ #[inline] -+ pub fn write_to_slice_unaligned(self, slice: &mut [$elem_ty]) { -+ unsafe { -+ assert!(slice.len() >= $elem_count); -+ self.write_to_slice_unaligned_unchecked(slice); -+ } -+ } -+ -+ /// Writes the values of the vector to the `slice`. -+ /// -+ /// # Precondition -+ /// -+ /// If `slice.len() < Self::lanes()` or `&slice[0]` is not -+ /// aligned to an `align_of::()` boundary, the behavior is -+ /// undefined. -+ #[inline] -+ pub unsafe fn write_to_slice_aligned_unchecked( -+ self, slice: &mut [$elem_ty], -+ ) { -+ #[allow(clippy::cast_ptr_alignment)] -+ *(slice.get_unchecked_mut(0) as *mut $elem_ty as *mut Self) = -+ self; -+ } -+ -+ /// Writes the values of the vector to the `slice`. -+ /// -+ /// # Precondition -+ /// -+ /// If `slice.len() < Self::lanes()` the behavior is undefined. -+ #[inline] -+ pub unsafe fn write_to_slice_unaligned_unchecked( -+ self, slice: &mut [$elem_ty], -+ ) { -+ let target_ptr = -+ slice.get_unchecked_mut(0) as *mut $elem_ty as *mut u8; -+ let self_ptr = &self as *const Self as *const u8; -+ crate::ptr::copy_nonoverlapping( -+ self_ptr, -+ target_ptr, -+ crate::mem::size_of::(), -+ ); -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _slice_write_to_slice>] { -+ use super::*; -+ use crate::iter::Iterator; -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn write_to_slice_unaligned() { -+ let (null, non_null) = ptr_vals!($id); -+ let mut unaligned = [null; $id::::lanes() + 1]; -+ let vec = $id::::splat(non_null); -+ vec.write_to_slice_unaligned(&mut unaligned[1..]); -+ for (index, &b) in unaligned.iter().enumerate() { -+ if index == 0 { -+ assert_eq!(b, null); -+ } else { -+ assert_eq!(b, non_null); -+ assert_eq!(b, vec.extract(index - 1)); -+ } -+ } -+ } -+ -+ // FIXME: wasm-bindgen-test does not support #[should_panic] -+ // #[cfg_attr(not(target_arch = "wasm32"), test)] -+ // #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg(not(target_arch = "wasm32"))] -+ #[test] -+ #[should_panic] -+ fn write_to_slice_unaligned_fail() { -+ let (null, non_null) = ptr_vals!($id); -+ let mut unaligned = [null; $id::::lanes() + 1]; -+ let vec = $id::::splat(non_null); -+ // the slice is not large enough => panic -+ vec.write_to_slice_unaligned(&mut unaligned[2..]); -+ } -+ -+ union A { -+ data: [<$id as sealed::Simd>::Element; -+ 2 * $id::::lanes()], -+ _vec: $id, -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn write_to_slice_aligned() { -+ let (null, non_null) = ptr_vals!($id); -+ let mut aligned = A { -+ data: [null; 2 * $id::::lanes()], -+ }; -+ let vec = $id::::splat(non_null); -+ unsafe { -+ vec.write_to_slice_aligned( -+ &mut aligned.data[$id::::lanes()..] -+ ) -+ }; -+ for (index, &b) in -+ unsafe { aligned.data.iter().enumerate() } { -+ if index < $id::::lanes() { -+ assert_eq!(b, null); -+ } else { -+ assert_eq!(b, non_null); -+ assert_eq!( -+ b, vec.extract(index - $id::::lanes()) -+ ); -+ } -+ } -+ } -+ -+ // FIXME: wasm-bindgen-test does not support #[should_panic] -+ // #[cfg_attr(not(target_arch = "wasm32"), test)] -+ // #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg(not(target_arch = "wasm32"))] -+ #[test] -+ #[should_panic] -+ fn write_to_slice_aligned_fail_lanes() { -+ let (null, non_null) = ptr_vals!($id); -+ let mut aligned = A { -+ data: [null; 2 * $id::::lanes()], -+ }; -+ let vec = $id::::splat(non_null); -+ // the slice is not large enough => panic -+ unsafe { -+ vec.write_to_slice_aligned( -+ &mut aligned.data[2 * $id::::lanes()..] -+ ) -+ }; -+ } -+ -+ // FIXME: wasm-bindgen-test does not support #[should_panic] -+ // #[cfg_attr(not(target_arch = "wasm32"), test)] -+ // #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg(not(target_arch = "wasm32"))] -+ #[test] -+ #[should_panic] -+ fn write_to_slice_aligned_fail_align() { -+ let (null, non_null) = ptr_vals!($id); -+ unsafe { -+ let mut aligned = A { -+ data: [null; 2 * $id::::lanes()], -+ }; -+ -+ // get a pointer to the front of data -+ let ptr = aligned.data.as_mut_ptr(); -+ // offset pointer by one element -+ let ptr = ptr.wrapping_add(1); -+ -+ if ptr.align_offset( -+ crate::mem::align_of::<$id>() -+ ) == 0 { -+ // the pointer is properly aligned, so -+ // write_to_slice_aligned won't fail here (e.g. -+ // this can happen for i128x1). So we panic to -+ // make the "should_fail" test pass: -+ panic!("ok"); -+ } -+ -+ // create a slice - this is safe, because the -+ // elements of the slice exist, are properly -+ // initialized, and properly aligned: -+ let s = slice::from_raw_parts_mut( -+ ptr, $id::::lanes() -+ ); -+ // this should always panic because the slice -+ // alignment does not match the alignment -+ // requirements for the vector type: -+ let vec = $id::::splat(non_null); -+ vec.write_to_slice_aligned(s); -+ } -+ } -+ } -+ } -+ } -+ -+ impl crate::hash::Hash for $id { -+ #[inline] -+ fn hash(&self, state: &mut H) { -+ let s: $usize_ty = unsafe { crate::mem::transmute(*self) }; -+ s.hash(state) -+ } -+ } -+ -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _hash>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn hash() { -+ use crate::hash::{Hash, Hasher}; -+ #[allow(deprecated)] -+ use crate::hash::{SipHasher13}; -+ -+ let values = [1_i32; $elem_count]; -+ -+ let mut vec: $id = Default::default(); -+ let mut array = [ -+ $id::::null().extract(0); -+ $elem_count -+ ]; -+ -+ for i in 0..$elem_count { -+ let ptr = unsafe { -+ crate::mem::transmute( -+ &values[i] as *const i32 -+ ) -+ }; -+ vec = vec.replace(i, ptr); -+ array[i] = ptr; -+ } -+ -+ #[allow(deprecated)] -+ let mut a_hash = SipHasher13::new(); -+ let mut v_hash = a_hash.clone(); -+ array.hash(&mut a_hash); -+ vec.hash(&mut v_hash); -+ assert_eq!(a_hash.finish(), v_hash.finish()); -+ } -+ } -+ } -+ } -+ -+ impl $id { -+ /// Calculates the offset from a pointer. -+ /// -+ /// `count` is in units of `T`; e.g. a count of `3` represents a -+ /// pointer offset of `3 * size_of::()` bytes. -+ /// -+ /// # Safety -+ /// -+ /// If any of the following conditions are violated, the result is -+ /// Undefined Behavior: -+ /// -+ /// * Both the starting and resulting pointer must be either in -+ /// bounds or one byte past the end of an allocated object. -+ /// -+ /// * The computed offset, in bytes, cannot overflow an `isize`. -+ /// -+ /// * The offset being in bounds cannot rely on "wrapping around" -+ /// the address space. That is, the infinite-precision sum, in bytes -+ /// must fit in a `usize`. -+ /// -+ /// The compiler and standard library generally tries to ensure -+ /// allocations never reach a size where an offset is a concern. For -+ /// instance, `Vec` and `Box` ensure they never allocate more than -+ /// `isize::MAX` bytes, so `vec.as_ptr().offset(vec.len() as isize)` -+ /// is always safe. -+ /// -+ /// Most platforms fundamentally can't even construct such an -+ /// allocation. For instance, no known 64-bit platform can ever -+ /// serve a request for 263 bytes due to page-table limitations or -+ /// splitting the address space. However, some 32-bit and 16-bit -+ /// platforms may successfully serve a request for more than -+ /// `isize::MAX` bytes with things like Physical Address Extension. -+ /// As such, memory acquired directly from allocators or memory -+ /// mapped files may be too large to handle with this function. -+ /// -+ /// Consider using `wrapping_offset` instead if these constraints -+ /// are difficult to satisfy. The only advantage of this method is -+ /// that it enables more aggressive compiler optimizations. -+ #[inline] -+ pub unsafe fn offset(self, count: $isize_ty) -> Self { -+ // FIXME: should use LLVM's `add nsw nuw` -+ self.wrapping_offset(count) -+ } -+ -+ /// Calculates the offset from a pointer using wrapping arithmetic. -+ /// -+ /// `count` is in units of `T`; e.g. a count of `3` represents a -+ /// pointer offset of `3 * size_of::()` bytes. -+ /// -+ /// # Safety -+ /// -+ /// The resulting pointer does not need to be in bounds, but it is -+ /// potentially hazardous to dereference (which requires unsafe). -+ /// -+ /// Always use `.offset(count)` instead when possible, because -+ /// offset allows the compiler to optimize better. -+ #[inline] -+ pub fn wrapping_offset(self, count: $isize_ty) -> Self { -+ unsafe { -+ let x: $isize_ty = crate::mem::transmute(self); -+ // note: {+,*} currently performs a `wrapping_{add, mul}` -+ crate::mem::transmute( -+ x + (count * crate::mem::size_of::() as isize) -+ ) -+ } -+ } -+ -+ /// Calculates the distance between two pointers. -+ /// -+ /// The returned value is in units of `T`: the distance in bytes is -+ /// divided by `mem::size_of::()`. -+ /// -+ /// This function is the inverse of offset. -+ /// -+ /// # Safety -+ /// -+ /// If any of the following conditions are violated, the result is -+ /// Undefined Behavior: -+ /// -+ /// * Both the starting and other pointer must be either in bounds -+ /// or one byte past the end of the same allocated object. -+ /// -+ /// * The distance between the pointers, in bytes, cannot overflow -+ /// an `isize`. -+ /// -+ /// * The distance between the pointers, in bytes, must be an exact -+ /// multiple of the size of `T`. -+ /// -+ /// * The distance being in bounds cannot rely on "wrapping around" -+ /// the address space. -+ /// -+ /// The compiler and standard library generally try to ensure -+ /// allocations never reach a size where an offset is a concern. For -+ /// instance, `Vec` and `Box` ensure they never allocate more than -+ /// `isize::MAX` bytes, so `ptr_into_vec.offset_from(vec.as_ptr())` -+ /// is always safe. -+ /// -+ /// Most platforms fundamentally can't even construct such an -+ /// allocation. For instance, no known 64-bit platform can ever -+ /// serve a request for 263 bytes due to page-table limitations or -+ /// splitting the address space. However, some 32-bit and 16-bit -+ /// platforms may successfully serve a request for more than -+ /// `isize::MAX` bytes with things like Physical Address Extension. -+ /// As such, memory acquired directly from allocators or memory -+ /// mapped files may be too large to handle with this function. -+ /// -+ /// Consider using wrapping_offset_from instead if these constraints -+ /// are difficult to satisfy. The only advantage of this method is -+ /// that it enables more aggressive compiler optimizations. -+ #[inline] -+ pub unsafe fn offset_from(self, origin: Self) -> $isize_ty { -+ // FIXME: should use LLVM's `sub nsw nuw`. -+ self.wrapping_offset_from(origin) -+ } -+ -+ /// Calculates the distance between two pointers. -+ /// -+ /// The returned value is in units of `T`: the distance in bytes is -+ /// divided by `mem::size_of::()`. -+ /// -+ /// If the address different between the two pointers is not a -+ /// multiple of `mem::size_of::()` then the result of the -+ /// division is rounded towards zero. -+ /// -+ /// Though this method is safe for any two pointers, note that its -+ /// result will be mostly useless if the two pointers aren't into -+ /// the same allocated object, for example if they point to two -+ /// different local variables. -+ #[inline] -+ pub fn wrapping_offset_from(self, origin: Self) -> $isize_ty { -+ let x: $isize_ty = unsafe { crate::mem::transmute(self) }; -+ let y: $isize_ty = unsafe { crate::mem::transmute(origin) }; -+ // note: {-,/} currently perform wrapping_{sub, div} -+ (y - x) / (crate::mem::size_of::() as isize) -+ } -+ -+ /// Calculates the offset from a pointer (convenience for -+ /// `.offset(count as isize)`). -+ /// -+ /// `count` is in units of `T`; e.g. a count of 3 represents a -+ /// pointer offset of `3 * size_of::()` bytes. -+ /// -+ /// # Safety -+ /// -+ /// If any of the following conditions are violated, the result is -+ /// Undefined Behavior: -+ /// -+ /// * Both the starting and resulting pointer must be either in -+ /// bounds or one byte past the end of an allocated object. -+ /// -+ /// * The computed offset, in bytes, cannot overflow an `isize`. -+ /// -+ /// * The offset being in bounds cannot rely on "wrapping around" -+ /// the address space. That is, the infinite-precision sum must fit -+ /// in a `usize`. -+ /// -+ /// The compiler and standard library generally tries to ensure -+ /// allocations never reach a size where an offset is a concern. For -+ /// instance, `Vec` and `Box` ensure they never allocate more than -+ /// `isize::MAX` bytes, so `vec.as_ptr().add(vec.len())` is always -+ /// safe. -+ /// -+ /// Most platforms fundamentally can't even construct such an -+ /// allocation. For instance, no known 64-bit platform can ever -+ /// serve a request for 263 bytes due to page-table limitations or -+ /// splitting the address space. However, some 32-bit and 16-bit -+ /// platforms may successfully serve a request for more than -+ /// `isize::MAX` bytes with things like Physical Address Extension. -+ /// As such, memory acquired directly from allocators or memory -+ /// mapped files may be too large to handle with this function. -+ /// -+ /// Consider using `wrapping_offset` instead if these constraints -+ /// are difficult to satisfy. The only advantage of this method is -+ /// that it enables more aggressive compiler optimizations. -+ #[inline] -+ #[allow(clippy::should_implement_trait)] -+ pub unsafe fn add(self, count: $usize_ty) -> Self { -+ self.offset(count.cast()) -+ } -+ -+ /// Calculates the offset from a pointer (convenience for -+ /// `.offset((count as isize).wrapping_neg())`). -+ /// -+ /// `count` is in units of T; e.g. a `count` of 3 represents a -+ /// pointer offset of `3 * size_of::()` bytes. -+ /// -+ /// # Safety -+ /// -+ /// If any of the following conditions are violated, the result is -+ /// Undefined Behavior: -+ /// -+ /// * Both the starting and resulting pointer must be either in -+ /// bounds or one byte past the end of an allocated object. -+ /// -+ /// * The computed offset cannot exceed `isize::MAX` **bytes**. -+ /// -+ /// * The offset being in bounds cannot rely on "wrapping around" -+ /// the address space. That is, the infinite-precision sum must fit -+ /// in a usize. -+ /// -+ /// The compiler and standard library generally tries to ensure -+ /// allocations never reach a size where an offset is a concern. For -+ /// instance, `Vec` and `Box` ensure they never allocate more than -+ /// `isize::MAX` bytes, so -+ /// `vec.as_ptr().add(vec.len()).sub(vec.len())` is always safe. -+ /// -+ /// Most platforms fundamentally can't even construct such an -+ /// allocation. For instance, no known 64-bit platform can ever -+ /// serve a request for 263 bytes due to page-table -+ /// limitations or splitting the address space. However, some 32-bit -+ /// and 16-bit platforms may successfully serve a request for more -+ /// than `isize::MAX` bytes with things like Physical Address -+ /// Extension. As such, memory acquired directly from allocators or -+ /// memory mapped files *may* be too large to handle with this -+ /// function. -+ /// -+ /// Consider using `wrapping_offset` instead if these constraints -+ /// are difficult to satisfy. The only advantage of this method is -+ /// that it enables more aggressive compiler optimizations. -+ #[inline] -+ #[allow(clippy::should_implement_trait)] -+ pub unsafe fn sub(self, count: $usize_ty) -> Self { -+ let x: $isize_ty = count.cast(); -+ // note: - is currently wrapping_neg -+ self.offset(-x) -+ } -+ -+ /// Calculates the offset from a pointer using wrapping arithmetic. -+ /// (convenience for `.wrapping_offset(count as isize)`) -+ /// -+ /// `count` is in units of T; e.g. a `count` of 3 represents a -+ /// pointer offset of `3 * size_of::()` bytes. -+ /// -+ /// # Safety -+ /// -+ /// The resulting pointer does not need to be in bounds, but it is -+ /// potentially hazardous to dereference (which requires `unsafe`). -+ /// -+ /// Always use `.add(count)` instead when possible, because `add` -+ /// allows the compiler to optimize better. -+ #[inline] -+ pub fn wrapping_add(self, count: $usize_ty) -> Self { -+ self.wrapping_offset(count.cast()) -+ } -+ -+ /// Calculates the offset from a pointer using wrapping arithmetic. -+ /// (convenience for `.wrapping_offset((count as -+ /// isize).wrapping_sub())`) -+ /// -+ /// `count` is in units of T; e.g. a `count` of 3 represents a -+ /// pointer offset of `3 * size_of::()` bytes. -+ /// -+ /// # Safety -+ /// -+ /// The resulting pointer does not need to be in bounds, but it is -+ /// potentially hazardous to dereference (which requires `unsafe`). -+ /// -+ /// Always use `.sub(count)` instead when possible, because `sub` -+ /// allows the compiler to optimize better. -+ #[inline] -+ pub fn wrapping_sub(self, count: $usize_ty) -> Self { -+ let x: $isize_ty = count.cast(); -+ self.wrapping_offset(-1 * x) -+ } -+ } -+ -+ impl $id { -+ /// Shuffle vector elements according to `indices`. -+ #[inline] -+ pub fn shuffle1_dyn(self, indices: I) -> Self -+ where -+ Self: codegen::shuffle1_dyn::Shuffle1Dyn, -+ { -+ codegen::shuffle1_dyn::Shuffle1Dyn::shuffle1_dyn(self, indices) -+ } -+ } -+ -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _shuffle1_dyn>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn shuffle1_dyn() { -+ let (null, non_null) = ptr_vals!($id); -+ -+ // alternating = [non_null, null, non_null, null, ...] -+ let mut alternating = $id::::splat(null); -+ for i in 0..$id::::lanes() { -+ if i % 2 == 0 { -+ alternating = alternating.replace(i, non_null); -+ } -+ } -+ -+ type Indices = <$id -+ as codegen::shuffle1_dyn::Shuffle1Dyn>::Indices; -+ // even = [0, 0, 2, 2, 4, 4, ..] -+ let even = { -+ let mut v = Indices::splat(0); -+ for i in 0..$id::::lanes() { -+ if i % 2 == 0 { -+ v = v.replace(i, (i as u8).into()); -+ } else { -+ v = v.replace(i, (i as u8 - 1).into()); -+ } -+ } -+ v -+ }; -+ // odd = [1, 1, 3, 3, 5, 5, ...] -+ let odd = { -+ let mut v = Indices::splat(0); -+ for i in 0..$id::::lanes() { -+ if i % 2 != 0 { -+ v = v.replace(i, (i as u8).into()); -+ } else { -+ v = v.replace(i, (i as u8 + 1).into()); -+ } -+ } -+ v -+ }; -+ -+ assert_eq!( -+ alternating.shuffle1_dyn(even), -+ $id::::splat(non_null) -+ ); -+ if $id::::lanes() > 1 { -+ assert_eq!( -+ alternating.shuffle1_dyn(odd), -+ $id::::splat(null) -+ ); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/ops.rs b/third_party/rust/packed_simd/src/api/ops.rs -new file mode 100644 -index 000000000000..f71c98795da3 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/ops.rs -@@ -0,0 +1,32 @@ -+//! Implementation of the `ops` traits -+#[macro_use] -+mod vector_mask_bitwise; -+#[macro_use] -+mod scalar_mask_bitwise; -+ -+#[macro_use] -+mod vector_arithmetic; -+#[macro_use] -+mod scalar_arithmetic; -+ -+#[macro_use] -+mod vector_bitwise; -+#[macro_use] -+mod scalar_bitwise; -+ -+#[macro_use] -+mod vector_shifts; -+#[macro_use] -+mod scalar_shifts; -+ -+#[macro_use] -+mod vector_rotates; -+ -+#[macro_use] -+mod vector_neg; -+ -+#[macro_use] -+mod vector_int_min_max; -+ -+#[macro_use] -+mod vector_float_min_max; -diff --git a/third_party/rust/packed_simd/src/api/ops/scalar_arithmetic.rs b/third_party/rust/packed_simd/src/api/ops/scalar_arithmetic.rs -new file mode 100644 -index 000000000000..da1a2037eaaf ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/ops/scalar_arithmetic.rs -@@ -0,0 +1,203 @@ -+//! Vertical (lane-wise) vector-scalar / scalar-vector arithmetic operations. -+ -+macro_rules! impl_ops_scalar_arithmetic { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl crate::ops::Add<$elem_ty> for $id { -+ type Output = Self; -+ #[inline] -+ fn add(self, other: $elem_ty) -> Self { -+ self + $id::splat(other) -+ } -+ } -+ impl crate::ops::Add<$id> for $elem_ty { -+ type Output = $id; -+ #[inline] -+ fn add(self, other: $id) -> $id { -+ $id::splat(self) + other -+ } -+ } -+ -+ impl crate::ops::Sub<$elem_ty> for $id { -+ type Output = Self; -+ #[inline] -+ fn sub(self, other: $elem_ty) -> Self { -+ self - $id::splat(other) -+ } -+ } -+ impl crate::ops::Sub<$id> for $elem_ty { -+ type Output = $id; -+ #[inline] -+ fn sub(self, other: $id) -> $id { -+ $id::splat(self) - other -+ } -+ } -+ -+ impl crate::ops::Mul<$elem_ty> for $id { -+ type Output = Self; -+ #[inline] -+ fn mul(self, other: $elem_ty) -> Self { -+ self * $id::splat(other) -+ } -+ } -+ impl crate::ops::Mul<$id> for $elem_ty { -+ type Output = $id; -+ #[inline] -+ fn mul(self, other: $id) -> $id { -+ $id::splat(self) * other -+ } -+ } -+ -+ impl crate::ops::Div<$elem_ty> for $id { -+ type Output = Self; -+ #[inline] -+ fn div(self, other: $elem_ty) -> Self { -+ self / $id::splat(other) -+ } -+ } -+ impl crate::ops::Div<$id> for $elem_ty { -+ type Output = $id; -+ #[inline] -+ fn div(self, other: $id) -> $id { -+ $id::splat(self) / other -+ } -+ } -+ -+ impl crate::ops::Rem<$elem_ty> for $id { -+ type Output = Self; -+ #[inline] -+ fn rem(self, other: $elem_ty) -> Self { -+ self % $id::splat(other) -+ } -+ } -+ impl crate::ops::Rem<$id> for $elem_ty { -+ type Output = $id; -+ #[inline] -+ fn rem(self, other: $id) -> $id { -+ $id::splat(self) % other -+ } -+ } -+ -+ impl crate::ops::AddAssign<$elem_ty> for $id { -+ #[inline] -+ fn add_assign(&mut self, other: $elem_ty) { -+ *self = *self + other; -+ } -+ } -+ -+ impl crate::ops::SubAssign<$elem_ty> for $id { -+ #[inline] -+ fn sub_assign(&mut self, other: $elem_ty) { -+ *self = *self - other; -+ } -+ } -+ -+ impl crate::ops::MulAssign<$elem_ty> for $id { -+ #[inline] -+ fn mul_assign(&mut self, other: $elem_ty) { -+ *self = *self * other; -+ } -+ } -+ -+ impl crate::ops::DivAssign<$elem_ty> for $id { -+ #[inline] -+ fn div_assign(&mut self, other: $elem_ty) { -+ *self = *self / other; -+ } -+ } -+ -+ impl crate::ops::RemAssign<$elem_ty> for $id { -+ #[inline] -+ fn rem_assign(&mut self, other: $elem_ty) { -+ *self = *self % other; -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _ops_scalar_arith>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn ops_scalar_arithmetic() { -+ let zi = 0 as $elem_ty; -+ let oi = 1 as $elem_ty; -+ let ti = 2 as $elem_ty; -+ let fi = 4 as $elem_ty; -+ let z = $id::splat(zi); -+ let o = $id::splat(oi); -+ let t = $id::splat(ti); -+ let f = $id::splat(fi); -+ -+ // add -+ assert_eq!(zi + z, z); -+ assert_eq!(z + zi, z); -+ assert_eq!(oi + z, o); -+ assert_eq!(o + zi, o); -+ assert_eq!(ti + z, t); -+ assert_eq!(t + zi, t); -+ assert_eq!(ti + t, f); -+ assert_eq!(t + ti, f); -+ // sub -+ assert_eq!(zi - z, z); -+ assert_eq!(z - zi, z); -+ assert_eq!(oi - z, o); -+ assert_eq!(o - zi, o); -+ assert_eq!(ti - z, t); -+ assert_eq!(t - zi, t); -+ assert_eq!(fi - t, t); -+ assert_eq!(f - ti, t); -+ assert_eq!(f - o - o, t); -+ assert_eq!(f - oi - oi, t); -+ // mul -+ assert_eq!(zi * z, z); -+ assert_eq!(z * zi, z); -+ assert_eq!(zi * o, z); -+ assert_eq!(z * oi, z); -+ assert_eq!(zi * t, z); -+ assert_eq!(z * ti, z); -+ assert_eq!(oi * t, t); -+ assert_eq!(o * ti, t); -+ assert_eq!(ti * t, f); -+ assert_eq!(t * ti, f); -+ // div -+ assert_eq!(zi / o, z); -+ assert_eq!(z / oi, z); -+ assert_eq!(ti / o, t); -+ assert_eq!(t / oi, t); -+ assert_eq!(fi / o, f); -+ assert_eq!(f / oi, f); -+ assert_eq!(ti / t, o); -+ assert_eq!(t / ti, o); -+ assert_eq!(fi / t, t); -+ assert_eq!(f / ti, t); -+ // rem -+ assert_eq!(oi % o, z); -+ assert_eq!(o % oi, z); -+ assert_eq!(fi % t, z); -+ assert_eq!(f % ti, z); -+ -+ { -+ let mut v = z; -+ assert_eq!(v, z); -+ v += oi; // add_assign -+ assert_eq!(v, o); -+ v -= oi; // sub_assign -+ assert_eq!(v, z); -+ v = t; -+ v *= oi; // mul_assign -+ assert_eq!(v, t); -+ v *= ti; -+ assert_eq!(v, f); -+ v /= oi; // div_assign -+ assert_eq!(v, f); -+ v /= ti; -+ assert_eq!(v, t); -+ v %= ti; // rem_assign -+ assert_eq!(v, z); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/ops/scalar_bitwise.rs b/third_party/rust/packed_simd/src/api/ops/scalar_bitwise.rs -new file mode 100644 -index 000000000000..88216769aec4 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/ops/scalar_bitwise.rs -@@ -0,0 +1,162 @@ -+//! Vertical (lane-wise) vector-scalar / scalar-vector bitwise operations. -+ -+macro_rules! impl_ops_scalar_bitwise { -+ ( -+ [$elem_ty:ident; $elem_count:expr]: -+ $id:ident | $test_tt:tt | -+ ($true:expr, $false:expr) -+ ) => { -+ impl crate::ops::BitXor<$elem_ty> for $id { -+ type Output = Self; -+ #[inline] -+ fn bitxor(self, other: $elem_ty) -> Self { -+ self ^ $id::splat(other) -+ } -+ } -+ impl crate::ops::BitXor<$id> for $elem_ty { -+ type Output = $id; -+ #[inline] -+ fn bitxor(self, other: $id) -> $id { -+ $id::splat(self) ^ other -+ } -+ } -+ -+ impl crate::ops::BitAnd<$elem_ty> for $id { -+ type Output = Self; -+ #[inline] -+ fn bitand(self, other: $elem_ty) -> Self { -+ self & $id::splat(other) -+ } -+ } -+ impl crate::ops::BitAnd<$id> for $elem_ty { -+ type Output = $id; -+ #[inline] -+ fn bitand(self, other: $id) -> $id { -+ $id::splat(self) & other -+ } -+ } -+ -+ impl crate::ops::BitOr<$elem_ty> for $id { -+ type Output = Self; -+ #[inline] -+ fn bitor(self, other: $elem_ty) -> Self { -+ self | $id::splat(other) -+ } -+ } -+ impl crate::ops::BitOr<$id> for $elem_ty { -+ type Output = $id; -+ #[inline] -+ fn bitor(self, other: $id) -> $id { -+ $id::splat(self) | other -+ } -+ } -+ -+ impl crate::ops::BitAndAssign<$elem_ty> for $id { -+ #[inline] -+ fn bitand_assign(&mut self, other: $elem_ty) { -+ *self = *self & other; -+ } -+ } -+ impl crate::ops::BitOrAssign<$elem_ty> for $id { -+ #[inline] -+ fn bitor_assign(&mut self, other: $elem_ty) { -+ *self = *self | other; -+ } -+ } -+ impl crate::ops::BitXorAssign<$elem_ty> for $id { -+ #[inline] -+ fn bitxor_assign(&mut self, other: $elem_ty) { -+ *self = *self ^ other; -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _ops_scalar_bitwise>] { -+ use super::*; -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn ops_scalar_bitwise() { -+ let zi = 0 as $elem_ty; -+ let oi = 1 as $elem_ty; -+ let ti = 2 as $elem_ty; -+ let z = $id::splat(zi); -+ let o = $id::splat(oi); -+ let t = $id::splat(ti); -+ -+ // BitAnd: -+ assert_eq!(oi & o, o); -+ assert_eq!(o & oi, o); -+ assert_eq!(oi & z, z); -+ assert_eq!(o & zi, z); -+ assert_eq!(zi & o, z); -+ assert_eq!(z & oi, z); -+ assert_eq!(zi & z, z); -+ assert_eq!(z & zi, z); -+ -+ assert_eq!(ti & t, t); -+ assert_eq!(t & ti, t); -+ assert_eq!(ti & o, z); -+ assert_eq!(t & oi, z); -+ assert_eq!(oi & t, z); -+ assert_eq!(o & ti, z); -+ -+ // BitOr: -+ assert_eq!(oi | o, o); -+ assert_eq!(o | oi, o); -+ assert_eq!(oi | z, o); -+ assert_eq!(o | zi, o); -+ assert_eq!(zi | o, o); -+ assert_eq!(z | oi, o); -+ assert_eq!(zi | z, z); -+ assert_eq!(z | zi, z); -+ -+ assert_eq!(ti | t, t); -+ assert_eq!(t | ti, t); -+ assert_eq!(zi | t, t); -+ assert_eq!(z | ti, t); -+ assert_eq!(ti | z, t); -+ assert_eq!(t | zi, t); -+ -+ // BitXOR: -+ assert_eq!(oi ^ o, z); -+ assert_eq!(o ^ oi, z); -+ assert_eq!(zi ^ z, z); -+ assert_eq!(z ^ zi, z); -+ assert_eq!(zi ^ o, o); -+ assert_eq!(z ^ oi, o); -+ assert_eq!(oi ^ z, o); -+ assert_eq!(o ^ zi, o); -+ -+ assert_eq!(ti ^ t, z); -+ assert_eq!(t ^ ti, z); -+ assert_eq!(ti ^ z, t); -+ assert_eq!(t ^ zi, t); -+ assert_eq!(zi ^ t, t); -+ assert_eq!(z ^ ti, t); -+ -+ { -+ // AndAssign: -+ let mut v = o; -+ v &= ti; -+ assert_eq!(v, z); -+ } -+ { -+ // OrAssign: -+ let mut v = z; -+ v |= oi; -+ assert_eq!(v, o); -+ } -+ { -+ // XORAssign: -+ let mut v = z; -+ v ^= oi; -+ assert_eq!(v, o); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/ops/scalar_mask_bitwise.rs b/third_party/rust/packed_simd/src/api/ops/scalar_mask_bitwise.rs -new file mode 100644 -index 000000000000..523a85207b6b ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/ops/scalar_mask_bitwise.rs -@@ -0,0 +1,140 @@ -+//! Vertical (lane-wise) vector-vector bitwise operations. -+ -+macro_rules! impl_ops_scalar_mask_bitwise { -+ ( -+ [$elem_ty:ident; $elem_count:expr]: -+ $id:ident | $test_tt:tt | -+ ($true:expr, $false:expr) -+ ) => { -+ impl crate::ops::BitXor for $id { -+ type Output = Self; -+ #[inline] -+ fn bitxor(self, other: bool) -> Self { -+ self ^ $id::splat(other) -+ } -+ } -+ impl crate::ops::BitXor<$id> for bool { -+ type Output = $id; -+ #[inline] -+ fn bitxor(self, other: $id) -> $id { -+ $id::splat(self) ^ other -+ } -+ } -+ -+ impl crate::ops::BitAnd for $id { -+ type Output = Self; -+ #[inline] -+ fn bitand(self, other: bool) -> Self { -+ self & $id::splat(other) -+ } -+ } -+ impl crate::ops::BitAnd<$id> for bool { -+ type Output = $id; -+ #[inline] -+ fn bitand(self, other: $id) -> $id { -+ $id::splat(self) & other -+ } -+ } -+ -+ impl crate::ops::BitOr for $id { -+ type Output = Self; -+ #[inline] -+ fn bitor(self, other: bool) -> Self { -+ self | $id::splat(other) -+ } -+ } -+ impl crate::ops::BitOr<$id> for bool { -+ type Output = $id; -+ #[inline] -+ fn bitor(self, other: $id) -> $id { -+ $id::splat(self) | other -+ } -+ } -+ -+ impl crate::ops::BitAndAssign for $id { -+ #[inline] -+ fn bitand_assign(&mut self, other: bool) { -+ *self = *self & other; -+ } -+ } -+ impl crate::ops::BitOrAssign for $id { -+ #[inline] -+ fn bitor_assign(&mut self, other: bool) { -+ *self = *self | other; -+ } -+ } -+ impl crate::ops::BitXorAssign for $id { -+ #[inline] -+ fn bitxor_assign(&mut self, other: bool) { -+ *self = *self ^ other; -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _ops_scalar_mask_bitwise>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn ops_scalar_mask_bitwise() { -+ let ti = true; -+ let fi = false; -+ let t = $id::splat(ti); -+ let f = $id::splat(fi); -+ assert!(t != f); -+ assert!(!(t == f)); -+ -+ // BitAnd: -+ assert_eq!(ti & f, f); -+ assert_eq!(t & fi, f); -+ assert_eq!(fi & t, f); -+ assert_eq!(f & ti, f); -+ assert_eq!(ti & t, t); -+ assert_eq!(t & ti, t); -+ assert_eq!(fi & f, f); -+ assert_eq!(f & fi, f); -+ -+ // BitOr: -+ assert_eq!(ti | f, t); -+ assert_eq!(t | fi, t); -+ assert_eq!(fi | t, t); -+ assert_eq!(f | ti, t); -+ assert_eq!(ti | t, t); -+ assert_eq!(t | ti, t); -+ assert_eq!(fi | f, f); -+ assert_eq!(f | fi, f); -+ -+ // BitXOR: -+ assert_eq!(ti ^ f, t); -+ assert_eq!(t ^ fi, t); -+ assert_eq!(fi ^ t, t); -+ assert_eq!(f ^ ti, t); -+ assert_eq!(ti ^ t, f); -+ assert_eq!(t ^ ti, f); -+ assert_eq!(fi ^ f, f); -+ assert_eq!(f ^ fi, f); -+ -+ { -+ // AndAssign: -+ let mut v = f; -+ v &= ti; -+ assert_eq!(v, f); -+ } -+ { -+ // OrAssign: -+ let mut v = f; -+ v |= ti; -+ assert_eq!(v, t); -+ } -+ { -+ // XORAssign: -+ let mut v = f; -+ v ^= ti; -+ assert_eq!(v, t); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/ops/scalar_shifts.rs b/third_party/rust/packed_simd/src/api/ops/scalar_shifts.rs -new file mode 100644 -index 000000000000..9c164ad56c0b ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/ops/scalar_shifts.rs -@@ -0,0 +1,107 @@ -+//! Vertical (lane-wise) vector-scalar shifts operations. -+ -+macro_rules! impl_ops_scalar_shifts { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl crate::ops::Shl for $id { -+ type Output = Self; -+ #[inline] -+ fn shl(self, other: u32) -> Self { -+ self << $id::splat(other as $elem_ty) -+ } -+ } -+ impl crate::ops::Shr for $id { -+ type Output = Self; -+ #[inline] -+ fn shr(self, other: u32) -> Self { -+ self >> $id::splat(other as $elem_ty) -+ } -+ } -+ -+ impl crate::ops::ShlAssign for $id { -+ #[inline] -+ fn shl_assign(&mut self, other: u32) { -+ *self = *self << other; -+ } -+ } -+ impl crate::ops::ShrAssign for $id { -+ #[inline] -+ fn shr_assign(&mut self, other: u32) { -+ *self = *self >> other; -+ } -+ } -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _ops_scalar_shifts>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg_attr(any(target_arch = "s390x", target_arch = "sparc64"), -+ allow(unreachable_code, -+ unused_variables, -+ unused_mut) -+ )] -+ // ^^^ FIXME: https://github.com/rust-lang/rust/issues/55344 -+ fn ops_scalar_shifts() { -+ let z = $id::splat(0 as $elem_ty); -+ let o = $id::splat(1 as $elem_ty); -+ let t = $id::splat(2 as $elem_ty); -+ let f = $id::splat(4 as $elem_ty); -+ -+ { -+ let zi = 0 as u32; -+ let oi = 1 as u32; -+ let ti = 2 as u32; -+ let maxi -+ = (mem::size_of::<$elem_ty>() * 8 - 1) as u32; -+ -+ // shr -+ assert_eq!(z >> zi, z); -+ assert_eq!(z >> oi, z); -+ assert_eq!(z >> ti, z); -+ assert_eq!(z >> ti, z); -+ -+ #[cfg(any(target_arch = "s390x", target_arch = "sparc64"))] { -+ // FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/13 -+ return; -+ } -+ -+ assert_eq!(o >> zi, o); -+ assert_eq!(t >> zi, t); -+ assert_eq!(f >> zi, f); -+ assert_eq!(f >> maxi, z); -+ -+ assert_eq!(o >> oi, z); -+ assert_eq!(t >> oi, o); -+ assert_eq!(t >> ti, z); -+ assert_eq!(f >> oi, t); -+ assert_eq!(f >> ti, o); -+ assert_eq!(f >> maxi, z); -+ -+ // shl -+ assert_eq!(z << zi, z); -+ assert_eq!(o << zi, o); -+ assert_eq!(t << zi, t); -+ assert_eq!(f << zi, f); -+ assert_eq!(f << maxi, z); -+ -+ assert_eq!(o << oi, t); -+ assert_eq!(o << ti, f); -+ assert_eq!(t << oi, f); -+ -+ { // shr_assign -+ let mut v = o; -+ v >>= oi; -+ assert_eq!(v, z); -+ } -+ { // shl_assign -+ let mut v = o; -+ v <<= oi; -+ assert_eq!(v, t); -+ } -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/ops/vector_arithmetic.rs b/third_party/rust/packed_simd/src/api/ops/vector_arithmetic.rs -new file mode 100644 -index 000000000000..7057f52d0317 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/ops/vector_arithmetic.rs -@@ -0,0 +1,148 @@ -+//! Vertical (lane-wise) vector-vector arithmetic operations. -+ -+macro_rules! impl_ops_vector_arithmetic { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl crate::ops::Add for $id { -+ type Output = Self; -+ #[inline] -+ fn add(self, other: Self) -> Self { -+ use crate::llvm::simd_add; -+ unsafe { Simd(simd_add(self.0, other.0)) } -+ } -+ } -+ -+ impl crate::ops::Sub for $id { -+ type Output = Self; -+ #[inline] -+ fn sub(self, other: Self) -> Self { -+ use crate::llvm::simd_sub; -+ unsafe { Simd(simd_sub(self.0, other.0)) } -+ } -+ } -+ -+ impl crate::ops::Mul for $id { -+ type Output = Self; -+ #[inline] -+ fn mul(self, other: Self) -> Self { -+ use crate::llvm::simd_mul; -+ unsafe { Simd(simd_mul(self.0, other.0)) } -+ } -+ } -+ -+ impl crate::ops::Div for $id { -+ type Output = Self; -+ #[inline] -+ fn div(self, other: Self) -> Self { -+ use crate::llvm::simd_div; -+ unsafe { Simd(simd_div(self.0, other.0)) } -+ } -+ } -+ -+ impl crate::ops::Rem for $id { -+ type Output = Self; -+ #[inline] -+ fn rem(self, other: Self) -> Self { -+ use crate::llvm::simd_rem; -+ unsafe { Simd(simd_rem(self.0, other.0)) } -+ } -+ } -+ -+ impl crate::ops::AddAssign for $id { -+ #[inline] -+ fn add_assign(&mut self, other: Self) { -+ *self = *self + other; -+ } -+ } -+ -+ impl crate::ops::SubAssign for $id { -+ #[inline] -+ fn sub_assign(&mut self, other: Self) { -+ *self = *self - other; -+ } -+ } -+ -+ impl crate::ops::MulAssign for $id { -+ #[inline] -+ fn mul_assign(&mut self, other: Self) { -+ *self = *self * other; -+ } -+ } -+ -+ impl crate::ops::DivAssign for $id { -+ #[inline] -+ fn div_assign(&mut self, other: Self) { -+ *self = *self / other; -+ } -+ } -+ -+ impl crate::ops::RemAssign for $id { -+ #[inline] -+ fn rem_assign(&mut self, other: Self) { -+ *self = *self % other; -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _ops_vector_arith>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn ops_vector_arithmetic() { -+ let z = $id::splat(0 as $elem_ty); -+ let o = $id::splat(1 as $elem_ty); -+ let t = $id::splat(2 as $elem_ty); -+ let f = $id::splat(4 as $elem_ty); -+ -+ // add -+ assert_eq!(z + z, z); -+ assert_eq!(o + z, o); -+ assert_eq!(t + z, t); -+ assert_eq!(t + t, f); -+ // sub -+ assert_eq!(z - z, z); -+ assert_eq!(o - z, o); -+ assert_eq!(t - z, t); -+ assert_eq!(f - t, t); -+ assert_eq!(f - o - o, t); -+ // mul -+ assert_eq!(z * z, z); -+ assert_eq!(z * o, z); -+ assert_eq!(z * t, z); -+ assert_eq!(o * t, t); -+ assert_eq!(t * t, f); -+ // div -+ assert_eq!(z / o, z); -+ assert_eq!(t / o, t); -+ assert_eq!(f / o, f); -+ assert_eq!(t / t, o); -+ assert_eq!(f / t, t); -+ // rem -+ assert_eq!(o % o, z); -+ assert_eq!(f % t, z); -+ -+ { -+ let mut v = z; -+ assert_eq!(v, z); -+ v += o; // add_assign -+ assert_eq!(v, o); -+ v -= o; // sub_assign -+ assert_eq!(v, z); -+ v = t; -+ v *= o; // mul_assign -+ assert_eq!(v, t); -+ v *= t; -+ assert_eq!(v, f); -+ v /= o; // div_assign -+ assert_eq!(v, f); -+ v /= t; -+ assert_eq!(v, t); -+ v %= t; // rem_assign -+ assert_eq!(v, z); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/ops/vector_bitwise.rs b/third_party/rust/packed_simd/src/api/ops/vector_bitwise.rs -new file mode 100644 -index 000000000000..7be9603fa261 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/ops/vector_bitwise.rs -@@ -0,0 +1,129 @@ -+//! Vertical (lane-wise) vector-vector bitwise operations. -+ -+macro_rules! impl_ops_vector_bitwise { -+ ( -+ [$elem_ty:ident; $elem_count:expr]: -+ $id:ident | $test_tt:tt | -+ ($true:expr, $false:expr) -+ ) => { -+ impl crate::ops::Not for $id { -+ type Output = Self; -+ #[inline] -+ fn not(self) -> Self { -+ Self::splat($true) ^ self -+ } -+ } -+ impl crate::ops::BitXor for $id { -+ type Output = Self; -+ #[inline] -+ fn bitxor(self, other: Self) -> Self { -+ use crate::llvm::simd_xor; -+ unsafe { Simd(simd_xor(self.0, other.0)) } -+ } -+ } -+ impl crate::ops::BitAnd for $id { -+ type Output = Self; -+ #[inline] -+ fn bitand(self, other: Self) -> Self { -+ use crate::llvm::simd_and; -+ unsafe { Simd(simd_and(self.0, other.0)) } -+ } -+ } -+ impl crate::ops::BitOr for $id { -+ type Output = Self; -+ #[inline] -+ fn bitor(self, other: Self) -> Self { -+ use crate::llvm::simd_or; -+ unsafe { Simd(simd_or(self.0, other.0)) } -+ } -+ } -+ impl crate::ops::BitAndAssign for $id { -+ #[inline] -+ fn bitand_assign(&mut self, other: Self) { -+ *self = *self & other; -+ } -+ } -+ impl crate::ops::BitOrAssign for $id { -+ #[inline] -+ fn bitor_assign(&mut self, other: Self) { -+ *self = *self | other; -+ } -+ } -+ impl crate::ops::BitXorAssign for $id { -+ #[inline] -+ fn bitxor_assign(&mut self, other: Self) { -+ *self = *self ^ other; -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _ops_vector_bitwise>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn ops_vector_bitwise() { -+ -+ let z = $id::splat(0 as $elem_ty); -+ let o = $id::splat(1 as $elem_ty); -+ let t = $id::splat(2 as $elem_ty); -+ let m = $id::splat(!z.extract(0)); -+ -+ // Not: -+ assert_eq!(!z, m); -+ assert_eq!(!m, z); -+ -+ // BitAnd: -+ assert_eq!(o & o, o); -+ assert_eq!(o & z, z); -+ assert_eq!(z & o, z); -+ assert_eq!(z & z, z); -+ -+ assert_eq!(t & t, t); -+ assert_eq!(t & o, z); -+ assert_eq!(o & t, z); -+ -+ // BitOr: -+ assert_eq!(o | o, o); -+ assert_eq!(o | z, o); -+ assert_eq!(z | o, o); -+ assert_eq!(z | z, z); -+ -+ assert_eq!(t | t, t); -+ assert_eq!(z | t, t); -+ assert_eq!(t | z, t); -+ -+ // BitXOR: -+ assert_eq!(o ^ o, z); -+ assert_eq!(z ^ z, z); -+ assert_eq!(z ^ o, o); -+ assert_eq!(o ^ z, o); -+ -+ assert_eq!(t ^ t, z); -+ assert_eq!(t ^ z, t); -+ assert_eq!(z ^ t, t); -+ -+ { -+ // AndAssign: -+ let mut v = o; -+ v &= t; -+ assert_eq!(v, z); -+ } -+ { -+ // OrAssign: -+ let mut v = z; -+ v |= o; -+ assert_eq!(v, o); -+ } -+ { -+ // XORAssign: -+ let mut v = z; -+ v ^= o; -+ assert_eq!(v, o); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/ops/vector_float_min_max.rs b/third_party/rust/packed_simd/src/api/ops/vector_float_min_max.rs -new file mode 100644 -index 000000000000..4126e87042f5 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/ops/vector_float_min_max.rs -@@ -0,0 +1,69 @@ -+//! Vertical (lane-wise) vector `min` and `max` for floating-point vectors. -+ -+macro_rules! impl_ops_vector_float_min_max { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Minimum of two vectors. -+ /// -+ /// Returns a new vector containing the minimum value of each of -+ /// the input vector lanes. -+ #[inline] -+ pub fn min(self, x: Self) -> Self { -+ use crate::llvm::simd_fmin; -+ unsafe { Simd(simd_fmin(self.0, x.0)) } -+ } -+ -+ /// Maximum of two vectors. -+ /// -+ /// Returns a new vector containing the maximum value of each of -+ /// the input vector lanes. -+ #[inline] -+ pub fn max(self, x: Self) -> Self { -+ use crate::llvm::simd_fmax; -+ unsafe { Simd(simd_fmax(self.0, x.0)) } -+ } -+ } -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _ops_vector_min_max>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn min_max() { -+ let n = crate::$elem_ty::NAN; -+ let o = $id::splat(1. as $elem_ty); -+ let t = $id::splat(2. as $elem_ty); -+ -+ let mut m = o; // [1., 2., 1., 2., ...] -+ let mut on = o; -+ for i in 0..$id::lanes() { -+ if i % 2 == 0 { -+ m = m.replace(i, 2. as $elem_ty); -+ on = on.replace(i, n); -+ } -+ } -+ -+ assert_eq!(o.min(t), o); -+ assert_eq!(t.min(o), o); -+ assert_eq!(m.min(o), o); -+ assert_eq!(o.min(m), o); -+ assert_eq!(m.min(t), m); -+ assert_eq!(t.min(m), m); -+ -+ assert_eq!(o.max(t), t); -+ assert_eq!(t.max(o), t); -+ assert_eq!(m.max(o), m); -+ assert_eq!(o.max(m), m); -+ assert_eq!(m.max(t), t); -+ assert_eq!(t.max(m), t); -+ -+ assert_eq!(on.min(o), o); -+ assert_eq!(o.min(on), o); -+ assert_eq!(on.max(o), o); -+ assert_eq!(o.max(on), o); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/ops/vector_int_min_max.rs b/third_party/rust/packed_simd/src/api/ops/vector_int_min_max.rs -new file mode 100644 -index 000000000000..36ea98e6bf32 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/ops/vector_int_min_max.rs -@@ -0,0 +1,57 @@ -+//! Vertical (lane-wise) vector `min` and `max` for integer vectors. -+ -+macro_rules! impl_ops_vector_int_min_max { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Minimum of two vectors. -+ /// -+ /// Returns a new vector containing the minimum value of each of -+ /// the input vector lanes. -+ #[inline] -+ pub fn min(self, x: Self) -> Self { -+ self.lt(x).select(self, x) -+ } -+ -+ /// Maximum of two vectors. -+ /// -+ /// Returns a new vector containing the maximum value of each of -+ /// the input vector lanes. -+ #[inline] -+ pub fn max(self, x: Self) -> Self { -+ self.gt(x).select(self, x) -+ } -+ } -+ test_if!{$test_tt: -+ paste::item! { -+ pub mod [<$id _ops_vector_min_max>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn min_max() { -+ let o = $id::splat(1 as $elem_ty); -+ let t = $id::splat(2 as $elem_ty); -+ -+ let mut m = o; -+ for i in 0..$id::lanes() { -+ if i % 2 == 0 { -+ m = m.replace(i, 2 as $elem_ty); -+ } -+ } -+ assert_eq!(o.min(t), o); -+ assert_eq!(t.min(o), o); -+ assert_eq!(m.min(o), o); -+ assert_eq!(o.min(m), o); -+ assert_eq!(m.min(t), m); -+ assert_eq!(t.min(m), m); -+ -+ assert_eq!(o.max(t), t); -+ assert_eq!(t.max(o), t); -+ assert_eq!(m.max(o), m); -+ assert_eq!(o.max(m), m); -+ assert_eq!(m.max(t), t); -+ assert_eq!(t.max(m), t); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/ops/vector_mask_bitwise.rs b/third_party/rust/packed_simd/src/api/ops/vector_mask_bitwise.rs -new file mode 100644 -index 000000000000..295fc1ca81c9 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/ops/vector_mask_bitwise.rs -@@ -0,0 +1,116 @@ -+//! Vertical (lane-wise) vector-vector bitwise operations. -+ -+macro_rules! impl_ops_vector_mask_bitwise { -+ ( -+ [$elem_ty:ident; $elem_count:expr]: -+ $id:ident | $test_tt:tt | -+ ($true:expr, $false:expr) -+ ) => { -+ impl crate::ops::Not for $id { -+ type Output = Self; -+ #[inline] -+ fn not(self) -> Self { -+ Self::splat($true) ^ self -+ } -+ } -+ impl crate::ops::BitXor for $id { -+ type Output = Self; -+ #[inline] -+ fn bitxor(self, other: Self) -> Self { -+ use crate::llvm::simd_xor; -+ unsafe { Simd(simd_xor(self.0, other.0)) } -+ } -+ } -+ impl crate::ops::BitAnd for $id { -+ type Output = Self; -+ #[inline] -+ fn bitand(self, other: Self) -> Self { -+ use crate::llvm::simd_and; -+ unsafe { Simd(simd_and(self.0, other.0)) } -+ } -+ } -+ impl crate::ops::BitOr for $id { -+ type Output = Self; -+ #[inline] -+ fn bitor(self, other: Self) -> Self { -+ use crate::llvm::simd_or; -+ unsafe { Simd(simd_or(self.0, other.0)) } -+ } -+ } -+ impl crate::ops::BitAndAssign for $id { -+ #[inline] -+ fn bitand_assign(&mut self, other: Self) { -+ *self = *self & other; -+ } -+ } -+ impl crate::ops::BitOrAssign for $id { -+ #[inline] -+ fn bitor_assign(&mut self, other: Self) { -+ *self = *self | other; -+ } -+ } -+ impl crate::ops::BitXorAssign for $id { -+ #[inline] -+ fn bitxor_assign(&mut self, other: Self) { -+ *self = *self ^ other; -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _ops_vector_mask_bitwise>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn ops_vector_mask_bitwise() { -+ let t = $id::splat(true); -+ let f = $id::splat(false); -+ assert!(t != f); -+ assert!(!(t == f)); -+ -+ // Not: -+ assert_eq!(!t, f); -+ assert_eq!(t, !f); -+ -+ // BitAnd: -+ assert_eq!(t & f, f); -+ assert_eq!(f & t, f); -+ assert_eq!(t & t, t); -+ assert_eq!(f & f, f); -+ -+ // BitOr: -+ assert_eq!(t | f, t); -+ assert_eq!(f | t, t); -+ assert_eq!(t | t, t); -+ assert_eq!(f | f, f); -+ -+ // BitXOR: -+ assert_eq!(t ^ f, t); -+ assert_eq!(f ^ t, t); -+ assert_eq!(t ^ t, f); -+ assert_eq!(f ^ f, f); -+ -+ { -+ // AndAssign: -+ let mut v = f; -+ v &= t; -+ assert_eq!(v, f); -+ } -+ { -+ // OrAssign: -+ let mut v = f; -+ v |= t; -+ assert_eq!(v, t); -+ } -+ { -+ // XORAssign: -+ let mut v = f; -+ v ^= t; -+ assert_eq!(v, t); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/ops/vector_neg.rs b/third_party/rust/packed_simd/src/api/ops/vector_neg.rs -new file mode 100644 -index 000000000000..e2d91fd2fed6 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/ops/vector_neg.rs -@@ -0,0 +1,43 @@ -+//! Vertical (lane-wise) vector `Neg`. -+ -+macro_rules! impl_ops_vector_neg { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl crate::ops::Neg for $id { -+ type Output = Self; -+ #[inline] -+ fn neg(self) -> Self { -+ Self::splat(-1 as $elem_ty) * self -+ } -+ } -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _ops_vector_neg>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn neg() { -+ let z = $id::splat(0 as $elem_ty); -+ let o = $id::splat(1 as $elem_ty); -+ let t = $id::splat(2 as $elem_ty); -+ let f = $id::splat(4 as $elem_ty); -+ -+ let nz = $id::splat(-(0 as $elem_ty)); -+ let no = $id::splat(-(1 as $elem_ty)); -+ let nt = $id::splat(-(2 as $elem_ty)); -+ let nf = $id::splat(-(4 as $elem_ty)); -+ -+ assert_eq!(-z, nz); -+ assert_eq!(-o, no); -+ assert_eq!(-t, nt); -+ assert_eq!(-f, nf); -+ -+ assert_eq!(z, -nz); -+ assert_eq!(o, -no); -+ assert_eq!(t, -nt); -+ assert_eq!(f, -nf); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/ops/vector_rotates.rs b/third_party/rust/packed_simd/src/api/ops/vector_rotates.rs -new file mode 100644 -index 000000000000..6c794ecf4b93 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/ops/vector_rotates.rs -@@ -0,0 +1,90 @@ -+//! Vertical (lane-wise) vector rotates operations. -+#![allow(unused)] -+ -+macro_rules! impl_ops_vector_rotates { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Shifts the bits of each lane to the left by the specified -+ /// amount in the corresponding lane of `n`, wrapping the -+ /// truncated bits to the end of the resulting integer. -+ /// -+ /// Note: this is neither the same operation as `<<` nor equivalent -+ /// to `slice::rotate_left`. -+ #[inline] -+ pub fn rotate_left(self, n: $id) -> $id { -+ const LANE_WIDTH: $elem_ty = -+ crate::mem::size_of::<$elem_ty>() as $elem_ty * 8; -+ // Protect against undefined behavior for over-long bit shifts -+ let n = n % LANE_WIDTH; -+ (self << n) | (self >> ((LANE_WIDTH - n) % LANE_WIDTH)) -+ } -+ -+ /// Shifts the bits of each lane to the right by the specified -+ /// amount in the corresponding lane of `n`, wrapping the -+ /// truncated bits to the beginning of the resulting integer. -+ /// -+ /// Note: this is neither the same operation as `<<` nor equivalent -+ /// to `slice::rotate_left`. -+ #[inline] -+ pub fn rotate_right(self, n: $id) -> $id { -+ const LANE_WIDTH: $elem_ty = -+ crate::mem::size_of::<$elem_ty>() as $elem_ty * 8; -+ // Protect against undefined behavior for over-long bit shifts -+ let n = n % LANE_WIDTH; -+ (self >> n) | (self << ((LANE_WIDTH - n) % LANE_WIDTH)) -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ // FIXME: -+ // https://github.com/rust-lang-nursery/packed_simd/issues/75 -+ #[cfg(not(any( -+ target_arch = "s390x", -+ target_arch = "sparc64", -+ )))] -+ pub mod [<$id _ops_vector_rotate>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn rotate_ops() { -+ let z = $id::splat(0 as $elem_ty); -+ let o = $id::splat(1 as $elem_ty); -+ let t = $id::splat(2 as $elem_ty); -+ let f = $id::splat(4 as $elem_ty); -+ -+ let max = $id::splat( -+ (mem::size_of::<$elem_ty>() * 8 - 1) as $elem_ty); -+ -+ // rotate_right -+ assert_eq!(z.rotate_right(z), z); -+ assert_eq!(z.rotate_right(o), z); -+ assert_eq!(z.rotate_right(t), z); -+ -+ assert_eq!(o.rotate_right(z), o); -+ assert_eq!(t.rotate_right(z), t); -+ assert_eq!(f.rotate_right(z), f); -+ assert_eq!(f.rotate_right(max), f << 1); -+ -+ assert_eq!(o.rotate_right(o), o << max); -+ assert_eq!(t.rotate_right(o), o); -+ assert_eq!(t.rotate_right(t), o << max); -+ assert_eq!(f.rotate_right(o), t); -+ assert_eq!(f.rotate_right(t), o); -+ -+ // rotate_left -+ assert_eq!(z.rotate_left(z), z); -+ assert_eq!(o.rotate_left(z), o); -+ assert_eq!(t.rotate_left(z), t); -+ assert_eq!(f.rotate_left(z), f); -+ assert_eq!(f.rotate_left(max), t); -+ -+ assert_eq!(o.rotate_left(o), t); -+ assert_eq!(o.rotate_left(t), f); -+ assert_eq!(t.rotate_left(o), f); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/ops/vector_shifts.rs b/third_party/rust/packed_simd/src/api/ops/vector_shifts.rs -new file mode 100644 -index 000000000000..22e1fbc0ec76 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/ops/vector_shifts.rs -@@ -0,0 +1,107 @@ -+//! Vertical (lane-wise) vector-vector shifts operations. -+ -+macro_rules! impl_ops_vector_shifts { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl crate::ops::Shl<$id> for $id { -+ type Output = Self; -+ #[inline] -+ fn shl(self, other: Self) -> Self { -+ use crate::llvm::simd_shl; -+ unsafe { Simd(simd_shl(self.0, other.0)) } -+ } -+ } -+ impl crate::ops::Shr<$id> for $id { -+ type Output = Self; -+ #[inline] -+ fn shr(self, other: Self) -> Self { -+ use crate::llvm::simd_shr; -+ unsafe { Simd(simd_shr(self.0, other.0)) } -+ } -+ } -+ impl crate::ops::ShlAssign<$id> for $id { -+ #[inline] -+ fn shl_assign(&mut self, other: Self) { -+ *self = *self << other; -+ } -+ } -+ impl crate::ops::ShrAssign<$id> for $id { -+ #[inline] -+ fn shr_assign(&mut self, other: Self) { -+ *self = *self >> other; -+ } -+ } -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _ops_vector_shifts>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg_attr(any(target_arch = "s390x", target_arch = "sparc64"), -+ allow(unreachable_code, -+ unused_variables, -+ unused_mut) -+ )] -+ // ^^^ FIXME: https://github.com/rust-lang/rust/issues/55344 -+ fn ops_vector_shifts() { -+ let z = $id::splat(0 as $elem_ty); -+ let o = $id::splat(1 as $elem_ty); -+ let t = $id::splat(2 as $elem_ty); -+ let f = $id::splat(4 as $elem_ty); -+ -+ let max =$id::splat( -+ (mem::size_of::<$elem_ty>() * 8 - 1) as $elem_ty -+ ); -+ -+ // shr -+ assert_eq!(z >> z, z); -+ assert_eq!(z >> o, z); -+ assert_eq!(z >> t, z); -+ assert_eq!(z >> t, z); -+ -+ #[cfg(any(target_arch = "s390x", target_arch = "sparc64"))] { -+ // FIXME: rust produces bad codegen for shifts: -+ // https://github.com/rust-lang-nursery/packed_simd/issues/13 -+ return; -+ } -+ -+ assert_eq!(o >> z, o); -+ assert_eq!(t >> z, t); -+ assert_eq!(f >> z, f); -+ assert_eq!(f >> max, z); -+ -+ assert_eq!(o >> o, z); -+ assert_eq!(t >> o, o); -+ assert_eq!(t >> t, z); -+ assert_eq!(f >> o, t); -+ assert_eq!(f >> t, o); -+ assert_eq!(f >> max, z); -+ -+ // shl -+ assert_eq!(z << z, z); -+ assert_eq!(o << z, o); -+ assert_eq!(t << z, t); -+ assert_eq!(f << z, f); -+ assert_eq!(f << max, z); -+ -+ assert_eq!(o << o, t); -+ assert_eq!(o << t, f); -+ assert_eq!(t << o, f); -+ -+ { -+ // shr_assign -+ let mut v = o; -+ v >>= o; -+ assert_eq!(v, z); -+ } -+ { -+ // shl_assign -+ let mut v = o; -+ v <<= o; -+ assert_eq!(v, t); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/ptr.rs b/third_party/rust/packed_simd/src/api/ptr.rs -new file mode 100644 -index 000000000000..d2e523a49faf ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/ptr.rs -@@ -0,0 +1,4 @@ -+//! Vector of pointers -+ -+#[macro_use] -+mod gather_scatter; -diff --git a/third_party/rust/packed_simd/src/api/ptr/gather_scatter.rs b/third_party/rust/packed_simd/src/api/ptr/gather_scatter.rs -new file mode 100644 -index 000000000000..9d8e113bb44f ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/ptr/gather_scatter.rs -@@ -0,0 +1,241 @@ -+//! Implements masked gather and scatters for vectors of pointers -+ -+macro_rules! impl_ptr_read { -+ ([$elem_ty:ty; $elem_count:expr]: $id:ident, $mask_ty:ident -+ | $test_tt:tt) => { -+ impl $id -+ where -+ [T; $elem_count]: sealed::SimdArray, -+ { -+ /// Reads selected vector elements from memory. -+ /// -+ /// Instantiates a new vector by reading the values from `self` for -+ /// those lanes whose `mask` is `true`, and using the elements of -+ /// `value` otherwise. -+ /// -+ /// No memory is accessed for those lanes of `self` whose `mask` is -+ /// `false`. -+ /// -+ /// # Safety -+ /// -+ /// This method is unsafe because it dereferences raw pointers. The -+ /// pointers must be aligned to `mem::align_of::()`. -+ #[inline] -+ pub unsafe fn read( -+ self, mask: Simd<[M; $elem_count]>, -+ value: Simd<[T; $elem_count]>, -+ ) -> Simd<[T; $elem_count]> -+ where -+ M: sealed::Mask, -+ [M; $elem_count]: sealed::SimdArray, -+ { -+ use crate::llvm::simd_gather; -+ Simd(simd_gather(value.0, self.0, mask.0)) -+ } -+ } -+ -+ test_if! { -+ $test_tt: -+ paste::item! { -+ mod [<$id _read>] { -+ use super::*; -+ #[test] -+ fn read() { -+ let mut v = [0_i32; $elem_count]; -+ for i in 0..$elem_count { -+ v[i] = i as i32; -+ } -+ -+ let mut ptr = $id::::null(); -+ -+ for i in 0..$elem_count { -+ ptr = ptr.replace(i, unsafe { -+ crate::mem::transmute(&v[i] as *const i32) -+ }); -+ } -+ -+ // all mask elements are true: -+ let mask = $mask_ty::splat(true); -+ let def = Simd::<[i32; $elem_count]>::splat(42_i32); -+ let r: Simd<[i32; $elem_count]> = unsafe { -+ ptr.read(mask, def) -+ }; -+ assert_eq!( -+ r, -+ Simd::<[i32; $elem_count]>::from_slice_unaligned( -+ &v -+ ) -+ ); -+ -+ let mut mask = mask; -+ for i in 0..$elem_count { -+ if i % 2 != 0 { -+ mask = mask.replace(i, false); -+ } -+ } -+ -+ // even mask elements are true, odd ones are false: -+ let r: Simd<[i32; $elem_count]> = unsafe { -+ ptr.read(mask, def) -+ }; -+ let mut e = v; -+ for i in 0..$elem_count { -+ if i % 2 != 0 { -+ e[i] = 42; -+ } -+ } -+ assert_eq!( -+ r, -+ Simd::<[i32; $elem_count]>::from_slice_unaligned( -+ &e -+ ) -+ ); -+ -+ // all mask elements are false: -+ let mask = $mask_ty::splat(false); -+ let def = Simd::<[i32; $elem_count]>::splat(42_i32); -+ let r: Simd<[i32; $elem_count]> = unsafe { -+ ptr.read(mask, def) } -+ ; -+ assert_eq!(r, def); -+ } -+ } -+ } -+ } -+ }; -+} -+ -+macro_rules! impl_ptr_write { -+ ([$elem_ty:ty; $elem_count:expr]: $id:ident, $mask_ty:ident -+ | $test_tt:tt) => { -+ impl $id -+ where -+ [T; $elem_count]: sealed::SimdArray, -+ { -+ /// Writes selected vector elements to memory. -+ /// -+ /// Writes the lanes of `values` for which the mask is `true` to -+ /// their corresponding memory addresses in `self`. -+ /// -+ /// No memory is accessed for those lanes of `self` whose `mask` is -+ /// `false`. -+ /// -+ /// Overlapping memory addresses of `self` are written to in order -+ /// from the lest-significant to the most-significant element. -+ /// -+ /// # Safety -+ /// -+ /// This method is unsafe because it dereferences raw pointers. The -+ /// pointers must be aligned to `mem::align_of::()`. -+ #[inline] -+ pub unsafe fn write( -+ self, mask: Simd<[M; $elem_count]>, -+ value: Simd<[T; $elem_count]>, -+ ) where -+ M: sealed::Mask, -+ [M; $elem_count]: sealed::SimdArray, -+ { -+ // FIXME: -+ // https://github.com/rust-lang-nursery/packed_simd/issues/85 -+ #[cfg(not(target_arch = "mips"))] -+ { -+ use crate::llvm::simd_scatter; -+ simd_scatter(value.0, self.0, mask.0) -+ } -+ #[cfg(target_arch = "mips")] -+ { -+ let m_ptr = -+ &mask as *const Simd<[M; $elem_count]> as *const M; -+ for i in 0..$elem_count { -+ let m = ptr::read(m_ptr.add(i)); -+ if m.test() { -+ let t_ptr = &self -+ as *const Simd<[*mut T; $elem_count]> -+ as *mut *mut T; -+ let v_ptr = &value as *const Simd<[T; $elem_count]> -+ as *const T; -+ ptr::write( -+ ptr::read(t_ptr.add(i)), -+ ptr::read(v_ptr.add(i)), -+ ); -+ } -+ } -+ } -+ } -+ } -+ -+ test_if! { -+ $test_tt: -+ paste::item! { -+ mod [<$id _write>] { -+ use super::*; -+ #[test] -+ fn write() { -+ // fourty_two = [42, 42, 42, ...] -+ let fourty_two -+ = Simd::<[i32; $elem_count]>::splat(42_i32); -+ -+ // This test will write to this array -+ let mut arr = [0_i32; $elem_count]; -+ for i in 0..$elem_count { -+ arr[i] = i as i32; -+ } -+ // arr = [0, 1, 2, ...] -+ -+ let mut ptr = $id::::null(); -+ for i in 0..$elem_count { -+ ptr = ptr.replace(i, unsafe { -+ crate::mem::transmute(arr.as_ptr().add(i)) -+ }); -+ } -+ // ptr = [&arr[0], &arr[1], ...] -+ -+ // write `fourty_two` to all elements of `v` -+ { -+ let backup = arr; -+ unsafe { -+ ptr.write($mask_ty::splat(true), fourty_two) -+ }; -+ assert_eq!(arr, [42_i32; $elem_count]); -+ arr = backup; // arr = [0, 1, 2, ...] -+ } -+ -+ // write 42 to even elements of arr: -+ { -+ // set odd elements of the mask to false -+ let mut mask = $mask_ty::splat(true); -+ for i in 0..$elem_count { -+ if i % 2 != 0 { -+ mask = mask.replace(i, false); -+ } -+ } -+ // mask = [true, false, true, false, ...] -+ -+ // expected result r = [42, 1, 42, 3, 42, 5, ...] -+ let mut r = arr; -+ for i in 0..$elem_count { -+ if i % 2 == 0 { -+ r[i] = 42; -+ } -+ } -+ -+ let backup = arr; -+ unsafe { ptr.write(mask, fourty_two) }; -+ assert_eq!(arr, r); -+ arr = backup; // arr = [0, 1, 2, 3, ...] -+ } -+ -+ // write 42 to no elements of arr -+ { -+ let backup = arr; -+ unsafe { -+ ptr.write($mask_ty::splat(false), fourty_two) -+ }; -+ assert_eq!(arr, backup); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/reductions.rs b/third_party/rust/packed_simd/src/api/reductions.rs -new file mode 100644 -index 000000000000..54d2f0cc7f08 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/reductions.rs -@@ -0,0 +1,12 @@ -+//! Reductions -+ -+#[macro_use] -+mod float_arithmetic; -+#[macro_use] -+mod integer_arithmetic; -+#[macro_use] -+mod bitwise; -+#[macro_use] -+mod mask; -+#[macro_use] -+mod min_max; -diff --git a/third_party/rust/packed_simd/src/api/reductions/bitwise.rs b/third_party/rust/packed_simd/src/api/reductions/bitwise.rs -new file mode 100644 -index 000000000000..5bad4f474b16 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/reductions/bitwise.rs -@@ -0,0 +1,151 @@ -+//! Implements portable horizontal bitwise vector reductions. -+#![allow(unused)] -+ -+macro_rules! impl_reduction_bitwise { -+ ( -+ [$elem_ty:ident; $elem_count:expr]: -+ $id:ident | $ielem_ty:ident | $test_tt:tt | -+ ($convert:expr) | -+ ($true:expr, $false:expr) -+ ) => { -+ impl $id { -+ /// Lane-wise bitwise `and` of the vector elements. -+ /// -+ /// Note: if the vector has one lane, the first element of the -+ /// vector is returned. -+ #[inline] -+ pub fn and(self) -> $elem_ty { -+ #[cfg(not(target_arch = "aarch64"))] -+ { -+ use crate::llvm::simd_reduce_and; -+ let r: $ielem_ty = unsafe { simd_reduce_and(self.0) }; -+ $convert(r) -+ } -+ #[cfg(target_arch = "aarch64")] -+ { -+ // FIXME: broken on aarch64 -+ // https://github.com/rust-lang-nursery/packed_simd/issues/15 -+ let mut x = self.extract(0) as $elem_ty; -+ for i in 1..$id::lanes() { -+ x &= self.extract(i) as $elem_ty; -+ } -+ x -+ } -+ } -+ -+ /// Lane-wise bitwise `or` of the vector elements. -+ /// -+ /// Note: if the vector has one lane, the first element of the -+ /// vector is returned. -+ #[inline] -+ pub fn or(self) -> $elem_ty { -+ #[cfg(not(target_arch = "aarch64"))] -+ { -+ use crate::llvm::simd_reduce_or; -+ let r: $ielem_ty = unsafe { simd_reduce_or(self.0) }; -+ $convert(r) -+ } -+ #[cfg(target_arch = "aarch64")] -+ { -+ // FIXME: broken on aarch64 -+ // https://github.com/rust-lang-nursery/packed_simd/issues/15 -+ let mut x = self.extract(0) as $elem_ty; -+ for i in 1..$id::lanes() { -+ x |= self.extract(i) as $elem_ty; -+ } -+ x -+ } -+ } -+ -+ /// Lane-wise bitwise `xor` of the vector elements. -+ /// -+ /// Note: if the vector has one lane, the first element of the -+ /// vector is returned. -+ #[inline] -+ pub fn xor(self) -> $elem_ty { -+ #[cfg(not(target_arch = "aarch64"))] -+ { -+ use crate::llvm::simd_reduce_xor; -+ let r: $ielem_ty = unsafe { simd_reduce_xor(self.0) }; -+ $convert(r) -+ } -+ #[cfg(target_arch = "aarch64")] -+ { -+ // FIXME: broken on aarch64 -+ // https://github.com/rust-lang-nursery/packed_simd/issues/15 -+ let mut x = self.extract(0) as $elem_ty; -+ for i in 1..$id::lanes() { -+ x ^= self.extract(i) as $elem_ty; -+ } -+ x -+ } -+ } -+ } -+ -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _reduction_bitwise>] { -+ use super::*; -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn and() { -+ let v = $id::splat($false); -+ assert_eq!(v.and(), $false); -+ let v = $id::splat($true); -+ assert_eq!(v.and(), $true); -+ let v = $id::splat($false); -+ let v = v.replace(0, $true); -+ if $id::lanes() > 1 { -+ assert_eq!(v.and(), $false); -+ } else { -+ assert_eq!(v.and(), $true); -+ } -+ let v = $id::splat($true); -+ let v = v.replace(0, $false); -+ assert_eq!(v.and(), $false); -+ -+ } -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn or() { -+ let v = $id::splat($false); -+ assert_eq!(v.or(), $false); -+ let v = $id::splat($true); -+ assert_eq!(v.or(), $true); -+ let v = $id::splat($false); -+ let v = v.replace(0, $true); -+ assert_eq!(v.or(), $true); -+ let v = $id::splat($true); -+ let v = v.replace(0, $false); -+ if $id::lanes() > 1 { -+ assert_eq!(v.or(), $true); -+ } else { -+ assert_eq!(v.or(), $false); -+ } -+ } -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn xor() { -+ let v = $id::splat($false); -+ assert_eq!(v.xor(), $false); -+ let v = $id::splat($true); -+ if $id::lanes() > 1 { -+ assert_eq!(v.xor(), $false); -+ } else { -+ assert_eq!(v.xor(), $true); -+ } -+ let v = $id::splat($false); -+ let v = v.replace(0, $true); -+ assert_eq!(v.xor(), $true); -+ let v = $id::splat($true); -+ let v = v.replace(0, $false); -+ if $id::lanes() > 1 { -+ assert_eq!(v.xor(), $true); -+ } else { -+ assert_eq!(v.xor(), $false); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/reductions/float_arithmetic.rs b/third_party/rust/packed_simd/src/api/reductions/float_arithmetic.rs -new file mode 100644 -index 000000000000..dd722ae25fdd ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/reductions/float_arithmetic.rs -@@ -0,0 +1,312 @@ -+//! Implements portable horizontal float vector arithmetic reductions. -+ -+macro_rules! impl_reduction_float_arithmetic { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Horizontal sum of the vector elements. -+ /// -+ /// The intrinsic performs a tree-reduction of the vector elements. -+ /// That is, for an 8 element vector: -+ /// -+ /// > ((x0 + x1) + (x2 + x3)) + ((x4 + x5) + (x6 + x7)) -+ /// -+ /// If one of the vector element is `NaN` the reduction returns -+ /// `NaN`. The resulting `NaN` is not required to be equal to any -+ /// of the `NaN`s in the vector. -+ #[inline] -+ pub fn sum(self) -> $elem_ty { -+ #[cfg(not(target_arch = "aarch64"))] -+ { -+ use crate::llvm::simd_reduce_add_ordered; -+ unsafe { simd_reduce_add_ordered(self.0, 0 as $elem_ty) } -+ } -+ #[cfg(target_arch = "aarch64")] -+ { -+ // FIXME: broken on AArch64 -+ // https://github.com/rust-lang-nursery/packed_simd/issues/15 -+ let mut x = self.extract(0) as $elem_ty; -+ for i in 1..$id::lanes() { -+ x += self.extract(i) as $elem_ty; -+ } -+ x -+ } -+ } -+ -+ /// Horizontal product of the vector elements. -+ /// -+ /// The intrinsic performs a tree-reduction of the vector elements. -+ /// That is, for an 8 element vector: -+ /// -+ /// > ((x0 * x1) * (x2 * x3)) * ((x4 * x5) * (x6 * x7)) -+ /// -+ /// If one of the vector element is `NaN` the reduction returns -+ /// `NaN`. The resulting `NaN` is not required to be equal to any -+ /// of the `NaN`s in the vector. -+ #[inline] -+ pub fn product(self) -> $elem_ty { -+ #[cfg(not(target_arch = "aarch64"))] -+ { -+ use crate::llvm::simd_reduce_mul_ordered; -+ unsafe { simd_reduce_mul_ordered(self.0, 1 as $elem_ty) } -+ } -+ #[cfg(target_arch = "aarch64")] -+ { -+ // FIXME: broken on AArch64 -+ // https://github.com/rust-lang-nursery/packed_simd/issues/15 -+ let mut x = self.extract(0) as $elem_ty; -+ for i in 1..$id::lanes() { -+ x *= self.extract(i) as $elem_ty; -+ } -+ x -+ } -+ } -+ } -+ -+ impl crate::iter::Sum for $id { -+ #[inline] -+ fn sum>(iter: I) -> $id { -+ iter.fold($id::splat(0.), crate::ops::Add::add) -+ } -+ } -+ -+ impl crate::iter::Product for $id { -+ #[inline] -+ fn product>(iter: I) -> $id { -+ iter.fold($id::splat(1.), crate::ops::Mul::mul) -+ } -+ } -+ -+ impl<'a> crate::iter::Sum<&'a $id> for $id { -+ #[inline] -+ fn sum>(iter: I) -> $id { -+ iter.fold($id::splat(0.), |a, b| crate::ops::Add::add(a, *b)) -+ } -+ } -+ -+ impl<'a> crate::iter::Product<&'a $id> for $id { -+ #[inline] -+ fn product>(iter: I) -> $id { -+ iter.fold($id::splat(1.), |a, b| crate::ops::Mul::mul(a, *b)) -+ } -+ } -+ -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _reduction_float_arith>] { -+ use super::*; -+ fn alternating(x: usize) -> $id { -+ let mut v = $id::splat(1 as $elem_ty); -+ for i in 0..$id::lanes() { -+ if i % x == 0 { -+ v = v.replace(i, 2 as $elem_ty); -+ } -+ } -+ v -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn sum() { -+ let v = $id::splat(0 as $elem_ty); -+ assert_eq!(v.sum(), 0 as $elem_ty); -+ let v = $id::splat(1 as $elem_ty); -+ assert_eq!(v.sum(), $id::lanes() as $elem_ty); -+ let v = alternating(2); -+ assert_eq!( -+ v.sum(), -+ ($id::lanes() / 2 + $id::lanes()) as $elem_ty -+ ); -+ } -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn product() { -+ let v = $id::splat(0 as $elem_ty); -+ assert_eq!(v.product(), 0 as $elem_ty); -+ let v = $id::splat(1 as $elem_ty); -+ assert_eq!(v.product(), 1 as $elem_ty); -+ let f = match $id::lanes() { -+ 64 => 16, -+ 32 => 8, -+ 16 => 4, -+ _ => 2, -+ }; -+ let v = alternating(f); -+ assert_eq!( -+ v.product(), -+ (2_usize.pow(($id::lanes() / f) as u32) -+ as $elem_ty) -+ ); -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[allow(unreachable_code)] -+ #[allow(unused_mut)] -+ // ^^^ FIXME: https://github.com/rust-lang/rust/issues/55344 -+ fn sum_nan() { -+ // FIXME: https://bugs.llvm.org/show_bug.cgi?id=36732 -+ // https://github.com/rust-lang-nursery/packed_simd/issues/6 -+ return; -+ -+ let n0 = crate::$elem_ty::NAN; -+ let v0 = $id::splat(-3.0); -+ for i in 0..$id::lanes() { -+ let mut v = v0.replace(i, n0); -+ // If the vector contains a NaN the result is NaN: -+ assert!( -+ v.sum().is_nan(), -+ "nan at {} => {} | {:?}", -+ i, -+ v.sum(), -+ v -+ ); -+ for j in 0..i { -+ v = v.replace(j, n0); -+ assert!(v.sum().is_nan()); -+ } -+ } -+ let v = $id::splat(n0); -+ assert!(v.sum().is_nan(), "all nans | {:?}", v); -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[allow(unreachable_code)] -+ #[allow(unused_mut)] -+ // ^^^ FIXME: https://github.com/rust-lang/rust/issues/55344 -+ fn product_nan() { -+ // FIXME: https://bugs.llvm.org/show_bug.cgi?id=36732 -+ // https://github.com/rust-lang-nursery/packed_simd/issues/6 -+ return; -+ -+ let n0 = crate::$elem_ty::NAN; -+ let v0 = $id::splat(-3.0); -+ for i in 0..$id::lanes() { -+ let mut v = v0.replace(i, n0); -+ // If the vector contains a NaN the result is NaN: -+ assert!( -+ v.product().is_nan(), -+ "nan at {} => {} | {:?}", -+ i, -+ v.product(), -+ v -+ ); -+ for j in 0..i { -+ v = v.replace(j, n0); -+ assert!(v.product().is_nan()); -+ } -+ } -+ let v = $id::splat(n0); -+ assert!(v.product().is_nan(), "all nans | {:?}", v); -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[allow(unused, dead_code)] -+ fn sum_roundoff() { -+ // Performs a tree-reduction -+ fn tree_reduce_sum(a: &[$elem_ty]) -> $elem_ty { -+ assert!(!a.is_empty()); -+ if a.len() == 1 { -+ a[0] -+ } else if a.len() == 2 { -+ a[0] + a[1] -+ } else { -+ let mid = a.len() / 2; -+ let (left, right) = a.split_at(mid); -+ tree_reduce_sum(left) + tree_reduce_sum(right) -+ } -+ } -+ -+ let mut start = crate::$elem_ty::EPSILON; -+ let mut scalar_reduction = 0. as $elem_ty; -+ -+ let mut v = $id::splat(0. as $elem_ty); -+ for i in 0..$id::lanes() { -+ let c = if i % 2 == 0 { 1e3 } else { -1. }; -+ start *= 3.14 * c; -+ scalar_reduction += start; -+ v = v.replace(i, start); -+ } -+ let simd_reduction = v.sum(); -+ -+ let mut a = [0. as $elem_ty; $id::lanes()]; -+ v.write_to_slice_unaligned(&mut a); -+ let tree_reduction = tree_reduce_sum(&a); -+ -+ // tolerate 1 ULP difference: -+ let red_bits = simd_reduction.to_bits(); -+ let tree_bits = tree_reduction.to_bits(); -+ assert!( -+ if red_bits > tree_bits { -+ red_bits - tree_bits -+ } else { -+ tree_bits - red_bits -+ } < 2, -+ "vector: {:?} | simd_reduction: {:?} | \ -+ tree_reduction: {} | scalar_reduction: {}", -+ v, -+ simd_reduction, -+ tree_reduction, -+ scalar_reduction -+ ); -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[allow(unused, dead_code)] -+ fn product_roundoff() { -+ // Performs a tree-reduction -+ fn tree_reduce_product(a: &[$elem_ty]) -> $elem_ty { -+ assert!(!a.is_empty()); -+ if a.len() == 1 { -+ a[0] -+ } else if a.len() == 2 { -+ a[0] * a[1] -+ } else { -+ let mid = a.len() / 2; -+ let (left, right) = a.split_at(mid); -+ tree_reduce_product(left) -+ * tree_reduce_product(right) -+ } -+ } -+ -+ let mut start = crate::$elem_ty::EPSILON; -+ let mut scalar_reduction = 1. as $elem_ty; -+ -+ let mut v = $id::splat(0. as $elem_ty); -+ for i in 0..$id::lanes() { -+ let c = if i % 2 == 0 { 1e3 } else { -1. }; -+ start *= 3.14 * c; -+ scalar_reduction *= start; -+ v = v.replace(i, start); -+ } -+ let simd_reduction = v.product(); -+ -+ let mut a = [0. as $elem_ty; $id::lanes()]; -+ v.write_to_slice_unaligned(&mut a); -+ let tree_reduction = tree_reduce_product(&a); -+ -+ // tolerate 1 ULP difference: -+ let red_bits = simd_reduction.to_bits(); -+ let tree_bits = tree_reduction.to_bits(); -+ assert!( -+ if red_bits > tree_bits { -+ red_bits - tree_bits -+ } else { -+ tree_bits - red_bits -+ } < 2, -+ "vector: {:?} | simd_reduction: {:?} | \ -+ tree_reduction: {} | scalar_reduction: {}", -+ v, -+ simd_reduction, -+ tree_reduction, -+ scalar_reduction -+ ); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/reductions/integer_arithmetic.rs b/third_party/rust/packed_simd/src/api/reductions/integer_arithmetic.rs -new file mode 100644 -index 000000000000..91dffad31032 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/reductions/integer_arithmetic.rs -@@ -0,0 +1,197 @@ -+//! Implements portable horizontal integer vector arithmetic reductions. -+ -+macro_rules! impl_reduction_integer_arithmetic { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $ielem_ty:ident -+ | $test_tt:tt) => { -+ impl $id { -+ /// Horizontal wrapping sum of the vector elements. -+ /// -+ /// The intrinsic performs a tree-reduction of the vector elements. -+ /// That is, for an 8 element vector: -+ /// -+ /// > ((x0 + x1) + (x2 + x3)) + ((x4 + x5) + (x6 + x7)) -+ /// -+ /// If an operation overflows it returns the mathematical result -+ /// modulo `2^n` where `n` is the number of times it overflows. -+ #[inline] -+ pub fn wrapping_sum(self) -> $elem_ty { -+ #[cfg(not(target_arch = "aarch64"))] -+ { -+ use crate::llvm::simd_reduce_add_ordered; -+ let v: $ielem_ty = unsafe { -+ simd_reduce_add_ordered(self.0, 0 as $ielem_ty) -+ }; -+ v as $elem_ty -+ } -+ #[cfg(target_arch = "aarch64")] -+ { -+ // FIXME: broken on AArch64 -+ // https://github.com/rust-lang-nursery/packed_simd/issues/15 -+ let mut x = self.extract(0) as $elem_ty; -+ for i in 1..$id::lanes() { -+ x = x.wrapping_add(self.extract(i) as $elem_ty); -+ } -+ x -+ } -+ } -+ -+ /// Horizontal wrapping product of the vector elements. -+ /// -+ /// The intrinsic performs a tree-reduction of the vector elements. -+ /// That is, for an 8 element vector: -+ /// -+ /// > ((x0 * x1) * (x2 * x3)) * ((x4 * x5) * (x6 * x7)) -+ /// -+ /// If an operation overflows it returns the mathematical result -+ /// modulo `2^n` where `n` is the number of times it overflows. -+ #[inline] -+ pub fn wrapping_product(self) -> $elem_ty { -+ #[cfg(not(target_arch = "aarch64"))] -+ { -+ use crate::llvm::simd_reduce_mul_ordered; -+ let v: $ielem_ty = unsafe { -+ simd_reduce_mul_ordered(self.0, 1 as $ielem_ty) -+ }; -+ v as $elem_ty -+ } -+ #[cfg(target_arch = "aarch64")] -+ { -+ // FIXME: broken on AArch64 -+ // https://github.com/rust-lang-nursery/packed_simd/issues/15 -+ let mut x = self.extract(0) as $elem_ty; -+ for i in 1..$id::lanes() { -+ x = x.wrapping_mul(self.extract(i) as $elem_ty); -+ } -+ x -+ } -+ } -+ } -+ -+ impl crate::iter::Sum for $id { -+ #[inline] -+ fn sum>(iter: I) -> $id { -+ iter.fold($id::splat(0), crate::ops::Add::add) -+ } -+ } -+ -+ impl crate::iter::Product for $id { -+ #[inline] -+ fn product>(iter: I) -> $id { -+ iter.fold($id::splat(1), crate::ops::Mul::mul) -+ } -+ } -+ -+ impl<'a> crate::iter::Sum<&'a $id> for $id { -+ #[inline] -+ fn sum>(iter: I) -> $id { -+ iter.fold($id::splat(0), |a, b| crate::ops::Add::add(a, *b)) -+ } -+ } -+ -+ impl<'a> crate::iter::Product<&'a $id> for $id { -+ #[inline] -+ fn product>(iter: I) -> $id { -+ iter.fold($id::splat(1), |a, b| crate::ops::Mul::mul(a, *b)) -+ } -+ } -+ -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _reduction_int_arith>] { -+ use super::*; -+ -+ fn alternating(x: usize) -> $id { -+ let mut v = $id::splat(1 as $elem_ty); -+ for i in 0..$id::lanes() { -+ if i % x == 0 { -+ v = v.replace(i, 2 as $elem_ty); -+ } -+ } -+ v -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn wrapping_sum() { -+ let v = $id::splat(0 as $elem_ty); -+ assert_eq!(v.wrapping_sum(), 0 as $elem_ty); -+ let v = $id::splat(1 as $elem_ty); -+ assert_eq!(v.wrapping_sum(), $id::lanes() as $elem_ty); -+ let v = alternating(2); -+ if $id::lanes() > 1 { -+ assert_eq!( -+ v.wrapping_sum(), -+ ($id::lanes() / 2 + $id::lanes()) as $elem_ty -+ ); -+ } else { -+ assert_eq!( -+ v.wrapping_sum(), -+ 2 as $elem_ty -+ ); -+ } -+ } -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn wrapping_sum_overflow() { -+ let start = $elem_ty::max_value() -+ - ($id::lanes() as $elem_ty / 2); -+ -+ let v = $id::splat(start as $elem_ty); -+ let vwrapping_sum = v.wrapping_sum(); -+ -+ let mut wrapping_sum = start; -+ for _ in 1..$id::lanes() { -+ wrapping_sum = wrapping_sum.wrapping_add(start); -+ } -+ assert_eq!(wrapping_sum, vwrapping_sum, "v = {:?}", v); -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn wrapping_product() { -+ let v = $id::splat(0 as $elem_ty); -+ assert_eq!(v.wrapping_product(), 0 as $elem_ty); -+ let v = $id::splat(1 as $elem_ty); -+ assert_eq!(v.wrapping_product(), 1 as $elem_ty); -+ let f = match $id::lanes() { -+ 64 => 16, -+ 32 => 8, -+ 16 => 4, -+ _ => 2, -+ }; -+ let v = alternating(f); -+ if $id::lanes() > 1 { -+ assert_eq!( -+ v.wrapping_product(), -+ (2_usize.pow(($id::lanes() / f) as u32) -+ as $elem_ty) -+ ); -+ } else { -+ assert_eq!( -+ v.wrapping_product(), -+ 2 as $elem_ty -+ ); -+ } -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn wrapping_product_overflow() { -+ let start = $elem_ty::max_value() -+ - ($id::lanes() as $elem_ty / 2); -+ -+ let v = $id::splat(start as $elem_ty); -+ let vmul = v.wrapping_product(); -+ -+ let mut mul = start; -+ for _ in 1..$id::lanes() { -+ mul = mul.wrapping_mul(start); -+ } -+ assert_eq!(mul, vmul, "v = {:?}", v); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/reductions/mask.rs b/third_party/rust/packed_simd/src/api/reductions/mask.rs -new file mode 100644 -index 000000000000..0dd6a84e7e8d ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/reductions/mask.rs -@@ -0,0 +1,89 @@ -+//! Implements portable horizontal mask reductions. -+ -+macro_rules! impl_reduction_mask { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Are `all` vector lanes `true`? -+ #[inline] -+ pub fn all(self) -> bool { -+ unsafe { crate::codegen::reductions::mask::All::all(self) } -+ } -+ /// Is `any` vector lane `true`? -+ #[inline] -+ pub fn any(self) -> bool { -+ unsafe { crate::codegen::reductions::mask::Any::any(self) } -+ } -+ /// Are `all` vector lanes `false`? -+ #[inline] -+ pub fn none(self) -> bool { -+ !self.any() -+ } -+ } -+ -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _reduction>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn all() { -+ let a = $id::splat(true); -+ assert!(a.all()); -+ let a = $id::splat(false); -+ assert!(!a.all()); -+ -+ if $id::lanes() > 1 { -+ for i in 0..$id::lanes() { -+ let mut a = $id::splat(true); -+ a = a.replace(i, false); -+ assert!(!a.all()); -+ let mut a = $id::splat(false); -+ a = a.replace(i, true); -+ assert!(!a.all()); -+ } -+ } -+ } -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn any() { -+ let a = $id::splat(true); -+ assert!(a.any()); -+ let a = $id::splat(false); -+ assert!(!a.any()); -+ -+ if $id::lanes() > 1 { -+ for i in 0..$id::lanes() { -+ let mut a = $id::splat(true); -+ a = a.replace(i, false); -+ assert!(a.any()); -+ let mut a = $id::splat(false); -+ a = a.replace(i, true); -+ assert!(a.any()); -+ } -+ } -+ } -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn none() { -+ let a = $id::splat(true); -+ assert!(!a.none()); -+ let a = $id::splat(false); -+ assert!(a.none()); -+ -+ if $id::lanes() > 1 { -+ for i in 0..$id::lanes() { -+ let mut a = $id::splat(true); -+ a = a.replace(i, false); -+ assert!(!a.none()); -+ let mut a = $id::splat(false); -+ a = a.replace(i, true); -+ assert!(!a.none()); -+ } -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/reductions/min_max.rs b/third_party/rust/packed_simd/src/api/reductions/min_max.rs -new file mode 100644 -index 000000000000..c4d3aa10f15c ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/reductions/min_max.rs -@@ -0,0 +1,377 @@ -+//! Implements portable horizontal vector min/max reductions. -+ -+macro_rules! impl_reduction_min_max { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident -+ | $ielem_ty:ident | $test_tt:tt) => { -+ impl $id { -+ /// Largest vector element value. -+ #[inline] -+ pub fn max_element(self) -> $elem_ty { -+ #[cfg(not(any( -+ target_arch = "aarch64", -+ target_arch = "arm", -+ target_arch = "powerpc64", -+ target_arch = "wasm32", -+ )))] -+ { -+ use crate::llvm::simd_reduce_max; -+ let v: $ielem_ty = unsafe { simd_reduce_max(self.0) }; -+ v as $elem_ty -+ } -+ #[cfg(any( -+ target_arch = "aarch64", -+ target_arch = "arm", -+ target_arch = "powerpc64", -+ target_arch = "wasm32", -+ ))] -+ { -+ // FIXME: broken on AArch64 -+ // https://github.com/rust-lang-nursery/packed_simd/issues/15 -+ // FIXME: broken on WASM32 -+ // https://github.com/rust-lang-nursery/packed_simd/issues/91 -+ let mut x = self.extract(0); -+ for i in 1..$id::lanes() { -+ x = x.max(self.extract(i)); -+ } -+ x -+ } -+ } -+ -+ /// Smallest vector element value. -+ #[inline] -+ pub fn min_element(self) -> $elem_ty { -+ #[cfg(not(any( -+ target_arch = "aarch64", -+ target_arch = "arm", -+ all(target_arch = "x86", not(target_feature = "sse2")), -+ target_arch = "powerpc64", -+ target_arch = "wasm32", -+ ),))] -+ { -+ use crate::llvm::simd_reduce_min; -+ let v: $ielem_ty = unsafe { simd_reduce_min(self.0) }; -+ v as $elem_ty -+ } -+ #[cfg(any( -+ target_arch = "aarch64", -+ target_arch = "arm", -+ all(target_arch = "x86", not(target_feature = "sse2")), -+ target_arch = "powerpc64", -+ target_arch = "wasm32", -+ ))] -+ { -+ // FIXME: broken on AArch64 -+ // https://github.com/rust-lang-nursery/packed_simd/issues/15 -+ // FIXME: broken on i586-unknown-linux-gnu -+ // https://github.com/rust-lang-nursery/packed_simd/issues/22 -+ // FIXME: broken on WASM32 -+ // https://github.com/rust-lang-nursery/packed_simd/issues/91 -+ let mut x = self.extract(0); -+ for i in 1..$id::lanes() { -+ x = x.min(self.extract(i)); -+ } -+ x -+ } -+ } -+ } -+ test_if! {$test_tt: -+ paste::item! { -+ pub mod [<$id _reduction_min_max>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ pub fn max_element() { -+ let v = $id::splat(0 as $elem_ty); -+ assert_eq!(v.max_element(), 0 as $elem_ty); -+ if $id::lanes() > 1 { -+ let v = v.replace(1, 1 as $elem_ty); -+ assert_eq!(v.max_element(), 1 as $elem_ty); -+ } -+ let v = v.replace(0, 2 as $elem_ty); -+ assert_eq!(v.max_element(), 2 as $elem_ty); -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ pub fn min_element() { -+ let v = $id::splat(0 as $elem_ty); -+ assert_eq!(v.min_element(), 0 as $elem_ty); -+ if $id::lanes() > 1 { -+ let v = v.replace(1, 1 as $elem_ty); -+ assert_eq!(v.min_element(), 0 as $elem_ty); -+ } -+ let v = $id::splat(1 as $elem_ty); -+ let v = v.replace(0, 2 as $elem_ty); -+ if $id::lanes() > 1 { -+ assert_eq!(v.min_element(), 1 as $elem_ty); -+ } else { -+ assert_eq!(v.min_element(), 2 as $elem_ty); -+ } -+ if $id::lanes() > 1 { -+ let v = $id::splat(2 as $elem_ty); -+ let v = v.replace(1, 1 as $elem_ty); -+ assert_eq!(v.min_element(), 1 as $elem_ty); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -+ -+macro_rules! test_reduction_float_min_max { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ test_if!{ -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _reduction_min_max_nan>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn min_element_test() { -+ let n = crate::$elem_ty::NAN; -+ -+ assert_eq!(n.min(-3.), -3.); -+ assert_eq!((-3. as $elem_ty).min(n), -3.); -+ -+ let v0 = $id::splat(-3.); -+ -+ let target_with_broken_last_lane_nan = !cfg!(any( -+ target_arch = "arm", target_arch = "aarch64", -+ all(target_arch = "x86", -+ not(target_feature = "sse2") -+ ), -+ target_arch = "powerpc64", -+ target_arch = "wasm32", -+ )); -+ -+ // The vector is initialized to `-3.`s: [-3, -3, -3, -3] -+ for i in 0..$id::lanes() { -+ // We replace the i-th element of the vector with -+ // `NaN`: [-3, -3, -3, NaN] -+ let mut v = v0.replace(i, n); -+ -+ // If the NaN is in the last place, the LLVM -+ // implementation of these methods is broken on some -+ // targets: -+ if i == $id::lanes() - 1 && -+ target_with_broken_last_lane_nan { -+ // FIXME: -+ // https://github.com/rust-lang-nursery/packed_simd/issues/5 -+ // -+ // If there is a NaN, the result should always -+ // the smallest element, but currently when the -+ // last element is NaN the current -+ // implementation incorrectly returns NaN. -+ // -+ // The targets mentioned above use different -+ // codegen that produces the correct result. -+ // -+ // These asserts detect if this behavior changes -+ assert!(v.min_element().is_nan(), -+ // FIXME: ^^^ should be -3. -+ "[A]: nan at {} => {} | {:?}", -+ i, v.min_element(), v); -+ -+ // If we replace all the elements in the vector -+ // up-to the `i-th` lane with `NaN`s, the result -+ // is still always `-3.` unless all elements of -+ // the vector are `NaN`s: -+ // -+ // This is also broken: -+ for j in 0..i { -+ v = v.replace(j, n); -+ assert!(v.min_element().is_nan(), -+ // FIXME: ^^^ should be -3. -+ "[B]: nan at {} => {} | {:?}", -+ i, v.min_element(), v); -+ } -+ -+ // We are done here, since we were in the last -+ // lane which is the last iteration of the loop. -+ break -+ } -+ -+ // We are not in the last lane, and there is only -+ // one `NaN` in the vector. -+ -+ // If the vector has one lane, the result is `NaN`: -+ if $id::lanes() == 1 { -+ assert!(v.min_element().is_nan(), -+ "[C]: all nans | v={:?} | min={} | \ -+ is_nan: {}", -+ v, v.min_element(), -+ v.min_element().is_nan() -+ ); -+ -+ // And we are done, since the vector only has -+ // one lane anyways. -+ break; -+ } -+ -+ // The vector has more than one lane, since there is -+ // only one `NaN` in the vector, the result is -+ // always `-3`. -+ assert_eq!(v.min_element(), -3., -+ "[D]: nan at {} => {} | {:?}", -+ i, v.min_element(), v); -+ -+ // If we replace all the elements in the vector -+ // up-to the `i-th` lane with `NaN`s, the result is -+ // still always `-3.` unless all elements of the -+ // vector are `NaN`s: -+ for j in 0..i { -+ v = v.replace(j, n); -+ -+ if i == $id::lanes() - 1 && j == i - 1 { -+ // All elements of the vector are `NaN`s, -+ // therefore the result is NaN as well. -+ // -+ // Note: the #lanes of the vector is > 1, so -+ // "i - 1" does not overflow. -+ assert!(v.min_element().is_nan(), -+ "[E]: all nans | v={:?} | min={} | \ -+ is_nan: {}", -+ v, v.min_element(), -+ v.min_element().is_nan()); -+ } else { -+ // There are non-`NaN` elements in the -+ // vector, therefore the result is `-3.`: -+ assert_eq!(v.min_element(), -3., -+ "[F]: nan at {} => {} | {:?}", -+ i, v.min_element(), v); -+ } -+ } -+ } -+ -+ // If the vector contains all NaNs the result is NaN: -+ assert!($id::splat(n).min_element().is_nan(), -+ "all nans | v={:?} | min={} | is_nan: {}", -+ $id::splat(n), $id::splat(n).min_element(), -+ $id::splat(n).min_element().is_nan()); -+ } -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn max_element_test() { -+ let n = crate::$elem_ty::NAN; -+ -+ assert_eq!(n.max(-3.), -3.); -+ assert_eq!((-3. as $elem_ty).max(n), -3.); -+ -+ let v0 = $id::splat(-3.); -+ -+ let target_with_broken_last_lane_nan = !cfg!(any( -+ target_arch = "arm", target_arch = "aarch64", -+ target_arch = "powerpc64", target_arch = "wasm32", -+ )); -+ -+ // The vector is initialized to `-3.`s: [-3, -3, -3, -3] -+ for i in 0..$id::lanes() { -+ // We replace the i-th element of the vector with -+ // `NaN`: [-3, -3, -3, NaN] -+ let mut v = v0.replace(i, n); -+ -+ // If the NaN is in the last place, the LLVM -+ // implementation of these methods is broken on some -+ // targets: -+ if i == $id::lanes() - 1 && -+ target_with_broken_last_lane_nan { -+ // FIXME: -+ // https://github.com/rust-lang-nursery/packed_simd/issues/5 -+ // -+ // If there is a NaN, the result should -+ // always the largest element, but currently -+ // when the last element is NaN the current -+ // implementation incorrectly returns NaN. -+ // -+ // The targets mentioned above use different -+ // codegen that produces the correct result. -+ // -+ // These asserts detect if this behavior -+ // changes -+ assert!(v.max_element().is_nan(), -+ // FIXME: ^^^ should be -3. -+ "[A]: nan at {} => {} | {:?}", -+ i, v.max_element(), v); -+ -+ // If we replace all the elements in the vector -+ // up-to the `i-th` lane with `NaN`s, the result -+ // is still always `-3.` unless all elements of -+ // the vector are `NaN`s: -+ // -+ // This is also broken: -+ for j in 0..i { -+ v = v.replace(j, n); -+ assert!(v.max_element().is_nan(), -+ // FIXME: ^^^ should be -3. -+ "[B]: nan at {} => {} | {:?}", -+ i, v.max_element(), v); -+ } -+ -+ // We are done here, since we were in the last -+ // lane which is the last iteration of the loop. -+ break -+ } -+ -+ // We are not in the last lane, and there is only -+ // one `NaN` in the vector. -+ -+ // If the vector has one lane, the result is `NaN`: -+ if $id::lanes() == 1 { -+ assert!(v.max_element().is_nan(), -+ "[C]: all nans | v={:?} | min={} | \ -+ is_nan: {}", -+ v, v.max_element(), -+ v.max_element().is_nan()); -+ -+ // And we are done, since the vector only has -+ // one lane anyways. -+ break; -+ } -+ -+ // The vector has more than one lane, since there is -+ // only one `NaN` in the vector, the result is -+ // always `-3`. -+ assert_eq!(v.max_element(), -3., -+ "[D]: nan at {} => {} | {:?}", -+ i, v.max_element(), v); -+ -+ // If we replace all the elements in the vector -+ // up-to the `i-th` lane with `NaN`s, the result is -+ // still always `-3.` unless all elements of the -+ // vector are `NaN`s: -+ for j in 0..i { -+ v = v.replace(j, n); -+ -+ if i == $id::lanes() - 1 && j == i - 1 { -+ // All elements of the vector are `NaN`s, -+ // therefore the result is NaN as well. -+ // -+ // Note: the #lanes of the vector is > 1, so -+ // "i - 1" does not overflow. -+ assert!(v.max_element().is_nan(), -+ "[E]: all nans | v={:?} | max={} | \ -+ is_nan: {}", -+ v, v.max_element(), -+ v.max_element().is_nan()); -+ } else { -+ // There are non-`NaN` elements in the -+ // vector, therefore the result is `-3.`: -+ assert_eq!(v.max_element(), -3., -+ "[F]: nan at {} => {} | {:?}", -+ i, v.max_element(), v); -+ } -+ } -+ } -+ -+ // If the vector contains all NaNs the result is NaN: -+ assert!($id::splat(n).max_element().is_nan(), -+ "all nans | v={:?} | max={} | is_nan: {}", -+ $id::splat(n), $id::splat(n).max_element(), -+ $id::splat(n).max_element().is_nan()); -+ } -+ } -+ } -+ } -+ } -+} -diff --git a/third_party/rust/packed_simd/src/api/select.rs b/third_party/rust/packed_simd/src/api/select.rs -new file mode 100644 -index 000000000000..24525df56c73 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/select.rs -@@ -0,0 +1,75 @@ -+//! Implements mask's `select`. -+ -+/// Implements mask select method -+macro_rules! impl_select { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Selects elements of `a` and `b` using mask. -+ /// -+ /// The lanes of the result for which the mask is `true` contain -+ /// the values of `a`. The remaining lanes contain the values of -+ /// `b`. -+ #[inline] -+ pub fn select(self, a: Simd, b: Simd) -> Simd -+ where -+ T: sealed::SimdArray< -+ NT = <[$elem_ty; $elem_count] as sealed::SimdArray>::NT, -+ >, -+ { -+ use crate::llvm::simd_select; -+ Simd(unsafe { simd_select(self.0, a.0, b.0) }) -+ } -+ } -+ -+ test_select!(bool, $id, $id, (false, true) | $test_tt); -+ }; -+} -+ -+macro_rules! test_select { -+ ( -+ $elem_ty:ident, -+ $mask_ty:ident, -+ $vec_ty:ident,($small:expr, $large:expr) | -+ $test_tt:tt -+ ) => { -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$vec_ty _select>] { -+ use super::*; -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn select() { -+ let o = $small as $elem_ty; -+ let t = $large as $elem_ty; -+ -+ let a = $vec_ty::splat(o); -+ let b = $vec_ty::splat(t); -+ let m = a.lt(b); -+ assert_eq!(m.select(a, b), a); -+ -+ let m = b.lt(a); -+ assert_eq!(m.select(b, a), a); -+ -+ let mut c = a; -+ let mut d = b; -+ let mut m_e = $mask_ty::splat(false); -+ for i in 0..$vec_ty::lanes() { -+ if i % 2 == 0 { -+ let c_tmp = c.extract(i); -+ c = c.replace(i, d.extract(i)); -+ d = d.replace(i, c_tmp); -+ } else { -+ m_e = m_e.replace(i, true); -+ } -+ } -+ -+ let m = c.lt(d); -+ assert_eq!(m_e, m); -+ assert_eq!(m.select(c, d), a); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/shuffle.rs b/third_party/rust/packed_simd/src/api/shuffle.rs -new file mode 100644 -index 000000000000..13a7fae5fcee ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/shuffle.rs -@@ -0,0 +1,190 @@ -+//! Implements portable vector shuffles with immediate indices. -+ -+// FIXME: comprehensive tests -+// https://github.com/rust-lang-nursery/packed_simd/issues/20 -+ -+/// Shuffles vector elements. -+/// -+/// This macro returns a new vector that contains a shuffle of the elements in -+/// one (`shuffle!(vec, [indices...])`) or two (`shuffle!(vec0, vec1, -+/// [indices...])`) input vectors. -+/// -+/// The type of `vec0` and `vec1` must be equal, and the element type of the -+/// resulting vector is the element type of the input vector. -+/// -+/// The number of `indices` must be a power-of-two in range `[0, 64)`, since -+/// currently, the largest vector supported by the library has 64 lanes. The -+/// length of the resulting vector equals the number of indices provided. -+/// -+/// The indices must be in range `[0, M * N)` where `M` is the number of input -+/// vectors (`1` or `2`) and `N` is the number of lanes of the input vectors. -+/// The indices `i` in range `[0, N)` refer to the `i`-th element of `vec0`, -+/// while the indices in range `[N, 2*N)` refer to the `i - N`-th element of -+/// `vec1`. -+/// -+/// # Examples -+/// -+/// Shuffling elements of two vectors: -+/// -+/// ``` -+/// # #[macro_use] -+/// # extern crate packed_simd; -+/// # use packed_simd::*; -+/// # fn main() { -+/// // Shuffle allows reordering the elements: -+/// let x = i32x4::new(1, 2, 3, 4); -+/// let y = i32x4::new(5, 6, 7, 8); -+/// let r = shuffle!(x, y, [4, 0, 5, 1]); -+/// assert_eq!(r, i32x4::new(5, 1, 6, 2)); -+/// -+/// // The resulting vector can als be smaller than the input: -+/// let r = shuffle!(x, y, [1, 6]); -+/// assert_eq!(r, i32x2::new(2, 7)); -+/// -+/// // Or larger: -+/// let r = shuffle!(x, y, [1, 3, 4, 2, 1, 7, 2, 2]); -+/// assert_eq!(r, i32x8::new(2, 4, 5, 3, 2, 8, 3, 3)); -+/// // At most 2 * the number of lanes in the input vector. -+/// # } -+/// ``` -+/// -+/// Shuffling elements of one vector: -+/// -+/// ``` -+/// # #[macro_use] -+/// # extern crate packed_simd; -+/// # use packed_simd::*; -+/// # fn main() { -+/// // Shuffle allows reordering the elements of a vector: -+/// let x = i32x4::new(1, 2, 3, 4); -+/// let r = shuffle!(x, [2, 1, 3, 0]); -+/// assert_eq!(r, i32x4::new(3, 2, 4, 1)); -+/// -+/// // The resulting vector can be smaller than the input: -+/// let r = shuffle!(x, [1, 3]); -+/// assert_eq!(r, i32x2::new(2, 4)); -+/// -+/// // Equal: -+/// let r = shuffle!(x, [1, 3, 2, 0]); -+/// assert_eq!(r, i32x4::new(2, 4, 3, 1)); -+/// -+/// // Or larger: -+/// let r = shuffle!(x, [1, 3, 2, 2, 1, 3, 2, 2]); -+/// assert_eq!(r, i32x8::new(2, 4, 3, 3, 2, 4, 3, 3)); -+/// // At most 2 * the number of lanes in the input vector. -+/// # } -+/// ``` -+#[macro_export] -+macro_rules! shuffle { -+ ($vec0:expr, $vec1:expr, [$l0:expr, $l1:expr]) => {{ -+ #[allow(unused_unsafe)] -+ unsafe { -+ $crate::Simd($crate::__shuffle_vector2( -+ $vec0.0, -+ $vec1.0, -+ [$l0, $l1], -+ )) -+ } -+ }}; -+ ($vec0:expr, $vec1:expr, [$l0:expr, $l1:expr, $l2:expr, $l3:expr]) => {{ -+ #[allow(unused_unsafe)] -+ unsafe { -+ $crate::Simd($crate::__shuffle_vector4( -+ $vec0.0, -+ $vec1.0, -+ [$l0, $l1, $l2, $l3], -+ )) -+ } -+ }}; -+ ($vec0:expr, $vec1:expr, -+ [$l0:expr, $l1:expr, $l2:expr, $l3:expr, -+ $l4:expr, $l5:expr, $l6:expr, $l7:expr]) => {{ -+ #[allow(unused_unsafe)] -+ unsafe { -+ $crate::Simd($crate::__shuffle_vector8( -+ $vec0.0, -+ $vec1.0, -+ [$l0, $l1, $l2, $l3, $l4, $l5, $l6, $l7], -+ )) -+ } -+ }}; -+ ($vec0:expr, $vec1:expr, -+ [$l0:expr, $l1:expr, $l2:expr, $l3:expr, -+ $l4:expr, $l5:expr, $l6:expr, $l7:expr, -+ $l8:expr, $l9:expr, $l10:expr, $l11:expr, -+ $l12:expr, $l13:expr, $l14:expr, $l15:expr]) => {{ -+ #[allow(unused_unsafe)] -+ unsafe { -+ $crate::Simd($crate::__shuffle_vector16( -+ $vec0.0, -+ $vec1.0, -+ [ -+ $l0, $l1, $l2, $l3, $l4, $l5, $l6, $l7, $l8, $l9, $l10, -+ $l11, $l12, $l13, $l14, $l15, -+ ], -+ )) -+ } -+ }}; -+ ($vec0:expr, $vec1:expr, -+ [$l0:expr, $l1:expr, $l2:expr, $l3:expr, -+ $l4:expr, $l5:expr, $l6:expr, $l7:expr, -+ $l8:expr, $l9:expr, $l10:expr, $l11:expr, -+ $l12:expr, $l13:expr, $l14:expr, $l15:expr, -+ $l16:expr, $l17:expr, $l18:expr, $l19:expr, -+ $l20:expr, $l21:expr, $l22:expr, $l23:expr, -+ $l24:expr, $l25:expr, $l26:expr, $l27:expr, -+ $l28:expr, $l29:expr, $l30:expr, $l31:expr]) => {{ -+ #[allow(unused_unsafe)] -+ unsafe { -+ $crate::Simd($crate::__shuffle_vector32( -+ $vec0.0, -+ $vec1.0, -+ [ -+ $l0, $l1, $l2, $l3, $l4, $l5, $l6, $l7, $l8, $l9, $l10, -+ $l11, $l12, $l13, $l14, $l15, $l16, $l17, $l18, $l19, -+ $l20, $l21, $l22, $l23, $l24, $l25, $l26, $l27, $l28, -+ $l29, $l30, $l31, -+ ], -+ )) -+ } -+ }}; -+ ($vec0:expr, $vec1:expr, -+ [$l0:expr, $l1:expr, $l2:expr, $l3:expr, -+ $l4:expr, $l5:expr, $l6:expr, $l7:expr, -+ $l8:expr, $l9:expr, $l10:expr, $l11:expr, -+ $l12:expr, $l13:expr, $l14:expr, $l15:expr, -+ $l16:expr, $l17:expr, $l18:expr, $l19:expr, -+ $l20:expr, $l21:expr, $l22:expr, $l23:expr, -+ $l24:expr, $l25:expr, $l26:expr, $l27:expr, -+ $l28:expr, $l29:expr, $l30:expr, $l31:expr, -+ $l32:expr, $l33:expr, $l34:expr, $l35:expr, -+ $l36:expr, $l37:expr, $l38:expr, $l39:expr, -+ $l40:expr, $l41:expr, $l42:expr, $l43:expr, -+ $l44:expr, $l45:expr, $l46:expr, $l47:expr, -+ $l48:expr, $l49:expr, $l50:expr, $l51:expr, -+ $l52:expr, $l53:expr, $l54:expr, $l55:expr, -+ $l56:expr, $l57:expr, $l58:expr, $l59:expr, -+ $l60:expr, $l61:expr, $l62:expr, $l63:expr]) => {{ -+ #[allow(unused_unsafe)] -+ unsafe { -+ $crate::Simd($crate::__shuffle_vector64( -+ $vec0.0, -+ $vec1.0, -+ [ -+ $l0, $l1, $l2, $l3, $l4, $l5, $l6, $l7, $l8, $l9, $l10, -+ $l11, $l12, $l13, $l14, $l15, $l16, $l17, $l18, $l19, -+ $l20, $l21, $l22, $l23, $l24, $l25, $l26, $l27, $l28, -+ $l29, $l30, $l31, $l32, $l33, $l34, $l35, $l36, $l37, -+ $l38, $l39, $l40, $l41, $l42, $l43, $l44, $l45, $l46, -+ $l47, $l48, $l49, $l50, $l51, $l52, $l53, $l54, $l55, -+ $l56, $l57, $l58, $l59, $l60, $l61, $l62, $l63, -+ ], -+ )) -+ } -+ }}; -+ ($vec:expr, [$($l:expr),*]) => { -+ match $vec { -+ v => shuffle!(v, v, [$($l),*]) -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/shuffle1_dyn.rs b/third_party/rust/packed_simd/src/api/shuffle1_dyn.rs -new file mode 100644 -index 000000000000..64536be6cba1 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/shuffle1_dyn.rs -@@ -0,0 +1,159 @@ -+//! Shuffle vector elements according to a dynamic vector of indices. -+ -+macro_rules! impl_shuffle1_dyn { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Shuffle vector elements according to `indices`. -+ #[inline] -+ pub fn shuffle1_dyn(self, indices: I) -> Self -+ where -+ Self: codegen::shuffle1_dyn::Shuffle1Dyn, -+ { -+ codegen::shuffle1_dyn::Shuffle1Dyn::shuffle1_dyn(self, indices) -+ } -+ } -+ }; -+} -+ -+macro_rules! test_shuffle1_dyn { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _shuffle1_dyn>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn shuffle1_dyn() { -+ let increasing = { -+ let mut v = $id::splat(0 as $elem_ty); -+ for i in 0..$id::lanes() { -+ v = v.replace(i, i as $elem_ty); -+ } -+ v -+ }; -+ let decreasing = { -+ let mut v = $id::splat(0 as $elem_ty); -+ for i in 0..$id::lanes() { -+ v = v.replace( -+ i, -+ ($id::lanes() - 1 - i) as $elem_ty -+ ); -+ } -+ v -+ }; -+ -+ type Indices = < -+ $id as codegen::shuffle1_dyn::Shuffle1Dyn -+ >::Indices; -+ let increasing_ids: Indices = increasing.cast(); -+ let decreasing_ids: Indices = decreasing.cast(); -+ -+ assert_eq!( -+ increasing.shuffle1_dyn(increasing_ids), -+ increasing, -+ "(i,i)=>i" -+ ); -+ assert_eq!( -+ decreasing.shuffle1_dyn(increasing_ids), -+ decreasing, -+ "(d,i)=>d" -+ ); -+ assert_eq!( -+ increasing.shuffle1_dyn(decreasing_ids), -+ decreasing, -+ "(i,d)=>d" -+ ); -+ assert_eq!( -+ decreasing.shuffle1_dyn(decreasing_ids), -+ increasing, -+ "(d,d)=>i" -+ ); -+ -+ for i in 0..$id::lanes() { -+ let v_ids: Indices -+ = $id::splat(i as $elem_ty).cast(); -+ assert_eq!(increasing.shuffle1_dyn(v_ids), -+ $id::splat(increasing.extract(i)) -+ ); -+ assert_eq!(decreasing.shuffle1_dyn(v_ids), -+ $id::splat(decreasing.extract(i)) -+ ); -+ assert_eq!( -+ $id::splat(i as $elem_ty) -+ .shuffle1_dyn(increasing_ids), -+ $id::splat(i as $elem_ty) -+ ); -+ assert_eq!( -+ $id::splat(i as $elem_ty) -+ .shuffle1_dyn(decreasing_ids), -+ $id::splat(i as $elem_ty) -+ ); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -+ -+macro_rules! test_shuffle1_dyn_mask { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _shuffle1_dyn>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn shuffle1_dyn() { -+ // alternating = [true, false, true, false, ...] -+ let mut alternating = $id::splat(false); -+ for i in 0..$id::lanes() { -+ if i % 2 == 0 { -+ alternating = alternating.replace(i, true); -+ } -+ } -+ -+ type Indices = < -+ $id as codegen::shuffle1_dyn::Shuffle1Dyn -+ >::Indices; -+ // even = [0, 0, 2, 2, 4, 4, ..] -+ let even = { -+ let mut v = Indices::splat(0); -+ for i in 0..$id::lanes() { -+ if i % 2 == 0 { -+ v = v.replace(i, (i as u8).into()); -+ } else { -+ v = v.replace(i, (i as u8 - 1).into()); -+ } -+ } -+ v -+ }; -+ // odd = [1, 1, 3, 3, 5, 5, ...] -+ let odd = { -+ let mut v = Indices::splat(0); -+ for i in 0..$id::lanes() { -+ if i % 2 != 0 { -+ v = v.replace(i, (i as u8).into()); -+ } else { -+ v = v.replace(i, (i as u8 + 1).into()); -+ } -+ } -+ v -+ }; -+ -+ assert_eq!( -+ alternating.shuffle1_dyn(even), -+ $id::splat(true) -+ ); -+ if $id::lanes() > 1 { -+ assert_eq!( -+ alternating.shuffle1_dyn(odd), -+ $id::splat(false) -+ ); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/slice.rs b/third_party/rust/packed_simd/src/api/slice.rs -new file mode 100644 -index 000000000000..526b848b5c06 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/slice.rs -@@ -0,0 +1,7 @@ -+//! Slice from/to methods -+ -+#[macro_use] -+mod from_slice; -+ -+#[macro_use] -+mod write_to_slice; -diff --git a/third_party/rust/packed_simd/src/api/slice/from_slice.rs b/third_party/rust/packed_simd/src/api/slice/from_slice.rs -new file mode 100644 -index 000000000000..109cd1f10b01 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/slice/from_slice.rs -@@ -0,0 +1,216 @@ -+//! Implements methods to read a vector type from a slice. -+ -+macro_rules! impl_slice_from_slice { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Instantiates a new vector with the values of the `slice`. -+ /// -+ /// # Panics -+ /// -+ /// If `slice.len() < Self::lanes()` or `&slice[0]` is not aligned -+ /// to an `align_of::()` boundary. -+ #[inline] -+ pub fn from_slice_aligned(slice: &[$elem_ty]) -> Self { -+ unsafe { -+ assert!(slice.len() >= $elem_count); -+ let target_ptr = slice.get_unchecked(0) as *const $elem_ty; -+ assert_eq!( -+ target_ptr -+ .align_offset(crate::mem::align_of::()), -+ 0 -+ ); -+ Self::from_slice_aligned_unchecked(slice) -+ } -+ } -+ -+ /// Instantiates a new vector with the values of the `slice`. -+ /// -+ /// # Panics -+ /// -+ /// If `slice.len() < Self::lanes()`. -+ #[inline] -+ pub fn from_slice_unaligned(slice: &[$elem_ty]) -> Self { -+ unsafe { -+ assert!(slice.len() >= $elem_count); -+ Self::from_slice_unaligned_unchecked(slice) -+ } -+ } -+ -+ /// Instantiates a new vector with the values of the `slice`. -+ /// -+ /// # Precondition -+ /// -+ /// If `slice.len() < Self::lanes()` or `&slice[0]` is not aligned -+ /// to an `align_of::()` boundary, the behavior is undefined. -+ #[inline] -+ pub unsafe fn from_slice_aligned_unchecked( -+ slice: &[$elem_ty], -+ ) -> Self { -+ debug_assert!(slice.len() >= $elem_count); -+ let target_ptr = slice.get_unchecked(0) as *const $elem_ty; -+ debug_assert_eq!( -+ target_ptr.align_offset(crate::mem::align_of::()), -+ 0 -+ ); -+ -+ #[allow(clippy::cast_ptr_alignment)] -+ *(target_ptr as *const Self) -+ } -+ -+ /// Instantiates a new vector with the values of the `slice`. -+ /// -+ /// # Precondition -+ /// -+ /// If `slice.len() < Self::lanes()` the behavior is undefined. -+ #[inline] -+ pub unsafe fn from_slice_unaligned_unchecked( -+ slice: &[$elem_ty], -+ ) -> Self { -+ use crate::mem::size_of; -+ debug_assert!(slice.len() >= $elem_count); -+ let target_ptr = -+ slice.get_unchecked(0) as *const $elem_ty as *const u8; -+ let mut x = Self::splat(0 as $elem_ty); -+ let self_ptr = &mut x as *mut Self as *mut u8; -+ crate::ptr::copy_nonoverlapping( -+ target_ptr, -+ self_ptr, -+ size_of::(), -+ ); -+ x -+ } -+ } -+ -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _slice_from_slice>] { -+ use super::*; -+ use crate::iter::Iterator; -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn from_slice_unaligned() { -+ let mut unaligned = [42 as $elem_ty; $id::lanes() + 1]; -+ unaligned[0] = 0 as $elem_ty; -+ let vec = $id::from_slice_unaligned(&unaligned[1..]); -+ for (index, &b) in unaligned.iter().enumerate() { -+ if index == 0 { -+ assert_eq!(b, 0 as $elem_ty); -+ } else { -+ assert_eq!(b, 42 as $elem_ty); -+ assert_eq!(b, vec.extract(index - 1)); -+ } -+ } -+ } -+ -+ // FIXME: wasm-bindgen-test does not support #[should_panic] -+ // #[cfg_attr(not(target_arch = "wasm32"), test)] -+ // #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg(not(target_arch = "wasm32"))] -+ #[test] -+ #[should_panic] -+ fn from_slice_unaligned_fail() { -+ let mut unaligned = [42 as $elem_ty; $id::lanes() + 1]; -+ unaligned[0] = 0 as $elem_ty; -+ // the slice is not large enough => panic -+ let _vec = $id::from_slice_unaligned(&unaligned[2..]); -+ } -+ -+ union A { -+ data: [$elem_ty; 2 * $id::lanes()], -+ _vec: $id, -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn from_slice_aligned() { -+ let mut aligned = A { -+ data: [0 as $elem_ty; 2 * $id::lanes()], -+ }; -+ for i in $id::lanes()..(2 * $id::lanes()) { -+ unsafe { -+ aligned.data[i] = 42 as $elem_ty; -+ } -+ } -+ -+ let vec = unsafe { -+ $id::from_slice_aligned( -+ &aligned.data[$id::lanes()..] -+ ) -+ }; -+ for (index, &b) in -+ unsafe { aligned.data.iter().enumerate() } { -+ if index < $id::lanes() { -+ assert_eq!(b, 0 as $elem_ty); -+ } else { -+ assert_eq!(b, 42 as $elem_ty); -+ assert_eq!( -+ b, vec.extract(index - $id::lanes()) -+ ); -+ } -+ } -+ } -+ -+ // FIXME: wasm-bindgen-test does not support #[should_panic] -+ // #[cfg_attr(not(target_arch = "wasm32"), test)] -+ // #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg(not(target_arch = "wasm32"))] -+ #[test] -+ #[should_panic] -+ fn from_slice_aligned_fail_lanes() { -+ let aligned = A { -+ data: [0 as $elem_ty; 2 * $id::lanes()], -+ }; -+ let _vec = unsafe { -+ $id::from_slice_aligned( -+ &aligned.data[2 * $id::lanes()..] -+ ) -+ }; -+ } -+ -+ // FIXME: wasm-bindgen-test does not support #[should_panic] -+ // #[cfg_attr(not(target_arch = "wasm32"), test)] -+ // #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg(not(target_arch = "wasm32"))] -+ #[test] -+ #[should_panic] -+ fn from_slice_aligned_fail_align() { -+ unsafe { -+ let aligned = A { -+ data: [0 as $elem_ty; 2 * $id::lanes()], -+ }; -+ -+ // get a pointer to the front of data -+ let ptr: *const $elem_ty = aligned.data.as_ptr() -+ as *const $elem_ty; -+ // offset pointer by one element -+ let ptr = ptr.wrapping_add(1); -+ -+ if ptr.align_offset( -+ crate::mem::align_of::<$id>() -+ ) == 0 { -+ // the pointer is properly aligned, so -+ // from_slice_aligned won't fail here (e.g. this -+ // can happen for i128x1). So we panic to make -+ // the "should_fail" test pass: -+ panic!("ok"); -+ } -+ -+ // create a slice - this is safe, because the -+ // elements of the slice exist, are properly -+ // initialized, and properly aligned: -+ let s: &[$elem_ty] = slice::from_raw_parts( -+ ptr, $id::lanes() -+ ); -+ // this should always panic because the slice -+ // alignment does not match the alignment -+ // requirements for the vector type: -+ let _vec = $id::from_slice_aligned(s); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/slice/write_to_slice.rs b/third_party/rust/packed_simd/src/api/slice/write_to_slice.rs -new file mode 100644 -index 000000000000..fcb288da70fc ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/slice/write_to_slice.rs -@@ -0,0 +1,211 @@ -+//! Implements methods to write a vector type to a slice. -+ -+macro_rules! impl_slice_write_to_slice { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Writes the values of the vector to the `slice`. -+ /// -+ /// # Panics -+ /// -+ /// If `slice.len() < Self::lanes()` or `&slice[0]` is not -+ /// aligned to an `align_of::()` boundary. -+ #[inline] -+ pub fn write_to_slice_aligned(self, slice: &mut [$elem_ty]) { -+ unsafe { -+ assert!(slice.len() >= $elem_count); -+ let target_ptr = -+ slice.get_unchecked_mut(0) as *mut $elem_ty; -+ assert_eq!( -+ target_ptr -+ .align_offset(crate::mem::align_of::()), -+ 0 -+ ); -+ self.write_to_slice_aligned_unchecked(slice); -+ } -+ } -+ -+ /// Writes the values of the vector to the `slice`. -+ /// -+ /// # Panics -+ /// -+ /// If `slice.len() < Self::lanes()`. -+ #[inline] -+ pub fn write_to_slice_unaligned(self, slice: &mut [$elem_ty]) { -+ unsafe { -+ assert!(slice.len() >= $elem_count); -+ self.write_to_slice_unaligned_unchecked(slice); -+ } -+ } -+ -+ /// Writes the values of the vector to the `slice`. -+ /// -+ /// # Precondition -+ /// -+ /// If `slice.len() < Self::lanes()` or `&slice[0]` is not -+ /// aligned to an `align_of::()` boundary, the behavior is -+ /// undefined. -+ #[inline] -+ pub unsafe fn write_to_slice_aligned_unchecked( -+ self, slice: &mut [$elem_ty], -+ ) { -+ debug_assert!(slice.len() >= $elem_count); -+ let target_ptr = slice.get_unchecked_mut(0) as *mut $elem_ty; -+ debug_assert_eq!( -+ target_ptr.align_offset(crate::mem::align_of::()), -+ 0 -+ ); -+ -+ #[allow(clippy::cast_ptr_alignment)] -+ #[allow(clippy::cast_ptr_alignment)] -+ #[allow(clippy::cast_ptr_alignment)] -+ #[allow(clippy::cast_ptr_alignment)] -+ *(target_ptr as *mut Self) = self; -+ } -+ -+ /// Writes the values of the vector to the `slice`. -+ /// -+ /// # Precondition -+ /// -+ /// If `slice.len() < Self::lanes()` the behavior is undefined. -+ #[inline] -+ pub unsafe fn write_to_slice_unaligned_unchecked( -+ self, slice: &mut [$elem_ty], -+ ) { -+ debug_assert!(slice.len() >= $elem_count); -+ let target_ptr = -+ slice.get_unchecked_mut(0) as *mut $elem_ty as *mut u8; -+ let self_ptr = &self as *const Self as *const u8; -+ crate::ptr::copy_nonoverlapping( -+ self_ptr, -+ target_ptr, -+ crate::mem::size_of::(), -+ ); -+ } -+ } -+ -+ test_if! { -+ $test_tt: -+ paste::item! { -+ pub mod [<$id _slice_write_to_slice>] { -+ use super::*; -+ use crate::iter::Iterator; -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn write_to_slice_unaligned() { -+ let mut unaligned = [0 as $elem_ty; $id::lanes() + 1]; -+ let vec = $id::splat(42 as $elem_ty); -+ vec.write_to_slice_unaligned(&mut unaligned[1..]); -+ for (index, &b) in unaligned.iter().enumerate() { -+ if index == 0 { -+ assert_eq!(b, 0 as $elem_ty); -+ } else { -+ assert_eq!(b, 42 as $elem_ty); -+ assert_eq!(b, vec.extract(index - 1)); -+ } -+ } -+ } -+ -+ // FIXME: wasm-bindgen-test does not support #[should_panic] -+ // #[cfg_attr(not(target_arch = "wasm32"), test)] -+ // #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg(not(target_arch = "wasm32"))] -+ #[test] -+ #[should_panic] -+ fn write_to_slice_unaligned_fail() { -+ let mut unaligned = [0 as $elem_ty; $id::lanes() + 1]; -+ let vec = $id::splat(42 as $elem_ty); -+ vec.write_to_slice_unaligned(&mut unaligned[2..]); -+ } -+ -+ union A { -+ data: [$elem_ty; 2 * $id::lanes()], -+ _vec: $id, -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn write_to_slice_aligned() { -+ let mut aligned = A { -+ data: [0 as $elem_ty; 2 * $id::lanes()], -+ }; -+ let vec = $id::splat(42 as $elem_ty); -+ unsafe { -+ vec.write_to_slice_aligned( -+ &mut aligned.data[$id::lanes()..] -+ ); -+ for (idx, &b) in aligned.data.iter().enumerate() { -+ if idx < $id::lanes() { -+ assert_eq!(b, 0 as $elem_ty); -+ } else { -+ assert_eq!(b, 42 as $elem_ty); -+ assert_eq!( -+ b, vec.extract(idx - $id::lanes()) -+ ); -+ } -+ } -+ } -+ } -+ -+ // FIXME: wasm-bindgen-test does not support #[should_panic] -+ // #[cfg_attr(not(target_arch = "wasm32"), test)] -+ // #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg(not(target_arch = "wasm32"))] -+ #[test] -+ #[should_panic] -+ fn write_to_slice_aligned_fail_lanes() { -+ let mut aligned = A { -+ data: [0 as $elem_ty; 2 * $id::lanes()], -+ }; -+ let vec = $id::splat(42 as $elem_ty); -+ unsafe { -+ vec.write_to_slice_aligned( -+ &mut aligned.data[2 * $id::lanes()..] -+ ) -+ }; -+ } -+ -+ // FIXME: wasm-bindgen-test does not support #[should_panic] -+ // #[cfg_attr(not(target_arch = "wasm32"), test)] -+ // #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ #[cfg(not(target_arch = "wasm32"))] -+ #[test] -+ #[should_panic] -+ fn write_to_slice_aligned_fail_align() { -+ unsafe { -+ let mut aligned = A { -+ data: [0 as $elem_ty; 2 * $id::lanes()], -+ }; -+ -+ // get a pointer to the front of data -+ let ptr: *mut $elem_ty -+ = aligned.data.as_mut_ptr() as *mut $elem_ty; -+ // offset pointer by one element -+ let ptr = ptr.wrapping_add(1); -+ -+ if ptr.align_offset(crate::mem::align_of::<$id>()) -+ == 0 { -+ // the pointer is properly aligned, so -+ // write_to_slice_aligned won't fail here (e.g. -+ // this can happen for i128x1). So we panic to -+ // make the "should_fail" test pass: -+ panic!("ok"); -+ } -+ -+ // create a slice - this is safe, because the -+ // elements of the slice exist, are properly -+ // initialized, and properly aligned: -+ let s: &mut [$elem_ty] -+ = slice::from_raw_parts_mut(ptr, $id::lanes()); -+ // this should always panic because the slice -+ // alignment does not match the alignment -+ // requirements for the vector type: -+ let vec = $id::splat(42 as $elem_ty); -+ vec.write_to_slice_aligned(s); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/swap_bytes.rs b/third_party/rust/packed_simd/src/api/swap_bytes.rs -new file mode 100644 -index 000000000000..53bba25bd311 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/swap_bytes.rs -@@ -0,0 +1,192 @@ -+//! Horizontal swap bytes -+ -+macro_rules! impl_swap_bytes { -+ ([$elem_ty:ident; $elem_count:expr]: $id:ident | $test_tt:tt) => { -+ impl $id { -+ /// Reverses the byte order of the vector. -+ #[inline] -+ pub fn swap_bytes(self) -> Self { -+ super::codegen::swap_bytes::SwapBytes::swap_bytes(self) -+ } -+ -+ /// Converts self to little endian from the target's endianness. -+ /// -+ /// On little endian this is a no-op. On big endian the bytes are -+ /// swapped. -+ #[inline] -+ pub fn to_le(self) -> Self { -+ #[cfg(target_endian = "little")] -+ { -+ self -+ } -+ #[cfg(not(target_endian = "little"))] -+ { -+ self.swap_bytes() -+ } -+ } -+ -+ /// Converts self to big endian from the target's endianness. -+ /// -+ /// On big endian this is a no-op. On little endian the bytes are -+ /// swapped. -+ #[inline] -+ pub fn to_be(self) -> Self { -+ #[cfg(target_endian = "big")] -+ { -+ self -+ } -+ #[cfg(not(target_endian = "big"))] -+ { -+ self.swap_bytes() -+ } -+ } -+ -+ /// Converts a vector from little endian to the target's endianness. -+ /// -+ /// On little endian this is a no-op. On big endian the bytes are -+ /// swapped. -+ #[inline] -+ pub fn from_le(x: Self) -> Self { -+ #[cfg(target_endian = "little")] -+ { -+ x -+ } -+ #[cfg(not(target_endian = "little"))] -+ { -+ x.swap_bytes() -+ } -+ } -+ -+ /// Converts a vector from big endian to the target's endianness. -+ /// -+ /// On big endian this is a no-op. On little endian the bytes are -+ /// swapped. -+ #[inline] -+ pub fn from_be(x: Self) -> Self { -+ #[cfg(target_endian = "big")] -+ { -+ x -+ } -+ #[cfg(not(target_endian = "big"))] -+ { -+ x.swap_bytes() -+ } -+ } -+ } -+ -+ test_if! { -+ $test_tt: -+ paste::item_with_macros! { -+ pub mod [<$id _swap_bytes>] { -+ use super::*; -+ -+ const BYTES: [u8; 64] = [ -+ 0, 1, 2, 3, 4, 5, 6, 7, -+ 8, 9, 10, 11, 12, 13, 14, 15, -+ 16, 17, 18, 19, 20, 21, 22, 23, -+ 24, 25, 26, 27, 28, 29, 30, 31, -+ 32, 33, 34, 35, 36, 37, 38, 39, -+ 40, 41, 42, 43, 44, 45, 46, 47, -+ 48, 49, 50, 51, 52, 53, 54, 55, -+ 56, 57, 58, 59, 60, 61, 62, 63, -+ ]; -+ -+ macro_rules! swap { -+ ($func: ident) => {{ -+ // catch possible future >512 vectors -+ assert!(mem::size_of::<$id>() <= 64); -+ -+ let mut actual = BYTES; -+ let elems: &mut [$elem_ty] = unsafe { -+ slice::from_raw_parts_mut( -+ actual.as_mut_ptr() as *mut $elem_ty, -+ $id::lanes(), -+ ) -+ }; -+ -+ let vec = $id::from_slice_unaligned(elems); -+ $id::$func(vec).write_to_slice_unaligned(elems); -+ -+ actual -+ }}; -+ } -+ -+ macro_rules! test_swap { -+ ($func: ident) => {{ -+ let actual = swap!($func); -+ let expected = -+ BYTES.iter().rev() -+ .skip(64 - crate::mem::size_of::<$id>()); -+ assert!(actual.iter().zip(expected) -+ .all(|(x, y)| x == y)); -+ }}; -+ } -+ -+ macro_rules! test_no_swap { -+ ($func: ident) => {{ -+ let actual = swap!($func); -+ let expected = BYTES.iter() -+ .take(mem::size_of::<$id>()); -+ -+ assert!(actual.iter().zip(expected) -+ .all(|(x, y)| x == y)); -+ }}; -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn swap_bytes() { -+ test_swap!(swap_bytes); -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn to_le() { -+ #[cfg(target_endian = "little")] -+ { -+ test_no_swap!(to_le); -+ } -+ #[cfg(not(target_endian = "little"))] -+ { -+ test_swap!(to_le); -+ } -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn to_be() { -+ #[cfg(target_endian = "big")] -+ { -+ test_no_swap!(to_be); -+ } -+ #[cfg(not(target_endian = "big"))] -+ { -+ test_swap!(to_be); -+ } -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn from_le() { -+ #[cfg(target_endian = "little")] -+ { -+ test_no_swap!(from_le); -+ } -+ #[cfg(not(target_endian = "little"))] -+ { -+ test_swap!(from_le); -+ } -+ } -+ -+ #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn from_be() { -+ #[cfg(target_endian = "big")] -+ { -+ test_no_swap!(from_be); -+ } -+ #[cfg(not(target_endian = "big"))] -+ { -+ test_swap!(from_be); -+ } -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/codegen.rs b/third_party/rust/packed_simd/src/codegen.rs -new file mode 100644 -index 000000000000..b7ccd838603f ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen.rs -@@ -0,0 +1,59 @@ -+//! Code-generation utilities -+ -+crate mod bit_manip; -+crate mod llvm; -+crate mod math; -+crate mod reductions; -+crate mod shuffle; -+crate mod shuffle1_dyn; -+crate mod swap_bytes; -+ -+macro_rules! impl_simd_array { -+ ([$elem_ty:ident; $elem_count:expr]: -+ $tuple_id:ident | $($elem_tys:ident),*) => { -+ #[derive(Copy, Clone)] -+ #[repr(simd)] -+ pub struct $tuple_id($(crate $elem_tys),*); -+ //^^^^^^^ leaked through SimdArray -+ -+ impl crate::sealed::SimdArray for [$elem_ty; $elem_count] { -+ type Tuple = $tuple_id; -+ type T = $elem_ty; -+ const N: usize = $elem_count; -+ type NT = [u32; $elem_count]; -+ } -+ -+ impl crate::sealed::Simd for $tuple_id { -+ type Element = $elem_ty; -+ const LANES: usize = $elem_count; -+ type LanesType = [u32; $elem_count]; -+ } -+ -+ } -+} -+ -+crate mod pointer_sized_int; -+ -+crate mod v16; -+crate use self::v16::*; -+ -+crate mod v32; -+crate use self::v32::*; -+ -+crate mod v64; -+crate use self::v64::*; -+ -+crate mod v128; -+crate use self::v128::*; -+ -+crate mod v256; -+crate use self::v256::*; -+ -+crate mod v512; -+crate use self::v512::*; -+ -+crate mod vSize; -+crate use self::vSize::*; -+ -+crate mod vPtr; -+crate use self::vPtr::*; -diff --git a/third_party/rust/packed_simd/src/codegen/bit_manip.rs b/third_party/rust/packed_simd/src/codegen/bit_manip.rs -new file mode 100644 -index 000000000000..947266f5bce8 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/bit_manip.rs -@@ -0,0 +1,354 @@ -+//! LLVM bit manipulation intrinsics. -+#![rustfmt::skip] -+ -+use crate::*; -+ -+#[allow(improper_ctypes, dead_code)] -+extern "C" { -+ #[link_name = "llvm.ctlz.v2i8"] -+ fn ctlz_u8x2(x: u8x2, is_zero_undef: bool) -> u8x2; -+ #[link_name = "llvm.ctlz.v4i8"] -+ fn ctlz_u8x4(x: u8x4, is_zero_undef: bool) -> u8x4; -+ #[link_name = "llvm.ctlz.v8i8"] -+ fn ctlz_u8x8(x: u8x8, is_zero_undef: bool) -> u8x8; -+ #[link_name = "llvm.ctlz.v16i8"] -+ fn ctlz_u8x16(x: u8x16, is_zero_undef: bool) -> u8x16; -+ #[link_name = "llvm.ctlz.v32i8"] -+ fn ctlz_u8x32(x: u8x32, is_zero_undef: bool) -> u8x32; -+ #[link_name = "llvm.ctlz.v64i8"] -+ fn ctlz_u8x64(x: u8x64, is_zero_undef: bool) -> u8x64; -+ -+ #[link_name = "llvm.ctlz.v2i16"] -+ fn ctlz_u16x2(x: u16x2, is_zero_undef: bool) -> u16x2; -+ #[link_name = "llvm.ctlz.v4i16"] -+ fn ctlz_u16x4(x: u16x4, is_zero_undef: bool) -> u16x4; -+ #[link_name = "llvm.ctlz.v8i16"] -+ fn ctlz_u16x8(x: u16x8, is_zero_undef: bool) -> u16x8; -+ #[link_name = "llvm.ctlz.v16i16"] -+ fn ctlz_u16x16(x: u16x16, is_zero_undef: bool) -> u16x16; -+ #[link_name = "llvm.ctlz.v32i16"] -+ fn ctlz_u16x32(x: u16x32, is_zero_undef: bool) -> u16x32; -+ -+ #[link_name = "llvm.ctlz.v2i32"] -+ fn ctlz_u32x2(x: u32x2, is_zero_undef: bool) -> u32x2; -+ #[link_name = "llvm.ctlz.v4i32"] -+ fn ctlz_u32x4(x: u32x4, is_zero_undef: bool) -> u32x4; -+ #[link_name = "llvm.ctlz.v8i32"] -+ fn ctlz_u32x8(x: u32x8, is_zero_undef: bool) -> u32x8; -+ #[link_name = "llvm.ctlz.v16i32"] -+ fn ctlz_u32x16(x: u32x16, is_zero_undef: bool) -> u32x16; -+ -+ #[link_name = "llvm.ctlz.v2i64"] -+ fn ctlz_u64x2(x: u64x2, is_zero_undef: bool) -> u64x2; -+ #[link_name = "llvm.ctlz.v4i64"] -+ fn ctlz_u64x4(x: u64x4, is_zero_undef: bool) -> u64x4; -+ #[link_name = "llvm.ctlz.v8i64"] -+ fn ctlz_u64x8(x: u64x8, is_zero_undef: bool) -> u64x8; -+ -+ #[link_name = "llvm.ctlz.v1i128"] -+ fn ctlz_u128x1(x: u128x1, is_zero_undef: bool) -> u128x1; -+ #[link_name = "llvm.ctlz.v2i128"] -+ fn ctlz_u128x2(x: u128x2, is_zero_undef: bool) -> u128x2; -+ #[link_name = "llvm.ctlz.v4i128"] -+ fn ctlz_u128x4(x: u128x4, is_zero_undef: bool) -> u128x4; -+ -+ #[link_name = "llvm.cttz.v2i8"] -+ fn cttz_u8x2(x: u8x2, is_zero_undef: bool) -> u8x2; -+ #[link_name = "llvm.cttz.v4i8"] -+ fn cttz_u8x4(x: u8x4, is_zero_undef: bool) -> u8x4; -+ #[link_name = "llvm.cttz.v8i8"] -+ fn cttz_u8x8(x: u8x8, is_zero_undef: bool) -> u8x8; -+ #[link_name = "llvm.cttz.v16i8"] -+ fn cttz_u8x16(x: u8x16, is_zero_undef: bool) -> u8x16; -+ #[link_name = "llvm.cttz.v32i8"] -+ fn cttz_u8x32(x: u8x32, is_zero_undef: bool) -> u8x32; -+ #[link_name = "llvm.cttz.v64i8"] -+ fn cttz_u8x64(x: u8x64, is_zero_undef: bool) -> u8x64; -+ -+ #[link_name = "llvm.cttz.v2i16"] -+ fn cttz_u16x2(x: u16x2, is_zero_undef: bool) -> u16x2; -+ #[link_name = "llvm.cttz.v4i16"] -+ fn cttz_u16x4(x: u16x4, is_zero_undef: bool) -> u16x4; -+ #[link_name = "llvm.cttz.v8i16"] -+ fn cttz_u16x8(x: u16x8, is_zero_undef: bool) -> u16x8; -+ #[link_name = "llvm.cttz.v16i16"] -+ fn cttz_u16x16(x: u16x16, is_zero_undef: bool) -> u16x16; -+ #[link_name = "llvm.cttz.v32i16"] -+ fn cttz_u16x32(x: u16x32, is_zero_undef: bool) -> u16x32; -+ -+ #[link_name = "llvm.cttz.v2i32"] -+ fn cttz_u32x2(x: u32x2, is_zero_undef: bool) -> u32x2; -+ #[link_name = "llvm.cttz.v4i32"] -+ fn cttz_u32x4(x: u32x4, is_zero_undef: bool) -> u32x4; -+ #[link_name = "llvm.cttz.v8i32"] -+ fn cttz_u32x8(x: u32x8, is_zero_undef: bool) -> u32x8; -+ #[link_name = "llvm.cttz.v16i32"] -+ fn cttz_u32x16(x: u32x16, is_zero_undef: bool) -> u32x16; -+ -+ #[link_name = "llvm.cttz.v2i64"] -+ fn cttz_u64x2(x: u64x2, is_zero_undef: bool) -> u64x2; -+ #[link_name = "llvm.cttz.v4i64"] -+ fn cttz_u64x4(x: u64x4, is_zero_undef: bool) -> u64x4; -+ #[link_name = "llvm.cttz.v8i64"] -+ fn cttz_u64x8(x: u64x8, is_zero_undef: bool) -> u64x8; -+ -+ #[link_name = "llvm.cttz.v1i128"] -+ fn cttz_u128x1(x: u128x1, is_zero_undef: bool) -> u128x1; -+ #[link_name = "llvm.cttz.v2i128"] -+ fn cttz_u128x2(x: u128x2, is_zero_undef: bool) -> u128x2; -+ #[link_name = "llvm.cttz.v4i128"] -+ fn cttz_u128x4(x: u128x4, is_zero_undef: bool) -> u128x4; -+ -+ #[link_name = "llvm.ctpop.v2i8"] -+ fn ctpop_u8x2(x: u8x2) -> u8x2; -+ #[link_name = "llvm.ctpop.v4i8"] -+ fn ctpop_u8x4(x: u8x4) -> u8x4; -+ #[link_name = "llvm.ctpop.v8i8"] -+ fn ctpop_u8x8(x: u8x8) -> u8x8; -+ #[link_name = "llvm.ctpop.v16i8"] -+ fn ctpop_u8x16(x: u8x16) -> u8x16; -+ #[link_name = "llvm.ctpop.v32i8"] -+ fn ctpop_u8x32(x: u8x32) -> u8x32; -+ #[link_name = "llvm.ctpop.v64i8"] -+ fn ctpop_u8x64(x: u8x64) -> u8x64; -+ -+ #[link_name = "llvm.ctpop.v2i16"] -+ fn ctpop_u16x2(x: u16x2) -> u16x2; -+ #[link_name = "llvm.ctpop.v4i16"] -+ fn ctpop_u16x4(x: u16x4) -> u16x4; -+ #[link_name = "llvm.ctpop.v8i16"] -+ fn ctpop_u16x8(x: u16x8) -> u16x8; -+ #[link_name = "llvm.ctpop.v16i16"] -+ fn ctpop_u16x16(x: u16x16) -> u16x16; -+ #[link_name = "llvm.ctpop.v32i16"] -+ fn ctpop_u16x32(x: u16x32) -> u16x32; -+ -+ #[link_name = "llvm.ctpop.v2i32"] -+ fn ctpop_u32x2(x: u32x2) -> u32x2; -+ #[link_name = "llvm.ctpop.v4i32"] -+ fn ctpop_u32x4(x: u32x4) -> u32x4; -+ #[link_name = "llvm.ctpop.v8i32"] -+ fn ctpop_u32x8(x: u32x8) -> u32x8; -+ #[link_name = "llvm.ctpop.v16i32"] -+ fn ctpop_u32x16(x: u32x16) -> u32x16; -+ -+ #[link_name = "llvm.ctpop.v2i64"] -+ fn ctpop_u64x2(x: u64x2) -> u64x2; -+ #[link_name = "llvm.ctpop.v4i64"] -+ fn ctpop_u64x4(x: u64x4) -> u64x4; -+ #[link_name = "llvm.ctpop.v8i64"] -+ fn ctpop_u64x8(x: u64x8) -> u64x8; -+ -+ #[link_name = "llvm.ctpop.v1i128"] -+ fn ctpop_u128x1(x: u128x1) -> u128x1; -+ #[link_name = "llvm.ctpop.v2i128"] -+ fn ctpop_u128x2(x: u128x2) -> u128x2; -+ #[link_name = "llvm.ctpop.v4i128"] -+ fn ctpop_u128x4(x: u128x4) -> u128x4; -+} -+ -+crate trait BitManip { -+ fn ctpop(self) -> Self; -+ fn ctlz(self) -> Self; -+ fn cttz(self) -> Self; -+} -+ -+macro_rules! impl_bit_manip { -+ (inner: $ty:ident, $scalar:ty, $uty:ident, -+ $ctpop:ident, $ctlz:ident, $cttz:ident) => { -+ // FIXME: several LLVM intrinsics break on s390x https://github.com/rust-lang-nursery/packed_simd/issues/192 -+ #[cfg(target_arch = "s390x")] -+ impl_bit_manip! { scalar: $ty, $scalar } -+ #[cfg(not(target_arch = "s390x"))] -+ impl BitManip for $ty { -+ #[inline] -+ fn ctpop(self) -> Self { -+ let y: $uty = self.cast(); -+ unsafe { $ctpop(y).cast() } -+ } -+ -+ #[inline] -+ fn ctlz(self) -> Self { -+ let y: $uty = self.cast(); -+ // the ctxx intrinsics need compile-time constant -+ // `is_zero_undef` -+ unsafe { $ctlz(y, false).cast() } -+ } -+ -+ #[inline] -+ fn cttz(self) -> Self { -+ let y: $uty = self.cast(); -+ unsafe { $cttz(y, false).cast() } -+ } -+ } -+ }; -+ (sized_inner: $ty:ident, $scalar:ty, $uty:ident) => { -+ #[cfg(target_arch = "s390x")] -+ impl_bit_manip! { scalar: $ty, $scalar } -+ #[cfg(not(target_arch = "s390x"))] -+ impl BitManip for $ty { -+ #[inline] -+ fn ctpop(self) -> Self { -+ let y: $uty = self.cast(); -+ $uty::ctpop(y).cast() -+ } -+ -+ #[inline] -+ fn ctlz(self) -> Self { -+ let y: $uty = self.cast(); -+ $uty::ctlz(y).cast() -+ } -+ -+ #[inline] -+ fn cttz(self) -> Self { -+ let y: $uty = self.cast(); -+ $uty::cttz(y).cast() -+ } -+ } -+ }; -+ (scalar: $ty:ident, $scalar:ty) => { -+ impl BitManip for $ty { -+ #[inline] -+ fn ctpop(self) -> Self { -+ let mut ones = self; -+ for i in 0..Self::lanes() { -+ ones = ones -+ .replace(i, self.extract(i).count_ones() as $scalar); -+ } -+ ones -+ } -+ -+ #[inline] -+ fn ctlz(self) -> Self { -+ let mut lz = self; -+ for i in 0..Self::lanes() { -+ lz = lz.replace( -+ i, -+ self.extract(i).leading_zeros() as $scalar, -+ ); -+ } -+ lz -+ } -+ -+ #[inline] -+ fn cttz(self) -> Self { -+ let mut tz = self; -+ for i in 0..Self::lanes() { -+ tz = tz.replace( -+ i, -+ self.extract(i).trailing_zeros() as $scalar, -+ ); -+ } -+ tz -+ } -+ } -+ }; -+ ($uty:ident, $uscalar:ty, $ity:ident, $iscalar:ty, -+ $ctpop:ident, $ctlz:ident, $cttz:ident) => { -+ impl_bit_manip! { inner: $uty, $uscalar, $uty, $ctpop, $ctlz, $cttz } -+ impl_bit_manip! { inner: $ity, $iscalar, $uty, $ctpop, $ctlz, $cttz } -+ }; -+ (sized: $usize:ident, $uscalar:ty, $isize:ident, -+ $iscalar:ty, $ty:ident) => { -+ impl_bit_manip! { sized_inner: $usize, $uscalar, $ty } -+ impl_bit_manip! { sized_inner: $isize, $iscalar, $ty } -+ }; -+} -+ -+impl_bit_manip! { u8x2 , u8, i8x2, i8, ctpop_u8x2, ctlz_u8x2, cttz_u8x2 } -+impl_bit_manip! { u8x4 , u8, i8x4, i8, ctpop_u8x4, ctlz_u8x4, cttz_u8x4 } -+#[cfg(not(target_arch = "aarch64"))] // see below -+impl_bit_manip! { u8x8 , u8, i8x8, i8, ctpop_u8x8, ctlz_u8x8, cttz_u8x8 } -+impl_bit_manip! { u8x16 , u8, i8x16, i8, ctpop_u8x16, ctlz_u8x16, cttz_u8x16 } -+impl_bit_manip! { u8x32 , u8, i8x32, i8, ctpop_u8x32, ctlz_u8x32, cttz_u8x32 } -+impl_bit_manip! { u8x64 , u8, i8x64, i8, ctpop_u8x64, ctlz_u8x64, cttz_u8x64 } -+impl_bit_manip! { u16x2 , u16, i16x2, i16, ctpop_u16x2, ctlz_u16x2, cttz_u16x2 } -+impl_bit_manip! { u16x4 , u16, i16x4, i16, ctpop_u16x4, ctlz_u16x4, cttz_u16x4 } -+impl_bit_manip! { u16x8 , u16, i16x8, i16, ctpop_u16x8, ctlz_u16x8, cttz_u16x8 } -+impl_bit_manip! { u16x16 , u16, i16x16, i16, ctpop_u16x16, ctlz_u16x16, cttz_u16x16 } -+impl_bit_manip! { u16x32 , u16, i16x32, i16, ctpop_u16x32, ctlz_u16x32, cttz_u16x32 } -+impl_bit_manip! { u32x2 , u32, i32x2, i32, ctpop_u32x2, ctlz_u32x2, cttz_u32x2 } -+impl_bit_manip! { u32x4 , u32, i32x4, i32, ctpop_u32x4, ctlz_u32x4, cttz_u32x4 } -+impl_bit_manip! { u32x8 , u32, i32x8, i32, ctpop_u32x8, ctlz_u32x8, cttz_u32x8 } -+impl_bit_manip! { u32x16 , u32, i32x16, i32, ctpop_u32x16, ctlz_u32x16, cttz_u32x16 } -+impl_bit_manip! { u64x2 , u64, i64x2, i64, ctpop_u64x2, ctlz_u64x2, cttz_u64x2 } -+impl_bit_manip! { u64x4 , u64, i64x4, i64, ctpop_u64x4, ctlz_u64x4, cttz_u64x4 } -+impl_bit_manip! { u64x8 , u64, i64x8, i64, ctpop_u64x8, ctlz_u64x8, cttz_u64x8 } -+impl_bit_manip! { u128x1 , u128, i128x1, i128, ctpop_u128x1, ctlz_u128x1, cttz_u128x1 } -+impl_bit_manip! { u128x2 , u128, i128x2, i128, ctpop_u128x2, ctlz_u128x2, cttz_u128x2 } -+impl_bit_manip! { u128x4 , u128, i128x4, i128, ctpop_u128x4, ctlz_u128x4, cttz_u128x4 } -+ -+#[cfg(target_arch = "aarch64")] -+impl BitManip for u8x8 { -+ #[inline] -+ fn ctpop(self) -> Self { -+ let y: u8x8 = self.cast(); -+ unsafe { ctpop_u8x8(y).cast() } -+ } -+ -+ #[inline] -+ fn ctlz(self) -> Self { -+ let y: u8x8 = self.cast(); -+ unsafe { ctlz_u8x8(y, false).cast() } -+ } -+ -+ #[inline] -+ fn cttz(self) -> Self { -+ // FIXME: LLVM cttz.v8i8 broken on aarch64 https://github.com/rust-lang-nursery/packed_simd/issues/191 -+ // OPTIMIZE: adapt the algorithm used for v8i16/etc to Rust's aarch64 -+ // intrinsics -+ let mut tz = self; -+ for i in 0..Self::lanes() { -+ tz = tz.replace(i, self.extract(i).trailing_zeros() as u8); -+ } -+ tz -+ } -+} -+#[cfg(target_arch = "aarch64")] -+impl BitManip for i8x8 { -+ #[inline] -+ fn ctpop(self) -> Self { -+ let y: u8x8 = self.cast(); -+ unsafe { ctpop_u8x8(y).cast() } -+ } -+ -+ #[inline] -+ fn ctlz(self) -> Self { -+ let y: u8x8 = self.cast(); -+ unsafe { ctlz_u8x8(y, false).cast() } -+ } -+ -+ #[inline] -+ fn cttz(self) -> Self { -+ // FIXME: LLVM cttz.v8i8 broken on aarch64 https://github.com/rust-lang-nursery/packed_simd/issues/191 -+ // OPTIMIZE: adapt the algorithm used for v8i16/etc to Rust's aarch64 -+ // intrinsics -+ let mut tz = self; -+ for i in 0..Self::lanes() { -+ tz = tz.replace(i, self.extract(i).trailing_zeros() as i8); -+ } -+ tz -+ } -+} -+ -+cfg_if! { -+ if #[cfg(target_pointer_width = "8")] { -+ impl_bit_manip! { sized: usizex2, usize, isizex2, isize, u8x2 } -+ impl_bit_manip! { sized: usizex4, usize, isizex4, isize, u8x4 } -+ impl_bit_manip! { sized: usizex8, usize, isizex8, isize, u8x8 } -+ } else if #[cfg(target_pointer_width = "16")] { -+ impl_bit_manip! { sized: usizex2, usize, isizex2, isize, u16x2 } -+ impl_bit_manip! { sized: usizex4, usize, isizex4, isize, u16x4 } -+ impl_bit_manip! { sized: usizex8, usize, isizex8, isize, u16x8 } -+ } else if #[cfg(target_pointer_width = "32")] { -+ impl_bit_manip! { sized: usizex2, usize, isizex2, isize, u32x2 } -+ impl_bit_manip! { sized: usizex4, usize, isizex4, isize, u32x4 } -+ impl_bit_manip! { sized: usizex8, usize, isizex8, isize, u32x8 } -+ } else if #[cfg(target_pointer_width = "64")] { -+ impl_bit_manip! { sized: usizex2, usize, isizex2, isize, u64x2 } -+ impl_bit_manip! { sized: usizex4, usize, isizex4, isize, u64x4 } -+ impl_bit_manip! { sized: usizex8, usize, isizex8, isize, u64x8 } -+ } else { -+ compile_error!("unsupported target_pointer_width"); -+ } -+} -diff --git a/third_party/rust/packed_simd/src/codegen/llvm.rs b/third_party/rust/packed_simd/src/codegen/llvm.rs -new file mode 100644 -index 000000000000..91c2b0758dcf ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/llvm.rs -@@ -0,0 +1,99 @@ -+//! LLVM's platform intrinsics -+#![allow(dead_code)] -+ -+use crate::sealed::Shuffle; -+#[allow(unused_imports)] // FIXME: spurious warning? -+use crate::sealed::Simd; -+ -+// Shuffle intrinsics: expanded in users' crates, therefore public. -+extern "platform-intrinsic" { -+ // FIXME: Passing this intrinsics an `idx` array with an index that is -+ // out-of-bounds will produce a monomorphization-time error. -+ // https://github.com/rust-lang-nursery/packed_simd/issues/21 -+ pub fn simd_shuffle2(x: T, y: T, idx: [u32; 2]) -> U -+ where -+ T: Simd, -+ ::Element: Shuffle<[u32; 2], Output = U>; -+ -+ pub fn simd_shuffle4(x: T, y: T, idx: [u32; 4]) -> U -+ where -+ T: Simd, -+ ::Element: Shuffle<[u32; 4], Output = U>; -+ -+ pub fn simd_shuffle8(x: T, y: T, idx: [u32; 8]) -> U -+ where -+ T: Simd, -+ ::Element: Shuffle<[u32; 8], Output = U>; -+ -+ pub fn simd_shuffle16(x: T, y: T, idx: [u32; 16]) -> U -+ where -+ T: Simd, -+ ::Element: Shuffle<[u32; 16], Output = U>; -+ -+ pub fn simd_shuffle32(x: T, y: T, idx: [u32; 32]) -> U -+ where -+ T: Simd, -+ ::Element: Shuffle<[u32; 32], Output = U>; -+ -+ pub fn simd_shuffle64(x: T, y: T, idx: [u32; 64]) -> U -+ where -+ T: Simd, -+ ::Element: Shuffle<[u32; 64], Output = U>; -+} -+ -+pub use self::simd_shuffle16 as __shuffle_vector16; -+pub use self::simd_shuffle2 as __shuffle_vector2; -+pub use self::simd_shuffle32 as __shuffle_vector32; -+pub use self::simd_shuffle4 as __shuffle_vector4; -+pub use self::simd_shuffle64 as __shuffle_vector64; -+pub use self::simd_shuffle8 as __shuffle_vector8; -+ -+extern "platform-intrinsic" { -+ crate fn simd_eq(x: T, y: T) -> U; -+ crate fn simd_ne(x: T, y: T) -> U; -+ crate fn simd_lt(x: T, y: T) -> U; -+ crate fn simd_le(x: T, y: T) -> U; -+ crate fn simd_gt(x: T, y: T) -> U; -+ crate fn simd_ge(x: T, y: T) -> U; -+ -+ crate fn simd_insert(x: T, idx: u32, val: U) -> T; -+ crate fn simd_extract(x: T, idx: u32) -> U; -+ -+ crate fn simd_cast(x: T) -> U; -+ -+ crate fn simd_add(x: T, y: T) -> T; -+ crate fn simd_sub(x: T, y: T) -> T; -+ crate fn simd_mul(x: T, y: T) -> T; -+ crate fn simd_div(x: T, y: T) -> T; -+ crate fn simd_rem(x: T, y: T) -> T; -+ crate fn simd_shl(x: T, y: T) -> T; -+ crate fn simd_shr(x: T, y: T) -> T; -+ crate fn simd_and(x: T, y: T) -> T; -+ crate fn simd_or(x: T, y: T) -> T; -+ crate fn simd_xor(x: T, y: T) -> T; -+ -+ crate fn simd_reduce_add_unordered(x: T) -> U; -+ crate fn simd_reduce_mul_unordered(x: T) -> U; -+ crate fn simd_reduce_add_ordered(x: T, acc: U) -> U; -+ crate fn simd_reduce_mul_ordered(x: T, acc: U) -> U; -+ crate fn simd_reduce_min(x: T) -> U; -+ crate fn simd_reduce_max(x: T) -> U; -+ crate fn simd_reduce_min_nanless(x: T) -> U; -+ crate fn simd_reduce_max_nanless(x: T) -> U; -+ crate fn simd_reduce_and(x: T) -> U; -+ crate fn simd_reduce_or(x: T) -> U; -+ crate fn simd_reduce_xor(x: T) -> U; -+ crate fn simd_reduce_all(x: T) -> bool; -+ crate fn simd_reduce_any(x: T) -> bool; -+ -+ crate fn simd_select(m: M, a: T, b: T) -> T; -+ -+ crate fn simd_fmin(a: T, b: T) -> T; -+ crate fn simd_fmax(a: T, b: T) -> T; -+ -+ crate fn simd_fsqrt(a: T) -> T; -+ crate fn simd_fma(a: T, b: T, c: T) -> T; -+ -+ crate fn simd_gather(value: T, pointers: P, mask: M) -> T; -+ crate fn simd_scatter(value: T, pointers: P, mask: M); -+} -diff --git a/third_party/rust/packed_simd/src/codegen/math.rs b/third_party/rust/packed_simd/src/codegen/math.rs -new file mode 100644 -index 000000000000..f3997c7f1135 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/math.rs -@@ -0,0 +1,3 @@ -+//! Vertical math operations -+ -+crate mod float; -diff --git a/third_party/rust/packed_simd/src/codegen/math/float.rs b/third_party/rust/packed_simd/src/codegen/math/float.rs -new file mode 100644 -index 000000000000..5e89bf6ae6b0 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/math/float.rs -@@ -0,0 +1,18 @@ -+//! Vertical floating-point math operations. -+#![allow(clippy::useless_transmute)] -+ -+#[macro_use] -+crate mod macros; -+crate mod abs; -+crate mod cos; -+crate mod cos_pi; -+crate mod exp; -+crate mod ln; -+crate mod mul_add; -+crate mod mul_adde; -+crate mod powf; -+crate mod sin; -+crate mod sin_cos_pi; -+crate mod sin_pi; -+crate mod sqrt; -+crate mod sqrte; -diff --git a/third_party/rust/packed_simd/src/codegen/math/float/abs.rs b/third_party/rust/packed_simd/src/codegen/math/float/abs.rs -new file mode 100644 -index 000000000000..bc4421f61de2 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/math/float/abs.rs -@@ -0,0 +1,103 @@ -+//! Vertical floating-point `fabs` -+#![allow(unused)] -+ -+// FIXME 64-bit 1 elem vectors fabs -+ -+use crate::*; -+ -+crate trait Abs { -+ fn abs(self) -> Self; -+} -+ -+#[allow(improper_ctypes)] -+extern "C" { -+ #[link_name = "llvm.fabs.v2f32"] -+ fn fabs_v2f32(x: f32x2) -> f32x2; -+ #[link_name = "llvm.fabs.v4f32"] -+ fn fabs_v4f32(x: f32x4) -> f32x4; -+ #[link_name = "llvm.fabs.v8f32"] -+ fn fabs_v8f32(x: f32x8) -> f32x8; -+ #[link_name = "llvm.fabs.v16f32"] -+ fn fabs_v16f32(x: f32x16) -> f32x16; -+ /* FIXME 64-bit fabsgle elem vectors -+ #[link_name = "llvm.fabs.v1f64"] -+ fn fabs_v1f64(x: f64x1) -> f64x1; -+ */ -+ #[link_name = "llvm.fabs.v2f64"] -+ fn fabs_v2f64(x: f64x2) -> f64x2; -+ #[link_name = "llvm.fabs.v4f64"] -+ fn fabs_v4f64(x: f64x4) -> f64x4; -+ #[link_name = "llvm.fabs.v8f64"] -+ fn fabs_v8f64(x: f64x8) -> f64x8; -+ -+ #[link_name = "llvm.fabs.f32"] -+ fn fabs_f32(x: f32) -> f32; -+ #[link_name = "llvm.fabs.f64"] -+ fn fabs_f64(x: f64) -> f64; -+} -+ -+gen_unary_impl_table!(Abs, abs); -+ -+cfg_if! { -+ if #[cfg(target_arch = "s390x")] { -+ // FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/14 -+ impl_unary!(f32x2[f32; 2]: fabs_f32); -+ impl_unary!(f32x4[f32; 4]: fabs_f32); -+ impl_unary!(f32x8[f32; 8]: fabs_f32); -+ impl_unary!(f32x16[f32; 16]: fabs_f32); -+ -+ impl_unary!(f64x2[f64; 2]: fabs_f64); -+ impl_unary!(f64x4[f64; 4]: fabs_f64); -+ impl_unary!(f64x8[f64; 8]: fabs_f64); -+ } else if #[cfg(all(target_arch = "x86_64", feature = "sleef-sys"))] { -+ use sleef_sys::*; -+ cfg_if! { -+ if #[cfg(target_feature = "avx2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_fabsf4_avx2128); -+ impl_unary!(f32x16[h => f32x8]: Sleef_fabsf8_avx2); -+ impl_unary!(f64x8[h => f64x4]: Sleef_fabsd4_avx2); -+ -+ impl_unary!(f32x4: Sleef_fabsf4_avx2128); -+ impl_unary!(f32x8: Sleef_fabsf8_avx2); -+ impl_unary!(f64x2: Sleef_fabsd2_avx2128); -+ impl_unary!(f64x4: Sleef_fabsd4_avx2); -+ } else if #[cfg(target_feature = "avx")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_fabsf4_sse4); -+ impl_unary!(f32x16[h => f32x8]: Sleef_fabsf8_avx); -+ impl_unary!(f64x8[h => f64x4]: Sleef_fabsd4_avx); -+ -+ impl_unary!(f32x4: Sleef_fabsf4_sse4); -+ impl_unary!(f32x8: Sleef_fabsf8_avx); -+ impl_unary!(f64x2: Sleef_fabsd2_sse4); -+ impl_unary!(f64x4: Sleef_fabsd4_avx); -+ } else if #[cfg(target_feature = "sse4.2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_fabsf4_sse4); -+ impl_unary!(f32x16[q => f32x4]: Sleef_fabsf4_sse4); -+ impl_unary!(f64x8[q => f64x2]: Sleef_fabsd2_sse4); -+ -+ impl_unary!(f32x4: Sleef_fabsf4_sse4); -+ impl_unary!(f32x8[h => f32x4]: Sleef_fabsf4_sse4); -+ impl_unary!(f64x2: Sleef_fabsd2_sse4); -+ impl_unary!(f64x4[h => f64x2]: Sleef_fabsd2_sse4); -+ } else { -+ impl_unary!(f32x2[f32; 2]: fabs_f32); -+ impl_unary!(f32x16: fabs_v16f32); -+ impl_unary!(f64x8: fabs_v8f64); -+ -+ impl_unary!(f32x4: fabs_v4f32); -+ impl_unary!(f32x8: fabs_v8f32); -+ impl_unary!(f64x2: fabs_v2f64); -+ impl_unary!(f64x4: fabs_v4f64); -+ } -+ } -+ } else { -+ impl_unary!(f32x2[f32; 2]: fabs_f32); -+ impl_unary!(f32x4: fabs_v4f32); -+ impl_unary!(f32x8: fabs_v8f32); -+ impl_unary!(f32x16: fabs_v16f32); -+ -+ impl_unary!(f64x2: fabs_v2f64); -+ impl_unary!(f64x4: fabs_v4f64); -+ impl_unary!(f64x8: fabs_v8f64); -+ } -+} -diff --git a/third_party/rust/packed_simd/src/codegen/math/float/cos.rs b/third_party/rust/packed_simd/src/codegen/math/float/cos.rs -new file mode 100644 -index 000000000000..50f6c16da255 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/math/float/cos.rs -@@ -0,0 +1,103 @@ -+//! Vertical floating-point `cos` -+#![allow(unused)] -+ -+// FIXME 64-bit 1 elem vector cos -+ -+use crate::*; -+ -+crate trait Cos { -+ fn cos(self) -> Self; -+} -+ -+#[allow(improper_ctypes)] -+extern "C" { -+ #[link_name = "llvm.cos.v2f32"] -+ fn cos_v2f32(x: f32x2) -> f32x2; -+ #[link_name = "llvm.cos.v4f32"] -+ fn cos_v4f32(x: f32x4) -> f32x4; -+ #[link_name = "llvm.cos.v8f32"] -+ fn cos_v8f32(x: f32x8) -> f32x8; -+ #[link_name = "llvm.cos.v16f32"] -+ fn cos_v16f32(x: f32x16) -> f32x16; -+ /* FIXME 64-bit cosgle elem vectors -+ #[link_name = "llvm.cos.v1f64"] -+ fn cos_v1f64(x: f64x1) -> f64x1; -+ */ -+ #[link_name = "llvm.cos.v2f64"] -+ fn cos_v2f64(x: f64x2) -> f64x2; -+ #[link_name = "llvm.cos.v4f64"] -+ fn cos_v4f64(x: f64x4) -> f64x4; -+ #[link_name = "llvm.cos.v8f64"] -+ fn cos_v8f64(x: f64x8) -> f64x8; -+ -+ #[link_name = "llvm.cos.f32"] -+ fn cos_f32(x: f32) -> f32; -+ #[link_name = "llvm.cos.f64"] -+ fn cos_f64(x: f64) -> f64; -+} -+ -+gen_unary_impl_table!(Cos, cos); -+ -+cfg_if! { -+ if #[cfg(target_arch = "s390x")] { -+ // FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/14 -+ impl_unary!(f32x2[f32; 2]: cos_f32); -+ impl_unary!(f32x4[f32; 4]: cos_f32); -+ impl_unary!(f32x8[f32; 8]: cos_f32); -+ impl_unary!(f32x16[f32; 16]: cos_f32); -+ -+ impl_unary!(f64x2[f64; 2]: cos_f64); -+ impl_unary!(f64x4[f64; 4]: cos_f64); -+ impl_unary!(f64x8[f64; 8]: cos_f64); -+ } else if #[cfg(all(target_arch = "x86_64", feature = "sleef-sys"))] { -+ use sleef_sys::*; -+ cfg_if! { -+ if #[cfg(target_feature = "avx2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_cosf4_u10avx2128); -+ impl_unary!(f32x16[h => f32x8]: Sleef_cosf8_u10avx2); -+ impl_unary!(f64x8[h => f64x4]: Sleef_cosd4_u10avx2); -+ -+ impl_unary!(f32x4: Sleef_cosf4_u10avx2128); -+ impl_unary!(f32x8: Sleef_cosf8_u10avx2); -+ impl_unary!(f64x2: Sleef_cosd2_u10avx2128); -+ impl_unary!(f64x4: Sleef_cosd4_u10avx2); -+ } else if #[cfg(target_feature = "avx")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_cosf4_u10sse4); -+ impl_unary!(f32x16[h => f32x8]: Sleef_cosf8_u10avx); -+ impl_unary!(f64x8[h => f64x4]: Sleef_cosd4_u10avx); -+ -+ impl_unary!(f32x4: Sleef_cosf4_u10sse4); -+ impl_unary!(f32x8: Sleef_cosf8_u10avx); -+ impl_unary!(f64x2: Sleef_cosd2_u10sse4); -+ impl_unary!(f64x4: Sleef_cosd4_u10avx); -+ } else if #[cfg(target_feature = "sse4.2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_cosf4_u10sse4); -+ impl_unary!(f32x16[q => f32x4]: Sleef_cosf4_u10sse4); -+ impl_unary!(f64x8[q => f64x2]: Sleef_cosd2_u10sse4); -+ -+ impl_unary!(f32x4: Sleef_cosf4_u10sse4); -+ impl_unary!(f32x8[h => f32x4]: Sleef_cosf4_u10sse4); -+ impl_unary!(f64x2: Sleef_cosd2_u10sse4); -+ impl_unary!(f64x4[h => f64x2]: Sleef_cosd2_u10sse4); -+ } else { -+ impl_unary!(f32x2[f32; 2]: cos_f32); -+ impl_unary!(f32x16: cos_v16f32); -+ impl_unary!(f64x8: cos_v8f64); -+ -+ impl_unary!(f32x4: cos_v4f32); -+ impl_unary!(f32x8: cos_v8f32); -+ impl_unary!(f64x2: cos_v2f64); -+ impl_unary!(f64x4: cos_v4f64); -+ } -+ } -+ } else { -+ impl_unary!(f32x2[f32; 2]: cos_f32); -+ impl_unary!(f32x4: cos_v4f32); -+ impl_unary!(f32x8: cos_v8f32); -+ impl_unary!(f32x16: cos_v16f32); -+ -+ impl_unary!(f64x2: cos_v2f64); -+ impl_unary!(f64x4: cos_v4f64); -+ impl_unary!(f64x8: cos_v8f64); -+ } -+} -diff --git a/third_party/rust/packed_simd/src/codegen/math/float/cos_pi.rs b/third_party/rust/packed_simd/src/codegen/math/float/cos_pi.rs -new file mode 100644 -index 000000000000..ebff5fd1c751 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/math/float/cos_pi.rs -@@ -0,0 +1,87 @@ -+//! Vertical floating-point `cos` -+#![allow(unused)] -+ -+// FIXME 64-bit 1 elem vectors cos_pi -+ -+use crate::*; -+ -+crate trait CosPi { -+ fn cos_pi(self) -> Self; -+} -+ -+gen_unary_impl_table!(CosPi, cos_pi); -+ -+macro_rules! impl_def { -+ ($vid:ident, $PI:path) => { -+ impl CosPi for $vid { -+ #[inline] -+ fn cos_pi(self) -> Self { -+ (self * Self::splat($PI)).cos() -+ } -+ } -+ }; -+} -+macro_rules! impl_def32 { -+ ($vid:ident) => { -+ impl_def!($vid, crate::f32::consts::PI); -+ }; -+} -+macro_rules! impl_def64 { -+ ($vid:ident) => { -+ impl_def!($vid, crate::f64::consts::PI); -+ }; -+} -+ -+cfg_if! { -+ if #[cfg(all(target_arch = "x86_64", feature = "sleef-sys"))] { -+ use sleef_sys::*; -+ cfg_if! { -+ if #[cfg(target_feature = "avx2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_cospif4_u05avx2128); -+ impl_unary!(f32x16[h => f32x8]: Sleef_cospif8_u05avx2); -+ impl_unary!(f64x8[h => f64x4]: Sleef_cospid4_u05avx2); -+ -+ impl_unary!(f32x4: Sleef_cospif4_u05avx2128); -+ impl_unary!(f32x8: Sleef_cospif8_u05avx2); -+ impl_unary!(f64x2: Sleef_cospid2_u05avx2128); -+ impl_unary!(f64x4: Sleef_cospid4_u05avx2); -+ } else if #[cfg(target_feature = "avx")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_cospif4_u05sse4); -+ impl_unary!(f32x16[h => f32x8]: Sleef_cospif8_u05avx); -+ impl_unary!(f64x8[h => f64x4]: Sleef_cospid4_u05avx); -+ -+ impl_unary!(f32x4: Sleef_cospif4_u05sse4); -+ impl_unary!(f32x8: Sleef_cospif8_u05avx); -+ impl_unary!(f64x2: Sleef_cospid2_u05sse4); -+ impl_unary!(f64x4: Sleef_cospid4_u05avx); -+ } else if #[cfg(target_feature = "sse4.2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_cospif4_u05sse4); -+ impl_unary!(f32x16[q => f32x4]: Sleef_cospif4_u05sse4); -+ impl_unary!(f64x8[q => f64x2]: Sleef_cospid2_u05sse4); -+ -+ impl_unary!(f32x4: Sleef_cospif4_u05sse4); -+ impl_unary!(f32x8[h => f32x4]: Sleef_cospif4_u05sse4); -+ impl_unary!(f64x2: Sleef_cospid2_u05sse4); -+ impl_unary!(f64x4[h => f64x2]: Sleef_cospid2_u05sse4); -+ } else { -+ impl_def32!(f32x2); -+ impl_def32!(f32x4); -+ impl_def32!(f32x8); -+ impl_def32!(f32x16); -+ -+ impl_def64!(f64x2); -+ impl_def64!(f64x4); -+ impl_def64!(f64x8); -+ } -+ } -+ } else { -+ impl_def32!(f32x2); -+ impl_def32!(f32x4); -+ impl_def32!(f32x8); -+ impl_def32!(f32x16); -+ -+ impl_def64!(f64x2); -+ impl_def64!(f64x4); -+ impl_def64!(f64x8); -+ } -+} -diff --git a/third_party/rust/packed_simd/src/codegen/math/float/exp.rs b/third_party/rust/packed_simd/src/codegen/math/float/exp.rs -new file mode 100644 -index 000000000000..00d10e9fa644 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/math/float/exp.rs -@@ -0,0 +1,112 @@ -+//! Vertical floating-point `exp` -+#![allow(unused)] -+ -+// FIXME 64-bit expgle elem vectors misexpg -+ -+use crate::*; -+ -+crate trait Exp { -+ fn exp(self) -> Self; -+} -+ -+#[allow(improper_ctypes)] -+extern "C" { -+ #[link_name = "llvm.exp.v2f32"] -+ fn exp_v2f32(x: f32x2) -> f32x2; -+ #[link_name = "llvm.exp.v4f32"] -+ fn exp_v4f32(x: f32x4) -> f32x4; -+ #[link_name = "llvm.exp.v8f32"] -+ fn exp_v8f32(x: f32x8) -> f32x8; -+ #[link_name = "llvm.exp.v16f32"] -+ fn exp_v16f32(x: f32x16) -> f32x16; -+ /* FIXME 64-bit expgle elem vectors -+ #[link_name = "llvm.exp.v1f64"] -+ fn exp_v1f64(x: f64x1) -> f64x1; -+ */ -+ #[link_name = "llvm.exp.v2f64"] -+ fn exp_v2f64(x: f64x2) -> f64x2; -+ #[link_name = "llvm.exp.v4f64"] -+ fn exp_v4f64(x: f64x4) -> f64x4; -+ #[link_name = "llvm.exp.v8f64"] -+ fn exp_v8f64(x: f64x8) -> f64x8; -+ -+ #[link_name = "llvm.exp.f32"] -+ fn exp_f32(x: f32) -> f32; -+ #[link_name = "llvm.exp.f64"] -+ fn exp_f64(x: f64) -> f64; -+} -+ -+gen_unary_impl_table!(Exp, exp); -+ -+cfg_if! { -+ if #[cfg(target_arch = "s390x")] { -+ // FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/14 -+ impl_unary!(f32x2[f32; 2]: exp_f32); -+ impl_unary!(f32x4[f32; 4]: exp_f32); -+ impl_unary!(f32x8[f32; 8]: exp_f32); -+ impl_unary!(f32x16[f32; 16]: exp_f32); -+ -+ impl_unary!(f64x2[f64; 2]: exp_f64); -+ impl_unary!(f64x4[f64; 4]: exp_f64); -+ impl_unary!(f64x8[f64; 8]: exp_f64); -+ } else if #[cfg(all(target_arch = "x86_64", feature = "sleef-sys"))] { -+ use sleef_sys::*; -+ cfg_if! { -+ if #[cfg(target_feature = "avx2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_expf4_u10avx2128); -+ impl_unary!(f32x16[h => f32x8]: Sleef_expf8_u10avx2); -+ impl_unary!(f64x8[h => f64x4]: Sleef_expd4_u10avx2); -+ -+ impl_unary!(f32x4: Sleef_expf4_u10avx2128); -+ impl_unary!(f32x8: Sleef_expf8_u10avx2); -+ impl_unary!(f64x2: Sleef_expd2_u10avx2128); -+ impl_unary!(f64x4: Sleef_expd4_u10avx2); -+ } else if #[cfg(target_feature = "avx")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_expf4_u10sse4); -+ impl_unary!(f32x16[h => f32x8]: Sleef_expf8_u10avx); -+ impl_unary!(f64x8[h => f64x4]: Sleef_expd4_u10avx); -+ -+ impl_unary!(f32x4: Sleef_expf4_u10sse4); -+ impl_unary!(f32x8: Sleef_expf8_u10avx); -+ impl_unary!(f64x2: Sleef_expd2_u10sse4); -+ impl_unary!(f64x4: Sleef_expd4_u10avx); -+ } else if #[cfg(target_feature = "sse4.2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_expf4_u10sse4); -+ impl_unary!(f32x16[q => f32x4]: Sleef_expf4_u10sse4); -+ impl_unary!(f64x8[q => f64x2]: Sleef_expd2_u10sse4); -+ -+ impl_unary!(f32x4: Sleef_expf4_u10sse4); -+ impl_unary!(f32x8[h => f32x4]: Sleef_expf4_u10sse4); -+ impl_unary!(f64x2: Sleef_expd2_u10sse4); -+ impl_unary!(f64x4[h => f64x2]: Sleef_expd2_u10sse4); -+ } else if #[cfg(target_feature = "sse2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_expf4_u10sse2); -+ impl_unary!(f32x16[q => f32x4]: Sleef_expf4_u10sse2); -+ impl_unary!(f64x8[q => f64x2]: Sleef_expd2_u10sse2); -+ -+ impl_unary!(f32x4: Sleef_expf4_u10sse2); -+ impl_unary!(f32x8[h => f32x4]: Sleef_expf4_u10sse2); -+ impl_unary!(f64x2: Sleef_expd2_u10sse2); -+ impl_unary!(f64x4[h => f64x2]: Sleef_expd2_u10sse2); -+ } else { -+ impl_unary!(f32x2[f32; 2]: exp_f32); -+ impl_unary!(f32x16: exp_v16f32); -+ impl_unary!(f64x8: exp_v8f64); -+ -+ impl_unary!(f32x4: exp_v4f32); -+ impl_unary!(f32x8: exp_v8f32); -+ impl_unary!(f64x2: exp_v2f64); -+ impl_unary!(f64x4: exp_v4f64); -+ } -+ } -+ } else { -+ impl_unary!(f32x2[f32; 2]: exp_f32); -+ impl_unary!(f32x4: exp_v4f32); -+ impl_unary!(f32x8: exp_v8f32); -+ impl_unary!(f32x16: exp_v16f32); -+ -+ impl_unary!(f64x2: exp_v2f64); -+ impl_unary!(f64x4: exp_v4f64); -+ impl_unary!(f64x8: exp_v8f64); -+ } -+} -diff --git a/third_party/rust/packed_simd/src/codegen/math/float/ln.rs b/third_party/rust/packed_simd/src/codegen/math/float/ln.rs -new file mode 100644 -index 000000000000..88a5a6c6c158 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/math/float/ln.rs -@@ -0,0 +1,112 @@ -+//! Vertical floating-point `ln` -+#![allow(unused)] -+ -+// FIXME 64-bit lngle elem vectors mislng -+ -+use crate::*; -+ -+crate trait Ln { -+ fn ln(self) -> Self; -+} -+ -+#[allow(improper_ctypes)] -+extern "C" { -+ #[link_name = "llvm.log.v2f32"] -+ fn ln_v2f32(x: f32x2) -> f32x2; -+ #[link_name = "llvm.log.v4f32"] -+ fn ln_v4f32(x: f32x4) -> f32x4; -+ #[link_name = "llvm.log.v8f32"] -+ fn ln_v8f32(x: f32x8) -> f32x8; -+ #[link_name = "llvm.log.v16f32"] -+ fn ln_v16f32(x: f32x16) -> f32x16; -+ /* FIXME 64-bit lngle elem vectors -+ #[link_name = "llvm.log.v1f64"] -+ fn ln_v1f64(x: f64x1) -> f64x1; -+ */ -+ #[link_name = "llvm.log.v2f64"] -+ fn ln_v2f64(x: f64x2) -> f64x2; -+ #[link_name = "llvm.log.v4f64"] -+ fn ln_v4f64(x: f64x4) -> f64x4; -+ #[link_name = "llvm.log.v8f64"] -+ fn ln_v8f64(x: f64x8) -> f64x8; -+ -+ #[link_name = "llvm.log.f32"] -+ fn ln_f32(x: f32) -> f32; -+ #[link_name = "llvm.log.f64"] -+ fn ln_f64(x: f64) -> f64; -+} -+ -+gen_unary_impl_table!(Ln, ln); -+ -+cfg_if! { -+ if #[cfg(target_arch = "s390x")] { -+ // FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/14 -+ impl_unary!(f32x2[f32; 2]: ln_f32); -+ impl_unary!(f32x4[f32; 4]: ln_f32); -+ impl_unary!(f32x8[f32; 8]: ln_f32); -+ impl_unary!(f32x16[f32; 16]: ln_f32); -+ -+ impl_unary!(f64x2[f64; 2]: ln_f64); -+ impl_unary!(f64x4[f64; 4]: ln_f64); -+ impl_unary!(f64x8[f64; 8]: ln_f64); -+ } else if #[cfg(all(target_arch = "x86_64", feature = "sleef-sys"))] { -+ use sleef_sys::*; -+ cfg_if! { -+ if #[cfg(target_feature = "avx2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_logf4_u10avx2128); -+ impl_unary!(f32x16[h => f32x8]: Sleef_logf8_u10avx2); -+ impl_unary!(f64x8[h => f64x4]: Sleef_logd4_u10avx2); -+ -+ impl_unary!(f32x4: Sleef_logf4_u10avx2128); -+ impl_unary!(f32x8: Sleef_logf8_u10avx2); -+ impl_unary!(f64x2: Sleef_logd2_u10avx2128); -+ impl_unary!(f64x4: Sleef_logd4_u10avx2); -+ } else if #[cfg(target_feature = "avx")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_logf4_u10sse4); -+ impl_unary!(f32x16[h => f32x8]: Sleef_logf8_u10avx); -+ impl_unary!(f64x8[h => f64x4]: Sleef_logd4_u10avx); -+ -+ impl_unary!(f32x4: Sleef_logf4_u10sse4); -+ impl_unary!(f32x8: Sleef_logf8_u10avx); -+ impl_unary!(f64x2: Sleef_logd2_u10sse4); -+ impl_unary!(f64x4: Sleef_logd4_u10avx); -+ } else if #[cfg(target_feature = "sse4.2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_logf4_u10sse4); -+ impl_unary!(f32x16[q => f32x4]: Sleef_logf4_u10sse4); -+ impl_unary!(f64x8[q => f64x2]: Sleef_logd2_u10sse4); -+ -+ impl_unary!(f32x4: Sleef_logf4_u10sse4); -+ impl_unary!(f32x8[h => f32x4]: Sleef_logf4_u10sse4); -+ impl_unary!(f64x2: Sleef_logd2_u10sse4); -+ impl_unary!(f64x4[h => f64x2]: Sleef_logd2_u10sse4); -+ } else if #[cfg(target_feature = "sse2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_logf4_u10sse2); -+ impl_unary!(f32x16[q => f32x4]: Sleef_logf4_u10sse2); -+ impl_unary!(f64x8[q => f64x2]: Sleef_logd2_u10sse2); -+ -+ impl_unary!(f32x4: Sleef_logf4_u10sse2); -+ impl_unary!(f32x8[h => f32x4]: Sleef_logf4_u10sse2); -+ impl_unary!(f64x2: Sleef_logd2_u10sse2); -+ impl_unary!(f64x4[h => f64x2]: Sleef_logd2_u10sse2); -+ } else { -+ impl_unary!(f32x2[f32; 2]: ln_f32); -+ impl_unary!(f32x16: ln_v16f32); -+ impl_unary!(f64x8: ln_v8f64); -+ -+ impl_unary!(f32x4: ln_v4f32); -+ impl_unary!(f32x8: ln_v8f32); -+ impl_unary!(f64x2: ln_v2f64); -+ impl_unary!(f64x4: ln_v4f64); -+ } -+ } -+ } else { -+ impl_unary!(f32x2[f32; 2]: ln_f32); -+ impl_unary!(f32x4: ln_v4f32); -+ impl_unary!(f32x8: ln_v8f32); -+ impl_unary!(f32x16: ln_v16f32); -+ -+ impl_unary!(f64x2: ln_v2f64); -+ impl_unary!(f64x4: ln_v4f64); -+ impl_unary!(f64x8: ln_v8f64); -+ } -+} -diff --git a/third_party/rust/packed_simd/src/codegen/math/float/macros.rs b/third_party/rust/packed_simd/src/codegen/math/float/macros.rs -new file mode 100644 -index 000000000000..02d0ca3f5c7a ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/math/float/macros.rs -@@ -0,0 +1,559 @@ -+//! Utility macros -+#![allow(unused)] -+ -+ -+macro_rules! impl_unary_ { -+ // implementation mapping 1:1 -+ (vec | $trait_id:ident, $trait_method:ident, $vec_id:ident, -+ $fun:ident) => { -+ impl $trait_id for $vec_id { -+ #[inline] -+ fn $trait_method(self) -> Self { -+ unsafe { -+ use crate::mem::transmute; -+ transmute($fun(transmute(self))) -+ } -+ } -+ } -+ }; -+ // implementation mapping 1:1 for when `$fun` is a generic function -+ // like some of the fp math rustc intrinsics (e.g. `fn fun(x: T) -> T`). -+ (gen | $trait_id:ident, $trait_method:ident, $vec_id:ident, -+ $fun:ident) => { -+ impl $trait_id for $vec_id { -+ #[inline] -+ fn $trait_method(self) -> Self { -+ unsafe { -+ use crate::mem::transmute; -+ transmute($fun(self.0)) -+ } -+ } -+ } -+ }; -+ (scalar | $trait_id:ident, $trait_method:ident, -+ $vec_id:ident, [$sid:ident; $scount:expr], $fun:ident) => { -+ impl $trait_id for $vec_id { -+ #[inline] -+ fn $trait_method(self) -> Self { -+ unsafe { -+ union U { -+ vec: $vec_id, -+ scalars: [$sid; $scount], -+ } -+ let mut scalars = U { vec: self }.scalars; -+ for i in &mut scalars { -+ *i = $fun(*i); -+ } -+ U { scalars }.vec -+ } -+ } -+ } -+ }; -+ // implementation calling fun twice on each of the vector halves: -+ (halves | $trait_id:ident, $trait_method:ident, $vec_id:ident, -+ $vech_id:ident, $fun:ident) => { -+ impl $trait_id for $vec_id { -+ #[inline] -+ fn $trait_method(self) -> Self { -+ unsafe { -+ use crate::mem::transmute; -+ union U { -+ vec: $vec_id, -+ halves: [$vech_id; 2], -+ } -+ -+ let mut halves = U { vec: self }.halves; -+ -+ *halves.get_unchecked_mut(0) = -+ transmute($fun(transmute(*halves.get_unchecked(0)))); -+ *halves.get_unchecked_mut(1) = -+ transmute($fun(transmute(*halves.get_unchecked(1)))); -+ -+ U { halves }.vec -+ } -+ } -+ } -+ }; -+ // implementation calling fun four times on each of the vector quarters: -+ (quarter | $trait_id:ident, $trait_method:ident, $vec_id:ident, -+ $vecq_id:ident, $fun:ident) => { -+ impl $trait_id for $vec_id { -+ #[inline] -+ fn $trait_method(self) -> Self { -+ unsafe { -+ use crate::mem::transmute; -+ union U { -+ vec: $vec_id, -+ quarters: [$vecq_id; 4], -+ } -+ -+ let mut quarters = U { vec: self }.quarters; -+ -+ *quarters.get_unchecked_mut(0) = -+ transmute($fun(transmute(*quarters.get_unchecked(0)))); -+ *quarters.get_unchecked_mut(1) = -+ transmute($fun(transmute(*quarters.get_unchecked(1)))); -+ *quarters.get_unchecked_mut(2) = -+ transmute($fun(transmute(*quarters.get_unchecked(2)))); -+ *quarters.get_unchecked_mut(3) = -+ transmute($fun(transmute(*quarters.get_unchecked(3)))); -+ -+ U { quarters }.vec -+ } -+ } -+ } -+ }; -+ // implementation calling fun once on a vector twice as large: -+ (twice | $trait_id:ident, $trait_method:ident, $vec_id:ident, -+ $vect_id:ident, $fun:ident) => { -+ impl $trait_id for $vec_id { -+ #[inline] -+ fn $trait_method(self) -> Self { -+ unsafe { -+ use crate::mem::{transmute, uninitialized}; -+ -+ union U { -+ vec: [$vec_id; 2], -+ twice: $vect_id, -+ } -+ -+ let twice = U { vec: [self, uninitialized()] }.twice; -+ let twice = transmute($fun(transmute(twice))); -+ -+ *(U { twice }.vec.get_unchecked(0)) -+ } -+ } -+ } -+ }; -+} -+ -+macro_rules! gen_unary_impl_table { -+ ($trait_id:ident, $trait_method:ident) => { -+ macro_rules! impl_unary { -+ ($vid:ident: $fun:ident) => { -+ impl_unary_!(vec | $trait_id, $trait_method, $vid, $fun); -+ }; -+ ($vid:ident[g]: $fun:ident) => { -+ impl_unary_!(gen | $trait_id, $trait_method, $vid, $fun); -+ }; -+ ($vid:ident[$sid:ident; $sc:expr]: $fun:ident) => { -+ impl_unary_!( -+ scalar | $trait_id, -+ $trait_method, -+ $vid, -+ [$sid; $sc], -+ $fun -+ ); -+ }; -+ ($vid:ident[s]: $fun:ident) => { -+ impl_unary_!(scalar | $trait_id, $trait_method, $vid, $fun); -+ }; -+ ($vid:ident[h => $vid_h:ident]: $fun:ident) => { -+ impl_unary_!( -+ halves | $trait_id, -+ $trait_method, -+ $vid, -+ $vid_h, -+ $fun -+ ); -+ }; -+ ($vid:ident[q => $vid_q:ident]: $fun:ident) => { -+ impl_unary_!( -+ quarter | $trait_id, -+ $trait_method, -+ $vid, -+ $vid_q, -+ $fun -+ ); -+ }; -+ ($vid:ident[t => $vid_t:ident]: $fun:ident) => { -+ impl_unary_!( -+ twice | $trait_id, -+ $trait_method, -+ $vid, -+ $vid_t, -+ $fun -+ ); -+ }; -+ } -+ }; -+} -+ -+macro_rules! impl_tertiary_ { -+ // implementation mapping 1:1 -+ (vec | $trait_id:ident, $trait_method:ident, $vec_id:ident, -+ $fun:ident) => { -+ impl $trait_id for $vec_id { -+ #[inline] -+ fn $trait_method(self, y: Self, z: Self) -> Self { -+ unsafe { -+ use crate::mem::transmute; -+ transmute($fun( -+ transmute(self), -+ transmute(y), -+ transmute(z), -+ )) -+ } -+ } -+ } -+ }; -+ (scalar | $trait_id:ident, $trait_method:ident, -+ $vec_id:ident, [$sid:ident; $scount:expr], $fun:ident) => { -+ impl $trait_id for $vec_id { -+ #[inline] -+ fn $trait_method(self, y: Self, z: Self) -> Self { -+ unsafe { -+ union U { -+ vec: $vec_id, -+ scalars: [$sid; $scount], -+ } -+ let mut x = U { vec: self }.scalars; -+ let y = U { vec: y }.scalars; -+ let z = U { vec: z }.scalars; -+ for (x, (y, z)) in (&mut scalars).zip(&y).zip(&z) { -+ *i = $fun(*i, *y, *z); -+ } -+ U { vec: x }.vec -+ } -+ } -+ } -+ }; -+ // implementation calling fun twice on each of the vector halves: -+ (halves | $trait_id:ident, $trait_method:ident, $vec_id:ident, -+ $vech_id:ident, $fun:ident) => { -+ impl $trait_id for $vec_id { -+ #[inline] -+ fn $trait_method(self, y: Self, z: Self) -> Self { -+ unsafe { -+ use crate::mem::transmute; -+ union U { -+ vec: $vec_id, -+ halves: [$vech_id; 2], -+ } -+ -+ let mut x_halves = U { vec: self }.halves; -+ let y_halves = U { vec: y }.halves; -+ let z_halves = U { vec: z }.halves; -+ -+ *x_halves.get_unchecked_mut(0) = transmute($fun( -+ transmute(*x_halves.get_unchecked(0)), -+ transmute(*y_halves.get_unchecked(0)), -+ transmute(*z_halves.get_unchecked(0)), -+ )); -+ *x_halves.get_unchecked_mut(1) = transmute($fun( -+ transmute(*x_halves.get_unchecked(1)), -+ transmute(*y_halves.get_unchecked(1)), -+ transmute(*z_halves.get_unchecked(1)), -+ )); -+ -+ U { halves: x_halves }.vec -+ } -+ } -+ } -+ }; -+ // implementation calling fun four times on each of the vector quarters: -+ (quarter | $trait_id:ident, $trait_method:ident, $vec_id:ident, -+ $vecq_id:ident, $fun:ident) => { -+ impl $trait_id for $vec_id { -+ #[inline] -+ fn $trait_method(self, y: Self, z: Self) -> Self { -+ unsafe { -+ use crate::mem::transmute; -+ union U { -+ vec: $vec_id, -+ quarters: [$vecq_id; 4], -+ } -+ -+ let mut x_quarters = U { vec: self }.quarters; -+ let y_quarters = U { vec: y }.quarters; -+ let z_quarters = U { vec: z }.quarters; -+ -+ *x_quarters.get_unchecked_mut(0) = transmute($fun( -+ transmute(*x_quarters.get_unchecked(0)), -+ transmute(*y_quarters.get_unchecked(0)), -+ transmute(*z_quarters.get_unchecked(0)), -+ )); -+ -+ *x_quarters.get_unchecked_mut(1) = transmute($fun( -+ transmute(*x_quarters.get_unchecked(1)), -+ transmute(*y_quarters.get_unchecked(1)), -+ transmute(*z_quarters.get_unchecked(1)), -+ )); -+ -+ *x_quarters.get_unchecked_mut(2) = transmute($fun( -+ transmute(*x_quarters.get_unchecked(2)), -+ transmute(*y_quarters.get_unchecked(2)), -+ transmute(*z_quarters.get_unchecked(2)), -+ )); -+ -+ *x_quarters.get_unchecked_mut(3) = transmute($fun( -+ transmute(*x_quarters.get_unchecked(3)), -+ transmute(*y_quarters.get_unchecked(3)), -+ transmute(*z_quarters.get_unchecked(3)), -+ )); -+ -+ U { quarters: x_quarters }.vec -+ } -+ } -+ } -+ }; -+ // implementation calling fun once on a vector twice as large: -+ (twice | $trait_id:ident, $trait_method:ident, $vec_id:ident, -+ $vect_id:ident, $fun:ident) => { -+ impl $trait_id for $vec_id { -+ #[inline] -+ fn $trait_method(self, y: Self, z: Self) -> Self { -+ unsafe { -+ use crate::mem::{transmute, uninitialized}; -+ -+ union U { -+ vec: [$vec_id; 2], -+ twice: $vect_id, -+ } -+ -+ let x_twice = U { vec: [self, uninitialized()] }.twice; -+ let y_twice = U { vec: [y, uninitialized()] }.twice; -+ let z_twice = U { vec: [z, uninitialized()] }.twice; -+ let twice: $vect_id = transmute($fun( -+ transmute(x_twice), -+ transmute(y_twice), -+ transmute(z_twice), -+ )); -+ -+ *(U { twice }.vec.get_unchecked(0)) -+ } -+ } -+ } -+ }; -+} -+ -+macro_rules! gen_tertiary_impl_table { -+ ($trait_id:ident, $trait_method:ident) => { -+ macro_rules! impl_tertiary { -+ ($vid:ident: $fun:ident) => { -+ impl_tertiary_!(vec | $trait_id, $trait_method, $vid, $fun); -+ }; -+ ($vid:ident[$sid:ident; $sc:expr]: $fun:ident) => { -+ impl_tertiary_!( -+ scalar | $trait_id, -+ $trait_method, -+ $vid, -+ [$sid; $sc], -+ $fun -+ ); -+ }; -+ ($vid:ident[s]: $fun:ident) => { -+ impl_tertiary_!(scalar | $trait_id, $trait_method, $vid, $fun); -+ }; -+ ($vid:ident[h => $vid_h:ident]: $fun:ident) => { -+ impl_tertiary_!( -+ halves | $trait_id, -+ $trait_method, -+ $vid, -+ $vid_h, -+ $fun -+ ); -+ }; -+ ($vid:ident[q => $vid_q:ident]: $fun:ident) => { -+ impl_tertiary_!( -+ quarter | $trait_id, -+ $trait_method, -+ $vid, -+ $vid_q, -+ $fun -+ ); -+ }; -+ ($vid:ident[t => $vid_t:ident]: $fun:ident) => { -+ impl_tertiary_!( -+ twice | $trait_id, -+ $trait_method, -+ $vid, -+ $vid_t, -+ $fun -+ ); -+ }; -+ } -+ }; -+} -+ -+macro_rules! impl_binary_ { -+ // implementation mapping 1:1 -+ (vec | $trait_id:ident, $trait_method:ident, $vec_id:ident, -+ $fun:ident) => { -+ impl $trait_id for $vec_id { -+ #[inline] -+ fn $trait_method(self, y: Self) -> Self { -+ unsafe { -+ use crate::mem::transmute; -+ transmute($fun(transmute(self), transmute(y))) -+ } -+ } -+ } -+ }; -+ (scalar | $trait_id:ident, $trait_method:ident, -+ $vec_id:ident, [$sid:ident; $scount:expr], $fun:ident) => { -+ impl $trait_id for $vec_id { -+ #[inline] -+ fn $trait_method(self, y: Self) -> Self { -+ unsafe { -+ union U { -+ vec: $vec_id, -+ scalars: [$sid; $scount], -+ } -+ let mut x = U { vec: self }.scalars; -+ let y = U { vec: y }.scalars; -+ for (x, y) in x.iter_mut().zip(&y) { -+ *x = $fun(*x, *y); -+ } -+ U { scalars: x }.vec -+ } -+ } -+ } -+ }; -+ // implementation calling fun twice on each of the vector halves: -+ (halves | $trait_id:ident, $trait_method:ident, $vec_id:ident, -+ $vech_id:ident, $fun:ident) => { -+ impl $trait_id for $vec_id { -+ #[inline] -+ fn $trait_method(self, y: Self) -> Self { -+ unsafe { -+ use crate::mem::transmute; -+ union U { -+ vec: $vec_id, -+ halves: [$vech_id; 2], -+ } -+ -+ let mut x_halves = U { vec: self }.halves; -+ let y_halves = U { vec: y }.halves; -+ -+ *x_halves.get_unchecked_mut(0) = transmute($fun( -+ transmute(*x_halves.get_unchecked(0)), -+ transmute(*y_halves.get_unchecked(0)), -+ )); -+ *x_halves.get_unchecked_mut(1) = transmute($fun( -+ transmute(*x_halves.get_unchecked(1)), -+ transmute(*y_halves.get_unchecked(1)), -+ )); -+ -+ U { halves: x_halves }.vec -+ } -+ } -+ } -+ }; -+ // implementation calling fun four times on each of the vector quarters: -+ (quarter | $trait_id:ident, $trait_method:ident, $vec_id:ident, -+ $vecq_id:ident, $fun:ident) => { -+ impl $trait_id for $vec_id { -+ #[inline] -+ fn $trait_method(self, y: Self) -> Self { -+ unsafe { -+ use crate::mem::transmute; -+ union U { -+ vec: $vec_id, -+ quarters: [$vecq_id; 4], -+ } -+ -+ let mut x_quarters = U { vec: self }.quarters; -+ let y_quarters = U { vec: y }.quarters; -+ -+ *x_quarters.get_unchecked_mut(0) = transmute($fun( -+ transmute(*x_quarters.get_unchecked(0)), -+ transmute(*y_quarters.get_unchecked(0)), -+ )); -+ -+ *x_quarters.get_unchecked_mut(1) = transmute($fun( -+ transmute(*x_quarters.get_unchecked(1)), -+ transmute(*y_quarters.get_unchecked(1)), -+ )); -+ -+ *x_quarters.get_unchecked_mut(2) = transmute($fun( -+ transmute(*x_quarters.get_unchecked(2)), -+ transmute(*y_quarters.get_unchecked(2)), -+ )); -+ -+ *x_quarters.get_unchecked_mut(3) = transmute($fun( -+ transmute(*x_quarters.get_unchecked(3)), -+ transmute(*y_quarters.get_unchecked(3)), -+ )); -+ -+ U { quarters: x_quarters }.vec -+ } -+ } -+ } -+ }; -+ // implementation calling fun once on a vector twice as large: -+ (twice | $trait_id:ident, $trait_method:ident, $vec_id:ident, -+ $vect_id:ident, $fun:ident) => { -+ impl $trait_id for $vec_id { -+ #[inline] -+ fn $trait_method(self, y: Self) -> Self { -+ unsafe { -+ use crate::mem::{transmute, uninitialized}; -+ -+ union U { -+ vec: [$vec_id; 2], -+ twice: $vect_id, -+ } -+ -+ let x_twice = U { vec: [self, uninitialized()] }.twice; -+ let y_twice = U { vec: [y, uninitialized()] }.twice; -+ let twice: $vect_id = transmute($fun( -+ transmute(x_twice), -+ transmute(y_twice), -+ )); -+ -+ *(U { twice }.vec.get_unchecked(0)) -+ } -+ } -+ } -+ }; -+} -+ -+macro_rules! gen_binary_impl_table { -+ ($trait_id:ident, $trait_method:ident) => { -+ macro_rules! impl_binary { -+ ($vid:ident: $fun:ident) => { -+ impl_binary_!(vec | $trait_id, $trait_method, $vid, $fun); -+ }; -+ ($vid:ident[$sid:ident; $sc:expr]: $fun:ident) => { -+ impl_binary_!( -+ scalar | $trait_id, -+ $trait_method, -+ $vid, -+ [$sid; $sc], -+ $fun -+ ); -+ }; -+ ($vid:ident[s]: $fun:ident) => { -+ impl_binary_!(scalar | $trait_id, $trait_method, $vid, $fun); -+ }; -+ ($vid:ident[h => $vid_h:ident]: $fun:ident) => { -+ impl_binary_!( -+ halves | $trait_id, -+ $trait_method, -+ $vid, -+ $vid_h, -+ $fun -+ ); -+ }; -+ ($vid:ident[q => $vid_q:ident]: $fun:ident) => { -+ impl_binary_!( -+ quarter | $trait_id, -+ $trait_method, -+ $vid, -+ $vid_q, -+ $fun -+ ); -+ }; -+ ($vid:ident[t => $vid_t:ident]: $fun:ident) => { -+ impl_binary_!( -+ twice | $trait_id, -+ $trait_method, -+ $vid, -+ $vid_t, -+ $fun -+ ); -+ }; -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/codegen/math/float/mul_add.rs b/third_party/rust/packed_simd/src/codegen/math/float/mul_add.rs -new file mode 100644 -index 000000000000..f48a57dc46c6 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/math/float/mul_add.rs -@@ -0,0 +1,109 @@ -+//! Vertical floating-point `mul_add` -+#![allow(unused)] -+use crate::*; -+ -+// FIXME: 64-bit 1 element mul_add -+ -+crate trait MulAdd { -+ fn mul_add(self, y: Self, z: Self) -> Self; -+} -+ -+#[cfg(not(target_arch = "s390x"))] -+#[allow(improper_ctypes)] -+extern "C" { -+ #[link_name = "llvm.fma.v2f32"] -+ fn fma_v2f32(x: f32x2, y: f32x2, z: f32x2) -> f32x2; -+ #[link_name = "llvm.fma.v4f32"] -+ fn fma_v4f32(x: f32x4, y: f32x4, z: f32x4) -> f32x4; -+ #[link_name = "llvm.fma.v8f32"] -+ fn fma_v8f32(x: f32x8, y: f32x8, z: f32x8) -> f32x8; -+ #[link_name = "llvm.fma.v16f32"] -+ fn fma_v16f32(x: f32x16, y: f32x16, z: f32x16) -> f32x16; -+ /* FIXME 64-bit single elem vectors -+ #[link_name = "llvm.fma.v1f64"] -+ fn fma_v1f64(x: f64x1, y: f64x1, z: f64x1) -> f64x1; -+ */ -+ #[link_name = "llvm.fma.v2f64"] -+ fn fma_v2f64(x: f64x2, y: f64x2, z: f64x2) -> f64x2; -+ #[link_name = "llvm.fma.v4f64"] -+ fn fma_v4f64(x: f64x4, y: f64x4, z: f64x4) -> f64x4; -+ #[link_name = "llvm.fma.v8f64"] -+ fn fma_v8f64(x: f64x8, y: f64x8, z: f64x8) -> f64x8; -+} -+ -+gen_tertiary_impl_table!(MulAdd, mul_add); -+ -+cfg_if! { -+ if #[cfg(target_arch = "s390x")] { -+ // FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/14 -+ macro_rules! impl_broken { -+ ($id:ident) => { -+ impl MulAdd for $id { -+ #[inline] -+ fn mul_add(self, y: Self, z: Self) -> Self { -+ self * y + z -+ } -+ } -+ }; -+ } -+ -+ impl_broken!(f32x2); -+ impl_broken!(f32x4); -+ impl_broken!(f32x8); -+ impl_broken!(f32x16); -+ -+ impl_broken!(f64x2); -+ impl_broken!(f64x4); -+ impl_broken!(f64x8); -+ } else if #[cfg(all(target_arch = "x86_64", feature = "sleef-sys"))] { -+ use sleef_sys::*; -+ cfg_if! { -+ if #[cfg(target_feature = "avx2")] { -+ impl_tertiary!(f32x2[t => f32x4]: Sleef_fmaf4_avx2128); -+ impl_tertiary!(f32x16[h => f32x8]: Sleef_fmaf8_avx2); -+ impl_tertiary!(f64x8[h => f64x4]: Sleef_fmad4_avx2); -+ -+ impl_tertiary!(f32x4: Sleef_fmaf4_avx2128); -+ impl_tertiary!(f32x8: Sleef_fmaf8_avx2); -+ impl_tertiary!(f64x2: Sleef_fmad2_avx2128); -+ impl_tertiary!(f64x4: Sleef_fmad4_avx2); -+ } else if #[cfg(target_feature = "avx")] { -+ impl_tertiary!(f32x2[t => f32x4]: Sleef_fmaf4_sse4); -+ impl_tertiary!(f32x16[h => f32x8]: Sleef_fmaf8_avx); -+ impl_tertiary!(f64x8[h => f64x4]: Sleef_fmad4_avx); -+ -+ impl_tertiary!(f32x4: Sleef_fmaf4_sse4); -+ impl_tertiary!(f32x8: Sleef_fmaf8_avx); -+ impl_tertiary!(f64x2: Sleef_fmad2_sse4); -+ impl_tertiary!(f64x4: Sleef_fmad4_avx); -+ } else if #[cfg(target_feature = "sse4.2")] { -+ impl_tertiary!(f32x2[t => f32x4]: Sleef_fmaf4_sse4); -+ impl_tertiary!(f32x16[q => f32x4]: Sleef_fmaf4_sse4); -+ impl_tertiary!(f64x8[q => f64x2]: Sleef_fmad2_sse4); -+ -+ impl_tertiary!(f32x4: Sleef_fmaf4_sse4); -+ impl_tertiary!(f32x8[h => f32x4]: Sleef_fmaf4_sse4); -+ impl_tertiary!(f64x2: Sleef_fmad2_sse4); -+ impl_tertiary!(f64x4[h => f64x2]: Sleef_fmad2_sse4); -+ } else { -+ impl_tertiary!(f32x2: fma_v2f32); -+ impl_tertiary!(f32x16: fma_v16f32); -+ impl_tertiary!(f64x8: fma_v8f64); -+ -+ impl_tertiary!(f32x4: fma_v4f32); -+ impl_tertiary!(f32x8: fma_v8f32); -+ impl_tertiary!(f64x2: fma_v2f64); -+ impl_tertiary!(f64x4: fma_v4f64); -+ } -+ } -+ } else { -+ impl_tertiary!(f32x2: fma_v2f32); -+ impl_tertiary!(f32x4: fma_v4f32); -+ impl_tertiary!(f32x8: fma_v8f32); -+ impl_tertiary!(f32x16: fma_v16f32); -+ // impl_tertiary!(f64x1: fma_v1f64); // FIXME 64-bit fmagle elem vectors -+ impl_tertiary!(f64x2: fma_v2f64); -+ impl_tertiary!(f64x4: fma_v4f64); -+ impl_tertiary!(f64x8: fma_v8f64); -+ } -+} -diff --git a/third_party/rust/packed_simd/src/codegen/math/float/mul_adde.rs b/third_party/rust/packed_simd/src/codegen/math/float/mul_adde.rs -new file mode 100644 -index 000000000000..8c41fb131d94 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/math/float/mul_adde.rs -@@ -0,0 +1,66 @@ -+//! Approximation for floating-point `mul_add` -+use crate::*; -+ -+// FIXME: 64-bit 1 element mul_adde -+ -+crate trait MulAddE { -+ fn mul_adde(self, y: Self, z: Self) -> Self; -+} -+ -+#[cfg(not(target_arch = "s390x"))] -+#[allow(improper_ctypes)] -+extern "C" { -+ #[link_name = "llvm.fmuladd.v2f32"] -+ fn fmuladd_v2f32(x: f32x2, y: f32x2, z: f32x2) -> f32x2; -+ #[link_name = "llvm.fmuladd.v4f32"] -+ fn fmuladd_v4f32(x: f32x4, y: f32x4, z: f32x4) -> f32x4; -+ #[link_name = "llvm.fmuladd.v8f32"] -+ fn fmuladd_v8f32(x: f32x8, y: f32x8, z: f32x8) -> f32x8; -+ #[link_name = "llvm.fmuladd.v16f32"] -+ fn fmuladd_v16f32(x: f32x16, y: f32x16, z: f32x16) -> f32x16; -+ /* FIXME 64-bit single elem vectors -+ #[link_name = "llvm.fmuladd.v1f64"] -+ fn fmuladd_v1f64(x: f64x1, y: f64x1, z: f64x1) -> f64x1; -+ */ -+ #[link_name = "llvm.fmuladd.v2f64"] -+ fn fmuladd_v2f64(x: f64x2, y: f64x2, z: f64x2) -> f64x2; -+ #[link_name = "llvm.fmuladd.v4f64"] -+ fn fmuladd_v4f64(x: f64x4, y: f64x4, z: f64x4) -> f64x4; -+ #[link_name = "llvm.fmuladd.v8f64"] -+ fn fmuladd_v8f64(x: f64x8, y: f64x8, z: f64x8) -> f64x8; -+} -+ -+macro_rules! impl_mul_adde { -+ ($id:ident : $fn:ident) => { -+ impl MulAddE for $id { -+ #[inline] -+ fn mul_adde(self, y: Self, z: Self) -> Self { -+ #[cfg(not(target_arch = "s390x"))] -+ { -+ use crate::mem::transmute; -+ unsafe { -+ transmute($fn( -+ transmute(self), -+ transmute(y), -+ transmute(z), -+ )) -+ } -+ } -+ #[cfg(target_arch = "s390x")] -+ { -+ // FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/14 -+ self * y + z -+ } -+ } -+ } -+ }; -+} -+ -+impl_mul_adde!(f32x2: fmuladd_v2f32); -+impl_mul_adde!(f32x4: fmuladd_v4f32); -+impl_mul_adde!(f32x8: fmuladd_v8f32); -+impl_mul_adde!(f32x16: fmuladd_v16f32); -+// impl_mul_adde!(f64x1: fma_v1f64); // FIXME 64-bit fmagle elem vectors -+impl_mul_adde!(f64x2: fmuladd_v2f64); -+impl_mul_adde!(f64x4: fmuladd_v4f64); -+impl_mul_adde!(f64x8: fmuladd_v8f64); -diff --git a/third_party/rust/packed_simd/src/codegen/math/float/powf.rs b/third_party/rust/packed_simd/src/codegen/math/float/powf.rs -new file mode 100644 -index 000000000000..bc15067d73a3 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/math/float/powf.rs -@@ -0,0 +1,112 @@ -+//! Vertical floating-point `powf` -+#![allow(unused)] -+ -+// FIXME 64-bit powfgle elem vectors mispowfg -+ -+use crate::*; -+ -+crate trait Powf { -+ fn powf(self, x: Self) -> Self; -+} -+ -+#[allow(improper_ctypes)] -+extern "C" { -+ #[link_name = "llvm.pow.v2f32"] -+ fn powf_v2f32(x: f32x2, y: f32x2) -> f32x2; -+ #[link_name = "llvm.pow.v4f32"] -+ fn powf_v4f32(x: f32x4, y: f32x4) -> f32x4; -+ #[link_name = "llvm.pow.v8f32"] -+ fn powf_v8f32(x: f32x8, y: f32x8) -> f32x8; -+ #[link_name = "llvm.pow.v16f32"] -+ fn powf_v16f32(x: f32x16, y: f32x16) -> f32x16; -+ /* FIXME 64-bit powfgle elem vectors -+ #[link_name = "llvm.pow.v1f64"] -+ fn powf_v1f64(x: f64x1, y: f64x1) -> f64x1; -+ */ -+ #[link_name = "llvm.pow.v2f64"] -+ fn powf_v2f64(x: f64x2, y: f64x2) -> f64x2; -+ #[link_name = "llvm.pow.v4f64"] -+ fn powf_v4f64(x: f64x4, y: f64x4) -> f64x4; -+ #[link_name = "llvm.pow.v8f64"] -+ fn powf_v8f64(x: f64x8, y: f64x8) -> f64x8; -+ -+ #[link_name = "llvm.pow.f32"] -+ fn powf_f32(x: f32, y: f32) -> f32; -+ #[link_name = "llvm.pow.f64"] -+ fn powf_f64(x: f64, y: f64) -> f64; -+} -+ -+gen_binary_impl_table!(Powf, powf); -+ -+cfg_if! { -+ if #[cfg(target_arch = "s390x")] { -+ // FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/14 -+ impl_binary!(f32x2[f32; 2]: powf_f32); -+ impl_binary!(f32x4[f32; 4]: powf_f32); -+ impl_binary!(f32x8[f32; 8]: powf_f32); -+ impl_binary!(f32x16[f32; 16]: powf_f32); -+ -+ impl_binary!(f64x2[f64; 2]: powf_f64); -+ impl_binary!(f64x4[f64; 4]: powf_f64); -+ impl_binary!(f64x8[f64; 8]: powf_f64); -+ } else if #[cfg(all(target_arch = "x86_64", feature = "sleef-sys"))] { -+ use sleef_sys::*; -+ cfg_if! { -+ if #[cfg(target_feature = "avx2")] { -+ impl_binary!(f32x2[t => f32x4]: Sleef_powf4_u10avx2128); -+ impl_binary!(f32x16[h => f32x8]: Sleef_powf8_u10avx2); -+ impl_binary!(f64x8[h => f64x4]: Sleef_powd4_u10avx2); -+ -+ impl_binary!(f32x4: Sleef_powf4_u10avx2128); -+ impl_binary!(f32x8: Sleef_powf8_u10avx2); -+ impl_binary!(f64x2: Sleef_powd2_u10avx2128); -+ impl_binary!(f64x4: Sleef_powd4_u10avx2); -+ } else if #[cfg(target_feature = "avx")] { -+ impl_binary!(f32x2[t => f32x4]: Sleef_powf4_u10sse4); -+ impl_binary!(f32x16[h => f32x8]: Sleef_powf8_u10avx); -+ impl_binary!(f64x8[h => f64x4]: Sleef_powd4_u10avx); -+ -+ impl_binary!(f32x4: Sleef_powf4_u10sse4); -+ impl_binary!(f32x8: Sleef_powf8_u10avx); -+ impl_binary!(f64x2: Sleef_powd2_u10sse4); -+ impl_binary!(f64x4: Sleef_powd4_u10avx); -+ } else if #[cfg(target_feature = "sse4.2")] { -+ impl_binary!(f32x2[t => f32x4]: Sleef_powf4_u10sse4); -+ impl_binary!(f32x16[q => f32x4]: Sleef_powf4_u10sse4); -+ impl_binary!(f64x8[q => f64x2]: Sleef_powd2_u10sse4); -+ -+ impl_binary!(f32x4: Sleef_powf4_u10sse4); -+ impl_binary!(f32x8[h => f32x4]: Sleef_powf4_u10sse4); -+ impl_binary!(f64x2: Sleef_powd2_u10sse4); -+ impl_binary!(f64x4[h => f64x2]: Sleef_powd2_u10sse4); -+ } else if #[cfg(target_feature = "sse2")] { -+ impl_binary!(f32x2[t => f32x4]: Sleef_powf4_u10sse2); -+ impl_binary!(f32x16[q => f32x4]: Sleef_powf4_u10sse2); -+ impl_binary!(f64x8[q => f64x2]: Sleef_powd2_u10sse2); -+ -+ impl_binary!(f32x4: Sleef_powf4_u10sse2); -+ impl_binary!(f32x8[h => f32x4]: Sleef_powf4_u10sse2); -+ impl_binary!(f64x2: Sleef_powd2_u10sse2); -+ impl_binary!(f64x4[h => f64x2]: Sleef_powd2_u10sse2); -+ } else { -+ impl_binary!(f32x2[f32; 2]: powf_f32); -+ impl_binary!(f32x4: powf_v4f32); -+ impl_binary!(f32x8: powf_v8f32); -+ impl_binary!(f32x16: powf_v16f32); -+ -+ impl_binary!(f64x2: powf_v2f64); -+ impl_binary!(f64x4: powf_v4f64); -+ impl_binary!(f64x8: powf_v8f64); -+ } -+ } -+ } else { -+ impl_binary!(f32x2[f32; 2]: powf_f32); -+ impl_binary!(f32x4: powf_v4f32); -+ impl_binary!(f32x8: powf_v8f32); -+ impl_binary!(f32x16: powf_v16f32); -+ -+ impl_binary!(f64x2: powf_v2f64); -+ impl_binary!(f64x4: powf_v4f64); -+ impl_binary!(f64x8: powf_v8f64); -+ } -+} -diff --git a/third_party/rust/packed_simd/src/codegen/math/float/sin.rs b/third_party/rust/packed_simd/src/codegen/math/float/sin.rs -new file mode 100644 -index 000000000000..7b014d07da8d ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/math/float/sin.rs -@@ -0,0 +1,103 @@ -+//! Vertical floating-point `sin` -+#![allow(unused)] -+ -+// FIXME 64-bit 1 elem vectors sin -+ -+use crate::*; -+ -+crate trait Sin { -+ fn sin(self) -> Self; -+} -+ -+#[allow(improper_ctypes)] -+extern "C" { -+ #[link_name = "llvm.sin.v2f32"] -+ fn sin_v2f32(x: f32x2) -> f32x2; -+ #[link_name = "llvm.sin.v4f32"] -+ fn sin_v4f32(x: f32x4) -> f32x4; -+ #[link_name = "llvm.sin.v8f32"] -+ fn sin_v8f32(x: f32x8) -> f32x8; -+ #[link_name = "llvm.sin.v16f32"] -+ fn sin_v16f32(x: f32x16) -> f32x16; -+ /* FIXME 64-bit single elem vectors -+ #[link_name = "llvm.sin.v1f64"] -+ fn sin_v1f64(x: f64x1) -> f64x1; -+ */ -+ #[link_name = "llvm.sin.v2f64"] -+ fn sin_v2f64(x: f64x2) -> f64x2; -+ #[link_name = "llvm.sin.v4f64"] -+ fn sin_v4f64(x: f64x4) -> f64x4; -+ #[link_name = "llvm.sin.v8f64"] -+ fn sin_v8f64(x: f64x8) -> f64x8; -+ -+ #[link_name = "llvm.sin.f32"] -+ fn sin_f32(x: f32) -> f32; -+ #[link_name = "llvm.sin.f64"] -+ fn sin_f64(x: f64) -> f64; -+} -+ -+gen_unary_impl_table!(Sin, sin); -+ -+cfg_if! { -+ if #[cfg(target_arch = "s390x")] { -+ // FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/14 -+ impl_unary!(f32x2[f32; 2]: sin_f32); -+ impl_unary!(f32x4[f32; 4]: sin_f32); -+ impl_unary!(f32x8[f32; 8]: sin_f32); -+ impl_unary!(f32x16[f32; 16]: sin_f32); -+ -+ impl_unary!(f64x2[f64; 2]: sin_f64); -+ impl_unary!(f64x4[f64; 4]: sin_f64); -+ impl_unary!(f64x8[f64; 8]: sin_f64); -+ } else if #[cfg(all(target_arch = "x86_64", feature = "sleef-sys"))] { -+ use sleef_sys::*; -+ cfg_if! { -+ if #[cfg(target_feature = "avx2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_sinf4_u10avx2128); -+ impl_unary!(f32x16[h => f32x8]: Sleef_sinf8_u10avx2); -+ impl_unary!(f64x8[h => f64x4]: Sleef_sind4_u10avx2); -+ -+ impl_unary!(f32x4: Sleef_sinf4_u10avx2128); -+ impl_unary!(f32x8: Sleef_sinf8_u10avx2); -+ impl_unary!(f64x2: Sleef_sind2_u10avx2128); -+ impl_unary!(f64x4: Sleef_sind4_u10avx2); -+ } else if #[cfg(target_feature = "avx")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_sinf4_u10sse4); -+ impl_unary!(f32x16[h => f32x8]: Sleef_sinf8_u10avx); -+ impl_unary!(f64x8[h => f64x4]: Sleef_sind4_u10avx); -+ -+ impl_unary!(f32x4: Sleef_sinf4_u10sse4); -+ impl_unary!(f32x8: Sleef_sinf8_u10avx); -+ impl_unary!(f64x2: Sleef_sind2_u10sse4); -+ impl_unary!(f64x4: Sleef_sind4_u10avx); -+ } else if #[cfg(target_feature = "sse4.2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_sinf4_u10sse4); -+ impl_unary!(f32x16[q => f32x4]: Sleef_sinf4_u10sse4); -+ impl_unary!(f64x8[q => f64x2]: Sleef_sind2_u10sse4); -+ -+ impl_unary!(f32x4: Sleef_sinf4_u10sse4); -+ impl_unary!(f32x8[h => f32x4]: Sleef_sinf4_u10sse4); -+ impl_unary!(f64x2: Sleef_sind2_u10sse4); -+ impl_unary!(f64x4[h => f64x2]: Sleef_sind2_u10sse4); -+ } else { -+ impl_unary!(f32x2[f32; 2]: sin_f32); -+ impl_unary!(f32x16: sin_v16f32); -+ impl_unary!(f64x8: sin_v8f64); -+ -+ impl_unary!(f32x4: sin_v4f32); -+ impl_unary!(f32x8: sin_v8f32); -+ impl_unary!(f64x2: sin_v2f64); -+ impl_unary!(f64x4: sin_v4f64); -+ } -+ } -+ } else { -+ impl_unary!(f32x2[f32; 2]: sin_f32); -+ impl_unary!(f32x4: sin_v4f32); -+ impl_unary!(f32x8: sin_v8f32); -+ impl_unary!(f32x16: sin_v16f32); -+ -+ impl_unary!(f64x2: sin_v2f64); -+ impl_unary!(f64x4: sin_v4f64); -+ impl_unary!(f64x8: sin_v8f64); -+ } -+} -diff --git a/third_party/rust/packed_simd/src/codegen/math/float/sin_cos_pi.rs b/third_party/rust/packed_simd/src/codegen/math/float/sin_cos_pi.rs -new file mode 100644 -index 000000000000..0f1249ec88f0 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/math/float/sin_cos_pi.rs -@@ -0,0 +1,195 @@ -+//! Vertical floating-point `sin_cos` -+#![allow(unused)] -+ -+// FIXME 64-bit 1 elem vectors sin_cos -+ -+use crate::*; -+ -+crate trait SinCosPi: Sized { -+ type Output; -+ fn sin_cos_pi(self) -> Self::Output; -+} -+ -+macro_rules! impl_def { -+ ($vid:ident, $PI:path) => { -+ impl SinCosPi for $vid { -+ type Output = (Self, Self); -+ #[inline] -+ fn sin_cos_pi(self) -> Self::Output { -+ let v = self * Self::splat($PI); -+ (v.sin(), v.cos()) -+ } -+ } -+ }; -+} -+ -+macro_rules! impl_def32 { -+ ($vid:ident) => { -+ impl_def!($vid, crate::f32::consts::PI); -+ }; -+} -+macro_rules! impl_def64 { -+ ($vid:ident) => { -+ impl_def!($vid, crate::f64::consts::PI); -+ }; -+} -+ -+macro_rules! impl_unary_t { -+ ($vid:ident: $fun:ident) => { -+ impl SinCosPi for $vid { -+ type Output = (Self, Self); -+ fn sin_cos_pi(self) -> Self::Output { -+ unsafe { -+ use crate::mem::transmute; -+ transmute($fun(transmute(self))) -+ } -+ } -+ } -+ }; -+ ($vid:ident[t => $vid_t:ident]: $fun:ident) => { -+ impl SinCosPi for $vid { -+ type Output = (Self, Self); -+ fn sin_cos_pi(self) -> Self::Output { -+ unsafe { -+ use crate::mem::{transmute, uninitialized}; -+ -+ union U { -+ vec: [$vid; 2], -+ twice: $vid_t, -+ } -+ -+ let twice = U { vec: [self, uninitialized()] }.twice; -+ let twice = transmute($fun(transmute(twice))); -+ -+ union R { -+ twice: ($vid_t, $vid_t), -+ vecs: ([$vid; 2], [$vid; 2]), -+ } -+ let r = R { twice }.vecs; -+ (*r.0.get_unchecked(0), *r.0.get_unchecked(1)) -+ } -+ } -+ } -+ }; -+ ($vid:ident[h => $vid_h:ident]: $fun:ident) => { -+ impl SinCosPi for $vid { -+ type Output = (Self, Self); -+ fn sin_cos_pi(self) -> Self::Output { -+ unsafe { -+ use crate::mem::transmute; -+ -+ union U { -+ vec: $vid, -+ halves: [$vid_h; 2], -+ } -+ -+ let halves = U { vec: self }.halves; -+ -+ let res_0: ($vid_h, $vid_h) = -+ transmute($fun(transmute(*halves.get_unchecked(0)))); -+ let res_1: ($vid_h, $vid_h) = -+ transmute($fun(transmute(*halves.get_unchecked(1)))); -+ -+ union R { -+ result: ($vid, $vid), -+ halves: ([$vid_h; 2], [$vid_h; 2]), -+ } -+ R { halves: ([res_0.0, res_1.0], [res_0.1, res_1.1]) } -+ .result -+ } -+ } -+ } -+ }; -+ ($vid:ident[q => $vid_q:ident]: $fun:ident) => { -+ impl SinCosPi for $vid { -+ type Output = (Self, Self); -+ fn sin_cos_pi(self) -> Self::Output { -+ unsafe { -+ use crate::mem::transmute; -+ -+ union U { -+ vec: $vid, -+ quarters: [$vid_q; 4], -+ } -+ -+ let quarters = U { vec: self }.quarters; -+ -+ let res_0: ($vid_q, $vid_q) = -+ transmute($fun(transmute(*quarters.get_unchecked(0)))); -+ let res_1: ($vid_q, $vid_q) = -+ transmute($fun(transmute(*quarters.get_unchecked(1)))); -+ let res_2: ($vid_q, $vid_q) = -+ transmute($fun(transmute(*quarters.get_unchecked(2)))); -+ let res_3: ($vid_q, $vid_q) = -+ transmute($fun(transmute(*quarters.get_unchecked(3)))); -+ -+ union R { -+ result: ($vid, $vid), -+ quarters: ([$vid_q; 4], [$vid_q; 4]), -+ } -+ R { -+ quarters: ( -+ [res_0.0, res_1.0, res_2.0, res_3.0], -+ [res_0.1, res_1.1, res_2.1, res_3.1], -+ ), -+ } -+ .result -+ } -+ } -+ } -+ }; -+} -+ -+cfg_if! { -+ if #[cfg(all(target_arch = "x86_64", feature = "sleef-sys"))] { -+ use sleef_sys::*; -+ cfg_if! { -+ if #[cfg(target_feature = "avx2")] { -+ impl_unary_t!(f32x2[t => f32x4]: Sleef_sincospif4_u05avx2128); -+ impl_unary_t!(f32x16[h => f32x8]: Sleef_sincospif8_u05avx2); -+ impl_unary_t!(f64x8[h => f64x4]: Sleef_sincospid4_u05avx2); -+ -+ impl_unary_t!(f32x4: Sleef_sincospif4_u05avx2128); -+ impl_unary_t!(f32x8: Sleef_sincospif8_u05avx2); -+ impl_unary_t!(f64x2: Sleef_sincospid2_u05avx2128); -+ impl_unary_t!(f64x4: Sleef_sincospid4_u05avx2); -+ } else if #[cfg(target_feature = "avx")] { -+ impl_unary_t!(f32x2[t => f32x4]: Sleef_sincospif4_u05sse4); -+ impl_unary_t!(f32x16[h => f32x8]: Sleef_sincospif8_u05avx); -+ impl_unary_t!(f64x8[h => f64x4]: Sleef_sincospid4_u05avx); -+ -+ impl_unary_t!(f32x4: Sleef_sincospif4_u05sse4); -+ impl_unary_t!(f32x8: Sleef_sincospif8_u05avx); -+ impl_unary_t!(f64x2: Sleef_sincospid2_u05sse4); -+ impl_unary_t!(f64x4: Sleef_sincospid4_u05avx); -+ } else if #[cfg(target_feature = "sse4.2")] { -+ impl_unary_t!(f32x2[t => f32x4]: Sleef_sincospif4_u05sse4); -+ impl_unary_t!(f32x16[q => f32x4]: Sleef_sincospif4_u05sse4); -+ impl_unary_t!(f64x8[q => f64x2]: Sleef_sincospid2_u05sse4); -+ -+ impl_unary_t!(f32x4: Sleef_sincospif4_u05sse4); -+ impl_unary_t!(f32x8[h => f32x4]: Sleef_sincospif4_u05sse4); -+ impl_unary_t!(f64x2: Sleef_sincospid2_u05sse4); -+ impl_unary_t!(f64x4[h => f64x2]: Sleef_sincospid2_u05sse4); -+ } else { -+ impl_def32!(f32x2); -+ impl_def32!(f32x4); -+ impl_def32!(f32x8); -+ impl_def32!(f32x16); -+ -+ impl_def64!(f64x2); -+ impl_def64!(f64x4); -+ impl_def64!(f64x8); -+ } -+ } -+ } else { -+ impl_def32!(f32x2); -+ impl_def32!(f32x4); -+ impl_def32!(f32x8); -+ impl_def32!(f32x16); -+ -+ impl_def64!(f64x2); -+ impl_def64!(f64x4); -+ impl_def64!(f64x8); -+ } -+} -diff --git a/third_party/rust/packed_simd/src/codegen/math/float/sin_pi.rs b/third_party/rust/packed_simd/src/codegen/math/float/sin_pi.rs -new file mode 100644 -index 000000000000..72df98c93c91 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/math/float/sin_pi.rs -@@ -0,0 +1,87 @@ -+//! Vertical floating-point `sin_pi` -+#![allow(unused)] -+ -+// FIXME 64-bit 1 elem vectors sin_pi -+ -+use crate::*; -+ -+crate trait SinPi { -+ fn sin_pi(self) -> Self; -+} -+ -+gen_unary_impl_table!(SinPi, sin_pi); -+ -+macro_rules! impl_def { -+ ($vid:ident, $PI:path) => { -+ impl SinPi for $vid { -+ #[inline] -+ fn sin_pi(self) -> Self { -+ (self * Self::splat($PI)).sin() -+ } -+ } -+ }; -+} -+macro_rules! impl_def32 { -+ ($vid:ident) => { -+ impl_def!($vid, crate::f32::consts::PI); -+ }; -+} -+macro_rules! impl_def64 { -+ ($vid:ident) => { -+ impl_def!($vid, crate::f64::consts::PI); -+ }; -+} -+ -+cfg_if! { -+ if #[cfg(all(target_arch = "x86_64", feature = "sleef-sys"))] { -+ use sleef_sys::*; -+ cfg_if! { -+ if #[cfg(target_feature = "avx2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_sinpif4_u05avx2128); -+ impl_unary!(f32x16[h => f32x8]: Sleef_sinpif8_u05avx2); -+ impl_unary!(f64x8[h => f64x4]: Sleef_sinpid4_u05avx2); -+ -+ impl_unary!(f32x4: Sleef_sinpif4_u05avx2128); -+ impl_unary!(f32x8: Sleef_sinpif8_u05avx2); -+ impl_unary!(f64x2: Sleef_sinpid2_u05avx2128); -+ impl_unary!(f64x4: Sleef_sinpid4_u05avx2); -+ } else if #[cfg(target_feature = "avx")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_sinpif4_u05sse4); -+ impl_unary!(f32x16[h => f32x8]: Sleef_sinpif8_u05avx); -+ impl_unary!(f64x8[h => f64x4]: Sleef_sinpid4_u05avx); -+ -+ impl_unary!(f32x4: Sleef_sinpif4_u05sse4); -+ impl_unary!(f32x8: Sleef_sinpif8_u05avx); -+ impl_unary!(f64x2: Sleef_sinpid2_u05sse4); -+ impl_unary!(f64x4: Sleef_sinpid4_u05avx); -+ } else if #[cfg(target_feature = "sse4.2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_sinpif4_u05sse4); -+ impl_unary!(f32x16[q => f32x4]: Sleef_sinpif4_u05sse4); -+ impl_unary!(f64x8[q => f64x2]: Sleef_sinpid2_u05sse4); -+ -+ impl_unary!(f32x4: Sleef_sinpif4_u05sse4); -+ impl_unary!(f32x8[h => f32x4]: Sleef_sinpif4_u05sse4); -+ impl_unary!(f64x2: Sleef_sinpid2_u05sse4); -+ impl_unary!(f64x4[h => f64x2]: Sleef_sinpid2_u05sse4); -+ } else { -+ impl_def32!(f32x2); -+ impl_def32!(f32x4); -+ impl_def32!(f32x8); -+ impl_def32!(f32x16); -+ -+ impl_def64!(f64x2); -+ impl_def64!(f64x4); -+ impl_def64!(f64x8); -+ } -+ } -+ } else { -+ impl_def32!(f32x2); -+ impl_def32!(f32x4); -+ impl_def32!(f32x8); -+ impl_def32!(f32x16); -+ -+ impl_def64!(f64x2); -+ impl_def64!(f64x4); -+ impl_def64!(f64x8); -+ } -+} -diff --git a/third_party/rust/packed_simd/src/codegen/math/float/sqrt.rs b/third_party/rust/packed_simd/src/codegen/math/float/sqrt.rs -new file mode 100644 -index 000000000000..7ce31df62662 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/math/float/sqrt.rs -@@ -0,0 +1,103 @@ -+//! Vertical floating-point `sqrt` -+#![allow(unused)] -+ -+// FIXME 64-bit 1 elem vectors sqrt -+ -+use crate::*; -+ -+crate trait Sqrt { -+ fn sqrt(self) -> Self; -+} -+ -+#[allow(improper_ctypes)] -+extern "C" { -+ #[link_name = "llvm.sqrt.v2f32"] -+ fn sqrt_v2f32(x: f32x2) -> f32x2; -+ #[link_name = "llvm.sqrt.v4f32"] -+ fn sqrt_v4f32(x: f32x4) -> f32x4; -+ #[link_name = "llvm.sqrt.v8f32"] -+ fn sqrt_v8f32(x: f32x8) -> f32x8; -+ #[link_name = "llvm.sqrt.v16f32"] -+ fn sqrt_v16f32(x: f32x16) -> f32x16; -+ /* FIXME 64-bit sqrtgle elem vectors -+ #[link_name = "llvm.sqrt.v1f64"] -+ fn sqrt_v1f64(x: f64x1) -> f64x1; -+ */ -+ #[link_name = "llvm.sqrt.v2f64"] -+ fn sqrt_v2f64(x: f64x2) -> f64x2; -+ #[link_name = "llvm.sqrt.v4f64"] -+ fn sqrt_v4f64(x: f64x4) -> f64x4; -+ #[link_name = "llvm.sqrt.v8f64"] -+ fn sqrt_v8f64(x: f64x8) -> f64x8; -+ -+ #[link_name = "llvm.sqrt.f32"] -+ fn sqrt_f32(x: f32) -> f32; -+ #[link_name = "llvm.sqrt.f64"] -+ fn sqrt_f64(x: f64) -> f64; -+} -+ -+gen_unary_impl_table!(Sqrt, sqrt); -+ -+cfg_if! { -+ if #[cfg(target_arch = "s390x")] { -+ // FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/14 -+ impl_unary!(f32x2[f32; 2]: sqrt_f32); -+ impl_unary!(f32x4[f32; 4]: sqrt_f32); -+ impl_unary!(f32x8[f32; 8]: sqrt_f32); -+ impl_unary!(f32x16[f32; 16]: sqrt_f32); -+ -+ impl_unary!(f64x2[f64; 2]: sqrt_f64); -+ impl_unary!(f64x4[f64; 4]: sqrt_f64); -+ impl_unary!(f64x8[f64; 8]: sqrt_f64); -+ } else if #[cfg(all(target_arch = "x86_64", feature = "sleef-sys"))] { -+ use sleef_sys::*; -+ cfg_if! { -+ if #[cfg(target_feature = "avx2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_sqrtf4_avx2128); -+ impl_unary!(f32x16[h => f32x8]: Sleef_sqrtf8_avx2); -+ impl_unary!(f64x8[h => f64x4]: Sleef_sqrtd4_avx2); -+ -+ impl_unary!(f32x4: Sleef_sqrtf4_avx2128); -+ impl_unary!(f32x8: Sleef_sqrtf8_avx2); -+ impl_unary!(f64x2: Sleef_sqrtd2_avx2128); -+ impl_unary!(f64x4: Sleef_sqrtd4_avx2); -+ } else if #[cfg(target_feature = "avx")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_sqrtf4_sse4); -+ impl_unary!(f32x16[h => f32x8]: Sleef_sqrtf8_avx); -+ impl_unary!(f64x8[h => f64x4]: Sleef_sqrtd4_avx); -+ -+ impl_unary!(f32x4: Sleef_sqrtf4_sse4); -+ impl_unary!(f32x8: Sleef_sqrtf8_avx); -+ impl_unary!(f64x2: Sleef_sqrtd2_sse4); -+ impl_unary!(f64x4: Sleef_sqrtd4_avx); -+ } else if #[cfg(target_feature = "sse4.2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_sqrtf4_sse4); -+ impl_unary!(f32x16[q => f32x4]: Sleef_sqrtf4_sse4); -+ impl_unary!(f64x8[q => f64x2]: Sleef_sqrtd2_sse4); -+ -+ impl_unary!(f32x4: Sleef_sqrtf4_sse4); -+ impl_unary!(f32x8[h => f32x4]: Sleef_sqrtf4_sse4); -+ impl_unary!(f64x2: Sleef_sqrtd2_sse4); -+ impl_unary!(f64x4[h => f64x2]: Sleef_sqrtd2_sse4); -+ } else { -+ impl_unary!(f32x2[f32; 2]: sqrt_f32); -+ impl_unary!(f32x16: sqrt_v16f32); -+ impl_unary!(f64x8: sqrt_v8f64); -+ -+ impl_unary!(f32x4: sqrt_v4f32); -+ impl_unary!(f32x8: sqrt_v8f32); -+ impl_unary!(f64x2: sqrt_v2f64); -+ impl_unary!(f64x4: sqrt_v4f64); -+ } -+ } -+ } else { -+ impl_unary!(f32x2[f32; 2]: sqrt_f32); -+ impl_unary!(f32x4: sqrt_v4f32); -+ impl_unary!(f32x8: sqrt_v8f32); -+ impl_unary!(f32x16: sqrt_v16f32); -+ -+ impl_unary!(f64x2: sqrt_v2f64); -+ impl_unary!(f64x4: sqrt_v4f64); -+ impl_unary!(f64x8: sqrt_v8f64); -+ } -+} -diff --git a/third_party/rust/packed_simd/src/codegen/math/float/sqrte.rs b/third_party/rust/packed_simd/src/codegen/math/float/sqrte.rs -new file mode 100644 -index 000000000000..c1e379c34241 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/math/float/sqrte.rs -@@ -0,0 +1,67 @@ -+//! Vertical floating-point `sqrt` -+#![allow(unused)] -+ -+// FIXME 64-bit 1 elem vectors sqrte -+ -+use crate::llvm::simd_fsqrt; -+use crate::*; -+ -+crate trait Sqrte { -+ fn sqrte(self) -> Self; -+} -+ -+gen_unary_impl_table!(Sqrte, sqrte); -+ -+cfg_if! { -+ if #[cfg(all(target_arch = "x86_64", feature = "sleef-sys"))] { -+ use sleef_sys::*; -+ cfg_if! { -+ if #[cfg(target_feature = "avx2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_sqrtf4_u35avx2128); -+ impl_unary!(f32x16[h => f32x8]: Sleef_sqrtf8_u35avx2); -+ impl_unary!(f64x8[h => f64x4]: Sleef_sqrtd4_u35avx2); -+ -+ impl_unary!(f32x4: Sleef_sqrtf4_u35avx2128); -+ impl_unary!(f32x8: Sleef_sqrtf8_u35avx2); -+ impl_unary!(f64x2: Sleef_sqrtd2_u35avx2128); -+ impl_unary!(f64x4: Sleef_sqrtd4_u35avx2); -+ } else if #[cfg(target_feature = "avx")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_sqrtf4_u35sse4); -+ impl_unary!(f32x16[h => f32x8]: Sleef_sqrtf8_u35avx); -+ impl_unary!(f64x8[h => f64x4]: Sleef_sqrtd4_u35avx); -+ -+ impl_unary!(f32x4: Sleef_sqrtf4_u35sse4); -+ impl_unary!(f32x8: Sleef_sqrtf8_u35avx); -+ impl_unary!(f64x2: Sleef_sqrtd2_u35sse4); -+ impl_unary!(f64x4: Sleef_sqrtd4_u35avx); -+ } else if #[cfg(target_feature = "sse4.2")] { -+ impl_unary!(f32x2[t => f32x4]: Sleef_sqrtf4_u35sse4); -+ impl_unary!(f32x16[q => f32x4]: Sleef_sqrtf4_u35sse4); -+ impl_unary!(f64x8[q => f64x2]: Sleef_sqrtd2_u35sse4); -+ -+ impl_unary!(f32x4: Sleef_sqrtf4_u35sse4); -+ impl_unary!(f32x8[h => f32x4]: Sleef_sqrtf4_u35sse4); -+ impl_unary!(f64x2: Sleef_sqrtd2_u35sse4); -+ impl_unary!(f64x4[h => f64x2]: Sleef_sqrtd2_u35sse4); -+ } else { -+ impl_unary!(f32x2[g]: simd_fsqrt); -+ impl_unary!(f32x16[g]: simd_fsqrt); -+ impl_unary!(f64x8[g]: simd_fsqrt); -+ -+ impl_unary!(f32x4[g]: simd_fsqrt); -+ impl_unary!(f32x8[g]: simd_fsqrt); -+ impl_unary!(f64x2[g]: simd_fsqrt); -+ impl_unary!(f64x4[g]: simd_fsqrt); -+ } -+ } -+ } else { -+ impl_unary!(f32x2[g]: simd_fsqrt); -+ impl_unary!(f32x4[g]: simd_fsqrt); -+ impl_unary!(f32x8[g]: simd_fsqrt); -+ impl_unary!(f32x16[g]: simd_fsqrt); -+ -+ impl_unary!(f64x2[g]: simd_fsqrt); -+ impl_unary!(f64x4[g]: simd_fsqrt); -+ impl_unary!(f64x8[g]: simd_fsqrt); -+ } -+} -diff --git a/third_party/rust/packed_simd/src/codegen/pointer_sized_int.rs b/third_party/rust/packed_simd/src/codegen/pointer_sized_int.rs -new file mode 100644 -index 000000000000..39f493d3b17f ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/pointer_sized_int.rs -@@ -0,0 +1,28 @@ -+//! Provides `isize` and `usize` -+ -+use cfg_if::cfg_if; -+ -+cfg_if! { -+ if #[cfg(target_pointer_width = "8")] { -+ crate type isize_ = i8; -+ crate type usize_ = u8; -+ } else if #[cfg(target_pointer_width = "16")] { -+ crate type isize_ = i16; -+ crate type usize_ = u16; -+ } else if #[cfg(target_pointer_width = "32")] { -+ crate type isize_ = i32; -+ crate type usize_ = u32; -+ -+ } else if #[cfg(target_pointer_width = "64")] { -+ crate type isize_ = i64; -+ crate type usize_ = u64; -+ } else if #[cfg(target_pointer_width = "64")] { -+ crate type isize_ = i64; -+ crate type usize_ = u64; -+ } else if #[cfg(target_pointer_width = "128")] { -+ crate type isize_ = i128; -+ crate type usize_ = u128; -+ } else { -+ compile_error!("unsupported target_pointer_width"); -+ } -+} -diff --git a/third_party/rust/packed_simd/src/codegen/reductions.rs b/third_party/rust/packed_simd/src/codegen/reductions.rs -new file mode 100644 -index 000000000000..7be4f5fabbea ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/reductions.rs -@@ -0,0 +1 @@ -+crate mod mask; -diff --git a/third_party/rust/packed_simd/src/codegen/reductions/mask.rs b/third_party/rust/packed_simd/src/codegen/reductions/mask.rs -new file mode 100644 -index 000000000000..97260c6d4e03 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/reductions/mask.rs -@@ -0,0 +1,69 @@ -+//! Code generation workaround for `all()` mask horizontal reduction. -+//! -+//! Works arround [LLVM bug 36702]. -+//! -+//! [LLVM bug 36702]: https://bugs.llvm.org/show_bug.cgi?id=36702 -+#![allow(unused_macros)] -+ -+use crate::*; -+ -+crate trait All: crate::marker::Sized { -+ unsafe fn all(self) -> bool; -+} -+ -+crate trait Any: crate::marker::Sized { -+ unsafe fn any(self) -> bool; -+} -+ -+#[macro_use] -+mod fallback_impl; -+ -+cfg_if! { -+ if #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] { -+ #[macro_use] -+ mod x86; -+ } else if #[cfg(all(target_arch = "arm", target_feature = "v7", -+ target_feature = "neon", -+ any(feature = "core_arch", libcore_neon)))] { -+ #[macro_use] -+ mod arm; -+ } else if #[cfg(all(target_arch = "aarch64", target_feature = "neon"))] { -+ #[macro_use] -+ mod aarch64; -+ } else { -+ #[macro_use] -+ mod fallback; -+ } -+} -+ -+impl_mask_reductions!(m8x2); -+impl_mask_reductions!(m8x4); -+impl_mask_reductions!(m8x8); -+impl_mask_reductions!(m8x16); -+impl_mask_reductions!(m8x32); -+impl_mask_reductions!(m8x64); -+ -+impl_mask_reductions!(m16x2); -+impl_mask_reductions!(m16x4); -+impl_mask_reductions!(m16x8); -+impl_mask_reductions!(m16x16); -+impl_mask_reductions!(m16x32); -+ -+impl_mask_reductions!(m32x2); -+impl_mask_reductions!(m32x4); -+impl_mask_reductions!(m32x8); -+impl_mask_reductions!(m32x16); -+ -+// FIXME: 64-bit single element vector -+// impl_mask_reductions!(m64x1); -+impl_mask_reductions!(m64x2); -+impl_mask_reductions!(m64x4); -+impl_mask_reductions!(m64x8); -+ -+impl_mask_reductions!(m128x1); -+impl_mask_reductions!(m128x2); -+impl_mask_reductions!(m128x4); -+ -+impl_mask_reductions!(msizex2); -+impl_mask_reductions!(msizex4); -+impl_mask_reductions!(msizex8); -diff --git a/third_party/rust/packed_simd/src/codegen/reductions/mask/aarch64.rs b/third_party/rust/packed_simd/src/codegen/reductions/mask/aarch64.rs -new file mode 100644 -index 000000000000..e9586eace1ff ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/reductions/mask/aarch64.rs -@@ -0,0 +1,71 @@ -+//! Mask reductions implementation for `aarch64` targets -+ -+/// 128-bit wide vectors -+macro_rules! aarch64_128_neon_impl { -+ ($id:ident, $vmin:ident, $vmax:ident) => { -+ impl All for $id { -+ #[inline] -+ #[target_feature(enable = "neon")] -+ unsafe fn all(self) -> bool { -+ use crate::arch::aarch64::$vmin; -+ $vmin(crate::mem::transmute(self)) != 0 -+ } -+ } -+ impl Any for $id { -+ #[inline] -+ #[target_feature(enable = "neon")] -+ unsafe fn any(self) -> bool { -+ use crate::arch::aarch64::$vmax; -+ $vmax(crate::mem::transmute(self)) != 0 -+ } -+ } -+ } -+} -+ -+/// 64-bit wide vectors -+macro_rules! aarch64_64_neon_impl { -+ ($id:ident, $vec128:ident) => { -+ impl All for $id { -+ #[inline] -+ #[target_feature(enable = "neon")] -+ unsafe fn all(self) -> bool { -+ // Duplicates the 64-bit vector into a 128-bit one and -+ // calls all on that. -+ union U { -+ halves: ($id, $id), -+ vec: $vec128, -+ } -+ U { -+ halves: (self, self), -+ }.vec.all() -+ } -+ } -+ impl Any for $id { -+ #[inline] -+ #[target_feature(enable = "neon")] -+ unsafe fn any(self) -> bool { -+ union U { -+ halves: ($id, $id), -+ vec: $vec128, -+ } -+ U { -+ halves: (self, self), -+ }.vec.any() -+ } -+ } -+ }; -+} -+ -+/// Mask reduction implementation for `aarch64` targets -+macro_rules! impl_mask_reductions { -+ // 64-bit wide masks -+ (m8x8) => { aarch64_64_neon_impl!(m8x8, m8x16); }; -+ (m16x4) => { aarch64_64_neon_impl!(m16x4, m16x8); }; -+ (m32x2) => { aarch64_64_neon_impl!(m32x2, m32x4); }; -+ // 128-bit wide masks -+ (m8x16) => { aarch64_128_neon_impl!(m8x16, vminvq_u8, vmaxvq_u8); }; -+ (m16x8) => { aarch64_128_neon_impl!(m16x8, vminvq_u16, vmaxvq_u16); }; -+ (m32x4) => { aarch64_128_neon_impl!(m32x4, vminvq_u32, vmaxvq_u32); }; -+ // Fallback to LLVM's default code-generation: -+ ($id:ident) => { fallback_impl!($id); }; -+} -diff --git a/third_party/rust/packed_simd/src/codegen/reductions/mask/arm.rs b/third_party/rust/packed_simd/src/codegen/reductions/mask/arm.rs -new file mode 100644 -index 000000000000..1987af7a9676 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/reductions/mask/arm.rs -@@ -0,0 +1,54 @@ -+//! Mask reductions implementation for `arm` targets -+ -+/// Implementation for ARM + v7 + NEON for 64-bit or 128-bit wide vectors with -+/// more than two elements. -+macro_rules! arm_128_v7_neon_impl { -+ ($id:ident, $half:ident, $vpmin:ident, $vpmax:ident) => { -+ impl All for $id { -+ #[inline] -+ #[target_feature(enable = "v7,neon")] -+ unsafe fn all(self) -> bool { -+ use crate::arch::arm::$vpmin; -+ use crate::mem::transmute; -+ union U { -+ halves: ($half, $half), -+ vec: $id, -+ } -+ let halves = U { vec: self }.halves; -+ let h: $half = transmute($vpmin( -+ transmute(halves.0), -+ transmute(halves.1), -+ )); -+ h.all() -+ } -+ } -+ impl Any for $id { -+ #[inline] -+ #[target_feature(enable = "v7,neon")] -+ unsafe fn any(self) -> bool { -+ use crate::arch::arm::$vpmax; -+ use crate::mem::transmute; -+ union U { -+ halves: ($half, $half), -+ vec: $id, -+ } -+ let halves = U { vec: self }.halves; -+ let h: $half = transmute($vpmax( -+ transmute(halves.0), -+ transmute(halves.1), -+ )); -+ h.any() -+ } -+ } -+ }; -+} -+ -+/// Mask reduction implementation for `arm` targets -+macro_rules! impl_mask_reductions { -+ // 128-bit wide masks -+ (m8x16) => { arm_128_v7_neon_impl!(m8x16, m8x8, vpmin_u8, vpmax_u8); }; -+ (m16x8) => { arm_128_v7_neon_impl!(m16x8, m16x4, vpmin_u16, vpmax_u16); }; -+ (m32x4) => { arm_128_v7_neon_impl!(m32x4, m32x2, vpmin_u32, vpmax_u32); }; -+ // Fallback to LLVM's default code-generation: -+ ($id:ident) => { fallback_impl!($id); }; -+} -diff --git a/third_party/rust/packed_simd/src/codegen/reductions/mask/fallback.rs b/third_party/rust/packed_simd/src/codegen/reductions/mask/fallback.rs -new file mode 100644 -index 000000000000..25e5c813abca ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/reductions/mask/fallback.rs -@@ -0,0 +1,6 @@ -+//! Default mask reduction implementations. -+ -+/// Default mask reduction implementation -+macro_rules! impl_mask_reductions { -+ ($id:ident) => { fallback_impl!($id); }; -+} -diff --git a/third_party/rust/packed_simd/src/codegen/reductions/mask/fallback_impl.rs b/third_party/rust/packed_simd/src/codegen/reductions/mask/fallback_impl.rs -new file mode 100644 -index 000000000000..0d246e2fdab6 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/reductions/mask/fallback_impl.rs -@@ -0,0 +1,237 @@ -+//! Default implementation of a mask reduction for any target. -+ -+macro_rules! fallback_to_other_impl { -+ ($id:ident, $other:ident) => { -+ impl All for $id { -+ #[inline] -+ unsafe fn all(self) -> bool { -+ let m: $other = crate::mem::transmute(self); -+ m.all() -+ } -+ } -+ impl Any for $id { -+ #[inline] -+ unsafe fn any(self) -> bool { -+ let m: $other = crate::mem::transmute(self); -+ m.any() -+ } -+ } -+ }; -+} -+ -+/// Fallback implementation. -+macro_rules! fallback_impl { -+ // 16-bit wide masks: -+ (m8x2) => { -+ impl All for m8x2 { -+ #[inline] -+ unsafe fn all(self) -> bool { -+ let i: u16 = crate::mem::transmute(self); -+ i == u16::max_value() -+ } -+ } -+ impl Any for m8x2 { -+ #[inline] -+ unsafe fn any(self) -> bool { -+ let i: u16 = crate::mem::transmute(self); -+ i != 0 -+ } -+ } -+ }; -+ // 32-bit wide masks -+ (m8x4) => { -+ impl All for m8x4 { -+ #[inline] -+ unsafe fn all(self) -> bool { -+ let i: u32 = crate::mem::transmute(self); -+ i == u32::max_value() -+ } -+ } -+ impl Any for m8x4 { -+ #[inline] -+ unsafe fn any(self) -> bool { -+ let i: u32 = crate::mem::transmute(self); -+ i != 0 -+ } -+ } -+ }; -+ (m16x2) => { -+ fallback_to_other_impl!(m16x2, m8x4); -+ }; -+ // 64-bit wide masks: -+ (m8x8) => { -+ impl All for m8x8 { -+ #[inline] -+ unsafe fn all(self) -> bool { -+ let i: u64 = crate::mem::transmute(self); -+ i == u64::max_value() -+ } -+ } -+ impl Any for m8x8 { -+ #[inline] -+ unsafe fn any(self) -> bool { -+ let i: u64 = crate::mem::transmute(self); -+ i != 0 -+ } -+ } -+ }; -+ (m16x4) => { -+ fallback_to_other_impl!(m16x4, m8x8); -+ }; -+ (m32x2) => { -+ fallback_to_other_impl!(m32x2, m16x4); -+ }; -+ // FIXME: 64x1 maxk -+ // 128-bit wide masks: -+ (m8x16) => { -+ impl All for m8x16 { -+ #[inline] -+ unsafe fn all(self) -> bool { -+ let i: u128 = crate::mem::transmute(self); -+ i == u128::max_value() -+ } -+ } -+ impl Any for m8x16 { -+ #[inline] -+ unsafe fn any(self) -> bool { -+ let i: u128 = crate::mem::transmute(self); -+ i != 0 -+ } -+ } -+ }; -+ (m16x8) => { -+ fallback_to_other_impl!(m16x8, m8x16); -+ }; -+ (m32x4) => { -+ fallback_to_other_impl!(m32x4, m16x8); -+ }; -+ (m64x2) => { -+ fallback_to_other_impl!(m64x2, m32x4); -+ }; -+ (m128x1) => { -+ fallback_to_other_impl!(m128x1, m64x2); -+ }; -+ // 256-bit wide masks -+ (m8x32) => { -+ impl All for m8x32 { -+ #[inline] -+ unsafe fn all(self) -> bool { -+ let i: [u128; 2] = crate::mem::transmute(self); -+ let o: [u128; 2] = [u128::max_value(); 2]; -+ i == o -+ } -+ } -+ impl Any for m8x32 { -+ #[inline] -+ unsafe fn any(self) -> bool { -+ let i: [u128; 2] = crate::mem::transmute(self); -+ let o: [u128; 2] = [0; 2]; -+ i != o -+ } -+ } -+ }; -+ (m16x16) => { -+ fallback_to_other_impl!(m16x16, m8x32); -+ }; -+ (m32x8) => { -+ fallback_to_other_impl!(m32x8, m16x16); -+ }; -+ (m64x4) => { -+ fallback_to_other_impl!(m64x4, m32x8); -+ }; -+ (m128x2) => { -+ fallback_to_other_impl!(m128x2, m64x4); -+ }; -+ // 512-bit wide masks -+ (m8x64) => { -+ impl All for m8x64 { -+ #[inline] -+ unsafe fn all(self) -> bool { -+ let i: [u128; 4] = crate::mem::transmute(self); -+ let o: [u128; 4] = [u128::max_value(); 4]; -+ i == o -+ } -+ } -+ impl Any for m8x64 { -+ #[inline] -+ unsafe fn any(self) -> bool { -+ let i: [u128; 4] = crate::mem::transmute(self); -+ let o: [u128; 4] = [0; 4]; -+ i != o -+ } -+ } -+ }; -+ (m16x32) => { -+ fallback_to_other_impl!(m16x32, m8x64); -+ }; -+ (m32x16) => { -+ fallback_to_other_impl!(m32x16, m16x32); -+ }; -+ (m64x8) => { -+ fallback_to_other_impl!(m64x8, m32x16); -+ }; -+ (m128x4) => { -+ fallback_to_other_impl!(m128x4, m64x8); -+ }; -+ // Masks with pointer-sized elements64 -+ (msizex2) => { -+ cfg_if! { -+ if #[cfg(target_pointer_width = "64")] { -+ fallback_to_other_impl!(msizex2, m64x2); -+ } else if #[cfg(target_pointer_width = "32")] { -+ fallback_to_other_impl!(msizex2, m32x2); -+ } else { -+ compile_error!("unsupported target_pointer_width"); -+ } -+ } -+ }; -+ (msizex4) => { -+ cfg_if! { -+ if #[cfg(target_pointer_width = "64")] { -+ fallback_to_other_impl!(msizex4, m64x4); -+ } else if #[cfg(target_pointer_width = "32")] { -+ fallback_to_other_impl!(msizex4, m32x4); -+ } else { -+ compile_error!("unsupported target_pointer_width"); -+ } -+ } -+ }; -+ (msizex8) => { -+ cfg_if! { -+ if #[cfg(target_pointer_width = "64")] { -+ fallback_to_other_impl!(msizex8, m64x8); -+ } else if #[cfg(target_pointer_width = "32")] { -+ fallback_to_other_impl!(msizex8, m32x8); -+ } else { -+ compile_error!("unsupported target_pointer_width"); -+ } -+ } -+ }; -+} -+ -+macro_rules! recurse_half { -+ ($vid:ident, $vid_h:ident) => { -+ impl All for $vid { -+ #[inline] -+ unsafe fn all(self) -> bool { -+ union U { -+ halves: ($vid_h, $vid_h), -+ vec: $vid, -+ } -+ let halves = U { vec: self }.halves; -+ halves.0.all() && halves.1.all() -+ } -+ } -+ impl Any for $vid { -+ #[inline] -+ unsafe fn any(self) -> bool { -+ union U { -+ halves: ($vid_h, $vid_h), -+ vec: $vid, -+ } -+ let halves = U { vec: self }.halves; -+ halves.0.any() || halves.1.any() -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/codegen/reductions/mask/x86.rs b/third_party/rust/packed_simd/src/codegen/reductions/mask/x86.rs -new file mode 100644 -index 000000000000..2ae4ed81c416 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/reductions/mask/x86.rs -@@ -0,0 +1,194 @@ -+//! Mask reductions implementation for `x86` and `x86_64` targets -+ -+#[cfg(target_feature = "sse")] -+#[macro_use] -+mod sse; -+ -+#[cfg(target_feature = "sse2")] -+#[macro_use] -+mod sse2; -+ -+#[cfg(target_feature = "avx")] -+#[macro_use] -+mod avx; -+ -+#[cfg(target_feature = "avx2")] -+#[macro_use] -+mod avx2; -+ -+/// x86 64-bit m8x8 implementation -+macro_rules! x86_m8x8_impl { -+ ($id:ident) => { -+ cfg_if! { -+ if #[cfg(all(target_arch = "x86_64", target_feature = "sse"))] { -+ x86_m8x8_sse_impl!($id); -+ } else { -+ fallback_impl!($id); -+ } -+ } -+ }; -+} -+ -+/// x86 128-bit m8x16 implementation -+macro_rules! x86_m8x16_impl { -+ ($id:ident) => { -+ cfg_if! { -+ if #[cfg(target_feature = "sse2")] { -+ x86_m8x16_sse2_impl!($id); -+ } else { -+ fallback_impl!($id); -+ } -+ } -+ }; -+} -+ -+/// x86 128-bit m32x4 implementation -+macro_rules! x86_m32x4_impl { -+ ($id:ident) => { -+ cfg_if! { -+ if #[cfg(target_feature = "sse")] { -+ x86_m32x4_sse_impl!($id); -+ } else { -+ fallback_impl!($id); -+ } -+ } -+ }; -+} -+ -+/// x86 128-bit m64x2 implementation -+macro_rules! x86_m64x2_impl { -+ ($id:ident) => { -+ cfg_if! { -+ if #[cfg(target_feature = "sse2")] { -+ x86_m64x2_sse2_impl!($id); -+ } else if #[cfg(target_feature = "sse")] { -+ x86_m32x4_sse_impl!($id); -+ } else { -+ fallback_impl!($id); -+ } -+ } -+ }; -+} -+ -+/// x86 256-bit m8x32 implementation -+macro_rules! x86_m8x32_impl { -+ ($id:ident, $half_id:ident) => { -+ cfg_if! { -+ if #[cfg(target_feature = "avx2")] { -+ x86_m8x32_avx2_impl!($id); -+ } else if #[cfg(target_feature = "avx")] { -+ x86_m8x32_avx_impl!($id); -+ } else if #[cfg(target_feature = "sse2")] { -+ recurse_half!($id, $half_id); -+ } else { -+ fallback_impl!($id); -+ } -+ } -+ }; -+} -+ -+/// x86 256-bit m32x8 implementation -+macro_rules! x86_m32x8_impl { -+ ($id:ident, $half_id:ident) => { -+ cfg_if! { -+ if #[cfg(target_feature = "avx")] { -+ x86_m32x8_avx_impl!($id); -+ } else if #[cfg(target_feature = "sse")] { -+ recurse_half!($id, $half_id); -+ } else { -+ fallback_impl!($id); -+ } -+ } -+ }; -+} -+ -+/// x86 256-bit m64x4 implementation -+macro_rules! x86_m64x4_impl { -+ ($id:ident, $half_id:ident) => { -+ cfg_if! { -+ if #[cfg(target_feature = "avx")] { -+ x86_m64x4_avx_impl!($id); -+ } else if #[cfg(target_feature = "sse")] { -+ recurse_half!($id, $half_id); -+ } else { -+ fallback_impl!($id); -+ } -+ } -+ }; -+} -+ -+/// Fallback implementation. -+macro_rules! x86_intr_impl { -+ ($id:ident) => { -+ impl All for $id { -+ #[inline] -+ unsafe fn all(self) -> bool { -+ use crate::llvm::simd_reduce_all; -+ simd_reduce_all(self.0) -+ } -+ } -+ impl Any for $id { -+ #[inline] -+ unsafe fn any(self) -> bool { -+ use crate::llvm::simd_reduce_any; -+ simd_reduce_any(self.0) -+ } -+ } -+ }; -+} -+ -+/// Mask reduction implementation for `x86` and `x86_64` targets -+macro_rules! impl_mask_reductions { -+ // 64-bit wide masks -+ (m8x8) => { x86_m8x8_impl!(m8x8); }; -+ (m16x4) => { x86_m8x8_impl!(m16x4); }; -+ (m32x2) => { x86_m8x8_impl!(m32x2); }; -+ // 128-bit wide masks -+ (m8x16) => { x86_m8x16_impl!(m8x16); }; -+ (m16x8) => { x86_m8x16_impl!(m16x8); }; -+ (m32x4) => { x86_m32x4_impl!(m32x4); }; -+ (m64x2) => { x86_m64x2_impl!(m64x2); }; -+ (m128x1) => { x86_intr_impl!(m128x1); }; -+ // 256-bit wide masks: -+ (m8x32) => { x86_m8x32_impl!(m8x32, m8x16); }; -+ (m16x16) => { x86_m8x32_impl!(m16x16, m16x8); }; -+ (m32x8) => { x86_m32x8_impl!(m32x8, m32x4); }; -+ (m64x4) => { x86_m64x4_impl!(m64x4, m64x2); }; -+ (m128x2) => { x86_intr_impl!(m128x2); }; -+ (msizex2) => { -+ cfg_if! { -+ if #[cfg(target_pointer_width = "64")] { -+ fallback_to_other_impl!(msizex2, m64x2); -+ } else if #[cfg(target_pointer_width = "32")] { -+ fallback_to_other_impl!(msizex2, m32x2); -+ } else { -+ compile_error!("unsupported target_pointer_width"); -+ } -+ } -+ }; -+ (msizex4) => { -+ cfg_if! { -+ if #[cfg(target_pointer_width = "64")] { -+ fallback_to_other_impl!(msizex4, m64x4); -+ } else if #[cfg(target_pointer_width = "32")] { -+ fallback_to_other_impl!(msizex4, m32x4); -+ } else { -+ compile_error!("unsupported target_pointer_width"); -+ } -+ } -+ }; -+ (msizex8) => { -+ cfg_if! { -+ if #[cfg(target_pointer_width = "64")] { -+ fallback_to_other_impl!(msizex8, m64x8); -+ } else if #[cfg(target_pointer_width = "32")] { -+ fallback_to_other_impl!(msizex8, m32x8); -+ } else { -+ compile_error!("unsupported target_pointer_width"); -+ } -+ } -+ }; -+ -+ // Fallback to LLVM's default code-generation: -+ ($id:ident) => { fallback_impl!($id); }; -+} -diff --git a/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/avx.rs b/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/avx.rs -new file mode 100644 -index 000000000000..d18736fb0399 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/avx.rs -@@ -0,0 +1,101 @@ -+//! Mask reductions implementation for `x86` and `x86_64` targets with `AVX` -+ -+/// `x86`/`x86_64` 256-bit `AVX` implementation -+/// FIXME: it might be faster here to do two `_mm_movmask_epi8` -+#[cfg(target_feature = "avx")] -+macro_rules! x86_m8x32_avx_impl { -+ ($id:ident) => { -+ impl All for $id { -+ #[inline] -+ #[target_feature(enable = "avx")] -+ unsafe fn all(self) -> bool { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::_mm256_testc_si256; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::_mm256_testc_si256; -+ _mm256_testc_si256( -+ crate::mem::transmute(self), -+ crate::mem::transmute($id::splat(true)), -+ ) != 0 -+ } -+ } -+ impl Any for $id { -+ #[inline] -+ #[target_feature(enable = "avx")] -+ unsafe fn any(self) -> bool { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::_mm256_testz_si256; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::_mm256_testz_si256; -+ _mm256_testz_si256( -+ crate::mem::transmute(self), -+ crate::mem::transmute(self), -+ ) == 0 -+ } -+ } -+ }; -+} -+ -+/// `x86`/`x86_64` 256-bit m32x8 `AVX` implementation -+macro_rules! x86_m32x8_avx_impl { -+ ($id:ident) => { -+ impl All for $id { -+ #[inline] -+ #[target_feature(enable = "sse")] -+ unsafe fn all(self) -> bool { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::_mm256_movemask_ps; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::_mm256_movemask_ps; -+ // _mm256_movemask_ps(a) creates a 8bit mask containing the -+ // most significant bit of each lane of `a`. If all bits are -+ // set, then all 8 lanes of the mask are true. -+ _mm256_movemask_ps(crate::mem::transmute(self)) == 0b_1111_1111_i32 -+ } -+ } -+ impl Any for $id { -+ #[inline] -+ #[target_feature(enable = "sse")] -+ unsafe fn any(self) -> bool { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::_mm256_movemask_ps; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::_mm256_movemask_ps; -+ -+ _mm256_movemask_ps(crate::mem::transmute(self)) != 0 -+ } -+ } -+ }; -+} -+ -+/// `x86`/`x86_64` 256-bit m64x4 `AVX` implementation -+macro_rules! x86_m64x4_avx_impl { -+ ($id:ident) => { -+ impl All for $id { -+ #[inline] -+ #[target_feature(enable = "sse")] -+ unsafe fn all(self) -> bool { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::_mm256_movemask_pd; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::_mm256_movemask_pd; -+ // _mm256_movemask_pd(a) creates a 4bit mask containing the -+ // most significant bit of each lane of `a`. If all bits are -+ // set, then all 4 lanes of the mask are true. -+ _mm256_movemask_pd(crate::mem::transmute(self)) == 0b_1111_i32 -+ } -+ } -+ impl Any for $id { -+ #[inline] -+ #[target_feature(enable = "sse")] -+ unsafe fn any(self) -> bool { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::_mm256_movemask_pd; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::_mm256_movemask_pd; -+ -+ _mm256_movemask_pd(crate::mem::transmute(self)) != 0 -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/avx2.rs b/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/avx2.rs -new file mode 100644 -index 000000000000..d37d02342092 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/avx2.rs -@@ -0,0 +1,35 @@ -+//! Mask reductions implementation for `x86` and `x86_64` targets with `AVX2`. -+#![allow(unused)] -+ -+/// x86/x86_64 256-bit m8x32 AVX2 implementation -+macro_rules! x86_m8x32_avx2_impl { -+ ($id:ident) => { -+ impl All for $id { -+ #[inline] -+ #[target_feature(enable = "sse2")] -+ unsafe fn all(self) -> bool { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::_mm256_movemask_epi8; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::_mm256_movemask_epi8; -+ // _mm256_movemask_epi8(a) creates a 32bit mask containing the -+ // most significant bit of each byte of `a`. If all -+ // bits are set, then all 32 lanes of the mask are -+ // true. -+ _mm256_movemask_epi8(crate::mem::transmute(self)) == -1_i32 -+ } -+ } -+ impl Any for $id { -+ #[inline] -+ #[target_feature(enable = "sse2")] -+ unsafe fn any(self) -> bool { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::_mm256_movemask_epi8; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::_mm256_movemask_epi8; -+ -+ _mm256_movemask_epi8(crate::mem::transmute(self)) != 0 -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse.rs b/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse.rs -new file mode 100644 -index 000000000000..7482f9430a14 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse.rs -@@ -0,0 +1,68 @@ -+//! Mask reductions implementation for `x86` and `x86_64` targets with `SSE`. -+#![allow(unused)] -+ -+/// `x86`/`x86_64` 128-bit `m32x4` `SSE` implementation -+macro_rules! x86_m32x4_sse_impl { -+ ($id:ident) => { -+ impl All for $id { -+ #[inline] -+ #[target_feature(enable = "sse")] -+ unsafe fn all(self) -> bool { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::_mm_movemask_ps; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::_mm_movemask_ps; -+ // _mm_movemask_ps(a) creates a 4bit mask containing the -+ // most significant bit of each lane of `a`. If all -+ // bits are set, then all 4 lanes of the mask are -+ // true. -+ _mm_movemask_ps(crate::mem::transmute(self)) -+ == 0b_1111_i32 -+ } -+ } -+ impl Any for $id { -+ #[inline] -+ #[target_feature(enable = "sse")] -+ unsafe fn any(self) -> bool { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::_mm_movemask_ps; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::_mm_movemask_ps; -+ -+ _mm_movemask_ps(crate::mem::transmute(self)) != 0 -+ } -+ } -+ }; -+} -+ -+macro_rules! x86_m8x8_sse_impl { -+ ($id:ident) => { -+ impl All for $id { -+ #[inline] -+ #[target_feature(enable = "sse")] -+ unsafe fn all(self) -> bool { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::_mm_movemask_pi8; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::_mm_movemask_pi8; -+ // _mm_movemask_pi8(a) creates an 8bit mask containing the most -+ // significant bit of each byte of `a`. If all bits are set, -+ // then all 8 lanes of the mask are true. -+ _mm_movemask_pi8(crate::mem::transmute(self)) -+ == u8::max_value() as i32 -+ } -+ } -+ impl Any for $id { -+ #[inline] -+ #[target_feature(enable = "sse")] -+ unsafe fn any(self) -> bool { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::_mm_movemask_pi8; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::_mm_movemask_pi8; -+ -+ _mm_movemask_pi8(crate::mem::transmute(self)) != 0 -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse2.rs b/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse2.rs -new file mode 100644 -index 000000000000..a99c606f5268 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse2.rs -@@ -0,0 +1,70 @@ -+//! Mask reductions implementation for `x86` and `x86_64` targets with `SSE2`. -+#![allow(unused)] -+ -+/// `x86`/`x86_64` 128-bit m64x2 `SSE2` implementation -+macro_rules! x86_m64x2_sse2_impl { -+ ($id:ident) => { -+ impl All for $id { -+ #[inline] -+ #[target_feature(enable = "sse")] -+ unsafe fn all(self) -> bool { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::_mm_movemask_pd; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::_mm_movemask_pd; -+ // _mm_movemask_pd(a) creates a 2bit mask containing the -+ // most significant bit of each lane of `a`. If all -+ // bits are set, then all 2 lanes of the mask are -+ // true. -+ _mm_movemask_pd(crate::mem::transmute(self)) -+ == 0b_11_i32 -+ } -+ } -+ impl Any for $id { -+ #[inline] -+ #[target_feature(enable = "sse")] -+ unsafe fn any(self) -> bool { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::_mm_movemask_pd; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::_mm_movemask_pd; -+ -+ _mm_movemask_pd(crate::mem::transmute(self)) != 0 -+ } -+ } -+ }; -+} -+ -+/// `x86`/`x86_64` 128-bit m8x16 `SSE2` implementation -+macro_rules! x86_m8x16_sse2_impl { -+ ($id:ident) => { -+ impl All for $id { -+ #[inline] -+ #[target_feature(enable = "sse2")] -+ unsafe fn all(self) -> bool { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::_mm_movemask_epi8; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::_mm_movemask_epi8; -+ // _mm_movemask_epi8(a) creates a 16bit mask containing the -+ // most significant bit of each byte of `a`. If all -+ // bits are set, then all 16 lanes of the mask are -+ // true. -+ _mm_movemask_epi8(crate::mem::transmute(self)) -+ == i32::from(u16::max_value()) -+ } -+ } -+ impl Any for $id { -+ #[inline] -+ #[target_feature(enable = "sse2")] -+ unsafe fn any(self) -> bool { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::_mm_movemask_epi8; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::_mm_movemask_epi8; -+ -+ _mm_movemask_epi8(crate::mem::transmute(self)) != 0 -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/codegen/shuffle.rs b/third_party/rust/packed_simd/src/codegen/shuffle.rs -new file mode 100644 -index 000000000000..35a9db905339 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/shuffle.rs -@@ -0,0 +1,302 @@ -+//! Implementations of the `ShuffleResult` trait for the different numbers of -+//! lanes and vector element types. -+ -+use crate::masks::*; -+use crate::sealed::Shuffle; -+ -+impl Shuffle<[u32; 2]> for i8 { -+ type Output = crate::codegen::i8x2; -+} -+impl Shuffle<[u32; 4]> for i8 { -+ type Output = crate::codegen::i8x4; -+} -+impl Shuffle<[u32; 8]> for i8 { -+ type Output = crate::codegen::i8x8; -+} -+impl Shuffle<[u32; 16]> for i8 { -+ type Output = crate::codegen::i8x16; -+} -+impl Shuffle<[u32; 32]> for i8 { -+ type Output = crate::codegen::i8x32; -+} -+impl Shuffle<[u32; 64]> for i8 { -+ type Output = crate::codegen::i8x64; -+} -+ -+impl Shuffle<[u32; 2]> for u8 { -+ type Output = crate::codegen::u8x2; -+} -+impl Shuffle<[u32; 4]> for u8 { -+ type Output = crate::codegen::u8x4; -+} -+impl Shuffle<[u32; 8]> for u8 { -+ type Output = crate::codegen::u8x8; -+} -+impl Shuffle<[u32; 16]> for u8 { -+ type Output = crate::codegen::u8x16; -+} -+impl Shuffle<[u32; 32]> for u8 { -+ type Output = crate::codegen::u8x32; -+} -+impl Shuffle<[u32; 64]> for u8 { -+ type Output = crate::codegen::u8x64; -+} -+ -+impl Shuffle<[u32; 2]> for m8 { -+ type Output = crate::codegen::m8x2; -+} -+impl Shuffle<[u32; 4]> for m8 { -+ type Output = crate::codegen::m8x4; -+} -+impl Shuffle<[u32; 8]> for m8 { -+ type Output = crate::codegen::m8x8; -+} -+impl Shuffle<[u32; 16]> for m8 { -+ type Output = crate::codegen::m8x16; -+} -+impl Shuffle<[u32; 32]> for m8 { -+ type Output = crate::codegen::m8x32; -+} -+impl Shuffle<[u32; 64]> for m8 { -+ type Output = crate::codegen::m8x64; -+} -+ -+impl Shuffle<[u32; 2]> for i16 { -+ type Output = crate::codegen::i16x2; -+} -+impl Shuffle<[u32; 4]> for i16 { -+ type Output = crate::codegen::i16x4; -+} -+impl Shuffle<[u32; 8]> for i16 { -+ type Output = crate::codegen::i16x8; -+} -+impl Shuffle<[u32; 16]> for i16 { -+ type Output = crate::codegen::i16x16; -+} -+impl Shuffle<[u32; 32]> for i16 { -+ type Output = crate::codegen::i16x32; -+} -+ -+impl Shuffle<[u32; 2]> for u16 { -+ type Output = crate::codegen::u16x2; -+} -+impl Shuffle<[u32; 4]> for u16 { -+ type Output = crate::codegen::u16x4; -+} -+impl Shuffle<[u32; 8]> for u16 { -+ type Output = crate::codegen::u16x8; -+} -+impl Shuffle<[u32; 16]> for u16 { -+ type Output = crate::codegen::u16x16; -+} -+impl Shuffle<[u32; 32]> for u16 { -+ type Output = crate::codegen::u16x32; -+} -+ -+impl Shuffle<[u32; 2]> for m16 { -+ type Output = crate::codegen::m16x2; -+} -+impl Shuffle<[u32; 4]> for m16 { -+ type Output = crate::codegen::m16x4; -+} -+impl Shuffle<[u32; 8]> for m16 { -+ type Output = crate::codegen::m16x8; -+} -+impl Shuffle<[u32; 16]> for m16 { -+ type Output = crate::codegen::m16x16; -+} -+impl Shuffle<[u32; 32]> for m16 { -+ type Output = crate::codegen::m16x32; -+} -+ -+impl Shuffle<[u32; 2]> for i32 { -+ type Output = crate::codegen::i32x2; -+} -+impl Shuffle<[u32; 4]> for i32 { -+ type Output = crate::codegen::i32x4; -+} -+impl Shuffle<[u32; 8]> for i32 { -+ type Output = crate::codegen::i32x8; -+} -+impl Shuffle<[u32; 16]> for i32 { -+ type Output = crate::codegen::i32x16; -+} -+ -+impl Shuffle<[u32; 2]> for u32 { -+ type Output = crate::codegen::u32x2; -+} -+impl Shuffle<[u32; 4]> for u32 { -+ type Output = crate::codegen::u32x4; -+} -+impl Shuffle<[u32; 8]> for u32 { -+ type Output = crate::codegen::u32x8; -+} -+impl Shuffle<[u32; 16]> for u32 { -+ type Output = crate::codegen::u32x16; -+} -+ -+impl Shuffle<[u32; 2]> for f32 { -+ type Output = crate::codegen::f32x2; -+} -+impl Shuffle<[u32; 4]> for f32 { -+ type Output = crate::codegen::f32x4; -+} -+impl Shuffle<[u32; 8]> for f32 { -+ type Output = crate::codegen::f32x8; -+} -+impl Shuffle<[u32; 16]> for f32 { -+ type Output = crate::codegen::f32x16; -+} -+ -+impl Shuffle<[u32; 2]> for m32 { -+ type Output = crate::codegen::m32x2; -+} -+impl Shuffle<[u32; 4]> for m32 { -+ type Output = crate::codegen::m32x4; -+} -+impl Shuffle<[u32; 8]> for m32 { -+ type Output = crate::codegen::m32x8; -+} -+impl Shuffle<[u32; 16]> for m32 { -+ type Output = crate::codegen::m32x16; -+} -+ -+/* FIXME: 64-bit single element vector -+impl Shuffle<[u32; 1]> for i64 { -+ type Output = crate::codegen::i64x1; -+} -+*/ -+impl Shuffle<[u32; 2]> for i64 { -+ type Output = crate::codegen::i64x2; -+} -+impl Shuffle<[u32; 4]> for i64 { -+ type Output = crate::codegen::i64x4; -+} -+impl Shuffle<[u32; 8]> for i64 { -+ type Output = crate::codegen::i64x8; -+} -+ -+/* FIXME: 64-bit single element vector -+impl Shuffle<[u32; 1]> for u64 { -+ type Output = crate::codegen::u64x1; -+} -+*/ -+impl Shuffle<[u32; 2]> for u64 { -+ type Output = crate::codegen::u64x2; -+} -+impl Shuffle<[u32; 4]> for u64 { -+ type Output = crate::codegen::u64x4; -+} -+impl Shuffle<[u32; 8]> for u64 { -+ type Output = crate::codegen::u64x8; -+} -+ -+/* FIXME: 64-bit single element vector -+impl Shuffle<[u32; 1]> for f64 { -+ type Output = crate::codegen::f64x1; -+} -+*/ -+impl Shuffle<[u32; 2]> for f64 { -+ type Output = crate::codegen::f64x2; -+} -+impl Shuffle<[u32; 4]> for f64 { -+ type Output = crate::codegen::f64x4; -+} -+impl Shuffle<[u32; 8]> for f64 { -+ type Output = crate::codegen::f64x8; -+} -+ -+/* FIXME: 64-bit single element vector -+impl Shuffle<[u32; 1]> for m64 { -+ type Output = crate::codegen::m64x1; -+} -+*/ -+impl Shuffle<[u32; 2]> for m64 { -+ type Output = crate::codegen::m64x2; -+} -+impl Shuffle<[u32; 4]> for m64 { -+ type Output = crate::codegen::m64x4; -+} -+impl Shuffle<[u32; 8]> for m64 { -+ type Output = crate::codegen::m64x8; -+} -+ -+impl Shuffle<[u32; 2]> for isize { -+ type Output = crate::codegen::isizex2; -+} -+impl Shuffle<[u32; 4]> for isize { -+ type Output = crate::codegen::isizex4; -+} -+impl Shuffle<[u32; 8]> for isize { -+ type Output = crate::codegen::isizex8; -+} -+ -+impl Shuffle<[u32; 2]> for usize { -+ type Output = crate::codegen::usizex2; -+} -+impl Shuffle<[u32; 4]> for usize { -+ type Output = crate::codegen::usizex4; -+} -+impl Shuffle<[u32; 8]> for usize { -+ type Output = crate::codegen::usizex8; -+} -+ -+impl Shuffle<[u32; 2]> for *const T { -+ type Output = crate::codegen::cptrx2; -+} -+impl Shuffle<[u32; 4]> for *const T { -+ type Output = crate::codegen::cptrx4; -+} -+impl Shuffle<[u32; 8]> for *const T { -+ type Output = crate::codegen::cptrx8; -+} -+ -+impl Shuffle<[u32; 2]> for *mut T { -+ type Output = crate::codegen::mptrx2; -+} -+impl Shuffle<[u32; 4]> for *mut T { -+ type Output = crate::codegen::mptrx4; -+} -+impl Shuffle<[u32; 8]> for *mut T { -+ type Output = crate::codegen::mptrx8; -+} -+ -+impl Shuffle<[u32; 2]> for msize { -+ type Output = crate::codegen::msizex2; -+} -+impl Shuffle<[u32; 4]> for msize { -+ type Output = crate::codegen::msizex4; -+} -+impl Shuffle<[u32; 8]> for msize { -+ type Output = crate::codegen::msizex8; -+} -+ -+impl Shuffle<[u32; 1]> for i128 { -+ type Output = crate::codegen::i128x1; -+} -+impl Shuffle<[u32; 2]> for i128 { -+ type Output = crate::codegen::i128x2; -+} -+impl Shuffle<[u32; 4]> for i128 { -+ type Output = crate::codegen::i128x4; -+} -+ -+impl Shuffle<[u32; 1]> for u128 { -+ type Output = crate::codegen::u128x1; -+} -+impl Shuffle<[u32; 2]> for u128 { -+ type Output = crate::codegen::u128x2; -+} -+impl Shuffle<[u32; 4]> for u128 { -+ type Output = crate::codegen::u128x4; -+} -+ -+impl Shuffle<[u32; 1]> for m128 { -+ type Output = crate::codegen::m128x1; -+} -+impl Shuffle<[u32; 2]> for m128 { -+ type Output = crate::codegen::m128x2; -+} -+impl Shuffle<[u32; 4]> for m128 { -+ type Output = crate::codegen::m128x4; -+} -diff --git a/third_party/rust/packed_simd/src/codegen/shuffle1_dyn.rs b/third_party/rust/packed_simd/src/codegen/shuffle1_dyn.rs -new file mode 100644 -index 000000000000..1e9f5816371a ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/shuffle1_dyn.rs -@@ -0,0 +1,432 @@ -+//! Shuffle vector lanes with run-time indices. -+ -+use crate::*; -+ -+pub trait Shuffle1Dyn { -+ type Indices; -+ fn shuffle1_dyn(self, _: Self::Indices) -> Self; -+} -+ -+// Fallback implementation -+macro_rules! impl_fallback { -+ ($id:ident) => { -+ impl Shuffle1Dyn for $id { -+ type Indices = Self; -+ #[inline] -+ fn shuffle1_dyn(self, indices: Self::Indices) -> Self { -+ let mut result = Self::splat(0); -+ for i in 0..$id::lanes() { -+ result = result -+ .replace(i, self.extract(indices.extract(i) as usize)); -+ } -+ result -+ } -+ } -+ }; -+} -+ -+macro_rules! impl_shuffle1_dyn { -+ (u8x8) => { -+ cfg_if! { -+ if #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), -+ target_feature = "ssse3"))] { -+ impl Shuffle1Dyn for u8x8 { -+ type Indices = Self; -+ #[inline] -+ fn shuffle1_dyn(self, indices: Self::Indices) -> Self { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::_mm_shuffle_pi8; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::_mm_shuffle_pi8; -+ -+ unsafe { -+ crate::mem::transmute( -+ _mm_shuffle_pi8( -+ crate::mem::transmute(self.0), -+ crate::mem::transmute(indices.0) -+ ) -+ ) -+ } -+ } -+ } -+ } else if #[cfg(all( -+ any( -+ all(target_aarch = "aarch64", target_feature = "neon"), -+ all(target_aarch = "arm", target_feature = "v7", -+ target_feature = "neon") -+ ), -+ any(feature = "core_arch", libcore_neon) -+ ) -+ )] { -+ impl Shuffle1Dyn for u8x8 { -+ type Indices = Self; -+ #[inline] -+ fn shuffle1_dyn(self, indices: Self::Indices) -> Self { -+ #[cfg(targt_arch = "aarch64")] -+ use crate::arch::aarch64::vtbl1_u8; -+ #[cfg(targt_arch = "arm")] -+ use crate::arch::arm::vtbl1_u8; -+ -+ // This is safe because the binary is compiled with -+ // neon enabled at compile-time and can therefore only -+ // run on CPUs that have it enabled. -+ unsafe { -+ Simd(mem::transmute( -+ vtbl1_u8(mem::transmute(self.0), -+ crate::mem::transmute(indices.0)) -+ )) -+ } -+ } -+ } -+ } else { -+ impl_fallback!(u8x8); -+ } -+ } -+ }; -+ (u8x16) => { -+ cfg_if! { -+ if #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), -+ target_feature = "ssse3"))] { -+ impl Shuffle1Dyn for u8x16 { -+ type Indices = Self; -+ #[inline] -+ fn shuffle1_dyn(self, indices: Self::Indices) -> Self { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::_mm_shuffle_epi8; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::_mm_shuffle_epi8; -+ // This is safe because the binary is compiled with -+ // ssse3 enabled at compile-time and can therefore only -+ // run on CPUs that have it enabled. -+ unsafe { -+ Simd(mem::transmute( -+ _mm_shuffle_epi8(mem::transmute(self.0), -+ crate::mem::transmute(indices)) -+ )) -+ } -+ } -+ } -+ } else if #[cfg(all(target_aarch = "aarch64", target_feature = "neon", -+ any(feature = "core_arch", libcore_neon)))] { -+ impl Shuffle1Dyn for u8x16 { -+ type Indices = Self; -+ #[inline] -+ fn shuffle1_dyn(self, indices: Self::Indices) -> Self { -+ use crate::arch::aarch64::vqtbl1q_u8; -+ -+ // This is safe because the binary is compiled with -+ // neon enabled at compile-time and can therefore only -+ // run on CPUs that have it enabled. -+ unsafe { -+ Simd(mem::transmute( -+ vqtbl1q_u8(mem::transmute(self.0), -+ crate::mem::transmute(indices.0)) -+ )) -+ } -+ } -+ } -+ } else if #[cfg(all(target_aarch = "arm", target_feature = "v7", -+ target_feature = "neon", -+ any(feature = "core_arch", libcore_neon)))] { -+ impl Shuffle1Dyn for u8x16 { -+ type Indices = Self; -+ #[inline] -+ fn shuffle1_dyn(self, indices: Self::Indices) -> Self { -+ use crate::arch::arm::vtbl2_u8; -+ -+ // This is safe because the binary is compiled with -+ // neon enabled at compile-time and can therefore only -+ // run on CPUs that have it enabled. -+ unsafe { -+ union U { -+ j: u8x16, -+ s: (u8x8, u8x8), -+ } -+ -+ let (i0, i1) = U { j: y }.s; -+ -+ let r0 = vtbl2_u8( -+ mem::transmute(x), -+ crate::mem::transmute(i0) -+ ); -+ let r1 = vtbl2_u8( -+ mem::transmute(x), -+ crate::mem::transmute(i1) -+ ); -+ -+ let r = U { s: (r0, r1) }.j; -+ -+ Simd(mem::transmute(r)) -+ } -+ } -+ } -+ } else { -+ impl_fallback!(u8x16); -+ } -+ } -+ }; -+ (u16x8) => { -+ impl Shuffle1Dyn for u16x8 { -+ type Indices = Self; -+ #[inline] -+ fn shuffle1_dyn(self, indices: Self::Indices) -> Self { -+ let indices: u8x8 = (indices * 2).cast(); -+ let indices: u8x16 = shuffle!( -+ indices, [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7] -+ ); -+ let v = u8x16::new( -+ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 -+ ); -+ let indices = indices + v; -+ unsafe { -+ let s: u8x16 =crate::mem::transmute(self); -+ crate::mem::transmute(s.shuffle1_dyn(indices)) -+ } -+ } -+ } -+ }; -+ (u32x4) => { -+ cfg_if! { -+ if #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), -+ target_feature = "avx"))] { -+ impl Shuffle1Dyn for u32x4 { -+ type Indices = Self; -+ #[inline] -+ fn shuffle1_dyn(self, indices: Self::Indices) -> Self { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::{_mm_permutevar_ps}; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::{_mm_permutevar_ps}; -+ -+ unsafe { -+ crate::mem::transmute( -+ _mm_permutevar_ps( -+ crate::mem::transmute(self.0), -+ crate::mem::transmute(indices.0) -+ ) -+ ) -+ } -+ } -+ } -+ } else { -+ impl Shuffle1Dyn for u32x4 { -+ type Indices = Self; -+ #[inline] -+ fn shuffle1_dyn(self, indices: Self::Indices) -> Self { -+ let indices: u8x4 = (indices * 4).cast(); -+ let indices: u8x16 = shuffle!( -+ indices, -+ [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3] -+ ); -+ let v = u8x16::new( -+ 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3 -+ ); -+ let indices = indices + v; -+ unsafe { -+ let s: u8x16 =crate::mem::transmute(self); -+ crate::mem::transmute(s.shuffle1_dyn(indices)) -+ } -+ } -+ } -+ } -+ } -+ }; -+ (u64x2) => { -+ cfg_if! { -+ if #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), -+ target_feature = "avx"))] { -+ impl Shuffle1Dyn for u64x2 { -+ type Indices = Self; -+ #[inline] -+ fn shuffle1_dyn(self, indices: Self::Indices) -> Self { -+ #[cfg(target_arch = "x86")] -+ use crate::arch::x86::{_mm_permutevar_pd}; -+ #[cfg(target_arch = "x86_64")] -+ use crate::arch::x86_64::{_mm_permutevar_pd}; -+ // _mm_permutevar_pd uses the _second_ bit of each -+ // element to perform the selection, that is: 0b00 => 0, -+ // 0b10 => 1: -+ let indices = indices << 1; -+ unsafe { -+ crate::mem::transmute( -+ _mm_permutevar_pd( -+ crate::mem::transmute(self), -+ crate::mem::transmute(indices) -+ ) -+ ) -+ } -+ } -+ } -+ } else { -+ impl Shuffle1Dyn for u64x2 { -+ type Indices = Self; -+ #[inline] -+ fn shuffle1_dyn(self, indices: Self::Indices) -> Self { -+ let indices: u8x2 = (indices * 8).cast(); -+ let indices: u8x16 = shuffle!( -+ indices, -+ [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1] -+ ); -+ let v = u8x16::new( -+ 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7 -+ ); -+ let indices = indices + v; -+ unsafe { -+ let s: u8x16 =crate::mem::transmute(self); -+ crate::mem::transmute(s.shuffle1_dyn(indices)) -+ } -+ } -+ } -+ } -+ } -+ }; -+ (u128x1) => { -+ impl Shuffle1Dyn for u128x1 { -+ type Indices = Self; -+ #[inline] -+ fn shuffle1_dyn(self, _indices: Self::Indices) -> Self { -+ self -+ } -+ } -+ }; -+ ($id:ident) => { impl_fallback!($id); } -+} -+ -+impl_shuffle1_dyn!(u8x2); -+impl_shuffle1_dyn!(u8x4); -+impl_shuffle1_dyn!(u8x8); -+impl_shuffle1_dyn!(u8x16); -+impl_shuffle1_dyn!(u8x32); -+impl_shuffle1_dyn!(u8x64); -+ -+impl_shuffle1_dyn!(u16x2); -+impl_shuffle1_dyn!(u16x4); -+impl_shuffle1_dyn!(u16x8); -+impl_shuffle1_dyn!(u16x16); -+impl_shuffle1_dyn!(u16x32); -+ -+impl_shuffle1_dyn!(u32x2); -+impl_shuffle1_dyn!(u32x4); -+impl_shuffle1_dyn!(u32x8); -+impl_shuffle1_dyn!(u32x16); -+ -+impl_shuffle1_dyn!(u64x2); -+impl_shuffle1_dyn!(u64x4); -+impl_shuffle1_dyn!(u64x8); -+ -+impl_shuffle1_dyn!(usizex2); -+impl_shuffle1_dyn!(usizex4); -+impl_shuffle1_dyn!(usizex8); -+ -+impl_shuffle1_dyn!(u128x1); -+impl_shuffle1_dyn!(u128x2); -+impl_shuffle1_dyn!(u128x4); -+ -+// Implementation for non-unsigned vector types -+macro_rules! impl_shuffle1_dyn_non_u { -+ ($id:ident, $uid:ident) => { -+ impl Shuffle1Dyn for $id { -+ type Indices = $uid; -+ #[inline] -+ fn shuffle1_dyn(self, indices: Self::Indices) -> Self { -+ unsafe { -+ let u: $uid = crate::mem::transmute(self); -+ crate::mem::transmute(u.shuffle1_dyn(indices)) -+ } -+ } -+ } -+ }; -+} -+ -+impl_shuffle1_dyn_non_u!(i8x2, u8x2); -+impl_shuffle1_dyn_non_u!(i8x4, u8x4); -+impl_shuffle1_dyn_non_u!(i8x8, u8x8); -+impl_shuffle1_dyn_non_u!(i8x16, u8x16); -+impl_shuffle1_dyn_non_u!(i8x32, u8x32); -+impl_shuffle1_dyn_non_u!(i8x64, u8x64); -+ -+impl_shuffle1_dyn_non_u!(i16x2, u16x2); -+impl_shuffle1_dyn_non_u!(i16x4, u16x4); -+impl_shuffle1_dyn_non_u!(i16x8, u16x8); -+impl_shuffle1_dyn_non_u!(i16x16, u16x16); -+impl_shuffle1_dyn_non_u!(i16x32, u16x32); -+ -+impl_shuffle1_dyn_non_u!(i32x2, u32x2); -+impl_shuffle1_dyn_non_u!(i32x4, u32x4); -+impl_shuffle1_dyn_non_u!(i32x8, u32x8); -+impl_shuffle1_dyn_non_u!(i32x16, u32x16); -+ -+impl_shuffle1_dyn_non_u!(i64x2, u64x2); -+impl_shuffle1_dyn_non_u!(i64x4, u64x4); -+impl_shuffle1_dyn_non_u!(i64x8, u64x8); -+ -+impl_shuffle1_dyn_non_u!(isizex2, usizex2); -+impl_shuffle1_dyn_non_u!(isizex4, usizex4); -+impl_shuffle1_dyn_non_u!(isizex8, usizex8); -+ -+impl_shuffle1_dyn_non_u!(i128x1, u128x1); -+impl_shuffle1_dyn_non_u!(i128x2, u128x2); -+impl_shuffle1_dyn_non_u!(i128x4, u128x4); -+ -+impl_shuffle1_dyn_non_u!(m8x2, u8x2); -+impl_shuffle1_dyn_non_u!(m8x4, u8x4); -+impl_shuffle1_dyn_non_u!(m8x8, u8x8); -+impl_shuffle1_dyn_non_u!(m8x16, u8x16); -+impl_shuffle1_dyn_non_u!(m8x32, u8x32); -+impl_shuffle1_dyn_non_u!(m8x64, u8x64); -+ -+impl_shuffle1_dyn_non_u!(m16x2, u16x2); -+impl_shuffle1_dyn_non_u!(m16x4, u16x4); -+impl_shuffle1_dyn_non_u!(m16x8, u16x8); -+impl_shuffle1_dyn_non_u!(m16x16, u16x16); -+impl_shuffle1_dyn_non_u!(m16x32, u16x32); -+ -+impl_shuffle1_dyn_non_u!(m32x2, u32x2); -+impl_shuffle1_dyn_non_u!(m32x4, u32x4); -+impl_shuffle1_dyn_non_u!(m32x8, u32x8); -+impl_shuffle1_dyn_non_u!(m32x16, u32x16); -+ -+impl_shuffle1_dyn_non_u!(m64x2, u64x2); -+impl_shuffle1_dyn_non_u!(m64x4, u64x4); -+impl_shuffle1_dyn_non_u!(m64x8, u64x8); -+ -+impl_shuffle1_dyn_non_u!(msizex2, usizex2); -+impl_shuffle1_dyn_non_u!(msizex4, usizex4); -+impl_shuffle1_dyn_non_u!(msizex8, usizex8); -+ -+impl_shuffle1_dyn_non_u!(m128x1, u128x1); -+impl_shuffle1_dyn_non_u!(m128x2, u128x2); -+impl_shuffle1_dyn_non_u!(m128x4, u128x4); -+ -+impl_shuffle1_dyn_non_u!(f32x2, u32x2); -+impl_shuffle1_dyn_non_u!(f32x4, u32x4); -+impl_shuffle1_dyn_non_u!(f32x8, u32x8); -+impl_shuffle1_dyn_non_u!(f32x16, u32x16); -+ -+impl_shuffle1_dyn_non_u!(f64x2, u64x2); -+impl_shuffle1_dyn_non_u!(f64x4, u64x4); -+impl_shuffle1_dyn_non_u!(f64x8, u64x8); -+ -+// Implementation for non-unsigned vector types -+macro_rules! impl_shuffle1_dyn_ptr { -+ ($id:ident, $uid:ident) => { -+ impl Shuffle1Dyn for $id { -+ type Indices = $uid; -+ #[inline] -+ fn shuffle1_dyn(self, indices: Self::Indices) -> Self { -+ unsafe { -+ let u: $uid = crate::mem::transmute(self); -+ crate::mem::transmute(u.shuffle1_dyn(indices)) -+ } -+ } -+ } -+ }; -+} -+ -+impl_shuffle1_dyn_ptr!(cptrx2, usizex2); -+impl_shuffle1_dyn_ptr!(cptrx4, usizex4); -+impl_shuffle1_dyn_ptr!(cptrx8, usizex8); -+ -+impl_shuffle1_dyn_ptr!(mptrx2, usizex2); -+impl_shuffle1_dyn_ptr!(mptrx4, usizex4); -+impl_shuffle1_dyn_ptr!(mptrx8, usizex8); -diff --git a/third_party/rust/packed_simd/src/codegen/swap_bytes.rs b/third_party/rust/packed_simd/src/codegen/swap_bytes.rs -new file mode 100644 -index 000000000000..b435fb5da120 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/swap_bytes.rs -@@ -0,0 +1,189 @@ -+//! Horizontal swap bytes reductions. -+ -+// FIXME: investigate using `llvm.bswap` -+// https://github.com/rust-lang-nursery/packed_simd/issues/19 -+ -+use crate::*; -+ -+crate trait SwapBytes { -+ fn swap_bytes(self) -> Self; -+} -+ -+macro_rules! impl_swap_bytes { -+ (v16: $($id:ident,)+) => { -+ $( -+ impl SwapBytes for $id { -+ #[inline] -+ fn swap_bytes(self) -> Self { -+ unsafe { shuffle!(self, [1, 0]) } -+ } -+ } -+ )+ -+ }; -+ (v32: $($id:ident,)+) => { -+ $( -+ impl SwapBytes for $id { -+ #[inline] -+ #[allow(clippy::useless_transmute)] -+ fn swap_bytes(self) -> Self { -+ unsafe { -+ let bytes: u8x4 = crate::mem::transmute(self); -+ let result: u8x4 = shuffle!(bytes, [3, 2, 1, 0]); -+ crate::mem::transmute(result) -+ } -+ } -+ } -+ )+ -+ }; -+ (v64: $($id:ident,)+) => { -+ $( -+ impl SwapBytes for $id { -+ #[inline] -+ #[allow(clippy::useless_transmute)] -+ fn swap_bytes(self) -> Self { -+ unsafe { -+ let bytes: u8x8 = crate::mem::transmute(self); -+ let result: u8x8 = shuffle!( -+ bytes, [7, 6, 5, 4, 3, 2, 1, 0] -+ ); -+ crate::mem::transmute(result) -+ } -+ } -+ } -+ )+ -+ }; -+ (v128: $($id:ident,)+) => { -+ $( -+ impl SwapBytes for $id { -+ #[inline] -+ #[allow(clippy::useless_transmute)] -+ fn swap_bytes(self) -> Self { -+ unsafe { -+ let bytes: u8x16 = crate::mem::transmute(self); -+ let result: u8x16 = shuffle!(bytes, [ -+ 15, 14, 13, 12, 11, 10, 9, 8, -+ 7, 6, 5, 4, 3, 2, 1, 0 -+ ]); -+ crate::mem::transmute(result) -+ } -+ } -+ } -+ )+ -+ }; -+ (v256: $($id:ident,)+) => { -+ $( -+ impl SwapBytes for $id { -+ #[inline] -+ #[allow(clippy::useless_transmute)] -+ fn swap_bytes(self) -> Self { -+ unsafe { -+ let bytes: u8x32 = crate::mem::transmute(self); -+ let result: u8x32 = shuffle!(bytes, [ -+ 31, 30, 29, 28, 27, 26, 25, 24, -+ 23, 22, 21, 20, 19, 18, 17, 16, -+ 15, 14, 13, 12, 11, 10, 9, 8, -+ 7, 6, 5, 4, 3, 2, 1, 0 -+ ]); -+ crate::mem::transmute(result) -+ } -+ } -+ } -+ )+ -+ }; -+ (v512: $($id:ident,)+) => { -+ $( -+ impl SwapBytes for $id { -+ #[inline] -+ #[allow(clippy::useless_transmute)] -+ fn swap_bytes(self) -> Self { -+ unsafe { -+ let bytes: u8x64 = crate::mem::transmute(self); -+ let result: u8x64 = shuffle!(bytes, [ -+ 63, 62, 61, 60, 59, 58, 57, 56, -+ 55, 54, 53, 52, 51, 50, 49, 48, -+ 47, 46, 45, 44, 43, 42, 41, 40, -+ 39, 38, 37, 36, 35, 34, 33, 32, -+ 31, 30, 29, 28, 27, 26, 25, 24, -+ 23, 22, 21, 20, 19, 18, 17, 16, -+ 15, 14, 13, 12, 11, 10, 9, 8, -+ 7, 6, 5, 4, 3, 2, 1, 0 -+ ]); -+ crate::mem::transmute(result) -+ } -+ } -+ } -+ )+ -+ }; -+} -+ -+impl_swap_bytes!(v16: u8x2, i8x2,); -+impl_swap_bytes!(v32: u8x4, i8x4, u16x2, i16x2,); -+// FIXME: 64-bit single element vector -+impl_swap_bytes!( -+ v64: u8x8, -+ i8x8, -+ u16x4, -+ i16x4, -+ u32x2, -+ i32x2, /* u64x1, i64x1, */ -+); -+ -+impl_swap_bytes!( -+ v128: u8x16, -+ i8x16, -+ u16x8, -+ i16x8, -+ u32x4, -+ i32x4, -+ u64x2, -+ i64x2, -+ u128x1, -+ i128x1, -+); -+impl_swap_bytes!( -+ v256: u8x32, -+ i8x32, -+ u16x16, -+ i16x16, -+ u32x8, -+ i32x8, -+ u64x4, -+ i64x4, -+ u128x2, -+ i128x2, -+); -+ -+impl_swap_bytes!( -+ v512: u8x64, -+ i8x64, -+ u16x32, -+ i16x32, -+ u32x16, -+ i32x16, -+ u64x8, -+ i64x8, -+ u128x4, -+ i128x4, -+); -+ -+cfg_if! { -+ if #[cfg(target_pointer_width = "8")] { -+ impl_swap_bytes!(v16: isizex2, usizex2,); -+ impl_swap_bytes!(v32: isizex4, usizex4,); -+ impl_swap_bytes!(v64: isizex8, usizex8,); -+ } else if #[cfg(target_pointer_width = "16")] { -+ impl_swap_bytes!(v32: isizex2, usizex2,); -+ impl_swap_bytes!(v64: isizex4, usizex4,); -+ impl_swap_bytes!(v128: isizex8, usizex8,); -+ } else if #[cfg(target_pointer_width = "32")] { -+ impl_swap_bytes!(v64: isizex2, usizex2,); -+ impl_swap_bytes!(v128: isizex4, usizex4,); -+ impl_swap_bytes!(v256: isizex8, usizex8,); -+ } else if #[cfg(target_pointer_width = "64")] { -+ impl_swap_bytes!(v128: isizex2, usizex2,); -+ impl_swap_bytes!(v256: isizex4, usizex4,); -+ impl_swap_bytes!(v512: isizex8, usizex8,); -+ } else { -+ compile_error!("unsupported target_pointer_width"); -+ } -+} -diff --git a/third_party/rust/packed_simd/src/codegen/v128.rs b/third_party/rust/packed_simd/src/codegen/v128.rs -new file mode 100644 -index 000000000000..9506424fadad ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/v128.rs -@@ -0,0 +1,46 @@ -+//! Internal 128-bit wide vector types -+ -+use crate::masks::*; -+ -+#[rustfmt::skip] -+impl_simd_array!( -+ [i8; 16]: i8x16 | -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8 -+); -+#[rustfmt::skip] -+impl_simd_array!( -+ [u8; 16]: u8x16 | -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8 -+); -+#[rustfmt::skip] -+impl_simd_array!( -+ [m8; 16]: m8x16 | -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8 -+); -+ -+impl_simd_array!([i16; 8]: i16x8 | i16, i16, i16, i16, i16, i16, i16, i16); -+impl_simd_array!([u16; 8]: u16x8 | u16, u16, u16, u16, u16, u16, u16, u16); -+impl_simd_array!([m16; 8]: m16x8 | i16, i16, i16, i16, i16, i16, i16, i16); -+ -+impl_simd_array!([i32; 4]: i32x4 | i32, i32, i32, i32); -+impl_simd_array!([u32; 4]: u32x4 | u32, u32, u32, u32); -+impl_simd_array!([f32; 4]: f32x4 | f32, f32, f32, f32); -+impl_simd_array!([m32; 4]: m32x4 | i32, i32, i32, i32); -+ -+impl_simd_array!([i64; 2]: i64x2 | i64, i64); -+impl_simd_array!([u64; 2]: u64x2 | u64, u64); -+impl_simd_array!([f64; 2]: f64x2 | f64, f64); -+impl_simd_array!([m64; 2]: m64x2 | i64, i64); -+ -+impl_simd_array!([i128; 1]: i128x1 | i128); -+impl_simd_array!([u128; 1]: u128x1 | u128); -+impl_simd_array!([m128; 1]: m128x1 | i128); -diff --git a/third_party/rust/packed_simd/src/codegen/v16.rs b/third_party/rust/packed_simd/src/codegen/v16.rs -new file mode 100644 -index 000000000000..4d55a6d8998e ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/v16.rs -@@ -0,0 +1,7 @@ -+//! Internal 16-bit wide vector types -+ -+use crate::masks::*; -+ -+impl_simd_array!([i8; 2]: i8x2 | i8, i8); -+impl_simd_array!([u8; 2]: u8x2 | u8, u8); -+impl_simd_array!([m8; 2]: m8x2 | i8, i8); -diff --git a/third_party/rust/packed_simd/src/codegen/v256.rs b/third_party/rust/packed_simd/src/codegen/v256.rs -new file mode 100644 -index 000000000000..5ca4759f0c0a ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/v256.rs -@@ -0,0 +1,78 @@ -+//! Internal 256-bit wide vector types -+ -+use crate::masks::*; -+ -+#[rustfmt::skip] -+impl_simd_array!( -+ [i8; 32]: i8x32 | -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8 -+); -+#[rustfmt::skip] -+impl_simd_array!( -+ [u8; 32]: u8x32 | -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8 -+); -+#[rustfmt::skip] -+impl_simd_array!( -+ [m8; 32]: m8x32 | -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8 -+); -+#[rustfmt::skip] -+impl_simd_array!( -+ [i16; 16]: i16x16 | -+ i16, i16, i16, i16, -+ i16, i16, i16, i16, -+ i16, i16, i16, i16, -+ i16, i16, i16, i16 -+); -+#[rustfmt::skip] -+impl_simd_array!( -+ [u16; 16]: u16x16 | -+ u16, u16, u16, u16, -+ u16, u16, u16, u16, -+ u16, u16, u16, u16, -+ u16, u16, u16, u16 -+); -+#[rustfmt::skip] -+impl_simd_array!( -+ [m16; 16]: m16x16 | -+ i16, i16, i16, i16, -+ i16, i16, i16, i16, -+ i16, i16, i16, i16, -+ i16, i16, i16, i16 -+); -+ -+impl_simd_array!([i32; 8]: i32x8 | i32, i32, i32, i32, i32, i32, i32, i32); -+impl_simd_array!([u32; 8]: u32x8 | u32, u32, u32, u32, u32, u32, u32, u32); -+impl_simd_array!([f32; 8]: f32x8 | f32, f32, f32, f32, f32, f32, f32, f32); -+impl_simd_array!([m32; 8]: m32x8 | i32, i32, i32, i32, i32, i32, i32, i32); -+ -+impl_simd_array!([i64; 4]: i64x4 | i64, i64, i64, i64); -+impl_simd_array!([u64; 4]: u64x4 | u64, u64, u64, u64); -+impl_simd_array!([f64; 4]: f64x4 | f64, f64, f64, f64); -+impl_simd_array!([m64; 4]: m64x4 | i64, i64, i64, i64); -+ -+impl_simd_array!([i128; 2]: i128x2 | i128, i128); -+impl_simd_array!([u128; 2]: u128x2 | u128, u128); -+impl_simd_array!([m128; 2]: m128x2 | i128, i128); -diff --git a/third_party/rust/packed_simd/src/codegen/v32.rs b/third_party/rust/packed_simd/src/codegen/v32.rs -new file mode 100644 -index 000000000000..ae1dabd00c22 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/v32.rs -@@ -0,0 +1,11 @@ -+//! Internal 32-bit wide vector types -+ -+use crate::masks::*; -+ -+impl_simd_array!([i8; 4]: i8x4 | i8, i8, i8, i8); -+impl_simd_array!([u8; 4]: u8x4 | u8, u8, u8, u8); -+impl_simd_array!([m8; 4]: m8x4 | i8, i8, i8, i8); -+ -+impl_simd_array!([i16; 2]: i16x2 | i16, i16); -+impl_simd_array!([u16; 2]: u16x2 | u16, u16); -+impl_simd_array!([m16; 2]: m16x2 | i16, i16); -diff --git a/third_party/rust/packed_simd/src/codegen/v512.rs b/third_party/rust/packed_simd/src/codegen/v512.rs -new file mode 100644 -index 000000000000..bf95110340d6 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/v512.rs -@@ -0,0 +1,145 @@ -+//! Internal 512-bit wide vector types -+ -+use crate::masks::*; -+ -+#[rustfmt::skip] -+impl_simd_array!( -+ [i8; 64]: i8x64 | -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8 -+); -+#[rustfmt::skip] -+impl_simd_array!( -+ [u8; 64]: u8x64 | -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8, -+ u8, u8, u8, u8 -+); -+#[rustfmt::skip] -+impl_simd_array!( -+ [m8; 64]: m8x64 | -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8, -+ i8, i8, i8, i8 -+); -+#[rustfmt::skip] -+impl_simd_array!( -+ [i16; 32]: i16x32 | -+ i16, i16, i16, i16, -+ i16, i16, i16, i16, -+ i16, i16, i16, i16, -+ i16, i16, i16, i16, -+ i16, i16, i16, i16, -+ i16, i16, i16, i16, -+ i16, i16, i16, i16, -+ i16, i16, i16, i16 -+); -+#[rustfmt::skip] -+impl_simd_array!( -+ [u16; 32]: u16x32 | -+ u16, u16, u16, u16, -+ u16, u16, u16, u16, -+ u16, u16, u16, u16, -+ u16, u16, u16, u16, -+ u16, u16, u16, u16, -+ u16, u16, u16, u16, -+ u16, u16, u16, u16, -+ u16, u16, u16, u16 -+); -+#[rustfmt::skip] -+impl_simd_array!( -+ [m16; 32]: m16x32 | -+ i16, i16, i16, i16, -+ i16, i16, i16, i16, -+ i16, i16, i16, i16, -+ i16, i16, i16, i16, -+ i16, i16, i16, i16, -+ i16, i16, i16, i16, -+ i16, i16, i16, i16, -+ i16, i16, i16, i16 -+); -+ -+#[rustfmt::skip] -+impl_simd_array!( -+ [i32; 16]: i32x16 | -+ i32, i32, i32, i32, -+ i32, i32, i32, i32, -+ i32, i32, i32, i32, -+ i32, i32, i32, i32 -+); -+#[rustfmt::skip] -+impl_simd_array!( -+ [u32; 16]: u32x16 | -+ u32, u32, u32, u32, -+ u32, u32, u32, u32, -+ u32, u32, u32, u32, -+ u32, u32, u32, u32 -+); -+#[rustfmt::skip] -+impl_simd_array!( -+ [f32; 16]: f32x16 | -+ f32, f32, f32, f32, -+ f32, f32, f32, f32, -+ f32, f32, f32, f32, -+ f32, f32, f32, f32 -+); -+#[rustfmt::skip] -+impl_simd_array!( -+ [m32; 16]: m32x16 | -+ i32, i32, i32, i32, -+ i32, i32, i32, i32, -+ i32, i32, i32, i32, -+ i32, i32, i32, i32 -+); -+ -+impl_simd_array!([i64; 8]: i64x8 | i64, i64, i64, i64, i64, i64, i64, i64); -+impl_simd_array!([u64; 8]: u64x8 | u64, u64, u64, u64, u64, u64, u64, u64); -+impl_simd_array!([f64; 8]: f64x8 | f64, f64, f64, f64, f64, f64, f64, f64); -+impl_simd_array!([m64; 8]: m64x8 | i64, i64, i64, i64, i64, i64, i64, i64); -+ -+impl_simd_array!([i128; 4]: i128x4 | i128, i128, i128, i128); -+impl_simd_array!([u128; 4]: u128x4 | u128, u128, u128, u128); -+impl_simd_array!([m128; 4]: m128x4 | i128, i128, i128, i128); -diff --git a/third_party/rust/packed_simd/src/codegen/v64.rs b/third_party/rust/packed_simd/src/codegen/v64.rs -new file mode 100644 -index 000000000000..3cfb67c1a013 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/v64.rs -@@ -0,0 +1,21 @@ -+//! Internal 64-bit wide vector types -+ -+use crate::masks::*; -+ -+impl_simd_array!([i8; 8]: i8x8 | i8, i8, i8, i8, i8, i8, i8, i8); -+impl_simd_array!([u8; 8]: u8x8 | u8, u8, u8, u8, u8, u8, u8, u8); -+impl_simd_array!([m8; 8]: m8x8 | i8, i8, i8, i8, i8, i8, i8, i8); -+ -+impl_simd_array!([i16; 4]: i16x4 | i16, i16, i16, i16); -+impl_simd_array!([u16; 4]: u16x4 | u16, u16, u16, u16); -+impl_simd_array!([m16; 4]: m16x4 | i16, i16, i16, i16); -+ -+impl_simd_array!([i32; 2]: i32x2 | i32, i32); -+impl_simd_array!([u32; 2]: u32x2 | u32, u32); -+impl_simd_array!([f32; 2]: f32x2 | f32, f32); -+impl_simd_array!([m32; 2]: m32x2 | i32, i32); -+ -+impl_simd_array!([i64; 1]: i64x1 | i64); -+impl_simd_array!([u64; 1]: u64x1 | u64); -+impl_simd_array!([f64; 1]: f64x1 | f64); -+impl_simd_array!([m64; 1]: m64x1 | i64); -diff --git a/third_party/rust/packed_simd/src/codegen/vPtr.rs b/third_party/rust/packed_simd/src/codegen/vPtr.rs -new file mode 100644 -index 000000000000..1f2bc7714dd9 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/vPtr.rs -@@ -0,0 +1,33 @@ -+//! Pointer vector types -+ -+macro_rules! impl_simd_ptr { -+ ([$ptr_ty:ty; $elem_count:expr]: $tuple_id:ident | $ty:ident -+ | $($tys:ty),*) => { -+ #[derive(Copy, Clone)] -+ #[repr(simd)] -+ pub struct $tuple_id<$ty>($(crate $tys),*); -+ //^^^^^^^ leaked through SimdArray -+ -+ impl<$ty> crate::sealed::SimdArray for [$ptr_ty; $elem_count] { -+ type Tuple = $tuple_id<$ptr_ty>; -+ type T = $ptr_ty; -+ const N: usize = $elem_count; -+ type NT = [u32; $elem_count]; -+ } -+ -+ impl<$ty> crate::sealed::Simd for $tuple_id<$ptr_ty> { -+ type Element = $ptr_ty; -+ const LANES: usize = $elem_count; -+ type LanesType = [u32; $elem_count]; -+ } -+ -+ } -+} -+ -+impl_simd_ptr!([*const T; 2]: cptrx2 | T | T, T); -+impl_simd_ptr!([*const T; 4]: cptrx4 | T | T, T, T, T); -+impl_simd_ptr!([*const T; 8]: cptrx8 | T | T, T, T, T, T, T, T, T); -+ -+impl_simd_ptr!([*mut T; 2]: mptrx2 | T | T, T); -+impl_simd_ptr!([*mut T; 4]: mptrx4 | T | T, T, T, T); -+impl_simd_ptr!([*mut T; 8]: mptrx8 | T | T, T, T, T, T, T, T, T); -diff --git a/third_party/rust/packed_simd/src/codegen/vSize.rs b/third_party/rust/packed_simd/src/codegen/vSize.rs -new file mode 100644 -index 000000000000..3911b21340c8 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/codegen/vSize.rs -@@ -0,0 +1,43 @@ -+//! Vector types with pointer-sized elements -+ -+use crate::codegen::pointer_sized_int::{isize_, usize_}; -+use crate::masks::*; -+ -+impl_simd_array!([isize; 2]: isizex2 | isize_, isize_); -+impl_simd_array!([usize; 2]: usizex2 | usize_, usize_); -+impl_simd_array!([msize; 2]: msizex2 | isize_, isize_); -+ -+impl_simd_array!([isize; 4]: isizex4 | isize_, isize_, isize_, isize_); -+impl_simd_array!([usize; 4]: usizex4 | usize_, usize_, usize_, usize_); -+impl_simd_array!([msize; 4]: msizex4 | isize_, isize_, isize_, isize_); -+ -+impl_simd_array!( -+ [isize; 8]: isizex8 | isize_, -+ isize_, -+ isize_, -+ isize_, -+ isize_, -+ isize_, -+ isize_, -+ isize_ -+); -+impl_simd_array!( -+ [usize; 8]: usizex8 | usize_, -+ usize_, -+ usize_, -+ usize_, -+ usize_, -+ usize_, -+ usize_, -+ usize_ -+); -+impl_simd_array!( -+ [msize; 8]: msizex8 | isize_, -+ isize_, -+ isize_, -+ isize_, -+ isize_, -+ isize_, -+ isize_, -+ isize_ -+); -diff --git a/third_party/rust/packed_simd/src/lib.rs b/third_party/rust/packed_simd/src/lib.rs -new file mode 100644 -index 000000000000..d73645e72fbe ---- /dev/null -+++ b/third_party/rust/packed_simd/src/lib.rs -@@ -0,0 +1,327 @@ -+//! # Portable packed SIMD vectors -+//! -+//! This crate is proposed for stabilization as `std::packed_simd` in [RFC2366: -+//! `std::simd`](https://github.com/rust-lang/rfcs/pull/2366) . -+//! -+//! The examples available in the -+//! [`examples/`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples) -+//! sub-directory of the crate showcase how to use the library in practice. -+//! -+//! ## Table of contents -+//! -+//! - [Introduction](#introduction) -+//! - [Vector types](#vector-types) -+//! - [Conditional operations](#conditional-operations) -+//! - [Conversions](#conversions) -+//! - [Performance -+//! guide](https://rust-lang-nursery.github.io/packed_simd/perf-guide/) -+//! -+//! ## Introduction -+//! -+//! This crate exports [`Simd<[T; N]>`][`Simd`]: a packed vector of `N` -+//! elements of type `T` as well as many type aliases for this type: for -+//! example, [`f32x4`], which is just an alias for `Simd<[f32; 4]>`. -+//! -+//! The operations on packed vectors are, by default, "vertical", that is, they -+//! are applied to each vector lane in isolation of the others: -+//! -+//! ``` -+//! # use packed_simd::*; -+//! let a = i32x4::new(1, 2, 3, 4); -+//! let b = i32x4::new(5, 6, 7, 8); -+//! assert_eq!(a + b, i32x4::new(6, 8, 10, 12)); -+//! ``` -+//! -+//! Many "horizontal" operations are also provided: -+//! -+//! ``` -+//! # use packed_simd::*; -+//! # let a = i32x4::new(1, 2, 3, 4); -+//! assert_eq!(a.wrapping_sum(), 10); -+//! ``` -+//! -+//! In virtually all architectures vertical operations are fast, while -+//! horizontal operations are, by comparison, much slower. That is, the -+//! most portably-efficient way of performing a reduction over a slice -+//! is to collect the results into a vector using vertical operations, -+//! and performing a single horizontal operation at the end: -+//! -+//! ``` -+//! # use packed_simd::*; -+//! fn reduce(x: &[i32]) -> i32 { -+//! assert!(x.len() % 4 == 0); -+//! let mut sum = i32x4::splat(0); // [0, 0, 0, 0] -+//! for i in (0..x.len()).step_by(4) { -+//! sum += i32x4::from_slice_unaligned(&x[i..]); -+//! } -+//! sum.wrapping_sum() -+//! } -+//! -+//! let x = [0, 1, 2, 3, 4, 5, 6, 7]; -+//! assert_eq!(reduce(&x), 28); -+//! ``` -+//! -+//! ## Vector types -+//! -+//! The vector type aliases are named according to the following scheme: -+//! -+//! > `{element_type}x{number_of_lanes} == Simd<[element_type; -+//! number_of_lanes]>` -+//! -+//! where the following element types are supported: -+//! -+//! * `i{element_width}`: signed integer -+//! * `u{element_width}`: unsigned integer -+//! * `f{element_width}`: float -+//! * `m{element_width}`: mask (see below) -+//! * `*{const,mut} T`: `const` and `mut` pointers -+//! -+//! ## Basic operations -+//! -+//! ``` -+//! # use packed_simd::*; -+//! // Sets all elements to `0`: -+//! let a = i32x4::splat(0); -+//! -+//! // Reads a vector from a slice: -+//! let mut arr = [0, 0, 0, 1, 2, 3, 4, 5]; -+//! let b = i32x4::from_slice_unaligned(&arr); -+//! -+//! // Reads the 4-th element of a vector: -+//! assert_eq!(b.extract(3), 1); -+//! -+//! // Returns a new vector where the 4-th element is replaced with `1`: -+//! let a = a.replace(3, 1); -+//! assert_eq!(a, b); -+//! -+//! // Writes a vector to a slice: -+//! let a = a.replace(2, 1); -+//! a.write_to_slice_unaligned(&mut arr[4..]); -+//! assert_eq!(arr, [0, 0, 0, 1, 0, 0, 1, 1]); -+//! ``` -+//! -+//! ## Conditional operations -+//! -+//! One often needs to perform an operation on some lanes of the vector. Vector -+//! masks, like `m32x4`, allow selecting on which vector lanes an operation is -+//! to be performed: -+//! -+//! ``` -+//! # use packed_simd::*; -+//! let a = i32x4::new(1, 1, 2, 2); -+//! -+//! // Add `1` to the first two lanes of the vector. -+//! let m = m16x4::new(true, true, false, false); -+//! let a = m.select(a + 1, a); -+//! assert_eq!(a, i32x4::splat(2)); -+//! ``` -+//! -+//! The elements of a vector mask are either `true` or `false`. Here `true` -+//! means that a lane is "selected", while `false` means that a lane is not -+//! selected. -+//! -+//! All vector masks implement a `mask.select(a: T, b: T) -> T` method that -+//! works on all vectors that have the same number of lanes as the mask. The -+//! resulting vector contains the elements of `a` for those lanes for which the -+//! mask is `true`, and the elements of `b` otherwise. -+//! -+//! The example constructs a mask with the first two lanes set to `true` and -+//! the last two lanes set to `false`. This selects the first two lanes of `a + -+//! 1` and the last two lanes of `a`, producing a vector where the first two -+//! lanes have been incremented by `1`. -+//! -+//! > note: mask `select` can be used on vector types that have the same number -+//! > of lanes as the mask. The example shows this by using [`m16x4`] instead -+//! > of [`m32x4`]. It is _typically_ more performant to use a mask element -+//! > width equal to the element width of the vectors being operated upon. -+//! > This is, however, not true for 512-bit wide vectors when targetting -+//! > AVX-512, where the most efficient masks use only 1-bit per element. -+//! -+//! All vertical comparison operations returns masks: -+//! -+//! ``` -+//! # use packed_simd::*; -+//! let a = i32x4::new(1, 1, 3, 3); -+//! let b = i32x4::new(2, 2, 0, 0); -+//! -+//! // ge: >= (Greater Eequal; see also lt, le, gt, eq, ne). -+//! let m = a.ge(i32x4::splat(2)); -+//! -+//! if m.any() { -+//! // all / any / none allow coherent control flow -+//! let d = m.select(a, b); -+//! assert_eq!(d, i32x4::new(2, 2, 3, 3)); -+//! } -+//! ``` -+//! -+//! ## Conversions -+//! -+//! * **lossless widening conversions**: [`From`]/[`Into`] are implemented for -+//! vectors with the same number of lanes when the conversion is value -+//! preserving (same as in `std`). -+//! -+//! * **safe bitwise conversions**: The cargo feature `into_bits` provides the -+//! `IntoBits/FromBits` traits (`x.into_bits()`). These perform safe bitwise -+//! `transmute`s when all bit patterns of the source type are valid bit -+//! patterns of the target type and are also implemented for the -+//! architecture-specific vector types of `std::arch`. For example, `let x: -+//! u8x8 = m8x8::splat(true).into_bits();` is provided because all `m8x8` bit -+//! patterns are valid `u8x8` bit patterns. However, the opposite is not -+//! true, not all `u8x8` bit patterns are valid `m8x8` bit-patterns, so this -+//! operation cannot be peformed safely using `x.into_bits()`; one needs to -+//! use `unsafe { crate::mem::transmute(x) }` for that, making sure that the -+//! value in the `u8x8` is a valid bit-pattern of `m8x8`. -+//! -+//! * **numeric casts** (`as`): are peformed using [`FromCast`]/[`Cast`] -+//! (`x.cast()`), just like `as`: -+//! -+//! * casting integer vectors whose lane types have the same size (e.g. -+//! `i32xN` -> `u32xN`) is a **no-op**, -+//! -+//! * casting from a larger integer to a smaller integer (e.g. `u32xN` -> -+//! `u8xN`) will **truncate**, -+//! -+//! * casting from a smaller integer to a larger integer (e.g. `u8xN` -> -+//! `u32xN`) will: -+//! * **zero-extend** if the source is unsigned, or -+//! * **sign-extend** if the source is signed, -+//! -+//! * casting from a float to an integer will **round the float towards -+//! zero**, -+//! -+//! * casting from an integer to float will produce the floating point -+//! representation of the integer, **rounding to nearest, ties to even**, -+//! -+//! * casting from an `f32` to an `f64` is perfect and lossless, -+//! -+//! * casting from an `f64` to an `f32` **rounds to nearest, ties to even**. -+//! -+//! Numeric casts are not very "precise": sometimes lossy, sometimes value -+//! preserving, etc. -+ -+#![feature( -+ repr_simd, -+ const_fn, -+ platform_intrinsics, -+ stdsimd, -+ aarch64_target_feature, -+ arm_target_feature, -+ link_llvm_intrinsics, -+ core_intrinsics, -+ stmt_expr_attributes, -+ align_offset, -+ mmx_target_feature, -+ crate_visibility_modifier, -+ custom_inner_attributes -+)] -+#![allow(non_camel_case_types, non_snake_case, -+ clippy::cast_possible_truncation, -+ clippy::cast_lossless, -+ clippy::cast_possible_wrap, -+ clippy::cast_precision_loss, -+ // This lint is currently broken for generic code -+ // See https://github.com/rust-lang/rust-clippy/issues/3410 -+ clippy::use_self -+)] -+#![cfg_attr(test, feature(hashmap_internals))] -+#![deny(warnings, rust_2018_idioms, clippy::missing_inline_in_public_items)] -+#![no_std] -+ -+use cfg_if::cfg_if; -+ -+cfg_if! { -+ if #[cfg(feature = "core_arch")] { -+ #[allow(unused_imports)] -+ use core_arch as arch; -+ } else { -+ #[allow(unused_imports)] -+ use core::arch; -+ } -+} -+ -+#[cfg(all(target_arch = "wasm32", test))] -+use wasm_bindgen_test::*; -+ -+#[allow(unused_imports)] -+use core::{ -+ /* arch (handled above), */ cmp, f32, f64, fmt, hash, hint, i128, -+ i16, i32, i64, i8, intrinsics, isize, iter, marker, mem, ops, ptr, slice, -+ u128, u16, u32, u64, u8, usize, -+}; -+ -+#[macro_use] -+mod testing; -+#[macro_use] -+mod api; -+mod codegen; -+mod sealed; -+ -+/// Packed SIMD vector type. -+/// -+/// # Examples -+/// -+/// ``` -+/// # use packed_simd::Simd; -+/// let v = Simd::<[i32; 4]>::new(0, 1, 2, 3); -+/// assert_eq!(v.extract(2), 2); -+/// ``` -+#[repr(transparent)] -+#[derive(Copy, Clone)] -+pub struct Simd( -+ // FIXME: this type should be private, -+ // but it currently must be public for the -+ // `shuffle!` macro to work: it needs to -+ // access the internal `repr(simd)` type -+ // to call the shuffle intrinsics. -+ #[doc(hidden)] pub ::Tuple, -+); -+ -+/// Wrapper over `T` implementing a lexicoraphical order via the `PartialOrd` -+/// and/or `Ord` traits. -+#[repr(transparent)] -+#[derive(Copy, Clone, Debug)] -+#[allow(clippy::missing_inline_in_public_items)] -+pub struct LexicographicallyOrdered(T); -+ -+mod masks; -+pub use self::masks::*; -+ -+mod v16; -+pub use self::v16::*; -+ -+mod v32; -+pub use self::v32::*; -+ -+mod v64; -+pub use self::v64::*; -+ -+mod v128; -+pub use self::v128::*; -+ -+mod v256; -+pub use self::v256::*; -+ -+mod v512; -+pub use self::v512::*; -+ -+mod vSize; -+pub use self::vSize::*; -+ -+mod vPtr; -+pub use self::vPtr::*; -+ -+pub use self::api::cast::*; -+ -+#[cfg(feature = "into_bits")] -+pub use self::api::into_bits::*; -+ -+// Re-export the shuffle intrinsics required by the `shuffle!` macro. -+#[doc(hidden)] -+pub use self::codegen::llvm::{ -+ __shuffle_vector16, __shuffle_vector2, __shuffle_vector32, -+ __shuffle_vector4, __shuffle_vector64, __shuffle_vector8, -+}; -+ -+crate mod llvm { -+ crate use crate::codegen::llvm::*; -+} -diff --git a/third_party/rust/packed_simd/src/masks.rs b/third_party/rust/packed_simd/src/masks.rs -new file mode 100644 -index 000000000000..f83c4da95750 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/masks.rs -@@ -0,0 +1,128 @@ -+//! Mask types -+ -+macro_rules! impl_mask_ty { -+ ($id:ident : $elem_ty:ident | #[$doc:meta]) => { -+ #[$doc] -+ #[derive(Copy, Clone)] -+ pub struct $id($elem_ty); -+ -+ impl crate::sealed::Mask for $id { -+ fn test(&self) -> bool { -+ $id::test(self) -+ } -+ } -+ -+ impl $id { -+ /// Instantiate a mask with `value` -+ #[inline] -+ pub fn new(x: bool) -> Self { -+ if x { -+ $id(!0) -+ } else { -+ $id(0) -+ } -+ } -+ /// Test if the mask is set -+ #[inline] -+ pub fn test(&self) -> bool { -+ self.0 != 0 -+ } -+ } -+ -+ impl Default for $id { -+ #[inline] -+ fn default() -> Self { -+ $id(0) -+ } -+ } -+ -+ #[allow(clippy::partialeq_ne_impl)] -+ impl PartialEq<$id> for $id { -+ #[inline] -+ fn eq(&self, other: &Self) -> bool { -+ self.0 == other.0 -+ } -+ #[inline] -+ fn ne(&self, other: &Self) -> bool { -+ self.0 != other.0 -+ } -+ } -+ -+ impl Eq for $id {} -+ -+ impl PartialOrd<$id> for $id { -+ #[inline] -+ fn partial_cmp( -+ &self, other: &Self, -+ ) -> Option { -+ use crate::cmp::Ordering; -+ if self == other { -+ Some(Ordering::Equal) -+ } else if self.0 > other.0 { -+ // Note: -+ // * false = 0_i -+ // * true == !0_i == -1_i -+ Some(Ordering::Less) -+ } else { -+ Some(Ordering::Greater) -+ } -+ } -+ -+ #[inline] -+ fn lt(&self, other: &Self) -> bool { -+ self.0 > other.0 -+ } -+ #[inline] -+ fn gt(&self, other: &Self) -> bool { -+ self.0 < other.0 -+ } -+ #[inline] -+ fn le(&self, other: &Self) -> bool { -+ self.0 >= other.0 -+ } -+ #[inline] -+ fn ge(&self, other: &Self) -> bool { -+ self.0 <= other.0 -+ } -+ } -+ -+ impl Ord for $id { -+ #[inline] -+ fn cmp(&self, other: &Self) -> crate::cmp::Ordering { -+ match self.partial_cmp(other) { -+ Some(x) => x, -+ None => unsafe { crate::hint::unreachable_unchecked() }, -+ } -+ } -+ } -+ -+ impl crate::hash::Hash for $id { -+ #[inline] -+ fn hash(&self, state: &mut H) { -+ (self.0 != 0).hash(state); -+ } -+ } -+ -+ impl crate::fmt::Debug for $id { -+ #[inline] -+ fn fmt( -+ &self, fmtter: &mut crate::fmt::Formatter<'_>, -+ ) -> Result<(), crate::fmt::Error> { -+ write!(fmtter, "{}({})", stringify!($id), self.0 != 0) -+ } -+ } -+ }; -+} -+ -+impl_mask_ty!(m8: i8 | /// 8-bit wide mask. -+); -+impl_mask_ty!(m16: i16 | /// 16-bit wide mask. -+); -+impl_mask_ty!(m32: i32 | /// 32-bit wide mask. -+); -+impl_mask_ty!(m64: i64 | /// 64-bit wide mask. -+); -+impl_mask_ty!(m128: i128 | /// 128-bit wide mask. -+); -+impl_mask_ty!(msize: isize | /// isize-wide mask. -+); -diff --git a/third_party/rust/packed_simd/src/sealed.rs b/third_party/rust/packed_simd/src/sealed.rs -new file mode 100644 -index 000000000000..832acd3f1d54 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/sealed.rs -@@ -0,0 +1,41 @@ -+//! Sealed traits -+ -+/// Trait implemented by arrays that can be SIMD types. -+#[doc(hidden)] -+pub trait SimdArray { -+ /// The type of the #[repr(simd)] type. -+ type Tuple: Copy + Clone; -+ /// The element type of the vector. -+ type T; -+ /// The number of elements in the array. -+ const N: usize; -+ /// The type: `[u32; Self::N]`. -+ type NT; -+} -+ -+/// This traits is used to constraint the arguments -+/// and result type of the portable shuffles. -+#[doc(hidden)] -+pub trait Shuffle { -+ // Lanes is a `[u32; N]` where `N` is the number of vector lanes -+ -+ /// The result type of the shuffle. -+ type Output; -+} -+ -+/// This trait is implemented by all SIMD vector types. -+#[doc(hidden)] -+pub trait Simd { -+ /// Element type of the SIMD vector -+ type Element; -+ /// The number of elements in the SIMD vector. -+ const LANES: usize; -+ /// The type: `[u32; Self::N]`. -+ type LanesType; -+} -+ -+/// This trait is implemented by all mask types -+#[doc(hidden)] -+pub trait Mask { -+ fn test(&self) -> bool; -+} -diff --git a/third_party/rust/packed_simd/src/testing.rs b/third_party/rust/packed_simd/src/testing.rs -new file mode 100644 -index 000000000000..fcbcf9e2ac8e ---- /dev/null -+++ b/third_party/rust/packed_simd/src/testing.rs -@@ -0,0 +1,8 @@ -+//! Testing macros and other utilities. -+ -+#[macro_use] -+mod macros; -+ -+#[cfg(test)] -+#[macro_use] -+crate mod utils; -diff --git a/third_party/rust/packed_simd/src/testing/macros.rs b/third_party/rust/packed_simd/src/testing/macros.rs -new file mode 100644 -index 000000000000..6008634c76ce ---- /dev/null -+++ b/third_party/rust/packed_simd/src/testing/macros.rs -@@ -0,0 +1,44 @@ -+//! Testing macros -+ -+macro_rules! test_if { -+ ($cfg_tt:tt: $it:item) => { -+ #[cfg(any( -+ // Test everything if: -+ // -+ // * tests are enabled, -+ // * no features about exclusively testing -+ // specific vector classes are enabled -+ all(test, not(any( -+ test_v16, -+ test_v32, -+ test_v64, -+ test_v128, -+ test_v256, -+ test_v512, -+ test_none, // disables all tests -+ ))), -+ // Test if: -+ // -+ // * tests are enabled -+ // * a particular cfg token tree returns true -+ all(test, $cfg_tt), -+ ))] -+ $it -+ }; -+} -+ -+#[cfg(test)] -+#[allow(unused)] -+macro_rules! ref_ { -+ ($anything:tt) => { -+ &$anything -+ }; -+} -+ -+#[cfg(test)] -+#[allow(unused)] -+macro_rules! ref_mut_ { -+ ($anything:tt) => { -+ &mut $anything -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/testing/utils.rs b/third_party/rust/packed_simd/src/testing/utils.rs -new file mode 100644 -index 000000000000..7b8f21ac1c55 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/testing/utils.rs -@@ -0,0 +1,135 @@ -+//! Testing utilities -+ -+#![allow(dead_code)] -+ -+use crate::{cmp::PartialOrd, fmt::Debug, LexicographicallyOrdered}; -+ -+/// Tests PartialOrd for `a` and `b` where `a < b` is true. -+pub fn test_lt( -+ a: LexicographicallyOrdered, b: LexicographicallyOrdered, -+) where -+ LexicographicallyOrdered: Debug + PartialOrd, -+{ -+ assert!(a < b, "{:?}, {:?}", a, b); -+ assert!(b > a, "{:?}, {:?}", a, b); -+ -+ assert!(!(a == b), "{:?}, {:?}", a, b); -+ assert!(a != b, "{:?}, {:?}", a, b); -+ -+ assert!(a <= b, "{:?}, {:?}", a, b); -+ assert!(b >= a, "{:?}, {:?}", a, b); -+ -+ // Irreflexivity -+ assert!(!(a < a), "{:?}, {:?}", a, b); -+ assert!(!(b < b), "{:?}, {:?}", a, b); -+ assert!(!(a > a), "{:?}, {:?}", a, b); -+ assert!(!(b > b), "{:?}, {:?}", a, b); -+ -+ assert!(a <= a, "{:?}, {:?}", a, b); -+ assert!(b <= b, "{:?}, {:?}", a, b); -+} -+ -+/// Tests PartialOrd for `a` and `b` where `a <= b` is true. -+pub fn test_le( -+ a: LexicographicallyOrdered, b: LexicographicallyOrdered, -+) where -+ LexicographicallyOrdered: Debug + PartialOrd, -+{ -+ assert!(a <= b, "{:?}, {:?}", a, b); -+ assert!(b >= a, "{:?}, {:?}", a, b); -+ -+ assert!(a == b || a < b, "{:?}, {:?}", a, b); -+ assert!(a == b || b > a, "{:?}, {:?}", a, b); -+ -+ if a == b { -+ assert!(!(a < b), "{:?}, {:?}", a, b); -+ assert!(!(b > a), "{:?}, {:?}", a, b); -+ -+ assert!(!(a != b), "{:?}, {:?}", a, b); -+ } else { -+ assert!(a != b, "{:?}, {:?}", a, b); -+ test_lt(a, b); -+ } -+} -+ -+/// Test PartialOrd::partial_cmp for `a` and `b` returning `Ordering` -+pub fn test_cmp( -+ a: LexicographicallyOrdered, b: LexicographicallyOrdered, -+ o: Option, -+) where -+ LexicographicallyOrdered: PartialOrd + Debug, -+ T: Debug + crate::sealed::Simd + Copy + Clone, -+ ::Element: Default + Copy + Clone + PartialOrd, -+{ -+ assert!(T::LANES <= 64, "array length in these two arrays needs updating"); -+ let mut arr_a: [T::Element; 64] = [Default::default(); 64]; -+ let mut arr_b: [T::Element; 64] = [Default::default(); 64]; -+ -+ unsafe { -+ crate::ptr::write_unaligned( -+ arr_a.as_mut_ptr() as *mut LexicographicallyOrdered, -+ a, -+ ) -+ } -+ unsafe { -+ crate::ptr::write_unaligned( -+ arr_b.as_mut_ptr() as *mut LexicographicallyOrdered, -+ b, -+ ) -+ } -+ let expected = arr_a[0..T::LANES].partial_cmp(&arr_b[0..T::LANES]); -+ let result = a.partial_cmp(&b); -+ assert_eq!(expected, result, "{:?}, {:?}", a, b); -+ assert_eq!(o, result, "{:?}, {:?}", a, b); -+ match o { -+ Some(crate::cmp::Ordering::Less) => { -+ test_lt(a, b); -+ test_le(a, b); -+ } -+ Some(crate::cmp::Ordering::Greater) => { -+ test_lt(b, a); -+ test_le(b, a); -+ } -+ Some(crate::cmp::Ordering::Equal) => { -+ assert!(a == b, "{:?}, {:?}", a, b); -+ assert!(!(a != b), "{:?}, {:?}", a, b); -+ assert!(!(a < b), "{:?}, {:?}", a, b); -+ assert!(!(b < a), "{:?}, {:?}", a, b); -+ assert!(!(a > b), "{:?}, {:?}", a, b); -+ assert!(!(b > a), "{:?}, {:?}", a, b); -+ -+ test_le(a, b); -+ test_le(b, a); -+ } -+ None => { -+ assert!(!(a == b), "{:?}, {:?}", a, b); -+ assert!(!(a != b), "{:?}, {:?}", a, b); -+ assert!(!(a < b), "{:?}, {:?}", a, b); -+ assert!(!(a > b), "{:?}, {:?}", a, b); -+ assert!(!(b < a), "{:?}, {:?}", a, b); -+ assert!(!(b > a), "{:?}, {:?}", a, b); -+ assert!(!(a <= b), "{:?}, {:?}", a, b); -+ assert!(!(b <= a), "{:?}, {:?}", a, b); -+ assert!(!(a >= b), "{:?}, {:?}", a, b); -+ assert!(!(b >= a), "{:?}, {:?}", a, b); -+ } -+ } -+} -+ -+// Returns a tuple containing two distinct pointer values of the same type as -+// the element type of the Simd vector `$id`. -+#[allow(unused)] -+macro_rules! ptr_vals { -+ ($id:ty) => { -+ // expands to an expression -+ #[allow(unused_unsafe)] -+ unsafe { -+ // all bits cleared -+ let clear: <$id as sealed::Simd>::Element = crate::mem::zeroed(); -+ // all bits set -+ let set: <$id as sealed::Simd>::Element = -+ crate::mem::transmute(-1_isize); -+ (clear, set) -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/v128.rs b/third_party/rust/packed_simd/src/v128.rs -new file mode 100644 -index 000000000000..1d0282dc4278 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/v128.rs -@@ -0,0 +1,80 @@ -+//! 128-bit wide vector types -+#![rustfmt::skip] -+ -+use crate::*; -+ -+impl_i!([i8; 16]: i8x16, m8x16 | i8 | test_v128 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | -+ From: | -+ /// A 128-bit vector with 16 `i8` lanes. -+); -+impl_u!([u8; 16]: u8x16, m8x16 | u8 | test_v128 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | -+ From: | -+ /// A 128-bit vector with 16 `u8` lanes. -+); -+impl_m!([m8; 16]: m8x16 | i8 | test_v128 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | -+ From: m16x16 | -+ /// A 128-bit vector mask with 16 `m8` lanes. -+); -+ -+impl_i!([i16; 8]: i16x8, m16x8 | i16 | test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 | -+ From: i8x8, u8x8 | -+ /// A 128-bit vector with 8 `i16` lanes. -+); -+impl_u!([u16; 8]: u16x8, m16x8 | u16| test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 | -+ From: u8x8 | -+ /// A 128-bit vector with 8 `u16` lanes. -+); -+impl_m!([m16; 8]: m16x8 | i16 | test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 | -+ From: m8x8, m32x8 | -+ /// A 128-bit vector mask with 8 `m16` lanes. -+); -+ -+impl_i!([i32; 4]: i32x4, m32x4 | i32 | test_v128 | x0, x1, x2, x3 | -+ From: i8x4, u8x4, i16x4, u16x4 | -+ /// A 128-bit vector with 4 `i32` lanes. -+); -+impl_u!([u32; 4]: u32x4, m32x4 | u32| test_v128 | x0, x1, x2, x3 | -+ From: u8x4, u16x4 | -+ /// A 128-bit vector with 4 `u32` lanes. -+); -+impl_f!([f32; 4]: f32x4, m32x4 | f32 | test_v128 | x0, x1, x2, x3 | -+ From: i8x4, u8x4, i16x4, u16x4 | -+ /// A 128-bit vector with 4 `f32` lanes. -+); -+impl_m!([m32; 4]: m32x4 | i32 | test_v128 | x0, x1, x2, x3 | -+ From: m8x4, m16x4, m64x4 | -+ /// A 128-bit vector mask with 4 `m32` lanes. -+); -+ -+impl_i!([i64; 2]: i64x2, m64x2 | i64 | test_v128 | x0, x1 | -+ From: i8x2, u8x2, i16x2, u16x2, i32x2, u32x2 | -+ /// A 128-bit vector with 2 `i64` lanes. -+); -+impl_u!([u64; 2]: u64x2, m64x2 | u64 | test_v128 | x0, x1 | -+ From: u8x2, u16x2, u32x2 | -+ /// A 128-bit vector with 2 `u64` lanes. -+); -+impl_f!([f64; 2]: f64x2, m64x2 | f64 | test_v128 | x0, x1 | -+ From: i8x2, u8x2, i16x2, u16x2, i32x2, u32x2, f32x2 | -+ /// A 128-bit vector with 2 `f64` lanes. -+); -+impl_m!([m64; 2]: m64x2 | i64 | test_v128 | x0, x1 | -+ From: m8x2, m16x2, m32x2, m128x2 | -+ /// A 128-bit vector mask with 2 `m64` lanes. -+); -+ -+impl_i!([i128; 1]: i128x1, m128x1 | i128 | test_v128 | x0 | -+ From: /*i8x1, u8x1, i16x1, u16x1, i32x1, u32x1, i64x1, u64x1 */ | // FIXME: unary small vector types -+ /// A 128-bit vector with 1 `i128` lane. -+); -+impl_u!([u128; 1]: u128x1, m128x1 | u128 | test_v128 | x0 | -+ From: /*u8x1, u16x1, u32x1, u64x1 */ | // FIXME: unary small vector types -+ /// A 128-bit vector with 1 `u128` lane. -+); -+impl_m!([m128; 1]: m128x1 | i128 | test_v128 | x0 | -+ From: /*m8x1, m16x1, m32x1, m64x1 */ | // FIXME: unary small vector types -+ /// A 128-bit vector mask with 1 `m128` lane. -+); -diff --git a/third_party/rust/packed_simd/src/v16.rs b/third_party/rust/packed_simd/src/v16.rs -new file mode 100644 -index 000000000000..67a3832d2530 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/v16.rs -@@ -0,0 +1,16 @@ -+//! 16-bit wide vector types -+ -+use crate::*; -+ -+impl_i!([i8; 2]: i8x2, m8x2 | i8 | test_v16 | x0, x1 | -+ From: | -+ /// A 16-bit vector with 2 `i8` lanes. -+); -+impl_u!([u8; 2]: u8x2, m8x2 | u8 | test_v16 | x0, x1 | -+ From: | -+ /// A 16-bit vector with 2 `u8` lanes. -+); -+impl_m!([m8; 2]: m8x2 | i8 | test_v16 | x0, x1 | -+ From: m16x2, m32x2, m64x2, m128x2 | -+ /// A 16-bit vector mask with 2 `m8` lanes. -+); -diff --git a/third_party/rust/packed_simd/src/v256.rs b/third_party/rust/packed_simd/src/v256.rs -new file mode 100644 -index 000000000000..6b59336f68b6 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/v256.rs -@@ -0,0 +1,86 @@ -+//! 256-bit wide vector types -+#![rustfmt::skip] -+ -+use crate::*; -+ -+impl_i!([i8; 32]: i8x32, m8x32 | i8 | test_v256 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, -+ x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 | -+ From: | -+ /// A 256-bit vector with 32 `i8` lanes. -+); -+impl_u!([u8; 32]: u8x32, m8x32 | u8 | test_v256 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, -+ x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 | -+ From: | -+ /// A 256-bit vector with 32 `u8` lanes. -+); -+impl_m!([m8; 32]: m8x32 | i8 | test_v256 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, -+ x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 | -+ From: | -+ /// A 256-bit vector mask with 32 `m8` lanes. -+); -+ -+impl_i!([i16; 16]: i16x16, m16x16 | i16 | test_v256 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | -+ From: i8x16, u8x16 | -+ /// A 256-bit vector with 16 `i16` lanes. -+); -+impl_u!([u16; 16]: u16x16, m16x16 | u16 | test_v256 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | -+ From: u8x16 | -+ /// A 256-bit vector with 16 `u16` lanes. -+); -+impl_m!([m16; 16]: m16x16 | i16 | test_v256 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | -+ From: m8x16 | -+ /// A 256-bit vector mask with 16 `m16` lanes. -+); -+ -+impl_i!([i32; 8]: i32x8, m32x8 | i32 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 | -+ From: i8x8, u8x8, i16x8, u16x8 | -+ /// A 256-bit vector with 8 `i32` lanes. -+); -+impl_u!([u32; 8]: u32x8, m32x8 | u32 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 | -+ From: u8x8, u16x8 | -+ /// A 256-bit vector with 8 `u32` lanes. -+); -+impl_f!([f32; 8]: f32x8, m32x8 | f32 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 | -+ From: i8x8, u8x8, i16x8, u16x8 | -+ /// A 256-bit vector with 8 `f32` lanes. -+); -+impl_m!([m32; 8]: m32x8 | i32 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 | -+ From: m8x8, m16x8 | -+ /// A 256-bit vector mask with 8 `m32` lanes. -+); -+ -+impl_i!([i64; 4]: i64x4, m64x4 | i64 | test_v256 | x0, x1, x2, x3 | -+ From: i8x4, u8x4, i16x4, u16x4, i32x4, u32x4 | -+ /// A 256-bit vector with 4 `i64` lanes. -+); -+impl_u!([u64; 4]: u64x4, m64x4 | u64 | test_v256 | x0, x1, x2, x3 | -+ From: u8x4, u16x4, u32x4 | -+ /// A 256-bit vector with 4 `u64` lanes. -+); -+impl_f!([f64; 4]: f64x4, m64x4 | f64 | test_v256 | x0, x1, x2, x3 | -+ From: i8x4, u8x4, i16x4, u16x4, i32x4, u32x4, f32x4 | -+ /// A 256-bit vector with 4 `f64` lanes. -+); -+impl_m!([m64; 4]: m64x4 | i64 | test_v256 | x0, x1, x2, x3 | -+ From: m8x4, m16x4, m32x4 | -+ /// A 256-bit vector mask with 4 `m64` lanes. -+); -+ -+impl_i!([i128; 2]: i128x2, m128x2 | i128 | test_v256 | x0, x1 | -+ From: i8x2, u8x2, i16x2, u16x2, i32x2, u32x2, i64x2, u64x2 | -+ /// A 256-bit vector with 2 `i128` lanes. -+); -+impl_u!([u128; 2]: u128x2, m128x2 | u128 | test_v256 | x0, x1 | -+ From: u8x2, u16x2, u32x2, u64x2 | -+ /// A 256-bit vector with 2 `u128` lanes. -+); -+impl_m!([m128; 2]: m128x2 | i128 | test_v256 | x0, x1 | -+ From: m8x2, m16x2, m32x2, m64x2 | -+ /// A 256-bit vector mask with 2 `m128` lanes. -+); -diff --git a/third_party/rust/packed_simd/src/v32.rs b/third_party/rust/packed_simd/src/v32.rs -new file mode 100644 -index 000000000000..09cef9bdd472 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/v32.rs -@@ -0,0 +1,29 @@ -+//! 32-bit wide vector types -+ -+use crate::*; -+ -+impl_i!([i8; 4]: i8x4, m8x4 | i8 | test_v32 | x0, x1, x2, x3 | -+ From: | -+ /// A 32-bit vector with 4 `i8` lanes. -+); -+impl_u!([u8; 4]: u8x4, m8x4 | u8 | test_v32 | x0, x1, x2, x3 | -+ From: | -+ /// A 32-bit vector with 4 `u8` lanes. -+); -+impl_m!([m8; 4]: m8x4 | i8 | test_v32 | x0, x1, x2, x3 | -+ From: m16x4, m32x4, m64x4 | -+ /// A 32-bit vector mask with 4 `m8` lanes. -+); -+ -+impl_i!([i16; 2]: i16x2, m16x2 | i16 | test_v32 | x0, x1 | -+ From: i8x2, u8x2 | -+ /// A 32-bit vector with 2 `i16` lanes. -+); -+impl_u!([u16; 2]: u16x2, m16x2 | u16 | test_v32 | x0, x1 | -+ From: u8x2 | -+ /// A 32-bit vector with 2 `u16` lanes. -+); -+impl_m!([m16; 2]: m16x2 | i16 | test_v32 | x0, x1 | -+ From: m8x2, m32x2, m64x2, m128x2 | -+ /// A 32-bit vector mask with 2 `m16` lanes. -+); -diff --git a/third_party/rust/packed_simd/src/v512.rs b/third_party/rust/packed_simd/src/v512.rs -new file mode 100644 -index 000000000000..b1714aded369 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/v512.rs -@@ -0,0 +1,99 @@ -+//! 512-bit wide vector types -+#![rustfmt::skip] -+ -+use crate::*; -+ -+impl_i!([i8; 64]: i8x64, m8x64 | i8 | test_v512 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, -+ x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, -+ x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47, -+ x48, x49, x50, x51, x52, x53, x54, x55, x56, x57, x58, x59, x60, x61, x62, x63 | -+ From: | -+ /// A 512-bit vector with 64 `i8` lanes. -+); -+impl_u!([u8; 64]: u8x64, m8x64 | u8 | test_v512 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, -+ x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, -+ x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47, -+ x48, x49, x50, x51, x52, x53, x54, x55, x56, x57, x58, x59, x60, x61, x62, x63 | -+ From: | -+ /// A 512-bit vector with 64 `u8` lanes. -+); -+impl_m!([m8; 64]: m8x64 | i8 | test_v512 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, -+ x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, -+ x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47, -+ x48, x49, x50, x51, x52, x53, x54, x55, x56, x57, x58, x59, x60, x61, x62, x63 | -+ From: | -+ /// A 512-bit vector mask with 64 `m8` lanes. -+); -+ -+impl_i!([i16; 32]: i16x32, m16x32 | i16 | test_v512 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, -+ x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 | -+ From: i8x32, u8x32 | -+ /// A 512-bit vector with 32 `i16` lanes. -+); -+impl_u!([u16; 32]: u16x32, m16x32 | u16 | test_v512 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, -+ x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 | -+ From: u8x32 | -+ /// A 512-bit vector with 32 `u16` lanes. -+); -+impl_m!([m16; 32]: m16x32 | i16 | test_v512 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, -+ x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 | -+ From: m8x32 | -+ /// A 512-bit vector mask with 32 `m16` lanes. -+); -+ -+impl_i!([i32; 16]: i32x16, m32x16 | i32 | test_v512 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | -+ From: i8x16, u8x16, i16x16, u16x16 | -+ /// A 512-bit vector with 16 `i32` lanes. -+); -+impl_u!([u32; 16]: u32x16, m32x16 | u32 | test_v512 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | -+ From: u8x16, u16x16 | -+ /// A 512-bit vector with 16 `u32` lanes. -+); -+impl_f!([f32; 16]: f32x16, m32x16 | f32 | test_v512 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | -+ From: i8x16, u8x16, i16x16, u16x16 | -+ /// A 512-bit vector with 16 `f32` lanes. -+); -+impl_m!([m32; 16]: m32x16 | i32 | test_v512 | -+ x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | -+ From: m8x16, m16x16 | -+ /// A 512-bit vector mask with 16 `m32` lanes. -+); -+ -+impl_i!([i64; 8]: i64x8, m64x8 | i64 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | -+ From: i8x8, u8x8, i16x8, u16x8, i32x8, u32x8 | -+ /// A 512-bit vector with 8 `i64` lanes. -+); -+impl_u!([u64; 8]: u64x8, m64x8 | u64 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | -+ From: u8x8, u16x8, u32x8 | -+ /// A 512-bit vector with 8 `u64` lanes. -+); -+impl_f!([f64; 8]: f64x8, m64x8 | f64 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | -+ From: i8x8, u8x8, i16x8, u16x8, i32x8, u32x8, f32x8 | -+ /// A 512-bit vector with 8 `f64` lanes. -+); -+impl_m!([m64; 8]: m64x8 | i64 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | -+ From: m8x8, m16x8, m32x8 | -+ /// A 512-bit vector mask with 8 `m64` lanes. -+); -+ -+impl_i!([i128; 4]: i128x4, m128x4 | i128 | test_v512 | x0, x1, x2, x3 | -+ From: i8x4, u8x4, i16x4, u16x4, i32x4, u32x4, i64x4, u64x4 | -+ /// A 512-bit vector with 4 `i128` lanes. -+); -+impl_u!([u128; 4]: u128x4, m128x4 | u128 | test_v512 | x0, x1, x2, x3 | -+ From: u8x4, u16x4, u32x4, u64x4 | -+ /// A 512-bit vector with 4 `u128` lanes. -+); -+impl_m!([m128; 4]: m128x4 | i128 | test_v512 | x0, x1, x2, x3 | -+ From: m8x4, m16x4, m32x4, m64x4 | -+ /// A 512-bit vector mask with 4 `m128` lanes. -+); -diff --git a/third_party/rust/packed_simd/src/v64.rs b/third_party/rust/packed_simd/src/v64.rs -new file mode 100644 -index 000000000000..1ee6219c040b ---- /dev/null -+++ b/third_party/rust/packed_simd/src/v64.rs -@@ -0,0 +1,66 @@ -+//! 64-bit wide vector types -+#![rustfmt::skip] -+ -+use super::*; -+ -+impl_i!([i8; 8]: i8x8, m8x8 | i8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 | -+ From: | -+ /// A 64-bit vector with 8 `i8` lanes. -+); -+impl_u!([u8; 8]: u8x8, m8x8 | u8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 | -+ From: | -+ /// A 64-bit vector with 8 `u8` lanes. -+); -+impl_m!([m8; 8]: m8x8 | i8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 | -+ From: m16x8, m32x8 | -+ /// A 64-bit vector mask with 8 `m8` lanes. -+); -+ -+impl_i!([i16; 4]: i16x4, m16x4 | i16 | test_v64 | x0, x1, x2, x3 | -+ From: i8x4, u8x4 | -+ /// A 64-bit vector with 4 `i16` lanes. -+); -+impl_u!([u16; 4]: u16x4, m16x4 | u16 | test_v64 | x0, x1, x2, x3 | -+ From: u8x4 | -+ /// A 64-bit vector with 4 `u16` lanes. -+); -+impl_m!([m16; 4]: m16x4 | i16 | test_v64 | x0, x1, x2, x3 | -+ From: m8x4, m32x4, m64x4 | -+ /// A 64-bit vector mask with 4 `m16` lanes. -+); -+ -+impl_i!([i32; 2]: i32x2, m32x2 | i32 | test_v64 | x0, x1 | -+ From: i8x2, u8x2, i16x2, u16x2 | -+ /// A 64-bit vector with 2 `i32` lanes. -+); -+impl_u!([u32; 2]: u32x2, m32x2 | u32 | test_v64 | x0, x1 | -+ From: u8x2, u16x2 | -+ /// A 64-bit vector with 2 `u32` lanes. -+); -+impl_m!([m32; 2]: m32x2 | i32 | test_v64 | x0, x1 | -+ From: m8x2, m16x2, m64x2, m128x2 | -+ /// A 64-bit vector mask with 2 `m32` lanes. -+); -+impl_f!([f32; 2]: f32x2, m32x2 | f32 | test_v64 | x0, x1 | -+ From: i8x2, u8x2, i16x2, u16x2 | -+ /// A 64-bit vector with 2 `f32` lanes. -+); -+ -+/* -+impl_i!([i64; 1]: i64x1, m64x1 | i64 | test_v64 | x0 | -+ From: /*i8x1, u8x1, i16x1, u16x1, i32x1, u32x1*/ | // FIXME: primitive to vector conversion -+ /// A 64-bit vector with 1 `i64` lanes. -+); -+impl_u!([u64; 1]: u64x1, m64x1 | u64 | test_v64 | x0 | -+ From: /*u8x1, u16x1, u32x1*/ | // FIXME: primitive to vector conversion -+ /// A 64-bit vector with 1 `u64` lanes. -+); -+impl_m!([m64; 1]: m64x1 | i64 | test_v64 | x0 | -+ From: /*m8x1, m16x1, m32x1, */ m128x1 | // FIXME: unary small vector types -+ /// A 64-bit vector mask with 1 `m64` lanes. -+); -+impl_f!([f64; 1]: f64x1, m64x1 | f64 | test_v64 | x0 | -+ From: /*i8x1, u8x1, i16x1, u16x1, i32x1, u32x1, f32x1*/ | // FIXME: unary small vector types -+ /// A 64-bit vector with 1 `f64` lanes. -+); -+*/ -diff --git a/third_party/rust/packed_simd/src/vPtr.rs b/third_party/rust/packed_simd/src/vPtr.rs -new file mode 100644 -index 000000000000..fe9fb28ffa89 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/vPtr.rs -@@ -0,0 +1,34 @@ -+//! Vectors of pointers -+#![rustfmt::skip] -+ -+use crate::*; -+ -+impl_const_p!( -+ [*const T; 2]: cptrx2, msizex2, usizex2, isizex2 | test_v128 | x0, x1 | From: | -+ /// A vector with 2 `*const T` lanes -+); -+ -+impl_mut_p!( -+ [*mut T; 2]: mptrx2, msizex2, usizex2, isizex2 | test_v128 | x0, x1 | From: | -+ /// A vector with 2 `*mut T` lanes -+); -+ -+impl_const_p!( -+ [*const T; 4]: cptrx4, msizex4, usizex4, isizex4 | test_v256 | x0, x1, x2, x3 | From: | -+ /// A vector with 4 `*const T` lanes -+); -+ -+impl_mut_p!( -+ [*mut T; 4]: mptrx4, msizex4, usizex4, isizex4 | test_v256 | x0, x1, x2, x3 | From: | -+ /// A vector with 4 `*mut T` lanes -+); -+ -+impl_const_p!( -+ [*const T; 8]: cptrx8, msizex8, usizex8, isizex8 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | From: | -+ /// A vector with 8 `*const T` lanes -+); -+ -+impl_mut_p!( -+ [*mut T; 8]: mptrx8, msizex8, usizex8, isizex8 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | From: | -+ /// A vector with 8 `*mut T` lanes -+); -diff --git a/third_party/rust/packed_simd/src/vSize.rs b/third_party/rust/packed_simd/src/vSize.rs -new file mode 100644 -index 000000000000..5594323372b4 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/vSize.rs -@@ -0,0 +1,53 @@ -+//! Vectors with pointer-sized elements -+ -+use crate::codegen::pointer_sized_int::{isize_, usize_}; -+use crate::*; -+ -+impl_i!([isize; 2]: isizex2, msizex2 | isize_ | test_v128 | -+ x0, x1| -+ From: | -+ /// A vector with 2 `isize` lanes. -+); -+ -+impl_u!([usize; 2]: usizex2, msizex2 | usize_ | test_v128 | -+ x0, x1| -+ From: | -+ /// A vector with 2 `usize` lanes. -+); -+impl_m!([msize; 2]: msizex2 | isize_ | test_v128 | -+ x0, x1 | -+ From: | -+ /// A vector mask with 2 `msize` lanes. -+); -+ -+impl_i!([isize; 4]: isizex4, msizex4 | isize_ | test_v256 | -+ x0, x1, x2, x3 | -+ From: | -+ /// A vector with 4 `isize` lanes. -+); -+impl_u!([usize; 4]: usizex4, msizex4 | usize_ | test_v256 | -+ x0, x1, x2, x3| -+ From: | -+ /// A vector with 4 `usize` lanes. -+); -+impl_m!([msize; 4]: msizex4 | isize_ | test_v256 | -+ x0, x1, x2, x3 | -+ From: | -+ /// A vector mask with 4 `msize` lanes. -+); -+ -+impl_i!([isize; 8]: isizex8, msizex8 | isize_ | test_v512 | -+ x0, x1, x2, x3, x4, x5, x6, x7 | -+ From: | -+ /// A vector with 4 `isize` lanes. -+); -+impl_u!([usize; 8]: usizex8, msizex8 | usize_ | test_v512 | -+ x0, x1, x2, x3, x4, x5, x6, x7 | -+ From: | -+ /// A vector with 8 `usize` lanes. -+); -+impl_m!([msize; 8]: msizex8 | isize_ | test_v512 | -+ x0, x1, x2, x3, x4, x5, x6, x7 | -+ From: | -+ /// A vector mask with 8 `msize` lanes. -+); -diff --git a/third_party/rust/packed_simd/tests/endianness.rs b/third_party/rust/packed_simd/tests/endianness.rs -new file mode 100644 -index 000000000000..1e6b4f354301 ---- /dev/null -+++ b/third_party/rust/packed_simd/tests/endianness.rs -@@ -0,0 +1,262 @@ -+#[cfg(target_arch = "wasm32")] -+use wasm_bindgen_test::*; -+ -+use packed_simd::*; -+use std::{mem, slice}; -+ -+#[cfg_attr(not(target_arch = "wasm32"), test)] -+#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+fn endian_indexing() { -+ let v = i32x4::new(0, 1, 2, 3); -+ assert_eq!(v.extract(0), 0); -+ assert_eq!(v.extract(1), 1); -+ assert_eq!(v.extract(2), 2); -+ assert_eq!(v.extract(3), 3); -+} -+ -+#[cfg_attr(not(target_arch = "wasm32"), test)] -+#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+fn endian_bitcasts() { -+ #[cfg_attr(rustfmt, rustfmt_skip)] -+ let x = i8x16::new( -+ 0, 1, 2, 3, 4, 5, 6, 7, -+ 8, 9, 10, 11, 12, 13, 14, 15, -+ ); -+ let t: i16x8 = unsafe { mem::transmute(x) }; -+ let e: i16x8 = if cfg!(target_endian = "little") { -+ i16x8::new(256, 770, 1284, 1798, 2312, 2826, 3340, 3854) -+ } else { -+ i16x8::new(1, 515, 1029, 1543, 2057, 2571, 3085, 3599) -+ }; -+ assert_eq!(t, e); -+} -+ -+#[cfg_attr(not(target_arch = "wasm32"), test)] -+#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+fn endian_casts() { -+ #[cfg_attr(rustfmt, rustfmt_skip)] -+ let x = i8x16::new( -+ 0, 1, 2, 3, 4, 5, 6, 7, -+ 8, 9, 10, 11, 12, 13, 14, 15, -+ ); -+ let t: i16x16 = x.into(); // simd_cast -+ #[cfg_attr(rustfmt, rustfmt_skip)] -+ let e = i16x16::new( -+ 0, 1, 2, 3, 4, 5, 6, 7, -+ 8, 9, 10, 11, 12, 13, 14, 15, -+ ); -+ assert_eq!(t, e); -+} -+ -+#[cfg_attr(not(target_arch = "wasm32"), test)] -+#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+fn endian_load_and_stores() { -+ #[cfg_attr(rustfmt, rustfmt_skip)] -+ let x = i8x16::new( -+ 0, 1, 2, 3, 4, 5, 6, 7, -+ 8, 9, 10, 11, 12, 13, 14, 15, -+ ); -+ let mut y: [i16; 8] = [0; 8]; -+ x.write_to_slice_unaligned(unsafe { -+ slice::from_raw_parts_mut(&mut y as *mut _ as *mut i8, 16) -+ }); -+ -+ let e: [i16; 8] = if cfg!(target_endian = "little") { -+ [256, 770, 1284, 1798, 2312, 2826, 3340, 3854] -+ } else { -+ [1, 515, 1029, 1543, 2057, 2571, 3085, 3599] -+ }; -+ assert_eq!(y, e); -+ -+ let z = i8x16::from_slice_unaligned(unsafe { -+ slice::from_raw_parts(&y as *const _ as *const i8, 16) -+ }); -+ assert_eq!(z, x); -+} -+ -+#[cfg_attr(not(target_arch = "wasm32"), test)] -+#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+fn endian_array_union() { -+ union A { -+ data: [f32; 4], -+ vec: f32x4, -+ } -+ let x: [f32; 4] = unsafe { A { vec: f32x4::new(0., 1., 2., 3.) }.data }; -+ assert_eq!(x[0], 0_f32); -+ assert_eq!(x[1], 1_f32); -+ assert_eq!(x[2], 2_f32); -+ assert_eq!(x[3], 3_f32); -+ let y: f32x4 = unsafe { A { data: [3., 2., 1., 0.] }.vec }; -+ assert_eq!(y, f32x4::new(3., 2., 1., 0.)); -+ -+ union B { -+ data: [i8; 16], -+ vec: i8x16, -+ } -+ #[cfg_attr(rustfmt, rustfmt_skip)] -+ let x = i8x16::new( -+ 0, 1, 2, 3, 4, 5, 6, 7, -+ 8, 9, 10, 11, 12, 13, 14, 15, -+ ); -+ let x: [i8; 16] = unsafe { B { vec: x }.data }; -+ -+ for i in 0..16 { -+ assert_eq!(x[i], i as i8); -+ } -+ -+ #[cfg_attr(rustfmt, rustfmt_skip)] -+ let y = [ -+ 15, 14, 13, 12, 11, 19, 9, 8, -+ 7, 6, 5, 4, 3, 2, 1, 0 -+ ]; -+ #[cfg_attr(rustfmt, rustfmt_skip)] -+ let e = i8x16::new( -+ 15, 14, 13, 12, 11, 19, 9, 8, -+ 7, 6, 5, 4, 3, 2, 1, 0 -+ ); -+ let z = unsafe { B { data: y }.vec }; -+ assert_eq!(z, e); -+ -+ union C { -+ data: [i16; 8], -+ vec: i8x16, -+ } -+ #[cfg_attr(rustfmt, rustfmt_skip)] -+ let x = i8x16::new( -+ 0, 1, 2, 3, 4, 5, 6, 7, -+ 8, 9, 10, 11, 12, 13, 14, 15, -+ ); -+ let x: [i16; 8] = unsafe { C { vec: x }.data }; -+ -+ let e: [i16; 8] = if cfg!(target_endian = "little") { -+ [256, 770, 1284, 1798, 2312, 2826, 3340, 3854] -+ } else { -+ [1, 515, 1029, 1543, 2057, 2571, 3085, 3599] -+ }; -+ assert_eq!(x, e); -+} -+ -+#[cfg_attr(not(target_arch = "wasm32"), test)] -+#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+fn endian_tuple_access() { -+ type F32x4T = (f32, f32, f32, f32); -+ union A { -+ data: F32x4T, -+ vec: f32x4, -+ } -+ let x: F32x4T = unsafe { A { vec: f32x4::new(0., 1., 2., 3.) }.data }; -+ assert_eq!(x.0, 0_f32); -+ assert_eq!(x.1, 1_f32); -+ assert_eq!(x.2, 2_f32); -+ assert_eq!(x.3, 3_f32); -+ let y: f32x4 = unsafe { A { data: (3., 2., 1., 0.) }.vec }; -+ assert_eq!(y, f32x4::new(3., 2., 1., 0.)); -+ -+ #[cfg_attr(rustfmt, rustfmt_skip)] -+ type I8x16T = (i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8); -+ union B { -+ data: I8x16T, -+ vec: i8x16, -+ } -+ -+ #[cfg_attr(rustfmt, rustfmt_skip)] -+ let x = i8x16::new( -+ 0, 1, 2, 3, 4, 5, 6, 7, -+ 8, 9, 10, 11, 12, 13, 14, 15, -+ ); -+ let x: I8x16T = unsafe { B { vec: x }.data }; -+ -+ assert_eq!(x.0, 0); -+ assert_eq!(x.1, 1); -+ assert_eq!(x.2, 2); -+ assert_eq!(x.3, 3); -+ assert_eq!(x.4, 4); -+ assert_eq!(x.5, 5); -+ assert_eq!(x.6, 6); -+ assert_eq!(x.7, 7); -+ assert_eq!(x.8, 8); -+ assert_eq!(x.9, 9); -+ assert_eq!(x.10, 10); -+ assert_eq!(x.11, 11); -+ assert_eq!(x.12, 12); -+ assert_eq!(x.13, 13); -+ assert_eq!(x.14, 14); -+ assert_eq!(x.15, 15); -+ -+ #[cfg_attr(rustfmt, rustfmt_skip)] -+ let y = ( -+ 15, 14, 13, 12, 11, 10, 9, 8, -+ 7, 6, 5, 4, 3, 2, 1, 0 -+ ); -+ let z: i8x16 = unsafe { B { data: y }.vec }; -+ #[cfg_attr(rustfmt, rustfmt_skip)] -+ let e = i8x16::new( -+ 15, 14, 13, 12, 11, 10, 9, 8, -+ 7, 6, 5, 4, 3, 2, 1, 0 -+ ); -+ assert_eq!(e, z); -+ -+ #[cfg_attr(rustfmt, rustfmt_skip)] -+ type I16x8T = (i16, i16, i16, i16, i16, i16, i16, i16); -+ union C { -+ data: I16x8T, -+ vec: i8x16, -+ } -+ -+ #[cfg_attr(rustfmt, rustfmt_skip)] -+ let x = i8x16::new( -+ 0, 1, 2, 3, 4, 5, 6, 7, -+ 8, 9, 10, 11, 12, 13, 14, 15, -+ ); -+ let x: I16x8T = unsafe { C { vec: x }.data }; -+ -+ let e: [i16; 8] = if cfg!(target_endian = "little") { -+ [256, 770, 1284, 1798, 2312, 2826, 3340, 3854] -+ } else { -+ [1, 515, 1029, 1543, 2057, 2571, 3085, 3599] -+ }; -+ assert_eq!(x.0, e[0]); -+ assert_eq!(x.1, e[1]); -+ assert_eq!(x.2, e[2]); -+ assert_eq!(x.3, e[3]); -+ assert_eq!(x.4, e[4]); -+ assert_eq!(x.5, e[5]); -+ assert_eq!(x.6, e[6]); -+ assert_eq!(x.7, e[7]); -+ -+ #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[repr(C)] -+ #[derive(Copy ,Clone)] -+ pub struct Tup(pub i8, pub i8, pub i16, pub i8, pub i8, pub i16, -+ pub i8, pub i8, pub i16, pub i8, pub i8, pub i16); -+ -+ union D { -+ data: Tup, -+ vec: i8x16, -+ } -+ -+ #[cfg_attr(rustfmt, rustfmt_skip)] -+ let x = i8x16::new( -+ 0, 1, 2, 3, 4, 5, 6, 7, -+ 8, 9, 10, 11, 12, 13, 14, 15, -+ ); -+ let x: Tup = unsafe { D { vec: x }.data }; -+ -+ let e: [i16; 12] = if cfg!(target_endian = "little") { -+ [0, 1, 770, 4, 5, 1798, 8, 9, 2826, 12, 13, 3854] -+ } else { -+ [0, 1, 515, 4, 5, 1543, 8, 9, 2571, 12, 13, 3599] -+ }; -+ assert_eq!(x.0 as i16, e[0]); -+ assert_eq!(x.1 as i16, e[1]); -+ assert_eq!(x.2 as i16, e[2]); -+ assert_eq!(x.3 as i16, e[3]); -+ assert_eq!(x.4 as i16, e[4]); -+ assert_eq!(x.5 as i16, e[5]); -+ assert_eq!(x.6 as i16, e[6]); -+ assert_eq!(x.7 as i16, e[7]); -+ assert_eq!(x.8 as i16, e[8]); -+ assert_eq!(x.9 as i16, e[9]); -+ assert_eq!(x.10 as i16, e[10]); -+ assert_eq!(x.11 as i16, e[11]); -+} -diff --git a/third_party/rust/simd/.cargo-checksum.json b/third_party/rust/simd/.cargo-checksum.json -deleted file mode 100644 -index 5e8c154cda72..000000000000 ---- a/third_party/rust/simd/.cargo-checksum.json -+++ /dev/null -@@ -1 +0,0 @@ --{"files":{"Cargo.toml":"0c7a480c62d7b42604098fa1dd6453be79629112569c494efa75d7fd0998fd69","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6d3a9431e65e69c73a8923e6517b889d17549b23db406b9ec027710d16af701f","README.md":"f426ca32bb44fee39d83d51e481fe6b2640d4b78cb097c952cd75800b886f2fd","benches/mandelbrot.rs":"051b5199e66bca6cf7774e9024915fd4e1349ab39726a10a14e06b60d65d87a4","benches/matrix.rs":"048a21dacdb62365e0105d00d2c8cd6bd2396ac81134f2bff7eb4f7d095fb735","build.rs":"69c9c9029ca969a4bb3f11429bc1424fa75af46143eb0d853b4db3a512859b32","examples/axpy.rs":"4307626045d64ec08361c97c9c72c5dc8d361bdc88f64453b97ac0212041a1b2","examples/convert.rs":"8e658fde050f8a0d8b84ad7570446b10fcf544afbd551b940ca340474f324840","examples/dot-product.rs":"6fe2e007c147af5353804173a593c5b9d57dbccec156e1da37e9e32537363f91","examples/fannkuch-redux-nosimd.rs":"7b2fbde35e8666929d14d67328471cb0483d038a5325232f8db148b30865312b","examples/fannkuch-redux.rs":"ea21fdbd2274488a62cc984acad6e0b65d52f24fb4ff63b7057a3a667e9c8aae","examples/mandelbrot.rs":"71be242543c1e487145d7f16341c05d05d86109de4d9e94c5d6bc9a9c6ed9766","examples/matrix-inverse.rs":"93dbc55c66a72e5f7bc730072f35682523fa20dd362755d8443ad6982143cb5d","examples/nbody-nosimd.rs":"9cf46ea02e266c20f811318f1c5856d5afb9575b2d48d552fbd978f5c1856bdb","examples/nbody.rs":"a864311affab262024479d6348ff51af43d809e9ad332ec30ea4aacceaa2eae1","examples/ops.rs":"b08ea83583df71d0052895d677320a9888da5b6729c9b70636d31ede5128bb7f","examples/spectral-norm-nosimd.rs":"ffc8512ecde779078ea467f38f423a0ea623c63da7078193f9dd370200773f79","examples/spectral-norm.rs":"edb09c9d477f83939098cfb77a27cc298bc7a0c8a8e29cece0cccae0d70d890e","src/aarch64/mod.rs":"83f52775364c98de0cecb7e1509530c18972e932469f5f1522aa24a735d0fa37","src/aarch64/neon.rs":"3c05ea43b7261b9af9c0d904b37de01c2ba99caedcb464700f16617b672965a1","src/arm/mod.rs":"dcdd90bc0b39abaf86a0c8946d442b16313563fbae1ff03248628275c74d8617","src/arm/neon.rs":"71d0bb6dac5f58599bb825449701a05cf32f6eca1918e80d060b746e69751c37","src/common.rs":"c5a7b937c5cd8c3bccf0fb20d5d77770c0d9b0dd9fa06a661c6f2ddf118e65c0","src/lib.rs":"a24a207e65468de2189297380747e2f2f33ec2317f4b83f0665d34b1c09feb08","src/sixty_four.rs":"d168776d02acf943bda8044b24e644b7a9584197a223eba1a7c3024b205dc87d","src/v256.rs":"34bfde3676e23f6925db5d0408ae838e3aab7706128fd7c33e855b8579c69318","src/x86/avx.rs":"efcf2120a904a89b0adf2d3d3bdd0ca17df2ec058410af23fb7e81915873f808","src/x86/avx2.rs":"3bcb3f391ad5f16f0a6da0bc1301329beb478ad6265bd3b2c9c124fc2e6198e5","src/x86/mod.rs":"0acc5a5e2672e2a0fddc11065663be8b8fa2da87320ea291fa86ff8c2f33edf5","src/x86/sse2.rs":"8807fb04bbfb404e17fcacf1e21d22616f8b377540a227b1fd03c121879122dd","src/x86/sse3.rs":"9bd01a4f08069ca4f445952e744d651efe887e3835b18872e757375f0d053bd2","src/x86/sse4_1.rs":"9ceb80dd70a7e7dfeef508cb935e1a2637175bc87a3b090f5dea691ff6aa0516","src/x86/sse4_2.rs":"c59321aed8decdce4d0d8570cff46aed02e1a8265647ef7702e9b180fc581254","src/x86/ssse3.rs":"2290f0269bae316b8e0491495645ee38a9bd73525c8572759c1328341c3bdb4c"},"package":"0048b17eb9577ac545c61d85c3559b41dfb4cbea41c9bd9ca6a4f73ff05fda84"} -\ No newline at end of file -diff --git a/third_party/rust/simd/Cargo.toml b/third_party/rust/simd/Cargo.toml -deleted file mode 100644 -index 30279b93556c..000000000000 ---- a/third_party/rust/simd/Cargo.toml -+++ /dev/null -@@ -1,37 +0,0 @@ --# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO --# --# When uploading crates to the registry Cargo will automatically --# "normalize" Cargo.toml files for maximal compatibility --# with all versions of Cargo and also rewrite `path` dependencies --# to registry (e.g. crates.io) dependencies --# --# If you believe there's an error in this file please file an --# issue against the rust-lang/cargo repository. If you're --# editing this file be aware that the upstream Cargo.toml --# will likely look very different (and much more reasonable) -- --[package] --name = "simd" --version = "0.2.3" --authors = ["Huon Wilson "] --description = "`simd` offers limited cross-platform access to SIMD instructions on\nCPUs, as well as raw interfaces to platform-specific instructions.\n(To be obsoleted by the `std::simd` implementation RFC 2366.)\n" --documentation = "https://docs.rs/simd/" --readme = "README.md" --keywords = ["simd", "data-parallel"] --license = "MIT/Apache-2.0" --repository = "https://github.com/hsivonen/simd" --[package.metadata.docs.rs] --features = ["doc"] --[dependencies.serde] --version = "1.0" --optional = true -- --[dependencies.serde_derive] --version = "1.0" --optional = true --[dev-dependencies.cfg-if] --version = "0.1" -- --[features] --doc = [] --with-serde = ["serde", "serde_derive"] -diff --git a/third_party/rust/simd/README.md b/third_party/rust/simd/README.md -deleted file mode 100644 -index 1c34f49bcd91..000000000000 ---- a/third_party/rust/simd/README.md -+++ /dev/null -@@ -1,11 +0,0 @@ --# `simd` -- --[![Build Status](https://travis-ci.org/hsivonen/simd.svg?branch=master)](https://travis-ci.org/hsivonen/simd) --[![crates.io](https://meritbadge.herokuapp.com/simd)](https://crates.io/crates/simd) --[![docs.rs](https://docs.rs/simd/badge.svg)](https://docs.rs/simd/) -- --`simd` offers a basic interface to the SIMD functionality of CPUs. (Note: This crate fails to build unless the target is aarch64, x86_64, i686 (i.e. SSE2 enabled; not i586) or an ARMv7 target (thumb or not) with NEON enabled.) -- --This crate is expected to become _obsolete_ once the implementation of [RFC 2366](https://github.com/rust-lang/rfcs/pull/2366) lands in the standard library. -- --[Documentation](https://docs.rs/simd) -diff --git a/third_party/rust/simd/benches/mandelbrot.rs b/third_party/rust/simd/benches/mandelbrot.rs -deleted file mode 100755 -index 61061a4a301f..000000000000 ---- a/third_party/rust/simd/benches/mandelbrot.rs -+++ /dev/null -@@ -1,117 +0,0 @@ --#![feature(test)] --#![feature(cfg_target_feature)] -- --extern crate simd; --extern crate test; -- --use test::black_box as bb; --use test::Bencher as B; --use simd::{f32x4, u32x4}; --#[cfg(any(target_feature = "avx", target_feature = "avx2"))] --use simd::x86::avx::{f32x8, u32x8}; -- --fn naive(c_x: f32, c_y: f32, max_iter: u32) -> u32 { -- let mut x = c_x; -- let mut y = c_y; -- let mut count = 0; -- while count < max_iter { -- let xy = x * y; -- let xx = x * x; -- let yy = y * y; -- let sum = xx + yy; -- if sum > 4.0 { -- break -- } -- count += 1; -- x = xx - yy + c_x; -- y = xy * 2.0 + c_y; -- } -- count --} -- --fn simd4(c_x: f32x4, c_y: f32x4, max_iter: u32) -> u32x4 { -- let mut x = c_x; -- let mut y = c_y; -- -- let mut count = u32x4::splat(0); -- for _ in 0..max_iter as usize { -- let xy = x * y; -- let xx = x * x; -- let yy = y * y; -- let sum = xx + yy; -- let mask = sum.lt(f32x4::splat(4.0)); -- -- if !mask.any() { break } -- count = count + mask.to_i().select(u32x4::splat(1), u32x4::splat(0)); -- -- x = xx - yy + c_x; -- y = xy + xy + c_y; -- } -- count --} -- --#[cfg(target_feature = "avx")] --fn simd8(c_x: f32x8, c_y: f32x8, max_iter: u32) -> u32x8 { -- let mut x = c_x; -- let mut y = c_y; -- -- let mut count = u32x8::splat(0); -- for _ in 0..max_iter as usize { -- let xy = x * y; -- let xx = x * x; -- let yy = y * y; -- let sum = xx + yy; -- let mask = sum.lt(f32x8::splat(4.0)); -- -- if !mask.any() { break } -- count = count + mask.to_i().select(u32x8::splat(1), u32x8::splat(0)); -- -- x = xx - yy + c_x; -- y = xy + xy + c_y; -- } -- count --} -- --const SCALE: f32 = 3.0 / 100.0; --const N: u32 = 100; --#[bench] --fn mandel_naive(b: &mut B) { -- b.iter(|| { -- for j in 0..100 { -- let y = -1.5 + (j as f32) * SCALE; -- for i in 0..100 { -- let x = -2.2 + (i as f32) * SCALE; -- bb(naive(x, y, N)); -- } -- } -- }) --} --#[bench] --fn mandel_simd4(b: &mut B) { -- let tweak = u32x4::new(0, 1, 2, 3); -- b.iter(|| { -- for j in 0..100 { -- let y = f32x4::splat(-1.5) + f32x4::splat(SCALE) * u32x4::splat(j).to_f32(); -- for i in 0..25 { -- let i = u32x4::splat(i * 4) + tweak; -- let x = f32x4::splat(-2.2) + f32x4::splat(SCALE) * i.to_f32(); -- bb(simd4(x, y, N)); -- } -- } -- }) --} --#[cfg(any(target_feature = "avx", target_feature = "avx2"))] --#[bench] --fn mandel_simd8(b: &mut B) { -- let tweak = u32x8::new(0, 1, 2, 3, 4, 5, 6, 7); -- b.iter(|| { -- for j in 0..100 { -- let y = f32x8::splat(-1.5) + f32x8::splat(SCALE) * u32x8::splat(j).to_f32(); -- for i in 0..13 { // 100 not divisible by 8 :( -- let i = u32x8::splat(i * 8) + tweak; -- let x = f32x8::splat(-2.2) + f32x8::splat(SCALE) * i.to_f32(); -- bb(simd8(x, y, N)); -- } -- } -- }) --} -diff --git a/third_party/rust/simd/benches/matrix.rs b/third_party/rust/simd/benches/matrix.rs -deleted file mode 100755 -index 36aa88237492..000000000000 ---- a/third_party/rust/simd/benches/matrix.rs -+++ /dev/null -@@ -1,485 +0,0 @@ --#![feature(test)] --#![feature(cfg_target_feature)] --extern crate test; --extern crate simd; -- --use test::black_box as bb; --use test::Bencher as B; --use simd::f32x4; --#[cfg(target_feature = "avx")] --use simd::x86::avx::{f32x8, f64x4}; --// #[cfg(target_feature = "avx2")] --// use simd::x86::avx2::Avx2F32x8; -- -- --#[bench] --fn multiply_naive(b: &mut B) { -- let x = [[1.0_f32; 4]; 4]; -- let y = [[2.0; 4]; 4]; -- b.iter(|| { -- for _ in 0..100 { -- let (x, y) = bb((&x, &y)); -- -- bb(&[[x[0][0] * y[0][0] + x[1][0] * y[0][1] + x[2][0] * y[0][2] + x[3][0] * y[0][3], -- x[0][1] * y[0][0] + x[1][1] * y[0][1] + x[2][1] * y[0][2] + x[3][1] * y[0][3], -- x[0][2] * y[0][0] + x[1][2] * y[0][1] + x[2][2] * y[0][2] + x[3][2] * y[0][3], -- x[0][3] * y[0][0] + x[1][3] * y[0][1] + x[2][3] * y[0][2] + x[3][3] * y[0][3]], -- [x[0][0] * y[1][0] + x[1][0] * y[1][1] + x[2][0] * y[1][2] + x[3][0] * y[1][3], -- x[0][1] * y[1][0] + x[1][1] * y[1][1] + x[2][1] * y[1][2] + x[3][1] * y[1][3], -- x[0][2] * y[1][0] + x[1][2] * y[1][1] + x[2][2] * y[1][2] + x[3][2] * y[1][3], -- x[0][3] * y[1][0] + x[1][3] * y[1][1] + x[2][3] * y[1][2] + x[3][3] * y[1][3]], -- [x[0][0] * y[2][0] + x[1][0] * y[2][1] + x[2][0] * y[2][2] + x[3][0] * y[2][3], -- x[0][1] * y[2][0] + x[1][1] * y[2][1] + x[2][1] * y[2][2] + x[3][1] * y[2][3], -- x[0][2] * y[2][0] + x[1][2] * y[2][1] + x[2][2] * y[2][2] + x[3][2] * y[2][3], -- x[0][3] * y[2][0] + x[1][3] * y[2][1] + x[2][3] * y[2][2] + x[3][3] * y[2][3]], -- [x[0][0] * y[3][0] + x[1][0] * y[3][1] + x[2][0] * y[3][2] + x[3][0] * y[3][3], -- x[0][1] * y[3][0] + x[1][1] * y[3][1] + x[2][1] * y[3][2] + x[3][1] * y[3][3], -- x[0][2] * y[3][0] + x[1][2] * y[3][1] + x[2][2] * y[3][2] + x[3][2] * y[3][3], -- x[0][3] * y[3][0] + x[1][3] * y[3][1] + x[2][3] * y[3][2] + x[3][3] * y[3][3]], -- ]); -- } -- }) --} -- --#[bench] --fn multiply_simd4_32(b: &mut B) { -- let x = [f32x4::splat(1.0_f32); 4]; -- let y = [f32x4::splat(2.0); 4]; -- b.iter(|| { -- for _ in 0..100 { -- let (x, y) = bb((&x, &y)); -- -- let y0 = y[0]; -- let y1 = y[1]; -- let y2 = y[2]; -- let y3 = y[3]; -- bb(&[f32x4::splat(y0.extract(0)) * x[0] + -- f32x4::splat(y0.extract(1)) * x[1] + -- f32x4::splat(y0.extract(2)) * x[2] + -- f32x4::splat(y0.extract(3)) * x[3], -- f32x4::splat(y1.extract(0)) * x[0] + -- f32x4::splat(y1.extract(1)) * x[1] + -- f32x4::splat(y1.extract(2)) * x[2] + -- f32x4::splat(y1.extract(3)) * x[3], -- f32x4::splat(y2.extract(0)) * x[0] + -- f32x4::splat(y2.extract(1)) * x[1] + -- f32x4::splat(y2.extract(2)) * x[2] + -- f32x4::splat(y2.extract(3)) * x[3], -- f32x4::splat(y3.extract(0)) * x[0] + -- f32x4::splat(y3.extract(1)) * x[1] + -- f32x4::splat(y3.extract(2)) * x[2] + -- f32x4::splat(y3.extract(3)) * x[3], -- ]); -- } -- }) --} -- --#[cfg(target_feature = "avx")] --#[bench] --fn multiply_simd4_64(b: &mut B) { -- let x = [f64x4::splat(1.0_f64); 4]; -- let y = [f64x4::splat(2.0); 4]; -- b.iter(|| { -- for _ in 0..100 { -- let (x, y) = bb((&x, &y)); -- -- let y0 = y[0]; -- let y1 = y[1]; -- let y2 = y[2]; -- let y3 = y[3]; -- bb(&[f64x4::splat(y0.extract(0)) * x[0] + -- f64x4::splat(y0.extract(1)) * x[1] + -- f64x4::splat(y0.extract(2)) * x[2] + -- f64x4::splat(y0.extract(3)) * x[3], -- f64x4::splat(y1.extract(0)) * x[0] + -- f64x4::splat(y1.extract(1)) * x[1] + -- f64x4::splat(y1.extract(2)) * x[2] + -- f64x4::splat(y1.extract(3)) * x[3], -- f64x4::splat(y2.extract(0)) * x[0] + -- f64x4::splat(y2.extract(1)) * x[1] + -- f64x4::splat(y2.extract(2)) * x[2] + -- f64x4::splat(y2.extract(3)) * x[3], -- f64x4::splat(y3.extract(0)) * x[0] + -- f64x4::splat(y3.extract(1)) * x[1] + -- f64x4::splat(y3.extract(2)) * x[2] + -- f64x4::splat(y3.extract(3)) * x[3], -- ]); -- } -- }) --} -- --#[bench] --fn inverse_naive(b: &mut B) { -- let mut x = [[0_f32; 4]; 4]; -- for i in 0..4 { x[i][i] = 1.0 } -- -- b.iter(|| { -- for _ in 0..100 { -- let x = bb(&x); -- -- let mut t = [[0_f32; 4]; 4]; -- for i in 0..4 { -- t[0][i] = x[i][0]; -- t[1][i] = x[i][1]; -- t[2][i] = x[i][2]; -- t[3][i] = x[i][3]; -- } -- -- let _0 = t[2][2] * t[3][3]; -- let _1 = t[2][3] * t[3][2]; -- let _2 = t[2][1] * t[3][3]; -- let _3 = t[2][3] * t[3][1]; -- let _4 = t[2][1] * t[3][2]; -- let _5 = t[2][2] * t[3][1]; -- let _6 = t[2][0] * t[3][3]; -- let _7 = t[2][3] * t[3][0]; -- let _8 = t[2][0] * t[3][2]; -- let _9 = t[2][2] * t[3][0]; -- let _10 = t[2][0] * t[3][1]; -- let _11 = t[2][1] * t[3][0]; -- -- let d00 = _0 * t[1][1] + _3 * t[1][2] + _4 * t[1][3] - -- (_1 * t[1][1] + _2 * t[1][2] + _5 * t[1][3]); -- let d01 = _1 * t[1][0] + _6 * t[1][2] + _9 * t[1][3] - -- (_0 * t[1][0] + _7 * t[1][2] + _8 * t[1][3]); -- let d02 = _2 * t[1][0] + _7 * t[1][1] + _10 * t[1][3] - -- (_3 * t[1][0] + _6 * t[1][1] + _11 * t[1][3]); -- let d03 = _5 * t[1][0] + _8 * t[1][1] + _11 * t[1][2] - -- (_4 * t[1][0] + _9 * t[1][1] + _10 * t[1][2]); -- let d10 = _1 * t[0][1] + _2 * t[0][2] + _5 * t[0][3] - -- (_0 * t[0][1] + _3 * t[0][2] + _4 * t[0][3]); -- let d11 = _0 * t[0][0] + _7 * t[0][2] + _8 * t[0][3] - -- (_1 * t[0][0] + _6 * t[0][2] + _9 * t[0][3]); -- let d12 = _3 * t[0][0] + _6 * t[0][1] + _11 * t[0][3] - -- (_2 * t[0][0] + _7 * t[0][1] + _10 * t[0][3]); -- let d13 = _4 * t[0][0] + _9 * t[0][1] + _10 * t[0][2] - -- (_5 * t[0][0] + _8 * t[0][1] + _11 * t[0][2]); -- -- let _0 = t[0][2] * t[1][3]; -- let _1 = t[0][3] * t[1][2]; -- let _2 = t[0][1] * t[1][3]; -- let _3 = t[0][3] * t[1][1]; -- let _4 = t[0][1] * t[1][2]; -- let _5 = t[0][2] * t[1][1]; -- let _6 = t[0][0] * t[1][3]; -- let _7 = t[0][3] * t[1][0]; -- let _8 = t[0][0] * t[1][2]; -- let _9 = t[0][2] * t[1][0]; -- let _10 = t[0][0] * t[1][1]; -- let _11 = t[0][1] * t[1][0]; -- -- let d20 = _0*t[3][1] + _3*t[3][2] + _4*t[3][3]- -- (_1*t[3][1] + _2*t[3][2] + _5*t[3][3]); -- let d21 = _1*t[3][0] + _6*t[3][2] + _9*t[3][3]- -- (_0*t[3][0] + _7*t[3][2] + _8*t[3][3]); -- let d22 = _2*t[3][0] + _7*t[3][1] + _10*t[3][3]- -- (_3*t[3][0] + _6*t[3][1] + _11*t[3][3]); -- let d23 = _5*t[3][0] + _8*t[3][1] + _11*t[3][2]- -- (_4*t[3][0] + _9*t[3][1] + _10*t[3][2]); -- let d30 = _2*t[2][2] + _5*t[2][3] + _1*t[2][1]- -- (_4*t[2][3] + _0*t[2][1] + _3*t[2][2]); -- let d31 = _8*t[2][3] + _0*t[2][0] + _7*t[2][2]- -- (_6*t[2][2] + _9*t[2][3] + _1*t[2][0]); -- let d32 = _6*t[2][1] + _11*t[2][3] + _3*t[2][0]- -- (_10*t[2][3] + _2*t[2][0] + _7*t[2][1]); -- let d33 = _10*t[2][2] + _4*t[2][0] + _9*t[2][1]- -- (_8*t[2][1] + _11*t[2][2] + _5*t[2][0]); -- -- let det = t[0][0] * d00 + t[0][1] * d01 + t[0][2] * d02 + t[0][3] * d03; -- -- let det = 1.0 / det; -- let mut ret = [[d00, d01, d02, d03], -- [d10, d11, d12, d13], -- [d20, d21, d22, d23], -- [d30, d31, d32, d33]]; -- for i in 0..4 { -- for j in 0..4 { -- ret[i][j] *= det; -- } -- } -- bb(&ret); -- } -- }) --} -- --#[bench] --fn inverse_simd4(b: &mut B) { -- let mut x = [f32x4::splat(0_f32); 4]; -- for i in 0..4 { x[i] = x[i].replace(i as u32, 1.0); } -- -- fn shuf0145(v: f32x4, w: f32x4) -> f32x4 { -- f32x4::new(v.extract(0), v.extract(1), -- w.extract(4 - 4), w.extract(5 - 4)) -- } -- fn shuf0246(v: f32x4, w: f32x4) -> f32x4 { -- f32x4::new(v.extract(0), v.extract(2), -- w.extract(4 - 4), w.extract(6 - 4)) -- } -- fn shuf1357(v: f32x4, w: f32x4) -> f32x4 { -- f32x4::new(v.extract(1), v.extract(3), -- w.extract(5 - 4), w.extract(7 - 4)) -- } -- fn shuf2367(v: f32x4, w: f32x4) -> f32x4 { -- f32x4::new(v.extract(2), v.extract(3), -- w.extract(6 - 4), w.extract(7 - 4)) -- } -- -- fn swiz1032(v: f32x4) -> f32x4 { -- f32x4::new(v.extract(1), v.extract(0), -- v.extract(3), v.extract(2)) -- } -- fn swiz2301(v: f32x4) -> f32x4 { -- f32x4::new(v.extract(2), v.extract(3), -- v.extract(0), v.extract(1)) -- } -- -- b.iter(|| { -- for _ in 0..100 { -- let src0; -- let src1; -- let src2; -- let src3; -- let mut tmp1; -- let row0; -- let mut row1; -- let mut row2; -- let mut row3; -- let mut minor0; -- let mut minor1; -- let mut minor2; -- let mut minor3; -- let mut det; -- -- let x = bb(&x); -- src0 = x[0]; -- src1 = x[1]; -- src2 = x[2]; -- src3 = x[3]; -- -- tmp1 = shuf0145(src0, src1); -- row1 = shuf0145(src2, src3); -- row0 = shuf0246(tmp1, row1); -- row1 = shuf1357(row1, tmp1); -- -- tmp1 = shuf2367(src0, src1); -- row3 = shuf2367(src2, src3); -- row2 = shuf0246(tmp1, row3); -- row3 = shuf0246(row3, tmp1); -- -- -- tmp1 = row2 * row3; -- tmp1 = swiz1032(tmp1); -- minor0 = row1 * tmp1; -- minor1 = row0 * tmp1; -- tmp1 = swiz2301(tmp1); -- minor0 = (row1 * tmp1) - minor0; -- minor1 = (row0 * tmp1) - minor1; -- minor1 = swiz2301(minor1); -- -- -- tmp1 = row1 * row2; -- tmp1 = swiz1032(tmp1); -- minor0 = (row3 * tmp1) + minor0; -- minor3 = row0 * tmp1; -- tmp1 = swiz2301(tmp1); -- -- minor0 = minor0 - row3 * tmp1; -- minor3 = row0 * tmp1 - minor3; -- minor3 = swiz2301(minor3); -- -- -- tmp1 = row3 * swiz2301(row1); -- tmp1 = swiz1032(tmp1); -- row2 = swiz2301(row2); -- minor0 = row2 * tmp1 + minor0; -- minor2 = row0 * tmp1; -- tmp1 = swiz2301(tmp1); -- minor0 = minor0 - row2 * tmp1; -- minor2 = row0 * tmp1 - minor2; -- minor2 = swiz2301(minor2); -- -- -- tmp1 = row0 * row1; -- tmp1 = swiz1032(tmp1); -- minor2 = minor2 + row3 * tmp1; -- minor3 = row2 * tmp1 - minor3; -- tmp1 = swiz2301(tmp1); -- minor2 = row3 * tmp1 - minor2; -- minor3 = minor3 - row2 * tmp1; -- -- -- -- tmp1 = row0 * row3; -- tmp1 = swiz1032(tmp1); -- minor1 = minor1 - row2 * tmp1; -- minor2 = row1 * tmp1 + minor2; -- tmp1 = swiz2301(tmp1); -- minor1 = row2 * tmp1 + minor1; -- minor2 = minor2 - row1 * tmp1; -- -- tmp1 = row0 * row2; -- tmp1 = swiz1032(tmp1); -- minor1 = row3 * tmp1 + minor1; -- minor3 = minor3 - row1 * tmp1; -- tmp1 = swiz2301(tmp1); -- minor1 = minor1 - row3 * tmp1; -- minor3 = row1 * tmp1 + minor3; -- -- det = row0 * minor0; -- det = swiz2301(det) + det; -- det = swiz1032(det) + det; -- //tmp1 = det.approx_reciprocal(); det = tmp1 * (f32x4::splat(2.0) - det * tmp1); -- det = f32x4::splat(1.0) / det; -- -- bb(&[minor0 * det, minor1 * det, minor2 * det, minor3 * det]); -- } -- }) -- --} -- --#[bench] --fn transpose_naive(b: &mut B) { -- let x = [[0_f32; 4]; 4]; -- b.iter(|| { -- for _ in 0..100 { -- let x = bb(&x); -- bb(&[[x[0][0], x[1][0], x[2][0], x[3][0]], -- [x[0][1], x[1][1], x[2][1], x[3][1]], -- [x[0][2], x[1][2], x[2][2], x[3][2]], -- [x[0][3], x[1][3], x[2][3], x[3][3]]]); -- } -- }) --} -- --#[bench] --fn transpose_simd4(b: &mut B) { -- let x = [f32x4::splat(0_f32); 4]; -- -- fn shuf0246(v: f32x4, w: f32x4) -> f32x4 { -- f32x4::new(v.extract(0), v.extract(2), -- w.extract(4 - 4), w.extract(6 - 4)) -- } -- fn shuf1357(v: f32x4, w: f32x4) -> f32x4 { -- f32x4::new(v.extract(1), v.extract(3), -- w.extract(5 - 4), w.extract(7 - 4)) -- } -- b.iter(|| { -- for _ in 0..100 { -- let x = bb(&x); -- let x0 = x[0]; -- let x1 = x[1]; -- let x2 = x[2]; -- let x3 = x[3]; -- -- let a0 = shuf0246(x0, x1); -- let a1 = shuf0246(x2, x3); -- let a2 = shuf1357(x0, x1); -- let a3 = shuf1357(x2, x3); -- -- let b0 = shuf0246(a0, a1); -- let b1 = shuf0246(a2, a3); -- let b2 = shuf1357(a0, a1); -- let b3 = shuf1357(a2, a3); -- bb(&[b0, b1, b2, b3]); -- } -- }) --} -- --#[cfg(target_feature = "avx")] --#[bench] --fn transpose_simd8_naive(b: &mut B) { -- let x = [f32x8::splat(0_f32); 2]; -- -- fn shuf0246(v: f32x8, w: f32x8) -> f32x8 { -- f32x8::new(v.extract(0), v.extract(2), v.extract(4), v.extract(6), -- w.extract(0), w.extract(2), w.extract(4), w.extract(6)) -- } -- fn shuf1357(v: f32x8, w: f32x8) -> f32x8 { -- f32x8::new(v.extract(1), v.extract(3), v.extract(5), v.extract(7), -- w.extract(1), w.extract(3), w.extract(5), w.extract(7),) -- } -- b.iter(|| { -- for _ in 0..100 { -- let x = bb(&x); -- let x01 = x[0]; -- let x23 = x[1]; -- -- let a01 = shuf0246(x01, x23); -- let a23 = shuf1357(x01, x23); -- -- let b01 = shuf0246(a01, a23); -- let b23 = shuf1357(a01, a23); -- bb(&[b01, b23]); -- } -- }) --} -- --#[cfg(target_feature = "avx")] --#[bench] --fn transpose_simd8_avx2_vpermps(b: &mut B) { -- let x = [f32x8::splat(0_f32); 2]; -- -- // efficient on AVX2 using vpermps -- fn perm04152637(v: f32x8) -> f32x8 { -- // broken on rustc 1.7.0-nightly (1ddaf8bdf 2015-12-12) -- // v.permutevar(i32x8::new(0, 4, 1, 5, 2, 6, 3, 7)) -- f32x8::new(v.extract(0), v.extract(4), v.extract(1), v.extract(5), -- v.extract(2), v.extract(6), v.extract(3), v.extract(7)) -- } -- fn shuf_lo(v: f32x8, w: f32x8) -> f32x8 { -- f32x8::new(v.extract(0), v.extract(1), w.extract(0), w.extract(1), -- v.extract(4), v.extract(5), w.extract(4), w.extract(5),) -- } -- fn shuf_hi(v: f32x8, w: f32x8) -> f32x8 { -- f32x8::new(v.extract(2), v.extract(3), w.extract(2), w.extract(3), -- v.extract(6), v.extract(7), w.extract(6), w.extract(7),) -- } -- b.iter(|| { -- for _ in 0..100 { -- let x = bb(&x); -- let x01 = x[0]; -- let x23 = x[1]; -- -- let a01 = perm04152637(x01); -- let a23 = perm04152637(x23); -- -- let b01 = shuf_lo(a01, a23); -- let b23 = shuf_hi(a01, a23); -- bb(&[b01, b23]); -- } -- }) --} -- --#[cfg(target_feature = "avx")] --#[bench] --fn transpose_simd8_avx2_vpermpd(b: &mut B) { -- let x = [f32x8::splat(0_f32); 2]; -- -- // efficient on AVX2 using vpermpd -- fn perm01452367(v: f32x8) -> f32x8 { -- f32x8::new(v.extract(0), v.extract(1), v.extract(4), v.extract(5), -- v.extract(2), v.extract(3), v.extract(6), v.extract(7)) -- } -- fn shuf_lo_ps(v: f32x8, w: f32x8) -> f32x8 { -- f32x8::new(v.extract(0), w.extract(0), v.extract(1), w.extract(1), -- v.extract(4), w.extract(4), v.extract(5), w.extract(5),) -- } -- fn shuf_hi_ps(v: f32x8, w: f32x8) -> f32x8 { -- f32x8::new(v.extract(2), w.extract(2), v.extract(3), w.extract(3), -- v.extract(6), w.extract(6), v.extract(7), w.extract(7),) -- } -- b.iter(|| { -- for _ in 0..100 { -- let x = bb(&x); -- let x01 = x[0]; -- let x23 = x[1]; -- -- let a01 = perm01452367(x01); -- let a23 = perm01452367(x23); -- -- let b01 = shuf_lo_ps(a01, a23); -- let b23 = shuf_hi_ps(a01, a23); -- bb(&[b01, b23]); -- } -- }) --} -diff --git a/third_party/rust/simd/build.rs b/third_party/rust/simd/build.rs -deleted file mode 100644 -index 61b5330a1846..000000000000 ---- a/third_party/rust/simd/build.rs -+++ /dev/null -@@ -1,3 +0,0 @@ --fn main() { -- println!("cargo:rustc-env=RUSTC_BOOTSTRAP=1"); --} -diff --git a/third_party/rust/simd/examples/axpy.rs b/third_party/rust/simd/examples/axpy.rs -deleted file mode 100755 -index 7862721b254d..000000000000 ---- a/third_party/rust/simd/examples/axpy.rs -+++ /dev/null -@@ -1,65 +0,0 @@ --#![feature(cfg_target_feature)] --extern crate simd; --use simd::f32x4; --#[cfg(target_feature = "avx")] --use simd::x86::avx::f32x8; -- --#[inline(never)] --pub fn axpy(z: &mut [f32], a: f32, x: &[f32], y: &[f32]) { -- assert_eq!(x.len(), y.len()); -- assert_eq!(x.len(), z.len()); -- -- let len = std::cmp::min(std::cmp::min(x.len(), y.len()), z.len()); -- -- let mut i = 0; -- while i < len & !3 { -- let x = f32x4::load(x, i); -- let y = f32x4::load(y, i); -- (f32x4::splat(a) * x + y).store(z, i); -- i += 4 -- } --} -- --#[cfg(target_feature = "avx")] --#[inline(never)] --pub fn axpy8(z: &mut [f32], a: f32, x: &[f32], y: &[f32]) { -- assert_eq!(x.len(), y.len()); -- assert_eq!(x.len(), z.len()); -- -- let len = std::cmp::min(std::cmp::min(x.len(), y.len()), z.len()); -- -- let mut i = 0; -- while i < len & !7 { -- let x = f32x8::load(x, i); -- let y = f32x8::load(y, i); -- (f32x8::splat(a) * x + y).store(z, i); -- i += 8 -- } --} -- -- --#[cfg(not(target_feature = "avx"))] --pub fn axpy8(_: &mut [f32], _: f32, _: &[f32], _: &[f32]) { -- unimplemented!() --} -- -- --fn main() { -- let mut z = vec![0.; 4]; -- axpy(&mut z, 2., &[1.0, 3.0, 5.0, 7.0], &[2.0, 4.0, 6.0, 8.0]); -- println!("{:?}", z); -- let mut z = vec![0.; 8]; -- axpy(&mut z, 3., &[1.0, 3.0, 6.0, 7.0, 10.0, 6.0, 3.0, 2.0], -- &[2.0, 4.0, 6.0, 8.0, 2.0, 4.0, 6.0, 8.0]); -- println!("{:?}", z); -- -- if cfg!(target_feature = "avx") { -- let mut z = vec![0.; 4]; -- axpy8(&mut z, 2., &[1.0, 3.0, 5.0, 7.0], &[2.0, 4.0, 6.0, 8.0]); -- println!("{:?}", z); -- let mut z = vec![0.; 8]; -- axpy8(&mut z, 3., &[1.0, 3.0, 6.0, 7.0, 10.0, 6.0, 3.0, 2.0], -- &[2.0, 4.0, 6.0, 8.0, 2.0, 4.0, 6.0, 8.0]); -- println!("{:?}", z); -- } --} -diff --git a/third_party/rust/simd/examples/convert.rs b/third_party/rust/simd/examples/convert.rs -deleted file mode 100644 -index 11823a4b50d2..000000000000 ---- a/third_party/rust/simd/examples/convert.rs -+++ /dev/null -@@ -1,38 +0,0 @@ --extern crate simd; --use simd::f32x4; -- --#[inline(never)] --pub fn convert_scalar(x: &mut [i32], y: &[f32]) { -- assert_eq!(x.len(), y.len()); -- -- let mut i = 0; -- while i < x.len() & !3 { -- x[i] = y[i] as i32; -- i += 1; -- } --} -- --#[inline(never)] --pub fn convert(x: &mut [i32], y: &[f32]) { -- assert_eq!(x.len(), y.len()); -- -- let mut i = 0; -- while i < x.len() & !3 { -- let v = f32x4::load(y, i); -- v.to_i32().store(x, i); -- i += 4 -- } --} -- --fn main() { -- let x = &mut [0; 12]; -- let y = [1.0; 12]; -- convert(x, &y); -- convert_scalar(x, &y); -- println!("{:?}", x); -- let x = &mut [0; 16]; -- let y = [1.0; 16]; -- convert(x, &y); -- convert_scalar(x, &y); -- println!("{:?}", x); --} -diff --git a/third_party/rust/simd/examples/dot-product.rs b/third_party/rust/simd/examples/dot-product.rs -deleted file mode 100755 -index 9f0e1d35c799..000000000000 ---- a/third_party/rust/simd/examples/dot-product.rs -+++ /dev/null -@@ -1,60 +0,0 @@ --#![feature(cfg_target_feature)] --extern crate simd; --use simd::f32x4; --#[cfg(target_feature = "avx")] --use simd::x86::avx::{f32x8, LowHigh128}; -- --#[inline(never)] --pub fn dot(x: &[f32], y: &[f32]) -> f32 { -- assert_eq!(x.len(), y.len()); -- -- let len = std::cmp::min(x.len(), y.len()); -- -- let mut sum = f32x4::splat(0.0); -- let mut i = 0; -- while i < len & !3 { -- let x = f32x4::load(x, i); -- let y = f32x4::load(y, i); -- sum = sum + x * y; -- i += 4 -- } -- sum.extract(0) + sum.extract(1) + sum.extract(2) + sum.extract(3) --} -- --#[cfg(target_feature = "avx")] --#[inline(never)] --pub fn dot8(x: &[f32], y: &[f32]) -> f32 { -- assert_eq!(x.len(), y.len()); -- -- let len = std::cmp::min(x.len(), y.len()); -- -- let mut sum = f32x8::splat(0.0); -- let mut i = 0; -- while i < len & !7 { -- let x = f32x8::load(x, i); -- let y = f32x8::load(y, i); -- sum = sum + x * y; -- i += 8 -- } -- let sum = sum.low() + sum.high(); -- sum.extract(0) + sum.extract(1) + sum.extract(2) + sum.extract(3) --} -- -- --#[cfg(not(target_feature = "avx"))] --pub fn dot8(_: &[f32], _: &[f32]) -> f32 { -- unimplemented!() --} -- -- --fn main() { -- println!("{}", dot(&[1.0, 3.0, 5.0, 7.0], &[2.0, 4.0, 6.0, 8.0])); -- println!("{}", dot(&[1.0, 3.0, 6.0, 7.0, 10.0, 6.0, 3.0, 2.0], -- &[2.0, 4.0, 6.0, 8.0, 2.0, 4.0, 6.0, 8.0])); -- -- if cfg!(target_feature = "avx") { -- println!("{}", dot8(&[1.0, 3.0, 5.0, 7.0], &[2.0, 4.0, 6.0, 8.0])); -- println!("{}", dot8(&[1.0, 3.0, 6.0, 7.0, 10.0, 6.0, 3.0, 2.0], -- &[2.0, 4.0, 6.0, 8.0, 2.0, 4.0, 6.0, 8.0])); -- } --} -diff --git a/third_party/rust/simd/examples/fannkuch-redux-nosimd.rs b/third_party/rust/simd/examples/fannkuch-redux-nosimd.rs -deleted file mode 100644 -index fa30b2283f93..000000000000 ---- a/third_party/rust/simd/examples/fannkuch-redux-nosimd.rs -+++ /dev/null -@@ -1,156 +0,0 @@ --// The Computer Language Benchmarks Game --// http://benchmarksgame.alioth.debian.org/ --// --// contributed by the Rust Project Developers --// contributed by TeXitoi -- --use std::{cmp, mem}; --use std::thread; -- --fn rotate(x: &mut [i32]) { -- let mut prev = x[0]; -- for place in x.iter_mut().rev() { -- prev = mem::replace(place, prev) -- } --} -- --fn next_permutation(perm: &mut [i32], count: &mut [i32]) { -- for i in 1..perm.len() { -- rotate(&mut perm[.. i + 1]); -- let count_i = &mut count[i]; -- if *count_i >= i as i32 { -- *count_i = 0; -- } else { -- *count_i += 1; -- break -- } -- } --} -- --#[derive(Clone, Copy)] --struct P { -- p: [i32; 16], --} -- --#[derive(Clone, Copy)] --struct Perm { -- cnt: [i32; 16], -- fact: [u32; 16], -- n: u32, -- permcount: u32, -- perm: P, --} -- --impl Perm { -- fn new(n: u32) -> Perm { -- let mut fact = [1; 16]; -- for i in 1 .. n as usize + 1 { -- fact[i] = fact[i - 1] * i as u32; -- } -- Perm { -- cnt: [0; 16], -- fact: fact, -- n: n, -- permcount: 0, -- perm: P { p: [0; 16 ] } -- } -- } -- -- fn get(&mut self, mut idx: i32) -> P { -- let mut pp = [0u8; 16]; -- self.permcount = idx as u32; -- for (i, place) in self.perm.p.iter_mut().enumerate() { -- *place = i as i32 + 1; -- } -- -- for i in (1 .. self.n as usize).rev() { -- let d = idx / self.fact[i] as i32; -- self.cnt[i] = d; -- idx %= self.fact[i] as i32; -- for (place, val) in pp.iter_mut().zip(self.perm.p[..(i+1)].iter()) { -- *place = (*val) as u8 -- } -- -- let d = d as usize; -- for j in 0 .. i + 1 { -- self.perm.p[j] = if j + d <= i {pp[j + d]} else {pp[j+d-i-1]} as i32; -- } -- } -- -- self.perm -- } -- -- fn count(&self) -> u32 { self.permcount } -- fn max(&self) -> u32 { self.fact[self.n as usize] } -- -- fn next(&mut self) -> P { -- next_permutation(&mut self.perm.p, &mut self.cnt); -- self.permcount += 1; -- -- self.perm -- } --} -- -- --fn reverse(tperm: &mut [i32], k: usize) { -- tperm[..k].reverse() --} -- --fn work(mut perm: Perm, n: usize, max: usize) -> (i32, i32) { -- let mut checksum = 0; -- let mut maxflips = 0; -- -- let mut p = perm.get(n as i32); -- -- while perm.count() < max as u32 { -- let mut flips = 0; -- -- while p.p[0] != 1 { -- let k = p.p[0] as usize; -- reverse(&mut p.p, k); -- flips += 1; -- } -- -- checksum += if perm.count() % 2 == 0 {flips} else {-flips}; -- maxflips = cmp::max(maxflips, flips); -- -- p = perm.next(); -- } -- -- (checksum, maxflips) --} -- --fn fannkuch(n: i32) -> (i32, i32) { -- let perm = Perm::new(n as u32); -- -- let n = 1; -- let mut futures = vec![]; -- let k = perm.max() / n; -- -- for j in (0..).map(|x| x * k).take_while(|&j| j < k * n) { -- let max = cmp::min(j+k, perm.max()); -- -- futures.push(thread::spawn(move|| { -- work(perm, j as usize, max as usize) -- })) -- } -- -- let mut checksum = 0; -- let mut maxflips = 0; -- for fut in futures.into_iter() { -- let (cs, mf) = fut.join().unwrap(); -- checksum += cs; -- maxflips = cmp::max(maxflips, mf); -- } -- (checksum, maxflips) --} -- --fn main() { -- let n = std::env::args_os().nth(1) -- .and_then(|s| s.into_string().ok()) -- .and_then(|n| n.parse().ok()) -- .unwrap_or(7); -- -- let (checksum, maxflips) = fannkuch(n); -- println!("{}\nPfannkuchen({}) = {}", checksum, n, maxflips); --} -diff --git a/third_party/rust/simd/examples/fannkuch-redux.rs b/third_party/rust/simd/examples/fannkuch-redux.rs -deleted file mode 100755 -index 2e52ae721135..000000000000 ---- a/third_party/rust/simd/examples/fannkuch-redux.rs -+++ /dev/null -@@ -1,233 +0,0 @@ --#![feature(cfg_target_feature)] --extern crate simd; --#[macro_use] extern crate cfg_if; --use simd::u8x16; -- --use std::{env, process}; -- --cfg_if! { -- if #[cfg(target_arch = "aarch64")] { -- #[inline(always)] -- fn shuffle(x: u8x16, y: u8x16) -> u8x16 { -- use simd::aarch64::neon::*; -- y.table_lookup_1(x) -- } -- } else if #[cfg(all(target_arch = "arm", -- target_feature = "neon"))] { -- #[inline(always)] -- fn shuffle(x: u8x16, y: u8x16) -> u8x16 { -- use simd::arm::neon::*; -- #[inline(always)] -- fn split(x: u8x16) -> (u8x8, u8x8) { -- unsafe {std::mem::transmute(x)} -- } -- fn join(x: u8x8, y: u8x8) -> u8x16 { -- unsafe {std::mem::transmute((x, y))} -- } -- -- let (t0, t1) = split(x); -- let (i0, i1) = split(y); -- join(i0.table_lookup_2(t0, t1), -- i1.table_lookup_2(t0, t1)) -- } -- } else if #[cfg(target_feature = "ssse3")] { -- #[inline(always)] -- fn shuffle(x: u8x16, y: u8x16) -> u8x16 { -- use simd::x86::ssse3::*; -- x.shuffle_bytes(y) -- } -- } else { -- // slow fallback, so tests work -- #[inline(always)] -- fn shuffle(x: u8x16, y: u8x16) -> u8x16 { -- u8x16::new(x.extract(y.extract(0) as u32), -- x.extract(y.extract(1) as u32), -- x.extract(y.extract(2) as u32), -- x.extract(y.extract(3) as u32), -- x.extract(y.extract(4) as u32), -- x.extract(y.extract(5) as u32), -- x.extract(y.extract(6) as u32), -- x.extract(y.extract(7) as u32), -- x.extract(y.extract(8) as u32), -- x.extract(y.extract(9) as u32), -- x.extract(y.extract(10) as u32), -- x.extract(y.extract(11) as u32), -- x.extract(y.extract(12) as u32), -- x.extract(y.extract(13) as u32), -- x.extract(y.extract(14) as u32), -- x.extract(y.extract(15) as u32)) -- } -- } --} --struct State { -- s: [u8; 16], -- flip_masks: [u8x16; 16], -- rotate_masks: [u8x16; 16], -- -- maxflips: i32, -- odd: u16, -- checksum: i32, --} --impl State { -- fn new() -> State { -- State { -- s: [0; 16], -- flip_masks: [u8x16::splat(0); 16], -- rotate_masks: [u8x16::splat(0); 16], -- -- maxflips: 0, -- odd: 0, -- checksum: 0, -- } -- } -- #[inline(never)] -- fn rotate_sisd(&mut self, n: usize) { -- let c = self.s[0]; -- for i in 1..(n + 1) { -- self.s[i - 1] = self.s[i]; -- } -- self.s[n] = c; -- } -- #[inline(never)] -- fn popmasks(&mut self) { -- let mut mask = [0_u8; 16]; -- for i in 0..16 { -- for j in 0..16 { mask[j] = j as u8; } -- -- for x in 0..(i+1)/2 { -- mask.swap(x, i - x); -- } -- -- self.flip_masks[i] = u8x16::load(&mask, 0); -- -- for j in 0..16 { self.s[j] = j as u8; } -- self.rotate_sisd(i); -- self.rotate_masks[i] = self.load_s(); -- } -- } -- fn rotate(&mut self, n: usize) { -- shuffle(self.load_s(), self.rotate_masks[n]).store(&mut self.s, 0) -- } -- -- fn load_s(&self) -> u8x16 { -- u8x16::load(&self.s, 0) -- } -- -- -- #[inline(never)] -- fn tk(&mut self, n: usize) { -- #[derive(Copy, Clone, Debug)] -- struct Perm { -- perm: u8x16, -- start: u8, -- odd: u16 -- } -- -- let mut perms = [Perm { perm: u8x16::splat(0), start: 0 , odd: 0 }; 60]; -- -- let mut i = 0; -- let mut c = [0_u8; 16]; -- let mut perm_max = 0; -- -- while i < n { -- while i < n && perm_max < 60 { -- self.rotate(i); -- if c[i] as usize >= i { -- c[i] = 0; -- i += 1; -- continue -- } -- -- c[i] += 1; -- i = 1; -- self.odd = !self.odd; -- if self.s[0] != 0 { -- if self.s[self.s[0] as usize] != 0 { -- perms[perm_max].perm = self.load_s(); -- perms[perm_max].start = self.s[0]; -- perms[perm_max].odd = self.odd; -- perm_max += 1; -- } else { -- if self.maxflips == 0 { self.maxflips = 1 } -- self.checksum += if self.odd != 0 { -1 } else { 1 }; -- } -- } -- } -- -- let mut k = 0; -- while k < std::cmp::max(1, perm_max) - 1 { -- let pk = &perms[k]; -- let pk1 = &perms[k + 1]; -- //println!("perm1 {:?}\nperm2 {:?}", pk.perm, pk1.perm); -- let mut perm1 = pk.perm; -- let mut perm2 = pk1.perm; -- -- let mut f1 = 0; -- let mut f2 = 0; -- let mut toterm1 = pk.start; -- let mut toterm2 = pk1.start; -- -- while toterm1 != 0 && toterm2 != 0 { -- perm1 = shuffle(perm1, self.flip_masks[toterm1 as usize]); -- perm2 = shuffle(perm2, self.flip_masks[toterm2 as usize]); -- toterm1 = perm1.extract(0); -- toterm2 = perm2.extract(0); -- -- f1 += 1; f2 += 1; -- } -- while toterm1 != 0 { -- perm1 = shuffle(perm1, self.flip_masks[toterm1 as usize]); -- toterm1 = perm1.extract(0); -- f1 += 1; -- } -- while toterm2 != 0 { -- perm2 = shuffle(perm2, self.flip_masks[toterm2 as usize]); -- toterm2 = perm2.extract(0); -- f2 += 1; -- } -- -- if f1 > self.maxflips { self.maxflips = f1 } -- if f2 > self.maxflips { self.maxflips = f2 } -- self.checksum += if pk.odd != 0 { -f1 } else { f1 }; -- self.checksum += if pk1.odd != 0 { -f2 } else { f2 }; -- -- k += 2; -- } -- while k < perm_max { -- let pk = &perms[k]; -- let mut perm = pk.perm; -- let mut f = 0; -- let mut toterm = pk.start; -- while toterm != 0 { -- perm = shuffle(perm, self.flip_masks[toterm as usize]); -- toterm = perm.extract(0); -- f += 1; -- } -- if f > self.maxflips { self.maxflips = f } -- self.checksum += if pk.odd != 0 { -f } else { f }; -- k += 1 -- } -- perm_max = 0; -- } -- } --} -- --fn main() { -- let mut state = State::new(); -- state.popmasks(); -- -- let args = env::args().collect::>(); -- if args.len() < 2 { -- println!("usage: {} number", args[0]); -- process::exit(1) -- } -- let max_n = args[1].parse().unwrap(); -- if max_n < 3 || max_n > 15 { -- println!("range: must be 3 <= n <= 14"); -- process::exit(1); -- } -- for i in 0..max_n { state.s[i] = i as u8 } -- state.tk(max_n); -- -- println!("{}\nPfannkuchen({}) = {}", state.checksum, max_n, state.maxflips); --} -diff --git a/third_party/rust/simd/examples/mandelbrot.rs b/third_party/rust/simd/examples/mandelbrot.rs -deleted file mode 100755 -index c6f1320a0784..000000000000 ---- a/third_party/rust/simd/examples/mandelbrot.rs -+++ /dev/null -@@ -1,125 +0,0 @@ --#![feature(iterator_step_by, test)] -- --extern crate test; --extern crate simd; --use simd::{f32x4, u32x4}; --use std::io::prelude::*; -- --#[inline(never)] --fn mandelbrot_naive(c_x: f32, c_y: f32, max_iter: u32) -> u32 { -- let mut x = c_x; -- let mut y = c_y; -- let mut count = 0; -- while count < max_iter { -- let xy = x * y; -- let xx = x * x; -- let yy = y * y; -- let sum = xx + yy; -- if sum > 4.0 { -- break -- } -- count += 1; -- x = xx - yy + c_x; -- y = xy * 2.0 + c_y; -- } -- count --} -- --#[inline(never)] --fn mandelbrot_vector(c_x: f32x4, c_y: f32x4, max_iter: u32) -> u32x4 { -- let mut x = c_x; -- let mut y = c_y; -- -- let mut count = u32x4::splat(0); -- for _ in 0..max_iter as usize { -- let xy = x * y; -- let xx = x * x; -- let yy = y * y; -- let sum = xx + yy; -- let mask = sum.lt(f32x4::splat(4.0)); -- -- if !mask.any() { break } -- count = count + mask.to_i().select(u32x4::splat(1), -- u32x4::splat(0)); -- -- x = xx - yy + c_x; -- y = xy + xy + c_y; -- } -- count --} -- --const COLOURS: &'static [(f32, f32, f32)] = &[(0.0, 7.0, 100.0), -- (32.0, 107.0, 203.0), -- (237.0, 255.0, 255.0), -- (255.0, 170.0, 0.0), -- (0.0, 2.0, 0.0)]; --const SCALE: f32 = 12.0; --const LIMIT: u32 = 100; -- --#[inline(never)] --fn output_one(buf: &mut [u8], val: u32) { -- let (r, g, b); -- if val == LIMIT { -- r = 0; -- g = 0; -- b = 0; -- } else { -- let val = (val as f32 % SCALE) * (COLOURS.len() as f32) / SCALE; -- let left = val as usize % COLOURS.len(); -- let right = (left + 1) % COLOURS.len(); -- -- let p = val - left as f32; -- let (r1, g1, b1) = COLOURS[left]; -- let (r2, g2, b2) = COLOURS[right]; -- r = (r1 + (r2 - r1) * p) as u8; -- g = (g1 + (g2 - g1) * p) as u8; -- b = (b1 + (b2 - b1) * p) as u8; -- } -- buf[0] = r; -- buf[1] = g; -- buf[2] = b; --} -- --fn main() { -- let mut args = std::env::args(); -- args.next(); -- let width = args.next().unwrap().parse().unwrap(); -- let height = args.next().unwrap().parse().unwrap(); -- -- let left = -2.2; -- let right = left + 3.0; -- let top = 1.0; -- let bottom = top - 2.0; -- -- let width_step: f32 = (right - left) / width as f32; -- let height_step: f32 = (bottom - top) / height as f32; -- -- let adjust = f32x4::splat(width_step) * f32x4::new(0., 1., 2., 3.); -- -- println!("P6 {} {} 255", width, height); -- let mut line = vec![0; width * 3]; -- -- if args.next().is_none() { -- for i in 0..height { -- let y = f32x4::splat(top + height_step * i as f32); -- for j in (0..width).step_by(4) { -- let x = f32x4::splat(left + width_step * j as f32) + adjust; -- let ret = mandelbrot_vector(x, y, LIMIT); -- test::black_box(ret); -- for k in 0..4 { let val = ret.extract(k as u32); output_one(&mut line[3*(j + k)..3*(j + k + 1)], val); } -- } -- ::std::io::stdout().write(&line).unwrap(); -- } -- } else { -- for i in 0..height { -- let y = top + height_step * i as f32; -- for j in 0..width { -- let x = left + width_step * j as f32; -- let val = mandelbrot_naive(x, y, LIMIT); -- test::black_box(val); -- output_one(&mut line[3*j..3*(j + 1)], val); -- } -- ::std::io::stdout().write(&line).unwrap(); -- } -- } --} -diff --git a/third_party/rust/simd/examples/matrix-inverse.rs b/third_party/rust/simd/examples/matrix-inverse.rs -deleted file mode 100644 -index e6eb7ffc4655..000000000000 ---- a/third_party/rust/simd/examples/matrix-inverse.rs -+++ /dev/null -@@ -1,281 +0,0 @@ --extern crate simd; --use simd::f32x4; -- --fn mul(x: &[f32x4; 4], y: &[f32x4; 4]) -> [f32x4; 4] { -- let y0 = y[0]; -- let y1 = y[1]; -- let y2 = y[2]; -- let y3 = y[3]; -- [f32x4::splat(y0.extract(0)) * x[0] + -- f32x4::splat(y0.extract(1)) * x[1] + -- f32x4::splat(y0.extract(2)) * x[2] + -- f32x4::splat(y0.extract(3)) * x[3], -- f32x4::splat(y1.extract(0)) * x[0] + -- f32x4::splat(y1.extract(1)) * x[1] + -- f32x4::splat(y1.extract(2)) * x[2] + -- f32x4::splat(y1.extract(3)) * x[3], -- f32x4::splat(y2.extract(0)) * x[0] + -- f32x4::splat(y2.extract(1)) * x[1] + -- f32x4::splat(y2.extract(2)) * x[2] + -- f32x4::splat(y2.extract(3)) * x[3], -- f32x4::splat(y3.extract(0)) * x[0] + -- f32x4::splat(y3.extract(1)) * x[1] + -- f32x4::splat(y3.extract(2)) * x[2] + -- f32x4::splat(y3.extract(3)) * x[3], -- ] --} -- --#[allow(dead_code)] --fn inverse_naive(x: &[[f32; 4]; 4]) -> [[f32; 4]; 4] { -- let mut t = [[0_f32; 4]; 4]; -- for i in 0..4 { -- t[0][i] = x[i][0]; -- t[1][i] = x[i][1]; -- t[2][i] = x[i][2]; -- t[3][i] = x[i][3]; -- } -- println!("{:?}", t); -- -- let _0 = t[2][2] * t[3][3]; -- let _1 = t[2][3] * t[3][2]; -- let _2 = t[2][1] * t[3][3]; -- let _3 = t[2][3] * t[3][1]; -- let _4 = t[2][1] * t[3][2]; -- let _5 = t[2][2] * t[3][1]; -- let _6 = t[2][0] * t[3][3]; -- let _7 = t[2][3] * t[3][0]; -- let _8 = t[2][0] * t[3][2]; -- let _9 = t[2][2] * t[3][0]; -- let _10 = t[2][0] * t[3][1]; -- let _11 = t[2][1] * t[3][0]; -- let v = [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11]; -- println!("{:?}", v); -- -- let d00 = _0 * t[1][1] + _3 * t[1][2] + _4 * t[1][3] - -- (_1 * t[1][1] + _2 * t[1][2] + _5 * t[1][3]); -- let d01 = _1 * t[1][0] + _6 * t[1][2] + _9 * t[1][3] - -- (_0 * t[1][0] + _7 * t[1][2] + _8 * t[1][3]); -- let d02 = _2 * t[1][0] + _7 * t[1][1] + _10 * t[1][3] - -- (_3 * t[1][0] + _6 * t[1][1] + _11 * t[1][3]); -- let d03 = _5 * t[1][0] + _8 * t[1][1] + _11 * t[1][2] - -- (_4 * t[1][0] + _9 * t[1][1] + _10 * t[1][2]); -- let d10 = _1 * t[0][1] + _2 * t[0][2] + _5 * t[0][3] - -- (_0 * t[0][1] + _3 * t[0][2] + _4 * t[0][3]); -- let d11 = _0 * t[0][0] + _7 * t[0][2] + _8 * t[0][3] - -- (_1 * t[0][0] + _6 * t[0][2] + _9 * t[0][3]); -- let d12 = _3 * t[0][0] + _6 * t[0][1] + _11 * t[0][3] - -- (_2 * t[0][0] + _7 * t[0][1] + _10 * t[0][3]); -- let d13 = _4 * t[0][0] + _9 * t[0][1] + _10 * t[0][2] - -- (_5 * t[0][0] + _8 * t[0][1] + _11 * t[0][2]); -- -- println!("{:?}", [d00, d01, d02, d03, d10, d11, d12, d13]); -- -- let _0 = t[0][2] * t[1][3]; -- let _1 = t[0][3] * t[1][2]; -- let _2 = t[0][1] * t[1][3]; -- let _3 = t[0][3] * t[1][1]; -- let _4 = t[0][1] * t[1][2]; -- let _5 = t[0][2] * t[1][1]; -- let _6 = t[0][0] * t[1][3]; -- let _7 = t[0][3] * t[1][0]; -- let _8 = t[0][0] * t[1][2]; -- let _9 = t[0][2] * t[1][0]; -- let _10 = t[0][0] * t[1][1]; -- let _11 = t[0][1] * t[1][0]; -- let v = [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11]; -- println!("{:?}", v); -- -- let d20 = _0*t[3][1] + _3*t[3][2] + _4*t[3][3]- -- (_1*t[3][1] + _2*t[3][2] + _5*t[3][3]); -- let d21 = _1*t[3][0] + _6*t[3][2] + _9*t[3][3]- -- (_0*t[3][0] + _7*t[3][2] + _8*t[3][3]); -- let d22 = _2*t[3][0] + _7*t[3][1] + _10*t[3][3]- -- (_3*t[3][0] + _6*t[3][1] + _11*t[3][3]); -- let d23 = _5*t[3][0] + _8*t[3][1] + _11*t[3][2]- -- (_4*t[3][0] + _9*t[3][1] + _10*t[3][2]); -- let d30 = _2*t[2][2] + _5*t[2][3] + _1*t[2][1]- -- (_4*t[2][3] + _0*t[2][1] + _3*t[2][2]); -- let d31 = _8*t[2][3] + _0*t[2][0] + _7*t[2][2]- -- (_6*t[2][2] + _9*t[2][3] + _1*t[2][0]); -- let d32 = _6*t[2][1] + _11*t[2][3] + _3*t[2][0]- -- (_10*t[2][3] + _2*t[2][0] + _7*t[2][1]); -- let d33 = _10*t[2][2] + _4*t[2][0] + _9*t[2][1]- -- (_8*t[2][1] + _11*t[2][2] + _5*t[2][0]); -- -- println!("{:?}", [d20, d21, d22, d23, d30, d31, d32, d33]); -- -- let det = t[0][0] * d00 + t[0][1] * d01 + t[0][2] * d02 + t[0][3] * d03; -- -- let det = 1.0 / det; -- let mut ret = [[d00, d01, d02, d03], -- [d10, d11, d12, d13], -- [d20, d21, d22, d23], -- [d30, d31, d32, d33]]; -- for i in 0..4 { -- for j in 0..4 { -- ret[i][j] *= det; -- } -- } -- ret --} -- --fn inverse_simd4(x: &[f32x4; 4]) -> [f32x4; 4] { -- let src0 = x[0]; -- let src1 = x[1]; -- let src2 = x[2]; -- let src3 = x[3]; -- -- let tmp1 = f32x4::new(src0.extract(0), src0.extract(1), -- src1.extract(4 - 4), src1.extract(5 - 4)); -- let row1 = f32x4::new(src2.extract(0), src2.extract(1), -- src3.extract(4 - 4), src3.extract(5 - 4)); -- let row0 = f32x4::new(tmp1.extract(0), tmp1.extract(2), -- row1.extract(4 - 4), row1.extract(6 - 4)); -- let row1 = f32x4::new(row1.extract(1), row1.extract(3), -- tmp1.extract(5 - 4), tmp1.extract(7 - 4)); -- -- let tmp1 = f32x4::new(src0.extract(2), src0.extract(3), -- src1.extract(6 - 4), src1.extract(7 - 4)); -- let row3 = f32x4::new(src2.extract(2), src2.extract(3), -- src3.extract(6 - 4), src3.extract(7 - 4)); -- let row2 = f32x4::new(tmp1.extract(0), tmp1.extract(2), -- row3.extract(4 - 4), row3.extract(6 - 4)); -- let row3 = f32x4::new(row3.extract(1), row3.extract(3), -- tmp1.extract(5 - 4), tmp1.extract(7 - 4)); -- -- -- let tmp1 = row2 * row3; -- let tmp1 = f32x4::new(tmp1.extract(1), tmp1.extract(0), -- tmp1.extract(3), tmp1.extract(2)); -- let minor0 = row1 * tmp1; -- let minor1 = row0 * tmp1; -- let tmp1 = f32x4::new(tmp1.extract(2), tmp1.extract(3), -- tmp1.extract(0), tmp1.extract(1)); -- let minor0 = (row1 * tmp1) - minor0; -- let minor1 = (row0 * tmp1) - minor1; -- let minor1 = f32x4::new(minor1.extract(2), minor1.extract(3), -- minor1.extract(0), minor1.extract(1)); -- //println!("{:?}", minor1); -- -- -- let tmp1 = row1 * row2; -- let tmp1 = f32x4::new(tmp1.extract(1), tmp1.extract(0), -- tmp1.extract(3), tmp1.extract(2)); -- let minor0 = (row3 * tmp1) + minor0; -- let minor3 = row0 * tmp1; -- let tmp1 = f32x4::new(tmp1.extract(2), tmp1.extract(3), -- tmp1.extract(0), tmp1.extract(1)); -- -- let minor0 = minor0 - row3 * tmp1; -- let minor3 = row0 * tmp1 - minor3; -- let minor3 = f32x4::new(minor3.extract(2), minor3.extract(3), -- minor3.extract(0), minor3.extract(1)); -- //println!("{:?}", minor1); -- -- -- let tmp1 = row3 * f32x4::new(row1.extract(2), row1.extract(3), -- row1.extract(0), row1.extract(1)); -- let tmp1 = f32x4::new(tmp1.extract(1), tmp1.extract(0), -- tmp1.extract(3), tmp1.extract(2)); -- let row2 = f32x4::new(row2.extract(2), row2.extract(3), -- row2.extract(0), row2.extract(1)); -- let minor0 = row2 * tmp1 + minor0; -- let minor2 = row0 * tmp1; -- let tmp1 = f32x4::new(tmp1.extract(2), tmp1.extract(3), -- tmp1.extract(0), tmp1.extract(1)); -- let minor0 = minor0 - row2 * tmp1; -- let minor2 = row0 * tmp1 - minor2; -- let minor2 = f32x4::new(minor2.extract(2), minor2.extract(3), -- minor2.extract(0), minor2.extract(1)); -- //println!("{:?}", minor1); -- -- -- let tmp1 = row0 * row1; -- let tmp1 = f32x4::new(tmp1.extract(1), tmp1.extract(0), -- tmp1.extract(3), tmp1.extract(2)); -- let minor2 = minor2 + row3 * tmp1; -- let minor3 = row2 * tmp1 - minor3; -- let tmp1 = f32x4::new(tmp1.extract(2), tmp1.extract(3), -- tmp1.extract(0), tmp1.extract(1)); -- let minor2 = row3 * tmp1 - minor2; -- let minor3 = minor3 - row2 * tmp1; -- //println!("{:?}", minor1); -- -- -- -- let tmp1 = row0 * row3; -- let tmp1 = f32x4::new(tmp1.extract(1), tmp1.extract(0), -- tmp1.extract(3), tmp1.extract(2)); -- let minor1 = minor1 - row2 * tmp1; -- let minor2 = row1 * tmp1 + minor2; -- let tmp1 = f32x4::new(tmp1.extract(2), tmp1.extract(3), -- tmp1.extract(0), tmp1.extract(1)); -- let minor1 = row2 * tmp1 + minor1; -- let minor2 = minor2 - row1 * tmp1; -- //println!("{:?}", minor1); -- -- let tmp1 = row0 * row2; -- let tmp1 = f32x4::new(tmp1.extract(1), tmp1.extract(0), -- tmp1.extract(3), tmp1.extract(2)); -- let minor1 = row3 * tmp1 + minor1; -- let minor3 = minor3 - row1 * tmp1; -- let tmp1 = f32x4::new(tmp1.extract(2), tmp1.extract(3), -- tmp1.extract(0), tmp1.extract(1)); -- let minor1 = minor1 - row3 * tmp1; -- let minor3 = row1 * tmp1 + minor3; -- //println!("{:?}", minor1); -- -- let det = row0 * minor0; -- let det = f32x4::new(det.extract(2), det.extract(3), -- det.extract(0), det.extract(1)) + det; -- let det = f32x4::new(det.extract(1), det.extract(0), -- det.extract(3), det.extract(2)) + det; -- let tmp1 = det.approx_reciprocal(); -- let det = tmp1 + tmp1 - det * tmp1 * tmp1; -- --// let det = f32x4::splat(det.extract(0)); -- -- [minor0 * det, minor1 * det, minor2 * det, minor3 * det] --} -- --fn p(x: &[f32x4; 4]) { -- for xx in x { -- for i in 0..4 { -- let v = xx.extract(i); -- if v == 0.0 { -- print!("{}{:6.2}", if i > 0 {", "} else {"|"}, ""); -- } else { -- print!("{}{:6.2}", if i > 0 {", "} else {"|"}, xx.extract(i)); -- } -- } -- println!(" |"); -- } --} -- --fn main() { -- let x = [f32x4::new(-100.0, 6.0, 100.0, 1.0), -- f32x4::new(3.0, 1.0, 0.0, 1.0), -- f32x4::new(2.0, 1.0, 1.0, 1.0), -- f32x4::new(-10.0, 1.0, 1.0, 1.0)]; -- -- /* let mut x_ = [[0.0; 4]; 4]; -- for i in 0..4 { -- for j in 0..4 { -- x_[i][j] = x[i].extract(j as u32) -- } -- } -- -- let ret = inverse_naive(&x_); -- let mut y = [f32x4::splat(0.0); 4]; -- for i in 0..4 { -- for j in 0..4 { -- y[i] = y[i].replace(j as u32, ret[i][j]) -- } --}*/ -- let y = inverse_simd4(&x); -- p(&x); -- println!(""); -- p(&y); -- println!(""); -- p(&mul(&x, &y)) --} -diff --git a/third_party/rust/simd/examples/nbody-nosimd.rs b/third_party/rust/simd/examples/nbody-nosimd.rs -deleted file mode 100644 -index d5f1bb422ff2..000000000000 ---- a/third_party/rust/simd/examples/nbody-nosimd.rs -+++ /dev/null -@@ -1,156 +0,0 @@ --// The Computer Language Benchmarks Game --// http://benchmarksgame.alioth.debian.org/ --// --// contributed by the Rust Project Developers --// contributed by TeXitoi -- --const PI: f64 = 3.141592653589793; --const SOLAR_MASS: f64 = 4.0 * PI * PI; --const YEAR: f64 = 365.24; --const N_BODIES: usize = 5; -- --static BODIES: [Planet;N_BODIES] = [ -- // Sun -- Planet { -- x: 0.0, y: 0.0, z: 0.0, -- vx: 0.0, vy: 0.0, vz: 0.0, -- mass: SOLAR_MASS, -- }, -- // Jupiter -- Planet { -- x: 4.84143144246472090e+00, -- y: -1.16032004402742839e+00, -- z: -1.03622044471123109e-01, -- vx: 1.66007664274403694e-03 * YEAR, -- vy: 7.69901118419740425e-03 * YEAR, -- vz: -6.90460016972063023e-05 * YEAR, -- mass: 9.54791938424326609e-04 * SOLAR_MASS, -- }, -- // Saturn -- Planet { -- x: 8.34336671824457987e+00, -- y: 4.12479856412430479e+00, -- z: -4.03523417114321381e-01, -- vx: -2.76742510726862411e-03 * YEAR, -- vy: 4.99852801234917238e-03 * YEAR, -- vz: 2.30417297573763929e-05 * YEAR, -- mass: 2.85885980666130812e-04 * SOLAR_MASS, -- }, -- // Uranus -- Planet { -- x: 1.28943695621391310e+01, -- y: -1.51111514016986312e+01, -- z: -2.23307578892655734e-01, -- vx: 2.96460137564761618e-03 * YEAR, -- vy: 2.37847173959480950e-03 * YEAR, -- vz: -2.96589568540237556e-05 * YEAR, -- mass: 4.36624404335156298e-05 * SOLAR_MASS, -- }, -- // Neptune -- Planet { -- x: 1.53796971148509165e+01, -- y: -2.59193146099879641e+01, -- z: 1.79258772950371181e-01, -- vx: 2.68067772490389322e-03 * YEAR, -- vy: 1.62824170038242295e-03 * YEAR, -- vz: -9.51592254519715870e-05 * YEAR, -- mass: 5.15138902046611451e-05 * SOLAR_MASS, -- }, --]; -- --#[derive(Clone, Copy)] --struct Planet { -- x: f64, y: f64, z: f64, -- vx: f64, vy: f64, vz: f64, -- mass: f64, --} -- --fn advance(bodies: &mut [Planet;N_BODIES], dt: f64, steps: i32) { -- for _ in 0..steps { -- let mut b_slice: &mut [_] = bodies; -- loop { -- let bi = match shift_mut_ref(&mut b_slice) { -- Some(bi) => bi, -- None => break -- }; -- for bj in b_slice.iter_mut() { -- let dx = bi.x - bj.x; -- let dy = bi.y - bj.y; -- let dz = bi.z - bj.z; -- -- let d2 = dx * dx + dy * dy + dz * dz; -- let mag = dt / (d2 * d2.sqrt()); -- -- let massj_mag = bj.mass * mag; -- bi.vx -= dx * massj_mag; -- bi.vy -= dy * massj_mag; -- bi.vz -= dz * massj_mag; -- -- let massi_mag = bi.mass * mag; -- bj.vx += dx * massi_mag; -- bj.vy += dy * massi_mag; -- bj.vz += dz * massi_mag; -- } -- bi.x += dt * bi.vx; -- bi.y += dt * bi.vy; -- bi.z += dt * bi.vz; -- } -- } --} -- --fn energy(bodies: &[Planet;N_BODIES]) -> f64 { -- let mut e = 0.0; -- let mut bodies = bodies.iter(); -- loop { -- let bi = match bodies.next() { -- Some(bi) => bi, -- None => break -- }; -- e += (bi.vx * bi.vx + bi.vy * bi.vy + bi.vz * bi.vz) * bi.mass / 2.0; -- for bj in bodies.clone() { -- let dx = bi.x - bj.x; -- let dy = bi.y - bj.y; -- let dz = bi.z - bj.z; -- let dist = (dx * dx + dy * dy + dz * dz).sqrt(); -- e -= bi.mass * bj.mass / dist; -- } -- } -- e --} -- --fn offset_momentum(bodies: &mut [Planet;N_BODIES]) { -- let mut px = 0.0; -- let mut py = 0.0; -- let mut pz = 0.0; -- for bi in bodies.iter() { -- px += bi.vx * bi.mass; -- py += bi.vy * bi.mass; -- pz += bi.vz * bi.mass; -- } -- let sun = &mut bodies[0]; -- sun.vx = - px / SOLAR_MASS; -- sun.vy = - py / SOLAR_MASS; -- sun.vz = - pz / SOLAR_MASS; --} -- --fn main() { -- let n = std::env::args().nth(1).expect("need one arg").parse().unwrap(); -- let mut bodies = BODIES; -- -- offset_momentum(&mut bodies); -- println!("{:.9}", energy(&bodies)); -- -- advance(&mut bodies, 0.01, n); -- -- println!("{:.9}", energy(&bodies)); --} -- --/// Pop a mutable reference off the head of a slice, mutating the slice to no --/// longer contain the mutable reference. --fn shift_mut_ref<'a, T>(r: &mut &'a mut [T]) -> Option<&'a mut T> { -- if r.len() == 0 { return None } -- let tmp = std::mem::replace(r, &mut []); -- let (h, t) = tmp.split_at_mut(1); -- *r = t; -- Some(&mut h[0]) --} -diff --git a/third_party/rust/simd/examples/nbody.rs b/third_party/rust/simd/examples/nbody.rs -deleted file mode 100755 -index d6d4e88e3741..000000000000 ---- a/third_party/rust/simd/examples/nbody.rs -+++ /dev/null -@@ -1,170 +0,0 @@ --#![feature(cfg_target_feature)] -- --extern crate simd; -- --#[cfg(target_feature = "sse2")] --use simd::x86::sse2::*; --#[cfg(target_arch = "aarch64")] --use simd::aarch64::neon::*; -- --const PI: f64 = 3.141592653589793; --const SOLAR_MASS: f64 = 4.0 * PI * PI; --const DAYS_PER_YEAR: f64 = 365.24; -- --struct Body { -- x: [f64; 3], -- _fill: f64, -- v: [f64; 3], -- mass: f64, --} -- --impl Body { -- fn new(x0: f64, x1: f64, x2: f64, -- v0: f64, v1: f64, v2: f64, -- mass: f64) -> Body { -- Body { -- x: [x0, x1, x2], -- _fill: 0.0, -- v: [v0, v1, v2], -- mass: mass, -- } -- } --} -- --const N_BODIES: usize = 5; --const N: usize = N_BODIES * (N_BODIES - 1) / 2; --fn offset_momentum(bodies: &mut [Body; N_BODIES]) { -- let (sun, rest) = bodies.split_at_mut(1); -- let sun = &mut sun[0]; -- for body in rest { -- for k in 0..3 { -- sun.v[k] -= body.v[k] * body.mass / SOLAR_MASS; -- } -- } --} --fn advance(bodies: &mut [Body; N_BODIES], dt: f64) { -- let mut r = [[0.0; 4]; N]; -- let mut mag = [0.0; N]; -- -- let mut dx = [f64x2::splat(0.0); 3]; -- let mut dsquared; -- let mut distance; -- let mut dmag; -- -- let mut i = 0; -- for j in 0..N_BODIES { -- for k in j+1..N_BODIES { -- for m in 0..3 { -- r[i][m] = bodies[j].x[m] - bodies[k].x[m]; -- } -- i += 1; -- } -- } -- -- i = 0; -- while i < N { -- for m in 0..3 { -- dx[m] = f64x2::new(r[i][m], r[i+1][m]); -- } -- -- dsquared = dx[0] * dx[0] + dx[1] * dx[1] + dx[2] * dx[2]; -- distance = dsquared.to_f32().approx_rsqrt().to_f64(); -- for _ in 0..2 { -- distance = distance * f64x2::splat(1.5) - -- ((f64x2::splat(0.5) * dsquared) * distance) * (distance * distance) -- } -- dmag = f64x2::splat(dt) / dsquared * distance; -- dmag.store(&mut mag, i); -- -- i += 2; -- } -- -- i = 0; -- for j in 0..N_BODIES { -- for k in j+1..N_BODIES { -- for m in 0..3 { -- bodies[j].v[m] -= r[i][m] * bodies[k].mass * mag[i]; -- bodies[k].v[m] += r[i][m] * bodies[j].mass * mag[i]; -- } -- i += 1 -- } -- } -- for body in bodies { -- for m in 0..3 { -- body.x[m] += dt * body.v[m] -- } -- } --} -- --fn energy(bodies: &[Body; N_BODIES]) -> f64 { -- let mut e = 0.0; -- for i in 0..N_BODIES { -- let bi = &bodies[i]; -- e += bi.mass * (bi.v[0] * bi.v[0] + bi.v[1] * bi.v[1] + bi.v[2] * bi.v[2]) / 2.0; -- for j in i+1..N_BODIES { -- let bj = &bodies[j]; -- let mut dx = [0.0; 3]; -- for k in 0..3 { -- dx[k] = bi.x[k] - bj.x[k]; -- } -- let mut distance = 0.0; -- for &d in &dx { distance += d * d } -- e -= bi.mass * bj.mass / distance.sqrt() -- } -- } -- e --} -- --fn main() { -- let mut bodies: [Body; N_BODIES] = [ -- /* sun */ -- Body::new(0.0, 0.0, 0.0, -- 0.0, 0.0, 0.0, -- SOLAR_MASS), -- /* jupiter */ -- Body::new(4.84143144246472090e+00, -- -1.16032004402742839e+00, -- -1.03622044471123109e-01 , -- 1.66007664274403694e-03 * DAYS_PER_YEAR, -- 7.69901118419740425e-03 * DAYS_PER_YEAR, -- -6.90460016972063023e-05 * DAYS_PER_YEAR , -- 9.54791938424326609e-04 * SOLAR_MASS -- ), -- /* saturn */ -- Body::new(8.34336671824457987e+00, -- 4.12479856412430479e+00, -- -4.03523417114321381e-01 , -- -2.76742510726862411e-03 * DAYS_PER_YEAR, -- 4.99852801234917238e-03 * DAYS_PER_YEAR, -- 2.30417297573763929e-05 * DAYS_PER_YEAR , -- 2.85885980666130812e-04 * SOLAR_MASS -- ), -- /* uranus */ -- Body::new(1.28943695621391310e+01, -- -1.51111514016986312e+01, -- -2.23307578892655734e-01 , -- 2.96460137564761618e-03 * DAYS_PER_YEAR, -- 2.37847173959480950e-03 * DAYS_PER_YEAR, -- -2.96589568540237556e-05 * DAYS_PER_YEAR , -- 4.36624404335156298e-05 * SOLAR_MASS -- ), -- /* neptune */ -- Body::new(1.53796971148509165e+01, -- -2.59193146099879641e+01, -- 1.79258772950371181e-01 , -- 2.68067772490389322e-03 * DAYS_PER_YEAR, -- 1.62824170038242295e-03 * DAYS_PER_YEAR, -- -9.51592254519715870e-05 * DAYS_PER_YEAR , -- 5.15138902046611451e-05 * SOLAR_MASS -- ) -- ]; -- -- let n: usize = std::env::args().nth(1).expect("need one arg").parse().unwrap(); -- -- offset_momentum(&mut bodies); -- println!("{:.9}", energy(&bodies)); -- for _ in 0..n { -- advance(&mut bodies, 0.01); -- } -- println!("{:.9}", energy(&bodies)); --} -diff --git a/third_party/rust/simd/examples/ops.rs b/third_party/rust/simd/examples/ops.rs -deleted file mode 100644 -index f8c919101e3c..000000000000 ---- a/third_party/rust/simd/examples/ops.rs -+++ /dev/null -@@ -1,10 +0,0 @@ --extern crate simd; -- --use simd::*; -- --#[allow(unused_variables)] --fn main() { -- let x = i32x4::splat(1_i32); -- let y = -x; -- let z = !x; --} -diff --git a/third_party/rust/simd/examples/spectral-norm-nosimd.rs b/third_party/rust/simd/examples/spectral-norm-nosimd.rs -deleted file mode 100644 -index 919f9c61990f..000000000000 ---- a/third_party/rust/simd/examples/spectral-norm-nosimd.rs -+++ /dev/null -@@ -1,106 +0,0 @@ --// The Computer Language Benchmarks Game --// http://benchmarksgame.alioth.debian.org/ --// --// contributed by the Rust Project Developers --// contributed by TeXitoi -- --#![allow(non_snake_case)] -- --use std::iter::repeat; --//use std::thread; -- --// As std::simd::f64x2 is unstable, we provide a similar interface, --// expecting llvm to autovectorize its usage. --#[allow(non_camel_case_types)] --struct f64x2(f64, f64); --impl std::ops::Add for f64x2 { -- type Output = Self; -- fn add(self, rhs: Self) -> Self { -- f64x2(self.0 + rhs.0, self.1 + rhs.1) -- } --} --impl std::ops::Div for f64x2 { -- type Output = Self; -- fn div(self, rhs: Self) -> Self { -- f64x2(self.0 / rhs.0, self.1 / rhs.1) -- } --} -- --fn main() { -- let n: usize = std::env::args().nth(1).expect("need one arg").parse().unwrap(); -- let answer = spectralnorm(n); -- println!("{:.9}", answer); --} -- --fn spectralnorm(n: usize) -> f64 { -- assert!(n % 2 == 0, "only even lengths are accepted"); -- let mut u = repeat(1.0).take(n).collect::>(); -- let mut v = u.clone(); -- let mut tmp = v.clone(); -- for _ in 0..10 { -- mult_AtAv(&u, &mut v, &mut tmp); -- mult_AtAv(&v, &mut u, &mut tmp); -- } -- (dot(&u, &v) / dot(&v, &v)).sqrt() --} -- --fn mult_AtAv(v: &[f64], out: &mut [f64], tmp: &mut [f64]) { -- mult_Av(v, tmp); -- mult_Atv(tmp, out); --} -- --fn mult_Av(v: &[f64], out: &mut [f64]) { -- parallel(out, |start, out| mult(v, out, start, |i, j| A(i, j))); --} -- --fn mult_Atv(v: &[f64], out: &mut [f64]) { -- parallel(out, |start, out| mult(v, out, start, |i, j| A(j, i))); --} -- --fn mult(v: &[f64], out: &mut [f64], start: usize, a: F) -- where F: Fn(usize, usize) -> f64 { -- for (i, slot) in out.iter_mut().enumerate().map(|(i, s)| (i + start, s)) { -- let mut sum = f64x2(0.0, 0.0); -- for (j, chunk) in v.chunks(2).enumerate().map(|(j, s)| (2 * j, s)) { -- let top = f64x2(chunk[0], chunk[1]); -- let bot = f64x2(a(i, j), a(i, j + 1)); -- sum = sum + top / bot; -- } -- let f64x2(a, b) = sum; -- *slot = a + b; -- } --} -- --fn A(i: usize, j: usize) -> f64 { -- ((i + j) * (i + j + 1) / 2 + i + 1) as f64 --} -- --fn dot(v: &[f64], u: &[f64]) -> f64 { -- v.iter().zip(u.iter()).map(|(a, b)| *a * *b).fold(0., |acc, i| acc + i) --} -- --//struct Racy(T); --//unsafe impl Send for Racy {} -- --// Executes a closure in parallel over the given mutable slice. The closure `f` --// is run in parallel and yielded the starting index within `v` as well as a --// sub-slice of `v`. --fn parallel<'a, T, F>(v: &mut [T], ref f: F) -- where T: 'static + Send + Sync, --F: Fn(usize, &mut [T]) + Sync --{ -- f(0, v); -- /*let size = v.len() / 4 + 1; -- let jhs = v.chunks_mut(size).enumerate().map(|(i, chunk)| { -- // Need to convert `f` and `chunk` to something that can cross the task -- // boundary. -- let f = Racy(f as *const F as *const usize); -- let raw = Racy((&mut chunk[0] as *mut T, chunk.len())); -- thread::spawn(move|| { -- let f = f.0 as *const F; -- let raw = raw.0; -- unsafe { (*f)(i * size, std::slice::from_raw_parts_mut(raw.0, raw.1)) } -- }) -- }).collect::>(); -- for jh in jhs { jh.join().unwrap(); }*/ --} -diff --git a/third_party/rust/simd/examples/spectral-norm.rs b/third_party/rust/simd/examples/spectral-norm.rs -deleted file mode 100755 -index 656f52e4fad0..000000000000 ---- a/third_party/rust/simd/examples/spectral-norm.rs -+++ /dev/null -@@ -1,74 +0,0 @@ --#![feature(cfg_target_feature)] --#![allow(non_snake_case)] -- --extern crate simd; -- --#[cfg(target_feature = "sse2")] --use simd::x86::sse2::f64x2; --#[cfg(target_arch = "aarch64")] --use simd::aarch64::neon::f64x2; -- --fn A(i: usize, j: usize) -> f64 { -- ((i + j) * (i + j + 1) / 2 + i + 1) as f64 --} -- --fn dot(x: &[f64], y: &[f64]) -> f64 { -- x.iter().zip(y).map(|(&x, &y)| x * y).fold(0.0, |a, b| a + b) --} -- --fn mult_Av(v: &[f64], out: &mut [f64]) { -- assert!(v.len() == out.len()); -- assert!(v.len() % 2 == 0); -- -- for i in 0..v.len() { -- let mut sum = f64x2::splat(0.0); -- -- let mut j = 0; -- while j < v.len() { -- let b = f64x2::load(v, j); -- let a = f64x2::new(A(i, j), A(i, j + 1)); -- sum = sum + b / a; -- j += 2 -- } -- out[i] = sum.extract(0) + sum.extract(1); -- } --} -- --fn mult_Atv(v: &[f64], out: &mut [f64]) { -- assert!(v.len() == out.len()); -- assert!(v.len() % 2 == 0); -- -- for i in 0..v.len() { -- let mut sum = f64x2::splat(0.0); -- -- let mut j = 0; -- while j < v.len() { -- let b = f64x2::load(v, j); -- let a = f64x2::new(A(j, i), A(j + 1, i)); -- sum = sum + b / a; -- j += 2 -- } -- out[i] = sum.extract(0) + sum.extract(1); -- } --} -- --fn mult_AtAv(v: &[f64], out: &mut [f64], tmp: &mut [f64]) { -- mult_Av(v, tmp); -- mult_Atv(tmp, out); --} -- --fn main() { -- let mut n: usize = std::env::args().nth(1).expect("need one arg").parse().unwrap(); -- if n % 2 == 1 { n += 1 } -- -- let mut u = vec![1.0; n]; -- let mut v = u.clone(); -- let mut tmp = u.clone(); -- -- for _ in 0..10 { -- mult_AtAv(&u, &mut v, &mut tmp); -- mult_AtAv(&v, &mut u, &mut tmp); -- } -- -- println!("{:.9}", (dot(&u, &v) / dot(&v, &v)).sqrt()); --} -diff --git a/third_party/rust/simd/src/aarch64/mod.rs b/third_party/rust/simd/src/aarch64/mod.rs -deleted file mode 100644 -index 5ba0a302b4d1..000000000000 ---- a/third_party/rust/simd/src/aarch64/mod.rs -+++ /dev/null -@@ -1,3 +0,0 @@ --//! Features specific to AArch64 CPUs. -- --pub mod neon; -diff --git a/third_party/rust/simd/src/aarch64/neon.rs b/third_party/rust/simd/src/aarch64/neon.rs -deleted file mode 100644 -index 0cca05a52788..000000000000 ---- a/third_party/rust/simd/src/aarch64/neon.rs -+++ /dev/null -@@ -1,681 +0,0 @@ --use super::super::*; --use {simd_cast, f32x2}; -- --pub use sixty_four::{f64x2, i64x2, u64x2, bool64ix2, bool64fx2}; --#[repr(simd)] --#[derive(Copy, Clone)] --pub struct u32x2(u32, u32); --#[repr(simd)] --#[derive(Copy, Clone)] --pub struct i32x2(i32, i32); -- --#[repr(simd)] --#[derive(Copy, Clone)] --pub struct u16x4(u16, u16, u16, u16); --#[repr(simd)] --#[derive(Copy, Clone)] --pub struct i16x4(i16, i16, i16, i16); --#[repr(simd)] --#[derive(Copy, Clone)] --pub struct u8x8(u8, u8, u8, u8, -- u8, u8, u8, u8); --#[repr(simd)] --#[derive(Copy, Clone)] --pub struct i8x8(i8, i8, i8, i8, -- i8, i8, i8, i8); -- --#[repr(simd)] --#[derive(Copy, Clone)] --pub struct i64x1(i64); --#[repr(simd)] --#[derive(Copy, Clone)] --pub struct u64x1(u64); --#[repr(simd)] --#[derive(Copy, Clone)] --pub struct f64x1(f64); -- --#[allow(dead_code)] --extern "platform-intrinsic" { -- fn aarch64_vhadd_s8(x: i8x8, y: i8x8) -> i8x8; -- fn aarch64_vhadd_u8(x: u8x8, y: u8x8) -> u8x8; -- fn aarch64_vhadd_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vhadd_u16(x: u16x4, y: u16x4) -> u16x4; -- fn aarch64_vhadd_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vhadd_u32(x: u32x2, y: u32x2) -> u32x2; -- fn aarch64_vhaddq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn aarch64_vhaddq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn aarch64_vhaddq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vhaddq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn aarch64_vhaddq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vhaddq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn aarch64_vrhadd_s8(x: i8x8, y: i8x8) -> i8x8; -- fn aarch64_vrhadd_u8(x: u8x8, y: u8x8) -> u8x8; -- fn aarch64_vrhadd_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vrhadd_u16(x: u16x4, y: u16x4) -> u16x4; -- fn aarch64_vrhadd_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vrhadd_u32(x: u32x2, y: u32x2) -> u32x2; -- fn aarch64_vrhaddq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn aarch64_vrhaddq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn aarch64_vrhaddq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vrhaddq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn aarch64_vrhaddq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vrhaddq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn aarch64_vqadd_s8(x: i8x8, y: i8x8) -> i8x8; -- fn aarch64_vqadd_u8(x: u8x8, y: u8x8) -> u8x8; -- fn aarch64_vqadd_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vqadd_u16(x: u16x4, y: u16x4) -> u16x4; -- fn aarch64_vqadd_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vqadd_u32(x: u32x2, y: u32x2) -> u32x2; -- fn aarch64_vqadd_s64(x: i64x1, y: i64x1) -> i64x1; -- fn aarch64_vqadd_u64(x: u64x1, y: u64x1) -> u64x1; -- fn aarch64_vqaddq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn aarch64_vqaddq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn aarch64_vqaddq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vqaddq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn aarch64_vqaddq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vqaddq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn aarch64_vqaddq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn aarch64_vqaddq_u64(x: u64x2, y: u64x2) -> u64x2; -- fn aarch64_vuqadd_s8(x: i8x16, y: u8x16) -> i8x16; -- fn aarch64_vuqadd_s16(x: i16x8, y: u16x8) -> i16x8; -- fn aarch64_vuqadd_s32(x: i32x4, y: u32x4) -> i32x4; -- fn aarch64_vuqadd_s64(x: i64x2, y: u64x2) -> i64x2; -- fn aarch64_vsqadd_u8(x: u8x16, y: i8x16) -> u8x16; -- fn aarch64_vsqadd_u16(x: u16x8, y: i16x8) -> u16x8; -- fn aarch64_vsqadd_u32(x: u32x4, y: i32x4) -> u32x4; -- fn aarch64_vsqadd_u64(x: u64x2, y: i64x2) -> u64x2; -- fn aarch64_vraddhn_s16(x: i16x8, y: i16x8) -> i8x8; -- fn aarch64_vraddhn_u16(x: u16x8, y: u16x8) -> u8x8; -- fn aarch64_vraddhn_s32(x: i32x4, y: i32x4) -> i16x4; -- fn aarch64_vraddhn_u32(x: u32x4, y: u32x4) -> u16x4; -- fn aarch64_vraddhn_s64(x: i64x2, y: i64x2) -> i32x2; -- fn aarch64_vraddhn_u64(x: u64x2, y: u64x2) -> u32x2; -- fn aarch64_vfmulx_f32(x: f32x2, y: f32x2) -> f32x2; -- fn aarch64_vfmulx_f64(x: f64x1, y: f64x1) -> f64x1; -- fn aarch64_vfmulxq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn aarch64_vfmulxq_f64(x: f64x2, y: f64x2) -> f64x2; -- fn aarch64_vfma_f32(x: f32x2, y: f32x2) -> f32x2; -- fn aarch64_vfma_f64(x: f64x1, y: f64x1) -> f64x1; -- fn aarch64_vfmaq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn aarch64_vfmaq_f64(x: f64x2, y: f64x2) -> f64x2; -- fn aarch64_vqdmulh_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vqdmulh_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vqdmulhq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vqdmulhq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vqrdmulh_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vqrdmulh_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vqrdmulhq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vqrdmulhq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vmull_s8(x: i8x8, y: i8x8) -> i16x8; -- fn aarch64_vmull_u8(x: u8x8, y: u8x8) -> u16x8; -- fn aarch64_vmull_s16(x: i16x4, y: i16x4) -> i32x4; -- fn aarch64_vmull_u16(x: u16x4, y: u16x4) -> u32x4; -- fn aarch64_vmull_s32(x: i32x2, y: i32x2) -> i64x2; -- fn aarch64_vmull_u32(x: u32x2, y: u32x2) -> u64x2; -- fn aarch64_vqdmullq_s8(x: i8x8, y: i8x8) -> i16x8; -- fn aarch64_vqdmullq_s16(x: i16x4, y: i16x4) -> i32x4; -- fn aarch64_vhsub_s8(x: i8x8, y: i8x8) -> i8x8; -- fn aarch64_vhsub_u8(x: u8x8, y: u8x8) -> u8x8; -- fn aarch64_vhsub_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vhsub_u16(x: u16x4, y: u16x4) -> u16x4; -- fn aarch64_vhsub_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vhsub_u32(x: u32x2, y: u32x2) -> u32x2; -- fn aarch64_vhsubq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn aarch64_vhsubq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn aarch64_vhsubq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vhsubq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn aarch64_vhsubq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vhsubq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn aarch64_vqsub_s8(x: i8x8, y: i8x8) -> i8x8; -- fn aarch64_vqsub_u8(x: u8x8, y: u8x8) -> u8x8; -- fn aarch64_vqsub_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vqsub_u16(x: u16x4, y: u16x4) -> u16x4; -- fn aarch64_vqsub_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vqsub_u32(x: u32x2, y: u32x2) -> u32x2; -- fn aarch64_vqsub_s64(x: i64x1, y: i64x1) -> i64x1; -- fn aarch64_vqsub_u64(x: u64x1, y: u64x1) -> u64x1; -- fn aarch64_vqsubq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn aarch64_vqsubq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn aarch64_vqsubq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vqsubq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn aarch64_vqsubq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vqsubq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn aarch64_vqsubq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn aarch64_vqsubq_u64(x: u64x2, y: u64x2) -> u64x2; -- fn aarch64_vrsubhn_s16(x: i16x8, y: i16x8) -> i8x8; -- fn aarch64_vrsubhn_u16(x: u16x8, y: u16x8) -> u8x8; -- fn aarch64_vrsubhn_s32(x: i32x4, y: i32x4) -> i16x4; -- fn aarch64_vrsubhn_u32(x: u32x4, y: u32x4) -> u16x4; -- fn aarch64_vrsubhn_s64(x: i64x2, y: i64x2) -> i32x2; -- fn aarch64_vrsubhn_u64(x: u64x2, y: u64x2) -> u32x2; -- fn aarch64_vabd_s8(x: i8x8, y: i8x8) -> i8x8; -- fn aarch64_vabd_u8(x: u8x8, y: u8x8) -> u8x8; -- fn aarch64_vabd_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vabd_u16(x: u16x4, y: u16x4) -> u16x4; -- fn aarch64_vabd_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vabd_u32(x: u32x2, y: u32x2) -> u32x2; -- fn aarch64_vabd_f32(x: f32x2, y: f32x2) -> f32x2; -- fn aarch64_vabd_f64(x: f64x1, y: f64x1) -> f64x1; -- fn aarch64_vabdq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn aarch64_vabdq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn aarch64_vabdq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vabdq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn aarch64_vabdq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vabdq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn aarch64_vabdq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn aarch64_vabdq_f64(x: f64x2, y: f64x2) -> f64x2; -- fn aarch64_vmax_s8(x: i8x8, y: i8x8) -> i8x8; -- fn aarch64_vmax_u8(x: u8x8, y: u8x8) -> u8x8; -- fn aarch64_vmax_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vmax_u16(x: u16x4, y: u16x4) -> u16x4; -- fn aarch64_vmax_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vmax_u32(x: u32x2, y: u32x2) -> u32x2; -- fn aarch64_vmax_f32(x: f32x2, y: f32x2) -> f32x2; -- fn aarch64_vmax_f64(x: f64x1, y: f64x1) -> f64x1; -- fn aarch64_vmaxq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn aarch64_vmaxq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn aarch64_vmaxq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vmaxq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn aarch64_vmaxq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vmaxq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn aarch64_vmaxq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn aarch64_vmaxq_f64(x: f64x2, y: f64x2) -> f64x2; -- fn aarch64_vmin_s8(x: i8x8, y: i8x8) -> i8x8; -- fn aarch64_vmin_u8(x: u8x8, y: u8x8) -> u8x8; -- fn aarch64_vmin_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vmin_u16(x: u16x4, y: u16x4) -> u16x4; -- fn aarch64_vmin_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vmin_u32(x: u32x2, y: u32x2) -> u32x2; -- fn aarch64_vmin_f32(x: f32x2, y: f32x2) -> f32x2; -- fn aarch64_vmin_f64(x: f64x1, y: f64x1) -> f64x1; -- fn aarch64_vminq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn aarch64_vminq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn aarch64_vminq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vminq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn aarch64_vminq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vminq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn aarch64_vminq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn aarch64_vminq_f64(x: f64x2, y: f64x2) -> f64x2; -- fn aarch64_vmaxnm_f32(x: f32x2, y: f32x2) -> f32x2; -- fn aarch64_vmaxnm_f64(x: f64x1, y: f64x1) -> f64x1; -- fn aarch64_vmaxnmq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn aarch64_vmaxnmq_f64(x: f64x2, y: f64x2) -> f64x2; -- fn aarch64_vminnm_f32(x: f32x2, y: f32x2) -> f32x2; -- fn aarch64_vminnm_f64(x: f64x1, y: f64x1) -> f64x1; -- fn aarch64_vminnmq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn aarch64_vminnmq_f64(x: f64x2, y: f64x2) -> f64x2; -- fn aarch64_vshl_s8(x: i8x8, y: i8x8) -> i8x8; -- fn aarch64_vshl_u8(x: u8x8, y: i8x8) -> u8x8; -- fn aarch64_vshl_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vshl_u16(x: u16x4, y: i16x4) -> u16x4; -- fn aarch64_vshl_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vshl_u32(x: u32x2, y: i32x2) -> u32x2; -- fn aarch64_vshl_s64(x: i64x1, y: i64x1) -> i64x1; -- fn aarch64_vshl_u64(x: u64x1, y: i64x1) -> u64x1; -- fn aarch64_vshlq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn aarch64_vshlq_u8(x: u8x16, y: i8x16) -> u8x16; -- fn aarch64_vshlq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vshlq_u16(x: u16x8, y: i16x8) -> u16x8; -- fn aarch64_vshlq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vshlq_u32(x: u32x4, y: i32x4) -> u32x4; -- fn aarch64_vshlq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn aarch64_vshlq_u64(x: u64x2, y: i64x2) -> u64x2; -- fn aarch64_vqshl_s8(x: i8x8, y: i8x8) -> i8x8; -- fn aarch64_vqshl_u8(x: u8x8, y: i8x8) -> u8x8; -- fn aarch64_vqshl_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vqshl_u16(x: u16x4, y: i16x4) -> u16x4; -- fn aarch64_vqshl_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vqshl_u32(x: u32x2, y: i32x2) -> u32x2; -- fn aarch64_vqshl_s64(x: i64x1, y: i64x1) -> i64x1; -- fn aarch64_vqshl_u64(x: u64x1, y: i64x1) -> u64x1; -- fn aarch64_vqshlq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn aarch64_vqshlq_u8(x: u8x16, y: i8x16) -> u8x16; -- fn aarch64_vqshlq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vqshlq_u16(x: u16x8, y: i16x8) -> u16x8; -- fn aarch64_vqshlq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vqshlq_u32(x: u32x4, y: i32x4) -> u32x4; -- fn aarch64_vqshlq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn aarch64_vqshlq_u64(x: u64x2, y: i64x2) -> u64x2; -- fn aarch64_vrshl_s8(x: i8x8, y: i8x8) -> i8x8; -- fn aarch64_vrshl_u8(x: u8x8, y: i8x8) -> u8x8; -- fn aarch64_vrshl_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vrshl_u16(x: u16x4, y: i16x4) -> u16x4; -- fn aarch64_vrshl_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vrshl_u32(x: u32x2, y: i32x2) -> u32x2; -- fn aarch64_vrshl_s64(x: i64x1, y: i64x1) -> i64x1; -- fn aarch64_vrshl_u64(x: u64x1, y: i64x1) -> u64x1; -- fn aarch64_vrshlq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn aarch64_vrshlq_u8(x: u8x16, y: i8x16) -> u8x16; -- fn aarch64_vrshlq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vrshlq_u16(x: u16x8, y: i16x8) -> u16x8; -- fn aarch64_vrshlq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vrshlq_u32(x: u32x4, y: i32x4) -> u32x4; -- fn aarch64_vrshlq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn aarch64_vrshlq_u64(x: u64x2, y: i64x2) -> u64x2; -- fn aarch64_vqrshl_s8(x: i8x8, y: i8x8) -> i8x8; -- fn aarch64_vqrshl_u8(x: u8x8, y: i8x8) -> u8x8; -- fn aarch64_vqrshl_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vqrshl_u16(x: u16x4, y: i16x4) -> u16x4; -- fn aarch64_vqrshl_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vqrshl_u32(x: u32x2, y: i32x2) -> u32x2; -- fn aarch64_vqrshl_s64(x: i64x1, y: i64x1) -> i64x1; -- fn aarch64_vqrshl_u64(x: u64x1, y: i64x1) -> u64x1; -- fn aarch64_vqrshlq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn aarch64_vqrshlq_u8(x: u8x16, y: i8x16) -> u8x16; -- fn aarch64_vqrshlq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vqrshlq_u16(x: u16x8, y: i16x8) -> u16x8; -- fn aarch64_vqrshlq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vqrshlq_u32(x: u32x4, y: i32x4) -> u32x4; -- fn aarch64_vqrshlq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn aarch64_vqrshlq_u64(x: u64x2, y: i64x2) -> u64x2; -- fn aarch64_vqshrun_n_s16(x: i16x8, y: u32) -> i8x8; -- fn aarch64_vqshrun_n_s32(x: i32x4, y: u32) -> i16x4; -- fn aarch64_vqshrun_n_s64(x: i64x2, y: u32) -> i32x2; -- fn aarch64_vqrshrun_n_s16(x: i16x8, y: u32) -> i8x8; -- fn aarch64_vqrshrun_n_s32(x: i32x4, y: u32) -> i16x4; -- fn aarch64_vqrshrun_n_s64(x: i64x2, y: u32) -> i32x2; -- fn aarch64_vqshrn_n_s16(x: i16x8, y: u32) -> i8x8; -- fn aarch64_vqshrn_n_u16(x: u16x8, y: u32) -> u8x8; -- fn aarch64_vqshrn_n_s32(x: i32x4, y: u32) -> i16x4; -- fn aarch64_vqshrn_n_u32(x: u32x4, y: u32) -> u16x4; -- fn aarch64_vqshrn_n_s64(x: i64x2, y: u32) -> i32x2; -- fn aarch64_vqshrn_n_u64(x: u64x2, y: u32) -> u32x2; -- fn aarch64_vrshrn_n_s16(x: i16x8, y: u32) -> i8x8; -- fn aarch64_vrshrn_n_u16(x: u16x8, y: u32) -> u8x8; -- fn aarch64_vrshrn_n_s32(x: i32x4, y: u32) -> i16x4; -- fn aarch64_vrshrn_n_u32(x: u32x4, y: u32) -> u16x4; -- fn aarch64_vrshrn_n_s64(x: i64x2, y: u32) -> i32x2; -- fn aarch64_vrshrn_n_u64(x: u64x2, y: u32) -> u32x2; -- fn aarch64_vqrshrn_n_s16(x: i16x8, y: u32) -> i8x8; -- fn aarch64_vqrshrn_n_u16(x: u16x8, y: u32) -> u8x8; -- fn aarch64_vqrshrn_n_s32(x: i32x4, y: u32) -> i16x4; -- fn aarch64_vqrshrn_n_u32(x: u32x4, y: u32) -> u16x4; -- fn aarch64_vqrshrn_n_s64(x: i64x2, y: u32) -> i32x2; -- fn aarch64_vqrshrn_n_u64(x: u64x2, y: u32) -> u32x2; -- fn aarch64_vsri_s8(x: i8x8, y: i8x8) -> i8x8; -- fn aarch64_vsri_u8(x: u8x8, y: u8x8) -> u8x8; -- fn aarch64_vsri_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vsri_u16(x: u16x4, y: u16x4) -> u16x4; -- fn aarch64_vsri_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vsri_u32(x: u32x2, y: u32x2) -> u32x2; -- fn aarch64_vsri_s64(x: i64x1, y: i64x1) -> i64x1; -- fn aarch64_vsri_u64(x: u64x1, y: u64x1) -> u64x1; -- fn aarch64_vsriq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn aarch64_vsriq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn aarch64_vsriq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vsriq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn aarch64_vsriq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vsriq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn aarch64_vsriq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn aarch64_vsriq_u64(x: u64x2, y: u64x2) -> u64x2; -- fn aarch64_vsli_s8(x: i8x8, y: i8x8) -> i8x8; -- fn aarch64_vsli_u8(x: u8x8, y: u8x8) -> u8x8; -- fn aarch64_vsli_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vsli_u16(x: u16x4, y: u16x4) -> u16x4; -- fn aarch64_vsli_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vsli_u32(x: u32x2, y: u32x2) -> u32x2; -- fn aarch64_vsli_s64(x: i64x1, y: i64x1) -> i64x1; -- fn aarch64_vsli_u64(x: u64x1, y: u64x1) -> u64x1; -- fn aarch64_vsliq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn aarch64_vsliq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn aarch64_vsliq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vsliq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn aarch64_vsliq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vsliq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn aarch64_vsliq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn aarch64_vsliq_u64(x: u64x2, y: u64x2) -> u64x2; -- fn aarch64_vvqmovn_s16(x: i16x8) -> i8x8; -- fn aarch64_vvqmovn_u16(x: u16x8) -> u8x8; -- fn aarch64_vvqmovn_s32(x: i32x4) -> i16x4; -- fn aarch64_vvqmovn_u32(x: u32x4) -> u16x4; -- fn aarch64_vvqmovn_s64(x: i64x2) -> i32x2; -- fn aarch64_vvqmovn_u64(x: u64x2) -> u32x2; -- fn aarch64_vabs_s8(x: i8x8) -> i8x8; -- fn aarch64_vabs_s16(x: i16x4) -> i16x4; -- fn aarch64_vabs_s32(x: i32x2) -> i32x2; -- fn aarch64_vabs_s64(x: i64x1) -> i64x1; -- fn aarch64_vabsq_s8(x: i8x16) -> i8x16; -- fn aarch64_vabsq_s16(x: i16x8) -> i16x8; -- fn aarch64_vabsq_s32(x: i32x4) -> i32x4; -- fn aarch64_vabsq_s64(x: i64x2) -> i64x2; -- fn aarch64_vabs_f32(x: f32x2) -> f32x2; -- fn aarch64_vabs_f64(x: f64x1) -> f64x1; -- fn aarch64_vabsq_f32(x: f32x4) -> f32x4; -- fn aarch64_vabsq_f64(x: f64x2) -> f64x2; -- fn aarch64_vqabs_s8(x: i8x8) -> i8x8; -- fn aarch64_vqabs_s16(x: i16x4) -> i16x4; -- fn aarch64_vqabs_s32(x: i32x2) -> i32x2; -- fn aarch64_vqabs_s64(x: i64x1) -> i64x1; -- fn aarch64_vqabsq_s8(x: i8x16) -> i8x16; -- fn aarch64_vqabsq_s16(x: i16x8) -> i16x8; -- fn aarch64_vqabsq_s32(x: i32x4) -> i32x4; -- fn aarch64_vqabsq_s64(x: i64x2) -> i64x2; -- fn aarch64_vqneg_s8(x: i8x8) -> i8x8; -- fn aarch64_vqneg_s16(x: i16x4) -> i16x4; -- fn aarch64_vqneg_s32(x: i32x2) -> i32x2; -- fn aarch64_vqneg_s64(x: i64x1) -> i64x1; -- fn aarch64_vqnegq_s8(x: i8x16) -> i8x16; -- fn aarch64_vqnegq_s16(x: i16x8) -> i16x8; -- fn aarch64_vqnegq_s32(x: i32x4) -> i32x4; -- fn aarch64_vqnegq_s64(x: i64x2) -> i64x2; -- fn aarch64_vclz_s8(x: i8x8) -> i8x8; -- fn aarch64_vclz_u8(x: u8x8) -> u8x8; -- fn aarch64_vclz_s16(x: i16x4) -> i16x4; -- fn aarch64_vclz_u16(x: u16x4) -> u16x4; -- fn aarch64_vclz_s32(x: i32x2) -> i32x2; -- fn aarch64_vclz_u32(x: u32x2) -> u32x2; -- fn aarch64_vclzq_s8(x: i8x16) -> i8x16; -- fn aarch64_vclzq_u8(x: u8x16) -> u8x16; -- fn aarch64_vclzq_s16(x: i16x8) -> i16x8; -- fn aarch64_vclzq_u16(x: u16x8) -> u16x8; -- fn aarch64_vclzq_s32(x: i32x4) -> i32x4; -- fn aarch64_vclzq_u32(x: u32x4) -> u32x4; -- fn aarch64_vcls_s8(x: i8x8) -> i8x8; -- fn aarch64_vcls_u8(x: u8x8) -> u8x8; -- fn aarch64_vcls_s16(x: i16x4) -> i16x4; -- fn aarch64_vcls_u16(x: u16x4) -> u16x4; -- fn aarch64_vcls_s32(x: i32x2) -> i32x2; -- fn aarch64_vcls_u32(x: u32x2) -> u32x2; -- fn aarch64_vclsq_s8(x: i8x16) -> i8x16; -- fn aarch64_vclsq_u8(x: u8x16) -> u8x16; -- fn aarch64_vclsq_s16(x: i16x8) -> i16x8; -- fn aarch64_vclsq_u16(x: u16x8) -> u16x8; -- fn aarch64_vclsq_s32(x: i32x4) -> i32x4; -- fn aarch64_vclsq_u32(x: u32x4) -> u32x4; -- fn aarch64_vcnt_s8(x: i8x8) -> i8x8; -- fn aarch64_vcnt_u8(x: u8x8) -> u8x8; -- fn aarch64_vcntq_s8(x: i8x16) -> i8x16; -- fn aarch64_vcntq_u8(x: u8x16) -> u8x16; -- fn aarch64_vrecpe_u32(x: u32x2) -> u32x2; -- fn aarch64_vrecpe_f32(x: f32x2) -> f32x2; -- fn aarch64_vrecpe_f64(x: f64x1) -> f64x1; -- fn aarch64_vrecpeq_u32(x: u32x4) -> u32x4; -- fn aarch64_vrecpeq_f32(x: f32x4) -> f32x4; -- fn aarch64_vrecpeq_f64(x: f64x2) -> f64x2; -- fn aarch64_vrecps_f32(x: f32x2, y: f32x2) -> f32x2; -- fn aarch64_vrecps_f64(x: f64x1, y: f64x1) -> f64x1; -- fn aarch64_vrecpsq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn aarch64_vrecpsq_f64(x: f64x2, y: f64x2) -> f64x2; -- fn aarch64_vsqrt_f32(x: f32x2) -> f32x2; -- fn aarch64_vsqrt_f64(x: f64x1) -> f64x1; -- fn aarch64_vsqrtq_f32(x: f32x4) -> f32x4; -- fn aarch64_vsqrtq_f64(x: f64x2) -> f64x2; -- fn aarch64_vrsqrte_u32(x: u32x2) -> u32x2; -- fn aarch64_vrsqrte_f32(x: f32x2) -> f32x2; -- fn aarch64_vrsqrte_f64(x: f64x1) -> f64x1; -- fn aarch64_vrsqrteq_u32(x: u32x4) -> u32x4; -- fn aarch64_vrsqrteq_f32(x: f32x4) -> f32x4; -- fn aarch64_vrsqrteq_f64(x: f64x2) -> f64x2; -- fn aarch64_vrsqrts_f32(x: f32x2, y: f32x2) -> f32x2; -- fn aarch64_vrsqrts_f64(x: f64x1, y: f64x1) -> f64x1; -- fn aarch64_vrsqrtsq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn aarch64_vrsqrtsq_f64(x: f64x2, y: f64x2) -> f64x2; -- fn aarch64_vrbit_s8(x: i8x8) -> i8x8; -- fn aarch64_vrbit_u8(x: u8x8) -> u8x8; -- fn aarch64_vrbitq_s8(x: i8x16) -> i8x16; -- fn aarch64_vrbitq_u8(x: u8x16) -> u8x16; -- fn aarch64_vpadd_s8(x: i8x8, y: i8x8) -> i8x8; -- fn aarch64_vpadd_u8(x: u8x8, y: u8x8) -> u8x8; -- fn aarch64_vpadd_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vpadd_u16(x: u16x4, y: u16x4) -> u16x4; -- fn aarch64_vpadd_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vpadd_u32(x: u32x2, y: u32x2) -> u32x2; -- fn aarch64_vpadd_f32(x: f32x2, y: f32x2) -> f32x2; -- fn aarch64_vpaddq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn aarch64_vpaddq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn aarch64_vpaddq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vpaddq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn aarch64_vpaddq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vpaddq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn aarch64_vpaddq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn aarch64_vpaddq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn aarch64_vpaddq_u64(x: u64x2, y: u64x2) -> u64x2; -- fn aarch64_vpaddq_f64(x: f64x2, y: f64x2) -> f64x2; -- fn aarch64_vpaddl_s16(x: i8x8) -> i16x4; -- fn aarch64_vpaddl_u16(x: u8x8) -> u16x4; -- fn aarch64_vpaddl_s32(x: i16x4) -> i32x2; -- fn aarch64_vpaddl_u32(x: u16x4) -> u32x2; -- fn aarch64_vpaddl_s64(x: i32x2) -> i64x1; -- fn aarch64_vpaddl_u64(x: u32x2) -> u64x1; -- fn aarch64_vpaddlq_s16(x: i8x16) -> i16x8; -- fn aarch64_vpaddlq_u16(x: u8x16) -> u16x8; -- fn aarch64_vpaddlq_s32(x: i16x8) -> i32x4; -- fn aarch64_vpaddlq_u32(x: u16x8) -> u32x4; -- fn aarch64_vpaddlq_s64(x: i32x4) -> i64x2; -- fn aarch64_vpaddlq_u64(x: u32x4) -> u64x2; -- fn aarch64_vpmax_s8(x: i8x8, y: i8x8) -> i8x8; -- fn aarch64_vpmax_u8(x: u8x8, y: u8x8) -> u8x8; -- fn aarch64_vpmax_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vpmax_u16(x: u16x4, y: u16x4) -> u16x4; -- fn aarch64_vpmax_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vpmax_u32(x: u32x2, y: u32x2) -> u32x2; -- fn aarch64_vpmax_f32(x: f32x2, y: f32x2) -> f32x2; -- fn aarch64_vpmaxq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn aarch64_vpmaxq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn aarch64_vpmaxq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vpmaxq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn aarch64_vpmaxq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vpmaxq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn aarch64_vpmaxq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn aarch64_vpmaxq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn aarch64_vpmaxq_u64(x: u64x2, y: u64x2) -> u64x2; -- fn aarch64_vpmaxq_f64(x: f64x2, y: f64x2) -> f64x2; -- fn aarch64_vpmin_s8(x: i8x8, y: i8x8) -> i8x8; -- fn aarch64_vpmin_u8(x: u8x8, y: u8x8) -> u8x8; -- fn aarch64_vpmin_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vpmin_u16(x: u16x4, y: u16x4) -> u16x4; -- fn aarch64_vpmin_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vpmin_u32(x: u32x2, y: u32x2) -> u32x2; -- fn aarch64_vpmin_f32(x: f32x2, y: f32x2) -> f32x2; -- fn aarch64_vpminq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn aarch64_vpminq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn aarch64_vpminq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vpminq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn aarch64_vpminq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vpminq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn aarch64_vpminq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn aarch64_vpminq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn aarch64_vpminq_u64(x: u64x2, y: u64x2) -> u64x2; -- fn aarch64_vpminq_f64(x: f64x2, y: f64x2) -> f64x2; -- fn aarch64_vpmaxnm_s8(x: i8x8, y: i8x8) -> i8x8; -- fn aarch64_vpmaxnm_u8(x: u8x8, y: u8x8) -> u8x8; -- fn aarch64_vpmaxnm_s16(x: i16x4, y: i16x4) -> i16x4; -- fn aarch64_vpmaxnm_u16(x: u16x4, y: u16x4) -> u16x4; -- fn aarch64_vpmaxnm_s32(x: i32x2, y: i32x2) -> i32x2; -- fn aarch64_vpmaxnm_u32(x: u32x2, y: u32x2) -> u32x2; -- fn aarch64_vpmaxnm_f32(x: f32x2, y: f32x2) -> f32x2; -- fn aarch64_vpmaxnmq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn aarch64_vpmaxnmq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn aarch64_vpmaxnmq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn aarch64_vpmaxnmq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn aarch64_vpmaxnmq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn aarch64_vpmaxnmq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn aarch64_vpmaxnmq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn aarch64_vpmaxnmq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn aarch64_vpmaxnmq_u64(x: u64x2, y: u64x2) -> u64x2; -- fn aarch64_vpmaxnmq_f64(x: f64x2, y: f64x2) -> f64x2; -- fn aarch64_vpminnm_f32(x: f32x2, y: f32x2) -> f32x2; -- fn aarch64_vpminnmq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn aarch64_vpminnmq_f64(x: f64x2, y: f64x2) -> f64x2; -- fn aarch64_vaddv_s8(x: i8x8) -> i8; -- fn aarch64_vaddv_u8(x: u8x8) -> u8; -- fn aarch64_vaddv_s16(x: i16x4) -> i16; -- fn aarch64_vaddv_u16(x: u16x4) -> u16; -- fn aarch64_vaddv_s32(x: i32x2) -> i32; -- fn aarch64_vaddv_u32(x: u32x2) -> u32; -- fn aarch64_vaddv_f32(x: f32x2) -> f32; -- fn aarch64_vaddvq_s8(x: i8x16) -> i8; -- fn aarch64_vaddvq_u8(x: u8x16) -> u8; -- fn aarch64_vaddvq_s16(x: i16x8) -> i16; -- fn aarch64_vaddvq_u16(x: u16x8) -> u16; -- fn aarch64_vaddvq_s32(x: i32x4) -> i32; -- fn aarch64_vaddvq_u32(x: u32x4) -> u32; -- fn aarch64_vaddvq_f32(x: f32x4) -> f32; -- fn aarch64_vaddvq_s64(x: i64x2) -> i64; -- fn aarch64_vaddvq_u64(x: u64x2) -> u64; -- fn aarch64_vaddvq_f64(x: f64x2) -> f64; -- fn aarch64_vaddlv_s8(x: i8x8) -> i16; -- fn aarch64_vaddlv_u8(x: u8x8) -> u16; -- fn aarch64_vaddlv_s16(x: i16x4) -> i32; -- fn aarch64_vaddlv_u16(x: u16x4) -> u32; -- fn aarch64_vaddlv_s32(x: i32x2) -> i64; -- fn aarch64_vaddlv_u32(x: u32x2) -> u64; -- fn aarch64_vaddlvq_s8(x: i8x16) -> i16; -- fn aarch64_vaddlvq_u8(x: u8x16) -> u16; -- fn aarch64_vaddlvq_s16(x: i16x8) -> i32; -- fn aarch64_vaddlvq_u16(x: u16x8) -> u32; -- fn aarch64_vaddlvq_s32(x: i32x4) -> i64; -- fn aarch64_vaddlvq_u32(x: u32x4) -> u64; -- fn aarch64_vmaxv_s8(x: i8x8) -> i8; -- fn aarch64_vmaxv_u8(x: u8x8) -> u8; -- fn aarch64_vmaxv_s16(x: i16x4) -> i16; -- fn aarch64_vmaxv_u16(x: u16x4) -> u16; -- fn aarch64_vmaxv_s32(x: i32x2) -> i32; -- fn aarch64_vmaxv_u32(x: u32x2) -> u32; -- fn aarch64_vmaxv_f32(x: f32x2) -> f32; -- fn aarch64_vmaxvq_s8(x: i8x16) -> i8; -- fn aarch64_vmaxvq_u8(x: u8x16) -> u8; -- fn aarch64_vmaxvq_s16(x: i16x8) -> i16; -- fn aarch64_vmaxvq_u16(x: u16x8) -> u16; -- fn aarch64_vmaxvq_s32(x: i32x4) -> i32; -- fn aarch64_vmaxvq_u32(x: u32x4) -> u32; -- fn aarch64_vmaxvq_f32(x: f32x4) -> f32; -- fn aarch64_vmaxvq_f64(x: f64x2) -> f64; -- fn aarch64_vminv_s8(x: i8x8) -> i8; -- fn aarch64_vminv_u8(x: u8x8) -> u8; -- fn aarch64_vminv_s16(x: i16x4) -> i16; -- fn aarch64_vminv_u16(x: u16x4) -> u16; -- fn aarch64_vminv_s32(x: i32x2) -> i32; -- fn aarch64_vminv_u32(x: u32x2) -> u32; -- fn aarch64_vminv_f32(x: f32x2) -> f32; -- fn aarch64_vminvq_s8(x: i8x16) -> i8; -- fn aarch64_vminvq_u8(x: u8x16) -> u8; -- fn aarch64_vminvq_s16(x: i16x8) -> i16; -- fn aarch64_vminvq_u16(x: u16x8) -> u16; -- fn aarch64_vminvq_s32(x: i32x4) -> i32; -- fn aarch64_vminvq_u32(x: u32x4) -> u32; -- fn aarch64_vminvq_f32(x: f32x4) -> f32; -- fn aarch64_vminvq_f64(x: f64x2) -> f64; -- fn aarch64_vmaxnmv_f32(x: f32x2) -> f32; -- fn aarch64_vmaxnmvq_f32(x: f32x4) -> f32; -- fn aarch64_vmaxnmvq_f64(x: f64x2) -> f64; -- fn aarch64_vminnmv_f32(x: f32x2) -> f32; -- fn aarch64_vminnmvq_f32(x: f32x4) -> f32; -- fn aarch64_vminnmvq_f64(x: f64x2) -> f64; -- fn aarch64_vqtbl1_s8(x: i8x16, y: u8x8) -> i8x8; -- fn aarch64_vqtbl1_u8(x: u8x16, y: u8x8) -> u8x8; -- fn aarch64_vqtbl1q_s8(x: i8x16, y: u8x16) -> i8x16; -- fn aarch64_vqtbl1q_u8(x: u8x16, y: u8x16) -> u8x16; -- fn aarch64_vqtbx1_s8(x: i8x8, y: i8x16, z: u8x8) -> i8x8; -- fn aarch64_vqtbx1_u8(x: u8x8, y: u8x16, z: u8x8) -> u8x8; -- fn aarch64_vqtbx1q_s8(x: i8x16, y: i8x16, z: u8x16) -> i8x16; -- fn aarch64_vqtbx1q_u8(x: u8x16, y: u8x16, z: u8x16) -> u8x16; -- fn aarch64_vqtbl2_s8(x: (i8x16, i8x16), y: u8x8) -> i8x8; -- fn aarch64_vqtbl2_u8(x: (u8x16, u8x16), y: u8x8) -> u8x8; -- fn aarch64_vqtbl2q_s8(x: (i8x16, i8x16), y: u8x16) -> i8x16; -- fn aarch64_vqtbl2q_u8(x: (u8x16, u8x16), y: u8x16) -> u8x16; -- fn aarch64_vqtbx2_s8(x: (i8x16, i8x16), y: u8x8) -> i8x8; -- fn aarch64_vqtbx2_u8(x: (u8x16, u8x16), y: u8x8) -> u8x8; -- fn aarch64_vqtbx2q_s8(x: (i8x16, i8x16), y: u8x16) -> i8x16; -- fn aarch64_vqtbx2q_u8(x: (u8x16, u8x16), y: u8x16) -> u8x16; -- fn aarch64_vqtbl3_s8(x: (i8x16, i8x16, i8x16), y: u8x8) -> i8x8; -- fn aarch64_vqtbl3_u8(x: (u8x16, u8x16, u8x16), y: u8x8) -> u8x8; -- fn aarch64_vqtbl3q_s8(x: (i8x16, i8x16, i8x16), y: u8x16) -> i8x16; -- fn aarch64_vqtbl3q_u8(x: (u8x16, u8x16, u8x16), y: u8x16) -> u8x16; -- fn aarch64_vqtbx3_s8(x: i8x8, y: (i8x16, i8x16, i8x16), z: u8x8) -> i8x8; -- fn aarch64_vqtbx3_u8(x: u8x8, y: (u8x16, u8x16, u8x16), z: u8x8) -> u8x8; -- fn aarch64_vqtbx3q_s8(x: i8x16, y: (i8x16, i8x16, i8x16), z: u8x16) -> i8x16; -- fn aarch64_vqtbx3q_u8(x: u8x16, y: (u8x16, u8x16, u8x16), z: u8x16) -> u8x16; -- fn aarch64_vqtbl4_s8(x: (i8x16, i8x16, i8x16, i8x16), y: u8x8) -> i8x8; -- fn aarch64_vqtbl4_u8(x: (u8x16, u8x16, u8x16, u8x16), y: u8x8) -> u8x8; -- fn aarch64_vqtbl4q_s8(x: (i8x16, i8x16, i8x16, i8x16), y: u8x16) -> i8x16; -- fn aarch64_vqtbl4q_u8(x: (u8x16, u8x16, u8x16, u8x16), y: u8x16) -> u8x16; -- fn aarch64_vqtbx4_s8(x: i8x8, y: (i8x16, i8x16, i8x16, i8x16), z: u8x8) -> i8x8; -- fn aarch64_vqtbx4_u8(x: u8x8, y: (u8x16, u8x16, u8x16, u8x16), z: u8x8) -> u8x8; -- fn aarch64_vqtbx4q_s8(x: i8x16, y: (i8x16, i8x16, i8x16, i8x16), z: u8x16) -> i8x16; -- fn aarch64_vqtbx4q_u8(x: u8x16, y: (u8x16, u8x16, u8x16, u8x16), z: u8x16) -> u8x16; --} -- --pub trait Aarch64F32x4 { -- fn to_f64(self) -> f64x2; --} --impl Aarch64F32x4 for f32x4 { -- #[inline] -- fn to_f64(self) -> f64x2 { -- unsafe { -- simd_cast(f32x2(self.0, self.1)) -- } -- } --} -- --pub trait Aarch64U8x16 { -- fn table_lookup_1(self, t0: u8x16) -> u8x16; --} --impl Aarch64U8x16 for u8x16 { -- #[inline] -- fn table_lookup_1(self, t0: u8x16) -> u8x16 { -- unsafe {aarch64_vqtbl1q_u8(t0, self)} -- } --} --pub trait Aarch64I8x16 { -- fn table_lookup_1(self, t0: i8x16) -> i8x16; --} --impl Aarch64I8x16 for i8x16 { -- #[inline] -- fn table_lookup_1(self, t0: i8x16) -> i8x16 { -- unsafe {aarch64_vqtbl2q_s8((t0, t0), ::bitcast(self))} -- } --} -- --#[doc(hidden)] --pub mod common { -- use super::super::super::*; -- use core::mem; -- -- #[inline] -- pub fn f32x4_sqrt(x: f32x4) -> f32x4 { -- unsafe {super::aarch64_vsqrtq_f32(x)} -- } -- #[inline] -- pub fn f32x4_approx_rsqrt(x: f32x4) -> f32x4 { -- unsafe {super::aarch64_vrsqrteq_f32(x)} -- } -- #[inline] -- pub fn f32x4_approx_reciprocal(x: f32x4) -> f32x4 { -- unsafe {super::aarch64_vrecpeq_f32(x)} -- } -- #[inline] -- pub fn f32x4_max(x: f32x4, y: f32x4) -> f32x4 { -- unsafe {super::aarch64_vmaxq_f32(x, y)} -- } -- #[inline] -- pub fn f32x4_min(x: f32x4, y: f32x4) -> f32x4 { -- unsafe {super::aarch64_vminq_f32(x, y)} -- } -- -- macro_rules! bools { -- ($($ty: ty, $all: ident ($min: ident), $any: ident ($max: ident);)*) => { -- $( -- #[inline] -- pub fn $all(x: $ty) -> bool { -- unsafe { -- super::$min(mem::transmute(x)) != 0 -- } -- } -- #[inline] -- pub fn $any(x: $ty) -> bool { -- unsafe { -- super::$max(mem::transmute(x)) != 0 -- } -- } -- )* -- } -- } -- -- bools! { -- bool32fx4, bool32fx4_all(aarch64_vminvq_u32), bool32fx4_any(aarch64_vmaxvq_u32); -- bool8ix16, bool8ix16_all(aarch64_vminvq_u8), bool8ix16_any(aarch64_vmaxvq_u8); -- bool16ix8, bool16ix8_all(aarch64_vminvq_u16), bool16ix8_any(aarch64_vmaxvq_u16); -- bool32ix4, bool32ix4_all(aarch64_vminvq_u32), bool32ix4_any(aarch64_vmaxvq_u32); -- } --} -diff --git a/third_party/rust/simd/src/arm/mod.rs b/third_party/rust/simd/src/arm/mod.rs -deleted file mode 100644 -index 0d451103840b..000000000000 ---- a/third_party/rust/simd/src/arm/mod.rs -+++ /dev/null -@@ -1,4 +0,0 @@ --//! Features specific to ARM CPUs. -- --#[cfg(any(feature = "doc", target_feature = "neon"))] --pub mod neon; -diff --git a/third_party/rust/simd/src/arm/neon.rs b/third_party/rust/simd/src/arm/neon.rs -deleted file mode 100644 -index 8c90a72bb0dc..000000000000 ---- a/third_party/rust/simd/src/arm/neon.rs -+++ /dev/null -@@ -1,622 +0,0 @@ --use super::super::*; --use sixty_four::{i64x2, u64x2}; -- --#[repr(simd)] --#[derive(Debug, Copy, Clone)] --pub struct u32x2(u32, u32); --#[repr(simd)] --#[derive(Debug, Copy, Clone)] --pub struct i32x2(i32, i32); --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct bool32ix2(i32, i32); -- --#[repr(simd)] --#[derive(Debug, Copy, Clone)] --pub struct f32x2(f32, f32); --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct bool32fx2(i32, i32); -- --#[repr(simd)] --#[derive(Debug, Copy, Clone)] --pub struct u16x4(u16, u16, u16, u16); --#[repr(simd)] --#[derive(Debug, Copy, Clone)] --pub struct i16x4(i16, i16, i16, i16); --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct bool16ix4(i16, i16, i16, i16); -- --#[repr(simd)] --#[derive(Debug, Copy, Clone)] --pub struct u8x8(u8, u8, u8, u8, -- u8, u8, u8, u8); --#[repr(simd)] --#[derive(Debug, Copy, Clone)] --pub struct i8x8(i8, i8, i8, i8, -- i8, i8, i8, i8); --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct bool8ix8(i8, i8, i8, i8, -- i8, i8, i8, i8); -- --#[repr(simd)] --#[derive(Debug, Copy, Clone)] --pub struct i64x1(i64); --#[repr(simd)] --#[derive(Debug, Copy, Clone)] --pub struct u64x1(u64); -- --macro_rules! half_bools { -- ($($ty: ty, $as_u: ty, $elem: ty, $all: ident ($min: ident), $any: ident ($max: ident);)*) => { -- $( -- impl $ty { -- #[inline] -- pub fn $all(self) -> bool { -- unsafe { -- let t: $as_u = bitcast(self); -- let y = $min(t, mem::uninitialized()); -- let y32: u32x2 = bitcast(y); -- y32.0 == 0xFFFFFFFF -- } -- } -- #[inline] -- pub fn $any(self) -> bool { -- unsafe { -- let t: $as_u = bitcast(self); -- let y = $max(t, mem::uninitialized()); -- let y32: u32x2 = bitcast(y); -- y32.0 != 0 -- } -- } -- } -- -- impl Clone for $ty { -- #[inline] fn clone(&self) -> Self { -- *self -- } -- } -- -- unsafe impl Simd for $ty { -- type Bool = $ty; -- type Elem = $elem; -- } -- -- )* -- } --} -- --half_bools! { -- bool32fx2, u32x2, i32, bool32fx2_all(arm_vpmin_u32), bool32fx2_any(arm_vpmax_u32); -- bool8ix8, u8x8, i8, bool8ix8_all(arm_vpmin_u8), bool8ix8_any(arm_vpmax_u8); -- bool16ix4, u16x4, i16, bool16ix4_all(arm_vpmin_u16), bool16ix4_any(arm_vpmax_u16); -- bool32ix2, u32x2, f32, bool32ix2_all(arm_vpmin_u32), bool32ix2_any(arm_vpmax_u32); --} -- --macro_rules! half_simd { -- ($($ty: ty, $elem: ty, $bool_ty: ty;)*) => { -- $( -- unsafe impl Simd for $ty { -- type Bool = $bool_ty; -- type Elem = $elem; -- } -- )* -- } --} -- --half_simd! { -- f32x2, f32, bool32fx2; -- u32x2, u32, bool32ix2; -- i32x2, i32, bool32ix2; -- u16x4, u16, bool16ix4; -- i16x4, i16, bool16ix4; -- u8x8, u8, bool8ix8; -- i8x8, i8, bool8ix8; --} -- --#[allow(dead_code)] --extern "platform-intrinsic" { -- fn arm_vhadd_s8(x: i8x8, y: i8x8) -> i8x8; -- fn arm_vhadd_u8(x: u8x8, y: u8x8) -> u8x8; -- fn arm_vhadd_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vhadd_u16(x: u16x4, y: u16x4) -> u16x4; -- fn arm_vhadd_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vhadd_u32(x: u32x2, y: u32x2) -> u32x2; -- fn arm_vhaddq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn arm_vhaddq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn arm_vhaddq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn arm_vhaddq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn arm_vhaddq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn arm_vhaddq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn arm_vrhadd_s8(x: i8x8, y: i8x8) -> i8x8; -- fn arm_vrhadd_u8(x: u8x8, y: u8x8) -> u8x8; -- fn arm_vrhadd_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vrhadd_u16(x: u16x4, y: u16x4) -> u16x4; -- fn arm_vrhadd_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vrhadd_u32(x: u32x2, y: u32x2) -> u32x2; -- fn arm_vrhaddq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn arm_vrhaddq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn arm_vrhaddq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn arm_vrhaddq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn arm_vrhaddq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn arm_vrhaddq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn arm_vqadd_s8(x: i8x8, y: i8x8) -> i8x8; -- fn arm_vqadd_u8(x: u8x8, y: u8x8) -> u8x8; -- fn arm_vqadd_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vqadd_u16(x: u16x4, y: u16x4) -> u16x4; -- fn arm_vqadd_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vqadd_u32(x: u32x2, y: u32x2) -> u32x2; -- fn arm_vqadd_s64(x: i64x1, y: i64x1) -> i64x1; -- fn arm_vqadd_u64(x: u64x1, y: u64x1) -> u64x1; -- fn arm_vqaddq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn arm_vqaddq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn arm_vqaddq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn arm_vqaddq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn arm_vqaddq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn arm_vqaddq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn arm_vqaddq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn arm_vqaddq_u64(x: u64x2, y: u64x2) -> u64x2; -- fn arm_vraddhn_s16(x: i16x8, y: i16x8) -> i8x8; -- fn arm_vraddhn_u16(x: u16x8, y: u16x8) -> u8x8; -- fn arm_vraddhn_s32(x: i32x4, y: i32x4) -> i16x4; -- fn arm_vraddhn_u32(x: u32x4, y: u32x4) -> u16x4; -- fn arm_vraddhn_s64(x: i64x2, y: i64x2) -> i32x2; -- fn arm_vraddhn_u64(x: u64x2, y: u64x2) -> u32x2; -- fn arm_vfma_f32(x: f32x2, y: f32x2) -> f32x2; -- fn arm_vfmaq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn arm_vqdmulh_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vqdmulh_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vqdmulhq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn arm_vqdmulhq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn arm_vqrdmulh_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vqrdmulh_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vqrdmulhq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn arm_vqrdmulhq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn arm_vmull_s8(x: i8x8, y: i8x8) -> i16x8; -- fn arm_vmull_u8(x: u8x8, y: u8x8) -> u16x8; -- fn arm_vmull_s16(x: i16x4, y: i16x4) -> i32x4; -- fn arm_vmull_u16(x: u16x4, y: u16x4) -> u32x4; -- fn arm_vmull_s32(x: i32x2, y: i32x2) -> i64x2; -- fn arm_vmull_u32(x: u32x2, y: u32x2) -> u64x2; -- fn arm_vqdmullq_s8(x: i8x8, y: i8x8) -> i16x8; -- fn arm_vqdmullq_s16(x: i16x4, y: i16x4) -> i32x4; -- fn arm_vhsub_s8(x: i8x8, y: i8x8) -> i8x8; -- fn arm_vhsub_u8(x: u8x8, y: u8x8) -> u8x8; -- fn arm_vhsub_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vhsub_u16(x: u16x4, y: u16x4) -> u16x4; -- fn arm_vhsub_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vhsub_u32(x: u32x2, y: u32x2) -> u32x2; -- fn arm_vhsubq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn arm_vhsubq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn arm_vhsubq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn arm_vhsubq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn arm_vhsubq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn arm_vhsubq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn arm_vqsub_s8(x: i8x8, y: i8x8) -> i8x8; -- fn arm_vqsub_u8(x: u8x8, y: u8x8) -> u8x8; -- fn arm_vqsub_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vqsub_u16(x: u16x4, y: u16x4) -> u16x4; -- fn arm_vqsub_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vqsub_u32(x: u32x2, y: u32x2) -> u32x2; -- fn arm_vqsub_s64(x: i64x1, y: i64x1) -> i64x1; -- fn arm_vqsub_u64(x: u64x1, y: u64x1) -> u64x1; -- fn arm_vqsubq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn arm_vqsubq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn arm_vqsubq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn arm_vqsubq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn arm_vqsubq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn arm_vqsubq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn arm_vqsubq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn arm_vqsubq_u64(x: u64x2, y: u64x2) -> u64x2; -- fn arm_vrsubhn_s16(x: i16x8, y: i16x8) -> i8x8; -- fn arm_vrsubhn_u16(x: u16x8, y: u16x8) -> u8x8; -- fn arm_vrsubhn_s32(x: i32x4, y: i32x4) -> i16x4; -- fn arm_vrsubhn_u32(x: u32x4, y: u32x4) -> u16x4; -- fn arm_vrsubhn_s64(x: i64x2, y: i64x2) -> i32x2; -- fn arm_vrsubhn_u64(x: u64x2, y: u64x2) -> u32x2; -- fn arm_vabd_s8(x: i8x8, y: i8x8) -> i8x8; -- fn arm_vabd_u8(x: u8x8, y: u8x8) -> u8x8; -- fn arm_vabd_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vabd_u16(x: u16x4, y: u16x4) -> u16x4; -- fn arm_vabd_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vabd_u32(x: u32x2, y: u32x2) -> u32x2; -- fn arm_vabd_f32(x: f32x2, y: f32x2) -> f32x2; -- fn arm_vabdq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn arm_vabdq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn arm_vabdq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn arm_vabdq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn arm_vabdq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn arm_vabdq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn arm_vabdq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn arm_vmax_s8(x: i8x8, y: i8x8) -> i8x8; -- fn arm_vmax_u8(x: u8x8, y: u8x8) -> u8x8; -- fn arm_vmax_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vmax_u16(x: u16x4, y: u16x4) -> u16x4; -- fn arm_vmax_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vmax_u32(x: u32x2, y: u32x2) -> u32x2; -- fn arm_vmax_f32(x: f32x2, y: f32x2) -> f32x2; -- fn arm_vmaxq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn arm_vmaxq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn arm_vmaxq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn arm_vmaxq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn arm_vmaxq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn arm_vmaxq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn arm_vmaxq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn arm_vmin_s8(x: i8x8, y: i8x8) -> i8x8; -- fn arm_vmin_u8(x: u8x8, y: u8x8) -> u8x8; -- fn arm_vmin_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vmin_u16(x: u16x4, y: u16x4) -> u16x4; -- fn arm_vmin_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vmin_u32(x: u32x2, y: u32x2) -> u32x2; -- fn arm_vmin_f32(x: f32x2, y: f32x2) -> f32x2; -- fn arm_vminq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn arm_vminq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn arm_vminq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn arm_vminq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn arm_vminq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn arm_vminq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn arm_vminq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn arm_vshl_s8(x: i8x8, y: i8x8) -> i8x8; -- fn arm_vshl_u8(x: u8x8, y: i8x8) -> u8x8; -- fn arm_vshl_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vshl_u16(x: u16x4, y: i16x4) -> u16x4; -- fn arm_vshl_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vshl_u32(x: u32x2, y: i32x2) -> u32x2; -- fn arm_vshl_s64(x: i64x1, y: i64x1) -> i64x1; -- fn arm_vshl_u64(x: u64x1, y: i64x1) -> u64x1; -- fn arm_vshlq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn arm_vshlq_u8(x: u8x16, y: i8x16) -> u8x16; -- fn arm_vshlq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn arm_vshlq_u16(x: u16x8, y: i16x8) -> u16x8; -- fn arm_vshlq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn arm_vshlq_u32(x: u32x4, y: i32x4) -> u32x4; -- fn arm_vshlq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn arm_vshlq_u64(x: u64x2, y: i64x2) -> u64x2; -- fn arm_vqshl_s8(x: i8x8, y: i8x8) -> i8x8; -- fn arm_vqshl_u8(x: u8x8, y: i8x8) -> u8x8; -- fn arm_vqshl_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vqshl_u16(x: u16x4, y: i16x4) -> u16x4; -- fn arm_vqshl_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vqshl_u32(x: u32x2, y: i32x2) -> u32x2; -- fn arm_vqshl_s64(x: i64x1, y: i64x1) -> i64x1; -- fn arm_vqshl_u64(x: u64x1, y: i64x1) -> u64x1; -- fn arm_vqshlq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn arm_vqshlq_u8(x: u8x16, y: i8x16) -> u8x16; -- fn arm_vqshlq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn arm_vqshlq_u16(x: u16x8, y: i16x8) -> u16x8; -- fn arm_vqshlq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn arm_vqshlq_u32(x: u32x4, y: i32x4) -> u32x4; -- fn arm_vqshlq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn arm_vqshlq_u64(x: u64x2, y: i64x2) -> u64x2; -- fn arm_vrshl_s8(x: i8x8, y: i8x8) -> i8x8; -- fn arm_vrshl_u8(x: u8x8, y: i8x8) -> u8x8; -- fn arm_vrshl_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vrshl_u16(x: u16x4, y: i16x4) -> u16x4; -- fn arm_vrshl_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vrshl_u32(x: u32x2, y: i32x2) -> u32x2; -- fn arm_vrshl_s64(x: i64x1, y: i64x1) -> i64x1; -- fn arm_vrshl_u64(x: u64x1, y: i64x1) -> u64x1; -- fn arm_vrshlq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn arm_vrshlq_u8(x: u8x16, y: i8x16) -> u8x16; -- fn arm_vrshlq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn arm_vrshlq_u16(x: u16x8, y: i16x8) -> u16x8; -- fn arm_vrshlq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn arm_vrshlq_u32(x: u32x4, y: i32x4) -> u32x4; -- fn arm_vrshlq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn arm_vrshlq_u64(x: u64x2, y: i64x2) -> u64x2; -- fn arm_vqrshl_s8(x: i8x8, y: i8x8) -> i8x8; -- fn arm_vqrshl_u8(x: u8x8, y: i8x8) -> u8x8; -- fn arm_vqrshl_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vqrshl_u16(x: u16x4, y: i16x4) -> u16x4; -- fn arm_vqrshl_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vqrshl_u32(x: u32x2, y: i32x2) -> u32x2; -- fn arm_vqrshl_s64(x: i64x1, y: i64x1) -> i64x1; -- fn arm_vqrshl_u64(x: u64x1, y: i64x1) -> u64x1; -- fn arm_vqrshlq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn arm_vqrshlq_u8(x: u8x16, y: i8x16) -> u8x16; -- fn arm_vqrshlq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn arm_vqrshlq_u16(x: u16x8, y: i16x8) -> u16x8; -- fn arm_vqrshlq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn arm_vqrshlq_u32(x: u32x4, y: i32x4) -> u32x4; -- fn arm_vqrshlq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn arm_vqrshlq_u64(x: u64x2, y: i64x2) -> u64x2; -- fn arm_vqshrun_n_s16(x: i16x8, y: u32) -> i8x8; -- fn arm_vqshrun_n_s32(x: i32x4, y: u32) -> i16x4; -- fn arm_vqshrun_n_s64(x: i64x2, y: u32) -> i32x2; -- fn arm_vqrshrun_n_s16(x: i16x8, y: u32) -> i8x8; -- fn arm_vqrshrun_n_s32(x: i32x4, y: u32) -> i16x4; -- fn arm_vqrshrun_n_s64(x: i64x2, y: u32) -> i32x2; -- fn arm_vqshrn_n_s16(x: i16x8, y: u32) -> i8x8; -- fn arm_vqshrn_n_u16(x: u16x8, y: u32) -> u8x8; -- fn arm_vqshrn_n_s32(x: i32x4, y: u32) -> i16x4; -- fn arm_vqshrn_n_u32(x: u32x4, y: u32) -> u16x4; -- fn arm_vqshrn_n_s64(x: i64x2, y: u32) -> i32x2; -- fn arm_vqshrn_n_u64(x: u64x2, y: u32) -> u32x2; -- fn arm_vrshrn_n_s16(x: i16x8, y: u32) -> i8x8; -- fn arm_vrshrn_n_u16(x: u16x8, y: u32) -> u8x8; -- fn arm_vrshrn_n_s32(x: i32x4, y: u32) -> i16x4; -- fn arm_vrshrn_n_u32(x: u32x4, y: u32) -> u16x4; -- fn arm_vrshrn_n_s64(x: i64x2, y: u32) -> i32x2; -- fn arm_vrshrn_n_u64(x: u64x2, y: u32) -> u32x2; -- fn arm_vqrshrn_n_s16(x: i16x8, y: u32) -> i8x8; -- fn arm_vqrshrn_n_u16(x: u16x8, y: u32) -> u8x8; -- fn arm_vqrshrn_n_s32(x: i32x4, y: u32) -> i16x4; -- fn arm_vqrshrn_n_u32(x: u32x4, y: u32) -> u16x4; -- fn arm_vqrshrn_n_s64(x: i64x2, y: u32) -> i32x2; -- fn arm_vqrshrn_n_u64(x: u64x2, y: u32) -> u32x2; -- fn arm_vsri_s8(x: i8x8, y: i8x8) -> i8x8; -- fn arm_vsri_u8(x: u8x8, y: u8x8) -> u8x8; -- fn arm_vsri_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vsri_u16(x: u16x4, y: u16x4) -> u16x4; -- fn arm_vsri_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vsri_u32(x: u32x2, y: u32x2) -> u32x2; -- fn arm_vsri_s64(x: i64x1, y: i64x1) -> i64x1; -- fn arm_vsri_u64(x: u64x1, y: u64x1) -> u64x1; -- fn arm_vsriq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn arm_vsriq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn arm_vsriq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn arm_vsriq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn arm_vsriq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn arm_vsriq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn arm_vsriq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn arm_vsriq_u64(x: u64x2, y: u64x2) -> u64x2; -- fn arm_vsli_s8(x: i8x8, y: i8x8) -> i8x8; -- fn arm_vsli_u8(x: u8x8, y: u8x8) -> u8x8; -- fn arm_vsli_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vsli_u16(x: u16x4, y: u16x4) -> u16x4; -- fn arm_vsli_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vsli_u32(x: u32x2, y: u32x2) -> u32x2; -- fn arm_vsli_s64(x: i64x1, y: i64x1) -> i64x1; -- fn arm_vsli_u64(x: u64x1, y: u64x1) -> u64x1; -- fn arm_vsliq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn arm_vsliq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn arm_vsliq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn arm_vsliq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn arm_vsliq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn arm_vsliq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn arm_vsliq_s64(x: i64x2, y: i64x2) -> i64x2; -- fn arm_vsliq_u64(x: u64x2, y: u64x2) -> u64x2; -- fn arm_vvqmovn_s16(x: i16x8) -> i8x8; -- fn arm_vvqmovn_u16(x: u16x8) -> u8x8; -- fn arm_vvqmovn_s32(x: i32x4) -> i16x4; -- fn arm_vvqmovn_u32(x: u32x4) -> u16x4; -- fn arm_vvqmovn_s64(x: i64x2) -> i32x2; -- fn arm_vvqmovn_u64(x: u64x2) -> u32x2; -- fn arm_vabs_s8(x: i8x8) -> i8x8; -- fn arm_vabs_s16(x: i16x4) -> i16x4; -- fn arm_vabs_s32(x: i32x2) -> i32x2; -- fn arm_vabsq_s8(x: i8x16) -> i8x16; -- fn arm_vabsq_s16(x: i16x8) -> i16x8; -- fn arm_vabsq_s32(x: i32x4) -> i32x4; -- fn arm_vabs_f32(x: f32x2) -> f32x2; -- fn arm_vabsq_f32(x: f32x4) -> f32x4; -- fn arm_vqabs_s8(x: i8x8) -> i8x8; -- fn arm_vqabs_s16(x: i16x4) -> i16x4; -- fn arm_vqabs_s32(x: i32x2) -> i32x2; -- fn arm_vqabsq_s8(x: i8x16) -> i8x16; -- fn arm_vqabsq_s16(x: i16x8) -> i16x8; -- fn arm_vqabsq_s32(x: i32x4) -> i32x4; -- fn arm_vqneg_s8(x: i8x8) -> i8x8; -- fn arm_vqneg_s16(x: i16x4) -> i16x4; -- fn arm_vqneg_s32(x: i32x2) -> i32x2; -- fn arm_vqnegq_s8(x: i8x16) -> i8x16; -- fn arm_vqnegq_s16(x: i16x8) -> i16x8; -- fn arm_vqnegq_s32(x: i32x4) -> i32x4; -- fn arm_vclz_s8(x: i8x8) -> i8x8; -- fn arm_vclz_u8(x: u8x8) -> u8x8; -- fn arm_vclz_s16(x: i16x4) -> i16x4; -- fn arm_vclz_u16(x: u16x4) -> u16x4; -- fn arm_vclz_s32(x: i32x2) -> i32x2; -- fn arm_vclz_u32(x: u32x2) -> u32x2; -- fn arm_vclzq_s8(x: i8x16) -> i8x16; -- fn arm_vclzq_u8(x: u8x16) -> u8x16; -- fn arm_vclzq_s16(x: i16x8) -> i16x8; -- fn arm_vclzq_u16(x: u16x8) -> u16x8; -- fn arm_vclzq_s32(x: i32x4) -> i32x4; -- fn arm_vclzq_u32(x: u32x4) -> u32x4; -- fn arm_vcls_s8(x: i8x8) -> i8x8; -- fn arm_vcls_u8(x: u8x8) -> u8x8; -- fn arm_vcls_s16(x: i16x4) -> i16x4; -- fn arm_vcls_u16(x: u16x4) -> u16x4; -- fn arm_vcls_s32(x: i32x2) -> i32x2; -- fn arm_vcls_u32(x: u32x2) -> u32x2; -- fn arm_vclsq_s8(x: i8x16) -> i8x16; -- fn arm_vclsq_u8(x: u8x16) -> u8x16; -- fn arm_vclsq_s16(x: i16x8) -> i16x8; -- fn arm_vclsq_u16(x: u16x8) -> u16x8; -- fn arm_vclsq_s32(x: i32x4) -> i32x4; -- fn arm_vclsq_u32(x: u32x4) -> u32x4; -- fn arm_vcnt_s8(x: i8x8) -> i8x8; -- fn arm_vcnt_u8(x: u8x8) -> u8x8; -- fn arm_vcntq_s8(x: i8x16) -> i8x16; -- fn arm_vcntq_u8(x: u8x16) -> u8x16; -- fn arm_vrecpe_u32(x: u32x2) -> u32x2; -- fn arm_vrecpe_f32(x: f32x2) -> f32x2; -- fn arm_vrecpeq_u32(x: u32x4) -> u32x4; -- fn arm_vrecpeq_f32(x: f32x4) -> f32x4; -- fn arm_vrecps_f32(x: f32x2, y: f32x2) -> f32x2; -- fn arm_vrecpsq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn arm_vsqrt_f32(x: f32x2) -> f32x2; -- fn arm_vsqrtq_f32(x: f32x4) -> f32x4; -- fn arm_vrsqrte_u32(x: u32x2) -> u32x2; -- fn arm_vrsqrte_f32(x: f32x2) -> f32x2; -- fn arm_vrsqrteq_u32(x: u32x4) -> u32x4; -- fn arm_vrsqrteq_f32(x: f32x4) -> f32x4; -- fn arm_vrsqrts_f32(x: f32x2, y: f32x2) -> f32x2; -- fn arm_vrsqrtsq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn arm_vbsl_s8(x: u8x8, y: i8x8) -> i8x8; -- fn arm_vbsl_u8(x: u8x8, y: u8x8) -> u8x8; -- fn arm_vbsl_s16(x: u16x4, y: i16x4) -> i16x4; -- fn arm_vbsl_u16(x: u16x4, y: u16x4) -> u16x4; -- fn arm_vbsl_s32(x: u32x2, y: i32x2) -> i32x2; -- fn arm_vbsl_u32(x: u32x2, y: u32x2) -> u32x2; -- fn arm_vbsl_s64(x: u64x1, y: i64x1) -> i64x1; -- fn arm_vbsl_u64(x: u64x1, y: u64x1) -> u64x1; -- fn arm_vbslq_s8(x: u8x16, y: i8x16) -> i8x16; -- fn arm_vbslq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn arm_vbslq_s16(x: u16x8, y: i16x8) -> i16x8; -- fn arm_vbslq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn arm_vbslq_s32(x: u32x4, y: i32x4) -> i32x4; -- fn arm_vbslq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn arm_vbslq_s64(x: u64x2, y: i64x2) -> i64x2; -- fn arm_vbslq_u64(x: u64x2, y: u64x2) -> u64x2; -- fn arm_vpadd_s8(x: i8x8, y: i8x8) -> i8x8; -- fn arm_vpadd_u8(x: u8x8, y: u8x8) -> u8x8; -- fn arm_vpadd_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vpadd_u16(x: u16x4, y: u16x4) -> u16x4; -- fn arm_vpadd_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vpadd_u32(x: u32x2, y: u32x2) -> u32x2; -- fn arm_vpadd_f32(x: f32x2, y: f32x2) -> f32x2; -- fn arm_vpaddl_s16(x: i8x8) -> i16x4; -- fn arm_vpaddl_u16(x: u8x8) -> u16x4; -- fn arm_vpaddl_s32(x: i16x4) -> i32x2; -- fn arm_vpaddl_u32(x: u16x4) -> u32x2; -- fn arm_vpaddl_s64(x: i32x2) -> i64x1; -- fn arm_vpaddl_u64(x: u32x2) -> u64x1; -- fn arm_vpaddlq_s16(x: i8x16) -> i16x8; -- fn arm_vpaddlq_u16(x: u8x16) -> u16x8; -- fn arm_vpaddlq_s32(x: i16x8) -> i32x4; -- fn arm_vpaddlq_u32(x: u16x8) -> u32x4; -- fn arm_vpaddlq_s64(x: i32x4) -> i64x2; -- fn arm_vpaddlq_u64(x: u32x4) -> u64x2; -- fn arm_vpadal_s16(x: i16x4, y: i8x8) -> i16x4; -- fn arm_vpadal_u16(x: u16x4, y: u8x8) -> u16x4; -- fn arm_vpadal_s32(x: i32x2, y: i16x4) -> i32x2; -- fn arm_vpadal_u32(x: u32x2, y: u16x4) -> u32x2; -- fn arm_vpadal_s64(x: i64x1, y: i32x2) -> i64x1; -- fn arm_vpadal_u64(x: u64x1, y: u32x2) -> u64x1; -- fn arm_vpadalq_s16(x: i16x8, y: i8x16) -> i16x8; -- fn arm_vpadalq_u16(x: u16x8, y: u8x16) -> u16x8; -- fn arm_vpadalq_s32(x: i32x4, y: i16x8) -> i32x4; -- fn arm_vpadalq_u32(x: u32x4, y: u16x8) -> u32x4; -- fn arm_vpadalq_s64(x: i64x2, y: i32x4) -> i64x2; -- fn arm_vpadalq_u64(x: u64x2, y: u32x4) -> u64x2; -- fn arm_vpmax_s8(x: i8x8, y: i8x8) -> i8x8; -- fn arm_vpmax_u8(x: u8x8, y: u8x8) -> u8x8; -- fn arm_vpmax_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vpmax_u16(x: u16x4, y: u16x4) -> u16x4; -- fn arm_vpmax_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vpmax_u32(x: u32x2, y: u32x2) -> u32x2; -- fn arm_vpmax_f32(x: f32x2, y: f32x2) -> f32x2; -- fn arm_vpmin_s8(x: i8x8, y: i8x8) -> i8x8; -- fn arm_vpmin_u8(x: u8x8, y: u8x8) -> u8x8; -- fn arm_vpmin_s16(x: i16x4, y: i16x4) -> i16x4; -- fn arm_vpmin_u16(x: u16x4, y: u16x4) -> u16x4; -- fn arm_vpmin_s32(x: i32x2, y: i32x2) -> i32x2; -- fn arm_vpmin_u32(x: u32x2, y: u32x2) -> u32x2; -- fn arm_vpmin_f32(x: f32x2, y: f32x2) -> f32x2; -- fn arm_vpminq_s8(x: i8x16, y: i8x16) -> i8x16; -- fn arm_vpminq_u8(x: u8x16, y: u8x16) -> u8x16; -- fn arm_vpminq_s16(x: i16x8, y: i16x8) -> i16x8; -- fn arm_vpminq_u16(x: u16x8, y: u16x8) -> u16x8; -- fn arm_vpminq_s32(x: i32x4, y: i32x4) -> i32x4; -- fn arm_vpminq_u32(x: u32x4, y: u32x4) -> u32x4; -- fn arm_vpminq_f32(x: f32x4, y: f32x4) -> f32x4; -- fn arm_vtbl1_s8(x: i8x8, y: u8x8) -> i8x8; -- fn arm_vtbl1_u8(x: u8x8, y: u8x8) -> u8x8; -- fn arm_vtbx1_s8(x: i8x8, y: i8x8, z: u8x8) -> i8x8; -- fn arm_vtbx1_u8(x: u8x8, y: u8x8, z: u8x8) -> u8x8; -- fn arm_vtbl2_s8(x: (i8x8, i8x8), y: u8x8) -> i8x8; -- fn arm_vtbl2_u8(x: (u8x8, u8x8), y: u8x8) -> u8x8; -- fn arm_vtbx2_s8(x: (i8x8, i8x8), y: u8x8) -> i8x8; -- fn arm_vtbx2_u8(x: (u8x8, u8x8), y: u8x8) -> u8x8; -- fn arm_vtbl3_s8(x: (i8x8, i8x8, i8x8), y: u8x8) -> i8x8; -- fn arm_vtbl3_u8(x: (u8x8, u8x8, u8x8), y: u8x8) -> u8x8; -- fn arm_vtbx3_s8(x: i8x8, y: (i8x8, i8x8, i8x8), z: u8x8) -> i8x8; -- fn arm_vtbx3_u8(x: u8x8, y: (u8x8, u8x8, u8x8), z: u8x8) -> u8x8; -- fn arm_vtbl4_s8(x: (i8x8, i8x8, i8x8, i8x8), y: u8x8) -> i8x8; -- fn arm_vtbl4_u8(x: (u8x8, u8x8, u8x8, u8x8), y: u8x8) -> u8x8; -- fn arm_vtbx4_s8(x: i8x8, y: (i8x8, i8x8, i8x8, i8x8), z: u8x8) -> i8x8; -- fn arm_vtbx4_u8(x: u8x8, y: (u8x8, u8x8, u8x8, u8x8), z: u8x8) -> u8x8; --} -- -- --impl u8x8 { -- #[inline] -- pub fn table_lookup_1(self, t0: u8x8) -> u8x8 { -- unsafe {arm_vtbl1_u8(t0, self)} -- } -- #[inline] -- pub fn table_lookup_2(self, t0: u8x8, t1: u8x8) -> u8x8 { -- unsafe {arm_vtbl2_u8((t0, t1), self)} -- } -- #[inline] -- pub fn table_lookup_3(self, t0: u8x8, t1: u8x8, t2: u8x8) -> u8x8 { -- unsafe {arm_vtbl3_u8((t0, t1, t2), self)} -- } -- #[inline] -- pub fn table_lookup_4(self, t0: u8x8, t1: u8x8, t2: u8x8, t3: u8x8) -> u8x8 { -- unsafe {arm_vtbl4_u8((t0, t1, t2, t3), self)} -- } --} -- --#[doc(hidden)] --pub mod common { -- use super::super::super::*; -- use super::*; -- use core::mem; -- -- #[inline] -- pub fn f32x4_sqrt(x: f32x4) -> f32x4 { -- unsafe {super::arm_vsqrtq_f32(x)} -- } -- #[inline] -- pub fn f32x4_approx_rsqrt(x: f32x4) -> f32x4 { -- unsafe {super::arm_vrsqrteq_f32(x)} -- } -- #[inline] -- pub fn f32x4_approx_reciprocal(x: f32x4) -> f32x4 { -- unsafe {super::arm_vrecpeq_f32(x)} -- } -- #[inline] -- pub fn f32x4_max(x: f32x4, y: f32x4) -> f32x4 { -- unsafe {super::arm_vmaxq_f32(x, y)} -- } -- #[inline] -- pub fn f32x4_min(x: f32x4, y: f32x4) -> f32x4 { -- unsafe {super::arm_vminq_f32(x, y)} -- } -- -- macro_rules! bools { -- ($($ty: ty, $as_u: ty, $shuffle_fn: ident, $lo_idxs: expr, $hi_idxs: expr, $all: ident ($min: ident), $any: ident ($max: ident);)*) => { -- $( -- #[inline] -- pub fn $all(x: $ty) -> bool { -- unsafe { -- let t: $as_u = bitcast(x); -- let lo = $shuffle_fn(t, t, $lo_idxs); -- let hi = $shuffle_fn(t, t, $hi_idxs); -- let x = super::$min(lo, hi); -- let y = super::$min(x, mem::uninitialized()); -- let y32: u32x2 = bitcast(y); -- y32.0 == 0xFFFFFFFF -- } -- } -- #[inline] -- pub fn $any(x: $ty) -> bool { -- unsafe { -- let t: $as_u = bitcast(x); -- let lo = $shuffle_fn(t, t, $lo_idxs); -- let hi = $shuffle_fn(t, t, $hi_idxs); -- let x = super::$max(lo, hi); -- let y = super::$max(x, mem::uninitialized()); -- let y32: u32x2 = bitcast(y); -- y32.0 != 0 -- } -- } -- )* -- } -- } -- -- bools! { -- bool32fx4, u32x4, simd_shuffle2, [0, 1], [2, 3], bool32fx4_all(arm_vpmin_u32), bool32fx4_any(arm_vpmax_u32); -- bool8ix16, u8x16, simd_shuffle8, [0, 1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14, 15], bool8ix16_all(arm_vpmin_u8), bool8ix16_any(arm_vpmax_u8); -- bool16ix8, u16x8, simd_shuffle4, [0, 1, 2, 3], [4, 5, 6, 7], bool16ix8_all(arm_vpmin_u16), bool16ix8_any(arm_vpmax_u16); -- bool32ix4, u32x4, simd_shuffle2, [0, 1], [2, 3], bool32ix4_all(arm_vpmin_u32), bool32ix4_any(arm_vpmax_u32); -- } --} -diff --git a/third_party/rust/simd/src/common.rs b/third_party/rust/simd/src/common.rs -deleted file mode 100644 -index 1052ae36959d..000000000000 ---- a/third_party/rust/simd/src/common.rs -+++ /dev/null -@@ -1,520 +0,0 @@ --use super::*; --#[allow(unused_imports)] --use super::{ -- simd_eq, simd_ne, simd_lt, simd_le, simd_gt, simd_ge, -- simd_shuffle2, simd_shuffle4, simd_shuffle8, simd_shuffle16, -- simd_insert, simd_extract, -- simd_cast, -- simd_add, simd_sub, simd_mul, simd_div, simd_shl, simd_shr, simd_and, simd_or, simd_xor, -- -- Unalign, bitcast, --}; --use core::{mem,ops}; -- --#[cfg(any(target_arch = "x86", -- target_arch = "x86_64"))] --use x86::sse2::common; --#[cfg(any(target_arch = "arm"))] --use arm::neon::common; --#[cfg(any(target_arch = "aarch64"))] --use aarch64::neon::common; -- --macro_rules! basic_impls { -- ($( -- $name: ident: -- $elem: ident, $bool: ident, $shuffle: ident, $length: expr, $($first: ident),* | $($last: ident),*; -- )*) => { -- $(impl $name { -- /// Create a new instance. -- #[inline] -- pub const fn new($($first: $elem),*, $($last: $elem),*) -> $name { -- $name($($first),*, $($last),*) -- } -- -- /// Create a new instance where every lane has value `x`. -- #[inline] -- pub const fn splat(x: $elem) -> $name { -- $name($({ #[allow(dead_code)] struct $first; x }),*, -- $({ #[allow(dead_code)] struct $last; x }),*) -- } -- -- /// Compare for equality. -- #[inline] -- pub fn eq(self, other: Self) -> $bool { -- unsafe {simd_eq(self, other)} -- } -- /// Compare for equality. -- #[inline] -- pub fn ne(self, other: Self) -> $bool { -- unsafe {simd_ne(self, other)} -- } -- /// Compare for equality. -- #[inline] -- pub fn lt(self, other: Self) -> $bool { -- unsafe {simd_lt(self, other)} -- } -- /// Compare for equality. -- #[inline] -- pub fn le(self, other: Self) -> $bool { -- unsafe {simd_le(self, other)} -- } -- /// Compare for equality. -- #[inline] -- pub fn gt(self, other: Self) -> $bool { -- unsafe {simd_gt(self, other)} -- } -- /// Compare for equality. -- #[inline] -- pub fn ge(self, other: Self) -> $bool { -- unsafe {simd_ge(self, other)} -- } -- -- /// Extract the value of the `idx`th lane of `self`. -- /// -- /// # Panics -- /// -- /// `extract` will panic if `idx` is out of bounds. -- #[inline] -- pub fn extract(self, idx: u32) -> $elem { -- assert!(idx < $length); -- unsafe {simd_extract(self, idx)} -- } -- /// Return a new vector where the `idx`th lane is replaced -- /// by `elem`. -- /// -- /// # Panics -- /// -- /// `replace` will panic if `idx` is out of bounds. -- #[inline] -- pub fn replace(self, idx: u32, elem: $elem) -> Self { -- assert!(idx < $length); -- unsafe {simd_insert(self, idx, elem)} -- } -- -- /// Load a new value from the `idx`th position of `array`. -- /// -- /// This is equivalent to the following, but is possibly -- /// more efficient: -- /// -- /// ```rust,ignore -- /// Self::new(array[idx], array[idx + 1], ...) -- /// ``` -- /// -- /// # Panics -- /// -- /// `load` will panic if `idx` is out of bounds in -- /// `array`, or if `array[idx..]` is too short. -- #[inline] -- pub fn load(array: &[$elem], idx: usize) -> Self { -- let data = &array[idx..idx + $length]; -- let loaded = unsafe { -- *(data.as_ptr() as *const Unalign) -- }; -- loaded.0 -- } -- -- /// Store the elements of `self` to `array`, starting at -- /// the `idx`th position. -- /// -- /// This is equivalent to the following, but is possibly -- /// more efficient: -- /// -- /// ```rust,ignore -- /// array[i] = self.extract(0); -- /// array[i + 1] = self.extract(1); -- /// // ... -- /// ``` -- /// -- /// # Panics -- /// -- /// `store` will panic if `idx` is out of bounds in -- /// `array`, or if `array[idx...]` is too short. -- #[inline] -- pub fn store(self, array: &mut [$elem], idx: usize) { -- let place = &mut array[idx..idx + $length]; -- unsafe { -- *(place.as_mut_ptr() as *mut Unalign) = Unalign(self) -- } -- } -- })* -- } --} -- --basic_impls! { -- u32x4: u32, bool32ix4, simd_shuffle4, 4, x0, x1 | x2, x3; -- i32x4: i32, bool32ix4, simd_shuffle4, 4, x0, x1 | x2, x3; -- f32x4: f32, bool32fx4, simd_shuffle4, 4, x0, x1 | x2, x3; -- -- u16x8: u16, bool16ix8, simd_shuffle8, 8, x0, x1, x2, x3 | x4, x5, x6, x7; -- i16x8: i16, bool16ix8, simd_shuffle8, 8, x0, x1, x2, x3 | x4, x5, x6, x7; -- -- u8x16: u8, bool8ix16, simd_shuffle16, 16, x0, x1, x2, x3, x4, x5, x6, x7 | x8, x9, x10, x11, x12, x13, x14, x15; -- i8x16: i8, bool8ix16, simd_shuffle16, 16, x0, x1, x2, x3, x4, x5, x6, x7 | x8, x9, x10, x11, x12, x13, x14, x15; --} -- --macro_rules! bool_impls { -- ($( -- $name: ident: -- $elem: ident, $repr: ident, $repr_elem: ident, $length: expr, $all: ident, $any: ident, -- $($first: ident),* | $($last: ident),* -- [$(#[$cvt_meta: meta] $cvt: ident -> $cvt_to: ident),*]; -- )*) => { -- $(impl $name { -- /// Convert to integer representation. -- #[inline] -- pub fn to_repr(self) -> $repr { -- unsafe {mem::transmute(self)} -- } -- /// Convert from integer representation. -- #[inline] -- #[inline] -- pub fn from_repr(x: $repr) -> Self { -- unsafe {mem::transmute(x)} -- } -- -- /// Create a new instance. -- #[inline] -- pub fn new($($first: bool),*, $($last: bool),*) -> $name { -- unsafe { -- // negate everything together -- simd_sub($name::splat(false), -- $name($( ($first as $repr_elem) ),*, -- $( ($last as $repr_elem) ),*)) -- } -- } -- -- /// Create a new instance where every lane has value `x`. -- #[allow(unused_variables)] -- #[inline] -- pub fn splat(x: bool) -> $name { -- let x = if x {!(0 as $repr_elem)} else {0}; -- $name($({ let $first = (); x}),*, -- $({ let $last = (); x}),*) -- } -- -- /// Extract the value of the `idx`th lane of `self`. -- /// -- /// # Panics -- /// -- /// `extract` will panic if `idx` is out of bounds. -- #[inline] -- pub fn extract(self, idx: u32) -> bool { -- assert!(idx < $length); -- unsafe {simd_extract(self.to_repr(), idx) != 0} -- } -- /// Return a new vector where the `idx`th lane is replaced -- /// by `elem`. -- /// -- /// # Panics -- /// -- /// `replace` will panic if `idx` is out of bounds. -- #[inline] -- pub fn replace(self, idx: u32, elem: bool) -> Self { -- assert!(idx < $length); -- let x = if elem {!(0 as $repr_elem)} else {0}; -- unsafe {Self::from_repr(simd_insert(self.to_repr(), idx, x))} -- } -- /// Select between elements of `then` and `else_`, based on -- /// the corresponding element of `self`. -- /// -- /// This is equivalent to the following, but is possibly -- /// more efficient: -- /// -- /// ```rust,ignore -- /// T::new(if self.extract(0) { then.extract(0) } else { else_.extract(0) }, -- /// if self.extract(1) { then.extract(1) } else { else_.extract(1) }, -- /// ...) -- /// ``` -- #[inline] -- pub fn select>(self, then: T, else_: T) -> T { -- let then: $repr = bitcast(then); -- let else_: $repr = bitcast(else_); -- bitcast((then & self.to_repr()) | (else_ & (!self).to_repr())) -- } -- -- /// Check if every element of `self` is true. -- /// -- /// This is equivalent to the following, but is possibly -- /// more efficient: -- /// -- /// ```rust,ignore -- /// self.extract(0) && self.extract(1) && ... -- /// ``` -- #[inline] -- pub fn all(self) -> bool { -- common::$all(self) -- } -- /// Check if any element of `self` is true. -- /// -- /// This is equivalent to the following, but is possibly -- /// more efficient: -- /// -- /// ```rust,ignore -- /// self.extract(0) || self.extract(1) || ... -- /// ``` -- #[inline] -- pub fn any(self) -> bool { -- common::$any(self) -- } -- -- $( -- #[$cvt_meta] -- #[inline] -- pub fn $cvt(self) -> $cvt_to { -- bitcast(self) -- } -- )* -- } -- impl ops::Not for $name { -- type Output = Self; -- -- #[inline] -- fn not(self) -> Self { -- Self::from_repr($repr::splat(!(0 as $repr_elem)) ^ self.to_repr()) -- } -- } -- )* -- } --} -- --bool_impls! { -- bool32ix4: bool32i, i32x4, i32, 4, bool32ix4_all, bool32ix4_any, x0, x1 | x2, x3 -- [/// Convert `self` to a boolean vector for interacting with floating point vectors. -- to_f -> bool32fx4]; -- bool32fx4: bool32f, i32x4, i32, 4, bool32fx4_all, bool32fx4_any, x0, x1 | x2, x3 -- [/// Convert `self` to a boolean vector for interacting with integer vectors. -- to_i -> bool32ix4]; -- -- bool16ix8: bool16i, i16x8, i16, 8, bool16ix8_all, bool16ix8_any, x0, x1, x2, x3 | x4, x5, x6, x7 []; -- -- bool8ix16: bool8i, i8x16, i8, 16, bool8ix16_all, bool8ix16_any, x0, x1, x2, x3, x4, x5, x6, x7 | x8, x9, x10, x11, x12, x13, x14, x15 []; --} -- --impl u32x4 { -- /// Convert each lane to a signed integer. -- #[inline] -- pub fn to_i32(self) -> i32x4 { -- unsafe {simd_cast(self)} -- } -- /// Convert each lane to a 32-bit float. -- #[inline] -- pub fn to_f32(self) -> f32x4 { -- unsafe {simd_cast(self)} -- } --} --impl i32x4 { -- /// Convert each lane to an unsigned integer. -- #[inline] -- pub fn to_u32(self) -> u32x4 { -- unsafe {simd_cast(self)} -- } -- /// Convert each lane to a 32-bit float. -- #[inline] -- pub fn to_f32(self) -> f32x4 { -- unsafe {simd_cast(self)} -- } --} --impl f32x4 { -- /// Compute the square root of each lane. -- #[inline] -- pub fn sqrt(self) -> Self { -- common::f32x4_sqrt(self) -- } -- /// Compute an approximation to the reciprocal of the square root -- /// of `self`, that is, `f32::splat(1.0) / self.sqrt()`. -- /// -- /// The accuracy of this approximation is platform dependent. -- #[inline] -- pub fn approx_rsqrt(self) -> Self { -- common::f32x4_approx_rsqrt(self) -- } -- /// Compute an approximation to the reciprocal of `self`, that is, -- /// `f32::splat(1.0) / self`. -- /// -- /// The accuracy of this approximation is platform dependent. -- #[inline] -- pub fn approx_reciprocal(self) -> Self { -- common::f32x4_approx_reciprocal(self) -- } -- /// Compute the lane-wise maximum of `self` and `other`. -- /// -- /// This is equivalent to the following, but is possibly more -- /// efficient: -- /// -- /// ```rust,ignore -- /// f32x4::new(self.extract(0).max(other.extract(0)), -- /// self.extract(1).max(other.extract(1)), -- /// ...) -- /// ``` -- #[inline] -- pub fn max(self, other: Self) -> Self { -- common::f32x4_max(self, other) -- } -- /// Compute the lane-wise minimum of `self` and `other`. -- /// -- /// This is equivalent to the following, but is possibly more -- /// efficient: -- /// -- /// ```rust,ignore -- /// f32x4::new(self.extract(0).min(other.extract(0)), -- /// self.extract(1).min(other.extract(1)), -- /// ...) -- /// ``` -- #[inline] -- pub fn min(self, other: Self) -> Self { -- common::f32x4_min(self, other) -- } -- /// Convert each lane to a signed integer. -- #[inline] -- pub fn to_i32(self) -> i32x4 { -- unsafe {simd_cast(self)} -- } -- /// Convert each lane to an unsigned integer. -- #[inline] -- pub fn to_u32(self) -> u32x4 { -- unsafe {simd_cast(self)} -- } --} -- --impl i16x8 { -- /// Convert each lane to an unsigned integer. -- #[inline] -- pub fn to_u16(self) -> u16x8 { -- unsafe {simd_cast(self)} -- } --} --impl u16x8 { -- /// Convert each lane to a signed integer. -- #[inline] -- pub fn to_i16(self) -> i16x8 { -- unsafe {simd_cast(self)} -- } --} -- --impl i8x16 { -- /// Convert each lane to an unsigned integer. -- #[inline] -- pub fn to_u8(self) -> u8x16 { -- unsafe {simd_cast(self)} -- } --} --impl u8x16 { -- /// Convert each lane to a signed integer. -- #[inline] -- pub fn to_i8(self) -> i8x16 { -- unsafe {simd_cast(self)} -- } --} -- -- --macro_rules! neg_impls { -- ($zero: expr, $($ty: ident,)*) => { -- $(impl ops::Neg for $ty { -- type Output = Self; -- fn neg(self) -> Self { -- $ty::splat($zero) - self -- } -- })* -- } --} --neg_impls!{ -- 0, -- i32x4, -- i16x8, -- i8x16, --} --neg_impls! { -- 0.0, -- f32x4, --} --macro_rules! not_impls { -- ($($ty: ident,)*) => { -- $(impl ops::Not for $ty { -- type Output = Self; -- fn not(self) -> Self { -- $ty::splat(!0) ^ self -- } -- })* -- } --} --not_impls! { -- i32x4, -- i16x8, -- i8x16, -- u32x4, -- u16x8, -- u8x16, --} -- --macro_rules! operators { -- ($($trayt: ident ($func: ident, $method: ident): $($ty: ty),*;)*) => { -- $( -- $(impl ops::$trayt for $ty { -- type Output = Self; -- #[inline] -- fn $method(self, x: Self) -> Self { -- unsafe {$func(self, x)} -- } -- })* -- )* -- } --} --operators! { -- Add (simd_add, add): -- i8x16, u8x16, i16x8, u16x8, i32x4, u32x4, -- f32x4; -- Sub (simd_sub, sub): -- i8x16, u8x16, i16x8, u16x8, i32x4, u32x4, -- f32x4; -- Mul (simd_mul, mul): -- i8x16, u8x16, i16x8, u16x8, i32x4, u32x4, -- f32x4; -- Div (simd_div, div): f32x4; -- -- BitAnd (simd_and, bitand): -- i8x16, u8x16, i16x8, u16x8, i32x4, u32x4, -- bool8ix16, bool16ix8, bool32ix4, -- bool32fx4; -- BitOr (simd_or, bitor): -- i8x16, u8x16, i16x8, u16x8, i32x4, u32x4, -- bool8ix16, bool16ix8, bool32ix4, -- bool32fx4; -- BitXor (simd_xor, bitxor): -- i8x16, u8x16, i16x8, u16x8, i32x4, u32x4, -- bool8ix16, bool16ix8, bool32ix4, -- bool32fx4; --} -- --macro_rules! shift_one { -- ($ty: ident, $($by: ident),*) => { -- $( -- impl ops::Shl<$by> for $ty { -- type Output = Self; -- #[inline] -- fn shl(self, other: $by) -> Self { -- unsafe { simd_shl(self, $ty::splat(other as <$ty as Simd>::Elem)) } -- } -- } -- impl ops::Shr<$by> for $ty { -- type Output = Self; -- #[inline] -- fn shr(self, other: $by) -> Self { -- unsafe {simd_shr(self, $ty::splat(other as <$ty as Simd>::Elem))} -- } -- } -- )* -- } --} -- --macro_rules! shift { -- ($($ty: ident),*) => { -- $(shift_one! { -- $ty, -- u8, u16, u32, u64, usize, -- i8, i16, i32, i64, isize -- })* -- } --} --shift! { -- i8x16, u8x16, i16x8, u16x8, i32x4, u32x4 --} -diff --git a/third_party/rust/simd/src/lib.rs b/third_party/rust/simd/src/lib.rs -deleted file mode 100644 -index e8fb1b16f53b..000000000000 ---- a/third_party/rust/simd/src/lib.rs -+++ /dev/null -@@ -1,804 +0,0 @@ --//! `simd` offers a basic interface to the SIMD functionality of CPUs. --#![no_std] -- --#![feature(cfg_target_feature, repr_simd, platform_intrinsics, const_fn)] --#![allow(non_camel_case_types)] -- --#[cfg(feature = "with-serde")] --extern crate serde; --#[cfg(feature = "with-serde")] --#[macro_use] --extern crate serde_derive; -- --use core::mem; -- --/// Boolean type for 8-bit integers. --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] --pub struct bool8i(i8); --/// Boolean type for 16-bit integers. --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] --pub struct bool16i(i16); --/// Boolean type for 32-bit integers. --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] --pub struct bool32i(i32); --/// Boolean type for 32-bit floats. --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] --pub struct bool32f(i32); -- --macro_rules! bool { -- ($($name: ident, $inner: ty;)*) => { -- $( -- impl From for $name { -- #[inline] -- fn from(b: bool) -> $name { -- $name(-(b as $inner)) -- } -- } -- impl From<$name> for bool { -- #[inline] -- fn from(b: $name) -> bool { -- b.0 != 0 -- } -- } -- )* -- } --} --bool! { -- bool8i, i8; -- bool16i, i16; -- bool32i, i32; -- bool32f, i32; --} -- --/// Types that are SIMD vectors. --pub unsafe trait Simd { -- /// The corresponding boolean vector type. -- type Bool: Simd; -- /// The element that this vector stores. -- type Elem; --} -- --/// A SIMD vector of 4 `u32`s. --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct u32x4(u32, u32, u32, u32); --/// A SIMD vector of 4 `i32`s. --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct i32x4(i32, i32, i32, i32); --/// A SIMD vector of 4 `f32`s. --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct f32x4(f32, f32, f32, f32); --/// A SIMD boolean vector for length-4 vectors of 32-bit integers. --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct bool32ix4(i32, i32, i32, i32); --/// A SIMD boolean vector for length-4 vectors of 32-bit floats. --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct bool32fx4(i32, i32, i32, i32); -- --#[allow(dead_code)] --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --struct u32x2(u32, u32); --#[allow(dead_code)] --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --struct i32x2(i32, i32); --#[allow(dead_code)] --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --struct f32x2(f32, f32); --#[allow(dead_code)] --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --struct bool32ix2(i32, i32); --#[allow(dead_code)] --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --struct bool32fx2(i32, i32); -- --/// A SIMD vector of 8 `u16`s. --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct u16x8(u16, u16, u16, u16, -- u16, u16, u16, u16); --/// A SIMD vector of 8 `i16`s. --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct i16x8(i16, i16, i16, i16, -- i16, i16, i16, i16); --/// A SIMD boolean vector for length-8 vectors of 16-bit integers. --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct bool16ix8(i16, i16, i16, i16, -- i16, i16, i16, i16); -- --/// A SIMD vector of 16 `u8`s. --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct u8x16(u8, u8, u8, u8, u8, u8, u8, u8, -- u8, u8, u8, u8, u8, u8, u8, u8); --/// A SIMD vector of 16 `i8`s. --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct i8x16(i8, i8, i8, i8, i8, i8, i8, i8, -- i8, i8, i8, i8, i8, i8, i8, i8); --/// A SIMD boolean vector for length-16 vectors of 8-bit integers. --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct bool8ix16(i8, i8, i8, i8, i8, i8, i8, i8, -- i8, i8, i8, i8, i8, i8, i8, i8); -- -- --macro_rules! simd { -- ($($bool: ty: $($ty: ty = $elem: ty),*;)*) => { -- $($(unsafe impl Simd for $ty { -- type Bool = $bool; -- type Elem = $elem; -- } -- impl Clone for $ty { #[inline] fn clone(&self) -> Self { *self } } -- )*)*} --} --simd! { -- bool8ix16: i8x16 = i8, u8x16 = u8, bool8ix16 = bool8i; -- bool16ix8: i16x8 = i16, u16x8 = u16, bool16ix8 = bool16i; -- bool32ix4: i32x4 = i32, u32x4 = u32, bool32ix4 = bool32i; -- bool32fx4: f32x4 = f32, bool32fx4 = bool32f; -- -- bool32ix2: i32x2 = i32, u32x2 = u32, bool32ix2 = bool32i; -- bool32fx2: f32x2 = f32, bool32fx2 = bool32f; --} -- --#[allow(dead_code)] --#[inline] --fn bitcast(x: T) -> U { -- assert_eq!(mem::size_of::(), -- mem::size_of::()); -- unsafe {mem::transmute_copy(&x)} --} -- --#[allow(dead_code)] --extern "platform-intrinsic" { -- fn simd_eq, U>(x: T, y: T) -> U; -- fn simd_ne, U>(x: T, y: T) -> U; -- fn simd_lt, U>(x: T, y: T) -> U; -- fn simd_le, U>(x: T, y: T) -> U; -- fn simd_gt, U>(x: T, y: T) -> U; -- fn simd_ge, U>(x: T, y: T) -> U; -- -- fn simd_shuffle2>(x: T, y: T, idx: [u32; 2]) -> U; -- fn simd_shuffle4>(x: T, y: T, idx: [u32; 4]) -> U; -- fn simd_shuffle8>(x: T, y: T, idx: [u32; 8]) -> U; -- fn simd_shuffle16>(x: T, y: T, idx: [u32; 16]) -> U; -- -- fn simd_insert, U>(x: T, idx: u32, val: U) -> T; -- fn simd_extract, U>(x: T, idx: u32) -> U; -- -- fn simd_cast(x: T) -> U; -- -- fn simd_add(x: T, y: T) -> T; -- fn simd_sub(x: T, y: T) -> T; -- fn simd_mul(x: T, y: T) -> T; -- fn simd_div(x: T, y: T) -> T; -- fn simd_shl(x: T, y: T) -> T; -- fn simd_shr(x: T, y: T) -> T; -- fn simd_and(x: T, y: T) -> T; -- fn simd_or(x: T, y: T) -> T; -- fn simd_xor(x: T, y: T) -> T; --} --#[repr(packed)] --#[derive(Copy)] --struct Unalign(T); -- --impl Clone for Unalign { -- fn clone(&self) -> Unalign { -- Unalign(unsafe { self.0.clone() }) -- } --} -- --#[macro_use] --mod common; --mod sixty_four; --mod v256; -- --#[cfg(any(feature = "doc", -- target_arch = "x86", -- target_arch = "x86_64"))] --pub mod x86; --#[cfg(any(feature = "doc", target_arch = "arm"))] --pub mod arm; --#[cfg(any(feature = "doc", target_arch = "aarch64"))] --pub mod aarch64; -- --#[cfg(test)] --mod tests { -- -- use super::u8x16; -- use super::u16x8; -- use super::u32x4; -- use super::f32x4; -- -- #[test] -- fn test_u8x16_none_not_any() { -- let x1 = u8x16::splat(1); -- let x2 = u8x16::splat(2); -- assert!(!(x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u8x16_none_not_all() { -- let x1 = u8x16::splat(1); -- let x2 = u8x16::splat(2); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u8x16_all_any() { -- let x1 = u8x16::splat(1); -- let x2 = u8x16::splat(1); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u8x16_all_all() { -- let x1 = u8x16::splat(1); -- let x2 = u8x16::splat(1); -- assert!((x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u8x16_except_last_any() { -- let x1 = u8x16::new(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1); -- let x2 = u8x16::splat(2); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u8x16_except_last_not_all() { -- let x1 = u8x16::new(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1); -- let x2 = u8x16::splat(2); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u8x16_except_first_any() { -- let x1 = u8x16::new(1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2); -- let x2 = u8x16::splat(2); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u8x16_except_first_not_all() { -- let x1 = u8x16::new(1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2); -- let x2 = u8x16::splat(2); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u8x16_only_last_any() { -- let x1 = u8x16::new(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1); -- let x2 = u8x16::splat(1); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u8x16_only_last_not_all() { -- let x1 = u8x16::new(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1); -- let x2 = u8x16::splat(1); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u8x16_only_first_any() { -- let x1 = u8x16::new(1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2); -- let x2 = u8x16::splat(1); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u8x16_only_first_not_all() { -- let x1 = u8x16::new(1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2); -- let x2 = u8x16::splat(1); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u8x16_except_thirteenth_any() { -- let x1 = u8x16::new(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2); -- let x2 = u8x16::splat(2); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u8x16_except_thirteenth_not_all() { -- let x1 = u8x16::new(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2); -- let x2 = u8x16::splat(2); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u8x16_except_fifth_any() { -- let x1 = u8x16::new(2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2); -- let x2 = u8x16::splat(2); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u8x16_except_fifth_not_all() { -- let x1 = u8x16::new(2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2); -- let x2 = u8x16::splat(2); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u8x16_only_thirteenth_any() { -- let x1 = u8x16::new(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2); -- let x2 = u8x16::splat(1); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u8x16_only_thirteenth_not_all() { -- let x1 = u8x16::new(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2); -- let x2 = u8x16::splat(1); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u8x16_only_fifth_any() { -- let x1 = u8x16::new(2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2); -- let x2 = u8x16::splat(1); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u8x16_only_fifth_not_all() { -- let x1 = u8x16::new(2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2); -- let x2 = u8x16::splat(1); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u16x8_none_not_any() { -- let x1 = u16x8::splat(1); -- let x2 = u16x8::splat(2); -- assert!(!(x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u16x8_none_not_all() { -- let x1 = u16x8::splat(1); -- let x2 = u16x8::splat(2); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u16x8_all_any() { -- let x1 = u16x8::splat(1); -- let x2 = u16x8::splat(1); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u16x8_all_all() { -- let x1 = u16x8::splat(1); -- let x2 = u16x8::splat(1); -- assert!((x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u16x8_except_last_any() { -- let x1 = u16x8::new(2, 2, 2, 2, 2, 2, 2, 1); -- let x2 = u16x8::splat(2); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u16x8_except_last_not_all() { -- let x1 = u16x8::new(2, 2, 2, 2, 2, 2, 2, 1); -- let x2 = u16x8::splat(2); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u16x8_except_first_any() { -- let x1 = u16x8::new(1, 2, 2, 2, 2, 2, 2, 2); -- let x2 = u16x8::splat(2); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u16x8_except_first_not_all() { -- let x1 = u16x8::new(1, 2, 2, 2, 2, 2, 2, 2); -- let x2 = u16x8::splat(2); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u16x8_only_last_any() { -- let x1 = u16x8::new(2, 2, 2, 2, 2, 2, 2, 1); -- let x2 = u16x8::splat(1); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u16x8_only_last_not_all() { -- let x1 = u16x8::new(2, 2, 2, 2, 2, 2, 2, 1); -- let x2 = u16x8::splat(1); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u16x8_only_first_any() { -- let x1 = u16x8::new(1, 2, 2, 2, 2, 2, 2, 2); -- let x2 = u16x8::splat(1); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u16x8_only_first_not_all() { -- let x1 = u16x8::new(1, 2, 2, 2, 2, 2, 2, 2); -- let x2 = u16x8::splat(1); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u16x8_except_sixth_any() { -- let x1 = u16x8::new(2, 2, 2, 2, 2, 1, 2, 2); -- let x2 = u16x8::splat(2); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u16x8_except_sixth_not_all() { -- let x1 = u16x8::new(2, 2, 2, 2, 2, 1, 2, 2); -- let x2 = u16x8::splat(2); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u16x8_except_third_any() { -- let x1 = u16x8::new(2, 2, 1, 2, 2, 2, 2, 2); -- let x2 = u16x8::splat(2); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u16x8_except_third_not_all() { -- let x1 = u16x8::new(2, 2, 1, 2, 2, 2, 2, 2); -- let x2 = u16x8::splat(2); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u16x8_only_sixth_any() { -- let x1 = u16x8::new(2, 2, 2, 2, 2, 1, 2, 2); -- let x2 = u16x8::splat(1); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u16x8_only_sixth_not_all() { -- let x1 = u16x8::new(2, 2, 2, 2, 2, 1, 2, 2); -- let x2 = u16x8::splat(1); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u16x8_only_third_any() { -- let x1 = u16x8::new(2, 2, 1, 2, 2, 2, 2, 2); -- let x2 = u16x8::splat(1); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u16x8_only_third_not_all() { -- let x1 = u16x8::new(2, 2, 1, 2, 2, 2, 2, 2); -- let x2 = u16x8::splat(1); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u32x4_none_not_any() { -- let x1 = u32x4::splat(1); -- let x2 = u32x4::splat(2); -- assert!(!(x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u32x4_none_not_all() { -- let x1 = u32x4::splat(1); -- let x2 = u32x4::splat(2); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u32x4_all_any() { -- let x1 = u32x4::splat(1); -- let x2 = u32x4::splat(1); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u32x4_all_all() { -- let x1 = u32x4::splat(1); -- let x2 = u32x4::splat(1); -- assert!((x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u32x4_except_last_any() { -- let x1 = u32x4::new(2, 2, 2, 1); -- let x2 = u32x4::splat(2); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u32x4_except_last_not_all() { -- let x1 = u32x4::new(2, 2, 2, 1); -- let x2 = u32x4::splat(2); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u32x4_except_first_any() { -- let x1 = u32x4::new(1, 2, 2, 2); -- let x2 = u32x4::splat(2); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u32x4_except_first_not_all() { -- let x1 = u32x4::new(1, 2, 2, 2); -- let x2 = u32x4::splat(2); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u32x4_only_last_any() { -- let x1 = u32x4::new(2, 2, 2, 1); -- let x2 = u32x4::splat(1); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u32x4_only_last_not_all() { -- let x1 = u32x4::new(2, 2, 2, 1); -- let x2 = u32x4::splat(1); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u32x4_only_first_any() { -- let x1 = u32x4::new(1, 2, 2, 2); -- let x2 = u32x4::splat(1); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u32x4_only_first_not_all() { -- let x1 = u32x4::new(1, 2, 2, 2); -- let x2 = u32x4::splat(1); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u32x4_except_second_any() { -- let x1 = u32x4::new(1, 2, 2, 2); -- let x2 = u32x4::splat(2); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u32x4_except_second_not_all() { -- let x1 = u32x4::new(1, 2, 2, 2); -- let x2 = u32x4::splat(2); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u32x4_except_third_any() { -- let x1 = u32x4::new(2, 2, 1, 2); -- let x2 = u32x4::splat(2); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u32x4_except_third_not_all() { -- let x1 = u32x4::new(2, 2, 1, 2); -- let x2 = u32x4::splat(2); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u32x4_only_second_any() { -- let x1 = u32x4::new(1, 2, 2, 2); -- let x2 = u32x4::splat(1); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u32x4_only_second_not_all() { -- let x1 = u32x4::new(1, 2, 2, 2); -- let x2 = u32x4::splat(1); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_u32x4_only_third_any() { -- let x1 = u32x4::new(2, 2, 1, 2); -- let x2 = u32x4::splat(1); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_u32x4_only_third_not_all() { -- let x1 = u32x4::new(2, 2, 1, 2); -- let x2 = u32x4::splat(1); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_f32x4_none_not_any() { -- let x1 = f32x4::splat(1.0); -- let x2 = f32x4::splat(2.0); -- assert!(!(x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_f32x4_none_not_all() { -- let x1 = f32x4::splat(1.0); -- let x2 = f32x4::splat(2.0); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_f32x4_all_any() { -- let x1 = f32x4::splat(1.0); -- let x2 = f32x4::splat(1.0); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_f32x4_all_all() { -- let x1 = f32x4::splat(1.0); -- let x2 = f32x4::splat(1.0); -- assert!((x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_f32x4_except_last_any() { -- let x1 = f32x4::new(2.0, 2.0, 2.0, 1.0); -- let x2 = f32x4::splat(2.0); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_f32x4_except_last_not_all() { -- let x1 = f32x4::new(2.0, 2.0, 2.0, 1.0); -- let x2 = f32x4::splat(2.0); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_f32x4_except_first_any() { -- let x1 = f32x4::new(1.0, 2.0, 2.0, 2.0); -- let x2 = f32x4::splat(2.0); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_f32x4_except_first_not_all() { -- let x1 = f32x4::new(1.0, 2.0, 2.0, 2.0); -- let x2 = f32x4::splat(2.0); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_f32x4_only_last_any() { -- let x1 = f32x4::new(2.0, 2.0, 2.0, 1.0); -- let x2 = f32x4::splat(1.0); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_f32x4_only_last_not_all() { -- let x1 = f32x4::new(2.0, 2.0, 2.0, 1.0); -- let x2 = f32x4::splat(1.0); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_f32x4_only_first_any() { -- let x1 = f32x4::new(1.0, 2.0, 2.0, 2.0); -- let x2 = f32x4::splat(1.0); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_f32x4_only_first_not_all() { -- let x1 = f32x4::new(1.0, 2.0, 2.0, 2.0); -- let x2 = f32x4::splat(1.0); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_f32x4_except_second_any() { -- let x1 = f32x4::new(1.0, 2.0, 2.0, 2.0); -- let x2 = f32x4::splat(2.0); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_f32x4_except_second_not_all() { -- let x1 = f32x4::new(1.0, 2.0, 2.0, 2.0); -- let x2 = f32x4::splat(2.0); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_f32x4_except_third_any() { -- let x1 = f32x4::new(2.0, 2.0, 1.0, 2.0); -- let x2 = f32x4::splat(2.0); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_f32x4_except_third_not_all() { -- let x1 = f32x4::new(2.0, 2.0, 1.0, 2.0); -- let x2 = f32x4::splat(2.0); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_f32x4_only_second_any() { -- let x1 = f32x4::new(1.0, 2.0, 2.0, 2.0); -- let x2 = f32x4::splat(1.0); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_f32x4_only_second_not_all() { -- let x1 = f32x4::new(1.0, 2.0, 2.0, 2.0); -- let x2 = f32x4::splat(1.0); -- assert!(!(x1.eq(x2)).all()); -- } -- -- #[test] -- fn test_f32x4_only_third_any() { -- let x1 = f32x4::new(2.0, 2.0, 1.0, 2.0); -- let x2 = f32x4::splat(1.0); -- assert!((x1.eq(x2)).any()); -- } -- -- #[test] -- fn test_f32x4_only_third_not_all() { -- let x1 = f32x4::new(2.0, 2.0, 1.0, 2.0); -- let x2 = f32x4::splat(1.0); -- assert!(!(x1.eq(x2)).all()); -- } -- --} -diff --git a/third_party/rust/simd/src/sixty_four.rs b/third_party/rust/simd/src/sixty_four.rs -deleted file mode 100644 -index a87f44a77ee7..000000000000 ---- a/third_party/rust/simd/src/sixty_four.rs -+++ /dev/null -@@ -1,228 +0,0 @@ --#![allow(dead_code)] --use super::*; --#[allow(unused_imports)] --use super::{ -- f32x2, -- simd_eq, simd_ne, simd_lt, simd_le, simd_gt, simd_ge, -- simd_shuffle2, simd_shuffle4, simd_shuffle8, simd_shuffle16, -- simd_insert, simd_extract, -- simd_cast, -- simd_add, simd_sub, simd_mul, simd_div, simd_shl, simd_shr, simd_and, simd_or, simd_xor, -- -- Unalign, bitcast, --}; --use core::{mem,ops}; -- --/// Boolean type for 64-bit integers. --#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy, Clone)] --pub struct bool64i(i64); --/// Boolean type for 64-bit floats. --#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy, Clone)] --pub struct bool64f(i64); --/// A SIMD vector of 2 `u64`s. --#[repr(simd)] --#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct u64x2(u64, u64); --/// A SIMD vector of 2 `i64`s. --#[repr(simd)] --#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct i64x2(i64, i64); --/// A SIMD vector of 2 `f64`s. --#[repr(simd)] --#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct f64x2(f64, f64); --/// A SIMD boolean vector for length-2 vectors of 64-bit integers. --#[repr(simd)] --#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct bool64ix2(i64, i64); --/// A SIMD boolean vector for length-2 vectors of 64-bit floats. --#[repr(simd)] --#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct bool64fx2(i64, i64); -- --simd! { -- bool64ix2: i64x2 = i64, u64x2 = u64, bool64ix2 = bool64i; -- bool64fx2: f64x2 = f64, bool64fx2 = bool64f; --} --basic_impls! { -- u64x2: u64, bool64ix2, simd_shuffle2, 2, x0 | x1; -- i64x2: i64, bool64ix2, simd_shuffle2, 2, x0 | x1; -- f64x2: f64, bool64fx2, simd_shuffle2, 2, x0 | x1; --} -- --mod common { -- use super::*; -- // naive for now -- #[inline] -- pub fn bool64ix2_all(x: bool64ix2) -> bool { -- x.0 != 0 && x.1 != 0 -- } -- #[inline] -- pub fn bool64ix2_any(x: bool64ix2) -> bool { -- x.0 != 0 || x.1 != 0 -- } -- #[inline] -- pub fn bool64fx2_all(x: bool64fx2) -> bool { -- x.0 != 0 && x.1 != 0 -- } -- #[inline] -- pub fn bool64fx2_any(x: bool64fx2) -> bool { -- x.0 != 0 || x.1 != 0 -- }} --bool_impls! { -- bool64ix2: bool64i, i64x2, i64, 2, bool64ix2_all, bool64ix2_any, x0 | x1 -- [/// Convert `self` to a boolean vector for interacting with floating point vectors. -- to_f -> bool64fx2]; -- -- bool64fx2: bool64f, i64x2, i64, 2, bool64fx2_all, bool64fx2_any, x0 | x1 -- [/// Convert `self` to a boolean vector for interacting with integer vectors. -- to_i -> bool64ix2]; --} -- --impl u64x2 { -- /// Convert each lane to a signed integer. -- #[inline] -- pub fn to_i64(self) -> i64x2 { -- unsafe {simd_cast(self)} -- } -- /// Convert each lane to a 64-bit float. -- #[inline] -- pub fn to_f64(self) -> f64x2 { -- unsafe {simd_cast(self)} -- } --} --impl i64x2 { -- /// Convert each lane to an unsigned integer. -- #[inline] -- pub fn to_u64(self) -> u64x2 { -- unsafe {simd_cast(self)} -- } -- /// Convert each lane to a 64-bit float. -- #[inline] -- pub fn to_f64(self) -> f64x2 { -- unsafe {simd_cast(self)} -- } --} --impl f64x2 { -- /// Convert each lane to a signed integer. -- #[inline] -- pub fn to_i64(self) -> i64x2 { -- unsafe {simd_cast(self)} -- } -- /// Convert each lane to an unsigned integer. -- #[inline] -- pub fn to_u64(self) -> u64x2 { -- unsafe {simd_cast(self)} -- } -- -- /// Convert each lane to a 32-bit float. -- #[inline] -- pub fn to_f32(self) -> f32x4 { -- unsafe { -- let x: f32x2 = simd_cast(self); -- f32x4::new(x.0, x.1, 0.0, 0.0) -- } -- } --} -- --neg_impls!{ -- 0, -- i64x2, --} --neg_impls! { -- 0.0, -- f64x2, --} --macro_rules! not_impls { -- ($($ty: ident,)*) => { -- $(impl ops::Not for $ty { -- type Output = Self; -- fn not(self) -> Self { -- $ty::splat(!0) ^ self -- } -- })* -- } --} --not_impls! { -- i64x2, -- u64x2, --} -- --macro_rules! operators { -- ($($trayt: ident ($func: ident, $method: ident): $($ty: ty),*;)*) => { -- $( -- $(impl ops::$trayt for $ty { -- type Output = Self; -- #[inline] -- fn $method(self, x: Self) -> Self { -- unsafe {$func(self, x)} -- } -- })* -- )* -- } --} --operators! { -- Add (simd_add, add): -- i64x2, u64x2, -- f64x2; -- Sub (simd_sub, sub): -- i64x2, u64x2, -- f64x2; -- Mul (simd_mul, mul): -- i64x2, u64x2, -- f64x2; -- Div (simd_div, div): f64x2; -- -- BitAnd (simd_and, bitand): -- i64x2, u64x2, -- bool64ix2, -- bool64fx2; -- BitOr (simd_or, bitor): -- i64x2, u64x2, -- bool64ix2, -- bool64fx2; -- BitXor (simd_xor, bitxor): -- i64x2, u64x2, -- bool64ix2, -- bool64fx2; --} -- --macro_rules! shift_one { ($ty: ident, $($by: ident),*) => { -- $( -- impl ops::Shl<$by> for $ty { -- type Output = Self; -- #[inline] -- fn shl(self, other: $by) -> Self { -- unsafe { simd_shl(self, $ty::splat(other as <$ty as Simd>::Elem)) } -- } -- } -- impl ops::Shr<$by> for $ty { -- type Output = Self; -- #[inline] -- fn shr(self, other: $by) -> Self { -- unsafe {simd_shr(self, $ty::splat(other as <$ty as Simd>::Elem))} -- } -- } -- )* -- } --} -- --macro_rules! shift { -- ($($ty: ident),*) => { -- $(shift_one! { -- $ty, -- u8, u16, u32, u64, usize, -- i8, i16, i32, i64, isize -- })* -- } --} --shift! { -- i64x2, u64x2 --} -diff --git a/third_party/rust/simd/src/v256.rs b/third_party/rust/simd/src/v256.rs -deleted file mode 100644 -index 519eb14e7259..000000000000 ---- a/third_party/rust/simd/src/v256.rs -+++ /dev/null -@@ -1,436 +0,0 @@ --#![allow(dead_code)] --use core::{mem,ops}; --#[allow(unused_imports)] --use super::{ -- Simd, -- u32x4, i32x4, u16x8, i16x8, u8x16, i8x16, f32x4, -- bool32ix4, bool16ix8, bool8ix16, bool32fx4, -- simd_eq, simd_ne, simd_lt, simd_le, simd_gt, simd_ge, -- simd_shuffle2, simd_shuffle4, simd_shuffle8, simd_shuffle16, -- simd_insert, simd_extract, -- simd_cast, -- simd_add, simd_sub, simd_mul, simd_div, simd_shl, simd_shr, simd_and, simd_or, simd_xor, -- bool8i, bool16i, bool32i, bool32f, -- Unalign, bitcast, --}; --use super::sixty_four::*; --#[cfg(all(target_feature = "avx"))] --use super::x86::avx::common; -- --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct u64x4(u64, u64, u64, u64); --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct i64x4(i64, i64, i64, i64); --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct f64x4(f64, f64, f64, f64); --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct bool64ix4(i64, i64, i64, i64); --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct bool64fx4(i64, i64, i64, i64); -- --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct u32x8(u32, u32, u32, u32, -- u32, u32, u32, u32); --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct i32x8(i32, i32, i32, i32, -- i32, i32, i32, i32); --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct f32x8(f32, f32, f32, f32, -- f32, f32, f32, f32); --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct bool32ix8(i32, i32, i32, i32, -- i32, i32, i32, i32);#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct bool32fx8(i32, i32, i32, i32, -- i32, i32, i32, i32); -- --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct u16x16(u16, u16, u16, u16, u16, u16, u16, u16, -- u16, u16, u16, u16, u16, u16, u16, u16); --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct i16x16(i16, i16, i16, i16, i16, i16, i16, i16, -- i16, i16, i16, i16, i16, i16, i16, i16); --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct bool16ix16(i16, i16, i16, i16, i16, i16, i16, i16, -- i16, i16, i16, i16, i16, i16, i16, i16); -- --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct u8x32(u8, u8, u8, u8, u8, u8, u8, u8, -- u8, u8, u8, u8, u8, u8, u8, u8, -- u8, u8, u8, u8, u8, u8, u8, u8, -- u8, u8, u8, u8, u8, u8, u8, u8); --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct i8x32(i8, i8, i8, i8, i8, i8, i8, i8, -- i8, i8, i8, i8, i8, i8, i8, i8, -- i8, i8, i8, i8, i8, i8, i8, i8, -- i8, i8, i8, i8, i8, i8, i8, i8); --#[repr(simd)] --#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))] --#[derive(Debug, Copy)] --pub struct bool8ix32(i8, i8, i8, i8, i8, i8, i8, i8, -- i8, i8, i8, i8, i8, i8, i8, i8, -- i8, i8, i8, i8, i8, i8, i8, i8, -- i8, i8, i8, i8, i8, i8, i8, i8); -- --simd! { -- bool8ix32: i8x32 = i8, u8x32 = u8, bool8ix32 = bool8i; -- bool16ix16: i16x16 = i16, u16x16 = u16, bool16ix16 = bool16i; -- bool32ix8: i32x8 = i32, u32x8 = u32, bool32ix8 = bool32i; -- bool64ix4: i64x4 = i64, u64x4 = u64, bool64ix4 = bool64i; -- -- bool32fx8: f32x8 = f32, bool32fx8 = bool32f; -- bool64fx4: f64x4 = f64, bool64fx4 = bool64f; --} -- --basic_impls! { -- u64x4: u64, bool64ix4, simd_shuffle4, 4, x0, x1 | x2, x3; -- i64x4: i64, bool64ix4, simd_shuffle4, 4, x0, x1 | x2, x3; -- f64x4: f64, bool64fx4, simd_shuffle4, 4, x0, x1 | x2, x3; -- -- u32x8: u32, bool32ix8, simd_shuffle8, 8, x0, x1, x2, x3 | x4, x5, x6, x7; -- i32x8: i32, bool32ix8, simd_shuffle8, 8, x0, x1, x2, x3 | x4, x5, x6, x7; -- f32x8: f32, bool32fx8, simd_shuffle8, 8, x0, x1, x2, x3 | x4, x5, x6, x7; -- -- u16x16: u16, bool16ix16, simd_shuffle16, 16, x0, x1, x2, x3, x4, x5, x6, x7 | x8, x9, x10, x11, x12, x13, x14, x15; -- i16x16: i16, bool16ix16, simd_shuffle16, 16, x0, x1, x2, x3, x4, x5, x6, x7 | x8, x9, x10, x11, x12, x13, x14, x15; -- -- u8x32: u8, bool8ix32, simd_shuffle32, 32, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | -- x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31; -- i8x32: i8, bool8ix32, simd_shuffle32, 32, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | -- x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31; --} -- --#[cfg(all(not(target_feature = "avx")))] --#[doc(hidden)] --mod common { -- use super::*; -- // implementation via SSE vectors -- macro_rules! bools { -- ($($ty: ty, $all: ident, $any: ident;)*) => { -- $( -- #[inline] -- pub fn $all(x: $ty) -> bool { -- x.low().all() && x.high().all() -- } -- #[inline] -- pub fn $any(x: $ty) -> bool { -- x.low().any() || x.high().any() -- } -- )* -- } -- } -- -- bools! { -- bool64ix4, bool64ix4_all, bool64ix4_any; -- bool64fx4, bool64fx4_all, bool64fx4_any; -- bool32ix8, bool32ix8_all, bool32ix8_any; -- bool32fx8, bool32fx8_all, bool32fx8_any; -- bool16ix16, bool16ix16_all, bool16ix16_any; -- bool8ix32, bool8ix32_all, bool8ix32_any; -- } -- --} -- --bool_impls! { -- bool64ix4: bool64i, i64x4, i64, 4, bool64ix4_all, bool64ix4_any, x0, x1 | x2, x3 -- [/// Convert `self` to a boolean vector for interacting with floating point vectors. -- to_f -> bool64fx4]; -- -- bool64fx4: bool64f, i64x4, i64, 4, bool64fx4_all, bool64fx4_any, x0, x1 | x2, x3 -- [/// Convert `self` to a boolean vector for interacting with integer vectors. -- to_i -> bool64ix4]; -- -- bool32ix8: bool32i, i32x8, i32, 8, bool32ix8_all, bool32ix8_any, x0, x1, x2, x3 | x4, x5, x6, x7 -- [/// Convert `self` to a boolean vector for interacting with floating point vectors. -- to_f -> bool32fx8]; -- -- bool32fx8: bool32f, i32x8, i32, 8, bool32fx8_all, bool32fx8_any, x0, x1, x2, x3 | x4, x5, x6, x7 -- [/// Convert `self` to a boolean vector for interacting with integer vectors. -- to_i -> bool32ix8]; -- -- bool16ix16: bool16i, i16x16, i16, 16, bool16ix16_all, bool16ix16_any, -- x0, x1, x2, x3, x4, x5, x6, x7 | x8, x9, x10, x11, x12, x13, x14, x15 []; -- -- bool8ix32: bool8i, i8x32, i8, 32, bool8ix32_all, bool8ix32_any, -- x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | -- x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 []; --} -- --pub trait LowHigh128 { -- type Half: Simd; -- /// Extract the low 128 bit part. -- fn low(self) -> Self::Half; -- /// Extract the high 128 bit part. -- fn high(self) -> Self::Half; --} -- --macro_rules! expr { ($x:expr) => ($x) } // HACK --macro_rules! low_high_impls { -- ($( -- $name: ident, $half: ident, $($first: tt),+ ... $($last: tt),+; -- )*) => { -- $(impl LowHigh128 for $name { -- type Half = $half; -- #[inline] -- fn low(self) -> Self::Half { -- $half::new($( expr!(self.$first), )*) -- } -- -- #[inline] -- fn high(self) -> Self::Half { -- $half::new($( expr!(self.$last), )*) -- } -- })* -- } --} -- --low_high_impls! { -- u64x4, u64x2, 0, 1 ... 2, 3; -- i64x4, i64x2, 0, 1 ... 2, 3; -- f64x4, f64x2, 0, 1 ... 2, 3; -- -- u32x8, u32x4, 0, 1, 2, 3 ... 4, 5, 6, 7; -- i32x8, i32x4, 0, 1, 2, 3 ... 4, 5, 6, 7; -- f32x8, f32x4, 0, 1, 2, 3 ... 4, 5, 6, 7; -- -- u16x16, u16x8, 0, 1, 2, 3, 4, 5, 6, 7 ... 8, 9, 10, 11, 12, 13, 14, 15; -- i16x16, i16x8, 0, 1, 2, 3, 4, 5, 6, 7 ... 8, 9, 10, 11, 12, 13, 14, 15; -- -- u8x32, u8x16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ... -- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31; -- i8x32, i8x16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ... -- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31; -- --} -- --macro_rules! bool_low_high_impls { -- ($( -- $name: ident: $half: ident; -- )*) => { -- $(impl LowHigh128 for $name { -- type Half = $half; -- /// Extract the low 128 bit part. -- #[inline] -- fn low(self) -> Self::Half { -- Self::Half::from_repr(self.to_repr().low()) -- } -- -- /// Extract the high 128 bit part. -- #[inline] -- fn high(self) -> Self::Half { -- Self::Half::from_repr(self.to_repr().high()) -- } -- })* -- } --} -- --bool_low_high_impls! { -- bool64fx4: bool64fx2; -- bool32fx8: bool32fx4; -- -- bool64ix4: bool64ix2; -- bool32ix8: bool32ix4; -- bool16ix16: bool16ix8; -- bool8ix32: bool8ix16; --} -- --impl u64x4 { -- /// Convert each lane to a signed integer. -- #[inline] -- pub fn to_i64(self) -> i64x4 { -- unsafe {simd_cast(self)} -- } -- /// Convert each lane to a 64-bit float. -- #[inline] -- pub fn to_f64(self) -> f64x4 { -- unsafe {simd_cast(self)} -- } --} -- --impl i64x4 { -- /// Convert each lane to an unsigned integer. -- #[inline] -- pub fn to_u64(self) -> u64x4 { -- unsafe {simd_cast(self)} -- } -- /// Convert each lane to a 64-bit float. -- #[inline] -- pub fn to_f64(self) -> f64x4 { -- unsafe {simd_cast(self)} -- } --} -- --impl f64x4 { -- /// Convert each lane to a signed integer. -- #[inline] -- pub fn to_i64(self) -> i64x4 { -- unsafe {simd_cast(self)} -- } -- /// Convert each lane to an unsigned integer. -- #[inline] -- pub fn to_u64(self) -> u64x4 { -- unsafe {simd_cast(self)} -- } --} -- --impl u32x8 { -- /// Convert each lane to a signed integer. -- #[inline] -- pub fn to_i32(self) -> i32x8 { -- unsafe {simd_cast(self)} -- } -- /// Convert each lane to a 32-bit float. -- #[inline] -- pub fn to_f32(self) -> f32x8 { -- unsafe {simd_cast(self)} -- } --} -- --impl i32x8 { -- /// Convert each lane to an unsigned integer. -- #[inline] -- pub fn to_u32(self) -> u32x8 { -- unsafe {simd_cast(self)} -- } -- /// Convert each lane to a 32-bit float. -- #[inline] -- pub fn to_f32(self) -> f32x8 { -- unsafe {simd_cast(self)} -- } --} -- --impl f32x8 { -- /// Convert each lane to a signed integer. -- #[inline] -- pub fn to_i32(self) -> i32x8 { -- unsafe {simd_cast(self)} -- } -- /// Convert each lane to an unsigned integer. -- #[inline] -- pub fn to_u32(self) -> u32x8 { -- unsafe {simd_cast(self)} -- } --} -- --impl i16x16 { -- /// Convert each lane to an unsigned integer. -- #[inline] -- pub fn to_u16(self) -> u16x16 { -- unsafe {simd_cast(self)} -- } --} -- --impl u16x16 { -- /// Convert each lane to a signed integer. -- #[inline] -- pub fn to_i16(self) -> i16x16 { -- unsafe {simd_cast(self)} -- } --} -- --impl i8x32 { -- /// Convert each lane to an unsigned integer. -- #[inline] -- pub fn to_u8(self) -> u8x32 { -- unsafe {simd_cast(self)} -- } --} -- --impl u8x32 { -- /// Convert each lane to a signed integer. -- #[inline] -- pub fn to_i8(self) -> i8x32 { -- unsafe {simd_cast(self)} -- } --} -- --operators! { -- Add (simd_add, add): -- i8x32, u8x32, i16x16, u16x16, i32x8, u32x8, i64x4, u64x4, -- f64x4, f32x8; -- Sub (simd_sub, sub): -- i8x32, u8x32, i16x16, u16x16, i32x8, u32x8, i64x4, u64x4, -- f64x4, f32x8; -- Mul (simd_mul, mul): -- i8x32, u8x32, i16x16, u16x16, i32x8, u32x8, i64x4, u64x4, -- f64x4, f32x8; -- Div (simd_div, div): f64x4, f32x8; -- -- BitAnd (simd_and, bitand): -- i8x32, u8x32, i16x16, u16x16, i32x8, u32x8, i64x4, u64x4, -- bool64ix4, bool32ix8, bool16ix16, -- bool64fx4, bool32fx8; -- BitOr (simd_or, bitor): -- i8x32, u8x32, i16x16, u16x16, i32x8, u32x8, i64x4, u64x4, -- bool64ix4, bool32ix8, bool16ix16, -- bool64fx4, bool32fx8; -- BitXor (simd_xor, bitxor): -- i8x32, u8x32, i16x16, u16x16, i32x8, u32x8, i64x4, u64x4, -- bool64ix4, bool32ix8, bool16ix16, -- bool64fx4, bool32fx8; --} -- --neg_impls!{ -- 0, -- i64x4, -- i32x8, -- i16x16, -- i8x32, --} -- --neg_impls! { -- 0.0, -- f64x4, -- f32x8, --} -- --not_impls! { -- i64x4, -- u64x4, -- i32x8, -- u32x8, -- i16x16, -- u16x16, -- i8x32, -- u8x32, --} -- --shift! { -- i64x4, -- u64x4, -- i32x8, -- u32x8, -- i16x16, -- u16x16, -- i8x32, -- u8x32 --} -diff --git a/third_party/rust/simd/src/x86/avx.rs b/third_party/rust/simd/src/x86/avx.rs -deleted file mode 100644 -index 180247e36561..000000000000 ---- a/third_party/rust/simd/src/x86/avx.rs -+++ /dev/null -@@ -1,290 +0,0 @@ --use super::super::*; --use sixty_four::*; -- --use super::super::bitcast; -- --pub use v256::{ -- f64x4, bool64fx4, u64x4, i64x4, bool64ix4, -- f32x8, bool32fx8, u32x8, i32x8, bool32ix8, -- u16x16, i16x16, bool16ix16, -- u8x32, i8x32, bool8ix32, -- LowHigh128 --}; -- --#[allow(dead_code)] --extern "platform-intrinsic" { -- fn x86_mm256_addsub_ps(x: f32x8, y: f32x8) -> f32x8; -- fn x86_mm256_addsub_pd(x: f64x4, y: f64x4) -> f64x4; -- fn x86_mm256_dp_ps(x: f32x8, y: f32x8, z: i32) -> f32x8; -- fn x86_mm256_hadd_ps(x: f32x8, y: f32x8) -> f32x8; -- fn x86_mm256_hadd_pd(x: f64x4, y: f64x4) -> f64x4; -- fn x86_mm256_hsub_ps(x: f32x8, y: f32x8) -> f32x8; -- fn x86_mm256_hsub_pd(x: f64x4, y: f64x4) -> f64x4; -- fn x86_mm256_max_ps(x: f32x8, y: f32x8) -> f32x8; -- fn x86_mm256_max_pd(x: f64x4, y: f64x4) -> f64x4; -- fn x86_mm256_min_ps(x: f32x8, y: f32x8) -> f32x8; -- fn x86_mm256_min_pd(x: f64x4, y: f64x4) -> f64x4; -- fn x86_mm256_movemask_ps(x: f32x8) -> i32; -- fn x86_mm256_movemask_pd(x: f64x4) -> i32; -- fn x86_mm_permutevar_ps(x: f32x4, y: i32x4) -> f32x4; -- fn x86_mm_permutevar_pd(x: f64x2, y: i64x2) -> f64x2; -- fn x86_mm256_permutevar_ps(x: f32x8, y: i32x8) -> f32x8; -- fn x86_mm256_permutevar_pd(x: f64x4, y: i64x4) -> f64x4; -- fn x86_mm256_rcp_ps(x: f32x8) -> f32x8; -- fn x86_mm256_rsqrt_ps(x: f32x8) -> f32x8; -- fn x86_mm256_sqrt_ps(x: f32x8) -> f32x8; -- fn x86_mm256_sqrt_pd(x: f64x4) -> f64x4; -- fn x86_mm_testc_ps(x: f32x4, y: f32x4) -> i32; -- fn x86_mm256_testc_ps(x: f32x8, y: f32x8) -> i32; -- fn x86_mm_testc_pd(x: f64x2, y: f64x2) -> i32; -- fn x86_mm256_testc_pd(x: f64x4, y: f64x4) -> i32; -- fn x86_mm256_testc_si256(x: u64x4, y: u64x4) -> i32; -- fn x86_mm_testnzc_ps(x: f32x4, y: f32x4) -> i32; -- fn x86_mm256_testnzc_ps(x: f32x8, y: f32x8) -> i32; -- fn x86_mm_testnzc_pd(x: f64x2, y: f64x2) -> i32; -- fn x86_mm256_testnzc_pd(x: f64x4, y: f64x4) -> i32; -- fn x86_mm256_testnzc_si256(x: u64x4, y: u64x4) -> i32; -- fn x86_mm_testz_ps(x: f32x4, y: f32x4) -> i32; -- fn x86_mm256_testz_ps(x: f32x8, y: f32x8) -> i32; -- fn x86_mm_testz_pd(x: f64x2, y: f64x2) -> i32; -- fn x86_mm256_testz_pd(x: f64x4, y: f64x4) -> i32; -- fn x86_mm256_testz_si256(x: u64x4, y: u64x4) -> i32; --} -- --#[doc(hidden)] --pub mod common { -- use super::*; -- use core::mem; -- -- macro_rules! bools { -- ($($ty: ty, $all: ident, $any: ident, $testc: ident, $testz: ident;)*) => { -- $( -- #[inline] -- pub fn $all(x: $ty) -> bool { -- unsafe { -- super::$testc(mem::transmute(x), mem::transmute(<$ty>::splat(true))) != 0 -- } -- } -- #[inline] -- pub fn $any(x: $ty) -> bool { -- unsafe { -- super::$testz(mem::transmute(x), mem::transmute(x)) == 0 -- } -- } -- )* -- } -- } -- -- bools! { -- bool32fx8, bool32fx8_all, bool32fx8_any, x86_mm256_testc_ps, x86_mm256_testz_ps; -- bool64fx4, bool64fx4_all, bool64fx4_any, x86_mm256_testc_pd, x86_mm256_testz_pd; -- bool8ix32, bool8ix32_all, bool8ix32_any, x86_mm256_testc_si256, x86_mm256_testz_si256; -- bool16ix16, bool16ix16_all, bool16ix16_any, x86_mm256_testc_si256, x86_mm256_testz_si256; -- bool32ix8, bool32ix8_all, bool32ix8_any, x86_mm256_testc_si256, x86_mm256_testz_si256; -- bool64ix4, bool64ix4_all, bool64ix4_any, x86_mm256_testc_si256, x86_mm256_testz_si256; -- } --} -- --// 128-bit vectors: -- --// 32 bit floats -- --pub trait AvxF32x4 { -- fn permutevar(self, other: i32x4) -> f32x4; --} --impl AvxF32x4 for f32x4 { -- fn permutevar(self, other: i32x4) -> f32x4 { -- unsafe { x86_mm_permutevar_ps(self, other) } -- } --} -- --pub trait AvxF64x4 { -- fn sqrt(self) -> Self; -- fn addsub(self, other: Self) -> Self; -- fn hadd(self, other: Self) -> Self; -- fn hsub(self, other: Self) -> Self; -- fn max(self, other: Self) -> Self; -- fn min(self, other: Self) -> Self; -- fn move_mask(self) -> u32; --} -- --impl AvxF64x4 for f64x4 { -- #[inline] -- fn sqrt(self) -> Self { -- unsafe { x86_mm256_sqrt_pd(self) } -- } -- -- #[inline] -- fn addsub(self, other: Self) -> Self { -- unsafe { x86_mm256_addsub_pd(self, other) } -- } -- -- #[inline] -- fn hadd(self, other: Self) -> Self { -- unsafe { x86_mm256_hadd_pd(self, other) } -- } -- -- #[inline] -- fn hsub(self, other: Self) -> Self { -- unsafe { x86_mm256_hsub_pd(self, other) } -- } -- -- #[inline] -- fn max(self, other: Self) -> Self { -- unsafe { x86_mm256_max_pd(self, other) } -- } -- -- #[inline] -- fn min(self, other: Self) -> Self { -- unsafe { x86_mm256_min_pd(self, other) } -- } -- -- #[inline] -- fn move_mask(self) -> u32 { -- unsafe { x86_mm256_movemask_pd(self) as u32 } -- } --} -- --pub trait AvxBool64fx4 { -- fn move_mask(self) -> u32; --} --impl AvxBool64fx4 for bool64fx4 { -- #[inline] -- fn move_mask(self) -> u32 { -- unsafe { x86_mm256_movemask_pd(bitcast(self)) as u32 } -- } --} -- --pub trait AvxF32x8 { -- fn sqrt(self) -> Self; -- fn addsub(self, other: Self) -> Self; -- fn hadd(self, other: Self) -> Self; -- fn hsub(self, other: Self) -> Self; -- fn max(self, other: Self) -> Self; -- fn min(self, other: Self) -> Self; -- fn move_mask(self) -> u32; -- /// Compute an approximation to the reciprocal of the square root -- /// of `self`, that is, `f32x8::splat(1.0) / self.sqrt()`. -- /// -- /// The accuracy of this approximation is platform dependent. -- fn approx_rsqrt(self) -> Self; -- /// Compute an approximation to the reciprocal of `self`, that is, -- /// `f32x8::splat(1.0) / self`. -- /// -- /// The accuracy of this approximation is platform dependent. -- fn approx_reciprocal(self) -> Self; --} -- --impl AvxF32x8 for f32x8 { -- #[inline] -- fn sqrt(self) -> Self { -- unsafe { x86_mm256_sqrt_ps(self) } -- } -- -- #[inline] -- fn addsub(self, other: Self) -> Self { -- unsafe { x86_mm256_addsub_ps(self, other) } -- } -- -- #[inline] -- fn hadd(self, other: Self) -> Self { -- unsafe { x86_mm256_hadd_ps(self, other) } -- } -- -- #[inline] -- fn hsub(self, other: Self) -> Self { -- unsafe { x86_mm256_hsub_ps(self, other) } -- } -- -- #[inline] -- fn max(self, other: Self) -> Self { -- unsafe { x86_mm256_max_ps(self, other) } -- } -- -- #[inline] -- fn min(self, other: Self) -> Self { -- unsafe { x86_mm256_min_ps(self, other) } -- } -- -- #[inline] -- fn move_mask(self) -> u32 { -- unsafe { x86_mm256_movemask_ps(self) as u32 } -- } -- -- #[inline] -- fn approx_reciprocal(self) -> Self { -- unsafe { x86_mm256_rcp_ps(self) } -- } -- -- #[inline] -- fn approx_rsqrt(self) -> Self { -- unsafe { x86_mm256_rsqrt_ps(self) } -- } --} -- --pub trait AvxBool32fx8 { -- fn move_mask(self) -> u32; --} --impl AvxBool32fx8 for bool32fx8 { -- #[inline] -- fn move_mask(self) -> u32 { -- unsafe { x86_mm256_movemask_ps(bitcast(self)) as u32 } -- } --} -- --pub trait AvxBool32fx4 {} --impl AvxBool32fx4 for bool32fx4 {} -- --// 64 bit floats -- --pub trait AvxF64x2 { -- fn permutevar(self, other: i64x2) -> f64x2; --} --impl AvxF64x2 for f64x2 { -- fn permutevar(self, other: i64x2) -> f64x2 { -- unsafe { x86_mm_permutevar_pd(self, other) } -- } --} -- --pub trait AvxBool64fx2 {} --impl AvxBool64fx2 for bool64fx2 {} -- --// 64 bit integers -- --pub trait AvxU64x2 {} --impl AvxU64x2 for u64x2 {} --pub trait AvxI64x2 {} --impl AvxI64x2 for i64x2 {} -- --pub trait AvxBool64ix2 {} --impl AvxBool64ix2 for bool64ix2 {} -- --// 32 bit integers -- --pub trait AvxU32x4 {} --impl AvxU32x4 for u32x4 {} --pub trait AvxI32x4 {} --impl AvxI32x4 for i32x4 {} -- --pub trait AvxBool32ix4 {} --impl AvxBool32ix4 for bool32ix4 {} -- --// 16 bit integers -- --pub trait AvxU16x8 {} --impl AvxU16x8 for u16x8 {} --pub trait AvxI16x8 {} --impl AvxI16x8 for i16x8 {} -- --pub trait AvxBool16ix8 {} --impl AvxBool16ix8 for bool16ix8 {} -- --// 8 bit integers -- --pub trait AvxU8x16 {} --impl AvxU8x16 for u8x16 {} --pub trait AvxI8x16 {} --impl AvxI8x16 for i8x16 {} -- --pub trait AvxBool8ix16 {} --impl AvxBool8ix16 for bool8ix16 {} -diff --git a/third_party/rust/simd/src/x86/avx2.rs b/third_party/rust/simd/src/x86/avx2.rs -deleted file mode 100644 -index e86a33d3b5bb..000000000000 ---- a/third_party/rust/simd/src/x86/avx2.rs -+++ /dev/null -@@ -1,65 +0,0 @@ --use x86::avx::*; -- --#[allow(dead_code)] --extern "platform-intrinsic" { -- fn x86_mm256_abs_epi8(x: i8x32) -> i8x32; -- fn x86_mm256_abs_epi16(x: i16x16) -> i16x16; -- fn x86_mm256_abs_epi32(x: i32x8) -> i32x8; -- fn x86_mm256_adds_epi8(x: i8x32, y: i8x32) -> i8x32; -- fn x86_mm256_adds_epu8(x: u8x32, y: u8x32) -> u8x32; -- fn x86_mm256_adds_epi16(x: i16x16, y: i16x16) -> i16x16; -- fn x86_mm256_adds_epu16(x: u16x16, y: u16x16) -> u16x16; -- fn x86_mm256_avg_epu8(x: u8x32, y: u8x32) -> u8x32; -- fn x86_mm256_avg_epu16(x: u16x16, y: u16x16) -> u16x16; -- fn x86_mm256_hadd_epi16(x: i16x16, y: i16x16) -> i16x16; -- fn x86_mm256_hadd_epi32(x: i32x8, y: i32x8) -> i32x8; -- fn x86_mm256_hadds_epi16(x: i16x16, y: i16x16) -> i16x16; -- fn x86_mm256_hsub_epi16(x: i16x16, y: i16x16) -> i16x16; -- fn x86_mm256_hsub_epi32(x: i32x8, y: i32x8) -> i32x8; -- fn x86_mm256_hsubs_epi16(x: i16x16, y: i16x16) -> i16x16; -- fn x86_mm256_madd_epi16(x: i16x16, y: i16x16) -> i32x8; -- fn x86_mm256_maddubs_epi16(x: i8x32, y: i8x32) -> i16x16; -- fn x86_mm256_max_epi8(x: i8x32, y: i8x32) -> i8x32; -- fn x86_mm256_max_epu8(x: u8x32, y: u8x32) -> u8x32; -- fn x86_mm256_max_epi16(x: i16x16, y: i16x16) -> i16x16; -- fn x86_mm256_max_epu16(x: u16x16, y: u16x16) -> u16x16; -- fn x86_mm256_max_epi32(x: i32x8, y: i32x8) -> i32x8; -- fn x86_mm256_max_epu32(x: u32x8, y: u32x8) -> u32x8; -- fn x86_mm256_min_epi8(x: i8x32, y: i8x32) -> i8x32; -- fn x86_mm256_min_epu8(x: u8x32, y: u8x32) -> u8x32; -- fn x86_mm256_min_epi16(x: i16x16, y: i16x16) -> i16x16; -- fn x86_mm256_min_epu16(x: u16x16, y: u16x16) -> u16x16; -- fn x86_mm256_min_epi32(x: i32x8, y: i32x8) -> i32x8; -- fn x86_mm256_min_epu32(x: u32x8, y: u32x8) -> u32x8; -- fn x86_mm256_mul_epi64(x: i32x8, y: i32x8) -> i64x4; -- fn x86_mm256_mul_epu64(x: u32x8, y: u32x8) -> u64x4; -- fn x86_mm256_mulhi_epi16(x: i16x16, y: i16x16) -> i16x16; -- fn x86_mm256_mulhi_epu16(x: u16x16, y: u16x16) -> u16x16; -- fn x86_mm256_mulhrs_epi16(x: i16x16, y: i16x16) -> i16x16; -- fn x86_mm256_packs_epi16(x: i16x16, y: i16x16) -> i8x32; -- fn x86_mm256_packus_epi16(x: i16x16, y: i16x16) -> u8x32; -- fn x86_mm256_packs_epi32(x: i32x8, y: i32x8) -> i16x16; -- fn x86_mm256_packus_epi32(x: i32x8, y: i32x8) -> u16x16; -- fn x86_mm256_permutevar8x32_epi32(x: i32x8, y: i32x8) -> i32x8; -- fn x86_mm256_permutevar8x32_ps(x: f32x8, y: i32x8) -> f32x8; -- fn x86_mm256_sad_epu8(x: u8x32, y: u8x32) -> u64x4; -- fn x86_mm256_shuffle_epi8(x: i8x32, y: i8x32) -> i8x32; -- fn x86_mm256_sign_epi8(x: i8x32, y: i8x32) -> i8x32; -- fn x86_mm256_sign_epi16(x: i16x16, y: i16x16) -> i16x16; -- fn x86_mm256_sign_epi32(x: i32x8, y: i32x8) -> i32x8; -- fn x86_mm256_subs_epi8(x: i8x32, y: i8x32) -> i8x32; -- fn x86_mm256_subs_epu8(x: u8x32, y: u8x32) -> u8x32; -- fn x86_mm256_subs_epi16(x: i16x16, y: i16x16) -> i16x16; -- fn x86_mm256_subs_epu16(x: u16x16, y: u16x16) -> u16x16; --} -- --// broken on rustc 1.7.0-nightly (1ddaf8bdf 2015-12-12) --// pub trait Avx2F32x8 { --// fn permutevar(self, other: i32x8) -> f32x8; --// } --// --// impl Avx2F32x8 for f32x8 { --// fn permutevar(self, other: i32x8) -> f32x8 { --// unsafe { x86_mm256_permutevar8x32_ps(self, other) } --// } --// } -diff --git a/third_party/rust/simd/src/x86/mod.rs b/third_party/rust/simd/src/x86/mod.rs -deleted file mode 100644 -index 8763fb16ccfd..000000000000 ---- a/third_party/rust/simd/src/x86/mod.rs -+++ /dev/null -@@ -1,16 +0,0 @@ --//! Features specific to x86 and x86-64 CPUs. -- --#[cfg(any(feature = "doc", target_feature = "sse2"))] --pub mod sse2; --#[cfg(any(feature = "doc", target_feature = "sse3"))] --pub mod sse3; --#[cfg(any(feature = "doc", target_feature = "ssse3"))] --pub mod ssse3; --#[cfg(any(feature = "doc", target_feature = "sse4.1"))] --pub mod sse4_1; --#[cfg(any(feature = "doc", target_feature = "sse4.2"))] --pub mod sse4_2; --#[cfg(any(feature = "doc", target_feature = "avx"))] --pub mod avx; --#[cfg(any(feature = "doc", target_feature = "avx2"))] --pub mod avx2; -diff --git a/third_party/rust/simd/src/x86/sse2.rs b/third_party/rust/simd/src/x86/sse2.rs -deleted file mode 100644 -index 5cbc853694d5..000000000000 ---- a/third_party/rust/simd/src/x86/sse2.rs -+++ /dev/null -@@ -1,359 +0,0 @@ --use super::super::*; --use {bitcast, simd_cast, f32x2}; -- --pub use sixty_four::{f64x2, i64x2, u64x2, bool64ix2, bool64fx2}; -- --//pub use super::{u64x2, i64x2, f64x2, bool64ix2, bool64fx2}; -- --// strictly speaking, these are SSE instructions, not SSE2. --extern "platform-intrinsic" { -- fn x86_mm_movemask_ps(x: f32x4) -> i32; -- fn x86_mm_max_ps(x: f32x4, y: f32x4) -> f32x4; -- fn x86_mm_min_ps(x: f32x4, y: f32x4) -> f32x4; -- fn x86_mm_rsqrt_ps(x: f32x4) -> f32x4; -- fn x86_mm_rcp_ps(x: f32x4) -> f32x4; -- fn x86_mm_sqrt_ps(x: f32x4) -> f32x4; --} -- --extern "platform-intrinsic" { -- fn x86_mm_adds_epi8(x: i8x16, y: i8x16) -> i8x16; -- fn x86_mm_adds_epu8(x: u8x16, y: u8x16) -> u8x16; -- fn x86_mm_adds_epi16(x: i16x8, y: i16x8) -> i16x8; -- fn x86_mm_adds_epu16(x: u16x8, y: u16x8) -> u16x8; -- fn x86_mm_avg_epu8(x: u8x16, y: u8x16) -> u8x16; -- fn x86_mm_avg_epu16(x: u16x8, y: u16x8) -> u16x8; -- fn x86_mm_madd_epi16(x: i16x8, y: i16x8) -> i32x4; -- fn x86_mm_max_epi16(x: i16x8, y: i16x8) -> i16x8; -- fn x86_mm_max_epu8(x: u8x16, y: u8x16) -> u8x16; -- fn x86_mm_max_pd(x: f64x2, y: f64x2) -> f64x2; -- fn x86_mm_min_epi16(x: i16x8, y: i16x8) -> i16x8; -- fn x86_mm_min_epu8(x: u8x16, y: u8x16) -> u8x16; -- fn x86_mm_min_pd(x: f64x2, y: f64x2) -> f64x2; -- fn x86_mm_movemask_pd(x: f64x2) -> i32; -- fn x86_mm_movemask_epi8(x: i8x16) -> i32; -- fn x86_mm_mul_epu32(x: u32x4, y: u32x4) -> u64x2; -- fn x86_mm_mulhi_epi16(x: i16x8, y: i16x8) -> i16x8; -- fn x86_mm_mulhi_epu16(x: u16x8, y: u16x8) -> u16x8; -- fn x86_mm_packs_epi16(x: i16x8, y: i16x8) -> i8x16; -- fn x86_mm_packs_epi32(x: i32x4, y: i32x4) -> i16x8; -- fn x86_mm_packus_epi16(x: i16x8, y: i16x8) -> u8x16; -- fn x86_mm_sad_epu8(x: u8x16, y: u8x16) -> u64x2; -- fn x86_mm_sqrt_pd(x: f64x2) -> f64x2; -- fn x86_mm_subs_epi8(x: i8x16, y: i8x16) -> i8x16; -- fn x86_mm_subs_epu8(x: u8x16, y: u8x16) -> u8x16; -- fn x86_mm_subs_epi16(x: i16x8, y: i16x8) -> i16x8; -- fn x86_mm_subs_epu16(x: u16x8, y: u16x8) -> u16x8; --} -- --#[doc(hidden)] --pub mod common { -- use super::super::super::*; -- use core::mem; -- -- #[inline] -- pub fn f32x4_sqrt(x: f32x4) -> f32x4 { -- unsafe {super::x86_mm_sqrt_ps(x)} -- } -- #[inline] -- pub fn f32x4_approx_rsqrt(x: f32x4) -> f32x4 { -- unsafe {super::x86_mm_rsqrt_ps(x)} -- } -- #[inline] -- pub fn f32x4_approx_reciprocal(x: f32x4) -> f32x4 { -- unsafe {super::x86_mm_rcp_ps(x)} -- } -- #[inline] -- pub fn f32x4_max(x: f32x4, y: f32x4) -> f32x4 { -- unsafe {super::x86_mm_max_ps(x, y)} -- } -- #[inline] -- pub fn f32x4_min(x: f32x4, y: f32x4) -> f32x4 { -- unsafe {super::x86_mm_min_ps(x, y)} -- } -- -- macro_rules! bools { -- ($($ty: ty, $all: ident, $any: ident, $movemask: ident, $width: expr;)*) => { -- $( -- #[inline] -- pub fn $all(x: $ty) -> bool { -- unsafe { -- super::$movemask(mem::transmute(x)) == (1 << $width) - 1 -- } -- } -- #[inline] -- pub fn $any(x: $ty) -> bool { -- unsafe { -- super::$movemask(mem::transmute(x)) != 0 -- } -- } -- )* -- } -- } -- -- bools! { -- bool32fx4, bool32fx4_all, bool32fx4_any, x86_mm_movemask_ps, 4; -- bool8ix16, bool8ix16_all, bool8ix16_any, x86_mm_movemask_epi8, 16; -- bool16ix8, bool16ix8_all, bool16ix8_any, x86_mm_movemask_epi8, 16; -- bool32ix4, bool32ix4_all, bool32ix4_any, x86_mm_movemask_epi8, 16; -- } --} -- --// 32 bit floats -- --pub trait Sse2F32x4 { -- fn to_f64(self) -> f64x2; -- fn move_mask(self) -> u32; --} --impl Sse2F32x4 for f32x4 { -- #[inline] -- fn to_f64(self) -> f64x2 { -- unsafe { -- simd_cast(f32x2(self.0, self.1)) -- } -- } -- fn move_mask(self) -> u32 { -- unsafe {x86_mm_movemask_ps(self) as u32} -- } --} --pub trait Sse2Bool32fx4 { -- fn move_mask(self) -> u32; --} --impl Sse2Bool32fx4 for bool32fx4 { -- #[inline] -- fn move_mask(self) -> u32 { -- unsafe { x86_mm_movemask_ps(bitcast(self)) as u32} -- } --} -- --// 64 bit floats -- --pub trait Sse2F64x2 { -- fn move_mask(self) -> u32; -- fn sqrt(self) -> Self; -- fn max(self, other: Self) -> Self; -- fn min(self, other: Self) -> Self; --} --impl Sse2F64x2 for f64x2 { -- #[inline] -- fn move_mask(self) -> u32 { -- unsafe { x86_mm_movemask_pd(bitcast(self)) as u32} -- } -- -- #[inline] -- fn sqrt(self) -> Self { -- unsafe { x86_mm_sqrt_pd(self) } -- } -- -- #[inline] -- fn max(self, other: Self) -> Self { -- unsafe { x86_mm_max_pd(self, other) } -- } -- #[inline] -- fn min(self, other: Self) -> Self { -- unsafe { x86_mm_min_pd(self, other) } -- } --} -- --pub trait Sse2Bool64fx2 { -- fn move_mask(self) -> u32; --} --impl Sse2Bool64fx2 for bool64fx2 { -- #[inline] -- fn move_mask(self) -> u32 { -- unsafe { x86_mm_movemask_pd(bitcast(self)) as u32} -- } --} -- --// 64 bit ints -- --pub trait Sse2U64x2 {} --impl Sse2U64x2 for u64x2 {} -- --pub trait Sse2I64x2 {} --impl Sse2I64x2 for i64x2 {} -- --pub trait Sse2Bool64ix2 {} --impl Sse2Bool64ix2 for bool64ix2 {} -- --// 32 bit ints -- --pub trait Sse2U32x4 { -- fn low_mul(self, other: Self) -> u64x2; --} --impl Sse2U32x4 for u32x4 { -- #[inline] -- fn low_mul(self, other: Self) -> u64x2 { -- unsafe { x86_mm_mul_epu32(self, other) } -- } --} -- --pub trait Sse2I32x4 { -- fn packs(self, other: Self) -> i16x8; --} --impl Sse2I32x4 for i32x4 { -- #[inline] -- fn packs(self, other: Self) -> i16x8 { -- unsafe { x86_mm_packs_epi32(self, other) } -- } --} -- --pub trait Sse2Bool32ix4 {} --impl Sse2Bool32ix4 for bool32ix4 {} -- --// 16 bit ints -- --pub trait Sse2U16x8 { -- fn adds(self, other: Self) -> Self; -- fn subs(self, other: Self) -> Self; -- fn avg(self, other: Self) -> Self; -- fn mulhi(self, other: Self) -> Self; --} --impl Sse2U16x8 for u16x8 { -- #[inline] -- fn adds(self, other: Self) -> Self { -- unsafe { x86_mm_adds_epu16(self, other) } -- } -- #[inline] -- fn subs(self, other: Self) -> Self { -- unsafe { x86_mm_subs_epu16(self, other) } -- } -- -- #[inline] -- fn avg(self, other: Self) -> Self { -- unsafe { x86_mm_avg_epu16(self, other) } -- } -- -- #[inline] -- fn mulhi(self, other: Self) -> Self { -- unsafe { x86_mm_mulhi_epu16(self, other) } -- } --} -- --pub trait Sse2I16x8 { -- fn adds(self, other: Self) -> Self; -- fn subs(self, other: Self) -> Self; -- fn madd(self, other: Self) -> i32x4; -- fn max(self, other: Self) -> Self; -- fn min(self, other: Self) -> Self; -- fn mulhi(self, other: Self) -> Self; -- fn packs(self, other: Self) -> i8x16; -- fn packus(self, other: Self) -> u8x16; --} --impl Sse2I16x8 for i16x8 { -- #[inline] -- fn adds(self, other: Self) -> Self { -- unsafe { x86_mm_adds_epi16(self, other) } -- } -- #[inline] -- fn subs(self, other: Self) -> Self { -- unsafe { x86_mm_subs_epi16(self, other) } -- } -- -- #[inline] -- fn madd(self, other: Self) -> i32x4 { -- unsafe { x86_mm_madd_epi16(self, other) } -- } -- -- #[inline] -- fn max(self, other: Self) -> Self { -- unsafe { x86_mm_max_epi16(self, other) } -- } -- #[inline] -- fn min(self, other: Self) -> Self { -- unsafe { x86_mm_min_epi16(self, other) } -- } -- -- #[inline] -- fn mulhi(self, other: Self) -> Self { -- unsafe { x86_mm_mulhi_epi16(self, other) } -- } -- -- #[inline] -- fn packs(self, other: Self) -> i8x16 { -- unsafe { x86_mm_packs_epi16(self, other) } -- } -- #[inline] -- fn packus(self, other: Self) -> u8x16 { -- unsafe { x86_mm_packus_epi16(self, other) } -- } --} -- --pub trait Sse2Bool16ix8 {} --impl Sse2Bool16ix8 for bool16ix8 {} -- --// 8 bit ints -- --pub trait Sse2U8x16 { -- fn move_mask(self) -> u32; -- fn adds(self, other: Self) -> Self; -- fn subs(self, other: Self) -> Self; -- fn avg(self, other: Self) -> Self; -- fn max(self, other: Self) -> Self; -- fn min(self, other: Self) -> Self; -- fn sad(self, other: Self) -> u64x2; --} --impl Sse2U8x16 for u8x16 { -- #[inline] -- fn move_mask(self) -> u32 { -- unsafe { x86_mm_movemask_epi8(bitcast(self)) as u32} -- } -- -- #[inline] -- fn adds(self, other: Self) -> Self { -- unsafe { x86_mm_adds_epu8(self, other) } -- } -- #[inline] -- fn subs(self, other: Self) -> Self { -- unsafe { x86_mm_subs_epu8(self, other) } -- } -- -- #[inline] -- fn avg(self, other: Self) -> Self { -- unsafe { x86_mm_avg_epu8(self, other) } -- } -- -- #[inline] -- fn max(self, other: Self) -> Self { -- unsafe { x86_mm_max_epu8(self, other) } -- } -- #[inline] -- fn min(self, other: Self) -> Self { -- unsafe { x86_mm_min_epu8(self, other) } -- } -- -- #[inline] -- fn sad(self, other: Self) -> u64x2 { -- unsafe { x86_mm_sad_epu8(self, other) } -- } --} -- --pub trait Sse2I8x16 { -- fn move_mask(self) -> u32; -- fn adds(self, other: Self) -> Self; -- fn subs(self, other: Self) -> Self; --} --impl Sse2I8x16 for i8x16 { -- #[inline] -- fn move_mask(self) -> u32 { -- unsafe { x86_mm_movemask_epi8(bitcast(self)) as u32} -- } -- -- #[inline] -- fn adds(self, other: Self) -> Self { -- unsafe { x86_mm_adds_epi8(self, other) } -- } -- #[inline] -- fn subs(self, other: Self) -> Self { -- unsafe { x86_mm_subs_epi8(self, other) } -- } --} -- --pub trait Sse2Bool8ix16 { -- fn move_mask(self) -> u32; --} --impl Sse2Bool8ix16 for bool8ix16 { -- #[inline] -- fn move_mask(self) -> u32 { -- unsafe { x86_mm_movemask_epi8(bitcast(self)) as u32} -- } --} -diff --git a/third_party/rust/simd/src/x86/sse3.rs b/third_party/rust/simd/src/x86/sse3.rs -deleted file mode 100644 -index bd70b569f9c0..000000000000 ---- a/third_party/rust/simd/src/x86/sse3.rs -+++ /dev/null -@@ -1,57 +0,0 @@ --use sixty_four::*; --use super::super::*; -- --extern "platform-intrinsic" { -- fn x86_mm_addsub_ps(x: f32x4, y: f32x4) -> f32x4; -- fn x86_mm_addsub_pd(x: f64x2, y: f64x2) -> f64x2; -- fn x86_mm_hadd_ps(x: f32x4, y: f32x4) -> f32x4; -- fn x86_mm_hadd_pd(x: f64x2, y: f64x2) -> f64x2; -- fn x86_mm_hsub_ps(x: f32x4, y: f32x4) -> f32x4; -- fn x86_mm_hsub_pd(x: f64x2, y: f64x2) -> f64x2; --} -- --pub trait Sse3F32x4 { -- fn addsub(self, other: Self) -> Self; -- fn hadd(self, other: Self) -> Self; -- fn hsub(self, other: Self) -> Self; --} -- --impl Sse3F32x4 for f32x4 { -- #[inline] -- fn addsub(self, other: Self) -> Self { -- unsafe { x86_mm_addsub_ps(self, other) } -- } -- -- #[inline] -- fn hadd(self, other: Self) -> Self { -- unsafe { x86_mm_hadd_ps(self, other) } -- } -- -- #[inline] -- fn hsub(self, other: Self) -> Self { -- unsafe { x86_mm_hsub_ps(self, other) } -- } --} -- --pub trait Sse3F64x2 { -- fn addsub(self, other: Self) -> Self; -- fn hadd(self, other: Self) -> Self; -- fn hsub(self, other: Self) -> Self; --} -- --impl Sse3F64x2 for f64x2 { -- #[inline] -- fn addsub(self, other: Self) -> Self { -- unsafe { x86_mm_addsub_pd(self, other) } -- } -- -- #[inline] -- fn hadd(self, other: Self) -> Self { -- unsafe { x86_mm_hadd_pd(self, other) } -- } -- -- #[inline] -- fn hsub(self, other: Self) -> Self { -- unsafe { x86_mm_hsub_pd(self, other) } -- } --} -diff --git a/third_party/rust/simd/src/x86/sse4_1.rs b/third_party/rust/simd/src/x86/sse4_1.rs -deleted file mode 100644 -index fa44678a0584..000000000000 ---- a/third_party/rust/simd/src/x86/sse4_1.rs -+++ /dev/null -@@ -1,155 +0,0 @@ --use super::super::*; --use x86::sse2::*; -- --#[allow(dead_code)] --extern "platform-intrinsic" { -- fn x86_mm_dp_ps(x: f32x4, y: f32x4, z: i32) -> f32x4; -- fn x86_mm_dp_pd(x: f64x2, y: f64x2, z: i32) -> f64x2; -- fn x86_mm_max_epi8(x: i8x16, y: i8x16) -> i8x16; -- fn x86_mm_max_epu16(x: u16x8, y: u16x8) -> u16x8; -- fn x86_mm_max_epi32(x: i32x4, y: i32x4) -> i32x4; -- fn x86_mm_max_epu32(x: u32x4, y: u32x4) -> u32x4; -- fn x86_mm_min_epi8(x: i8x16, y: i8x16) -> i8x16; -- fn x86_mm_min_epu16(x: u16x8, y: u16x8) -> u16x8; -- fn x86_mm_min_epi32(x: i32x4, y: i32x4) -> i32x4; -- fn x86_mm_min_epu32(x: u32x4, y: u32x4) -> u32x4; -- fn x86_mm_minpos_epu16(x: u16x8) -> u16x8; -- fn x86_mm_mpsadbw_epu8(x: u8x16, y: u8x16, z: i32) -> u16x8; -- fn x86_mm_mul_epi32(x: i32x4, y: i32x4) -> i64x2; -- fn x86_mm_packus_epi32(x: i32x4, y: i32x4) -> u16x8; -- fn x86_mm_testc_si128(x: u64x2, y: u64x2) -> i32; -- fn x86_mm_testnzc_si128(x: u64x2, y: u64x2) -> i32; -- fn x86_mm_testz_si128(x: u64x2, y: u64x2) -> i32; --} -- --// 32 bit floats -- --pub trait Sse41F32x4 {} --impl Sse41F32x4 for f32x4 {} -- --// 64 bit floats -- --pub trait Sse41F64x2 {} --impl Sse41F64x2 for f64x2 {} -- --// 64 bit integers -- --pub trait Sse41U64x2 { -- fn testc(self, other: Self) -> i32; -- fn testnzc(self, other: Self) -> i32; -- fn testz(self, other: Self) -> i32; --} --impl Sse41U64x2 for u64x2 { -- #[inline] -- fn testc(self, other: Self) -> i32 { -- unsafe { x86_mm_testc_si128(self, other) } -- } -- #[inline] -- fn testnzc(self, other: Self) -> i32 { -- unsafe { x86_mm_testnzc_si128(self, other) } -- } -- #[inline] -- fn testz(self, other: Self) -> i32 { -- unsafe { x86_mm_testz_si128(self, other) } -- } --} --pub trait Sse41I64x2 {} --impl Sse41I64x2 for i64x2 {} -- --pub trait Sse41Bool64ix2 {} --impl Sse41Bool64ix2 for bool64ix2 {} -- --// 32 bit integers -- --pub trait Sse41U32x4 { -- fn max(self, other: Self) -> Self; -- fn min(self, other: Self) -> Self; --} --impl Sse41U32x4 for u32x4 { -- #[inline] -- fn max(self, other: Self) -> Self { -- unsafe { x86_mm_max_epu32(self, other) } -- } -- #[inline] -- fn min(self, other: Self) -> Self { -- unsafe { x86_mm_min_epu32(self, other) } -- } --} --pub trait Sse41I32x4 { -- fn max(self, other: Self) -> Self; -- fn min(self, other: Self) -> Self; -- fn low_mul(self, other: Self) -> i64x2; -- fn packus(self, other: Self) -> u16x8; --} --impl Sse41I32x4 for i32x4 { -- #[inline] -- fn max(self, other: Self) -> Self { -- unsafe { x86_mm_max_epi32(self, other) } -- } -- #[inline] -- fn min(self, other: Self) -> Self { -- unsafe { x86_mm_min_epi32(self, other) } -- } -- -- #[inline] -- fn low_mul(self, other: Self) -> i64x2 { -- unsafe { x86_mm_mul_epi32(self, other) } -- } -- #[inline] -- fn packus(self, other: Self) -> u16x8 { -- unsafe { x86_mm_packus_epi32(self, other) } -- } --} -- --pub trait Sse41Bool32ix4 {} --impl Sse41Bool32ix4 for bool32ix4 {} -- --// 16 bit integers -- --pub trait Sse41U16x8 { -- fn max(self, other: Self) -> Self; -- fn min(self, other: Self) -> Self; -- fn minpos(self) -> Self; --} --impl Sse41U16x8 for u16x8 { -- #[inline] -- fn max(self, other: Self) -> Self { -- unsafe { x86_mm_max_epu16(self, other) } -- } -- #[inline] -- fn min(self, other: Self) -> Self { -- unsafe { x86_mm_min_epu16(self, other) } -- } -- -- #[inline] -- fn minpos(self) -> Self { -- unsafe { x86_mm_minpos_epu16(self) } -- } --} --pub trait Sse41I16x8 {} --impl Sse41I16x8 for i16x8 {} -- --pub trait Sse41Bool16ix8 {} --impl Sse41Bool16ix8 for bool16ix8 {} -- --// 8 bit integers -- --pub trait Sse41U8x16 {} --impl Sse41U8x16 for u8x16 {} --pub trait Sse41I8x16 { -- fn max(self, other: Self) -> Self; -- fn min(self, other: Self) -> Self; --} --impl Sse41I8x16 for i8x16 { -- #[inline] -- fn max(self, other: Self) -> Self { -- unsafe { x86_mm_max_epi8(self, other) } -- } -- #[inline] -- fn min(self, other: Self) -> Self { -- unsafe { x86_mm_min_epi8(self, other) } -- } --} -- --pub trait Sse41Bool8ix16 {} --impl Sse41Bool8ix16 for bool8ix16 {} -diff --git a/third_party/rust/simd/src/x86/sse4_2.rs b/third_party/rust/simd/src/x86/sse4_2.rs -deleted file mode 100644 -index 5afe4583cf71..000000000000 ---- a/third_party/rust/simd/src/x86/sse4_2.rs -+++ /dev/null -@@ -1,19 +0,0 @@ --use i8x16; -- --#[allow(dead_code)] --extern "platform-intrinsic" { -- fn x86_mm_cmpestra(x: i8x16, y: i32, z: i8x16, w: i32, a: i32) -> i32; -- fn x86_mm_cmpestrc(x: i8x16, y: i32, z: i8x16, w: i32, a: i32) -> i32; -- fn x86_mm_cmpestri(x: i8x16, y: i32, z: i8x16, w: i32, a: i32) -> i32; -- fn x86_mm_cmpestrm(x: i8x16, y: i32, z: i8x16, w: i32, a: i32) -> i8x16; -- fn x86_mm_cmpestro(x: i8x16, y: i32, z: i8x16, w: i32, a: i32) -> i32; -- fn x86_mm_cmpestrs(x: i8x16, y: i32, z: i8x16, w: i32, a: i32) -> i32; -- fn x86_mm_cmpestrz(x: i8x16, y: i32, z: i8x16, w: i32, a: i32) -> i32; -- fn x86_mm_cmpistra(x: i8x16, y: i8x16, z: i32) -> i32; -- fn x86_mm_cmpistrc(x: i8x16, y: i8x16, z: i32) -> i32; -- fn x86_mm_cmpistri(x: i8x16, y: i8x16, z: i32) -> i32; -- fn x86_mm_cmpistrm(x: i8x16, y: i8x16, z: i32) -> i8x16; -- fn x86_mm_cmpistro(x: i8x16, y: i8x16, z: i32) -> i32; -- fn x86_mm_cmpistrs(x: i8x16, y: i8x16, z: i32) -> i32; -- fn x86_mm_cmpistrz(x: i8x16, y: i8x16, z: i32) -> i32; --} -diff --git a/third_party/rust/simd/src/x86/ssse3.rs b/third_party/rust/simd/src/x86/ssse3.rs -deleted file mode 100644 -index aa22a08a68a4..000000000000 ---- a/third_party/rust/simd/src/x86/ssse3.rs -+++ /dev/null -@@ -1,172 +0,0 @@ --use super::super::*; --use bitcast; -- --macro_rules! bitcast { -- ($func: ident($a: ident, $b: ident)) => { -- bitcast($func(bitcast($a), bitcast($b))) -- } --} -- --extern "platform-intrinsic" { -- fn x86_mm_abs_epi8(x: i8x16) -> i8x16; -- fn x86_mm_abs_epi16(x: i16x8) -> i16x8; -- fn x86_mm_abs_epi32(x: i32x4) -> i32x4; -- fn x86_mm_hadd_epi16(x: i16x8, y: i16x8) -> i16x8; -- fn x86_mm_hadd_epi32(x: i32x4, y: i32x4) -> i32x4; -- fn x86_mm_hadds_epi16(x: i16x8, y: i16x8) -> i16x8; -- fn x86_mm_hsub_epi16(x: i16x8, y: i16x8) -> i16x8; -- fn x86_mm_hsub_epi32(x: i32x4, y: i32x4) -> i32x4; -- fn x86_mm_hsubs_epi16(x: i16x8, y: i16x8) -> i16x8; -- fn x86_mm_maddubs_epi16(x: u8x16, y: i8x16) -> i16x8; -- fn x86_mm_mulhrs_epi16(x: i16x8, y: i16x8) -> i16x8; -- fn x86_mm_shuffle_epi8(x: i8x16, y: i8x16) -> i8x16; -- fn x86_mm_sign_epi8(x: i8x16, y: i8x16) -> i8x16; -- fn x86_mm_sign_epi16(x: i16x8, y: i16x8) -> i16x8; -- fn x86_mm_sign_epi32(x: i32x4, y: i32x4) -> i32x4; --} -- --// 32 bit integers -- --pub trait Ssse3I32x4 { -- fn abs(self) -> Self; -- fn hadd(self, other: Self) -> Self; -- fn hsub(self, other: Self) -> Self; -- fn sign(self, other: Self) -> Self; --} --impl Ssse3I32x4 for i32x4 { -- #[inline] -- fn abs(self) -> Self { -- unsafe { x86_mm_abs_epi32(self) } -- } -- -- #[inline] -- fn hadd(self, other: Self) -> Self { -- unsafe { x86_mm_hadd_epi32(self, other) } -- } -- #[inline] -- fn hsub(self, other: Self) -> Self { -- unsafe { x86_mm_hsub_epi32(self, other) } -- } -- -- #[inline] -- fn sign(self, other: Self) -> Self { -- unsafe { x86_mm_sign_epi32(self, other) } -- } --} -- --pub trait Ssse3U32x4 { -- fn hadd(self, other: Self) -> Self; -- fn hsub(self, other: Self) -> Self; --} --impl Ssse3U32x4 for u32x4 { -- #[inline] -- fn hadd(self, other: Self) -> Self { -- unsafe { bitcast!(x86_mm_hadd_epi32(self, other)) } -- } -- #[inline] -- fn hsub(self, other: Self) -> Self { -- unsafe { bitcast!(x86_mm_hsub_epi32(self, other)) } -- } --} -- --// 16 bit integers -- --pub trait Ssse3I16x8 { -- fn abs(self) -> Self; -- fn hadd(self, other: Self) -> Self; -- fn hadds(self, other: Self) -> Self; -- fn hsub(self, other: Self) -> Self; -- fn hsubs(self, other: Self) -> Self; -- fn sign(self, other: Self) -> Self; -- fn mulhrs(self, other: Self) -> Self; --} --impl Ssse3I16x8 for i16x8 { -- #[inline] -- fn abs(self) -> Self { -- unsafe { x86_mm_abs_epi16(self) } -- } -- -- #[inline] -- fn hadd(self, other: Self) -> Self { -- unsafe { x86_mm_hadd_epi16(self, other) } -- } -- #[inline] -- fn hadds(self, other: Self) -> Self { -- unsafe { x86_mm_hadds_epi16(self, other) } -- } -- #[inline] -- fn hsub(self, other: Self) -> Self { -- unsafe { x86_mm_hsub_epi16(self, other) } -- } -- #[inline] -- fn hsubs(self, other: Self) -> Self { -- unsafe { x86_mm_hsubs_epi16(self, other) } -- } -- -- #[inline] -- fn sign(self, other: Self) -> Self { -- unsafe { x86_mm_sign_epi16(self, other) } -- } -- -- #[inline] -- fn mulhrs(self, other: Self) -> Self { -- unsafe { x86_mm_mulhrs_epi16(self, other) } -- } --} -- --pub trait Ssse3U16x8 { -- fn hadd(self, other: Self) -> Self; -- fn hsub(self, other: Self) -> Self; --} --impl Ssse3U16x8 for u16x8 { -- #[inline] -- fn hadd(self, other: Self) -> Self { -- unsafe { bitcast!(x86_mm_hadd_epi16(self, other)) } -- } -- #[inline] -- fn hsub(self, other: Self) -> Self { -- unsafe { bitcast!(x86_mm_hsub_epi16(self, other)) } -- } --} -- -- --// 8 bit integers -- --pub trait Ssse3U8x16 { -- fn shuffle_bytes(self, indices: Self) -> Self; -- fn maddubs(self, other: i8x16) -> i16x8; --} -- --impl Ssse3U8x16 for u8x16 { -- #[inline] -- fn shuffle_bytes(self, indices: Self) -> Self { -- unsafe {bitcast!(x86_mm_shuffle_epi8(self, indices))} -- } -- -- fn maddubs(self, other: i8x16) -> i16x8 { -- unsafe { x86_mm_maddubs_epi16(self, other) } -- } --} -- --pub trait Ssse3I8x16 { -- fn abs(self) -> Self; -- fn shuffle_bytes(self, indices: Self) -> Self; -- fn sign(self, other: Self) -> Self; --} --impl Ssse3I8x16 for i8x16 { -- #[inline] -- fn abs(self) -> Self { -- unsafe {x86_mm_abs_epi8(self)} -- } -- #[inline] -- fn shuffle_bytes(self, indices: Self) -> Self { -- unsafe { -- x86_mm_shuffle_epi8(self, indices) -- } -- } -- -- #[inline] -- fn sign(self, other: Self) -> Self { -- unsafe { x86_mm_sign_epi8(self, other) } -- } --} -diff --git a/toolkit/moz.configure b/toolkit/moz.configure -index 70416df2f6df..c1bf3721e423 100644 ---- a/toolkit/moz.configure -+++ b/toolkit/moz.configure -@@ -716,14 +716,11 @@ set_config('MOZ_ENABLE_WEBRENDER', webrender.enable) - option('--enable-rust-simd', env='MOZ_RUST_SIMD', - help='Enable explicit SIMD in Rust code.') - --@depends('--enable-rust-simd', target, rustc_info) --def rust_simd(value, target, rustc_info): -- # As of 2018-06-05, the simd crate only works on aarch64, -- # armv7, x86 and x86_64. -+@depends('--enable-rust-simd', target) -+def rust_simd(value, target): -+ # As of 2019-03-04, the simd-accel feature of encoding_rs has not -+ # been properly set up outside aarch64, armv7, x86 and x86_64. - if target.cpu in ('aarch64', 'arm', 'x86', 'x86_64') and value: -- if rustc_info and rustc_info.version >= Version('1.33.0'): -- die('--enable-rust-simd does not work with Rust 1.33 or later. ' -- 'See https://bugzilla.mozilla.org/show_bug.cgi?id=1521249 .') - return True - - set_config('MOZ_RUST_SIMD', rust_simd) --- -2.21.0 - diff --git a/network/web/firefox/files/0002-Bug-1419426-Implement-browserSettings.contextMenuSho.patch b/network/web/firefox/files/0002-Bug-1419426-Implement-browserSettings.contextMenuSho.patch deleted file mode 100644 index 822f1ee06b..0000000000 --- a/network/web/firefox/files/0002-Bug-1419426-Implement-browserSettings.contextMenuSho.patch +++ /dev/null @@ -1,254 +0,0 @@ -From f19a0f3bc5e1e87d3c663cc2b147c5c0831519c5 Mon Sep 17 00:00:00 2001 -Message-Id: -In-Reply-To: <05ec1aa0d5e8806dd0c5c6d08c82846a1389b599.1512038840.git.jan.steffens@gmail.com> -References: <05ec1aa0d5e8806dd0c5c6d08c82846a1389b599.1512038840.git.jan.steffens@gmail.com> -From: Bob Silverberg -Date: Fri, 24 Nov 2017 07:45:03 -0500 -Subject: [PATCH 2/2] Bug 1419426 - Implement - browserSettings.contextMenuShowEvent, r=kmag a=gchang - -Uplift for 58. ---- - .../components/extensions/ext-browserSettings.js | 45 ++++++++++++++++ - .../extensions/schemas/browser_settings.json | 10 ++++ - .../test/xpcshell/test_ext_browserSettings.js | 62 ++++++++++++++++++++-- - 3 files changed, 114 insertions(+), 3 deletions(-) - -diff --git a/toolkit/components/extensions/ext-browserSettings.js b/toolkit/components/extensions/ext-browserSettings.js -index f3212f351baf6975..2b24bcc1d09091f2 100644 ---- a/toolkit/components/extensions/ext-browserSettings.js -+++ b/toolkit/components/extensions/ext-browserSettings.js -@@ -2,17 +2,23 @@ - /* vim: set sts=2 sw=2 et tw=80: */ - "use strict"; - -+XPCOMUtils.defineLazyModuleGetter(this, "AppConstants", -+ "resource://gre/modules/AppConstants.jsm"); - XPCOMUtils.defineLazyModuleGetter(this, "ExtensionSettingsStore", - "resource://gre/modules/ExtensionSettingsStore.jsm"); - XPCOMUtils.defineLazyModuleGetter(this, "Services", - "resource://gre/modules/Services.jsm"); - - XPCOMUtils.defineLazyServiceGetter(this, "aboutNewTabService", - "@mozilla.org/browser/aboutnewtab-service;1", - "nsIAboutNewTabService"); - - Cu.import("resource://gre/modules/ExtensionPreferencesManager.jsm"); - -+var { -+ ExtensionError, -+} = ExtensionUtils; -+ - const HOMEPAGE_OVERRIDE_SETTING = "homepage_override"; - const HOMEPAGE_URL_PREF = "browser.startup.homepage"; - const URL_STORE_TYPE = "url_overrides"; -@@ -82,6 +88,16 @@ ExtensionPreferencesManager.addSetting("imageAnimationBehavior", { - }, - }); - -+ExtensionPreferencesManager.addSetting("contextMenuShowEvent", { -+ prefNames: [ -+ "ui.context_menus.after_mouseup", -+ ], -+ -+ setCallback(value) { -+ return {[this.prefNames[0]]: value === "mouseup"}; -+ }, -+}); -+ - this.browserSettings = class extends ExtensionAPI { - getAPI(context) { - let {extension} = context; -@@ -114,6 +130,35 @@ this.browserSettings = class extends ExtensionAPI { - () => { - return aboutNewTabService.newTabURL; - }, URL_STORE_TYPE, true), -+ contextMenuShowEvent: Object.assign( -+ getSettingsAPI( -+ extension, -+ "contextMenuShowEvent", -+ () => { -+ if (AppConstants.platform === "win") { -+ return "mouseup"; -+ } -+ let prefValue = Services.prefs.getBoolPref( -+ "ui.context_menus.after_mouseup", null); -+ return prefValue ? "mouseup" : "mousedown"; -+ } -+ ), -+ { -+ set: details => { -+ if (!["mouseup", "mousedown"].includes(details.value)) { -+ throw new ExtensionError( -+ `${details.value} is not a valid value for contextMenuShowEvent.`); -+ } -+ if (AppConstants.platform === "android" || -+ (AppConstants.platform === "win" && -+ details.value === "mousedown")) { -+ return false; -+ } -+ return ExtensionPreferencesManager.setSetting( -+ extension, "contextMenuShowEvent", details.value); -+ }, -+ } -+ ), - }, - }; - } -diff --git a/toolkit/components/extensions/schemas/browser_settings.json b/toolkit/components/extensions/schemas/browser_settings.json -index af073d933723cbd5..4f354e69dfedaf96 100644 ---- a/toolkit/components/extensions/schemas/browser_settings.json -+++ b/toolkit/components/extensions/schemas/browser_settings.json -@@ -27,28 +27,38 @@ - "type": "string", - "enum": ["normal", "none", "once"], - "description": "How images should be animated in the browser." -+ }, -+ { -+ "id": "ContextMenuMouseEvent", -+ "type": "string", -+ "enum": ["mouseup", "mousedown"], -+ "description": "After which mouse event context menus should popup." - } - ], - "properties": { - "allowPopupsForUserEvents": { - "$ref": "types.Setting", - "description": "Allows or disallows pop-up windows from opening in response to user events." - }, - "cacheEnabled": { - "$ref": "types.Setting", - "description": "Enables or disables the browser cache." - }, - "homepageOverride": { - "$ref": "types.Setting", - "description": "Returns the value of the overridden home page. Read-only." - }, - "imageAnimationBehavior": { - "$ref": "types.Setting", - "description": "Controls the behaviour of image animation in the browser. This setting's value is of type ImageAnimationBehavior, defaulting to normal." - }, - "newTabPageOverride": { - "$ref": "types.Setting", - "description": "Returns the value of the overridden new tab page. Read-only." -+ }, -+ "contextMenuShowEvent": { -+ "$ref": "types.Setting", -+ "description": "Controls after which mouse event context menus popup. This setting's value is of type ContextMenuMouseEvent, which has possible values of mouseup and mousedown." - } - } - } -diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_browserSettings.js b/toolkit/components/extensions/test/xpcshell/test_ext_browserSettings.js -index 5c441df3e4198671..7e9c1576a723dfc6 100644 ---- a/toolkit/components/extensions/test/xpcshell/test_ext_browserSettings.js -+++ b/toolkit/components/extensions/test/xpcshell/test_ext_browserSettings.js -@@ -24,13 +24,20 @@ add_task(async function test_browser_settings() { - "browser.cache.memory.enable": true, - "dom.popup_allowed_events": Preferences.get("dom.popup_allowed_events"), - "image.animation_mode": "none", -+ "ui.context_menus.after_mouseup": false, - }; - - async function background() { - browser.test.onMessage.addListener(async (msg, apiName, value) => { - let apiObj = browser.browserSettings[apiName]; -- await apiObj.set({value}); -- browser.test.sendMessage("settingData", await apiObj.get({})); -+ let result = await apiObj.set({value}); -+ if (msg === "set") { -+ browser.test.assertTrue(result, "set returns true."); -+ browser.test.sendMessage("settingData", await apiObj.get({})); -+ } else { -+ browser.test.assertFalse(result, "set returns false for a no-op."); -+ browser.test.sendMessage("no-op set"); -+ } - }); - } - -@@ -69,33 +76,82 @@ add_task(async function test_browser_settings() { - } - } - -+ async function testNoOpSetting(setting, value, expected) { -+ extension.sendMessage("setNoOp", setting, value); -+ await extension.awaitMessage("no-op set"); -+ for (let pref in expected) { -+ equal(Preferences.get(pref), expected[pref], `${pref} set correctly for ${value}`); -+ } -+ } -+ - await testSetting( - "cacheEnabled", false, - { - "browser.cache.disk.enable": false, - "browser.cache.memory.enable": false, - }); - await testSetting( - "cacheEnabled", true, - { - "browser.cache.disk.enable": true, - "browser.cache.memory.enable": true, - }); - - await testSetting( - "allowPopupsForUserEvents", false, - {"dom.popup_allowed_events": ""}); - await testSetting( - "allowPopupsForUserEvents", true, - {"dom.popup_allowed_events": PREFS["dom.popup_allowed_events"]}); - - for (let value of ["normal", "none", "once"]) { - await testSetting( - "imageAnimationBehavior", value, - {"image.animation_mode": value}); - } - -- await extension.unload(); -+ // This setting is a no-op on Android. -+ if (AppConstants.platform === "android") { -+ await testNoOpSetting("contextMenuShowEvent", "mouseup", -+ {"ui.context_menus.after_mouseup": false}); -+ } else { -+ await testSetting( -+ "contextMenuShowEvent", "mouseup", -+ {"ui.context_menus.after_mouseup": true}); -+ } - -+ // "mousedown" is also a no-op on Windows. -+ if (["android", "win"].includes(AppConstants.platform)) { -+ await testNoOpSetting("contextMenuShowEvent", "mousedown", -+ {"ui.context_menus.after_mouseup": AppConstants.platform === "win"}); -+ } else { -+ await testSetting( -+ "contextMenuShowEvent", "mousedown", -+ {"ui.context_menus.after_mouseup": false}); -+ } -+ -+ await extension.unload(); - await promiseShutdownManager(); - }); -+ -+add_task(async function test_bad_value() { -+ async function background() { -+ await browser.test.assertRejects( -+ browser.browserSettings.contextMenuShowEvent.set({value: "bad"}), -+ /bad is not a valid value for contextMenuShowEvent/, -+ "contextMenuShowEvent.set rejects with an invalid value."); -+ -+ browser.test.sendMessage("done"); -+ } -+ -+ let extension = ExtensionTestUtils.loadExtension({ -+ background, -+ manifest: { -+ permissions: ["browserSettings"], -+ }, -+ }); -+ -+ await extension.startup(); -+ await extension.awaitMessage("done"); -+ await extension.unload(); -+}); --- -2.15.1 - diff --git a/network/web/firefox/files/0002-Bug-1667736-Update-packed_simd-to-compile-on-Rust-1.patch b/network/web/firefox/files/0002-Bug-1667736-Update-packed_simd-to-compile-on-Rust-1.patch deleted file mode 100644 index 4ff6bae3c2..0000000000 --- a/network/web/firefox/files/0002-Bug-1667736-Update-packed_simd-to-compile-on-Rust-1.patch +++ /dev/null @@ -1,3514 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Henri Sivonen -Date: Fri, 30 Oct 2020 08:29:53 +0000 -Subject: [PATCH] Bug 1667736 - Update packed_simd to compile on Rust 1.48. - r=glandium - -Differential Revision: https://phabricator.services.mozilla.com/D91572 ---- - .cargo/config.in | 2 +- - Cargo.lock | 4 +- - Cargo.toml | 2 +- - .../rust/packed_simd/.cargo-checksum.json | 2 +- - third_party/rust/packed_simd/.travis.yml | 237 +++++------- - third_party/rust/packed_simd/Cargo.toml | 14 +- - .../rust/packed_simd/{readme.md => README.md} | 107 ++---- - third_party/rust/packed_simd/build.rs | 2 +- - third_party/rust/packed_simd/ci/all.sh | 2 +- - .../aarch64-unknown-linux-gnu/Dockerfile | 2 +- - .../arm-unknown-linux-gnueabi/Dockerfile | 2 +- - .../arm-unknown-linux-gnueabihf/Dockerfile | 2 +- - .../armv7-unknown-linux-gnueabihf/Dockerfile | 2 +- - .../docker/i586-unknown-linux-gnu/Dockerfile | 2 +- - .../docker/i686-unknown-linux-gnu/Dockerfile | 2 +- - .../docker/mips-unknown-linux-gnu/Dockerfile | 2 +- - .../mips64-unknown-linux-gnuabi64/Dockerfile | 2 +- - .../Dockerfile | 2 +- - .../mipsel-unknown-linux-musl/Dockerfile | 4 +- - .../powerpc-unknown-linux-gnu/Dockerfile | 3 +- - .../powerpc64-unknown-linux-gnu/Dockerfile | 2 +- - .../powerpc64le-unknown-linux-gnu/Dockerfile | 2 +- - .../Dockerfile | 2 +- - .../x86_64-unknown-linux-gnu/Dockerfile | 2 +- - third_party/rust/packed_simd/ci/dox.sh | 7 +- - third_party/rust/packed_simd/ci/run.sh | 6 +- - .../rust/packed_simd/ci/setup_benchmarks.sh | 3 - - third_party/rust/packed_simd/src/api.rs | 13 +- - .../rust/packed_simd/src/api/bit_manip.rs | 1 + - .../rust/packed_simd/src/api/bitmask.rs | 82 +++++ - .../rust/packed_simd/src/api/cast/v128.rs | 2 +- - .../rust/packed_simd/src/api/cast/v16.rs | 2 +- - .../rust/packed_simd/src/api/cast/v256.rs | 2 +- - .../rust/packed_simd/src/api/cast/v32.rs | 2 +- - .../rust/packed_simd/src/api/cast/v512.rs | 2 +- - .../rust/packed_simd/src/api/cast/v64.rs | 2 +- - .../rust/packed_simd/src/api/default.rs | 2 + - .../packed_simd/src/api/from/from_array.rs | 2 + - third_party/rust/packed_simd/src/api/hash.rs | 2 + - .../src/api/into_bits/arch_specific.rs | 3 +- - .../packed_simd/src/api/into_bits/v128.rs | 2 +- - .../rust/packed_simd/src/api/into_bits/v16.rs | 2 +- - .../packed_simd/src/api/into_bits/v256.rs | 2 +- - .../rust/packed_simd/src/api/into_bits/v32.rs | 2 +- - .../packed_simd/src/api/into_bits/v512.rs | 2 +- - .../rust/packed_simd/src/api/into_bits/v64.rs | 2 +- - .../rust/packed_simd/src/api/minimal/iuf.rs | 6 +- - .../rust/packed_simd/src/api/minimal/mask.rs | 6 +- - .../rust/packed_simd/src/api/minimal/ptr.rs | 28 +- - .../src/api/ops/vector_float_min_max.rs | 5 + - .../packed_simd/src/api/ptr/gather_scatter.rs | 36 +- - .../src/api/reductions/float_arithmetic.rs | 13 +- - .../packed_simd/src/api/reductions/min_max.rs | 4 + - .../packed_simd/src/api/slice/from_slice.rs | 6 +- - .../src/api/slice/write_to_slice.rs | 6 +- - third_party/rust/packed_simd/src/codegen.rs | 3 + - .../rust/packed_simd/src/codegen/bit_manip.rs | 2 +- - .../rust/packed_simd/src/codegen/llvm.rs | 8 + - .../src/codegen/reductions/mask/x86.rs | 8 +- - .../src/codegen/reductions/mask/x86/sse.rs | 32 -- - .../rust/packed_simd/src/codegen/shuffle.rs | 348 +++++------------- - .../packed_simd/src/codegen/shuffle1_dyn.rs | 35 +- - .../rust/packed_simd/src/codegen/vPtr.rs | 2 + - third_party/rust/packed_simd/src/lib.rs | 29 +- - third_party/rust/packed_simd/src/masks.rs | 2 + - third_party/rust/packed_simd/src/sealed.rs | 15 +- - .../rust/packed_simd/src/testing/utils.rs | 25 +- - third_party/rust/packed_simd/src/v128.rs | 32 +- - third_party/rust/packed_simd/src/v16.rs | 6 +- - third_party/rust/packed_simd/src/v256.rs | 32 +- - third_party/rust/packed_simd/src/v32.rs | 12 +- - third_party/rust/packed_simd/src/v512.rs | 32 +- - third_party/rust/packed_simd/src/v64.rs | 26 +- - third_party/rust/packed_simd/src/vPtr.rs | 2 +- - third_party/rust/packed_simd/src/vSize.rs | 20 +- - .../rust/packed_simd/tests/endianness.rs | 62 ++-- - 76 files changed, 605 insertions(+), 788 deletions(-) - rename third_party/rust/packed_simd/{readme.md => README.md} (54%) - create mode 100644 third_party/rust/packed_simd/src/api/bitmask.rs - -diff --git a/.cargo/config.in b/.cargo/config.in -index 4f87ad00fb470..b0e726869f032 100644 ---- a/.cargo/config.in -+++ b/.cargo/config.in -@@ -45,7 +45,7 @@ tag = "v0.4.2" - [source."https://github.com/hsivonen/packed_simd"] - git = "https://github.com/hsivonen/packed_simd" - replace-with = "vendored-sources" --rev = "3541e3818fdc7c2a24f87e3459151a4ce955a67a" -+rev = "0917fe780032a6bbb23d71be545f9c1834128d75" - - [source."https://github.com/gfx-rs/naga"] - git = "https://github.com/gfx-rs/naga" -diff --git a/Cargo.lock b/Cargo.lock -index 4e817cbfd2e6f..f41b68f6c745a 100644 ---- a/Cargo.lock -+++ b/Cargo.lock -@@ -3545,8 +3545,8 @@ dependencies = [ - - [[package]] - name = "packed_simd" --version = "0.3.3" --source = "git+https://github.com/hsivonen/packed_simd?rev=3541e3818fdc7c2a24f87e3459151a4ce955a67a#3541e3818fdc7c2a24f87e3459151a4ce955a67a" -+version = "0.3.4" -+source = "git+https://github.com/hsivonen/packed_simd?rev=0917fe780032a6bbb23d71be545f9c1834128d75#0917fe780032a6bbb23d71be545f9c1834128d75" - dependencies = [ - "cfg-if", - ] -diff --git a/Cargo.toml b/Cargo.toml -index d1b826e2b388a..f78c9a7408d94 100644 ---- a/Cargo.toml -+++ b/Cargo.toml -@@ -65,7 +65,7 @@ panic = "abort" - - [patch.crates-io] - libudev-sys = { path = "dom/webauthn/libudev-sys" } --packed_simd = { git = "https://github.com/hsivonen/packed_simd", rev="3541e3818fdc7c2a24f87e3459151a4ce955a67a" } -+packed_simd = { git = "https://github.com/hsivonen/packed_simd", rev="0917fe780032a6bbb23d71be545f9c1834128d75" } - rlbox_lucet_sandbox = { git = "https://github.com/PLSysSec/rlbox_lucet_sandbox/", rev="ed8bac8812e9f335d5fadd0f4ece96981aba88a3" } - nix = { git = "https://github.com/shravanrn/nix/", branch = "r0.13.1", rev="4af6c367603869a30fddb5ffb0aba2b9477ba92e" } - spirv_cross = { git = "https://github.com/kvark/spirv_cross", branch = "wgpu3", rev = "20191ad2f370afd6d247edcb9ff9da32d3bedb9c" } -diff --git a/third_party/rust/packed_simd/.cargo-checksum.json b/third_party/rust/packed_simd/.cargo-checksum.json -index 01afcc1efdacd..1512803e57292 100644 ---- a/third_party/rust/packed_simd/.cargo-checksum.json -+++ b/third_party/rust/packed_simd/.cargo-checksum.json -@@ -1 +1 @@ --{"files":{".appveyor.yml":"f1ed01850e0d725f9498f52a1a63ddf40702ad6e0bf5b2d7c4c04d76e96794a3",".travis.yml":"e9258d9a54fdaf4cbc12405fe5993ac4497eb2b29021691dbc91b19cb9b52227","Cargo.toml":"089941ba3c89ea111cbea3cc3abdcdcf2b9d0ae0db268d7269ee38226db950e5","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","bors.toml":"dee881dc69b9b7834e4eba5d95c3ed5a416d4628815a167d6a22d4cb4fb064b8","build.rs":"f3baefc5e5bb9b250e762a1466371b922fd7ee4243c217b2d014307603c2f57a","ci/all.sh":"a23d14e10cb26a0eb719e389c30eb955fa53cddcd436890646df09af640bd2eb","ci/android-install-ndk.sh":"0f1746108cc30bf9b9ba45bcde7b19fc1a8bdf5b0258035b4eb8dc69b75efac4","ci/android-install-sdk.sh":"3490432022c5c8f5a115c084f7a9aca1626f96c0c87ffb62019228c4346b47e4","ci/android-sysimage.sh":"ebf4e5daa1f0fe1b2092b79f0f3f161c4c4275cb744e52352c4d81ab451e4c5a","ci/benchmark.sh":"b61d19ef6b90deba8fb79dee74c8b062d94844676293da346da87bb78a9a49a4","ci/deploy_and_run_on_ios_simulator.rs":"ec8ecf82d92072676aa47f0d1a3d021b60a7ae3531153ef12d2ff4541fc294dc","ci/docker/aarch64-linux-android/Dockerfile":"ace2e7d33c87bc0f6d3962a4a3408c04557646f7f51ab99cfbf574906796b016","ci/docker/aarch64-unknown-linux-gnu/Dockerfile":"1ecdac757101d951794fb2ab0deaa278199cf25f2e08a15c7d40ff31a8556184","ci/docker/arm-linux-androideabi/Dockerfile":"370e55d3330a413a3ccf677b3afb3e0ef9018a5fab263faa97ae8ac017fc2286","ci/docker/arm-unknown-linux-gnueabi/Dockerfile":"e25d88f6c0c94aada3d2e3f08243f755feb7e869dc5dc505b3799719cb1af591","ci/docker/arm-unknown-linux-gnueabihf/Dockerfile":"f126f4c7bae8c11ab8b16df06ad997863f0838825a9c08c9899a3eedb6d570bd","ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile":"b647545c158ee480a4c581dbdc1f57833aef056c8d498acc04b573e842bf803c","ci/docker/i586-unknown-linux-gnu/Dockerfile":"0d492759017307ccf74dc2aa4a8cf6623daf3dc728c708dc2b18fa7940800cba","ci/docker/i686-unknown-linux-gnu/Dockerfile":"0d492759017307ccf74dc2aa4a8cf6623daf3dc728c708dc2b18fa7940800cba","ci/docker/mips-unknown-linux-gnu/Dockerfile":"323776469bb7b160385f3621d66e3ee14c75242f8180f916e65af048a29d4ea0","ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile":"c647f6948a9a43b0be695cbed4eac752120d0faf28e5e69c718cb10406921dab","ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile":"77bfd00cc8639509be381b394f077e39b45a00158ad61b4e1656714c714665d1","ci/docker/mipsel-unknown-linux-musl/Dockerfile":"ec5bea6c98a3b626731fdb95f9ff2d1182639c76e8fb16d3271d0fc884901524","ci/docker/powerpc-unknown-linux-gnu/Dockerfile":"4f2b662de66e83d1354f650b7077692309637f786c2ea5516c31b5c2ee10af2d","ci/docker/powerpc64-unknown-linux-gnu/Dockerfile":"a9595402b772bc365982e22a0096a8988825d90b09b5faa97ab192e76072f71d","ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile":"df3c381c157439695ae8cd10ab71664702c061e3b4ab22906a5ad6c2680acfed","ci/docker/s390x-unknown-linux-gnu/Dockerfile":"93fb44df3d7fd31ead158570667c97b5076a05c3d968af4a84bc13819a8f2db8","ci/docker/sparc64-unknown-linux-gnu/Dockerfile":"da1c39a3ff1fe22e41395fa7c8934e90b4c1788e551b9aec6e38bfd94effc437","ci/docker/thumbv7neon-linux-androideabi/Dockerfile":"c2decd5591bd7a09378901bef629cd944acf052eb55e4f35b79eb9cb4d62246a","ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile":"75c0c56161c7382b439de74c00de1c0e3dc9d59560cd6720976a751034b78714","ci/docker/wasm32-unknown-unknown/Dockerfile":"3e5f294bc1e004aa599086c2af49d6f3e7459fa250f5fbdd60cf67d53db78758","ci/docker/x86_64-linux-android/Dockerfile":"685040273cf350d5509e580ac451555efa19790c8723ca2af066adadc6880ad2","ci/docker/x86_64-unknown-linux-gnu-emulated/Dockerfile":"44b6203d9290bfdc53d81219f0937e1110847a23dd982ec8c4de388354f01536","ci/docker/x86_64-unknown-linux-gnu/Dockerfile":"d253c86803b22da428fa9cc671a05f18d3318eca7733b8dccb4f7be1ddf524c5","ci/dox.sh":"5b61711be47a4e3dde0ddd15ba73d256ea95fd75af3897732c24db1dc7e66366","ci/linux-s390x.sh":"d6b732d7795b4ba131326aff893bca6228a7d2eb0e9402f135705413dbbe0dce","ci/linux-sparc64.sh":"c92966838b1ab7ad3b7a344833ee726aba6b647cf5952e56f0ad1ba420b13325","ci/lld-shim.rs":"3d7f71ec23a49e2b67f694a0168786f9a954dda15f5a138815d966643fd3fcc3","ci/max_line_width.sh":"0a1518bba4c9ecaa55694cb2e9930d0e19c265baabf73143f17f9cf285aaa5bb","ci/run-docker.sh":"92e036390ad9b0d16f109579df1b5ced2e72e9afea40c7d011400ebd3a2a90de","ci/run.sh":"63259e22a96ba539f53c06b1b39f53e3a78a71171652e7afc170836110ccd913","ci/run_examples.sh":"d1a23c6c35374a0678ba5114b9b8fefd8be0a79e774872a8bf0898d1baca18d0","ci/runtest-android.rs":"145a8e9799a5223975061fe7e586ade5669ee4877a7d7a4cf6b4ab48e8e36c7c","ci/setup_benchmarks.sh":"73fb981a8fdb1dcd54409d3c0fbbfb8f77a3ceabf8626a6b9bf9d21d6bc8ce72","ci/test-runner-linux":"c8aa6025cff5306f4f31d0c61dc5f9d4dd5a1d189ab613ef8d4c367c694d9ccd","contributing.md":"2cc8c9c560ae17867e69b06d09b758dbf7bc39eb774ada50a743724b10acc0a2","perf-guide/.gitignore":"fe82c7da551079d832cf74200b0b359b4df9828cb4a0416fa7384f07a2ae6a13","perf-guide/book.toml":"115a98284126c6b180178b44713314cc494f08a71662ee2ce15cf67f17a51064","perf-guide/src/SUMMARY.md":"3e03bffc991fdc2050f3d51842d72d9d21ea6abab56a3baf3b2d5973a78b89e1","perf-guide/src/ascii.css":"29afb08833b2fe2250f0412e1fa1161a2432a0820a14953c87124407417c741a","perf-guide/src/bound_checks.md":"5e4991ff58a183ef0cd9fdc1feb4cd12d083b44bdf87393bbb0927808ef3ce7d","perf-guide/src/float-math/approx.md":"8c09032fa2d795a0c5db1775826c850d28eb2627846d0965c60ee72de63735ad","perf-guide/src/float-math/fma.md":"311076ba4b741d604a82e74b83a8d7e8c318fcbd7f64c4392d1cf5af95c60243","perf-guide/src/float-math/fp.md":"04153e775ab6e4f0d7837bcc515230d327b04edfa34c84ce9c9e10ebaeef2be8","perf-guide/src/float-math/svml.md":"0798873b8eedaeda5fed62dc91645b57c20775a02d3cd74d8bd06958f1516506","perf-guide/src/introduction.md":"9f5a19e9e6751f25d2daad39891a0cc600974527ec4c8305843f9618910671bd","perf-guide/src/prof/linux.md":"447731eb5de7d69166728fdbc5ecb0c0c9db678ea493b45a592d67dd002184c0","perf-guide/src/prof/mca.md":"f56d54f3d20e7aa4d32052186e8237b03d65971eb5d112802b442570ff11d344","perf-guide/src/prof/profiling.md":"8a650c0fd6ede0964789bb6577557eeef1d8226a896788602ce61528e260e43c","perf-guide/src/target-feature/attribute.md":"615f88dca0a707b6c416fa605435dd6e1fb5361cc639429cbf68cd87624bd78b","perf-guide/src/target-feature/features.md":"17077760ff24c006b606dd21889c53d87228f4311f3ba3a574f9afdeacd86165","perf-guide/src/target-feature/inlining.md":"7ed1d7068d8173a00d84c16cfe5871cd68b9f04f8d0cca2d01ebc84957ebf2f6","perf-guide/src/target-feature/practice.md":"c4b371842e0086df178488fec97f20def8f0c62ee588bcd25fd948b9b1fa227e","perf-guide/src/target-feature/runtime.md":"835425f5ee597fb3e51d36e725a81ebee29f4561231d19563cd4da81dbb1cfcb","perf-guide/src/target-feature/rustflags.md":"ab49712e9293a65d74d540ba4784fcb57ff1119ec05a575d895c071f1a620f64","perf-guide/src/vert-hor-ops.md":"c6211c0ee91e60552ec592d89d9d957eedc21dee3cbd89e1ad6765ea06a27471","readme.md":"585a8f0e16877fb9abb00cd17a175fcb9d7857840c6c61209f1827ffab095070","rustfmt.toml":"de6101d0670bad65fb3b337d56957d2a024e017e5ab146ec784d77312daaf8ff","src/api.rs":"331a3a4abb19cee2df5f2df4ad7c3e88b45e62cf23fdacfc9bbaa633dc5cf788","src/api/bit_manip.rs":"e68290ee679cc5abc9c73afbe635c1035f8cbfe849e5c751a1680e459244c39e","src/api/cast.rs":"03b94a3d316ac7b7be7068810044911e965e889a0ace7bae762749ca74a92747","src/api/cast/macros.rs":"b0a14d0c83ad2ebb7a275180f6d9e3f2bc312ba57a7d3d6c39fad4e0f20f9408","src/api/cast/v128.rs":"63e28c6a3edf1a7a635f51b8d3c6adbb1d46f884d92a196b3d4a6e743d809416","src/api/cast/v16.rs":"2a584eeb57fd47baad6f3533764301b04aaaac23702b7a8db12598ac02899262","src/api/cast/v256.rs":"b91c15ed8d1536ecd97b4eb79ff9d5aba0552cd9b6f0ea6435b05f2273e23b3a","src/api/cast/v32.rs":"62ec89fcce7fa7f28497ee5770adc8f81d2d3a6b2925b02f7dc06504c40e8f38","src/api/cast/v512.rs":"d855cb943ae7106e9599ef38e30a3afb1c6bd5433178baca54cb128fd9a7d143","src/api/cast/v64.rs":"fe0f7dfaf4fc0c0c1a78c96fcfcdfdc2a1e2845843b11aa797a0c6fb52a8f774","src/api/cmp.rs":"357c3a2a09c6d4611c32dd7fa95be2fae933d513e229026ec9b44451a77b884e","src/api/cmp/eq.rs":"60f70f355bae4cb5b17db53204cacc3890f70670611c17df638d4c04f7cc8075","src/api/cmp/ord.rs":"589f7234761c294fa5df8f525bc4acd5a47cdb602207d524a0d4e19804cd9695","src/api/cmp/partial_eq.rs":"3ed23d2a930b0f9750c3a5309da766b03dc4f9c4d375b42ad3c50fe732693d15","src/api/cmp/partial_ord.rs":"e16b11805c94048acd058c93994b5bc74bb187f8d7e3b86a87df60e1601467f9","src/api/cmp/vertical.rs":"de3d62f38eba817299aa16f1e1939954c9a447e316509397465c2830852ba053","src/api/default.rs":"b61f92fc0e33a2633b3375eb405beba480da071cde03df4d437d8a6058afcd97","src/api/fmt.rs":"67fb804bb86b6cd77cf8cd492b5733ce437071b66fe3297278b8a6552c325dda","src/api/fmt/binary.rs":"35cb5c266197d6224d598fb3d286e5fe48ef0c01ed356c2ff6fe9ba946f96a92","src/api/fmt/debug.rs":"aa18eea443bf353fea3db8b1a025132bbcaf91e747ecfa43b8d9fce9af395a0c","src/api/fmt/lower_hex.rs":"69d5be366631af309f214e8031c8c20267fcc27a695eac6f45c6bc1df72a67e6","src/api/fmt/octal.rs":"9eb11ba3d990213f3c7f1ec25edba7ce997cb1320e16d308c83498ba6b9bfbd9","src/api/fmt/upper_hex.rs":"a4637d085b7bb20e759ce58e08435b510a563ba3dd468af2b03560fdc5511562","src/api/from.rs":"2e599d8329cb05eaf06224cc441355c4b7b51254fc19256619333be8c149d444","src/api/from/from_array.rs":"4151593c7bba7455821fffa5b59867005a77c95d32f1f0cc3fd87294000157d9","src/api/from/from_vector.rs":"9764371aa9e6005aace74dea14f59e5611a095b7cf42707940924749282c52f0","src/api/hash.rs":"562cfa3f1d8eb9a733c035a3665a599c2f1e341ee820d8fbdd102a4398a441bc","src/api/into_bits.rs":"82297f0697d67b5a015e904e7e6e7b2a7066ba825bc54b94b4ff3e22d7a1eefb","src/api/into_bits/arch_specific.rs":"1f925390b0ce7132587d95f2419c6e2ad3e1a9d17eb1d9c120a1c1c4bdf4277e","src/api/into_bits/macros.rs":"d762406de25aedff88d460dec7a80dc8e825a2a419d53218ce007efa6a1d3e04","src/api/into_bits/v128.rs":"ecdc5893664c71d7ab1ff3697c3fbe490d20d8748b9b76881d05e7625e40d74c","src/api/into_bits/v16.rs":"5459ec7dad1ad7bd30dc7e48374580b993abf23701d9c3cb22203fa0a9aabb6d","src/api/into_bits/v256.rs":"90ea351da0380ead1bf0f63b620afd40d01d638d09f7e7be31840bd2c1d9c663","src/api/into_bits/v32.rs":"ee1dc5a430050e16f51154b5fe85b1536f5feddf2ea23dd1d3859b67c4afc6fc","src/api/into_bits/v512.rs":"f72098ed1c9a23944f3d01abaf5e0f2d0e81d35a06fdadd2183e896d41b59867","src/api/into_bits/v64.rs":"6394462facdfe7827349c742b7801f1291e75a720dfb8c0b52100df46f371c98","src/api/math.rs":"8b2a2fc651917a850539f993aa0b9e5bf4da67b11685285b8de8cdca311719ec","src/api/math/float.rs":"61d2794d68262a1090ae473bd30793b5f65cf732f32a6694a3af2ce5d9225616","src/api/math/float/abs.rs":"5b6b2701e2e11135b7ce58a05052ea8120e10e4702c95d046b9d21b827b26bf8","src/api/math/float/consts.rs":"78acba000d3fa527111300b6327c1932de9c4c1e02d4174e1a5615c01463d38c","src/api/math/float/cos.rs":"4c2dd7173728ef189314f1576c9486e03be21b7da98843b2f9011282a7979e31","src/api/math/float/exp.rs":"7c6d5f1e304f498a01cfa23b92380c815d7da0ad94eae3483783bc377d287eef","src/api/math/float/ln.rs":"54c7583f3df793b39ff57534fade27b41bb992439e5dc178252f5ca3190a3e54","src/api/math/float/mul_add.rs":"62cac77660d20159276d4c9ef066eb90c81cbddb808e8e157182c607625ad2eb","src/api/math/float/mul_adde.rs":"bae056ee9f3a70df39ec3c3b2f6437c65303888a7b843ef1a5bcf1f5aca0e602","src/api/math/float/powf.rs":"9ddb938984b36d39d82a82f862f80df8f7fb013f1d222d45698d41d88472f568","src/api/math/float/recpre.rs":"589225794ff1dbf31158dff660e6d4509ecc8befbb57c633900dea5ac0b840d6","src/api/math/float/rsqrte.rs":"a32abdcc318d7ccc8448231f54d75b884b7cbeb03a7d595713ab6243036f4dbf","src/api/math/float/sin.rs":"cbd3622b7df74f19691743001c8cf747a201f8977ad90542fee915f37dcd1e49","src/api/math/float/sqrt.rs":"0c66d5d63fb08e4d99c6b82a8828e41173aff1ac9fa1a2764a11fac217ccf2ac","src/api/math/float/sqrte.rs":"731e1c9f321b662accdd27dacb3aac2e8043b7aecb2f2161dde733bd9f025362","src/api/minimal.rs":"1f22bcc528555444e76de569ec0ae2029b9ae9d04805efeafa93369c8098036b","src/api/minimal/iuf.rs":"c501a6696950cf5e521765f178de548af64fdfb6e10d026616d09fab93ca2d17","src/api/minimal/mask.rs":"42e415f536c5193d0218f5a754b34b87fd7c971bff068009f958712166ff056d","src/api/minimal/ptr.rs":"a9ee482d1dd1c956fb8f3f179e6e620b1de4e9d713961461d4c6923a4ef2e67c","src/api/ops.rs":"3e273b277a0f3019d42c3c59ca94a5afd4885d5ae6d2182e5089bbeec9de42ee","src/api/ops/scalar_arithmetic.rs":"d2d5ad897a59dd0787544f927e0e7ca4072c3e58b0f4a2324083312b0d5a21d7","src/api/ops/scalar_bitwise.rs":"482204e459ca6be79568e1c9f70adbe2d2151412ddf122fb2161be8ebb51c40c","src/api/ops/scalar_mask_bitwise.rs":"c250f52042e37b22d57256c80d4604104cfd2fbe2a2e127c676267270ca5d350","src/api/ops/scalar_shifts.rs":"987f8fdebeedc16e3d77c1b732e7826ef70633c541d16dfa290845d5c6289150","src/api/ops/vector_arithmetic.rs":"ddca15d09ddeef502c2ed66117a62300ca65d87e959e8b622d767bdf1c307910","src/api/ops/vector_bitwise.rs":"b3968f7005b649edcc22a54e2379b14d5ee19045f2e784029805781ae043b5ee","src/api/ops/vector_float_min_max.rs":"f5155dce75219f4ba11275b1f295d2fdcddd49d174a6f1fb2ace7ea42813ce41","src/api/ops/vector_int_min_max.rs":"a378789c6ff9b32a51fbd0a97ffd36ed102cd1fe6a067d2b02017c1df342def6","src/api/ops/vector_mask_bitwise.rs":"5052d18517d765415d40327e6e8e55a312daaca0a5e2aec959bfa54b1675f9c8","src/api/ops/vector_neg.rs":"5c62f6b0221983cdbd23cd0a3af3672e6ba1255f0dfe8b19aae6fbd6503e231b","src/api/ops/vector_rotates.rs":"03cbe8a400fd7c688e4ee771a990a6754f2031b1a59b19ae81158b21471167e5","src/api/ops/vector_shifts.rs":"9bf69d0087268f61009e39aea52e03a90f378910206b6a28e8393178b6a5d0e0","src/api/ptr.rs":"8a793251bed6130dcfb2f1519ceaa18b751bbb15875928d0fb6deb5a5e07523a","src/api/ptr/gather_scatter.rs":"9ddd960365e050674b25b2fd3116e24d94669b4375d74e71c03e3f1469576066","src/api/reductions.rs":"ae5baca81352ecd44526d6c30c0a1feeda475ec73ddd3c3ec6b14e944e5448ee","src/api/reductions/bitwise.rs":"8bf910ae226188bd15fc7e125f058cd2566b6186fcd0cd8fd020f352c39ce139","src/api/reductions/float_arithmetic.rs":"e58c8c87806a95df2b2b5b48ac5991036df024096d9d7c171a480fe9282896a4","src/api/reductions/integer_arithmetic.rs":"47471da1c5f859489680bb5d34ced3d3aa20081c16053a3af121a4496fcb57bf","src/api/reductions/mask.rs":"db83327a950e33a317f37fd33ca4e20c347fb415975ec024f3e23da8509425af","src/api/reductions/min_max.rs":"f27be3aa28e1c1f46de7890198db6e12f00c207085e89ef2de7e57ee443cdb98","src/api/select.rs":"a98e2ccf9fc6bdeed32d337c8675bc96c2fbe2cc34fbf149ad6047fb8e749774","src/api/shuffle.rs":"da58200790868c09659819322a489929a5b6e56c596ed07e6a44293ea02e7d09","src/api/shuffle1_dyn.rs":"bfea5a91905b31444e9ef7ca6eddb7a9606b7e22d3f71bb842eb2795a0346620","src/api/slice.rs":"ee87484e8af329547b9a5d4f2a69e8bed6ea10bbd96270d706083843d4eea2ac","src/api/slice/from_slice.rs":"4d4fe8a329c885fcb4fbcbedf99efb15a95296fe6b3f595056cc37037450d5ac","src/api/slice/write_to_slice.rs":"f5b23b2c4b91cfb26b713a9013a6c0da7f45eaefb79ba06dcbc27f3f23bda679","src/api/swap_bytes.rs":"4a6792a2e49a77475e1b237592b4b2804dbddb79c474331acd0dd71b36934259","src/codegen.rs":"c6eebc3d3665420aa6a2f317977e3c41a4f43e0550ac630cdbe8e4bbed5e2031","src/codegen/bit_manip.rs":"5559e095105a80003e0de35af1d19b0c65c9ab04eb743c7e01c5442d882eb34e","src/codegen/llvm.rs":"d1299c189abb17a6133f047574cffc7a6db4c1be37cb7d4785491cb5e8f8cf54","src/codegen/math.rs":"35f96e37a78fcf0cdb02146b7f27a45108fe06a37fc2a54d8851ce131a326178","src/codegen/math/float.rs":"dd86c0449e576c83b719700962ac017c332987fac08d91f2b7a2b1b883598170","src/codegen/math/float/abs.rs":"f56e2b4b8055ea861c1f5cbc6b6e1d8e7e5af163b62c13574ddee4e09513bfbc","src/codegen/math/float/cos.rs":"ef3b511a24d23045b310315e80348a9b7fedb576fc2de52d74290616a0abeb2a","src/codegen/math/float/cos_pi.rs":"4e7631a5d73dac21531e09ef1802d1180f8997509c2c8fa9f67f322194263a97","src/codegen/math/float/exp.rs":"61b691598c41b5622f24e4320c1bdd08701e612a516438bdddcc728fc3405c8c","src/codegen/math/float/ln.rs":"46b718b1ba8c9d99e1ad40f53d20dfde08a3063ca7bd2a9fdd6698e060da687e","src/codegen/math/float/macros.rs":"dd42135fff13f9aca4fd3a1a4e14c7e6c31aadc6d817d63b0d2fb9e62e062744","src/codegen/math/float/mul_add.rs":"a37bf764345d4b1714f97e83897b7cf0855fc2811704bcbc0012db91825339e1","src/codegen/math/float/mul_adde.rs":"c75702bfcb361de45964a93caf959a695ef2376bd069227600b8c6872665c755","src/codegen/math/float/powf.rs":"642346e982bc4c39203de0864d2149c4179cd7b21cf67a2951687932b4675872","src/codegen/math/float/sin.rs":"9d68164c90cdca6a85155040cdac42e27342ebe0b925273ef1593df721af4258","src/codegen/math/float/sin_cos_pi.rs":"9be02ad48585a1e8d99129382fbffbaed47852f15459256a708850b6b7a75405","src/codegen/math/float/sin_pi.rs":"9890347905b4d4a3c7341c3eb06406e46e60582bcf6960688bd727e5dadc6c57","src/codegen/math/float/sqrt.rs":"e3c60dcfb0c6d2fc62adabcc931b2d4040b83cab294dea36443fb4b89eb79e34","src/codegen/math/float/sqrte.rs":"f0f4ef9eb475ae41bcc7ec6a95ad744ba6b36925faa8b2c2814004396d196b63","src/codegen/pointer_sized_int.rs":"a70697169c28218b56fd2e8d5353f2e00671d1150d0c8cef77d613bdfacd84cb","src/codegen/reductions.rs":"645e2514746d01387ddd07f0aa4ffd8430cc9ab428d4fb13773ea319fa25dd95","src/codegen/reductions/mask.rs":"8f1afe6aabf096a3278e1fc3a30f736e04aa8b9ce96373cee22162d18cfe2702","src/codegen/reductions/mask/aarch64.rs":"cba6e17603d39795dcfe8339b6b7d8714c3e162a1f0a635979f037aa24fe4206","src/codegen/reductions/mask/arm.rs":"9447904818aa2c7c25d0963eead452a639a11ca7dbd6d21eedbfcaade07a0f33","src/codegen/reductions/mask/fallback.rs":"7a0ef9f7fd03ae318b495b95e121350cd61caffc5cc6ee17fabf130d5d933453","src/codegen/reductions/mask/fallback_impl.rs":"76547f396e55ef403327c77c314cf8db8c7a5c9b9819bfb925abeacf130249e5","src/codegen/reductions/mask/x86.rs":"14bd2c482071f2355beebcf7b7ecf950ff2dfcdb08c3ca50993092434a9de717","src/codegen/reductions/mask/x86/avx.rs":"b4913d87844c522903641cbbf10db4551addb1ce5e9e78278e21612fa65c733b","src/codegen/reductions/mask/x86/avx2.rs":"677aed3f056285285daa3adff8bc65e739630b4424defa6d9665e160f027507e","src/codegen/reductions/mask/x86/sse.rs":"226610b4ff88c676d5187114dd57b4a8800de6ce40884675e9198445b1ed0306","src/codegen/reductions/mask/x86/sse2.rs":"bc38e6c31cb4b3d62147eba6cac264e519e2a48e0f7ce9010cfa9ef0cf0ec9fd","src/codegen/shuffle.rs":"0abca97e92cdce49a58a39cc447eb09dc7d7715ef256c8dbd2181a186e61bb64","src/codegen/shuffle1_dyn.rs":"04523e9338133bdedb012dd076c2c564b79ce5593b0fc56d0fb6910e04190a81","src/codegen/swap_bytes.rs":"1d6cdc716eadddc92b4fd506b2445a821caa8dc00860447de09d7ebd69c2087f","src/codegen/v128.rs":"94226b31ec403d18d9d2fe06713f147c9c79e9b5f9105089088266313f843185","src/codegen/v16.rs":"ddec4ffb66b6f7aaffb9a1780c5ddba82557abd74f45073d335047e04cf74924","src/codegen/v256.rs":"6b63917f0444118d6b1595bff2045e59b97c4d24012bd575f69f1f0efc5a0241","src/codegen/v32.rs":"3477b3c5540aed86e61e2f5807dd31db947413cec9181c587d93ed6ec74f0eba","src/codegen/v512.rs":"5854f99d3aabc4cd42b28a20d9ce447756dc2ba024a409a69b6a8ae1f1842fc5","src/codegen/v64.rs":"e9e89caebfe63d10c0cbca61e4dfdba3b7e02ee0989170f80beed23237ddd950","src/codegen/vPtr.rs":"96d609a9eece4dcbbcc01ba0b8744d7f5958be12774176a2945bc676f4e6b5cb","src/codegen/vSize.rs":"eeee9858749aa82142b27bc120d1989bb74a6b82e1e4efbbeaccc9634dc9acfc","src/lib.rs":"1b5d419ff05ee0370d671810423ccc254708cc8d415c1dbac2a7a36be4bf63a8","src/masks.rs":"870f429967b2d7d5133f4d28d6c753fc5cef0570b27b29d4e966a066d22d2d0e","src/sealed.rs":"ff7f0324276408ae8249941cfa32c90b8835a54d750896b683efea857af19db2","src/testing.rs":"1d3a7862ef625e235a5734ad7204e68d350f902c0695182b1f08a0552432416e","src/testing/macros.rs":"6378856d7a40ba5ec5c7c0dad6327d79f0c77266921c24296d10aed6c68e9b98","src/testing/utils.rs":"d6fd5a5017f1f85d9d99585754f8f6ad06fc3d683b34083543e67a7cc6c1772c","src/v128.rs":"18fe263c4aa28cd06461c7070b0269f69f4a2e75749b8f142a83dfdfe4d22bf5","src/v16.rs":"e5c663c9fb3547eaeac78a5f7db9969f4d8b5ec96112bf2954602fff11f0aebd","src/v256.rs":"68732cd688ad12a56d8b4f8ddf279f77bdfe1be2943c7dc0c1b4f1a76798aa0f","src/v32.rs":"785b22a1ccb4a41bb53dfeb0670f624c0ce42e6cdf62d1747e3283777a1c70bd","src/v512.rs":"d1337bfe07f06a8f37f8e8fa7d4315b9307476ee435ad80dd5269eaed564fbfa","src/v64.rs":"3077468d65125b8f085e9454c8b2463a4d5225697464ba6a1300f8799528fd4b","src/vPtr.rs":"c9a53f41f466e17b6648a4ce390fd8f4d3a848d440eb8a9a803a11608d76eb05","src/vSize.rs":"5c46d3e8c3ee5863d9b6e37e681f871386e0efc254d6d84ba711edb529ce7b3c","tests/endianness.rs":"541a144be017e3dd7da7c8ea49d907dc02538245e8c5f3deb5bd43da92c929e1"},"package":null} -\ No newline at end of file -+{"files":{".appveyor.yml":"f1ed01850e0d725f9498f52a1a63ddf40702ad6e0bf5b2d7c4c04d76e96794a3",".travis.yml":"d56de6531d3c4880e3aada85ac8e6d7388e5d781871e181cb8ade2a746d5d5f5","Cargo.toml":"e94ccb82002e8b55680c2c5fec554a9e864c5f354e113278d0aa927df279330d","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"49d01e49a33393af64fa6c813b6a724f68a4d1abfbedcb96413651ed105aa820","bors.toml":"dee881dc69b9b7834e4eba5d95c3ed5a416d4628815a167d6a22d4cb4fb064b8","build.rs":"c3312e786c7fcb8f16c0785fe235ebbcf43fbeab6d7d683752f62043ca92d887","ci/all.sh":"2ae6b2445b4db83833e40b37efd0016c6b9879ee988b9b3ef94db5439a3e1606","ci/android-install-ndk.sh":"0f1746108cc30bf9b9ba45bcde7b19fc1a8bdf5b0258035b4eb8dc69b75efac4","ci/android-install-sdk.sh":"3490432022c5c8f5a115c084f7a9aca1626f96c0c87ffb62019228c4346b47e4","ci/android-sysimage.sh":"ebf4e5daa1f0fe1b2092b79f0f3f161c4c4275cb744e52352c4d81ab451e4c5a","ci/benchmark.sh":"b61d19ef6b90deba8fb79dee74c8b062d94844676293da346da87bb78a9a49a4","ci/deploy_and_run_on_ios_simulator.rs":"ec8ecf82d92072676aa47f0d1a3d021b60a7ae3531153ef12d2ff4541fc294dc","ci/docker/aarch64-linux-android/Dockerfile":"ace2e7d33c87bc0f6d3962a4a3408c04557646f7f51ab99cfbf574906796b016","ci/docker/aarch64-unknown-linux-gnu/Dockerfile":"da88c0d50f16dc08448c7fdf1fa5ed2cbe576acf9e7dd85b5b818621b2a8c702","ci/docker/arm-linux-androideabi/Dockerfile":"370e55d3330a413a3ccf677b3afb3e0ef9018a5fab263faa97ae8ac017fc2286","ci/docker/arm-unknown-linux-gnueabi/Dockerfile":"bb5f8ae890707c128652290ffc544447643bf12037ddd73c6ad6989f848cb380","ci/docker/arm-unknown-linux-gnueabihf/Dockerfile":"1afaefcbc05b740859acd4e067bc92439be6bcbe8f2e9678474fb434bcd398d9","ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile":"8282ea707a94109beed47a57574755e2d58401735904a03f85fb64c578c53b4f","ci/docker/i586-unknown-linux-gnu/Dockerfile":"49792922269f371bd29da4727e9085101b27be67a6b97755d0196c63317f7abb","ci/docker/i686-unknown-linux-gnu/Dockerfile":"49792922269f371bd29da4727e9085101b27be67a6b97755d0196c63317f7abb","ci/docker/mips-unknown-linux-gnu/Dockerfile":"b2ebc25797612c4f8395fe9d407725156044955bfbcf442036b7f55b43a5f9da","ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile":"b0c1692ac65bc56dd30494b1993d8e929c48cc9c4b92029b7c7592af6d4f9220","ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile":"4e9249c179300138141d0b2b7401b11897f64aed69f541f078c1db4594df2827","ci/docker/mipsel-unknown-linux-musl/Dockerfile":"3164c52b0dcbb01afa78292b15b5c43503ccf0491cf6eb801ec2bf22ae274e52","ci/docker/powerpc-unknown-linux-gnu/Dockerfile":"786f799d0b56eb54d7b6c4b00e1aed4ce81776e14e44767e083c89d014b72004","ci/docker/powerpc64-unknown-linux-gnu/Dockerfile":"e8bc363837cd9c2d8b22402acb8c1c329efc11ba5d12170603d2fe2eae9da059","ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile":"47998d45b781d797b9e6085ebe898d90de0c952b54537a8db4e8d7503eb032d9","ci/docker/s390x-unknown-linux-gnu/Dockerfile":"93fb44df3d7fd31ead158570667c97b5076a05c3d968af4a84bc13819a8f2db8","ci/docker/sparc64-unknown-linux-gnu/Dockerfile":"da1c39a3ff1fe22e41395fa7c8934e90b4c1788e551b9aec6e38bfd94effc437","ci/docker/thumbv7neon-linux-androideabi/Dockerfile":"c2decd5591bd7a09378901bef629cd944acf052eb55e4f35b79eb9cb4d62246a","ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile":"51955a8bf3c4d440f47382af6f5426ebff94ab01a04da36175babda9a057740f","ci/docker/wasm32-unknown-unknown/Dockerfile":"3e5f294bc1e004aa599086c2af49d6f3e7459fa250f5fbdd60cf67d53db78758","ci/docker/x86_64-linux-android/Dockerfile":"685040273cf350d5509e580ac451555efa19790c8723ca2af066adadc6880ad2","ci/docker/x86_64-unknown-linux-gnu-emulated/Dockerfile":"44b6203d9290bfdc53d81219f0937e1110847a23dd982ec8c4de388354f01536","ci/docker/x86_64-unknown-linux-gnu/Dockerfile":"7f4e3ca5fa288ea70edb4d1f75309708cd30b192e2e4444e61c4d5b3b58f89cf","ci/dox.sh":"434e9611c52e389312d2b03564adf09429f10cc76fe66a8644adb104903b87b7","ci/linux-s390x.sh":"d6b732d7795b4ba131326aff893bca6228a7d2eb0e9402f135705413dbbe0dce","ci/linux-sparc64.sh":"c92966838b1ab7ad3b7a344833ee726aba6b647cf5952e56f0ad1ba420b13325","ci/lld-shim.rs":"3d7f71ec23a49e2b67f694a0168786f9a954dda15f5a138815d966643fd3fcc3","ci/max_line_width.sh":"0a1518bba4c9ecaa55694cb2e9930d0e19c265baabf73143f17f9cf285aaa5bb","ci/run-docker.sh":"92e036390ad9b0d16f109579df1b5ced2e72e9afea40c7d011400ebd3a2a90de","ci/run.sh":"41dd6a60efaaeae9661a01370cce98b631f78392859a0cf68c946c0a16edf5f7","ci/run_examples.sh":"d1a23c6c35374a0678ba5114b9b8fefd8be0a79e774872a8bf0898d1baca18d0","ci/runtest-android.rs":"145a8e9799a5223975061fe7e586ade5669ee4877a7d7a4cf6b4ab48e8e36c7c","ci/setup_benchmarks.sh":"fae3960023f6f3d1388cd2ad22fdbab4b075f1f29dd4292d7994a20783beb6cf","ci/test-runner-linux":"c8aa6025cff5306f4f31d0c61dc5f9d4dd5a1d189ab613ef8d4c367c694d9ccd","contributing.md":"2cc8c9c560ae17867e69b06d09b758dbf7bc39eb774ada50a743724b10acc0a2","perf-guide/.gitignore":"fe82c7da551079d832cf74200b0b359b4df9828cb4a0416fa7384f07a2ae6a13","perf-guide/book.toml":"115a98284126c6b180178b44713314cc494f08a71662ee2ce15cf67f17a51064","perf-guide/src/SUMMARY.md":"3e03bffc991fdc2050f3d51842d72d9d21ea6abab56a3baf3b2d5973a78b89e1","perf-guide/src/ascii.css":"29afb08833b2fe2250f0412e1fa1161a2432a0820a14953c87124407417c741a","perf-guide/src/bound_checks.md":"5e4991ff58a183ef0cd9fdc1feb4cd12d083b44bdf87393bbb0927808ef3ce7d","perf-guide/src/float-math/approx.md":"8c09032fa2d795a0c5db1775826c850d28eb2627846d0965c60ee72de63735ad","perf-guide/src/float-math/fma.md":"311076ba4b741d604a82e74b83a8d7e8c318fcbd7f64c4392d1cf5af95c60243","perf-guide/src/float-math/fp.md":"04153e775ab6e4f0d7837bcc515230d327b04edfa34c84ce9c9e10ebaeef2be8","perf-guide/src/float-math/svml.md":"0798873b8eedaeda5fed62dc91645b57c20775a02d3cd74d8bd06958f1516506","perf-guide/src/introduction.md":"9f5a19e9e6751f25d2daad39891a0cc600974527ec4c8305843f9618910671bd","perf-guide/src/prof/linux.md":"447731eb5de7d69166728fdbc5ecb0c0c9db678ea493b45a592d67dd002184c0","perf-guide/src/prof/mca.md":"f56d54f3d20e7aa4d32052186e8237b03d65971eb5d112802b442570ff11d344","perf-guide/src/prof/profiling.md":"8a650c0fd6ede0964789bb6577557eeef1d8226a896788602ce61528e260e43c","perf-guide/src/target-feature/attribute.md":"615f88dca0a707b6c416fa605435dd6e1fb5361cc639429cbf68cd87624bd78b","perf-guide/src/target-feature/features.md":"17077760ff24c006b606dd21889c53d87228f4311f3ba3a574f9afdeacd86165","perf-guide/src/target-feature/inlining.md":"7ed1d7068d8173a00d84c16cfe5871cd68b9f04f8d0cca2d01ebc84957ebf2f6","perf-guide/src/target-feature/practice.md":"c4b371842e0086df178488fec97f20def8f0c62ee588bcd25fd948b9b1fa227e","perf-guide/src/target-feature/runtime.md":"835425f5ee597fb3e51d36e725a81ebee29f4561231d19563cd4da81dbb1cfcb","perf-guide/src/target-feature/rustflags.md":"ab49712e9293a65d74d540ba4784fcb57ff1119ec05a575d895c071f1a620f64","perf-guide/src/vert-hor-ops.md":"c6211c0ee91e60552ec592d89d9d957eedc21dee3cbd89e1ad6765ea06a27471","rustfmt.toml":"de6101d0670bad65fb3b337d56957d2a024e017e5ab146ec784d77312daaf8ff","src/api.rs":"f6e92f056565e6fd93f98829a408aee9e790251e0cbd8a8bc30c8662b4d6fabb","src/api/bit_manip.rs":"c47a4d0f7451f7e35d07715e4f39a472e07457fd456fdb726864a4f6887252a3","src/api/bitmask.rs":"6d2beefd62ee5d9c8eb060bee6abc641616bf828c99f82abf97b21bf004e894b","src/api/cast.rs":"03b94a3d316ac7b7be7068810044911e965e889a0ace7bae762749ca74a92747","src/api/cast/macros.rs":"b0a14d0c83ad2ebb7a275180f6d9e3f2bc312ba57a7d3d6c39fad4e0f20f9408","src/api/cast/v128.rs":"2107ea6a426a0fe37a0aa6a03a579ff0bdeb5a1599ea76e2d81734a82f41276d","src/api/cast/v16.rs":"d785cf93b8e61200c9ae1c32b9f5e9d9518e87c261c56bcaf92f2e47b0009eb4","src/api/cast/v256.rs":"b81fcfd367a5de532d922dedf18579e53666facef7957c0e1bc827825e500ae6","src/api/cast/v32.rs":"2aac9ec0a67a97328ba908b13a1ff98da3dcd7781910d592d31f9207cbd9a7d2","src/api/cast/v512.rs":"33b33de818f8d4eccc982bc2f3951a8b3d03e9762ec02789b3df82e3f5ed3fc3","src/api/cast/v64.rs":"ec878917d52a8c952633251b3a938a2cbe0a63fee6d12c15840d9f1343d1f394","src/api/cmp.rs":"357c3a2a09c6d4611c32dd7fa95be2fae933d513e229026ec9b44451a77b884e","src/api/cmp/eq.rs":"60f70f355bae4cb5b17db53204cacc3890f70670611c17df638d4c04f7cc8075","src/api/cmp/ord.rs":"589f7234761c294fa5df8f525bc4acd5a47cdb602207d524a0d4e19804cd9695","src/api/cmp/partial_eq.rs":"3ed23d2a930b0f9750c3a5309da766b03dc4f9c4d375b42ad3c50fe732693d15","src/api/cmp/partial_ord.rs":"e16b11805c94048acd058c93994b5bc74bb187f8d7e3b86a87df60e1601467f9","src/api/cmp/vertical.rs":"de3d62f38eba817299aa16f1e1939954c9a447e316509397465c2830852ba053","src/api/default.rs":"67bf21c134127d12a7028c8b88a57f0ceee8ccbd74976da8ca74eb9f16a174d5","src/api/fmt.rs":"67fb804bb86b6cd77cf8cd492b5733ce437071b66fe3297278b8a6552c325dda","src/api/fmt/binary.rs":"35cb5c266197d6224d598fb3d286e5fe48ef0c01ed356c2ff6fe9ba946f96a92","src/api/fmt/debug.rs":"aa18eea443bf353fea3db8b1a025132bbcaf91e747ecfa43b8d9fce9af395a0c","src/api/fmt/lower_hex.rs":"69d5be366631af309f214e8031c8c20267fcc27a695eac6f45c6bc1df72a67e6","src/api/fmt/octal.rs":"9eb11ba3d990213f3c7f1ec25edba7ce997cb1320e16d308c83498ba6b9bfbd9","src/api/fmt/upper_hex.rs":"a4637d085b7bb20e759ce58e08435b510a563ba3dd468af2b03560fdc5511562","src/api/from.rs":"2e599d8329cb05eaf06224cc441355c4b7b51254fc19256619333be8c149d444","src/api/from/from_array.rs":"dd3fc64fb17d6184bb60343f8da26a05edf0e5f3c14caf55d49fa15e21d948dc","src/api/from/from_vector.rs":"9764371aa9e6005aace74dea14f59e5611a095b7cf42707940924749282c52f0","src/api/hash.rs":"5076ece87969592c876486f5b1ea8affbeaec379d1a14a30859e0aa5592019de","src/api/into_bits.rs":"82297f0697d67b5a015e904e7e6e7b2a7066ba825bc54b94b4ff3e22d7a1eefb","src/api/into_bits/arch_specific.rs":"4acab22af90112072a2608fafc66fccf18cbf2e641b72af28404d30833cfe5c6","src/api/into_bits/macros.rs":"d762406de25aedff88d460dec7a80dc8e825a2a419d53218ce007efa6a1d3e04","src/api/into_bits/v128.rs":"3c502b9ce85bfcc727d6f053d49030b0ba9f46bd8e9fa5aa109382a2033f9f87","src/api/into_bits/v16.rs":"f4f4f61ba88aa51b158ec56ca3dce234349aea0daf2b3029a14ab5125d1e41e5","src/api/into_bits/v256.rs":"c24c3676707a0feb868dabe00766d74deab176794f905f79056337198c7cf790","src/api/into_bits/v32.rs":"905ba683d342fa32f4202b80bb46530807bd0a5b588f6c2e8c9f475223c47775","src/api/into_bits/v512.rs":"7cd89005215a9326eed8a742125dcbf981cba1aca72a313478eabf3df71b1160","src/api/into_bits/v64.rs":"d6238022ccff7b92e55b3f6017fc269acb6f36330a6d7e8fb389853a0f1b6478","src/api/math.rs":"8b2a2fc651917a850539f993aa0b9e5bf4da67b11685285b8de8cdca311719ec","src/api/math/float.rs":"61d2794d68262a1090ae473bd30793b5f65cf732f32a6694a3af2ce5d9225616","src/api/math/float/abs.rs":"5b6b2701e2e11135b7ce58a05052ea8120e10e4702c95d046b9d21b827b26bf8","src/api/math/float/consts.rs":"78acba000d3fa527111300b6327c1932de9c4c1e02d4174e1a5615c01463d38c","src/api/math/float/cos.rs":"4c2dd7173728ef189314f1576c9486e03be21b7da98843b2f9011282a7979e31","src/api/math/float/exp.rs":"7c6d5f1e304f498a01cfa23b92380c815d7da0ad94eae3483783bc377d287eef","src/api/math/float/ln.rs":"54c7583f3df793b39ff57534fade27b41bb992439e5dc178252f5ca3190a3e54","src/api/math/float/mul_add.rs":"62cac77660d20159276d4c9ef066eb90c81cbddb808e8e157182c607625ad2eb","src/api/math/float/mul_adde.rs":"bae056ee9f3a70df39ec3c3b2f6437c65303888a7b843ef1a5bcf1f5aca0e602","src/api/math/float/powf.rs":"9ddb938984b36d39d82a82f862f80df8f7fb013f1d222d45698d41d88472f568","src/api/math/float/recpre.rs":"589225794ff1dbf31158dff660e6d4509ecc8befbb57c633900dea5ac0b840d6","src/api/math/float/rsqrte.rs":"a32abdcc318d7ccc8448231f54d75b884b7cbeb03a7d595713ab6243036f4dbf","src/api/math/float/sin.rs":"cbd3622b7df74f19691743001c8cf747a201f8977ad90542fee915f37dcd1e49","src/api/math/float/sqrt.rs":"0c66d5d63fb08e4d99c6b82a8828e41173aff1ac9fa1a2764a11fac217ccf2ac","src/api/math/float/sqrte.rs":"731e1c9f321b662accdd27dacb3aac2e8043b7aecb2f2161dde733bd9f025362","src/api/minimal.rs":"1f22bcc528555444e76de569ec0ae2029b9ae9d04805efeafa93369c8098036b","src/api/minimal/iuf.rs":"819cff26d3e196f807645bcc1d79eb27d9f175edb89910f2274d52a1e913cd11","src/api/minimal/mask.rs":"0cae10ae1fc65f5070e686c0c79bfba27b86b33d6c399367bd4848fb367dcec4","src/api/minimal/ptr.rs":"f65ebf21866a863485344432d9a7a9b7418f7fad5fdf841a4e2fa56ec0766ad0","src/api/ops.rs":"3e273b277a0f3019d42c3c59ca94a5afd4885d5ae6d2182e5089bbeec9de42ee","src/api/ops/scalar_arithmetic.rs":"d2d5ad897a59dd0787544f927e0e7ca4072c3e58b0f4a2324083312b0d5a21d7","src/api/ops/scalar_bitwise.rs":"482204e459ca6be79568e1c9f70adbe2d2151412ddf122fb2161be8ebb51c40c","src/api/ops/scalar_mask_bitwise.rs":"c250f52042e37b22d57256c80d4604104cfd2fbe2a2e127c676267270ca5d350","src/api/ops/scalar_shifts.rs":"987f8fdebeedc16e3d77c1b732e7826ef70633c541d16dfa290845d5c6289150","src/api/ops/vector_arithmetic.rs":"ddca15d09ddeef502c2ed66117a62300ca65d87e959e8b622d767bdf1c307910","src/api/ops/vector_bitwise.rs":"b3968f7005b649edcc22a54e2379b14d5ee19045f2e784029805781ae043b5ee","src/api/ops/vector_float_min_max.rs":"76bf8cb607e2c442923c1da1061a6b80d742d607408033c2a3761161114cf2a0","src/api/ops/vector_int_min_max.rs":"a378789c6ff9b32a51fbd0a97ffd36ed102cd1fe6a067d2b02017c1df342def6","src/api/ops/vector_mask_bitwise.rs":"5052d18517d765415d40327e6e8e55a312daaca0a5e2aec959bfa54b1675f9c8","src/api/ops/vector_neg.rs":"5c62f6b0221983cdbd23cd0a3af3672e6ba1255f0dfe8b19aae6fbd6503e231b","src/api/ops/vector_rotates.rs":"03cbe8a400fd7c688e4ee771a990a6754f2031b1a59b19ae81158b21471167e5","src/api/ops/vector_shifts.rs":"9bf69d0087268f61009e39aea52e03a90f378910206b6a28e8393178b6a5d0e0","src/api/ptr.rs":"8a793251bed6130dcfb2f1519ceaa18b751bbb15875928d0fb6deb5a5e07523a","src/api/ptr/gather_scatter.rs":"138b02b0fa1fdd785b95fc7048488be7e3ef277e0bc6ac5affb26af6a11d41a6","src/api/reductions.rs":"ae5baca81352ecd44526d6c30c0a1feeda475ec73ddd3c3ec6b14e944e5448ee","src/api/reductions/bitwise.rs":"8bf910ae226188bd15fc7e125f058cd2566b6186fcd0cd8fd020f352c39ce139","src/api/reductions/float_arithmetic.rs":"3997125f87c7bac07fffda3a1d814e0e6c77ca83099546a9e2fb8dc92231129f","src/api/reductions/integer_arithmetic.rs":"47471da1c5f859489680bb5d34ced3d3aa20081c16053a3af121a4496fcb57bf","src/api/reductions/mask.rs":"db83327a950e33a317f37fd33ca4e20c347fb415975ec024f3e23da8509425af","src/api/reductions/min_max.rs":"d40ccad10220ae5982785015bef92e4b0749583c2b060cad0aa4f92d99491c3b","src/api/select.rs":"a98e2ccf9fc6bdeed32d337c8675bc96c2fbe2cc34fbf149ad6047fb8e749774","src/api/shuffle.rs":"da58200790868c09659819322a489929a5b6e56c596ed07e6a44293ea02e7d09","src/api/shuffle1_dyn.rs":"bfea5a91905b31444e9ef7ca6eddb7a9606b7e22d3f71bb842eb2795a0346620","src/api/slice.rs":"ee87484e8af329547b9a5d4f2a69e8bed6ea10bbd96270d706083843d4eea2ac","src/api/slice/from_slice.rs":"53691dc9958dec4180004a42d140552b405e8cd875caa282e89af378dd63c8bc","src/api/slice/write_to_slice.rs":"3dd2e511af43dc6fa911dd0b12f6f00323e0acd1202a01365db400557d52a89b","src/api/swap_bytes.rs":"4a6792a2e49a77475e1b237592b4b2804dbddb79c474331acd0dd71b36934259","src/codegen.rs":"a29d38fa0a85eaf787fb49989e625bf64effd5f39c126fbb2a24be206d2a3917","src/codegen/bit_manip.rs":"17ecebcff1f080e712fea5eb51602a73f4201ed56a198220342c8eb55bb92692","src/codegen/llvm.rs":"b1f24237f61b7c5ddb8d47f3943aab79a95ce0e75af87ab2d1c88d842faffd39","src/codegen/math.rs":"35f96e37a78fcf0cdb02146b7f27a45108fe06a37fc2a54d8851ce131a326178","src/codegen/math/float.rs":"dd86c0449e576c83b719700962ac017c332987fac08d91f2b7a2b1b883598170","src/codegen/math/float/abs.rs":"f56e2b4b8055ea861c1f5cbc6b6e1d8e7e5af163b62c13574ddee4e09513bfbc","src/codegen/math/float/cos.rs":"ef3b511a24d23045b310315e80348a9b7fedb576fc2de52d74290616a0abeb2a","src/codegen/math/float/cos_pi.rs":"4e7631a5d73dac21531e09ef1802d1180f8997509c2c8fa9f67f322194263a97","src/codegen/math/float/exp.rs":"61b691598c41b5622f24e4320c1bdd08701e612a516438bdddcc728fc3405c8c","src/codegen/math/float/ln.rs":"46b718b1ba8c9d99e1ad40f53d20dfde08a3063ca7bd2a9fdd6698e060da687e","src/codegen/math/float/macros.rs":"dd42135fff13f9aca4fd3a1a4e14c7e6c31aadc6d817d63b0d2fb9e62e062744","src/codegen/math/float/mul_add.rs":"a37bf764345d4b1714f97e83897b7cf0855fc2811704bcbc0012db91825339e1","src/codegen/math/float/mul_adde.rs":"c75702bfcb361de45964a93caf959a695ef2376bd069227600b8c6872665c755","src/codegen/math/float/powf.rs":"642346e982bc4c39203de0864d2149c4179cd7b21cf67a2951687932b4675872","src/codegen/math/float/sin.rs":"9d68164c90cdca6a85155040cdac42e27342ebe0b925273ef1593df721af4258","src/codegen/math/float/sin_cos_pi.rs":"9be02ad48585a1e8d99129382fbffbaed47852f15459256a708850b6b7a75405","src/codegen/math/float/sin_pi.rs":"9890347905b4d4a3c7341c3eb06406e46e60582bcf6960688bd727e5dadc6c57","src/codegen/math/float/sqrt.rs":"e3c60dcfb0c6d2fc62adabcc931b2d4040b83cab294dea36443fb4b89eb79e34","src/codegen/math/float/sqrte.rs":"f0f4ef9eb475ae41bcc7ec6a95ad744ba6b36925faa8b2c2814004396d196b63","src/codegen/pointer_sized_int.rs":"a70697169c28218b56fd2e8d5353f2e00671d1150d0c8cef77d613bdfacd84cb","src/codegen/reductions.rs":"645e2514746d01387ddd07f0aa4ffd8430cc9ab428d4fb13773ea319fa25dd95","src/codegen/reductions/mask.rs":"8f1afe6aabf096a3278e1fc3a30f736e04aa8b9ce96373cee22162d18cfe2702","src/codegen/reductions/mask/aarch64.rs":"cba6e17603d39795dcfe8339b6b7d8714c3e162a1f0a635979f037aa24fe4206","src/codegen/reductions/mask/arm.rs":"9447904818aa2c7c25d0963eead452a639a11ca7dbd6d21eedbfcaade07a0f33","src/codegen/reductions/mask/fallback.rs":"7a0ef9f7fd03ae318b495b95e121350cd61caffc5cc6ee17fabf130d5d933453","src/codegen/reductions/mask/fallback_impl.rs":"76547f396e55ef403327c77c314cf8db8c7a5c9b9819bfb925abeacf130249e5","src/codegen/reductions/mask/x86.rs":"4c0457b6276f9809223590092a4c77e73812330326cdabd28df06820de10a310","src/codegen/reductions/mask/x86/avx.rs":"b4913d87844c522903641cbbf10db4551addb1ce5e9e78278e21612fa65c733b","src/codegen/reductions/mask/x86/avx2.rs":"677aed3f056285285daa3adff8bc65e739630b4424defa6d9665e160f027507e","src/codegen/reductions/mask/x86/sse.rs":"5a827c6f8e1074e324f6e4c778942badb6c09d747a7142de01cadec1240b3428","src/codegen/reductions/mask/x86/sse2.rs":"bc38e6c31cb4b3d62147eba6cac264e519e2a48e0f7ce9010cfa9ef0cf0ec9fd","src/codegen/shuffle.rs":"99a0b52c2470097b028af134221099baba383446a01c7dc3ae560209880bcdb7","src/codegen/shuffle1_dyn.rs":"abbc95305dad815ab2ded3e8357791bcff080414668b55a4d397558a1d202d01","src/codegen/swap_bytes.rs":"1d6cdc716eadddc92b4fd506b2445a821caa8dc00860447de09d7ebd69c2087f","src/codegen/v128.rs":"94226b31ec403d18d9d2fe06713f147c9c79e9b5f9105089088266313f843185","src/codegen/v16.rs":"ddec4ffb66b6f7aaffb9a1780c5ddba82557abd74f45073d335047e04cf74924","src/codegen/v256.rs":"6b63917f0444118d6b1595bff2045e59b97c4d24012bd575f69f1f0efc5a0241","src/codegen/v32.rs":"3477b3c5540aed86e61e2f5807dd31db947413cec9181c587d93ed6ec74f0eba","src/codegen/v512.rs":"5854f99d3aabc4cd42b28a20d9ce447756dc2ba024a409a69b6a8ae1f1842fc5","src/codegen/v64.rs":"e9e89caebfe63d10c0cbca61e4dfdba3b7e02ee0989170f80beed23237ddd950","src/codegen/vPtr.rs":"711c753a08d53a2879c4fb87a0762c46ce4e34c22f0ca88d2e4c557a0f679969","src/codegen/vSize.rs":"eeee9858749aa82142b27bc120d1989bb74a6b82e1e4efbbeaccc9634dc9acfc","src/lib.rs":"b842b5e47008b9bd59af4d2e309b84204d90a53d36595684082adc46b6934987","src/masks.rs":"be05e923ac58fe6eb61311561b5583cd306574f206dc09fe8e3c7de3dd0c1433","src/sealed.rs":"ae7fdeaf5d84cd7710ed730ca72ca7eaba93df6cb0acb183e5c0a7327acf197f","src/testing.rs":"1d3a7862ef625e235a5734ad7204e68d350f902c0695182b1f08a0552432416e","src/testing/macros.rs":"6378856d7a40ba5ec5c7c0dad6327d79f0c77266921c24296d10aed6c68e9b98","src/testing/utils.rs":"5ec6a47b836f364ec6dede19750a19eaac704162327d03041eb0f007d5f8d75c","src/v128.rs":"16cf9a8e7156b899ee9b9cd3f2dba9d13ec63289bea8c3ee9ae2e43ad9510288","src/v16.rs":"cb6465cf1e00bf530183af1819b9fe3d7eec978f8765d5e85d9b58a39a4b4045","src/v256.rs":"fe235017da18c7f3c361831c60e3173ad304d8ea1e95d64ebebc79da2d708511","src/v32.rs":"145d347855bac59b2de6508f9e594654e6c330423af9edc0e2ac8f4d1abdf45e","src/v512.rs":"f372f277f3e62eb5c945bb1c460333fdb17b6974fcc876633788ff53bded9599","src/v64.rs":"0b8079881b71575e3414be0b7f8f7eaba65281ba6732f2b2f61f73e95b6f48f7","src/vPtr.rs":"8b3e433d487180bb4304ff71245ecad90f0010f43e139a72027b672abe58facc","src/vSize.rs":"eda5aa020706cbf94d15bada41a0c2a35fc8f3f37cb7c2cd6f34d201399a495e","tests/endianness.rs":"7db22078f31fe1421fc2d21f2e6b9df5eb0bdc99c10f6985d3a74c0df8f205dc"},"package":null} -\ No newline at end of file -diff --git a/third_party/rust/packed_simd/.travis.yml b/third_party/rust/packed_simd/.travis.yml -index 8d8ed54ab7373..be3fb23693414 100644 ---- a/third_party/rust/packed_simd/.travis.yml -+++ b/third_party/rust/packed_simd/.travis.yml -@@ -1,286 +1,217 @@ - language: rust --sudo: false - rust: nightly -+os: linux -+dist: focal - - stages: - - tools -- - linux-tier1 -- - osx-tier1 -- - osx-tier2 -- - linux-tier2 -- - android -+ - build-test-verify # Passes full test suite, permit no regressions (unless it's rustup :/) -+ - 32bit-tier1 -+ - 64bit-tier2 -+ - 32bit-tier2 - --matrix: -- fast_finish: true -+jobs: -+ fast_finish: true - include: - # Android: -- - env: TARGET=x86_64-linux-android NOVERIFY=1 -+ - env: TARGET=x86_64-linux-android - name: "x86_64-unknown-linux-android + SSE2" -- stage: android -+ stage: build-test-verify - - env: TARGET=arm-linux-androideabi - name: "arm-linux-androideabi" -- stage: android -+ stage: build-test-verify - - env: TARGET=arm-linux-androideabi RUSTFLAGS="-C target-feature=+v7,+neon" - name: "arm-linux-androideabi + NEON" -- stage: android -- - env: TARGET=aarch64-linux-android -- name: "aarch64-unknown-linux-android" -- stage: android -- - env: TARGET=aarch64-linux-android RUSTFLAGS="-C target-feature=+neon" -- name: "aarch64-unknown-linux-android + NEON" -- stage: android -+ stage: build-test-verify -+ - name: "aarch64-unknown-linux-android + NEON" -+ env: TARGET=aarch64-linux-android RUSTFLAGS="-C target-feature=+neon" -+ stage: build-test-verify - - env: TARGET="thumbv7neon-linux-androideabi" - name: "thumbv7neon-linux-androideabi" -- stage: android -+ stage: 32bit-tier2 - # Linux: - - env: TARGET=i586-unknown-linux-gnu - name: "i586-unknown-linux-gnu" -- stage: linux-tier2 -+ stage: 32bit-tier2 - - env: TARGET=i586-unknown-linux-gnu RUSTFLAGS="-C target-feature=+sse" - name: "i586-unknown-linux-gnu + SSE" -- stage: linux-tier2 -+ stage: 32bit-tier2 - - env: TARGET=i586-unknown-linux-gnu RUSTFLAGS="-C target-feature=+sse2" - name: "i586-unknown-linux-gnu + SSE2" -- stage: linux-tier2 -+ stage: 32bit-tier2 - - env: TARGET=i686-unknown-linux-gnu - name: "i686-unknown-linux-gnu + SSE2" -- stage: linux-tier1 -+ stage: 32bit-tier1 - - env: TARGET=i686-unknown-linux-gnu RUSTFLAGS="-C target-feature=+sse4.2" - name: "i686-unknown-linux-gnu + SSE4.2" -- stage: linux-tier1 -+ stage: 32bit-tier1 - - env: TARGET=i686-unknown-linux-gnu RUSTFLAGS="-C target-feature=+avx2" - name: "i686-unknown-linux-gnu + AVX2" -- stage: linux-tier1 -- - env: TARGET=x86_64-unknown-linux-gnu -- name: "x86_64-unknown-linux-gnu + SSE2" -- install: rustup component add rustfmt-preview -- stage: linux-tier1 -+ stage: 32bit-tier1 - - env: TARGET=x86_64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+sse4.2" - name: "x86_64-unknown-linux-gnu + SSE4.2" - install: rustup component add rustfmt-preview -- stage: linux-tier1 -- - env: TARGET=x86_64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+avx" -- name: "x86_64-unknown-linux-gnu + AVX" -- install: rustup component add rustfmt-preview -- stage: linux-tier1 -+ stage: build-test-verify - - env: TARGET=x86_64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+avx2" - name: "x86_64-unknown-linux-gnu + AVX2" - install: rustup component add rustfmt-preview -- stage: linux-tier1 -- - env: TARGET=x86_64-unknown-linux-gnu-emulated -- name: "Intel SDE + SSE2" -- install: true -- stage: linux-tier1 -- - env: TARGET=x86_64-unknown-linux-gnu-emulated RUSTFLAGS="-C target-feature=+sse4.2" -- name: "Intel SDE + SSE4.2" -- install: true -- stage: linux-tier1 -- - env: TARGET=x86_64-unknown-linux-gnu-emulated RUSTFLAGS="-C target-feature=+avx" -- name: "Intel SDE + AVX" -- install: true -- stage: linux-tier1 -- - env: TARGET=x86_64-unknown-linux-gnu-emulated RUSTFLAGS="-C target-feature=+avx2" -- name: "Intel SDE + AVX2" -- install: true -- stage: linux-tier1 -- - env: TARGET=x86_64-unknown-linux-gnu-emulated RUSTFLAGS="-C target-feature=+avx-512f" -- name: "Intel SDE + AVX-512" -- install: true -- stage: linux-tier1 -- - env: TARGET=arm-unknown-linux-gnueabi -- name: "arm-unknown-linux-gnueabi" -- stage: linux-tier2 -+ stage: build-test-verify - - env: TARGET=arm-unknown-linux-gnueabi RUSTFLAGS="-C target-feature=+v7,+neon" - name: "arm-unknown-linux-gnueabi + NEON" -- stage: linux-tier2 -+ stage: build-test-verify - - env: TARGET=arm-unknown-linux-gnueabihf - name: "arm-unknown-linux-gnueabihf" -- stage: linux-tier2 -+ stage: build-test-verify - - env: TARGET=arm-unknown-linux-gnueabihf RUSTFLAGS="-C target-feature=+v7,+neon" - name: "arm-unknown-linux-gnueabihf + NEON" -- stage: linux-tier2 -+ stage: build-test-verify - - env: TARGET=armv7-unknown-linux-gnueabihf - name: "armv7-unknown-linux-gnueabihf" -- stage: linux-tier2 -+ stage: build-test-verify - - env: TARGET=armv7-unknown-linux-gnueabihf RUSTFLAGS="-C target-feature=+neon" - name: "armv7-unknown-linux-gnueabihf + NEON" -- stage: linux-tier2 -+ stage: build-test-verify - - env: TARGET="thumbv7neon-unknown-linux-gnueabihf" - name: "thumbv7neon-unknown-linux-gnueabihf" -- stage: linux-tier2 -- - env: TARGET=aarch64-unknown-linux-gnu -- name: "aarch64-unknown-linux-gnu" -- stage: linux-tier2 -- - env: TARGET=aarch64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+neon" -- name: "aarch64-unknown-linux-gnu + NEON" -- stage: linux-tier2 -+ stage: 32bit-tier2 -+ - name: "aarch64-unknown-linux-gnu + NEON" -+ env: TARGET=aarch64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+neon" -+ stage: build-test-verify - - env: TARGET=mips-unknown-linux-gnu - name: "mips-unknown-linux-gnu" -- stage: linux-tier2 -+ stage: 32bit-tier2 - - env: TARGET=mipsel-unknown-linux-musl - name: "mipsel-unknown-linux-musl" -- stage: linux-tier2 -+ stage: 32bit-tier2 - - env: TARGET=mips64-unknown-linux-gnuabi64 - name: "mips64-unknown-linux-gnuabi64" -- stage: linux-tier2 -+ stage: 64bit-tier2 - - env: TARGET=mips64el-unknown-linux-gnuabi64 - name: "mips64el-unknown-linux-gnuabi64" -- stage: linux-tier2 -+ stage: 64bit-tier2 - # FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/18 - # env: TARGET=mips64el-unknown-linux-gnuabi64 RUSTFLAGS="-C target-feature=+msa -C target-cpu=mips64r6" - - env: TARGET=powerpc-unknown-linux-gnu - name: "powerpc-unknown-linux-gnu" -- stage: linux-tier2 -+ stage: 32bit-tier2 - - env: TARGET=powerpc64-unknown-linux-gnu - name: "powerpc64-unknown-linux-gnu" -- stage: linux-tier2 -- - env: TARGET=powerpc64le-unknown-linux-gnu -- name: "powerpc64le-unknown-linux-gnu" -- stage: linux-tier2 -- - env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+altivec" -- name: "powerpc64le-unknown-linux-gnu + ALTIVEC" -- stage: linux-tier2 -- - env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+vsx" -- name: "powerpc64le-unknown-linux-gnu + VSX" -- stage: linux-tier2 -- - env: TARGET=s390x-unknown-linux-gnu -- name: "s390x-unknown-linux-gnu" -- stage: linux-tier2 -+ stage: 64bit-tier2 -+ - name: "powerpc64le-unknown-linux-gnu" -+ env: TARGET=powerpc64le-unknown-linux-gnu -+ stage: build-test-verify -+ - name: "powerpc64le-unknown-linux-gnu + ALTIVEC" -+ env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+altivec" -+ stage: build-test-verify -+ - name: "powerpc64le-unknown-linux-gnu + VSX" -+ env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+vsx" -+ stage: build-test-verify -+ - name: "s390x-unknown-linux-gnu" -+ env: TARGET=s390x-unknown-linux-gnu -+ stage: 64bit-tier2 - - env: TARGET=sparc64-unknown-linux-gnu - name: "sparc64-unknown-linux-gnu" -- stage: linux-tier2 -+ stage: 64bit-tier2 - # WebAssembly: - - env: TARGET=wasm32-unknown-unknown - name: "wasm32-unknown-unknown" -- stage: osx-tier1 # For now -+ stage: 32bit-tier2 - # MacOSX: -- - os: osx -- env: TARGET=i686-apple-darwin -- name: "i686-apple-darwin + SSE2" -- script: ci/run.sh -- osx_image: xcode10 -- stage: osx-tier1 -- - os: osx -- env: TARGET=i686-apple-darwin RUSTFLAGS="-C target-feature=+sse4.2" -- name: "i686-apple-darwin + SSE4.2" -- script: ci/run.sh -- osx_image: xcode10 -- stage: osx-tier1 -- # Travis-CI OSX build bots do not support AVX2: -- - os: osx -- env: TARGET=i686-apple-darwin RUSTFLAGS="-C target-feature=+avx" -- name: "i686-apple-darwin + AVX" -- script: ci/run.sh -- osx_image: xcode10 -- stage: osx-tier1 -- - os: osx -- env: TARGET=x86_64-apple-darwin -- name: "x86_64-apple-darwin + SSE2" -- install: true -- script: ci/run.sh -- osx_image: xcode10 -- stage: osx-tier1 - - os: osx - env: TARGET=x86_64-apple-darwin RUSTFLAGS="-C target-feature=+sse4.2" - name: "x86_64-apple-darwin + SSE4.2" - install: true - script: ci/run.sh - osx_image: xcode10 -- stage: osx-tier1 -+ stage: build-test-verify - # Travis-CI OSX build bots do not support AVX2: - - os: osx - env: TARGET=x86_64-apple-darwin RUSTFLAGS="-C target-feature=+avx" - name: "x86_64-apple-darwin + AVX" - install: true - script: ci/run.sh - osx_image: xcode10 -- stage: osx-tier1 -+ stage: build-test-verify - # *BSDs: - #- env: TARGET=i686-unknown-freebsd NORUN=1 - # script: ci/run.sh - #- env: TARGET=x86_64-unknown-freebsd NORUN=1 - # script: ci/run.sh - #- env: TARGET=x86_64-unknown-netbsd NORUN=1 - # script: ci/run.sh - # Solaris: - #- env: TARGET=x86_64-sun-solaris NORUN=1 - # script: ci/run.sh - # iOS: -- - os: osx -- env: TARGET=i386-apple-ios -- name: "i386-apple-ios" -- script: ci/run.sh -- osx_image: xcode9.4 -- stage: osx-tier2 - - os: osx - env: TARGET=x86_64-apple-ios - name: "x86_64-apple-ios + SSE2" - script: ci/run.sh - osx_image: xcode9.4 -- stage: osx-tier2 -- - os: osx -- env: TARGET=armv7-apple-ios NORUN=1 -- name: "armv7-apple-ios [Build only]" -- script: ci/run.sh -+ stage: 64bit-tier2 -+ - name: "aarch64-apple-ios + NEON" -+ env: TARGET=aarch64-apple-ios RUSTFLAGS="-C target-feature=+neon" -+ os: osx - osx_image: xcode9.4 -- stage: osx-tier2 -- - os: osx -- env: TARGET=aarch64-apple-ios NORUN=1 -- name: "aarch64-apple-ios [Build only]" - script: ci/run.sh -- osx_image: xcode9.4 -- stage: osx-tier2 -+ stage: 64bit-tier2 - # BENCHMARKS: - - name: "Benchmarks - x86_64-unknown-linux-gnu" - install: TARGET=x86_64-unknown-linux-gnu ./ci/setup_benchmarks.sh -- script: PATH=$(pwd):$PATH NORUN=1 VERIFY=1 FEATURES=core_arch,ispc,sleef-sys ci/benchmark.sh -+ # FIXME: Use `core_arch,sleef-sys` features once they works again -+ script: PATH=$(pwd):$PATH NORUN=1 VERIFY=1 FEATURES=ispc ci/benchmark.sh - stage: tools - - name: "Benchmarks - x86_64-apple-darwin" - install: TARGET=x86_64-apple-darwin ./ci/setup_benchmarks.sh -- script: PATH=$(pwd):$PATH NORUN=1 VERIFY=1 FEATURES=core_arch,ispc,sleef-sys ci/benchmark.sh -+ # FIXME: Use `core_arch,sleef-sys` features once they works again -+ script: PATH=$(pwd):$PATH NORUN=1 VERIFY=1 FEATURES=ispc ci/benchmark.sh - os: osx - osx_image: xcode9.4 - stage: tools - # TOOLS: - - name: "Documentation" -- install: cargo install mdbook -+ before_install: -+ - sudo add-apt-repository -y ppa:deadsnakes/ppa -+ - sudo apt-get update -y -+ - sudo apt-get install -y python3.9 -+ install: -+ - cargo install mdbook - script: ci/dox.sh - stage: tools - - name: "rustfmt" - install: true -- before_script: rustup component add rustfmt-preview -- script: ci/all.sh check_fmt || true -+ script: | -+ if rustup component add rustfmt-preview ; then -+ ci/all.sh check_fmt || true -+ fi - stage: tools - - name: "clippy" - install: true -- before_script: rustup component add clippy-preview -- script: ci/all.sh clippy -+ script: | -+ if rustup component add clippy-preview ; then -+ ci/all.sh clippy -+ fi - stage: tools - - allow_failures: - # FIXME: ISPC cannot be found? - - name: "Benchmarks - x86_64-apple-darwin" -- # FIXME: TBD -- - env: TARGET=powerpc-unknown-linux-gnu -- - env: TARGET=powerpc64-unknown-linux-gnu -- - env: TARGET=powerpc64le-unknown-linux-gnu -- - env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+altivec" -- - env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+vsx" -+ # FIXME: i686 fails in inlining, apparently -+ - stage: 32bit-tier1 - #- env: TARGET=i686-unknown-freebsd NORUN=1 - #- env: TARGET=x86_64-unknown-freebsd NORUN=1 - #- env: TARGET=x86_64-unknown-netbsd NORUN=1 - #- env: TARGET=x86_64-sun-solaris NORUN=1 - - # FIXME: TBD -- - env: TARGET=arm-linux-androideabi -- - env: TARGET=arm-linux-androideabi RUSTFLAGS="-C target-feature=+v7,+neon" -- - env: TARGET=aarch64-linux-android -- - env: TARGET=aarch64-linux-android RUSTFLAGS="-C target-feature=+neon" -+ - stage: 64bit-tier2 -+ - stage: 32bit-tier2 - - # FIXME: iOS - # https://github.com/rust-lang-nursery/packed_simd/issues/26 -- - env: TARGET=i386-apple-ios - - env: TARGET=x86_64-apple-ios -+ # Is this related to the above? Mysterious test failure -+ - name: "aarch64-apple-ios + NEON" - - # FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/182 - - env: TARGET=arm-unknown-linux-gnueabi RUSTFLAGS="-C target-feature=+v7,+neon" -diff --git a/third_party/rust/packed_simd/Cargo.toml b/third_party/rust/packed_simd/Cargo.toml -index 3db9354c9407b..70bbf26ed259e 100644 ---- a/third_party/rust/packed_simd/Cargo.toml -+++ b/third_party/rust/packed_simd/Cargo.toml -@@ -1,42 +1,42 @@ - [package] - name = "packed_simd" --version = "0.3.3" -+version = "0.3.4" - authors = ["Gonzalo Brito Gadeschi "] - description = "Portable Packed SIMD vectors" - documentation = "https://docs.rs/crate/packed_simd/" - homepage = "https://github.com/rust-lang-nursery/packed_simd" - repository = "https://github.com/rust-lang-nursery/packed_simd" - keywords = ["simd", "vector", "portability"] - categories = ["hardware-support", "concurrency", "no-std", "data-structures"] - license = "MIT/Apache-2.0" - build = "build.rs" - edition = "2018" - - [badges] - appveyor = { repository = "rust-lang-nursery/packed_simd" } - travis-ci = { repository = "rust-lang-nursery/packed_simd" } - codecov = { repository = "rust-lang-nursery/packed_simd" } - is-it-maintained-issue-resolution = { repository = "rust-lang-nursery/packed_simd" } - is-it-maintained-open-issues = { repository = "rust-lang-nursery/packed_simd" } - maintenance = { status = "experimental" } - - [dependencies] --cfg-if = "^0.1.6" --core_arch = { version = "^0.1.3", optional = true } -+cfg-if = "0.1.10" -+core_arch = { version = "0.1.5", optional = true } - - [features] - default = [] - into_bits = [] - libcore_neon = [] - - [dev-dependencies] - paste = "^0.1.3" --arrayvec = { version = "^0.4", default-features = false } -+arrayvec = { version = "^0.5", default-features = false } - - [target.'cfg(target_arch = "x86_64")'.dependencies.sleef-sys] --version = "^0.1.2" -+version = "0.1.2" - optional = true - - [target.wasm32-unknown-unknown.dev-dependencies] --wasm-bindgen = "=0.2.19" --wasm-bindgen-test = "=0.2.19" -\ No newline at end of file -+wasm-bindgen = "=0.2.52" -+wasm-bindgen-test = "=0.3.2" -diff --git a/third_party/rust/packed_simd/readme.md b/third_party/rust/packed_simd/README.md -similarity index 54% -rename from third_party/rust/packed_simd/readme.md -rename to third_party/rust/packed_simd/README.md -index 3b27a2bba0d6a..ad4f3f27093f7 100644 ---- a/third_party/rust/packed_simd/readme.md -+++ b/third_party/rust/packed_simd/README.md -@@ -4,131 +4,98 @@ - - [![Travis-CI Status]][travis] [![Appveyor Status]][appveyor] [![Latest Version]][crates.io] [![docs]][master_docs] - --> This aims to be a 100% conforming implementation of Rust RFC 2366 for stabilization. -- --**WARNING**: this crate only supports the most recent nightly Rust toolchain. -+**WARNING**: this crate only supports the most recent nightly Rust toolchain -+and will be superceded by [stdsimd](https://github.com/rust-lang/stdsimd). - - ## Documentation - - * [API docs (`master` branch)][master_docs] - * [Performance guide][perf_guide] --* [API docs (`docs.rs`)][docs.rs]: **CURRENTLY DOWN** due to -- https://github.com/rust-lang-nursery/packed_simd/issues/110 -+* [API docs (`docs.rs`)][docs.rs] - * [RFC2366 `std::simd`][rfc2366]: - contains motivation, design rationale, - discussion, etc. - - ## Examples - - Most of the examples come with both a scalar and a vectorized implementation. - - * [`aobench`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/aobench) - * [`fannkuch_redux`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/fannkuch_redux) - * [`matrix inverse`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/matrix_inverse) - * [`mandelbrot`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/mandelbrot) - * [`n-body`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/nbody) - * [`options_pricing`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/options_pricing) - * [`spectral_norm`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/spectral_norm) - * [`triangle transform`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/triangle_xform) - * [`stencil`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/stencil) - * [`vector dot product`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/dot_product) - - ## Cargo features - - * `into_bits` (default: disabled): enables `FromBits`/`IntoBits` trait - implementations for the vector types. These allow reinterpreting the bits of a - vector type as those of another vector type safely by just using the - `.into_bits()` method. - --* `core_arch` (default: disabled): enable this feature to recompile `core::arch` -- for the target-features enabled. `packed_simd` includes optimizations for some -- target feature combinations that are enabled by this feature. Note, however, -- that this is an unstable dependency, that rustc might break at any time. -- --* `sleef-sys` (default: disabled - `x86_64` only): internally uses the [SLEEF] -- short-vector math library when profitable via the [`sleef-sys`][sleef_sys] -- crate. [SLEEF] is licensed under the [Boost Software License -- v1.0][boost_license], an extremely permissive license, and can be statically -- linked without issues. -- - ## Performance - - The following [ISPC] examples are also part of `packed_simd`'s - [`examples/`](https://github.com/rust-lang-nursery/packed_simd/tree/master/examples/) - directory, where `packed_simd`+[`rayon`][rayon] are used to emulate [ISPC]'s - Single-Program-Multiple-Data (SPMD) programming model. The performance results - on different hardware is shown in the `readme.md` of each example. The following - table summarizes the performance ranges, where `+` means speed-up and `-` - slowdown: - - * `aobench`: `[-1.02x, +1.53x]`, - * `stencil`: `[+1.06x, +1.72x]`, - * `mandelbrot`: `[-1.74x, +1.2x]`, - * `options_pricing`: - * `black_scholes`: `+1.0x` - * `binomial_put`: `+1.4x` - - While SPMD is not the intended use case for `packed_simd`, it is possible to - combine the library with [`rayon`][rayon] to poorly emulate [ISPC]'s SPMD programming - model in Rust. Writing performant code is not as straightforward as with - [ISPC], but with some care (e.g. see the [Performance Guide][perf_guide]) one - can easily match and often out-perform [ISPC]'s "default performance". - - ## Platform support - --The following table describes the supported platforms: `build` shows whether the --library compiles without issues for a given target, while `run` shows whether --the full testsuite passes on the target. -+The following table describes the supported platforms: `build` shows whether -+the library compiles without issues for a given target, while `run` shows -+whether the test suite passes for a given target. - --| Linux targets: | build | run | --|-----------------------------------|-----------|---------| --| `i586-unknown-linux-gnu` | ✓ | ✓ | --| `i686-unknown-linux-gnu` | ✓ | ✓ | --| `x86_64-unknown-linux-gnu` | ✓ | ✓ | --| `arm-unknown-linux-gnueabi` | ✗ | ✗ | --| `arm-unknown-linux-gnueabihf` | ✓ | ✓ | --| `armv7-unknown-linux-gnueabi` | ✓ | ✓ | --| `aarch64-unknown-linux-gnu` | ✓ | ✓ | --| `mips-unknown-linux-gnu` | ✓ | ✓ | --| `mipsel-unknown-linux-musl` | ✓ | ✓ | --| `mips64-unknown-linux-gnuabi64` | ✓ | ✓ | --| `mips64el-unknown-linux-gnuabi64` | ✓ | ✓ | --| `powerpc-unknown-linux-gnu` | ✗ | ✗ | --| `powerpc64-unknown-linux-gnu` | ✗ | ✗ | --| `powerpc64le-unknown-linux-gnu` | ✗ | ✗ | --| `s390x-unknown-linux-gnu` | ✓ | ✓* | --| `sparc64-unknown-linux-gnu` | ✓ | ✓* | --| `thumbv7neon-unknown-linux-gnueabihf` | ✓ | ✓ | --| **MacOSX targets:** | **build** | **run** | --| `x86_64-apple-darwin` | ✓ | ✓ | --| `i686-apple-darwin` | ✓ | ✓ | --| **Windows targets:** | **build** | **run** | --| `x86_64-pc-windows-msvc` | ✓ | ✓ | --| `i686-pc-windows-msvc` | ✓ | ✓ | --| `x86_64-pc-windows-gnu` | ✗ | ✗ | --| `i686-pc-windows-gnu` | ✗ | ✗ | --| **WebAssembly targets:** | **build** | **run** | --| `wasm32-unknown-unknown` | ✓ | ✓ | --| **Android targets:** | **build** | **run** | --| `x86_64-linux-android` | ✓ | ✓ | --| `arm-linux-androideabi` | ✓ | ✓ | --| `aarch64-linux-android` | ✓ | ✗ | --| `thumbv7neon-linux-androideabi` | ✓ | ✓ | --| **iOS targets:** | **build** | **run** | --| `i386-apple-ios` | ✓ | ✗ | --| `x86_64-apple-ios` | ✓ | ✗ | --| `armv7-apple-ios` | ✓ | ✗** | --| `aarch64-apple-ios` | ✓ | ✗** | --| **xBSD targets:** | **build** | **run** | --| `i686-unknown-freebsd` | ✗ | ✗** | --| `x86_64-unknown-freebsd` | ✗ | ✗** | --| `x86_64-unknown-netbsd` | ✗ | ✗** | --| **Solaris targets:** | **build** | **run** | --| `x86_64-sun-solaris` | ✗ | ✗** | -+| **Linux** | **build** | **run** | -+|---------------------------------------|-----------|---------| -+| `i586-unknown-linux-gnu` | ✓ | ✗ | -+| `i686-unknown-linux-gnu` | ✓ | ✗ | -+| `x86_64-unknown-linux-gnu` | ✓ | ✓ | -+| `arm-unknown-linux-gnueabi` | ✗ | ✗ | -+| `arm-unknown-linux-gnueabihf` | ✓ | ✓ | -+| `armv7-unknown-linux-gnueabi` | ✓ | ✓ | -+| `aarch64-unknown-linux-gnu` | ✓ | ✓ | -+| `mips-unknown-linux-gnu` | ✓ | ✗ | -+| `mipsel-unknown-linux-musl` | ✓ | ✗ | -+| `mips64-unknown-linux-gnuabi64` | ✓ | ✗ | -+| `mips64el-unknown-linux-gnuabi64` | ✓ | ✗ | -+| `powerpc-unknown-linux-gnu` | ✗ | ✗ | -+| `powerpc64-unknown-linux-gnu` | ✗ | ✗ | -+| `powerpc64le-unknown-linux-gnu` | ✓ | ✓ | -+| `s390x-unknown-linux-gnu` | ✗ | ✗ | -+| `sparc64-unknown-linux-gnu` | ✓ | ✗ | -+| `thumbv7neon-unknown-linux-gnueabihf` | ✓ | ✓ | -+| **MacOSX** | **build** | **run** | -+| `x86_64-apple-darwin` | ✓ | ✓ | -+| **Android** | **build** | **run** | -+| `x86_64-linux-android` | ✓ | ✓ | -+| `arm-linux-androideabi` | ✓ | ✓ | -+| `aarch64-linux-android` | ✓ | ✓ | -+| `thumbv7neon-linux-androideabi` | ✗ | ✗ | -+| **iOS** | **build** | **run** | -+| `x86_64-apple-ios` | ✓ | ✗ | -+| `aarch64-apple-ios` | ✓ | ✗ | - --[*] most of the test suite passes correctly on these platform but --there are correctness bugs open in the issue tracker. -- --[**] it is currently not easily possible to run these platforms on CI. - - ## Machine code verification - -@@ -162,8 +129,8 @@ Unless you explicitly state otherwise, any contribution intentionally submitted - for inclusion in `packed_simd` by you, as defined in the Apache-2.0 license, shall be - dual licensed as above, without any additional terms or conditions. - --[travis]: https://travis-ci.org/rust-lang-nursery/packed_simd --[Travis-CI Status]: https://travis-ci.org/rust-lang-nursery/packed_simd.svg?branch=master -+[travis]: https://travis-ci.com/rust-lang-nursery/packed_simd -+[Travis-CI Status]: https://travis-ci.com/rust-lang-nursery/packed_simd.svg?branch=master - [appveyor]: https://ci.appveyor.com/project/gnzlbg/packed-simd - [Appveyor Status]: https://ci.appveyor.com/api/projects/status/hd7v9dvr442hgdix?svg=true - [Latest Version]: https://img.shields.io/crates/v/packed_simd.svg -diff --git a/third_party/rust/packed_simd/build.rs b/third_party/rust/packed_simd/build.rs -index 85639ff9d085e..5958b9b7856ea 100644 ---- a/third_party/rust/packed_simd/build.rs -+++ b/third_party/rust/packed_simd/build.rs -@@ -1,5 +1,5 @@ - fn main() { -- println!("cargo:rustc-env=RUSTC_BOOTSTRAP=1"); -+ println!("cargo:rustc-env=RUSTC_BOOTSTRAP=1"); - let target = std::env::var("TARGET") - .expect("TARGET environment variable not defined"); - if target.contains("neon") { -diff --git a/third_party/rust/packed_simd/ci/all.sh b/third_party/rust/packed_simd/ci/all.sh -index 273562d4a9bb9..55a1fa2efefeb 100755 ---- a/third_party/rust/packed_simd/ci/all.sh -+++ b/third_party/rust/packed_simd/ci/all.sh -@@ -21,7 +21,7 @@ cargo_fmt() { - } - - cargo_clippy() { -- cargo clippy --all -- -D clippy::pedantic -+ cargo clippy --all -- -D clippy::perf - } - - CMD="-1" -diff --git a/third_party/rust/packed_simd/ci/docker/aarch64-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/aarch64-unknown-linux-gnu/Dockerfile -index 68261a2f033d0..41ff4729ac596 100644 ---- a/third_party/rust/packed_simd/ci/docker/aarch64-unknown-linux-gnu/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/aarch64-unknown-linux-gnu/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc \ - ca-certificates \ -diff --git a/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabi/Dockerfile b/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabi/Dockerfile -index cb4de6a57eaaf..e1c591dd979a9 100644 ---- a/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabi/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabi/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc \ - ca-certificates \ -diff --git a/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile b/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile -index c7bd61f0a7969..757b79e7ecc13 100644 ---- a/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc \ - ca-certificates \ -diff --git a/third_party/rust/packed_simd/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile b/third_party/rust/packed_simd/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile -index e01b87afdf568..253906293374d 100644 ---- a/third_party/rust/packed_simd/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc \ - ca-certificates \ -diff --git a/third_party/rust/packed_simd/ci/docker/i586-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/i586-unknown-linux-gnu/Dockerfile -index 857974a858f1c..01093698f679f 100644 ---- a/third_party/rust/packed_simd/ci/docker/i586-unknown-linux-gnu/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/i586-unknown-linux-gnu/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc-multilib \ - libc6-dev \ -diff --git a/third_party/rust/packed_simd/ci/docker/i686-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/i686-unknown-linux-gnu/Dockerfile -index 857974a858f1c..01093698f679f 100644 ---- a/third_party/rust/packed_simd/ci/docker/i686-unknown-linux-gnu/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/i686-unknown-linux-gnu/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc-multilib \ - libc6-dev \ -diff --git a/third_party/rust/packed_simd/ci/docker/mips-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/mips-unknown-linux-gnu/Dockerfile -index 4711cead372af..3bd471e87d4d1 100644 ---- a/third_party/rust/packed_simd/ci/docker/mips-unknown-linux-gnu/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/mips-unknown-linux-gnu/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc libc6-dev qemu-user ca-certificates \ -diff --git a/third_party/rust/packed_simd/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile b/third_party/rust/packed_simd/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile -index 1422e8c809240..f26f1f38eb229 100644 ---- a/third_party/rust/packed_simd/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc libc6-dev qemu-user ca-certificates \ -diff --git a/third_party/rust/packed_simd/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile b/third_party/rust/packed_simd/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile -index d94deb5b20134..7d9f0bd99250b 100644 ---- a/third_party/rust/packed_simd/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc libc6-dev qemu-user ca-certificates \ -diff --git a/third_party/rust/packed_simd/ci/docker/mipsel-unknown-linux-musl/Dockerfile b/third_party/rust/packed_simd/ci/docker/mipsel-unknown-linux-musl/Dockerfile -index 40ac50675bd99..7488662ef2814 100644 ---- a/third_party/rust/packed_simd/ci/docker/mipsel-unknown-linux-musl/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/mipsel-unknown-linux-musl/Dockerfile -@@ -16,10 +16,10 @@ RUN mkdir /toolchain - - # Note that this originally came from: - # https://downloads.openwrt.org/snapshots/trunk/malta/generic/OpenWrt-Toolchain-malta-le_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2 --RUN curl -L https://s3-us-west-1.amazonaws.com/rust-lang-ci2/libc/OpenWrt-Toolchain-malta-le_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2 | \ -+RUN curl -L https://ci-mirrors.rust-lang.org/libc/OpenWrt-Toolchain-malta-le_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2 | \ - tar xjf - -C /toolchain --strip-components=2 - - ENV PATH=$PATH:/rust/bin:/toolchain/bin \ - CC_mipsel_unknown_linux_musl=mipsel-openwrt-linux-gcc \ - CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_LINKER=mipsel-openwrt-linux-gcc \ -- CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_RUNNER="qemu-mipsel -L /toolchain" -\ No newline at end of file -+ CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_RUNNER="qemu-mipsel -L /toolchain" -diff --git a/third_party/rust/packed_simd/ci/docker/powerpc-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/powerpc-unknown-linux-gnu/Dockerfile -index 43b174ed87fc0..80cfee8ab5b90 100644 ---- a/third_party/rust/packed_simd/ci/docker/powerpc-unknown-linux-gnu/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/powerpc-unknown-linux-gnu/Dockerfile -@@ -1,12 +1,13 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc libc6-dev qemu-user ca-certificates \ - gcc-powerpc-linux-gnu libc6-dev-powerpc-cross \ - qemu-system-ppc \ - make \ - file - - ENV CARGO_TARGET_POWERPC_UNKNOWN_LINUX_GNU_LINKER=powerpc-linux-gnu-gcc \ - CARGO_TARGET_POWERPC_UNKNOWN_LINUX_GNU_RUNNER="qemu-ppc -cpu Vger -L /usr/powerpc-linux-gnu" \ -+ CC=powerpc-linux-gnu-gcc \ - OBJDUMP=powerpc-linux-gnu-objdump -diff --git a/third_party/rust/packed_simd/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile -index 7757ad28a42d5..74031a2a3e6f3 100644 ---- a/third_party/rust/packed_simd/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc \ -diff --git a/third_party/rust/packed_simd/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile -index 0b0c214fdf1b7..471a7d9651f78 100644 ---- a/third_party/rust/packed_simd/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc libc6-dev qemu-user ca-certificates \ -diff --git a/third_party/rust/packed_simd/ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile b/third_party/rust/packed_simd/ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile -index 696cb6c3fb52e..588d23c65ae53 100644 ---- a/third_party/rust/packed_simd/ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc \ - ca-certificates \ -diff --git a/third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu/Dockerfile -index e6b000d0516e9..ce5bb88e625d8 100644 ---- a/third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc \ - libc6-dev \ -diff --git a/third_party/rust/packed_simd/ci/dox.sh b/third_party/rust/packed_simd/ci/dox.sh -index 1743366407e3b..560eaadcc8804 100755 ---- a/third_party/rust/packed_simd/ci/dox.sh -+++ b/third_party/rust/packed_simd/ci/dox.sh -@@ -18,7 +18,10 @@ cp -r perf-guide/book target/doc/perf-guide - - # If we're on travis, not a PR, and on the right branch, publish! - if [ "$TRAVIS_PULL_REQUEST" = "false" ] && [ "$TRAVIS_BRANCH" = "master" ]; then -- pip install ghp_import --install-option="--prefix=$HOME/.local" -- $HOME/.local/bin/ghp-import -n target/doc -+ python3 -vV -+ pip -vV -+ python3.9 -vV -+ pip install ghp_import --user -+ ghp-import -n target/doc - git push -qf https://${GH_PAGES}@github.com/${TRAVIS_REPO_SLUG}.git gh-pages - fi -diff --git a/third_party/rust/packed_simd/ci/run.sh b/third_party/rust/packed_simd/ci/run.sh -index 7bb8258836801..428a5d8902579 100755 ---- a/third_party/rust/packed_simd/ci/run.sh -+++ b/third_party/rust/packed_simd/ci/run.sh -@@ -78,9 +78,11 @@ fi - - if [[ "${TARGET}" == "x86_64-unknown-linux-gnu" ]] || [[ "${TARGET}" == "x86_64-pc-windows-msvc" ]]; then - # use sleef on linux and windows x86_64 builds -- cargo_test_impl --release --features=into_bits,core_arch,sleef-sys -+ # FIXME: Use `core_arch,sleef-sys` features once they works again -+ cargo_test_impl --release --features=into_bits - else -- cargo_test_impl --release --features=into_bits,core_arch -+ # FIXME: Use `core_arch` feature once it works again -+ cargo_test_impl --release --features=into_bits - fi - - # Verify code generation -diff --git a/third_party/rust/packed_simd/ci/setup_benchmarks.sh b/third_party/rust/packed_simd/ci/setup_benchmarks.sh -index ddc4765d5ceb0..cd41a78513034 100755 ---- a/third_party/rust/packed_simd/ci/setup_benchmarks.sh -+++ b/third_party/rust/packed_simd/ci/setup_benchmarks.sh -@@ -5,6 +5,3 @@ set -ex - # Get latest ISPC binary for the target and put it in the path - git clone https://github.com/gnzlbg/ispc-binaries - cp ispc-binaries/ispc-${TARGET} ispc -- --# Rust-bindgen requires RUSTFMT --rustup component add rustfmt-preview -diff --git a/third_party/rust/packed_simd/src/api.rs b/third_party/rust/packed_simd/src/api.rs -index 9959a052ae96a..4e9c4292e06ca 100644 ---- a/third_party/rust/packed_simd/src/api.rs -+++ b/third_party/rust/packed_simd/src/api.rs -@@ -1,5 +1,7 @@ - //! Implements the Simd<[T; N]> APIs - -+#[macro_use] -+mod bitmask; - crate mod cast; - #[macro_use] - mod cmp; -@@ -39,7 +41,7 @@ crate mod into_bits; - - macro_rules! impl_i { - ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident -- | $ielem_ty:ident | $test_tt:tt | $($elem_ids:ident),* -+ | $ielem_ty:ident, $ibitmask_ty:ident | $test_tt:tt | $($elem_ids:ident),* - | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => { - impl_minimal_iuf!([$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt - | $($elem_ids),* | $(#[$doc])*); -@@ -93,16 +95,17 @@ macro_rules! impl_i { - ); - impl_cmp_partial_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt); - impl_cmp_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1)); -+ impl_bitmask!($tuple_id | $ibitmask_ty | (-1, 0) | $test_tt); - - test_select!($elem_ty, $mask_ty, $tuple_id, (1, 2) | $test_tt); - test_cmp_partial_ord_int!([$elem_ty; $elem_n]: $tuple_id | $test_tt); - test_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt); - } - } - - macro_rules! impl_u { - ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident -- | $ielem_ty:ident | $test_tt:tt | $($elem_ids:ident),* -+ | $ielem_ty:ident, $ibitmask_ty:ident | $test_tt:tt | $($elem_ids:ident),* - | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => { - impl_minimal_iuf!([$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt - | $($elem_ids),* | $(#[$doc])*); -@@ -155,6 +158,8 @@ macro_rules! impl_u { - ); - impl_cmp_partial_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt); - impl_cmp_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1)); -+ impl_bitmask!($tuple_id | $ibitmask_ty | ($ielem_ty::max_value(), 0) | -+ $test_tt); - - test_select!($elem_ty, $mask_ty, $tuple_id, (1, 2) | $test_tt); - test_cmp_partial_ord_int!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -@@ -222,7 +227,8 @@ macro_rules! impl_f { - } - - macro_rules! impl_m { -- ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident | $ielem_ty:ident -+ ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident -+ | $ielem_ty:ident, $ibitmask_ty:ident - | $test_tt:tt | $($elem_ids:ident),* | From: $($from_vec_ty:ident),* - | $(#[$doc:meta])*) => { - impl_minimal_mask!( -@@ -265,6 +271,7 @@ macro_rules! impl_m { - [$elem_ty; $elem_n]: $tuple_id | $test_tt | (false, true) - ); - impl_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_bitmask!($tuple_id | $ibitmask_ty | (true, false) | $test_tt); - - test_cmp_partial_ord_mask!([$elem_ty; $elem_n]: $tuple_id | $test_tt); - test_shuffle1_dyn_mask!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -diff --git a/third_party/rust/packed_simd/src/api/bit_manip.rs b/third_party/rust/packed_simd/src/api/bit_manip.rs -index 3d3c4eb8850ab..6d8865706d3ea 100644 ---- a/third_party/rust/packed_simd/src/api/bit_manip.rs -+++ b/third_party/rust/packed_simd/src/api/bit_manip.rs -@@ -37,6 +37,7 @@ macro_rules! impl_bit_manip { - paste::item_with_macros! { - #[allow(overflowing_literals)] - pub mod [<$id _bit_manip>] { -+ #![allow(const_item_mutation)] - use super::*; - - const LANE_WIDTH: usize = mem::size_of::<$elem_ty>() * 8; -diff --git a/third_party/rust/packed_simd/src/api/bitmask.rs b/third_party/rust/packed_simd/src/api/bitmask.rs -new file mode 100644 -index 0000000000000..a06ff0fab1f48 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/bitmask.rs -@@ -0,0 +1,82 @@ -+//! Bitmask API -+ -+macro_rules! impl_bitmask { -+ ($id:ident | $ibitmask_ty:ident | ($set:expr, $clear:expr) -+ | $test_tt:tt) => { -+ impl $id { -+ /// Creates a bitmask with the MSB of each vector lane. -+ /// -+ /// If the vector has less than 8 lanes, the bits that do not -+ /// correspond to any vector lanes are cleared. -+ #[inline] -+ pub fn bitmask(self) -> $ibitmask_ty { -+ unsafe { codegen::llvm::simd_bitmask(self.0) } -+ } -+ } -+ -+ test_if! { -+ $test_tt: -+ paste::item! { -+ #[cfg(not(any( -+ // FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/210 -+ all(target_arch = "mips", target_endian = "big"), -+ all(target_arch = "mips64", target_endian = "big"), -+ target_arch = "sparc64", -+ target_arch = "s390x", -+ )))] -+ pub mod [<$id _bitmask>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn bitmask() { -+ // clear all lanes -+ let vec = $id::splat($clear as _); -+ let bitmask: $ibitmask_ty = 0; -+ assert_eq!(vec.bitmask(), bitmask); -+ -+ // set even lanes -+ let mut vec = $id::splat($clear as _); -+ for i in 0..$id::lanes() { -+ if i % 2 == 0 { -+ vec = vec.replace(i, $set as _); -+ } -+ } -+ // create bitmask with even lanes set: -+ let mut bitmask: $ibitmask_ty = 0; -+ for i in 0..$id::lanes() { -+ if i % 2 == 0 { -+ bitmask |= 1 << i; -+ } -+ } -+ assert_eq!(vec.bitmask(), bitmask); -+ -+ -+ // set odd lanes -+ let mut vec = $id::splat($clear as _); -+ for i in 0..$id::lanes() { -+ if i % 2 != 0 { -+ vec = vec.replace(i, $set as _); -+ } -+ } -+ // create bitmask with odd lanes set: -+ let mut bitmask: $ibitmask_ty = 0; -+ for i in 0..$id::lanes() { -+ if i % 2 != 0 { -+ bitmask |= 1 << i; -+ } -+ } -+ assert_eq!(vec.bitmask(), bitmask); -+ -+ // set all lanes -+ let vec = $id::splat($set as _); -+ let mut bitmask: $ibitmask_ty = 0; -+ for i in 0..$id::lanes() { -+ bitmask |= 1 << i; -+ } -+ assert_eq!(vec.bitmask(), bitmask); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/cast/v128.rs b/third_party/rust/packed_simd/src/api/cast/v128.rs -index 78c07f3a5597e..ab47ddc006d69 100644 ---- a/third_party/rust/packed_simd/src/api/cast/v128.rs -+++ b/third_party/rust/packed_simd/src/api/cast/v128.rs -@@ -1,5 +1,5 @@ - //! `FromCast` and `IntoCast` implementations for portable 128-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - -diff --git a/third_party/rust/packed_simd/src/api/cast/v16.rs b/third_party/rust/packed_simd/src/api/cast/v16.rs -index d292936baa411..cf974bb08e70d 100644 ---- a/third_party/rust/packed_simd/src/api/cast/v16.rs -+++ b/third_party/rust/packed_simd/src/api/cast/v16.rs -@@ -1,5 +1,5 @@ - //! `FromCast` and `IntoCast` implementations for portable 16-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - -diff --git a/third_party/rust/packed_simd/src/api/cast/v256.rs b/third_party/rust/packed_simd/src/api/cast/v256.rs -index 0a669e0beebea..9389dcb4c7f78 100644 ---- a/third_party/rust/packed_simd/src/api/cast/v256.rs -+++ b/third_party/rust/packed_simd/src/api/cast/v256.rs -@@ -1,5 +1,5 @@ - //! `FromCast` and `IntoCast` implementations for portable 256-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - -diff --git a/third_party/rust/packed_simd/src/api/cast/v32.rs b/third_party/rust/packed_simd/src/api/cast/v32.rs -index 65050cdacb4e2..2b254ba0cf124 100644 ---- a/third_party/rust/packed_simd/src/api/cast/v32.rs -+++ b/third_party/rust/packed_simd/src/api/cast/v32.rs -@@ -1,5 +1,5 @@ - //! `FromCast` and `IntoCast` implementations for portable 32-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - -diff --git a/third_party/rust/packed_simd/src/api/cast/v512.rs b/third_party/rust/packed_simd/src/api/cast/v512.rs -index 9ae1caed35e2a..5a10ab066677a 100644 ---- a/third_party/rust/packed_simd/src/api/cast/v512.rs -+++ b/third_party/rust/packed_simd/src/api/cast/v512.rs -@@ -1,5 +1,5 @@ - //! `FromCast` and `IntoCast` implementations for portable 512-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - -diff --git a/third_party/rust/packed_simd/src/api/cast/v64.rs b/third_party/rust/packed_simd/src/api/cast/v64.rs -index 0e2f78f7335b2..192a4638a3621 100644 ---- a/third_party/rust/packed_simd/src/api/cast/v64.rs -+++ b/third_party/rust/packed_simd/src/api/cast/v64.rs -@@ -1,5 +1,5 @@ - //! `FromCast` and `IntoCast` implementations for portable 64-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - -diff --git a/third_party/rust/packed_simd/src/api/default.rs b/third_party/rust/packed_simd/src/api/default.rs -index 843d51bcc4bb0..7af55ea77a85a 100644 ---- a/third_party/rust/packed_simd/src/api/default.rs -+++ b/third_party/rust/packed_simd/src/api/default.rs -@@ -12,6 +12,8 @@ macro_rules! impl_default { - test_if!{ - $test_tt: - paste::item! { -+ // Comparisons use integer casts within mantissa^1 range. -+ #[allow(clippy::float_cmp)] - pub mod [<$id _default>] { - use super::*; - #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -diff --git a/third_party/rust/packed_simd/src/api/from/from_array.rs b/third_party/rust/packed_simd/src/api/from/from_array.rs -index 964d1501df6a9..b83f938162624 100644 ---- a/third_party/rust/packed_simd/src/api/from/from_array.rs -+++ b/third_party/rust/packed_simd/src/api/from/from_array.rs -@@ -56,6 +56,8 @@ macro_rules! impl_from_array { - test_if! { - $test_tt: - paste::item! { -+ // Comparisons use integer casts within mantissa^1 range. -+ #[allow(clippy::float_cmp)] - mod [<$id _from>] { - use super::*; - #[test] -diff --git a/third_party/rust/packed_simd/src/api/hash.rs b/third_party/rust/packed_simd/src/api/hash.rs -index 08d42496ea8b4..ee80eff939c36 100644 ---- a/third_party/rust/packed_simd/src/api/hash.rs -+++ b/third_party/rust/packed_simd/src/api/hash.rs -@@ -36,6 +36,8 @@ macro_rules! impl_hash { - let mut v_hash = a_hash.clone(); - a.hash(&mut a_hash); - -+ // Integer within mantissa^1 range. -+ #[allow(clippy::float_cmp)] - let v = $id::splat(42 as $elem_ty); - v.hash(&mut v_hash); - assert_eq!(a_hash.finish(), v_hash.finish()); -diff --git a/third_party/rust/packed_simd/src/api/into_bits/arch_specific.rs b/third_party/rust/packed_simd/src/api/into_bits/arch_specific.rs -index 6cc2fa37b7281..fee6140052f95 100644 ---- a/third_party/rust/packed_simd/src/api/into_bits/arch_specific.rs -+++ b/third_party/rust/packed_simd/src/api/into_bits/arch_specific.rs -@@ -1,6 +1,6 @@ - //! `FromBits` and `IntoBits` between portable vector types and the - //! architecture-specific vector types. --#![rustfmt::skip] -+#[rustfmt::skip] - - // FIXME: MIPS FromBits/IntoBits - -@@ -84,7 +84,6 @@ macro_rules! impl_arch { - // FIXME: 64-bit single element types - // FIXME: arm/aarch float16x4_t missing - impl_arch!( -- [x86["x86"]: __m64], [x86_64["x86_64"]: __m64], - [arm["arm"]: int8x8_t, uint8x8_t, poly8x8_t, int16x4_t, uint16x4_t, - poly16x4_t, int32x2_t, uint32x2_t, float32x2_t, int64x1_t, - uint64x1_t], -diff --git a/third_party/rust/packed_simd/src/api/into_bits/v128.rs b/third_party/rust/packed_simd/src/api/into_bits/v128.rs -index 804dbf282d53e..e32cd7f9f099a 100644 ---- a/third_party/rust/packed_simd/src/api/into_bits/v128.rs -+++ b/third_party/rust/packed_simd/src/api/into_bits/v128.rs -@@ -1,5 +1,5 @@ - //! `FromBits` and `IntoBits` implementations for portable 128-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - #[allow(unused)] // wasm_bindgen_test - use crate::*; -diff --git a/third_party/rust/packed_simd/src/api/into_bits/v16.rs b/third_party/rust/packed_simd/src/api/into_bits/v16.rs -index 1162a62e5bd16..e44d0e7f9a184 100644 ---- a/third_party/rust/packed_simd/src/api/into_bits/v16.rs -+++ b/third_party/rust/packed_simd/src/api/into_bits/v16.rs -@@ -1,5 +1,5 @@ - //! `FromBits` and `IntoBits` implementations for portable 16-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - #[allow(unused)] // wasm_bindgen_test - use crate::*; -diff --git a/third_party/rust/packed_simd/src/api/into_bits/v256.rs b/third_party/rust/packed_simd/src/api/into_bits/v256.rs -index cc7a6646b535b..c4c373e0d0b8d 100644 ---- a/third_party/rust/packed_simd/src/api/into_bits/v256.rs -+++ b/third_party/rust/packed_simd/src/api/into_bits/v256.rs -@@ -1,5 +1,5 @@ - //! `FromBits` and `IntoBits` implementations for portable 256-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - #[allow(unused)] // wasm_bindgen_test - use crate::*; -diff --git a/third_party/rust/packed_simd/src/api/into_bits/v32.rs b/third_party/rust/packed_simd/src/api/into_bits/v32.rs -index 2c183ecf1c778..5dba38a17976c 100644 ---- a/third_party/rust/packed_simd/src/api/into_bits/v32.rs -+++ b/third_party/rust/packed_simd/src/api/into_bits/v32.rs -@@ -1,5 +1,5 @@ - //! `FromBits` and `IntoBits` implementations for portable 32-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - #[allow(unused)] // wasm_bindgen_test - use crate::*; -diff --git a/third_party/rust/packed_simd/src/api/into_bits/v512.rs b/third_party/rust/packed_simd/src/api/into_bits/v512.rs -index 8dec6a7f63a03..4a771962c3486 100644 ---- a/third_party/rust/packed_simd/src/api/into_bits/v512.rs -+++ b/third_party/rust/packed_simd/src/api/into_bits/v512.rs -@@ -1,5 +1,5 @@ - //! `FromBits` and `IntoBits` implementations for portable 512-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - #[allow(unused)] // wasm_bindgen_test - use crate::*; -diff --git a/third_party/rust/packed_simd/src/api/into_bits/v64.rs b/third_party/rust/packed_simd/src/api/into_bits/v64.rs -index 8999d98e13f8d..5b065f1bd5f70 100644 ---- a/third_party/rust/packed_simd/src/api/into_bits/v64.rs -+++ b/third_party/rust/packed_simd/src/api/into_bits/v64.rs -@@ -1,5 +1,5 @@ - //! `FromBits` and `IntoBits` implementations for portable 64-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - #[allow(unused)] // wasm_bindgen_test - use crate::*; -diff --git a/third_party/rust/packed_simd/src/api/minimal/iuf.rs b/third_party/rust/packed_simd/src/api/minimal/iuf.rs -index 58ffabab994f3..a155ac178a26a 100644 ---- a/third_party/rust/packed_simd/src/api/minimal/iuf.rs -+++ b/third_party/rust/packed_simd/src/api/minimal/iuf.rs -@@ -53,54 +53,56 @@ macro_rules! impl_minimal_iuf { - - /// Extracts the value at `index`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `index >= Self::lanes()` the behavior is undefined. - #[inline] - pub unsafe fn extract_unchecked(self, index: usize) -> $elem_ty { - use crate::llvm::simd_extract; - let e: $ielem_ty = simd_extract(self.0, index as u32); - e as $elem_ty - } - - /// Returns a new vector where the value at `index` is replaced by `new_value`. - /// - /// # Panics - /// - /// If `index >= Self::lanes()`. - #[inline] - #[must_use = "replace does not modify the original value - \ - it returns a new vector with the value at `index` \ - replaced by `new_value`d" - ] - pub fn replace(self, index: usize, new_value: $elem_ty) -> Self { - assert!(index < $elem_count); - unsafe { self.replace_unchecked(index, new_value) } - } - - /// Returns a new vector where the value at `index` is replaced by `new_value`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `index >= Self::lanes()` the behavior is undefined. - #[inline] - #[must_use = "replace_unchecked does not modify the original value - \ - it returns a new vector with the value at `index` \ - replaced by `new_value`d" - ] - pub unsafe fn replace_unchecked( - self, - index: usize, - new_value: $elem_ty, - ) -> Self { - use crate::llvm::simd_insert; - Simd(simd_insert(self.0, index as u32, new_value as $ielem_ty)) - } - } - - test_if!{ - $test_tt: - paste::item! { -+ // Comparisons use integer casts within mantissa^1 range. -+ #[allow(clippy::float_cmp)] - pub mod [<$id _minimal>] { - use super::*; - #[cfg_attr(not(target_arch = "wasm32"), test)] -diff --git a/third_party/rust/packed_simd/src/api/minimal/mask.rs b/third_party/rust/packed_simd/src/api/minimal/mask.rs -index e65be95db12c4..a420060b423d1 100644 ---- a/third_party/rust/packed_simd/src/api/minimal/mask.rs -+++ b/third_party/rust/packed_simd/src/api/minimal/mask.rs -@@ -58,6 +58,8 @@ macro_rules! impl_minimal_mask { - - /// Extracts the value at `index`. - /// -+ /// # Safety -+ /// - /// If `index >= Self::lanes()` the behavior is undefined. - #[inline] - pub unsafe fn extract_unchecked(self, index: usize) -> bool { -@@ -85,9 +87,9 @@ macro_rules! impl_minimal_mask { - /// Returns a new vector where the value at `index` is replaced by - /// `new_value`. - /// -- /// # Panics -+ /// # Safety - /// -- /// If `index >= Self::lanes()`. -+ /// If `index >= Self::lanes()` the behavior is undefined. - #[inline] - #[must_use = "replace_unchecked does not modify the original value - \ - it returns a new vector with the value at `index` \ -diff --git a/third_party/rust/packed_simd/src/api/minimal/ptr.rs b/third_party/rust/packed_simd/src/api/minimal/ptr.rs -index 75e5aad5c0656..c3d61fbf6d5e2 100644 ---- a/third_party/rust/packed_simd/src/api/minimal/ptr.rs -+++ b/third_party/rust/packed_simd/src/api/minimal/ptr.rs -@@ -68,7 +68,7 @@ macro_rules! impl_minimal_p { - - /// Extracts the value at `index`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `index >= Self::lanes()` the behavior is undefined. - #[inline] -@@ -96,7 +96,7 @@ macro_rules! impl_minimal_p { - - /// Returns a new vector where the value at `index` is replaced by `new_value`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `index >= Self::lanes()` the behavior is undefined. - #[inline] -@@ -215,7 +215,7 @@ macro_rules! impl_minimal_p { - f, - "{}<{}>(", - stringify!($id), -- unsafe { crate::intrinsics::type_name::() } -+ crate::intrinsics::type_name::() - )?; - for i in 0..$elem_count { - if i > 0 { -@@ -550,11 +550,7 @@ macro_rules! impl_minimal_p { - ]; - - for i in 0..$elem_count { -- let ptr = unsafe { -- crate::mem::transmute( -- &values[i] as *const i32 -- ) -- }; -+ let ptr = &values[i] as *const i32 as *mut i32; - vec = vec.replace(i, ptr); - array[i] = ptr; - } -@@ -611,20 +607,20 @@ macro_rules! impl_minimal_p { - - /// Instantiates a new vector with the values of the `slice`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `slice.len() < Self::lanes()` or `&slice[0]` is not aligned - /// to an `align_of::()` boundary, the behavior is undefined. - #[inline] - pub unsafe fn from_slice_aligned_unchecked(slice: &[$elem_ty]) - -> Self { - #[allow(clippy::cast_ptr_alignment)] - *(slice.get_unchecked(0) as *const $elem_ty as *const Self) - } - - /// Instantiates a new vector with the values of the `slice`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `slice.len() < Self::lanes()` the behavior is undefined. - #[inline] -@@ -827,23 +823,23 @@ macro_rules! impl_minimal_p { - - /// Writes the values of the vector to the `slice`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `slice.len() < Self::lanes()` or `&slice[0]` is not - /// aligned to an `align_of::()` boundary, the behavior is - /// undefined. - #[inline] - pub unsafe fn write_to_slice_aligned_unchecked( - self, slice: &mut [$elem_ty], - ) { - #[allow(clippy::cast_ptr_alignment)] - *(slice.get_unchecked_mut(0) as *mut $elem_ty as *mut Self) = - self; - } - - /// Writes the values of the vector to the `slice`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `slice.len() < Self::lanes()` the behavior is undefined. - #[inline] -@@ -1025,11 +1021,7 @@ macro_rules! impl_minimal_p { - ]; - - for i in 0..$elem_count { -- let ptr = unsafe { -- crate::mem::transmute( -- &values[i] as *const i32 -- ) -- }; -+ let ptr = &values[i] as *const i32 as *mut i32; - vec = vec.replace(i, ptr); - array[i] = ptr; - } -@@ -1151,7 +1143,7 @@ macro_rules! impl_minimal_p { - /// As such, memory acquired directly from allocators or memory - /// mapped files may be too large to handle with this function. - /// -- /// Consider using wrapping_offset_from instead if these constraints -+ /// Consider using `wrapping_offset_from` instead if these constraints - /// are difficult to satisfy. The only advantage of this method is - /// that it enables more aggressive compiler optimizations. - #[inline] -diff --git a/third_party/rust/packed_simd/src/api/ops/vector_float_min_max.rs b/third_party/rust/packed_simd/src/api/ops/vector_float_min_max.rs -index 4126e87042f52..8310667b7a8dd 100644 ---- a/third_party/rust/packed_simd/src/api/ops/vector_float_min_max.rs -+++ b/third_party/rust/packed_simd/src/api/ops/vector_float_min_max.rs -@@ -26,6 +26,11 @@ macro_rules! impl_ops_vector_float_min_max { - test_if!{ - $test_tt: - paste::item! { -+ #[cfg(not(any( -+ // FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/223 -+ all(target_arch = "mips", target_endian = "big"), -+ target_arch = "mips64", -+ )))] - pub mod [<$id _ops_vector_min_max>] { - use super::*; - #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -diff --git a/third_party/rust/packed_simd/src/api/ptr/gather_scatter.rs b/third_party/rust/packed_simd/src/api/ptr/gather_scatter.rs -index 9d8e113bb44fd..4304356209394 100644 ---- a/third_party/rust/packed_simd/src/api/ptr/gather_scatter.rs -+++ b/third_party/rust/packed_simd/src/api/ptr/gather_scatter.rs -@@ -49,9 +49,9 @@ macro_rules! impl_ptr_read { - let mut ptr = $id::::null(); - - for i in 0..$elem_count { -- ptr = ptr.replace(i, unsafe { -- crate::mem::transmute(&v[i] as *const i32) -- }); -+ ptr = ptr.replace(i, -+ &v[i] as *const i32 as *mut i32 -+ ); - } - - // all mask elements are true: -@@ -135,57 +135,33 @@ macro_rules! impl_ptr_write { - M: sealed::Mask, - [M; $elem_count]: sealed::SimdArray, - { -- // FIXME: -- // https://github.com/rust-lang-nursery/packed_simd/issues/85 -- #[cfg(not(target_arch = "mips"))] -- { -- use crate::llvm::simd_scatter; -- simd_scatter(value.0, self.0, mask.0) -- } -- #[cfg(target_arch = "mips")] -- { -- let m_ptr = -- &mask as *const Simd<[M; $elem_count]> as *const M; -- for i in 0..$elem_count { -- let m = ptr::read(m_ptr.add(i)); -- if m.test() { -- let t_ptr = &self -- as *const Simd<[*mut T; $elem_count]> -- as *mut *mut T; -- let v_ptr = &value as *const Simd<[T; $elem_count]> -- as *const T; -- ptr::write( -- ptr::read(t_ptr.add(i)), -- ptr::read(v_ptr.add(i)), -- ); -- } -- } -- } -+ use crate::llvm::simd_scatter; -+ simd_scatter(value.0, self.0, mask.0) - } - } - - test_if! { - $test_tt: - paste::item! { - mod [<$id _write>] { - use super::*; - #[test] - fn write() { - // fourty_two = [42, 42, 42, ...] - let fourty_two - = Simd::<[i32; $elem_count]>::splat(42_i32); - - // This test will write to this array - let mut arr = [0_i32; $elem_count]; - for i in 0..$elem_count { - arr[i] = i as i32; - } - // arr = [0, 1, 2, ...] - - let mut ptr = $id::::null(); - for i in 0..$elem_count { - ptr = ptr.replace(i, unsafe { -- crate::mem::transmute(arr.as_ptr().add(i)) -+ arr.as_ptr().add(i) as *mut i32 - }); - } - // ptr = [&arr[0], &arr[1], ...] -diff --git a/third_party/rust/packed_simd/src/api/reductions/float_arithmetic.rs b/third_party/rust/packed_simd/src/api/reductions/float_arithmetic.rs -index dd722ae25fdd7..4a47452e50061 100644 ---- a/third_party/rust/packed_simd/src/api/reductions/float_arithmetic.rs -+++ b/third_party/rust/packed_simd/src/api/reductions/float_arithmetic.rs -@@ -93,6 +93,8 @@ macro_rules! impl_reduction_float_arithmetic { - test_if! { - $test_tt: - paste::item! { -+ // Comparisons use integer casts within mantissa^1 range. -+ #[allow(clippy::float_cmp)] - pub mod [<$id _reduction_float_arith>] { - use super::*; - fn alternating(x: usize) -> $id { -@@ -225,7 +227,7 @@ macro_rules! impl_reduction_float_arithmetic { - let mut v = $id::splat(0. as $elem_ty); - for i in 0..$id::lanes() { - let c = if i % 2 == 0 { 1e3 } else { -1. }; -- start *= 3.14 * c; -+ start *= ::core::$elem_ty::consts::PI * c; - scalar_reduction += start; - v = v.replace(i, start); - } -@@ -257,46 +259,49 @@ macro_rules! impl_reduction_float_arithmetic { - #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - #[allow(unused, dead_code)] - fn product_roundoff() { -+ use ::core::convert::TryInto; - // Performs a tree-reduction - fn tree_reduce_product(a: &[$elem_ty]) -> $elem_ty { - assert!(!a.is_empty()); - if a.len() == 1 { - a[0] - } else if a.len() == 2 { - a[0] * a[1] - } else { - let mid = a.len() / 2; - let (left, right) = a.split_at(mid); - tree_reduce_product(left) - * tree_reduce_product(right) - } - } - - let mut start = crate::$elem_ty::EPSILON; - let mut scalar_reduction = 1. as $elem_ty; - - let mut v = $id::splat(0. as $elem_ty); - for i in 0..$id::lanes() { - let c = if i % 2 == 0 { 1e3 } else { -1. }; -- start *= 3.14 * c; -+ start *= ::core::$elem_ty::consts::PI * c; - scalar_reduction *= start; - v = v.replace(i, start); - } - let simd_reduction = v.product(); - - let mut a = [0. as $elem_ty; $id::lanes()]; - v.write_to_slice_unaligned(&mut a); - let tree_reduction = tree_reduce_product(&a); - -- // tolerate 1 ULP difference: -+ // FIXME: Too imprecise, even only for product(f32x8). -+ // Figure out how to narrow this down. -+ let ulp_limit = $id::lanes() / 2; - let red_bits = simd_reduction.to_bits(); - let tree_bits = tree_reduction.to_bits(); - assert!( - if red_bits > tree_bits { - red_bits - tree_bits - } else { - tree_bits - red_bits -- } < 2, -+ } < ulp_limit.try_into().unwrap(), - "vector: {:?} | simd_reduction: {:?} | \ - tree_reduction: {} | scalar_reduction: {}", - v, -diff --git a/third_party/rust/packed_simd/src/api/reductions/min_max.rs b/third_party/rust/packed_simd/src/api/reductions/min_max.rs -index c4d3aa10f15cf..c4c1400a8fc47 100644 ---- a/third_party/rust/packed_simd/src/api/reductions/min_max.rs -+++ b/third_party/rust/packed_simd/src/api/reductions/min_max.rs -@@ -76,6 +76,8 @@ macro_rules! impl_reduction_min_max { - } - test_if! {$test_tt: - paste::item! { -+ // Comparisons use integer casts within mantissa^1 range. -+ #[allow(clippy::float_cmp)] - pub mod [<$id _reduction_min_max>] { - use super::*; - #[cfg_attr(not(target_arch = "wasm32"), test)] -@@ -124,6 +126,8 @@ macro_rules! test_reduction_float_min_max { - test_if!{ - $test_tt: - paste::item! { -+ // Comparisons use integer casts within mantissa^1 range. -+ #[allow(clippy::float_cmp)] - pub mod [<$id _reduction_min_max_nan>] { - use super::*; - #[cfg_attr(not(target_arch = "wasm32"), test)] -diff --git a/third_party/rust/packed_simd/src/api/slice/from_slice.rs b/third_party/rust/packed_simd/src/api/slice/from_slice.rs -index 109cd1f10b010..25082d1e6800f 100644 ---- a/third_party/rust/packed_simd/src/api/slice/from_slice.rs -+++ b/third_party/rust/packed_simd/src/api/slice/from_slice.rs -@@ -38,52 +38,54 @@ macro_rules! impl_slice_from_slice { - - /// Instantiates a new vector with the values of the `slice`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `slice.len() < Self::lanes()` or `&slice[0]` is not aligned - /// to an `align_of::()` boundary, the behavior is undefined. - #[inline] - pub unsafe fn from_slice_aligned_unchecked( - slice: &[$elem_ty], - ) -> Self { - debug_assert!(slice.len() >= $elem_count); - let target_ptr = slice.get_unchecked(0) as *const $elem_ty; - debug_assert_eq!( - target_ptr.align_offset(crate::mem::align_of::()), - 0 - ); - - #[allow(clippy::cast_ptr_alignment)] - *(target_ptr as *const Self) - } - - /// Instantiates a new vector with the values of the `slice`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `slice.len() < Self::lanes()` the behavior is undefined. - #[inline] - pub unsafe fn from_slice_unaligned_unchecked( - slice: &[$elem_ty], - ) -> Self { - use crate::mem::size_of; - debug_assert!(slice.len() >= $elem_count); - let target_ptr = - slice.get_unchecked(0) as *const $elem_ty as *const u8; - let mut x = Self::splat(0 as $elem_ty); - let self_ptr = &mut x as *mut Self as *mut u8; - crate::ptr::copy_nonoverlapping( - target_ptr, - self_ptr, - size_of::(), - ); - x - } - } - - test_if! { - $test_tt: - paste::item! { -+ // Comparisons use integer casts within mantissa^1 range. -+ #[allow(clippy::float_cmp)] - pub mod [<$id _slice_from_slice>] { - use super::*; - use crate::iter::Iterator; -diff --git a/third_party/rust/packed_simd/src/api/slice/write_to_slice.rs b/third_party/rust/packed_simd/src/api/slice/write_to_slice.rs -index fcb288da70fc3..b634d98b9962e 100644 ---- a/third_party/rust/packed_simd/src/api/slice/write_to_slice.rs -+++ b/third_party/rust/packed_simd/src/api/slice/write_to_slice.rs -@@ -39,53 +39,55 @@ macro_rules! impl_slice_write_to_slice { - - /// Writes the values of the vector to the `slice`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `slice.len() < Self::lanes()` or `&slice[0]` is not - /// aligned to an `align_of::()` boundary, the behavior is - /// undefined. - #[inline] - pub unsafe fn write_to_slice_aligned_unchecked( - self, slice: &mut [$elem_ty], - ) { - debug_assert!(slice.len() >= $elem_count); - let target_ptr = slice.get_unchecked_mut(0) as *mut $elem_ty; - debug_assert_eq!( - target_ptr.align_offset(crate::mem::align_of::()), - 0 - ); - - #[allow(clippy::cast_ptr_alignment)] - #[allow(clippy::cast_ptr_alignment)] - #[allow(clippy::cast_ptr_alignment)] - #[allow(clippy::cast_ptr_alignment)] - *(target_ptr as *mut Self) = self; - } - - /// Writes the values of the vector to the `slice`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `slice.len() < Self::lanes()` the behavior is undefined. - #[inline] - pub unsafe fn write_to_slice_unaligned_unchecked( - self, slice: &mut [$elem_ty], - ) { - debug_assert!(slice.len() >= $elem_count); - let target_ptr = - slice.get_unchecked_mut(0) as *mut $elem_ty as *mut u8; - let self_ptr = &self as *const Self as *const u8; - crate::ptr::copy_nonoverlapping( - self_ptr, - target_ptr, - crate::mem::size_of::(), - ); - } - } - - test_if! { - $test_tt: - paste::item! { -+ // Comparisons use integer casts within mantissa^1 range. -+ #[allow(clippy::float_cmp)] - pub mod [<$id _slice_write_to_slice>] { - use super::*; - use crate::iter::Iterator; -diff --git a/third_party/rust/packed_simd/src/codegen.rs b/third_party/rust/packed_simd/src/codegen.rs -index b7ccd838603fc..9d1517e203d19 100644 ---- a/third_party/rust/packed_simd/src/codegen.rs -+++ b/third_party/rust/packed_simd/src/codegen.rs -@@ -16,13 +16,16 @@ macro_rules! impl_simd_array { - pub struct $tuple_id($(crate $elem_tys),*); - //^^^^^^^ leaked through SimdArray - -+ impl crate::sealed::Seal for [$elem_ty; $elem_count] {} -+ - impl crate::sealed::SimdArray for [$elem_ty; $elem_count] { - type Tuple = $tuple_id; - type T = $elem_ty; - const N: usize = $elem_count; - type NT = [u32; $elem_count]; - } - -+ impl crate::sealed::Seal for $tuple_id {} - impl crate::sealed::Simd for $tuple_id { - type Element = $elem_ty; - const LANES: usize = $elem_count; -diff --git a/third_party/rust/packed_simd/src/codegen/bit_manip.rs b/third_party/rust/packed_simd/src/codegen/bit_manip.rs -index 947266f5bce80..83c7d1987cac9 100644 ---- a/third_party/rust/packed_simd/src/codegen/bit_manip.rs -+++ b/third_party/rust/packed_simd/src/codegen/bit_manip.rs -@@ -1,5 +1,5 @@ - //! LLVM bit manipulation intrinsics. --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - -diff --git a/third_party/rust/packed_simd/src/codegen/llvm.rs b/third_party/rust/packed_simd/src/codegen/llvm.rs -index 91c2b0758dcf2..93c6ce6b77ed4 100644 ---- a/third_party/rust/packed_simd/src/codegen/llvm.rs -+++ b/third_party/rust/packed_simd/src/codegen/llvm.rs -@@ -10,31 +10,37 @@ extern "platform-intrinsic" { - // FIXME: Passing this intrinsics an `idx` array with an index that is - // out-of-bounds will produce a monomorphization-time error. - // https://github.com/rust-lang-nursery/packed_simd/issues/21 -+ #[rustc_args_required_const(2)] - pub fn simd_shuffle2(x: T, y: T, idx: [u32; 2]) -> U - where - T: Simd, - ::Element: Shuffle<[u32; 2], Output = U>; - -+ #[rustc_args_required_const(2)] - pub fn simd_shuffle4(x: T, y: T, idx: [u32; 4]) -> U - where - T: Simd, - ::Element: Shuffle<[u32; 4], Output = U>; - -+ #[rustc_args_required_const(2)] - pub fn simd_shuffle8(x: T, y: T, idx: [u32; 8]) -> U - where - T: Simd, - ::Element: Shuffle<[u32; 8], Output = U>; - -+ #[rustc_args_required_const(2)] - pub fn simd_shuffle16(x: T, y: T, idx: [u32; 16]) -> U - where - T: Simd, - ::Element: Shuffle<[u32; 16], Output = U>; - -+ #[rustc_args_required_const(2)] - pub fn simd_shuffle32(x: T, y: T, idx: [u32; 32]) -> U - where - T: Simd, - ::Element: Shuffle<[u32; 32], Output = U>; - -+ #[rustc_args_required_const(2)] - pub fn simd_shuffle64(x: T, y: T, idx: [u32; 64]) -> U - where - T: Simd, -@@ -96,4 +102,6 @@ extern "platform-intrinsic" { - - crate fn simd_gather(value: T, pointers: P, mask: M) -> T; - crate fn simd_scatter(value: T, pointers: P, mask: M); -+ -+ crate fn simd_bitmask(value: T) -> U; - } -diff --git a/third_party/rust/packed_simd/src/codegen/reductions/mask/x86.rs b/third_party/rust/packed_simd/src/codegen/reductions/mask/x86.rs -index 2ae4ed81c416f..bcfb1a6e17722 100644 ---- a/third_party/rust/packed_simd/src/codegen/reductions/mask/x86.rs -+++ b/third_party/rust/packed_simd/src/codegen/reductions/mask/x86.rs -@@ -19,13 +19,7 @@ mod avx2; - /// x86 64-bit m8x8 implementation - macro_rules! x86_m8x8_impl { - ($id:ident) => { -- cfg_if! { -- if #[cfg(all(target_arch = "x86_64", target_feature = "sse"))] { -- x86_m8x8_sse_impl!($id); -- } else { -- fallback_impl!($id); -- } -- } -+ fallback_impl!($id); - }; - } - -diff --git a/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse.rs b/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse.rs -index 7482f9430a146..eb1ef7fac9220 100644 ---- a/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse.rs -+++ b/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse.rs -@@ -34,35 +34,3 @@ macro_rules! x86_m32x4_sse_impl { - } - }; - } -- --macro_rules! x86_m8x8_sse_impl { -- ($id:ident) => { -- impl All for $id { -- #[inline] -- #[target_feature(enable = "sse")] -- unsafe fn all(self) -> bool { -- #[cfg(target_arch = "x86")] -- use crate::arch::x86::_mm_movemask_pi8; -- #[cfg(target_arch = "x86_64")] -- use crate::arch::x86_64::_mm_movemask_pi8; -- // _mm_movemask_pi8(a) creates an 8bit mask containing the most -- // significant bit of each byte of `a`. If all bits are set, -- // then all 8 lanes of the mask are true. -- _mm_movemask_pi8(crate::mem::transmute(self)) -- == u8::max_value() as i32 -- } -- } -- impl Any for $id { -- #[inline] -- #[target_feature(enable = "sse")] -- unsafe fn any(self) -> bool { -- #[cfg(target_arch = "x86")] -- use crate::arch::x86::_mm_movemask_pi8; -- #[cfg(target_arch = "x86_64")] -- use crate::arch::x86_64::_mm_movemask_pi8; -- -- _mm_movemask_pi8(crate::mem::transmute(self)) != 0 -- } -- } -- }; --} -diff --git a/third_party/rust/packed_simd/src/codegen/shuffle.rs b/third_party/rust/packed_simd/src/codegen/shuffle.rs -index 35a9db9053390..d92c9ee224273 100644 ---- a/third_party/rust/packed_simd/src/codegen/shuffle.rs -+++ b/third_party/rust/packed_simd/src/codegen/shuffle.rs -@@ -2,301 +2,149 @@ - //! lanes and vector element types. - - use crate::masks::*; --use crate::sealed::Shuffle; -+use crate::sealed::{Shuffle, Seal}; - --impl Shuffle<[u32; 2]> for i8 { -- type Output = crate::codegen::i8x2; --} --impl Shuffle<[u32; 4]> for i8 { -- type Output = crate::codegen::i8x4; --} --impl Shuffle<[u32; 8]> for i8 { -- type Output = crate::codegen::i8x8; --} --impl Shuffle<[u32; 16]> for i8 { -- type Output = crate::codegen::i8x16; --} --impl Shuffle<[u32; 32]> for i8 { -- type Output = crate::codegen::i8x32; --} --impl Shuffle<[u32; 64]> for i8 { -- type Output = crate::codegen::i8x64; -+macro_rules! impl_shuffle { -+ ($array:ty, $base:ty, $out:ty) => { -+ impl Seal<$array> for $base {} -+ impl Shuffle<$array> for $base { -+ type Output = $out; -+ } -+ } - } - --impl Shuffle<[u32; 2]> for u8 { -- type Output = crate::codegen::u8x2; --} --impl Shuffle<[u32; 4]> for u8 { -- type Output = crate::codegen::u8x4; --} --impl Shuffle<[u32; 8]> for u8 { -- type Output = crate::codegen::u8x8; --} --impl Shuffle<[u32; 16]> for u8 { -- type Output = crate::codegen::u8x16; --} --impl Shuffle<[u32; 32]> for u8 { -- type Output = crate::codegen::u8x32; --} --impl Shuffle<[u32; 64]> for u8 { -- type Output = crate::codegen::u8x64; --} -+impl_shuffle! { [u32; 2], i8, crate::codegen::i8x2 } -+impl_shuffle! { [u32; 4], i8, crate::codegen::i8x4 } -+impl_shuffle! { [u32; 8], i8, crate::codegen::i8x8 } -+impl_shuffle! { [u32; 16], i8, crate::codegen::i8x16 } -+impl_shuffle! { [u32; 32], i8, crate::codegen::i8x32 } -+impl_shuffle! { [u32; 64], i8, crate::codegen::i8x64 } - --impl Shuffle<[u32; 2]> for m8 { -- type Output = crate::codegen::m8x2; --} --impl Shuffle<[u32; 4]> for m8 { -- type Output = crate::codegen::m8x4; --} --impl Shuffle<[u32; 8]> for m8 { -- type Output = crate::codegen::m8x8; --} --impl Shuffle<[u32; 16]> for m8 { -- type Output = crate::codegen::m8x16; --} --impl Shuffle<[u32; 32]> for m8 { -- type Output = crate::codegen::m8x32; --} --impl Shuffle<[u32; 64]> for m8 { -- type Output = crate::codegen::m8x64; --} -+impl_shuffle! { [u32; 2], u8, crate::codegen::u8x2 } -+impl_shuffle! { [u32; 4], u8, crate::codegen::u8x4 } -+impl_shuffle! { [u32; 8], u8, crate::codegen::u8x8 } -+impl_shuffle! { [u32; 16], u8, crate::codegen::u8x16 } -+impl_shuffle! { [u32; 32], u8, crate::codegen::u8x32 } -+impl_shuffle! { [u32; 64], u8, crate::codegen::u8x64 } - --impl Shuffle<[u32; 2]> for i16 { -- type Output = crate::codegen::i16x2; --} --impl Shuffle<[u32; 4]> for i16 { -- type Output = crate::codegen::i16x4; --} --impl Shuffle<[u32; 8]> for i16 { -- type Output = crate::codegen::i16x8; --} --impl Shuffle<[u32; 16]> for i16 { -- type Output = crate::codegen::i16x16; --} --impl Shuffle<[u32; 32]> for i16 { -- type Output = crate::codegen::i16x32; --} -+impl_shuffle! { [u32; 2], m8, crate::codegen::m8x2 } -+impl_shuffle! { [u32; 4], m8, crate::codegen::m8x4 } -+impl_shuffle! { [u32; 8], m8, crate::codegen::m8x8 } -+impl_shuffle! { [u32; 16], m8, crate::codegen::m8x16 } -+impl_shuffle! { [u32; 32], m8, crate::codegen::m8x32 } -+impl_shuffle! { [u32; 64], m8, crate::codegen::m8x64 } - --impl Shuffle<[u32; 2]> for u16 { -- type Output = crate::codegen::u16x2; --} --impl Shuffle<[u32; 4]> for u16 { -- type Output = crate::codegen::u16x4; --} --impl Shuffle<[u32; 8]> for u16 { -- type Output = crate::codegen::u16x8; --} --impl Shuffle<[u32; 16]> for u16 { -- type Output = crate::codegen::u16x16; --} --impl Shuffle<[u32; 32]> for u16 { -- type Output = crate::codegen::u16x32; --} -+impl_shuffle! { [u32; 2], i16, crate::codegen::i16x2 } -+impl_shuffle! { [u32; 4], i16, crate::codegen::i16x4 } -+impl_shuffle! { [u32; 8], i16, crate::codegen::i16x8 } -+impl_shuffle! { [u32; 16], i16, crate::codegen::i16x16 } -+impl_shuffle! { [u32; 32], i16, crate::codegen::i16x32 } - --impl Shuffle<[u32; 2]> for m16 { -- type Output = crate::codegen::m16x2; --} --impl Shuffle<[u32; 4]> for m16 { -- type Output = crate::codegen::m16x4; --} --impl Shuffle<[u32; 8]> for m16 { -- type Output = crate::codegen::m16x8; --} --impl Shuffle<[u32; 16]> for m16 { -- type Output = crate::codegen::m16x16; --} --impl Shuffle<[u32; 32]> for m16 { -- type Output = crate::codegen::m16x32; --} -+impl_shuffle! { [u32; 2], u16, crate::codegen::u16x2 } -+impl_shuffle! { [u32; 4], u16, crate::codegen::u16x4 } -+impl_shuffle! { [u32; 8], u16, crate::codegen::u16x8 } -+impl_shuffle! { [u32; 16], u16, crate::codegen::u16x16 } -+impl_shuffle! { [u32; 32], u16, crate::codegen::u16x32 } - --impl Shuffle<[u32; 2]> for i32 { -- type Output = crate::codegen::i32x2; --} --impl Shuffle<[u32; 4]> for i32 { -- type Output = crate::codegen::i32x4; --} --impl Shuffle<[u32; 8]> for i32 { -- type Output = crate::codegen::i32x8; --} --impl Shuffle<[u32; 16]> for i32 { -- type Output = crate::codegen::i32x16; --} -+impl_shuffle! { [u32; 2], m16, crate::codegen::m16x2 } -+impl_shuffle! { [u32; 4], m16, crate::codegen::m16x4 } -+impl_shuffle! { [u32; 8], m16, crate::codegen::m16x8 } -+impl_shuffle! { [u32; 16], m16, crate::codegen::m16x16 } - --impl Shuffle<[u32; 2]> for u32 { -- type Output = crate::codegen::u32x2; --} --impl Shuffle<[u32; 4]> for u32 { -- type Output = crate::codegen::u32x4; --} --impl Shuffle<[u32; 8]> for u32 { -- type Output = crate::codegen::u32x8; --} --impl Shuffle<[u32; 16]> for u32 { -- type Output = crate::codegen::u32x16; --} -+impl_shuffle! { [u32; 2], i32, crate::codegen::i32x2 } -+impl_shuffle! { [u32; 4], i32, crate::codegen::i32x4 } -+impl_shuffle! { [u32; 8], i32, crate::codegen::i32x8 } -+impl_shuffle! { [u32; 16], i32, crate::codegen::i32x16 } - --impl Shuffle<[u32; 2]> for f32 { -- type Output = crate::codegen::f32x2; --} --impl Shuffle<[u32; 4]> for f32 { -- type Output = crate::codegen::f32x4; --} --impl Shuffle<[u32; 8]> for f32 { -- type Output = crate::codegen::f32x8; --} --impl Shuffle<[u32; 16]> for f32 { -- type Output = crate::codegen::f32x16; --} -+impl_shuffle! { [u32; 2], u32, crate::codegen::u32x2 } -+impl_shuffle! { [u32; 4], u32, crate::codegen::u32x4 } -+impl_shuffle! { [u32; 8], u32, crate::codegen::u32x8 } -+impl_shuffle! { [u32; 16], u32, crate::codegen::u32x16 } - --impl Shuffle<[u32; 2]> for m32 { -- type Output = crate::codegen::m32x2; --} --impl Shuffle<[u32; 4]> for m32 { -- type Output = crate::codegen::m32x4; --} --impl Shuffle<[u32; 8]> for m32 { -- type Output = crate::codegen::m32x8; --} --impl Shuffle<[u32; 16]> for m32 { -- type Output = crate::codegen::m32x16; --} -+impl_shuffle! { [u32; 2], f32, crate::codegen::f32x2 } -+impl_shuffle! { [u32; 4], f32, crate::codegen::f32x4 } -+impl_shuffle! { [u32; 8], f32, crate::codegen::f32x8 } -+impl_shuffle! { [u32; 16], f32, crate::codegen::f32x16 } -+ -+impl_shuffle! { [u32; 2], m32, crate::codegen::m32x2 } -+impl_shuffle! { [u32; 4], m32, crate::codegen::m32x4 } -+impl_shuffle! { [u32; 8], m32, crate::codegen::m32x8 } -+impl_shuffle! { [u32; 16], m32, crate::codegen::m32x16 } - - /* FIXME: 64-bit single element vector --impl Shuffle<[u32; 1]> for i64 { -- type Output = crate::codegen::i64x1; --} -+impl_shuffle! { [u32; 1], i64, crate::codegen::i64x1 } - */ --impl Shuffle<[u32; 2]> for i64 { -- type Output = crate::codegen::i64x2; --} --impl Shuffle<[u32; 4]> for i64 { -- type Output = crate::codegen::i64x4; --} --impl Shuffle<[u32; 8]> for i64 { -- type Output = crate::codegen::i64x8; --} -+impl_shuffle! { [u32; 2], i64, crate::codegen::i64x2 } -+impl_shuffle! { [u32; 4], i64, crate::codegen::i64x4 } -+impl_shuffle! { [u32; 8], i64, crate::codegen::i64x8 } - - /* FIXME: 64-bit single element vector --impl Shuffle<[u32; 1]> for u64 { -- type Output = crate::codegen::u64x1; --} -+impl_shuffle! { [u32; 1], i64, crate::codegen::i64x1 } - */ --impl Shuffle<[u32; 2]> for u64 { -- type Output = crate::codegen::u64x2; --} --impl Shuffle<[u32; 4]> for u64 { -- type Output = crate::codegen::u64x4; --} --impl Shuffle<[u32; 8]> for u64 { -- type Output = crate::codegen::u64x8; --} -+impl_shuffle! { [u32; 2], u64, crate::codegen::u64x2 } -+impl_shuffle! { [u32; 4], u64, crate::codegen::u64x4 } -+impl_shuffle! { [u32; 8], u64, crate::codegen::u64x8 } - - /* FIXME: 64-bit single element vector --impl Shuffle<[u32; 1]> for f64 { -- type Output = crate::codegen::f64x1; --} -+impl_shuffle! { [u32; 1], i64, crate::codegen::i64x1 } - */ --impl Shuffle<[u32; 2]> for f64 { -- type Output = crate::codegen::f64x2; --} --impl Shuffle<[u32; 4]> for f64 { -- type Output = crate::codegen::f64x4; --} --impl Shuffle<[u32; 8]> for f64 { -- type Output = crate::codegen::f64x8; --} -+impl_shuffle! { [u32; 2], f64, crate::codegen::f64x2 } -+impl_shuffle! { [u32; 4], f64, crate::codegen::f64x4 } -+impl_shuffle! { [u32; 8], f64, crate::codegen::f64x8 } - - /* FIXME: 64-bit single element vector --impl Shuffle<[u32; 1]> for m64 { -- type Output = crate::codegen::m64x1; --} -+impl_shuffle! { [u32; 1], i64, crate::codegen::i64x1 } - */ --impl Shuffle<[u32; 2]> for m64 { -- type Output = crate::codegen::m64x2; --} --impl Shuffle<[u32; 4]> for m64 { -- type Output = crate::codegen::m64x4; --} --impl Shuffle<[u32; 8]> for m64 { -- type Output = crate::codegen::m64x8; --} -+impl_shuffle! { [u32; 2], m64, crate::codegen::m64x2 } -+impl_shuffle! { [u32; 4], m64, crate::codegen::m64x4 } -+impl_shuffle! { [u32; 8], m64, crate::codegen::m64x8 } - --impl Shuffle<[u32; 2]> for isize { -- type Output = crate::codegen::isizex2; --} --impl Shuffle<[u32; 4]> for isize { -- type Output = crate::codegen::isizex4; --} --impl Shuffle<[u32; 8]> for isize { -- type Output = crate::codegen::isizex8; --} -+impl_shuffle! { [u32; 2], isize, crate::codegen::isizex2 } -+impl_shuffle! { [u32; 4], isize, crate::codegen::isizex4 } -+impl_shuffle! { [u32; 8], isize, crate::codegen::isizex8 } - --impl Shuffle<[u32; 2]> for usize { -- type Output = crate::codegen::usizex2; --} --impl Shuffle<[u32; 4]> for usize { -- type Output = crate::codegen::usizex4; --} --impl Shuffle<[u32; 8]> for usize { -- type Output = crate::codegen::usizex8; --} -+impl_shuffle! { [u32; 2], usize, crate::codegen::usizex2 } -+impl_shuffle! { [u32; 4], usize, crate::codegen::usizex4 } -+impl_shuffle! { [u32; 8], usize, crate::codegen::usizex8 } - -+impl_shuffle! { [u32; 2], msize, crate::codegen::msizex2 } -+impl_shuffle! { [u32; 4], msize, crate::codegen::msizex4 } -+impl_shuffle! { [u32; 8], msize, crate::codegen::msizex8 } -+ -+impl Seal<[u32; 2]> for *const T {} - impl Shuffle<[u32; 2]> for *const T { - type Output = crate::codegen::cptrx2; - } -+impl Seal<[u32; 4]> for *const T {} - impl Shuffle<[u32; 4]> for *const T { - type Output = crate::codegen::cptrx4; - } -+impl Seal<[u32; 8]> for *const T {} - impl Shuffle<[u32; 8]> for *const T { - type Output = crate::codegen::cptrx8; - } - -+impl Seal<[u32; 2]> for *mut T {} - impl Shuffle<[u32; 2]> for *mut T { - type Output = crate::codegen::mptrx2; - } -+impl Seal<[u32; 4]> for *mut T {} - impl Shuffle<[u32; 4]> for *mut T { - type Output = crate::codegen::mptrx4; - } -+impl Seal<[u32; 8]> for *mut T {} - impl Shuffle<[u32; 8]> for *mut T { - type Output = crate::codegen::mptrx8; - } - --impl Shuffle<[u32; 2]> for msize { -- type Output = crate::codegen::msizex2; --} --impl Shuffle<[u32; 4]> for msize { -- type Output = crate::codegen::msizex4; --} --impl Shuffle<[u32; 8]> for msize { -- type Output = crate::codegen::msizex8; --} -+impl_shuffle! { [u32; 1], i128, crate::codegen::i128x1 } -+impl_shuffle! { [u32; 2], i128, crate::codegen::i128x2 } -+impl_shuffle! { [u32; 4], i128, crate::codegen::i128x4 } - --impl Shuffle<[u32; 1]> for i128 { -- type Output = crate::codegen::i128x1; --} --impl Shuffle<[u32; 2]> for i128 { -- type Output = crate::codegen::i128x2; --} --impl Shuffle<[u32; 4]> for i128 { -- type Output = crate::codegen::i128x4; --} -+impl_shuffle! { [u32; 1], u128, crate::codegen::u128x1 } -+impl_shuffle! { [u32; 2], u128, crate::codegen::u128x2 } -+impl_shuffle! { [u32; 4], u128, crate::codegen::u128x4 } - --impl Shuffle<[u32; 1]> for u128 { -- type Output = crate::codegen::u128x1; --} --impl Shuffle<[u32; 2]> for u128 { -- type Output = crate::codegen::u128x2; --} --impl Shuffle<[u32; 4]> for u128 { -- type Output = crate::codegen::u128x4; --} -- --impl Shuffle<[u32; 1]> for m128 { -- type Output = crate::codegen::m128x1; --} --impl Shuffle<[u32; 2]> for m128 { -- type Output = crate::codegen::m128x2; --} --impl Shuffle<[u32; 4]> for m128 { -- type Output = crate::codegen::m128x4; --} -+impl_shuffle! { [u32; 1], m128, crate::codegen::m128x1 } -+impl_shuffle! { [u32; 2], m128, crate::codegen::m128x2 } -+impl_shuffle! { [u32; 4], m128, crate::codegen::m128x4 } -diff --git a/third_party/rust/packed_simd/src/codegen/shuffle1_dyn.rs b/third_party/rust/packed_simd/src/codegen/shuffle1_dyn.rs -index 1e9f5816371a9..a5403a06bb6eb 100644 ---- a/third_party/rust/packed_simd/src/codegen/shuffle1_dyn.rs -+++ b/third_party/rust/packed_simd/src/codegen/shuffle1_dyn.rs -@@ -28,43 +28,22 @@ macro_rules! impl_fallback { - macro_rules! impl_shuffle1_dyn { - (u8x8) => { - cfg_if! { -- if #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), -- target_feature = "ssse3"))] { -- impl Shuffle1Dyn for u8x8 { -- type Indices = Self; -- #[inline] -- fn shuffle1_dyn(self, indices: Self::Indices) -> Self { -- #[cfg(target_arch = "x86")] -- use crate::arch::x86::_mm_shuffle_pi8; -- #[cfg(target_arch = "x86_64")] -- use crate::arch::x86_64::_mm_shuffle_pi8; -- -- unsafe { -- crate::mem::transmute( -- _mm_shuffle_pi8( -- crate::mem::transmute(self.0), -- crate::mem::transmute(indices.0) -- ) -- ) -- } -- } -- } -- } else if #[cfg(all( -+ if #[cfg(all( - any( -- all(target_aarch = "aarch64", target_feature = "neon"), -- all(target_aarch = "arm", target_feature = "v7", -+ all(target_arch = "aarch64", target_feature = "neon"), -+ all(target_arch = "doesnotexist", target_feature = "v7", - target_feature = "neon") - ), - any(feature = "core_arch", libcore_neon) - ) - )] { - impl Shuffle1Dyn for u8x8 { - type Indices = Self; - #[inline] - fn shuffle1_dyn(self, indices: Self::Indices) -> Self { -- #[cfg(targt_arch = "aarch64")] -+ #[cfg(target_arch = "aarch64")] - use crate::arch::aarch64::vtbl1_u8; -- #[cfg(targt_arch = "arm")] -+ #[cfg(target_arch = "doesnotexist")] - use crate::arch::arm::vtbl1_u8; - - // This is safe because the binary is compiled with -@@ -106,26 +85,26 @@ macro_rules! impl_shuffle1_dyn { - } - } - } -- } else if #[cfg(all(target_aarch = "aarch64", target_feature = "neon", -+ } else if #[cfg(all(target_arch = "aarch64", target_feature = "neon", - any(feature = "core_arch", libcore_neon)))] { - impl Shuffle1Dyn for u8x16 { - type Indices = Self; - #[inline] - fn shuffle1_dyn(self, indices: Self::Indices) -> Self { - use crate::arch::aarch64::vqtbl1q_u8; - - // This is safe because the binary is compiled with - // neon enabled at compile-time and can therefore only - // run on CPUs that have it enabled. - unsafe { - Simd(mem::transmute( - vqtbl1q_u8(mem::transmute(self.0), - crate::mem::transmute(indices.0)) - )) - } - } - } -- } else if #[cfg(all(target_aarch = "arm", target_feature = "v7", -+ } else if #[cfg(all(target_arch = "doesnotexist", target_feature = "v7", - target_feature = "neon", - any(feature = "core_arch", libcore_neon)))] { - impl Shuffle1Dyn for u8x16 { -diff --git a/third_party/rust/packed_simd/src/codegen/vPtr.rs b/third_party/rust/packed_simd/src/codegen/vPtr.rs -index 1f2bc7714dd96..cf4765538178d 100644 ---- a/third_party/rust/packed_simd/src/codegen/vPtr.rs -+++ b/third_party/rust/packed_simd/src/codegen/vPtr.rs -@@ -8,13 +8,15 @@ macro_rules! impl_simd_ptr { - pub struct $tuple_id<$ty>($(crate $tys),*); - //^^^^^^^ leaked through SimdArray - -+ impl<$ty> crate::sealed::Seal for [$ptr_ty; $elem_count] {} - impl<$ty> crate::sealed::SimdArray for [$ptr_ty; $elem_count] { - type Tuple = $tuple_id<$ptr_ty>; - type T = $ptr_ty; - const N: usize = $elem_count; - type NT = [u32; $elem_count]; - } - -+ impl<$ty> crate::sealed::Seal for $tuple_id<$ptr_ty> {} - impl<$ty> crate::sealed::Simd for $tuple_id<$ptr_ty> { - type Element = $ptr_ty; - const LANES: usize = $elem_count; -diff --git a/third_party/rust/packed_simd/src/lib.rs b/third_party/rust/packed_simd/src/lib.rs -index d73645e72fbea..b0b56d4d74618 100644 ---- a/third_party/rust/packed_simd/src/lib.rs -+++ b/third_party/rust/packed_simd/src/lib.rs -@@ -201,30 +201,35 @@ - - #![feature( - repr_simd, -+ rustc_attrs, - const_fn, - platform_intrinsics, - stdsimd, - aarch64_target_feature, - arm_target_feature, - link_llvm_intrinsics, - core_intrinsics, - stmt_expr_attributes, -- align_offset, -- mmx_target_feature, - crate_visibility_modifier, - custom_inner_attributes - )] - #![allow(non_camel_case_types, non_snake_case, -- clippy::cast_possible_truncation, -- clippy::cast_lossless, -- clippy::cast_possible_wrap, -- clippy::cast_precision_loss, -- // This lint is currently broken for generic code -- // See https://github.com/rust-lang/rust-clippy/issues/3410 -- clippy::use_self -+ // FIXME: these types are unsound in C FFI already -+ // See https://github.com/rust-lang/rust/issues/53346 -+ improper_ctypes_definitions, -+ clippy::cast_possible_truncation, -+ clippy::cast_lossless, -+ clippy::cast_possible_wrap, -+ clippy::cast_precision_loss, -+ // TODO: manually add the `#[must_use]` attribute where appropriate -+ clippy::must_use_candidate, -+ // This lint is currently broken for generic code -+ // See https://github.com/rust-lang/rust-clippy/issues/3410 -+ clippy::use_self, -+ clippy::wrong_self_convention, - )] - #![cfg_attr(test, feature(hashmap_internals))] --#![deny(warnings, rust_2018_idioms, clippy::missing_inline_in_public_items)] -+#![deny(rust_2018_idioms, clippy::missing_inline_in_public_items)] - #![no_std] - - use cfg_if::cfg_if; -@@ -256,26 +261,30 @@ mod api; - mod codegen; - mod sealed; - -+pub use crate::sealed::{Simd as SimdVector, Shuffle, SimdArray, Mask}; -+ - /// Packed SIMD vector type. - /// - /// # Examples - /// - /// ``` - /// # use packed_simd::Simd; - /// let v = Simd::<[i32; 4]>::new(0, 1, 2, 3); - /// assert_eq!(v.extract(2), 2); - /// ``` - #[repr(transparent)] - #[derive(Copy, Clone)] - pub struct Simd( - // FIXME: this type should be private, - // but it currently must be public for the - // `shuffle!` macro to work: it needs to - // access the internal `repr(simd)` type - // to call the shuffle intrinsics. - #[doc(hidden)] pub ::Tuple, - ); - -+impl sealed::Seal for Simd {} -+ - /// Wrapper over `T` implementing a lexicoraphical order via the `PartialOrd` - /// and/or `Ord` traits. - #[repr(transparent)] -diff --git a/third_party/rust/packed_simd/src/masks.rs b/third_party/rust/packed_simd/src/masks.rs -index f83c4da95750f..aeb36d2328046 100644 ---- a/third_party/rust/packed_simd/src/masks.rs -+++ b/third_party/rust/packed_simd/src/masks.rs -@@ -6,7 +6,9 @@ macro_rules! impl_mask_ty { - #[derive(Copy, Clone)] - pub struct $id($elem_ty); - -+ impl crate::sealed::Seal for $id {} - impl crate::sealed::Mask for $id { -+ #[inline] - fn test(&self) -> bool { - $id::test(self) - } -diff --git a/third_party/rust/packed_simd/src/sealed.rs b/third_party/rust/packed_simd/src/sealed.rs -index 832acd3f1d54c..0ec20300fdd42 100644 ---- a/third_party/rust/packed_simd/src/sealed.rs -+++ b/third_party/rust/packed_simd/src/sealed.rs -@@ -1,41 +1,42 @@ - //! Sealed traits - -+/// A sealed trait, this is logically private to the crate -+/// and will prevent implementations from outside the crate -+pub trait Seal {} -+ - /// Trait implemented by arrays that can be SIMD types. --#[doc(hidden)] --pub trait SimdArray { -+pub trait SimdArray: Seal { - /// The type of the #[repr(simd)] type. - type Tuple: Copy + Clone; - /// The element type of the vector. - type T; - /// The number of elements in the array. - const N: usize; - /// The type: `[u32; Self::N]`. - type NT; - } - - /// This traits is used to constraint the arguments - /// and result type of the portable shuffles. - #[doc(hidden)] --pub trait Shuffle { -+pub trait Shuffle: Seal { - // Lanes is a `[u32; N]` where `N` is the number of vector lanes - - /// The result type of the shuffle. - type Output; - } - - /// This trait is implemented by all SIMD vector types. --#[doc(hidden)] --pub trait Simd { -+pub trait Simd: Seal { - /// Element type of the SIMD vector - type Element; - /// The number of elements in the SIMD vector. - const LANES: usize; - /// The type: `[u32; Self::N]`. - type LanesType; - } - - /// This trait is implemented by all mask types --#[doc(hidden)] --pub trait Mask { -+pub trait Mask: Seal { - fn test(&self) -> bool; - } -diff --git a/third_party/rust/packed_simd/src/testing/utils.rs b/third_party/rust/packed_simd/src/testing/utils.rs -index 7b8f21ac1c552..21f27aae54329 100644 ---- a/third_party/rust/packed_simd/src/testing/utils.rs -+++ b/third_party/rust/packed_simd/src/testing/utils.rs -@@ -1,45 +1,52 @@ - //! Testing utilities - - #![allow(dead_code)] -+// FIXME: Or don't. But it's true this is a problematic comparison. -+#![allow(clippy::neg_cmp_op_on_partial_ord)] - - use crate::{cmp::PartialOrd, fmt::Debug, LexicographicallyOrdered}; - - /// Tests PartialOrd for `a` and `b` where `a < b` is true. - pub fn test_lt( - a: LexicographicallyOrdered, b: LexicographicallyOrdered, - ) where - LexicographicallyOrdered: Debug + PartialOrd, - { - assert!(a < b, "{:?}, {:?}", a, b); - assert!(b > a, "{:?}, {:?}", a, b); - - assert!(!(a == b), "{:?}, {:?}", a, b); - assert!(a != b, "{:?}, {:?}", a, b); - - assert!(a <= b, "{:?}, {:?}", a, b); - assert!(b >= a, "{:?}, {:?}", a, b); - -- // Irreflexivity -- assert!(!(a < a), "{:?}, {:?}", a, b); -- assert!(!(b < b), "{:?}, {:?}", a, b); -- assert!(!(a > a), "{:?}, {:?}", a, b); -- assert!(!(b > b), "{:?}, {:?}", a, b); -+ // The elegance of the mathematical expression of irreflexivity is more -+ // than clippy can handle. -+ #[allow(clippy::eq_op)] -+ { -+ // Irreflexivity -+ assert!(!(a < a), "{:?}, {:?}", a, b); -+ assert!(!(b < b), "{:?}, {:?}", a, b); -+ assert!(!(a > a), "{:?}, {:?}", a, b); -+ assert!(!(b > b), "{:?}, {:?}", a, b); - -- assert!(a <= a, "{:?}, {:?}", a, b); -- assert!(b <= b, "{:?}, {:?}", a, b); -+ assert!(a <= a, "{:?}, {:?}", a, b); -+ assert!(b <= b, "{:?}, {:?}", a, b); -+ } - } - - /// Tests PartialOrd for `a` and `b` where `a <= b` is true. - pub fn test_le( - a: LexicographicallyOrdered, b: LexicographicallyOrdered, - ) where - LexicographicallyOrdered: Debug + PartialOrd, - { - assert!(a <= b, "{:?}, {:?}", a, b); - assert!(b >= a, "{:?}, {:?}", a, b); - -- assert!(a == b || a < b, "{:?}, {:?}", a, b); -- assert!(a == b || b > a, "{:?}, {:?}", a, b); -+ assert!(a <= b, "{:?}, {:?}", a, b); -+ assert!(b >= a, "{:?}, {:?}", a, b); - - if a == b { - assert!(!(a < b), "{:?}, {:?}", a, b); -diff --git a/third_party/rust/packed_simd/src/v128.rs b/third_party/rust/packed_simd/src/v128.rs -index 1d0282dc42788..7949f6619a4ff 100644 ---- a/third_party/rust/packed_simd/src/v128.rs -+++ b/third_party/rust/packed_simd/src/v128.rs -@@ -1,80 +1,80 @@ - //! 128-bit wide vector types --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - --impl_i!([i8; 16]: i8x16, m8x16 | i8 | test_v128 | -+impl_i!([i8; 16]: i8x16, m8x16 | i8, u16 | test_v128 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: | - /// A 128-bit vector with 16 `i8` lanes. - ); --impl_u!([u8; 16]: u8x16, m8x16 | u8 | test_v128 | -+impl_u!([u8; 16]: u8x16, m8x16 | u8, u16 | test_v128 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: | - /// A 128-bit vector with 16 `u8` lanes. - ); --impl_m!([m8; 16]: m8x16 | i8 | test_v128 | -+impl_m!([m8; 16]: m8x16 | i8, u16 | test_v128 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: m16x16 | - /// A 128-bit vector mask with 16 `m8` lanes. - ); - --impl_i!([i16; 8]: i16x8, m16x8 | i16 | test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_i!([i16; 8]: i16x8, m16x8 | i16, u8 | test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: i8x8, u8x8 | - /// A 128-bit vector with 8 `i16` lanes. - ); --impl_u!([u16; 8]: u16x8, m16x8 | u16| test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_u!([u16; 8]: u16x8, m16x8 | u16, u8 | test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: u8x8 | - /// A 128-bit vector with 8 `u16` lanes. - ); --impl_m!([m16; 8]: m16x8 | i16 | test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_m!([m16; 8]: m16x8 | i16, u8 | test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: m8x8, m32x8 | - /// A 128-bit vector mask with 8 `m16` lanes. - ); - --impl_i!([i32; 4]: i32x4, m32x4 | i32 | test_v128 | x0, x1, x2, x3 | -+impl_i!([i32; 4]: i32x4, m32x4 | i32, u8 | test_v128 | x0, x1, x2, x3 | - From: i8x4, u8x4, i16x4, u16x4 | - /// A 128-bit vector with 4 `i32` lanes. - ); --impl_u!([u32; 4]: u32x4, m32x4 | u32| test_v128 | x0, x1, x2, x3 | -+impl_u!([u32; 4]: u32x4, m32x4 | u32, u8 | test_v128 | x0, x1, x2, x3 | - From: u8x4, u16x4 | - /// A 128-bit vector with 4 `u32` lanes. - ); - impl_f!([f32; 4]: f32x4, m32x4 | f32 | test_v128 | x0, x1, x2, x3 | - From: i8x4, u8x4, i16x4, u16x4 | - /// A 128-bit vector with 4 `f32` lanes. - ); --impl_m!([m32; 4]: m32x4 | i32 | test_v128 | x0, x1, x2, x3 | -+impl_m!([m32; 4]: m32x4 | i32, u8 | test_v128 | x0, x1, x2, x3 | - From: m8x4, m16x4, m64x4 | - /// A 128-bit vector mask with 4 `m32` lanes. - ); - --impl_i!([i64; 2]: i64x2, m64x2 | i64 | test_v128 | x0, x1 | -+impl_i!([i64; 2]: i64x2, m64x2 | i64, u8 | test_v128 | x0, x1 | - From: i8x2, u8x2, i16x2, u16x2, i32x2, u32x2 | - /// A 128-bit vector with 2 `i64` lanes. - ); --impl_u!([u64; 2]: u64x2, m64x2 | u64 | test_v128 | x0, x1 | -+impl_u!([u64; 2]: u64x2, m64x2 | u64, u8 | test_v128 | x0, x1 | - From: u8x2, u16x2, u32x2 | - /// A 128-bit vector with 2 `u64` lanes. - ); - impl_f!([f64; 2]: f64x2, m64x2 | f64 | test_v128 | x0, x1 | - From: i8x2, u8x2, i16x2, u16x2, i32x2, u32x2, f32x2 | - /// A 128-bit vector with 2 `f64` lanes. - ); --impl_m!([m64; 2]: m64x2 | i64 | test_v128 | x0, x1 | -+impl_m!([m64; 2]: m64x2 | i64, u8 | test_v128 | x0, x1 | - From: m8x2, m16x2, m32x2, m128x2 | - /// A 128-bit vector mask with 2 `m64` lanes. - ); - --impl_i!([i128; 1]: i128x1, m128x1 | i128 | test_v128 | x0 | -+impl_i!([i128; 1]: i128x1, m128x1 | i128, u8 | test_v128 | x0 | - From: /*i8x1, u8x1, i16x1, u16x1, i32x1, u32x1, i64x1, u64x1 */ | // FIXME: unary small vector types - /// A 128-bit vector with 1 `i128` lane. - ); --impl_u!([u128; 1]: u128x1, m128x1 | u128 | test_v128 | x0 | -+impl_u!([u128; 1]: u128x1, m128x1 | u128, u8 | test_v128 | x0 | - From: /*u8x1, u16x1, u32x1, u64x1 */ | // FIXME: unary small vector types - /// A 128-bit vector with 1 `u128` lane. - ); --impl_m!([m128; 1]: m128x1 | i128 | test_v128 | x0 | -+impl_m!([m128; 1]: m128x1 | i128, u8 | test_v128 | x0 | - From: /*m8x1, m16x1, m32x1, m64x1 */ | // FIXME: unary small vector types - /// A 128-bit vector mask with 1 `m128` lane. - ); -diff --git a/third_party/rust/packed_simd/src/v16.rs b/third_party/rust/packed_simd/src/v16.rs -index 67a3832d2530d..4ca5afb2a7d59 100644 ---- a/third_party/rust/packed_simd/src/v16.rs -+++ b/third_party/rust/packed_simd/src/v16.rs -@@ -2,15 +2,15 @@ - - use crate::*; - --impl_i!([i8; 2]: i8x2, m8x2 | i8 | test_v16 | x0, x1 | -+impl_i!([i8; 2]: i8x2, m8x2 | i8, u8 | test_v16 | x0, x1 | - From: | - /// A 16-bit vector with 2 `i8` lanes. - ); --impl_u!([u8; 2]: u8x2, m8x2 | u8 | test_v16 | x0, x1 | -+impl_u!([u8; 2]: u8x2, m8x2 | u8, u8 | test_v16 | x0, x1 | - From: | - /// A 16-bit vector with 2 `u8` lanes. - ); --impl_m!([m8; 2]: m8x2 | i8 | test_v16 | x0, x1 | -+impl_m!([m8; 2]: m8x2 | i8, u8 | test_v16 | x0, x1 | - From: m16x2, m32x2, m64x2, m128x2 | - /// A 16-bit vector mask with 2 `m8` lanes. - ); -diff --git a/third_party/rust/packed_simd/src/v256.rs b/third_party/rust/packed_simd/src/v256.rs -index 6b59336f68b6e..f0c3bc281383e 100644 ---- a/third_party/rust/packed_simd/src/v256.rs -+++ b/third_party/rust/packed_simd/src/v256.rs -@@ -1,86 +1,86 @@ - //! 256-bit wide vector types --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - --impl_i!([i8; 32]: i8x32, m8x32 | i8 | test_v256 | -+impl_i!([i8; 32]: i8x32, m8x32 | i8, u32 | test_v256 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, - x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 | - From: | - /// A 256-bit vector with 32 `i8` lanes. - ); --impl_u!([u8; 32]: u8x32, m8x32 | u8 | test_v256 | -+impl_u!([u8; 32]: u8x32, m8x32 | u8, u32 | test_v256 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, - x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 | - From: | - /// A 256-bit vector with 32 `u8` lanes. - ); --impl_m!([m8; 32]: m8x32 | i8 | test_v256 | -+impl_m!([m8; 32]: m8x32 | i8, u32 | test_v256 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, - x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 | - From: | - /// A 256-bit vector mask with 32 `m8` lanes. - ); - --impl_i!([i16; 16]: i16x16, m16x16 | i16 | test_v256 | -+impl_i!([i16; 16]: i16x16, m16x16 | i16, u16 | test_v256 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: i8x16, u8x16 | - /// A 256-bit vector with 16 `i16` lanes. - ); --impl_u!([u16; 16]: u16x16, m16x16 | u16 | test_v256 | -+impl_u!([u16; 16]: u16x16, m16x16 | u16, u16 | test_v256 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: u8x16 | - /// A 256-bit vector with 16 `u16` lanes. - ); --impl_m!([m16; 16]: m16x16 | i16 | test_v256 | -+impl_m!([m16; 16]: m16x16 | i16, u16 | test_v256 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: m8x16 | - /// A 256-bit vector mask with 16 `m16` lanes. - ); - --impl_i!([i32; 8]: i32x8, m32x8 | i32 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_i!([i32; 8]: i32x8, m32x8 | i32, u8 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: i8x8, u8x8, i16x8, u16x8 | - /// A 256-bit vector with 8 `i32` lanes. - ); --impl_u!([u32; 8]: u32x8, m32x8 | u32 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_u!([u32; 8]: u32x8, m32x8 | u32, u8 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: u8x8, u16x8 | - /// A 256-bit vector with 8 `u32` lanes. - ); - impl_f!([f32; 8]: f32x8, m32x8 | f32 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: i8x8, u8x8, i16x8, u16x8 | - /// A 256-bit vector with 8 `f32` lanes. - ); --impl_m!([m32; 8]: m32x8 | i32 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_m!([m32; 8]: m32x8 | i32, u8 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: m8x8, m16x8 | - /// A 256-bit vector mask with 8 `m32` lanes. - ); - --impl_i!([i64; 4]: i64x4, m64x4 | i64 | test_v256 | x0, x1, x2, x3 | -+impl_i!([i64; 4]: i64x4, m64x4 | i64, u8 | test_v256 | x0, x1, x2, x3 | - From: i8x4, u8x4, i16x4, u16x4, i32x4, u32x4 | - /// A 256-bit vector with 4 `i64` lanes. - ); --impl_u!([u64; 4]: u64x4, m64x4 | u64 | test_v256 | x0, x1, x2, x3 | -+impl_u!([u64; 4]: u64x4, m64x4 | u64, u8 | test_v256 | x0, x1, x2, x3 | - From: u8x4, u16x4, u32x4 | - /// A 256-bit vector with 4 `u64` lanes. - ); - impl_f!([f64; 4]: f64x4, m64x4 | f64 | test_v256 | x0, x1, x2, x3 | - From: i8x4, u8x4, i16x4, u16x4, i32x4, u32x4, f32x4 | - /// A 256-bit vector with 4 `f64` lanes. - ); --impl_m!([m64; 4]: m64x4 | i64 | test_v256 | x0, x1, x2, x3 | -+impl_m!([m64; 4]: m64x4 | i64, u8 | test_v256 | x0, x1, x2, x3 | - From: m8x4, m16x4, m32x4 | - /// A 256-bit vector mask with 4 `m64` lanes. - ); - --impl_i!([i128; 2]: i128x2, m128x2 | i128 | test_v256 | x0, x1 | -+impl_i!([i128; 2]: i128x2, m128x2 | i128, u8 | test_v256 | x0, x1 | - From: i8x2, u8x2, i16x2, u16x2, i32x2, u32x2, i64x2, u64x2 | - /// A 256-bit vector with 2 `i128` lanes. - ); --impl_u!([u128; 2]: u128x2, m128x2 | u128 | test_v256 | x0, x1 | -+impl_u!([u128; 2]: u128x2, m128x2 | u128, u8 | test_v256 | x0, x1 | - From: u8x2, u16x2, u32x2, u64x2 | - /// A 256-bit vector with 2 `u128` lanes. - ); --impl_m!([m128; 2]: m128x2 | i128 | test_v256 | x0, x1 | -+impl_m!([m128; 2]: m128x2 | i128, u8 | test_v256 | x0, x1 | - From: m8x2, m16x2, m32x2, m64x2 | - /// A 256-bit vector mask with 2 `m128` lanes. - ); -diff --git a/third_party/rust/packed_simd/src/v32.rs b/third_party/rust/packed_simd/src/v32.rs -index 09cef9bdd4720..75a1838e5e0e1 100644 ---- a/third_party/rust/packed_simd/src/v32.rs -+++ b/third_party/rust/packed_simd/src/v32.rs -@@ -2,28 +2,28 @@ - - use crate::*; - --impl_i!([i8; 4]: i8x4, m8x4 | i8 | test_v32 | x0, x1, x2, x3 | -+impl_i!([i8; 4]: i8x4, m8x4 | i8, u8 | test_v32 | x0, x1, x2, x3 | - From: | - /// A 32-bit vector with 4 `i8` lanes. - ); --impl_u!([u8; 4]: u8x4, m8x4 | u8 | test_v32 | x0, x1, x2, x3 | -+impl_u!([u8; 4]: u8x4, m8x4 | u8, u8 | test_v32 | x0, x1, x2, x3 | - From: | - /// A 32-bit vector with 4 `u8` lanes. - ); --impl_m!([m8; 4]: m8x4 | i8 | test_v32 | x0, x1, x2, x3 | -+impl_m!([m8; 4]: m8x4 | i8, u8 | test_v32 | x0, x1, x2, x3 | - From: m16x4, m32x4, m64x4 | - /// A 32-bit vector mask with 4 `m8` lanes. - ); - --impl_i!([i16; 2]: i16x2, m16x2 | i16 | test_v32 | x0, x1 | -+impl_i!([i16; 2]: i16x2, m16x2 | i16, u8 | test_v32 | x0, x1 | - From: i8x2, u8x2 | - /// A 32-bit vector with 2 `i16` lanes. - ); --impl_u!([u16; 2]: u16x2, m16x2 | u16 | test_v32 | x0, x1 | -+impl_u!([u16; 2]: u16x2, m16x2 | u16, u8 | test_v32 | x0, x1 | - From: u8x2 | - /// A 32-bit vector with 2 `u16` lanes. - ); --impl_m!([m16; 2]: m16x2 | i16 | test_v32 | x0, x1 | -+impl_m!([m16; 2]: m16x2 | i16, u8 | test_v32 | x0, x1 | - From: m8x2, m32x2, m64x2, m128x2 | - /// A 32-bit vector mask with 2 `m16` lanes. - ); -diff --git a/third_party/rust/packed_simd/src/v512.rs b/third_party/rust/packed_simd/src/v512.rs -index b1714aded3690..4c8c71338aca1 100644 ---- a/third_party/rust/packed_simd/src/v512.rs -+++ b/third_party/rust/packed_simd/src/v512.rs -@@ -1,99 +1,99 @@ - //! 512-bit wide vector types --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - --impl_i!([i8; 64]: i8x64, m8x64 | i8 | test_v512 | -+impl_i!([i8; 64]: i8x64, m8x64 | i8, u64 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, - x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, - x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47, - x48, x49, x50, x51, x52, x53, x54, x55, x56, x57, x58, x59, x60, x61, x62, x63 | - From: | - /// A 512-bit vector with 64 `i8` lanes. - ); --impl_u!([u8; 64]: u8x64, m8x64 | u8 | test_v512 | -+impl_u!([u8; 64]: u8x64, m8x64 | u8, u64 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, - x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, - x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47, - x48, x49, x50, x51, x52, x53, x54, x55, x56, x57, x58, x59, x60, x61, x62, x63 | - From: | - /// A 512-bit vector with 64 `u8` lanes. - ); --impl_m!([m8; 64]: m8x64 | i8 | test_v512 | -+impl_m!([m8; 64]: m8x64 | i8, u64 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, - x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, - x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47, - x48, x49, x50, x51, x52, x53, x54, x55, x56, x57, x58, x59, x60, x61, x62, x63 | - From: | - /// A 512-bit vector mask with 64 `m8` lanes. - ); - --impl_i!([i16; 32]: i16x32, m16x32 | i16 | test_v512 | -+impl_i!([i16; 32]: i16x32, m16x32 | i16, u32 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, - x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 | - From: i8x32, u8x32 | - /// A 512-bit vector with 32 `i16` lanes. - ); --impl_u!([u16; 32]: u16x32, m16x32 | u16 | test_v512 | -+impl_u!([u16; 32]: u16x32, m16x32 | u16, u32 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, - x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 | - From: u8x32 | - /// A 512-bit vector with 32 `u16` lanes. - ); --impl_m!([m16; 32]: m16x32 | i16 | test_v512 | -+impl_m!([m16; 32]: m16x32 | i16, u32 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, - x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 | - From: m8x32 | - /// A 512-bit vector mask with 32 `m16` lanes. - ); - --impl_i!([i32; 16]: i32x16, m32x16 | i32 | test_v512 | -+impl_i!([i32; 16]: i32x16, m32x16 | i32, u16 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: i8x16, u8x16, i16x16, u16x16 | - /// A 512-bit vector with 16 `i32` lanes. - ); --impl_u!([u32; 16]: u32x16, m32x16 | u32 | test_v512 | -+impl_u!([u32; 16]: u32x16, m32x16 | u32, u16 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: u8x16, u16x16 | - /// A 512-bit vector with 16 `u32` lanes. - ); - impl_f!([f32; 16]: f32x16, m32x16 | f32 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: i8x16, u8x16, i16x16, u16x16 | - /// A 512-bit vector with 16 `f32` lanes. - ); --impl_m!([m32; 16]: m32x16 | i32 | test_v512 | -+impl_m!([m32; 16]: m32x16 | i32, u16 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: m8x16, m16x16 | - /// A 512-bit vector mask with 16 `m32` lanes. - ); - --impl_i!([i64; 8]: i64x8, m64x8 | i64 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_i!([i64; 8]: i64x8, m64x8 | i64, u8 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: i8x8, u8x8, i16x8, u16x8, i32x8, u32x8 | - /// A 512-bit vector with 8 `i64` lanes. - ); --impl_u!([u64; 8]: u64x8, m64x8 | u64 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_u!([u64; 8]: u64x8, m64x8 | u64, u8 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: u8x8, u16x8, u32x8 | - /// A 512-bit vector with 8 `u64` lanes. - ); - impl_f!([f64; 8]: f64x8, m64x8 | f64 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: i8x8, u8x8, i16x8, u16x8, i32x8, u32x8, f32x8 | - /// A 512-bit vector with 8 `f64` lanes. - ); --impl_m!([m64; 8]: m64x8 | i64 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_m!([m64; 8]: m64x8 | i64, u8 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: m8x8, m16x8, m32x8 | - /// A 512-bit vector mask with 8 `m64` lanes. - ); - --impl_i!([i128; 4]: i128x4, m128x4 | i128 | test_v512 | x0, x1, x2, x3 | -+impl_i!([i128; 4]: i128x4, m128x4 | i128, u8 | test_v512 | x0, x1, x2, x3 | - From: i8x4, u8x4, i16x4, u16x4, i32x4, u32x4, i64x4, u64x4 | - /// A 512-bit vector with 4 `i128` lanes. - ); --impl_u!([u128; 4]: u128x4, m128x4 | u128 | test_v512 | x0, x1, x2, x3 | -+impl_u!([u128; 4]: u128x4, m128x4 | u128, u8 | test_v512 | x0, x1, x2, x3 | - From: u8x4, u16x4, u32x4, u64x4 | - /// A 512-bit vector with 4 `u128` lanes. - ); --impl_m!([m128; 4]: m128x4 | i128 | test_v512 | x0, x1, x2, x3 | -+impl_m!([m128; 4]: m128x4 | i128, u8 | test_v512 | x0, x1, x2, x3 | - From: m8x4, m16x4, m32x4, m64x4 | - /// A 512-bit vector mask with 4 `m128` lanes. - ); -diff --git a/third_party/rust/packed_simd/src/v64.rs b/third_party/rust/packed_simd/src/v64.rs -index 1ee6219c040bd..bf6b9de61005c 100644 ---- a/third_party/rust/packed_simd/src/v64.rs -+++ b/third_party/rust/packed_simd/src/v64.rs -@@ -1,61 +1,61 @@ - //! 64-bit wide vector types --#![rustfmt::skip] -+#[rustfmt::skip] - - use super::*; - --impl_i!([i8; 8]: i8x8, m8x8 | i8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_i!([i8; 8]: i8x8, m8x8 | i8, u8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: | - /// A 64-bit vector with 8 `i8` lanes. - ); --impl_u!([u8; 8]: u8x8, m8x8 | u8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_u!([u8; 8]: u8x8, m8x8 | u8, u8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: | - /// A 64-bit vector with 8 `u8` lanes. - ); --impl_m!([m8; 8]: m8x8 | i8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_m!([m8; 8]: m8x8 | i8, u8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: m16x8, m32x8 | - /// A 64-bit vector mask with 8 `m8` lanes. - ); - --impl_i!([i16; 4]: i16x4, m16x4 | i16 | test_v64 | x0, x1, x2, x3 | -+impl_i!([i16; 4]: i16x4, m16x4 | i16, u8 | test_v64 | x0, x1, x2, x3 | - From: i8x4, u8x4 | - /// A 64-bit vector with 4 `i16` lanes. - ); --impl_u!([u16; 4]: u16x4, m16x4 | u16 | test_v64 | x0, x1, x2, x3 | -+impl_u!([u16; 4]: u16x4, m16x4 | u16, u8 | test_v64 | x0, x1, x2, x3 | - From: u8x4 | - /// A 64-bit vector with 4 `u16` lanes. - ); --impl_m!([m16; 4]: m16x4 | i16 | test_v64 | x0, x1, x2, x3 | -+impl_m!([m16; 4]: m16x4 | i16, u8 | test_v64 | x0, x1, x2, x3 | - From: m8x4, m32x4, m64x4 | - /// A 64-bit vector mask with 4 `m16` lanes. - ); - --impl_i!([i32; 2]: i32x2, m32x2 | i32 | test_v64 | x0, x1 | -+impl_i!([i32; 2]: i32x2, m32x2 | i32, u8 | test_v64 | x0, x1 | - From: i8x2, u8x2, i16x2, u16x2 | - /// A 64-bit vector with 2 `i32` lanes. - ); --impl_u!([u32; 2]: u32x2, m32x2 | u32 | test_v64 | x0, x1 | -+impl_u!([u32; 2]: u32x2, m32x2 | u32, u8 | test_v64 | x0, x1 | - From: u8x2, u16x2 | - /// A 64-bit vector with 2 `u32` lanes. - ); --impl_m!([m32; 2]: m32x2 | i32 | test_v64 | x0, x1 | -+impl_m!([m32; 2]: m32x2 | i32, u8 | test_v64 | x0, x1 | - From: m8x2, m16x2, m64x2, m128x2 | - /// A 64-bit vector mask with 2 `m32` lanes. - ); - impl_f!([f32; 2]: f32x2, m32x2 | f32 | test_v64 | x0, x1 | - From: i8x2, u8x2, i16x2, u16x2 | - /// A 64-bit vector with 2 `f32` lanes. - ); - - /* --impl_i!([i64; 1]: i64x1, m64x1 | i64 | test_v64 | x0 | -+impl_i!([i64; 1]: i64x1, m64x1 | i64, u8 | test_v64 | x0 | - From: /*i8x1, u8x1, i16x1, u16x1, i32x1, u32x1*/ | // FIXME: primitive to vector conversion - /// A 64-bit vector with 1 `i64` lanes. - ); --impl_u!([u64; 1]: u64x1, m64x1 | u64 | test_v64 | x0 | -+impl_u!([u64; 1]: u64x1, m64x1 | u64, u8 | test_v64 | x0 | - From: /*u8x1, u16x1, u32x1*/ | // FIXME: primitive to vector conversion - /// A 64-bit vector with 1 `u64` lanes. - ); --impl_m!([m64; 1]: m64x1 | i64 | test_v64 | x0 | -+impl_m!([m64; 1]: m64x1 | i64, u8 | test_v64 | x0 | - From: /*m8x1, m16x1, m32x1, */ m128x1 | // FIXME: unary small vector types - /// A 64-bit vector mask with 1 `m64` lanes. - ); -diff --git a/third_party/rust/packed_simd/src/vPtr.rs b/third_party/rust/packed_simd/src/vPtr.rs -index fe9fb28ffa898..e34cb170eb1c2 100644 ---- a/third_party/rust/packed_simd/src/vPtr.rs -+++ b/third_party/rust/packed_simd/src/vPtr.rs -@@ -1,5 +1,5 @@ - //! Vectors of pointers --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - -diff --git a/third_party/rust/packed_simd/src/vSize.rs b/third_party/rust/packed_simd/src/vSize.rs -index 5594323372b46..b5d8910061388 100644 ---- a/third_party/rust/packed_simd/src/vSize.rs -+++ b/third_party/rust/packed_simd/src/vSize.rs -@@ -3,50 +3,50 @@ - use crate::codegen::pointer_sized_int::{isize_, usize_}; - use crate::*; - --impl_i!([isize; 2]: isizex2, msizex2 | isize_ | test_v128 | -+impl_i!([isize; 2]: isizex2, msizex2 | isize_, u8 | test_v128 | - x0, x1| - From: | - /// A vector with 2 `isize` lanes. - ); - --impl_u!([usize; 2]: usizex2, msizex2 | usize_ | test_v128 | -+impl_u!([usize; 2]: usizex2, msizex2 | usize_, u8 | test_v128 | - x0, x1| - From: | - /// A vector with 2 `usize` lanes. - ); --impl_m!([msize; 2]: msizex2 | isize_ | test_v128 | -+impl_m!([msize; 2]: msizex2 | isize_, u8 | test_v128 | - x0, x1 | - From: | - /// A vector mask with 2 `msize` lanes. - ); - --impl_i!([isize; 4]: isizex4, msizex4 | isize_ | test_v256 | -+impl_i!([isize; 4]: isizex4, msizex4 | isize_, u8 | test_v256 | - x0, x1, x2, x3 | - From: | - /// A vector with 4 `isize` lanes. - ); --impl_u!([usize; 4]: usizex4, msizex4 | usize_ | test_v256 | -+impl_u!([usize; 4]: usizex4, msizex4 | usize_, u8 | test_v256 | - x0, x1, x2, x3| - From: | - /// A vector with 4 `usize` lanes. - ); --impl_m!([msize; 4]: msizex4 | isize_ | test_v256 | -+impl_m!([msize; 4]: msizex4 | isize_, u8 | test_v256 | - x0, x1, x2, x3 | - From: | - /// A vector mask with 4 `msize` lanes. - ); - --impl_i!([isize; 8]: isizex8, msizex8 | isize_ | test_v512 | -+impl_i!([isize; 8]: isizex8, msizex8 | isize_, u8 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7 | - From: | -- /// A vector with 4 `isize` lanes. -+ /// A vector with 8 `isize` lanes. - ); --impl_u!([usize; 8]: usizex8, msizex8 | usize_ | test_v512 | -+impl_u!([usize; 8]: usizex8, msizex8 | usize_, u8 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7 | - From: | - /// A vector with 8 `usize` lanes. - ); --impl_m!([msize; 8]: msizex8 | isize_ | test_v512 | -+impl_m!([msize; 8]: msizex8 | isize_, u8 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7 | - From: | - /// A vector mask with 8 `msize` lanes. -diff --git a/third_party/rust/packed_simd/tests/endianness.rs b/third_party/rust/packed_simd/tests/endianness.rs -index 1e6b4f354301a..31fb7073afb33 100644 ---- a/third_party/rust/packed_simd/tests/endianness.rs -+++ b/third_party/rust/packed_simd/tests/endianness.rs -@@ -17,41 +17,41 @@ fn endian_indexing() { - #[cfg_attr(not(target_arch = "wasm32"), test)] - #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - fn endian_bitcasts() { -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let x = i8x16::new( - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - ); - let t: i16x8 = unsafe { mem::transmute(x) }; - let e: i16x8 = if cfg!(target_endian = "little") { - i16x8::new(256, 770, 1284, 1798, 2312, 2826, 3340, 3854) - } else { - i16x8::new(1, 515, 1029, 1543, 2057, 2571, 3085, 3599) - }; - assert_eq!(t, e); - } - - #[cfg_attr(not(target_arch = "wasm32"), test)] - #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - fn endian_casts() { -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let x = i8x16::new( - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - ); - let t: i16x16 = x.into(); // simd_cast -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let e = i16x16::new( - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - ); - assert_eq!(t, e); - } - - #[cfg_attr(not(target_arch = "wasm32"), test)] - #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - fn endian_load_and_stores() { -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let x = i8x16::new( - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, -@@ -82,160 +82,170 @@ fn endian_array_union() { - vec: f32x4, - } - let x: [f32; 4] = unsafe { A { vec: f32x4::new(0., 1., 2., 3.) }.data }; -- assert_eq!(x[0], 0_f32); -- assert_eq!(x[1], 1_f32); -- assert_eq!(x[2], 2_f32); -- assert_eq!(x[3], 3_f32); -+ // As all of these are integer values within the mantissa^1 range, it -+ // would be very unusual for them to actually fail to compare. -+ #[allow(clippy::float_cmp)] -+ { -+ assert_eq!(x[0], 0_f32); -+ assert_eq!(x[1], 1_f32); -+ assert_eq!(x[2], 2_f32); -+ assert_eq!(x[3], 3_f32); -+ } - let y: f32x4 = unsafe { A { data: [3., 2., 1., 0.] }.vec }; - assert_eq!(y, f32x4::new(3., 2., 1., 0.)); - - union B { - data: [i8; 16], - vec: i8x16, - } -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let x = i8x16::new( - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - ); - let x: [i8; 16] = unsafe { B { vec: x }.data }; - -- for i in 0..16 { -- assert_eq!(x[i], i as i8); -+ for (i, v) in x.iter().enumerate() { -+ assert_eq!(i as i8, *v); - } - -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let y = [ - 15, 14, 13, 12, 11, 19, 9, 8, - 7, 6, 5, 4, 3, 2, 1, 0 - ]; -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let e = i8x16::new( - 15, 14, 13, 12, 11, 19, 9, 8, - 7, 6, 5, 4, 3, 2, 1, 0 - ); - let z = unsafe { B { data: y }.vec }; - assert_eq!(z, e); - - union C { - data: [i16; 8], - vec: i8x16, - } -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let x = i8x16::new( - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - ); - let x: [i16; 8] = unsafe { C { vec: x }.data }; - - let e: [i16; 8] = if cfg!(target_endian = "little") { - [256, 770, 1284, 1798, 2312, 2826, 3340, 3854] - } else { - [1, 515, 1029, 1543, 2057, 2571, 3085, 3599] - }; - assert_eq!(x, e); - } - - #[cfg_attr(not(target_arch = "wasm32"), test)] - #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - fn endian_tuple_access() { - type F32x4T = (f32, f32, f32, f32); - union A { - data: F32x4T, - vec: f32x4, - } - let x: F32x4T = unsafe { A { vec: f32x4::new(0., 1., 2., 3.) }.data }; -- assert_eq!(x.0, 0_f32); -- assert_eq!(x.1, 1_f32); -- assert_eq!(x.2, 2_f32); -- assert_eq!(x.3, 3_f32); -+ // As all of these are integer values within the mantissa^1 range, it -+ // would be very unusual for them to actually fail to compare. -+ #[allow(clippy::float_cmp)] -+ { -+ assert_eq!(x.0, 0_f32); -+ assert_eq!(x.1, 1_f32); -+ assert_eq!(x.2, 2_f32); -+ assert_eq!(x.3, 3_f32); -+ } - let y: f32x4 = unsafe { A { data: (3., 2., 1., 0.) }.vec }; - assert_eq!(y, f32x4::new(3., 2., 1., 0.)); - -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - type I8x16T = (i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8); - union B { - data: I8x16T, - vec: i8x16, - } - -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let x = i8x16::new( - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - ); - let x: I8x16T = unsafe { B { vec: x }.data }; - - assert_eq!(x.0, 0); - assert_eq!(x.1, 1); - assert_eq!(x.2, 2); - assert_eq!(x.3, 3); - assert_eq!(x.4, 4); - assert_eq!(x.5, 5); - assert_eq!(x.6, 6); - assert_eq!(x.7, 7); - assert_eq!(x.8, 8); - assert_eq!(x.9, 9); - assert_eq!(x.10, 10); - assert_eq!(x.11, 11); - assert_eq!(x.12, 12); - assert_eq!(x.13, 13); - assert_eq!(x.14, 14); - assert_eq!(x.15, 15); - -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let y = ( - 15, 14, 13, 12, 11, 10, 9, 8, - 7, 6, 5, 4, 3, 2, 1, 0 - ); - let z: i8x16 = unsafe { B { data: y }.vec }; -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let e = i8x16::new( - 15, 14, 13, 12, 11, 10, 9, 8, - 7, 6, 5, 4, 3, 2, 1, 0 - ); - assert_eq!(e, z); - -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - type I16x8T = (i16, i16, i16, i16, i16, i16, i16, i16); - union C { - data: I16x8T, - vec: i8x16, - } - -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let x = i8x16::new( - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - ); - let x: I16x8T = unsafe { C { vec: x }.data }; - - let e: [i16; 8] = if cfg!(target_endian = "little") { - [256, 770, 1284, 1798, 2312, 2826, 3340, 3854] - } else { - [1, 515, 1029, 1543, 2057, 2571, 3085, 3599] - }; - assert_eq!(x.0, e[0]); - assert_eq!(x.1, e[1]); - assert_eq!(x.2, e[2]); - assert_eq!(x.3, e[3]); - assert_eq!(x.4, e[4]); - assert_eq!(x.5, e[5]); - assert_eq!(x.6, e[6]); - assert_eq!(x.7, e[7]); - -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - #[repr(C)] - #[derive(Copy ,Clone)] - pub struct Tup(pub i8, pub i8, pub i16, pub i8, pub i8, pub i16, - pub i8, pub i8, pub i16, pub i8, pub i8, pub i16); - - union D { - data: Tup, - vec: i8x16, - } - -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let x = i8x16::new( - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, diff --git a/network/web/firefox/files/0002-Bug-1745560-Add-missing-stub-for-wl_proxy_marshal_fl.patch b/network/web/firefox/files/0002-Bug-1745560-Add-missing-stub-for-wl_proxy_marshal_fl.patch deleted file mode 100644 index bcd5e25822..0000000000 --- a/network/web/firefox/files/0002-Bug-1745560-Add-missing-stub-for-wl_proxy_marshal_fl.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Kevin Daudt -Date: Sun, 12 Dec 2021 13:38:48 +0000 -Subject: [PATCH] Bug 1745560 - Add missing stub for wl_proxy_marshal_flags, - r=stransky - -Firefox fails to build against wayland 1.20 because this symbol is missing - -Differential Revision: https://phabricator.services.mozilla.com/D133583 ---- - widget/gtk/mozwayland/mozwayland.c | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/widget/gtk/mozwayland/mozwayland.c b/widget/gtk/mozwayland/mozwayland.c -index 7a448e6321e2..1a86468b4f3d 100644 ---- a/widget/gtk/mozwayland/mozwayland.c -+++ b/widget/gtk/mozwayland/mozwayland.c -@@ -200,3 +200,10 @@ MOZ_EXPORT int wl_list_empty(const struct wl_list* list) { return -1; } - - MOZ_EXPORT void wl_list_insert_list(struct wl_list* list, - struct wl_list* other) {} -+ -+MOZ_EXPORT struct wl_proxy* wl_proxy_marshal_flags( -+ struct wl_proxy* proxy, uint32_t opcode, -+ const struct wl_interface* interface, uint32_t version, uint32_t flags, -+ ...) { -+ return NULL; -+} diff --git a/network/web/firefox/files/complete-csd-window-offset-mozilla-1457691.patch b/network/web/firefox/files/complete-csd-window-offset-mozilla-1457691.patch deleted file mode 100644 index a43a51830b..0000000000 --- a/network/web/firefox/files/complete-csd-window-offset-mozilla-1457691.patch +++ /dev/null @@ -1,614 +0,0 @@ -This is a composition of these patches for Firefox 60: - -https://bugzilla.mozilla.org/show_bug.cgi?id=1441873 -https://bugzilla.mozilla.org/show_bug.cgi?id=1441665 -https://bugzilla.mozilla.org/show_bug.cgi?id=1456898 -https://bugzilla.mozilla.org/show_bug.cgi?id=1457309 -https://bugzilla.mozilla.org/show_bug.cgi?id=1457691 - -which fix popup window placement at CSD window mode. - - -diff --git a/widget/gtk/nsLookAndFeel.cpp b/widget/gtk/nsLookAndFeel.cpp ---- a/widget/gtk/nsLookAndFeel.cpp -+++ b/widget/gtk/nsLookAndFeel.cpp -@@ -1076,19 +1076,18 @@ nsLookAndFeel::EnsureInit() - nullptr); - - GetSystemFontInfo(gtk_widget_get_style_context(entry), - &mFieldFontName, &mFieldFontStyle); - - gtk_widget_destroy(window); - g_object_unref(labelWidget); - -- // Require GTK 3.10 for GtkHeaderBar support and compatible window manager. -- mCSDAvailable = (gtk_check_version(3, 10, 0) == nullptr && -- nsWindow::GetCSDSupportLevel() != nsWindow::CSD_SUPPORT_NONE); -+ mCSDAvailable = -+ nsWindow::GetSystemCSDSupportLevel() != nsWindow::CSD_SUPPORT_NONE; - - mCSDCloseButton = false; - mCSDMinimizeButton = false; - mCSDMaximizeButton = false; - - // We need to initialize whole CSD config explicitly because it's queried - // as -moz-gtk* media features. - WidgetNodeType buttonLayout[TOOLBAR_BUTTONS]; -diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h ---- a/widget/gtk/nsWindow.h -+++ b/widget/gtk/nsWindow.h -@@ -395,28 +395,26 @@ public: - // From GDK - int GdkCoordToDevicePixels(gint coord); - LayoutDeviceIntPoint GdkPointToDevicePixels(GdkPoint point); - LayoutDeviceIntPoint GdkEventCoordsToDevicePixels(gdouble x, gdouble y); - LayoutDeviceIntRect GdkRectToDevicePixels(GdkRectangle rect); - - virtual bool WidgetTypeSupportsAcceleration() override; - -- bool DoDrawTitlebar() const; -- - typedef enum { CSD_SUPPORT_SYSTEM, // CSD including shadows - CSD_SUPPORT_CLIENT, // CSD without shadows - CSD_SUPPORT_NONE, // WM does not support CSD at all - CSD_SUPPORT_UNKNOWN - } CSDSupportLevel; - /** - * Get the support of Client Side Decoration by checking - * the XDG_CURRENT_DESKTOP environment variable. - */ -- static CSDSupportLevel GetCSDSupportLevel(); -+ static CSDSupportLevel GetSystemCSDSupportLevel(); - - protected: - virtual ~nsWindow(); - - // event handling code - void DispatchActivateEvent(void); - void DispatchDeactivateEvent(void); - void DispatchResized(); -@@ -512,19 +510,21 @@ private: - int mXDepth; - mozilla::widget::WindowSurfaceProvider mSurfaceProvider; - #endif - - // Upper bound on pending ConfigureNotify events to be dispatched to the - // window. See bug 1225044. - unsigned int mPendingConfigures; - -- bool mIsCSDAvailable; -+ // Window titlebar rendering mode, CSD_SUPPORT_NONE if it's disabled -+ // for this window. -+ CSDSupportLevel mCSDSupportLevel; - // If true, draw our own window titlebar. -- bool mIsCSDEnabled; -+ bool mDrawInTitlebar; - // Draggable titlebar region maintained by UpdateWindowDraggingRegion - LayoutDeviceIntRegion mDraggableRegion; - - #ifdef ACCESSIBILITY - RefPtr mRootAccessible; - - /** - * Request to create the accessible for this window if it is top level. - -diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp ---- a/widget/gtk/nsWindow.cpp -+++ b/widget/gtk/nsWindow.cpp -@@ -474,18 +474,18 @@ nsWindow::nsWindow() - - mTransparencyBitmapWidth = 0; - mTransparencyBitmapHeight = 0; - - #if GTK_CHECK_VERSION(3,4,0) - mLastScrollEventTime = GDK_CURRENT_TIME; - #endif - mPendingConfigures = 0; -- mIsCSDAvailable = false; -- mIsCSDEnabled = false; -+ mCSDSupportLevel = CSD_SUPPORT_NONE; -+ mDrawInTitlebar = false; - } - - nsWindow::~nsWindow() - { - LOG(("nsWindow::~nsWindow() [%p]\n", (void *)this)); - - delete[] mTransparencyBitmap; - mTransparencyBitmap = nullptr; -@@ -2814,17 +2814,17 @@ nsWindow::OnButtonReleaseEvent(GdkEventB - LayoutDeviceIntPoint pos = event.mRefPoint; - - nsEventStatus eventStatus = DispatchInputEvent(&event); - - bool defaultPrevented = (eventStatus == nsEventStatus_eConsumeNoDefault); - // Check if mouse position in titlebar and doubleclick happened to - // trigger restore/maximize. - if (!defaultPrevented -- && mIsCSDEnabled -+ && mDrawInTitlebar - && event.button == WidgetMouseEvent::eLeftButton - && event.mClickCount == 2 - && mDraggableRegion.Contains(pos.x, pos.y)) { - - if (mSizeState == nsSizeMode_Maximized) { - SetSizeMode(nsSizeMode_Normal); - } else { - SetSizeMode(nsSizeMode_Maximized); -@@ -3758,22 +3758,18 @@ nsWindow::Create(nsIWidget* aParent, - gtk_window_set_wmclass(GTK_WINDOW(mShell), "Toplevel", - gdk_get_program_class()); - - // each toplevel window gets its own window group - GtkWindowGroup *group = gtk_window_group_new(); - gtk_window_group_add_window(group, GTK_WINDOW(mShell)); - g_object_unref(group); - -- int32_t isCSDAvailable = false; -- nsresult rv = LookAndFeel::GetInt(LookAndFeel::eIntID_GTKCSDAvailable, -- &isCSDAvailable); -- if (NS_SUCCEEDED(rv)) { -- mIsCSDAvailable = isCSDAvailable; -- } -+ // We enable titlebar rendering for toplevel windows only. -+ mCSDSupportLevel = GetSystemCSDSupportLevel(); - } - - // Create a container to hold child windows and child GtkWidgets. - GtkWidget *container = moz_container_new(); - mContainer = MOZ_CONTAINER(container); - - // "csd" style is set when widget is realized so we need to call - // it explicitly now. -@@ -3788,17 +3784,17 @@ nsWindow::Create(nsIWidget* aParent, - * are drawn by Gtk+ to mShell. Content is rendered to mContainer - * and we listen to the Gtk+ events on mContainer. - * 3) We're running on Wayland. All gecko content is rendered - * to mContainer and we listen to the Gtk+ events on mContainer. - */ - GtkStyleContext* style = gtk_widget_get_style_context(mShell); - drawToContainer = - !mIsX11Display || -- (mIsCSDAvailable && GetCSDSupportLevel() == CSD_SUPPORT_CLIENT) || -+ (mCSDSupportLevel == CSD_SUPPORT_CLIENT) || - gtk_style_context_has_class(style, "csd"); - eventWidget = (drawToContainer) ? container : mShell; - - gtk_widget_add_events(eventWidget, kEvents); - if (drawToContainer) - gtk_widget_add_events(mShell, GDK_PROPERTY_CHANGE_MASK); - - // Prevent GtkWindow from painting a background to avoid flickering. -@@ -6581,90 +6577,91 @@ nsWindow::ClearCachedResources() - window->ClearCachedResources(); - } - } - } - - nsresult - nsWindow::SetNonClientMargins(LayoutDeviceIntMargin &aMargins) - { -- SetDrawsInTitlebar(aMargins.top == 0); -- return NS_OK; -+ SetDrawsInTitlebar(aMargins.top == 0); -+ return NS_OK; - } - - void - nsWindow::SetDrawsInTitlebar(bool aState) - { -- if (!mIsCSDAvailable || aState == mIsCSDEnabled) -- return; -- -- if (mShell) { -- if (GetCSDSupportLevel() == CSD_SUPPORT_SYSTEM) { -- SetWindowDecoration(aState ? eBorderStyle_border : mBorderStyle); -- } -- else { -- /* Window manager does not support GDK_DECOR_BORDER, -- * emulate it by CSD. -- * -- * gtk_window_set_titlebar() works on unrealized widgets only, -- * we need to handle mShell carefully here. -- * When CSD is enabled mGdkWindow is owned by mContainer which is good -- * as we can't delete our mGdkWindow. To make mShell unrealized while -- * mContainer is preserved we temporary reparent mContainer to an -- * invisible GtkWindow. -- */ -- NativeShow(false); -- -- // Using GTK_WINDOW_POPUP rather than -- // GTK_WINDOW_TOPLEVEL in the hope that POPUP results in less -- // initialization and window manager interaction. -- GtkWidget* tmpWindow = gtk_window_new(GTK_WINDOW_POPUP); -- gtk_widget_realize(tmpWindow); -- -- gtk_widget_reparent(GTK_WIDGET(mContainer), tmpWindow); -- gtk_widget_unrealize(GTK_WIDGET(mShell)); -- -- // Available as of GTK 3.10+ -- static auto sGtkWindowSetTitlebar = (void (*)(GtkWindow*, GtkWidget*)) -- dlsym(RTLD_DEFAULT, "gtk_window_set_titlebar"); -- MOZ_ASSERT(sGtkWindowSetTitlebar, -- "Missing gtk_window_set_titlebar(), old Gtk+ library?"); -- -- if (aState) { -- // Add a hidden titlebar widget to trigger CSD, but disable the default -- // titlebar. GtkFixed is a somewhat random choice for a simple unused -- // widget. gtk_window_set_titlebar() takes ownership of the titlebar -- // widget. -- sGtkWindowSetTitlebar(GTK_WINDOW(mShell), gtk_fixed_new()); -- } else { -- sGtkWindowSetTitlebar(GTK_WINDOW(mShell), nullptr); -- } -- -- /* A workaround for https://bugzilla.gnome.org/show_bug.cgi?id=791081 -- * gtk_widget_realize() throws: -- * "In pixman_region32_init_rect: Invalid rectangle passed" -- * when mShell has default 1x1 size. -- */ -- GtkAllocation allocation = {0, 0, 0, 0}; -- gtk_widget_get_preferred_width(GTK_WIDGET(mShell), nullptr, -- &allocation.width); -- gtk_widget_get_preferred_height(GTK_WIDGET(mShell), nullptr, -- &allocation.height); -- gtk_widget_size_allocate(GTK_WIDGET(mShell), &allocation); -- -- gtk_widget_realize(GTK_WIDGET(mShell)); -- gtk_widget_reparent(GTK_WIDGET(mContainer), GTK_WIDGET(mShell)); -- mNeedsShow = true; -- NativeResize(); -- -- gtk_widget_destroy(tmpWindow); -- } -- } -- -- mIsCSDEnabled = aState; -+ if (!mShell || -+ mCSDSupportLevel == CSD_SUPPORT_NONE || -+ aState == mDrawInTitlebar) { -+ return; -+ } -+ -+ if (mCSDSupportLevel == CSD_SUPPORT_SYSTEM) { -+ SetWindowDecoration(aState ? eBorderStyle_border : mBorderStyle); -+ } -+ else if (mCSDSupportLevel == CSD_SUPPORT_CLIENT) { -+ /* Window manager does not support GDK_DECOR_BORDER, -+ * emulate it by CSD. -+ * -+ * gtk_window_set_titlebar() works on unrealized widgets only, -+ * we need to handle mShell carefully here. -+ * When CSD is enabled mGdkWindow is owned by mContainer which is good -+ * as we can't delete our mGdkWindow. To make mShell unrealized while -+ * mContainer is preserved we temporary reparent mContainer to an -+ * invisible GtkWindow. -+ */ -+ NativeShow(false); -+ -+ // Using GTK_WINDOW_POPUP rather than -+ // GTK_WINDOW_TOPLEVEL in the hope that POPUP results in less -+ // initialization and window manager interaction. -+ GtkWidget* tmpWindow = gtk_window_new(GTK_WINDOW_POPUP); -+ gtk_widget_realize(tmpWindow); -+ -+ gtk_widget_reparent(GTK_WIDGET(mContainer), tmpWindow); -+ gtk_widget_unrealize(GTK_WIDGET(mShell)); -+ -+ // Available as of GTK 3.10+ -+ static auto sGtkWindowSetTitlebar = (void (*)(GtkWindow*, GtkWidget*)) -+ dlsym(RTLD_DEFAULT, "gtk_window_set_titlebar"); -+ MOZ_ASSERT(sGtkWindowSetTitlebar, -+ "Missing gtk_window_set_titlebar(), old Gtk+ library?"); -+ -+ if (aState) { -+ // Add a hidden titlebar widget to trigger CSD, but disable the default -+ // titlebar. GtkFixed is a somewhat random choice for a simple unused -+ // widget. gtk_window_set_titlebar() takes ownership of the titlebar -+ // widget. -+ sGtkWindowSetTitlebar(GTK_WINDOW(mShell), gtk_fixed_new()); -+ } else { -+ sGtkWindowSetTitlebar(GTK_WINDOW(mShell), nullptr); -+ } -+ -+ /* A workaround for https://bugzilla.gnome.org/show_bug.cgi?id=791081 -+ * gtk_widget_realize() throws: -+ * "In pixman_region32_init_rect: Invalid rectangle passed" -+ * when mShell has default 1x1 size. -+ */ -+ GtkAllocation allocation = {0, 0, 0, 0}; -+ gtk_widget_get_preferred_width(GTK_WIDGET(mShell), nullptr, -+ &allocation.width); -+ gtk_widget_get_preferred_height(GTK_WIDGET(mShell), nullptr, -+ &allocation.height); -+ gtk_widget_size_allocate(GTK_WIDGET(mShell), &allocation); -+ -+ gtk_widget_realize(GTK_WIDGET(mShell)); -+ gtk_widget_reparent(GTK_WIDGET(mContainer), GTK_WIDGET(mShell)); -+ mNeedsShow = true; -+ NativeResize(); -+ -+ gtk_widget_destroy(tmpWindow); -+ } -+ -+ mDrawInTitlebar = aState; - } - - gint - nsWindow::GdkScaleFactor() - { - #if (MOZ_WIDGET_GTK >= 3) - // Available as of GTK 3.10+ - static auto sGdkWindowGetScaleFactorPtr = (gint (*)(GdkWindow*)) -@@ -6923,28 +6920,28 @@ nsWindow::SynthesizeNativeTouchPoint(uin - event.touch.y = DevicePixelsToGdkCoordRoundDown(pointInWindow.y); - - gdk_event_put(&event); - - return NS_OK; - } - #endif - --bool --nsWindow::DoDrawTitlebar() const --{ -- return mIsCSDEnabled && mSizeState == nsSizeMode_Normal; --} -- - nsWindow::CSDSupportLevel --nsWindow::GetCSDSupportLevel() { -+nsWindow::GetSystemCSDSupportLevel() { - if (sCSDSupportLevel != CSD_SUPPORT_UNKNOWN) { - return sCSDSupportLevel; - } - -+ // Require GTK 3.10 for GtkHeaderBar support and compatible window manager. -+ if (gtk_check_version(3, 10, 0) != nullptr) { -+ sCSDSupportLevel = CSD_SUPPORT_NONE; -+ return sCSDSupportLevel; -+ } -+ - const char* currentDesktop = getenv("XDG_CURRENT_DESKTOP"); - if (currentDesktop) { - // GNOME Flashback (fallback) - if (strstr(currentDesktop, "GNOME-Flashback:GNOME") != nullptr) { - sCSDSupportLevel = CSD_SUPPORT_CLIENT; - // gnome-shell - } else if (strstr(currentDesktop, "GNOME") != nullptr) { - sCSDSupportLevel = CSD_SUPPORT_SYSTEM; -diff -up firefox-60.0/widget/gtk/gtk3drawing.cpp.orig firefox-60.0/widget/gtk/gtk3drawing.cpp ---- firefox-60.0/widget/gtk/gtk3drawing.cpp.orig 2018-04-26 22:07:36.000000000 +0200 -+++ firefox-60.0/widget/gtk/gtk3drawing.cpp 2018-04-30 13:38:19.083949868 +0200 -@@ -38,6 +38,16 @@ static ToolbarGTKMetrics sToolbarMetrics - #define GTK_STATE_FLAG_CHECKED (1 << 11) - #endif - -+static GtkBorder -+operator+=(GtkBorder& first, const GtkBorder& second) -+{ -+ first.left += second.left; -+ first.right += second.right; -+ first.top += second.top; -+ first.bottom += second.bottom; -+ return first; -+} -+ - static gint - moz_gtk_get_tab_thickness(GtkStyleContext *style); - -@@ -3056,6 +3066,76 @@ GetScrollbarMetrics(GtkOrientation aOrie - return metrics; - } - -+/* -+ * get_shadow_width() from gtkwindow.c is not public so we need -+ * to implement it. -+ */ -+bool -+GetCSDDecorationSize(GtkWindow *aGtkWindow, GtkBorder* aDecorationSize) -+{ -+ GtkStyleContext* context = gtk_widget_get_style_context(GTK_WIDGET(aGtkWindow)); -+ bool solidDecorations = gtk_style_context_has_class(context, "solid-csd"); -+ context = GetStyleContext(solidDecorations ? -+ MOZ_GTK_WINDOW_DECORATION_SOLID : -+ MOZ_GTK_WINDOW_DECORATION); -+ -+ /* Always sum border + padding */ -+ GtkBorder padding; -+ GtkStateFlags state = gtk_style_context_get_state(context); -+ gtk_style_context_get_border(context, state, aDecorationSize); -+ gtk_style_context_get_padding(context, state, &padding); -+ *aDecorationSize += padding; -+ -+ // Available on GTK 3.20+. -+ static auto sGtkRenderBackgroundGetClip = -+ (void (*)(GtkStyleContext*, gdouble, gdouble, gdouble, gdouble, GdkRectangle*)) -+ dlsym(RTLD_DEFAULT, "gtk_render_background_get_clip"); -+ -+ GtkBorder margin; -+ gtk_style_context_get_margin(context, state, &margin); -+ -+ GtkBorder extents = {0, 0, 0, 0}; -+ if (sGtkRenderBackgroundGetClip) { -+ /* Get shadow extents but combine with style margin; use the bigger value. -+ */ -+ GdkRectangle clip; -+ sGtkRenderBackgroundGetClip(context, 0, 0, 0, 0, &clip); -+ -+ extents.top = -clip.y; -+ extents.right = clip.width + clip.x; -+ extents.bottom = clip.height + clip.y; -+ extents.left = -clip.x; -+ -+ // Margin is used for resize grip size - it's not present on -+ // popup windows. -+ if (gtk_window_get_window_type(aGtkWindow) != GTK_WINDOW_POPUP) { -+ extents.top = MAX(extents.top, margin.top); -+ extents.right = MAX(extents.right, margin.right); -+ extents.bottom = MAX(extents.bottom, margin.bottom); -+ extents.left = MAX(extents.left, margin.left); -+ } -+ } else { -+ /* If we can't get shadow extents use decoration-resize-handle instead -+ * as a workaround. This is inspired by update_border_windows() -+ * from gtkwindow.c although this is not 100% accurate as we emulate -+ * the extents here. -+ */ -+ gint handle; -+ gtk_widget_style_get(GetWidget(MOZ_GTK_WINDOW), -+ "decoration-resize-handle", &handle, -+ NULL); -+ -+ extents.top = handle + margin.top; -+ extents.right = handle + margin.right; -+ extents.bottom = handle + margin.bottom; -+ extents.left = handle + margin.left; -+ } -+ -+ *aDecorationSize += extents; -+ -+ return (sGtkRenderBackgroundGetClip != nullptr); -+} -+ - /* cairo_t *cr argument has to be a system-cairo. */ - gint - moz_gtk_widget_paint(WidgetNodeType widget, cairo_t *cr, -diff -up firefox-60.0/widget/gtk/gtkdrawing.h.orig firefox-60.0/widget/gtk/gtkdrawing.h ---- firefox-60.0/widget/gtk/gtkdrawing.h.orig 2018-04-26 22:07:35.000000000 +0200 -+++ firefox-60.0/widget/gtk/gtkdrawing.h 2018-04-30 13:38:19.083949868 +0200 -@@ -334,6 +334,10 @@ typedef enum { - */ - MOZ_GTK_HEADER_BAR_BUTTON_MAXIMIZE_RESTORE, - -+ /* Client-side window decoration node. Available on GTK 3.20+. */ -+ MOZ_GTK_WINDOW_DECORATION, -+ MOZ_GTK_WINDOW_DECORATION_SOLID, -+ - MOZ_GTK_WIDGET_NODE_COUNT - } WidgetNodeType; - -@@ -606,4 +610,17 @@ GetToolbarButtonMetrics(WidgetNodeType a - int - GetGtkHeaderBarButtonLayout(WidgetNodeType* aButtonLayout, int aMaxButtonNums); - -+/** -+ * Get size of CSD window extents of given GtkWindow. -+ * -+ * aGtkWindow [IN] Decorated window. -+ * aDecorationSize [OUT] Returns calculated (or estimated) decoration -+ * size of given aGtkWindow. -+ * -+ * returns: True if we have extract decoration size (for GTK 3.20+) -+ * False if we have only an estimation (for GTK+ before 3.20+) -+ */ -+bool -+GetCSDDecorationSize(GtkWindow *aGtkWindow, GtkBorder* aDecorationSize); -+ - #endif -diff -up firefox-60.0/widget/gtk/nsWindow.cpp.orig firefox-60.0/widget/gtk/nsWindow.cpp ---- firefox-60.0/widget/gtk/nsWindow.cpp.orig 2018-04-30 13:37:32.145122854 +0200 -+++ firefox-60.0/widget/gtk/nsWindow.cpp 2018-04-30 13:39:12.593752681 +0200 -@@ -127,6 +127,7 @@ using namespace mozilla::widget; - #endif - - #include "nsShmImage.h" -+#include "gtkdrawing.h" - - #include "nsIDOMWheelEvent.h" - -@@ -3360,6 +3361,10 @@ nsWindow::OnWindowStateEvent(GtkWidget * - aEvent->new_window_state & GDK_WINDOW_STATE_FULLSCREEN); - } - } -+ -+ if (mDrawInTitlebar && mCSDSupportLevel == CSD_SUPPORT_CLIENT) { -+ UpdateClientOffsetForCSDWindow(); -+ } - } - - void -@@ -6552,6 +6557,32 @@ nsWindow::ClearCachedResources() - } - } - -+/* nsWindow::UpdateClientOffsetForCSDWindow() is designed to be called from -+ * paint code to update mClientOffset any time. It also propagates -+ * the mClientOffset to child tabs. -+ * -+ * It works only for CSD decorated GtkWindow. -+ */ -+void -+nsWindow::UpdateClientOffsetForCSDWindow() -+{ -+ // _NET_FRAME_EXTENTS is not set on client decorated windows, -+ // so we need to read offset between mContainer and toplevel mShell -+ // window. -+ if (mSizeState == nsSizeMode_Normal) { -+ GtkBorder decorationSize; -+ GetCSDDecorationSize(GTK_WINDOW(mShell), &decorationSize); -+ mClientOffset = nsIntPoint(decorationSize.left, decorationSize.top); -+ } else { -+ mClientOffset = nsIntPoint(0, 0); -+ } -+ -+ // Send a WindowMoved notification. This ensures that TabParent -+ // picks up the new client offset and sends it to the child process -+ // if appropriate. -+ NotifyWindowMoved(mBounds.x, mBounds.y); -+} -+ - nsresult - nsWindow::SetNonClientMargins(LayoutDeviceIntMargin &aMargins) - { -@@ -6626,6 +6657,13 @@ nsWindow::SetDrawsInTitlebar(bool aState - mNeedsShow = true; - NativeResize(); - -+ // When we use system titlebar setup managed by Gtk+ we also get -+ // _NET_FRAME_EXTENTS property for our toplevel window so we can't -+ // update the client offset it here. -+ if (aState) { -+ UpdateClientOffsetForCSDWindow(); -+ } -+ - gtk_widget_destroy(tmpWindow); - } - -diff -up firefox-60.0/widget/gtk/nsWindow.h.orig firefox-60.0/widget/gtk/nsWindow.h ---- firefox-60.0/widget/gtk/nsWindow.h.orig 2018-04-30 13:37:32.143122861 +0200 -+++ firefox-60.0/widget/gtk/nsWindow.h 2018-04-30 13:38:19.085949861 +0200 -@@ -454,6 +454,8 @@ private: - nsIWidgetListener* GetListener(); - bool IsComposited() const; - -+ void UpdateClientOffsetForCSDWindow(); -+ - GtkWidget *mShell; - MozContainer *mContainer; - GdkWindow *mGdkWindow; -diff -up firefox-60.0/widget/gtk/WidgetStyleCache.cpp.orig firefox-60.0/widget/gtk/WidgetStyleCache.cpp ---- firefox-60.0/widget/gtk/WidgetStyleCache.cpp.orig 2018-04-26 22:07:35.000000000 +0200 -+++ firefox-60.0/widget/gtk/WidgetStyleCache.cpp 2018-04-30 13:38:19.085949861 +0200 -@@ -1285,6 +1285,22 @@ GetCssNodeStyleInternal(WidgetNodeType a - "MOZ_GTK_HEADER_BAR_BUTTON_RESTORE is used as an icon only!"); - return nullptr; - } -+ case MOZ_GTK_WINDOW_DECORATION: -+ { -+ GtkStyleContext* parentStyle = -+ CreateSubStyleWithClass(MOZ_GTK_WINDOW, "csd"); -+ style = CreateCSSNode("decoration", parentStyle); -+ g_object_unref(parentStyle); -+ break; -+ } -+ case MOZ_GTK_WINDOW_DECORATION_SOLID: -+ { -+ GtkStyleContext* parentStyle = -+ CreateSubStyleWithClass(MOZ_GTK_WINDOW, "solid-csd"); -+ style = CreateCSSNode("decoration", parentStyle); -+ g_object_unref(parentStyle); -+ break; -+ } - default: - return GetWidgetRootStyle(aNodeType); - } diff --git a/network/web/firefox/files/ffmpeg4.patch b/network/web/firefox/files/ffmpeg4.patch deleted file mode 100644 index 0d81467bd4..0000000000 --- a/network/web/firefox/files/ffmpeg4.patch +++ /dev/null @@ -1,13720 +0,0 @@ -From 2af07dbbaea1f66c055e1ca611474aa829046060 Mon Sep 17 00:00:00 2001 -Message-Id: <2af07dbbaea1f66c055e1ca611474aa829046060.1524695477.git.jan.steffens@gmail.com> -From: Jean-Yves Avenard -Date: Thu, 19 Apr 2018 10:19:15 +0200 -Subject: [PATCH] Bug 1435212 - Add support for FFmpeg 4.0. r=bryce - -MozReview-Commit-ID: JlDFSUyGQu - ---HG-- -extra : rebase_source : 310135ac5453b01164910bd3bf50b6107dcbc710 ---- - .../platforms/ffmpeg/FFmpegDataDecoder.cpp | 6 + - .../platforms/ffmpeg/FFmpegLibWrapper.cpp | 13 +- - dom/media/platforms/ffmpeg/FFmpegLibs.h | 4 +- - .../platforms/ffmpeg/FFmpegRuntimeLinker.cpp | 4 + - .../platforms/ffmpeg/FFmpegVideoDecoder.cpp | 2 +- - .../ffmpeg/ffmpeg58/include/COPYING.LGPLv2.1 | 504 ++ - .../ffmpeg58/include/libavcodec/avcodec.h | 6146 +++++++++++++++++ - .../ffmpeg58/include/libavcodec/avfft.h | 118 + - .../ffmpeg58/include/libavcodec/vaapi.h | 86 + - .../ffmpeg58/include/libavcodec/vdpau.h | 176 + - .../ffmpeg58/include/libavcodec/version.h | 137 + - .../ffmpeg58/include/libavutil/attributes.h | 167 + - .../ffmpeg58/include/libavutil/avconfig.h | 6 + - .../ffmpeg58/include/libavutil/avutil.h | 365 + - .../ffmpeg58/include/libavutil/buffer.h | 291 + - .../include/libavutil/channel_layout.h | 232 + - .../ffmpeg58/include/libavutil/common.h | 560 ++ - .../ffmpeg/ffmpeg58/include/libavutil/cpu.h | 130 + - .../ffmpeg/ffmpeg58/include/libavutil/dict.h | 200 + - .../ffmpeg/ffmpeg58/include/libavutil/error.h | 126 + - .../ffmpeg/ffmpeg58/include/libavutil/frame.h | 893 +++ - .../ffmpeg58/include/libavutil/hwcontext.h | 584 ++ - .../ffmpeg58/include/libavutil/intfloat.h | 77 + - .../ffmpeg/ffmpeg58/include/libavutil/log.h | 362 + - .../ffmpeg58/include/libavutil/macros.h | 50 + - .../ffmpeg58/include/libavutil/mathematics.h | 242 + - .../ffmpeg/ffmpeg58/include/libavutil/mem.h | 700 ++ - .../ffmpeg58/include/libavutil/pixfmt.h | 529 ++ - .../ffmpeg58/include/libavutil/rational.h | 214 + - .../ffmpeg58/include/libavutil/samplefmt.h | 272 + - .../ffmpeg58/include/libavutil/version.h | 139 + - dom/media/platforms/ffmpeg/ffmpeg58/moz.build | 25 + - dom/media/platforms/ffmpeg/moz.build | 1 + - 33 files changed, 13355 insertions(+), 6 deletions(-) - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/COPYING.LGPLv2.1 - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/avcodec.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/avfft.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/vaapi.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/vdpau.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/version.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/attributes.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/avconfig.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/avutil.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/buffer.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/channel_layout.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/common.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/cpu.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/dict.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/error.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/frame.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/hwcontext.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/intfloat.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/log.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/macros.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/mathematics.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/mem.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/pixfmt.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/rational.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/samplefmt.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/version.h - create mode 100644 dom/media/platforms/ffmpeg/ffmpeg58/moz.build - -diff --git a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp -index 4600ad6d247c..a9c7089fa880 100644 ---- a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp -+++ b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp -@@ -77,15 +77,21 @@ FFmpegDataDecoder::InitDecoder() - mCodecContext->extradata_size = mExtraData->Length(); - // FFmpeg may use SIMD instructions to access the data which reads the - // data in 32 bytes block. Must ensure we have enough data to read. -+#if LIBAVCODEC_VERSION_MAJOR >= 58 -+ mExtraData->AppendElements(AV_INPUT_BUFFER_PADDING_SIZE); -+#else - mExtraData->AppendElements(FF_INPUT_BUFFER_PADDING_SIZE); -+#endif - mCodecContext->extradata = mExtraData->Elements(); - } else { - mCodecContext->extradata_size = 0; - } - -+#if LIBAVCODEC_VERSION_MAJOR < 57 - if (codec->capabilities & CODEC_CAP_DR1) { - mCodecContext->flags |= CODEC_FLAG_EMU_EDGE; - } -+#endif - - if (mLib->avcodec_open2(mCodecContext, codec, nullptr) < 0) { - mLib->avcodec_close(mCodecContext); -diff --git a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp -index c8009b81627f..a2ce8a3ccd1a 100644 ---- a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp -+++ b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp -@@ -61,31 +61,36 @@ FFmpegLibWrapper::Link() - AV_FUNC_55 = 1 << 2, - AV_FUNC_56 = 1 << 3, - AV_FUNC_57 = 1 << 4, -+ AV_FUNC_58 = 1 << 5, - AV_FUNC_AVUTIL_53 = AV_FUNC_53 | AV_FUNC_AVUTIL_MASK, - AV_FUNC_AVUTIL_54 = AV_FUNC_54 | AV_FUNC_AVUTIL_MASK, - AV_FUNC_AVUTIL_55 = AV_FUNC_55 | AV_FUNC_AVUTIL_MASK, - AV_FUNC_AVUTIL_56 = AV_FUNC_56 | AV_FUNC_AVUTIL_MASK, - AV_FUNC_AVUTIL_57 = AV_FUNC_57 | AV_FUNC_AVUTIL_MASK, -- AV_FUNC_AVCODEC_ALL = AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 | AV_FUNC_56 | AV_FUNC_57, -+ AV_FUNC_AVUTIL_58 = AV_FUNC_58 | AV_FUNC_AVUTIL_MASK, -+ AV_FUNC_AVCODEC_ALL = AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 | AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58, - AV_FUNC_AVUTIL_ALL = AV_FUNC_AVCODEC_ALL | AV_FUNC_AVUTIL_MASK - }; - - switch (macro) { - case 53: - version = AV_FUNC_53; - break; - case 54: - version = AV_FUNC_54; - break; - case 55: - version = AV_FUNC_55; - break; - case 56: - version = AV_FUNC_56; - break; - case 57: - version = AV_FUNC_57; - break; -+ case 58: -+ version = AV_FUNC_58; -+ break; - default: - FFMPEG_LOG("Unknown avcodec version"); - Unlink(); -@@ -134,9 +139,9 @@ FFmpegLibWrapper::Link() - AV_FUNC(av_log_set_level, AV_FUNC_AVUTIL_ALL) - AV_FUNC(av_malloc, AV_FUNC_AVUTIL_ALL) - AV_FUNC(av_freep, AV_FUNC_AVUTIL_ALL) -- AV_FUNC(av_frame_alloc, (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57)) -- AV_FUNC(av_frame_free, (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57)) -- AV_FUNC(av_frame_unref, (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57)) -+ AV_FUNC(av_frame_alloc, (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 | AV_FUNC_AVUTIL_58)) -+ AV_FUNC(av_frame_free, (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 | AV_FUNC_AVUTIL_58)) -+ AV_FUNC(av_frame_unref, (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 | AV_FUNC_AVUTIL_58)) - AV_FUNC_OPTION(av_frame_get_colorspace, AV_FUNC_AVUTIL_ALL) - #undef AV_FUNC - #undef AV_FUNC_OPTION -diff --git a/dom/media/platforms/ffmpeg/FFmpegLibs.h b/dom/media/platforms/ffmpeg/FFmpegLibs.h -index b8c092330212..be99eaa244ca 100644 ---- a/dom/media/platforms/ffmpeg/FFmpegLibs.h -+++ b/dom/media/platforms/ffmpeg/FFmpegLibs.h -@@ -27,9 +27,11 @@ extern "C" { - #define AV_CODEC_ID_VP8 CODEC_ID_VP8 - #define AV_CODEC_ID_NONE CODEC_ID_NONE - #define AV_CODEC_ID_FLAC CODEC_ID_FLAC --#define AV_CODEC_FLAG_LOW_DELAY CODEC_FLAG_LOW_DELAY - typedef CodecID AVCodecID; - #endif -+#if LIBAVCODEC_VERSION_MAJOR <= 55 -+#define AV_CODEC_FLAG_LOW_DELAY CODEC_FLAG_LOW_DELAY -+#endif - - #ifdef FFVPX_VERSION - enum { LIBAV_VER = FFVPX_VERSION }; -diff --git a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp -index f671e6e61bc4..b7ab49329502 100644 ---- a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp -+++ b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp -@@ -26,12 +26,15 @@ static FFmpegLibWrapper sLibAV; - - static const char* sLibs[] = { - #if defined(XP_DARWIN) -+ "libavcodec.58.dylib", - "libavcodec.57.dylib", - "libavcodec.56.dylib", - "libavcodec.55.dylib", - "libavcodec.54.dylib", - "libavcodec.53.dylib", - #else -+ "libavcodec.so.58", -+ "libavcodec-ffmpeg.so.58", - "libavcodec-ffmpeg.so.57", - "libavcodec-ffmpeg.so.56", - "libavcodec.so.57", -@@ -134,6 +137,7 @@ FFmpegRuntimeLinker::CreateDecoderModule() - case 55: - case 56: module = FFmpegDecoderModule<55>::Create(&sLibAV); break; - case 57: module = FFmpegDecoderModule<57>::Create(&sLibAV); break; -+ case 58: module = FFmpegDecoderModule<58>::Create(&sLibAV); break; - default: module = nullptr; - } - return module.forget(); -diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp -index 184fd43b6573..de37e007488f 100644 ---- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp -+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp -@@ -166,7 +166,7 @@ FFmpegVideoDecoder::InitCodecContext() - } - - if (mLowLatency) { -- mCodecContext->flags |= CODEC_FLAG_LOW_DELAY; -+ mCodecContext->flags |= AV_CODEC_FLAG_LOW_DELAY; - // ffvp9 and ffvp8 at this stage do not support slice threading, but it may - // help with the h264 decoder if there's ever one. - mCodecContext->thread_type = FF_THREAD_SLICE; -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/COPYING.LGPLv2.1 b/dom/media/platforms/ffmpeg/ffmpeg58/include/COPYING.LGPLv2.1 -new file mode 100644 -index 000000000000..00b4fedfe7e7 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/COPYING.LGPLv2.1 -@@ -0,0 +1,504 @@ -+ GNU LESSER GENERAL PUBLIC LICENSE -+ Version 2.1, February 1999 -+ -+ Copyright (C) 1991, 1999 Free Software Foundation, Inc. -+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ Everyone is permitted to copy and distribute verbatim copies -+ of this license document, but changing it is not allowed. -+ -+[This is the first released version of the Lesser GPL. It also counts -+ as the successor of the GNU Library Public License, version 2, hence -+ the version number 2.1.] -+ -+ Preamble -+ -+ The licenses for most software are designed to take away your -+freedom to share and change it. By contrast, the GNU General Public -+Licenses are intended to guarantee your freedom to share and change -+free software--to make sure the software is free for all its users. -+ -+ This license, the Lesser General Public License, applies to some -+specially designated software packages--typically libraries--of the -+Free Software Foundation and other authors who decide to use it. You -+can use it too, but we suggest you first think carefully about whether -+this license or the ordinary General Public License is the better -+strategy to use in any particular case, based on the explanations below. -+ -+ When we speak of free software, we are referring to freedom of use, -+not price. Our General Public Licenses are designed to make sure that -+you have the freedom to distribute copies of free software (and charge -+for this service if you wish); that you receive source code or can get -+it if you want it; that you can change the software and use pieces of -+it in new free programs; and that you are informed that you can do -+these things. -+ -+ To protect your rights, we need to make restrictions that forbid -+distributors to deny you these rights or to ask you to surrender these -+rights. These restrictions translate to certain responsibilities for -+you if you distribute copies of the library or if you modify it. -+ -+ For example, if you distribute copies of the library, whether gratis -+or for a fee, you must give the recipients all the rights that we gave -+you. You must make sure that they, too, receive or can get the source -+code. If you link other code with the library, you must provide -+complete object files to the recipients, so that they can relink them -+with the library after making changes to the library and recompiling -+it. And you must show them these terms so they know their rights. -+ -+ We protect your rights with a two-step method: (1) we copyright the -+library, and (2) we offer you this license, which gives you legal -+permission to copy, distribute and/or modify the library. -+ -+ To protect each distributor, we want to make it very clear that -+there is no warranty for the free library. Also, if the library is -+modified by someone else and passed on, the recipients should know -+that what they have is not the original version, so that the original -+author's reputation will not be affected by problems that might be -+introduced by others. -+ -+ Finally, software patents pose a constant threat to the existence of -+any free program. We wish to make sure that a company cannot -+effectively restrict the users of a free program by obtaining a -+restrictive license from a patent holder. Therefore, we insist that -+any patent license obtained for a version of the library must be -+consistent with the full freedom of use specified in this license. -+ -+ Most GNU software, including some libraries, is covered by the -+ordinary GNU General Public License. This license, the GNU Lesser -+General Public License, applies to certain designated libraries, and -+is quite different from the ordinary General Public License. We use -+this license for certain libraries in order to permit linking those -+libraries into non-free programs. -+ -+ When a program is linked with a library, whether statically or using -+a shared library, the combination of the two is legally speaking a -+combined work, a derivative of the original library. The ordinary -+General Public License therefore permits such linking only if the -+entire combination fits its criteria of freedom. The Lesser General -+Public License permits more lax criteria for linking other code with -+the library. -+ -+ We call this license the "Lesser" General Public License because it -+does Less to protect the user's freedom than the ordinary General -+Public License. It also provides other free software developers Less -+of an advantage over competing non-free programs. These disadvantages -+are the reason we use the ordinary General Public License for many -+libraries. However, the Lesser license provides advantages in certain -+special circumstances. -+ -+ For example, on rare occasions, there may be a special need to -+encourage the widest possible use of a certain library, so that it becomes -+a de-facto standard. To achieve this, non-free programs must be -+allowed to use the library. A more frequent case is that a free -+library does the same job as widely used non-free libraries. In this -+case, there is little to gain by limiting the free library to free -+software only, so we use the Lesser General Public License. -+ -+ In other cases, permission to use a particular library in non-free -+programs enables a greater number of people to use a large body of -+free software. For example, permission to use the GNU C Library in -+non-free programs enables many more people to use the whole GNU -+operating system, as well as its variant, the GNU/Linux operating -+system. -+ -+ Although the Lesser General Public License is Less protective of the -+users' freedom, it does ensure that the user of a program that is -+linked with the Library has the freedom and the wherewithal to run -+that program using a modified version of the Library. -+ -+ The precise terms and conditions for copying, distribution and -+modification follow. Pay close attention to the difference between a -+"work based on the library" and a "work that uses the library". The -+former contains code derived from the library, whereas the latter must -+be combined with the library in order to run. -+ -+ GNU LESSER GENERAL PUBLIC LICENSE -+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -+ -+ 0. This License Agreement applies to any software library or other -+program which contains a notice placed by the copyright holder or -+other authorized party saying it may be distributed under the terms of -+this Lesser General Public License (also called "this License"). -+Each licensee is addressed as "you". -+ -+ A "library" means a collection of software functions and/or data -+prepared so as to be conveniently linked with application programs -+(which use some of those functions and data) to form executables. -+ -+ The "Library", below, refers to any such software library or work -+which has been distributed under these terms. A "work based on the -+Library" means either the Library or any derivative work under -+copyright law: that is to say, a work containing the Library or a -+portion of it, either verbatim or with modifications and/or translated -+straightforwardly into another language. (Hereinafter, translation is -+included without limitation in the term "modification".) -+ -+ "Source code" for a work means the preferred form of the work for -+making modifications to it. For a library, complete source code means -+all the source code for all modules it contains, plus any associated -+interface definition files, plus the scripts used to control compilation -+and installation of the library. -+ -+ Activities other than copying, distribution and modification are not -+covered by this License; they are outside its scope. The act of -+running a program using the Library is not restricted, and output from -+such a program is covered only if its contents constitute a work based -+on the Library (independent of the use of the Library in a tool for -+writing it). Whether that is true depends on what the Library does -+and what the program that uses the Library does. -+ -+ 1. You may copy and distribute verbatim copies of the Library's -+complete source code as you receive it, in any medium, provided that -+you conspicuously and appropriately publish on each copy an -+appropriate copyright notice and disclaimer of warranty; keep intact -+all the notices that refer to this License and to the absence of any -+warranty; and distribute a copy of this License along with the -+Library. -+ -+ You may charge a fee for the physical act of transferring a copy, -+and you may at your option offer warranty protection in exchange for a -+fee. -+ -+ 2. You may modify your copy or copies of the Library or any portion -+of it, thus forming a work based on the Library, and copy and -+distribute such modifications or work under the terms of Section 1 -+above, provided that you also meet all of these conditions: -+ -+ a) The modified work must itself be a software library. -+ -+ b) You must cause the files modified to carry prominent notices -+ stating that you changed the files and the date of any change. -+ -+ c) You must cause the whole of the work to be licensed at no -+ charge to all third parties under the terms of this License. -+ -+ d) If a facility in the modified Library refers to a function or a -+ table of data to be supplied by an application program that uses -+ the facility, other than as an argument passed when the facility -+ is invoked, then you must make a good faith effort to ensure that, -+ in the event an application does not supply such function or -+ table, the facility still operates, and performs whatever part of -+ its purpose remains meaningful. -+ -+ (For example, a function in a library to compute square roots has -+ a purpose that is entirely well-defined independent of the -+ application. Therefore, Subsection 2d requires that any -+ application-supplied function or table used by this function must -+ be optional: if the application does not supply it, the square -+ root function must still compute square roots.) -+ -+These requirements apply to the modified work as a whole. If -+identifiable sections of that work are not derived from the Library, -+and can be reasonably considered independent and separate works in -+themselves, then this License, and its terms, do not apply to those -+sections when you distribute them as separate works. But when you -+distribute the same sections as part of a whole which is a work based -+on the Library, the distribution of the whole must be on the terms of -+this License, whose permissions for other licensees extend to the -+entire whole, and thus to each and every part regardless of who wrote -+it. -+ -+Thus, it is not the intent of this section to claim rights or contest -+your rights to work written entirely by you; rather, the intent is to -+exercise the right to control the distribution of derivative or -+collective works based on the Library. -+ -+In addition, mere aggregation of another work not based on the Library -+with the Library (or with a work based on the Library) on a volume of -+a storage or distribution medium does not bring the other work under -+the scope of this License. -+ -+ 3. You may opt to apply the terms of the ordinary GNU General Public -+License instead of this License to a given copy of the Library. To do -+this, you must alter all the notices that refer to this License, so -+that they refer to the ordinary GNU General Public License, version 2, -+instead of to this License. (If a newer version than version 2 of the -+ordinary GNU General Public License has appeared, then you can specify -+that version instead if you wish.) Do not make any other change in -+these notices. -+ -+ Once this change is made in a given copy, it is irreversible for -+that copy, so the ordinary GNU General Public License applies to all -+subsequent copies and derivative works made from that copy. -+ -+ This option is useful when you wish to copy part of the code of -+the Library into a program that is not a library. -+ -+ 4. You may copy and distribute the Library (or a portion or -+derivative of it, under Section 2) in object code or executable form -+under the terms of Sections 1 and 2 above provided that you accompany -+it with the complete corresponding machine-readable source code, which -+must be distributed under the terms of Sections 1 and 2 above on a -+medium customarily used for software interchange. -+ -+ If distribution of object code is made by offering access to copy -+from a designated place, then offering equivalent access to copy the -+source code from the same place satisfies the requirement to -+distribute the source code, even though third parties are not -+compelled to copy the source along with the object code. -+ -+ 5. A program that contains no derivative of any portion of the -+Library, but is designed to work with the Library by being compiled or -+linked with it, is called a "work that uses the Library". Such a -+work, in isolation, is not a derivative work of the Library, and -+therefore falls outside the scope of this License. -+ -+ However, linking a "work that uses the Library" with the Library -+creates an executable that is a derivative of the Library (because it -+contains portions of the Library), rather than a "work that uses the -+library". The executable is therefore covered by this License. -+Section 6 states terms for distribution of such executables. -+ -+ When a "work that uses the Library" uses material from a header file -+that is part of the Library, the object code for the work may be a -+derivative work of the Library even though the source code is not. -+Whether this is true is especially significant if the work can be -+linked without the Library, or if the work is itself a library. The -+threshold for this to be true is not precisely defined by law. -+ -+ If such an object file uses only numerical parameters, data -+structure layouts and accessors, and small macros and small inline -+functions (ten lines or less in length), then the use of the object -+file is unrestricted, regardless of whether it is legally a derivative -+work. (Executables containing this object code plus portions of the -+Library will still fall under Section 6.) -+ -+ Otherwise, if the work is a derivative of the Library, you may -+distribute the object code for the work under the terms of Section 6. -+Any executables containing that work also fall under Section 6, -+whether or not they are linked directly with the Library itself. -+ -+ 6. As an exception to the Sections above, you may also combine or -+link a "work that uses the Library" with the Library to produce a -+work containing portions of the Library, and distribute that work -+under terms of your choice, provided that the terms permit -+modification of the work for the customer's own use and reverse -+engineering for debugging such modifications. -+ -+ You must give prominent notice with each copy of the work that the -+Library is used in it and that the Library and its use are covered by -+this License. You must supply a copy of this License. If the work -+during execution displays copyright notices, you must include the -+copyright notice for the Library among them, as well as a reference -+directing the user to the copy of this License. Also, you must do one -+of these things: -+ -+ a) Accompany the work with the complete corresponding -+ machine-readable source code for the Library including whatever -+ changes were used in the work (which must be distributed under -+ Sections 1 and 2 above); and, if the work is an executable linked -+ with the Library, with the complete machine-readable "work that -+ uses the Library", as object code and/or source code, so that the -+ user can modify the Library and then relink to produce a modified -+ executable containing the modified Library. (It is understood -+ that the user who changes the contents of definitions files in the -+ Library will not necessarily be able to recompile the application -+ to use the modified definitions.) -+ -+ b) Use a suitable shared library mechanism for linking with the -+ Library. A suitable mechanism is one that (1) uses at run time a -+ copy of the library already present on the user's computer system, -+ rather than copying library functions into the executable, and (2) -+ will operate properly with a modified version of the library, if -+ the user installs one, as long as the modified version is -+ interface-compatible with the version that the work was made with. -+ -+ c) Accompany the work with a written offer, valid for at -+ least three years, to give the same user the materials -+ specified in Subsection 6a, above, for a charge no more -+ than the cost of performing this distribution. -+ -+ d) If distribution of the work is made by offering access to copy -+ from a designated place, offer equivalent access to copy the above -+ specified materials from the same place. -+ -+ e) Verify that the user has already received a copy of these -+ materials or that you have already sent this user a copy. -+ -+ For an executable, the required form of the "work that uses the -+Library" must include any data and utility programs needed for -+reproducing the executable from it. However, as a special exception, -+the materials to be distributed need not include anything that is -+normally distributed (in either source or binary form) with the major -+components (compiler, kernel, and so on) of the operating system on -+which the executable runs, unless that component itself accompanies -+the executable. -+ -+ It may happen that this requirement contradicts the license -+restrictions of other proprietary libraries that do not normally -+accompany the operating system. Such a contradiction means you cannot -+use both them and the Library together in an executable that you -+distribute. -+ -+ 7. You may place library facilities that are a work based on the -+Library side-by-side in a single library together with other library -+facilities not covered by this License, and distribute such a combined -+library, provided that the separate distribution of the work based on -+the Library and of the other library facilities is otherwise -+permitted, and provided that you do these two things: -+ -+ a) Accompany the combined library with a copy of the same work -+ based on the Library, uncombined with any other library -+ facilities. This must be distributed under the terms of the -+ Sections above. -+ -+ b) Give prominent notice with the combined library of the fact -+ that part of it is a work based on the Library, and explaining -+ where to find the accompanying uncombined form of the same work. -+ -+ 8. You may not copy, modify, sublicense, link with, or distribute -+the Library except as expressly provided under this License. Any -+attempt otherwise to copy, modify, sublicense, link with, or -+distribute the Library is void, and will automatically terminate your -+rights under this License. However, parties who have received copies, -+or rights, from you under this License will not have their licenses -+terminated so long as such parties remain in full compliance. -+ -+ 9. You are not required to accept this License, since you have not -+signed it. However, nothing else grants you permission to modify or -+distribute the Library or its derivative works. These actions are -+prohibited by law if you do not accept this License. Therefore, by -+modifying or distributing the Library (or any work based on the -+Library), you indicate your acceptance of this License to do so, and -+all its terms and conditions for copying, distributing or modifying -+the Library or works based on it. -+ -+ 10. Each time you redistribute the Library (or any work based on the -+Library), the recipient automatically receives a license from the -+original licensor to copy, distribute, link with or modify the Library -+subject to these terms and conditions. You may not impose any further -+restrictions on the recipients' exercise of the rights granted herein. -+You are not responsible for enforcing compliance by third parties with -+this License. -+ -+ 11. If, as a consequence of a court judgment or allegation of patent -+infringement or for any other reason (not limited to patent issues), -+conditions are imposed on you (whether by court order, agreement or -+otherwise) that contradict the conditions of this License, they do not -+excuse you from the conditions of this License. If you cannot -+distribute so as to satisfy simultaneously your obligations under this -+License and any other pertinent obligations, then as a consequence you -+may not distribute the Library at all. For example, if a patent -+license would not permit royalty-free redistribution of the Library by -+all those who receive copies directly or indirectly through you, then -+the only way you could satisfy both it and this License would be to -+refrain entirely from distribution of the Library. -+ -+If any portion of this section is held invalid or unenforceable under any -+particular circumstance, the balance of the section is intended to apply, -+and the section as a whole is intended to apply in other circumstances. -+ -+It is not the purpose of this section to induce you to infringe any -+patents or other property right claims or to contest validity of any -+such claims; this section has the sole purpose of protecting the -+integrity of the free software distribution system which is -+implemented by public license practices. Many people have made -+generous contributions to the wide range of software distributed -+through that system in reliance on consistent application of that -+system; it is up to the author/donor to decide if he or she is willing -+to distribute software through any other system and a licensee cannot -+impose that choice. -+ -+This section is intended to make thoroughly clear what is believed to -+be a consequence of the rest of this License. -+ -+ 12. If the distribution and/or use of the Library is restricted in -+certain countries either by patents or by copyrighted interfaces, the -+original copyright holder who places the Library under this License may add -+an explicit geographical distribution limitation excluding those countries, -+so that distribution is permitted only in or among countries not thus -+excluded. In such case, this License incorporates the limitation as if -+written in the body of this License. -+ -+ 13. The Free Software Foundation may publish revised and/or new -+versions of the Lesser General Public License from time to time. -+Such new versions will be similar in spirit to the present version, -+but may differ in detail to address new problems or concerns. -+ -+Each version is given a distinguishing version number. If the Library -+specifies a version number of this License which applies to it and -+"any later version", you have the option of following the terms and -+conditions either of that version or of any later version published by -+the Free Software Foundation. If the Library does not specify a -+license version number, you may choose any version ever published by -+the Free Software Foundation. -+ -+ 14. If you wish to incorporate parts of the Library into other free -+programs whose distribution conditions are incompatible with these, -+write to the author to ask for permission. For software which is -+copyrighted by the Free Software Foundation, write to the Free -+Software Foundation; we sometimes make exceptions for this. Our -+decision will be guided by the two goals of preserving the free status -+of all derivatives of our free software and of promoting the sharing -+and reuse of software generally. -+ -+ NO WARRANTY -+ -+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. -+ -+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -+DAMAGES. -+ -+ END OF TERMS AND CONDITIONS -+ -+ How to Apply These Terms to Your New Libraries -+ -+ If you develop a new library, and you want it to be of the greatest -+possible use to the public, we recommend making it free software that -+everyone can redistribute and change. You can do so by permitting -+redistribution under these terms (or, alternatively, under the terms of the -+ordinary General Public License). -+ -+ To apply these terms, attach the following notices to the library. It is -+safest to attach them to the start of each source file to most effectively -+convey the exclusion of warranty; and each file should have at least the -+"copyright" line and a pointer to where the full notice is found. -+ -+ -+ Copyright (C) -+ -+ This library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ This library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with this library; if not, write to the Free Software -+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ -+Also add information on how to contact you by electronic and paper mail. -+ -+You should also get your employer (if you work as a programmer) or your -+school, if any, to sign a "copyright disclaimer" for the library, if -+necessary. Here is a sample; alter the names: -+ -+ Yoyodyne, Inc., hereby disclaims all copyright interest in the -+ library `Frob' (a library for tweaking knobs) written by James Random Hacker. -+ -+ , 1 April 1990 -+ Ty Coon, President of Vice -+ -+That's all there is to it! -+ -+ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/avcodec.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/avcodec.h -new file mode 100644 -index 000000000000..fb0c6fae70b3 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/avcodec.h -@@ -0,0 +1,6146 @@ -+/* -+ * copyright (c) 2001 Fabrice Bellard -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+#ifndef AVCODEC_AVCODEC_H -+#define AVCODEC_AVCODEC_H -+ -+/** -+ * @file -+ * @ingroup libavc -+ * Libavcodec external API header -+ */ -+ -+#include -+#include "libavutil/samplefmt.h" -+#include "libavutil/attributes.h" -+#include "libavutil/avutil.h" -+#include "libavutil/buffer.h" -+#include "libavutil/cpu.h" -+#include "libavutil/channel_layout.h" -+#include "libavutil/dict.h" -+#include "libavutil/frame.h" -+#include "libavutil/hwcontext.h" -+#include "libavutil/log.h" -+#include "libavutil/pixfmt.h" -+#include "libavutil/rational.h" -+ -+#include "version.h" -+ -+/** -+ * @defgroup libavc libavcodec -+ * Encoding/Decoding Library -+ * -+ * @{ -+ * -+ * @defgroup lavc_decoding Decoding -+ * @{ -+ * @} -+ * -+ * @defgroup lavc_encoding Encoding -+ * @{ -+ * @} -+ * -+ * @defgroup lavc_codec Codecs -+ * @{ -+ * @defgroup lavc_codec_native Native Codecs -+ * @{ -+ * @} -+ * @defgroup lavc_codec_wrappers External library wrappers -+ * @{ -+ * @} -+ * @defgroup lavc_codec_hwaccel Hardware Accelerators bridge -+ * @{ -+ * @} -+ * @} -+ * @defgroup lavc_internal Internal -+ * @{ -+ * @} -+ * @} -+ */ -+ -+/** -+ * @ingroup libavc -+ * @defgroup lavc_encdec send/receive encoding and decoding API overview -+ * @{ -+ * -+ * The avcodec_send_packet()/avcodec_receive_frame()/avcodec_send_frame()/ -+ * avcodec_receive_packet() functions provide an encode/decode API, which -+ * decouples input and output. -+ * -+ * The API is very similar for encoding/decoding and audio/video, and works as -+ * follows: -+ * - Set up and open the AVCodecContext as usual. -+ * - Send valid input: -+ * - For decoding, call avcodec_send_packet() to give the decoder raw -+ * compressed data in an AVPacket. -+ * - For encoding, call avcodec_send_frame() to give the encoder an AVFrame -+ * containing uncompressed audio or video. -+ * In both cases, it is recommended that AVPackets and AVFrames are -+ * refcounted, or libavcodec might have to copy the input data. (libavformat -+ * always returns refcounted AVPackets, and av_frame_get_buffer() allocates -+ * refcounted AVFrames.) -+ * - Receive output in a loop. Periodically call one of the avcodec_receive_*() -+ * functions and process their output: -+ * - For decoding, call avcodec_receive_frame(). On success, it will return -+ * an AVFrame containing uncompressed audio or video data. -+ * - For encoding, call avcodec_receive_packet(). On success, it will return -+ * an AVPacket with a compressed frame. -+ * Repeat this call until it returns AVERROR(EAGAIN) or an error. The -+ * AVERROR(EAGAIN) return value means that new input data is required to -+ * return new output. In this case, continue with sending input. For each -+ * input frame/packet, the codec will typically return 1 output frame/packet, -+ * but it can also be 0 or more than 1. -+ * -+ * At the beginning of decoding or encoding, the codec might accept multiple -+ * input frames/packets without returning a frame, until its internal buffers -+ * are filled. This situation is handled transparently if you follow the steps -+ * outlined above. -+ * -+ * In theory, sending input can result in EAGAIN - this should happen only if -+ * not all output was received. You can use this to structure alternative decode -+ * or encode loops other than the one suggested above. For example, you could -+ * try sending new input on each iteration, and try to receive output if that -+ * returns EAGAIN. -+ * -+ * End of stream situations. These require "flushing" (aka draining) the codec, -+ * as the codec might buffer multiple frames or packets internally for -+ * performance or out of necessity (consider B-frames). -+ * This is handled as follows: -+ * - Instead of valid input, send NULL to the avcodec_send_packet() (decoding) -+ * or avcodec_send_frame() (encoding) functions. This will enter draining -+ * mode. -+ * - Call avcodec_receive_frame() (decoding) or avcodec_receive_packet() -+ * (encoding) in a loop until AVERROR_EOF is returned. The functions will -+ * not return AVERROR(EAGAIN), unless you forgot to enter draining mode. -+ * - Before decoding can be resumed again, the codec has to be reset with -+ * avcodec_flush_buffers(). -+ * -+ * Using the API as outlined above is highly recommended. But it is also -+ * possible to call functions outside of this rigid schema. For example, you can -+ * call avcodec_send_packet() repeatedly without calling -+ * avcodec_receive_frame(). In this case, avcodec_send_packet() will succeed -+ * until the codec's internal buffer has been filled up (which is typically of -+ * size 1 per output frame, after initial input), and then reject input with -+ * AVERROR(EAGAIN). Once it starts rejecting input, you have no choice but to -+ * read at least some output. -+ * -+ * Not all codecs will follow a rigid and predictable dataflow; the only -+ * guarantee is that an AVERROR(EAGAIN) return value on a send/receive call on -+ * one end implies that a receive/send call on the other end will succeed, or -+ * at least will not fail with AVERROR(EAGAIN). In general, no codec will -+ * permit unlimited buffering of input or output. -+ * -+ * This API replaces the following legacy functions: -+ * - avcodec_decode_video2() and avcodec_decode_audio4(): -+ * Use avcodec_send_packet() to feed input to the decoder, then use -+ * avcodec_receive_frame() to receive decoded frames after each packet. -+ * Unlike with the old video decoding API, multiple frames might result from -+ * a packet. For audio, splitting the input packet into frames by partially -+ * decoding packets becomes transparent to the API user. You never need to -+ * feed an AVPacket to the API twice (unless it is rejected with AVERROR(EAGAIN) - then -+ * no data was read from the packet). -+ * Additionally, sending a flush/draining packet is required only once. -+ * - avcodec_encode_video2()/avcodec_encode_audio2(): -+ * Use avcodec_send_frame() to feed input to the encoder, then use -+ * avcodec_receive_packet() to receive encoded packets. -+ * Providing user-allocated buffers for avcodec_receive_packet() is not -+ * possible. -+ * - The new API does not handle subtitles yet. -+ * -+ * Mixing new and old function calls on the same AVCodecContext is not allowed, -+ * and will result in undefined behavior. -+ * -+ * Some codecs might require using the new API; using the old API will return -+ * an error when calling it. All codecs support the new API. -+ * -+ * A codec is not allowed to return AVERROR(EAGAIN) for both sending and receiving. This -+ * would be an invalid state, which could put the codec user into an endless -+ * loop. The API has no concept of time either: it cannot happen that trying to -+ * do avcodec_send_packet() results in AVERROR(EAGAIN), but a repeated call 1 second -+ * later accepts the packet (with no other receive/flush API calls involved). -+ * The API is a strict state machine, and the passage of time is not supposed -+ * to influence it. Some timing-dependent behavior might still be deemed -+ * acceptable in certain cases. But it must never result in both send/receive -+ * returning EAGAIN at the same time at any point. It must also absolutely be -+ * avoided that the current state is "unstable" and can "flip-flop" between -+ * the send/receive APIs allowing progress. For example, it's not allowed that -+ * the codec randomly decides that it actually wants to consume a packet now -+ * instead of returning a frame, after it just returned AVERROR(EAGAIN) on an -+ * avcodec_send_packet() call. -+ * @} -+ */ -+ -+/** -+ * @defgroup lavc_core Core functions/structures. -+ * @ingroup libavc -+ * -+ * Basic definitions, functions for querying libavcodec capabilities, -+ * allocating core structures, etc. -+ * @{ -+ */ -+ -+ -+/** -+ * Identify the syntax and semantics of the bitstream. -+ * The principle is roughly: -+ * Two decoders with the same ID can decode the same streams. -+ * Two encoders with the same ID can encode compatible streams. -+ * There may be slight deviations from the principle due to implementation -+ * details. -+ * -+ * If you add a codec ID to this list, add it so that -+ * 1. no value of an existing codec ID changes (that would break ABI), -+ * 2. it is as close as possible to similar codecs -+ * -+ * After adding new codec IDs, do not forget to add an entry to the codec -+ * descriptor list and bump libavcodec minor version. -+ */ -+enum AVCodecID { -+ AV_CODEC_ID_NONE, -+ -+ /* video codecs */ -+ AV_CODEC_ID_MPEG1VIDEO, -+ AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding -+ AV_CODEC_ID_H261, -+ AV_CODEC_ID_H263, -+ AV_CODEC_ID_RV10, -+ AV_CODEC_ID_RV20, -+ AV_CODEC_ID_MJPEG, -+ AV_CODEC_ID_MJPEGB, -+ AV_CODEC_ID_LJPEG, -+ AV_CODEC_ID_SP5X, -+ AV_CODEC_ID_JPEGLS, -+ AV_CODEC_ID_MPEG4, -+ AV_CODEC_ID_RAWVIDEO, -+ AV_CODEC_ID_MSMPEG4V1, -+ AV_CODEC_ID_MSMPEG4V2, -+ AV_CODEC_ID_MSMPEG4V3, -+ AV_CODEC_ID_WMV1, -+ AV_CODEC_ID_WMV2, -+ AV_CODEC_ID_H263P, -+ AV_CODEC_ID_H263I, -+ AV_CODEC_ID_FLV1, -+ AV_CODEC_ID_SVQ1, -+ AV_CODEC_ID_SVQ3, -+ AV_CODEC_ID_DVVIDEO, -+ AV_CODEC_ID_HUFFYUV, -+ AV_CODEC_ID_CYUV, -+ AV_CODEC_ID_H264, -+ AV_CODEC_ID_INDEO3, -+ AV_CODEC_ID_VP3, -+ AV_CODEC_ID_THEORA, -+ AV_CODEC_ID_ASV1, -+ AV_CODEC_ID_ASV2, -+ AV_CODEC_ID_FFV1, -+ AV_CODEC_ID_4XM, -+ AV_CODEC_ID_VCR1, -+ AV_CODEC_ID_CLJR, -+ AV_CODEC_ID_MDEC, -+ AV_CODEC_ID_ROQ, -+ AV_CODEC_ID_INTERPLAY_VIDEO, -+ AV_CODEC_ID_XAN_WC3, -+ AV_CODEC_ID_XAN_WC4, -+ AV_CODEC_ID_RPZA, -+ AV_CODEC_ID_CINEPAK, -+ AV_CODEC_ID_WS_VQA, -+ AV_CODEC_ID_MSRLE, -+ AV_CODEC_ID_MSVIDEO1, -+ AV_CODEC_ID_IDCIN, -+ AV_CODEC_ID_8BPS, -+ AV_CODEC_ID_SMC, -+ AV_CODEC_ID_FLIC, -+ AV_CODEC_ID_TRUEMOTION1, -+ AV_CODEC_ID_VMDVIDEO, -+ AV_CODEC_ID_MSZH, -+ AV_CODEC_ID_ZLIB, -+ AV_CODEC_ID_QTRLE, -+ AV_CODEC_ID_TSCC, -+ AV_CODEC_ID_ULTI, -+ AV_CODEC_ID_QDRAW, -+ AV_CODEC_ID_VIXL, -+ AV_CODEC_ID_QPEG, -+ AV_CODEC_ID_PNG, -+ AV_CODEC_ID_PPM, -+ AV_CODEC_ID_PBM, -+ AV_CODEC_ID_PGM, -+ AV_CODEC_ID_PGMYUV, -+ AV_CODEC_ID_PAM, -+ AV_CODEC_ID_FFVHUFF, -+ AV_CODEC_ID_RV30, -+ AV_CODEC_ID_RV40, -+ AV_CODEC_ID_VC1, -+ AV_CODEC_ID_WMV3, -+ AV_CODEC_ID_LOCO, -+ AV_CODEC_ID_WNV1, -+ AV_CODEC_ID_AASC, -+ AV_CODEC_ID_INDEO2, -+ AV_CODEC_ID_FRAPS, -+ AV_CODEC_ID_TRUEMOTION2, -+ AV_CODEC_ID_BMP, -+ AV_CODEC_ID_CSCD, -+ AV_CODEC_ID_MMVIDEO, -+ AV_CODEC_ID_ZMBV, -+ AV_CODEC_ID_AVS, -+ AV_CODEC_ID_SMACKVIDEO, -+ AV_CODEC_ID_NUV, -+ AV_CODEC_ID_KMVC, -+ AV_CODEC_ID_FLASHSV, -+ AV_CODEC_ID_CAVS, -+ AV_CODEC_ID_JPEG2000, -+ AV_CODEC_ID_VMNC, -+ AV_CODEC_ID_VP5, -+ AV_CODEC_ID_VP6, -+ AV_CODEC_ID_VP6F, -+ AV_CODEC_ID_TARGA, -+ AV_CODEC_ID_DSICINVIDEO, -+ AV_CODEC_ID_TIERTEXSEQVIDEO, -+ AV_CODEC_ID_TIFF, -+ AV_CODEC_ID_GIF, -+ AV_CODEC_ID_DXA, -+ AV_CODEC_ID_DNXHD, -+ AV_CODEC_ID_THP, -+ AV_CODEC_ID_SGI, -+ AV_CODEC_ID_C93, -+ AV_CODEC_ID_BETHSOFTVID, -+ AV_CODEC_ID_PTX, -+ AV_CODEC_ID_TXD, -+ AV_CODEC_ID_VP6A, -+ AV_CODEC_ID_AMV, -+ AV_CODEC_ID_VB, -+ AV_CODEC_ID_PCX, -+ AV_CODEC_ID_SUNRAST, -+ AV_CODEC_ID_INDEO4, -+ AV_CODEC_ID_INDEO5, -+ AV_CODEC_ID_MIMIC, -+ AV_CODEC_ID_RL2, -+ AV_CODEC_ID_ESCAPE124, -+ AV_CODEC_ID_DIRAC, -+ AV_CODEC_ID_BFI, -+ AV_CODEC_ID_CMV, -+ AV_CODEC_ID_MOTIONPIXELS, -+ AV_CODEC_ID_TGV, -+ AV_CODEC_ID_TGQ, -+ AV_CODEC_ID_TQI, -+ AV_CODEC_ID_AURA, -+ AV_CODEC_ID_AURA2, -+ AV_CODEC_ID_V210X, -+ AV_CODEC_ID_TMV, -+ AV_CODEC_ID_V210, -+ AV_CODEC_ID_DPX, -+ AV_CODEC_ID_MAD, -+ AV_CODEC_ID_FRWU, -+ AV_CODEC_ID_FLASHSV2, -+ AV_CODEC_ID_CDGRAPHICS, -+ AV_CODEC_ID_R210, -+ AV_CODEC_ID_ANM, -+ AV_CODEC_ID_BINKVIDEO, -+ AV_CODEC_ID_IFF_ILBM, -+#define AV_CODEC_ID_IFF_BYTERUN1 AV_CODEC_ID_IFF_ILBM -+ AV_CODEC_ID_KGV1, -+ AV_CODEC_ID_YOP, -+ AV_CODEC_ID_VP8, -+ AV_CODEC_ID_PICTOR, -+ AV_CODEC_ID_ANSI, -+ AV_CODEC_ID_A64_MULTI, -+ AV_CODEC_ID_A64_MULTI5, -+ AV_CODEC_ID_R10K, -+ AV_CODEC_ID_MXPEG, -+ AV_CODEC_ID_LAGARITH, -+ AV_CODEC_ID_PRORES, -+ AV_CODEC_ID_JV, -+ AV_CODEC_ID_DFA, -+ AV_CODEC_ID_WMV3IMAGE, -+ AV_CODEC_ID_VC1IMAGE, -+ AV_CODEC_ID_UTVIDEO, -+ AV_CODEC_ID_BMV_VIDEO, -+ AV_CODEC_ID_VBLE, -+ AV_CODEC_ID_DXTORY, -+ AV_CODEC_ID_V410, -+ AV_CODEC_ID_XWD, -+ AV_CODEC_ID_CDXL, -+ AV_CODEC_ID_XBM, -+ AV_CODEC_ID_ZEROCODEC, -+ AV_CODEC_ID_MSS1, -+ AV_CODEC_ID_MSA1, -+ AV_CODEC_ID_TSCC2, -+ AV_CODEC_ID_MTS2, -+ AV_CODEC_ID_CLLC, -+ AV_CODEC_ID_MSS2, -+ AV_CODEC_ID_VP9, -+ AV_CODEC_ID_AIC, -+ AV_CODEC_ID_ESCAPE130, -+ AV_CODEC_ID_G2M, -+ AV_CODEC_ID_WEBP, -+ AV_CODEC_ID_HNM4_VIDEO, -+ AV_CODEC_ID_HEVC, -+#define AV_CODEC_ID_H265 AV_CODEC_ID_HEVC -+ AV_CODEC_ID_FIC, -+ AV_CODEC_ID_ALIAS_PIX, -+ AV_CODEC_ID_BRENDER_PIX, -+ AV_CODEC_ID_PAF_VIDEO, -+ AV_CODEC_ID_EXR, -+ AV_CODEC_ID_VP7, -+ AV_CODEC_ID_SANM, -+ AV_CODEC_ID_SGIRLE, -+ AV_CODEC_ID_MVC1, -+ AV_CODEC_ID_MVC2, -+ AV_CODEC_ID_HQX, -+ AV_CODEC_ID_TDSC, -+ AV_CODEC_ID_HQ_HQA, -+ AV_CODEC_ID_HAP, -+ AV_CODEC_ID_DDS, -+ AV_CODEC_ID_DXV, -+ AV_CODEC_ID_SCREENPRESSO, -+ AV_CODEC_ID_RSCC, -+ -+ AV_CODEC_ID_Y41P = 0x8000, -+ AV_CODEC_ID_AVRP, -+ AV_CODEC_ID_012V, -+ AV_CODEC_ID_AVUI, -+ AV_CODEC_ID_AYUV, -+ AV_CODEC_ID_TARGA_Y216, -+ AV_CODEC_ID_V308, -+ AV_CODEC_ID_V408, -+ AV_CODEC_ID_YUV4, -+ AV_CODEC_ID_AVRN, -+ AV_CODEC_ID_CPIA, -+ AV_CODEC_ID_XFACE, -+ AV_CODEC_ID_SNOW, -+ AV_CODEC_ID_SMVJPEG, -+ AV_CODEC_ID_APNG, -+ AV_CODEC_ID_DAALA, -+ AV_CODEC_ID_CFHD, -+ AV_CODEC_ID_TRUEMOTION2RT, -+ AV_CODEC_ID_M101, -+ AV_CODEC_ID_MAGICYUV, -+ AV_CODEC_ID_SHEERVIDEO, -+ AV_CODEC_ID_YLC, -+ AV_CODEC_ID_PSD, -+ AV_CODEC_ID_PIXLET, -+ AV_CODEC_ID_SPEEDHQ, -+ AV_CODEC_ID_FMVC, -+ AV_CODEC_ID_SCPR, -+ AV_CODEC_ID_CLEARVIDEO, -+ AV_CODEC_ID_XPM, -+ AV_CODEC_ID_AV1, -+ AV_CODEC_ID_BITPACKED, -+ AV_CODEC_ID_MSCC, -+ AV_CODEC_ID_SRGC, -+ AV_CODEC_ID_SVG, -+ AV_CODEC_ID_GDV, -+ AV_CODEC_ID_FITS, -+ -+ /* various PCM "codecs" */ -+ AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs -+ AV_CODEC_ID_PCM_S16LE = 0x10000, -+ AV_CODEC_ID_PCM_S16BE, -+ AV_CODEC_ID_PCM_U16LE, -+ AV_CODEC_ID_PCM_U16BE, -+ AV_CODEC_ID_PCM_S8, -+ AV_CODEC_ID_PCM_U8, -+ AV_CODEC_ID_PCM_MULAW, -+ AV_CODEC_ID_PCM_ALAW, -+ AV_CODEC_ID_PCM_S32LE, -+ AV_CODEC_ID_PCM_S32BE, -+ AV_CODEC_ID_PCM_U32LE, -+ AV_CODEC_ID_PCM_U32BE, -+ AV_CODEC_ID_PCM_S24LE, -+ AV_CODEC_ID_PCM_S24BE, -+ AV_CODEC_ID_PCM_U24LE, -+ AV_CODEC_ID_PCM_U24BE, -+ AV_CODEC_ID_PCM_S24DAUD, -+ AV_CODEC_ID_PCM_ZORK, -+ AV_CODEC_ID_PCM_S16LE_PLANAR, -+ AV_CODEC_ID_PCM_DVD, -+ AV_CODEC_ID_PCM_F32BE, -+ AV_CODEC_ID_PCM_F32LE, -+ AV_CODEC_ID_PCM_F64BE, -+ AV_CODEC_ID_PCM_F64LE, -+ AV_CODEC_ID_PCM_BLURAY, -+ AV_CODEC_ID_PCM_LXF, -+ AV_CODEC_ID_S302M, -+ AV_CODEC_ID_PCM_S8_PLANAR, -+ AV_CODEC_ID_PCM_S24LE_PLANAR, -+ AV_CODEC_ID_PCM_S32LE_PLANAR, -+ AV_CODEC_ID_PCM_S16BE_PLANAR, -+ -+ AV_CODEC_ID_PCM_S64LE = 0x10800, -+ AV_CODEC_ID_PCM_S64BE, -+ AV_CODEC_ID_PCM_F16LE, -+ AV_CODEC_ID_PCM_F24LE, -+ -+ /* various ADPCM codecs */ -+ AV_CODEC_ID_ADPCM_IMA_QT = 0x11000, -+ AV_CODEC_ID_ADPCM_IMA_WAV, -+ AV_CODEC_ID_ADPCM_IMA_DK3, -+ AV_CODEC_ID_ADPCM_IMA_DK4, -+ AV_CODEC_ID_ADPCM_IMA_WS, -+ AV_CODEC_ID_ADPCM_IMA_SMJPEG, -+ AV_CODEC_ID_ADPCM_MS, -+ AV_CODEC_ID_ADPCM_4XM, -+ AV_CODEC_ID_ADPCM_XA, -+ AV_CODEC_ID_ADPCM_ADX, -+ AV_CODEC_ID_ADPCM_EA, -+ AV_CODEC_ID_ADPCM_G726, -+ AV_CODEC_ID_ADPCM_CT, -+ AV_CODEC_ID_ADPCM_SWF, -+ AV_CODEC_ID_ADPCM_YAMAHA, -+ AV_CODEC_ID_ADPCM_SBPRO_4, -+ AV_CODEC_ID_ADPCM_SBPRO_3, -+ AV_CODEC_ID_ADPCM_SBPRO_2, -+ AV_CODEC_ID_ADPCM_THP, -+ AV_CODEC_ID_ADPCM_IMA_AMV, -+ AV_CODEC_ID_ADPCM_EA_R1, -+ AV_CODEC_ID_ADPCM_EA_R3, -+ AV_CODEC_ID_ADPCM_EA_R2, -+ AV_CODEC_ID_ADPCM_IMA_EA_SEAD, -+ AV_CODEC_ID_ADPCM_IMA_EA_EACS, -+ AV_CODEC_ID_ADPCM_EA_XAS, -+ AV_CODEC_ID_ADPCM_EA_MAXIS_XA, -+ AV_CODEC_ID_ADPCM_IMA_ISS, -+ AV_CODEC_ID_ADPCM_G722, -+ AV_CODEC_ID_ADPCM_IMA_APC, -+ AV_CODEC_ID_ADPCM_VIMA, -+ -+ AV_CODEC_ID_ADPCM_AFC = 0x11800, -+ AV_CODEC_ID_ADPCM_IMA_OKI, -+ AV_CODEC_ID_ADPCM_DTK, -+ AV_CODEC_ID_ADPCM_IMA_RAD, -+ AV_CODEC_ID_ADPCM_G726LE, -+ AV_CODEC_ID_ADPCM_THP_LE, -+ AV_CODEC_ID_ADPCM_PSX, -+ AV_CODEC_ID_ADPCM_AICA, -+ AV_CODEC_ID_ADPCM_IMA_DAT4, -+ AV_CODEC_ID_ADPCM_MTAF, -+ -+ /* AMR */ -+ AV_CODEC_ID_AMR_NB = 0x12000, -+ AV_CODEC_ID_AMR_WB, -+ -+ /* RealAudio codecs*/ -+ AV_CODEC_ID_RA_144 = 0x13000, -+ AV_CODEC_ID_RA_288, -+ -+ /* various DPCM codecs */ -+ AV_CODEC_ID_ROQ_DPCM = 0x14000, -+ AV_CODEC_ID_INTERPLAY_DPCM, -+ AV_CODEC_ID_XAN_DPCM, -+ AV_CODEC_ID_SOL_DPCM, -+ -+ AV_CODEC_ID_SDX2_DPCM = 0x14800, -+ AV_CODEC_ID_GREMLIN_DPCM, -+ -+ /* audio codecs */ -+ AV_CODEC_ID_MP2 = 0x15000, -+ AV_CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3 -+ AV_CODEC_ID_AAC, -+ AV_CODEC_ID_AC3, -+ AV_CODEC_ID_DTS, -+ AV_CODEC_ID_VORBIS, -+ AV_CODEC_ID_DVAUDIO, -+ AV_CODEC_ID_WMAV1, -+ AV_CODEC_ID_WMAV2, -+ AV_CODEC_ID_MACE3, -+ AV_CODEC_ID_MACE6, -+ AV_CODEC_ID_VMDAUDIO, -+ AV_CODEC_ID_FLAC, -+ AV_CODEC_ID_MP3ADU, -+ AV_CODEC_ID_MP3ON4, -+ AV_CODEC_ID_SHORTEN, -+ AV_CODEC_ID_ALAC, -+ AV_CODEC_ID_WESTWOOD_SND1, -+ AV_CODEC_ID_GSM, ///< as in Berlin toast format -+ AV_CODEC_ID_QDM2, -+ AV_CODEC_ID_COOK, -+ AV_CODEC_ID_TRUESPEECH, -+ AV_CODEC_ID_TTA, -+ AV_CODEC_ID_SMACKAUDIO, -+ AV_CODEC_ID_QCELP, -+ AV_CODEC_ID_WAVPACK, -+ AV_CODEC_ID_DSICINAUDIO, -+ AV_CODEC_ID_IMC, -+ AV_CODEC_ID_MUSEPACK7, -+ AV_CODEC_ID_MLP, -+ AV_CODEC_ID_GSM_MS, /* as found in WAV */ -+ AV_CODEC_ID_ATRAC3, -+ AV_CODEC_ID_APE, -+ AV_CODEC_ID_NELLYMOSER, -+ AV_CODEC_ID_MUSEPACK8, -+ AV_CODEC_ID_SPEEX, -+ AV_CODEC_ID_WMAVOICE, -+ AV_CODEC_ID_WMAPRO, -+ AV_CODEC_ID_WMALOSSLESS, -+ AV_CODEC_ID_ATRAC3P, -+ AV_CODEC_ID_EAC3, -+ AV_CODEC_ID_SIPR, -+ AV_CODEC_ID_MP1, -+ AV_CODEC_ID_TWINVQ, -+ AV_CODEC_ID_TRUEHD, -+ AV_CODEC_ID_MP4ALS, -+ AV_CODEC_ID_ATRAC1, -+ AV_CODEC_ID_BINKAUDIO_RDFT, -+ AV_CODEC_ID_BINKAUDIO_DCT, -+ AV_CODEC_ID_AAC_LATM, -+ AV_CODEC_ID_QDMC, -+ AV_CODEC_ID_CELT, -+ AV_CODEC_ID_G723_1, -+ AV_CODEC_ID_G729, -+ AV_CODEC_ID_8SVX_EXP, -+ AV_CODEC_ID_8SVX_FIB, -+ AV_CODEC_ID_BMV_AUDIO, -+ AV_CODEC_ID_RALF, -+ AV_CODEC_ID_IAC, -+ AV_CODEC_ID_ILBC, -+ AV_CODEC_ID_OPUS, -+ AV_CODEC_ID_COMFORT_NOISE, -+ AV_CODEC_ID_TAK, -+ AV_CODEC_ID_METASOUND, -+ AV_CODEC_ID_PAF_AUDIO, -+ AV_CODEC_ID_ON2AVC, -+ AV_CODEC_ID_DSS_SP, -+ AV_CODEC_ID_CODEC2, -+ -+ AV_CODEC_ID_FFWAVESYNTH = 0x15800, -+ AV_CODEC_ID_SONIC, -+ AV_CODEC_ID_SONIC_LS, -+ AV_CODEC_ID_EVRC, -+ AV_CODEC_ID_SMV, -+ AV_CODEC_ID_DSD_LSBF, -+ AV_CODEC_ID_DSD_MSBF, -+ AV_CODEC_ID_DSD_LSBF_PLANAR, -+ AV_CODEC_ID_DSD_MSBF_PLANAR, -+ AV_CODEC_ID_4GV, -+ AV_CODEC_ID_INTERPLAY_ACM, -+ AV_CODEC_ID_XMA1, -+ AV_CODEC_ID_XMA2, -+ AV_CODEC_ID_DST, -+ AV_CODEC_ID_ATRAC3AL, -+ AV_CODEC_ID_ATRAC3PAL, -+ AV_CODEC_ID_DOLBY_E, -+ AV_CODEC_ID_APTX, -+ AV_CODEC_ID_APTX_HD, -+ AV_CODEC_ID_SBC, -+ -+ /* subtitle codecs */ -+ AV_CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs. -+ AV_CODEC_ID_DVD_SUBTITLE = 0x17000, -+ AV_CODEC_ID_DVB_SUBTITLE, -+ AV_CODEC_ID_TEXT, ///< raw UTF-8 text -+ AV_CODEC_ID_XSUB, -+ AV_CODEC_ID_SSA, -+ AV_CODEC_ID_MOV_TEXT, -+ AV_CODEC_ID_HDMV_PGS_SUBTITLE, -+ AV_CODEC_ID_DVB_TELETEXT, -+ AV_CODEC_ID_SRT, -+ -+ AV_CODEC_ID_MICRODVD = 0x17800, -+ AV_CODEC_ID_EIA_608, -+ AV_CODEC_ID_JACOSUB, -+ AV_CODEC_ID_SAMI, -+ AV_CODEC_ID_REALTEXT, -+ AV_CODEC_ID_STL, -+ AV_CODEC_ID_SUBVIEWER1, -+ AV_CODEC_ID_SUBVIEWER, -+ AV_CODEC_ID_SUBRIP, -+ AV_CODEC_ID_WEBVTT, -+ AV_CODEC_ID_MPL2, -+ AV_CODEC_ID_VPLAYER, -+ AV_CODEC_ID_PJS, -+ AV_CODEC_ID_ASS, -+ AV_CODEC_ID_HDMV_TEXT_SUBTITLE, -+ -+ /* other specific kind of codecs (generally used for attachments) */ -+ AV_CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs. -+ AV_CODEC_ID_TTF = 0x18000, -+ -+ AV_CODEC_ID_SCTE_35, ///< Contain timestamp estimated through PCR of program stream. -+ AV_CODEC_ID_BINTEXT = 0x18800, -+ AV_CODEC_ID_XBIN, -+ AV_CODEC_ID_IDF, -+ AV_CODEC_ID_OTF, -+ AV_CODEC_ID_SMPTE_KLV, -+ AV_CODEC_ID_DVD_NAV, -+ AV_CODEC_ID_TIMED_ID3, -+ AV_CODEC_ID_BIN_DATA, -+ -+ -+ AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it -+ -+ AV_CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS -+ * stream (only used by libavformat) */ -+ AV_CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems -+ * stream (only used by libavformat) */ -+ AV_CODEC_ID_FFMETADATA = 0x21000, ///< Dummy codec for streams containing only metadata information. -+ AV_CODEC_ID_WRAPPED_AVFRAME = 0x21001, ///< Passthrough codec, AVFrames wrapped in AVPacket -+}; -+ -+/** -+ * This struct describes the properties of a single codec described by an -+ * AVCodecID. -+ * @see avcodec_descriptor_get() -+ */ -+typedef struct AVCodecDescriptor { -+ enum AVCodecID id; -+ enum AVMediaType type; -+ /** -+ * Name of the codec described by this descriptor. It is non-empty and -+ * unique for each codec descriptor. It should contain alphanumeric -+ * characters and '_' only. -+ */ -+ const char *name; -+ /** -+ * A more descriptive name for this codec. May be NULL. -+ */ -+ const char *long_name; -+ /** -+ * Codec properties, a combination of AV_CODEC_PROP_* flags. -+ */ -+ int props; -+ /** -+ * MIME type(s) associated with the codec. -+ * May be NULL; if not, a NULL-terminated array of MIME types. -+ * The first item is always non-NULL and is the preferred MIME type. -+ */ -+ const char *const *mime_types; -+ /** -+ * If non-NULL, an array of profiles recognized for this codec. -+ * Terminated with FF_PROFILE_UNKNOWN. -+ */ -+ const struct AVProfile *profiles; -+} AVCodecDescriptor; -+ -+/** -+ * Codec uses only intra compression. -+ * Video and audio codecs only. -+ */ -+#define AV_CODEC_PROP_INTRA_ONLY (1 << 0) -+/** -+ * Codec supports lossy compression. Audio and video codecs only. -+ * @note a codec may support both lossy and lossless -+ * compression modes -+ */ -+#define AV_CODEC_PROP_LOSSY (1 << 1) -+/** -+ * Codec supports lossless compression. Audio and video codecs only. -+ */ -+#define AV_CODEC_PROP_LOSSLESS (1 << 2) -+/** -+ * Codec supports frame reordering. That is, the coded order (the order in which -+ * the encoded packets are output by the encoders / stored / input to the -+ * decoders) may be different from the presentation order of the corresponding -+ * frames. -+ * -+ * For codecs that do not have this property set, PTS and DTS should always be -+ * equal. -+ */ -+#define AV_CODEC_PROP_REORDER (1 << 3) -+/** -+ * Subtitle codec is bitmap based -+ * Decoded AVSubtitle data can be read from the AVSubtitleRect->pict field. -+ */ -+#define AV_CODEC_PROP_BITMAP_SUB (1 << 16) -+/** -+ * Subtitle codec is text based. -+ * Decoded AVSubtitle data can be read from the AVSubtitleRect->ass field. -+ */ -+#define AV_CODEC_PROP_TEXT_SUB (1 << 17) -+ -+/** -+ * @ingroup lavc_decoding -+ * Required number of additionally allocated bytes at the end of the input bitstream for decoding. -+ * This is mainly needed because some optimized bitstream readers read -+ * 32 or 64 bit at once and could read over the end.
-+ * Note: If the first 23 bits of the additional bytes are not 0, then damaged -+ * MPEG bitstreams could cause overread and segfault. -+ */ -+#define AV_INPUT_BUFFER_PADDING_SIZE 64 -+ -+/** -+ * @ingroup lavc_encoding -+ * minimum encoding buffer size -+ * Used to avoid some checks during header writing. -+ */ -+#define AV_INPUT_BUFFER_MIN_SIZE 16384 -+ -+/** -+ * @ingroup lavc_decoding -+ */ -+enum AVDiscard{ -+ /* We leave some space between them for extensions (drop some -+ * keyframes for intra-only or drop just some bidir frames). */ -+ AVDISCARD_NONE =-16, ///< discard nothing -+ AVDISCARD_DEFAULT = 0, ///< discard useless packets like 0 size packets in avi -+ AVDISCARD_NONREF = 8, ///< discard all non reference -+ AVDISCARD_BIDIR = 16, ///< discard all bidirectional frames -+ AVDISCARD_NONINTRA= 24, ///< discard all non intra frames -+ AVDISCARD_NONKEY = 32, ///< discard all frames except keyframes -+ AVDISCARD_ALL = 48, ///< discard all -+}; -+ -+enum AVAudioServiceType { -+ AV_AUDIO_SERVICE_TYPE_MAIN = 0, -+ AV_AUDIO_SERVICE_TYPE_EFFECTS = 1, -+ AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED = 2, -+ AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED = 3, -+ AV_AUDIO_SERVICE_TYPE_DIALOGUE = 4, -+ AV_AUDIO_SERVICE_TYPE_COMMENTARY = 5, -+ AV_AUDIO_SERVICE_TYPE_EMERGENCY = 6, -+ AV_AUDIO_SERVICE_TYPE_VOICE_OVER = 7, -+ AV_AUDIO_SERVICE_TYPE_KARAOKE = 8, -+ AV_AUDIO_SERVICE_TYPE_NB , ///< Not part of ABI -+}; -+ -+/** -+ * @ingroup lavc_encoding -+ */ -+typedef struct RcOverride{ -+ int start_frame; -+ int end_frame; -+ int qscale; // If this is 0 then quality_factor will be used instead. -+ float quality_factor; -+} RcOverride; -+ -+/* encoding support -+ These flags can be passed in AVCodecContext.flags before initialization. -+ Note: Not everything is supported yet. -+*/ -+ -+/** -+ * Allow decoders to produce frames with data planes that are not aligned -+ * to CPU requirements (e.g. due to cropping). -+ */ -+#define AV_CODEC_FLAG_UNALIGNED (1 << 0) -+/** -+ * Use fixed qscale. -+ */ -+#define AV_CODEC_FLAG_QSCALE (1 << 1) -+/** -+ * 4 MV per MB allowed / advanced prediction for H.263. -+ */ -+#define AV_CODEC_FLAG_4MV (1 << 2) -+/** -+ * Output even those frames that might be corrupted. -+ */ -+#define AV_CODEC_FLAG_OUTPUT_CORRUPT (1 << 3) -+/** -+ * Use qpel MC. -+ */ -+#define AV_CODEC_FLAG_QPEL (1 << 4) -+/** -+ * Use internal 2pass ratecontrol in first pass mode. -+ */ -+#define AV_CODEC_FLAG_PASS1 (1 << 9) -+/** -+ * Use internal 2pass ratecontrol in second pass mode. -+ */ -+#define AV_CODEC_FLAG_PASS2 (1 << 10) -+/** -+ * loop filter. -+ */ -+#define AV_CODEC_FLAG_LOOP_FILTER (1 << 11) -+/** -+ * Only decode/encode grayscale. -+ */ -+#define AV_CODEC_FLAG_GRAY (1 << 13) -+/** -+ * error[?] variables will be set during encoding. -+ */ -+#define AV_CODEC_FLAG_PSNR (1 << 15) -+/** -+ * Input bitstream might be truncated at a random location -+ * instead of only at frame boundaries. -+ */ -+#define AV_CODEC_FLAG_TRUNCATED (1 << 16) -+/** -+ * Use interlaced DCT. -+ */ -+#define AV_CODEC_FLAG_INTERLACED_DCT (1 << 18) -+/** -+ * Force low delay. -+ */ -+#define AV_CODEC_FLAG_LOW_DELAY (1 << 19) -+/** -+ * Place global headers in extradata instead of every keyframe. -+ */ -+#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22) -+/** -+ * Use only bitexact stuff (except (I)DCT). -+ */ -+#define AV_CODEC_FLAG_BITEXACT (1 << 23) -+/* Fx : Flag for H.263+ extra options */ -+/** -+ * H.263 advanced intra coding / MPEG-4 AC prediction -+ */ -+#define AV_CODEC_FLAG_AC_PRED (1 << 24) -+/** -+ * interlaced motion estimation -+ */ -+#define AV_CODEC_FLAG_INTERLACED_ME (1 << 29) -+#define AV_CODEC_FLAG_CLOSED_GOP (1U << 31) -+ -+/** -+ * Allow non spec compliant speedup tricks. -+ */ -+#define AV_CODEC_FLAG2_FAST (1 << 0) -+/** -+ * Skip bitstream encoding. -+ */ -+#define AV_CODEC_FLAG2_NO_OUTPUT (1 << 2) -+/** -+ * Place global headers at every keyframe instead of in extradata. -+ */ -+#define AV_CODEC_FLAG2_LOCAL_HEADER (1 << 3) -+ -+/** -+ * timecode is in drop frame format. DEPRECATED!!!! -+ */ -+#define AV_CODEC_FLAG2_DROP_FRAME_TIMECODE (1 << 13) -+ -+/** -+ * Input bitstream might be truncated at a packet boundaries -+ * instead of only at frame boundaries. -+ */ -+#define AV_CODEC_FLAG2_CHUNKS (1 << 15) -+/** -+ * Discard cropping information from SPS. -+ */ -+#define AV_CODEC_FLAG2_IGNORE_CROP (1 << 16) -+ -+/** -+ * Show all frames before the first keyframe -+ */ -+#define AV_CODEC_FLAG2_SHOW_ALL (1 << 22) -+/** -+ * Export motion vectors through frame side data -+ */ -+#define AV_CODEC_FLAG2_EXPORT_MVS (1 << 28) -+/** -+ * Do not skip samples and export skip information as frame side data -+ */ -+#define AV_CODEC_FLAG2_SKIP_MANUAL (1 << 29) -+/** -+ * Do not reset ASS ReadOrder field on flush (subtitles decoding) -+ */ -+#define AV_CODEC_FLAG2_RO_FLUSH_NOOP (1 << 30) -+ -+/* Unsupported options : -+ * Syntax Arithmetic coding (SAC) -+ * Reference Picture Selection -+ * Independent Segment Decoding */ -+/* /Fx */ -+/* codec capabilities */ -+ -+/** -+ * Decoder can use draw_horiz_band callback. -+ */ -+#define AV_CODEC_CAP_DRAW_HORIZ_BAND (1 << 0) -+/** -+ * Codec uses get_buffer() for allocating buffers and supports custom allocators. -+ * If not set, it might not use get_buffer() at all or use operations that -+ * assume the buffer was allocated by avcodec_default_get_buffer. -+ */ -+#define AV_CODEC_CAP_DR1 (1 << 1) -+#define AV_CODEC_CAP_TRUNCATED (1 << 3) -+/** -+ * Encoder or decoder requires flushing with NULL input at the end in order to -+ * give the complete and correct output. -+ * -+ * NOTE: If this flag is not set, the codec is guaranteed to never be fed with -+ * with NULL data. The user can still send NULL data to the public encode -+ * or decode function, but libavcodec will not pass it along to the codec -+ * unless this flag is set. -+ * -+ * Decoders: -+ * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL, -+ * avpkt->size=0 at the end to get the delayed data until the decoder no longer -+ * returns frames. -+ * -+ * Encoders: -+ * The encoder needs to be fed with NULL data at the end of encoding until the -+ * encoder no longer returns data. -+ * -+ * NOTE: For encoders implementing the AVCodec.encode2() function, setting this -+ * flag also means that the encoder must set the pts and duration for -+ * each output packet. If this flag is not set, the pts and duration will -+ * be determined by libavcodec from the input frame. -+ */ -+#define AV_CODEC_CAP_DELAY (1 << 5) -+/** -+ * Codec can be fed a final frame with a smaller size. -+ * This can be used to prevent truncation of the last audio samples. -+ */ -+#define AV_CODEC_CAP_SMALL_LAST_FRAME (1 << 6) -+ -+/** -+ * Codec can output multiple frames per AVPacket -+ * Normally demuxers return one frame at a time, demuxers which do not do -+ * are connected to a parser to split what they return into proper frames. -+ * This flag is reserved to the very rare category of codecs which have a -+ * bitstream that cannot be split into frames without timeconsuming -+ * operations like full decoding. Demuxers carrying such bitstreams thus -+ * may return multiple frames in a packet. This has many disadvantages like -+ * prohibiting stream copy in many cases thus it should only be considered -+ * as a last resort. -+ */ -+#define AV_CODEC_CAP_SUBFRAMES (1 << 8) -+/** -+ * Codec is experimental and is thus avoided in favor of non experimental -+ * encoders -+ */ -+#define AV_CODEC_CAP_EXPERIMENTAL (1 << 9) -+/** -+ * Codec should fill in channel configuration and samplerate instead of container -+ */ -+#define AV_CODEC_CAP_CHANNEL_CONF (1 << 10) -+/** -+ * Codec supports frame-level multithreading. -+ */ -+#define AV_CODEC_CAP_FRAME_THREADS (1 << 12) -+/** -+ * Codec supports slice-based (or partition-based) multithreading. -+ */ -+#define AV_CODEC_CAP_SLICE_THREADS (1 << 13) -+/** -+ * Codec supports changed parameters at any point. -+ */ -+#define AV_CODEC_CAP_PARAM_CHANGE (1 << 14) -+/** -+ * Codec supports avctx->thread_count == 0 (auto). -+ */ -+#define AV_CODEC_CAP_AUTO_THREADS (1 << 15) -+/** -+ * Audio encoder supports receiving a different number of samples in each call. -+ */ -+#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE (1 << 16) -+/** -+ * Decoder is not a preferred choice for probing. -+ * This indicates that the decoder is not a good choice for probing. -+ * It could for example be an expensive to spin up hardware decoder, -+ * or it could simply not provide a lot of useful information about -+ * the stream. -+ * A decoder marked with this flag should only be used as last resort -+ * choice for probing. -+ */ -+#define AV_CODEC_CAP_AVOID_PROBING (1 << 17) -+/** -+ * Codec is intra only. -+ */ -+#define AV_CODEC_CAP_INTRA_ONLY 0x40000000 -+/** -+ * Codec is lossless. -+ */ -+#define AV_CODEC_CAP_LOSSLESS 0x80000000 -+ -+/** -+ * Codec is backed by a hardware implementation. Typically used to -+ * identify a non-hwaccel hardware decoder. For information about hwaccels, use -+ * avcodec_get_hw_config() instead. -+ */ -+#define AV_CODEC_CAP_HARDWARE (1 << 18) -+ -+/** -+ * Codec is potentially backed by a hardware implementation, but not -+ * necessarily. This is used instead of AV_CODEC_CAP_HARDWARE, if the -+ * implementation provides some sort of internal fallback. -+ */ -+#define AV_CODEC_CAP_HYBRID (1 << 19) -+ -+/** -+ * Pan Scan area. -+ * This specifies the area which should be displayed. -+ * Note there may be multiple such areas for one frame. -+ */ -+typedef struct AVPanScan { -+ /** -+ * id -+ * - encoding: Set by user. -+ * - decoding: Set by libavcodec. -+ */ -+ int id; -+ -+ /** -+ * width and height in 1/16 pel -+ * - encoding: Set by user. -+ * - decoding: Set by libavcodec. -+ */ -+ int width; -+ int height; -+ -+ /** -+ * position of the top left corner in 1/16 pel for up to 3 fields/frames -+ * - encoding: Set by user. -+ * - decoding: Set by libavcodec. -+ */ -+ int16_t position[3][2]; -+} AVPanScan; -+ -+/** -+ * This structure describes the bitrate properties of an encoded bitstream. It -+ * roughly corresponds to a subset the VBV parameters for MPEG-2 or HRD -+ * parameters for H.264/HEVC. -+ */ -+typedef struct AVCPBProperties { -+ /** -+ * Maximum bitrate of the stream, in bits per second. -+ * Zero if unknown or unspecified. -+ */ -+ int max_bitrate; -+ /** -+ * Minimum bitrate of the stream, in bits per second. -+ * Zero if unknown or unspecified. -+ */ -+ int min_bitrate; -+ /** -+ * Average bitrate of the stream, in bits per second. -+ * Zero if unknown or unspecified. -+ */ -+ int avg_bitrate; -+ -+ /** -+ * The size of the buffer to which the ratecontrol is applied, in bits. -+ * Zero if unknown or unspecified. -+ */ -+ int buffer_size; -+ -+ /** -+ * The delay between the time the packet this structure is associated with -+ * is received and the time when it should be decoded, in periods of a 27MHz -+ * clock. -+ * -+ * UINT64_MAX when unknown or unspecified. -+ */ -+ uint64_t vbv_delay; -+} AVCPBProperties; -+ -+/** -+ * The decoder will keep a reference to the frame and may reuse it later. -+ */ -+#define AV_GET_BUFFER_FLAG_REF (1 << 0) -+ -+/** -+ * @defgroup lavc_packet AVPacket -+ * -+ * Types and functions for working with AVPacket. -+ * @{ -+ */ -+enum AVPacketSideDataType { -+ /** -+ * An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE -+ * bytes worth of palette. This side data signals that a new palette is -+ * present. -+ */ -+ AV_PKT_DATA_PALETTE, -+ -+ /** -+ * The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format -+ * that the extradata buffer was changed and the receiving side should -+ * act upon it appropriately. The new extradata is embedded in the side -+ * data buffer and should be immediately used for processing the current -+ * frame or packet. -+ */ -+ AV_PKT_DATA_NEW_EXTRADATA, -+ -+ /** -+ * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows: -+ * @code -+ * u32le param_flags -+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT) -+ * s32le channel_count -+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT) -+ * u64le channel_layout -+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE) -+ * s32le sample_rate -+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS) -+ * s32le width -+ * s32le height -+ * @endcode -+ */ -+ AV_PKT_DATA_PARAM_CHANGE, -+ -+ /** -+ * An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of -+ * structures with info about macroblocks relevant to splitting the -+ * packet into smaller packets on macroblock edges (e.g. as for RFC 2190). -+ * That is, it does not necessarily contain info about all macroblocks, -+ * as long as the distance between macroblocks in the info is smaller -+ * than the target payload size. -+ * Each MB info structure is 12 bytes, and is laid out as follows: -+ * @code -+ * u32le bit offset from the start of the packet -+ * u8 current quantizer at the start of the macroblock -+ * u8 GOB number -+ * u16le macroblock address within the GOB -+ * u8 horizontal MV predictor -+ * u8 vertical MV predictor -+ * u8 horizontal MV predictor for block number 3 -+ * u8 vertical MV predictor for block number 3 -+ * @endcode -+ */ -+ AV_PKT_DATA_H263_MB_INFO, -+ -+ /** -+ * This side data should be associated with an audio stream and contains -+ * ReplayGain information in form of the AVReplayGain struct. -+ */ -+ AV_PKT_DATA_REPLAYGAIN, -+ -+ /** -+ * This side data contains a 3x3 transformation matrix describing an affine -+ * transformation that needs to be applied to the decoded video frames for -+ * correct presentation. -+ * -+ * See libavutil/display.h for a detailed description of the data. -+ */ -+ AV_PKT_DATA_DISPLAYMATRIX, -+ -+ /** -+ * This side data should be associated with a video stream and contains -+ * Stereoscopic 3D information in form of the AVStereo3D struct. -+ */ -+ AV_PKT_DATA_STEREO3D, -+ -+ /** -+ * This side data should be associated with an audio stream and corresponds -+ * to enum AVAudioServiceType. -+ */ -+ AV_PKT_DATA_AUDIO_SERVICE_TYPE, -+ -+ /** -+ * This side data contains quality related information from the encoder. -+ * @code -+ * u32le quality factor of the compressed frame. Allowed range is between 1 (good) and FF_LAMBDA_MAX (bad). -+ * u8 picture type -+ * u8 error count -+ * u16 reserved -+ * u64le[error count] sum of squared differences between encoder in and output -+ * @endcode -+ */ -+ AV_PKT_DATA_QUALITY_STATS, -+ -+ /** -+ * This side data contains an integer value representing the stream index -+ * of a "fallback" track. A fallback track indicates an alternate -+ * track to use when the current track can not be decoded for some reason. -+ * e.g. no decoder available for codec. -+ */ -+ AV_PKT_DATA_FALLBACK_TRACK, -+ -+ /** -+ * This side data corresponds to the AVCPBProperties struct. -+ */ -+ AV_PKT_DATA_CPB_PROPERTIES, -+ -+ /** -+ * Recommmends skipping the specified number of samples -+ * @code -+ * u32le number of samples to skip from start of this packet -+ * u32le number of samples to skip from end of this packet -+ * u8 reason for start skip -+ * u8 reason for end skip (0=padding silence, 1=convergence) -+ * @endcode -+ */ -+ AV_PKT_DATA_SKIP_SAMPLES, -+ -+ /** -+ * An AV_PKT_DATA_JP_DUALMONO side data packet indicates that -+ * the packet may contain "dual mono" audio specific to Japanese DTV -+ * and if it is true, recommends only the selected channel to be used. -+ * @code -+ * u8 selected channels (0=mail/left, 1=sub/right, 2=both) -+ * @endcode -+ */ -+ AV_PKT_DATA_JP_DUALMONO, -+ -+ /** -+ * A list of zero terminated key/value strings. There is no end marker for -+ * the list, so it is required to rely on the side data size to stop. -+ */ -+ AV_PKT_DATA_STRINGS_METADATA, -+ -+ /** -+ * Subtitle event position -+ * @code -+ * u32le x1 -+ * u32le y1 -+ * u32le x2 -+ * u32le y2 -+ * @endcode -+ */ -+ AV_PKT_DATA_SUBTITLE_POSITION, -+ -+ /** -+ * Data found in BlockAdditional element of matroska container. There is -+ * no end marker for the data, so it is required to rely on the side data -+ * size to recognize the end. 8 byte id (as found in BlockAddId) followed -+ * by data. -+ */ -+ AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, -+ -+ /** -+ * The optional first identifier line of a WebVTT cue. -+ */ -+ AV_PKT_DATA_WEBVTT_IDENTIFIER, -+ -+ /** -+ * The optional settings (rendering instructions) that immediately -+ * follow the timestamp specifier of a WebVTT cue. -+ */ -+ AV_PKT_DATA_WEBVTT_SETTINGS, -+ -+ /** -+ * A list of zero terminated key/value strings. There is no end marker for -+ * the list, so it is required to rely on the side data size to stop. This -+ * side data includes updated metadata which appeared in the stream. -+ */ -+ AV_PKT_DATA_METADATA_UPDATE, -+ -+ /** -+ * MPEGTS stream ID, this is required to pass the stream ID -+ * information from the demuxer to the corresponding muxer. -+ */ -+ AV_PKT_DATA_MPEGTS_STREAM_ID, -+ -+ /** -+ * Mastering display metadata (based on SMPTE-2086:2014). This metadata -+ * should be associated with a video stream and contains data in the form -+ * of the AVMasteringDisplayMetadata struct. -+ */ -+ AV_PKT_DATA_MASTERING_DISPLAY_METADATA, -+ -+ /** -+ * This side data should be associated with a video stream and corresponds -+ * to the AVSphericalMapping structure. -+ */ -+ AV_PKT_DATA_SPHERICAL, -+ -+ /** -+ * Content light level (based on CTA-861.3). This metadata should be -+ * associated with a video stream and contains data in the form of the -+ * AVContentLightMetadata struct. -+ */ -+ AV_PKT_DATA_CONTENT_LIGHT_LEVEL, -+ -+ /** -+ * ATSC A53 Part 4 Closed Captions. This metadata should be associated with -+ * a video stream. A53 CC bitstream is stored as uint8_t in AVPacketSideData.data. -+ * The number of bytes of CC data is AVPacketSideData.size. -+ */ -+ AV_PKT_DATA_A53_CC, -+ -+ /** -+ * This side data is encryption initialization data. -+ * The format is not part of ABI, use av_encryption_init_info_* methods to -+ * access. -+ */ -+ AV_PKT_DATA_ENCRYPTION_INIT_INFO, -+ -+ /** -+ * This side data contains encryption info for how to decrypt the packet. -+ * The format is not part of ABI, use av_encryption_info_* methods to access. -+ */ -+ AV_PKT_DATA_ENCRYPTION_INFO, -+ -+ /** -+ * The number of side data types. -+ * This is not part of the public API/ABI in the sense that it may -+ * change when new side data types are added. -+ * This must stay the last enum value. -+ * If its value becomes huge, some code using it -+ * needs to be updated as it assumes it to be smaller than other limits. -+ */ -+ AV_PKT_DATA_NB -+}; -+ -+#define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED -+ -+typedef struct AVPacketSideData { -+ uint8_t *data; -+ int size; -+ enum AVPacketSideDataType type; -+} AVPacketSideData; -+ -+/** -+ * This structure stores compressed data. It is typically exported by demuxers -+ * and then passed as input to decoders, or received as output from encoders and -+ * then passed to muxers. -+ * -+ * For video, it should typically contain one compressed frame. For audio it may -+ * contain several compressed frames. Encoders are allowed to output empty -+ * packets, with no compressed data, containing only side data -+ * (e.g. to update some stream parameters at the end of encoding). -+ * -+ * AVPacket is one of the few structs in FFmpeg, whose size is a part of public -+ * ABI. Thus it may be allocated on stack and no new fields can be added to it -+ * without libavcodec and libavformat major bump. -+ * -+ * The semantics of data ownership depends on the buf field. -+ * If it is set, the packet data is dynamically allocated and is -+ * valid indefinitely until a call to av_packet_unref() reduces the -+ * reference count to 0. -+ * -+ * If the buf field is not set av_packet_ref() would make a copy instead -+ * of increasing the reference count. -+ * -+ * The side data is always allocated with av_malloc(), copied by -+ * av_packet_ref() and freed by av_packet_unref(). -+ * -+ * @see av_packet_ref -+ * @see av_packet_unref -+ */ -+typedef struct AVPacket { -+ /** -+ * A reference to the reference-counted buffer where the packet data is -+ * stored. -+ * May be NULL, then the packet data is not reference-counted. -+ */ -+ AVBufferRef *buf; -+ /** -+ * Presentation timestamp in AVStream->time_base units; the time at which -+ * the decompressed packet will be presented to the user. -+ * Can be AV_NOPTS_VALUE if it is not stored in the file. -+ * pts MUST be larger or equal to dts as presentation cannot happen before -+ * decompression, unless one wants to view hex dumps. Some formats misuse -+ * the terms dts and pts/cts to mean something different. Such timestamps -+ * must be converted to true pts/dts before they are stored in AVPacket. -+ */ -+ int64_t pts; -+ /** -+ * Decompression timestamp in AVStream->time_base units; the time at which -+ * the packet is decompressed. -+ * Can be AV_NOPTS_VALUE if it is not stored in the file. -+ */ -+ int64_t dts; -+ uint8_t *data; -+ int size; -+ int stream_index; -+ /** -+ * A combination of AV_PKT_FLAG values -+ */ -+ int flags; -+ /** -+ * Additional packet data that can be provided by the container. -+ * Packet can contain several types of side information. -+ */ -+ AVPacketSideData *side_data; -+ int side_data_elems; -+ -+ /** -+ * Duration of this packet in AVStream->time_base units, 0 if unknown. -+ * Equals next_pts - this_pts in presentation order. -+ */ -+ int64_t duration; -+ -+ int64_t pos; ///< byte position in stream, -1 if unknown -+ -+#if FF_API_CONVERGENCE_DURATION -+ /** -+ * @deprecated Same as the duration field, but as int64_t. This was required -+ * for Matroska subtitles, whose duration values could overflow when the -+ * duration field was still an int. -+ */ -+ attribute_deprecated -+ int64_t convergence_duration; -+#endif -+} AVPacket; -+#define AV_PKT_FLAG_KEY 0x0001 ///< The packet contains a keyframe -+#define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted -+/** -+ * Flag is used to discard packets which are required to maintain valid -+ * decoder state but are not required for output and should be dropped -+ * after decoding. -+ **/ -+#define AV_PKT_FLAG_DISCARD 0x0004 -+/** -+ * The packet comes from a trusted source. -+ * -+ * Otherwise-unsafe constructs such as arbitrary pointers to data -+ * outside the packet may be followed. -+ */ -+#define AV_PKT_FLAG_TRUSTED 0x0008 -+/** -+ * Flag is used to indicate packets that contain frames that can -+ * be discarded by the decoder. I.e. Non-reference frames. -+ */ -+#define AV_PKT_FLAG_DISPOSABLE 0x0010 -+ -+ -+enum AVSideDataParamChangeFlags { -+ AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT = 0x0001, -+ AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = 0x0002, -+ AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE = 0x0004, -+ AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS = 0x0008, -+}; -+/** -+ * @} -+ */ -+ -+struct AVCodecInternal; -+ -+enum AVFieldOrder { -+ AV_FIELD_UNKNOWN, -+ AV_FIELD_PROGRESSIVE, -+ AV_FIELD_TT, //< Top coded_first, top displayed first -+ AV_FIELD_BB, //< Bottom coded first, bottom displayed first -+ AV_FIELD_TB, //< Top coded first, bottom displayed first -+ AV_FIELD_BT, //< Bottom coded first, top displayed first -+}; -+ -+/** -+ * main external API structure. -+ * New fields can be added to the end with minor version bumps. -+ * Removal, reordering and changes to existing fields require a major -+ * version bump. -+ * You can use AVOptions (av_opt* / av_set/get*()) to access these fields from user -+ * applications. -+ * The name string for AVOptions options matches the associated command line -+ * parameter name and can be found in libavcodec/options_table.h -+ * The AVOption/command line parameter names differ in some cases from the C -+ * structure field names for historic reasons or brevity. -+ * sizeof(AVCodecContext) must not be used outside libav*. -+ */ -+typedef struct AVCodecContext { -+ /** -+ * information on struct for av_log -+ * - set by avcodec_alloc_context3 -+ */ -+ const AVClass *av_class; -+ int log_level_offset; -+ -+ enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */ -+ const struct AVCodec *codec; -+ enum AVCodecID codec_id; /* see AV_CODEC_ID_xxx */ -+ -+ /** -+ * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A'). -+ * This is used to work around some encoder bugs. -+ * A demuxer should set this to what is stored in the field used to identify the codec. -+ * If there are multiple such fields in a container then the demuxer should choose the one -+ * which maximizes the information about the used codec. -+ * If the codec tag field in a container is larger than 32 bits then the demuxer should -+ * remap the longer ID to 32 bits with a table or other structure. Alternatively a new -+ * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated -+ * first. -+ * - encoding: Set by user, if not then the default based on codec_id will be used. -+ * - decoding: Set by user, will be converted to uppercase by libavcodec during init. -+ */ -+ unsigned int codec_tag; -+ -+ void *priv_data; -+ -+ /** -+ * Private context used for internal data. -+ * -+ * Unlike priv_data, this is not codec-specific. It is used in general -+ * libavcodec functions. -+ */ -+ struct AVCodecInternal *internal; -+ -+ /** -+ * Private data of the user, can be used to carry app specific stuff. -+ * - encoding: Set by user. -+ * - decoding: Set by user. -+ */ -+ void *opaque; -+ -+ /** -+ * the average bitrate -+ * - encoding: Set by user; unused for constant quantizer encoding. -+ * - decoding: Set by user, may be overwritten by libavcodec -+ * if this info is available in the stream -+ */ -+ int64_t bit_rate; -+ -+ /** -+ * number of bits the bitstream is allowed to diverge from the reference. -+ * the reference can be CBR (for CBR pass1) or VBR (for pass2) -+ * - encoding: Set by user; unused for constant quantizer encoding. -+ * - decoding: unused -+ */ -+ int bit_rate_tolerance; -+ -+ /** -+ * Global quality for codecs which cannot change it per frame. -+ * This should be proportional to MPEG-1/2/4 qscale. -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int global_quality; -+ -+ /** -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int compression_level; -+#define FF_COMPRESSION_DEFAULT -1 -+ -+ /** -+ * AV_CODEC_FLAG_*. -+ * - encoding: Set by user. -+ * - decoding: Set by user. -+ */ -+ int flags; -+ -+ /** -+ * AV_CODEC_FLAG2_* -+ * - encoding: Set by user. -+ * - decoding: Set by user. -+ */ -+ int flags2; -+ -+ /** -+ * some codecs need / can use extradata like Huffman tables. -+ * MJPEG: Huffman tables -+ * rv10: additional flags -+ * MPEG-4: global headers (they can be in the bitstream or here) -+ * The allocated memory should be AV_INPUT_BUFFER_PADDING_SIZE bytes larger -+ * than extradata_size to avoid problems if it is read with the bitstream reader. -+ * The bytewise contents of extradata must not depend on the architecture or CPU endianness. -+ * - encoding: Set/allocated/freed by libavcodec. -+ * - decoding: Set/allocated/freed by user. -+ */ -+ uint8_t *extradata; -+ int extradata_size; -+ -+ /** -+ * This is the fundamental unit of time (in seconds) in terms -+ * of which frame timestamps are represented. For fixed-fps content, -+ * timebase should be 1/framerate and timestamp increments should be -+ * identically 1. -+ * This often, but not always is the inverse of the frame rate or field rate -+ * for video. 1/time_base is not the average frame rate if the frame rate is not -+ * constant. -+ * -+ * Like containers, elementary streams also can store timestamps, 1/time_base -+ * is the unit in which these timestamps are specified. -+ * As example of such codec time base see ISO/IEC 14496-2:2001(E) -+ * vop_time_increment_resolution and fixed_vop_rate -+ * (fixed_vop_rate == 0 implies that it is different from the framerate) -+ * -+ * - encoding: MUST be set by user. -+ * - decoding: the use of this field for decoding is deprecated. -+ * Use framerate instead. -+ */ -+ AVRational time_base; -+ -+ /** -+ * For some codecs, the time base is closer to the field rate than the frame rate. -+ * Most notably, H.264 and MPEG-2 specify time_base as half of frame duration -+ * if no telecine is used ... -+ * -+ * Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it to 2. -+ */ -+ int ticks_per_frame; -+ -+ /** -+ * Codec delay. -+ * -+ * Encoding: Number of frames delay there will be from the encoder input to -+ * the decoder output. (we assume the decoder matches the spec) -+ * Decoding: Number of frames delay in addition to what a standard decoder -+ * as specified in the spec would produce. -+ * -+ * Video: -+ * Number of frames the decoded output will be delayed relative to the -+ * encoded input. -+ * -+ * Audio: -+ * For encoding, this field is unused (see initial_padding). -+ * -+ * For decoding, this is the number of samples the decoder needs to -+ * output before the decoder's output is valid. When seeking, you should -+ * start decoding this many samples prior to your desired seek point. -+ * -+ * - encoding: Set by libavcodec. -+ * - decoding: Set by libavcodec. -+ */ -+ int delay; -+ -+ -+ /* video only */ -+ /** -+ * picture width / height. -+ * -+ * @note Those fields may not match the values of the last -+ * AVFrame output by avcodec_decode_video2 due frame -+ * reordering. -+ * -+ * - encoding: MUST be set by user. -+ * - decoding: May be set by the user before opening the decoder if known e.g. -+ * from the container. Some decoders will require the dimensions -+ * to be set by the caller. During decoding, the decoder may -+ * overwrite those values as required while parsing the data. -+ */ -+ int width, height; -+ -+ /** -+ * Bitstream width / height, may be different from width/height e.g. when -+ * the decoded frame is cropped before being output or lowres is enabled. -+ * -+ * @note Those field may not match the value of the last -+ * AVFrame output by avcodec_receive_frame() due frame -+ * reordering. -+ * -+ * - encoding: unused -+ * - decoding: May be set by the user before opening the decoder if known -+ * e.g. from the container. During decoding, the decoder may -+ * overwrite those values as required while parsing the data. -+ */ -+ int coded_width, coded_height; -+ -+ /** -+ * the number of pictures in a group of pictures, or 0 for intra_only -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int gop_size; -+ -+ /** -+ * Pixel format, see AV_PIX_FMT_xxx. -+ * May be set by the demuxer if known from headers. -+ * May be overridden by the decoder if it knows better. -+ * -+ * @note This field may not match the value of the last -+ * AVFrame output by avcodec_receive_frame() due frame -+ * reordering. -+ * -+ * - encoding: Set by user. -+ * - decoding: Set by user if known, overridden by libavcodec while -+ * parsing the data. -+ */ -+ enum AVPixelFormat pix_fmt; -+ -+ /** -+ * If non NULL, 'draw_horiz_band' is called by the libavcodec -+ * decoder to draw a horizontal band. It improves cache usage. Not -+ * all codecs can do that. You must check the codec capabilities -+ * beforehand. -+ * When multithreading is used, it may be called from multiple threads -+ * at the same time; threads might draw different parts of the same AVFrame, -+ * or multiple AVFrames, and there is no guarantee that slices will be drawn -+ * in order. -+ * The function is also used by hardware acceleration APIs. -+ * It is called at least once during frame decoding to pass -+ * the data needed for hardware render. -+ * In that mode instead of pixel data, AVFrame points to -+ * a structure specific to the acceleration API. The application -+ * reads the structure and can change some fields to indicate progress -+ * or mark state. -+ * - encoding: unused -+ * - decoding: Set by user. -+ * @param height the height of the slice -+ * @param y the y position of the slice -+ * @param type 1->top field, 2->bottom field, 3->frame -+ * @param offset offset into the AVFrame.data from which the slice should be read -+ */ -+ void (*draw_horiz_band)(struct AVCodecContext *s, -+ const AVFrame *src, int offset[AV_NUM_DATA_POINTERS], -+ int y, int type, int height); -+ -+ /** -+ * callback to negotiate the pixelFormat -+ * @param fmt is the list of formats which are supported by the codec, -+ * it is terminated by -1 as 0 is a valid format, the formats are ordered by quality. -+ * The first is always the native one. -+ * @note The callback may be called again immediately if initialization for -+ * the selected (hardware-accelerated) pixel format failed. -+ * @warning Behavior is undefined if the callback returns a value not -+ * in the fmt list of formats. -+ * @return the chosen format -+ * - encoding: unused -+ * - decoding: Set by user, if not set the native format will be chosen. -+ */ -+ enum AVPixelFormat (*get_format)(struct AVCodecContext *s, const enum AVPixelFormat * fmt); -+ -+ /** -+ * maximum number of B-frames between non-B-frames -+ * Note: The output will be delayed by max_b_frames+1 relative to the input. -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int max_b_frames; -+ -+ /** -+ * qscale factor between IP and B-frames -+ * If > 0 then the last P-frame quantizer will be used (q= lastp_q*factor+offset). -+ * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset). -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ float b_quant_factor; -+ -+#if FF_API_PRIVATE_OPT -+ /** @deprecated use encoder private options instead */ -+ attribute_deprecated -+ int b_frame_strategy; -+#endif -+ -+ /** -+ * qscale offset between IP and B-frames -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ float b_quant_offset; -+ -+ /** -+ * Size of the frame reordering buffer in the decoder. -+ * For MPEG-2 it is 1 IPB or 0 low delay IP. -+ * - encoding: Set by libavcodec. -+ * - decoding: Set by libavcodec. -+ */ -+ int has_b_frames; -+ -+#if FF_API_PRIVATE_OPT -+ /** @deprecated use encoder private options instead */ -+ attribute_deprecated -+ int mpeg_quant; -+#endif -+ -+ /** -+ * qscale factor between P- and I-frames -+ * If > 0 then the last P-frame quantizer will be used (q = lastp_q * factor + offset). -+ * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset). -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ float i_quant_factor; -+ -+ /** -+ * qscale offset between P and I-frames -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ float i_quant_offset; -+ -+ /** -+ * luminance masking (0-> disabled) -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ float lumi_masking; -+ -+ /** -+ * temporary complexity masking (0-> disabled) -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ float temporal_cplx_masking; -+ -+ /** -+ * spatial complexity masking (0-> disabled) -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ float spatial_cplx_masking; -+ -+ /** -+ * p block masking (0-> disabled) -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ float p_masking; -+ -+ /** -+ * darkness masking (0-> disabled) -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ float dark_masking; -+ -+ /** -+ * slice count -+ * - encoding: Set by libavcodec. -+ * - decoding: Set by user (or 0). -+ */ -+ int slice_count; -+ -+#if FF_API_PRIVATE_OPT -+ /** @deprecated use encoder private options instead */ -+ attribute_deprecated -+ int prediction_method; -+#define FF_PRED_LEFT 0 -+#define FF_PRED_PLANE 1 -+#define FF_PRED_MEDIAN 2 -+#endif -+ -+ /** -+ * slice offsets in the frame in bytes -+ * - encoding: Set/allocated by libavcodec. -+ * - decoding: Set/allocated by user (or NULL). -+ */ -+ int *slice_offset; -+ -+ /** -+ * sample aspect ratio (0 if unknown) -+ * That is the width of a pixel divided by the height of the pixel. -+ * Numerator and denominator must be relatively prime and smaller than 256 for some video standards. -+ * - encoding: Set by user. -+ * - decoding: Set by libavcodec. -+ */ -+ AVRational sample_aspect_ratio; -+ -+ /** -+ * motion estimation comparison function -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int me_cmp; -+ /** -+ * subpixel motion estimation comparison function -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int me_sub_cmp; -+ /** -+ * macroblock comparison function (not supported yet) -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int mb_cmp; -+ /** -+ * interlaced DCT comparison function -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int ildct_cmp; -+#define FF_CMP_SAD 0 -+#define FF_CMP_SSE 1 -+#define FF_CMP_SATD 2 -+#define FF_CMP_DCT 3 -+#define FF_CMP_PSNR 4 -+#define FF_CMP_BIT 5 -+#define FF_CMP_RD 6 -+#define FF_CMP_ZERO 7 -+#define FF_CMP_VSAD 8 -+#define FF_CMP_VSSE 9 -+#define FF_CMP_NSSE 10 -+#define FF_CMP_W53 11 -+#define FF_CMP_W97 12 -+#define FF_CMP_DCTMAX 13 -+#define FF_CMP_DCT264 14 -+#define FF_CMP_MEDIAN_SAD 15 -+#define FF_CMP_CHROMA 256 -+ -+ /** -+ * ME diamond size & shape -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int dia_size; -+ -+ /** -+ * amount of previous MV predictors (2a+1 x 2a+1 square) -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int last_predictor_count; -+ -+#if FF_API_PRIVATE_OPT -+ /** @deprecated use encoder private options instead */ -+ attribute_deprecated -+ int pre_me; -+#endif -+ -+ /** -+ * motion estimation prepass comparison function -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int me_pre_cmp; -+ -+ /** -+ * ME prepass diamond size & shape -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int pre_dia_size; -+ -+ /** -+ * subpel ME quality -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int me_subpel_quality; -+ -+ /** -+ * maximum motion estimation search range in subpel units -+ * If 0 then no limit. -+ * -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int me_range; -+ -+ /** -+ * slice flags -+ * - encoding: unused -+ * - decoding: Set by user. -+ */ -+ int slice_flags; -+#define SLICE_FLAG_CODED_ORDER 0x0001 ///< draw_horiz_band() is called in coded order instead of display -+#define SLICE_FLAG_ALLOW_FIELD 0x0002 ///< allow draw_horiz_band() with field slices (MPEG-2 field pics) -+#define SLICE_FLAG_ALLOW_PLANE 0x0004 ///< allow draw_horiz_band() with 1 component at a time (SVQ1) -+ -+ /** -+ * macroblock decision mode -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int mb_decision; -+#define FF_MB_DECISION_SIMPLE 0 ///< uses mb_cmp -+#define FF_MB_DECISION_BITS 1 ///< chooses the one which needs the fewest bits -+#define FF_MB_DECISION_RD 2 ///< rate distortion -+ -+ /** -+ * custom intra quantization matrix -+ * - encoding: Set by user, can be NULL. -+ * - decoding: Set by libavcodec. -+ */ -+ uint16_t *intra_matrix; -+ -+ /** -+ * custom inter quantization matrix -+ * - encoding: Set by user, can be NULL. -+ * - decoding: Set by libavcodec. -+ */ -+ uint16_t *inter_matrix; -+ -+#if FF_API_PRIVATE_OPT -+ /** @deprecated use encoder private options instead */ -+ attribute_deprecated -+ int scenechange_threshold; -+ -+ /** @deprecated use encoder private options instead */ -+ attribute_deprecated -+ int noise_reduction; -+#endif -+ -+ /** -+ * precision of the intra DC coefficient - 8 -+ * - encoding: Set by user. -+ * - decoding: Set by libavcodec -+ */ -+ int intra_dc_precision; -+ -+ /** -+ * Number of macroblock rows at the top which are skipped. -+ * - encoding: unused -+ * - decoding: Set by user. -+ */ -+ int skip_top; -+ -+ /** -+ * Number of macroblock rows at the bottom which are skipped. -+ * - encoding: unused -+ * - decoding: Set by user. -+ */ -+ int skip_bottom; -+ -+ /** -+ * minimum MB Lagrange multiplier -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int mb_lmin; -+ -+ /** -+ * maximum MB Lagrange multiplier -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int mb_lmax; -+ -+#if FF_API_PRIVATE_OPT -+ /** -+ * @deprecated use encoder private options instead -+ */ -+ attribute_deprecated -+ int me_penalty_compensation; -+#endif -+ -+ /** -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int bidir_refine; -+ -+#if FF_API_PRIVATE_OPT -+ /** @deprecated use encoder private options instead */ -+ attribute_deprecated -+ int brd_scale; -+#endif -+ -+ /** -+ * minimum GOP size -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int keyint_min; -+ -+ /** -+ * number of reference frames -+ * - encoding: Set by user. -+ * - decoding: Set by lavc. -+ */ -+ int refs; -+ -+#if FF_API_PRIVATE_OPT -+ /** @deprecated use encoder private options instead */ -+ attribute_deprecated -+ int chromaoffset; -+#endif -+ -+ /** -+ * Note: Value depends upon the compare function used for fullpel ME. -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int mv0_threshold; -+ -+#if FF_API_PRIVATE_OPT -+ /** @deprecated use encoder private options instead */ -+ attribute_deprecated -+ int b_sensitivity; -+#endif -+ -+ /** -+ * Chromaticity coordinates of the source primaries. -+ * - encoding: Set by user -+ * - decoding: Set by libavcodec -+ */ -+ enum AVColorPrimaries color_primaries; -+ -+ /** -+ * Color Transfer Characteristic. -+ * - encoding: Set by user -+ * - decoding: Set by libavcodec -+ */ -+ enum AVColorTransferCharacteristic color_trc; -+ -+ /** -+ * YUV colorspace type. -+ * - encoding: Set by user -+ * - decoding: Set by libavcodec -+ */ -+ enum AVColorSpace colorspace; -+ -+ /** -+ * MPEG vs JPEG YUV range. -+ * - encoding: Set by user -+ * - decoding: Set by libavcodec -+ */ -+ enum AVColorRange color_range; -+ -+ /** -+ * This defines the location of chroma samples. -+ * - encoding: Set by user -+ * - decoding: Set by libavcodec -+ */ -+ enum AVChromaLocation chroma_sample_location; -+ -+ /** -+ * Number of slices. -+ * Indicates number of picture subdivisions. Used for parallelized -+ * decoding. -+ * - encoding: Set by user -+ * - decoding: unused -+ */ -+ int slices; -+ -+ /** Field order -+ * - encoding: set by libavcodec -+ * - decoding: Set by user. -+ */ -+ enum AVFieldOrder field_order; -+ -+ /* audio only */ -+ int sample_rate; ///< samples per second -+ int channels; ///< number of audio channels -+ -+ /** -+ * audio sample format -+ * - encoding: Set by user. -+ * - decoding: Set by libavcodec. -+ */ -+ enum AVSampleFormat sample_fmt; ///< sample format -+ -+ /* The following data should not be initialized. */ -+ /** -+ * Number of samples per channel in an audio frame. -+ * -+ * - encoding: set by libavcodec in avcodec_open2(). Each submitted frame -+ * except the last must contain exactly frame_size samples per channel. -+ * May be 0 when the codec has AV_CODEC_CAP_VARIABLE_FRAME_SIZE set, then the -+ * frame size is not restricted. -+ * - decoding: may be set by some decoders to indicate constant frame size -+ */ -+ int frame_size; -+ -+ /** -+ * Frame counter, set by libavcodec. -+ * -+ * - decoding: total number of frames returned from the decoder so far. -+ * - encoding: total number of frames passed to the encoder so far. -+ * -+ * @note the counter is not incremented if encoding/decoding resulted in -+ * an error. -+ */ -+ int frame_number; -+ -+ /** -+ * number of bytes per packet if constant and known or 0 -+ * Used by some WAV based audio codecs. -+ */ -+ int block_align; -+ -+ /** -+ * Audio cutoff bandwidth (0 means "automatic") -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int cutoff; -+ -+ /** -+ * Audio channel layout. -+ * - encoding: set by user. -+ * - decoding: set by user, may be overwritten by libavcodec. -+ */ -+ uint64_t channel_layout; -+ -+ /** -+ * Request decoder to use this channel layout if it can (0 for default) -+ * - encoding: unused -+ * - decoding: Set by user. -+ */ -+ uint64_t request_channel_layout; -+ -+ /** -+ * Type of service that the audio stream conveys. -+ * - encoding: Set by user. -+ * - decoding: Set by libavcodec. -+ */ -+ enum AVAudioServiceType audio_service_type; -+ -+ /** -+ * desired sample format -+ * - encoding: Not used. -+ * - decoding: Set by user. -+ * Decoder will decode to this format if it can. -+ */ -+ enum AVSampleFormat request_sample_fmt; -+ -+ /** -+ * This callback is called at the beginning of each frame to get data -+ * buffer(s) for it. There may be one contiguous buffer for all the data or -+ * there may be a buffer per each data plane or anything in between. What -+ * this means is, you may set however many entries in buf[] you feel necessary. -+ * Each buffer must be reference-counted using the AVBuffer API (see description -+ * of buf[] below). -+ * -+ * The following fields will be set in the frame before this callback is -+ * called: -+ * - format -+ * - width, height (video only) -+ * - sample_rate, channel_layout, nb_samples (audio only) -+ * Their values may differ from the corresponding values in -+ * AVCodecContext. This callback must use the frame values, not the codec -+ * context values, to calculate the required buffer size. -+ * -+ * This callback must fill the following fields in the frame: -+ * - data[] -+ * - linesize[] -+ * - extended_data: -+ * * if the data is planar audio with more than 8 channels, then this -+ * callback must allocate and fill extended_data to contain all pointers -+ * to all data planes. data[] must hold as many pointers as it can. -+ * extended_data must be allocated with av_malloc() and will be freed in -+ * av_frame_unref(). -+ * * otherwise extended_data must point to data -+ * - buf[] must contain one or more pointers to AVBufferRef structures. Each of -+ * the frame's data and extended_data pointers must be contained in these. That -+ * is, one AVBufferRef for each allocated chunk of memory, not necessarily one -+ * AVBufferRef per data[] entry. See: av_buffer_create(), av_buffer_alloc(), -+ * and av_buffer_ref(). -+ * - extended_buf and nb_extended_buf must be allocated with av_malloc() by -+ * this callback and filled with the extra buffers if there are more -+ * buffers than buf[] can hold. extended_buf will be freed in -+ * av_frame_unref(). -+ * -+ * If AV_CODEC_CAP_DR1 is not set then get_buffer2() must call -+ * avcodec_default_get_buffer2() instead of providing buffers allocated by -+ * some other means. -+ * -+ * Each data plane must be aligned to the maximum required by the target -+ * CPU. -+ * -+ * @see avcodec_default_get_buffer2() -+ * -+ * Video: -+ * -+ * If AV_GET_BUFFER_FLAG_REF is set in flags then the frame may be reused -+ * (read and/or written to if it is writable) later by libavcodec. -+ * -+ * avcodec_align_dimensions2() should be used to find the required width and -+ * height, as they normally need to be rounded up to the next multiple of 16. -+ * -+ * Some decoders do not support linesizes changing between frames. -+ * -+ * If frame multithreading is used and thread_safe_callbacks is set, -+ * this callback may be called from a different thread, but not from more -+ * than one at once. Does not need to be reentrant. -+ * -+ * @see avcodec_align_dimensions2() -+ * -+ * Audio: -+ * -+ * Decoders request a buffer of a particular size by setting -+ * AVFrame.nb_samples prior to calling get_buffer2(). The decoder may, -+ * however, utilize only part of the buffer by setting AVFrame.nb_samples -+ * to a smaller value in the output frame. -+ * -+ * As a convenience, av_samples_get_buffer_size() and -+ * av_samples_fill_arrays() in libavutil may be used by custom get_buffer2() -+ * functions to find the required data size and to fill data pointers and -+ * linesize. In AVFrame.linesize, only linesize[0] may be set for audio -+ * since all planes must be the same size. -+ * -+ * @see av_samples_get_buffer_size(), av_samples_fill_arrays() -+ * -+ * - encoding: unused -+ * - decoding: Set by libavcodec, user can override. -+ */ -+ int (*get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags); -+ -+ /** -+ * If non-zero, the decoded audio and video frames returned from -+ * avcodec_decode_video2() and avcodec_decode_audio4() are reference-counted -+ * and are valid indefinitely. The caller must free them with -+ * av_frame_unref() when they are not needed anymore. -+ * Otherwise, the decoded frames must not be freed by the caller and are -+ * only valid until the next decode call. -+ * -+ * This is always automatically enabled if avcodec_receive_frame() is used. -+ * -+ * - encoding: unused -+ * - decoding: set by the caller before avcodec_open2(). -+ */ -+ attribute_deprecated -+ int refcounted_frames; -+ -+ /* - encoding parameters */ -+ float qcompress; ///< amount of qscale change between easy & hard scenes (0.0-1.0) -+ float qblur; ///< amount of qscale smoothing over time (0.0-1.0) -+ -+ /** -+ * minimum quantizer -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int qmin; -+ -+ /** -+ * maximum quantizer -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int qmax; -+ -+ /** -+ * maximum quantizer difference between frames -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int max_qdiff; -+ -+ /** -+ * decoder bitstream buffer size -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int rc_buffer_size; -+ -+ /** -+ * ratecontrol override, see RcOverride -+ * - encoding: Allocated/set/freed by user. -+ * - decoding: unused -+ */ -+ int rc_override_count; -+ RcOverride *rc_override; -+ -+ /** -+ * maximum bitrate -+ * - encoding: Set by user. -+ * - decoding: Set by user, may be overwritten by libavcodec. -+ */ -+ int64_t rc_max_rate; -+ -+ /** -+ * minimum bitrate -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int64_t rc_min_rate; -+ -+ /** -+ * Ratecontrol attempt to use, at maximum, of what can be used without an underflow. -+ * - encoding: Set by user. -+ * - decoding: unused. -+ */ -+ float rc_max_available_vbv_use; -+ -+ /** -+ * Ratecontrol attempt to use, at least, times the amount needed to prevent a vbv overflow. -+ * - encoding: Set by user. -+ * - decoding: unused. -+ */ -+ float rc_min_vbv_overflow_use; -+ -+ /** -+ * Number of bits which should be loaded into the rc buffer before decoding starts. -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int rc_initial_buffer_occupancy; -+ -+#if FF_API_CODER_TYPE -+#define FF_CODER_TYPE_VLC 0 -+#define FF_CODER_TYPE_AC 1 -+#define FF_CODER_TYPE_RAW 2 -+#define FF_CODER_TYPE_RLE 3 -+ /** -+ * @deprecated use encoder private options instead -+ */ -+ attribute_deprecated -+ int coder_type; -+#endif /* FF_API_CODER_TYPE */ -+ -+#if FF_API_PRIVATE_OPT -+ /** @deprecated use encoder private options instead */ -+ attribute_deprecated -+ int context_model; -+#endif -+ -+#if FF_API_PRIVATE_OPT -+ /** @deprecated use encoder private options instead */ -+ attribute_deprecated -+ int frame_skip_threshold; -+ -+ /** @deprecated use encoder private options instead */ -+ attribute_deprecated -+ int frame_skip_factor; -+ -+ /** @deprecated use encoder private options instead */ -+ attribute_deprecated -+ int frame_skip_exp; -+ -+ /** @deprecated use encoder private options instead */ -+ attribute_deprecated -+ int frame_skip_cmp; -+#endif /* FF_API_PRIVATE_OPT */ -+ -+ /** -+ * trellis RD quantization -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int trellis; -+ -+#if FF_API_PRIVATE_OPT -+ /** @deprecated use encoder private options instead */ -+ attribute_deprecated -+ int min_prediction_order; -+ -+ /** @deprecated use encoder private options instead */ -+ attribute_deprecated -+ int max_prediction_order; -+ -+ /** @deprecated use encoder private options instead */ -+ attribute_deprecated -+ int64_t timecode_frame_start; -+#endif -+ -+#if FF_API_RTP_CALLBACK -+ /** -+ * @deprecated unused -+ */ -+ /* The RTP callback: This function is called */ -+ /* every time the encoder has a packet to send. */ -+ /* It depends on the encoder if the data starts */ -+ /* with a Start Code (it should). H.263 does. */ -+ /* mb_nb contains the number of macroblocks */ -+ /* encoded in the RTP payload. */ -+ attribute_deprecated -+ void (*rtp_callback)(struct AVCodecContext *avctx, void *data, int size, int mb_nb); -+#endif -+ -+#if FF_API_PRIVATE_OPT -+ /** @deprecated use encoder private options instead */ -+ attribute_deprecated -+ int rtp_payload_size; /* The size of the RTP payload: the coder will */ -+ /* do its best to deliver a chunk with size */ -+ /* below rtp_payload_size, the chunk will start */ -+ /* with a start code on some codecs like H.263. */ -+ /* This doesn't take account of any particular */ -+ /* headers inside the transmitted RTP payload. */ -+#endif -+ -+#if FF_API_STAT_BITS -+ /* statistics, used for 2-pass encoding */ -+ attribute_deprecated -+ int mv_bits; -+ attribute_deprecated -+ int header_bits; -+ attribute_deprecated -+ int i_tex_bits; -+ attribute_deprecated -+ int p_tex_bits; -+ attribute_deprecated -+ int i_count; -+ attribute_deprecated -+ int p_count; -+ attribute_deprecated -+ int skip_count; -+ attribute_deprecated -+ int misc_bits; -+ -+ /** @deprecated this field is unused */ -+ attribute_deprecated -+ int frame_bits; -+#endif -+ -+ /** -+ * pass1 encoding statistics output buffer -+ * - encoding: Set by libavcodec. -+ * - decoding: unused -+ */ -+ char *stats_out; -+ -+ /** -+ * pass2 encoding statistics input buffer -+ * Concatenated stuff from stats_out of pass1 should be placed here. -+ * - encoding: Allocated/set/freed by user. -+ * - decoding: unused -+ */ -+ char *stats_in; -+ -+ /** -+ * Work around bugs in encoders which sometimes cannot be detected automatically. -+ * - encoding: Set by user -+ * - decoding: Set by user -+ */ -+ int workaround_bugs; -+#define FF_BUG_AUTODETECT 1 ///< autodetection -+#define FF_BUG_XVID_ILACE 4 -+#define FF_BUG_UMP4 8 -+#define FF_BUG_NO_PADDING 16 -+#define FF_BUG_AMV 32 -+#define FF_BUG_QPEL_CHROMA 64 -+#define FF_BUG_STD_QPEL 128 -+#define FF_BUG_QPEL_CHROMA2 256 -+#define FF_BUG_DIRECT_BLOCKSIZE 512 -+#define FF_BUG_EDGE 1024 -+#define FF_BUG_HPEL_CHROMA 2048 -+#define FF_BUG_DC_CLIP 4096 -+#define FF_BUG_MS 8192 ///< Work around various bugs in Microsoft's broken decoders. -+#define FF_BUG_TRUNCATED 16384 -+#define FF_BUG_IEDGE 32768 -+ -+ /** -+ * strictly follow the standard (MPEG-4, ...). -+ * - encoding: Set by user. -+ * - decoding: Set by user. -+ * Setting this to STRICT or higher means the encoder and decoder will -+ * generally do stupid things, whereas setting it to unofficial or lower -+ * will mean the encoder might produce output that is not supported by all -+ * spec-compliant decoders. Decoders don't differentiate between normal, -+ * unofficial and experimental (that is, they always try to decode things -+ * when they can) unless they are explicitly asked to behave stupidly -+ * (=strictly conform to the specs) -+ */ -+ int strict_std_compliance; -+#define FF_COMPLIANCE_VERY_STRICT 2 ///< Strictly conform to an older more strict version of the spec or reference software. -+#define FF_COMPLIANCE_STRICT 1 ///< Strictly conform to all the things in the spec no matter what consequences. -+#define FF_COMPLIANCE_NORMAL 0 -+#define FF_COMPLIANCE_UNOFFICIAL -1 ///< Allow unofficial extensions -+#define FF_COMPLIANCE_EXPERIMENTAL -2 ///< Allow nonstandardized experimental things. -+ -+ /** -+ * error concealment flags -+ * - encoding: unused -+ * - decoding: Set by user. -+ */ -+ int error_concealment; -+#define FF_EC_GUESS_MVS 1 -+#define FF_EC_DEBLOCK 2 -+#define FF_EC_FAVOR_INTER 256 -+ -+ /** -+ * debug -+ * - encoding: Set by user. -+ * - decoding: Set by user. -+ */ -+ int debug; -+#define FF_DEBUG_PICT_INFO 1 -+#define FF_DEBUG_RC 2 -+#define FF_DEBUG_BITSTREAM 4 -+#define FF_DEBUG_MB_TYPE 8 -+#define FF_DEBUG_QP 16 -+#if FF_API_DEBUG_MV -+/** -+ * @deprecated this option does nothing -+ */ -+#define FF_DEBUG_MV 32 -+#endif -+#define FF_DEBUG_DCT_COEFF 0x00000040 -+#define FF_DEBUG_SKIP 0x00000080 -+#define FF_DEBUG_STARTCODE 0x00000100 -+#define FF_DEBUG_ER 0x00000400 -+#define FF_DEBUG_MMCO 0x00000800 -+#define FF_DEBUG_BUGS 0x00001000 -+#if FF_API_DEBUG_MV -+#define FF_DEBUG_VIS_QP 0x00002000 -+#define FF_DEBUG_VIS_MB_TYPE 0x00004000 -+#endif -+#define FF_DEBUG_BUFFERS 0x00008000 -+#define FF_DEBUG_THREADS 0x00010000 -+#define FF_DEBUG_GREEN_MD 0x00800000 -+#define FF_DEBUG_NOMC 0x01000000 -+ -+#if FF_API_DEBUG_MV -+ /** -+ * debug -+ * - encoding: Set by user. -+ * - decoding: Set by user. -+ */ -+ int debug_mv; -+#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 // visualize forward predicted MVs of P-frames -+#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 // visualize forward predicted MVs of B-frames -+#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 // visualize backward predicted MVs of B-frames -+#endif -+ -+ /** -+ * Error recognition; may misdetect some more or less valid parts as errors. -+ * - encoding: unused -+ * - decoding: Set by user. -+ */ -+ int err_recognition; -+ -+/** -+ * Verify checksums embedded in the bitstream (could be of either encoded or -+ * decoded data, depending on the codec) and print an error message on mismatch. -+ * If AV_EF_EXPLODE is also set, a mismatching checksum will result in the -+ * decoder returning an error. -+ */ -+#define AV_EF_CRCCHECK (1<<0) -+#define AV_EF_BITSTREAM (1<<1) ///< detect bitstream specification deviations -+#define AV_EF_BUFFER (1<<2) ///< detect improper bitstream length -+#define AV_EF_EXPLODE (1<<3) ///< abort decoding on minor error detection -+ -+#define AV_EF_IGNORE_ERR (1<<15) ///< ignore errors and continue -+#define AV_EF_CAREFUL (1<<16) ///< consider things that violate the spec, are fast to calculate and have not been seen in the wild as errors -+#define AV_EF_COMPLIANT (1<<17) ///< consider all spec non compliances as errors -+#define AV_EF_AGGRESSIVE (1<<18) ///< consider things that a sane encoder should not do as an error -+ -+ -+ /** -+ * opaque 64-bit number (generally a PTS) that will be reordered and -+ * output in AVFrame.reordered_opaque -+ * - encoding: unused -+ * - decoding: Set by user. -+ */ -+ int64_t reordered_opaque; -+ -+ /** -+ * Hardware accelerator in use -+ * - encoding: unused. -+ * - decoding: Set by libavcodec -+ */ -+ const struct AVHWAccel *hwaccel; -+ -+ /** -+ * Hardware accelerator context. -+ * For some hardware accelerators, a global context needs to be -+ * provided by the user. In that case, this holds display-dependent -+ * data FFmpeg cannot instantiate itself. Please refer to the -+ * FFmpeg HW accelerator documentation to know how to fill this -+ * is. e.g. for VA API, this is a struct vaapi_context. -+ * - encoding: unused -+ * - decoding: Set by user -+ */ -+ void *hwaccel_context; -+ -+ /** -+ * error -+ * - encoding: Set by libavcodec if flags & AV_CODEC_FLAG_PSNR. -+ * - decoding: unused -+ */ -+ uint64_t error[AV_NUM_DATA_POINTERS]; -+ -+ /** -+ * DCT algorithm, see FF_DCT_* below -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int dct_algo; -+#define FF_DCT_AUTO 0 -+#define FF_DCT_FASTINT 1 -+#define FF_DCT_INT 2 -+#define FF_DCT_MMX 3 -+#define FF_DCT_ALTIVEC 5 -+#define FF_DCT_FAAN 6 -+ -+ /** -+ * IDCT algorithm, see FF_IDCT_* below. -+ * - encoding: Set by user. -+ * - decoding: Set by user. -+ */ -+ int idct_algo; -+#define FF_IDCT_AUTO 0 -+#define FF_IDCT_INT 1 -+#define FF_IDCT_SIMPLE 2 -+#define FF_IDCT_SIMPLEMMX 3 -+#define FF_IDCT_ARM 7 -+#define FF_IDCT_ALTIVEC 8 -+#define FF_IDCT_SIMPLEARM 10 -+#define FF_IDCT_XVID 14 -+#define FF_IDCT_SIMPLEARMV5TE 16 -+#define FF_IDCT_SIMPLEARMV6 17 -+#define FF_IDCT_FAAN 20 -+#define FF_IDCT_SIMPLENEON 22 -+#define FF_IDCT_NONE 24 /* Used by XvMC to extract IDCT coefficients with FF_IDCT_PERM_NONE */ -+#define FF_IDCT_SIMPLEAUTO 128 -+ -+ /** -+ * bits per sample/pixel from the demuxer (needed for huffyuv). -+ * - encoding: Set by libavcodec. -+ * - decoding: Set by user. -+ */ -+ int bits_per_coded_sample; -+ -+ /** -+ * Bits per sample/pixel of internal libavcodec pixel/sample format. -+ * - encoding: set by user. -+ * - decoding: set by libavcodec. -+ */ -+ int bits_per_raw_sample; -+ -+#if FF_API_LOWRES -+ /** -+ * low resolution decoding, 1-> 1/2 size, 2->1/4 size -+ * - encoding: unused -+ * - decoding: Set by user. -+ */ -+ int lowres; -+#endif -+ -+#if FF_API_CODED_FRAME -+ /** -+ * the picture in the bitstream -+ * - encoding: Set by libavcodec. -+ * - decoding: unused -+ * -+ * @deprecated use the quality factor packet side data instead -+ */ -+ attribute_deprecated AVFrame *coded_frame; -+#endif -+ -+ /** -+ * thread count -+ * is used to decide how many independent tasks should be passed to execute() -+ * - encoding: Set by user. -+ * - decoding: Set by user. -+ */ -+ int thread_count; -+ -+ /** -+ * Which multithreading methods to use. -+ * Use of FF_THREAD_FRAME will increase decoding delay by one frame per thread, -+ * so clients which cannot provide future frames should not use it. -+ * -+ * - encoding: Set by user, otherwise the default is used. -+ * - decoding: Set by user, otherwise the default is used. -+ */ -+ int thread_type; -+#define FF_THREAD_FRAME 1 ///< Decode more than one frame at once -+#define FF_THREAD_SLICE 2 ///< Decode more than one part of a single frame at once -+ -+ /** -+ * Which multithreading methods are in use by the codec. -+ * - encoding: Set by libavcodec. -+ * - decoding: Set by libavcodec. -+ */ -+ int active_thread_type; -+ -+ /** -+ * Set by the client if its custom get_buffer() callback can be called -+ * synchronously from another thread, which allows faster multithreaded decoding. -+ * draw_horiz_band() will be called from other threads regardless of this setting. -+ * Ignored if the default get_buffer() is used. -+ * - encoding: Set by user. -+ * - decoding: Set by user. -+ */ -+ int thread_safe_callbacks; -+ -+ /** -+ * The codec may call this to execute several independent things. -+ * It will return only after finishing all tasks. -+ * The user may replace this with some multithreaded implementation, -+ * the default implementation will execute the parts serially. -+ * @param count the number of things to execute -+ * - encoding: Set by libavcodec, user can override. -+ * - decoding: Set by libavcodec, user can override. -+ */ -+ int (*execute)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size); -+ -+ /** -+ * The codec may call this to execute several independent things. -+ * It will return only after finishing all tasks. -+ * The user may replace this with some multithreaded implementation, -+ * the default implementation will execute the parts serially. -+ * Also see avcodec_thread_init and e.g. the --enable-pthread configure option. -+ * @param c context passed also to func -+ * @param count the number of things to execute -+ * @param arg2 argument passed unchanged to func -+ * @param ret return values of executed functions, must have space for "count" values. May be NULL. -+ * @param func function that will be called count times, with jobnr from 0 to count-1. -+ * threadnr will be in the range 0 to c->thread_count-1 < MAX_THREADS and so that no -+ * two instances of func executing at the same time will have the same threadnr. -+ * @return always 0 currently, but code should handle a future improvement where when any call to func -+ * returns < 0 no further calls to func may be done and < 0 is returned. -+ * - encoding: Set by libavcodec, user can override. -+ * - decoding: Set by libavcodec, user can override. -+ */ -+ int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count); -+ -+ /** -+ * noise vs. sse weight for the nsse comparison function -+ * - encoding: Set by user. -+ * - decoding: unused -+ */ -+ int nsse_weight; -+ -+ /** -+ * profile -+ * - encoding: Set by user. -+ * - decoding: Set by libavcodec. -+ */ -+ int profile; -+#define FF_PROFILE_UNKNOWN -99 -+#define FF_PROFILE_RESERVED -100 -+ -+#define FF_PROFILE_AAC_MAIN 0 -+#define FF_PROFILE_AAC_LOW 1 -+#define FF_PROFILE_AAC_SSR 2 -+#define FF_PROFILE_AAC_LTP 3 -+#define FF_PROFILE_AAC_HE 4 -+#define FF_PROFILE_AAC_HE_V2 28 -+#define FF_PROFILE_AAC_LD 22 -+#define FF_PROFILE_AAC_ELD 38 -+#define FF_PROFILE_MPEG2_AAC_LOW 128 -+#define FF_PROFILE_MPEG2_AAC_HE 131 -+ -+#define FF_PROFILE_DNXHD 0 -+#define FF_PROFILE_DNXHR_LB 1 -+#define FF_PROFILE_DNXHR_SQ 2 -+#define FF_PROFILE_DNXHR_HQ 3 -+#define FF_PROFILE_DNXHR_HQX 4 -+#define FF_PROFILE_DNXHR_444 5 -+ -+#define FF_PROFILE_DTS 20 -+#define FF_PROFILE_DTS_ES 30 -+#define FF_PROFILE_DTS_96_24 40 -+#define FF_PROFILE_DTS_HD_HRA 50 -+#define FF_PROFILE_DTS_HD_MA 60 -+#define FF_PROFILE_DTS_EXPRESS 70 -+ -+#define FF_PROFILE_MPEG2_422 0 -+#define FF_PROFILE_MPEG2_HIGH 1 -+#define FF_PROFILE_MPEG2_SS 2 -+#define FF_PROFILE_MPEG2_SNR_SCALABLE 3 -+#define FF_PROFILE_MPEG2_MAIN 4 -+#define FF_PROFILE_MPEG2_SIMPLE 5 -+ -+#define FF_PROFILE_H264_CONSTRAINED (1<<9) // 8+1; constraint_set1_flag -+#define FF_PROFILE_H264_INTRA (1<<11) // 8+3; constraint_set3_flag -+ -+#define FF_PROFILE_H264_BASELINE 66 -+#define FF_PROFILE_H264_CONSTRAINED_BASELINE (66|FF_PROFILE_H264_CONSTRAINED) -+#define FF_PROFILE_H264_MAIN 77 -+#define FF_PROFILE_H264_EXTENDED 88 -+#define FF_PROFILE_H264_HIGH 100 -+#define FF_PROFILE_H264_HIGH_10 110 -+#define FF_PROFILE_H264_HIGH_10_INTRA (110|FF_PROFILE_H264_INTRA) -+#define FF_PROFILE_H264_MULTIVIEW_HIGH 118 -+#define FF_PROFILE_H264_HIGH_422 122 -+#define FF_PROFILE_H264_HIGH_422_INTRA (122|FF_PROFILE_H264_INTRA) -+#define FF_PROFILE_H264_STEREO_HIGH 128 -+#define FF_PROFILE_H264_HIGH_444 144 -+#define FF_PROFILE_H264_HIGH_444_PREDICTIVE 244 -+#define FF_PROFILE_H264_HIGH_444_INTRA (244|FF_PROFILE_H264_INTRA) -+#define FF_PROFILE_H264_CAVLC_444 44 -+ -+#define FF_PROFILE_VC1_SIMPLE 0 -+#define FF_PROFILE_VC1_MAIN 1 -+#define FF_PROFILE_VC1_COMPLEX 2 -+#define FF_PROFILE_VC1_ADVANCED 3 -+ -+#define FF_PROFILE_MPEG4_SIMPLE 0 -+#define FF_PROFILE_MPEG4_SIMPLE_SCALABLE 1 -+#define FF_PROFILE_MPEG4_CORE 2 -+#define FF_PROFILE_MPEG4_MAIN 3 -+#define FF_PROFILE_MPEG4_N_BIT 4 -+#define FF_PROFILE_MPEG4_SCALABLE_TEXTURE 5 -+#define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION 6 -+#define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE 7 -+#define FF_PROFILE_MPEG4_HYBRID 8 -+#define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME 9 -+#define FF_PROFILE_MPEG4_CORE_SCALABLE 10 -+#define FF_PROFILE_MPEG4_ADVANCED_CODING 11 -+#define FF_PROFILE_MPEG4_ADVANCED_CORE 12 -+#define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13 -+#define FF_PROFILE_MPEG4_SIMPLE_STUDIO 14 -+#define FF_PROFILE_MPEG4_ADVANCED_SIMPLE 15 -+ -+#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 1 -+#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 2 -+#define FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION 32768 -+#define FF_PROFILE_JPEG2000_DCINEMA_2K 3 -+#define FF_PROFILE_JPEG2000_DCINEMA_4K 4 -+ -+#define FF_PROFILE_VP9_0 0 -+#define FF_PROFILE_VP9_1 1 -+#define FF_PROFILE_VP9_2 2 -+#define FF_PROFILE_VP9_3 3 -+ -+#define FF_PROFILE_HEVC_MAIN 1 -+#define FF_PROFILE_HEVC_MAIN_10 2 -+#define FF_PROFILE_HEVC_MAIN_STILL_PICTURE 3 -+#define FF_PROFILE_HEVC_REXT 4 -+ -+#define FF_PROFILE_AV1_MAIN 0 -+#define FF_PROFILE_AV1_HIGH 1 -+#define FF_PROFILE_AV1_PROFESSIONAL 2 -+ -+#define FF_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT 0xc0 -+#define FF_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT 0xc1 -+#define FF_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT 0xc2 -+#define FF_PROFILE_MJPEG_HUFFMAN_LOSSLESS 0xc3 -+#define FF_PROFILE_MJPEG_JPEG_LS 0xf7 -+ -+#define FF_PROFILE_SBC_MSBC 1 -+ -+ /** -+ * level -+ * - encoding: Set by user. -+ * - decoding: Set by libavcodec. -+ */ -+ int level; -+#define FF_LEVEL_UNKNOWN -99 -+ -+ /** -+ * Skip loop filtering for selected frames. -+ * - encoding: unused -+ * - decoding: Set by user. -+ */ -+ enum AVDiscard skip_loop_filter; -+ -+ /** -+ * Skip IDCT/dequantization for selected frames. -+ * - encoding: unused -+ * - decoding: Set by user. -+ */ -+ enum AVDiscard skip_idct; -+ -+ /** -+ * Skip decoding for selected frames. -+ * - encoding: unused -+ * - decoding: Set by user. -+ */ -+ enum AVDiscard skip_frame; -+ -+ /** -+ * Header containing style information for text subtitles. -+ * For SUBTITLE_ASS subtitle type, it should contain the whole ASS -+ * [Script Info] and [V4+ Styles] section, plus the [Events] line and -+ * the Format line following. It shouldn't include any Dialogue line. -+ * - encoding: Set/allocated/freed by user (before avcodec_open2()) -+ * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2()) -+ */ -+ uint8_t *subtitle_header; -+ int subtitle_header_size; -+ -+#if FF_API_VBV_DELAY -+ /** -+ * VBV delay coded in the last frame (in periods of a 27 MHz clock). -+ * Used for compliant TS muxing. -+ * - encoding: Set by libavcodec. -+ * - decoding: unused. -+ * @deprecated this value is now exported as a part of -+ * AV_PKT_DATA_CPB_PROPERTIES packet side data -+ */ -+ attribute_deprecated -+ uint64_t vbv_delay; -+#endif -+ -+#if FF_API_SIDEDATA_ONLY_PKT -+ /** -+ * Encoding only and set by default. Allow encoders to output packets -+ * that do not contain any encoded data, only side data. -+ * -+ * Some encoders need to output such packets, e.g. to update some stream -+ * parameters at the end of encoding. -+ * -+ * @deprecated this field disables the default behaviour and -+ * it is kept only for compatibility. -+ */ -+ attribute_deprecated -+ int side_data_only_packets; -+#endif -+ -+ /** -+ * Audio only. The number of "priming" samples (padding) inserted by the -+ * encoder at the beginning of the audio. I.e. this number of leading -+ * decoded samples must be discarded by the caller to get the original audio -+ * without leading padding. -+ * -+ * - decoding: unused -+ * - encoding: Set by libavcodec. The timestamps on the output packets are -+ * adjusted by the encoder so that they always refer to the -+ * first sample of the data actually contained in the packet, -+ * including any added padding. E.g. if the timebase is -+ * 1/samplerate and the timestamp of the first input sample is -+ * 0, the timestamp of the first output packet will be -+ * -initial_padding. -+ */ -+ int initial_padding; -+ -+ /** -+ * - decoding: For codecs that store a framerate value in the compressed -+ * bitstream, the decoder may export it here. { 0, 1} when -+ * unknown. -+ * - encoding: May be used to signal the framerate of CFR content to an -+ * encoder. -+ */ -+ AVRational framerate; -+ -+ /** -+ * Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx. -+ * - encoding: unused. -+ * - decoding: Set by libavcodec before calling get_format() -+ */ -+ enum AVPixelFormat sw_pix_fmt; -+ -+ /** -+ * Timebase in which pkt_dts/pts and AVPacket.dts/pts are. -+ * - encoding unused. -+ * - decoding set by user. -+ */ -+ AVRational pkt_timebase; -+ -+ /** -+ * AVCodecDescriptor -+ * - encoding: unused. -+ * - decoding: set by libavcodec. -+ */ -+ const AVCodecDescriptor *codec_descriptor; -+ -+#if !FF_API_LOWRES -+ /** -+ * low resolution decoding, 1-> 1/2 size, 2->1/4 size -+ * - encoding: unused -+ * - decoding: Set by user. -+ */ -+ int lowres; -+#endif -+ -+ /** -+ * Current statistics for PTS correction. -+ * - decoding: maintained and used by libavcodec, not intended to be used by user apps -+ * - encoding: unused -+ */ -+ int64_t pts_correction_num_faulty_pts; /// Number of incorrect PTS values so far -+ int64_t pts_correction_num_faulty_dts; /// Number of incorrect DTS values so far -+ int64_t pts_correction_last_pts; /// PTS of the last frame -+ int64_t pts_correction_last_dts; /// DTS of the last frame -+ -+ /** -+ * Character encoding of the input subtitles file. -+ * - decoding: set by user -+ * - encoding: unused -+ */ -+ char *sub_charenc; -+ -+ /** -+ * Subtitles character encoding mode. Formats or codecs might be adjusting -+ * this setting (if they are doing the conversion themselves for instance). -+ * - decoding: set by libavcodec -+ * - encoding: unused -+ */ -+ int sub_charenc_mode; -+#define FF_SUB_CHARENC_MODE_DO_NOTHING -1 ///< do nothing (demuxer outputs a stream supposed to be already in UTF-8, or the codec is bitmap for instance) -+#define FF_SUB_CHARENC_MODE_AUTOMATIC 0 ///< libavcodec will select the mode itself -+#define FF_SUB_CHARENC_MODE_PRE_DECODER 1 ///< the AVPacket data needs to be recoded to UTF-8 before being fed to the decoder, requires iconv -+#define FF_SUB_CHARENC_MODE_IGNORE 2 ///< neither convert the subtitles, nor check them for valid UTF-8 -+ -+ /** -+ * Skip processing alpha if supported by codec. -+ * Note that if the format uses pre-multiplied alpha (common with VP6, -+ * and recommended due to better video quality/compression) -+ * the image will look as if alpha-blended onto a black background. -+ * However for formats that do not use pre-multiplied alpha -+ * there might be serious artefacts (though e.g. libswscale currently -+ * assumes pre-multiplied alpha anyway). -+ * -+ * - decoding: set by user -+ * - encoding: unused -+ */ -+ int skip_alpha; -+ -+ /** -+ * Number of samples to skip after a discontinuity -+ * - decoding: unused -+ * - encoding: set by libavcodec -+ */ -+ int seek_preroll; -+ -+#if !FF_API_DEBUG_MV -+ /** -+ * debug motion vectors -+ * - encoding: Set by user. -+ * - decoding: Set by user. -+ */ -+ int debug_mv; -+#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 //visualize forward predicted MVs of P frames -+#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 //visualize forward predicted MVs of B frames -+#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 //visualize backward predicted MVs of B frames -+#endif -+ -+ /** -+ * custom intra quantization matrix -+ * - encoding: Set by user, can be NULL. -+ * - decoding: unused. -+ */ -+ uint16_t *chroma_intra_matrix; -+ -+ /** -+ * dump format separator. -+ * can be ", " or "\n " or anything else -+ * - encoding: Set by user. -+ * - decoding: Set by user. -+ */ -+ uint8_t *dump_separator; -+ -+ /** -+ * ',' separated list of allowed decoders. -+ * If NULL then all are allowed -+ * - encoding: unused -+ * - decoding: set by user -+ */ -+ char *codec_whitelist; -+ -+ /** -+ * Properties of the stream that gets decoded -+ * - encoding: unused -+ * - decoding: set by libavcodec -+ */ -+ unsigned properties; -+#define FF_CODEC_PROPERTY_LOSSLESS 0x00000001 -+#define FF_CODEC_PROPERTY_CLOSED_CAPTIONS 0x00000002 -+ -+ /** -+ * Additional data associated with the entire coded stream. -+ * -+ * - decoding: unused -+ * - encoding: may be set by libavcodec after avcodec_open2(). -+ */ -+ AVPacketSideData *coded_side_data; -+ int nb_coded_side_data; -+ -+ /** -+ * A reference to the AVHWFramesContext describing the input (for encoding) -+ * or output (decoding) frames. The reference is set by the caller and -+ * afterwards owned (and freed) by libavcodec - it should never be read by -+ * the caller after being set. -+ * -+ * - decoding: This field should be set by the caller from the get_format() -+ * callback. The previous reference (if any) will always be -+ * unreffed by libavcodec before the get_format() call. -+ * -+ * If the default get_buffer2() is used with a hwaccel pixel -+ * format, then this AVHWFramesContext will be used for -+ * allocating the frame buffers. -+ * -+ * - encoding: For hardware encoders configured to use a hwaccel pixel -+ * format, this field should be set by the caller to a reference -+ * to the AVHWFramesContext describing input frames. -+ * AVHWFramesContext.format must be equal to -+ * AVCodecContext.pix_fmt. -+ * -+ * This field should be set before avcodec_open2() is called. -+ */ -+ AVBufferRef *hw_frames_ctx; -+ -+ /** -+ * Control the form of AVSubtitle.rects[N]->ass -+ * - decoding: set by user -+ * - encoding: unused -+ */ -+ int sub_text_format; -+#define FF_SUB_TEXT_FMT_ASS 0 -+#if FF_API_ASS_TIMING -+#define FF_SUB_TEXT_FMT_ASS_WITH_TIMINGS 1 -+#endif -+ -+ /** -+ * Audio only. The amount of padding (in samples) appended by the encoder to -+ * the end of the audio. I.e. this number of decoded samples must be -+ * discarded by the caller from the end of the stream to get the original -+ * audio without any trailing padding. -+ * -+ * - decoding: unused -+ * - encoding: unused -+ */ -+ int trailing_padding; -+ -+ /** -+ * The number of pixels per image to maximally accept. -+ * -+ * - decoding: set by user -+ * - encoding: set by user -+ */ -+ int64_t max_pixels; -+ -+ /** -+ * A reference to the AVHWDeviceContext describing the device which will -+ * be used by a hardware encoder/decoder. The reference is set by the -+ * caller and afterwards owned (and freed) by libavcodec. -+ * -+ * This should be used if either the codec device does not require -+ * hardware frames or any that are used are to be allocated internally by -+ * libavcodec. If the user wishes to supply any of the frames used as -+ * encoder input or decoder output then hw_frames_ctx should be used -+ * instead. When hw_frames_ctx is set in get_format() for a decoder, this -+ * field will be ignored while decoding the associated stream segment, but -+ * may again be used on a following one after another get_format() call. -+ * -+ * For both encoders and decoders this field should be set before -+ * avcodec_open2() is called and must not be written to thereafter. -+ * -+ * Note that some decoders may require this field to be set initially in -+ * order to support hw_frames_ctx at all - in that case, all frames -+ * contexts used must be created on the same device. -+ */ -+ AVBufferRef *hw_device_ctx; -+ -+ /** -+ * Bit set of AV_HWACCEL_FLAG_* flags, which affect hardware accelerated -+ * decoding (if active). -+ * - encoding: unused -+ * - decoding: Set by user (either before avcodec_open2(), or in the -+ * AVCodecContext.get_format callback) -+ */ -+ int hwaccel_flags; -+ -+ /** -+ * Video decoding only. Certain video codecs support cropping, meaning that -+ * only a sub-rectangle of the decoded frame is intended for display. This -+ * option controls how cropping is handled by libavcodec. -+ * -+ * When set to 1 (the default), libavcodec will apply cropping internally. -+ * I.e. it will modify the output frame width/height fields and offset the -+ * data pointers (only by as much as possible while preserving alignment, or -+ * by the full amount if the AV_CODEC_FLAG_UNALIGNED flag is set) so that -+ * the frames output by the decoder refer only to the cropped area. The -+ * crop_* fields of the output frames will be zero. -+ * -+ * When set to 0, the width/height fields of the output frames will be set -+ * to the coded dimensions and the crop_* fields will describe the cropping -+ * rectangle. Applying the cropping is left to the caller. -+ * -+ * @warning When hardware acceleration with opaque output frames is used, -+ * libavcodec is unable to apply cropping from the top/left border. -+ * -+ * @note when this option is set to zero, the width/height fields of the -+ * AVCodecContext and output AVFrames have different meanings. The codec -+ * context fields store display dimensions (with the coded dimensions in -+ * coded_width/height), while the frame fields store the coded dimensions -+ * (with the display dimensions being determined by the crop_* fields). -+ */ -+ int apply_cropping; -+ -+ /* -+ * Video decoding only. Sets the number of extra hardware frames which -+ * the decoder will allocate for use by the caller. This must be set -+ * before avcodec_open2() is called. -+ * -+ * Some hardware decoders require all frames that they will use for -+ * output to be defined in advance before decoding starts. For such -+ * decoders, the hardware frame pool must therefore be of a fixed size. -+ * The extra frames set here are on top of any number that the decoder -+ * needs internally in order to operate normally (for example, frames -+ * used as reference pictures). -+ */ -+ int extra_hw_frames; -+} AVCodecContext; -+ -+#if FF_API_CODEC_GET_SET -+/** -+ * Accessors for some AVCodecContext fields. These used to be provided for ABI -+ * compatibility, and do not need to be used anymore. -+ */ -+attribute_deprecated -+AVRational av_codec_get_pkt_timebase (const AVCodecContext *avctx); -+attribute_deprecated -+void av_codec_set_pkt_timebase (AVCodecContext *avctx, AVRational val); -+ -+attribute_deprecated -+const AVCodecDescriptor *av_codec_get_codec_descriptor(const AVCodecContext *avctx); -+attribute_deprecated -+void av_codec_set_codec_descriptor(AVCodecContext *avctx, const AVCodecDescriptor *desc); -+ -+attribute_deprecated -+unsigned av_codec_get_codec_properties(const AVCodecContext *avctx); -+ -+#if FF_API_LOWRES -+attribute_deprecated -+int av_codec_get_lowres(const AVCodecContext *avctx); -+attribute_deprecated -+void av_codec_set_lowres(AVCodecContext *avctx, int val); -+#endif -+ -+attribute_deprecated -+int av_codec_get_seek_preroll(const AVCodecContext *avctx); -+attribute_deprecated -+void av_codec_set_seek_preroll(AVCodecContext *avctx, int val); -+ -+attribute_deprecated -+uint16_t *av_codec_get_chroma_intra_matrix(const AVCodecContext *avctx); -+attribute_deprecated -+void av_codec_set_chroma_intra_matrix(AVCodecContext *avctx, uint16_t *val); -+#endif -+ -+/** -+ * AVProfile. -+ */ -+typedef struct AVProfile { -+ int profile; -+ const char *name; ///< short name for the profile -+} AVProfile; -+ -+enum { -+ /** -+ * The codec supports this format via the hw_device_ctx interface. -+ * -+ * When selecting this format, AVCodecContext.hw_device_ctx should -+ * have been set to a device of the specified type before calling -+ * avcodec_open2(). -+ */ -+ AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX = 0x01, -+ /** -+ * The codec supports this format via the hw_frames_ctx interface. -+ * -+ * When selecting this format for a decoder, -+ * AVCodecContext.hw_frames_ctx should be set to a suitable frames -+ * context inside the get_format() callback. The frames context -+ * must have been created on a device of the specified type. -+ */ -+ AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX = 0x02, -+ /** -+ * The codec supports this format by some internal method. -+ * -+ * This format can be selected without any additional configuration - -+ * no device or frames context is required. -+ */ -+ AV_CODEC_HW_CONFIG_METHOD_INTERNAL = 0x04, -+ /** -+ * The codec supports this format by some ad-hoc method. -+ * -+ * Additional settings and/or function calls are required. See the -+ * codec-specific documentation for details. (Methods requiring -+ * this sort of configuration are deprecated and others should be -+ * used in preference.) -+ */ -+ AV_CODEC_HW_CONFIG_METHOD_AD_HOC = 0x08, -+}; -+ -+typedef struct AVCodecHWConfig { -+ /** -+ * A hardware pixel format which the codec can use. -+ */ -+ enum AVPixelFormat pix_fmt; -+ /** -+ * Bit set of AV_CODEC_HW_CONFIG_METHOD_* flags, describing the possible -+ * setup methods which can be used with this configuration. -+ */ -+ int methods; -+ /** -+ * The device type associated with the configuration. -+ * -+ * Must be set for AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX and -+ * AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX, otherwise unused. -+ */ -+ enum AVHWDeviceType device_type; -+} AVCodecHWConfig; -+ -+typedef struct AVCodecDefault AVCodecDefault; -+ -+struct AVSubtitle; -+ -+/** -+ * AVCodec. -+ */ -+typedef struct AVCodec { -+ /** -+ * Name of the codec implementation. -+ * The name is globally unique among encoders and among decoders (but an -+ * encoder and a decoder can share the same name). -+ * This is the primary way to find a codec from the user perspective. -+ */ -+ const char *name; -+ /** -+ * Descriptive name for the codec, meant to be more human readable than name. -+ * You should use the NULL_IF_CONFIG_SMALL() macro to define it. -+ */ -+ const char *long_name; -+ enum AVMediaType type; -+ enum AVCodecID id; -+ /** -+ * Codec capabilities. -+ * see AV_CODEC_CAP_* -+ */ -+ int capabilities; -+ const AVRational *supported_framerates; ///< array of supported framerates, or NULL if any, array is terminated by {0,0} -+ const enum AVPixelFormat *pix_fmts; ///< array of supported pixel formats, or NULL if unknown, array is terminated by -1 -+ const int *supported_samplerates; ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0 -+ const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1 -+ const uint64_t *channel_layouts; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0 -+ uint8_t max_lowres; ///< maximum value for lowres supported by the decoder -+ const AVClass *priv_class; ///< AVClass for the private context -+ const AVProfile *profiles; ///< array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN} -+ -+ /** -+ * Group name of the codec implementation. -+ * This is a short symbolic name of the wrapper backing this codec. A -+ * wrapper uses some kind of external implementation for the codec, such -+ * as an external library, or a codec implementation provided by the OS or -+ * the hardware. -+ * If this field is NULL, this is a builtin, libavcodec native codec. -+ * If non-NULL, this will be the suffix in AVCodec.name in most cases -+ * (usually AVCodec.name will be of the form "_"). -+ */ -+ const char *wrapper_name; -+ -+ /***************************************************************** -+ * No fields below this line are part of the public API. They -+ * may not be used outside of libavcodec and can be changed and -+ * removed at will. -+ * New public fields should be added right above. -+ ***************************************************************** -+ */ -+ int priv_data_size; -+ struct AVCodec *next; -+ /** -+ * @name Frame-level threading support functions -+ * @{ -+ */ -+ /** -+ * If defined, called on thread contexts when they are created. -+ * If the codec allocates writable tables in init(), re-allocate them here. -+ * priv_data will be set to a copy of the original. -+ */ -+ int (*init_thread_copy)(AVCodecContext *); -+ /** -+ * Copy necessary context variables from a previous thread context to the current one. -+ * If not defined, the next thread will start automatically; otherwise, the codec -+ * must call ff_thread_finish_setup(). -+ * -+ * dst and src will (rarely) point to the same context, in which case memcpy should be skipped. -+ */ -+ int (*update_thread_context)(AVCodecContext *dst, const AVCodecContext *src); -+ /** @} */ -+ -+ /** -+ * Private codec-specific defaults. -+ */ -+ const AVCodecDefault *defaults; -+ -+ /** -+ * Initialize codec static data, called from avcodec_register(). -+ * -+ * This is not intended for time consuming operations as it is -+ * run for every codec regardless of that codec being used. -+ */ -+ void (*init_static_data)(struct AVCodec *codec); -+ -+ int (*init)(AVCodecContext *); -+ int (*encode_sub)(AVCodecContext *, uint8_t *buf, int buf_size, -+ const struct AVSubtitle *sub); -+ /** -+ * Encode data to an AVPacket. -+ * -+ * @param avctx codec context -+ * @param avpkt output AVPacket (may contain a user-provided buffer) -+ * @param[in] frame AVFrame containing the raw data to be encoded -+ * @param[out] got_packet_ptr encoder sets to 0 or 1 to indicate that a -+ * non-empty packet was returned in avpkt. -+ * @return 0 on success, negative error code on failure -+ */ -+ int (*encode2)(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, -+ int *got_packet_ptr); -+ int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt); -+ int (*close)(AVCodecContext *); -+ /** -+ * Encode API with decoupled packet/frame dataflow. The API is the -+ * same as the avcodec_ prefixed APIs (avcodec_send_frame() etc.), except -+ * that: -+ * - never called if the codec is closed or the wrong type, -+ * - if AV_CODEC_CAP_DELAY is not set, drain frames are never sent, -+ * - only one drain frame is ever passed down, -+ */ -+ int (*send_frame)(AVCodecContext *avctx, const AVFrame *frame); -+ int (*receive_packet)(AVCodecContext *avctx, AVPacket *avpkt); -+ -+ /** -+ * Decode API with decoupled packet/frame dataflow. This function is called -+ * to get one output frame. It should call ff_decode_get_packet() to obtain -+ * input data. -+ */ -+ int (*receive_frame)(AVCodecContext *avctx, AVFrame *frame); -+ /** -+ * Flush buffers. -+ * Will be called when seeking -+ */ -+ void (*flush)(AVCodecContext *); -+ /** -+ * Internal codec capabilities. -+ * See FF_CODEC_CAP_* in internal.h -+ */ -+ int caps_internal; -+ -+ /** -+ * Decoding only, a comma-separated list of bitstream filters to apply to -+ * packets before decoding. -+ */ -+ const char *bsfs; -+ -+ /** -+ * Array of pointers to hardware configurations supported by the codec, -+ * or NULL if no hardware supported. The array is terminated by a NULL -+ * pointer. -+ * -+ * The user can only access this field via avcodec_get_hw_config(). -+ */ -+ const struct AVCodecHWConfigInternal **hw_configs; -+} AVCodec; -+ -+#if FF_API_CODEC_GET_SET -+attribute_deprecated -+int av_codec_get_max_lowres(const AVCodec *codec); -+#endif -+ -+struct MpegEncContext; -+ -+/** -+ * Retrieve supported hardware configurations for a codec. -+ * -+ * Values of index from zero to some maximum return the indexed configuration -+ * descriptor; all other values return NULL. If the codec does not support -+ * any hardware configurations then it will always return NULL. -+ */ -+const AVCodecHWConfig *avcodec_get_hw_config(const AVCodec *codec, int index); -+ -+/** -+ * @defgroup lavc_hwaccel AVHWAccel -+ * -+ * @note Nothing in this structure should be accessed by the user. At some -+ * point in future it will not be externally visible at all. -+ * -+ * @{ -+ */ -+typedef struct AVHWAccel { -+ /** -+ * Name of the hardware accelerated codec. -+ * The name is globally unique among encoders and among decoders (but an -+ * encoder and a decoder can share the same name). -+ */ -+ const char *name; -+ -+ /** -+ * Type of codec implemented by the hardware accelerator. -+ * -+ * See AVMEDIA_TYPE_xxx -+ */ -+ enum AVMediaType type; -+ -+ /** -+ * Codec implemented by the hardware accelerator. -+ * -+ * See AV_CODEC_ID_xxx -+ */ -+ enum AVCodecID id; -+ -+ /** -+ * Supported pixel format. -+ * -+ * Only hardware accelerated formats are supported here. -+ */ -+ enum AVPixelFormat pix_fmt; -+ -+ /** -+ * Hardware accelerated codec capabilities. -+ * see AV_HWACCEL_CODEC_CAP_* -+ */ -+ int capabilities; -+ -+ /***************************************************************** -+ * No fields below this line are part of the public API. They -+ * may not be used outside of libavcodec and can be changed and -+ * removed at will. -+ * New public fields should be added right above. -+ ***************************************************************** -+ */ -+ -+ /** -+ * Allocate a custom buffer -+ */ -+ int (*alloc_frame)(AVCodecContext *avctx, AVFrame *frame); -+ -+ /** -+ * Called at the beginning of each frame or field picture. -+ * -+ * Meaningful frame information (codec specific) is guaranteed to -+ * be parsed at this point. This function is mandatory. -+ * -+ * Note that buf can be NULL along with buf_size set to 0. -+ * Otherwise, this means the whole frame is available at this point. -+ * -+ * @param avctx the codec context -+ * @param buf the frame data buffer base -+ * @param buf_size the size of the frame in bytes -+ * @return zero if successful, a negative value otherwise -+ */ -+ int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); -+ -+ /** -+ * Callback for parameter data (SPS/PPS/VPS etc). -+ * -+ * Useful for hardware decoders which keep persistent state about the -+ * video parameters, and need to receive any changes to update that state. -+ * -+ * @param avctx the codec context -+ * @param type the nal unit type -+ * @param buf the nal unit data buffer -+ * @param buf_size the size of the nal unit in bytes -+ * @return zero if successful, a negative value otherwise -+ */ -+ int (*decode_params)(AVCodecContext *avctx, int type, const uint8_t *buf, uint32_t buf_size); -+ -+ /** -+ * Callback for each slice. -+ * -+ * Meaningful slice information (codec specific) is guaranteed to -+ * be parsed at this point. This function is mandatory. -+ * The only exception is XvMC, that works on MB level. -+ * -+ * @param avctx the codec context -+ * @param buf the slice data buffer base -+ * @param buf_size the size of the slice in bytes -+ * @return zero if successful, a negative value otherwise -+ */ -+ int (*decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); -+ -+ /** -+ * Called at the end of each frame or field picture. -+ * -+ * The whole picture is parsed at this point and can now be sent -+ * to the hardware accelerator. This function is mandatory. -+ * -+ * @param avctx the codec context -+ * @return zero if successful, a negative value otherwise -+ */ -+ int (*end_frame)(AVCodecContext *avctx); -+ -+ /** -+ * Size of per-frame hardware accelerator private data. -+ * -+ * Private data is allocated with av_mallocz() before -+ * AVCodecContext.get_buffer() and deallocated after -+ * AVCodecContext.release_buffer(). -+ */ -+ int frame_priv_data_size; -+ -+ /** -+ * Called for every Macroblock in a slice. -+ * -+ * XvMC uses it to replace the ff_mpv_reconstruct_mb(). -+ * Instead of decoding to raw picture, MB parameters are -+ * stored in an array provided by the video driver. -+ * -+ * @param s the mpeg context -+ */ -+ void (*decode_mb)(struct MpegEncContext *s); -+ -+ /** -+ * Initialize the hwaccel private data. -+ * -+ * This will be called from ff_get_format(), after hwaccel and -+ * hwaccel_context are set and the hwaccel private data in AVCodecInternal -+ * is allocated. -+ */ -+ int (*init)(AVCodecContext *avctx); -+ -+ /** -+ * Uninitialize the hwaccel private data. -+ * -+ * This will be called from get_format() or avcodec_close(), after hwaccel -+ * and hwaccel_context are already uninitialized. -+ */ -+ int (*uninit)(AVCodecContext *avctx); -+ -+ /** -+ * Size of the private data to allocate in -+ * AVCodecInternal.hwaccel_priv_data. -+ */ -+ int priv_data_size; -+ -+ /** -+ * Internal hwaccel capabilities. -+ */ -+ int caps_internal; -+ -+ /** -+ * Fill the given hw_frames context with current codec parameters. Called -+ * from get_format. Refer to avcodec_get_hw_frames_parameters() for -+ * details. -+ * -+ * This CAN be called before AVHWAccel.init is called, and you must assume -+ * that avctx->hwaccel_priv_data is invalid. -+ */ -+ int (*frame_params)(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx); -+} AVHWAccel; -+ -+/** -+ * HWAccel is experimental and is thus avoided in favor of non experimental -+ * codecs -+ */ -+#define AV_HWACCEL_CODEC_CAP_EXPERIMENTAL 0x0200 -+ -+/** -+ * Hardware acceleration should be used for decoding even if the codec level -+ * used is unknown or higher than the maximum supported level reported by the -+ * hardware driver. -+ * -+ * It's generally a good idea to pass this flag unless you have a specific -+ * reason not to, as hardware tends to under-report supported levels. -+ */ -+#define AV_HWACCEL_FLAG_IGNORE_LEVEL (1 << 0) -+ -+/** -+ * Hardware acceleration can output YUV pixel formats with a different chroma -+ * sampling than 4:2:0 and/or other than 8 bits per component. -+ */ -+#define AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH (1 << 1) -+ -+/** -+ * Hardware acceleration should still be attempted for decoding when the -+ * codec profile does not match the reported capabilities of the hardware. -+ * -+ * For example, this can be used to try to decode baseline profile H.264 -+ * streams in hardware - it will often succeed, because many streams marked -+ * as baseline profile actually conform to constrained baseline profile. -+ * -+ * @warning If the stream is actually not supported then the behaviour is -+ * undefined, and may include returning entirely incorrect output -+ * while indicating success. -+ */ -+#define AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH (1 << 2) -+ -+/** -+ * @} -+ */ -+ -+#if FF_API_AVPICTURE -+/** -+ * @defgroup lavc_picture AVPicture -+ * -+ * Functions for working with AVPicture -+ * @{ -+ */ -+ -+/** -+ * Picture data structure. -+ * -+ * Up to four components can be stored into it, the last component is -+ * alpha. -+ * @deprecated use AVFrame or imgutils functions instead -+ */ -+typedef struct AVPicture { -+ attribute_deprecated -+ uint8_t *data[AV_NUM_DATA_POINTERS]; ///< pointers to the image data planes -+ attribute_deprecated -+ int linesize[AV_NUM_DATA_POINTERS]; ///< number of bytes per line -+} AVPicture; -+ -+/** -+ * @} -+ */ -+#endif -+ -+enum AVSubtitleType { -+ SUBTITLE_NONE, -+ -+ SUBTITLE_BITMAP, ///< A bitmap, pict will be set -+ -+ /** -+ * Plain text, the text field must be set by the decoder and is -+ * authoritative. ass and pict fields may contain approximations. -+ */ -+ SUBTITLE_TEXT, -+ -+ /** -+ * Formatted text, the ass field must be set by the decoder and is -+ * authoritative. pict and text fields may contain approximations. -+ */ -+ SUBTITLE_ASS, -+}; -+ -+#define AV_SUBTITLE_FLAG_FORCED 0x00000001 -+ -+typedef struct AVSubtitleRect { -+ int x; ///< top left corner of pict, undefined when pict is not set -+ int y; ///< top left corner of pict, undefined when pict is not set -+ int w; ///< width of pict, undefined when pict is not set -+ int h; ///< height of pict, undefined when pict is not set -+ int nb_colors; ///< number of colors in pict, undefined when pict is not set -+ -+#if FF_API_AVPICTURE -+ /** -+ * @deprecated unused -+ */ -+ attribute_deprecated -+ AVPicture pict; -+#endif -+ /** -+ * data+linesize for the bitmap of this subtitle. -+ * Can be set for text/ass as well once they are rendered. -+ */ -+ uint8_t *data[4]; -+ int linesize[4]; -+ -+ enum AVSubtitleType type; -+ -+ char *text; ///< 0 terminated plain UTF-8 text -+ -+ /** -+ * 0 terminated ASS/SSA compatible event line. -+ * The presentation of this is unaffected by the other values in this -+ * struct. -+ */ -+ char *ass; -+ -+ int flags; -+} AVSubtitleRect; -+ -+typedef struct AVSubtitle { -+ uint16_t format; /* 0 = graphics */ -+ uint32_t start_display_time; /* relative to packet pts, in ms */ -+ uint32_t end_display_time; /* relative to packet pts, in ms */ -+ unsigned num_rects; -+ AVSubtitleRect **rects; -+ int64_t pts; ///< Same as packet pts, in AV_TIME_BASE -+} AVSubtitle; -+ -+/** -+ * This struct describes the properties of an encoded stream. -+ * -+ * sizeof(AVCodecParameters) is not a part of the public ABI, this struct must -+ * be allocated with avcodec_parameters_alloc() and freed with -+ * avcodec_parameters_free(). -+ */ -+typedef struct AVCodecParameters { -+ /** -+ * General type of the encoded data. -+ */ -+ enum AVMediaType codec_type; -+ /** -+ * Specific type of the encoded data (the codec used). -+ */ -+ enum AVCodecID codec_id; -+ /** -+ * Additional information about the codec (corresponds to the AVI FOURCC). -+ */ -+ uint32_t codec_tag; -+ -+ /** -+ * Extra binary data needed for initializing the decoder, codec-dependent. -+ * -+ * Must be allocated with av_malloc() and will be freed by -+ * avcodec_parameters_free(). The allocated size of extradata must be at -+ * least extradata_size + AV_INPUT_BUFFER_PADDING_SIZE, with the padding -+ * bytes zeroed. -+ */ -+ uint8_t *extradata; -+ /** -+ * Size of the extradata content in bytes. -+ */ -+ int extradata_size; -+ -+ /** -+ * - video: the pixel format, the value corresponds to enum AVPixelFormat. -+ * - audio: the sample format, the value corresponds to enum AVSampleFormat. -+ */ -+ int format; -+ -+ /** -+ * The average bitrate of the encoded data (in bits per second). -+ */ -+ int64_t bit_rate; -+ -+ /** -+ * The number of bits per sample in the codedwords. -+ * -+ * This is basically the bitrate per sample. It is mandatory for a bunch of -+ * formats to actually decode them. It's the number of bits for one sample in -+ * the actual coded bitstream. -+ * -+ * This could be for example 4 for ADPCM -+ * For PCM formats this matches bits_per_raw_sample -+ * Can be 0 -+ */ -+ int bits_per_coded_sample; -+ -+ /** -+ * This is the number of valid bits in each output sample. If the -+ * sample format has more bits, the least significant bits are additional -+ * padding bits, which are always 0. Use right shifts to reduce the sample -+ * to its actual size. For example, audio formats with 24 bit samples will -+ * have bits_per_raw_sample set to 24, and format set to AV_SAMPLE_FMT_S32. -+ * To get the original sample use "(int32_t)sample >> 8"." -+ * -+ * For ADPCM this might be 12 or 16 or similar -+ * Can be 0 -+ */ -+ int bits_per_raw_sample; -+ -+ /** -+ * Codec-specific bitstream restrictions that the stream conforms to. -+ */ -+ int profile; -+ int level; -+ -+ /** -+ * Video only. The dimensions of the video frame in pixels. -+ */ -+ int width; -+ int height; -+ -+ /** -+ * Video only. The aspect ratio (width / height) which a single pixel -+ * should have when displayed. -+ * -+ * When the aspect ratio is unknown / undefined, the numerator should be -+ * set to 0 (the denominator may have any value). -+ */ -+ AVRational sample_aspect_ratio; -+ -+ /** -+ * Video only. The order of the fields in interlaced video. -+ */ -+ enum AVFieldOrder field_order; -+ -+ /** -+ * Video only. Additional colorspace characteristics. -+ */ -+ enum AVColorRange color_range; -+ enum AVColorPrimaries color_primaries; -+ enum AVColorTransferCharacteristic color_trc; -+ enum AVColorSpace color_space; -+ enum AVChromaLocation chroma_location; -+ -+ /** -+ * Video only. Number of delayed frames. -+ */ -+ int video_delay; -+ -+ /** -+ * Audio only. The channel layout bitmask. May be 0 if the channel layout is -+ * unknown or unspecified, otherwise the number of bits set must be equal to -+ * the channels field. -+ */ -+ uint64_t channel_layout; -+ /** -+ * Audio only. The number of audio channels. -+ */ -+ int channels; -+ /** -+ * Audio only. The number of audio samples per second. -+ */ -+ int sample_rate; -+ /** -+ * Audio only. The number of bytes per coded audio frame, required by some -+ * formats. -+ * -+ * Corresponds to nBlockAlign in WAVEFORMATEX. -+ */ -+ int block_align; -+ /** -+ * Audio only. Audio frame size, if known. Required by some formats to be static. -+ */ -+ int frame_size; -+ -+ /** -+ * Audio only. The amount of padding (in samples) inserted by the encoder at -+ * the beginning of the audio. I.e. this number of leading decoded samples -+ * must be discarded by the caller to get the original audio without leading -+ * padding. -+ */ -+ int initial_padding; -+ /** -+ * Audio only. The amount of padding (in samples) appended by the encoder to -+ * the end of the audio. I.e. this number of decoded samples must be -+ * discarded by the caller from the end of the stream to get the original -+ * audio without any trailing padding. -+ */ -+ int trailing_padding; -+ /** -+ * Audio only. Number of samples to skip after a discontinuity. -+ */ -+ int seek_preroll; -+} AVCodecParameters; -+ -+/** -+ * Iterate over all registered codecs. -+ * -+ * @param opaque a pointer where libavcodec will store the iteration state. Must -+ * point to NULL to start the iteration. -+ * -+ * @return the next registered codec or NULL when the iteration is -+ * finished -+ */ -+const AVCodec *av_codec_iterate(void **opaque); -+ -+#if FF_API_NEXT -+/** -+ * If c is NULL, returns the first registered codec, -+ * if c is non-NULL, returns the next registered codec after c, -+ * or NULL if c is the last one. -+ */ -+attribute_deprecated -+AVCodec *av_codec_next(const AVCodec *c); -+#endif -+ -+/** -+ * Return the LIBAVCODEC_VERSION_INT constant. -+ */ -+unsigned avcodec_version(void); -+ -+/** -+ * Return the libavcodec build-time configuration. -+ */ -+const char *avcodec_configuration(void); -+ -+/** -+ * Return the libavcodec license. -+ */ -+const char *avcodec_license(void); -+ -+#if FF_API_NEXT -+/** -+ * Register the codec codec and initialize libavcodec. -+ * -+ * @warning either this function or avcodec_register_all() must be called -+ * before any other libavcodec functions. -+ * -+ * @see avcodec_register_all() -+ */ -+attribute_deprecated -+void avcodec_register(AVCodec *codec); -+ -+/** -+ * Register all the codecs, parsers and bitstream filters which were enabled at -+ * configuration time. If you do not call this function you can select exactly -+ * which formats you want to support, by using the individual registration -+ * functions. -+ * -+ * @see avcodec_register -+ * @see av_register_codec_parser -+ * @see av_register_bitstream_filter -+ */ -+attribute_deprecated -+void avcodec_register_all(void); -+#endif -+ -+/** -+ * Allocate an AVCodecContext and set its fields to default values. The -+ * resulting struct should be freed with avcodec_free_context(). -+ * -+ * @param codec if non-NULL, allocate private data and initialize defaults -+ * for the given codec. It is illegal to then call avcodec_open2() -+ * with a different codec. -+ * If NULL, then the codec-specific defaults won't be initialized, -+ * which may result in suboptimal default settings (this is -+ * important mainly for encoders, e.g. libx264). -+ * -+ * @return An AVCodecContext filled with default values or NULL on failure. -+ */ -+AVCodecContext *avcodec_alloc_context3(const AVCodec *codec); -+ -+/** -+ * Free the codec context and everything associated with it and write NULL to -+ * the provided pointer. -+ */ -+void avcodec_free_context(AVCodecContext **avctx); -+ -+#if FF_API_GET_CONTEXT_DEFAULTS -+/** -+ * @deprecated This function should not be used, as closing and opening a codec -+ * context multiple time is not supported. A new codec context should be -+ * allocated for each new use. -+ */ -+int avcodec_get_context_defaults3(AVCodecContext *s, const AVCodec *codec); -+#endif -+ -+/** -+ * Get the AVClass for AVCodecContext. It can be used in combination with -+ * AV_OPT_SEARCH_FAKE_OBJ for examining options. -+ * -+ * @see av_opt_find(). -+ */ -+const AVClass *avcodec_get_class(void); -+ -+#if FF_API_COPY_CONTEXT -+/** -+ * Get the AVClass for AVFrame. It can be used in combination with -+ * AV_OPT_SEARCH_FAKE_OBJ for examining options. -+ * -+ * @see av_opt_find(). -+ */ -+const AVClass *avcodec_get_frame_class(void); -+ -+/** -+ * Get the AVClass for AVSubtitleRect. It can be used in combination with -+ * AV_OPT_SEARCH_FAKE_OBJ for examining options. -+ * -+ * @see av_opt_find(). -+ */ -+const AVClass *avcodec_get_subtitle_rect_class(void); -+ -+/** -+ * Copy the settings of the source AVCodecContext into the destination -+ * AVCodecContext. The resulting destination codec context will be -+ * unopened, i.e. you are required to call avcodec_open2() before you -+ * can use this AVCodecContext to decode/encode video/audio data. -+ * -+ * @param dest target codec context, should be initialized with -+ * avcodec_alloc_context3(NULL), but otherwise uninitialized -+ * @param src source codec context -+ * @return AVERROR() on error (e.g. memory allocation error), 0 on success -+ * -+ * @deprecated The semantics of this function are ill-defined and it should not -+ * be used. If you need to transfer the stream parameters from one codec context -+ * to another, use an intermediate AVCodecParameters instance and the -+ * avcodec_parameters_from_context() / avcodec_parameters_to_context() -+ * functions. -+ */ -+attribute_deprecated -+int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src); -+#endif -+ -+/** -+ * Allocate a new AVCodecParameters and set its fields to default values -+ * (unknown/invalid/0). The returned struct must be freed with -+ * avcodec_parameters_free(). -+ */ -+AVCodecParameters *avcodec_parameters_alloc(void); -+ -+/** -+ * Free an AVCodecParameters instance and everything associated with it and -+ * write NULL to the supplied pointer. -+ */ -+void avcodec_parameters_free(AVCodecParameters **par); -+ -+/** -+ * Copy the contents of src to dst. Any allocated fields in dst are freed and -+ * replaced with newly allocated duplicates of the corresponding fields in src. -+ * -+ * @return >= 0 on success, a negative AVERROR code on failure. -+ */ -+int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src); -+ -+/** -+ * Fill the parameters struct based on the values from the supplied codec -+ * context. Any allocated fields in par are freed and replaced with duplicates -+ * of the corresponding fields in codec. -+ * -+ * @return >= 0 on success, a negative AVERROR code on failure -+ */ -+int avcodec_parameters_from_context(AVCodecParameters *par, -+ const AVCodecContext *codec); -+ -+/** -+ * Fill the codec context based on the values from the supplied codec -+ * parameters. Any allocated fields in codec that have a corresponding field in -+ * par are freed and replaced with duplicates of the corresponding field in par. -+ * Fields in codec that do not have a counterpart in par are not touched. -+ * -+ * @return >= 0 on success, a negative AVERROR code on failure. -+ */ -+int avcodec_parameters_to_context(AVCodecContext *codec, -+ const AVCodecParameters *par); -+ -+/** -+ * Initialize the AVCodecContext to use the given AVCodec. Prior to using this -+ * function the context has to be allocated with avcodec_alloc_context3(). -+ * -+ * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(), -+ * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for -+ * retrieving a codec. -+ * -+ * @warning This function is not thread safe! -+ * -+ * @note Always call this function before using decoding routines (such as -+ * @ref avcodec_receive_frame()). -+ * -+ * @code -+ * avcodec_register_all(); -+ * av_dict_set(&opts, "b", "2.5M", 0); -+ * codec = avcodec_find_decoder(AV_CODEC_ID_H264); -+ * if (!codec) -+ * exit(1); -+ * -+ * context = avcodec_alloc_context3(codec); -+ * -+ * if (avcodec_open2(context, codec, opts) < 0) -+ * exit(1); -+ * @endcode -+ * -+ * @param avctx The context to initialize. -+ * @param codec The codec to open this context for. If a non-NULL codec has been -+ * previously passed to avcodec_alloc_context3() or -+ * for this context, then this parameter MUST be either NULL or -+ * equal to the previously passed codec. -+ * @param options A dictionary filled with AVCodecContext and codec-private options. -+ * On return this object will be filled with options that were not found. -+ * -+ * @return zero on success, a negative value on error -+ * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(), -+ * av_dict_set(), av_opt_find(). -+ */ -+int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options); -+ -+/** -+ * Close a given AVCodecContext and free all the data associated with it -+ * (but not the AVCodecContext itself). -+ * -+ * Calling this function on an AVCodecContext that hasn't been opened will free -+ * the codec-specific data allocated in avcodec_alloc_context3() with a non-NULL -+ * codec. Subsequent calls will do nothing. -+ * -+ * @note Do not use this function. Use avcodec_free_context() to destroy a -+ * codec context (either open or closed). Opening and closing a codec context -+ * multiple times is not supported anymore -- use multiple codec contexts -+ * instead. -+ */ -+int avcodec_close(AVCodecContext *avctx); -+ -+/** -+ * Free all allocated data in the given subtitle struct. -+ * -+ * @param sub AVSubtitle to free. -+ */ -+void avsubtitle_free(AVSubtitle *sub); -+ -+/** -+ * @} -+ */ -+ -+/** -+ * @addtogroup lavc_packet -+ * @{ -+ */ -+ -+/** -+ * Allocate an AVPacket and set its fields to default values. The resulting -+ * struct must be freed using av_packet_free(). -+ * -+ * @return An AVPacket filled with default values or NULL on failure. -+ * -+ * @note this only allocates the AVPacket itself, not the data buffers. Those -+ * must be allocated through other means such as av_new_packet. -+ * -+ * @see av_new_packet -+ */ -+AVPacket *av_packet_alloc(void); -+ -+/** -+ * Create a new packet that references the same data as src. -+ * -+ * This is a shortcut for av_packet_alloc()+av_packet_ref(). -+ * -+ * @return newly created AVPacket on success, NULL on error. -+ * -+ * @see av_packet_alloc -+ * @see av_packet_ref -+ */ -+AVPacket *av_packet_clone(const AVPacket *src); -+ -+/** -+ * Free the packet, if the packet is reference counted, it will be -+ * unreferenced first. -+ * -+ * @param pkt packet to be freed. The pointer will be set to NULL. -+ * @note passing NULL is a no-op. -+ */ -+void av_packet_free(AVPacket **pkt); -+ -+/** -+ * Initialize optional fields of a packet with default values. -+ * -+ * Note, this does not touch the data and size members, which have to be -+ * initialized separately. -+ * -+ * @param pkt packet -+ */ -+void av_init_packet(AVPacket *pkt); -+ -+/** -+ * Allocate the payload of a packet and initialize its fields with -+ * default values. -+ * -+ * @param pkt packet -+ * @param size wanted payload size -+ * @return 0 if OK, AVERROR_xxx otherwise -+ */ -+int av_new_packet(AVPacket *pkt, int size); -+ -+/** -+ * Reduce packet size, correctly zeroing padding -+ * -+ * @param pkt packet -+ * @param size new size -+ */ -+void av_shrink_packet(AVPacket *pkt, int size); -+ -+/** -+ * Increase packet size, correctly zeroing padding -+ * -+ * @param pkt packet -+ * @param grow_by number of bytes by which to increase the size of the packet -+ */ -+int av_grow_packet(AVPacket *pkt, int grow_by); -+ -+/** -+ * Initialize a reference-counted packet from av_malloc()ed data. -+ * -+ * @param pkt packet to be initialized. This function will set the data, size, -+ * buf and destruct fields, all others are left untouched. -+ * @param data Data allocated by av_malloc() to be used as packet data. If this -+ * function returns successfully, the data is owned by the underlying AVBuffer. -+ * The caller may not access the data through other means. -+ * @param size size of data in bytes, without the padding. I.e. the full buffer -+ * size is assumed to be size + AV_INPUT_BUFFER_PADDING_SIZE. -+ * -+ * @return 0 on success, a negative AVERROR on error -+ */ -+int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size); -+ -+#if FF_API_AVPACKET_OLD_API -+/** -+ * @warning This is a hack - the packet memory allocation stuff is broken. The -+ * packet is allocated if it was not really allocated. -+ * -+ * @deprecated Use av_packet_ref or av_packet_make_refcounted -+ */ -+attribute_deprecated -+int av_dup_packet(AVPacket *pkt); -+/** -+ * Copy packet, including contents -+ * -+ * @return 0 on success, negative AVERROR on fail -+ * -+ * @deprecated Use av_packet_ref -+ */ -+attribute_deprecated -+int av_copy_packet(AVPacket *dst, const AVPacket *src); -+ -+/** -+ * Copy packet side data -+ * -+ * @return 0 on success, negative AVERROR on fail -+ * -+ * @deprecated Use av_packet_copy_props -+ */ -+attribute_deprecated -+int av_copy_packet_side_data(AVPacket *dst, const AVPacket *src); -+ -+/** -+ * Free a packet. -+ * -+ * @deprecated Use av_packet_unref -+ * -+ * @param pkt packet to free -+ */ -+attribute_deprecated -+void av_free_packet(AVPacket *pkt); -+#endif -+/** -+ * Allocate new information of a packet. -+ * -+ * @param pkt packet -+ * @param type side information type -+ * @param size side information size -+ * @return pointer to fresh allocated data or NULL otherwise -+ */ -+uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, -+ int size); -+ -+/** -+ * Wrap an existing array as a packet side data. -+ * -+ * @param pkt packet -+ * @param type side information type -+ * @param data the side data array. It must be allocated with the av_malloc() -+ * family of functions. The ownership of the data is transferred to -+ * pkt. -+ * @param size side information size -+ * @return a non-negative number on success, a negative AVERROR code on -+ * failure. On failure, the packet is unchanged and the data remains -+ * owned by the caller. -+ */ -+int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type, -+ uint8_t *data, size_t size); -+ -+/** -+ * Shrink the already allocated side data buffer -+ * -+ * @param pkt packet -+ * @param type side information type -+ * @param size new side information size -+ * @return 0 on success, < 0 on failure -+ */ -+int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type, -+ int size); -+ -+/** -+ * Get side information from packet. -+ * -+ * @param pkt packet -+ * @param type desired side information type -+ * @param size pointer for side information size to store (optional) -+ * @return pointer to data if present or NULL otherwise -+ */ -+uint8_t* av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, -+ int *size); -+ -+#if FF_API_MERGE_SD_API -+attribute_deprecated -+int av_packet_merge_side_data(AVPacket *pkt); -+ -+attribute_deprecated -+int av_packet_split_side_data(AVPacket *pkt); -+#endif -+ -+const char *av_packet_side_data_name(enum AVPacketSideDataType type); -+ -+/** -+ * Pack a dictionary for use in side_data. -+ * -+ * @param dict The dictionary to pack. -+ * @param size pointer to store the size of the returned data -+ * @return pointer to data if successful, NULL otherwise -+ */ -+uint8_t *av_packet_pack_dictionary(AVDictionary *dict, int *size); -+/** -+ * Unpack a dictionary from side_data. -+ * -+ * @param data data from side_data -+ * @param size size of the data -+ * @param dict the metadata storage dictionary -+ * @return 0 on success, < 0 on failure -+ */ -+int av_packet_unpack_dictionary(const uint8_t *data, int size, AVDictionary **dict); -+ -+ -+/** -+ * Convenience function to free all the side data stored. -+ * All the other fields stay untouched. -+ * -+ * @param pkt packet -+ */ -+void av_packet_free_side_data(AVPacket *pkt); -+ -+/** -+ * Setup a new reference to the data described by a given packet -+ * -+ * If src is reference-counted, setup dst as a new reference to the -+ * buffer in src. Otherwise allocate a new buffer in dst and copy the -+ * data from src into it. -+ * -+ * All the other fields are copied from src. -+ * -+ * @see av_packet_unref -+ * -+ * @param dst Destination packet -+ * @param src Source packet -+ * -+ * @return 0 on success, a negative AVERROR on error. -+ */ -+int av_packet_ref(AVPacket *dst, const AVPacket *src); -+ -+/** -+ * Wipe the packet. -+ * -+ * Unreference the buffer referenced by the packet and reset the -+ * remaining packet fields to their default values. -+ * -+ * @param pkt The packet to be unreferenced. -+ */ -+void av_packet_unref(AVPacket *pkt); -+ -+/** -+ * Move every field in src to dst and reset src. -+ * -+ * @see av_packet_unref -+ * -+ * @param src Source packet, will be reset -+ * @param dst Destination packet -+ */ -+void av_packet_move_ref(AVPacket *dst, AVPacket *src); -+ -+/** -+ * Copy only "properties" fields from src to dst. -+ * -+ * Properties for the purpose of this function are all the fields -+ * beside those related to the packet data (buf, data, size) -+ * -+ * @param dst Destination packet -+ * @param src Source packet -+ * -+ * @return 0 on success AVERROR on failure. -+ */ -+int av_packet_copy_props(AVPacket *dst, const AVPacket *src); -+ -+/** -+ * Ensure the data described by a given packet is reference counted. -+ * -+ * @note This function does not ensure that the reference will be writable. -+ * Use av_packet_make_writable instead for that purpose. -+ * -+ * @see av_packet_ref -+ * @see av_packet_make_writable -+ * -+ * @param pkt packet whose data should be made reference counted. -+ * -+ * @return 0 on success, a negative AVERROR on error. On failure, the -+ * packet is unchanged. -+ */ -+int av_packet_make_refcounted(AVPacket *pkt); -+ -+/** -+ * Create a writable reference for the data described by a given packet, -+ * avoiding data copy if possible. -+ * -+ * @param pkt Packet whose data should be made writable. -+ * -+ * @return 0 on success, a negative AVERROR on failure. On failure, the -+ * packet is unchanged. -+ */ -+int av_packet_make_writable(AVPacket *pkt); -+ -+/** -+ * Convert valid timing fields (timestamps / durations) in a packet from one -+ * timebase to another. Timestamps with unknown values (AV_NOPTS_VALUE) will be -+ * ignored. -+ * -+ * @param pkt packet on which the conversion will be performed -+ * @param tb_src source timebase, in which the timing fields in pkt are -+ * expressed -+ * @param tb_dst destination timebase, to which the timing fields will be -+ * converted -+ */ -+void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst); -+ -+/** -+ * @} -+ */ -+ -+/** -+ * @addtogroup lavc_decoding -+ * @{ -+ */ -+ -+/** -+ * Find a registered decoder with a matching codec ID. -+ * -+ * @param id AVCodecID of the requested decoder -+ * @return A decoder if one was found, NULL otherwise. -+ */ -+AVCodec *avcodec_find_decoder(enum AVCodecID id); -+ -+/** -+ * Find a registered decoder with the specified name. -+ * -+ * @param name name of the requested decoder -+ * @return A decoder if one was found, NULL otherwise. -+ */ -+AVCodec *avcodec_find_decoder_by_name(const char *name); -+ -+/** -+ * The default callback for AVCodecContext.get_buffer2(). It is made public so -+ * it can be called by custom get_buffer2() implementations for decoders without -+ * AV_CODEC_CAP_DR1 set. -+ */ -+int avcodec_default_get_buffer2(AVCodecContext *s, AVFrame *frame, int flags); -+ -+/** -+ * Modify width and height values so that they will result in a memory -+ * buffer that is acceptable for the codec if you do not use any horizontal -+ * padding. -+ * -+ * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened. -+ */ -+void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height); -+ -+/** -+ * Modify width and height values so that they will result in a memory -+ * buffer that is acceptable for the codec if you also ensure that all -+ * line sizes are a multiple of the respective linesize_align[i]. -+ * -+ * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened. -+ */ -+void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, -+ int linesize_align[AV_NUM_DATA_POINTERS]); -+ -+/** -+ * Converts AVChromaLocation to swscale x/y chroma position. -+ * -+ * The positions represent the chroma (0,0) position in a coordinates system -+ * with luma (0,0) representing the origin and luma(1,1) representing 256,256 -+ * -+ * @param xpos horizontal chroma sample position -+ * @param ypos vertical chroma sample position -+ */ -+int avcodec_enum_to_chroma_pos(int *xpos, int *ypos, enum AVChromaLocation pos); -+ -+/** -+ * Converts swscale x/y chroma position to AVChromaLocation. -+ * -+ * The positions represent the chroma (0,0) position in a coordinates system -+ * with luma (0,0) representing the origin and luma(1,1) representing 256,256 -+ * -+ * @param xpos horizontal chroma sample position -+ * @param ypos vertical chroma sample position -+ */ -+enum AVChromaLocation avcodec_chroma_pos_to_enum(int xpos, int ypos); -+ -+/** -+ * Decode the audio frame of size avpkt->size from avpkt->data into frame. -+ * -+ * Some decoders may support multiple frames in a single AVPacket. Such -+ * decoders would then just decode the first frame and the return value would be -+ * less than the packet size. In this case, avcodec_decode_audio4 has to be -+ * called again with an AVPacket containing the remaining data in order to -+ * decode the second frame, etc... Even if no frames are returned, the packet -+ * needs to be fed to the decoder with remaining data until it is completely -+ * consumed or an error occurs. -+ * -+ * Some decoders (those marked with AV_CODEC_CAP_DELAY) have a delay between input -+ * and output. This means that for some packets they will not immediately -+ * produce decoded output and need to be flushed at the end of decoding to get -+ * all the decoded data. Flushing is done by calling this function with packets -+ * with avpkt->data set to NULL and avpkt->size set to 0 until it stops -+ * returning samples. It is safe to flush even those decoders that are not -+ * marked with AV_CODEC_CAP_DELAY, then no samples will be returned. -+ * -+ * @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE -+ * larger than the actual read bytes because some optimized bitstream -+ * readers read 32 or 64 bits at once and could read over the end. -+ * -+ * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() -+ * before packets may be fed to the decoder. -+ * -+ * @param avctx the codec context -+ * @param[out] frame The AVFrame in which to store decoded audio samples. -+ * The decoder will allocate a buffer for the decoded frame by -+ * calling the AVCodecContext.get_buffer2() callback. -+ * When AVCodecContext.refcounted_frames is set to 1, the frame is -+ * reference counted and the returned reference belongs to the -+ * caller. The caller must release the frame using av_frame_unref() -+ * when the frame is no longer needed. The caller may safely write -+ * to the frame if av_frame_is_writable() returns 1. -+ * When AVCodecContext.refcounted_frames is set to 0, the returned -+ * reference belongs to the decoder and is valid only until the -+ * next call to this function or until closing or flushing the -+ * decoder. The caller may not write to it. -+ * @param[out] got_frame_ptr Zero if no frame could be decoded, otherwise it is -+ * non-zero. Note that this field being set to zero -+ * does not mean that an error has occurred. For -+ * decoders with AV_CODEC_CAP_DELAY set, no given decode -+ * call is guaranteed to produce a frame. -+ * @param[in] avpkt The input AVPacket containing the input buffer. -+ * At least avpkt->data and avpkt->size should be set. Some -+ * decoders might also require additional fields to be set. -+ * @return A negative error code is returned if an error occurred during -+ * decoding, otherwise the number of bytes consumed from the input -+ * AVPacket is returned. -+ * -+* @deprecated Use avcodec_send_packet() and avcodec_receive_frame(). -+ */ -+attribute_deprecated -+int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, -+ int *got_frame_ptr, const AVPacket *avpkt); -+ -+/** -+ * Decode the video frame of size avpkt->size from avpkt->data into picture. -+ * Some decoders may support multiple frames in a single AVPacket, such -+ * decoders would then just decode the first frame. -+ * -+ * @warning The input buffer must be AV_INPUT_BUFFER_PADDING_SIZE larger than -+ * the actual read bytes because some optimized bitstream readers read 32 or 64 -+ * bits at once and could read over the end. -+ * -+ * @warning The end of the input buffer buf should be set to 0 to ensure that -+ * no overreading happens for damaged MPEG streams. -+ * -+ * @note Codecs which have the AV_CODEC_CAP_DELAY capability set have a delay -+ * between input and output, these need to be fed with avpkt->data=NULL, -+ * avpkt->size=0 at the end to return the remaining frames. -+ * -+ * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() -+ * before packets may be fed to the decoder. -+ * -+ * @param avctx the codec context -+ * @param[out] picture The AVFrame in which the decoded video frame will be stored. -+ * Use av_frame_alloc() to get an AVFrame. The codec will -+ * allocate memory for the actual bitmap by calling the -+ * AVCodecContext.get_buffer2() callback. -+ * When AVCodecContext.refcounted_frames is set to 1, the frame is -+ * reference counted and the returned reference belongs to the -+ * caller. The caller must release the frame using av_frame_unref() -+ * when the frame is no longer needed. The caller may safely write -+ * to the frame if av_frame_is_writable() returns 1. -+ * When AVCodecContext.refcounted_frames is set to 0, the returned -+ * reference belongs to the decoder and is valid only until the -+ * next call to this function or until closing or flushing the -+ * decoder. The caller may not write to it. -+ * -+ * @param[in] avpkt The input AVPacket containing the input buffer. -+ * You can create such packet with av_init_packet() and by then setting -+ * data and size, some decoders might in addition need other fields like -+ * flags&AV_PKT_FLAG_KEY. All decoders are designed to use the least -+ * fields possible. -+ * @param[in,out] got_picture_ptr Zero if no frame could be decompressed, otherwise, it is nonzero. -+ * @return On error a negative value is returned, otherwise the number of bytes -+ * used or zero if no frame could be decompressed. -+ * -+ * @deprecated Use avcodec_send_packet() and avcodec_receive_frame(). -+ */ -+attribute_deprecated -+int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, -+ int *got_picture_ptr, -+ const AVPacket *avpkt); -+ -+/** -+ * Decode a subtitle message. -+ * Return a negative value on error, otherwise return the number of bytes used. -+ * If no subtitle could be decompressed, got_sub_ptr is zero. -+ * Otherwise, the subtitle is stored in *sub. -+ * Note that AV_CODEC_CAP_DR1 is not available for subtitle codecs. This is for -+ * simplicity, because the performance difference is expect to be negligible -+ * and reusing a get_buffer written for video codecs would probably perform badly -+ * due to a potentially very different allocation pattern. -+ * -+ * Some decoders (those marked with AV_CODEC_CAP_DELAY) have a delay between input -+ * and output. This means that for some packets they will not immediately -+ * produce decoded output and need to be flushed at the end of decoding to get -+ * all the decoded data. Flushing is done by calling this function with packets -+ * with avpkt->data set to NULL and avpkt->size set to 0 until it stops -+ * returning subtitles. It is safe to flush even those decoders that are not -+ * marked with AV_CODEC_CAP_DELAY, then no subtitles will be returned. -+ * -+ * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() -+ * before packets may be fed to the decoder. -+ * -+ * @param avctx the codec context -+ * @param[out] sub The Preallocated AVSubtitle in which the decoded subtitle will be stored, -+ * must be freed with avsubtitle_free if *got_sub_ptr is set. -+ * @param[in,out] got_sub_ptr Zero if no subtitle could be decompressed, otherwise, it is nonzero. -+ * @param[in] avpkt The input AVPacket containing the input buffer. -+ */ -+int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, -+ int *got_sub_ptr, -+ AVPacket *avpkt); -+ -+/** -+ * Supply raw packet data as input to a decoder. -+ * -+ * Internally, this call will copy relevant AVCodecContext fields, which can -+ * influence decoding per-packet, and apply them when the packet is actually -+ * decoded. (For example AVCodecContext.skip_frame, which might direct the -+ * decoder to drop the frame contained by the packet sent with this function.) -+ * -+ * @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE -+ * larger than the actual read bytes because some optimized bitstream -+ * readers read 32 or 64 bits at once and could read over the end. -+ * -+ * @warning Do not mix this API with the legacy API (like avcodec_decode_video2()) -+ * on the same AVCodecContext. It will return unexpected results now -+ * or in future libavcodec versions. -+ * -+ * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() -+ * before packets may be fed to the decoder. -+ * -+ * @param avctx codec context -+ * @param[in] avpkt The input AVPacket. Usually, this will be a single video -+ * frame, or several complete audio frames. -+ * Ownership of the packet remains with the caller, and the -+ * decoder will not write to the packet. The decoder may create -+ * a reference to the packet data (or copy it if the packet is -+ * not reference-counted). -+ * Unlike with older APIs, the packet is always fully consumed, -+ * and if it contains multiple frames (e.g. some audio codecs), -+ * will require you to call avcodec_receive_frame() multiple -+ * times afterwards before you can send a new packet. -+ * It can be NULL (or an AVPacket with data set to NULL and -+ * size set to 0); in this case, it is considered a flush -+ * packet, which signals the end of the stream. Sending the -+ * first flush packet will return success. Subsequent ones are -+ * unnecessary and will return AVERROR_EOF. If the decoder -+ * still has frames buffered, it will return them after sending -+ * a flush packet. -+ * -+ * @return 0 on success, otherwise negative error code: -+ * AVERROR(EAGAIN): input is not accepted in the current state - user -+ * must read output with avcodec_receive_frame() (once -+ * all output is read, the packet should be resent, and -+ * the call will not fail with EAGAIN). -+ * AVERROR_EOF: the decoder has been flushed, and no new packets can -+ * be sent to it (also returned if more than 1 flush -+ * packet is sent) -+ * AVERROR(EINVAL): codec not opened, it is an encoder, or requires flush -+ * AVERROR(ENOMEM): failed to add packet to internal queue, or similar -+ * other errors: legitimate decoding errors -+ */ -+int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt); -+ -+/** -+ * Return decoded output data from a decoder. -+ * -+ * @param avctx codec context -+ * @param frame This will be set to a reference-counted video or audio -+ * frame (depending on the decoder type) allocated by the -+ * decoder. Note that the function will always call -+ * av_frame_unref(frame) before doing anything else. -+ * -+ * @return -+ * 0: success, a frame was returned -+ * AVERROR(EAGAIN): output is not available in this state - user must try -+ * to send new input -+ * AVERROR_EOF: the decoder has been fully flushed, and there will be -+ * no more output frames -+ * AVERROR(EINVAL): codec not opened, or it is an encoder -+ * other negative values: legitimate decoding errors -+ */ -+int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame); -+ -+/** -+ * Supply a raw video or audio frame to the encoder. Use avcodec_receive_packet() -+ * to retrieve buffered output packets. -+ * -+ * @param avctx codec context -+ * @param[in] frame AVFrame containing the raw audio or video frame to be encoded. -+ * Ownership of the frame remains with the caller, and the -+ * encoder will not write to the frame. The encoder may create -+ * a reference to the frame data (or copy it if the frame is -+ * not reference-counted). -+ * It can be NULL, in which case it is considered a flush -+ * packet. This signals the end of the stream. If the encoder -+ * still has packets buffered, it will return them after this -+ * call. Once flushing mode has been entered, additional flush -+ * packets are ignored, and sending frames will return -+ * AVERROR_EOF. -+ * -+ * For audio: -+ * If AV_CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame -+ * can have any number of samples. -+ * If it is not set, frame->nb_samples must be equal to -+ * avctx->frame_size for all frames except the last. -+ * The final frame may be smaller than avctx->frame_size. -+ * @return 0 on success, otherwise negative error code: -+ * AVERROR(EAGAIN): input is not accepted in the current state - user -+ * must read output with avcodec_receive_packet() (once -+ * all output is read, the packet should be resent, and -+ * the call will not fail with EAGAIN). -+ * AVERROR_EOF: the encoder has been flushed, and no new frames can -+ * be sent to it -+ * AVERROR(EINVAL): codec not opened, refcounted_frames not set, it is a -+ * decoder, or requires flush -+ * AVERROR(ENOMEM): failed to add packet to internal queue, or similar -+ * other errors: legitimate decoding errors -+ */ -+int avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame); -+ -+/** -+ * Read encoded data from the encoder. -+ * -+ * @param avctx codec context -+ * @param avpkt This will be set to a reference-counted packet allocated by the -+ * encoder. Note that the function will always call -+ * av_frame_unref(frame) before doing anything else. -+ * @return 0 on success, otherwise negative error code: -+ * AVERROR(EAGAIN): output is not available in the current state - user -+ * must try to send input -+ * AVERROR_EOF: the encoder has been fully flushed, and there will be -+ * no more output packets -+ * AVERROR(EINVAL): codec not opened, or it is an encoder -+ * other errors: legitimate decoding errors -+ */ -+int avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt); -+ -+/** -+ * Create and return a AVHWFramesContext with values adequate for hardware -+ * decoding. This is meant to get called from the get_format callback, and is -+ * a helper for preparing a AVHWFramesContext for AVCodecContext.hw_frames_ctx. -+ * This API is for decoding with certain hardware acceleration modes/APIs only. -+ * -+ * The returned AVHWFramesContext is not initialized. The caller must do this -+ * with av_hwframe_ctx_init(). -+ * -+ * Calling this function is not a requirement, but makes it simpler to avoid -+ * codec or hardware API specific details when manually allocating frames. -+ * -+ * Alternatively to this, an API user can set AVCodecContext.hw_device_ctx, -+ * which sets up AVCodecContext.hw_frames_ctx fully automatically, and makes -+ * it unnecessary to call this function or having to care about -+ * AVHWFramesContext initialization at all. -+ * -+ * There are a number of requirements for calling this function: -+ * -+ * - It must be called from get_format with the same avctx parameter that was -+ * passed to get_format. Calling it outside of get_format is not allowed, and -+ * can trigger undefined behavior. -+ * - The function is not always supported (see description of return values). -+ * Even if this function returns successfully, hwaccel initialization could -+ * fail later. (The degree to which implementations check whether the stream -+ * is actually supported varies. Some do this check only after the user's -+ * get_format callback returns.) -+ * - The hw_pix_fmt must be one of the choices suggested by get_format. If the -+ * user decides to use a AVHWFramesContext prepared with this API function, -+ * the user must return the same hw_pix_fmt from get_format. -+ * - The device_ref passed to this function must support the given hw_pix_fmt. -+ * - After calling this API function, it is the user's responsibility to -+ * initialize the AVHWFramesContext (returned by the out_frames_ref parameter), -+ * and to set AVCodecContext.hw_frames_ctx to it. If done, this must be done -+ * before returning from get_format (this is implied by the normal -+ * AVCodecContext.hw_frames_ctx API rules). -+ * - The AVHWFramesContext parameters may change every time time get_format is -+ * called. Also, AVCodecContext.hw_frames_ctx is reset before get_format. So -+ * you are inherently required to go through this process again on every -+ * get_format call. -+ * - It is perfectly possible to call this function without actually using -+ * the resulting AVHWFramesContext. One use-case might be trying to reuse a -+ * previously initialized AVHWFramesContext, and calling this API function -+ * only to test whether the required frame parameters have changed. -+ * - Fields that use dynamically allocated values of any kind must not be set -+ * by the user unless setting them is explicitly allowed by the documentation. -+ * If the user sets AVHWFramesContext.free and AVHWFramesContext.user_opaque, -+ * the new free callback must call the potentially set previous free callback. -+ * This API call may set any dynamically allocated fields, including the free -+ * callback. -+ * -+ * The function will set at least the following fields on AVHWFramesContext -+ * (potentially more, depending on hwaccel API): -+ * -+ * - All fields set by av_hwframe_ctx_alloc(). -+ * - Set the format field to hw_pix_fmt. -+ * - Set the sw_format field to the most suited and most versatile format. (An -+ * implication is that this will prefer generic formats over opaque formats -+ * with arbitrary restrictions, if possible.) -+ * - Set the width/height fields to the coded frame size, rounded up to the -+ * API-specific minimum alignment. -+ * - Only _if_ the hwaccel requires a pre-allocated pool: set the initial_pool_size -+ * field to the number of maximum reference surfaces possible with the codec, -+ * plus 1 surface for the user to work (meaning the user can safely reference -+ * at most 1 decoded surface at a time), plus additional buffering introduced -+ * by frame threading. If the hwaccel does not require pre-allocation, the -+ * field is left to 0, and the decoder will allocate new surfaces on demand -+ * during decoding. -+ * - Possibly AVHWFramesContext.hwctx fields, depending on the underlying -+ * hardware API. -+ * -+ * Essentially, out_frames_ref returns the same as av_hwframe_ctx_alloc(), but -+ * with basic frame parameters set. -+ * -+ * The function is stateless, and does not change the AVCodecContext or the -+ * device_ref AVHWDeviceContext. -+ * -+ * @param avctx The context which is currently calling get_format, and which -+ * implicitly contains all state needed for filling the returned -+ * AVHWFramesContext properly. -+ * @param device_ref A reference to the AVHWDeviceContext describing the device -+ * which will be used by the hardware decoder. -+ * @param hw_pix_fmt The hwaccel format you are going to return from get_format. -+ * @param out_frames_ref On success, set to a reference to an _uninitialized_ -+ * AVHWFramesContext, created from the given device_ref. -+ * Fields will be set to values required for decoding. -+ * Not changed if an error is returned. -+ * @return zero on success, a negative value on error. The following error codes -+ * have special semantics: -+ * AVERROR(ENOENT): the decoder does not support this functionality. Setup -+ * is always manual, or it is a decoder which does not -+ * support setting AVCodecContext.hw_frames_ctx at all, -+ * or it is a software format. -+ * AVERROR(EINVAL): it is known that hardware decoding is not supported for -+ * this configuration, or the device_ref is not supported -+ * for the hwaccel referenced by hw_pix_fmt. -+ */ -+int avcodec_get_hw_frames_parameters(AVCodecContext *avctx, -+ AVBufferRef *device_ref, -+ enum AVPixelFormat hw_pix_fmt, -+ AVBufferRef **out_frames_ref); -+ -+ -+ -+/** -+ * @defgroup lavc_parsing Frame parsing -+ * @{ -+ */ -+ -+enum AVPictureStructure { -+ AV_PICTURE_STRUCTURE_UNKNOWN, //< unknown -+ AV_PICTURE_STRUCTURE_TOP_FIELD, //< coded as top field -+ AV_PICTURE_STRUCTURE_BOTTOM_FIELD, //< coded as bottom field -+ AV_PICTURE_STRUCTURE_FRAME, //< coded as frame -+}; -+ -+typedef struct AVCodecParserContext { -+ void *priv_data; -+ struct AVCodecParser *parser; -+ int64_t frame_offset; /* offset of the current frame */ -+ int64_t cur_offset; /* current offset -+ (incremented by each av_parser_parse()) */ -+ int64_t next_frame_offset; /* offset of the next frame */ -+ /* video info */ -+ int pict_type; /* XXX: Put it back in AVCodecContext. */ -+ /** -+ * This field is used for proper frame duration computation in lavf. -+ * It signals, how much longer the frame duration of the current frame -+ * is compared to normal frame duration. -+ * -+ * frame_duration = (1 + repeat_pict) * time_base -+ * -+ * It is used by codecs like H.264 to display telecined material. -+ */ -+ int repeat_pict; /* XXX: Put it back in AVCodecContext. */ -+ int64_t pts; /* pts of the current frame */ -+ int64_t dts; /* dts of the current frame */ -+ -+ /* private data */ -+ int64_t last_pts; -+ int64_t last_dts; -+ int fetch_timestamp; -+ -+#define AV_PARSER_PTS_NB 4 -+ int cur_frame_start_index; -+ int64_t cur_frame_offset[AV_PARSER_PTS_NB]; -+ int64_t cur_frame_pts[AV_PARSER_PTS_NB]; -+ int64_t cur_frame_dts[AV_PARSER_PTS_NB]; -+ -+ int flags; -+#define PARSER_FLAG_COMPLETE_FRAMES 0x0001 -+#define PARSER_FLAG_ONCE 0x0002 -+/// Set if the parser has a valid file offset -+#define PARSER_FLAG_FETCHED_OFFSET 0x0004 -+#define PARSER_FLAG_USE_CODEC_TS 0x1000 -+ -+ int64_t offset; ///< byte offset from starting packet start -+ int64_t cur_frame_end[AV_PARSER_PTS_NB]; -+ -+ /** -+ * Set by parser to 1 for key frames and 0 for non-key frames. -+ * It is initialized to -1, so if the parser doesn't set this flag, -+ * old-style fallback using AV_PICTURE_TYPE_I picture type as key frames -+ * will be used. -+ */ -+ int key_frame; -+ -+#if FF_API_CONVERGENCE_DURATION -+ /** -+ * @deprecated unused -+ */ -+ attribute_deprecated -+ int64_t convergence_duration; -+#endif -+ -+ // Timestamp generation support: -+ /** -+ * Synchronization point for start of timestamp generation. -+ * -+ * Set to >0 for sync point, 0 for no sync point and <0 for undefined -+ * (default). -+ * -+ * For example, this corresponds to presence of H.264 buffering period -+ * SEI message. -+ */ -+ int dts_sync_point; -+ -+ /** -+ * Offset of the current timestamp against last timestamp sync point in -+ * units of AVCodecContext.time_base. -+ * -+ * Set to INT_MIN when dts_sync_point unused. Otherwise, it must -+ * contain a valid timestamp offset. -+ * -+ * Note that the timestamp of sync point has usually a nonzero -+ * dts_ref_dts_delta, which refers to the previous sync point. Offset of -+ * the next frame after timestamp sync point will be usually 1. -+ * -+ * For example, this corresponds to H.264 cpb_removal_delay. -+ */ -+ int dts_ref_dts_delta; -+ -+ /** -+ * Presentation delay of current frame in units of AVCodecContext.time_base. -+ * -+ * Set to INT_MIN when dts_sync_point unused. Otherwise, it must -+ * contain valid non-negative timestamp delta (presentation time of a frame -+ * must not lie in the past). -+ * -+ * This delay represents the difference between decoding and presentation -+ * time of the frame. -+ * -+ * For example, this corresponds to H.264 dpb_output_delay. -+ */ -+ int pts_dts_delta; -+ -+ /** -+ * Position of the packet in file. -+ * -+ * Analogous to cur_frame_pts/dts -+ */ -+ int64_t cur_frame_pos[AV_PARSER_PTS_NB]; -+ -+ /** -+ * Byte position of currently parsed frame in stream. -+ */ -+ int64_t pos; -+ -+ /** -+ * Previous frame byte position. -+ */ -+ int64_t last_pos; -+ -+ /** -+ * Duration of the current frame. -+ * For audio, this is in units of 1 / AVCodecContext.sample_rate. -+ * For all other types, this is in units of AVCodecContext.time_base. -+ */ -+ int duration; -+ -+ enum AVFieldOrder field_order; -+ -+ /** -+ * Indicate whether a picture is coded as a frame, top field or bottom field. -+ * -+ * For example, H.264 field_pic_flag equal to 0 corresponds to -+ * AV_PICTURE_STRUCTURE_FRAME. An H.264 picture with field_pic_flag -+ * equal to 1 and bottom_field_flag equal to 0 corresponds to -+ * AV_PICTURE_STRUCTURE_TOP_FIELD. -+ */ -+ enum AVPictureStructure picture_structure; -+ -+ /** -+ * Picture number incremented in presentation or output order. -+ * This field may be reinitialized at the first picture of a new sequence. -+ * -+ * For example, this corresponds to H.264 PicOrderCnt. -+ */ -+ int output_picture_number; -+ -+ /** -+ * Dimensions of the decoded video intended for presentation. -+ */ -+ int width; -+ int height; -+ -+ /** -+ * Dimensions of the coded video. -+ */ -+ int coded_width; -+ int coded_height; -+ -+ /** -+ * The format of the coded data, corresponds to enum AVPixelFormat for video -+ * and for enum AVSampleFormat for audio. -+ * -+ * Note that a decoder can have considerable freedom in how exactly it -+ * decodes the data, so the format reported here might be different from the -+ * one returned by a decoder. -+ */ -+ int format; -+} AVCodecParserContext; -+ -+typedef struct AVCodecParser { -+ int codec_ids[5]; /* several codec IDs are permitted */ -+ int priv_data_size; -+ int (*parser_init)(AVCodecParserContext *s); -+ /* This callback never returns an error, a negative value means that -+ * the frame start was in a previous packet. */ -+ int (*parser_parse)(AVCodecParserContext *s, -+ AVCodecContext *avctx, -+ const uint8_t **poutbuf, int *poutbuf_size, -+ const uint8_t *buf, int buf_size); -+ void (*parser_close)(AVCodecParserContext *s); -+ int (*split)(AVCodecContext *avctx, const uint8_t *buf, int buf_size); -+ struct AVCodecParser *next; -+} AVCodecParser; -+ -+/** -+ * Iterate over all registered codec parsers. -+ * -+ * @param opaque a pointer where libavcodec will store the iteration state. Must -+ * point to NULL to start the iteration. -+ * -+ * @return the next registered codec parser or NULL when the iteration is -+ * finished -+ */ -+const AVCodecParser *av_parser_iterate(void **opaque); -+ -+attribute_deprecated -+AVCodecParser *av_parser_next(const AVCodecParser *c); -+ -+attribute_deprecated -+void av_register_codec_parser(AVCodecParser *parser); -+AVCodecParserContext *av_parser_init(int codec_id); -+ -+/** -+ * Parse a packet. -+ * -+ * @param s parser context. -+ * @param avctx codec context. -+ * @param poutbuf set to pointer to parsed buffer or NULL if not yet finished. -+ * @param poutbuf_size set to size of parsed buffer or zero if not yet finished. -+ * @param buf input buffer. -+ * @param buf_size buffer size in bytes without the padding. I.e. the full buffer -+ size is assumed to be buf_size + AV_INPUT_BUFFER_PADDING_SIZE. -+ To signal EOF, this should be 0 (so that the last frame -+ can be output). -+ * @param pts input presentation timestamp. -+ * @param dts input decoding timestamp. -+ * @param pos input byte position in stream. -+ * @return the number of bytes of the input bitstream used. -+ * -+ * Example: -+ * @code -+ * while(in_len){ -+ * len = av_parser_parse2(myparser, AVCodecContext, &data, &size, -+ * in_data, in_len, -+ * pts, dts, pos); -+ * in_data += len; -+ * in_len -= len; -+ * -+ * if(size) -+ * decode_frame(data, size); -+ * } -+ * @endcode -+ */ -+int av_parser_parse2(AVCodecParserContext *s, -+ AVCodecContext *avctx, -+ uint8_t **poutbuf, int *poutbuf_size, -+ const uint8_t *buf, int buf_size, -+ int64_t pts, int64_t dts, -+ int64_t pos); -+ -+/** -+ * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed -+ * @deprecated use AVBitStreamFilter -+ */ -+int av_parser_change(AVCodecParserContext *s, -+ AVCodecContext *avctx, -+ uint8_t **poutbuf, int *poutbuf_size, -+ const uint8_t *buf, int buf_size, int keyframe); -+void av_parser_close(AVCodecParserContext *s); -+ -+/** -+ * @} -+ * @} -+ */ -+ -+/** -+ * @addtogroup lavc_encoding -+ * @{ -+ */ -+ -+/** -+ * Find a registered encoder with a matching codec ID. -+ * -+ * @param id AVCodecID of the requested encoder -+ * @return An encoder if one was found, NULL otherwise. -+ */ -+AVCodec *avcodec_find_encoder(enum AVCodecID id); -+ -+/** -+ * Find a registered encoder with the specified name. -+ * -+ * @param name name of the requested encoder -+ * @return An encoder if one was found, NULL otherwise. -+ */ -+AVCodec *avcodec_find_encoder_by_name(const char *name); -+ -+/** -+ * Encode a frame of audio. -+ * -+ * Takes input samples from frame and writes the next output packet, if -+ * available, to avpkt. The output packet does not necessarily contain data for -+ * the most recent frame, as encoders can delay, split, and combine input frames -+ * internally as needed. -+ * -+ * @param avctx codec context -+ * @param avpkt output AVPacket. -+ * The user can supply an output buffer by setting -+ * avpkt->data and avpkt->size prior to calling the -+ * function, but if the size of the user-provided data is not -+ * large enough, encoding will fail. If avpkt->data and -+ * avpkt->size are set, avpkt->destruct must also be set. All -+ * other AVPacket fields will be reset by the encoder using -+ * av_init_packet(). If avpkt->data is NULL, the encoder will -+ * allocate it. The encoder will set avpkt->size to the size -+ * of the output packet. -+ * -+ * If this function fails or produces no output, avpkt will be -+ * freed using av_packet_unref(). -+ * @param[in] frame AVFrame containing the raw audio data to be encoded. -+ * May be NULL when flushing an encoder that has the -+ * AV_CODEC_CAP_DELAY capability set. -+ * If AV_CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame -+ * can have any number of samples. -+ * If it is not set, frame->nb_samples must be equal to -+ * avctx->frame_size for all frames except the last. -+ * The final frame may be smaller than avctx->frame_size. -+ * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the -+ * output packet is non-empty, and to 0 if it is -+ * empty. If the function returns an error, the -+ * packet can be assumed to be invalid, and the -+ * value of got_packet_ptr is undefined and should -+ * not be used. -+ * @return 0 on success, negative error code on failure -+ * -+ * @deprecated use avcodec_send_frame()/avcodec_receive_packet() instead -+ */ -+attribute_deprecated -+int avcodec_encode_audio2(AVCodecContext *avctx, AVPacket *avpkt, -+ const AVFrame *frame, int *got_packet_ptr); -+ -+/** -+ * Encode a frame of video. -+ * -+ * Takes input raw video data from frame and writes the next output packet, if -+ * available, to avpkt. The output packet does not necessarily contain data for -+ * the most recent frame, as encoders can delay and reorder input frames -+ * internally as needed. -+ * -+ * @param avctx codec context -+ * @param avpkt output AVPacket. -+ * The user can supply an output buffer by setting -+ * avpkt->data and avpkt->size prior to calling the -+ * function, but if the size of the user-provided data is not -+ * large enough, encoding will fail. All other AVPacket fields -+ * will be reset by the encoder using av_init_packet(). If -+ * avpkt->data is NULL, the encoder will allocate it. -+ * The encoder will set avpkt->size to the size of the -+ * output packet. The returned data (if any) belongs to the -+ * caller, he is responsible for freeing it. -+ * -+ * If this function fails or produces no output, avpkt will be -+ * freed using av_packet_unref(). -+ * @param[in] frame AVFrame containing the raw video data to be encoded. -+ * May be NULL when flushing an encoder that has the -+ * AV_CODEC_CAP_DELAY capability set. -+ * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the -+ * output packet is non-empty, and to 0 if it is -+ * empty. If the function returns an error, the -+ * packet can be assumed to be invalid, and the -+ * value of got_packet_ptr is undefined and should -+ * not be used. -+ * @return 0 on success, negative error code on failure -+ * -+ * @deprecated use avcodec_send_frame()/avcodec_receive_packet() instead -+ */ -+attribute_deprecated -+int avcodec_encode_video2(AVCodecContext *avctx, AVPacket *avpkt, -+ const AVFrame *frame, int *got_packet_ptr); -+ -+int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size, -+ const AVSubtitle *sub); -+ -+ -+/** -+ * @} -+ */ -+ -+#if FF_API_AVPICTURE -+/** -+ * @addtogroup lavc_picture -+ * @{ -+ */ -+ -+/** -+ * @deprecated unused -+ */ -+attribute_deprecated -+int avpicture_alloc(AVPicture *picture, enum AVPixelFormat pix_fmt, int width, int height); -+ -+/** -+ * @deprecated unused -+ */ -+attribute_deprecated -+void avpicture_free(AVPicture *picture); -+ -+/** -+ * @deprecated use av_image_fill_arrays() instead. -+ */ -+attribute_deprecated -+int avpicture_fill(AVPicture *picture, const uint8_t *ptr, -+ enum AVPixelFormat pix_fmt, int width, int height); -+ -+/** -+ * @deprecated use av_image_copy_to_buffer() instead. -+ */ -+attribute_deprecated -+int avpicture_layout(const AVPicture *src, enum AVPixelFormat pix_fmt, -+ int width, int height, -+ unsigned char *dest, int dest_size); -+ -+/** -+ * @deprecated use av_image_get_buffer_size() instead. -+ */ -+attribute_deprecated -+int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height); -+ -+/** -+ * @deprecated av_image_copy() instead. -+ */ -+attribute_deprecated -+void av_picture_copy(AVPicture *dst, const AVPicture *src, -+ enum AVPixelFormat pix_fmt, int width, int height); -+ -+/** -+ * @deprecated unused -+ */ -+attribute_deprecated -+int av_picture_crop(AVPicture *dst, const AVPicture *src, -+ enum AVPixelFormat pix_fmt, int top_band, int left_band); -+ -+/** -+ * @deprecated unused -+ */ -+attribute_deprecated -+int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width, enum AVPixelFormat pix_fmt, -+ int padtop, int padbottom, int padleft, int padright, int *color); -+ -+/** -+ * @} -+ */ -+#endif -+ -+/** -+ * @defgroup lavc_misc Utility functions -+ * @ingroup libavc -+ * -+ * Miscellaneous utility functions related to both encoding and decoding -+ * (or neither). -+ * @{ -+ */ -+ -+/** -+ * @defgroup lavc_misc_pixfmt Pixel formats -+ * -+ * Functions for working with pixel formats. -+ * @{ -+ */ -+ -+#if FF_API_GETCHROMA -+/** -+ * @deprecated Use av_pix_fmt_get_chroma_sub_sample -+ */ -+ -+attribute_deprecated -+void avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift); -+#endif -+ -+/** -+ * Return a value representing the fourCC code associated to the -+ * pixel format pix_fmt, or 0 if no associated fourCC code can be -+ * found. -+ */ -+unsigned int avcodec_pix_fmt_to_codec_tag(enum AVPixelFormat pix_fmt); -+ -+/** -+ * @deprecated see av_get_pix_fmt_loss() -+ */ -+int avcodec_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt, enum AVPixelFormat src_pix_fmt, -+ int has_alpha); -+ -+/** -+ * Find the best pixel format to convert to given a certain source pixel -+ * format. When converting from one pixel format to another, information loss -+ * may occur. For example, when converting from RGB24 to GRAY, the color -+ * information will be lost. Similarly, other losses occur when converting from -+ * some formats to other formats. avcodec_find_best_pix_fmt_of_2() searches which of -+ * the given pixel formats should be used to suffer the least amount of loss. -+ * The pixel formats from which it chooses one, are determined by the -+ * pix_fmt_list parameter. -+ * -+ * -+ * @param[in] pix_fmt_list AV_PIX_FMT_NONE terminated array of pixel formats to choose from -+ * @param[in] src_pix_fmt source pixel format -+ * @param[in] has_alpha Whether the source pixel format alpha channel is used. -+ * @param[out] loss_ptr Combination of flags informing you what kind of losses will occur. -+ * @return The best pixel format to convert to or -1 if none was found. -+ */ -+enum AVPixelFormat avcodec_find_best_pix_fmt_of_list(const enum AVPixelFormat *pix_fmt_list, -+ enum AVPixelFormat src_pix_fmt, -+ int has_alpha, int *loss_ptr); -+ -+/** -+ * @deprecated see av_find_best_pix_fmt_of_2() -+ */ -+enum AVPixelFormat avcodec_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, -+ enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); -+ -+attribute_deprecated -+enum AVPixelFormat avcodec_find_best_pix_fmt2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, -+ enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); -+ -+enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum AVPixelFormat * fmt); -+ -+/** -+ * @} -+ */ -+ -+#if FF_API_TAG_STRING -+/** -+ * Put a string representing the codec tag codec_tag in buf. -+ * -+ * @param buf buffer to place codec tag in -+ * @param buf_size size in bytes of buf -+ * @param codec_tag codec tag to assign -+ * @return the length of the string that would have been generated if -+ * enough space had been available, excluding the trailing null -+ * -+ * @deprecated see av_fourcc_make_string() and av_fourcc2str(). -+ */ -+attribute_deprecated -+size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag); -+#endif -+ -+void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode); -+ -+/** -+ * Return a name for the specified profile, if available. -+ * -+ * @param codec the codec that is searched for the given profile -+ * @param profile the profile value for which a name is requested -+ * @return A name for the profile if found, NULL otherwise. -+ */ -+const char *av_get_profile_name(const AVCodec *codec, int profile); -+ -+/** -+ * Return a name for the specified profile, if available. -+ * -+ * @param codec_id the ID of the codec to which the requested profile belongs -+ * @param profile the profile value for which a name is requested -+ * @return A name for the profile if found, NULL otherwise. -+ * -+ * @note unlike av_get_profile_name(), which searches a list of profiles -+ * supported by a specific decoder or encoder implementation, this -+ * function searches the list of profiles from the AVCodecDescriptor -+ */ -+const char *avcodec_profile_name(enum AVCodecID codec_id, int profile); -+ -+int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size); -+int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count); -+//FIXME func typedef -+ -+/** -+ * Fill AVFrame audio data and linesize pointers. -+ * -+ * The buffer buf must be a preallocated buffer with a size big enough -+ * to contain the specified samples amount. The filled AVFrame data -+ * pointers will point to this buffer. -+ * -+ * AVFrame extended_data channel pointers are allocated if necessary for -+ * planar audio. -+ * -+ * @param frame the AVFrame -+ * frame->nb_samples must be set prior to calling the -+ * function. This function fills in frame->data, -+ * frame->extended_data, frame->linesize[0]. -+ * @param nb_channels channel count -+ * @param sample_fmt sample format -+ * @param buf buffer to use for frame data -+ * @param buf_size size of buffer -+ * @param align plane size sample alignment (0 = default) -+ * @return >=0 on success, negative error code on failure -+ * @todo return the size in bytes required to store the samples in -+ * case of success, at the next libavutil bump -+ */ -+int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels, -+ enum AVSampleFormat sample_fmt, const uint8_t *buf, -+ int buf_size, int align); -+ -+/** -+ * Reset the internal decoder state / flush internal buffers. Should be called -+ * e.g. when seeking or when switching to a different stream. -+ * -+ * @note when refcounted frames are not used (i.e. avctx->refcounted_frames is 0), -+ * this invalidates the frames previously returned from the decoder. When -+ * refcounted frames are used, the decoder just releases any references it might -+ * keep internally, but the caller's reference remains valid. -+ */ -+void avcodec_flush_buffers(AVCodecContext *avctx); -+ -+/** -+ * Return codec bits per sample. -+ * -+ * @param[in] codec_id the codec -+ * @return Number of bits per sample or zero if unknown for the given codec. -+ */ -+int av_get_bits_per_sample(enum AVCodecID codec_id); -+ -+/** -+ * Return the PCM codec associated with a sample format. -+ * @param be endianness, 0 for little, 1 for big, -+ * -1 (or anything else) for native -+ * @return AV_CODEC_ID_PCM_* or AV_CODEC_ID_NONE -+ */ -+enum AVCodecID av_get_pcm_codec(enum AVSampleFormat fmt, int be); -+ -+/** -+ * Return codec bits per sample. -+ * Only return non-zero if the bits per sample is exactly correct, not an -+ * approximation. -+ * -+ * @param[in] codec_id the codec -+ * @return Number of bits per sample or zero if unknown for the given codec. -+ */ -+int av_get_exact_bits_per_sample(enum AVCodecID codec_id); -+ -+/** -+ * Return audio frame duration. -+ * -+ * @param avctx codec context -+ * @param frame_bytes size of the frame, or 0 if unknown -+ * @return frame duration, in samples, if known. 0 if not able to -+ * determine. -+ */ -+int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes); -+ -+/** -+ * This function is the same as av_get_audio_frame_duration(), except it works -+ * with AVCodecParameters instead of an AVCodecContext. -+ */ -+int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes); -+ -+#if FF_API_OLD_BSF -+typedef struct AVBitStreamFilterContext { -+ void *priv_data; -+ const struct AVBitStreamFilter *filter; -+ AVCodecParserContext *parser; -+ struct AVBitStreamFilterContext *next; -+ /** -+ * Internal default arguments, used if NULL is passed to av_bitstream_filter_filter(). -+ * Not for access by library users. -+ */ -+ char *args; -+} AVBitStreamFilterContext; -+#endif -+ -+typedef struct AVBSFInternal AVBSFInternal; -+ -+/** -+ * The bitstream filter state. -+ * -+ * This struct must be allocated with av_bsf_alloc() and freed with -+ * av_bsf_free(). -+ * -+ * The fields in the struct will only be changed (by the caller or by the -+ * filter) as described in their documentation, and are to be considered -+ * immutable otherwise. -+ */ -+typedef struct AVBSFContext { -+ /** -+ * A class for logging and AVOptions -+ */ -+ const AVClass *av_class; -+ -+ /** -+ * The bitstream filter this context is an instance of. -+ */ -+ const struct AVBitStreamFilter *filter; -+ -+ /** -+ * Opaque libavcodec internal data. Must not be touched by the caller in any -+ * way. -+ */ -+ AVBSFInternal *internal; -+ -+ /** -+ * Opaque filter-specific private data. If filter->priv_class is non-NULL, -+ * this is an AVOptions-enabled struct. -+ */ -+ void *priv_data; -+ -+ /** -+ * Parameters of the input stream. This field is allocated in -+ * av_bsf_alloc(), it needs to be filled by the caller before -+ * av_bsf_init(). -+ */ -+ AVCodecParameters *par_in; -+ -+ /** -+ * Parameters of the output stream. This field is allocated in -+ * av_bsf_alloc(), it is set by the filter in av_bsf_init(). -+ */ -+ AVCodecParameters *par_out; -+ -+ /** -+ * The timebase used for the timestamps of the input packets. Set by the -+ * caller before av_bsf_init(). -+ */ -+ AVRational time_base_in; -+ -+ /** -+ * The timebase used for the timestamps of the output packets. Set by the -+ * filter in av_bsf_init(). -+ */ -+ AVRational time_base_out; -+} AVBSFContext; -+ -+typedef struct AVBitStreamFilter { -+ const char *name; -+ -+ /** -+ * A list of codec ids supported by the filter, terminated by -+ * AV_CODEC_ID_NONE. -+ * May be NULL, in that case the bitstream filter works with any codec id. -+ */ -+ const enum AVCodecID *codec_ids; -+ -+ /** -+ * A class for the private data, used to declare bitstream filter private -+ * AVOptions. This field is NULL for bitstream filters that do not declare -+ * any options. -+ * -+ * If this field is non-NULL, the first member of the filter private data -+ * must be a pointer to AVClass, which will be set by libavcodec generic -+ * code to this class. -+ */ -+ const AVClass *priv_class; -+ -+ /***************************************************************** -+ * No fields below this line are part of the public API. They -+ * may not be used outside of libavcodec and can be changed and -+ * removed at will. -+ * New public fields should be added right above. -+ ***************************************************************** -+ */ -+ -+ int priv_data_size; -+ int (*init)(AVBSFContext *ctx); -+ int (*filter)(AVBSFContext *ctx, AVPacket *pkt); -+ void (*close)(AVBSFContext *ctx); -+} AVBitStreamFilter; -+ -+#if FF_API_OLD_BSF -+/** -+ * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) -+ * is deprecated. Use the new bitstream filtering API (using AVBSFContext). -+ */ -+attribute_deprecated -+void av_register_bitstream_filter(AVBitStreamFilter *bsf); -+/** -+ * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) -+ * is deprecated. Use av_bsf_get_by_name(), av_bsf_alloc(), and av_bsf_init() -+ * from the new bitstream filtering API (using AVBSFContext). -+ */ -+attribute_deprecated -+AVBitStreamFilterContext *av_bitstream_filter_init(const char *name); -+/** -+ * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) -+ * is deprecated. Use av_bsf_send_packet() and av_bsf_receive_packet() from the -+ * new bitstream filtering API (using AVBSFContext). -+ */ -+attribute_deprecated -+int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc, -+ AVCodecContext *avctx, const char *args, -+ uint8_t **poutbuf, int *poutbuf_size, -+ const uint8_t *buf, int buf_size, int keyframe); -+/** -+ * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) -+ * is deprecated. Use av_bsf_free() from the new bitstream filtering API (using -+ * AVBSFContext). -+ */ -+attribute_deprecated -+void av_bitstream_filter_close(AVBitStreamFilterContext *bsf); -+/** -+ * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) -+ * is deprecated. Use av_bsf_iterate() from the new bitstream filtering API (using -+ * AVBSFContext). -+ */ -+attribute_deprecated -+const AVBitStreamFilter *av_bitstream_filter_next(const AVBitStreamFilter *f); -+#endif -+ -+/** -+ * @return a bitstream filter with the specified name or NULL if no such -+ * bitstream filter exists. -+ */ -+const AVBitStreamFilter *av_bsf_get_by_name(const char *name); -+ -+/** -+ * Iterate over all registered bitstream filters. -+ * -+ * @param opaque a pointer where libavcodec will store the iteration state. Must -+ * point to NULL to start the iteration. -+ * -+ * @return the next registered bitstream filter or NULL when the iteration is -+ * finished -+ */ -+const AVBitStreamFilter *av_bsf_iterate(void **opaque); -+#if FF_API_NEXT -+attribute_deprecated -+const AVBitStreamFilter *av_bsf_next(void **opaque); -+#endif -+ -+/** -+ * Allocate a context for a given bitstream filter. The caller must fill in the -+ * context parameters as described in the documentation and then call -+ * av_bsf_init() before sending any data to the filter. -+ * -+ * @param filter the filter for which to allocate an instance. -+ * @param ctx a pointer into which the pointer to the newly-allocated context -+ * will be written. It must be freed with av_bsf_free() after the -+ * filtering is done. -+ * -+ * @return 0 on success, a negative AVERROR code on failure -+ */ -+int av_bsf_alloc(const AVBitStreamFilter *filter, AVBSFContext **ctx); -+ -+/** -+ * Prepare the filter for use, after all the parameters and options have been -+ * set. -+ */ -+int av_bsf_init(AVBSFContext *ctx); -+ -+/** -+ * Submit a packet for filtering. -+ * -+ * After sending each packet, the filter must be completely drained by calling -+ * av_bsf_receive_packet() repeatedly until it returns AVERROR(EAGAIN) or -+ * AVERROR_EOF. -+ * -+ * @param pkt the packet to filter. The bitstream filter will take ownership of -+ * the packet and reset the contents of pkt. pkt is not touched if an error occurs. -+ * This parameter may be NULL, which signals the end of the stream (i.e. no more -+ * packets will be sent). That will cause the filter to output any packets it -+ * may have buffered internally. -+ * -+ * @return 0 on success, a negative AVERROR on error. -+ */ -+int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt); -+ -+/** -+ * Retrieve a filtered packet. -+ * -+ * @param[out] pkt this struct will be filled with the contents of the filtered -+ * packet. It is owned by the caller and must be freed using -+ * av_packet_unref() when it is no longer needed. -+ * This parameter should be "clean" (i.e. freshly allocated -+ * with av_packet_alloc() or unreffed with av_packet_unref()) -+ * when this function is called. If this function returns -+ * successfully, the contents of pkt will be completely -+ * overwritten by the returned data. On failure, pkt is not -+ * touched. -+ * -+ * @return 0 on success. AVERROR(EAGAIN) if more packets need to be sent to the -+ * filter (using av_bsf_send_packet()) to get more output. AVERROR_EOF if there -+ * will be no further output from the filter. Another negative AVERROR value if -+ * an error occurs. -+ * -+ * @note one input packet may result in several output packets, so after sending -+ * a packet with av_bsf_send_packet(), this function needs to be called -+ * repeatedly until it stops returning 0. It is also possible for a filter to -+ * output fewer packets than were sent to it, so this function may return -+ * AVERROR(EAGAIN) immediately after a successful av_bsf_send_packet() call. -+ */ -+int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt); -+ -+/** -+ * Free a bitstream filter context and everything associated with it; write NULL -+ * into the supplied pointer. -+ */ -+void av_bsf_free(AVBSFContext **ctx); -+ -+/** -+ * Get the AVClass for AVBSFContext. It can be used in combination with -+ * AV_OPT_SEARCH_FAKE_OBJ for examining options. -+ * -+ * @see av_opt_find(). -+ */ -+const AVClass *av_bsf_get_class(void); -+ -+/** -+ * Structure for chain/list of bitstream filters. -+ * Empty list can be allocated by av_bsf_list_alloc(). -+ */ -+typedef struct AVBSFList AVBSFList; -+ -+/** -+ * Allocate empty list of bitstream filters. -+ * The list must be later freed by av_bsf_list_free() -+ * or finalized by av_bsf_list_finalize(). -+ * -+ * @return Pointer to @ref AVBSFList on success, NULL in case of failure -+ */ -+AVBSFList *av_bsf_list_alloc(void); -+ -+/** -+ * Free list of bitstream filters. -+ * -+ * @param lst Pointer to pointer returned by av_bsf_list_alloc() -+ */ -+void av_bsf_list_free(AVBSFList **lst); -+ -+/** -+ * Append bitstream filter to the list of bitstream filters. -+ * -+ * @param lst List to append to -+ * @param bsf Filter context to be appended -+ * -+ * @return >=0 on success, negative AVERROR in case of failure -+ */ -+int av_bsf_list_append(AVBSFList *lst, AVBSFContext *bsf); -+ -+/** -+ * Construct new bitstream filter context given it's name and options -+ * and append it to the list of bitstream filters. -+ * -+ * @param lst List to append to -+ * @param bsf_name Name of the bitstream filter -+ * @param options Options for the bitstream filter, can be set to NULL -+ * -+ * @return >=0 on success, negative AVERROR in case of failure -+ */ -+int av_bsf_list_append2(AVBSFList *lst, const char * bsf_name, AVDictionary **options); -+/** -+ * Finalize list of bitstream filters. -+ * -+ * This function will transform @ref AVBSFList to single @ref AVBSFContext, -+ * so the whole chain of bitstream filters can be treated as single filter -+ * freshly allocated by av_bsf_alloc(). -+ * If the call is successful, @ref AVBSFList structure is freed and lst -+ * will be set to NULL. In case of failure, caller is responsible for -+ * freeing the structure by av_bsf_list_free() -+ * -+ * @param lst Filter list structure to be transformed -+ * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure -+ * representing the chain of bitstream filters -+ * -+ * @return >=0 on success, negative AVERROR in case of failure -+ */ -+int av_bsf_list_finalize(AVBSFList **lst, AVBSFContext **bsf); -+ -+/** -+ * Parse string describing list of bitstream filters and create single -+ * @ref AVBSFContext describing the whole chain of bitstream filters. -+ * Resulting @ref AVBSFContext can be treated as any other @ref AVBSFContext freshly -+ * allocated by av_bsf_alloc(). -+ * -+ * @param str String describing chain of bitstream filters in format -+ * `bsf1[=opt1=val1:opt2=val2][,bsf2]` -+ * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure -+ * representing the chain of bitstream filters -+ * -+ * @return >=0 on success, negative AVERROR in case of failure -+ */ -+int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf); -+ -+/** -+ * Get null/pass-through bitstream filter. -+ * -+ * @param[out] bsf Pointer to be set to new instance of pass-through bitstream filter -+ * -+ * @return -+ */ -+int av_bsf_get_null_filter(AVBSFContext **bsf); -+ -+/* memory */ -+ -+/** -+ * Same behaviour av_fast_malloc but the buffer has additional -+ * AV_INPUT_BUFFER_PADDING_SIZE at the end which will always be 0. -+ * -+ * In addition the whole buffer will initially and after resizes -+ * be 0-initialized so that no uninitialized data will ever appear. -+ */ -+void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size); -+ -+/** -+ * Same behaviour av_fast_padded_malloc except that buffer will always -+ * be 0-initialized after call. -+ */ -+void av_fast_padded_mallocz(void *ptr, unsigned int *size, size_t min_size); -+ -+/** -+ * Encode extradata length to a buffer. Used by xiph codecs. -+ * -+ * @param s buffer to write to; must be at least (v/255+1) bytes long -+ * @param v size of extradata in bytes -+ * @return number of bytes written to the buffer. -+ */ -+unsigned int av_xiphlacing(unsigned char *s, unsigned int v); -+ -+#if FF_API_USER_VISIBLE_AVHWACCEL -+/** -+ * Register the hardware accelerator hwaccel. -+ * -+ * @deprecated This function doesn't do anything. -+ */ -+attribute_deprecated -+void av_register_hwaccel(AVHWAccel *hwaccel); -+ -+/** -+ * If hwaccel is NULL, returns the first registered hardware accelerator, -+ * if hwaccel is non-NULL, returns the next registered hardware accelerator -+ * after hwaccel, or NULL if hwaccel is the last one. -+ * -+ * @deprecated AVHWaccel structures contain no user-serviceable parts, so -+ * this function should not be used. -+ */ -+attribute_deprecated -+AVHWAccel *av_hwaccel_next(const AVHWAccel *hwaccel); -+#endif -+ -+#if FF_API_LOCKMGR -+/** -+ * Lock operation used by lockmgr -+ * -+ * @deprecated Deprecated together with av_lockmgr_register(). -+ */ -+enum AVLockOp { -+ AV_LOCK_CREATE, ///< Create a mutex -+ AV_LOCK_OBTAIN, ///< Lock the mutex -+ AV_LOCK_RELEASE, ///< Unlock the mutex -+ AV_LOCK_DESTROY, ///< Free mutex resources -+}; -+ -+/** -+ * Register a user provided lock manager supporting the operations -+ * specified by AVLockOp. The "mutex" argument to the function points -+ * to a (void *) where the lockmgr should store/get a pointer to a user -+ * allocated mutex. It is NULL upon AV_LOCK_CREATE and equal to the -+ * value left by the last call for all other ops. If the lock manager is -+ * unable to perform the op then it should leave the mutex in the same -+ * state as when it was called and return a non-zero value. However, -+ * when called with AV_LOCK_DESTROY the mutex will always be assumed to -+ * have been successfully destroyed. If av_lockmgr_register succeeds -+ * it will return a non-negative value, if it fails it will return a -+ * negative value and destroy all mutex and unregister all callbacks. -+ * av_lockmgr_register is not thread-safe, it must be called from a -+ * single thread before any calls which make use of locking are used. -+ * -+ * @param cb User defined callback. av_lockmgr_register invokes calls -+ * to this callback and the previously registered callback. -+ * The callback will be used to create more than one mutex -+ * each of which must be backed by its own underlying locking -+ * mechanism (i.e. do not use a single static object to -+ * implement your lock manager). If cb is set to NULL the -+ * lockmgr will be unregistered. -+ * -+ * @deprecated This function does nothing, and always returns 0. Be sure to -+ * build with thread support to get basic thread safety. -+ */ -+attribute_deprecated -+int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op)); -+#endif -+ -+/** -+ * Get the type of the given codec. -+ */ -+enum AVMediaType avcodec_get_type(enum AVCodecID codec_id); -+ -+/** -+ * Get the name of a codec. -+ * @return a static string identifying the codec; never NULL -+ */ -+const char *avcodec_get_name(enum AVCodecID id); -+ -+/** -+ * @return a positive value if s is open (i.e. avcodec_open2() was called on it -+ * with no corresponding avcodec_close()), 0 otherwise. -+ */ -+int avcodec_is_open(AVCodecContext *s); -+ -+/** -+ * @return a non-zero number if codec is an encoder, zero otherwise -+ */ -+int av_codec_is_encoder(const AVCodec *codec); -+ -+/** -+ * @return a non-zero number if codec is a decoder, zero otherwise -+ */ -+int av_codec_is_decoder(const AVCodec *codec); -+ -+/** -+ * @return descriptor for given codec ID or NULL if no descriptor exists. -+ */ -+const AVCodecDescriptor *avcodec_descriptor_get(enum AVCodecID id); -+ -+/** -+ * Iterate over all codec descriptors known to libavcodec. -+ * -+ * @param prev previous descriptor. NULL to get the first descriptor. -+ * -+ * @return next descriptor or NULL after the last descriptor -+ */ -+const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev); -+ -+/** -+ * @return codec descriptor with the given name or NULL if no such descriptor -+ * exists. -+ */ -+const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name); -+ -+/** -+ * Allocate a CPB properties structure and initialize its fields to default -+ * values. -+ * -+ * @param size if non-NULL, the size of the allocated struct will be written -+ * here. This is useful for embedding it in side data. -+ * -+ * @return the newly allocated struct or NULL on failure -+ */ -+AVCPBProperties *av_cpb_properties_alloc(size_t *size); -+ -+/** -+ * @} -+ */ -+ -+#endif /* AVCODEC_AVCODEC_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/avfft.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/avfft.h -new file mode 100644 -index 000000000000..0c0f9b8d8dae ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/avfft.h -@@ -0,0 +1,118 @@ -+/* -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+#ifndef AVCODEC_AVFFT_H -+#define AVCODEC_AVFFT_H -+ -+/** -+ * @file -+ * @ingroup lavc_fft -+ * FFT functions -+ */ -+ -+/** -+ * @defgroup lavc_fft FFT functions -+ * @ingroup lavc_misc -+ * -+ * @{ -+ */ -+ -+typedef float FFTSample; -+ -+typedef struct FFTComplex { -+ FFTSample re, im; -+} FFTComplex; -+ -+typedef struct FFTContext FFTContext; -+ -+/** -+ * Set up a complex FFT. -+ * @param nbits log2 of the length of the input array -+ * @param inverse if 0 perform the forward transform, if 1 perform the inverse -+ */ -+FFTContext *av_fft_init(int nbits, int inverse); -+ -+/** -+ * Do the permutation needed BEFORE calling ff_fft_calc(). -+ */ -+void av_fft_permute(FFTContext *s, FFTComplex *z); -+ -+/** -+ * Do a complex FFT with the parameters defined in av_fft_init(). The -+ * input data must be permuted before. No 1.0/sqrt(n) normalization is done. -+ */ -+void av_fft_calc(FFTContext *s, FFTComplex *z); -+ -+void av_fft_end(FFTContext *s); -+ -+FFTContext *av_mdct_init(int nbits, int inverse, double scale); -+void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); -+void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input); -+void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); -+void av_mdct_end(FFTContext *s); -+ -+/* Real Discrete Fourier Transform */ -+ -+enum RDFTransformType { -+ DFT_R2C, -+ IDFT_C2R, -+ IDFT_R2C, -+ DFT_C2R, -+}; -+ -+typedef struct RDFTContext RDFTContext; -+ -+/** -+ * Set up a real FFT. -+ * @param nbits log2 of the length of the input array -+ * @param trans the type of transform -+ */ -+RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans); -+void av_rdft_calc(RDFTContext *s, FFTSample *data); -+void av_rdft_end(RDFTContext *s); -+ -+/* Discrete Cosine Transform */ -+ -+typedef struct DCTContext DCTContext; -+ -+enum DCTTransformType { -+ DCT_II = 0, -+ DCT_III, -+ DCT_I, -+ DST_I, -+}; -+ -+/** -+ * Set up DCT. -+ * -+ * @param nbits size of the input array: -+ * (1 << nbits) for DCT-II, DCT-III and DST-I -+ * (1 << nbits) + 1 for DCT-I -+ * @param type the type of transform -+ * -+ * @note the first element of the input of DST-I is ignored -+ */ -+DCTContext *av_dct_init(int nbits, enum DCTTransformType type); -+void av_dct_calc(DCTContext *s, FFTSample *data); -+void av_dct_end (DCTContext *s); -+ -+/** -+ * @} -+ */ -+ -+#endif /* AVCODEC_AVFFT_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/vaapi.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/vaapi.h -new file mode 100644 -index 000000000000..2cf7da5889ab ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/vaapi.h -@@ -0,0 +1,86 @@ -+/* -+ * Video Acceleration API (shared data between FFmpeg and the video player) -+ * HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1 -+ * -+ * Copyright (C) 2008-2009 Splitted-Desktop Systems -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+#ifndef AVCODEC_VAAPI_H -+#define AVCODEC_VAAPI_H -+ -+/** -+ * @file -+ * @ingroup lavc_codec_hwaccel_vaapi -+ * Public libavcodec VA API header. -+ */ -+ -+#include -+#include "libavutil/attributes.h" -+#include "version.h" -+ -+#if FF_API_STRUCT_VAAPI_CONTEXT -+ -+/** -+ * @defgroup lavc_codec_hwaccel_vaapi VA API Decoding -+ * @ingroup lavc_codec_hwaccel -+ * @{ -+ */ -+ -+/** -+ * This structure is used to share data between the FFmpeg library and -+ * the client video application. -+ * This shall be zero-allocated and available as -+ * AVCodecContext.hwaccel_context. All user members can be set once -+ * during initialization or through each AVCodecContext.get_buffer() -+ * function call. In any case, they must be valid prior to calling -+ * decoding functions. -+ * -+ * Deprecated: use AVCodecContext.hw_frames_ctx instead. -+ */ -+struct attribute_deprecated vaapi_context { -+ /** -+ * Window system dependent data -+ * -+ * - encoding: unused -+ * - decoding: Set by user -+ */ -+ void *display; -+ -+ /** -+ * Configuration ID -+ * -+ * - encoding: unused -+ * - decoding: Set by user -+ */ -+ uint32_t config_id; -+ -+ /** -+ * Context ID (video decode pipeline) -+ * -+ * - encoding: unused -+ * - decoding: Set by user -+ */ -+ uint32_t context_id; -+}; -+ -+/* @} */ -+ -+#endif /* FF_API_STRUCT_VAAPI_CONTEXT */ -+ -+#endif /* AVCODEC_VAAPI_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/vdpau.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/vdpau.h -new file mode 100644 -index 000000000000..4d9994336911 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/vdpau.h -@@ -0,0 +1,176 @@ -+/* -+ * The Video Decode and Presentation API for UNIX (VDPAU) is used for -+ * hardware-accelerated decoding of MPEG-1/2, H.264 and VC-1. -+ * -+ * Copyright (C) 2008 NVIDIA -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+#ifndef AVCODEC_VDPAU_H -+#define AVCODEC_VDPAU_H -+ -+/** -+ * @file -+ * @ingroup lavc_codec_hwaccel_vdpau -+ * Public libavcodec VDPAU header. -+ */ -+ -+ -+/** -+ * @defgroup lavc_codec_hwaccel_vdpau VDPAU Decoder and Renderer -+ * @ingroup lavc_codec_hwaccel -+ * -+ * VDPAU hardware acceleration has two modules -+ * - VDPAU decoding -+ * - VDPAU presentation -+ * -+ * The VDPAU decoding module parses all headers using FFmpeg -+ * parsing mechanisms and uses VDPAU for the actual decoding. -+ * -+ * As per the current implementation, the actual decoding -+ * and rendering (API calls) are done as part of the VDPAU -+ * presentation (vo_vdpau.c) module. -+ * -+ * @{ -+ */ -+ -+#include -+ -+#include "libavutil/avconfig.h" -+#include "libavutil/attributes.h" -+ -+#include "avcodec.h" -+#include "version.h" -+ -+struct AVCodecContext; -+struct AVFrame; -+ -+typedef int (*AVVDPAU_Render2)(struct AVCodecContext *, struct AVFrame *, -+ const VdpPictureInfo *, uint32_t, -+ const VdpBitstreamBuffer *); -+ -+/** -+ * This structure is used to share data between the libavcodec library and -+ * the client video application. -+ * The user shall allocate the structure via the av_alloc_vdpau_hwaccel -+ * function and make it available as -+ * AVCodecContext.hwaccel_context. Members can be set by the user once -+ * during initialization or through each AVCodecContext.get_buffer() -+ * function call. In any case, they must be valid prior to calling -+ * decoding functions. -+ * -+ * The size of this structure is not a part of the public ABI and must not -+ * be used outside of libavcodec. Use av_vdpau_alloc_context() to allocate an -+ * AVVDPAUContext. -+ */ -+typedef struct AVVDPAUContext { -+ /** -+ * VDPAU decoder handle -+ * -+ * Set by user. -+ */ -+ VdpDecoder decoder; -+ -+ /** -+ * VDPAU decoder render callback -+ * -+ * Set by the user. -+ */ -+ VdpDecoderRender *render; -+ -+ AVVDPAU_Render2 render2; -+} AVVDPAUContext; -+ -+/** -+ * @brief allocation function for AVVDPAUContext -+ * -+ * Allows extending the struct without breaking API/ABI -+ */ -+AVVDPAUContext *av_alloc_vdpaucontext(void); -+ -+AVVDPAU_Render2 av_vdpau_hwaccel_get_render2(const AVVDPAUContext *); -+void av_vdpau_hwaccel_set_render2(AVVDPAUContext *, AVVDPAU_Render2); -+ -+/** -+ * Associate a VDPAU device with a codec context for hardware acceleration. -+ * This function is meant to be called from the get_format() codec callback, -+ * or earlier. It can also be called after avcodec_flush_buffers() to change -+ * the underlying VDPAU device mid-stream (e.g. to recover from non-transparent -+ * display preemption). -+ * -+ * @note get_format() must return AV_PIX_FMT_VDPAU if this function completes -+ * successfully. -+ * -+ * @param avctx decoding context whose get_format() callback is invoked -+ * @param device VDPAU device handle to use for hardware acceleration -+ * @param get_proc_address VDPAU device driver -+ * @param flags zero of more OR'd AV_HWACCEL_FLAG_* flags -+ * -+ * @return 0 on success, an AVERROR code on failure. -+ */ -+int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device, -+ VdpGetProcAddress *get_proc_address, unsigned flags); -+ -+/** -+ * Gets the parameters to create an adequate VDPAU video surface for the codec -+ * context using VDPAU hardware decoding acceleration. -+ * -+ * @note Behavior is undefined if the context was not successfully bound to a -+ * VDPAU device using av_vdpau_bind_context(). -+ * -+ * @param avctx the codec context being used for decoding the stream -+ * @param type storage space for the VDPAU video surface chroma type -+ * (or NULL to ignore) -+ * @param width storage space for the VDPAU video surface pixel width -+ * (or NULL to ignore) -+ * @param height storage space for the VDPAU video surface pixel height -+ * (or NULL to ignore) -+ * -+ * @return 0 on success, a negative AVERROR code on failure. -+ */ -+int av_vdpau_get_surface_parameters(AVCodecContext *avctx, VdpChromaType *type, -+ uint32_t *width, uint32_t *height); -+ -+/** -+ * Allocate an AVVDPAUContext. -+ * -+ * @return Newly-allocated AVVDPAUContext or NULL on failure. -+ */ -+AVVDPAUContext *av_vdpau_alloc_context(void); -+ -+#if FF_API_VDPAU_PROFILE -+/** -+ * Get a decoder profile that should be used for initializing a VDPAU decoder. -+ * Should be called from the AVCodecContext.get_format() callback. -+ * -+ * @deprecated Use av_vdpau_bind_context() instead. -+ * -+ * @param avctx the codec context being used for decoding the stream -+ * @param profile a pointer into which the result will be written on success. -+ * The contents of profile are undefined if this function returns -+ * an error. -+ * -+ * @return 0 on success (non-negative), a negative AVERROR on failure. -+ */ -+attribute_deprecated -+int av_vdpau_get_profile(AVCodecContext *avctx, VdpDecoderProfile *profile); -+#endif -+ -+/* @}*/ -+ -+#endif /* AVCODEC_VDPAU_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/version.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/version.h -new file mode 100644 -index 000000000000..6895f1a461e3 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavcodec/version.h -@@ -0,0 +1,137 @@ -+/* -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+#ifndef AVCODEC_VERSION_H -+#define AVCODEC_VERSION_H -+ -+/** -+ * @file -+ * @ingroup libavc -+ * Libavcodec version macros. -+ */ -+ -+#include "libavutil/version.h" -+ -+#define LIBAVCODEC_VERSION_MAJOR 58 -+#define LIBAVCODEC_VERSION_MINOR 18 -+#define LIBAVCODEC_VERSION_MICRO 100 -+ -+#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ -+ LIBAVCODEC_VERSION_MINOR, \ -+ LIBAVCODEC_VERSION_MICRO) -+#define LIBAVCODEC_VERSION AV_VERSION(LIBAVCODEC_VERSION_MAJOR, \ -+ LIBAVCODEC_VERSION_MINOR, \ -+ LIBAVCODEC_VERSION_MICRO) -+#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT -+ -+#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION) -+ -+/** -+ * FF_API_* defines may be placed below to indicate public API that will be -+ * dropped at a future version bump. The defines themselves are not part of -+ * the public API and may change, break or disappear at any time. -+ * -+ * @note, when bumping the major version it is recommended to manually -+ * disable each FF_API_* in its own commit instead of disabling them all -+ * at once through the bump. This improves the git bisect-ability of the change. -+ */ -+ -+#ifndef FF_API_LOWRES -+#define FF_API_LOWRES (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_DEBUG_MV -+#define FF_API_DEBUG_MV (LIBAVCODEC_VERSION_MAJOR < 58) -+#endif -+#ifndef FF_API_AVCTX_TIMEBASE -+#define FF_API_AVCTX_TIMEBASE (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_CODED_FRAME -+#define FF_API_CODED_FRAME (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_SIDEDATA_ONLY_PKT -+#define FF_API_SIDEDATA_ONLY_PKT (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_VDPAU_PROFILE -+#define FF_API_VDPAU_PROFILE (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_CONVERGENCE_DURATION -+#define FF_API_CONVERGENCE_DURATION (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_AVPICTURE -+#define FF_API_AVPICTURE (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_AVPACKET_OLD_API -+#define FF_API_AVPACKET_OLD_API (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_RTP_CALLBACK -+#define FF_API_RTP_CALLBACK (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_VBV_DELAY -+#define FF_API_VBV_DELAY (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_CODER_TYPE -+#define FF_API_CODER_TYPE (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_STAT_BITS -+#define FF_API_STAT_BITS (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_PRIVATE_OPT -+#define FF_API_PRIVATE_OPT (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_ASS_TIMING -+#define FF_API_ASS_TIMING (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_OLD_BSF -+#define FF_API_OLD_BSF (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_COPY_CONTEXT -+#define FF_API_COPY_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_GET_CONTEXT_DEFAULTS -+#define FF_API_GET_CONTEXT_DEFAULTS (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_NVENC_OLD_NAME -+#define FF_API_NVENC_OLD_NAME (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_STRUCT_VAAPI_CONTEXT -+#define FF_API_STRUCT_VAAPI_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_MERGE_SD_API -+#define FF_API_MERGE_SD_API (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_TAG_STRING -+#define FF_API_TAG_STRING (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_GETCHROMA -+#define FF_API_GETCHROMA (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_CODEC_GET_SET -+#define FF_API_CODEC_GET_SET (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_USER_VISIBLE_AVHWACCEL -+#define FF_API_USER_VISIBLE_AVHWACCEL (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_LOCKMGR -+#define FF_API_LOCKMGR (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+#ifndef FF_API_NEXT -+#define FF_API_NEXT (LIBAVCODEC_VERSION_MAJOR < 59) -+#endif -+ -+ -+#endif /* AVCODEC_VERSION_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/attributes.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/attributes.h -new file mode 100644 -index 000000000000..ced108aa2c75 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/attributes.h -@@ -0,0 +1,167 @@ -+/* -+ * copyright (c) 2006 Michael Niedermayer -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/** -+ * @file -+ * Macro definitions for various function/variable attributes -+ */ -+ -+#ifndef AVUTIL_ATTRIBUTES_H -+#define AVUTIL_ATTRIBUTES_H -+ -+#ifdef __GNUC__ -+# define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > (x) || __GNUC__ == (x) && __GNUC_MINOR__ >= (y)) -+# define AV_GCC_VERSION_AT_MOST(x,y) (__GNUC__ < (x) || __GNUC__ == (x) && __GNUC_MINOR__ <= (y)) -+#else -+# define AV_GCC_VERSION_AT_LEAST(x,y) 0 -+# define AV_GCC_VERSION_AT_MOST(x,y) 0 -+#endif -+ -+#ifndef av_always_inline -+#if AV_GCC_VERSION_AT_LEAST(3,1) -+# define av_always_inline __attribute__((always_inline)) inline -+#elif defined(_MSC_VER) -+# define av_always_inline __forceinline -+#else -+# define av_always_inline inline -+#endif -+#endif -+ -+#ifndef av_extern_inline -+#if defined(__ICL) && __ICL >= 1210 || defined(__GNUC_STDC_INLINE__) -+# define av_extern_inline extern inline -+#else -+# define av_extern_inline inline -+#endif -+#endif -+ -+#if AV_GCC_VERSION_AT_LEAST(3,4) -+# define av_warn_unused_result __attribute__((warn_unused_result)) -+#else -+# define av_warn_unused_result -+#endif -+ -+#if AV_GCC_VERSION_AT_LEAST(3,1) -+# define av_noinline __attribute__((noinline)) -+#elif defined(_MSC_VER) -+# define av_noinline __declspec(noinline) -+#else -+# define av_noinline -+#endif -+ -+#if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__) -+# define av_pure __attribute__((pure)) -+#else -+# define av_pure -+#endif -+ -+#if AV_GCC_VERSION_AT_LEAST(2,6) || defined(__clang__) -+# define av_const __attribute__((const)) -+#else -+# define av_const -+#endif -+ -+#if AV_GCC_VERSION_AT_LEAST(4,3) || defined(__clang__) -+# define av_cold __attribute__((cold)) -+#else -+# define av_cold -+#endif -+ -+#if AV_GCC_VERSION_AT_LEAST(4,1) && !defined(__llvm__) -+# define av_flatten __attribute__((flatten)) -+#else -+# define av_flatten -+#endif -+ -+#if AV_GCC_VERSION_AT_LEAST(3,1) -+# define attribute_deprecated __attribute__((deprecated)) -+#elif defined(_MSC_VER) -+# define attribute_deprecated __declspec(deprecated) -+#else -+# define attribute_deprecated -+#endif -+ -+/** -+ * Disable warnings about deprecated features -+ * This is useful for sections of code kept for backward compatibility and -+ * scheduled for removal. -+ */ -+#ifndef AV_NOWARN_DEPRECATED -+#if AV_GCC_VERSION_AT_LEAST(4,6) -+# define AV_NOWARN_DEPRECATED(code) \ -+ _Pragma("GCC diagnostic push") \ -+ _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") \ -+ code \ -+ _Pragma("GCC diagnostic pop") -+#elif defined(_MSC_VER) -+# define AV_NOWARN_DEPRECATED(code) \ -+ __pragma(warning(push)) \ -+ __pragma(warning(disable : 4996)) \ -+ code; \ -+ __pragma(warning(pop)) -+#else -+# define AV_NOWARN_DEPRECATED(code) code -+#endif -+#endif -+ -+#if defined(__GNUC__) || defined(__clang__) -+# define av_unused __attribute__((unused)) -+#else -+# define av_unused -+#endif -+ -+/** -+ * Mark a variable as used and prevent the compiler from optimizing it -+ * away. This is useful for variables accessed only from inline -+ * assembler without the compiler being aware. -+ */ -+#if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__) -+# define av_used __attribute__((used)) -+#else -+# define av_used -+#endif -+ -+#if AV_GCC_VERSION_AT_LEAST(3,3) || defined(__clang__) -+# define av_alias __attribute__((may_alias)) -+#else -+# define av_alias -+#endif -+ -+#if (defined(__GNUC__) || defined(__clang__)) && !defined(__INTEL_COMPILER) -+# define av_uninit(x) x=x -+#else -+# define av_uninit(x) x -+#endif -+ -+#if defined(__GNUC__) || defined(__clang__) -+# define av_builtin_constant_p __builtin_constant_p -+# define av_printf_format(fmtpos, attrpos) __attribute__((__format__(__printf__, fmtpos, attrpos))) -+#else -+# define av_builtin_constant_p(x) 0 -+# define av_printf_format(fmtpos, attrpos) -+#endif -+ -+#if AV_GCC_VERSION_AT_LEAST(2,5) || defined(__clang__) -+# define av_noreturn __attribute__((noreturn)) -+#else -+# define av_noreturn -+#endif -+ -+#endif /* AVUTIL_ATTRIBUTES_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/avconfig.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/avconfig.h -new file mode 100644 -index 000000000000..c289fbb551c1 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/avconfig.h -@@ -0,0 +1,6 @@ -+/* Generated by ffmpeg configure */ -+#ifndef AVUTIL_AVCONFIG_H -+#define AVUTIL_AVCONFIG_H -+#define AV_HAVE_BIGENDIAN 0 -+#define AV_HAVE_FAST_UNALIGNED 1 -+#endif /* AVUTIL_AVCONFIG_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/avutil.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/avutil.h -new file mode 100644 -index 000000000000..4d633156d14d ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/avutil.h -@@ -0,0 +1,365 @@ -+/* -+ * copyright (c) 2006 Michael Niedermayer -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+#ifndef AVUTIL_AVUTIL_H -+#define AVUTIL_AVUTIL_H -+ -+/** -+ * @file -+ * @ingroup lavu -+ * Convenience header that includes @ref lavu "libavutil"'s core. -+ */ -+ -+/** -+ * @mainpage -+ * -+ * @section ffmpeg_intro Introduction -+ * -+ * This document describes the usage of the different libraries -+ * provided by FFmpeg. -+ * -+ * @li @ref libavc "libavcodec" encoding/decoding library -+ * @li @ref lavfi "libavfilter" graph-based frame editing library -+ * @li @ref libavf "libavformat" I/O and muxing/demuxing library -+ * @li @ref lavd "libavdevice" special devices muxing/demuxing library -+ * @li @ref lavu "libavutil" common utility library -+ * @li @ref lswr "libswresample" audio resampling, format conversion and mixing -+ * @li @ref lpp "libpostproc" post processing library -+ * @li @ref libsws "libswscale" color conversion and scaling library -+ * -+ * @section ffmpeg_versioning Versioning and compatibility -+ * -+ * Each of the FFmpeg libraries contains a version.h header, which defines a -+ * major, minor and micro version number with the -+ * LIBRARYNAME_VERSION_{MAJOR,MINOR,MICRO} macros. The major version -+ * number is incremented with backward incompatible changes - e.g. removing -+ * parts of the public API, reordering public struct members, etc. The minor -+ * version number is incremented for backward compatible API changes or major -+ * new features - e.g. adding a new public function or a new decoder. The micro -+ * version number is incremented for smaller changes that a calling program -+ * might still want to check for - e.g. changing behavior in a previously -+ * unspecified situation. -+ * -+ * FFmpeg guarantees backward API and ABI compatibility for each library as long -+ * as its major version number is unchanged. This means that no public symbols -+ * will be removed or renamed. Types and names of the public struct members and -+ * values of public macros and enums will remain the same (unless they were -+ * explicitly declared as not part of the public API). Documented behavior will -+ * not change. -+ * -+ * In other words, any correct program that works with a given FFmpeg snapshot -+ * should work just as well without any changes with any later snapshot with the -+ * same major versions. This applies to both rebuilding the program against new -+ * FFmpeg versions or to replacing the dynamic FFmpeg libraries that a program -+ * links against. -+ * -+ * However, new public symbols may be added and new members may be appended to -+ * public structs whose size is not part of public ABI (most public structs in -+ * FFmpeg). New macros and enum values may be added. Behavior in undocumented -+ * situations may change slightly (and be documented). All those are accompanied -+ * by an entry in doc/APIchanges and incrementing either the minor or micro -+ * version number. -+ */ -+ -+/** -+ * @defgroup lavu libavutil -+ * Common code shared across all FFmpeg libraries. -+ * -+ * @note -+ * libavutil is designed to be modular. In most cases, in order to use the -+ * functions provided by one component of libavutil you must explicitly include -+ * the specific header containing that feature. If you are only using -+ * media-related components, you could simply include libavutil/avutil.h, which -+ * brings in most of the "core" components. -+ * -+ * @{ -+ * -+ * @defgroup lavu_crypto Crypto and Hashing -+ * -+ * @{ -+ * @} -+ * -+ * @defgroup lavu_math Mathematics -+ * @{ -+ * -+ * @} -+ * -+ * @defgroup lavu_string String Manipulation -+ * -+ * @{ -+ * -+ * @} -+ * -+ * @defgroup lavu_mem Memory Management -+ * -+ * @{ -+ * -+ * @} -+ * -+ * @defgroup lavu_data Data Structures -+ * @{ -+ * -+ * @} -+ * -+ * @defgroup lavu_video Video related -+ * -+ * @{ -+ * -+ * @} -+ * -+ * @defgroup lavu_audio Audio related -+ * -+ * @{ -+ * -+ * @} -+ * -+ * @defgroup lavu_error Error Codes -+ * -+ * @{ -+ * -+ * @} -+ * -+ * @defgroup lavu_log Logging Facility -+ * -+ * @{ -+ * -+ * @} -+ * -+ * @defgroup lavu_misc Other -+ * -+ * @{ -+ * -+ * @defgroup preproc_misc Preprocessor String Macros -+ * -+ * @{ -+ * -+ * @} -+ * -+ * @defgroup version_utils Library Version Macros -+ * -+ * @{ -+ * -+ * @} -+ */ -+ -+ -+/** -+ * @addtogroup lavu_ver -+ * @{ -+ */ -+ -+/** -+ * Return the LIBAVUTIL_VERSION_INT constant. -+ */ -+unsigned avutil_version(void); -+ -+/** -+ * Return an informative version string. This usually is the actual release -+ * version number or a git commit description. This string has no fixed format -+ * and can change any time. It should never be parsed by code. -+ */ -+const char *av_version_info(void); -+ -+/** -+ * Return the libavutil build-time configuration. -+ */ -+const char *avutil_configuration(void); -+ -+/** -+ * Return the libavutil license. -+ */ -+const char *avutil_license(void); -+ -+/** -+ * @} -+ */ -+ -+/** -+ * @addtogroup lavu_media Media Type -+ * @brief Media Type -+ */ -+ -+enum AVMediaType { -+ AVMEDIA_TYPE_UNKNOWN = -1, ///< Usually treated as AVMEDIA_TYPE_DATA -+ AVMEDIA_TYPE_VIDEO, -+ AVMEDIA_TYPE_AUDIO, -+ AVMEDIA_TYPE_DATA, ///< Opaque data information usually continuous -+ AVMEDIA_TYPE_SUBTITLE, -+ AVMEDIA_TYPE_ATTACHMENT, ///< Opaque data information usually sparse -+ AVMEDIA_TYPE_NB -+}; -+ -+/** -+ * Return a string describing the media_type enum, NULL if media_type -+ * is unknown. -+ */ -+const char *av_get_media_type_string(enum AVMediaType media_type); -+ -+/** -+ * @defgroup lavu_const Constants -+ * @{ -+ * -+ * @defgroup lavu_enc Encoding specific -+ * -+ * @note those definition should move to avcodec -+ * @{ -+ */ -+ -+#define FF_LAMBDA_SHIFT 7 -+#define FF_LAMBDA_SCALE (1< -+ -+/** -+ * @defgroup lavu_buffer AVBuffer -+ * @ingroup lavu_data -+ * -+ * @{ -+ * AVBuffer is an API for reference-counted data buffers. -+ * -+ * There are two core objects in this API -- AVBuffer and AVBufferRef. AVBuffer -+ * represents the data buffer itself; it is opaque and not meant to be accessed -+ * by the caller directly, but only through AVBufferRef. However, the caller may -+ * e.g. compare two AVBuffer pointers to check whether two different references -+ * are describing the same data buffer. AVBufferRef represents a single -+ * reference to an AVBuffer and it is the object that may be manipulated by the -+ * caller directly. -+ * -+ * There are two functions provided for creating a new AVBuffer with a single -+ * reference -- av_buffer_alloc() to just allocate a new buffer, and -+ * av_buffer_create() to wrap an existing array in an AVBuffer. From an existing -+ * reference, additional references may be created with av_buffer_ref(). -+ * Use av_buffer_unref() to free a reference (this will automatically free the -+ * data once all the references are freed). -+ * -+ * The convention throughout this API and the rest of FFmpeg is such that the -+ * buffer is considered writable if there exists only one reference to it (and -+ * it has not been marked as read-only). The av_buffer_is_writable() function is -+ * provided to check whether this is true and av_buffer_make_writable() will -+ * automatically create a new writable buffer when necessary. -+ * Of course nothing prevents the calling code from violating this convention, -+ * however that is safe only when all the existing references are under its -+ * control. -+ * -+ * @note Referencing and unreferencing the buffers is thread-safe and thus -+ * may be done from multiple threads simultaneously without any need for -+ * additional locking. -+ * -+ * @note Two different references to the same buffer can point to different -+ * parts of the buffer (i.e. their AVBufferRef.data will not be equal). -+ */ -+ -+/** -+ * A reference counted buffer type. It is opaque and is meant to be used through -+ * references (AVBufferRef). -+ */ -+typedef struct AVBuffer AVBuffer; -+ -+/** -+ * A reference to a data buffer. -+ * -+ * The size of this struct is not a part of the public ABI and it is not meant -+ * to be allocated directly. -+ */ -+typedef struct AVBufferRef { -+ AVBuffer *buffer; -+ -+ /** -+ * The data buffer. It is considered writable if and only if -+ * this is the only reference to the buffer, in which case -+ * av_buffer_is_writable() returns 1. -+ */ -+ uint8_t *data; -+ /** -+ * Size of data in bytes. -+ */ -+ int size; -+} AVBufferRef; -+ -+/** -+ * Allocate an AVBuffer of the given size using av_malloc(). -+ * -+ * @return an AVBufferRef of given size or NULL when out of memory -+ */ -+AVBufferRef *av_buffer_alloc(int size); -+ -+/** -+ * Same as av_buffer_alloc(), except the returned buffer will be initialized -+ * to zero. -+ */ -+AVBufferRef *av_buffer_allocz(int size); -+ -+/** -+ * Always treat the buffer as read-only, even when it has only one -+ * reference. -+ */ -+#define AV_BUFFER_FLAG_READONLY (1 << 0) -+ -+/** -+ * Create an AVBuffer from an existing array. -+ * -+ * If this function is successful, data is owned by the AVBuffer. The caller may -+ * only access data through the returned AVBufferRef and references derived from -+ * it. -+ * If this function fails, data is left untouched. -+ * @param data data array -+ * @param size size of data in bytes -+ * @param free a callback for freeing this buffer's data -+ * @param opaque parameter to be got for processing or passed to free -+ * @param flags a combination of AV_BUFFER_FLAG_* -+ * -+ * @return an AVBufferRef referring to data on success, NULL on failure. -+ */ -+AVBufferRef *av_buffer_create(uint8_t *data, int size, -+ void (*free)(void *opaque, uint8_t *data), -+ void *opaque, int flags); -+ -+/** -+ * Default free callback, which calls av_free() on the buffer data. -+ * This function is meant to be passed to av_buffer_create(), not called -+ * directly. -+ */ -+void av_buffer_default_free(void *opaque, uint8_t *data); -+ -+/** -+ * Create a new reference to an AVBuffer. -+ * -+ * @return a new AVBufferRef referring to the same AVBuffer as buf or NULL on -+ * failure. -+ */ -+AVBufferRef *av_buffer_ref(AVBufferRef *buf); -+ -+/** -+ * Free a given reference and automatically free the buffer if there are no more -+ * references to it. -+ * -+ * @param buf the reference to be freed. The pointer is set to NULL on return. -+ */ -+void av_buffer_unref(AVBufferRef **buf); -+ -+/** -+ * @return 1 if the caller may write to the data referred to by buf (which is -+ * true if and only if buf is the only reference to the underlying AVBuffer). -+ * Return 0 otherwise. -+ * A positive answer is valid until av_buffer_ref() is called on buf. -+ */ -+int av_buffer_is_writable(const AVBufferRef *buf); -+ -+/** -+ * @return the opaque parameter set by av_buffer_create. -+ */ -+void *av_buffer_get_opaque(const AVBufferRef *buf); -+ -+int av_buffer_get_ref_count(const AVBufferRef *buf); -+ -+/** -+ * Create a writable reference from a given buffer reference, avoiding data copy -+ * if possible. -+ * -+ * @param buf buffer reference to make writable. On success, buf is either left -+ * untouched, or it is unreferenced and a new writable AVBufferRef is -+ * written in its place. On failure, buf is left untouched. -+ * @return 0 on success, a negative AVERROR on failure. -+ */ -+int av_buffer_make_writable(AVBufferRef **buf); -+ -+/** -+ * Reallocate a given buffer. -+ * -+ * @param buf a buffer reference to reallocate. On success, buf will be -+ * unreferenced and a new reference with the required size will be -+ * written in its place. On failure buf will be left untouched. *buf -+ * may be NULL, then a new buffer is allocated. -+ * @param size required new buffer size. -+ * @return 0 on success, a negative AVERROR on failure. -+ * -+ * @note the buffer is actually reallocated with av_realloc() only if it was -+ * initially allocated through av_buffer_realloc(NULL) and there is only one -+ * reference to it (i.e. the one passed to this function). In all other cases -+ * a new buffer is allocated and the data is copied. -+ */ -+int av_buffer_realloc(AVBufferRef **buf, int size); -+ -+/** -+ * @} -+ */ -+ -+/** -+ * @defgroup lavu_bufferpool AVBufferPool -+ * @ingroup lavu_data -+ * -+ * @{ -+ * AVBufferPool is an API for a lock-free thread-safe pool of AVBuffers. -+ * -+ * Frequently allocating and freeing large buffers may be slow. AVBufferPool is -+ * meant to solve this in cases when the caller needs a set of buffers of the -+ * same size (the most obvious use case being buffers for raw video or audio -+ * frames). -+ * -+ * At the beginning, the user must call av_buffer_pool_init() to create the -+ * buffer pool. Then whenever a buffer is needed, call av_buffer_pool_get() to -+ * get a reference to a new buffer, similar to av_buffer_alloc(). This new -+ * reference works in all aspects the same way as the one created by -+ * av_buffer_alloc(). However, when the last reference to this buffer is -+ * unreferenced, it is returned to the pool instead of being freed and will be -+ * reused for subsequent av_buffer_pool_get() calls. -+ * -+ * When the caller is done with the pool and no longer needs to allocate any new -+ * buffers, av_buffer_pool_uninit() must be called to mark the pool as freeable. -+ * Once all the buffers are released, it will automatically be freed. -+ * -+ * Allocating and releasing buffers with this API is thread-safe as long as -+ * either the default alloc callback is used, or the user-supplied one is -+ * thread-safe. -+ */ -+ -+/** -+ * The buffer pool. This structure is opaque and not meant to be accessed -+ * directly. It is allocated with av_buffer_pool_init() and freed with -+ * av_buffer_pool_uninit(). -+ */ -+typedef struct AVBufferPool AVBufferPool; -+ -+/** -+ * Allocate and initialize a buffer pool. -+ * -+ * @param size size of each buffer in this pool -+ * @param alloc a function that will be used to allocate new buffers when the -+ * pool is empty. May be NULL, then the default allocator will be used -+ * (av_buffer_alloc()). -+ * @return newly created buffer pool on success, NULL on error. -+ */ -+AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size)); -+ -+/** -+ * Allocate and initialize a buffer pool with a more complex allocator. -+ * -+ * @param size size of each buffer in this pool -+ * @param opaque arbitrary user data used by the allocator -+ * @param alloc a function that will be used to allocate new buffers when the -+ * pool is empty. -+ * @param pool_free a function that will be called immediately before the pool -+ * is freed. I.e. after av_buffer_pool_uninit() is called -+ * by the caller and all the frames are returned to the pool -+ * and freed. It is intended to uninitialize the user opaque -+ * data. -+ * @return newly created buffer pool on success, NULL on error. -+ */ -+AVBufferPool *av_buffer_pool_init2(int size, void *opaque, -+ AVBufferRef* (*alloc)(void *opaque, int size), -+ void (*pool_free)(void *opaque)); -+ -+/** -+ * Mark the pool as being available for freeing. It will actually be freed only -+ * once all the allocated buffers associated with the pool are released. Thus it -+ * is safe to call this function while some of the allocated buffers are still -+ * in use. -+ * -+ * @param pool pointer to the pool to be freed. It will be set to NULL. -+ */ -+void av_buffer_pool_uninit(AVBufferPool **pool); -+ -+/** -+ * Allocate a new AVBuffer, reusing an old buffer from the pool when available. -+ * This function may be called simultaneously from multiple threads. -+ * -+ * @return a reference to the new buffer on success, NULL on error. -+ */ -+AVBufferRef *av_buffer_pool_get(AVBufferPool *pool); -+ -+/** -+ * @} -+ */ -+ -+#endif /* AVUTIL_BUFFER_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/channel_layout.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/channel_layout.h -new file mode 100644 -index 000000000000..50bb8f03c586 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/channel_layout.h -@@ -0,0 +1,232 @@ -+/* -+ * Copyright (c) 2006 Michael Niedermayer -+ * Copyright (c) 2008 Peter Ross -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+#ifndef AVUTIL_CHANNEL_LAYOUT_H -+#define AVUTIL_CHANNEL_LAYOUT_H -+ -+#include -+ -+/** -+ * @file -+ * audio channel layout utility functions -+ */ -+ -+/** -+ * @addtogroup lavu_audio -+ * @{ -+ */ -+ -+/** -+ * @defgroup channel_masks Audio channel masks -+ * -+ * A channel layout is a 64-bits integer with a bit set for every channel. -+ * The number of bits set must be equal to the number of channels. -+ * The value 0 means that the channel layout is not known. -+ * @note this data structure is not powerful enough to handle channels -+ * combinations that have the same channel multiple times, such as -+ * dual-mono. -+ * -+ * @{ -+ */ -+#define AV_CH_FRONT_LEFT 0x00000001 -+#define AV_CH_FRONT_RIGHT 0x00000002 -+#define AV_CH_FRONT_CENTER 0x00000004 -+#define AV_CH_LOW_FREQUENCY 0x00000008 -+#define AV_CH_BACK_LEFT 0x00000010 -+#define AV_CH_BACK_RIGHT 0x00000020 -+#define AV_CH_FRONT_LEFT_OF_CENTER 0x00000040 -+#define AV_CH_FRONT_RIGHT_OF_CENTER 0x00000080 -+#define AV_CH_BACK_CENTER 0x00000100 -+#define AV_CH_SIDE_LEFT 0x00000200 -+#define AV_CH_SIDE_RIGHT 0x00000400 -+#define AV_CH_TOP_CENTER 0x00000800 -+#define AV_CH_TOP_FRONT_LEFT 0x00001000 -+#define AV_CH_TOP_FRONT_CENTER 0x00002000 -+#define AV_CH_TOP_FRONT_RIGHT 0x00004000 -+#define AV_CH_TOP_BACK_LEFT 0x00008000 -+#define AV_CH_TOP_BACK_CENTER 0x00010000 -+#define AV_CH_TOP_BACK_RIGHT 0x00020000 -+#define AV_CH_STEREO_LEFT 0x20000000 ///< Stereo downmix. -+#define AV_CH_STEREO_RIGHT 0x40000000 ///< See AV_CH_STEREO_LEFT. -+#define AV_CH_WIDE_LEFT 0x0000000080000000ULL -+#define AV_CH_WIDE_RIGHT 0x0000000100000000ULL -+#define AV_CH_SURROUND_DIRECT_LEFT 0x0000000200000000ULL -+#define AV_CH_SURROUND_DIRECT_RIGHT 0x0000000400000000ULL -+#define AV_CH_LOW_FREQUENCY_2 0x0000000800000000ULL -+ -+/** Channel mask value used for AVCodecContext.request_channel_layout -+ to indicate that the user requests the channel order of the decoder output -+ to be the native codec channel order. */ -+#define AV_CH_LAYOUT_NATIVE 0x8000000000000000ULL -+ -+/** -+ * @} -+ * @defgroup channel_mask_c Audio channel layouts -+ * @{ -+ * */ -+#define AV_CH_LAYOUT_MONO (AV_CH_FRONT_CENTER) -+#define AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT) -+#define AV_CH_LAYOUT_2POINT1 (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY) -+#define AV_CH_LAYOUT_2_1 (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER) -+#define AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) -+#define AV_CH_LAYOUT_3POINT1 (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY) -+#define AV_CH_LAYOUT_4POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER) -+#define AV_CH_LAYOUT_4POINT1 (AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY) -+#define AV_CH_LAYOUT_2_2 (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) -+#define AV_CH_LAYOUT_QUAD (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) -+#define AV_CH_LAYOUT_5POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) -+#define AV_CH_LAYOUT_5POINT1 (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY) -+#define AV_CH_LAYOUT_5POINT0_BACK (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) -+#define AV_CH_LAYOUT_5POINT1_BACK (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY) -+#define AV_CH_LAYOUT_6POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_CENTER) -+#define AV_CH_LAYOUT_6POINT0_FRONT (AV_CH_LAYOUT_2_2|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) -+#define AV_CH_LAYOUT_HEXAGONAL (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_BACK_CENTER) -+#define AV_CH_LAYOUT_6POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER) -+#define AV_CH_LAYOUT_6POINT1_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER) -+#define AV_CH_LAYOUT_6POINT1_FRONT (AV_CH_LAYOUT_6POINT0_FRONT|AV_CH_LOW_FREQUENCY) -+#define AV_CH_LAYOUT_7POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) -+#define AV_CH_LAYOUT_7POINT0_FRONT (AV_CH_LAYOUT_5POINT0|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) -+#define AV_CH_LAYOUT_7POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) -+#define AV_CH_LAYOUT_7POINT1_WIDE (AV_CH_LAYOUT_5POINT1|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) -+#define AV_CH_LAYOUT_7POINT1_WIDE_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) -+#define AV_CH_LAYOUT_OCTAGONAL (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT) -+#define AV_CH_LAYOUT_HEXADECAGONAL (AV_CH_LAYOUT_OCTAGONAL|AV_CH_WIDE_LEFT|AV_CH_WIDE_RIGHT|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT|AV_CH_TOP_BACK_CENTER|AV_CH_TOP_FRONT_CENTER|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT) -+#define AV_CH_LAYOUT_STEREO_DOWNMIX (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT) -+ -+enum AVMatrixEncoding { -+ AV_MATRIX_ENCODING_NONE, -+ AV_MATRIX_ENCODING_DOLBY, -+ AV_MATRIX_ENCODING_DPLII, -+ AV_MATRIX_ENCODING_DPLIIX, -+ AV_MATRIX_ENCODING_DPLIIZ, -+ AV_MATRIX_ENCODING_DOLBYEX, -+ AV_MATRIX_ENCODING_DOLBYHEADPHONE, -+ AV_MATRIX_ENCODING_NB -+}; -+ -+/** -+ * Return a channel layout id that matches name, or 0 if no match is found. -+ * -+ * name can be one or several of the following notations, -+ * separated by '+' or '|': -+ * - the name of an usual channel layout (mono, stereo, 4.0, quad, 5.0, -+ * 5.0(side), 5.1, 5.1(side), 7.1, 7.1(wide), downmix); -+ * - the name of a single channel (FL, FR, FC, LFE, BL, BR, FLC, FRC, BC, -+ * SL, SR, TC, TFL, TFC, TFR, TBL, TBC, TBR, DL, DR); -+ * - a number of channels, in decimal, followed by 'c', yielding -+ * the default channel layout for that number of channels (@see -+ * av_get_default_channel_layout); -+ * - a channel layout mask, in hexadecimal starting with "0x" (see the -+ * AV_CH_* macros). -+ * -+ * Example: "stereo+FC" = "2c+FC" = "2c+1c" = "0x7" -+ */ -+uint64_t av_get_channel_layout(const char *name); -+ -+/** -+ * Return a channel layout and the number of channels based on the specified name. -+ * -+ * This function is similar to (@see av_get_channel_layout), but can also parse -+ * unknown channel layout specifications. -+ * -+ * @param[in] name channel layout specification string -+ * @param[out] channel_layout parsed channel layout (0 if unknown) -+ * @param[out] nb_channels number of channels -+ * -+ * @return 0 on success, AVERROR(EINVAL) if the parsing fails. -+ */ -+int av_get_extended_channel_layout(const char *name, uint64_t* channel_layout, int* nb_channels); -+ -+/** -+ * Return a description of a channel layout. -+ * If nb_channels is <= 0, it is guessed from the channel_layout. -+ * -+ * @param buf put here the string containing the channel layout -+ * @param buf_size size in bytes of the buffer -+ */ -+void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout); -+ -+struct AVBPrint; -+/** -+ * Append a description of a channel layout to a bprint buffer. -+ */ -+void av_bprint_channel_layout(struct AVBPrint *bp, int nb_channels, uint64_t channel_layout); -+ -+/** -+ * Return the number of channels in the channel layout. -+ */ -+int av_get_channel_layout_nb_channels(uint64_t channel_layout); -+ -+/** -+ * Return default channel layout for a given number of channels. -+ */ -+int64_t av_get_default_channel_layout(int nb_channels); -+ -+/** -+ * Get the index of a channel in channel_layout. -+ * -+ * @param channel a channel layout describing exactly one channel which must be -+ * present in channel_layout. -+ * -+ * @return index of channel in channel_layout on success, a negative AVERROR -+ * on error. -+ */ -+int av_get_channel_layout_channel_index(uint64_t channel_layout, -+ uint64_t channel); -+ -+/** -+ * Get the channel with the given index in channel_layout. -+ */ -+uint64_t av_channel_layout_extract_channel(uint64_t channel_layout, int index); -+ -+/** -+ * Get the name of a given channel. -+ * -+ * @return channel name on success, NULL on error. -+ */ -+const char *av_get_channel_name(uint64_t channel); -+ -+/** -+ * Get the description of a given channel. -+ * -+ * @param channel a channel layout with a single channel -+ * @return channel description on success, NULL on error -+ */ -+const char *av_get_channel_description(uint64_t channel); -+ -+/** -+ * Get the value and name of a standard channel layout. -+ * -+ * @param[in] index index in an internal list, starting at 0 -+ * @param[out] layout channel layout mask -+ * @param[out] name name of the layout -+ * @return 0 if the layout exists, -+ * <0 if index is beyond the limits -+ */ -+int av_get_standard_channel_layout(unsigned index, uint64_t *layout, -+ const char **name); -+ -+/** -+ * @} -+ * @} -+ */ -+ -+#endif /* AVUTIL_CHANNEL_LAYOUT_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/common.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/common.h -new file mode 100644 -index 000000000000..0fffa67714e8 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/common.h -@@ -0,0 +1,560 @@ -+/* -+ * copyright (c) 2006 Michael Niedermayer -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/** -+ * @file -+ * common internal and external API header -+ */ -+ -+#ifndef AVUTIL_COMMON_H -+#define AVUTIL_COMMON_H -+ -+#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) && !defined(UINT64_C) -+#error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS -+#endif -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "attributes.h" -+#include "macros.h" -+#include "version.h" -+#include "libavutil/avconfig.h" -+ -+#if AV_HAVE_BIGENDIAN -+# define AV_NE(be, le) (be) -+#else -+# define AV_NE(be, le) (le) -+#endif -+ -+//rounded division & shift -+#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b)) -+/* assume b>0 */ -+#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) -+/* Fast a/(1<=0 and b>=0 */ -+#define AV_CEIL_RSHIFT(a,b) (!av_builtin_constant_p(b) ? -((-(a)) >> (b)) \ -+ : ((a) + (1<<(b)) - 1) >> (b)) -+/* Backwards compat. */ -+#define FF_CEIL_RSHIFT AV_CEIL_RSHIFT -+ -+#define FFUDIV(a,b) (((a)>0 ?(a):(a)-(b)+1) / (b)) -+#define FFUMOD(a,b) ((a)-(b)*FFUDIV(a,b)) -+ -+/** -+ * Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they -+ * are not representable as absolute values of their type. This is the same -+ * as with *abs() -+ * @see FFNABS() -+ */ -+#define FFABS(a) ((a) >= 0 ? (a) : (-(a))) -+#define FFSIGN(a) ((a) > 0 ? 1 : -1) -+ -+/** -+ * Negative Absolute value. -+ * this works for all integers of all types. -+ * As with many macros, this evaluates its argument twice, it thus must not have -+ * a sideeffect, that is FFNABS(x++) has undefined behavior. -+ */ -+#define FFNABS(a) ((a) <= 0 ? (a) : (-(a))) -+ -+/** -+ * Comparator. -+ * For two numerical expressions x and y, gives 1 if x > y, -1 if x < y, and 0 -+ * if x == y. This is useful for instance in a qsort comparator callback. -+ * Furthermore, compilers are able to optimize this to branchless code, and -+ * there is no risk of overflow with signed types. -+ * As with many macros, this evaluates its argument multiple times, it thus -+ * must not have a side-effect. -+ */ -+#define FFDIFFSIGN(x,y) (((x)>(y)) - ((x)<(y))) -+ -+#define FFMAX(a,b) ((a) > (b) ? (a) : (b)) -+#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c) -+#define FFMIN(a,b) ((a) > (b) ? (b) : (a)) -+#define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c) -+ -+#define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0) -+#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0])) -+ -+/* misc math functions */ -+ -+#ifdef HAVE_AV_CONFIG_H -+# include "config.h" -+# include "intmath.h" -+#endif -+ -+/* Pull in unguarded fallback defines at the end of this file. */ -+#include "common.h" -+ -+#ifndef av_log2 -+av_const int av_log2(unsigned v); -+#endif -+ -+#ifndef av_log2_16bit -+av_const int av_log2_16bit(unsigned v); -+#endif -+ -+/** -+ * Clip a signed integer value into the amin-amax range. -+ * @param a value to clip -+ * @param amin minimum value of the clip range -+ * @param amax maximum value of the clip range -+ * @return clipped value -+ */ -+static av_always_inline av_const int av_clip_c(int a, int amin, int amax) -+{ -+#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 -+ if (amin > amax) abort(); -+#endif -+ if (a < amin) return amin; -+ else if (a > amax) return amax; -+ else return a; -+} -+ -+/** -+ * Clip a signed 64bit integer value into the amin-amax range. -+ * @param a value to clip -+ * @param amin minimum value of the clip range -+ * @param amax maximum value of the clip range -+ * @return clipped value -+ */ -+static av_always_inline av_const int64_t av_clip64_c(int64_t a, int64_t amin, int64_t amax) -+{ -+#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 -+ if (amin > amax) abort(); -+#endif -+ if (a < amin) return amin; -+ else if (a > amax) return amax; -+ else return a; -+} -+ -+/** -+ * Clip a signed integer value into the 0-255 range. -+ * @param a value to clip -+ * @return clipped value -+ */ -+static av_always_inline av_const uint8_t av_clip_uint8_c(int a) -+{ -+ if (a&(~0xFF)) return (~a)>>31; -+ else return a; -+} -+ -+/** -+ * Clip a signed integer value into the -128,127 range. -+ * @param a value to clip -+ * @return clipped value -+ */ -+static av_always_inline av_const int8_t av_clip_int8_c(int a) -+{ -+ if ((a+0x80U) & ~0xFF) return (a>>31) ^ 0x7F; -+ else return a; -+} -+ -+/** -+ * Clip a signed integer value into the 0-65535 range. -+ * @param a value to clip -+ * @return clipped value -+ */ -+static av_always_inline av_const uint16_t av_clip_uint16_c(int a) -+{ -+ if (a&(~0xFFFF)) return (~a)>>31; -+ else return a; -+} -+ -+/** -+ * Clip a signed integer value into the -32768,32767 range. -+ * @param a value to clip -+ * @return clipped value -+ */ -+static av_always_inline av_const int16_t av_clip_int16_c(int a) -+{ -+ if ((a+0x8000U) & ~0xFFFF) return (a>>31) ^ 0x7FFF; -+ else return a; -+} -+ -+/** -+ * Clip a signed 64-bit integer value into the -2147483648,2147483647 range. -+ * @param a value to clip -+ * @return clipped value -+ */ -+static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a) -+{ -+ if ((a+0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (int32_t)((a>>63) ^ 0x7FFFFFFF); -+ else return (int32_t)a; -+} -+ -+/** -+ * Clip a signed integer into the -(2^p),(2^p-1) range. -+ * @param a value to clip -+ * @param p bit position to clip at -+ * @return clipped value -+ */ -+static av_always_inline av_const int av_clip_intp2_c(int a, int p) -+{ -+ if (((unsigned)a + (1 << p)) & ~((2 << p) - 1)) -+ return (a >> 31) ^ ((1 << p) - 1); -+ else -+ return a; -+} -+ -+/** -+ * Clip a signed integer to an unsigned power of two range. -+ * @param a value to clip -+ * @param p bit position to clip at -+ * @return clipped value -+ */ -+static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p) -+{ -+ if (a & ~((1<> 31 & ((1<= 2 -+ if (amin > amax) abort(); -+#endif -+ if (a < amin) return amin; -+ else if (a > amax) return amax; -+ else return a; -+} -+ -+/** -+ * Clip a double value into the amin-amax range. -+ * @param a value to clip -+ * @param amin minimum value of the clip range -+ * @param amax maximum value of the clip range -+ * @return clipped value -+ */ -+static av_always_inline av_const double av_clipd_c(double a, double amin, double amax) -+{ -+#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 -+ if (amin > amax) abort(); -+#endif -+ if (a < amin) return amin; -+ else if (a > amax) return amax; -+ else return a; -+} -+ -+/** Compute ceil(log2(x)). -+ * @param x value used to compute ceil(log2(x)) -+ * @return computed ceiling of log2(x) -+ */ -+static av_always_inline av_const int av_ceil_log2_c(int x) -+{ -+ return av_log2((x - 1) << 1); -+} -+ -+/** -+ * Count number of bits set to one in x -+ * @param x value to count bits of -+ * @return the number of bits set to one in x -+ */ -+static av_always_inline av_const int av_popcount_c(uint32_t x) -+{ -+ x -= (x >> 1) & 0x55555555; -+ x = (x & 0x33333333) + ((x >> 2) & 0x33333333); -+ x = (x + (x >> 4)) & 0x0F0F0F0F; -+ x += x >> 8; -+ return (x + (x >> 16)) & 0x3F; -+} -+ -+/** -+ * Count number of bits set to one in x -+ * @param x value to count bits of -+ * @return the number of bits set to one in x -+ */ -+static av_always_inline av_const int av_popcount64_c(uint64_t x) -+{ -+ return av_popcount((uint32_t)x) + av_popcount((uint32_t)(x >> 32)); -+} -+ -+static av_always_inline av_const int av_parity_c(uint32_t v) -+{ -+ return av_popcount(v) & 1; -+} -+ -+#define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24)) -+#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24)) -+ -+/** -+ * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form. -+ * -+ * @param val Output value, must be an lvalue of type uint32_t. -+ * @param GET_BYTE Expression reading one byte from the input. -+ * Evaluated up to 7 times (4 for the currently -+ * assigned Unicode range). With a memory buffer -+ * input, this could be *ptr++. -+ * @param ERROR Expression to be evaluated on invalid input, -+ * typically a goto statement. -+ * -+ * @warning ERROR should not contain a loop control statement which -+ * could interact with the internal while loop, and should force an -+ * exit from the macro code (e.g. through a goto or a return) in order -+ * to prevent undefined results. -+ */ -+#define GET_UTF8(val, GET_BYTE, ERROR)\ -+ val= (GET_BYTE);\ -+ {\ -+ uint32_t top = (val & 128) >> 1;\ -+ if ((val & 0xc0) == 0x80 || val >= 0xFE)\ -+ ERROR\ -+ while (val & top) {\ -+ int tmp= (GET_BYTE) - 128;\ -+ if(tmp>>6)\ -+ ERROR\ -+ val= (val<<6) + tmp;\ -+ top <<= 5;\ -+ }\ -+ val &= (top << 1) - 1;\ -+ } -+ -+/** -+ * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form. -+ * -+ * @param val Output value, must be an lvalue of type uint32_t. -+ * @param GET_16BIT Expression returning two bytes of UTF-16 data converted -+ * to native byte order. Evaluated one or two times. -+ * @param ERROR Expression to be evaluated on invalid input, -+ * typically a goto statement. -+ */ -+#define GET_UTF16(val, GET_16BIT, ERROR)\ -+ val = GET_16BIT;\ -+ {\ -+ unsigned int hi = val - 0xD800;\ -+ if (hi < 0x800) {\ -+ val = GET_16BIT - 0xDC00;\ -+ if (val > 0x3FFU || hi > 0x3FFU)\ -+ ERROR\ -+ val += (hi<<10) + 0x10000;\ -+ }\ -+ }\ -+ -+/** -+ * @def PUT_UTF8(val, tmp, PUT_BYTE) -+ * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long). -+ * @param val is an input-only argument and should be of type uint32_t. It holds -+ * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If -+ * val is given as a function it is executed only once. -+ * @param tmp is a temporary variable and should be of type uint8_t. It -+ * represents an intermediate value during conversion that is to be -+ * output by PUT_BYTE. -+ * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination. -+ * It could be a function or a statement, and uses tmp as the input byte. -+ * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be -+ * executed up to 4 times for values in the valid UTF-8 range and up to -+ * 7 times in the general case, depending on the length of the converted -+ * Unicode character. -+ */ -+#define PUT_UTF8(val, tmp, PUT_BYTE)\ -+ {\ -+ int bytes, shift;\ -+ uint32_t in = val;\ -+ if (in < 0x80) {\ -+ tmp = in;\ -+ PUT_BYTE\ -+ } else {\ -+ bytes = (av_log2(in) + 4) / 5;\ -+ shift = (bytes - 1) * 6;\ -+ tmp = (256 - (256 >> bytes)) | (in >> shift);\ -+ PUT_BYTE\ -+ while (shift >= 6) {\ -+ shift -= 6;\ -+ tmp = 0x80 | ((in >> shift) & 0x3f);\ -+ PUT_BYTE\ -+ }\ -+ }\ -+ } -+ -+/** -+ * @def PUT_UTF16(val, tmp, PUT_16BIT) -+ * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes). -+ * @param val is an input-only argument and should be of type uint32_t. It holds -+ * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If -+ * val is given as a function it is executed only once. -+ * @param tmp is a temporary variable and should be of type uint16_t. It -+ * represents an intermediate value during conversion that is to be -+ * output by PUT_16BIT. -+ * @param PUT_16BIT writes the converted UTF-16 data to any proper destination -+ * in desired endianness. It could be a function or a statement, and uses tmp -+ * as the input byte. For example, PUT_BYTE could be "*output++ = tmp;" -+ * PUT_BYTE will be executed 1 or 2 times depending on input character. -+ */ -+#define PUT_UTF16(val, tmp, PUT_16BIT)\ -+ {\ -+ uint32_t in = val;\ -+ if (in < 0x10000) {\ -+ tmp = in;\ -+ PUT_16BIT\ -+ } else {\ -+ tmp = 0xD800 | ((in - 0x10000) >> 10);\ -+ PUT_16BIT\ -+ tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\ -+ PUT_16BIT\ -+ }\ -+ }\ -+ -+ -+ -+#include "mem.h" -+ -+#ifdef HAVE_AV_CONFIG_H -+# include "internal.h" -+#endif /* HAVE_AV_CONFIG_H */ -+ -+#endif /* AVUTIL_COMMON_H */ -+ -+/* -+ * The following definitions are outside the multiple inclusion guard -+ * to ensure they are immediately available in intmath.h. -+ */ -+ -+#ifndef av_ceil_log2 -+# define av_ceil_log2 av_ceil_log2_c -+#endif -+#ifndef av_clip -+# define av_clip av_clip_c -+#endif -+#ifndef av_clip64 -+# define av_clip64 av_clip64_c -+#endif -+#ifndef av_clip_uint8 -+# define av_clip_uint8 av_clip_uint8_c -+#endif -+#ifndef av_clip_int8 -+# define av_clip_int8 av_clip_int8_c -+#endif -+#ifndef av_clip_uint16 -+# define av_clip_uint16 av_clip_uint16_c -+#endif -+#ifndef av_clip_int16 -+# define av_clip_int16 av_clip_int16_c -+#endif -+#ifndef av_clipl_int32 -+# define av_clipl_int32 av_clipl_int32_c -+#endif -+#ifndef av_clip_intp2 -+# define av_clip_intp2 av_clip_intp2_c -+#endif -+#ifndef av_clip_uintp2 -+# define av_clip_uintp2 av_clip_uintp2_c -+#endif -+#ifndef av_mod_uintp2 -+# define av_mod_uintp2 av_mod_uintp2_c -+#endif -+#ifndef av_sat_add32 -+# define av_sat_add32 av_sat_add32_c -+#endif -+#ifndef av_sat_dadd32 -+# define av_sat_dadd32 av_sat_dadd32_c -+#endif -+#ifndef av_sat_sub32 -+# define av_sat_sub32 av_sat_sub32_c -+#endif -+#ifndef av_sat_dsub32 -+# define av_sat_dsub32 av_sat_dsub32_c -+#endif -+#ifndef av_clipf -+# define av_clipf av_clipf_c -+#endif -+#ifndef av_clipd -+# define av_clipd av_clipd_c -+#endif -+#ifndef av_popcount -+# define av_popcount av_popcount_c -+#endif -+#ifndef av_popcount64 -+# define av_popcount64 av_popcount64_c -+#endif -+#ifndef av_parity -+# define av_parity av_parity_c -+#endif -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/cpu.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/cpu.h -new file mode 100644 -index 000000000000..8bb9eb606bf2 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/cpu.h -@@ -0,0 +1,130 @@ -+/* -+ * Copyright (c) 2000, 2001, 2002 Fabrice Bellard -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+#ifndef AVUTIL_CPU_H -+#define AVUTIL_CPU_H -+ -+#include -+ -+#include "attributes.h" -+ -+#define AV_CPU_FLAG_FORCE 0x80000000 /* force usage of selected flags (OR) */ -+ -+ /* lower 16 bits - CPU features */ -+#define AV_CPU_FLAG_MMX 0x0001 ///< standard MMX -+#define AV_CPU_FLAG_MMXEXT 0x0002 ///< SSE integer functions or AMD MMX ext -+#define AV_CPU_FLAG_MMX2 0x0002 ///< SSE integer functions or AMD MMX ext -+#define AV_CPU_FLAG_3DNOW 0x0004 ///< AMD 3DNOW -+#define AV_CPU_FLAG_SSE 0x0008 ///< SSE functions -+#define AV_CPU_FLAG_SSE2 0x0010 ///< PIV SSE2 functions -+#define AV_CPU_FLAG_SSE2SLOW 0x40000000 ///< SSE2 supported, but usually not faster -+ ///< than regular MMX/SSE (e.g. Core1) -+#define AV_CPU_FLAG_3DNOWEXT 0x0020 ///< AMD 3DNowExt -+#define AV_CPU_FLAG_SSE3 0x0040 ///< Prescott SSE3 functions -+#define AV_CPU_FLAG_SSE3SLOW 0x20000000 ///< SSE3 supported, but usually not faster -+ ///< than regular MMX/SSE (e.g. Core1) -+#define AV_CPU_FLAG_SSSE3 0x0080 ///< Conroe SSSE3 functions -+#define AV_CPU_FLAG_SSSE3SLOW 0x4000000 ///< SSSE3 supported, but usually not faster -+#define AV_CPU_FLAG_ATOM 0x10000000 ///< Atom processor, some SSSE3 instructions are slower -+#define AV_CPU_FLAG_SSE4 0x0100 ///< Penryn SSE4.1 functions -+#define AV_CPU_FLAG_SSE42 0x0200 ///< Nehalem SSE4.2 functions -+#define AV_CPU_FLAG_AESNI 0x80000 ///< Advanced Encryption Standard functions -+#define AV_CPU_FLAG_AVX 0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used -+#define AV_CPU_FLAG_AVXSLOW 0x8000000 ///< AVX supported, but slow when using YMM registers (e.g. Bulldozer) -+#define AV_CPU_FLAG_XOP 0x0400 ///< Bulldozer XOP functions -+#define AV_CPU_FLAG_FMA4 0x0800 ///< Bulldozer FMA4 functions -+#define AV_CPU_FLAG_CMOV 0x1000 ///< supports cmov instruction -+#define AV_CPU_FLAG_AVX2 0x8000 ///< AVX2 functions: requires OS support even if YMM registers aren't used -+#define AV_CPU_FLAG_FMA3 0x10000 ///< Haswell FMA3 functions -+#define AV_CPU_FLAG_BMI1 0x20000 ///< Bit Manipulation Instruction Set 1 -+#define AV_CPU_FLAG_BMI2 0x40000 ///< Bit Manipulation Instruction Set 2 -+#define AV_CPU_FLAG_AVX512 0x100000 ///< AVX-512 functions: requires OS support even if YMM/ZMM registers aren't used -+ -+#define AV_CPU_FLAG_ALTIVEC 0x0001 ///< standard -+#define AV_CPU_FLAG_VSX 0x0002 ///< ISA 2.06 -+#define AV_CPU_FLAG_POWER8 0x0004 ///< ISA 2.07 -+ -+#define AV_CPU_FLAG_ARMV5TE (1 << 0) -+#define AV_CPU_FLAG_ARMV6 (1 << 1) -+#define AV_CPU_FLAG_ARMV6T2 (1 << 2) -+#define AV_CPU_FLAG_VFP (1 << 3) -+#define AV_CPU_FLAG_VFPV3 (1 << 4) -+#define AV_CPU_FLAG_NEON (1 << 5) -+#define AV_CPU_FLAG_ARMV8 (1 << 6) -+#define AV_CPU_FLAG_VFP_VM (1 << 7) ///< VFPv2 vector mode, deprecated in ARMv7-A and unavailable in various CPUs implementations -+#define AV_CPU_FLAG_SETEND (1 <<16) -+ -+/** -+ * Return the flags which specify extensions supported by the CPU. -+ * The returned value is affected by av_force_cpu_flags() if that was used -+ * before. So av_get_cpu_flags() can easily be used in an application to -+ * detect the enabled cpu flags. -+ */ -+int av_get_cpu_flags(void); -+ -+/** -+ * Disables cpu detection and forces the specified flags. -+ * -1 is a special case that disables forcing of specific flags. -+ */ -+void av_force_cpu_flags(int flags); -+ -+/** -+ * Set a mask on flags returned by av_get_cpu_flags(). -+ * This function is mainly useful for testing. -+ * Please use av_force_cpu_flags() and av_get_cpu_flags() instead which are more flexible -+ */ -+attribute_deprecated void av_set_cpu_flags_mask(int mask); -+ -+/** -+ * Parse CPU flags from a string. -+ * -+ * The returned flags contain the specified flags as well as related unspecified flags. -+ * -+ * This function exists only for compatibility with libav. -+ * Please use av_parse_cpu_caps() when possible. -+ * @return a combination of AV_CPU_* flags, negative on error. -+ */ -+attribute_deprecated -+int av_parse_cpu_flags(const char *s); -+ -+/** -+ * Parse CPU caps from a string and update the given AV_CPU_* flags based on that. -+ * -+ * @return negative on error. -+ */ -+int av_parse_cpu_caps(unsigned *flags, const char *s); -+ -+/** -+ * @return the number of logical CPU cores present. -+ */ -+int av_cpu_count(void); -+ -+/** -+ * Get the maximum data alignment that may be required by FFmpeg. -+ * -+ * Note that this is affected by the build configuration and the CPU flags mask, -+ * so e.g. if the CPU supports AVX, but libavutil has been built with -+ * --disable-avx or the AV_CPU_FLAG_AVX flag has been disabled through -+ * av_set_cpu_flags_mask(), then this function will behave as if AVX is not -+ * present. -+ */ -+size_t av_cpu_max_align(void); -+ -+#endif /* AVUTIL_CPU_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/dict.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/dict.h -new file mode 100644 -index 000000000000..118f1f00ed20 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/dict.h -@@ -0,0 +1,200 @@ -+/* -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/** -+ * @file -+ * Public dictionary API. -+ * @deprecated -+ * AVDictionary is provided for compatibility with libav. It is both in -+ * implementation as well as API inefficient. It does not scale and is -+ * extremely slow with large dictionaries. -+ * It is recommended that new code uses our tree container from tree.c/h -+ * where applicable, which uses AVL trees to achieve O(log n) performance. -+ */ -+ -+#ifndef AVUTIL_DICT_H -+#define AVUTIL_DICT_H -+ -+#include -+ -+#include "version.h" -+ -+/** -+ * @addtogroup lavu_dict AVDictionary -+ * @ingroup lavu_data -+ * -+ * @brief Simple key:value store -+ * -+ * @{ -+ * Dictionaries are used for storing key:value pairs. To create -+ * an AVDictionary, simply pass an address of a NULL pointer to -+ * av_dict_set(). NULL can be used as an empty dictionary wherever -+ * a pointer to an AVDictionary is required. -+ * Use av_dict_get() to retrieve an entry or iterate over all -+ * entries and finally av_dict_free() to free the dictionary -+ * and all its contents. -+ * -+ @code -+ AVDictionary *d = NULL; // "create" an empty dictionary -+ AVDictionaryEntry *t = NULL; -+ -+ av_dict_set(&d, "foo", "bar", 0); // add an entry -+ -+ char *k = av_strdup("key"); // if your strings are already allocated, -+ char *v = av_strdup("value"); // you can avoid copying them like this -+ av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL); -+ -+ while (t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) { -+ <....> // iterate over all entries in d -+ } -+ av_dict_free(&d); -+ @endcode -+ */ -+ -+#define AV_DICT_MATCH_CASE 1 /**< Only get an entry with exact-case key match. Only relevant in av_dict_get(). */ -+#define AV_DICT_IGNORE_SUFFIX 2 /**< Return first entry in a dictionary whose first part corresponds to the search key, -+ ignoring the suffix of the found key string. Only relevant in av_dict_get(). */ -+#define AV_DICT_DONT_STRDUP_KEY 4 /**< Take ownership of a key that's been -+ allocated with av_malloc() or another memory allocation function. */ -+#define AV_DICT_DONT_STRDUP_VAL 8 /**< Take ownership of a value that's been -+ allocated with av_malloc() or another memory allocation function. */ -+#define AV_DICT_DONT_OVERWRITE 16 ///< Don't overwrite existing entries. -+#define AV_DICT_APPEND 32 /**< If the entry already exists, append to it. Note that no -+ delimiter is added, the strings are simply concatenated. */ -+#define AV_DICT_MULTIKEY 64 /**< Allow to store several equal keys in the dictionary */ -+ -+typedef struct AVDictionaryEntry { -+ char *key; -+ char *value; -+} AVDictionaryEntry; -+ -+typedef struct AVDictionary AVDictionary; -+ -+/** -+ * Get a dictionary entry with matching key. -+ * -+ * The returned entry key or value must not be changed, or it will -+ * cause undefined behavior. -+ * -+ * To iterate through all the dictionary entries, you can set the matching key -+ * to the null string "" and set the AV_DICT_IGNORE_SUFFIX flag. -+ * -+ * @param prev Set to the previous matching element to find the next. -+ * If set to NULL the first matching element is returned. -+ * @param key matching key -+ * @param flags a collection of AV_DICT_* flags controlling how the entry is retrieved -+ * @return found entry or NULL in case no matching entry was found in the dictionary -+ */ -+AVDictionaryEntry *av_dict_get(const AVDictionary *m, const char *key, -+ const AVDictionaryEntry *prev, int flags); -+ -+/** -+ * Get number of entries in dictionary. -+ * -+ * @param m dictionary -+ * @return number of entries in dictionary -+ */ -+int av_dict_count(const AVDictionary *m); -+ -+/** -+ * Set the given entry in *pm, overwriting an existing entry. -+ * -+ * Note: If AV_DICT_DONT_STRDUP_KEY or AV_DICT_DONT_STRDUP_VAL is set, -+ * these arguments will be freed on error. -+ * -+ * Warning: Adding a new entry to a dictionary invalidates all existing entries -+ * previously returned with av_dict_get. -+ * -+ * @param pm pointer to a pointer to a dictionary struct. If *pm is NULL -+ * a dictionary struct is allocated and put in *pm. -+ * @param key entry key to add to *pm (will either be av_strduped or added as a new key depending on flags) -+ * @param value entry value to add to *pm (will be av_strduped or added as a new key depending on flags). -+ * Passing a NULL value will cause an existing entry to be deleted. -+ * @return >= 0 on success otherwise an error code <0 -+ */ -+int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags); -+ -+/** -+ * Convenience wrapper for av_dict_set that converts the value to a string -+ * and stores it. -+ * -+ * Note: If AV_DICT_DONT_STRDUP_KEY is set, key will be freed on error. -+ */ -+int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags); -+ -+/** -+ * Parse the key/value pairs list and add the parsed entries to a dictionary. -+ * -+ * In case of failure, all the successfully set entries are stored in -+ * *pm. You may need to manually free the created dictionary. -+ * -+ * @param key_val_sep a 0-terminated list of characters used to separate -+ * key from value -+ * @param pairs_sep a 0-terminated list of characters used to separate -+ * two pairs from each other -+ * @param flags flags to use when adding to dictionary. -+ * AV_DICT_DONT_STRDUP_KEY and AV_DICT_DONT_STRDUP_VAL -+ * are ignored since the key/value tokens will always -+ * be duplicated. -+ * @return 0 on success, negative AVERROR code on failure -+ */ -+int av_dict_parse_string(AVDictionary **pm, const char *str, -+ const char *key_val_sep, const char *pairs_sep, -+ int flags); -+ -+/** -+ * Copy entries from one AVDictionary struct into another. -+ * @param dst pointer to a pointer to a AVDictionary struct. If *dst is NULL, -+ * this function will allocate a struct for you and put it in *dst -+ * @param src pointer to source AVDictionary struct -+ * @param flags flags to use when setting entries in *dst -+ * @note metadata is read using the AV_DICT_IGNORE_SUFFIX flag -+ * @return 0 on success, negative AVERROR code on failure. If dst was allocated -+ * by this function, callers should free the associated memory. -+ */ -+int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags); -+ -+/** -+ * Free all the memory allocated for an AVDictionary struct -+ * and all keys and values. -+ */ -+void av_dict_free(AVDictionary **m); -+ -+/** -+ * Get dictionary entries as a string. -+ * -+ * Create a string containing dictionary's entries. -+ * Such string may be passed back to av_dict_parse_string(). -+ * @note String is escaped with backslashes ('\'). -+ * -+ * @param[in] m dictionary -+ * @param[out] buffer Pointer to buffer that will be allocated with string containg entries. -+ * Buffer must be freed by the caller when is no longer needed. -+ * @param[in] key_val_sep character used to separate key from value -+ * @param[in] pairs_sep character used to separate two pairs from each other -+ * @return >= 0 on success, negative on error -+ * @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the same. -+ */ -+int av_dict_get_string(const AVDictionary *m, char **buffer, -+ const char key_val_sep, const char pairs_sep); -+ -+/** -+ * @} -+ */ -+ -+#endif /* AVUTIL_DICT_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/error.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/error.h -new file mode 100644 -index 000000000000..71df4da353b9 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/error.h -@@ -0,0 +1,126 @@ -+/* -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/** -+ * @file -+ * error code definitions -+ */ -+ -+#ifndef AVUTIL_ERROR_H -+#define AVUTIL_ERROR_H -+ -+#include -+#include -+ -+/** -+ * @addtogroup lavu_error -+ * -+ * @{ -+ */ -+ -+ -+/* error handling */ -+#if EDOM > 0 -+#define AVERROR(e) (-(e)) ///< Returns a negative error code from a POSIX error code, to return from library functions. -+#define AVUNERROR(e) (-(e)) ///< Returns a POSIX error code from a library function error return value. -+#else -+/* Some platforms have E* and errno already negated. */ -+#define AVERROR(e) (e) -+#define AVUNERROR(e) (e) -+#endif -+ -+#define FFERRTAG(a, b, c, d) (-(int)MKTAG(a, b, c, d)) -+ -+#define AVERROR_BSF_NOT_FOUND FFERRTAG(0xF8,'B','S','F') ///< Bitstream filter not found -+#define AVERROR_BUG FFERRTAG( 'B','U','G','!') ///< Internal bug, also see AVERROR_BUG2 -+#define AVERROR_BUFFER_TOO_SMALL FFERRTAG( 'B','U','F','S') ///< Buffer too small -+#define AVERROR_DECODER_NOT_FOUND FFERRTAG(0xF8,'D','E','C') ///< Decoder not found -+#define AVERROR_DEMUXER_NOT_FOUND FFERRTAG(0xF8,'D','E','M') ///< Demuxer not found -+#define AVERROR_ENCODER_NOT_FOUND FFERRTAG(0xF8,'E','N','C') ///< Encoder not found -+#define AVERROR_EOF FFERRTAG( 'E','O','F',' ') ///< End of file -+#define AVERROR_EXIT FFERRTAG( 'E','X','I','T') ///< Immediate exit was requested; the called function should not be restarted -+#define AVERROR_EXTERNAL FFERRTAG( 'E','X','T',' ') ///< Generic error in an external library -+#define AVERROR_FILTER_NOT_FOUND FFERRTAG(0xF8,'F','I','L') ///< Filter not found -+#define AVERROR_INVALIDDATA FFERRTAG( 'I','N','D','A') ///< Invalid data found when processing input -+#define AVERROR_MUXER_NOT_FOUND FFERRTAG(0xF8,'M','U','X') ///< Muxer not found -+#define AVERROR_OPTION_NOT_FOUND FFERRTAG(0xF8,'O','P','T') ///< Option not found -+#define AVERROR_PATCHWELCOME FFERRTAG( 'P','A','W','E') ///< Not yet implemented in FFmpeg, patches welcome -+#define AVERROR_PROTOCOL_NOT_FOUND FFERRTAG(0xF8,'P','R','O') ///< Protocol not found -+ -+#define AVERROR_STREAM_NOT_FOUND FFERRTAG(0xF8,'S','T','R') ///< Stream not found -+/** -+ * This is semantically identical to AVERROR_BUG -+ * it has been introduced in Libav after our AVERROR_BUG and with a modified value. -+ */ -+#define AVERROR_BUG2 FFERRTAG( 'B','U','G',' ') -+#define AVERROR_UNKNOWN FFERRTAG( 'U','N','K','N') ///< Unknown error, typically from an external library -+#define AVERROR_EXPERIMENTAL (-0x2bb2afa8) ///< Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it. -+#define AVERROR_INPUT_CHANGED (-0x636e6701) ///< Input changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_OUTPUT_CHANGED) -+#define AVERROR_OUTPUT_CHANGED (-0x636e6702) ///< Output changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_INPUT_CHANGED) -+/* HTTP & RTSP errors */ -+#define AVERROR_HTTP_BAD_REQUEST FFERRTAG(0xF8,'4','0','0') -+#define AVERROR_HTTP_UNAUTHORIZED FFERRTAG(0xF8,'4','0','1') -+#define AVERROR_HTTP_FORBIDDEN FFERRTAG(0xF8,'4','0','3') -+#define AVERROR_HTTP_NOT_FOUND FFERRTAG(0xF8,'4','0','4') -+#define AVERROR_HTTP_OTHER_4XX FFERRTAG(0xF8,'4','X','X') -+#define AVERROR_HTTP_SERVER_ERROR FFERRTAG(0xF8,'5','X','X') -+ -+#define AV_ERROR_MAX_STRING_SIZE 64 -+ -+/** -+ * Put a description of the AVERROR code errnum in errbuf. -+ * In case of failure the global variable errno is set to indicate the -+ * error. Even in case of failure av_strerror() will print a generic -+ * error message indicating the errnum provided to errbuf. -+ * -+ * @param errnum error code to describe -+ * @param errbuf buffer to which description is written -+ * @param errbuf_size the size in bytes of errbuf -+ * @return 0 on success, a negative value if a description for errnum -+ * cannot be found -+ */ -+int av_strerror(int errnum, char *errbuf, size_t errbuf_size); -+ -+/** -+ * Fill the provided buffer with a string containing an error string -+ * corresponding to the AVERROR code errnum. -+ * -+ * @param errbuf a buffer -+ * @param errbuf_size size in bytes of errbuf -+ * @param errnum error code to describe -+ * @return the buffer in input, filled with the error description -+ * @see av_strerror() -+ */ -+static inline char *av_make_error_string(char *errbuf, size_t errbuf_size, int errnum) -+{ -+ av_strerror(errnum, errbuf, errbuf_size); -+ return errbuf; -+} -+ -+/** -+ * Convenience macro, the return value should be used only directly in -+ * function arguments but never stand-alone. -+ */ -+#define av_err2str(errnum) \ -+ av_make_error_string((char[AV_ERROR_MAX_STRING_SIZE]){0}, AV_ERROR_MAX_STRING_SIZE, errnum) -+ -+/** -+ * @} -+ */ -+ -+#endif /* AVUTIL_ERROR_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/frame.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/frame.h -new file mode 100644 -index 000000000000..9d57d6ce66ff ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/frame.h -@@ -0,0 +1,893 @@ -+/* -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/** -+ * @file -+ * @ingroup lavu_frame -+ * reference-counted frame API -+ */ -+ -+#ifndef AVUTIL_FRAME_H -+#define AVUTIL_FRAME_H -+ -+#include -+#include -+ -+#include "avutil.h" -+#include "buffer.h" -+#include "dict.h" -+#include "rational.h" -+#include "samplefmt.h" -+#include "pixfmt.h" -+#include "version.h" -+ -+ -+/** -+ * @defgroup lavu_frame AVFrame -+ * @ingroup lavu_data -+ * -+ * @{ -+ * AVFrame is an abstraction for reference-counted raw multimedia data. -+ */ -+ -+enum AVFrameSideDataType { -+ /** -+ * The data is the AVPanScan struct defined in libavcodec. -+ */ -+ AV_FRAME_DATA_PANSCAN, -+ /** -+ * ATSC A53 Part 4 Closed Captions. -+ * A53 CC bitstream is stored as uint8_t in AVFrameSideData.data. -+ * The number of bytes of CC data is AVFrameSideData.size. -+ */ -+ AV_FRAME_DATA_A53_CC, -+ /** -+ * Stereoscopic 3d metadata. -+ * The data is the AVStereo3D struct defined in libavutil/stereo3d.h. -+ */ -+ AV_FRAME_DATA_STEREO3D, -+ /** -+ * The data is the AVMatrixEncoding enum defined in libavutil/channel_layout.h. -+ */ -+ AV_FRAME_DATA_MATRIXENCODING, -+ /** -+ * Metadata relevant to a downmix procedure. -+ * The data is the AVDownmixInfo struct defined in libavutil/downmix_info.h. -+ */ -+ AV_FRAME_DATA_DOWNMIX_INFO, -+ /** -+ * ReplayGain information in the form of the AVReplayGain struct. -+ */ -+ AV_FRAME_DATA_REPLAYGAIN, -+ /** -+ * This side data contains a 3x3 transformation matrix describing an affine -+ * transformation that needs to be applied to the frame for correct -+ * presentation. -+ * -+ * See libavutil/display.h for a detailed description of the data. -+ */ -+ AV_FRAME_DATA_DISPLAYMATRIX, -+ /** -+ * Active Format Description data consisting of a single byte as specified -+ * in ETSI TS 101 154 using AVActiveFormatDescription enum. -+ */ -+ AV_FRAME_DATA_AFD, -+ /** -+ * Motion vectors exported by some codecs (on demand through the export_mvs -+ * flag set in the libavcodec AVCodecContext flags2 option). -+ * The data is the AVMotionVector struct defined in -+ * libavutil/motion_vector.h. -+ */ -+ AV_FRAME_DATA_MOTION_VECTORS, -+ /** -+ * Recommmends skipping the specified number of samples. This is exported -+ * only if the "skip_manual" AVOption is set in libavcodec. -+ * This has the same format as AV_PKT_DATA_SKIP_SAMPLES. -+ * @code -+ * u32le number of samples to skip from start of this packet -+ * u32le number of samples to skip from end of this packet -+ * u8 reason for start skip -+ * u8 reason for end skip (0=padding silence, 1=convergence) -+ * @endcode -+ */ -+ AV_FRAME_DATA_SKIP_SAMPLES, -+ /** -+ * This side data must be associated with an audio frame and corresponds to -+ * enum AVAudioServiceType defined in avcodec.h. -+ */ -+ AV_FRAME_DATA_AUDIO_SERVICE_TYPE, -+ /** -+ * Mastering display metadata associated with a video frame. The payload is -+ * an AVMasteringDisplayMetadata type and contains information about the -+ * mastering display color volume. -+ */ -+ AV_FRAME_DATA_MASTERING_DISPLAY_METADATA, -+ /** -+ * The GOP timecode in 25 bit timecode format. Data format is 64-bit integer. -+ * This is set on the first frame of a GOP that has a temporal reference of 0. -+ */ -+ AV_FRAME_DATA_GOP_TIMECODE, -+ -+ /** -+ * The data represents the AVSphericalMapping structure defined in -+ * libavutil/spherical.h. -+ */ -+ AV_FRAME_DATA_SPHERICAL, -+ -+ /** -+ * Content light level (based on CTA-861.3). This payload contains data in -+ * the form of the AVContentLightMetadata struct. -+ */ -+ AV_FRAME_DATA_CONTENT_LIGHT_LEVEL, -+ -+ /** -+ * The data contains an ICC profile as an opaque octet buffer following the -+ * format described by ISO 15076-1 with an optional name defined in the -+ * metadata key entry "name". -+ */ -+ AV_FRAME_DATA_ICC_PROFILE, -+ -+#if FF_API_FRAME_QP -+ /** -+ * Implementation-specific description of the format of AV_FRAME_QP_TABLE_DATA. -+ * The contents of this side data are undocumented and internal; use -+ * av_frame_set_qp_table() and av_frame_get_qp_table() to access this in a -+ * meaningful way instead. -+ */ -+ AV_FRAME_DATA_QP_TABLE_PROPERTIES, -+ -+ /** -+ * Raw QP table data. Its format is described by -+ * AV_FRAME_DATA_QP_TABLE_PROPERTIES. Use av_frame_set_qp_table() and -+ * av_frame_get_qp_table() to access this instead. -+ */ -+ AV_FRAME_DATA_QP_TABLE_DATA, -+#endif -+}; -+ -+enum AVActiveFormatDescription { -+ AV_AFD_SAME = 8, -+ AV_AFD_4_3 = 9, -+ AV_AFD_16_9 = 10, -+ AV_AFD_14_9 = 11, -+ AV_AFD_4_3_SP_14_9 = 13, -+ AV_AFD_16_9_SP_14_9 = 14, -+ AV_AFD_SP_4_3 = 15, -+}; -+ -+ -+/** -+ * Structure to hold side data for an AVFrame. -+ * -+ * sizeof(AVFrameSideData) is not a part of the public ABI, so new fields may be added -+ * to the end with a minor bump. -+ */ -+typedef struct AVFrameSideData { -+ enum AVFrameSideDataType type; -+ uint8_t *data; -+ int size; -+ AVDictionary *metadata; -+ AVBufferRef *buf; -+} AVFrameSideData; -+ -+/** -+ * This structure describes decoded (raw) audio or video data. -+ * -+ * AVFrame must be allocated using av_frame_alloc(). Note that this only -+ * allocates the AVFrame itself, the buffers for the data must be managed -+ * through other means (see below). -+ * AVFrame must be freed with av_frame_free(). -+ * -+ * AVFrame is typically allocated once and then reused multiple times to hold -+ * different data (e.g. a single AVFrame to hold frames received from a -+ * decoder). In such a case, av_frame_unref() will free any references held by -+ * the frame and reset it to its original clean state before it -+ * is reused again. -+ * -+ * The data described by an AVFrame is usually reference counted through the -+ * AVBuffer API. The underlying buffer references are stored in AVFrame.buf / -+ * AVFrame.extended_buf. An AVFrame is considered to be reference counted if at -+ * least one reference is set, i.e. if AVFrame.buf[0] != NULL. In such a case, -+ * every single data plane must be contained in one of the buffers in -+ * AVFrame.buf or AVFrame.extended_buf. -+ * There may be a single buffer for all the data, or one separate buffer for -+ * each plane, or anything in between. -+ * -+ * sizeof(AVFrame) is not a part of the public ABI, so new fields may be added -+ * to the end with a minor bump. -+ * -+ * Fields can be accessed through AVOptions, the name string used, matches the -+ * C structure field name for fields accessible through AVOptions. The AVClass -+ * for AVFrame can be obtained from avcodec_get_frame_class() -+ */ -+typedef struct AVFrame { -+#define AV_NUM_DATA_POINTERS 8 -+ /** -+ * pointer to the picture/channel planes. -+ * This might be different from the first allocated byte -+ * -+ * Some decoders access areas outside 0,0 - width,height, please -+ * see avcodec_align_dimensions2(). Some filters and swscale can read -+ * up to 16 bytes beyond the planes, if these filters are to be used, -+ * then 16 extra bytes must be allocated. -+ * -+ * NOTE: Except for hwaccel formats, pointers not needed by the format -+ * MUST be set to NULL. -+ */ -+ uint8_t *data[AV_NUM_DATA_POINTERS]; -+ -+ /** -+ * For video, size in bytes of each picture line. -+ * For audio, size in bytes of each plane. -+ * -+ * For audio, only linesize[0] may be set. For planar audio, each channel -+ * plane must be the same size. -+ * -+ * For video the linesizes should be multiples of the CPUs alignment -+ * preference, this is 16 or 32 for modern desktop CPUs. -+ * Some code requires such alignment other code can be slower without -+ * correct alignment, for yet other it makes no difference. -+ * -+ * @note The linesize may be larger than the size of usable data -- there -+ * may be extra padding present for performance reasons. -+ */ -+ int linesize[AV_NUM_DATA_POINTERS]; -+ -+ /** -+ * pointers to the data planes/channels. -+ * -+ * For video, this should simply point to data[]. -+ * -+ * For planar audio, each channel has a separate data pointer, and -+ * linesize[0] contains the size of each channel buffer. -+ * For packed audio, there is just one data pointer, and linesize[0] -+ * contains the total size of the buffer for all channels. -+ * -+ * Note: Both data and extended_data should always be set in a valid frame, -+ * but for planar audio with more channels that can fit in data, -+ * extended_data must be used in order to access all channels. -+ */ -+ uint8_t **extended_data; -+ -+ /** -+ * @name Video dimensions -+ * Video frames only. The coded dimensions (in pixels) of the video frame, -+ * i.e. the size of the rectangle that contains some well-defined values. -+ * -+ * @note The part of the frame intended for display/presentation is further -+ * restricted by the @ref cropping "Cropping rectangle". -+ * @{ -+ */ -+ int width, height; -+ /** -+ * @} -+ */ -+ -+ /** -+ * number of audio samples (per channel) described by this frame -+ */ -+ int nb_samples; -+ -+ /** -+ * format of the frame, -1 if unknown or unset -+ * Values correspond to enum AVPixelFormat for video frames, -+ * enum AVSampleFormat for audio) -+ */ -+ int format; -+ -+ /** -+ * 1 -> keyframe, 0-> not -+ */ -+ int key_frame; -+ -+ /** -+ * Picture type of the frame. -+ */ -+ enum AVPictureType pict_type; -+ -+ /** -+ * Sample aspect ratio for the video frame, 0/1 if unknown/unspecified. -+ */ -+ AVRational sample_aspect_ratio; -+ -+ /** -+ * Presentation timestamp in time_base units (time when frame should be shown to user). -+ */ -+ int64_t pts; -+ -+#if FF_API_PKT_PTS -+ /** -+ * PTS copied from the AVPacket that was decoded to produce this frame. -+ * @deprecated use the pts field instead -+ */ -+ attribute_deprecated -+ int64_t pkt_pts; -+#endif -+ -+ /** -+ * DTS copied from the AVPacket that triggered returning this frame. (if frame threading isn't used) -+ * This is also the Presentation time of this AVFrame calculated from -+ * only AVPacket.dts values without pts values. -+ */ -+ int64_t pkt_dts; -+ -+ /** -+ * picture number in bitstream order -+ */ -+ int coded_picture_number; -+ /** -+ * picture number in display order -+ */ -+ int display_picture_number; -+ -+ /** -+ * quality (between 1 (good) and FF_LAMBDA_MAX (bad)) -+ */ -+ int quality; -+ -+ /** -+ * for some private data of the user -+ */ -+ void *opaque; -+ -+#if FF_API_ERROR_FRAME -+ /** -+ * @deprecated unused -+ */ -+ attribute_deprecated -+ uint64_t error[AV_NUM_DATA_POINTERS]; -+#endif -+ -+ /** -+ * When decoding, this signals how much the picture must be delayed. -+ * extra_delay = repeat_pict / (2*fps) -+ */ -+ int repeat_pict; -+ -+ /** -+ * The content of the picture is interlaced. -+ */ -+ int interlaced_frame; -+ -+ /** -+ * If the content is interlaced, is top field displayed first. -+ */ -+ int top_field_first; -+ -+ /** -+ * Tell user application that palette has changed from previous frame. -+ */ -+ int palette_has_changed; -+ -+ /** -+ * reordered opaque 64 bits (generally an integer or a double precision float -+ * PTS but can be anything). -+ * The user sets AVCodecContext.reordered_opaque to represent the input at -+ * that time, -+ * the decoder reorders values as needed and sets AVFrame.reordered_opaque -+ * to exactly one of the values provided by the user through AVCodecContext.reordered_opaque -+ * @deprecated in favor of pkt_pts -+ */ -+ int64_t reordered_opaque; -+ -+ /** -+ * Sample rate of the audio data. -+ */ -+ int sample_rate; -+ -+ /** -+ * Channel layout of the audio data. -+ */ -+ uint64_t channel_layout; -+ -+ /** -+ * AVBuffer references backing the data for this frame. If all elements of -+ * this array are NULL, then this frame is not reference counted. This array -+ * must be filled contiguously -- if buf[i] is non-NULL then buf[j] must -+ * also be non-NULL for all j < i. -+ * -+ * There may be at most one AVBuffer per data plane, so for video this array -+ * always contains all the references. For planar audio with more than -+ * AV_NUM_DATA_POINTERS channels, there may be more buffers than can fit in -+ * this array. Then the extra AVBufferRef pointers are stored in the -+ * extended_buf array. -+ */ -+ AVBufferRef *buf[AV_NUM_DATA_POINTERS]; -+ -+ /** -+ * For planar audio which requires more than AV_NUM_DATA_POINTERS -+ * AVBufferRef pointers, this array will hold all the references which -+ * cannot fit into AVFrame.buf. -+ * -+ * Note that this is different from AVFrame.extended_data, which always -+ * contains all the pointers. This array only contains the extra pointers, -+ * which cannot fit into AVFrame.buf. -+ * -+ * This array is always allocated using av_malloc() by whoever constructs -+ * the frame. It is freed in av_frame_unref(). -+ */ -+ AVBufferRef **extended_buf; -+ /** -+ * Number of elements in extended_buf. -+ */ -+ int nb_extended_buf; -+ -+ AVFrameSideData **side_data; -+ int nb_side_data; -+ -+/** -+ * @defgroup lavu_frame_flags AV_FRAME_FLAGS -+ * @ingroup lavu_frame -+ * Flags describing additional frame properties. -+ * -+ * @{ -+ */ -+ -+/** -+ * The frame data may be corrupted, e.g. due to decoding errors. -+ */ -+#define AV_FRAME_FLAG_CORRUPT (1 << 0) -+/** -+ * A flag to mark the frames which need to be decoded, but shouldn't be output. -+ */ -+#define AV_FRAME_FLAG_DISCARD (1 << 2) -+/** -+ * @} -+ */ -+ -+ /** -+ * Frame flags, a combination of @ref lavu_frame_flags -+ */ -+ int flags; -+ -+ /** -+ * MPEG vs JPEG YUV range. -+ * - encoding: Set by user -+ * - decoding: Set by libavcodec -+ */ -+ enum AVColorRange color_range; -+ -+ enum AVColorPrimaries color_primaries; -+ -+ enum AVColorTransferCharacteristic color_trc; -+ -+ /** -+ * YUV colorspace type. -+ * - encoding: Set by user -+ * - decoding: Set by libavcodec -+ */ -+ enum AVColorSpace colorspace; -+ -+ enum AVChromaLocation chroma_location; -+ -+ /** -+ * frame timestamp estimated using various heuristics, in stream time base -+ * - encoding: unused -+ * - decoding: set by libavcodec, read by user. -+ */ -+ int64_t best_effort_timestamp; -+ -+ /** -+ * reordered pos from the last AVPacket that has been input into the decoder -+ * - encoding: unused -+ * - decoding: Read by user. -+ */ -+ int64_t pkt_pos; -+ -+ /** -+ * duration of the corresponding packet, expressed in -+ * AVStream->time_base units, 0 if unknown. -+ * - encoding: unused -+ * - decoding: Read by user. -+ */ -+ int64_t pkt_duration; -+ -+ /** -+ * metadata. -+ * - encoding: Set by user. -+ * - decoding: Set by libavcodec. -+ */ -+ AVDictionary *metadata; -+ -+ /** -+ * decode error flags of the frame, set to a combination of -+ * FF_DECODE_ERROR_xxx flags if the decoder produced a frame, but there -+ * were errors during the decoding. -+ * - encoding: unused -+ * - decoding: set by libavcodec, read by user. -+ */ -+ int decode_error_flags; -+#define FF_DECODE_ERROR_INVALID_BITSTREAM 1 -+#define FF_DECODE_ERROR_MISSING_REFERENCE 2 -+ -+ /** -+ * number of audio channels, only used for audio. -+ * - encoding: unused -+ * - decoding: Read by user. -+ */ -+ int channels; -+ -+ /** -+ * size of the corresponding packet containing the compressed -+ * frame. -+ * It is set to a negative value if unknown. -+ * - encoding: unused -+ * - decoding: set by libavcodec, read by user. -+ */ -+ int pkt_size; -+ -+#if FF_API_FRAME_QP -+ /** -+ * QP table -+ */ -+ attribute_deprecated -+ int8_t *qscale_table; -+ /** -+ * QP store stride -+ */ -+ attribute_deprecated -+ int qstride; -+ -+ attribute_deprecated -+ int qscale_type; -+ -+ attribute_deprecated -+ AVBufferRef *qp_table_buf; -+#endif -+ /** -+ * For hwaccel-format frames, this should be a reference to the -+ * AVHWFramesContext describing the frame. -+ */ -+ AVBufferRef *hw_frames_ctx; -+ -+ /** -+ * AVBufferRef for free use by the API user. FFmpeg will never check the -+ * contents of the buffer ref. FFmpeg calls av_buffer_unref() on it when -+ * the frame is unreferenced. av_frame_copy_props() calls create a new -+ * reference with av_buffer_ref() for the target frame's opaque_ref field. -+ * -+ * This is unrelated to the opaque field, although it serves a similar -+ * purpose. -+ */ -+ AVBufferRef *opaque_ref; -+ -+ /** -+ * @anchor cropping -+ * @name Cropping -+ * Video frames only. The number of pixels to discard from the the -+ * top/bottom/left/right border of the frame to obtain the sub-rectangle of -+ * the frame intended for presentation. -+ * @{ -+ */ -+ size_t crop_top; -+ size_t crop_bottom; -+ size_t crop_left; -+ size_t crop_right; -+ /** -+ * @} -+ */ -+ -+ /** -+ * AVBufferRef for internal use by a single libav* library. -+ * Must not be used to transfer data between libraries. -+ * Has to be NULL when ownership of the frame leaves the respective library. -+ * -+ * Code outside the FFmpeg libs should never check or change the contents of the buffer ref. -+ * -+ * FFmpeg calls av_buffer_unref() on it when the frame is unreferenced. -+ * av_frame_copy_props() calls create a new reference with av_buffer_ref() -+ * for the target frame's private_ref field. -+ */ -+ AVBufferRef *private_ref; -+} AVFrame; -+ -+#if FF_API_FRAME_GET_SET -+/** -+ * Accessors for some AVFrame fields. These used to be provided for ABI -+ * compatibility, and do not need to be used anymore. -+ */ -+attribute_deprecated -+int64_t av_frame_get_best_effort_timestamp(const AVFrame *frame); -+attribute_deprecated -+void av_frame_set_best_effort_timestamp(AVFrame *frame, int64_t val); -+attribute_deprecated -+int64_t av_frame_get_pkt_duration (const AVFrame *frame); -+attribute_deprecated -+void av_frame_set_pkt_duration (AVFrame *frame, int64_t val); -+attribute_deprecated -+int64_t av_frame_get_pkt_pos (const AVFrame *frame); -+attribute_deprecated -+void av_frame_set_pkt_pos (AVFrame *frame, int64_t val); -+attribute_deprecated -+int64_t av_frame_get_channel_layout (const AVFrame *frame); -+attribute_deprecated -+void av_frame_set_channel_layout (AVFrame *frame, int64_t val); -+attribute_deprecated -+int av_frame_get_channels (const AVFrame *frame); -+attribute_deprecated -+void av_frame_set_channels (AVFrame *frame, int val); -+attribute_deprecated -+int av_frame_get_sample_rate (const AVFrame *frame); -+attribute_deprecated -+void av_frame_set_sample_rate (AVFrame *frame, int val); -+attribute_deprecated -+AVDictionary *av_frame_get_metadata (const AVFrame *frame); -+attribute_deprecated -+void av_frame_set_metadata (AVFrame *frame, AVDictionary *val); -+attribute_deprecated -+int av_frame_get_decode_error_flags (const AVFrame *frame); -+attribute_deprecated -+void av_frame_set_decode_error_flags (AVFrame *frame, int val); -+attribute_deprecated -+int av_frame_get_pkt_size(const AVFrame *frame); -+attribute_deprecated -+void av_frame_set_pkt_size(AVFrame *frame, int val); -+#if FF_API_FRAME_QP -+attribute_deprecated -+int8_t *av_frame_get_qp_table(AVFrame *f, int *stride, int *type); -+attribute_deprecated -+int av_frame_set_qp_table(AVFrame *f, AVBufferRef *buf, int stride, int type); -+#endif -+attribute_deprecated -+enum AVColorSpace av_frame_get_colorspace(const AVFrame *frame); -+attribute_deprecated -+void av_frame_set_colorspace(AVFrame *frame, enum AVColorSpace val); -+attribute_deprecated -+enum AVColorRange av_frame_get_color_range(const AVFrame *frame); -+attribute_deprecated -+void av_frame_set_color_range(AVFrame *frame, enum AVColorRange val); -+#endif -+ -+/** -+ * Get the name of a colorspace. -+ * @return a static string identifying the colorspace; can be NULL. -+ */ -+const char *av_get_colorspace_name(enum AVColorSpace val); -+ -+/** -+ * Allocate an AVFrame and set its fields to default values. The resulting -+ * struct must be freed using av_frame_free(). -+ * -+ * @return An AVFrame filled with default values or NULL on failure. -+ * -+ * @note this only allocates the AVFrame itself, not the data buffers. Those -+ * must be allocated through other means, e.g. with av_frame_get_buffer() or -+ * manually. -+ */ -+AVFrame *av_frame_alloc(void); -+ -+/** -+ * Free the frame and any dynamically allocated objects in it, -+ * e.g. extended_data. If the frame is reference counted, it will be -+ * unreferenced first. -+ * -+ * @param frame frame to be freed. The pointer will be set to NULL. -+ */ -+void av_frame_free(AVFrame **frame); -+ -+/** -+ * Set up a new reference to the data described by the source frame. -+ * -+ * Copy frame properties from src to dst and create a new reference for each -+ * AVBufferRef from src. -+ * -+ * If src is not reference counted, new buffers are allocated and the data is -+ * copied. -+ * -+ * @warning: dst MUST have been either unreferenced with av_frame_unref(dst), -+ * or newly allocated with av_frame_alloc() before calling this -+ * function, or undefined behavior will occur. -+ * -+ * @return 0 on success, a negative AVERROR on error -+ */ -+int av_frame_ref(AVFrame *dst, const AVFrame *src); -+ -+/** -+ * Create a new frame that references the same data as src. -+ * -+ * This is a shortcut for av_frame_alloc()+av_frame_ref(). -+ * -+ * @return newly created AVFrame on success, NULL on error. -+ */ -+AVFrame *av_frame_clone(const AVFrame *src); -+ -+/** -+ * Unreference all the buffers referenced by frame and reset the frame fields. -+ */ -+void av_frame_unref(AVFrame *frame); -+ -+/** -+ * Move everything contained in src to dst and reset src. -+ * -+ * @warning: dst is not unreferenced, but directly overwritten without reading -+ * or deallocating its contents. Call av_frame_unref(dst) manually -+ * before calling this function to ensure that no memory is leaked. -+ */ -+void av_frame_move_ref(AVFrame *dst, AVFrame *src); -+ -+/** -+ * Allocate new buffer(s) for audio or video data. -+ * -+ * The following fields must be set on frame before calling this function: -+ * - format (pixel format for video, sample format for audio) -+ * - width and height for video -+ * - nb_samples and channel_layout for audio -+ * -+ * This function will fill AVFrame.data and AVFrame.buf arrays and, if -+ * necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf. -+ * For planar formats, one buffer will be allocated for each plane. -+ * -+ * @warning: if frame already has been allocated, calling this function will -+ * leak memory. In addition, undefined behavior can occur in certain -+ * cases. -+ * -+ * @param frame frame in which to store the new buffers. -+ * @param align Required buffer size alignment. If equal to 0, alignment will be -+ * chosen automatically for the current CPU. It is highly -+ * recommended to pass 0 here unless you know what you are doing. -+ * -+ * @return 0 on success, a negative AVERROR on error. -+ */ -+int av_frame_get_buffer(AVFrame *frame, int align); -+ -+/** -+ * Check if the frame data is writable. -+ * -+ * @return A positive value if the frame data is writable (which is true if and -+ * only if each of the underlying buffers has only one reference, namely the one -+ * stored in this frame). Return 0 otherwise. -+ * -+ * If 1 is returned the answer is valid until av_buffer_ref() is called on any -+ * of the underlying AVBufferRefs (e.g. through av_frame_ref() or directly). -+ * -+ * @see av_frame_make_writable(), av_buffer_is_writable() -+ */ -+int av_frame_is_writable(AVFrame *frame); -+ -+/** -+ * Ensure that the frame data is writable, avoiding data copy if possible. -+ * -+ * Do nothing if the frame is writable, allocate new buffers and copy the data -+ * if it is not. -+ * -+ * @return 0 on success, a negative AVERROR on error. -+ * -+ * @see av_frame_is_writable(), av_buffer_is_writable(), -+ * av_buffer_make_writable() -+ */ -+int av_frame_make_writable(AVFrame *frame); -+ -+/** -+ * Copy the frame data from src to dst. -+ * -+ * This function does not allocate anything, dst must be already initialized and -+ * allocated with the same parameters as src. -+ * -+ * This function only copies the frame data (i.e. the contents of the data / -+ * extended data arrays), not any other properties. -+ * -+ * @return >= 0 on success, a negative AVERROR on error. -+ */ -+int av_frame_copy(AVFrame *dst, const AVFrame *src); -+ -+/** -+ * Copy only "metadata" fields from src to dst. -+ * -+ * Metadata for the purpose of this function are those fields that do not affect -+ * the data layout in the buffers. E.g. pts, sample rate (for audio) or sample -+ * aspect ratio (for video), but not width/height or channel layout. -+ * Side data is also copied. -+ */ -+int av_frame_copy_props(AVFrame *dst, const AVFrame *src); -+ -+/** -+ * Get the buffer reference a given data plane is stored in. -+ * -+ * @param plane index of the data plane of interest in frame->extended_data. -+ * -+ * @return the buffer reference that contains the plane or NULL if the input -+ * frame is not valid. -+ */ -+AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane); -+ -+/** -+ * Add a new side data to a frame. -+ * -+ * @param frame a frame to which the side data should be added -+ * @param type type of the added side data -+ * @param size size of the side data -+ * -+ * @return newly added side data on success, NULL on error -+ */ -+AVFrameSideData *av_frame_new_side_data(AVFrame *frame, -+ enum AVFrameSideDataType type, -+ int size); -+ -+/** -+ * Add a new side data to a frame from an existing AVBufferRef -+ * -+ * @param frame a frame to which the side data should be added -+ * @param type the type of the added side data -+ * @param buf an AVBufferRef to add as side data. The ownership of -+ * the reference is transferred to the frame. -+ * -+ * @return newly added side data on success, NULL on error. On failure -+ * the frame is unchanged and the AVBufferRef remains owned by -+ * the caller. -+ */ -+AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame, -+ enum AVFrameSideDataType type, -+ AVBufferRef *buf); -+ -+/** -+ * @return a pointer to the side data of a given type on success, NULL if there -+ * is no side data with such type in this frame. -+ */ -+AVFrameSideData *av_frame_get_side_data(const AVFrame *frame, -+ enum AVFrameSideDataType type); -+ -+/** -+ * If side data of the supplied type exists in the frame, free it and remove it -+ * from the frame. -+ */ -+void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type); -+ -+ -+/** -+ * Flags for frame cropping. -+ */ -+enum { -+ /** -+ * Apply the maximum possible cropping, even if it requires setting the -+ * AVFrame.data[] entries to unaligned pointers. Passing unaligned data -+ * to FFmpeg API is generally not allowed, and causes undefined behavior -+ * (such as crashes). You can pass unaligned data only to FFmpeg APIs that -+ * are explicitly documented to accept it. Use this flag only if you -+ * absolutely know what you are doing. -+ */ -+ AV_FRAME_CROP_UNALIGNED = 1 << 0, -+}; -+ -+/** -+ * Crop the given video AVFrame according to its crop_left/crop_top/crop_right/ -+ * crop_bottom fields. If cropping is successful, the function will adjust the -+ * data pointers and the width/height fields, and set the crop fields to 0. -+ * -+ * In all cases, the cropping boundaries will be rounded to the inherent -+ * alignment of the pixel format. In some cases, such as for opaque hwaccel -+ * formats, the left/top cropping is ignored. The crop fields are set to 0 even -+ * if the cropping was rounded or ignored. -+ * -+ * @param frame the frame which should be cropped -+ * @param flags Some combination of AV_FRAME_CROP_* flags, or 0. -+ * -+ * @return >= 0 on success, a negative AVERROR on error. If the cropping fields -+ * were invalid, AVERROR(ERANGE) is returned, and nothing is changed. -+ */ -+int av_frame_apply_cropping(AVFrame *frame, int flags); -+ -+/** -+ * @return a string identifying the side data type -+ */ -+const char *av_frame_side_data_name(enum AVFrameSideDataType type); -+ -+/** -+ * @} -+ */ -+ -+#endif /* AVUTIL_FRAME_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/hwcontext.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/hwcontext.h -new file mode 100644 -index 000000000000..f5a4b6238774 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/hwcontext.h -@@ -0,0 +1,584 @@ -+/* -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+#ifndef AVUTIL_HWCONTEXT_H -+#define AVUTIL_HWCONTEXT_H -+ -+#include "buffer.h" -+#include "frame.h" -+#include "log.h" -+#include "pixfmt.h" -+ -+enum AVHWDeviceType { -+ AV_HWDEVICE_TYPE_NONE, -+ AV_HWDEVICE_TYPE_VDPAU, -+ AV_HWDEVICE_TYPE_CUDA, -+ AV_HWDEVICE_TYPE_VAAPI, -+ AV_HWDEVICE_TYPE_DXVA2, -+ AV_HWDEVICE_TYPE_QSV, -+ AV_HWDEVICE_TYPE_VIDEOTOOLBOX, -+ AV_HWDEVICE_TYPE_D3D11VA, -+ AV_HWDEVICE_TYPE_DRM, -+ AV_HWDEVICE_TYPE_OPENCL, -+ AV_HWDEVICE_TYPE_MEDIACODEC, -+}; -+ -+typedef struct AVHWDeviceInternal AVHWDeviceInternal; -+ -+/** -+ * This struct aggregates all the (hardware/vendor-specific) "high-level" state, -+ * i.e. state that is not tied to a concrete processing configuration. -+ * E.g., in an API that supports hardware-accelerated encoding and decoding, -+ * this struct will (if possible) wrap the state that is common to both encoding -+ * and decoding and from which specific instances of encoders or decoders can be -+ * derived. -+ * -+ * This struct is reference-counted with the AVBuffer mechanism. The -+ * av_hwdevice_ctx_alloc() constructor yields a reference, whose data field -+ * points to the actual AVHWDeviceContext. Further objects derived from -+ * AVHWDeviceContext (such as AVHWFramesContext, describing a frame pool with -+ * specific properties) will hold an internal reference to it. After all the -+ * references are released, the AVHWDeviceContext itself will be freed, -+ * optionally invoking a user-specified callback for uninitializing the hardware -+ * state. -+ */ -+typedef struct AVHWDeviceContext { -+ /** -+ * A class for logging. Set by av_hwdevice_ctx_alloc(). -+ */ -+ const AVClass *av_class; -+ -+ /** -+ * Private data used internally by libavutil. Must not be accessed in any -+ * way by the caller. -+ */ -+ AVHWDeviceInternal *internal; -+ -+ /** -+ * This field identifies the underlying API used for hardware access. -+ * -+ * This field is set when this struct is allocated and never changed -+ * afterwards. -+ */ -+ enum AVHWDeviceType type; -+ -+ /** -+ * The format-specific data, allocated and freed by libavutil along with -+ * this context. -+ * -+ * Should be cast by the user to the format-specific context defined in the -+ * corresponding header (hwcontext_*.h) and filled as described in the -+ * documentation before calling av_hwdevice_ctx_init(). -+ * -+ * After calling av_hwdevice_ctx_init() this struct should not be modified -+ * by the caller. -+ */ -+ void *hwctx; -+ -+ /** -+ * This field may be set by the caller before calling av_hwdevice_ctx_init(). -+ * -+ * If non-NULL, this callback will be called when the last reference to -+ * this context is unreferenced, immediately before it is freed. -+ * -+ * @note when other objects (e.g an AVHWFramesContext) are derived from this -+ * struct, this callback will be invoked after all such child objects -+ * are fully uninitialized and their respective destructors invoked. -+ */ -+ void (*free)(struct AVHWDeviceContext *ctx); -+ -+ /** -+ * Arbitrary user data, to be used e.g. by the free() callback. -+ */ -+ void *user_opaque; -+} AVHWDeviceContext; -+ -+typedef struct AVHWFramesInternal AVHWFramesInternal; -+ -+/** -+ * This struct describes a set or pool of "hardware" frames (i.e. those with -+ * data not located in normal system memory). All the frames in the pool are -+ * assumed to be allocated in the same way and interchangeable. -+ * -+ * This struct is reference-counted with the AVBuffer mechanism and tied to a -+ * given AVHWDeviceContext instance. The av_hwframe_ctx_alloc() constructor -+ * yields a reference, whose data field points to the actual AVHWFramesContext -+ * struct. -+ */ -+typedef struct AVHWFramesContext { -+ /** -+ * A class for logging. -+ */ -+ const AVClass *av_class; -+ -+ /** -+ * Private data used internally by libavutil. Must not be accessed in any -+ * way by the caller. -+ */ -+ AVHWFramesInternal *internal; -+ -+ /** -+ * A reference to the parent AVHWDeviceContext. This reference is owned and -+ * managed by the enclosing AVHWFramesContext, but the caller may derive -+ * additional references from it. -+ */ -+ AVBufferRef *device_ref; -+ -+ /** -+ * The parent AVHWDeviceContext. This is simply a pointer to -+ * device_ref->data provided for convenience. -+ * -+ * Set by libavutil in av_hwframe_ctx_init(). -+ */ -+ AVHWDeviceContext *device_ctx; -+ -+ /** -+ * The format-specific data, allocated and freed automatically along with -+ * this context. -+ * -+ * Should be cast by the user to the format-specific context defined in the -+ * corresponding header (hwframe_*.h) and filled as described in the -+ * documentation before calling av_hwframe_ctx_init(). -+ * -+ * After any frames using this context are created, the contents of this -+ * struct should not be modified by the caller. -+ */ -+ void *hwctx; -+ -+ /** -+ * This field may be set by the caller before calling av_hwframe_ctx_init(). -+ * -+ * If non-NULL, this callback will be called when the last reference to -+ * this context is unreferenced, immediately before it is freed. -+ */ -+ void (*free)(struct AVHWFramesContext *ctx); -+ -+ /** -+ * Arbitrary user data, to be used e.g. by the free() callback. -+ */ -+ void *user_opaque; -+ -+ /** -+ * A pool from which the frames are allocated by av_hwframe_get_buffer(). -+ * This field may be set by the caller before calling av_hwframe_ctx_init(). -+ * The buffers returned by calling av_buffer_pool_get() on this pool must -+ * have the properties described in the documentation in the corresponding hw -+ * type's header (hwcontext_*.h). The pool will be freed strictly before -+ * this struct's free() callback is invoked. -+ * -+ * This field may be NULL, then libavutil will attempt to allocate a pool -+ * internally. Note that certain device types enforce pools allocated at -+ * fixed size (frame count), which cannot be extended dynamically. In such a -+ * case, initial_pool_size must be set appropriately. -+ */ -+ AVBufferPool *pool; -+ -+ /** -+ * Initial size of the frame pool. If a device type does not support -+ * dynamically resizing the pool, then this is also the maximum pool size. -+ * -+ * May be set by the caller before calling av_hwframe_ctx_init(). Must be -+ * set if pool is NULL and the device type does not support dynamic pools. -+ */ -+ int initial_pool_size; -+ -+ /** -+ * The pixel format identifying the underlying HW surface type. -+ * -+ * Must be a hwaccel format, i.e. the corresponding descriptor must have the -+ * AV_PIX_FMT_FLAG_HWACCEL flag set. -+ * -+ * Must be set by the user before calling av_hwframe_ctx_init(). -+ */ -+ enum AVPixelFormat format; -+ -+ /** -+ * The pixel format identifying the actual data layout of the hardware -+ * frames. -+ * -+ * Must be set by the caller before calling av_hwframe_ctx_init(). -+ * -+ * @note when the underlying API does not provide the exact data layout, but -+ * only the colorspace/bit depth, this field should be set to the fully -+ * planar version of that format (e.g. for 8-bit 420 YUV it should be -+ * AV_PIX_FMT_YUV420P, not AV_PIX_FMT_NV12 or anything else). -+ */ -+ enum AVPixelFormat sw_format; -+ -+ /** -+ * The allocated dimensions of the frames in this pool. -+ * -+ * Must be set by the user before calling av_hwframe_ctx_init(). -+ */ -+ int width, height; -+} AVHWFramesContext; -+ -+/** -+ * Look up an AVHWDeviceType by name. -+ * -+ * @param name String name of the device type (case-insensitive). -+ * @return The type from enum AVHWDeviceType, or AV_HWDEVICE_TYPE_NONE if -+ * not found. -+ */ -+enum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name); -+ -+/** Get the string name of an AVHWDeviceType. -+ * -+ * @param type Type from enum AVHWDeviceType. -+ * @return Pointer to a static string containing the name, or NULL if the type -+ * is not valid. -+ */ -+const char *av_hwdevice_get_type_name(enum AVHWDeviceType type); -+ -+/** -+ * Iterate over supported device types. -+ * -+ * @param type AV_HWDEVICE_TYPE_NONE initially, then the previous type -+ * returned by this function in subsequent iterations. -+ * @return The next usable device type from enum AVHWDeviceType, or -+ * AV_HWDEVICE_TYPE_NONE if there are no more. -+ */ -+enum AVHWDeviceType av_hwdevice_iterate_types(enum AVHWDeviceType prev); -+ -+/** -+ * Allocate an AVHWDeviceContext for a given hardware type. -+ * -+ * @param type the type of the hardware device to allocate. -+ * @return a reference to the newly created AVHWDeviceContext on success or NULL -+ * on failure. -+ */ -+AVBufferRef *av_hwdevice_ctx_alloc(enum AVHWDeviceType type); -+ -+/** -+ * Finalize the device context before use. This function must be called after -+ * the context is filled with all the required information and before it is -+ * used in any way. -+ * -+ * @param ref a reference to the AVHWDeviceContext -+ * @return 0 on success, a negative AVERROR code on failure -+ */ -+int av_hwdevice_ctx_init(AVBufferRef *ref); -+ -+/** -+ * Open a device of the specified type and create an AVHWDeviceContext for it. -+ * -+ * This is a convenience function intended to cover the simple cases. Callers -+ * who need to fine-tune device creation/management should open the device -+ * manually and then wrap it in an AVHWDeviceContext using -+ * av_hwdevice_ctx_alloc()/av_hwdevice_ctx_init(). -+ * -+ * The returned context is already initialized and ready for use, the caller -+ * should not call av_hwdevice_ctx_init() on it. The user_opaque/free fields of -+ * the created AVHWDeviceContext are set by this function and should not be -+ * touched by the caller. -+ * -+ * @param device_ctx On success, a reference to the newly-created device context -+ * will be written here. The reference is owned by the caller -+ * and must be released with av_buffer_unref() when no longer -+ * needed. On failure, NULL will be written to this pointer. -+ * @param type The type of the device to create. -+ * @param device A type-specific string identifying the device to open. -+ * @param opts A dictionary of additional (type-specific) options to use in -+ * opening the device. The dictionary remains owned by the caller. -+ * @param flags currently unused -+ * -+ * @return 0 on success, a negative AVERROR code on failure. -+ */ -+int av_hwdevice_ctx_create(AVBufferRef **device_ctx, enum AVHWDeviceType type, -+ const char *device, AVDictionary *opts, int flags); -+ -+/** -+ * Create a new device of the specified type from an existing device. -+ * -+ * If the source device is a device of the target type or was originally -+ * derived from such a device (possibly through one or more intermediate -+ * devices of other types), then this will return a reference to the -+ * existing device of the same type as is requested. -+ * -+ * Otherwise, it will attempt to derive a new device from the given source -+ * device. If direct derivation to the new type is not implemented, it will -+ * attempt the same derivation from each ancestor of the source device in -+ * turn looking for an implemented derivation method. -+ * -+ * @param dst_ctx On success, a reference to the newly-created -+ * AVHWDeviceContext. -+ * @param type The type of the new device to create. -+ * @param src_ctx A reference to an existing AVHWDeviceContext which will be -+ * used to create the new device. -+ * @param flags Currently unused; should be set to zero. -+ * @return Zero on success, a negative AVERROR code on failure. -+ */ -+int av_hwdevice_ctx_create_derived(AVBufferRef **dst_ctx, -+ enum AVHWDeviceType type, -+ AVBufferRef *src_ctx, int flags); -+ -+ -+/** -+ * Allocate an AVHWFramesContext tied to a given device context. -+ * -+ * @param device_ctx a reference to a AVHWDeviceContext. This function will make -+ * a new reference for internal use, the one passed to the -+ * function remains owned by the caller. -+ * @return a reference to the newly created AVHWFramesContext on success or NULL -+ * on failure. -+ */ -+AVBufferRef *av_hwframe_ctx_alloc(AVBufferRef *device_ctx); -+ -+/** -+ * Finalize the context before use. This function must be called after the -+ * context is filled with all the required information and before it is attached -+ * to any frames. -+ * -+ * @param ref a reference to the AVHWFramesContext -+ * @return 0 on success, a negative AVERROR code on failure -+ */ -+int av_hwframe_ctx_init(AVBufferRef *ref); -+ -+/** -+ * Allocate a new frame attached to the given AVHWFramesContext. -+ * -+ * @param hwframe_ctx a reference to an AVHWFramesContext -+ * @param frame an empty (freshly allocated or unreffed) frame to be filled with -+ * newly allocated buffers. -+ * @param flags currently unused, should be set to zero -+ * @return 0 on success, a negative AVERROR code on failure -+ */ -+int av_hwframe_get_buffer(AVBufferRef *hwframe_ctx, AVFrame *frame, int flags); -+ -+/** -+ * Copy data to or from a hw surface. At least one of dst/src must have an -+ * AVHWFramesContext attached. -+ * -+ * If src has an AVHWFramesContext attached, then the format of dst (if set) -+ * must use one of the formats returned by av_hwframe_transfer_get_formats(src, -+ * AV_HWFRAME_TRANSFER_DIRECTION_FROM). -+ * If dst has an AVHWFramesContext attached, then the format of src must use one -+ * of the formats returned by av_hwframe_transfer_get_formats(dst, -+ * AV_HWFRAME_TRANSFER_DIRECTION_TO) -+ * -+ * dst may be "clean" (i.e. with data/buf pointers unset), in which case the -+ * data buffers will be allocated by this function using av_frame_get_buffer(). -+ * If dst->format is set, then this format will be used, otherwise (when -+ * dst->format is AV_PIX_FMT_NONE) the first acceptable format will be chosen. -+ * -+ * The two frames must have matching allocated dimensions (i.e. equal to -+ * AVHWFramesContext.width/height), since not all device types support -+ * transferring a sub-rectangle of the whole surface. The display dimensions -+ * (i.e. AVFrame.width/height) may be smaller than the allocated dimensions, but -+ * also have to be equal for both frames. When the display dimensions are -+ * smaller than the allocated dimensions, the content of the padding in the -+ * destination frame is unspecified. -+ * -+ * @param dst the destination frame. dst is not touched on failure. -+ * @param src the source frame. -+ * @param flags currently unused, should be set to zero -+ * @return 0 on success, a negative AVERROR error code on failure. -+ */ -+int av_hwframe_transfer_data(AVFrame *dst, const AVFrame *src, int flags); -+ -+enum AVHWFrameTransferDirection { -+ /** -+ * Transfer the data from the queried hw frame. -+ */ -+ AV_HWFRAME_TRANSFER_DIRECTION_FROM, -+ -+ /** -+ * Transfer the data to the queried hw frame. -+ */ -+ AV_HWFRAME_TRANSFER_DIRECTION_TO, -+}; -+ -+/** -+ * Get a list of possible source or target formats usable in -+ * av_hwframe_transfer_data(). -+ * -+ * @param hwframe_ctx the frame context to obtain the information for -+ * @param dir the direction of the transfer -+ * @param formats the pointer to the output format list will be written here. -+ * The list is terminated with AV_PIX_FMT_NONE and must be freed -+ * by the caller when no longer needed using av_free(). -+ * If this function returns successfully, the format list will -+ * have at least one item (not counting the terminator). -+ * On failure, the contents of this pointer are unspecified. -+ * @param flags currently unused, should be set to zero -+ * @return 0 on success, a negative AVERROR code on failure. -+ */ -+int av_hwframe_transfer_get_formats(AVBufferRef *hwframe_ctx, -+ enum AVHWFrameTransferDirection dir, -+ enum AVPixelFormat **formats, int flags); -+ -+ -+/** -+ * This struct describes the constraints on hardware frames attached to -+ * a given device with a hardware-specific configuration. This is returned -+ * by av_hwdevice_get_hwframe_constraints() and must be freed by -+ * av_hwframe_constraints_free() after use. -+ */ -+typedef struct AVHWFramesConstraints { -+ /** -+ * A list of possible values for format in the hw_frames_ctx, -+ * terminated by AV_PIX_FMT_NONE. This member will always be filled. -+ */ -+ enum AVPixelFormat *valid_hw_formats; -+ -+ /** -+ * A list of possible values for sw_format in the hw_frames_ctx, -+ * terminated by AV_PIX_FMT_NONE. Can be NULL if this information is -+ * not known. -+ */ -+ enum AVPixelFormat *valid_sw_formats; -+ -+ /** -+ * The minimum size of frames in this hw_frames_ctx. -+ * (Zero if not known.) -+ */ -+ int min_width; -+ int min_height; -+ -+ /** -+ * The maximum size of frames in this hw_frames_ctx. -+ * (INT_MAX if not known / no limit.) -+ */ -+ int max_width; -+ int max_height; -+} AVHWFramesConstraints; -+ -+/** -+ * Allocate a HW-specific configuration structure for a given HW device. -+ * After use, the user must free all members as required by the specific -+ * hardware structure being used, then free the structure itself with -+ * av_free(). -+ * -+ * @param device_ctx a reference to the associated AVHWDeviceContext. -+ * @return The newly created HW-specific configuration structure on -+ * success or NULL on failure. -+ */ -+void *av_hwdevice_hwconfig_alloc(AVBufferRef *device_ctx); -+ -+/** -+ * Get the constraints on HW frames given a device and the HW-specific -+ * configuration to be used with that device. If no HW-specific -+ * configuration is provided, returns the maximum possible capabilities -+ * of the device. -+ * -+ * @param ref a reference to the associated AVHWDeviceContext. -+ * @param hwconfig a filled HW-specific configuration structure, or NULL -+ * to return the maximum possible capabilities of the device. -+ * @return AVHWFramesConstraints structure describing the constraints -+ * on the device, or NULL if not available. -+ */ -+AVHWFramesConstraints *av_hwdevice_get_hwframe_constraints(AVBufferRef *ref, -+ const void *hwconfig); -+ -+/** -+ * Free an AVHWFrameConstraints structure. -+ * -+ * @param constraints The (filled or unfilled) AVHWFrameConstraints structure. -+ */ -+void av_hwframe_constraints_free(AVHWFramesConstraints **constraints); -+ -+ -+/** -+ * Flags to apply to frame mappings. -+ */ -+enum { -+ /** -+ * The mapping must be readable. -+ */ -+ AV_HWFRAME_MAP_READ = 1 << 0, -+ /** -+ * The mapping must be writeable. -+ */ -+ AV_HWFRAME_MAP_WRITE = 1 << 1, -+ /** -+ * The mapped frame will be overwritten completely in subsequent -+ * operations, so the current frame data need not be loaded. Any values -+ * which are not overwritten are unspecified. -+ */ -+ AV_HWFRAME_MAP_OVERWRITE = 1 << 2, -+ /** -+ * The mapping must be direct. That is, there must not be any copying in -+ * the map or unmap steps. Note that performance of direct mappings may -+ * be much lower than normal memory. -+ */ -+ AV_HWFRAME_MAP_DIRECT = 1 << 3, -+}; -+ -+/** -+ * Map a hardware frame. -+ * -+ * This has a number of different possible effects, depending on the format -+ * and origin of the src and dst frames. On input, src should be a usable -+ * frame with valid buffers and dst should be blank (typically as just created -+ * by av_frame_alloc()). src should have an associated hwframe context, and -+ * dst may optionally have a format and associated hwframe context. -+ * -+ * If src was created by mapping a frame from the hwframe context of dst, -+ * then this function undoes the mapping - dst is replaced by a reference to -+ * the frame that src was originally mapped from. -+ * -+ * If both src and dst have an associated hwframe context, then this function -+ * attempts to map the src frame from its hardware context to that of dst and -+ * then fill dst with appropriate data to be usable there. This will only be -+ * possible if the hwframe contexts and associated devices are compatible - -+ * given compatible devices, av_hwframe_ctx_create_derived() can be used to -+ * create a hwframe context for dst in which mapping should be possible. -+ * -+ * If src has a hwframe context but dst does not, then the src frame is -+ * mapped to normal memory and should thereafter be usable as a normal frame. -+ * If the format is set on dst, then the mapping will attempt to create dst -+ * with that format and fail if it is not possible. If format is unset (is -+ * AV_PIX_FMT_NONE) then dst will be mapped with whatever the most appropriate -+ * format to use is (probably the sw_format of the src hwframe context). -+ * -+ * A return value of AVERROR(ENOSYS) indicates that the mapping is not -+ * possible with the given arguments and hwframe setup, while other return -+ * values indicate that it failed somehow. -+ * -+ * @param dst Destination frame, to contain the mapping. -+ * @param src Source frame, to be mapped. -+ * @param flags Some combination of AV_HWFRAME_MAP_* flags. -+ * @return Zero on success, negative AVERROR code on failure. -+ */ -+int av_hwframe_map(AVFrame *dst, const AVFrame *src, int flags); -+ -+ -+/** -+ * Create and initialise an AVHWFramesContext as a mapping of another existing -+ * AVHWFramesContext on a different device. -+ * -+ * av_hwframe_ctx_init() should not be called after this. -+ * -+ * @param derived_frame_ctx On success, a reference to the newly created -+ * AVHWFramesContext. -+ * @param derived_device_ctx A reference to the device to create the new -+ * AVHWFramesContext on. -+ * @param source_frame_ctx A reference to an existing AVHWFramesContext -+ * which will be mapped to the derived context. -+ * @param flags Some combination of AV_HWFRAME_MAP_* flags, defining the -+ * mapping parameters to apply to frames which are allocated -+ * in the derived device. -+ * @return Zero on success, negative AVERROR code on failure. -+ */ -+int av_hwframe_ctx_create_derived(AVBufferRef **derived_frame_ctx, -+ enum AVPixelFormat format, -+ AVBufferRef *derived_device_ctx, -+ AVBufferRef *source_frame_ctx, -+ int flags); -+ -+#endif /* AVUTIL_HWCONTEXT_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/intfloat.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/intfloat.h -new file mode 100644 -index 000000000000..fe3d7ec4a5b6 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/intfloat.h -@@ -0,0 +1,77 @@ -+/* -+ * Copyright (c) 2011 Mans Rullgard -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+#ifndef AVUTIL_INTFLOAT_H -+#define AVUTIL_INTFLOAT_H -+ -+#include -+#include "attributes.h" -+ -+union av_intfloat32 { -+ uint32_t i; -+ float f; -+}; -+ -+union av_intfloat64 { -+ uint64_t i; -+ double f; -+}; -+ -+/** -+ * Reinterpret a 32-bit integer as a float. -+ */ -+static av_always_inline float av_int2float(uint32_t i) -+{ -+ union av_intfloat32 v; -+ v.i = i; -+ return v.f; -+} -+ -+/** -+ * Reinterpret a float as a 32-bit integer. -+ */ -+static av_always_inline uint32_t av_float2int(float f) -+{ -+ union av_intfloat32 v; -+ v.f = f; -+ return v.i; -+} -+ -+/** -+ * Reinterpret a 64-bit integer as a double. -+ */ -+static av_always_inline double av_int2double(uint64_t i) -+{ -+ union av_intfloat64 v; -+ v.i = i; -+ return v.f; -+} -+ -+/** -+ * Reinterpret a double as a 64-bit integer. -+ */ -+static av_always_inline uint64_t av_double2int(double f) -+{ -+ union av_intfloat64 v; -+ v.f = f; -+ return v.i; -+} -+ -+#endif /* AVUTIL_INTFLOAT_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/log.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/log.h -new file mode 100644 -index 000000000000..d9554e609d40 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/log.h -@@ -0,0 +1,362 @@ -+/* -+ * copyright (c) 2006 Michael Niedermayer -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+#ifndef AVUTIL_LOG_H -+#define AVUTIL_LOG_H -+ -+#include -+#include "avutil.h" -+#include "attributes.h" -+#include "version.h" -+ -+typedef enum { -+ AV_CLASS_CATEGORY_NA = 0, -+ AV_CLASS_CATEGORY_INPUT, -+ AV_CLASS_CATEGORY_OUTPUT, -+ AV_CLASS_CATEGORY_MUXER, -+ AV_CLASS_CATEGORY_DEMUXER, -+ AV_CLASS_CATEGORY_ENCODER, -+ AV_CLASS_CATEGORY_DECODER, -+ AV_CLASS_CATEGORY_FILTER, -+ AV_CLASS_CATEGORY_BITSTREAM_FILTER, -+ AV_CLASS_CATEGORY_SWSCALER, -+ AV_CLASS_CATEGORY_SWRESAMPLER, -+ AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT = 40, -+ AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, -+ AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT, -+ AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, -+ AV_CLASS_CATEGORY_DEVICE_OUTPUT, -+ AV_CLASS_CATEGORY_DEVICE_INPUT, -+ AV_CLASS_CATEGORY_NB ///< not part of ABI/API -+}AVClassCategory; -+ -+#define AV_IS_INPUT_DEVICE(category) \ -+ (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT) || \ -+ ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT) || \ -+ ((category) == AV_CLASS_CATEGORY_DEVICE_INPUT)) -+ -+#define AV_IS_OUTPUT_DEVICE(category) \ -+ (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT) || \ -+ ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT) || \ -+ ((category) == AV_CLASS_CATEGORY_DEVICE_OUTPUT)) -+ -+struct AVOptionRanges; -+ -+/** -+ * Describe the class of an AVClass context structure. That is an -+ * arbitrary struct of which the first field is a pointer to an -+ * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.). -+ */ -+typedef struct AVClass { -+ /** -+ * The name of the class; usually it is the same name as the -+ * context structure type to which the AVClass is associated. -+ */ -+ const char* class_name; -+ -+ /** -+ * A pointer to a function which returns the name of a context -+ * instance ctx associated with the class. -+ */ -+ const char* (*item_name)(void* ctx); -+ -+ /** -+ * a pointer to the first option specified in the class if any or NULL -+ * -+ * @see av_set_default_options() -+ */ -+ const struct AVOption *option; -+ -+ /** -+ * LIBAVUTIL_VERSION with which this structure was created. -+ * This is used to allow fields to be added without requiring major -+ * version bumps everywhere. -+ */ -+ -+ int version; -+ -+ /** -+ * Offset in the structure where log_level_offset is stored. -+ * 0 means there is no such variable -+ */ -+ int log_level_offset_offset; -+ -+ /** -+ * Offset in the structure where a pointer to the parent context for -+ * logging is stored. For example a decoder could pass its AVCodecContext -+ * to eval as such a parent context, which an av_log() implementation -+ * could then leverage to display the parent context. -+ * The offset can be NULL. -+ */ -+ int parent_log_context_offset; -+ -+ /** -+ * Return next AVOptions-enabled child or NULL -+ */ -+ void* (*child_next)(void *obj, void *prev); -+ -+ /** -+ * Return an AVClass corresponding to the next potential -+ * AVOptions-enabled child. -+ * -+ * The difference between child_next and this is that -+ * child_next iterates over _already existing_ objects, while -+ * child_class_next iterates over _all possible_ children. -+ */ -+ const struct AVClass* (*child_class_next)(const struct AVClass *prev); -+ -+ /** -+ * Category used for visualization (like color) -+ * This is only set if the category is equal for all objects using this class. -+ * available since version (51 << 16 | 56 << 8 | 100) -+ */ -+ AVClassCategory category; -+ -+ /** -+ * Callback to return the category. -+ * available since version (51 << 16 | 59 << 8 | 100) -+ */ -+ AVClassCategory (*get_category)(void* ctx); -+ -+ /** -+ * Callback to return the supported/allowed ranges. -+ * available since version (52.12) -+ */ -+ int (*query_ranges)(struct AVOptionRanges **, void *obj, const char *key, int flags); -+} AVClass; -+ -+/** -+ * @addtogroup lavu_log -+ * -+ * @{ -+ * -+ * @defgroup lavu_log_constants Logging Constants -+ * -+ * @{ -+ */ -+ -+/** -+ * Print no output. -+ */ -+#define AV_LOG_QUIET -8 -+ -+/** -+ * Something went really wrong and we will crash now. -+ */ -+#define AV_LOG_PANIC 0 -+ -+/** -+ * Something went wrong and recovery is not possible. -+ * For example, no header was found for a format which depends -+ * on headers or an illegal combination of parameters is used. -+ */ -+#define AV_LOG_FATAL 8 -+ -+/** -+ * Something went wrong and cannot losslessly be recovered. -+ * However, not all future data is affected. -+ */ -+#define AV_LOG_ERROR 16 -+ -+/** -+ * Something somehow does not look correct. This may or may not -+ * lead to problems. An example would be the use of '-vstrict -2'. -+ */ -+#define AV_LOG_WARNING 24 -+ -+/** -+ * Standard information. -+ */ -+#define AV_LOG_INFO 32 -+ -+/** -+ * Detailed information. -+ */ -+#define AV_LOG_VERBOSE 40 -+ -+/** -+ * Stuff which is only useful for libav* developers. -+ */ -+#define AV_LOG_DEBUG 48 -+ -+/** -+ * Extremely verbose debugging, useful for libav* development. -+ */ -+#define AV_LOG_TRACE 56 -+ -+#define AV_LOG_MAX_OFFSET (AV_LOG_TRACE - AV_LOG_QUIET) -+ -+/** -+ * @} -+ */ -+ -+/** -+ * Sets additional colors for extended debugging sessions. -+ * @code -+ av_log(ctx, AV_LOG_DEBUG|AV_LOG_C(134), "Message in purple\n"); -+ @endcode -+ * Requires 256color terminal support. Uses outside debugging is not -+ * recommended. -+ */ -+#define AV_LOG_C(x) ((x) << 8) -+ -+/** -+ * Send the specified message to the log if the level is less than or equal -+ * to the current av_log_level. By default, all logging messages are sent to -+ * stderr. This behavior can be altered by setting a different logging callback -+ * function. -+ * @see av_log_set_callback -+ * -+ * @param avcl A pointer to an arbitrary struct of which the first field is a -+ * pointer to an AVClass struct or NULL if general log. -+ * @param level The importance level of the message expressed using a @ref -+ * lavu_log_constants "Logging Constant". -+ * @param fmt The format string (printf-compatible) that specifies how -+ * subsequent arguments are converted to output. -+ */ -+void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4); -+ -+ -+/** -+ * Send the specified message to the log if the level is less than or equal -+ * to the current av_log_level. By default, all logging messages are sent to -+ * stderr. This behavior can be altered by setting a different logging callback -+ * function. -+ * @see av_log_set_callback -+ * -+ * @param avcl A pointer to an arbitrary struct of which the first field is a -+ * pointer to an AVClass struct. -+ * @param level The importance level of the message expressed using a @ref -+ * lavu_log_constants "Logging Constant". -+ * @param fmt The format string (printf-compatible) that specifies how -+ * subsequent arguments are converted to output. -+ * @param vl The arguments referenced by the format string. -+ */ -+void av_vlog(void *avcl, int level, const char *fmt, va_list vl); -+ -+/** -+ * Get the current log level -+ * -+ * @see lavu_log_constants -+ * -+ * @return Current log level -+ */ -+int av_log_get_level(void); -+ -+/** -+ * Set the log level -+ * -+ * @see lavu_log_constants -+ * -+ * @param level Logging level -+ */ -+void av_log_set_level(int level); -+ -+/** -+ * Set the logging callback -+ * -+ * @note The callback must be thread safe, even if the application does not use -+ * threads itself as some codecs are multithreaded. -+ * -+ * @see av_log_default_callback -+ * -+ * @param callback A logging function with a compatible signature. -+ */ -+void av_log_set_callback(void (*callback)(void*, int, const char*, va_list)); -+ -+/** -+ * Default logging callback -+ * -+ * It prints the message to stderr, optionally colorizing it. -+ * -+ * @param avcl A pointer to an arbitrary struct of which the first field is a -+ * pointer to an AVClass struct. -+ * @param level The importance level of the message expressed using a @ref -+ * lavu_log_constants "Logging Constant". -+ * @param fmt The format string (printf-compatible) that specifies how -+ * subsequent arguments are converted to output. -+ * @param vl The arguments referenced by the format string. -+ */ -+void av_log_default_callback(void *avcl, int level, const char *fmt, -+ va_list vl); -+ -+/** -+ * Return the context name -+ * -+ * @param ctx The AVClass context -+ * -+ * @return The AVClass class_name -+ */ -+const char* av_default_item_name(void* ctx); -+AVClassCategory av_default_get_category(void *ptr); -+ -+/** -+ * Format a line of log the same way as the default callback. -+ * @param line buffer to receive the formatted line -+ * @param line_size size of the buffer -+ * @param print_prefix used to store whether the prefix must be printed; -+ * must point to a persistent integer initially set to 1 -+ */ -+void av_log_format_line(void *ptr, int level, const char *fmt, va_list vl, -+ char *line, int line_size, int *print_prefix); -+ -+/** -+ * Format a line of log the same way as the default callback. -+ * @param line buffer to receive the formatted line; -+ * may be NULL if line_size is 0 -+ * @param line_size size of the buffer; at most line_size-1 characters will -+ * be written to the buffer, plus one null terminator -+ * @param print_prefix used to store whether the prefix must be printed; -+ * must point to a persistent integer initially set to 1 -+ * @return Returns a negative value if an error occurred, otherwise returns -+ * the number of characters that would have been written for a -+ * sufficiently large buffer, not including the terminating null -+ * character. If the return value is not less than line_size, it means -+ * that the log message was truncated to fit the buffer. -+ */ -+int av_log_format_line2(void *ptr, int level, const char *fmt, va_list vl, -+ char *line, int line_size, int *print_prefix); -+ -+/** -+ * Skip repeated messages, this requires the user app to use av_log() instead of -+ * (f)printf as the 2 would otherwise interfere and lead to -+ * "Last message repeated x times" messages below (f)printf messages with some -+ * bad luck. -+ * Also to receive the last, "last repeated" line if any, the user app must -+ * call av_log(NULL, AV_LOG_QUIET, "%s", ""); at the end -+ */ -+#define AV_LOG_SKIP_REPEATED 1 -+ -+/** -+ * Include the log severity in messages originating from codecs. -+ * -+ * Results in messages such as: -+ * [rawvideo @ 0xDEADBEEF] [error] encode did not produce valid pts -+ */ -+#define AV_LOG_PRINT_LEVEL 2 -+ -+void av_log_set_flags(int arg); -+int av_log_get_flags(void); -+ -+/** -+ * @} -+ */ -+ -+#endif /* AVUTIL_LOG_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/macros.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/macros.h -new file mode 100644 -index 000000000000..2007ee561987 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/macros.h -@@ -0,0 +1,50 @@ -+/* -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/** -+ * @file -+ * @ingroup lavu -+ * Utility Preprocessor macros -+ */ -+ -+#ifndef AVUTIL_MACROS_H -+#define AVUTIL_MACROS_H -+ -+/** -+ * @addtogroup preproc_misc Preprocessor String Macros -+ * -+ * String manipulation macros -+ * -+ * @{ -+ */ -+ -+#define AV_STRINGIFY(s) AV_TOSTRING(s) -+#define AV_TOSTRING(s) #s -+ -+#define AV_GLUE(a, b) a ## b -+#define AV_JOIN(a, b) AV_GLUE(a, b) -+ -+/** -+ * @} -+ */ -+ -+#define AV_PRAGMA(s) _Pragma(#s) -+ -+#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1)) -+ -+#endif /* AVUTIL_MACROS_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/mathematics.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/mathematics.h -new file mode 100644 -index 000000000000..54901800ba6a ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/mathematics.h -@@ -0,0 +1,242 @@ -+/* -+ * copyright (c) 2005-2012 Michael Niedermayer -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/** -+ * @file -+ * @addtogroup lavu_math -+ * Mathematical utilities for working with timestamp and time base. -+ */ -+ -+#ifndef AVUTIL_MATHEMATICS_H -+#define AVUTIL_MATHEMATICS_H -+ -+#include -+#include -+#include "attributes.h" -+#include "rational.h" -+#include "intfloat.h" -+ -+#ifndef M_E -+#define M_E 2.7182818284590452354 /* e */ -+#endif -+#ifndef M_LN2 -+#define M_LN2 0.69314718055994530942 /* log_e 2 */ -+#endif -+#ifndef M_LN10 -+#define M_LN10 2.30258509299404568402 /* log_e 10 */ -+#endif -+#ifndef M_LOG2_10 -+#define M_LOG2_10 3.32192809488736234787 /* log_2 10 */ -+#endif -+#ifndef M_PHI -+#define M_PHI 1.61803398874989484820 /* phi / golden ratio */ -+#endif -+#ifndef M_PI -+#define M_PI 3.14159265358979323846 /* pi */ -+#endif -+#ifndef M_PI_2 -+#define M_PI_2 1.57079632679489661923 /* pi/2 */ -+#endif -+#ifndef M_SQRT1_2 -+#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ -+#endif -+#ifndef M_SQRT2 -+#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ -+#endif -+#ifndef NAN -+#define NAN av_int2float(0x7fc00000) -+#endif -+#ifndef INFINITY -+#define INFINITY av_int2float(0x7f800000) -+#endif -+ -+/** -+ * @addtogroup lavu_math -+ * -+ * @{ -+ */ -+ -+/** -+ * Rounding methods. -+ */ -+enum AVRounding { -+ AV_ROUND_ZERO = 0, ///< Round toward zero. -+ AV_ROUND_INF = 1, ///< Round away from zero. -+ AV_ROUND_DOWN = 2, ///< Round toward -infinity. -+ AV_ROUND_UP = 3, ///< Round toward +infinity. -+ AV_ROUND_NEAR_INF = 5, ///< Round to nearest and halfway cases away from zero. -+ /** -+ * Flag telling rescaling functions to pass `INT64_MIN`/`MAX` through -+ * unchanged, avoiding special cases for #AV_NOPTS_VALUE. -+ * -+ * Unlike other values of the enumeration AVRounding, this value is a -+ * bitmask that must be used in conjunction with another value of the -+ * enumeration through a bitwise OR, in order to set behavior for normal -+ * cases. -+ * -+ * @code{.c} -+ * av_rescale_rnd(3, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX); -+ * // Rescaling 3: -+ * // Calculating 3 * 1 / 2 -+ * // 3 / 2 is rounded up to 2 -+ * // => 2 -+ * -+ * av_rescale_rnd(AV_NOPTS_VALUE, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX); -+ * // Rescaling AV_NOPTS_VALUE: -+ * // AV_NOPTS_VALUE == INT64_MIN -+ * // AV_NOPTS_VALUE is passed through -+ * // => AV_NOPTS_VALUE -+ * @endcode -+ */ -+ AV_ROUND_PASS_MINMAX = 8192, -+}; -+ -+/** -+ * Compute the greatest common divisor of two integer operands. -+ * -+ * @param a,b Operands -+ * @return GCD of a and b up to sign; if a >= 0 and b >= 0, return value is >= 0; -+ * if a == 0 and b == 0, returns 0. -+ */ -+int64_t av_const av_gcd(int64_t a, int64_t b); -+ -+/** -+ * Rescale a 64-bit integer with rounding to nearest. -+ * -+ * The operation is mathematically equivalent to `a * b / c`, but writing that -+ * directly can overflow. -+ * -+ * This function is equivalent to av_rescale_rnd() with #AV_ROUND_NEAR_INF. -+ * -+ * @see av_rescale_rnd(), av_rescale_q(), av_rescale_q_rnd() -+ */ -+int64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const; -+ -+/** -+ * Rescale a 64-bit integer with specified rounding. -+ * -+ * The operation is mathematically equivalent to `a * b / c`, but writing that -+ * directly can overflow, and does not support different rounding methods. -+ * -+ * @see av_rescale(), av_rescale_q(), av_rescale_q_rnd() -+ */ -+int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd) av_const; -+ -+/** -+ * Rescale a 64-bit integer by 2 rational numbers. -+ * -+ * The operation is mathematically equivalent to `a * bq / cq`. -+ * -+ * This function is equivalent to av_rescale_q_rnd() with #AV_ROUND_NEAR_INF. -+ * -+ * @see av_rescale(), av_rescale_rnd(), av_rescale_q_rnd() -+ */ -+int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const; -+ -+/** -+ * Rescale a 64-bit integer by 2 rational numbers with specified rounding. -+ * -+ * The operation is mathematically equivalent to `a * bq / cq`. -+ * -+ * @see av_rescale(), av_rescale_rnd(), av_rescale_q() -+ */ -+int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq, -+ enum AVRounding rnd) av_const; -+ -+/** -+ * Compare two timestamps each in its own time base. -+ * -+ * @return One of the following values: -+ * - -1 if `ts_a` is before `ts_b` -+ * - 1 if `ts_a` is after `ts_b` -+ * - 0 if they represent the same position -+ * -+ * @warning -+ * The result of the function is undefined if one of the timestamps is outside -+ * the `int64_t` range when represented in the other's timebase. -+ */ -+int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b); -+ -+/** -+ * Compare the remainders of two integer operands divided by a common divisor. -+ * -+ * In other words, compare the least significant `log2(mod)` bits of integers -+ * `a` and `b`. -+ * -+ * @code{.c} -+ * av_compare_mod(0x11, 0x02, 0x10) < 0 // since 0x11 % 0x10 (0x1) < 0x02 % 0x10 (0x2) -+ * av_compare_mod(0x11, 0x02, 0x20) > 0 // since 0x11 % 0x20 (0x11) > 0x02 % 0x20 (0x02) -+ * @endcode -+ * -+ * @param a,b Operands -+ * @param mod Divisor; must be a power of 2 -+ * @return -+ * - a negative value if `a % mod < b % mod` -+ * - a positive value if `a % mod > b % mod` -+ * - zero if `a % mod == b % mod` -+ */ -+int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod); -+ -+/** -+ * Rescale a timestamp while preserving known durations. -+ * -+ * This function is designed to be called per audio packet to scale the input -+ * timestamp to a different time base. Compared to a simple av_rescale_q() -+ * call, this function is robust against possible inconsistent frame durations. -+ * -+ * The `last` parameter is a state variable that must be preserved for all -+ * subsequent calls for the same stream. For the first call, `*last` should be -+ * initialized to #AV_NOPTS_VALUE. -+ * -+ * @param[in] in_tb Input time base -+ * @param[in] in_ts Input timestamp -+ * @param[in] fs_tb Duration time base; typically this is finer-grained -+ * (greater) than `in_tb` and `out_tb` -+ * @param[in] duration Duration till the next call to this function (i.e. -+ * duration of the current packet/frame) -+ * @param[in,out] last Pointer to a timestamp expressed in terms of -+ * `fs_tb`, acting as a state variable -+ * @param[in] out_tb Output timebase -+ * @return Timestamp expressed in terms of `out_tb` -+ * -+ * @note In the context of this function, "duration" is in term of samples, not -+ * seconds. -+ */ -+int64_t av_rescale_delta(AVRational in_tb, int64_t in_ts, AVRational fs_tb, int duration, int64_t *last, AVRational out_tb); -+ -+/** -+ * Add a value to a timestamp. -+ * -+ * This function guarantees that when the same value is repeatly added that -+ * no accumulation of rounding errors occurs. -+ * -+ * @param[in] ts Input timestamp -+ * @param[in] ts_tb Input timestamp time base -+ * @param[in] inc Value to be added -+ * @param[in] inc_tb Time base of `inc` -+ */ -+int64_t av_add_stable(AVRational ts_tb, int64_t ts, AVRational inc_tb, int64_t inc); -+ -+ -+/** -+ * @} -+ */ -+ -+#endif /* AVUTIL_MATHEMATICS_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/mem.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/mem.h -new file mode 100644 -index 000000000000..7e0b12a8a782 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/mem.h -@@ -0,0 +1,700 @@ -+/* -+ * copyright (c) 2006 Michael Niedermayer -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/** -+ * @file -+ * @ingroup lavu_mem -+ * Memory handling functions -+ */ -+ -+#ifndef AVUTIL_MEM_H -+#define AVUTIL_MEM_H -+ -+#include -+#include -+ -+#include "attributes.h" -+#include "error.h" -+#include "avutil.h" -+ -+/** -+ * @addtogroup lavu_mem -+ * Utilities for manipulating memory. -+ * -+ * FFmpeg has several applications of memory that are not required of a typical -+ * program. For example, the computing-heavy components like video decoding and -+ * encoding can be sped up significantly through the use of aligned memory. -+ * -+ * However, for each of FFmpeg's applications of memory, there might not be a -+ * recognized or standardized API for that specific use. Memory alignment, for -+ * instance, varies wildly depending on operating systems, architectures, and -+ * compilers. Hence, this component of @ref libavutil is created to make -+ * dealing with memory consistently possible on all platforms. -+ * -+ * @{ -+ * -+ * @defgroup lavu_mem_macros Alignment Macros -+ * Helper macros for declaring aligned variables. -+ * @{ -+ */ -+ -+/** -+ * @def DECLARE_ALIGNED(n,t,v) -+ * Declare a variable that is aligned in memory. -+ * -+ * @code{.c} -+ * DECLARE_ALIGNED(16, uint16_t, aligned_int) = 42; -+ * DECLARE_ALIGNED(32, uint8_t, aligned_array)[128]; -+ * -+ * // The default-alignment equivalent would be -+ * uint16_t aligned_int = 42; -+ * uint8_t aligned_array[128]; -+ * @endcode -+ * -+ * @param n Minimum alignment in bytes -+ * @param t Type of the variable (or array element) -+ * @param v Name of the variable -+ */ -+ -+/** -+ * @def DECLARE_ASM_ALIGNED(n,t,v) -+ * Declare an aligned variable appropriate for use in inline assembly code. -+ * -+ * @code{.c} -+ * DECLARE_ASM_ALIGNED(16, uint64_t, pw_08) = UINT64_C(0x0008000800080008); -+ * @endcode -+ * -+ * @param n Minimum alignment in bytes -+ * @param t Type of the variable (or array element) -+ * @param v Name of the variable -+ */ -+ -+/** -+ * @def DECLARE_ASM_CONST(n,t,v) -+ * Declare a static constant aligned variable appropriate for use in inline -+ * assembly code. -+ * -+ * @code{.c} -+ * DECLARE_ASM_CONST(16, uint64_t, pw_08) = UINT64_C(0x0008000800080008); -+ * @endcode -+ * -+ * @param n Minimum alignment in bytes -+ * @param t Type of the variable (or array element) -+ * @param v Name of the variable -+ */ -+ -+#if defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1110 || defined(__SUNPRO_C) -+ #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v -+ #define DECLARE_ASM_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v -+ #define DECLARE_ASM_CONST(n,t,v) const t __attribute__ ((aligned (n))) v -+#elif defined(__DJGPP__) -+ #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (FFMIN(n, 16)))) v -+ #define DECLARE_ASM_ALIGNED(n,t,v) t av_used __attribute__ ((aligned (FFMIN(n, 16)))) v -+ #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (FFMIN(n, 16)))) v -+#elif defined(__GNUC__) || defined(__clang__) -+ #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v -+ #define DECLARE_ASM_ALIGNED(n,t,v) t av_used __attribute__ ((aligned (n))) v -+ #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (n))) v -+#elif defined(_MSC_VER) -+ #define DECLARE_ALIGNED(n,t,v) __declspec(align(n)) t v -+ #define DECLARE_ASM_ALIGNED(n,t,v) __declspec(align(n)) t v -+ #define DECLARE_ASM_CONST(n,t,v) __declspec(align(n)) static const t v -+#else -+ #define DECLARE_ALIGNED(n,t,v) t v -+ #define DECLARE_ASM_ALIGNED(n,t,v) t v -+ #define DECLARE_ASM_CONST(n,t,v) static const t v -+#endif -+ -+/** -+ * @} -+ */ -+ -+/** -+ * @defgroup lavu_mem_attrs Function Attributes -+ * Function attributes applicable to memory handling functions. -+ * -+ * These function attributes can help compilers emit more useful warnings, or -+ * generate better code. -+ * @{ -+ */ -+ -+/** -+ * @def av_malloc_attrib -+ * Function attribute denoting a malloc-like function. -+ * -+ * @see
Function attribute `malloc` in GCC's documentation -+ */ -+ -+#if AV_GCC_VERSION_AT_LEAST(3,1) -+ #define av_malloc_attrib __attribute__((__malloc__)) -+#else -+ #define av_malloc_attrib -+#endif -+ -+/** -+ * @def av_alloc_size(...) -+ * Function attribute used on a function that allocates memory, whose size is -+ * given by the specified parameter(s). -+ * -+ * @code{.c} -+ * void *av_malloc(size_t size) av_alloc_size(1); -+ * void *av_calloc(size_t nmemb, size_t size) av_alloc_size(1, 2); -+ * @endcode -+ * -+ * @param ... One or two parameter indexes, separated by a comma -+ * -+ * @see Function attribute `alloc_size` in GCC's documentation -+ */ -+ -+#if AV_GCC_VERSION_AT_LEAST(4,3) -+ #define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__))) -+#else -+ #define av_alloc_size(...) -+#endif -+ -+/** -+ * @} -+ */ -+ -+/** -+ * @defgroup lavu_mem_funcs Heap Management -+ * Functions responsible for allocating, freeing, and copying memory. -+ * -+ * All memory allocation functions have a built-in upper limit of `INT_MAX` -+ * bytes. This may be changed with av_max_alloc(), although exercise extreme -+ * caution when doing so. -+ * -+ * @{ -+ */ -+ -+/** -+ * Allocate a memory block with alignment suitable for all memory accesses -+ * (including vectors if available on the CPU). -+ * -+ * @param size Size in bytes for the memory block to be allocated -+ * @return Pointer to the allocated block, or `NULL` if the block cannot -+ * be allocated -+ * @see av_mallocz() -+ */ -+void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1); -+ -+/** -+ * Allocate a memory block with alignment suitable for all memory accesses -+ * (including vectors if available on the CPU) and zero all the bytes of the -+ * block. -+ * -+ * @param size Size in bytes for the memory block to be allocated -+ * @return Pointer to the allocated block, or `NULL` if it cannot be allocated -+ * @see av_malloc() -+ */ -+void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1); -+ -+/** -+ * Allocate a memory block for an array with av_malloc(). -+ * -+ * The allocated memory will have size `size * nmemb` bytes. -+ * -+ * @param nmemb Number of element -+ * @param size Size of a single element -+ * @return Pointer to the allocated block, or `NULL` if the block cannot -+ * be allocated -+ * @see av_malloc() -+ */ -+av_alloc_size(1, 2) void *av_malloc_array(size_t nmemb, size_t size); -+ -+/** -+ * Allocate a memory block for an array with av_mallocz(). -+ * -+ * The allocated memory will have size `size * nmemb` bytes. -+ * -+ * @param nmemb Number of elements -+ * @param size Size of the single element -+ * @return Pointer to the allocated block, or `NULL` if the block cannot -+ * be allocated -+ * -+ * @see av_mallocz() -+ * @see av_malloc_array() -+ */ -+av_alloc_size(1, 2) void *av_mallocz_array(size_t nmemb, size_t size); -+ -+/** -+ * Non-inlined equivalent of av_mallocz_array(). -+ * -+ * Created for symmetry with the calloc() C function. -+ */ -+void *av_calloc(size_t nmemb, size_t size) av_malloc_attrib; -+ -+/** -+ * Allocate, reallocate, or free a block of memory. -+ * -+ * If `ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is -+ * zero, free the memory block pointed to by `ptr`. Otherwise, expand or -+ * shrink that block of memory according to `size`. -+ * -+ * @param ptr Pointer to a memory block already allocated with -+ * av_realloc() or `NULL` -+ * @param size Size in bytes of the memory block to be allocated or -+ * reallocated -+ * -+ * @return Pointer to a newly-reallocated block or `NULL` if the block -+ * cannot be reallocated or the function is used to free the memory block -+ * -+ * @warning Unlike av_malloc(), the returned pointer is not guaranteed to be -+ * correctly aligned. -+ * @see av_fast_realloc() -+ * @see av_reallocp() -+ */ -+void *av_realloc(void *ptr, size_t size) av_alloc_size(2); -+ -+/** -+ * Allocate, reallocate, or free a block of memory through a pointer to a -+ * pointer. -+ * -+ * If `*ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is -+ * zero, free the memory block pointed to by `*ptr`. Otherwise, expand or -+ * shrink that block of memory according to `size`. -+ * -+ * @param[in,out] ptr Pointer to a pointer to a memory block already allocated -+ * with av_realloc(), or a pointer to `NULL`. The pointer -+ * is updated on success, or freed on failure. -+ * @param[in] size Size in bytes for the memory block to be allocated or -+ * reallocated -+ * -+ * @return Zero on success, an AVERROR error code on failure -+ * -+ * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be -+ * correctly aligned. -+ */ -+av_warn_unused_result -+int av_reallocp(void *ptr, size_t size); -+ -+/** -+ * Allocate, reallocate, or free a block of memory. -+ * -+ * This function does the same thing as av_realloc(), except: -+ * - It takes two size arguments and allocates `nelem * elsize` bytes, -+ * after checking the result of the multiplication for integer overflow. -+ * - It frees the input block in case of failure, thus avoiding the memory -+ * leak with the classic -+ * @code{.c} -+ * buf = realloc(buf); -+ * if (!buf) -+ * return -1; -+ * @endcode -+ * pattern. -+ */ -+void *av_realloc_f(void *ptr, size_t nelem, size_t elsize); -+ -+/** -+ * Allocate, reallocate, or free an array. -+ * -+ * If `ptr` is `NULL` and `nmemb` > 0, allocate a new block. If -+ * `nmemb` is zero, free the memory block pointed to by `ptr`. -+ * -+ * @param ptr Pointer to a memory block already allocated with -+ * av_realloc() or `NULL` -+ * @param nmemb Number of elements in the array -+ * @param size Size of the single element of the array -+ * -+ * @return Pointer to a newly-reallocated block or NULL if the block -+ * cannot be reallocated or the function is used to free the memory block -+ * -+ * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be -+ * correctly aligned. -+ * @see av_reallocp_array() -+ */ -+av_alloc_size(2, 3) void *av_realloc_array(void *ptr, size_t nmemb, size_t size); -+ -+/** -+ * Allocate, reallocate, or free an array through a pointer to a pointer. -+ * -+ * If `*ptr` is `NULL` and `nmemb` > 0, allocate a new block. If `nmemb` is -+ * zero, free the memory block pointed to by `*ptr`. -+ * -+ * @param[in,out] ptr Pointer to a pointer to a memory block already -+ * allocated with av_realloc(), or a pointer to `NULL`. -+ * The pointer is updated on success, or freed on failure. -+ * @param[in] nmemb Number of elements -+ * @param[in] size Size of the single element -+ * -+ * @return Zero on success, an AVERROR error code on failure -+ * -+ * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be -+ * correctly aligned. -+ */ -+av_alloc_size(2, 3) int av_reallocp_array(void *ptr, size_t nmemb, size_t size); -+ -+/** -+ * Reallocate the given buffer if it is not large enough, otherwise do nothing. -+ * -+ * If the given buffer is `NULL`, then a new uninitialized buffer is allocated. -+ * -+ * If the given buffer is not large enough, and reallocation fails, `NULL` is -+ * returned and `*size` is set to 0, but the original buffer is not changed or -+ * freed. -+ * -+ * A typical use pattern follows: -+ * -+ * @code{.c} -+ * uint8_t *buf = ...; -+ * uint8_t *new_buf = av_fast_realloc(buf, ¤t_size, size_needed); -+ * if (!new_buf) { -+ * // Allocation failed; clean up original buffer -+ * av_freep(&buf); -+ * return AVERROR(ENOMEM); -+ * } -+ * @endcode -+ * -+ * @param[in,out] ptr Already allocated buffer, or `NULL` -+ * @param[in,out] size Pointer to current size of buffer `ptr`. `*size` is -+ * changed to `min_size` in case of success or 0 in -+ * case of failure -+ * @param[in] min_size New size of buffer `ptr` -+ * @return `ptr` if the buffer is large enough, a pointer to newly reallocated -+ * buffer if the buffer was not large enough, or `NULL` in case of -+ * error -+ * @see av_realloc() -+ * @see av_fast_malloc() -+ */ -+void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size); -+ -+/** -+ * Allocate a buffer, reusing the given one if large enough. -+ * -+ * Contrary to av_fast_realloc(), the current buffer contents might not be -+ * preserved and on error the old buffer is freed, thus no special handling to -+ * avoid memleaks is necessary. -+ * -+ * `*ptr` is allowed to be `NULL`, in which case allocation always happens if -+ * `size_needed` is greater than 0. -+ * -+ * @code{.c} -+ * uint8_t *buf = ...; -+ * av_fast_malloc(&buf, ¤t_size, size_needed); -+ * if (!buf) { -+ * // Allocation failed; buf already freed -+ * return AVERROR(ENOMEM); -+ * } -+ * @endcode -+ * -+ * @param[in,out] ptr Pointer to pointer to an already allocated buffer. -+ * `*ptr` will be overwritten with pointer to new -+ * buffer on success or `NULL` on failure -+ * @param[in,out] size Pointer to current size of buffer `*ptr`. `*size` is -+ * changed to `min_size` in case of success or 0 in -+ * case of failure -+ * @param[in] min_size New size of buffer `*ptr` -+ * @see av_realloc() -+ * @see av_fast_mallocz() -+ */ -+void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size); -+ -+/** -+ * Allocate and clear a buffer, reusing the given one if large enough. -+ * -+ * Like av_fast_malloc(), but all newly allocated space is initially cleared. -+ * Reused buffer is not cleared. -+ * -+ * `*ptr` is allowed to be `NULL`, in which case allocation always happens if -+ * `size_needed` is greater than 0. -+ * -+ * @param[in,out] ptr Pointer to pointer to an already allocated buffer. -+ * `*ptr` will be overwritten with pointer to new -+ * buffer on success or `NULL` on failure -+ * @param[in,out] size Pointer to current size of buffer `*ptr`. `*size` is -+ * changed to `min_size` in case of success or 0 in -+ * case of failure -+ * @param[in] min_size New size of buffer `*ptr` -+ * @see av_fast_malloc() -+ */ -+void av_fast_mallocz(void *ptr, unsigned int *size, size_t min_size); -+ -+/** -+ * Free a memory block which has been allocated with a function of av_malloc() -+ * or av_realloc() family. -+ * -+ * @param ptr Pointer to the memory block which should be freed. -+ * -+ * @note `ptr = NULL` is explicitly allowed. -+ * @note It is recommended that you use av_freep() instead, to prevent leaving -+ * behind dangling pointers. -+ * @see av_freep() -+ */ -+void av_free(void *ptr); -+ -+/** -+ * Free a memory block which has been allocated with a function of av_malloc() -+ * or av_realloc() family, and set the pointer pointing to it to `NULL`. -+ * -+ * @code{.c} -+ * uint8_t *buf = av_malloc(16); -+ * av_free(buf); -+ * // buf now contains a dangling pointer to freed memory, and accidental -+ * // dereference of buf will result in a use-after-free, which may be a -+ * // security risk. -+ * -+ * uint8_t *buf = av_malloc(16); -+ * av_freep(&buf); -+ * // buf is now NULL, and accidental dereference will only result in a -+ * // NULL-pointer dereference. -+ * @endcode -+ * -+ * @param ptr Pointer to the pointer to the memory block which should be freed -+ * @note `*ptr = NULL` is safe and leads to no action. -+ * @see av_free() -+ */ -+void av_freep(void *ptr); -+ -+/** -+ * Duplicate a string. -+ * -+ * @param s String to be duplicated -+ * @return Pointer to a newly-allocated string containing a -+ * copy of `s` or `NULL` if the string cannot be allocated -+ * @see av_strndup() -+ */ -+char *av_strdup(const char *s) av_malloc_attrib; -+ -+/** -+ * Duplicate a substring of a string. -+ * -+ * @param s String to be duplicated -+ * @param len Maximum length of the resulting string (not counting the -+ * terminating byte) -+ * @return Pointer to a newly-allocated string containing a -+ * substring of `s` or `NULL` if the string cannot be allocated -+ */ -+char *av_strndup(const char *s, size_t len) av_malloc_attrib; -+ -+/** -+ * Duplicate a buffer with av_malloc(). -+ * -+ * @param p Buffer to be duplicated -+ * @param size Size in bytes of the buffer copied -+ * @return Pointer to a newly allocated buffer containing a -+ * copy of `p` or `NULL` if the buffer cannot be allocated -+ */ -+void *av_memdup(const void *p, size_t size); -+ -+/** -+ * Overlapping memcpy() implementation. -+ * -+ * @param dst Destination buffer -+ * @param back Number of bytes back to start copying (i.e. the initial size of -+ * the overlapping window); must be > 0 -+ * @param cnt Number of bytes to copy; must be >= 0 -+ * -+ * @note `cnt > back` is valid, this will copy the bytes we just copied, -+ * thus creating a repeating pattern with a period length of `back`. -+ */ -+void av_memcpy_backptr(uint8_t *dst, int back, int cnt); -+ -+/** -+ * @} -+ */ -+ -+/** -+ * @defgroup lavu_mem_dynarray Dynamic Array -+ * -+ * Utilities to make an array grow when needed. -+ * -+ * Sometimes, the programmer would want to have an array that can grow when -+ * needed. The libavutil dynamic array utilities fill that need. -+ * -+ * libavutil supports two systems of appending elements onto a dynamically -+ * allocated array, the first one storing the pointer to the value in the -+ * array, and the second storing the value directly. In both systems, the -+ * caller is responsible for maintaining a variable containing the length of -+ * the array, as well as freeing of the array after use. -+ * -+ * The first system stores pointers to values in a block of dynamically -+ * allocated memory. Since only pointers are stored, the function does not need -+ * to know the size of the type. Both av_dynarray_add() and -+ * av_dynarray_add_nofree() implement this system. -+ * -+ * @code -+ * type **array = NULL; //< an array of pointers to values -+ * int nb = 0; //< a variable to keep track of the length of the array -+ * -+ * type to_be_added = ...; -+ * type to_be_added2 = ...; -+ * -+ * av_dynarray_add(&array, &nb, &to_be_added); -+ * if (nb == 0) -+ * return AVERROR(ENOMEM); -+ * -+ * av_dynarray_add(&array, &nb, &to_be_added2); -+ * if (nb == 0) -+ * return AVERROR(ENOMEM); -+ * -+ * // Now: -+ * // nb == 2 -+ * // &to_be_added == array[0] -+ * // &to_be_added2 == array[1] -+ * -+ * av_freep(&array); -+ * @endcode -+ * -+ * The second system stores the value directly in a block of memory. As a -+ * result, the function has to know the size of the type. av_dynarray2_add() -+ * implements this mechanism. -+ * -+ * @code -+ * type *array = NULL; //< an array of values -+ * int nb = 0; //< a variable to keep track of the length of the array -+ * -+ * type to_be_added = ...; -+ * type to_be_added2 = ...; -+ * -+ * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), NULL); -+ * if (!addr) -+ * return AVERROR(ENOMEM); -+ * memcpy(addr, &to_be_added, sizeof(to_be_added)); -+ * -+ * // Shortcut of the above. -+ * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), -+ * (const void *)&to_be_added2); -+ * if (!addr) -+ * return AVERROR(ENOMEM); -+ * -+ * // Now: -+ * // nb == 2 -+ * // to_be_added == array[0] -+ * // to_be_added2 == array[1] -+ * -+ * av_freep(&array); -+ * @endcode -+ * -+ * @{ -+ */ -+ -+/** -+ * Add the pointer to an element to a dynamic array. -+ * -+ * The array to grow is supposed to be an array of pointers to -+ * structures, and the element to add must be a pointer to an already -+ * allocated structure. -+ * -+ * The array is reallocated when its size reaches powers of 2. -+ * Therefore, the amortized cost of adding an element is constant. -+ * -+ * In case of success, the pointer to the array is updated in order to -+ * point to the new grown array, and the number pointed to by `nb_ptr` -+ * is incremented. -+ * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and -+ * `*nb_ptr` is set to 0. -+ * -+ * @param[in,out] tab_ptr Pointer to the array to grow -+ * @param[in,out] nb_ptr Pointer to the number of elements in the array -+ * @param[in] elem Element to add -+ * @see av_dynarray_add_nofree(), av_dynarray2_add() -+ */ -+void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem); -+ -+/** -+ * Add an element to a dynamic array. -+ * -+ * Function has the same functionality as av_dynarray_add(), -+ * but it doesn't free memory on fails. It returns error code -+ * instead and leave current buffer untouched. -+ * -+ * @return >=0 on success, negative otherwise -+ * @see av_dynarray_add(), av_dynarray2_add() -+ */ -+av_warn_unused_result -+int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem); -+ -+/** -+ * Add an element of size `elem_size` to a dynamic array. -+ * -+ * The array is reallocated when its number of elements reaches powers of 2. -+ * Therefore, the amortized cost of adding an element is constant. -+ * -+ * In case of success, the pointer to the array is updated in order to -+ * point to the new grown array, and the number pointed to by `nb_ptr` -+ * is incremented. -+ * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and -+ * `*nb_ptr` is set to 0. -+ * -+ * @param[in,out] tab_ptr Pointer to the array to grow -+ * @param[in,out] nb_ptr Pointer to the number of elements in the array -+ * @param[in] elem_size Size in bytes of an element in the array -+ * @param[in] elem_data Pointer to the data of the element to add. If -+ * `NULL`, the space of the newly added element is -+ * allocated but left uninitialized. -+ * -+ * @return Pointer to the data of the element to copy in the newly allocated -+ * space -+ * @see av_dynarray_add(), av_dynarray_add_nofree() -+ */ -+void *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size, -+ const uint8_t *elem_data); -+ -+/** -+ * @} -+ */ -+ -+/** -+ * @defgroup lavu_mem_misc Miscellaneous Functions -+ * -+ * Other functions related to memory allocation. -+ * -+ * @{ -+ */ -+ -+/** -+ * Multiply two `size_t` values checking for overflow. -+ * -+ * @param[in] a,b Operands of multiplication -+ * @param[out] r Pointer to the result of the operation -+ * @return 0 on success, AVERROR(EINVAL) on overflow -+ */ -+static inline int av_size_mult(size_t a, size_t b, size_t *r) -+{ -+ size_t t = a * b; -+ /* Hack inspired from glibc: don't try the division if nelem and elsize -+ * are both less than sqrt(SIZE_MAX). */ -+ if ((a | b) >= ((size_t)1 << (sizeof(size_t) * 4)) && a && t / a != b) -+ return AVERROR(EINVAL); -+ *r = t; -+ return 0; -+} -+ -+/** -+ * Set the maximum size that may be allocated in one block. -+ * -+ * The value specified with this function is effective for all libavutil's @ref -+ * lavu_mem_funcs "heap management functions." -+ * -+ * By default, the max value is defined as `INT_MAX`. -+ * -+ * @param max Value to be set as the new maximum size -+ * -+ * @warning Exercise extreme caution when using this function. Don't touch -+ * this if you do not understand the full consequence of doing so. -+ */ -+void av_max_alloc(size_t max); -+ -+/** -+ * @} -+ * @} -+ */ -+ -+#endif /* AVUTIL_MEM_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/pixfmt.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/pixfmt.h -new file mode 100644 -index 000000000000..e184a56672dc ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/pixfmt.h -@@ -0,0 +1,529 @@ -+/* -+ * copyright (c) 2006 Michael Niedermayer -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+#ifndef AVUTIL_PIXFMT_H -+#define AVUTIL_PIXFMT_H -+ -+/** -+ * @file -+ * pixel format definitions -+ */ -+ -+#include "libavutil/avconfig.h" -+#include "version.h" -+ -+#define AVPALETTE_SIZE 1024 -+#define AVPALETTE_COUNT 256 -+ -+/** -+ * Pixel format. -+ * -+ * @note -+ * AV_PIX_FMT_RGB32 is handled in an endian-specific manner. An RGBA -+ * color is put together as: -+ * (A << 24) | (R << 16) | (G << 8) | B -+ * This is stored as BGRA on little-endian CPU architectures and ARGB on -+ * big-endian CPUs. -+ * -+ * @par -+ * When the pixel format is palettized RGB32 (AV_PIX_FMT_PAL8), the palettized -+ * image data is stored in AVFrame.data[0]. The palette is transported in -+ * AVFrame.data[1], is 1024 bytes long (256 4-byte entries) and is -+ * formatted the same as in AV_PIX_FMT_RGB32 described above (i.e., it is -+ * also endian-specific). Note also that the individual RGB32 palette -+ * components stored in AVFrame.data[1] should be in the range 0..255. -+ * This is important as many custom PAL8 video codecs that were designed -+ * to run on the IBM VGA graphics adapter use 6-bit palette components. -+ * -+ * @par -+ * For all the 8 bits per pixel formats, an RGB32 palette is in data[1] like -+ * for pal8. This palette is filled in automatically by the function -+ * allocating the picture. -+ */ -+enum AVPixelFormat { -+ AV_PIX_FMT_NONE = -1, -+ AV_PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples) -+ AV_PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr -+ AV_PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB... -+ AV_PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR... -+ AV_PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) -+ AV_PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples) -+ AV_PIX_FMT_YUV410P, ///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples) -+ AV_PIX_FMT_YUV411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) -+ AV_PIX_FMT_GRAY8, ///< Y , 8bpp -+ AV_PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb -+ AV_PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb -+ AV_PIX_FMT_PAL8, ///< 8 bits with AV_PIX_FMT_RGB32 palette -+ AV_PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range -+ AV_PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting color_range -+ AV_PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting color_range -+ AV_PIX_FMT_UYVY422, ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 -+ AV_PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3 -+ AV_PIX_FMT_BGR8, ///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb) -+ AV_PIX_FMT_BGR4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits -+ AV_PIX_FMT_BGR4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb) -+ AV_PIX_FMT_RGB8, ///< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb) -+ AV_PIX_FMT_RGB4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits -+ AV_PIX_FMT_RGB4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb) -+ AV_PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V) -+ AV_PIX_FMT_NV21, ///< as above, but U and V bytes are swapped -+ -+ AV_PIX_FMT_ARGB, ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB... -+ AV_PIX_FMT_RGBA, ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA... -+ AV_PIX_FMT_ABGR, ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR... -+ AV_PIX_FMT_BGRA, ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA... -+ -+ AV_PIX_FMT_GRAY16BE, ///< Y , 16bpp, big-endian -+ AV_PIX_FMT_GRAY16LE, ///< Y , 16bpp, little-endian -+ AV_PIX_FMT_YUV440P, ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples) -+ AV_PIX_FMT_YUVJ440P, ///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range -+ AV_PIX_FMT_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples) -+ AV_PIX_FMT_RGB48BE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian -+ AV_PIX_FMT_RGB48LE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian -+ -+ AV_PIX_FMT_RGB565BE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian -+ AV_PIX_FMT_RGB565LE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian -+ AV_PIX_FMT_RGB555BE, ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian , X=unused/undefined -+ AV_PIX_FMT_RGB555LE, ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined -+ -+ AV_PIX_FMT_BGR565BE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian -+ AV_PIX_FMT_BGR565LE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian -+ AV_PIX_FMT_BGR555BE, ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian , X=unused/undefined -+ AV_PIX_FMT_BGR555LE, ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined -+ -+#if FF_API_VAAPI -+ /** @name Deprecated pixel formats */ -+ /**@{*/ -+ AV_PIX_FMT_VAAPI_MOCO, ///< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers -+ AV_PIX_FMT_VAAPI_IDCT, ///< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers -+ AV_PIX_FMT_VAAPI_VLD, ///< HW decoding through VA API, Picture.data[3] contains a VASurfaceID -+ /**@}*/ -+ AV_PIX_FMT_VAAPI = AV_PIX_FMT_VAAPI_VLD, -+#else -+ /** -+ * Hardware acceleration through VA-API, data[3] contains a -+ * VASurfaceID. -+ */ -+ AV_PIX_FMT_VAAPI, -+#endif -+ -+ AV_PIX_FMT_YUV420P16LE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian -+ AV_PIX_FMT_YUV420P16BE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian -+ AV_PIX_FMT_YUV422P16LE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian -+ AV_PIX_FMT_YUV422P16BE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian -+ AV_PIX_FMT_YUV444P16LE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian -+ AV_PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian -+ AV_PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer -+ -+ AV_PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined -+ AV_PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian, X=unused/undefined -+ AV_PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined -+ AV_PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian, X=unused/undefined -+ AV_PIX_FMT_YA8, ///< 8 bits gray, 8 bits alpha -+ -+ AV_PIX_FMT_Y400A = AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8 -+ AV_PIX_FMT_GRAY8A= AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8 -+ -+ AV_PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian -+ AV_PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian -+ -+ /** -+ * The following 12 formats have the disadvantage of needing 1 format for each bit depth. -+ * Notice that each 9/10 bits sample is stored in 16 bits with extra padding. -+ * If you want to support multiple bit depths, then using AV_PIX_FMT_YUV420P16* with the bpp stored separately is better. -+ */ -+ AV_PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian -+ AV_PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian -+ AV_PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian -+ AV_PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian -+ AV_PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian -+ AV_PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian -+ AV_PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian -+ AV_PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian -+ AV_PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian -+ AV_PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian -+ AV_PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian -+ AV_PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian -+ AV_PIX_FMT_GBRP, ///< planar GBR 4:4:4 24bpp -+ AV_PIX_FMT_GBR24P = AV_PIX_FMT_GBRP, // alias for #AV_PIX_FMT_GBRP -+ AV_PIX_FMT_GBRP9BE, ///< planar GBR 4:4:4 27bpp, big-endian -+ AV_PIX_FMT_GBRP9LE, ///< planar GBR 4:4:4 27bpp, little-endian -+ AV_PIX_FMT_GBRP10BE, ///< planar GBR 4:4:4 30bpp, big-endian -+ AV_PIX_FMT_GBRP10LE, ///< planar GBR 4:4:4 30bpp, little-endian -+ AV_PIX_FMT_GBRP16BE, ///< planar GBR 4:4:4 48bpp, big-endian -+ AV_PIX_FMT_GBRP16LE, ///< planar GBR 4:4:4 48bpp, little-endian -+ AV_PIX_FMT_YUVA422P, ///< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples) -+ AV_PIX_FMT_YUVA444P, ///< planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples) -+ AV_PIX_FMT_YUVA420P9BE, ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian -+ AV_PIX_FMT_YUVA420P9LE, ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), little-endian -+ AV_PIX_FMT_YUVA422P9BE, ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian -+ AV_PIX_FMT_YUVA422P9LE, ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian -+ AV_PIX_FMT_YUVA444P9BE, ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian -+ AV_PIX_FMT_YUVA444P9LE, ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian -+ AV_PIX_FMT_YUVA420P10BE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian) -+ AV_PIX_FMT_YUVA420P10LE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian) -+ AV_PIX_FMT_YUVA422P10BE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian) -+ AV_PIX_FMT_YUVA422P10LE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian) -+ AV_PIX_FMT_YUVA444P10BE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian) -+ AV_PIX_FMT_YUVA444P10LE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian) -+ AV_PIX_FMT_YUVA420P16BE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian) -+ AV_PIX_FMT_YUVA420P16LE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian) -+ AV_PIX_FMT_YUVA422P16BE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian) -+ AV_PIX_FMT_YUVA422P16LE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian) -+ AV_PIX_FMT_YUVA444P16BE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian) -+ AV_PIX_FMT_YUVA444P16LE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian) -+ -+ AV_PIX_FMT_VDPAU, ///< HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface -+ -+ AV_PIX_FMT_XYZ12LE, ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as little-endian, the 4 lower bits are set to 0 -+ AV_PIX_FMT_XYZ12BE, ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as big-endian, the 4 lower bits are set to 0 -+ AV_PIX_FMT_NV16, ///< interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) -+ AV_PIX_FMT_NV20LE, ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian -+ AV_PIX_FMT_NV20BE, ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian -+ -+ AV_PIX_FMT_RGBA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian -+ AV_PIX_FMT_RGBA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian -+ AV_PIX_FMT_BGRA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian -+ AV_PIX_FMT_BGRA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian -+ -+ AV_PIX_FMT_YVYU422, ///< packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb -+ -+ AV_PIX_FMT_YA16BE, ///< 16 bits gray, 16 bits alpha (big-endian) -+ AV_PIX_FMT_YA16LE, ///< 16 bits gray, 16 bits alpha (little-endian) -+ -+ AV_PIX_FMT_GBRAP, ///< planar GBRA 4:4:4:4 32bpp -+ AV_PIX_FMT_GBRAP16BE, ///< planar GBRA 4:4:4:4 64bpp, big-endian -+ AV_PIX_FMT_GBRAP16LE, ///< planar GBRA 4:4:4:4 64bpp, little-endian -+ /** -+ * HW acceleration through QSV, data[3] contains a pointer to the -+ * mfxFrameSurface1 structure. -+ */ -+ AV_PIX_FMT_QSV, -+ /** -+ * HW acceleration though MMAL, data[3] contains a pointer to the -+ * MMAL_BUFFER_HEADER_T structure. -+ */ -+ AV_PIX_FMT_MMAL, -+ -+ AV_PIX_FMT_D3D11VA_VLD, ///< HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView pointer -+ -+ /** -+ * HW acceleration through CUDA. data[i] contain CUdeviceptr pointers -+ * exactly as for system memory frames. -+ */ -+ AV_PIX_FMT_CUDA, -+ -+ AV_PIX_FMT_0RGB, ///< packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined -+ AV_PIX_FMT_RGB0, ///< packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined -+ AV_PIX_FMT_0BGR, ///< packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined -+ AV_PIX_FMT_BGR0, ///< packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined -+ -+ AV_PIX_FMT_YUV420P12BE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian -+ AV_PIX_FMT_YUV420P12LE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian -+ AV_PIX_FMT_YUV420P14BE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian -+ AV_PIX_FMT_YUV420P14LE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian -+ AV_PIX_FMT_YUV422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian -+ AV_PIX_FMT_YUV422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian -+ AV_PIX_FMT_YUV422P14BE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian -+ AV_PIX_FMT_YUV422P14LE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian -+ AV_PIX_FMT_YUV444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian -+ AV_PIX_FMT_YUV444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian -+ AV_PIX_FMT_YUV444P14BE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian -+ AV_PIX_FMT_YUV444P14LE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian -+ AV_PIX_FMT_GBRP12BE, ///< planar GBR 4:4:4 36bpp, big-endian -+ AV_PIX_FMT_GBRP12LE, ///< planar GBR 4:4:4 36bpp, little-endian -+ AV_PIX_FMT_GBRP14BE, ///< planar GBR 4:4:4 42bpp, big-endian -+ AV_PIX_FMT_GBRP14LE, ///< planar GBR 4:4:4 42bpp, little-endian -+ AV_PIX_FMT_YUVJ411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV411P and setting color_range -+ -+ AV_PIX_FMT_BAYER_BGGR8, ///< bayer, BGBG..(odd line), GRGR..(even line), 8-bit samples */ -+ AV_PIX_FMT_BAYER_RGGB8, ///< bayer, RGRG..(odd line), GBGB..(even line), 8-bit samples */ -+ AV_PIX_FMT_BAYER_GBRG8, ///< bayer, GBGB..(odd line), RGRG..(even line), 8-bit samples */ -+ AV_PIX_FMT_BAYER_GRBG8, ///< bayer, GRGR..(odd line), BGBG..(even line), 8-bit samples */ -+ AV_PIX_FMT_BAYER_BGGR16LE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, little-endian */ -+ AV_PIX_FMT_BAYER_BGGR16BE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, big-endian */ -+ AV_PIX_FMT_BAYER_RGGB16LE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian */ -+ AV_PIX_FMT_BAYER_RGGB16BE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, big-endian */ -+ AV_PIX_FMT_BAYER_GBRG16LE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, little-endian */ -+ AV_PIX_FMT_BAYER_GBRG16BE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian */ -+ AV_PIX_FMT_BAYER_GRBG16LE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian */ -+ AV_PIX_FMT_BAYER_GRBG16BE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian */ -+ -+ AV_PIX_FMT_XVMC,///< XVideo Motion Acceleration via common packet passing -+ -+ AV_PIX_FMT_YUV440P10LE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian -+ AV_PIX_FMT_YUV440P10BE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian -+ AV_PIX_FMT_YUV440P12LE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian -+ AV_PIX_FMT_YUV440P12BE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian -+ AV_PIX_FMT_AYUV64LE, ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), little-endian -+ AV_PIX_FMT_AYUV64BE, ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), big-endian -+ -+ AV_PIX_FMT_VIDEOTOOLBOX, ///< hardware decoding through Videotoolbox -+ -+ AV_PIX_FMT_P010LE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, little-endian -+ AV_PIX_FMT_P010BE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, big-endian -+ -+ AV_PIX_FMT_GBRAP12BE, ///< planar GBR 4:4:4:4 48bpp, big-endian -+ AV_PIX_FMT_GBRAP12LE, ///< planar GBR 4:4:4:4 48bpp, little-endian -+ -+ AV_PIX_FMT_GBRAP10BE, ///< planar GBR 4:4:4:4 40bpp, big-endian -+ AV_PIX_FMT_GBRAP10LE, ///< planar GBR 4:4:4:4 40bpp, little-endian -+ -+ AV_PIX_FMT_MEDIACODEC, ///< hardware decoding through MediaCodec -+ -+ AV_PIX_FMT_GRAY12BE, ///< Y , 12bpp, big-endian -+ AV_PIX_FMT_GRAY12LE, ///< Y , 12bpp, little-endian -+ AV_PIX_FMT_GRAY10BE, ///< Y , 10bpp, big-endian -+ AV_PIX_FMT_GRAY10LE, ///< Y , 10bpp, little-endian -+ -+ AV_PIX_FMT_P016LE, ///< like NV12, with 16bpp per component, little-endian -+ AV_PIX_FMT_P016BE, ///< like NV12, with 16bpp per component, big-endian -+ -+ /** -+ * Hardware surfaces for Direct3D11. -+ * -+ * This is preferred over the legacy AV_PIX_FMT_D3D11VA_VLD. The new D3D11 -+ * hwaccel API and filtering support AV_PIX_FMT_D3D11 only. -+ * -+ * data[0] contains a ID3D11Texture2D pointer, and data[1] contains the -+ * texture array index of the frame as intptr_t if the ID3D11Texture2D is -+ * an array texture (or always 0 if it's a normal texture). -+ */ -+ AV_PIX_FMT_D3D11, -+ -+ AV_PIX_FMT_GRAY9BE, ///< Y , 9bpp, big-endian -+ AV_PIX_FMT_GRAY9LE, ///< Y , 9bpp, little-endian -+ -+ AV_PIX_FMT_GBRPF32BE, ///< IEEE-754 single precision planar GBR 4:4:4, 96bpp, big-endian -+ AV_PIX_FMT_GBRPF32LE, ///< IEEE-754 single precision planar GBR 4:4:4, 96bpp, little-endian -+ AV_PIX_FMT_GBRAPF32BE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, big-endian -+ AV_PIX_FMT_GBRAPF32LE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, little-endian -+ -+ /** -+ * DRM-managed buffers exposed through PRIME buffer sharing. -+ * -+ * data[0] points to an AVDRMFrameDescriptor. -+ */ -+ AV_PIX_FMT_DRM_PRIME, -+ /** -+ * Hardware surfaces for OpenCL. -+ * -+ * data[i] contain 2D image objects (typed in C as cl_mem, used -+ * in OpenCL as image2d_t) for each plane of the surface. -+ */ -+ AV_PIX_FMT_OPENCL, -+ -+ AV_PIX_FMT_NB ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions -+}; -+ -+#if AV_HAVE_BIGENDIAN -+# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##be -+#else -+# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##le -+#endif -+ -+#define AV_PIX_FMT_RGB32 AV_PIX_FMT_NE(ARGB, BGRA) -+#define AV_PIX_FMT_RGB32_1 AV_PIX_FMT_NE(RGBA, ABGR) -+#define AV_PIX_FMT_BGR32 AV_PIX_FMT_NE(ABGR, RGBA) -+#define AV_PIX_FMT_BGR32_1 AV_PIX_FMT_NE(BGRA, ARGB) -+#define AV_PIX_FMT_0RGB32 AV_PIX_FMT_NE(0RGB, BGR0) -+#define AV_PIX_FMT_0BGR32 AV_PIX_FMT_NE(0BGR, RGB0) -+ -+#define AV_PIX_FMT_GRAY9 AV_PIX_FMT_NE(GRAY9BE, GRAY9LE) -+#define AV_PIX_FMT_GRAY10 AV_PIX_FMT_NE(GRAY10BE, GRAY10LE) -+#define AV_PIX_FMT_GRAY12 AV_PIX_FMT_NE(GRAY12BE, GRAY12LE) -+#define AV_PIX_FMT_GRAY16 AV_PIX_FMT_NE(GRAY16BE, GRAY16LE) -+#define AV_PIX_FMT_YA16 AV_PIX_FMT_NE(YA16BE, YA16LE) -+#define AV_PIX_FMT_RGB48 AV_PIX_FMT_NE(RGB48BE, RGB48LE) -+#define AV_PIX_FMT_RGB565 AV_PIX_FMT_NE(RGB565BE, RGB565LE) -+#define AV_PIX_FMT_RGB555 AV_PIX_FMT_NE(RGB555BE, RGB555LE) -+#define AV_PIX_FMT_RGB444 AV_PIX_FMT_NE(RGB444BE, RGB444LE) -+#define AV_PIX_FMT_RGBA64 AV_PIX_FMT_NE(RGBA64BE, RGBA64LE) -+#define AV_PIX_FMT_BGR48 AV_PIX_FMT_NE(BGR48BE, BGR48LE) -+#define AV_PIX_FMT_BGR565 AV_PIX_FMT_NE(BGR565BE, BGR565LE) -+#define AV_PIX_FMT_BGR555 AV_PIX_FMT_NE(BGR555BE, BGR555LE) -+#define AV_PIX_FMT_BGR444 AV_PIX_FMT_NE(BGR444BE, BGR444LE) -+#define AV_PIX_FMT_BGRA64 AV_PIX_FMT_NE(BGRA64BE, BGRA64LE) -+ -+#define AV_PIX_FMT_YUV420P9 AV_PIX_FMT_NE(YUV420P9BE , YUV420P9LE) -+#define AV_PIX_FMT_YUV422P9 AV_PIX_FMT_NE(YUV422P9BE , YUV422P9LE) -+#define AV_PIX_FMT_YUV444P9 AV_PIX_FMT_NE(YUV444P9BE , YUV444P9LE) -+#define AV_PIX_FMT_YUV420P10 AV_PIX_FMT_NE(YUV420P10BE, YUV420P10LE) -+#define AV_PIX_FMT_YUV422P10 AV_PIX_FMT_NE(YUV422P10BE, YUV422P10LE) -+#define AV_PIX_FMT_YUV440P10 AV_PIX_FMT_NE(YUV440P10BE, YUV440P10LE) -+#define AV_PIX_FMT_YUV444P10 AV_PIX_FMT_NE(YUV444P10BE, YUV444P10LE) -+#define AV_PIX_FMT_YUV420P12 AV_PIX_FMT_NE(YUV420P12BE, YUV420P12LE) -+#define AV_PIX_FMT_YUV422P12 AV_PIX_FMT_NE(YUV422P12BE, YUV422P12LE) -+#define AV_PIX_FMT_YUV440P12 AV_PIX_FMT_NE(YUV440P12BE, YUV440P12LE) -+#define AV_PIX_FMT_YUV444P12 AV_PIX_FMT_NE(YUV444P12BE, YUV444P12LE) -+#define AV_PIX_FMT_YUV420P14 AV_PIX_FMT_NE(YUV420P14BE, YUV420P14LE) -+#define AV_PIX_FMT_YUV422P14 AV_PIX_FMT_NE(YUV422P14BE, YUV422P14LE) -+#define AV_PIX_FMT_YUV444P14 AV_PIX_FMT_NE(YUV444P14BE, YUV444P14LE) -+#define AV_PIX_FMT_YUV420P16 AV_PIX_FMT_NE(YUV420P16BE, YUV420P16LE) -+#define AV_PIX_FMT_YUV422P16 AV_PIX_FMT_NE(YUV422P16BE, YUV422P16LE) -+#define AV_PIX_FMT_YUV444P16 AV_PIX_FMT_NE(YUV444P16BE, YUV444P16LE) -+ -+#define AV_PIX_FMT_GBRP9 AV_PIX_FMT_NE(GBRP9BE , GBRP9LE) -+#define AV_PIX_FMT_GBRP10 AV_PIX_FMT_NE(GBRP10BE, GBRP10LE) -+#define AV_PIX_FMT_GBRP12 AV_PIX_FMT_NE(GBRP12BE, GBRP12LE) -+#define AV_PIX_FMT_GBRP14 AV_PIX_FMT_NE(GBRP14BE, GBRP14LE) -+#define AV_PIX_FMT_GBRP16 AV_PIX_FMT_NE(GBRP16BE, GBRP16LE) -+#define AV_PIX_FMT_GBRAP10 AV_PIX_FMT_NE(GBRAP10BE, GBRAP10LE) -+#define AV_PIX_FMT_GBRAP12 AV_PIX_FMT_NE(GBRAP12BE, GBRAP12LE) -+#define AV_PIX_FMT_GBRAP16 AV_PIX_FMT_NE(GBRAP16BE, GBRAP16LE) -+ -+#define AV_PIX_FMT_BAYER_BGGR16 AV_PIX_FMT_NE(BAYER_BGGR16BE, BAYER_BGGR16LE) -+#define AV_PIX_FMT_BAYER_RGGB16 AV_PIX_FMT_NE(BAYER_RGGB16BE, BAYER_RGGB16LE) -+#define AV_PIX_FMT_BAYER_GBRG16 AV_PIX_FMT_NE(BAYER_GBRG16BE, BAYER_GBRG16LE) -+#define AV_PIX_FMT_BAYER_GRBG16 AV_PIX_FMT_NE(BAYER_GRBG16BE, BAYER_GRBG16LE) -+ -+#define AV_PIX_FMT_GBRPF32 AV_PIX_FMT_NE(GBRPF32BE, GBRPF32LE) -+#define AV_PIX_FMT_GBRAPF32 AV_PIX_FMT_NE(GBRAPF32BE, GBRAPF32LE) -+ -+#define AV_PIX_FMT_YUVA420P9 AV_PIX_FMT_NE(YUVA420P9BE , YUVA420P9LE) -+#define AV_PIX_FMT_YUVA422P9 AV_PIX_FMT_NE(YUVA422P9BE , YUVA422P9LE) -+#define AV_PIX_FMT_YUVA444P9 AV_PIX_FMT_NE(YUVA444P9BE , YUVA444P9LE) -+#define AV_PIX_FMT_YUVA420P10 AV_PIX_FMT_NE(YUVA420P10BE, YUVA420P10LE) -+#define AV_PIX_FMT_YUVA422P10 AV_PIX_FMT_NE(YUVA422P10BE, YUVA422P10LE) -+#define AV_PIX_FMT_YUVA444P10 AV_PIX_FMT_NE(YUVA444P10BE, YUVA444P10LE) -+#define AV_PIX_FMT_YUVA420P16 AV_PIX_FMT_NE(YUVA420P16BE, YUVA420P16LE) -+#define AV_PIX_FMT_YUVA422P16 AV_PIX_FMT_NE(YUVA422P16BE, YUVA422P16LE) -+#define AV_PIX_FMT_YUVA444P16 AV_PIX_FMT_NE(YUVA444P16BE, YUVA444P16LE) -+ -+#define AV_PIX_FMT_XYZ12 AV_PIX_FMT_NE(XYZ12BE, XYZ12LE) -+#define AV_PIX_FMT_NV20 AV_PIX_FMT_NE(NV20BE, NV20LE) -+#define AV_PIX_FMT_AYUV64 AV_PIX_FMT_NE(AYUV64BE, AYUV64LE) -+#define AV_PIX_FMT_P010 AV_PIX_FMT_NE(P010BE, P010LE) -+#define AV_PIX_FMT_P016 AV_PIX_FMT_NE(P016BE, P016LE) -+ -+/** -+ * Chromaticity coordinates of the source primaries. -+ * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.1. -+ */ -+enum AVColorPrimaries { -+ AVCOL_PRI_RESERVED0 = 0, -+ AVCOL_PRI_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B -+ AVCOL_PRI_UNSPECIFIED = 2, -+ AVCOL_PRI_RESERVED = 3, -+ AVCOL_PRI_BT470M = 4, ///< also FCC Title 47 Code of Federal Regulations 73.682 (a)(20) -+ -+ AVCOL_PRI_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM -+ AVCOL_PRI_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC -+ AVCOL_PRI_SMPTE240M = 7, ///< functionally identical to above -+ AVCOL_PRI_FILM = 8, ///< colour filters using Illuminant C -+ AVCOL_PRI_BT2020 = 9, ///< ITU-R BT2020 -+ AVCOL_PRI_SMPTE428 = 10, ///< SMPTE ST 428-1 (CIE 1931 XYZ) -+ AVCOL_PRI_SMPTEST428_1 = AVCOL_PRI_SMPTE428, -+ AVCOL_PRI_SMPTE431 = 11, ///< SMPTE ST 431-2 (2011) / DCI P3 -+ AVCOL_PRI_SMPTE432 = 12, ///< SMPTE ST 432-1 (2010) / P3 D65 / Display P3 -+ AVCOL_PRI_JEDEC_P22 = 22, ///< JEDEC P22 phosphors -+ AVCOL_PRI_NB ///< Not part of ABI -+}; -+ -+/** -+ * Color Transfer Characteristic. -+ * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.2. -+ */ -+enum AVColorTransferCharacteristic { -+ AVCOL_TRC_RESERVED0 = 0, -+ AVCOL_TRC_BT709 = 1, ///< also ITU-R BT1361 -+ AVCOL_TRC_UNSPECIFIED = 2, -+ AVCOL_TRC_RESERVED = 3, -+ AVCOL_TRC_GAMMA22 = 4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM -+ AVCOL_TRC_GAMMA28 = 5, ///< also ITU-R BT470BG -+ AVCOL_TRC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC -+ AVCOL_TRC_SMPTE240M = 7, -+ AVCOL_TRC_LINEAR = 8, ///< "Linear transfer characteristics" -+ AVCOL_TRC_LOG = 9, ///< "Logarithmic transfer characteristic (100:1 range)" -+ AVCOL_TRC_LOG_SQRT = 10, ///< "Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)" -+ AVCOL_TRC_IEC61966_2_4 = 11, ///< IEC 61966-2-4 -+ AVCOL_TRC_BT1361_ECG = 12, ///< ITU-R BT1361 Extended Colour Gamut -+ AVCOL_TRC_IEC61966_2_1 = 13, ///< IEC 61966-2-1 (sRGB or sYCC) -+ AVCOL_TRC_BT2020_10 = 14, ///< ITU-R BT2020 for 10-bit system -+ AVCOL_TRC_BT2020_12 = 15, ///< ITU-R BT2020 for 12-bit system -+ AVCOL_TRC_SMPTE2084 = 16, ///< SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems -+ AVCOL_TRC_SMPTEST2084 = AVCOL_TRC_SMPTE2084, -+ AVCOL_TRC_SMPTE428 = 17, ///< SMPTE ST 428-1 -+ AVCOL_TRC_SMPTEST428_1 = AVCOL_TRC_SMPTE428, -+ AVCOL_TRC_ARIB_STD_B67 = 18, ///< ARIB STD-B67, known as "Hybrid log-gamma" -+ AVCOL_TRC_NB ///< Not part of ABI -+}; -+ -+/** -+ * YUV colorspace type. -+ * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.3. -+ */ -+enum AVColorSpace { -+ AVCOL_SPC_RGB = 0, ///< order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB) -+ AVCOL_SPC_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B -+ AVCOL_SPC_UNSPECIFIED = 2, -+ AVCOL_SPC_RESERVED = 3, -+ AVCOL_SPC_FCC = 4, ///< FCC Title 47 Code of Federal Regulations 73.682 (a)(20) -+ AVCOL_SPC_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601 -+ AVCOL_SPC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC -+ AVCOL_SPC_SMPTE240M = 7, ///< functionally identical to above -+ AVCOL_SPC_YCGCO = 8, ///< Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16 -+ AVCOL_SPC_YCOCG = AVCOL_SPC_YCGCO, -+ AVCOL_SPC_BT2020_NCL = 9, ///< ITU-R BT2020 non-constant luminance system -+ AVCOL_SPC_BT2020_CL = 10, ///< ITU-R BT2020 constant luminance system -+ AVCOL_SPC_SMPTE2085 = 11, ///< SMPTE 2085, Y'D'zD'x -+ AVCOL_SPC_CHROMA_DERIVED_NCL = 12, ///< Chromaticity-derived non-constant luminance system -+ AVCOL_SPC_CHROMA_DERIVED_CL = 13, ///< Chromaticity-derived constant luminance system -+ AVCOL_SPC_ICTCP = 14, ///< ITU-R BT.2100-0, ICtCp -+ AVCOL_SPC_NB ///< Not part of ABI -+}; -+ -+/** -+ * MPEG vs JPEG YUV range. -+ */ -+enum AVColorRange { -+ AVCOL_RANGE_UNSPECIFIED = 0, -+ AVCOL_RANGE_MPEG = 1, ///< the normal 219*2^(n-8) "MPEG" YUV ranges -+ AVCOL_RANGE_JPEG = 2, ///< the normal 2^n-1 "JPEG" YUV ranges -+ AVCOL_RANGE_NB ///< Not part of ABI -+}; -+ -+/** -+ * Location of chroma samples. -+ * -+ * Illustration showing the location of the first (top left) chroma sample of the -+ * image, the left shows only luma, the right -+ * shows the location of the chroma sample, the 2 could be imagined to overlay -+ * each other but are drawn separately due to limitations of ASCII -+ * -+ * 1st 2nd 1st 2nd horizontal luma sample positions -+ * v v v v -+ * ______ ______ -+ *1st luma line > |X X ... |3 4 X ... X are luma samples, -+ * | |1 2 1-6 are possible chroma positions -+ *2nd luma line > |X X ... |5 6 X ... 0 is undefined/unknown position -+ */ -+enum AVChromaLocation { -+ AVCHROMA_LOC_UNSPECIFIED = 0, -+ AVCHROMA_LOC_LEFT = 1, ///< MPEG-2/4 4:2:0, H.264 default for 4:2:0 -+ AVCHROMA_LOC_CENTER = 2, ///< MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0 -+ AVCHROMA_LOC_TOPLEFT = 3, ///< ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2 -+ AVCHROMA_LOC_TOP = 4, -+ AVCHROMA_LOC_BOTTOMLEFT = 5, -+ AVCHROMA_LOC_BOTTOM = 6, -+ AVCHROMA_LOC_NB ///< Not part of ABI -+}; -+ -+#endif /* AVUTIL_PIXFMT_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/rational.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/rational.h -new file mode 100644 -index 000000000000..5c6b67b4e9f8 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/rational.h -@@ -0,0 +1,214 @@ -+/* -+ * rational numbers -+ * Copyright (c) 2003 Michael Niedermayer -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/** -+ * @file -+ * @ingroup lavu_math_rational -+ * Utilties for rational number calculation. -+ * @author Michael Niedermayer -+ */ -+ -+#ifndef AVUTIL_RATIONAL_H -+#define AVUTIL_RATIONAL_H -+ -+#include -+#include -+#include "attributes.h" -+ -+/** -+ * @defgroup lavu_math_rational AVRational -+ * @ingroup lavu_math -+ * Rational number calculation. -+ * -+ * While rational numbers can be expressed as floating-point numbers, the -+ * conversion process is a lossy one, so are floating-point operations. On the -+ * other hand, the nature of FFmpeg demands highly accurate calculation of -+ * timestamps. This set of rational number utilities serves as a generic -+ * interface for manipulating rational numbers as pairs of numerators and -+ * denominators. -+ * -+ * Many of the functions that operate on AVRational's have the suffix `_q`, in -+ * reference to the mathematical symbol "ℚ" (Q) which denotes the set of all -+ * rational numbers. -+ * -+ * @{ -+ */ -+ -+/** -+ * Rational number (pair of numerator and denominator). -+ */ -+typedef struct AVRational{ -+ int num; ///< Numerator -+ int den; ///< Denominator -+} AVRational; -+ -+/** -+ * Create an AVRational. -+ * -+ * Useful for compilers that do not support compound literals. -+ * -+ * @note The return value is not reduced. -+ * @see av_reduce() -+ */ -+static inline AVRational av_make_q(int num, int den) -+{ -+ AVRational r = { num, den }; -+ return r; -+} -+ -+/** -+ * Compare two rationals. -+ * -+ * @param a First rational -+ * @param b Second rational -+ * -+ * @return One of the following values: -+ * - 0 if `a == b` -+ * - 1 if `a > b` -+ * - -1 if `a < b` -+ * - `INT_MIN` if one of the values is of the form `0 / 0` -+ */ -+static inline int av_cmp_q(AVRational a, AVRational b){ -+ const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den; -+ -+ if(tmp) return (int)((tmp ^ a.den ^ b.den)>>63)|1; -+ else if(b.den && a.den) return 0; -+ else if(a.num && b.num) return (a.num>>31) - (b.num>>31); -+ else return INT_MIN; -+} -+ -+/** -+ * Convert an AVRational to a `double`. -+ * @param a AVRational to convert -+ * @return `a` in floating-point form -+ * @see av_d2q() -+ */ -+static inline double av_q2d(AVRational a){ -+ return a.num / (double) a.den; -+} -+ -+/** -+ * Reduce a fraction. -+ * -+ * This is useful for framerate calculations. -+ * -+ * @param[out] dst_num Destination numerator -+ * @param[out] dst_den Destination denominator -+ * @param[in] num Source numerator -+ * @param[in] den Source denominator -+ * @param[in] max Maximum allowed values for `dst_num` & `dst_den` -+ * @return 1 if the operation is exact, 0 otherwise -+ */ -+int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max); -+ -+/** -+ * Multiply two rationals. -+ * @param b First rational -+ * @param c Second rational -+ * @return b*c -+ */ -+AVRational av_mul_q(AVRational b, AVRational c) av_const; -+ -+/** -+ * Divide one rational by another. -+ * @param b First rational -+ * @param c Second rational -+ * @return b/c -+ */ -+AVRational av_div_q(AVRational b, AVRational c) av_const; -+ -+/** -+ * Add two rationals. -+ * @param b First rational -+ * @param c Second rational -+ * @return b+c -+ */ -+AVRational av_add_q(AVRational b, AVRational c) av_const; -+ -+/** -+ * Subtract one rational from another. -+ * @param b First rational -+ * @param c Second rational -+ * @return b-c -+ */ -+AVRational av_sub_q(AVRational b, AVRational c) av_const; -+ -+/** -+ * Invert a rational. -+ * @param q value -+ * @return 1 / q -+ */ -+static av_always_inline AVRational av_inv_q(AVRational q) -+{ -+ AVRational r = { q.den, q.num }; -+ return r; -+} -+ -+/** -+ * Convert a double precision floating point number to a rational. -+ * -+ * In case of infinity, the returned value is expressed as `{1, 0}` or -+ * `{-1, 0}` depending on the sign. -+ * -+ * @param d `double` to convert -+ * @param max Maximum allowed numerator and denominator -+ * @return `d` in AVRational form -+ * @see av_q2d() -+ */ -+AVRational av_d2q(double d, int max) av_const; -+ -+/** -+ * Find which of the two rationals is closer to another rational. -+ * -+ * @param q Rational to be compared against -+ * @param q1,q2 Rationals to be tested -+ * @return One of the following values: -+ * - 1 if `q1` is nearer to `q` than `q2` -+ * - -1 if `q2` is nearer to `q` than `q1` -+ * - 0 if they have the same distance -+ */ -+int av_nearer_q(AVRational q, AVRational q1, AVRational q2); -+ -+/** -+ * Find the value in a list of rationals nearest a given reference rational. -+ * -+ * @param q Reference rational -+ * @param q_list Array of rationals terminated by `{0, 0}` -+ * @return Index of the nearest value found in the array -+ */ -+int av_find_nearest_q_idx(AVRational q, const AVRational* q_list); -+ -+/** -+ * Convert an AVRational to a IEEE 32-bit `float` expressed in fixed-point -+ * format. -+ * -+ * @param q Rational to be converted -+ * @return Equivalent floating-point value, expressed as an unsigned 32-bit -+ * integer. -+ * @note The returned value is platform-indepedant. -+ */ -+uint32_t av_q2intfloat(AVRational q); -+ -+/** -+ * @} -+ */ -+ -+#endif /* AVUTIL_RATIONAL_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/samplefmt.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/samplefmt.h -new file mode 100644 -index 000000000000..8cd43ae8568a ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/samplefmt.h -@@ -0,0 +1,272 @@ -+/* -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+#ifndef AVUTIL_SAMPLEFMT_H -+#define AVUTIL_SAMPLEFMT_H -+ -+#include -+ -+#include "avutil.h" -+#include "attributes.h" -+ -+/** -+ * @addtogroup lavu_audio -+ * @{ -+ * -+ * @defgroup lavu_sampfmts Audio sample formats -+ * -+ * Audio sample format enumeration and related convenience functions. -+ * @{ -+ */ -+ -+/** -+ * Audio sample formats -+ * -+ * - The data described by the sample format is always in native-endian order. -+ * Sample values can be expressed by native C types, hence the lack of a signed -+ * 24-bit sample format even though it is a common raw audio data format. -+ * -+ * - The floating-point formats are based on full volume being in the range -+ * [-1.0, 1.0]. Any values outside this range are beyond full volume level. -+ * -+ * - The data layout as used in av_samples_fill_arrays() and elsewhere in FFmpeg -+ * (such as AVFrame in libavcodec) is as follows: -+ * -+ * @par -+ * For planar sample formats, each audio channel is in a separate data plane, -+ * and linesize is the buffer size, in bytes, for a single plane. All data -+ * planes must be the same size. For packed sample formats, only the first data -+ * plane is used, and samples for each channel are interleaved. In this case, -+ * linesize is the buffer size, in bytes, for the 1 plane. -+ * -+ */ -+enum AVSampleFormat { -+ AV_SAMPLE_FMT_NONE = -1, -+ AV_SAMPLE_FMT_U8, ///< unsigned 8 bits -+ AV_SAMPLE_FMT_S16, ///< signed 16 bits -+ AV_SAMPLE_FMT_S32, ///< signed 32 bits -+ AV_SAMPLE_FMT_FLT, ///< float -+ AV_SAMPLE_FMT_DBL, ///< double -+ -+ AV_SAMPLE_FMT_U8P, ///< unsigned 8 bits, planar -+ AV_SAMPLE_FMT_S16P, ///< signed 16 bits, planar -+ AV_SAMPLE_FMT_S32P, ///< signed 32 bits, planar -+ AV_SAMPLE_FMT_FLTP, ///< float, planar -+ AV_SAMPLE_FMT_DBLP, ///< double, planar -+ AV_SAMPLE_FMT_S64, ///< signed 64 bits -+ AV_SAMPLE_FMT_S64P, ///< signed 64 bits, planar -+ -+ AV_SAMPLE_FMT_NB ///< Number of sample formats. DO NOT USE if linking dynamically -+}; -+ -+/** -+ * Return the name of sample_fmt, or NULL if sample_fmt is not -+ * recognized. -+ */ -+const char *av_get_sample_fmt_name(enum AVSampleFormat sample_fmt); -+ -+/** -+ * Return a sample format corresponding to name, or AV_SAMPLE_FMT_NONE -+ * on error. -+ */ -+enum AVSampleFormat av_get_sample_fmt(const char *name); -+ -+/** -+ * Return the planar<->packed alternative form of the given sample format, or -+ * AV_SAMPLE_FMT_NONE on error. If the passed sample_fmt is already in the -+ * requested planar/packed format, the format returned is the same as the -+ * input. -+ */ -+enum AVSampleFormat av_get_alt_sample_fmt(enum AVSampleFormat sample_fmt, int planar); -+ -+/** -+ * Get the packed alternative form of the given sample format. -+ * -+ * If the passed sample_fmt is already in packed format, the format returned is -+ * the same as the input. -+ * -+ * @return the packed alternative form of the given sample format or -+ AV_SAMPLE_FMT_NONE on error. -+ */ -+enum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt); -+ -+/** -+ * Get the planar alternative form of the given sample format. -+ * -+ * If the passed sample_fmt is already in planar format, the format returned is -+ * the same as the input. -+ * -+ * @return the planar alternative form of the given sample format or -+ AV_SAMPLE_FMT_NONE on error. -+ */ -+enum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt); -+ -+/** -+ * Generate a string corresponding to the sample format with -+ * sample_fmt, or a header if sample_fmt is negative. -+ * -+ * @param buf the buffer where to write the string -+ * @param buf_size the size of buf -+ * @param sample_fmt the number of the sample format to print the -+ * corresponding info string, or a negative value to print the -+ * corresponding header. -+ * @return the pointer to the filled buffer or NULL if sample_fmt is -+ * unknown or in case of other errors -+ */ -+char *av_get_sample_fmt_string(char *buf, int buf_size, enum AVSampleFormat sample_fmt); -+ -+/** -+ * Return number of bytes per sample. -+ * -+ * @param sample_fmt the sample format -+ * @return number of bytes per sample or zero if unknown for the given -+ * sample format -+ */ -+int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt); -+ -+/** -+ * Check if the sample format is planar. -+ * -+ * @param sample_fmt the sample format to inspect -+ * @return 1 if the sample format is planar, 0 if it is interleaved -+ */ -+int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt); -+ -+/** -+ * Get the required buffer size for the given audio parameters. -+ * -+ * @param[out] linesize calculated linesize, may be NULL -+ * @param nb_channels the number of channels -+ * @param nb_samples the number of samples in a single channel -+ * @param sample_fmt the sample format -+ * @param align buffer size alignment (0 = default, 1 = no alignment) -+ * @return required buffer size, or negative error code on failure -+ */ -+int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples, -+ enum AVSampleFormat sample_fmt, int align); -+ -+/** -+ * @} -+ * -+ * @defgroup lavu_sampmanip Samples manipulation -+ * -+ * Functions that manipulate audio samples -+ * @{ -+ */ -+ -+/** -+ * Fill plane data pointers and linesize for samples with sample -+ * format sample_fmt. -+ * -+ * The audio_data array is filled with the pointers to the samples data planes: -+ * for planar, set the start point of each channel's data within the buffer, -+ * for packed, set the start point of the entire buffer only. -+ * -+ * The value pointed to by linesize is set to the aligned size of each -+ * channel's data buffer for planar layout, or to the aligned size of the -+ * buffer for all channels for packed layout. -+ * -+ * The buffer in buf must be big enough to contain all the samples -+ * (use av_samples_get_buffer_size() to compute its minimum size), -+ * otherwise the audio_data pointers will point to invalid data. -+ * -+ * @see enum AVSampleFormat -+ * The documentation for AVSampleFormat describes the data layout. -+ * -+ * @param[out] audio_data array to be filled with the pointer for each channel -+ * @param[out] linesize calculated linesize, may be NULL -+ * @param buf the pointer to a buffer containing the samples -+ * @param nb_channels the number of channels -+ * @param nb_samples the number of samples in a single channel -+ * @param sample_fmt the sample format -+ * @param align buffer size alignment (0 = default, 1 = no alignment) -+ * @return >=0 on success or a negative error code on failure -+ * @todo return minimum size in bytes required for the buffer in case -+ * of success at the next bump -+ */ -+int av_samples_fill_arrays(uint8_t **audio_data, int *linesize, -+ const uint8_t *buf, -+ int nb_channels, int nb_samples, -+ enum AVSampleFormat sample_fmt, int align); -+ -+/** -+ * Allocate a samples buffer for nb_samples samples, and fill data pointers and -+ * linesize accordingly. -+ * The allocated samples buffer can be freed by using av_freep(&audio_data[0]) -+ * Allocated data will be initialized to silence. -+ * -+ * @see enum AVSampleFormat -+ * The documentation for AVSampleFormat describes the data layout. -+ * -+ * @param[out] audio_data array to be filled with the pointer for each channel -+ * @param[out] linesize aligned size for audio buffer(s), may be NULL -+ * @param nb_channels number of audio channels -+ * @param nb_samples number of samples per channel -+ * @param align buffer size alignment (0 = default, 1 = no alignment) -+ * @return >=0 on success or a negative error code on failure -+ * @todo return the size of the allocated buffer in case of success at the next bump -+ * @see av_samples_fill_arrays() -+ * @see av_samples_alloc_array_and_samples() -+ */ -+int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels, -+ int nb_samples, enum AVSampleFormat sample_fmt, int align); -+ -+/** -+ * Allocate a data pointers array, samples buffer for nb_samples -+ * samples, and fill data pointers and linesize accordingly. -+ * -+ * This is the same as av_samples_alloc(), but also allocates the data -+ * pointers array. -+ * -+ * @see av_samples_alloc() -+ */ -+int av_samples_alloc_array_and_samples(uint8_t ***audio_data, int *linesize, int nb_channels, -+ int nb_samples, enum AVSampleFormat sample_fmt, int align); -+ -+/** -+ * Copy samples from src to dst. -+ * -+ * @param dst destination array of pointers to data planes -+ * @param src source array of pointers to data planes -+ * @param dst_offset offset in samples at which the data will be written to dst -+ * @param src_offset offset in samples at which the data will be read from src -+ * @param nb_samples number of samples to be copied -+ * @param nb_channels number of audio channels -+ * @param sample_fmt audio sample format -+ */ -+int av_samples_copy(uint8_t **dst, uint8_t * const *src, int dst_offset, -+ int src_offset, int nb_samples, int nb_channels, -+ enum AVSampleFormat sample_fmt); -+ -+/** -+ * Fill an audio buffer with silence. -+ * -+ * @param audio_data array of pointers to data planes -+ * @param offset offset in samples at which to start filling -+ * @param nb_samples number of samples to fill -+ * @param nb_channels number of audio channels -+ * @param sample_fmt audio sample format -+ */ -+int av_samples_set_silence(uint8_t **audio_data, int offset, int nb_samples, -+ int nb_channels, enum AVSampleFormat sample_fmt); -+ -+/** -+ * @} -+ * @} -+ */ -+#endif /* AVUTIL_SAMPLEFMT_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/version.h b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/version.h -new file mode 100644 -index 000000000000..3a63e6355f84 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/version.h -@@ -0,0 +1,139 @@ -+/* -+ * copyright (c) 2003 Fabrice Bellard -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/** -+ * @file -+ * @ingroup lavu -+ * Libavutil version macros -+ */ -+ -+#ifndef AVUTIL_VERSION_H -+#define AVUTIL_VERSION_H -+ -+#include "macros.h" -+ -+/** -+ * @addtogroup version_utils -+ * -+ * Useful to check and match library version in order to maintain -+ * backward compatibility. -+ * -+ * The FFmpeg libraries follow a versioning sheme very similar to -+ * Semantic Versioning (http://semver.org/) -+ * The difference is that the component called PATCH is called MICRO in FFmpeg -+ * and its value is reset to 100 instead of 0 to keep it above or equal to 100. -+ * Also we do not increase MICRO for every bugfix or change in git master. -+ * -+ * Prior to FFmpeg 3.2 point releases did not change any lib version number to -+ * avoid aliassing different git master checkouts. -+ * Starting with FFmpeg 3.2, the released library versions will occupy -+ * a separate MAJOR.MINOR that is not used on the master development branch. -+ * That is if we branch a release of master 55.10.123 we will bump to 55.11.100 -+ * for the release and master will continue at 55.12.100 after it. Each new -+ * point release will then bump the MICRO improving the usefulness of the lib -+ * versions. -+ * -+ * @{ -+ */ -+ -+#define AV_VERSION_INT(a, b, c) ((a)<<16 | (b)<<8 | (c)) -+#define AV_VERSION_DOT(a, b, c) a ##.## b ##.## c -+#define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c) -+ -+/** -+ * Extract version components from the full ::AV_VERSION_INT int as returned -+ * by functions like ::avformat_version() and ::avcodec_version() -+ */ -+#define AV_VERSION_MAJOR(a) ((a) >> 16) -+#define AV_VERSION_MINOR(a) (((a) & 0x00FF00) >> 8) -+#define AV_VERSION_MICRO(a) ((a) & 0xFF) -+ -+/** -+ * @} -+ */ -+ -+/** -+ * @defgroup lavu_ver Version and Build diagnostics -+ * -+ * Macros and function useful to check at compiletime and at runtime -+ * which version of libavutil is in use. -+ * -+ * @{ -+ */ -+ -+#define LIBAVUTIL_VERSION_MAJOR 56 -+#define LIBAVUTIL_VERSION_MINOR 14 -+#define LIBAVUTIL_VERSION_MICRO 100 -+ -+#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ -+ LIBAVUTIL_VERSION_MINOR, \ -+ LIBAVUTIL_VERSION_MICRO) -+#define LIBAVUTIL_VERSION AV_VERSION(LIBAVUTIL_VERSION_MAJOR, \ -+ LIBAVUTIL_VERSION_MINOR, \ -+ LIBAVUTIL_VERSION_MICRO) -+#define LIBAVUTIL_BUILD LIBAVUTIL_VERSION_INT -+ -+#define LIBAVUTIL_IDENT "Lavu" AV_STRINGIFY(LIBAVUTIL_VERSION) -+ -+/** -+ * @defgroup lavu_depr_guards Deprecation Guards -+ * FF_API_* defines may be placed below to indicate public API that will be -+ * dropped at a future version bump. The defines themselves are not part of -+ * the public API and may change, break or disappear at any time. -+ * -+ * @note, when bumping the major version it is recommended to manually -+ * disable each FF_API_* in its own commit instead of disabling them all -+ * at once through the bump. This improves the git bisect-ability of the change. -+ * -+ * @{ -+ */ -+ -+#ifndef FF_API_VAAPI -+#define FF_API_VAAPI (LIBAVUTIL_VERSION_MAJOR < 57) -+#endif -+#ifndef FF_API_FRAME_QP -+#define FF_API_FRAME_QP (LIBAVUTIL_VERSION_MAJOR < 57) -+#endif -+#ifndef FF_API_PLUS1_MINUS1 -+#define FF_API_PLUS1_MINUS1 (LIBAVUTIL_VERSION_MAJOR < 57) -+#endif -+#ifndef FF_API_ERROR_FRAME -+#define FF_API_ERROR_FRAME (LIBAVUTIL_VERSION_MAJOR < 57) -+#endif -+#ifndef FF_API_PKT_PTS -+#define FF_API_PKT_PTS (LIBAVUTIL_VERSION_MAJOR < 57) -+#endif -+#ifndef FF_API_CRYPTO_SIZE_T -+#define FF_API_CRYPTO_SIZE_T (LIBAVUTIL_VERSION_MAJOR < 57) -+#endif -+#ifndef FF_API_FRAME_GET_SET -+#define FF_API_FRAME_GET_SET (LIBAVUTIL_VERSION_MAJOR < 57) -+#endif -+#ifndef FF_API_PSEUDOPAL -+#define FF_API_PSEUDOPAL (LIBAVUTIL_VERSION_MAJOR < 57) -+#endif -+ -+ -+/** -+ * @} -+ * @} -+ */ -+ -+#endif /* AVUTIL_VERSION_H */ -diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/moz.build b/dom/media/platforms/ffmpeg/ffmpeg58/moz.build -new file mode 100644 -index 000000000000..c757ed6fad04 ---- /dev/null -+++ b/dom/media/platforms/ffmpeg/ffmpeg58/moz.build -@@ -0,0 +1,25 @@ -+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- -+# vim: set filetype=python: -+# This Source Code Form is subject to the terms of the Mozilla Public -+# License, v. 2.0. If a copy of the MPL was not distributed with this -+# file, You can obtain one at http://mozilla.org/MPL/2.0/. -+ -+UNIFIED_SOURCES += [ -+ '../FFmpegAudioDecoder.cpp', -+ '../FFmpegDataDecoder.cpp', -+ '../FFmpegDecoderModule.cpp', -+ '../FFmpegVideoDecoder.cpp', -+] -+LOCAL_INCLUDES += [ -+ '..', -+ 'include', -+] -+ -+if CONFIG['CC_TYPE'] in ('clang', 'gcc'): -+ CXXFLAGS += [ '-Wno-deprecated-declarations' ] -+if CONFIG['CC_TYPE'] == 'clang': -+ CXXFLAGS += [ -+ '-Wno-unknown-attributes', -+ ] -+ -+FINAL_LIBRARY = 'xul' -diff --git a/dom/media/platforms/ffmpeg/moz.build b/dom/media/platforms/ffmpeg/moz.build -index 604e445aa4d9..af96fb521e3d 100644 ---- a/dom/media/platforms/ffmpeg/moz.build -+++ b/dom/media/platforms/ffmpeg/moz.build -@@ -13,6 +13,7 @@ DIRS += [ - 'libav54', - 'libav55', - 'ffmpeg57', -+ 'ffmpeg58', - ] - - UNIFIED_SOURCES += [ --- -2.17.0 - diff --git a/network/web/firefox/files/firefox-install-dir.patch b/network/web/firefox/files/firefox-install-dir.patch deleted file mode 100644 index d6aaafa99e..0000000000 --- a/network/web/firefox/files/firefox-install-dir.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git i/config/baseconfig.mk w/config/baseconfig.mk -index e204533ac9b66b88..27ae154ce265ca2b 100644 ---- i/config/baseconfig.mk -+++ w/config/baseconfig.mk -@@ -4,7 +4,7 @@ - # whether a normal build is happening or whether the check is running. - includedir := $(includedir)/$(MOZ_APP_NAME)-$(MOZ_APP_VERSION) - idldir = $(datadir)/idl/$(MOZ_APP_NAME)-$(MOZ_APP_VERSION) --installdir = $(libdir)/$(MOZ_APP_NAME)-$(MOZ_APP_VERSION) -+installdir = $(libdir)/$(MOZ_APP_NAME) - sdkdir = $(libdir)/$(MOZ_APP_NAME)-devel-$(MOZ_APP_VERSION) - ifeq (.,$(DEPTH)) - DIST = dist diff --git a/network/web/firefox/files/gtk3.patch b/network/web/firefox/files/gtk3.patch deleted file mode 100644 index 4aab6eff2d..0000000000 --- a/network/web/firefox/files/gtk3.patch +++ /dev/null @@ -1,1697 +0,0 @@ -diff -up firefox-46.0.1/widget/gtk/gtk3drawing.c.gtk3-20 firefox-46.0.1/widget/gtk/gtk3drawing.c ---- firefox-46.0.1/widget/gtk/gtk3drawing.c.gtk3-20 2016-05-03 07:31:12.000000000 +0200 -+++ firefox-46.0.1/widget/gtk/gtk3drawing.c 2016-05-20 15:05:08.750151522 +0200 -@@ -17,34 +17,86 @@ - - #include - -+#define MOZ_WIDGET_STYLES 4 -+ -+typedef struct { -+ GtkWidget* widget; -+ -+ union { -+ struct { -+ GtkStyleContext* style; -+ GtkStyleContext* styleSelection; -+ } entry; -+ -+ struct { -+ GtkStyleContext* style; -+ } button; -+ -+ struct { -+ GtkStyleContext* style; -+ GtkStyleContext* styleBackground; -+ } tooltip; -+ -+ struct { -+ GtkStyleContext* style; -+ GtkStyleContext* styleContents; -+ GtkStyleContext* styleTrough; -+ GtkStyleContext* styleSlider; -+ } scroll; -+ -+ struct { -+ GtkStyleContext* style; -+ GtkStyleContext* styleCheck; -+ GtkStyleContext* styleLabel; -+ } check; -+ -+ struct { -+ GtkStyleContext* style; -+ GtkStyleContext* styleTrough; -+ GtkStyleContext* styleProgress; -+ } progress; -+ -+ struct { -+ GtkStyleContext* style; -+ GtkStyleContext* styleEntry; -+ GtkStyleContext* styleButtonUp; -+ GtkStyleContext* styleButtonDown; -+ } spin; -+ -+ struct { -+ GtkStyleContext* style[MOZ_WIDGET_STYLES]; -+ } all; -+ }; -+} MozGtkWidget; -+ - static GtkWidget* gProtoWindow; - static GtkWidget* gProtoLayout; --static GtkWidget* gButtonWidget; -+static MozGtkWidget gButton; - static GtkWidget* gToggleButtonWidget; - static GtkWidget* gButtonArrowWidget; --static GtkWidget* gCheckboxWidget; --static GtkWidget* gRadiobuttonWidget; --static GtkWidget* gHorizScrollbarWidget; --static GtkWidget* gVertScrollbarWidget; --static GtkWidget* gSpinWidget; -+static MozGtkWidget gCheckbox; -+static MozGtkWidget gRadiobutton; -+static MozGtkWidget gVertScrollbar; -+static MozGtkWidget gHorizScrollbar; -+static MozGtkWidget gSpin; - static GtkWidget* gHScaleWidget; - static GtkWidget* gVScaleWidget; --static GtkWidget* gEntryWidget; -+static MozGtkWidget gEntry; - static GtkWidget* gComboBoxWidget; - static GtkWidget* gComboBoxButtonWidget; - static GtkWidget* gComboBoxArrowWidget; - static GtkWidget* gComboBoxSeparatorWidget; - static GtkWidget* gComboBoxEntryWidget; --static GtkWidget* gComboBoxEntryTextareaWidget; -+static MozGtkWidget gComboBoxEntryTextarea; - static GtkWidget* gComboBoxEntryButtonWidget; - static GtkWidget* gComboBoxEntryArrowWidget; - static GtkWidget* gHandleBoxWidget; - static GtkWidget* gToolbarWidget; - static GtkWidget* gFrameWidget; - static GtkWidget* gStatusbarWidget; --static GtkWidget* gProgressWidget; -+static MozGtkWidget gProgressBar; - static GtkWidget* gTabWidget; --static GtkWidget* gTooltipWidget; -+static MozGtkWidget gTooltip; - static GtkWidget* gMenuBarWidget; - static GtkWidget* gMenuBarItemWidget; - static GtkWidget* gMenuPopupWidget; -@@ -78,6 +130,37 @@ static gboolean is_initialized; - #define GTK_STATE_FLAG_CHECKED (1 << 11) - #endif - -+void moz_gtk_widget_free(MozGtkWidget *aMozWidget) -+{ -+ // This was removed as a child of gProtoWindow -+ if (aMozWidget->widget) { -+ aMozWidget->widget = NULL; -+ } -+ -+ for(int i = 0; i < MOZ_WIDGET_STYLES; i++) { -+ if (aMozWidget->all.style[i]) { -+ g_object_unref(aMozWidget->all.style[i]); -+ aMozWidget->all.style[i] = NULL; -+ } -+ } -+} -+ -+// TODO - weak dep!! (dlsym) -+#if GTK_CHECK_VERSION(3, 19, 2) -+#define moz_gtk_path_set_class_name gtk_widget_path_iter_set_object_name -+#else -+#define moz_gtk_path_set_class_name gtk_widget_path_iter_add_class -+#endif -+//gtk_widget_path_iter_get_state -+ -+static void -+moz_gtk_get_style_border(GtkStyleContext* style, GtkStateFlags state_flags, -+ GtkBorder *border); -+ -+static void -+moz_gtk_get_style_padding(GtkStyleContext* style, GtkStateFlags state_flags, -+ GtkBorder *padding); -+ - static GtkStateFlags - GetStateFlagsFromGtkWidgetState(GtkWidgetState* state) - { -@@ -97,6 +180,41 @@ GetStateFlagsFromGtkWidgetState(GtkWidge - return stateFlags; - } - -+GtkStyleContext * -+moz_gtk_style_create(GtkCssNode *node, GtkStyleContext *parent) -+{ -+ GtkWidgetPath *path; -+ GtkStyleContext *context; -+ -+ if (parent) -+ path = gtk_widget_path_copy (gtk_style_context_get_path (parent)); -+ else -+ path = gtk_widget_path_new (); -+ -+ gtk_widget_path_append_type (path, node->type); -+ if (node->name) -+ moz_gtk_path_set_class_name(path, -1, node->name); -+ if (node->class1) -+ gtk_widget_path_iter_add_class(path, -1, node->class1); -+ if (node->class2) -+ gtk_widget_path_iter_add_class(path, -1, node->class2); -+ -+ context = gtk_style_context_new (); -+ gtk_style_context_set_path (context, path); -+ gtk_style_context_set_parent (context, parent); -+ -+ if(!gtk_check_version(3, 14, 0)) { -+ /* Unfortunately, we have to explicitly set the state again here -+ * for it to take effect -+ */ -+ gtk_style_context_set_state (context, gtk_widget_path_iter_get_state (path, -1)); -+ } -+ -+ gtk_widget_path_unref (path); -+ -+ return context; -+} -+ - /* Because we have such an unconventional way of drawing widgets, signal to the GTK theme engine - that they are drawing for Mozilla instead of a conventional GTK app so they can do any specific - things they may want to do. */ -@@ -141,9 +259,16 @@ setup_widget_prototype(GtkWidget* widget - static gint - ensure_button_widget() - { -- if (!gButtonWidget) { -- gButtonWidget = gtk_button_new_with_label("M"); -- setup_widget_prototype(gButtonWidget); -+ if (!gButton.widget) { -+ GtkCssNode path[] = { -+ { GTK_TYPE_BUTTON, "button", NULL, NULL } -+ }; -+ -+ gButton.widget = gtk_button_new_with_label("M"); -+ setup_widget_prototype(gButton.widget); -+ gtk_widget_show(gButton.widget); -+ -+ gButton.button.style = moz_gtk_style_create(&path[0], NULL); - } - return MOZ_GTK_SUCCESS; - } -@@ -195,9 +320,21 @@ ensure_button_arrow_widget() - static gint - ensure_checkbox_widget() - { -- if (!gCheckboxWidget) { -- gCheckboxWidget = gtk_check_button_new_with_label("M"); -- setup_widget_prototype(gCheckboxWidget); -+ if (!gCheckbox.widget) { -+ GtkCssNode path[] = { -+ { GTK_TYPE_TOGGLE_BUTTON, "checkbutton", NULL, NULL }, -+ { G_TYPE_NONE, "check", NULL, NULL }, -+ { G_TYPE_NONE, "label", NULL, NULL } -+ }; -+ -+ gCheckbox.widget = gtk_check_button_new_with_label("M"); -+ setup_widget_prototype(gCheckbox.widget); -+ -+ gCheckbox.check.style = moz_gtk_style_create(&path[0], NULL); -+ gCheckbox.check.styleCheck = moz_gtk_style_create(&path[1], -+ gCheckbox.check.style); -+ gCheckbox.check.styleLabel = moz_gtk_style_create(&path[2], -+ gCheckbox.check.style); - } - return MOZ_GTK_SUCCESS; - } -@@ -205,9 +342,21 @@ ensure_checkbox_widget() - static gint - ensure_radiobutton_widget() - { -- if (!gRadiobuttonWidget) { -- gRadiobuttonWidget = gtk_radio_button_new_with_label(NULL, "M"); -- setup_widget_prototype(gRadiobuttonWidget); -+ if (!gRadiobutton.widget) { -+ GtkCssNode path[] = { -+ { GTK_TYPE_TOGGLE_BUTTON, "radiobutton", NULL, NULL }, -+ { G_TYPE_NONE, "radio", NULL, NULL }, -+ { G_TYPE_NONE, "label", NULL, NULL } -+ }; -+ -+ gRadiobutton.widget = gtk_radio_button_new_with_label(NULL, "M"); -+ setup_widget_prototype(gRadiobutton.widget); -+ -+ gRadiobutton.check.style = moz_gtk_style_create(&path[0], NULL); -+ gRadiobutton.check.styleCheck = moz_gtk_style_create(&path[1], -+ gRadiobutton.check.style); -+ gRadiobutton.check.styleLabel = moz_gtk_style_create(&path[2], -+ gRadiobutton.check.style); - } - return MOZ_GTK_SUCCESS; - } -@@ -215,25 +364,62 @@ ensure_radiobutton_widget() - static gint - ensure_scrollbar_widget() - { -- if (!gVertScrollbarWidget) { -- gVertScrollbarWidget = gtk_scrollbar_new(GTK_ORIENTATION_VERTICAL, NULL); -- setup_widget_prototype(gVertScrollbarWidget); -- } -- if (!gHorizScrollbarWidget) { -- gHorizScrollbarWidget = gtk_scrollbar_new(GTK_ORIENTATION_HORIZONTAL, NULL); -- setup_widget_prototype(gHorizScrollbarWidget); -- } -+ if (!gVertScrollbar.widget && !gHorizScrollbar.widget) { -+ GtkCssNode path[] = { -+ { GTK_TYPE_SCROLLBAR, "scrollbar", "horizontal", "bottom"}, -+ { GTK_TYPE_SCROLLBAR, "scrollbar", "vertical", "right" }, -+ { G_TYPE_NONE, "contents", NULL, NULL }, -+ { G_TYPE_NONE, "trough", NULL, NULL }, -+ { G_TYPE_NONE, "slider", NULL, NULL } -+ }; -+ -+ gHorizScrollbar.widget = gtk_scrollbar_new(GTK_ORIENTATION_HORIZONTAL, NULL); -+ setup_widget_prototype(gHorizScrollbar.widget); -+ -+ gHorizScrollbar.scroll.style = moz_gtk_style_create(path, NULL); -+ gHorizScrollbar.scroll.styleContents = moz_gtk_style_create(path+2, -+ gHorizScrollbar.scroll.style); -+ gHorizScrollbar.scroll.styleTrough = moz_gtk_style_create(path+3, -+ gHorizScrollbar.scroll.styleContents); -+ gHorizScrollbar.scroll.styleSlider = moz_gtk_style_create(path+4, -+ gHorizScrollbar.scroll.styleTrough); -+ -+ gVertScrollbar.widget = gtk_scrollbar_new(GTK_ORIENTATION_VERTICAL, NULL); -+ setup_widget_prototype(gVertScrollbar.widget); -+ -+ gVertScrollbar.scroll.style = moz_gtk_style_create(path+1, NULL); -+ gVertScrollbar.scroll.styleContents = moz_gtk_style_create(path+2, -+ gVertScrollbar.scroll.style); -+ gVertScrollbar.scroll.styleTrough = moz_gtk_style_create(path+3, -+ gVertScrollbar.scroll.styleContents); -+ gVertScrollbar.scroll.styleSlider = moz_gtk_style_create(path+4, -+ gVertScrollbar.scroll.styleTrough); -+ -+ } - return MOZ_GTK_SUCCESS; - } - - static gint - ensure_spin_widget() - { -- if (!gSpinWidget) { -- gSpinWidget = gtk_spin_button_new(NULL, 1, 0); -- setup_widget_prototype(gSpinWidget); -- } -- return MOZ_GTK_SUCCESS; -+ if (!gSpin.widget) { -+ GtkCssNode path[] = { -+ { GTK_TYPE_SPIN_BUTTON, "spinbutton", "horizontal", NULL }, -+ { GTK_TYPE_SPIN_BUTTON, "spinbutton", "vertical", NULL }, -+ { GTK_TYPE_ENTRY, "entry", NULL, NULL }, -+ { G_TYPE_NONE, "button", "up", NULL }, -+ { G_TYPE_NONE, "button", "down", NULL } -+ }; -+ -+ gSpin.widget = gtk_spin_button_new(NULL, 1, 0); -+ setup_widget_prototype(gSpin.widget); -+ -+ gSpin.spin.style = moz_gtk_style_create(path, NULL); -+ gSpin.spin.styleButtonUp = moz_gtk_style_create(path+3, gSpin.spin.style); -+ gSpin.spin.styleButtonDown = moz_gtk_style_create(path+4, gSpin.spin.style); -+ gSpin.spin.styleEntry = moz_gtk_style_create(path+2, gSpin.spin.style); -+ } -+ return MOZ_GTK_SUCCESS; - } - - static gint -@@ -253,9 +439,19 @@ ensure_scale_widget() - static gint - ensure_entry_widget() - { -- if (!gEntryWidget) { -- gEntryWidget = gtk_entry_new(); -- setup_widget_prototype(gEntryWidget); -+ if (!gEntry.widget) { -+ GtkCssNode path[] = { -+ { GTK_TYPE_ENTRY, "entry", NULL, NULL }, -+ { G_TYPE_NONE, "selection", NULL, NULL } -+ }; -+ -+ gEntry.widget = gtk_entry_new(); -+ setup_widget_prototype(gEntry.widget); -+ gtk_widget_show(gEntry.widget); -+ -+ gEntry.entry.style = moz_gtk_style_create(&path[0], NULL); -+ gEntry.entry.styleSelection = moz_gtk_style_create(&path[1], -+ gEntry.entry.style); - } - return MOZ_GTK_SUCCESS; - } -@@ -387,9 +583,9 @@ moz_gtk_get_combo_box_entry_inner_widget - g_object_add_weak_pointer(G_OBJECT(widget), - (gpointer) &gComboBoxEntryButtonWidget); - } else if (GTK_IS_ENTRY(widget)) { -- gComboBoxEntryTextareaWidget = widget; -+ gComboBoxEntryTextarea.widget = widget; - g_object_add_weak_pointer(G_OBJECT(widget), -- (gpointer) &gComboBoxEntryTextareaWidget); -+ (gpointer) &gComboBoxEntryTextarea.widget); - } else - return; - gtk_widget_realize(widget); -@@ -411,7 +607,7 @@ ensure_combo_box_entry_widgets() - { - GtkWidget* buttonChild; - -- if (gComboBoxEntryTextareaWidget && -+ if (gComboBoxEntryTextarea.widget && - gComboBoxEntryButtonWidget && - gComboBoxEntryArrowWidget) - return MOZ_GTK_SUCCESS; -@@ -427,9 +623,9 @@ ensure_combo_box_entry_widgets() - moz_gtk_get_combo_box_entry_inner_widgets, - NULL); - -- if (!gComboBoxEntryTextareaWidget) { -+ if (!gComboBoxEntryTextarea.widget) { - ensure_entry_widget(); -- gComboBoxEntryTextareaWidget = gEntryWidget; -+ gComboBoxEntryTextarea.widget = gEntry.widget; - } - - if (gComboBoxEntryButtonWidget) { -@@ -507,12 +703,18 @@ ensure_toolbar_separator_widget() - static gint - ensure_tooltip_widget() - { -- if (!gTooltipWidget) { -- gTooltipWidget = gtk_window_new(GTK_WINDOW_POPUP); -- GtkStyleContext* style = gtk_widget_get_style_context(gTooltipWidget); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_TOOLTIP); -- gtk_widget_realize(gTooltipWidget); -- moz_gtk_set_widget_name(gTooltipWidget); -+ if (!gTooltip.widget) { -+ GtkCssNode path[] = { -+ { GTK_TYPE_TOOLTIP, "tooltip", NULL, NULL}, -+ { GTK_TYPE_TOOLTIP, "tooltip", "background", NULL}, -+ }; -+ -+ gTooltip.widget = gtk_window_new(GTK_WINDOW_POPUP); -+ gtk_widget_realize(gTooltip.widget); -+ moz_gtk_set_widget_name(gTooltip.widget); -+ -+ gTooltip.tooltip.style = moz_gtk_style_create(&path[0], NULL); -+ gTooltip.tooltip.styleBackground = moz_gtk_style_create(&path[1], NULL); - } - return MOZ_GTK_SUCCESS; - } -@@ -530,9 +732,21 @@ ensure_tab_widget() - static gint - ensure_progress_widget() - { -- if (!gProgressWidget) { -- gProgressWidget = gtk_progress_bar_new(); -- setup_widget_prototype(gProgressWidget); -+ if (!gProgressBar.widget) { -+ GtkCssNode path[] = { -+ { GTK_TYPE_LABEL, "progressbar", NULL, NULL }, -+ { G_TYPE_NONE, "trough", NULL, NULL }, -+ { G_TYPE_NONE, "progress", NULL, NULL }, -+ }; -+ -+ gProgressBar.widget = gtk_progress_bar_new(); -+ setup_widget_prototype(gProgressBar.widget); -+ -+ gProgressBar.progress.style = moz_gtk_style_create(&path[0], NULL); -+ gProgressBar.progress.styleTrough = moz_gtk_style_create(&path[1], -+ gProgressBar.progress.style); -+ gProgressBar.progress.styleProgress = moz_gtk_style_create(&path[2], -+ gProgressBar.progress.styleTrough); - } - return MOZ_GTK_SUCCESS; - } -@@ -638,6 +852,11 @@ static gint - ensure_check_menu_item_widget() - { - if (!gCheckMenuItemWidget) { -+ GtkCssNode path[] = { -+ { GTK_TYPE_CHECK_MENU_ITEM, "menuitem", NULL, NULL }, -+ { G_TYPE_NONE, "check", NULL, NULL } -+ }; -+ - ensure_menu_popup_widget(); - gCheckMenuItemWidget = gtk_check_menu_item_new_with_label("M"); - gtk_menu_shell_append(GTK_MENU_SHELL(gMenuPopupWidget), -@@ -752,7 +971,7 @@ moz_gtk_checkbox_get_metrics(gint* indic - { - ensure_checkbox_widget(); - -- gtk_widget_style_get (gCheckboxWidget, -+ gtk_widget_style_get (gCheckbox.widget, - "indicator_size", indicator_size, - "indicator_spacing", indicator_spacing, - NULL); -@@ -765,7 +984,7 @@ moz_gtk_radio_get_metrics(gint* indicato - { - ensure_radiobutton_widget(); - -- gtk_widget_style_get (gRadiobuttonWidget, -+ gtk_widget_style_get (gRadiobutton.widget, - "indicator_size", indicator_size, - "indicator_spacing", indicator_spacing, - NULL); -@@ -778,13 +997,13 @@ moz_gtk_get_focus_outline_size(gint* foc - { - GtkBorder border; - GtkBorder padding; -- GtkStyleContext *style; -+ GtkStyleContext* style; - - ensure_entry_widget(); -- style = gtk_widget_get_style_context(gEntryWidget); - -- gtk_style_context_get_border(style, 0, &border); -- gtk_style_context_get_padding(style, 0, &padding); -+ style = gEntry.entry.style; -+ gtk_style_context_get_border(style, gtk_style_context_get_state(style), &border); -+ gtk_style_context_get_padding(style, gtk_style_context_get_state(style), &padding); - *focus_h_width = border.left + padding.left; - *focus_v_width = border.top + padding.top; - return MOZ_GTK_SUCCESS; -@@ -821,7 +1040,7 @@ moz_gtk_button_get_default_overflow(gint - GtkBorder* default_outside_border; - - ensure_button_widget(); -- gtk_widget_style_get(gButtonWidget, -+ gtk_widget_style_get(gButton.widget, - "default-outside-border", &default_outside_border, - NULL); - -@@ -844,7 +1063,7 @@ moz_gtk_button_get_default_border(gint* - GtkBorder* default_border; - - ensure_button_widget(); -- gtk_widget_style_get(gButtonWidget, -+ gtk_widget_style_get(gButton.widget, - "default-border", &default_border, - NULL); - -@@ -935,7 +1154,7 @@ moz_gtk_button_paint(cairo_t *cr, GdkRec - - if (state->focused) { - GtkBorder border; -- gtk_style_context_get_border(style, state_flags, &border); -+ moz_gtk_get_style_border(style, state_flags, &border); - x += border.left; - y += border.top; - width -= (border.left + border.right); -@@ -956,15 +1175,14 @@ moz_gtk_toggle_paint(cairo_t *cr, GdkRec - gint indicator_size, indicator_spacing; - gint x, y, width, height; - gint focus_x, focus_y, focus_width, focus_height; -- GtkWidget *w; -- GtkStyleContext *style; -+ MozGtkWidget *w; - - if (isradio) { - moz_gtk_radio_get_metrics(&indicator_size, &indicator_spacing); -- w = gRadiobuttonWidget; -+ w = &gRadiobutton; - } else { - moz_gtk_checkbox_get_metrics(&indicator_size, &indicator_spacing); -- w = gCheckboxWidget; -+ w = &gCheckbox; - } - - // XXX we should assert rect->height >= indicator_size too -@@ -983,11 +1201,9 @@ moz_gtk_toggle_paint(cairo_t *cr, GdkRec - focus_width = width + 2 * indicator_spacing; - focus_height = height + 2 * indicator_spacing; - -- style = gtk_widget_get_style_context(w); -- -- gtk_widget_set_sensitive(w, !state->disabled); -- gtk_widget_set_direction(w, direction); -- gtk_style_context_save(style); -+ gtk_widget_set_sensitive(w->widget, !state->disabled); -+ gtk_widget_set_direction(w->widget, direction); -+ gtk_style_context_save(w->check.styleCheck); - - if (selected) - state_flags |= checkbox_check_state; -@@ -995,13 +1211,15 @@ moz_gtk_toggle_paint(cairo_t *cr, GdkRec - if (inconsistent) - state_flags |= GTK_STATE_FLAG_INCONSISTENT; - -- gtk_style_context_set_state(style, state_flags); -+ gtk_style_context_set_state(w->check.styleCheck, state_flags); -+ -+ gtk_render_background(w->check.styleCheck, cr, x, y, width, height); -+ gtk_render_frame(w->check.styleCheck, cr, x, y, width, height); - - if (isradio) { -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_RADIO); -- gtk_render_option(style, cr, x, y, width, height); -+ gtk_render_option(w->check.styleCheck, cr, x, y, width, height); - if (state->focused) { -- gtk_render_focus(style, cr, focus_x, focus_y, -+ gtk_render_focus(w->check.styleCheck, cr, focus_x, focus_y, - focus_width, focus_height); - } - } -@@ -1010,15 +1228,14 @@ moz_gtk_toggle_paint(cairo_t *cr, GdkRec - * 'indeterminate' type on checkboxes. In GTK, the shadow type - * must also be changed for the state to be drawn. - */ -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_CHECK); -- gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON(gCheckboxWidget), inconsistent); -- gtk_render_check(style, cr, x, y, width, height); -+ gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON(w->widget), inconsistent); -+ gtk_render_check(w->check.styleCheck, cr, x, y, width, height); - if (state->focused) { -- gtk_render_focus(style, cr, -+ gtk_render_focus(w->check.styleCheck, cr, - focus_x, focus_y, focus_width, focus_height); - } - } -- gtk_style_context_restore(style); -+ gtk_style_context_restore(w->check.styleCheck); - - return MOZ_GTK_SUCCESS; - } -@@ -1035,8 +1252,8 @@ calculate_button_inner_rect(GtkWidget* b - style = gtk_widget_get_style_context(button); - - /* This mirrors gtkbutton's child positioning */ -- gtk_style_context_get_border(style, 0, &border); -- gtk_style_context_get_padding(style, 0, &padding); -+ gtk_style_context_get_border(style, gtk_style_context_get_state(style), &border); -+ gtk_style_context_get_padding(style, gtk_style_context_get_state(style), &padding); - - inner_rect->x = rect->x + border.left + padding.left; - inner_rect->y = rect->y + padding.top + border.top; -@@ -1099,9 +1316,9 @@ moz_gtk_scrollbar_button_paint(cairo_t * - ensure_scrollbar_widget(); - - if (flags & MOZ_GTK_STEPPER_VERTICAL) -- scrollbar = gVertScrollbarWidget; -+ scrollbar = gVertScrollbar.widget; - else -- scrollbar = gHorizScrollbarWidget; -+ scrollbar = gHorizScrollbar.widget; - - gtk_widget_set_direction(scrollbar, direction); - -@@ -1181,25 +1398,22 @@ moz_gtk_scrollbar_trough_paint(GtkThemeW - GtkTextDirection direction) - { - GtkStyleContext* style; -- GtkScrollbar *scrollbar; - - ensure_scrollbar_widget(); - -- if (widget == MOZ_GTK_SCROLLBAR_HORIZONTAL) -- scrollbar = GTK_SCROLLBAR(gHorizScrollbarWidget); -- else -- scrollbar = GTK_SCROLLBAR(gVertScrollbarWidget); -- -- gtk_widget_set_direction(GTK_WIDGET(scrollbar), direction); -- - if (flags & MOZ_GTK_TRACK_OPAQUE) { - style = gtk_widget_get_style_context(GTK_WIDGET(gProtoWindow)); - gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height); - } - -- style = gtk_widget_get_style_context(GTK_WIDGET(scrollbar)); -- gtk_style_context_save(style); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_TROUGH); -+ if (widget == MOZ_GTK_SCROLLBAR_HORIZONTAL) { -+ gtk_widget_set_direction(GTK_WIDGET(gHorizScrollbar.widget), direction); -+ style = gHorizScrollbar.scroll.style; -+ } -+ else { -+ gtk_widget_set_direction(GTK_WIDGET(gVertScrollbar.widget), direction); -+ style = gVertScrollbar.scroll.style; -+ } - - gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height); - gtk_render_frame(style, cr, rect->x, rect->y, rect->width, rect->height); -@@ -1208,7 +1422,6 @@ moz_gtk_scrollbar_trough_paint(GtkThemeW - gtk_render_focus(style, cr, - rect->x, rect->y, rect->width, rect->height); - } -- gtk_style_context_restore(style); - return MOZ_GTK_SUCCESS; - } - -@@ -1220,24 +1433,20 @@ moz_gtk_scrollbar_thumb_paint(GtkThemeWi - { - GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state); - GtkStyleContext* style; -- GtkScrollbar *scrollbar; - GtkBorder margin; - - ensure_scrollbar_widget(); - -- if (widget == MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL) -- scrollbar = GTK_SCROLLBAR(gHorizScrollbarWidget); -- else -- scrollbar = GTK_SCROLLBAR(gVertScrollbarWidget); -- -- gtk_widget_set_direction(GTK_WIDGET(scrollbar), direction); -- -- style = gtk_widget_get_style_context(GTK_WIDGET(scrollbar)); -- gtk_style_context_save(style); -+ if (widget == MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL) { -+ style = gHorizScrollbar.scroll.styleSlider; -+ gtk_widget_set_direction(GTK_WIDGET(gHorizScrollbar.widget), direction); -+ } -+ else { -+ style = gVertScrollbar.scroll.styleSlider; -+ gtk_widget_set_direction(GTK_WIDGET(gVertScrollbar.widget), direction); -+ } - -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_SLIDER); - gtk_style_context_set_state(style, state_flags); -- - gtk_style_context_get_margin (style, state_flags, &margin); - - gtk_render_slider(style, cr, -@@ -1248,8 +1457,6 @@ moz_gtk_scrollbar_thumb_paint(GtkThemeWi - (widget == MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL) ? - GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL); - -- gtk_style_context_restore(style); -- - return MOZ_GTK_SUCCESS; - } - -@@ -1260,8 +1467,8 @@ moz_gtk_spin_paint(cairo_t *cr, GdkRecta - GtkStyleContext* style; - - ensure_spin_widget(); -- gtk_widget_set_direction(gSpinWidget, direction); -- style = gtk_widget_get_style_context(gSpinWidget); -+ gtk_widget_set_direction(gSpin.widget, direction); -+ style = gSpin.spin.style; - gtk_style_context_save(style); - gtk_style_context_add_class(style, GTK_STYLE_CLASS_SPINBUTTON); - gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height); -@@ -1280,11 +1487,10 @@ moz_gtk_spin_updown_paint(cairo_t *cr, G - GtkStyleContext* style; - - ensure_spin_widget(); -- style = gtk_widget_get_style_context(gSpinWidget); -+ style = gSpin.spin.style; - gtk_style_context_save(style); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_SPINBUTTON); - gtk_style_context_set_state(style, GetStateFlagsFromGtkWidgetState(state)); -- gtk_widget_set_direction(gSpinWidget, direction); -+ gtk_widget_set_direction(gSpin.widget, direction); - - gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height); - gtk_render_frame(style, cr, rect->x, rect->y, rect->width, rect->height); -@@ -1450,15 +1656,13 @@ moz_gtk_vpaned_paint(cairo_t *cr, GdkRec - static gint - moz_gtk_entry_paint(cairo_t *cr, GdkRectangle* rect, - GtkWidgetState* state, -- GtkWidget* widget, GtkTextDirection direction) -+ MozGtkWidget* w, GtkTextDirection direction) - { - gint x = rect->x, y = rect->y, width = rect->width, height = rect->height; -- GtkStyleContext* style; - int draw_focus_outline_only = state->depressed; // NS_THEME_FOCUS_OUTLINE -+ GtkStyleContext* style = w->entry.style; - -- gtk_widget_set_direction(widget, direction); -- -- style = gtk_widget_get_style_context(widget); -+ gtk_widget_set_direction(w->widget, direction); - - if (draw_focus_outline_only) { - // Inflate the given 'rect' with the focus outline size. -@@ -1478,10 +1682,9 @@ moz_gtk_entry_paint(cairo_t *cr, GdkRect - * textarea window uses gtk_paint_flat_box when exposed */ - - /* This gets us a lovely greyish disabledish look */ -- gtk_widget_set_sensitive(widget, !state->disabled); -+ gtk_widget_set_sensitive(w->widget, !state->disabled); - - gtk_style_context_save(style); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_ENTRY); - - /* Now paint the shadow and focus border. - * We do like in gtk_entry_draw_frame, we first draw the shadow, a tad -@@ -1531,7 +1734,7 @@ moz_gtk_treeview_paint(cairo_t *cr, GdkR - style = gtk_widget_get_style_context(gScrolledWindowWidget); - gtk_style_context_save(style); - gtk_style_context_add_class(style, GTK_STYLE_CLASS_FRAME); -- gtk_style_context_get_border(style, state_flags, &border); -+ moz_gtk_get_style_border(style, state_flags, &border); - xthickness = border.left; - ythickness = border.top; - -@@ -1702,7 +1905,7 @@ moz_gtk_combo_box_paint(cairo_t *cr, Gdk - if (direction == GTK_TEXT_DIR_LTR) { - GtkBorder padding; - GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state); -- gtk_style_context_get_padding(style, state_flags, &padding); -+ moz_gtk_get_style_padding(style, state_flags, &padding); - arrow_rect.x -= padding.left; - } - else -@@ -1804,29 +2007,27 @@ moz_gtk_container_paint(cairo_t *cr, Gdk - gboolean isradio, GtkTextDirection direction) - { - GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state); -- GtkStyleContext* style; -- GtkWidget *widget; -+ MozGtkWidget *widget; - - if (isradio) { - ensure_radiobutton_widget(); -- widget = gRadiobuttonWidget; -+ widget = &gRadiobutton; - } else { - ensure_checkbox_widget(); -- widget = gCheckboxWidget; -+ widget = &gCheckbox; - } -- gtk_widget_set_direction(widget, direction); -+ gtk_widget_set_direction(widget->widget, direction); - -- style = gtk_widget_get_style_context(widget); -- gtk_style_context_save(style); -- gtk_style_context_set_state(style, state_flags); -+ gtk_style_context_save(widget->check.style); -+ gtk_style_context_set_state(widget->check.style, state_flags); - - /* this is for drawing a prelight box */ - if (state_flags & GTK_STATE_FLAG_PRELIGHT) { -- gtk_render_background(style, cr, -+ gtk_render_background(widget->check.style, cr, - rect->x, rect->y, rect->width, rect->height); - } - -- gtk_style_context_restore(style); -+ gtk_style_context_restore(widget->check.style); - - return MOZ_GTK_SUCCESS; - } -@@ -1836,32 +2037,26 @@ moz_gtk_toggle_label_paint(cairo_t *cr, - GtkWidgetState* state, - gboolean isradio, GtkTextDirection direction) - { -- GtkStyleContext *style; -- GtkWidget *widget; -+ MozGtkWidget *widget; - - if (!state->focused) - return MOZ_GTK_SUCCESS; - - if (isradio) { - ensure_radiobutton_widget(); -- widget = gRadiobuttonWidget; -+ widget = &gRadiobutton; - } else { - ensure_checkbox_widget(); -- widget = gCheckboxWidget; -- } -- style = gtk_widget_get_style_context(widget); -- gtk_style_context_save(style); -- if (isradio) { -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_RADIO); -- } else { -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_CHECK); -+ widget = &gCheckbox; - } -- gtk_widget_set_direction(widget, direction); -+ gtk_style_context_save(widget->check.styleLabel); -+ gtk_widget_set_direction(widget->widget, direction); - -- gtk_style_context_set_state(style, GetStateFlagsFromGtkWidgetState(state)); -- gtk_render_focus(style, cr, -+ gtk_style_context_set_state(widget->check.styleLabel, -+ GetStateFlagsFromGtkWidgetState(state)); -+ gtk_render_focus(widget->check.styleLabel, cr, - rect->x, rect->y, rect->width, rect->height); -- gtk_style_context_restore(style); -+ gtk_style_context_restore(widget->check.styleLabel); - - return MOZ_GTK_SUCCESS; - } -@@ -1922,7 +2117,7 @@ moz_gtk_toolbar_separator_paint(cairo_t - rect->height * (end_fraction - start_fraction)); - } else { - GtkBorder padding; -- gtk_style_context_get_padding(style, 0, &padding); -+ gtk_style_context_get_padding(style, gtk_style_context_get_state(style), &padding); - - paint_width = padding.left; - if (paint_width > rect->width) -@@ -1945,9 +2140,9 @@ moz_gtk_tooltip_paint(cairo_t *cr, GdkRe - GtkStyleContext* style; - - ensure_tooltip_widget(); -- gtk_widget_set_direction(gTooltipWidget, direction); -+ gtk_widget_set_direction(gTooltip.widget, direction); - -- style = gtk_widget_get_style_context(gTooltipWidget); -+ style = gTooltip.tooltip.styleBackground; - gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height); - gtk_render_frame(style, cr, rect->x, rect->y, rect->width, rect->height); - return MOZ_GTK_SUCCESS; -@@ -2006,18 +2201,13 @@ static gint - moz_gtk_progressbar_paint(cairo_t *cr, GdkRectangle* rect, - GtkTextDirection direction) - { -- GtkStyleContext* style; -- - ensure_progress_widget(); -- gtk_widget_set_direction(gProgressWidget, direction); -+ gtk_widget_set_direction(gProgressBar.widget, direction); - -- style = gtk_widget_get_style_context(gProgressWidget); -- gtk_style_context_save(style); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_TROUGH); -- -- gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height); -- gtk_render_frame(style, cr, rect->x, rect->y, rect->width, rect->height); -- gtk_style_context_restore(style); -+ gtk_render_background(gProgressBar.progress.styleTrough, cr, -+ rect->x, rect->y, rect->width, rect->height); -+ gtk_render_frame(gProgressBar.progress.styleTrough, cr, -+ rect->x, rect->y, rect->width, rect->height); - - return MOZ_GTK_SUCCESS; - } -@@ -2027,15 +2217,8 @@ moz_gtk_progress_chunk_paint(cairo_t *cr - GtkTextDirection direction, - GtkThemeWidgetType widget) - { -- GtkStyleContext* style; -- - ensure_progress_widget(); -- gtk_widget_set_direction(gProgressWidget, direction); -- -- style = gtk_widget_get_style_context(gProgressWidget); -- gtk_style_context_save(style); -- gtk_style_context_remove_class(style, GTK_STYLE_CLASS_TROUGH); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_PROGRESSBAR); -+ gtk_widget_set_direction(gProgressBar.widget, direction); - - if (widget == MOZ_GTK_PROGRESS_CHUNK_INDETERMINATE || - widget == MOZ_GTK_PROGRESS_CHUNK_VERTICAL_INDETERMINATE) { -@@ -2074,12 +2257,14 @@ moz_gtk_progress_chunk_paint(cairo_t *cr - // gtk_render_activity was used to render progress chunks on GTK versions - // before 3.13.7, see bug 1173907. - if (!gtk_check_version(3, 13, 7)) { -- gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height); -- gtk_render_frame(style, cr, rect->x, rect->y, rect->width, rect->height); -+ gtk_render_background(gProgressBar.progress.styleProgress, cr, -+ rect->x, rect->y, rect->width, rect->height); -+ gtk_render_frame(gProgressBar.progress.styleProgress, cr, -+ rect->x, rect->y, rect->width, rect->height); - } else { -- gtk_render_activity(style, cr, rect->x, rect->y, rect->width, rect->height); -+ gtk_render_activity(gProgressBar.progress.styleProgress, cr, -+ rect->x, rect->y, rect->width, rect->height); - } -- gtk_style_context_restore(style); - - return MOZ_GTK_SUCCESS; - } -@@ -2096,7 +2281,7 @@ moz_gtk_get_tab_thickness(void) - - style = gtk_widget_get_style_context(gTabWidget); - gtk_style_context_add_class(style, GTK_STYLE_CLASS_NOTEBOOK); -- gtk_style_context_get_border(style, 0, &border); -+ gtk_style_context_get_border(style, gtk_style_context_get_state(style), &border); - - if (border.top < 2) - return 2; /* some themes don't set ythickness correctly */ -@@ -2292,7 +2477,7 @@ moz_gtk_tab_paint(cairo_t *cr, GdkRectan - gtk_style_context_save(style); - moz_gtk_tab_prepare_style_context(style, flags); - -- gtk_style_context_get_padding(style, GetStateFlagsFromGtkWidgetState(state), &padding); -+ moz_gtk_get_style_padding(style, GetStateFlagsFromGtkWidgetState(state), &padding); - - focusRect.x += padding.left; - focusRect.width -= (padding.left + padding.right); -@@ -2408,7 +2593,7 @@ moz_gtk_tab_scroll_arrow_paint(cairo_t * - } - - static gint --moz_gtk_menu_bar_paint(cairo_t *cr, GdkRectangle* rect, -+moz_gtk_menu_bar_paint(cairo_t *cr, GdkRectangle* rect, GtkWidgetState* state, - GtkTextDirection direction) - { - GtkStyleContext* style; -@@ -2468,7 +2653,7 @@ moz_gtk_menu_separator_paint(cairo_t *cr - border_width = gtk_container_get_border_width(GTK_CONTAINER(gMenuSeparatorWidget)); - - style = gtk_widget_get_style_context(gMenuSeparatorWidget); -- gtk_style_context_get_padding(style, 0, &padding); -+ gtk_style_context_get_padding(style, gtk_style_context_get_state(style), &padding); - - x = rect->x + border_width; - y = rect->y + border_width; -@@ -2521,7 +2706,8 @@ moz_gtk_menu_item_paint(cairo_t *cr, Gdk - item_widget = gMenuItemWidget; - } - style = gtk_widget_get_style_context(item_widget); -- gtk_style_context_save(style); -+// TODO - FIX! -+// gtk_style_context_save(style); - - if (flags & MOZ_TOPLEVEL_MENU_ITEM) { - gtk_style_context_add_class(style, GTK_STYLE_CLASS_MENUBAR); -@@ -2540,7 +2726,7 @@ moz_gtk_menu_item_paint(cairo_t *cr, Gdk - - gtk_render_background(style, cr, x, y, w, h); - gtk_render_frame(style, cr, x, y, w, h); -- gtk_style_context_restore(style); -+// gtk_style_context_restore(style); - } - - return MOZ_GTK_SUCCESS; -@@ -2556,7 +2742,10 @@ moz_gtk_menu_arrow_paint(cairo_t *cr, Gd - - ensure_menu_item_widget(); - gtk_widget_set_direction(gMenuItemWidget, direction); -- -+/* -+ state_flags |= (direction == GTK_TEXT_DIR_LTR) ? GTK_STATE_FLAG_DIR_LTR : -+ GTK_STATE_FLAG_DIR_RTL; -+*/ - style = gtk_widget_get_style_context(gMenuItemWidget); - gtk_style_context_save(style); - gtk_style_context_add_class(style, GTK_STYLE_CLASS_MENUITEM); -@@ -2606,7 +2795,7 @@ moz_gtk_check_menu_item_paint(cairo_t *c - } - - gtk_style_context_set_state(style, state_flags); -- gtk_style_context_get_padding(style, state_flags, &padding); -+ moz_gtk_get_style_padding(style, state_flags, &padding); - - offset = gtk_container_get_border_width(GTK_CONTAINER(gCheckMenuItemWidget)) + - padding.left + 2; -@@ -2658,7 +2847,7 @@ moz_gtk_add_style_border(GtkStyleContext - { - GtkBorder border; - -- gtk_style_context_get_border(style, 0, &border); -+ gtk_style_context_get_border(style, gtk_style_context_get_state(style), &border); - - *left += border.left; - *right += border.right; -@@ -2667,12 +2856,22 @@ moz_gtk_add_style_border(GtkStyleContext - } - - static void -+moz_gtk_get_style_border(GtkStyleContext* style, GtkStateFlags state_flags, -+ GtkBorder *border) -+{ -+ gtk_style_context_save(style); -+ gtk_style_context_set_state(style, state_flags); -+ gtk_style_context_get_border(style, gtk_style_context_get_state(style), border); -+ gtk_style_context_restore(style); -+} -+ -+static void - moz_gtk_add_style_padding(GtkStyleContext* style, - gint* left, gint* top, gint* right, gint* bottom) - { - GtkBorder padding; - -- gtk_style_context_get_padding(style, 0, &padding); -+ gtk_style_context_get_padding(style, gtk_style_context_get_state(style), &padding); - - *left += padding.left; - *right += padding.right; -@@ -2680,6 +2879,16 @@ moz_gtk_add_style_padding(GtkStyleContex - *bottom += padding.bottom; - } - -+static void -+moz_gtk_get_style_padding(GtkStyleContext* style, GtkStateFlags state_flags, -+ GtkBorder *padding) -+{ -+ gtk_style_context_save(style); -+ gtk_style_context_set_state(style, state_flags); -+ gtk_style_context_get_padding(style, gtk_style_context_get_state(style), padding); -+ gtk_style_context_restore(style); -+} -+ - gint - moz_gtk_get_widget_border(GtkThemeWidgetType widget, gint* left, gint* top, - gint* right, gint* bottom, GtkTextDirection direction, -@@ -2694,37 +2903,35 @@ moz_gtk_get_widget_border(GtkThemeWidget - case MOZ_GTK_TOOLBAR_BUTTON: - { - ensure_button_widget(); -- style = gtk_widget_get_style_context(gButtonWidget); -- -- *left = *top = *right = *bottom = gtk_container_get_border_width(GTK_CONTAINER(gButtonWidget)); - -- if (widget == MOZ_GTK_TOOLBAR_BUTTON) { -- gtk_style_context_save(style); -- gtk_style_context_add_class(style, "image-button"); -- } -- -- moz_gtk_add_style_padding(style, left, top, right, bottom); -- -- if (widget == MOZ_GTK_TOOLBAR_BUTTON) -- gtk_style_context_restore(style); -+ *left = *top = *right = *bottom = gtk_container_get_border_width(GTK_CONTAINER(gButton.widget)); -+ moz_gtk_add_style_padding(gButton.button.style, left, top, right, bottom); - - // XXX: Subtract 1 pixel from the border to account for the added - // -moz-focus-inner border (Bug 1228281). - *left -= 1; *top -= 1; *right -= 1; *bottom -= 1; -- moz_gtk_add_style_border(style, left, top, right, bottom); -+ moz_gtk_add_style_border(gButton.button.style, left, top, right, bottom); -+ - return MOZ_GTK_SUCCESS; - } - case MOZ_GTK_ENTRY: - { - ensure_entry_widget(); -- style = gtk_widget_get_style_context(gEntryWidget); - - // XXX: Subtract 1 pixel from the padding to account for the default - // padding in forms.css. See bug 1187385. - *left = *top = *right = *bottom = -1; -- moz_gtk_add_style_padding(style, left, top, right, bottom); -- moz_gtk_add_style_border(style, left, top, right, bottom); - -+ moz_gtk_add_style_padding(gEntry.entry.style, left, top, right, bottom); -+ moz_gtk_add_style_border(gEntry.entry.style, left, top, right, bottom); -+ -+ return MOZ_GTK_SUCCESS; -+ } -+ case MOZ_GTK_TOOLTIP: -+ { -+ ensure_tooltip_widget(); -+ moz_gtk_add_style_padding(gTooltip.tooltip.styleBackground, left, top, right, bottom); -+ moz_gtk_add_style_border(gTooltip.tooltip.styleBackground, left, top, right, bottom); - return MOZ_GTK_SUCCESS; - } - case MOZ_GTK_TREEVIEW: -@@ -2759,7 +2966,7 @@ moz_gtk_get_widget_border(GtkThemeWidget - break; - case MOZ_GTK_DROPDOWN_ENTRY: - ensure_combo_box_entry_widgets(); -- w = gComboBoxEntryTextareaWidget; -+ w = gComboBoxEntryTextarea.widget; - break; - case MOZ_GTK_DROPDOWN_ARROW: - ensure_combo_box_entry_widgets(); -@@ -2795,7 +3002,7 @@ moz_gtk_get_widget_border(GtkThemeWidget - - if (!wide_separators) { - style = gtk_widget_get_style_context(gComboBoxSeparatorWidget); -- gtk_style_context_get_border(style, 0, &border); -+ gtk_style_context_get_border(style, gtk_style_context_get_state(style), &border); - separator_width = border.left; - } - } -@@ -2814,14 +3021,17 @@ moz_gtk_get_widget_border(GtkThemeWidget - w = gTabWidget; - break; - case MOZ_GTK_PROGRESSBAR: -- ensure_progress_widget(); -- w = gProgressWidget; -- break; -+ { -+ ensure_progress_widget(); -+ moz_gtk_add_style_border(gProgressBar.progress.styleTrough, -+ left, top, right, bottom); -+ return MOZ_GTK_SUCCESS; -+ } - case MOZ_GTK_SPINBUTTON_ENTRY: - case MOZ_GTK_SPINBUTTON_UP: - case MOZ_GTK_SPINBUTTON_DOWN: - ensure_spin_widget(); -- w = gSpinWidget; -+ w = gSpin.widget; - break; - case MOZ_GTK_SCALE_HORIZONTAL: - ensure_scale_widget(); -@@ -2840,12 +3050,13 @@ moz_gtk_get_widget_border(GtkThemeWidget - { - if (widget == MOZ_GTK_CHECKBUTTON_CONTAINER) { - ensure_checkbox_widget(); -- w = gCheckboxWidget; -+ w = gCheckbox.widget; -+ style = gCheckbox.check.styleCheck; - } else { - ensure_radiobutton_widget(); -- w = gRadiobuttonWidget; -+ w = gRadiobutton.widget; -+ style = gRadiobutton.check.styleCheck; - } -- style = gtk_widget_get_style_context(w); - - *left = *top = *right = *bottom = gtk_container_get_border_width(GTK_CONTAINER(w)); - moz_gtk_add_style_border(style, -@@ -2904,7 +3115,6 @@ moz_gtk_get_widget_border(GtkThemeWidget - case MOZ_GTK_MENUSEPARATOR: - /* These widgets have no borders.*/ - case MOZ_GTK_SPINBUTTON: -- case MOZ_GTK_TOOLTIP: - case MOZ_GTK_WINDOW: - case MOZ_GTK_RESIZER: - case MOZ_GTK_MENUARROW: -@@ -2978,6 +3188,32 @@ moz_gtk_get_combo_box_entry_button_size( - } - - gint -+moz_gtk_get_entry_height(gint* height) -+{ -+ GtkRequisition requisition; -+ ensure_entry_widget(); -+ -+ gtk_widget_get_preferred_size(gEntry.widget, NULL, &requisition); -+ *height = requisition.height; -+ -+ return MOZ_GTK_SUCCESS; -+} -+ -+ -+gint -+moz_gtk_get_button_height(gint* height) -+{ -+ GtkRequisition requisition; -+ ensure_entry_widget(); -+ -+ gtk_widget_get_preferred_size(gButton.widget, NULL, &requisition); -+ *height = requisition.height; -+ -+ return MOZ_GTK_SUCCESS; -+} -+ -+ -+gint - moz_gtk_get_tab_scroll_arrow_size(gint* width, gint* height) - { - gint arrow_size; -@@ -3030,7 +3266,7 @@ moz_gtk_get_toolbar_separator_width(gint - "separator-width", &separator_width, - NULL); - /* Just in case... */ -- gtk_style_context_get_border(style, 0, &border); -+ gtk_style_context_get_border(style, gtk_style_context_get_state(style), &border); - *size = MAX(*size, (wide_separators ? separator_width : border.left)); - return MOZ_GTK_SUCCESS; - } -@@ -3072,7 +3308,7 @@ moz_gtk_get_menu_separator_height(gint * - border_width = gtk_container_get_border_width(GTK_CONTAINER(gMenuSeparatorWidget)); - - style = gtk_widget_get_style_context(gMenuSeparatorWidget); -- gtk_style_context_get_padding(style, 0, &padding); -+ gtk_style_context_get_padding(style, gtk_style_context_get_state(style), &padding); - - gtk_style_context_save(style); - gtk_style_context_add_class(style, GTK_STYLE_CLASS_SEPARATOR); -@@ -3130,15 +3366,21 @@ moz_gtk_get_scrollbar_metrics(MozGtkScro - { - ensure_scrollbar_widget(); - -- gtk_widget_style_get (gHorizScrollbarWidget, -+ gtk_widget_style_get (gHorizScrollbar.widget, - "slider_width", &metrics->slider_width, - "trough_border", &metrics->trough_border, - "stepper_size", &metrics->stepper_size, - "stepper_spacing", &metrics->stepper_spacing, - NULL); - -- metrics->min_slider_size = -- gtk_range_get_min_slider_size(GTK_RANGE(gHorizScrollbarWidget)); -+ if (!gtk_check_version(3,19,7)) { -+ gtk_style_context_get(gVertScrollbar.scroll.styleSlider, -+ gtk_style_context_get_state(gVertScrollbar.scroll.styleSlider), -+ "min-height", &metrics->min_slider_size, NULL); -+ } else { -+ metrics->min_slider_size = -+ gtk_range_get_min_slider_size(GTK_RANGE(gVertScrollbar.widget)); -+ } - - return MOZ_GTK_SUCCESS; - } -@@ -3163,7 +3405,7 @@ moz_gtk_images_in_buttons() - GtkSettings* settings; - - ensure_button_widget(); -- settings = gtk_widget_get_settings(gButtonWidget); -+ settings = gtk_widget_get_settings(gButton.widget); - - g_object_get(settings, "gtk-button-images", &result, NULL); - return result; -@@ -3191,7 +3433,7 @@ moz_gtk_widget_paint(GtkThemeWidgetType - } - ensure_button_widget(); - return moz_gtk_button_paint(cr, rect, state, -- (GtkReliefStyle) flags, gButtonWidget, -+ (GtkReliefStyle) flags, gButton.widget, - direction); - break; - case MOZ_GTK_CHECKBUTTON: -@@ -3241,7 +3483,7 @@ moz_gtk_widget_paint(GtkThemeWidgetType - case MOZ_GTK_SPINBUTTON_ENTRY: - ensure_spin_widget(); - return moz_gtk_entry_paint(cr, rect, state, -- gSpinWidget, direction); -+ &gSpin, direction); - break; - case MOZ_GTK_GRIPPER: - return moz_gtk_gripper_paint(cr, rect, state, -@@ -3268,7 +3510,7 @@ moz_gtk_widget_paint(GtkThemeWidgetType - case MOZ_GTK_ENTRY: - ensure_entry_widget(); - return moz_gtk_entry_paint(cr, rect, state, -- gEntryWidget, direction); -+ &gEntry, direction); - break; - case MOZ_GTK_DROPDOWN: - return moz_gtk_combo_box_paint(cr, rect, state, direction); -@@ -3280,7 +3522,7 @@ moz_gtk_widget_paint(GtkThemeWidgetType - case MOZ_GTK_DROPDOWN_ENTRY: - ensure_combo_box_entry_widgets(); - return moz_gtk_entry_paint(cr, rect, state, -- gComboBoxEntryTextareaWidget, direction); -+ &gComboBoxEntryTextarea, direction); - break; - case MOZ_GTK_CHECKBUTTON_CONTAINER: - case MOZ_GTK_RADIOBUTTON_CONTAINER: -@@ -3332,7 +3574,7 @@ moz_gtk_widget_paint(GtkThemeWidgetType - (GtkArrowType) flags, direction); - break; - case MOZ_GTK_MENUBAR: -- return moz_gtk_menu_bar_paint(cr, rect, direction); -+ return moz_gtk_menu_bar_paint(cr, rect, state, direction); - break; - case MOZ_GTK_MENUPOPUP: - return moz_gtk_menu_popup_paint(cr, rect, direction); -@@ -3383,7 +3625,7 @@ GtkWidget* moz_gtk_get_scrollbar_widget( - { - MOZ_ASSERT(is_initialized, "Forgot to call moz_gtk_init()"); - ensure_scrollbar_widget(); -- return gHorizScrollbarWidget; -+ return gVertScrollbar.widget; - } - - gboolean moz_gtk_has_scrollbar_buttons(void) -@@ -3391,7 +3633,7 @@ gboolean moz_gtk_has_scrollbar_buttons(v - gboolean backward, forward, secondary_backward, secondary_forward; - MOZ_ASSERT(is_initialized, "Forgot to call moz_gtk_init()"); - ensure_scrollbar_widget(); -- gtk_widget_style_get (gHorizScrollbarWidget, -+ gtk_widget_style_get (gHorizScrollbar.widget, - "has-backward-stepper", &backward, - "has-forward-stepper", &forward, - "has-secondary-backward-stepper", &secondary_backward, -@@ -3403,8 +3645,8 @@ gboolean moz_gtk_has_scrollbar_buttons(v - gint - moz_gtk_shutdown() - { -- if (gTooltipWidget) -- gtk_widget_destroy(gTooltipWidget); -+ moz_gtk_widget_free(&gTooltip); -+ - /* This will destroy all of our widgets */ - if (gProtoWindow) - gtk_widget_destroy(gProtoWindow); -@@ -3415,17 +3657,19 @@ moz_gtk_shutdown() - - gProtoWindow = NULL; - gProtoLayout = NULL; -- gButtonWidget = NULL; -+ -+ // MozWidgets -+ moz_gtk_widget_free(&gButton); - gToggleButtonWidget = NULL; - gButtonArrowWidget = NULL; -- gCheckboxWidget = NULL; -- gRadiobuttonWidget = NULL; -- gHorizScrollbarWidget = NULL; -- gVertScrollbarWidget = NULL; -- gSpinWidget = NULL; -+ moz_gtk_widget_free(&gCheckbox); -+ moz_gtk_widget_free(&gRadiobutton); -+ moz_gtk_widget_free(&gHorizScrollbar); -+ moz_gtk_widget_free(&gVertScrollbar); -+ moz_gtk_widget_free(&gSpin); - gHScaleWidget = NULL; - gVScaleWidget = NULL; -- gEntryWidget = NULL; -+ moz_gtk_widget_free(&gEntry); - gComboBoxWidget = NULL; - gComboBoxButtonWidget = NULL; - gComboBoxSeparatorWidget = NULL; -@@ -3433,14 +3677,13 @@ moz_gtk_shutdown() - gComboBoxEntryWidget = NULL; - gComboBoxEntryButtonWidget = NULL; - gComboBoxEntryArrowWidget = NULL; -- gComboBoxEntryTextareaWidget = NULL; -+ moz_gtk_widget_free(&gComboBoxEntryTextarea); - gHandleBoxWidget = NULL; - gToolbarWidget = NULL; - gStatusbarWidget = NULL; - gFrameWidget = NULL; -- gProgressWidget = NULL; -+ moz_gtk_widget_free(&gProgressBar); - gTabWidget = NULL; -- gTooltipWidget = NULL; - gMenuBarWidget = NULL; - gMenuBarItemWidget = NULL; - gMenuPopupWidget = NULL; -diff -up firefox-46.0.1/widget/gtk/gtkdrawing.h.gtk3-20 firefox-46.0.1/widget/gtk/gtkdrawing.h ---- firefox-46.0.1/widget/gtk/gtkdrawing.h.gtk3-20 2016-05-03 07:31:12.000000000 +0200 -+++ firefox-46.0.1/widget/gtk/gtkdrawing.h 2016-05-19 15:20:11.656519199 +0200 -@@ -67,6 +67,13 @@ typedef enum { - MOZ_GTK_TAB_SELECTED = 1 << 10 - } GtkTabFlags; - -+typedef struct { -+ GType type; -+ const gchar *name; -+ const gchar *class1; -+ const gchar *class2; -+} GtkCssNode; -+ - /** flags for menuitems **/ - typedef enum { - /* menuitem is part of the menubar */ -@@ -396,6 +403,9 @@ void - moz_gtk_get_arrow_size(GtkThemeWidgetType widgetType, - gint* width, gint* height); - -+gint moz_gtk_get_entry_height(gint* height); -+gint moz_gtk_get_button_height(gint* height); -+ - /** - * Get the desired size of a toolbar separator - * size: [OUT] the desired width -@@ -466,6 +476,12 @@ gboolean moz_gtk_images_in_buttons(void) - */ - gboolean moz_gtk_has_scrollbar_buttons(void); - -+ -+GtkStyleContext * -+moz_gtk_style_create(GtkCssNode *node, GtkStyleContext *parent); -+ -+ -+ - #ifdef __cplusplus - } - #endif /* __cplusplus */ -diff -up firefox-46.0.1/widget/gtk/mozgtk/mozgtk.c.gtk3-20 firefox-46.0.1/widget/gtk/mozgtk/mozgtk.c ---- firefox-46.0.1/widget/gtk/mozgtk/mozgtk.c.gtk3-20 2016-05-03 07:31:12.000000000 +0200 -+++ firefox-46.0.1/widget/gtk/mozgtk/mozgtk.c 2016-05-20 10:40:19.442320669 +0200 -@@ -504,6 +504,11 @@ STUB(gtk_window_set_type_hint) - STUB(gtk_window_set_wmclass) - STUB(gtk_window_unfullscreen) - STUB(gtk_window_unmaximize) -+STUB(gtk_widget_get_preferred_height_and_baseline_for_width) -+STUB(gtk_entry_get_text_area) -+STUB(gtk_check_menu_item_get_type) -+STUB(gtk_spin_button_get_type) -+STUB(gtk_button_get_type) - #endif - - #ifdef GTK3_SYMBOLS -@@ -581,6 +586,14 @@ STUB(gtk_color_chooser_get_type) - STUB(gtk_color_chooser_set_rgba) - STUB(gtk_color_chooser_get_rgba) - STUB(gtk_color_chooser_set_use_alpha) -+STUB(gtk_style_context_get_path) -+STUB(gtk_widget_path_copy) -+STUB(gtk_widget_path_iter_set_object_name) -+STUB(gtk_widget_path_iter_add_class) -+STUB(gtk_widget_path_iter_get_state) -+STUB(gtk_style_context_set_parent) -+STUB(gtk_widget_path_unref) -+STUB(gtk_tooltip_get_type) - #endif - - #ifdef GTK2_SYMBOLS -diff -up firefox-46.0.1/widget/gtk/nsLookAndFeel.cpp.gtk3-20 firefox-46.0.1/widget/gtk/nsLookAndFeel.cpp ---- firefox-46.0.1/widget/gtk/nsLookAndFeel.cpp.gtk3-20 2016-05-03 07:31:12.000000000 +0200 -+++ firefox-46.0.1/widget/gtk/nsLookAndFeel.cpp 2016-05-20 13:53:54.085049707 +0200 -@@ -353,14 +353,18 @@ nsLookAndFeel::NativeGetColor(ColorID aI - case eColorID_activeborder: - // active window border - gtk_style_context_get_border_color(mBackgroundStyle, -- GTK_STATE_FLAG_NORMAL, &gdk_color); -+ gtk_style_context_get_state(mBackgroundStyle), -+ &gdk_color); - aColor = GDK_RGBA_TO_NS_RGBA(gdk_color); - break; - case eColorID_inactiveborder: - // inactive window border -+ gtk_style_context_save(mBackgroundStyle); -+ gtk_style_context_set_state(mBackgroundStyle, GTK_STATE_FLAG_INSENSITIVE); - gtk_style_context_get_border_color(mBackgroundStyle, -- GTK_STATE_FLAG_INSENSITIVE, -+ gtk_style_context_get_state(mBackgroundStyle), - &gdk_color); -+ gtk_style_context_restore(mBackgroundStyle); - aColor = GDK_RGBA_TO_NS_RGBA(gdk_color); - break; - case eColorID_graytext: // disabled text in windows, menus, etc. -@@ -369,9 +373,12 @@ nsLookAndFeel::NativeGetColor(ColorID aI - break; - case eColorID_inactivecaption: - // inactive window caption -+ gtk_style_context_save(mBackgroundStyle); -+ gtk_style_context_set_state(mBackgroundStyle, GTK_STATE_FLAG_INSENSITIVE); - gtk_style_context_get_background_color(mBackgroundStyle, -- GTK_STATE_FLAG_INSENSITIVE, -+ gtk_style_context_get_state(mBackgroundStyle), - &gdk_color); -+ gtk_style_context_restore(mBackgroundStyle); - aColor = GDK_RGBA_TO_NS_RGBA(gdk_color); - break; - #endif -@@ -497,13 +504,17 @@ nsLookAndFeel::NativeGetColor(ColorID aI - case eColorID__moz_buttondefault: - // default button border color - gtk_style_context_get_border_color(mButtonStyle, -- GTK_STATE_FLAG_NORMAL, &gdk_color); -+ gtk_style_context_get_state(mButtonStyle), -+ &gdk_color); - aColor = GDK_RGBA_TO_NS_RGBA(gdk_color); - break; - case eColorID__moz_buttonhoverface: -+ gtk_style_context_save(mButtonStyle); -+ gtk_style_context_set_state(mButtonStyle, GTK_STATE_FLAG_PRELIGHT); - gtk_style_context_get_background_color(mButtonStyle, -- GTK_STATE_FLAG_PRELIGHT, -+ gtk_style_context_get_state(mButtonStyle), - &gdk_color); -+ gtk_style_context_restore(mButtonStyle); - aColor = GDK_RGBA_TO_NS_RGBA(gdk_color); - break; - case eColorID__moz_buttonhovertext: -@@ -1110,27 +1126,29 @@ nsLookAndFeel::Init() - style = create_context(path); - gtk_style_context_add_class(style, GTK_STYLE_CLASS_SCROLLBAR); - gtk_style_context_add_class(style, GTK_STYLE_CLASS_TROUGH); -- gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); -+ gtk_style_context_get_background_color(style, gtk_style_context_get_state(style), &color); - sMozScrollbar = GDK_RGBA_TO_NS_RGBA(color); - g_object_unref(style); - - // Window colors - style = create_context(path); -- gtk_style_context_save(style); - gtk_style_context_add_class(style, GTK_STYLE_CLASS_BACKGROUND); -- gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); -+ gtk_style_context_get_background_color(style, gtk_style_context_get_state(style), &color); - sMozWindowBackground = GDK_RGBA_TO_NS_RGBA(color); -- gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); -+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); - sMozWindowText = GDK_RGBA_TO_NS_RGBA(color); -- gtk_style_context_restore(style); -+ g_object_unref(style); - - // tooltip foreground and background -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_TOOLTIP); -+ GtkCssNode tooltipPath[] = { -+ { GTK_TYPE_TOOLTIP, "tooltip", NULL, NULL}, -+ }; -+ style = moz_gtk_style_create(tooltipPath, NULL); -+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); -+ sInfoText = GDK_RGBA_TO_NS_RGBA(color); - gtk_style_context_add_class(style, GTK_STYLE_CLASS_BACKGROUND); -- gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); -+ gtk_style_context_get_background_color(style, gtk_style_context_get_state(style), &color); - sInfoBackground = GDK_RGBA_TO_NS_RGBA(color); -- gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); -- sInfoText = GDK_RGBA_TO_NS_RGBA(color); - g_object_unref(style); - - // menu foreground & menu background -@@ -1144,20 +1162,26 @@ nsLookAndFeel::Init() - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - - style = gtk_widget_get_style_context(accel_label); -- gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); -+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); - sMenuText = GDK_RGBA_TO_NS_RGBA(color); -- gtk_style_context_get_color(style, GTK_STATE_FLAG_INSENSITIVE, &color); -+ gtk_style_context_save(style); -+ gtk_style_context_set_state(style, GTK_STATE_FLAG_INSENSITIVE); -+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); - sMenuTextInactive = GDK_RGBA_TO_NS_RGBA(color); -+ gtk_style_context_restore(style); - - style = gtk_widget_get_style_context(menu); -- gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); -+ gtk_style_context_get_background_color(style, gtk_style_context_get_state(style), &color); - sMenuBackground = GDK_RGBA_TO_NS_RGBA(color); - - style = gtk_widget_get_style_context(menuitem); -- gtk_style_context_get_background_color(style, GTK_STATE_FLAG_PRELIGHT, &color); -+ gtk_style_context_save(style); -+ gtk_style_context_set_state(style, GTK_STATE_FLAG_PRELIGHT); -+ gtk_style_context_get_background_color(style, gtk_style_context_get_state(style), &color); - sMenuHover = GDK_RGBA_TO_NS_RGBA(color); -- gtk_style_context_get_color(style, GTK_STATE_FLAG_PRELIGHT, &color); -+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); - sMenuHoverText = GDK_RGBA_TO_NS_RGBA(color); -+ gtk_style_context_restore(style); - - g_object_unref(menu); - #endif -@@ -1266,44 +1290,54 @@ nsLookAndFeel::Init() - GDK_COLOR_TO_NS_RGB(style->dark[GTK_STATE_NORMAL]); - } - #else -+ GtkCssNode labelPath[] = { -+ { GTK_TYPE_LABEL, "label", "view", NULL }, -+ { G_TYPE_NONE, "selection", NULL, NULL } -+ }; -+ -+ GtkStyleContext *styleLabel; -+ GtkStyleContext *styleSelection; -+ GtkBorder padding; -+ - // Text colors -- style = gtk_widget_get_style_context(textView); -- gtk_style_context_save(style); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_VIEW); -- gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); -+ styleLabel = moz_gtk_style_create(labelPath, NULL); -+ styleSelection = moz_gtk_style_create(labelPath+1, styleLabel); -+ -+ gtk_style_context_get_background_color(styleLabel, gtk_style_context_get_state(styleLabel), &color); - sMozFieldBackground = GDK_RGBA_TO_NS_RGBA(color); -- gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); -+ gtk_style_context_get_color(styleLabel, gtk_style_context_get_state(styleLabel), &color); - sMozFieldText = GDK_RGBA_TO_NS_RGBA(color); - - // Selected text and background -- gtk_style_context_get_background_color(style, -- static_cast(GTK_STATE_FLAG_FOCUSED|GTK_STATE_FLAG_SELECTED), -- &color); -+ gtk_style_context_get_background_color(styleSelection, gtk_style_context_get_state(styleSelection), &color); - sTextSelectedBackground = GDK_RGBA_TO_NS_RGBA(color); -- gtk_style_context_get_color(style, -- static_cast(GTK_STATE_FLAG_FOCUSED|GTK_STATE_FLAG_SELECTED), -- &color); -+ gtk_style_context_get_color(styleSelection, gtk_style_context_get_state(styleSelection), &color); - sTextSelectedText = GDK_RGBA_TO_NS_RGBA(color); -- gtk_style_context_restore(style); - - // Button text, background, border - style = gtk_widget_get_style_context(label); -- gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); -+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); - sButtonText = GDK_RGBA_TO_NS_RGBA(color); -- gtk_style_context_get_color(style, GTK_STATE_FLAG_PRELIGHT, &color); -+ gtk_style_context_save(style); -+ gtk_style_context_set_state(style, GTK_STATE_FLAG_PRELIGHT); -+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); - sButtonHoverText = GDK_RGBA_TO_NS_RGBA(color); -+ gtk_style_context_restore(style); - - // Combobox text color - style = gtk_widget_get_style_context(comboboxLabel); -- gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); -+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); - sComboBoxText = GDK_RGBA_TO_NS_RGBA(color); - - // Menubar text and hover text colors - style = gtk_widget_get_style_context(menuBar); -- gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); -+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); - sMenuBarText = GDK_RGBA_TO_NS_RGBA(color); -- gtk_style_context_get_color(style, GTK_STATE_FLAG_PRELIGHT, &color); -+ gtk_style_context_save(style); -+ gtk_style_context_set_state(style, GTK_STATE_FLAG_PRELIGHT); -+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); - sMenuBarHoverText = GDK_RGBA_TO_NS_RGBA(color); -+ gtk_style_context_restore(style); - - // GTK's guide to fancy odd row background colors: - // 1) Check if a theme explicitly defines an odd row color -@@ -1316,7 +1350,7 @@ nsLookAndFeel::Init() - // Get odd row background color - gtk_style_context_save(style); - gtk_style_context_add_region(style, GTK_STYLE_REGION_ROW, GTK_REGION_ODD); -- gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); -+ gtk_style_context_get_background_color(style, gtk_style_context_get_state(style), &color); - sOddCellBackground = GDK_RGBA_TO_NS_RGBA(color); - gtk_style_context_restore(style); - -@@ -1334,9 +1368,11 @@ nsLookAndFeel::Init() - gtk_container_add(GTK_CONTAINER(parent), infoBar); - gtk_container_add(GTK_CONTAINER(infoBarContent), infoBarLabel); - style = gtk_widget_get_style_context(infoBarLabel); -+ gtk_style_context_save(style); - gtk_style_context_add_class(style, GTK_STYLE_CLASS_INFO); -- gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); -+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); - sInfoBarText = GDK_RGBA_TO_NS_RGBA(color); -+ gtk_style_context_restore(style); - #endif - // Some themes have a unified menu bar, and support window dragging on it - gboolean supports_menubar_drag = FALSE; -diff -up firefox-46.0.1/widget/gtk/nsNativeThemeGTK.cpp.gtk3-20 firefox-46.0.1/widget/gtk/nsNativeThemeGTK.cpp ---- firefox-46.0.1/widget/gtk/nsNativeThemeGTK.cpp.gtk3-20 2016-05-03 07:31:12.000000000 +0200 -+++ firefox-46.0.1/widget/gtk/nsNativeThemeGTK.cpp 2016-05-19 15:20:11.658519202 +0200 -@@ -1567,9 +1567,6 @@ nsNativeThemeGTK::GetMinimumWidgetSize(n - case NS_THEME_RADIO_CONTAINER: - case NS_THEME_CHECKBOX_LABEL: - case NS_THEME_RADIO_LABEL: -- case NS_THEME_BUTTON: -- case NS_THEME_DROPDOWN: -- case NS_THEME_TOOLBAR_BUTTON: - case NS_THEME_TREEVIEW_HEADER_CELL: - { - if (aWidgetType == NS_THEME_DROPDOWN) { -@@ -1588,6 +1585,21 @@ nsNativeThemeGTK::GetMinimumWidgetSize(n - aResult->height += border.top + border.bottom; - } - break; -+ case NS_THEME_BUTTON: -+ case NS_THEME_DROPDOWN: -+ case NS_THEME_TOOLBAR_BUTTON: -+ { -+ moz_gtk_get_button_height(&aResult->height); -+ } -+ break; -+ case NS_THEME_FOCUS_OUTLINE: -+ case NS_THEME_NUMBER_INPUT: -+ case NS_THEME_TEXTFIELD: -+ case NS_THEME_TEXTFIELD_MULTILINE: -+ { -+ moz_gtk_get_entry_height(&aResult->height); -+ } -+ break; - case NS_THEME_TOOLBAR_SEPARATOR: - { - gint separator_width; diff --git a/network/web/firefox/files/icu58.patch b/network/web/firefox/files/icu58.patch deleted file mode 100644 index f8683c8c0c..0000000000 --- a/network/web/firefox/files/icu58.patch +++ /dev/null @@ -1,60 +0,0 @@ -diff -Nuar a/build/autoconf/icu.m4 b/build/autoconf/icu.m4 ---- a/build/autoconf/icu.m4 2017-09-14 23:15:53.000000000 +0300 -+++ b/build/autoconf/icu.m4 2018-01-19 18:45:55.713445653 +0300 -@@ -15,7 +15,7 @@ - MOZ_SYSTEM_ICU=1) - - if test -n "$MOZ_SYSTEM_ICU"; then -- PKG_CHECK_MODULES(MOZ_ICU, icu-i18n >= 59.1) -+ PKG_CHECK_MODULES(MOZ_ICU, icu-i18n >= 58.2) - CFLAGS="$CFLAGS $MOZ_ICU_CFLAGS" - CXXFLAGS="$CXXFLAGS $MOZ_ICU_CFLAGS" - fi -diff -Nuar a/old-configure b/old-configure ---- a/old-configure 2018-01-19 02:55:53.000000000 +0300 -+++ b/old-configure 2018-01-19 18:45:13.792448678 +0300 -@@ -17589,29 +17589,29 @@ - else - PKG_CONFIG_MIN_VERSION=0.9.0 - if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then -- echo $ac_n "checking for icu-i18n >= 59.1""... $ac_c" 1>&6 --echo "configure:17594: checking for icu-i18n >= 59.1" >&5 -+ echo $ac_n "checking for icu-i18n >= 58.2""... $ac_c" 1>&6 -+echo "configure:17594: checking for icu-i18n >= 58.2" >&5 - -- if $PKG_CONFIG --exists "icu-i18n >= 59.1" ; then -+ if $PKG_CONFIG --exists "icu-i18n >= 58.2" ; then - echo "$ac_t""yes" 1>&6 - succeeded=yes - - echo $ac_n "checking MOZ_ICU_CFLAGS""... $ac_c" 1>&6 - echo "configure:17601: checking MOZ_ICU_CFLAGS" >&5 -- MOZ_ICU_CFLAGS=`$PKG_CONFIG --cflags "icu-i18n >= 59.1"` -+ MOZ_ICU_CFLAGS=`$PKG_CONFIG --cflags "icu-i18n >= 58.2"` - echo "$ac_t""$MOZ_ICU_CFLAGS" 1>&6 - - echo $ac_n "checking MOZ_ICU_LIBS""... $ac_c" 1>&6 - echo "configure:17606: checking MOZ_ICU_LIBS" >&5 - ## Remove evil flags like -Wl,--export-dynamic -- MOZ_ICU_LIBS="`$PKG_CONFIG --libs \"icu-i18n >= 59.1\" |sed s/-Wl,--export-dynamic//g`" -+ MOZ_ICU_LIBS="`$PKG_CONFIG --libs \"icu-i18n >= 58.2\" |sed s/-Wl,--export-dynamic//g`" - echo "$ac_t""$MOZ_ICU_LIBS" 1>&6 - else - MOZ_ICU_CFLAGS="" - MOZ_ICU_LIBS="" - ## If we have a custom action on failure, don't print errors, but - ## do set a variable so people can do so. -- MOZ_ICU_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "icu-i18n >= 59.1"` -+ MOZ_ICU_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "icu-i18n >= 58.2"` - echo $MOZ_ICU_PKG_ERRORS - fi - -@@ -17627,7 +17627,7 @@ - : - else - if test "$COMPILE_ENVIRONMENT"; then -- { echo "configure: error: Library requirements (icu-i18n >= 59.1) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them." 1>&2; echo "configure: error: Library requirements (icu-i18n >= 59.1) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them." 1>&5; exit 1; } -+ { echo "configure: error: Library requirements (icu-i18n >= 58.2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them." 1>&2; echo "configure: error: Library requirements (icu-i18n >= 58.2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them." 1>&5; exit 1; } - fi - fi - diff --git a/network/web/firefox/files/llvmversyon.patch b/network/web/firefox/files/llvmversyon.patch deleted file mode 100644 index bbac4847dc..0000000000 --- a/network/web/firefox/files/llvmversyon.patch +++ /dev/null @@ -1,33 +0,0 @@ -diff -Nuar a/toolkit/moz.configure b/toolkit/moz.configure ---- a/toolkit/moz.configure 2017-11-16 13:38:11.571875852 +0300 -+++ b/toolkit/moz.configure 2017-11-16 13:35:29.679887533 +0300 -@@ -618,7 +618,7 @@ - @imports('os') - @imports('subprocess') - def llvm_config_paths(host): -- llvm_supported_versions = ['6.0', '5.0', '4.0', '3.9'] -+ llvm_supported_versions = ['6.0', '5.0', '4.0', '3.9', '3.8'] - llvm_config_progs = [] - for version in llvm_supported_versions: - llvm_config_progs += [ -@@ -662,9 +662,9 @@ - - with only_when(building_stylo_bindgen): - option('--with-libclang-path', nargs=1, -- help='Absolute path to a directory containing Clang/LLVM libraries for Stylo (version 3.9.x or above)') -+ help='Absolute path to a directory containing Clang/LLVM libraries for Stylo (version 3.8.x or above)') - option('--with-clang-path', nargs=1, -- help='Absolute path to a Clang binary for Stylo bindgen (version 3.9.x or above)') -+ help='Absolute path to a Clang binary for Stylo bindgen (version 3.8.x or above)') - - def invoke_llvm_config(llvm_config, *options): - '''Invoke llvm_config with the given options and return the first line of -@@ -675,7 +675,7 @@ - @imports(_from='textwrap', _import='dedent') - def check_minimum_llvm_config_version(llvm_config): - version = Version(invoke_llvm_config(llvm_config, '--version')) -- min_version = Version('3.9.0') -+ min_version = Version('3.8.0') - if version < min_version: - die(dedent('''\ - llvm installation {} is incompatible with Stylo bindgen. diff --git a/network/web/firefox/files/rhbz-966424.patch b/network/web/firefox/files/rhbz-966424.patch deleted file mode 100644 index c4c332e9e7..0000000000 --- a/network/web/firefox/files/rhbz-966424.patch +++ /dev/null @@ -1,23 +0,0 @@ ---- a/toolkit/modules/CertUtils.jsm -+++ b/toolkit/modules/CertUtils.jsm -@@ -170,17 +170,19 @@ this.checkCert = - issuerCert = issuerCert.QueryInterface(Ci.nsIX509Cert3); - var tokenNames = issuerCert.getAllTokenNames({}); - - if (!tokenNames || !tokenNames.some(isBuiltinToken)) - throw new Ce(certNotBuiltInErr, Cr.NS_ERROR_ABORT); - } - - function isBuiltinToken(tokenName) { -- return tokenName == "Builtin Object Token"; -+ return tokenName == "Builtin Object Token" || -+ tokenName == "Default Trust" || -+ tokenName == "System Trust"; - } - - /** - * This class implements nsIBadCertListener. Its job is to prevent "bad cert" - * security dialogs from being shown to the user. It is better to simply fail - * if the certificate is bad. See bug 304286. - * - * @param aAllowNonBuiltInCerts (optional) diff --git a/network/web/firefox/files/rustc.patch b/network/web/firefox/files/rustc.patch deleted file mode 100644 index f55baa8541..0000000000 --- a/network/web/firefox/files/rustc.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/build/moz.configure/rust.configure b/build/moz.configure/rust.configure ---- a/build/moz.configure/rust.configure 2018-01-11 23:16:54.000000000 +0300 -+++ b/build/moz.configure/rust.configure 2018-01-20 11:41:47.109584234 +0300 -@@ -58,7 +58,7 @@ - You can install rust by running './mach bootstrap' - or by directly running the installer from https://rustup.rs/ - ''')) -- rustc_min_version = Version('1.21.0') -+ rustc_min_version = Version('1.20.0') - cargo_min_version = Version('0.{}'.format(rustc_min_version.minor + 1)) - - version = rustc_info.version diff --git a/network/web/firefox/files/sed43.patch b/network/web/firefox/files/sed43.patch deleted file mode 100644 index c18048b0a8..0000000000 --- a/network/web/firefox/files/sed43.patch +++ /dev/null @@ -1,21 +0,0 @@ ---- a/build/autoconf/icu.m4 -+++ b/build/autoconf/icu.m4 -@@ -64,17 +64,17 @@ if test -n "$USE_ICU"; then - icudir="$_topsrcdir/intl/icu/source" - if test ! -d "$icudir"; then - icudir="$_topsrcdir/../../intl/icu/source" - if test ! -d "$icudir"; then - AC_MSG_ERROR([Cannot find the ICU directory]) - fi - fi - -- version=`sed -n 's/^[[:space:]]*#[[:space:]]*define[[:space:]][[:space:]]*U_ICU_VERSION_MAJOR_NUM[[:space:]][[:space:]]*\([0-9][0-9]*\)[[:space:]]*$/\1/p' "$icudir/common/unicode/uvernum.h"` -+ version=`sed -n 's/^[[[:space:]]]*#[[:space:]]*define[[:space:]][[:space:]]*U_ICU_VERSION_MAJOR_NUM[[:space:]][[:space:]]*\([0-9][0-9]*\)[[:space:]]*$/\1/p' "$icudir/common/unicode/uvernum.h"` - if test x"$version" = x; then - AC_MSG_ERROR([cannot determine icu version number from uvernum.h header file $lineno]) - fi - MOZ_ICU_VERSION="$version" - - # TODO: the l is actually endian-dependent - # We could make this set as 'l' or 'b' for little or big, respectively, - # but we'd need to check in a big-endian version of the file. diff --git a/network/web/firefox/pspec.xml b/network/web/firefox/pspec.xml index 8017fde45f..2ff759827c 100644 --- a/network/web/firefox/pspec.xml +++ b/network/web/firefox/pspec.xml @@ -15,7 +15,7 @@ app:gui Firefox Web Browser It is more secure and faster to browse the web with Firefox web browser. You can personalize your web browser with many specifications that is not enough to explain in two sentences. - https://ftp.mozilla.org/pub/firefox/releases/95.0.1/source/firefox-95.0.1.source.tar.xz + https://ftp.mozilla.org/pub/firefox/releases/96.0/source/firefox-96.0.source.tar.xz @@ -74,7 +74,7 @@ util-linux - 0002-Bug-1745560-Add-missing-stub-for-wl_proxy_marshal_fl.patch + @@ -558,6 +558,13 @@ + + 2022-01-10 + 96.0 + Version bump. + Mustafa Cinasal + muscnsl@gmail.com + 2021-12-16 95.0.1