Ravenports generated: 28 Dec 2020 06:48
[ravenports.git] / bucket_67 / thunderbird
1 # Buildsheet autogenerated by ravenadm tool -- Do not edit.
2
3 NAMEBASE=               thunderbird
4 VERSION=                78.6.0
5 KEYWORDS=               mail net_im news
6 VARIANTS=               standard
7 SDESC[standard]=        Mozilla Thunderbird mail/newsgroup client
8 HOMEPAGE=               https://www.thunderbird.net/
9 CONTACT=                nobody
10
11 DOWNLOAD_GROUPS=        main
12 SITES[main]=            MOZILLA/thunderbird/releases/78.6.0/source
13 DISTFILE[1]=            thunderbird-78.6.0.source.tar.xz:main
14 DF_INDEX=               1
15 SPKGS[standard]=        single
16
17 OPTIONS_AVAILABLE=      none
18 OPTIONS_STANDARD=       none
19
20 BUILD_DEPENDS=          rust:single:standard
21                         cbindgen:single:standard
22                         autoconf213:single:standard
23                         yasm:single:standard
24                         nasm:primary:standard
25                         zip:single:standard
26                         bzip2:static:standard
27                         nodejs:primary:standard
28                         libvpx:single:standard
29                         clang:compiler:standard
30                         evdev-proto:single:standard
31                         autoselect-python:single:standard
32                         python-sqlite3:single:python_used
33 BUILDRUN_DEPENDS=       nss:primary:standard
34                         icu:single:standard
35                         libffi:single:standard
36                         libproxy:single:standard
37                         libevent:single:standard
38                         libcanberra:primary:standard
39                         libnotify:primary:standard
40                         harfbuzz:primary:standard
41                         aom:single:standard
42                         WebP:single:standard
43                         dav1d:single:standard
44                         bzip2:shared:standard
45                         ffmpeg:primary:standard
46                         dbus-glib:primary:standard
47                         startup-notification:single:standard
48
49 USES=                   cpe desktop-utils:single gmake jpeg png zlib
50                         perl:build pkgconfig iconv python:build
51                         gettext-runtime
52 GNOME_COMPONENTS=       gconf gtk2 gtk3 gdkpixbuf pango
53 XORG_COMPONENTS=        x11 xcb xcomposite xdamage xext xfixes xrender xt
54                         pixman
55
56 LICENSE=                MPL:single
57 LICENSE_TERMS=          single:{{WRKSRC}}/toolkit/content/license.html
58 LICENSE_FILE=           MPL:stock
59 LICENSE_SCHEME=         solo
60
61 CPE_VENDOR=             mozilla
62 FPC_EQUIVALENT=         mail/thunderbird
63
64 MUST_CONFIGURE=         yes
65 CONFIGURE_OUTSOURCE=    yes
66 CONFIGURE_ENV=          PYTHON3={{PYTHON_CMD}}
67                         SETUPTOOLS_USE_DISTUTILS=stdlib
68
69 MAKE_ENV=               PYTHON3={{PYTHON_CMD}}
70                         CXXSTDLIB="stdc++"
71
72 QMAKE_ARGS=             --prefix="{{PREFIX}}"
73                         --with-system-nss
74                         --with-system-nspr
75                         --with-system-zlib
76                         --with-system-icu
77                         --with-system-png="{{LOCALBASE}}"
78                         --with-system-jpeg="{{LOCALBASE}}"
79                         --with-system-libevent
80                         --with-system-harfbuzz
81                         --with-system-graphite2
82                         --with-system-av1
83                         --with-system-webp
84                         --enable-system-ffi
85                         --enable-system-pixman
86                         --enable-install-strip
87                         --enable-strip
88                         --enable-calendar
89                         --enable-libproxy
90                         --enable-release
91                         --enable-optimize
92                         --enable-official-branding
93                         --enable-application=comm/mail
94                         --enable-update-channel=release
95                         --enable-rust-simd
96                         --with-intl-api
97                         --disable-alsa
98                         --disable-debug
99                         --disable-debug-symbols
100                         --disable-dtrace
101                         --disable-jack
102                         --disable-webrtc
103                         --disable-profiling
104                         --disable-pulseaudio
105                         --disable-tests
106                         --disable-updater
107                         --disable-hardening
108 VAR_OPSYS[linux]=       QMAKE_ARGS=--disable-elf-hack
109
110 post-patch:
111         ${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|g' \
112                 ${WRKSRC}/comm/mail/app/nsMailApp.cpp \
113                 ${WRKSRC}/browser/app/nsBrowserApp.cpp
114         (cd ${WRKSRC}/gfx/angle/checkout/src/compiler/translator && \
115                 ${REINPLACE_CMD} -e 's|<math.h>|<cmath>|' \
116                 InfoSink.h IntermNode.cpp)
117         # disable SCTP
118         ${REINPLACE_CMD} -e 's|MOZ_SCTP|MOZ_DISABLE_SCTP|' \
119                 ${WRKSRC}/netwerk/moz.build
120         # alsa headers use 'u_int32_t' and other BerkeleyDB/nvi
121         # fixed types (_XOPEN_SOURCE)
122         ${REINPLACE_CMD} -e 's@_XOPEN_SOURCE@&___@g' \
123                 ${WRKSRC}/media/libcubeb/src/cubeb_alsa.c
124         ${REINPLACE_CMD} -e 's@_POSIX_SOURCE@&___@g' \
125                 ${WRKSRC}/media/libcubeb/src/cubeb_jack.cpp
126         # Set mozilla options
127         @${ECHO_CMD} "--=> Setting configuration <=--"
128         @for arg in ${QMAKE_ARGS}; do \
129                 ${ECHO_CMD} ".mozconfig <<  $$arg" ;\
130                 ${ECHO_CMD} ac_add_options $$arg >> ${WRKSRC}/.mozconfig ;\
131         done
132         @${ECHO_CMD} LDFLAGS=\"-Wl,-rpath,${PREFIX}/lib/thunderbird\" \
133                 >> ${WRKSRC}/.mozconfig
134         # temporary
135         ${MV} ${WRKSRC}/third_party/rust/packed_simd/readme.md \
136               ${WRKSRC}/third_party/rust/packed_simd/README.md
137
138 post-patch-dragonfly:
139         ${REINPLACE_CMD} -e '/<malloc.h>/d' \
140                 ${WRKSRC}/comm/ldap/c-sdk/libraries/liblber/lber-int.h
141
142 post-install:
143         ${MKDIR} ${STAGEDIR}${PREFIX}/share/applications
144         ${MKDIR} ${STAGEDIR}${PREFIX}/share/pixmaps
145         ${INSTALL_DATA} ${FILESDIR}/thunderbird.desktop \
146                 ${STAGEDIR}${PREFIX}/share/applications
147         (cd ${STAGEDIR}${PREFIX}/share/pixmaps && ${LN} -sf \
148                 ../../lib/thunderbird/chrome/icons/default/default48.png \
149                 thunderbird.png)
150         # regenerate symlink to avoid absolute paths
151         ${RM} ${STAGEDIR}${PREFIX}/bin/thunderbird
152         (cd ${STAGEDIR}${PREFIX}/bin && \
153                 ${LN} -sf ../lib/thunderbird/thunderbird thunderbird)
154
155 pre-configure:
156         (cd ${WRKSRC} && ${LOCALBASE}/bin/autoconf-2.13)
157         (cd ${WRKSRC}/js/src/ && ${LOCALBASE}/bin/autoconf-2.13)
158
159 [FILE:391:descriptions/desc.single]
160 Thunderbird is a free and open source email, newsfeed, chat, and
161 calendaring client, that's easy to set up and customize. One of the core
162 principles of Thunderbird is the use and promotion of open standards -
163 this focus is a rejection of our world of closed platforms and services
164 that can't communicate with each other. We want our users to have
165 freedom and choice in how they communicate.
166
167
168 [FILE:111:distinfo]
169 1dd6f9a4d88b4c3d0ec47bba60a891243ef95e105a9045b2d32e2b126779844b    353496712 thunderbird-78.6.0.source.tar.xz
170
171
172 [FILE:949:manifests/plist.single]
173 bin/thunderbird
174 lib/thunderbird/
175  application.ini
176  dependentlibs.list
177  libldap60.so
178  libldif60.so
179  liblgpllibs.so
180  libmozgtk.so
181  libmozsqlite3.so
182  libprldap60.so
183  librnp.so
184  libxul.so
185  omni.ja
186  pingsender
187  platform.ini
188  plugin-container
189  removed-files
190  thunderbird
191  thunderbird-bin
192 lib/thunderbird/chrome/icons/default/
193  calendar-alarm-dialog.png
194  calendar-event-dialog.png
195  calendar-event-summary-dialog.png
196  calendar-task-dialog.png
197  calendar-task-summary-dialog.png
198  default128.png
199  default16.png
200  default22.png
201  default24.png
202  default256.png
203  default32.png
204  default48.png
205  default64.png
206 lib/thunderbird/defaults/messenger/mailViews.dat
207 lib/thunderbird/defaults/pref/channel-prefs.js
208 lib/thunderbird/features/wetransfer@extensions.thunderbird.net.xpi
209 lib/thunderbird/gtk2/libmozgtk.so
210 lib/thunderbird/isp/
211  Bogofilter.sfd
212  DSPAM.sfd
213  POPFile.sfd
214  SpamAssassin.sfd
215  SpamPal.sfd
216 share/applications/thunderbird.desktop
217 share/pixmaps/thunderbird.png
218
219
220 [FILE:5540:patches/patch-addon-search]
221 https://github.com/mozilla/addons/issues/708
222 https://github.com/mozilla/addons-frontend/issues/4610
223
224 diff --git mail/app/profile/all-thunderbird.js mail/app/profile/all-thunderbird.js
225 index 75c2c5e435e35..4d8c09c02759b 100644
226 --- comm/mail/app/profile/all-thunderbird.js
227 +++ comm/mail/app/profile/all-thunderbird.js
228 @@ -153,10 +153,10 @@ pref("extensions.getAddons.maxResults", 15);
229  pref("extensions.getAddons.get.url", "https://services.addons.thunderbird.net/api/v3/addons/search/?guid=%IDS%&lang=%LOCALE%");
230  pref("extensions.getAddons.compatOverides.url", "https://services.addons.thunderbird.net/api/v3/addons/compat-override/?guid=%IDS%&lang=%LOCALE%");
231  pref("extensions.getAddons.link.url", "https://addons.thunderbird.net/%LOCALE%/%APP%/");
232 -pref("extensions.getAddons.recommended.url", "https://services.addons.thunderbird.net/%LOCALE%/%APP%/api/%API_VERSION%/list/recommended/all/%MAX_RESULTS%/%OS%/%VERSION%?src=thunderbird");
233 +pref("extensions.getAddons.recommended.url", "https://services.addons.thunderbird.net/%LOCALE%/%APP%/api/%API_VERSION%/list/recommended/all/%MAX_RESULTS%/Linux/%VERSION%?src=thunderbird");
234  pref("extensions.getAddons.search.browseURL", "https://addons.thunderbird.net/%LOCALE%/%APP%/search/?q=%TERMS%");
235 -pref("extensions.getAddons.search.url", "https://services.addons.thunderbird.net/%LOCALE%/%APP%/api/%API_VERSION%/search/%TERMS%/all/%MAX_RESULTS%/%OS%/%VERSION%/%COMPATIBILITY_MODE%?src=thunderbird");
236 -pref("extensions.webservice.discoverURL", "https://services.addons.thunderbird.net/%LOCALE%/%APP%/discovery/pane/%VERSION%/%OS%");
237 +pref("extensions.getAddons.search.url", "https://services.addons.thunderbird.net/%LOCALE%/%APP%/api/%API_VERSION%/search/%TERMS%/all/%MAX_RESULTS%/Linux/%VERSION%/%COMPATIBILITY_MODE%?src=thunderbird");
238 +pref("extensions.webservice.discoverURL", "https://services.addons.thunderbird.net/%LOCALE%/%APP%/discovery/pane/%VERSION%/Linux");
239  pref("extensions.getAddons.siteRegExp", "^https://.*addons\\.thunderbird\\.net");
240  pref("extensions.getAddons.langpacks.url", "https://services.addons.thunderbird.net/api/v3/addons/language-tools/?app=thunderbird&type=language&appversion=%VERSION%");
241  
242 @@ -180,9 +180,9 @@ pref("security.cert_pinning.enforcement_level", 1);
243  //  .. etc ..
244  //
245  pref("extensions.update.enabled", true);
246 -pref("extensions.update.url", "https://versioncheck.addons.thunderbird.net/update/VersionCheck.php?reqVersion=%REQ_VERSION%&id=%ITEM_ID%&version=%ITEM_VERSION%&maxAppVersion=%ITEM_MAXAPPVERSION%&status=%ITEM_STATUS%&appID=%APP_ID%&appVersion=%APP_VERSION%&appOS=%APP_OS%&appABI=%APP_ABI%&locale=%APP_LOCALE%&currentAppVersion=%CURRENT_APP_VERSION%&updateType=%UPDATE_TYPE%&compatMode=%COMPATIBILITY_MODE%");
247 +pref("extensions.update.url", "https://versioncheck.addons.thunderbird.net/update/VersionCheck.php?reqVersion=%REQ_VERSION%&id=%ITEM_ID%&version=%ITEM_VERSION%&maxAppVersion=%ITEM_MAXAPPVERSION%&status=%ITEM_STATUS%&appID=%APP_ID%&appVersion=%APP_VERSION%&appOS=Linux&appABI=%APP_ABI%&locale=%APP_LOCALE%&currentAppVersion=%CURRENT_APP_VERSION%&updateType=%UPDATE_TYPE%&compatMode=%COMPATIBILITY_MODE%");
248  
249 -pref("extensions.update.background.url", "https://versioncheck-bg.addons.thunderbird.net/update/VersionCheck.php?reqVersion=%REQ_VERSION%&id=%ITEM_ID%&version=%ITEM_VERSION%&maxAppVersion=%ITEM_MAXAPPVERSION%&status=%ITEM_STATUS%&appID=%APP_ID%&appVersion=%APP_VERSION%&appOS=%APP_OS%&appABI=%APP_ABI%&locale=%APP_LOCALE%&currentAppVersion=%CURRENT_APP_VERSION%&updateType=%UPDATE_TYPE%&compatMode=%COMPATIBILITY_MODE%");
250 +pref("extensions.update.background.url", "https://versioncheck-bg.addons.thunderbird.net/update/VersionCheck.php?reqVersion=%REQ_VERSION%&id=%ITEM_ID%&version=%ITEM_VERSION%&maxAppVersion=%ITEM_MAXAPPVERSION%&status=%ITEM_STATUS%&appID=%APP_ID%&appVersion=%APP_VERSION%&appOS=Linux&appABI=%APP_ABI%&locale=%APP_LOCALE%&currentAppVersion=%CURRENT_APP_VERSION%&updateType=%UPDATE_TYPE%&compatMode=%COMPATIBILITY_MODE%");
251  
252  pref("extensions.update.interval", 86400);  // Check for updates to Extensions and
253                                              // Themes every day
254 diff --git toolkit/mozapps/extensions/internal/AddonRepository.jsm toolkit/mozapps/extensions/internal/AddonRepository.jsm
255 index f70fd8d7e3bd8..81e8cd7764fdf 100644
256 --- toolkit/mozapps/extensions/internal/AddonRepository.jsm
257 +++ toolkit/mozapps/extensions/internal/AddonRepository.jsm
258 @@ -602,7 +602,7 @@ var AddonRepository = {
259        addon.version = String(aEntry.current_version.version);
260        if (Array.isArray(aEntry.current_version.files)) {
261          for (let file of aEntry.current_version.files) {
262 -          if (file.platform == "all" || file.platform == PLATFORM) {
263 +          if (file.platform == "all" || file.platform == "linux" || file.platform == PLATFORM) {
264              if (file.url) {
265                addon.sourceURI = NetUtil.newURI(file.url);
266              }
267 diff --git toolkit/mozapps/extensions/internal/XPIDatabase.jsm toolkit/mozapps/extensions/internal/XPIDatabase.jsm
268 index f70fd8d7e3bd8..81e8cd7764fdf 100644
269 --- toolkit/mozapps/extensions/internal/XPIDatabase.jsm
270 +++ toolkit/mozapps/extensions/internal/XPIDatabase.jsm
271 @@ -355,7 +355,7 @@ class AddonInternal {
272      // Something is causing errors in here
273      try {
274        for (let platform of this.targetPlatforms) {
275 -        if (platform.os == Services.appinfo.OS) {
276 +        if (platform.os == "Linux" || platform.os == Services.appinfo.OS) {
277            if (platform.abi) {
278              needsABI = true;
279              if (platform.abi === abi)
280
281
282 [FILE:445:patches/patch-browser-app-nsBrowserApp.cpp]
283 --- browser/app/nsBrowserApp.cpp.orig   2016-09-19 16:19:28 UTC
284 +++ browser/app/nsBrowserApp.cpp
285 @@ -324,6 +324,9 @@ int main(int argc, char* argv[], char* e
286  {
287    mozilla::TimeStamp start = mozilla::TimeStamp::Now();
288  
289 +  setenv("MOZ_GMP_PATH", "%%LOCALBASE%%/lib/browser_plugins/symlinks/gecko", 0);
290 +  setenv("MOZ_PLUGIN_PATH", "%%LOCALBASE%%/lib/browser_plugins/symlinks/gecko", 0);
291 +
292  #ifdef HAS_DLL_BLOCKLIST
293    DllBlocklist_Initialize();
294  
295
296
297 [FILE:1800:patches/patch-bug1288587]
298 diff --git a/build/moz.configure/init.configure b/build/moz.configure/init.configure
299 index 855214a..1e91d51 100644
300 --- build/moz.configure/init.configure
301 +++ build/moz.configure/init.configure
302 @@ -251,6 +251,7 @@ option(env='PYTHON3', nargs=1, help='Python 3 interpre
303  @imports(_from='mozbuild.pythonutil', _import='find_python3_executable')
304  @imports(_from='mozbuild.pythonutil', _import='python_executable_version')
305  @imports(_from='six', _import='ensure_text')
306 +@imports(_from='__builtin__', _import='KeyError')
307  def virtualenv_python3(env_python, build_env, mozconfig, help):
308      # Avoid re-executing python when running configure --help.
309      if help:
310 @@ -283,6 +284,12 @@ def virtualenv_python3(env_python, build_env, mozconfi
311              python = mozconfig['vars']['added']['PYTHON3']
312          elif 'PYTHON3' in mozconfig['vars']['modified']:
313              python = mozconfig['vars']['modified']['PYTHON3'][1]
314 +        for i in ('env', 'vars'):
315 +            for j in ('added', 'modified'):
316 +                try:
317 +                    del mozconfig[i][j]['PYTHON3']
318 +                except KeyError:
319 +                    pass
320  
321      log.debug("python3: executable from configuration: %r" % python)
322  
323 @@ -365,7 +372,10 @@ def virtualenv_python3(env_python, build_env, mozconfi
324              sys.executable, manager.python_path))
325          log.info('Re-executing in the virtualenv')
326          if env_python:
327 -            del os.environ['PYTHON3']
328 +                try:
329 +                    del os.environ['PYTHON3']
330 +                except KeyError:
331 +                    pass
332          # Homebrew on macOS will change Python's sys.executable to a custom
333          # value which messes with mach's virtualenv handling code. Override
334          # Homebrew's changes with the correct sys.executable value.
335
336
337 [FILE:3590:patches/patch-bug1559213]
338 commit 717bba28411c
339 Author: Jory A. Pratt <anarchy@gentoo.org>
340 Date:   Thu Jun 13 11:53:00 2019 -0700
341
342     Bug 1559213 - Allow to use system av1 libs instead of bundled.
343 ---
344  config/external/moz.build      |  5 +++--
345  config/system-headers.mozbuild |  8 ++++++++
346  dom/media/platforms/moz.build  |  5 +++++
347  toolkit/moz.configure          | 19 ++++++++++++++++++-
348  4 files changed, 34 insertions(+), 3 deletions(-)
349
350 diff --git config/external/moz.build config/external/moz.build
351 index 03e4fa143bd1..a67d10b11fe6 100644
352 --- config/external/moz.build
353 +++ config/external/moz.build
354 @@ -37,8 +37,9 @@ if not CONFIG['MOZ_SYSTEM_LIBVPX']:
355      external_dirs += ['media/libvpx']
356  
357  if CONFIG['MOZ_AV1']:
358 -    external_dirs += ['media/libaom']
359 -    external_dirs += ['media/libdav1d']
360 +    if not CONFIG['MOZ_SYSTEM_AV1']:
361 +        external_dirs += ['media/libaom']
362 +        external_dirs += ['media/libdav1d']
363  
364  if not CONFIG['MOZ_SYSTEM_PNG']:
365      external_dirs += ['media/libpng']
366 diff --git config/system-headers.mozbuild config/system-headers.mozbuild
367 index bcf5c4925564..48964a999a9b 100644
368 --- config/system-headers.mozbuild
369 +++ config/system-headers.mozbuild
370 @@ -1304,6 +1304,14 @@ if CONFIG['MOZ_ENABLE_CONTENTMANAGER']:
371          'SelectSingleContentItemPage.h',
372      ]
373  
374 +if CONFIG['MOZ_SYSTEM_AV1']:
375 +    system_headers += [
376 +        'aom/aom_decoder.h',
377 +        'aom/aomdx.h',
378 +        'aom/aom_image.h',
379 +        'dav1d/dav1d.h',
380 +    ]
381 +
382  if CONFIG['MOZ_SYSTEM_LIBVPX']:
383      system_headers += [
384          'vpx_mem/vpx_mem.h',
385 diff --git dom/media/platforms/moz.build dom/media/platforms/moz.build
386 index 092cee0c9b66..38e45de5b5f0 100644
387 --- dom/media/platforms/moz.build
388 +++ dom/media/platforms/moz.build
389 @@ -80,6 +80,11 @@ if CONFIG['MOZ_AV1']:
390          'agnostic/AOMDecoder.cpp',
391          'agnostic/DAV1DDecoder.cpp',
392      ]
393 +    if CONFIG['MOZ_SYSTEM_AV1']:
394 +        CXXFLAGS += CONFIG['MOZ_SYSTEM_LIBAOM_CFLAGS']
395 +        OS_LIBS += CONFIG['MOZ_SYSTEM_LIBAOM_LIBS']
396 +        CXXFLAGS += CONFIG['MOZ_SYSTEM_LIBDAV1D_CFLAGS']
397 +        OS_LIBS += CONFIG['MOZ_SYSTEM_LIBDAV1D_LIBS']
398  
399  if CONFIG['MOZ_OMX']:
400      EXPORTS += [
401 diff --git toolkit/moz.configure toolkit/moz.configure
402 index 82b5a59acf42..e2329560b42b 100644
403 --- toolkit/moz.configure
404 +++ toolkit/moz.configure
405 @@ -441,7 +441,23 @@ def av1(value):
406      if value:
407          return True
408  
409 -@depends(target, nasm_version, when=av1 & compile_environment)
410 +option('--with-system-av1',
411 +       help="Use system av1 (located with pkgconfig)")
412 +
413 +system_libaom_info = pkg_check_modules('MOZ_SYSTEM_LIBAOM', 'aom >= 1.0.0',
414 +                                       when='--with-system-av1')
415 +
416 +system_libdav1d_info = pkg_check_modules('MOZ_SYSTEM_LIBDAV1D', 'dav1d >= 0.1.1',
417 +                                         when='--with-system-av1')
418 +
419 +@depends(system_libaom_info, system_libdav1d_info)
420 +def system_av1(system_libaom_info, system_libdav1d_info):
421 +    has_av1_libs = False
422 +    if system_libaom_info and system_libdav1d_info:
423 +        has_av1_libs = True
424 +    return has_av1_libs
425 +
426 +@depends(target, nasm_version, when=av1 & depends(system_av1)(lambda v: not v) & compile_environment)
427  def dav1d_asm(target, nasm_version):
428      if target.os != 'Android':
429          if target.cpu == 'aarch64':
430 @@ -457,6 +473,7 @@ set_config('MOZ_DAV1D_ASM', dav1d_asm)
431  set_define('MOZ_DAV1D_ASM', dav1d_asm)
432  set_config('MOZ_AV1', av1)
433  set_define('MOZ_AV1', av1)
434 +set_config('MOZ_SYSTEM_AV1', depends_if(system_av1)(lambda _: True))
435  
436  # Built-in fragmented MP4 support.
437  # ==============================================================
438
439
440 [FILE:1254:patches/patch-bug1618914]
441 [Wayland] Fall back to ftruncate if posix_fallocate isn't supported by filesystem.
442
443 diff --git widget/gtk/WindowSurfaceWayland.cpp widget/gtk/WindowSurfaceWayland.cpp
444 index 9a73326399bd5..9e42a7f1c5d18 100644
445 --- widget/gtk/WindowSurfaceWayland.cpp
446 +++ widget/gtk/WindowSurfaceWayland.cpp
447 @@ -222,20 +222,21 @@ static int WaylandAllocateShmMemory(int aSize) {
448  #ifdef HAVE_POSIX_FALLOCATE
449    do {
450      ret = posix_fallocate(fd, 0, aSize);
451    } while (ret == EINTR);
452 -  if (ret != 0) {
453 +  if (ret == 0) {
454 +    return fd;
455 +  } else if (ret != ENODEV && ret != EINVAL && ret != EOPNOTSUPP) {
456      close(fd);
457      MOZ_CRASH("posix_fallocate() fails to allocate shm memory");
458    }
459 -#else
460 +#endif
461    do {
462      ret = ftruncate(fd, aSize);
463    } while (ret < 0 && errno == EINTR);
464    if (ret < 0) {
465      close(fd);
466      MOZ_CRASH("ftruncate() fails to allocate shm memory");
467    }
468 -#endif
469  
470    return fd;
471  }
472 @@ -265,8 +266,8 @@ bool WaylandShmPool::Resize(int aSize) {
473  #ifdef HAVE_POSIX_FALLOCATE
474    do {
475      errno = posix_fallocate(mShmPoolFd, 0, aSize);
476    } while (errno == EINTR);
477 -  if (errno != 0) return false;
478 +  if (errno != 0 && errno != ENODEV && errno != EINVAL && errno != EOPNOTSUPP) return false;
479  #endif
480  
481    wl_shm_pool_resize(mShmPool, aSize);
482
483
484 [FILE:173909:patches/patch-bug1667736]
485 commit 33c996c701b9
486 Author: Henri Sivonen <hsivonen@hsivonen.fi>
487 Date:   Fri Oct 30 08:29:53 2020 +0000
488
489     Bug 1667736 - Update packed_simd to compile on Rust 1.48. r=glandium
490     
491     Differential Revision: https://phabricator.services.mozilla.com/D91572
492 ---
493  .cargo/config.in                                   |   2 +-
494  Cargo.lock                                         |   4 +-
495  Cargo.toml                                         |   2 +-
496  third_party/rust/packed_simd/.cargo-checksum.json  |   2 +-
497  third_party/rust/packed_simd/.travis.yml           | 237 +++++--------
498  third_party/rust/packed_simd/Cargo.toml            |  14 +-
499  .../rust/packed_simd/{readme.md => README.md}      | 111 +++----
500  third_party/rust/packed_simd/build.rs              |   2 +-
501  third_party/rust/packed_simd/ci/all.sh             |   2 +-
502  .../ci/docker/aarch64-unknown-linux-gnu/Dockerfile |   2 +-
503  .../ci/docker/arm-unknown-linux-gnueabi/Dockerfile |   2 +-
504  .../docker/arm-unknown-linux-gnueabihf/Dockerfile  |   2 +-
505  .../armv7-unknown-linux-gnueabihf/Dockerfile       |   2 +-
506  .../ci/docker/i586-unknown-linux-gnu/Dockerfile    |   2 +-
507  .../ci/docker/i686-unknown-linux-gnu/Dockerfile    |   2 +-
508  .../ci/docker/mips-unknown-linux-gnu/Dockerfile    |   2 +-
509  .../mips64-unknown-linux-gnuabi64/Dockerfile       |   2 +-
510  .../mips64el-unknown-linux-gnuabi64/Dockerfile     |   2 +-
511  .../ci/docker/mipsel-unknown-linux-musl/Dockerfile |   4 +-
512  .../ci/docker/powerpc-unknown-linux-gnu/Dockerfile |   3 +-
513  .../docker/powerpc64-unknown-linux-gnu/Dockerfile  |   2 +-
514  .../powerpc64le-unknown-linux-gnu/Dockerfile       |   2 +-
515  .../thumbv7neon-unknown-linux-gnueabihf/Dockerfile |   2 +-
516  .../ci/docker/x86_64-unknown-linux-gnu/Dockerfile  |   2 +-
517  third_party/rust/packed_simd/ci/dox.sh             |   7 +-
518  third_party/rust/packed_simd/ci/run.sh             |   6 +-
519  .../rust/packed_simd/ci/setup_benchmarks.sh        |   3 -
520  third_party/rust/packed_simd/src/api.rs            |  13 +-
521  third_party/rust/packed_simd/src/api/bit_manip.rs  |   1 +
522  third_party/rust/packed_simd/src/api/bitmask.rs    |  82 +++++
523  third_party/rust/packed_simd/src/api/cast/v128.rs  |   2 +-
524  third_party/rust/packed_simd/src/api/cast/v16.rs   |   2 +-
525  third_party/rust/packed_simd/src/api/cast/v256.rs  |   2 +-
526  third_party/rust/packed_simd/src/api/cast/v32.rs   |   2 +-
527  third_party/rust/packed_simd/src/api/cast/v512.rs  |   2 +-
528  third_party/rust/packed_simd/src/api/cast/v64.rs   |   2 +-
529  third_party/rust/packed_simd/src/api/default.rs    |   2 +
530  .../rust/packed_simd/src/api/from/from_array.rs    |   2 +
531  third_party/rust/packed_simd/src/api/hash.rs       |   2 +
532  .../packed_simd/src/api/into_bits/arch_specific.rs |   3 +-
533  .../rust/packed_simd/src/api/into_bits/v128.rs     |   2 +-
534  .../rust/packed_simd/src/api/into_bits/v16.rs      |   2 +-
535  .../rust/packed_simd/src/api/into_bits/v256.rs     |   2 +-
536  .../rust/packed_simd/src/api/into_bits/v32.rs      |   2 +-
537  .../rust/packed_simd/src/api/into_bits/v512.rs     |   2 +-
538  .../rust/packed_simd/src/api/into_bits/v64.rs      |   2 +-
539  .../rust/packed_simd/src/api/minimal/iuf.rs        |   6 +-
540  .../rust/packed_simd/src/api/minimal/mask.rs       |   6 +-
541  .../rust/packed_simd/src/api/minimal/ptr.rs        |  28 +-
542  .../src/api/ops/vector_float_min_max.rs            |   5 +
543  .../rust/packed_simd/src/api/ptr/gather_scatter.rs |  36 +-
544  .../src/api/reductions/float_arithmetic.rs         |  13 +-
545  .../rust/packed_simd/src/api/reductions/min_max.rs |   4 +
546  .../rust/packed_simd/src/api/slice/from_slice.rs   |   6 +-
547  .../packed_simd/src/api/slice/write_to_slice.rs    |   6 +-
548  third_party/rust/packed_simd/src/codegen.rs        |   3 +
549  .../rust/packed_simd/src/codegen/bit_manip.rs      |   2 +-
550  third_party/rust/packed_simd/src/codegen/llvm.rs   |   8 +
551  .../packed_simd/src/codegen/reductions/mask/x86.rs |   8 +-
552  .../src/codegen/reductions/mask/x86/sse.rs         |  32 --
553  .../rust/packed_simd/src/codegen/shuffle.rs        | 370 ++++++---------------
554  .../rust/packed_simd/src/codegen/shuffle1_dyn.rs   |  35 +-
555  third_party/rust/packed_simd/src/codegen/vPtr.rs   |   2 +
556  third_party/rust/packed_simd/src/lib.rs            |  29 +-
557  third_party/rust/packed_simd/src/masks.rs          |   2 +
558  third_party/rust/packed_simd/src/sealed.rs         |  15 +-
559  third_party/rust/packed_simd/src/testing/utils.rs  |  25 +-
560  third_party/rust/packed_simd/src/v128.rs           |  32 +-
561  third_party/rust/packed_simd/src/v16.rs            |   6 +-
562  third_party/rust/packed_simd/src/v256.rs           |  32 +-
563  third_party/rust/packed_simd/src/v32.rs            |  12 +-
564  third_party/rust/packed_simd/src/v512.rs           |  32 +-
565  third_party/rust/packed_simd/src/v64.rs            |  26 +-
566  third_party/rust/packed_simd/src/vPtr.rs           |   2 +-
567  third_party/rust/packed_simd/src/vSize.rs          |  20 +-
568  third_party/rust/packed_simd/tests/endianness.rs   |  62 ++--
569  76 files changed, 618 insertions(+), 801 deletions(-)
570
571 diff --git .cargo/config.in .cargo/config.in
572 index 1d25dffe4e49..7a321d933326 100644
573 --- .cargo/config.in
574 +++ .cargo/config.in
575 @@ -45,7 +45,7 @@ tag = "v0.4.2"
576  [source."https://github.com/hsivonen/packed_simd"]
577  git = "https://github.com/hsivonen/packed_simd"
578  replace-with = "vendored-sources"
579 -rev = "3541e3818fdc7c2a24f87e3459151a4ce955a67a"
580 +rev = "0917fe780032a6bbb23d71be545f9c1834128d75"
581  
582  [source."https://github.com/gfx-rs/naga"]
583  git = "https://github.com/gfx-rs/naga"
584 diff --git Cargo.lock Cargo.lock
585 index ea0a543b7397..5c030b1ef875 100644
586 --- Cargo.lock
587 +++ Cargo.lock
588 @@ -3578,8 +3578,8 @@ dependencies = [
589  
590  [[package]]
591  name = "packed_simd"
592 -version = "0.3.3"
593 -source = "git+https://github.com/hsivonen/packed_simd?rev=3541e3818fdc7c2a24f87e3459151a4ce955a67a#3541e3818fdc7c2a24f87e3459151a4ce955a67a"
594 +version = "0.3.4"
595 +source = "git+https://github.com/hsivonen/packed_simd?rev=0917fe780032a6bbb23d71be545f9c1834128d75#0917fe780032a6bbb23d71be545f9c1834128d75"
596  dependencies = [
597   "cfg-if",
598  ]
599 diff --git Cargo.toml Cargo.toml
600 index d1b826e2b388..f78c9a7408d9 100644
601 --- Cargo.toml
602 +++ Cargo.toml
603 @@ -66,7 +66,7 @@ panic = "abort"
604  
605  [patch.crates-io]
606  libudev-sys = { path = "dom/webauthn/libudev-sys" }
607 -packed_simd = { git = "https://github.com/hsivonen/packed_simd", rev="3541e3818fdc7c2a24f87e3459151a4ce955a67a" }
608 +packed_simd = { git = "https://github.com/hsivonen/packed_simd", rev="0917fe780032a6bbb23d71be545f9c1834128d75" }
609  rlbox_lucet_sandbox = { git = "https://github.com/PLSysSec/rlbox_lucet_sandbox/", rev="d510da5999a744c563b0acd18056069d1698273f" }
610  nix = { git = "https://github.com/shravanrn/nix/", branch = "r0.13.1", rev="4af6c367603869a30fddb5ffb0aba2b9477ba92e" }
611  spirv_cross = { git = "https://github.com/kvark/spirv_cross", branch = "wgpu3", rev = "20191ad2f370afd6d247edcb9ff9da32d3bedb9c" }
612 diff --git third_party/rust/packed_simd/.cargo-checksum.json third_party/rust/packed_simd/.cargo-checksum.json
613 index 01afcc1efdac..1512803e5729 100644
614 --- third_party/rust/packed_simd/.cargo-checksum.json
615 +++ third_party/rust/packed_simd/.cargo-checksum.json
616 @@ -1 +1 @@
617 -{"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}
618 \ No newline at end of file
619 +{"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}
620 \ No newline at end of file
621 diff --git third_party/rust/packed_simd/.travis.yml third_party/rust/packed_simd/.travis.yml
622 index 8d8ed54ab737..be3fb2369341 100644
623 --- third_party/rust/packed_simd/.travis.yml
624 +++ third_party/rust/packed_simd/.travis.yml
625 @@ -1,192 +1,129 @@
626  language: rust
627 -sudo: false
628  rust: nightly
629 +os: linux
630 +dist: focal
631  
632  stages:
633    - tools
634 -  - linux-tier1
635 -  - osx-tier1
636 -  - osx-tier2
637 -  - linux-tier2
638 -  - android
639 +  - build-test-verify # Passes full test suite, permit no regressions (unless it's rustup :/)
640 +  - 32bit-tier1
641 +  - 64bit-tier2
642 +  - 32bit-tier2
643  
644 -matrix:
645 -  fast_finish: true    
646 +jobs:
647 +  fast_finish: true
648    include:
649      # Android:
650 -    - env: TARGET=x86_64-linux-android NOVERIFY=1
651 +    - env: TARGET=x86_64-linux-android
652        name: "x86_64-unknown-linux-android + SSE2"
653 -      stage: android
654 +      stage: build-test-verify
655      - env: TARGET=arm-linux-androideabi
656        name: "arm-linux-androideabi"
657 -      stage: android
658 +      stage: build-test-verify
659      - env: TARGET=arm-linux-androideabi RUSTFLAGS="-C target-feature=+v7,+neon"
660        name: "arm-linux-androideabi + NEON"
661 -      stage: android
662 -    - env: TARGET=aarch64-linux-android
663 -      name: "aarch64-unknown-linux-android"
664 -      stage: android
665 -    - env: TARGET=aarch64-linux-android RUSTFLAGS="-C target-feature=+neon"
666 -      name: "aarch64-unknown-linux-android + NEON"
667 -      stage: android
668 +      stage: build-test-verify
669 +    - name: "aarch64-unknown-linux-android + NEON"
670 +      env: TARGET=aarch64-linux-android RUSTFLAGS="-C target-feature=+neon"
671 +      stage: build-test-verify
672      - env: TARGET="thumbv7neon-linux-androideabi"
673        name: "thumbv7neon-linux-androideabi"
674 -      stage: android
675 +      stage: 32bit-tier2
676      # Linux:
677      - env: TARGET=i586-unknown-linux-gnu
678        name: "i586-unknown-linux-gnu"
679 -      stage: linux-tier2
680 +      stage: 32bit-tier2
681      - env: TARGET=i586-unknown-linux-gnu RUSTFLAGS="-C target-feature=+sse"
682        name: "i586-unknown-linux-gnu + SSE"
683 -      stage: linux-tier2
684 +      stage: 32bit-tier2
685      - env: TARGET=i586-unknown-linux-gnu RUSTFLAGS="-C target-feature=+sse2"
686        name: "i586-unknown-linux-gnu + SSE2"
687 -      stage: linux-tier2
688 +      stage: 32bit-tier2
689      - env: TARGET=i686-unknown-linux-gnu
690        name: "i686-unknown-linux-gnu + SSE2"
691 -      stage: linux-tier1
692 +      stage: 32bit-tier1
693      - env: TARGET=i686-unknown-linux-gnu RUSTFLAGS="-C target-feature=+sse4.2"
694        name: "i686-unknown-linux-gnu + SSE4.2"
695 -      stage: linux-tier1
696 +      stage: 32bit-tier1
697      - env: TARGET=i686-unknown-linux-gnu RUSTFLAGS="-C target-feature=+avx2"
698        name: "i686-unknown-linux-gnu + AVX2"
699 -      stage: linux-tier1
700 -    - env: TARGET=x86_64-unknown-linux-gnu
701 -      name: "x86_64-unknown-linux-gnu + SSE2"
702 -      install: rustup component add rustfmt-preview
703 -      stage: linux-tier1
704 +      stage: 32bit-tier1
705      - env: TARGET=x86_64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+sse4.2"
706        name: "x86_64-unknown-linux-gnu + SSE4.2"
707        install: rustup component add rustfmt-preview
708 -      stage: linux-tier1
709 -    - env: TARGET=x86_64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+avx"
710 -      name: "x86_64-unknown-linux-gnu + AVX"
711 -      install: rustup component add rustfmt-preview
712 -      stage: linux-tier1
713 +      stage: build-test-verify
714      - env: TARGET=x86_64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+avx2"
715        name: "x86_64-unknown-linux-gnu + AVX2"
716        install: rustup component add rustfmt-preview
717 -      stage: linux-tier1
718 -    - env: TARGET=x86_64-unknown-linux-gnu-emulated
719 -      name: "Intel SDE + SSE2"
720 -      install: true
721 -      stage: linux-tier1
722 -    - env: TARGET=x86_64-unknown-linux-gnu-emulated RUSTFLAGS="-C target-feature=+sse4.2"
723 -      name: "Intel SDE + SSE4.2"
724 -      install: true
725 -      stage: linux-tier1
726 -    - env: TARGET=x86_64-unknown-linux-gnu-emulated RUSTFLAGS="-C target-feature=+avx"
727 -      name: "Intel SDE + AVX"
728 -      install: true
729 -      stage: linux-tier1
730 -    - env: TARGET=x86_64-unknown-linux-gnu-emulated RUSTFLAGS="-C target-feature=+avx2"
731 -      name: "Intel SDE + AVX2"
732 -      install: true
733 -      stage: linux-tier1
734 -    - env: TARGET=x86_64-unknown-linux-gnu-emulated RUSTFLAGS="-C target-feature=+avx-512f"
735 -      name: "Intel SDE + AVX-512"
736 -      install: true
737 -      stage: linux-tier1
738 -    - env: TARGET=arm-unknown-linux-gnueabi
739 -      name: "arm-unknown-linux-gnueabi"
740 -      stage: linux-tier2
741 +      stage: build-test-verify
742      - env: TARGET=arm-unknown-linux-gnueabi RUSTFLAGS="-C target-feature=+v7,+neon"
743        name: "arm-unknown-linux-gnueabi + NEON"
744 -      stage: linux-tier2
745 +      stage: build-test-verify
746      - env: TARGET=arm-unknown-linux-gnueabihf
747        name: "arm-unknown-linux-gnueabihf"
748 -      stage: linux-tier2
749 +      stage: build-test-verify
750      - env: TARGET=arm-unknown-linux-gnueabihf RUSTFLAGS="-C target-feature=+v7,+neon"
751        name: "arm-unknown-linux-gnueabihf + NEON"
752 -      stage: linux-tier2
753 +      stage: build-test-verify
754      - env: TARGET=armv7-unknown-linux-gnueabihf
755        name: "armv7-unknown-linux-gnueabihf"
756 -      stage: linux-tier2
757 +      stage: build-test-verify
758      - env: TARGET=armv7-unknown-linux-gnueabihf RUSTFLAGS="-C target-feature=+neon"
759        name: "armv7-unknown-linux-gnueabihf + NEON"
760 -      stage: linux-tier2
761 +      stage: build-test-verify
762      - env: TARGET="thumbv7neon-unknown-linux-gnueabihf"
763        name: "thumbv7neon-unknown-linux-gnueabihf"
764 -      stage: linux-tier2
765 -    - env: TARGET=aarch64-unknown-linux-gnu
766 -      name: "aarch64-unknown-linux-gnu"
767 -      stage: linux-tier2
768 -    - env: TARGET=aarch64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+neon"
769 -      name: "aarch64-unknown-linux-gnu + NEON"
770 -      stage: linux-tier2
771 +      stage: 32bit-tier2
772 +    - name: "aarch64-unknown-linux-gnu + NEON"
773 +      env: TARGET=aarch64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+neon"
774 +      stage: build-test-verify
775      - env: TARGET=mips-unknown-linux-gnu
776        name: "mips-unknown-linux-gnu"
777 -      stage: linux-tier2
778 +      stage: 32bit-tier2
779      - env: TARGET=mipsel-unknown-linux-musl
780        name: "mipsel-unknown-linux-musl"
781 -      stage: linux-tier2
782 +      stage: 32bit-tier2
783      - env: TARGET=mips64-unknown-linux-gnuabi64
784        name: "mips64-unknown-linux-gnuabi64"
785 -      stage: linux-tier2
786 +      stage: 64bit-tier2
787      - env: TARGET=mips64el-unknown-linux-gnuabi64
788        name: "mips64el-unknown-linux-gnuabi64"
789 -      stage: linux-tier2
790 +      stage: 64bit-tier2
791        # FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/18
792        # env: TARGET=mips64el-unknown-linux-gnuabi64 RUSTFLAGS="-C target-feature=+msa -C target-cpu=mips64r6"
793      - env: TARGET=powerpc-unknown-linux-gnu
794        name: "powerpc-unknown-linux-gnu"
795 -      stage: linux-tier2
796 +      stage: 32bit-tier2
797      - env: TARGET=powerpc64-unknown-linux-gnu
798        name: "powerpc64-unknown-linux-gnu"
799 -      stage: linux-tier2
800 -    - env: TARGET=powerpc64le-unknown-linux-gnu
801 -      name: "powerpc64le-unknown-linux-gnu"
802 -      stage: linux-tier2
803 -    - env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+altivec"
804 -      name: "powerpc64le-unknown-linux-gnu + ALTIVEC"
805 -      stage: linux-tier2
806 -    - env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+vsx"
807 -      name: "powerpc64le-unknown-linux-gnu + VSX"
808 -      stage: linux-tier2
809 -    - env: TARGET=s390x-unknown-linux-gnu
810 -      name: "s390x-unknown-linux-gnu"
811 -      stage: linux-tier2
812 +      stage: 64bit-tier2
813 +    - name: "powerpc64le-unknown-linux-gnu"
814 +      env: TARGET=powerpc64le-unknown-linux-gnu
815 +      stage: build-test-verify
816 +    - name: "powerpc64le-unknown-linux-gnu + ALTIVEC"
817 +      env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+altivec"
818 +      stage: build-test-verify
819 +    - name: "powerpc64le-unknown-linux-gnu + VSX"
820 +      env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+vsx"
821 +      stage: build-test-verify
822 +    - name: "s390x-unknown-linux-gnu"
823 +      env: TARGET=s390x-unknown-linux-gnu
824 +      stage: 64bit-tier2
825      - env: TARGET=sparc64-unknown-linux-gnu
826        name: "sparc64-unknown-linux-gnu"
827 -      stage: linux-tier2
828 +      stage: 64bit-tier2
829      # WebAssembly:
830      - env: TARGET=wasm32-unknown-unknown
831        name: "wasm32-unknown-unknown"
832 -      stage: osx-tier1 # For now
833 +      stage: 32bit-tier2
834      # MacOSX:
835 -    - os: osx
836 -      env: TARGET=i686-apple-darwin
837 -      name: "i686-apple-darwin + SSE2"
838 -      script: ci/run.sh
839 -      osx_image: xcode10
840 -      stage: osx-tier1
841 -    - os: osx
842 -      env: TARGET=i686-apple-darwin RUSTFLAGS="-C target-feature=+sse4.2"
843 -      name: "i686-apple-darwin + SSE4.2"
844 -      script: ci/run.sh
845 -      osx_image: xcode10
846 -      stage: osx-tier1
847 -      # Travis-CI OSX build bots do not support AVX2:
848 -    - os: osx
849 -      env: TARGET=i686-apple-darwin RUSTFLAGS="-C target-feature=+avx"
850 -      name: "i686-apple-darwin + AVX"
851 -      script: ci/run.sh
852 -      osx_image: xcode10
853 -      stage: osx-tier1
854 -    - os: osx
855 -      env: TARGET=x86_64-apple-darwin
856 -      name: "x86_64-apple-darwin + SSE2"
857 -      install: true
858 -      script: ci/run.sh
859 -      osx_image: xcode10
860 -      stage: osx-tier1
861      - os: osx
862        env: TARGET=x86_64-apple-darwin RUSTFLAGS="-C target-feature=+sse4.2"
863        name: "x86_64-apple-darwin + SSE4.2"
864        install: true
865        script: ci/run.sh
866        osx_image: xcode10
867 -      stage: osx-tier1
868 +      stage: build-test-verify
869        # Travis-CI OSX build bots do not support AVX2:
870      - os: osx
871        env: TARGET=x86_64-apple-darwin RUSTFLAGS="-C target-feature=+avx"
872 @@ -194,7 +131,7 @@ matrix:
873        install: true
874        script: ci/run.sh
875        osx_image: xcode10
876 -      stage: osx-tier1
877 +      stage: build-test-verify
878      # *BSDs:
879      #- env: TARGET=i686-unknown-freebsd NORUN=1
880      #  script: ci/run.sh
881 @@ -206,81 +143,75 @@ matrix:
882      #- env: TARGET=x86_64-sun-solaris NORUN=1
883      #  script: ci/run.sh
884      # iOS:
885 -    - os: osx
886 -      env: TARGET=i386-apple-ios
887 -      name: "i386-apple-ios"
888 -      script: ci/run.sh
889 -      osx_image: xcode9.4
890 -      stage: osx-tier2
891      - os: osx
892        env: TARGET=x86_64-apple-ios
893        name: "x86_64-apple-ios + SSE2"
894        script: ci/run.sh
895        osx_image: xcode9.4
896 -      stage: osx-tier2
897 -    - os: osx
898 -      env: TARGET=armv7-apple-ios NORUN=1
899 -      name: "armv7-apple-ios [Build only]"
900 -      script: ci/run.sh
901 +      stage: 64bit-tier2
902 +    - name: "aarch64-apple-ios + NEON"
903 +      env: TARGET=aarch64-apple-ios RUSTFLAGS="-C target-feature=+neon"
904 +      os: osx
905        osx_image: xcode9.4
906 -      stage: osx-tier2
907 -    - os: osx
908 -      env: TARGET=aarch64-apple-ios NORUN=1
909 -      name: "aarch64-apple-ios [Build only]"
910        script: ci/run.sh
911 -      osx_image: xcode9.4
912 -      stage: osx-tier2
913 +      stage: 64bit-tier2
914      # BENCHMARKS:
915      - name: "Benchmarks - x86_64-unknown-linux-gnu"
916        install: TARGET=x86_64-unknown-linux-gnu ./ci/setup_benchmarks.sh
917 -      script: PATH=$(pwd):$PATH NORUN=1 VERIFY=1 FEATURES=core_arch,ispc,sleef-sys ci/benchmark.sh
918 +      # FIXME: Use `core_arch,sleef-sys` features once they works again
919 +      script: PATH=$(pwd):$PATH NORUN=1 VERIFY=1 FEATURES=ispc ci/benchmark.sh
920        stage: tools
921      - name: "Benchmarks - x86_64-apple-darwin"
922        install: TARGET=x86_64-apple-darwin ./ci/setup_benchmarks.sh
923 -      script: PATH=$(pwd):$PATH NORUN=1 VERIFY=1 FEATURES=core_arch,ispc,sleef-sys ci/benchmark.sh
924 +      # FIXME: Use `core_arch,sleef-sys` features once they works again
925 +      script: PATH=$(pwd):$PATH NORUN=1 VERIFY=1 FEATURES=ispc ci/benchmark.sh
926        os: osx
927        osx_image: xcode9.4
928        stage: tools
929      # TOOLS:
930      - name: "Documentation"
931 -      install: cargo install mdbook
932 +      before_install:
933 +        - sudo add-apt-repository -y ppa:deadsnakes/ppa
934 +        - sudo apt-get update -y
935 +        - sudo apt-get install -y python3.9
936 +      install:
937 +        - cargo install mdbook
938        script: ci/dox.sh
939        stage: tools
940      - name: "rustfmt"
941        install: true
942 -      before_script: rustup component add rustfmt-preview
943 -      script: ci/all.sh check_fmt || true
944 +      script: |
945 +        if rustup component add rustfmt-preview ; then
946 +            ci/all.sh check_fmt || true
947 +        fi
948        stage: tools
949      - name: "clippy"
950        install: true
951 -      before_script: rustup component add clippy-preview
952 -      script: ci/all.sh clippy
953 +      script: |
954 +        if rustup component add clippy-preview ; then
955 +            ci/all.sh clippy
956 +        fi
957        stage: tools
958  
959    allow_failures:
960      # FIXME: ISPC cannot be found?
961      - name: "Benchmarks - x86_64-apple-darwin"
962 -    # FIXME: TBD
963 -    - env: TARGET=powerpc-unknown-linux-gnu
964 -    - env: TARGET=powerpc64-unknown-linux-gnu
965 -    - env: TARGET=powerpc64le-unknown-linux-gnu
966 -    - env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+altivec"
967 -    - env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+vsx"
968 +    # FIXME: i686 fails in inlining, apparently
969 +    - stage: 32bit-tier1
970      #- env: TARGET=i686-unknown-freebsd NORUN=1
971      #- env: TARGET=x86_64-unknown-freebsd NORUN=1
972      #- env: TARGET=x86_64-unknown-netbsd NORUN=1
973      #- env: TARGET=x86_64-sun-solaris NORUN=1
974  
975      # FIXME: TBD
976 -    - env: TARGET=arm-linux-androideabi
977 -    - env: TARGET=arm-linux-androideabi RUSTFLAGS="-C target-feature=+v7,+neon"
978 -    - env: TARGET=aarch64-linux-android
979 -    - env: TARGET=aarch64-linux-android RUSTFLAGS="-C target-feature=+neon"
980 +    - stage: 64bit-tier2
981 +    - stage: 32bit-tier2
982  
983      # FIXME: iOS
984      # https://github.com/rust-lang-nursery/packed_simd/issues/26
985 -    - env: TARGET=i386-apple-ios
986      - env: TARGET=x86_64-apple-ios
987 +    # Is this related to the above? Mysterious test failure
988 +    - name: "aarch64-apple-ios + NEON"
989  
990      # FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/182
991      - env: TARGET=arm-unknown-linux-gnueabi RUSTFLAGS="-C target-feature=+v7,+neon"
992 diff --git third_party/rust/packed_simd/Cargo.toml third_party/rust/packed_simd/Cargo.toml
993 index 3db9354c9407..70bbf26ed259 100644
994 --- third_party/rust/packed_simd/Cargo.toml
995 +++ third_party/rust/packed_simd/Cargo.toml
996 @@ -1,6 +1,6 @@
997  [package]
998  name = "packed_simd"
999 -version = "0.3.3"
1000 +version = "0.3.4"
1001  authors = ["Gonzalo Brito Gadeschi <gonzalobg88@gmail.com>"]
1002  description = "Portable Packed SIMD vectors"
1003  documentation = "https://docs.rs/crate/packed_simd/"
1004 @@ -21,8 +21,8 @@ is-it-maintained-open-issues = { repository = "rust-lang-nursery/packed_simd" }
1005  maintenance = { status = "experimental" }
1006  
1007  [dependencies]
1008 -cfg-if = "^0.1.6"
1009 -core_arch = { version = "^0.1.3", optional = true }
1010 +cfg-if = "0.1.10"
1011 +core_arch = { version = "0.1.5", optional = true }
1012  
1013  [features]
1014  default = []
1015 @@ -31,12 +31,12 @@ libcore_neon = []
1016  
1017  [dev-dependencies]
1018  paste = "^0.1.3"
1019 -arrayvec = { version = "^0.4", default-features = false }
1020 +arrayvec = { version = "^0.5", default-features = false }
1021  
1022  [target.'cfg(target_arch = "x86_64")'.dependencies.sleef-sys]
1023 -version = "^0.1.2"
1024 +version = "0.1.2"
1025  optional = true
1026  
1027  [target.wasm32-unknown-unknown.dev-dependencies]
1028 -wasm-bindgen = "=0.2.19"
1029 -wasm-bindgen-test = "=0.2.19"
1030 \ No newline at end of file
1031 +wasm-bindgen = "=0.2.52"
1032 +wasm-bindgen-test = "=0.3.2"
1033 diff --git third_party/rust/packed_simd/readme.md third_party/rust/packed_simd/README.md
1034 similarity index 54%
1035 rename from third_party/rust/packed_simd/readme.md
1036 rename to third_party/rust/packed_simd/README.md
1037 index 3b27a2bba0d6..ad4f3f27093f 100644
1038 --- third_party/rust/packed_simd/readme.md
1039 +++ third_party/rust/packed_simd/README.md
1040 @@ -4,16 +4,14 @@
1041  
1042  [![Travis-CI Status]][travis] [![Appveyor Status]][appveyor] [![Latest Version]][crates.io] [![docs]][master_docs]
1043  
1044 -> This aims to be a 100% conforming implementation of Rust RFC 2366 for stabilization.
1045 -
1046 -**WARNING**: this crate only supports the most recent nightly Rust toolchain.
1047 +**WARNING**: this crate only supports the most recent nightly Rust toolchain
1048 +and will be superceded by [stdsimd](https://github.com/rust-lang/stdsimd).
1049  
1050  ## Documentation
1051  
1052  * [API docs (`master` branch)][master_docs]
1053  * [Performance guide][perf_guide]
1054 -* [API docs (`docs.rs`)][docs.rs]: **CURRENTLY DOWN** due to
1055 -  https://github.com/rust-lang-nursery/packed_simd/issues/110
1056 +* [API docs (`docs.rs`)][docs.rs]
1057  * [RFC2366 `std::simd`][rfc2366]: - contains motivation, design rationale,
1058    discussion, etc.
1059  
1060 @@ -39,17 +37,6 @@ Most of the examples come with both a scalar and a vectorized implementation.
1061    vector type as those of another vector type safely by just using the
1062    `.into_bits()` method.
1063  
1064 -* `core_arch` (default: disabled): enable this feature to recompile `core::arch`
1065 -  for the target-features enabled. `packed_simd` includes optimizations for some
1066 -  target feature combinations that are enabled by this feature. Note, however,
1067 -  that this is an unstable dependency, that rustc might break at any time.
1068 -
1069 -* `sleef-sys` (default: disabled - `x86_64` only): internally uses the [SLEEF]
1070 -  short-vector math library when profitable via the [`sleef-sys`][sleef_sys]
1071 -  crate. [SLEEF] is licensed under the [Boost Software License
1072 -  v1.0][boost_license], an extremely permissive license, and can be statically
1073 -  linked without issues.
1074 -
1075  ## Performance
1076  
1077  The following [ISPC] examples are also part of `packed_simd`'s
1078 @@ -75,60 +62,40 @@ slowdown:
1079  
1080  ## Platform support
1081  
1082 -The following table describes the supported platforms: `build` shows whether the
1083 -library compiles without issues for a given target, while `run` shows whether
1084 -the full testsuite passes on the target.
1085 -
1086 -| Linux targets:                    | build     | run     |
1087 -|-----------------------------------|-----------|---------|
1088 -| `i586-unknown-linux-gnu`          | âœ“         | âœ“       |
1089 -| `i686-unknown-linux-gnu`          | âœ“         | âœ“       |
1090 -| `x86_64-unknown-linux-gnu`        | âœ“         | âœ“       |
1091 -| `arm-unknown-linux-gnueabi`       | âœ—         | âœ—       |
1092 -| `arm-unknown-linux-gnueabihf`     | âœ“         | âœ“       |
1093 -| `armv7-unknown-linux-gnueabi`     | âœ“         | âœ“       |
1094 -| `aarch64-unknown-linux-gnu`       | âœ“         | âœ“       |
1095 -| `mips-unknown-linux-gnu`          | âœ“         | âœ“       |
1096 -| `mipsel-unknown-linux-musl`       | âœ“         | âœ“       |
1097 -| `mips64-unknown-linux-gnuabi64`   | âœ“         | âœ“       |
1098 -| `mips64el-unknown-linux-gnuabi64` | âœ“         | âœ“       |
1099 -| `powerpc-unknown-linux-gnu`       | âœ—         | âœ—       |
1100 -| `powerpc64-unknown-linux-gnu`     | âœ—         | âœ—       |
1101 -| `powerpc64le-unknown-linux-gnu`   | âœ—         | âœ—       |
1102 -| `s390x-unknown-linux-gnu`         | âœ“         | âœ“*      |
1103 -| `sparc64-unknown-linux-gnu`       | âœ“         | âœ“*      |
1104 -| `thumbv7neon-unknown-linux-gnueabihf` | âœ“         | âœ“      |
1105 -| **MacOSX targets:**               | **build** | **run** |
1106 -| `x86_64-apple-darwin`             | âœ“         | âœ“       |
1107 -| `i686-apple-darwin`               | âœ“         | âœ“       |
1108 -| **Windows targets:**              | **build** | **run** |
1109 -| `x86_64-pc-windows-msvc`          | âœ“         | âœ“       |
1110 -| `i686-pc-windows-msvc`            | âœ“         | âœ“       |
1111 -| `x86_64-pc-windows-gnu`           | âœ—          | âœ—        |
1112 -| `i686-pc-windows-gnu`             | âœ—          | âœ—        |
1113 -| **WebAssembly targets:**          | **build** | **run** |
1114 -| `wasm32-unknown-unknown`          | âœ“         | âœ“      |
1115 -| **Android targets:**              | **build** | **run** |
1116 -| `x86_64-linux-android`            | âœ“         | âœ“       |
1117 -| `arm-linux-androideabi`           | âœ“         | âœ“       |
1118 -| `aarch64-linux-android`           | âœ“         | âœ—       |
1119 -| `thumbv7neon-linux-androideabi`  | âœ“         | âœ“       |
1120 -| **iOS targets:**                  | **build** | **run** |
1121 -| `i386-apple-ios`                  | âœ“         | âœ—       |
1122 -| `x86_64-apple-ios`                | âœ“         | âœ—       |
1123 -| `armv7-apple-ios`                 | âœ“         | âœ—**     |
1124 -| `aarch64-apple-ios`               | âœ“         | âœ—**     |
1125 -| **xBSD targets:**                 | **build** | **run** |
1126 -| `i686-unknown-freebsd`            | âœ—         | âœ—**     |
1127 -| `x86_64-unknown-freebsd`          | âœ—         | âœ—**     |
1128 -| `x86_64-unknown-netbsd`           | âœ—         | âœ—**     |
1129 -| **Solaris targets:**              | **build** | **run** |
1130 -| `x86_64-sun-solaris`              | âœ—         | âœ—**     |
1131 -
1132 -[*] most of the test suite passes correctly on these platform but
1133 -there are correctness bugs open in the issue tracker.
1134 -
1135 -[**] it is currently not easily possible to run these platforms on CI.
1136 +The following table describes the supported platforms: `build` shows whether
1137 +the library compiles without issues for a given target, while `run` shows
1138 +whether the test suite passes for a given target.
1139 +
1140 +| **Linux**                             | **build** | **run** |
1141 +|---------------------------------------|-----------|---------|
1142 +| `i586-unknown-linux-gnu`              | âœ“         | âœ—       |
1143 +| `i686-unknown-linux-gnu`              | âœ“         | âœ—       |
1144 +| `x86_64-unknown-linux-gnu`            | âœ“         | âœ“       |
1145 +| `arm-unknown-linux-gnueabi`           | âœ—         | âœ—       |
1146 +| `arm-unknown-linux-gnueabihf`         | âœ“         | âœ“       |
1147 +| `armv7-unknown-linux-gnueabi`         | âœ“         | âœ“       |
1148 +| `aarch64-unknown-linux-gnu`           | âœ“         | âœ“       |
1149 +| `mips-unknown-linux-gnu`              | âœ“         | âœ—       |
1150 +| `mipsel-unknown-linux-musl`           | âœ“         | âœ—       |
1151 +| `mips64-unknown-linux-gnuabi64`       | âœ“         | âœ—       |
1152 +| `mips64el-unknown-linux-gnuabi64`     | âœ“         | âœ—       |
1153 +| `powerpc-unknown-linux-gnu`           | âœ—         | âœ—       |
1154 +| `powerpc64-unknown-linux-gnu`         | âœ—         | âœ—       |
1155 +| `powerpc64le-unknown-linux-gnu`       | âœ“         | âœ“       |
1156 +| `s390x-unknown-linux-gnu`             | âœ—         | âœ—       |
1157 +| `sparc64-unknown-linux-gnu`           | âœ“         | âœ—       |
1158 +| `thumbv7neon-unknown-linux-gnueabihf` | âœ“         | âœ“       |
1159 +| **MacOSX**                            | **build** | **run** |
1160 +| `x86_64-apple-darwin`                 | âœ“         | âœ“       |
1161 +| **Android**                           | **build** | **run** |
1162 +| `x86_64-linux-android`                | âœ“         | âœ“       |
1163 +| `arm-linux-androideabi`               | âœ“         | âœ“       |
1164 +| `aarch64-linux-android`               | âœ“         | âœ“       |
1165 +| `thumbv7neon-linux-androideabi`       | âœ—         | âœ—       |
1166 +| **iOS**                               | **build** | **run** |
1167 +| `x86_64-apple-ios`                    | âœ“         | âœ—       |
1168 +| `aarch64-apple-ios`                   | âœ“         | âœ—       |
1169 +
1170  
1171  ## Machine code verification
1172  
1173 @@ -162,8 +129,8 @@ Unless you explicitly state otherwise, any contribution intentionally submitted
1174  for inclusion in `packed_simd` by you, as defined in the Apache-2.0 license, shall be
1175  dual licensed as above, without any additional terms or conditions.
1176  
1177 -[travis]: https://travis-ci.org/rust-lang-nursery/packed_simd
1178 -[Travis-CI Status]: https://travis-ci.org/rust-lang-nursery/packed_simd.svg?branch=master
1179 +[travis]: https://travis-ci.com/rust-lang-nursery/packed_simd
1180 +[Travis-CI Status]: https://travis-ci.com/rust-lang-nursery/packed_simd.svg?branch=master
1181  [appveyor]: https://ci.appveyor.com/project/gnzlbg/packed-simd
1182  [Appveyor Status]: https://ci.appveyor.com/api/projects/status/hd7v9dvr442hgdix?svg=true
1183  [Latest Version]: https://img.shields.io/crates/v/packed_simd.svg
1184 diff --git third_party/rust/packed_simd/build.rs third_party/rust/packed_simd/build.rs
1185 index 85639ff9d085..5958b9b7856e 100644
1186 --- third_party/rust/packed_simd/build.rs
1187 +++ third_party/rust/packed_simd/build.rs
1188 @@ -1,5 +1,5 @@
1189  fn main() {
1190 -       println!("cargo:rustc-env=RUSTC_BOOTSTRAP=1");
1191 +    println!("cargo:rustc-env=RUSTC_BOOTSTRAP=1");
1192      let target = std::env::var("TARGET")
1193          .expect("TARGET environment variable not defined");
1194      if target.contains("neon") {
1195 diff --git third_party/rust/packed_simd/ci/all.sh third_party/rust/packed_simd/ci/all.sh
1196 index 273562d4a9bb..55a1fa2efefe 100755
1197 --- third_party/rust/packed_simd/ci/all.sh
1198 +++ third_party/rust/packed_simd/ci/all.sh
1199 @@ -21,7 +21,7 @@ cargo_fmt() {
1200  }
1201  
1202  cargo_clippy() {
1203 -    cargo clippy --all -- -D clippy::pedantic
1204 +    cargo clippy --all -- -D clippy::perf
1205  }
1206  
1207  CMD="-1"
1208 diff --git third_party/rust/packed_simd/ci/docker/aarch64-unknown-linux-gnu/Dockerfile third_party/rust/packed_simd/ci/docker/aarch64-unknown-linux-gnu/Dockerfile
1209 index 68261a2f033d..41ff4729ac59 100644
1210 --- third_party/rust/packed_simd/ci/docker/aarch64-unknown-linux-gnu/Dockerfile
1211 +++ third_party/rust/packed_simd/ci/docker/aarch64-unknown-linux-gnu/Dockerfile
1212 @@ -1,4 +1,4 @@
1213 -FROM ubuntu:17.10
1214 +FROM ubuntu:18.04
1215  RUN apt-get update && apt-get install -y --no-install-recommends \
1216    gcc \
1217    ca-certificates \
1218 diff --git third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabi/Dockerfile third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabi/Dockerfile
1219 index cb4de6a57eaa..e1c591dd979a 100644
1220 --- third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabi/Dockerfile
1221 +++ third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabi/Dockerfile
1222 @@ -1,4 +1,4 @@
1223 -FROM ubuntu:17.10
1224 +FROM ubuntu:18.04
1225  RUN apt-get update && apt-get install -y --no-install-recommends \
1226    gcc \
1227    ca-certificates \
1228 diff --git third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile
1229 index c7bd61f0a796..757b79e7ecc1 100644
1230 --- third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile
1231 +++ third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile
1232 @@ -1,4 +1,4 @@
1233 -FROM ubuntu:17.10
1234 +FROM ubuntu:18.04
1235  RUN apt-get update && apt-get install -y --no-install-recommends \
1236    gcc \
1237    ca-certificates \
1238 diff --git third_party/rust/packed_simd/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile third_party/rust/packed_simd/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile
1239 index e01b87afdf56..253906293374 100644
1240 --- third_party/rust/packed_simd/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile
1241 +++ third_party/rust/packed_simd/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile
1242 @@ -1,4 +1,4 @@
1243 -FROM ubuntu:17.10
1244 +FROM ubuntu:18.04
1245  RUN apt-get update && apt-get install -y --no-install-recommends \
1246    gcc \
1247    ca-certificates \
1248 diff --git third_party/rust/packed_simd/ci/docker/i586-unknown-linux-gnu/Dockerfile third_party/rust/packed_simd/ci/docker/i586-unknown-linux-gnu/Dockerfile
1249 index 857974a858f1..01093698f679 100644
1250 --- third_party/rust/packed_simd/ci/docker/i586-unknown-linux-gnu/Dockerfile
1251 +++ third_party/rust/packed_simd/ci/docker/i586-unknown-linux-gnu/Dockerfile
1252 @@ -1,4 +1,4 @@
1253 -FROM ubuntu:17.10
1254 +FROM ubuntu:18.04
1255  RUN apt-get update && apt-get install -y --no-install-recommends \
1256    gcc-multilib \
1257    libc6-dev \
1258 diff --git third_party/rust/packed_simd/ci/docker/i686-unknown-linux-gnu/Dockerfile third_party/rust/packed_simd/ci/docker/i686-unknown-linux-gnu/Dockerfile
1259 index 857974a858f1..01093698f679 100644
1260 --- third_party/rust/packed_simd/ci/docker/i686-unknown-linux-gnu/Dockerfile
1261 +++ third_party/rust/packed_simd/ci/docker/i686-unknown-linux-gnu/Dockerfile
1262 @@ -1,4 +1,4 @@
1263 -FROM ubuntu:17.10
1264 +FROM ubuntu:18.04
1265  RUN apt-get update && apt-get install -y --no-install-recommends \
1266    gcc-multilib \
1267    libc6-dev \
1268 diff --git third_party/rust/packed_simd/ci/docker/mips-unknown-linux-gnu/Dockerfile third_party/rust/packed_simd/ci/docker/mips-unknown-linux-gnu/Dockerfile
1269 index 4711cead372a..3bd471e87d4d 100644
1270 --- third_party/rust/packed_simd/ci/docker/mips-unknown-linux-gnu/Dockerfile
1271 +++ third_party/rust/packed_simd/ci/docker/mips-unknown-linux-gnu/Dockerfile
1272 @@ -1,4 +1,4 @@
1273 -FROM ubuntu:17.10
1274 +FROM ubuntu:18.04
1275  
1276  RUN apt-get update && apt-get install -y --no-install-recommends \
1277          gcc libc6-dev qemu-user ca-certificates \
1278 diff --git third_party/rust/packed_simd/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile third_party/rust/packed_simd/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile
1279 index 1422e8c80924..f26f1f38eb22 100644
1280 --- third_party/rust/packed_simd/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile
1281 +++ third_party/rust/packed_simd/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile
1282 @@ -1,4 +1,4 @@
1283 -FROM ubuntu:17.10
1284 +FROM ubuntu:18.04
1285  
1286  RUN apt-get update && apt-get install -y --no-install-recommends \
1287          gcc libc6-dev qemu-user ca-certificates \
1288 diff --git third_party/rust/packed_simd/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile third_party/rust/packed_simd/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile
1289 index d94deb5b2013..7d9f0bd99250 100644
1290 --- third_party/rust/packed_simd/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile
1291 +++ third_party/rust/packed_simd/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile
1292 @@ -1,4 +1,4 @@
1293 -FROM ubuntu:17.10
1294 +FROM ubuntu:18.04
1295  
1296  RUN apt-get update && apt-get install -y --no-install-recommends \
1297          gcc libc6-dev qemu-user ca-certificates \
1298 diff --git third_party/rust/packed_simd/ci/docker/mipsel-unknown-linux-musl/Dockerfile third_party/rust/packed_simd/ci/docker/mipsel-unknown-linux-musl/Dockerfile
1299 index 40ac50675bd9..7488662ef281 100644
1300 --- third_party/rust/packed_simd/ci/docker/mipsel-unknown-linux-musl/Dockerfile
1301 +++ third_party/rust/packed_simd/ci/docker/mipsel-unknown-linux-musl/Dockerfile
1302 @@ -16,10 +16,10 @@ RUN mkdir /toolchain
1303  
1304  # Note that this originally came from:
1305  # 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
1306 -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 | \
1307 +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 | \
1308        tar xjf - -C /toolchain --strip-components=2
1309  
1310  ENV PATH=$PATH:/rust/bin:/toolchain/bin \
1311      CC_mipsel_unknown_linux_musl=mipsel-openwrt-linux-gcc \
1312      CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_LINKER=mipsel-openwrt-linux-gcc \
1313 -    CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_RUNNER="qemu-mipsel -L /toolchain"
1314 \ No newline at end of file
1315 +    CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_RUNNER="qemu-mipsel -L /toolchain"
1316 diff --git third_party/rust/packed_simd/ci/docker/powerpc-unknown-linux-gnu/Dockerfile third_party/rust/packed_simd/ci/docker/powerpc-unknown-linux-gnu/Dockerfile
1317 index 43b174ed87fc..80cfee8ab5b9 100644
1318 --- third_party/rust/packed_simd/ci/docker/powerpc-unknown-linux-gnu/Dockerfile
1319 +++ third_party/rust/packed_simd/ci/docker/powerpc-unknown-linux-gnu/Dockerfile
1320 @@ -1,4 +1,4 @@
1321 -FROM ubuntu:17.10
1322 +FROM ubuntu:18.04
1323  
1324  RUN apt-get update && apt-get install -y --no-install-recommends \
1325          gcc libc6-dev qemu-user ca-certificates \
1326 @@ -9,4 +9,5 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
1327  
1328  ENV CARGO_TARGET_POWERPC_UNKNOWN_LINUX_GNU_LINKER=powerpc-linux-gnu-gcc \
1329      CARGO_TARGET_POWERPC_UNKNOWN_LINUX_GNU_RUNNER="qemu-ppc -cpu Vger -L /usr/powerpc-linux-gnu" \
1330 +    CC=powerpc-linux-gnu-gcc \
1331      OBJDUMP=powerpc-linux-gnu-objdump
1332 diff --git third_party/rust/packed_simd/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile third_party/rust/packed_simd/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile
1333 index 7757ad28a42d..74031a2a3e6f 100644
1334 --- third_party/rust/packed_simd/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile
1335 +++ third_party/rust/packed_simd/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile
1336 @@ -1,4 +1,4 @@
1337 -FROM ubuntu:17.10
1338 +FROM ubuntu:18.04
1339  
1340  RUN apt-get update && apt-get install -y --no-install-recommends \
1341      gcc \
1342 diff --git third_party/rust/packed_simd/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile third_party/rust/packed_simd/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile
1343 index 0b0c214fdf1b..471a7d9651f7 100644
1344 --- third_party/rust/packed_simd/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile
1345 +++ third_party/rust/packed_simd/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile
1346 @@ -1,4 +1,4 @@
1347 -FROM ubuntu:17.10
1348 +FROM ubuntu:18.04
1349  
1350  RUN apt-get update && apt-get install -y --no-install-recommends \
1351          gcc libc6-dev qemu-user ca-certificates \
1352 diff --git third_party/rust/packed_simd/ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile third_party/rust/packed_simd/ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile
1353 index 696cb6c3fb52..588d23c65ae5 100644
1354 --- third_party/rust/packed_simd/ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile
1355 +++ third_party/rust/packed_simd/ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile
1356 @@ -1,4 +1,4 @@
1357 -FROM ubuntu:17.10
1358 +FROM ubuntu:18.04
1359  RUN apt-get update && apt-get install -y --no-install-recommends \
1360    gcc \
1361    ca-certificates \
1362 diff --git third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu/Dockerfile third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu/Dockerfile
1363 index e6b000d0516e..ce5bb88e625d 100644
1364 --- third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu/Dockerfile
1365 +++ third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu/Dockerfile
1366 @@ -1,4 +1,4 @@
1367 -FROM ubuntu:17.10
1368 +FROM ubuntu:18.04
1369  RUN apt-get update && apt-get install -y --no-install-recommends \
1370    gcc \
1371    libc6-dev \
1372 diff --git third_party/rust/packed_simd/ci/dox.sh third_party/rust/packed_simd/ci/dox.sh
1373 index 1743366407e3..560eaadcc880 100755
1374 --- third_party/rust/packed_simd/ci/dox.sh
1375 +++ third_party/rust/packed_simd/ci/dox.sh
1376 @@ -18,7 +18,10 @@ cp -r perf-guide/book target/doc/perf-guide
1377  
1378  # If we're on travis, not a PR, and on the right branch, publish!
1379  if [ "$TRAVIS_PULL_REQUEST" = "false" ] && [ "$TRAVIS_BRANCH" = "master" ]; then
1380 -  pip install ghp_import --install-option="--prefix=$HOME/.local"
1381 -  $HOME/.local/bin/ghp-import -n target/doc
1382 +  python3 -vV
1383 +  pip -vV
1384 +  python3.9 -vV
1385 +  pip install ghp_import --user
1386 +  ghp-import -n target/doc
1387    git push -qf https://${GH_PAGES}@github.com/${TRAVIS_REPO_SLUG}.git gh-pages
1388  fi
1389 diff --git third_party/rust/packed_simd/ci/run.sh third_party/rust/packed_simd/ci/run.sh
1390 index 7bb825883680..428a5d890257 100755
1391 --- third_party/rust/packed_simd/ci/run.sh
1392 +++ third_party/rust/packed_simd/ci/run.sh
1393 @@ -78,9 +78,11 @@ fi
1394  
1395  if [[ "${TARGET}" == "x86_64-unknown-linux-gnu" ]] || [[ "${TARGET}" == "x86_64-pc-windows-msvc" ]]; then
1396      # use sleef on linux and windows x86_64 builds
1397 -    cargo_test_impl --release --features=into_bits,core_arch,sleef-sys
1398 +    # FIXME: Use `core_arch,sleef-sys` features once they works again
1399 +    cargo_test_impl --release --features=into_bits
1400  else
1401 -    cargo_test_impl --release --features=into_bits,core_arch
1402 +    # FIXME: Use `core_arch` feature once it works again
1403 +    cargo_test_impl --release --features=into_bits
1404  fi
1405  
1406  # Verify code generation
1407 diff --git third_party/rust/packed_simd/ci/setup_benchmarks.sh third_party/rust/packed_simd/ci/setup_benchmarks.sh
1408 index ddc4765d5ceb..cd41a7851303 100755
1409 --- third_party/rust/packed_simd/ci/setup_benchmarks.sh
1410 +++ third_party/rust/packed_simd/ci/setup_benchmarks.sh
1411 @@ -5,6 +5,3 @@ set -ex
1412  # Get latest ISPC binary for the target and put it in the path
1413  git clone https://github.com/gnzlbg/ispc-binaries
1414  cp ispc-binaries/ispc-${TARGET} ispc
1415 -
1416 -# Rust-bindgen requires RUSTFMT
1417 -rustup component add rustfmt-preview
1418 diff --git third_party/rust/packed_simd/src/api.rs third_party/rust/packed_simd/src/api.rs
1419 index 9959a052ae96..4e9c4292e06c 100644
1420 --- third_party/rust/packed_simd/src/api.rs
1421 +++ third_party/rust/packed_simd/src/api.rs
1422 @@ -1,5 +1,7 @@
1423  //! Implements the Simd<[T; N]> APIs
1424  
1425 +#[macro_use]
1426 +mod bitmask;
1427  crate mod cast;
1428  #[macro_use]
1429  mod cmp;
1430 @@ -39,7 +41,7 @@ crate mod into_bits;
1431  
1432  macro_rules! impl_i {
1433      ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident
1434 -     | $ielem_ty:ident | $test_tt:tt | $($elem_ids:ident),*
1435 +     | $ielem_ty:ident, $ibitmask_ty:ident | $test_tt:tt | $($elem_ids:ident),*
1436       | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => {
1437          impl_minimal_iuf!([$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
1438                            | $($elem_ids),* | $(#[$doc])*);
1439 @@ -93,6 +95,7 @@ macro_rules! impl_i {
1440          );
1441          impl_cmp_partial_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
1442          impl_cmp_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1));
1443 +        impl_bitmask!($tuple_id | $ibitmask_ty | (-1, 0) | $test_tt);
1444  
1445          test_select!($elem_ty, $mask_ty, $tuple_id, (1, 2) | $test_tt);
1446          test_cmp_partial_ord_int!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
1447 @@ -102,7 +105,7 @@ macro_rules! impl_i {
1448  
1449  macro_rules! impl_u {
1450      ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident
1451 -     | $ielem_ty:ident | $test_tt:tt | $($elem_ids:ident),*
1452 +     | $ielem_ty:ident, $ibitmask_ty:ident | $test_tt:tt | $($elem_ids:ident),*
1453       | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => {
1454          impl_minimal_iuf!([$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt
1455                            | $($elem_ids),* | $(#[$doc])*);
1456 @@ -155,6 +158,8 @@ macro_rules! impl_u {
1457          );
1458          impl_cmp_partial_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
1459          impl_cmp_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1));
1460 +        impl_bitmask!($tuple_id | $ibitmask_ty | ($ielem_ty::max_value(), 0) |
1461 +                      $test_tt);
1462  
1463          test_select!($elem_ty, $mask_ty, $tuple_id, (1, 2) | $test_tt);
1464          test_cmp_partial_ord_int!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
1465 @@ -222,7 +227,8 @@ macro_rules! impl_f {
1466  }
1467  
1468  macro_rules! impl_m {
1469 -    ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident | $ielem_ty:ident
1470 +    ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident
1471 +     | $ielem_ty:ident, $ibitmask_ty:ident
1472       | $test_tt:tt | $($elem_ids:ident),* | From: $($from_vec_ty:ident),*
1473       | $(#[$doc:meta])*) => {
1474          impl_minimal_mask!(
1475 @@ -265,6 +271,7 @@ macro_rules! impl_m {
1476              [$elem_ty; $elem_n]: $tuple_id | $test_tt | (false, true)
1477          );
1478          impl_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
1479 +        impl_bitmask!($tuple_id | $ibitmask_ty | (true, false) | $test_tt);
1480  
1481          test_cmp_partial_ord_mask!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
1482          test_shuffle1_dyn_mask!([$elem_ty; $elem_n]: $tuple_id | $test_tt);
1483 diff --git third_party/rust/packed_simd/src/api/bit_manip.rs third_party/rust/packed_simd/src/api/bit_manip.rs
1484 index 3d3c4eb8850a..6d8865706d3e 100644
1485 --- third_party/rust/packed_simd/src/api/bit_manip.rs
1486 +++ third_party/rust/packed_simd/src/api/bit_manip.rs
1487 @@ -37,6 +37,7 @@ macro_rules! impl_bit_manip {
1488              paste::item_with_macros! {
1489                  #[allow(overflowing_literals)]
1490                  pub mod [<$id _bit_manip>] {
1491 +                    #![allow(const_item_mutation)]
1492                      use super::*;
1493  
1494                      const LANE_WIDTH: usize = mem::size_of::<$elem_ty>() * 8;
1495 diff --git third_party/rust/packed_simd/src/api/bitmask.rs third_party/rust/packed_simd/src/api/bitmask.rs
1496 new file mode 100644
1497 index 000000000000..a06ff0fab1f4
1498 --- /dev/null
1499 +++ third_party/rust/packed_simd/src/api/bitmask.rs
1500 @@ -0,0 +1,82 @@
1501 +//! Bitmask API
1502 +
1503 +macro_rules! impl_bitmask {
1504 +    ($id:ident | $ibitmask_ty:ident | ($set:expr, $clear:expr)
1505 +     | $test_tt:tt) => {
1506 +        impl $id {
1507 +            /// Creates a bitmask with the MSB of each vector lane.
1508 +            ///
1509 +            /// If the vector has less than 8 lanes, the bits that do not
1510 +            /// correspond to any vector lanes are cleared.
1511 +            #[inline]
1512 +            pub fn bitmask(self) -> $ibitmask_ty {
1513 +                unsafe { codegen::llvm::simd_bitmask(self.0) }
1514 +            }
1515 +        }
1516 +
1517 +        test_if! {
1518 +            $test_tt:
1519 +            paste::item! {
1520 +                #[cfg(not(any(
1521 +                    // FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/210
1522 +                    all(target_arch = "mips", target_endian = "big"),
1523 +                    all(target_arch = "mips64", target_endian = "big"),
1524 +                    target_arch = "sparc64",
1525 +                    target_arch = "s390x",
1526 +                )))]
1527 +                pub mod [<$id _bitmask>] {
1528 +                    use super::*;
1529 +                    #[cfg_attr(not(target_arch = "wasm32"), test)]
1530 +                    #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
1531 +                    fn bitmask() {
1532 +                        // clear all lanes
1533 +                        let vec = $id::splat($clear as _);
1534 +                        let bitmask: $ibitmask_ty = 0;
1535 +                        assert_eq!(vec.bitmask(), bitmask);
1536 +
1537 +                        // set even lanes
1538 +                        let mut vec = $id::splat($clear as _);
1539 +                        for i in 0..$id::lanes() {
1540 +                            if i % 2 == 0 {
1541 +                                vec = vec.replace(i, $set as _);
1542 +                            }
1543 +                        }
1544 +                        // create bitmask with even lanes set:
1545 +                        let mut bitmask: $ibitmask_ty = 0;
1546 +                        for i in 0..$id::lanes() {
1547 +                            if i % 2 == 0 {
1548 +                                bitmask |= 1 << i;
1549 +                            }
1550 +                        }
1551 +                        assert_eq!(vec.bitmask(), bitmask);
1552 +
1553 +
1554 +                        // set odd lanes
1555 +                        let mut vec = $id::splat($clear as _);
1556 +                        for i in 0..$id::lanes() {
1557 +                            if i % 2 != 0 {
1558 +                                vec = vec.replace(i, $set as _);
1559 +                            }
1560 +                        }
1561 +                        // create bitmask with odd lanes set:
1562 +                        let mut bitmask: $ibitmask_ty = 0;
1563 +                        for i in 0..$id::lanes() {
1564 +                            if i % 2 != 0 {
1565 +                                bitmask |= 1 << i;
1566 +                            }
1567 +                        }
1568 +                        assert_eq!(vec.bitmask(), bitmask);
1569 +
1570 +                        // set all lanes
1571 +                        let vec = $id::splat($set as _);
1572 +                        let mut bitmask: $ibitmask_ty = 0;
1573 +                        for i in 0..$id::lanes() {
1574 +                            bitmask |= 1 << i;
1575 +                        }
1576 +                        assert_eq!(vec.bitmask(), bitmask);
1577 +                    }
1578 +                }
1579 +            }
1580 +        }
1581 +    };
1582 +}
1583 diff --git third_party/rust/packed_simd/src/api/cast/v128.rs third_party/rust/packed_simd/src/api/cast/v128.rs
1584 index 78c07f3a5597..ab47ddc006d6 100644
1585 --- third_party/rust/packed_simd/src/api/cast/v128.rs
1586 +++ third_party/rust/packed_simd/src/api/cast/v128.rs
1587 @@ -1,5 +1,5 @@
1588  //! `FromCast` and `IntoCast` implementations for portable 128-bit wide vectors
1589 -#![rustfmt::skip]
1590 +#[rustfmt::skip]
1591  
1592  use crate::*;
1593  
1594 diff --git third_party/rust/packed_simd/src/api/cast/v16.rs third_party/rust/packed_simd/src/api/cast/v16.rs
1595 index d292936baa41..cf974bb08e70 100644
1596 --- third_party/rust/packed_simd/src/api/cast/v16.rs
1597 +++ third_party/rust/packed_simd/src/api/cast/v16.rs
1598 @@ -1,5 +1,5 @@
1599  //! `FromCast` and `IntoCast` implementations for portable 16-bit wide vectors
1600 -#![rustfmt::skip]
1601 +#[rustfmt::skip]
1602  
1603  use crate::*;
1604  
1605 diff --git third_party/rust/packed_simd/src/api/cast/v256.rs third_party/rust/packed_simd/src/api/cast/v256.rs
1606 index 0a669e0beebe..9389dcb4c7f7 100644
1607 --- third_party/rust/packed_simd/src/api/cast/v256.rs
1608 +++ third_party/rust/packed_simd/src/api/cast/v256.rs
1609 @@ -1,5 +1,5 @@
1610  //! `FromCast` and `IntoCast` implementations for portable 256-bit wide vectors
1611 -#![rustfmt::skip]
1612 +#[rustfmt::skip]
1613  
1614  use crate::*;
1615  
1616 diff --git third_party/rust/packed_simd/src/api/cast/v32.rs third_party/rust/packed_simd/src/api/cast/v32.rs
1617 index 65050cdacb4e..2b254ba0cf12 100644
1618 --- third_party/rust/packed_simd/src/api/cast/v32.rs
1619 +++ third_party/rust/packed_simd/src/api/cast/v32.rs
1620 @@ -1,5 +1,5 @@
1621  //! `FromCast` and `IntoCast` implementations for portable 32-bit wide vectors
1622 -#![rustfmt::skip]
1623 +#[rustfmt::skip]
1624  
1625  use crate::*;
1626  
1627 diff --git third_party/rust/packed_simd/src/api/cast/v512.rs third_party/rust/packed_simd/src/api/cast/v512.rs
1628 index 9ae1caed35e2..5a10ab066677 100644
1629 --- third_party/rust/packed_simd/src/api/cast/v512.rs
1630 +++ third_party/rust/packed_simd/src/api/cast/v512.rs
1631 @@ -1,5 +1,5 @@
1632  //! `FromCast` and `IntoCast` implementations for portable 512-bit wide vectors
1633 -#![rustfmt::skip]
1634 +#[rustfmt::skip]
1635  
1636  use crate::*;
1637  
1638 diff --git third_party/rust/packed_simd/src/api/cast/v64.rs third_party/rust/packed_simd/src/api/cast/v64.rs
1639 index 0e2f78f7335b..192a4638a362 100644
1640 --- third_party/rust/packed_simd/src/api/cast/v64.rs
1641 +++ third_party/rust/packed_simd/src/api/cast/v64.rs
1642 @@ -1,5 +1,5 @@
1643  //! `FromCast` and `IntoCast` implementations for portable 64-bit wide vectors
1644 -#![rustfmt::skip]
1645 +#[rustfmt::skip]
1646  
1647  use crate::*;
1648  
1649 diff --git third_party/rust/packed_simd/src/api/default.rs third_party/rust/packed_simd/src/api/default.rs
1650 index 843d51bcc4bb..7af55ea77a85 100644
1651 --- third_party/rust/packed_simd/src/api/default.rs
1652 +++ third_party/rust/packed_simd/src/api/default.rs
1653 @@ -12,6 +12,8 @@ macro_rules! impl_default {
1654          test_if!{
1655              $test_tt:
1656              paste::item! {
1657 +                // Comparisons use integer casts within mantissa^1 range.
1658 +                #[allow(clippy::float_cmp)]
1659                  pub mod [<$id _default>] {
1660                      use super::*;
1661                      #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
1662 diff --git third_party/rust/packed_simd/src/api/from/from_array.rs third_party/rust/packed_simd/src/api/from/from_array.rs
1663 index 964d1501df6a..b83f93816262 100644
1664 --- third_party/rust/packed_simd/src/api/from/from_array.rs
1665 +++ third_party/rust/packed_simd/src/api/from/from_array.rs
1666 @@ -56,6 +56,8 @@ macro_rules! impl_from_array {
1667          test_if! {
1668              $test_tt:
1669              paste::item! {
1670 +                // Comparisons use integer casts within mantissa^1 range.
1671 +                #[allow(clippy::float_cmp)]
1672                  mod [<$id _from>] {
1673                      use super::*;
1674                      #[test]
1675 diff --git third_party/rust/packed_simd/src/api/hash.rs third_party/rust/packed_simd/src/api/hash.rs
1676 index 08d42496ea8b..ee80eff939c3 100644
1677 --- third_party/rust/packed_simd/src/api/hash.rs
1678 +++ third_party/rust/packed_simd/src/api/hash.rs
1679 @@ -36,6 +36,8 @@ macro_rules! impl_hash {
1680                          let mut v_hash = a_hash.clone();
1681                          a.hash(&mut a_hash);
1682  
1683 +                        // Integer within mantissa^1 range.
1684 +                        #[allow(clippy::float_cmp)]
1685                          let v = $id::splat(42 as $elem_ty);
1686                          v.hash(&mut v_hash);
1687                          assert_eq!(a_hash.finish(), v_hash.finish());
1688 diff --git third_party/rust/packed_simd/src/api/into_bits/arch_specific.rs third_party/rust/packed_simd/src/api/into_bits/arch_specific.rs
1689 index 6cc2fa37b728..fee6140052f9 100644
1690 --- third_party/rust/packed_simd/src/api/into_bits/arch_specific.rs
1691 +++ third_party/rust/packed_simd/src/api/into_bits/arch_specific.rs
1692 @@ -1,6 +1,6 @@
1693  //! `FromBits` and `IntoBits` between portable vector types and the
1694  //! architecture-specific vector types.
1695 -#![rustfmt::skip]
1696 +#[rustfmt::skip]
1697  
1698  // FIXME: MIPS FromBits/IntoBits
1699  
1700 @@ -84,7 +84,6 @@ macro_rules! impl_arch {
1701  // FIXME: 64-bit single element types
1702  // FIXME: arm/aarch float16x4_t missing
1703  impl_arch!(
1704 -    [x86["x86"]: __m64], [x86_64["x86_64"]: __m64],
1705      [arm["arm"]: int8x8_t, uint8x8_t, poly8x8_t, int16x4_t, uint16x4_t,
1706       poly16x4_t, int32x2_t, uint32x2_t, float32x2_t, int64x1_t,
1707       uint64x1_t],
1708 diff --git third_party/rust/packed_simd/src/api/into_bits/v128.rs third_party/rust/packed_simd/src/api/into_bits/v128.rs
1709 index 804dbf282d53..e32cd7f9f099 100644
1710 --- third_party/rust/packed_simd/src/api/into_bits/v128.rs
1711 +++ third_party/rust/packed_simd/src/api/into_bits/v128.rs
1712 @@ -1,5 +1,5 @@
1713  //! `FromBits` and `IntoBits` implementations for portable 128-bit wide vectors
1714 -#![rustfmt::skip]
1715 +#[rustfmt::skip]
1716  
1717  #[allow(unused)]  // wasm_bindgen_test
1718  use crate::*;
1719 diff --git third_party/rust/packed_simd/src/api/into_bits/v16.rs third_party/rust/packed_simd/src/api/into_bits/v16.rs
1720 index 1162a62e5bd1..e44d0e7f9a18 100644
1721 --- third_party/rust/packed_simd/src/api/into_bits/v16.rs
1722 +++ third_party/rust/packed_simd/src/api/into_bits/v16.rs
1723 @@ -1,5 +1,5 @@
1724  //! `FromBits` and `IntoBits` implementations for portable 16-bit wide vectors
1725 -#![rustfmt::skip]
1726 +#[rustfmt::skip]
1727  
1728  #[allow(unused)]  // wasm_bindgen_test
1729  use crate::*;
1730 diff --git third_party/rust/packed_simd/src/api/into_bits/v256.rs third_party/rust/packed_simd/src/api/into_bits/v256.rs
1731 index cc7a6646b535..c4c373e0d0b8 100644
1732 --- third_party/rust/packed_simd/src/api/into_bits/v256.rs
1733 +++ third_party/rust/packed_simd/src/api/into_bits/v256.rs
1734 @@ -1,5 +1,5 @@
1735  //! `FromBits` and `IntoBits` implementations for portable 256-bit wide vectors
1736 -#![rustfmt::skip]
1737 +#[rustfmt::skip]
1738  
1739  #[allow(unused)]  // wasm_bindgen_test
1740  use crate::*;
1741 diff --git third_party/rust/packed_simd/src/api/into_bits/v32.rs third_party/rust/packed_simd/src/api/into_bits/v32.rs
1742 index 2c183ecf1c77..5dba38a17976 100644
1743 --- third_party/rust/packed_simd/src/api/into_bits/v32.rs
1744 +++ third_party/rust/packed_simd/src/api/into_bits/v32.rs
1745 @@ -1,5 +1,5 @@
1746  //! `FromBits` and `IntoBits` implementations for portable 32-bit wide vectors
1747 -#![rustfmt::skip]
1748 +#[rustfmt::skip]
1749  
1750  #[allow(unused)]  // wasm_bindgen_test
1751  use crate::*;
1752 diff --git third_party/rust/packed_simd/src/api/into_bits/v512.rs third_party/rust/packed_simd/src/api/into_bits/v512.rs
1753 index 8dec6a7f63a0..4a771962c348 100644
1754 --- third_party/rust/packed_simd/src/api/into_bits/v512.rs
1755 +++ third_party/rust/packed_simd/src/api/into_bits/v512.rs
1756 @@ -1,5 +1,5 @@
1757  //! `FromBits` and `IntoBits` implementations for portable 512-bit wide vectors
1758 -#![rustfmt::skip]
1759 +#[rustfmt::skip]
1760  
1761  #[allow(unused)]  // wasm_bindgen_test
1762  use crate::*;
1763 diff --git third_party/rust/packed_simd/src/api/into_bits/v64.rs third_party/rust/packed_simd/src/api/into_bits/v64.rs
1764 index 8999d98e13f8..5b065f1bd5f7 100644
1765 --- third_party/rust/packed_simd/src/api/into_bits/v64.rs
1766 +++ third_party/rust/packed_simd/src/api/into_bits/v64.rs
1767 @@ -1,5 +1,5 @@
1768  //! `FromBits` and `IntoBits` implementations for portable 64-bit wide vectors
1769 -#![rustfmt::skip]
1770 +#[rustfmt::skip]
1771  
1772  #[allow(unused)]  // wasm_bindgen_test
1773  use crate::*;
1774 diff --git third_party/rust/packed_simd/src/api/minimal/iuf.rs third_party/rust/packed_simd/src/api/minimal/iuf.rs
1775 index 58ffabab994f..a155ac178a26 100644
1776 --- third_party/rust/packed_simd/src/api/minimal/iuf.rs
1777 +++ third_party/rust/packed_simd/src/api/minimal/iuf.rs
1778 @@ -53,7 +53,7 @@ macro_rules! impl_minimal_iuf {
1779  
1780              /// Extracts the value at `index`.
1781              ///
1782 -            /// # Precondition
1783 +            /// # Safety
1784              ///
1785              /// If `index >= Self::lanes()` the behavior is undefined.
1786              #[inline]
1787 @@ -80,7 +80,7 @@ macro_rules! impl_minimal_iuf {
1788  
1789              /// Returns a new vector where the value at `index` is replaced by `new_value`.
1790              ///
1791 -            /// # Precondition
1792 +            /// # Safety
1793              ///
1794              /// If `index >= Self::lanes()` the behavior is undefined.
1795              #[inline]
1796 @@ -101,6 +101,8 @@ macro_rules! impl_minimal_iuf {
1797          test_if!{
1798              $test_tt:
1799              paste::item! {
1800 +                // Comparisons use integer casts within mantissa^1 range.
1801 +                #[allow(clippy::float_cmp)]
1802                  pub mod [<$id _minimal>] {
1803                      use super::*;
1804                      #[cfg_attr(not(target_arch = "wasm32"), test)]
1805 diff --git third_party/rust/packed_simd/src/api/minimal/mask.rs third_party/rust/packed_simd/src/api/minimal/mask.rs
1806 index e65be95db12c..a420060b423d 100644
1807 --- third_party/rust/packed_simd/src/api/minimal/mask.rs
1808 +++ third_party/rust/packed_simd/src/api/minimal/mask.rs
1809 @@ -58,6 +58,8 @@ macro_rules! impl_minimal_mask {
1810  
1811              /// Extracts the value at `index`.
1812              ///
1813 +            /// # Safety
1814 +            ///
1815              /// If `index >= Self::lanes()` the behavior is undefined.
1816              #[inline]
1817              pub unsafe fn extract_unchecked(self, index: usize) -> bool {
1818 @@ -85,9 +87,9 @@ macro_rules! impl_minimal_mask {
1819              /// Returns a new vector where the value at `index` is replaced by
1820              /// `new_value`.
1821              ///
1822 -            /// # Panics
1823 +            /// # Safety
1824              ///
1825 -            /// If `index >= Self::lanes()`.
1826 +            /// If `index >= Self::lanes()` the behavior is undefined.
1827              #[inline]
1828              #[must_use = "replace_unchecked does not modify the original value - \
1829                            it returns a new vector with the value at `index` \
1830 diff --git third_party/rust/packed_simd/src/api/minimal/ptr.rs third_party/rust/packed_simd/src/api/minimal/ptr.rs
1831 index 75e5aad5c065..c3d61fbf6d5e 100644
1832 --- third_party/rust/packed_simd/src/api/minimal/ptr.rs
1833 +++ third_party/rust/packed_simd/src/api/minimal/ptr.rs
1834 @@ -68,7 +68,7 @@ macro_rules! impl_minimal_p {
1835  
1836              /// Extracts the value at `index`.
1837              ///
1838 -            /// # Precondition
1839 +            /// # Safety
1840              ///
1841              /// If `index >= Self::lanes()` the behavior is undefined.
1842              #[inline]
1843 @@ -96,7 +96,7 @@ macro_rules! impl_minimal_p {
1844  
1845              /// Returns a new vector where the value at `index` is replaced by `new_value`.
1846              ///
1847 -            /// # Precondition
1848 +            /// # Safety
1849              ///
1850              /// If `index >= Self::lanes()` the behavior is undefined.
1851              #[inline]
1852 @@ -215,7 +215,7 @@ macro_rules! impl_minimal_p {
1853                      f,
1854                      "{}<{}>(",
1855                      stringify!($id),
1856 -                    unsafe { crate::intrinsics::type_name::<T>() }
1857 +                    crate::intrinsics::type_name::<T>()
1858                  )?;
1859                  for i in 0..$elem_count {
1860                      if i > 0 {
1861 @@ -550,11 +550,7 @@ macro_rules! impl_minimal_p {
1862                          ];
1863  
1864                          for i in 0..$elem_count {
1865 -                            let ptr = unsafe {
1866 -                                crate::mem::transmute(
1867 -                                    &values[i] as *const i32
1868 -                                )
1869 -                            };
1870 +                            let ptr = &values[i] as *const i32 as *mut i32;
1871                              vec = vec.replace(i, ptr);
1872                              array[i] = ptr;
1873                          }
1874 @@ -611,7 +607,7 @@ macro_rules! impl_minimal_p {
1875  
1876              /// Instantiates a new vector with the values of the `slice`.
1877              ///
1878 -            /// # Precondition
1879 +            /// # Safety
1880              ///
1881              /// If `slice.len() < Self::lanes()` or `&slice[0]` is not aligned
1882              /// to an `align_of::<Self>()` boundary, the behavior is undefined.
1883 @@ -624,7 +620,7 @@ macro_rules! impl_minimal_p {
1884  
1885              /// Instantiates a new vector with the values of the `slice`.
1886              ///
1887 -            /// # Precondition
1888 +            /// # Safety
1889              ///
1890              /// If `slice.len() < Self::lanes()` the behavior is undefined.
1891              #[inline]
1892 @@ -827,7 +823,7 @@ macro_rules! impl_minimal_p {
1893  
1894              /// Writes the values of the vector to the `slice`.
1895              ///
1896 -            /// # Precondition
1897 +            /// # Safety
1898              ///
1899              /// If `slice.len() < Self::lanes()` or `&slice[0]` is not
1900              /// aligned to an `align_of::<Self>()` boundary, the behavior is
1901 @@ -843,7 +839,7 @@ macro_rules! impl_minimal_p {
1902  
1903              /// Writes the values of the vector to the `slice`.
1904              ///
1905 -            /// # Precondition
1906 +            /// # Safety
1907              ///
1908              /// If `slice.len() < Self::lanes()` the behavior is undefined.
1909              #[inline]
1910 @@ -1025,11 +1021,7 @@ macro_rules! impl_minimal_p {
1911                          ];
1912  
1913                          for i in 0..$elem_count {
1914 -                            let ptr = unsafe {
1915 -                                crate::mem::transmute(
1916 -                                    &values[i] as *const i32
1917 -                                )
1918 -                            };
1919 +                            let ptr = &values[i] as *const i32 as *mut i32;
1920                              vec = vec.replace(i, ptr);
1921                              array[i] = ptr;
1922                          }
1923 @@ -1151,7 +1143,7 @@ macro_rules! impl_minimal_p {
1924              /// As such, memory acquired directly from allocators or memory
1925              /// mapped files may be too large to handle with this function.
1926              ///
1927 -            /// Consider using wrapping_offset_from instead if these constraints
1928 +            /// Consider using `wrapping_offset_from` instead if these constraints
1929              /// are difficult to satisfy. The only advantage of this method is
1930              /// that it enables more aggressive compiler optimizations.
1931              #[inline]
1932 diff --git third_party/rust/packed_simd/src/api/ops/vector_float_min_max.rs third_party/rust/packed_simd/src/api/ops/vector_float_min_max.rs
1933 index 4126e87042f5..8310667b7a8d 100644
1934 --- third_party/rust/packed_simd/src/api/ops/vector_float_min_max.rs
1935 +++ third_party/rust/packed_simd/src/api/ops/vector_float_min_max.rs
1936 @@ -26,6 +26,11 @@ macro_rules! impl_ops_vector_float_min_max {
1937          test_if!{
1938              $test_tt:
1939              paste::item! {
1940 +                #[cfg(not(any(
1941 +                    // FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/223
1942 +                    all(target_arch = "mips", target_endian = "big"),
1943 +                    target_arch = "mips64",
1944 +                )))]
1945                  pub mod [<$id _ops_vector_min_max>] {
1946                      use super::*;
1947                      #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
1948 diff --git third_party/rust/packed_simd/src/api/ptr/gather_scatter.rs third_party/rust/packed_simd/src/api/ptr/gather_scatter.rs
1949 index 9d8e113bb44f..430435620939 100644
1950 --- third_party/rust/packed_simd/src/api/ptr/gather_scatter.rs
1951 +++ third_party/rust/packed_simd/src/api/ptr/gather_scatter.rs
1952 @@ -49,9 +49,9 @@ macro_rules! impl_ptr_read {
1953                          let mut ptr = $id::<i32>::null();
1954  
1955                          for i in 0..$elem_count {
1956 -                            ptr = ptr.replace(i, unsafe {
1957 -                                crate::mem::transmute(&v[i] as *const i32)
1958 -                            });
1959 +                            ptr = ptr.replace(i,
1960 +                                &v[i] as *const i32 as *mut i32
1961 +                            );
1962                          }
1963  
1964                          // all mask elements are true:
1965 @@ -135,32 +135,8 @@ macro_rules! impl_ptr_write {
1966                  M: sealed::Mask,
1967                  [M; $elem_count]: sealed::SimdArray,
1968              {
1969 -                // FIXME:
1970 -                // https://github.com/rust-lang-nursery/packed_simd/issues/85
1971 -                #[cfg(not(target_arch = "mips"))]
1972 -                {
1973 -                    use crate::llvm::simd_scatter;
1974 -                    simd_scatter(value.0, self.0, mask.0)
1975 -                }
1976 -                #[cfg(target_arch = "mips")]
1977 -                {
1978 -                    let m_ptr =
1979 -                        &mask as *const Simd<[M; $elem_count]> as *const M;
1980 -                    for i in 0..$elem_count {
1981 -                        let m = ptr::read(m_ptr.add(i));
1982 -                        if m.test() {
1983 -                            let t_ptr = &self
1984 -                                as *const Simd<[*mut T; $elem_count]>
1985 -                                as *mut *mut T;
1986 -                            let v_ptr = &value as *const Simd<[T; $elem_count]>
1987 -                                as *const T;
1988 -                            ptr::write(
1989 -                                ptr::read(t_ptr.add(i)),
1990 -                                ptr::read(v_ptr.add(i)),
1991 -                            );
1992 -                        }
1993 -                    }
1994 -                }
1995 +                use crate::llvm::simd_scatter;
1996 +                simd_scatter(value.0, self.0, mask.0)
1997              }
1998          }
1999  
2000 @@ -185,7 +161,7 @@ macro_rules! impl_ptr_write {
2001                          let mut ptr = $id::<i32>::null();
2002                          for i in 0..$elem_count {
2003                              ptr = ptr.replace(i, unsafe {
2004 -                                crate::mem::transmute(arr.as_ptr().add(i))
2005 +                                arr.as_ptr().add(i) as *mut i32
2006                              });
2007                          }
2008                          // ptr = [&arr[0], &arr[1], ...]
2009 diff --git third_party/rust/packed_simd/src/api/reductions/float_arithmetic.rs third_party/rust/packed_simd/src/api/reductions/float_arithmetic.rs
2010 index dd722ae25fdd..4a47452e5006 100644
2011 --- third_party/rust/packed_simd/src/api/reductions/float_arithmetic.rs
2012 +++ third_party/rust/packed_simd/src/api/reductions/float_arithmetic.rs
2013 @@ -93,6 +93,8 @@ macro_rules! impl_reduction_float_arithmetic {
2014          test_if! {
2015              $test_tt:
2016              paste::item! {
2017 +                // Comparisons use integer casts within mantissa^1 range.
2018 +                #[allow(clippy::float_cmp)]
2019                  pub mod [<$id _reduction_float_arith>] {
2020                      use super::*;
2021                      fn alternating(x: usize) -> $id {
2022 @@ -225,7 +227,7 @@ macro_rules! impl_reduction_float_arithmetic {
2023                          let mut v = $id::splat(0. as $elem_ty);
2024                          for i in 0..$id::lanes() {
2025                              let c = if i % 2 == 0 { 1e3 } else { -1. };
2026 -                            start *= 3.14 * c;
2027 +                            start *= ::core::$elem_ty::consts::PI * c;
2028                              scalar_reduction += start;
2029                              v = v.replace(i, start);
2030                          }
2031 @@ -257,6 +259,7 @@ macro_rules! impl_reduction_float_arithmetic {
2032                      #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
2033                      #[allow(unused, dead_code)]
2034                      fn product_roundoff() {
2035 +                        use ::core::convert::TryInto;
2036                          // Performs a tree-reduction
2037                          fn tree_reduce_product(a: &[$elem_ty]) -> $elem_ty {
2038                              assert!(!a.is_empty());
2039 @@ -278,7 +281,7 @@ macro_rules! impl_reduction_float_arithmetic {
2040                          let mut v = $id::splat(0. as $elem_ty);
2041                          for i in 0..$id::lanes() {
2042                              let c = if i % 2 == 0 { 1e3 } else { -1. };
2043 -                            start *= 3.14 * c;
2044 +                            start *= ::core::$elem_ty::consts::PI * c;
2045                              scalar_reduction *= start;
2046                              v = v.replace(i, start);
2047                          }
2048 @@ -288,7 +291,9 @@ macro_rules! impl_reduction_float_arithmetic {
2049                          v.write_to_slice_unaligned(&mut a);
2050                          let tree_reduction = tree_reduce_product(&a);
2051  
2052 -                        // tolerate 1 ULP difference:
2053 +                        // FIXME: Too imprecise, even only for product(f32x8).
2054 +                        // Figure out how to narrow this down.
2055 +                        let ulp_limit = $id::lanes() / 2;
2056                          let red_bits = simd_reduction.to_bits();
2057                          let tree_bits = tree_reduction.to_bits();
2058                          assert!(
2059 @@ -296,7 +301,7 @@ macro_rules! impl_reduction_float_arithmetic {
2060                                  red_bits - tree_bits
2061                              } else {
2062                                  tree_bits - red_bits
2063 -                            } < 2,
2064 +                            } < ulp_limit.try_into().unwrap(),
2065                              "vector: {:?} | simd_reduction: {:?} | \
2066                               tree_reduction: {} | scalar_reduction: {}",
2067                              v,
2068 diff --git third_party/rust/packed_simd/src/api/reductions/min_max.rs third_party/rust/packed_simd/src/api/reductions/min_max.rs
2069 index c4d3aa10f15c..c4c1400a8fc4 100644
2070 --- third_party/rust/packed_simd/src/api/reductions/min_max.rs
2071 +++ third_party/rust/packed_simd/src/api/reductions/min_max.rs
2072 @@ -76,6 +76,8 @@ macro_rules! impl_reduction_min_max {
2073          }
2074          test_if! {$test_tt:
2075          paste::item! {
2076 +            // Comparisons use integer casts within mantissa^1 range.
2077 +            #[allow(clippy::float_cmp)]
2078              pub mod [<$id _reduction_min_max>] {
2079                  use super::*;
2080                  #[cfg_attr(not(target_arch = "wasm32"), test)]
2081 @@ -124,6 +126,8 @@ macro_rules! test_reduction_float_min_max {
2082          test_if!{
2083              $test_tt:
2084              paste::item! {
2085 +                // Comparisons use integer casts within mantissa^1 range.
2086 +                #[allow(clippy::float_cmp)]
2087                  pub mod [<$id _reduction_min_max_nan>] {
2088                      use super::*;
2089                      #[cfg_attr(not(target_arch = "wasm32"), test)]
2090 diff --git third_party/rust/packed_simd/src/api/slice/from_slice.rs third_party/rust/packed_simd/src/api/slice/from_slice.rs
2091 index 109cd1f10b01..25082d1e6800 100644
2092 --- third_party/rust/packed_simd/src/api/slice/from_slice.rs
2093 +++ third_party/rust/packed_simd/src/api/slice/from_slice.rs
2094 @@ -38,7 +38,7 @@ macro_rules! impl_slice_from_slice {
2095  
2096              /// Instantiates a new vector with the values of the `slice`.
2097              ///
2098 -            /// # Precondition
2099 +            /// # Safety
2100              ///
2101              /// If `slice.len() < Self::lanes()` or `&slice[0]` is not aligned
2102              /// to an `align_of::<Self>()` boundary, the behavior is undefined.
2103 @@ -59,7 +59,7 @@ macro_rules! impl_slice_from_slice {
2104  
2105              /// Instantiates a new vector with the values of the `slice`.
2106              ///
2107 -            /// # Precondition
2108 +            /// # Safety
2109              ///
2110              /// If `slice.len() < Self::lanes()` the behavior is undefined.
2111              #[inline]
2112 @@ -84,6 +84,8 @@ macro_rules! impl_slice_from_slice {
2113          test_if! {
2114              $test_tt:
2115              paste::item! {
2116 +                // Comparisons use integer casts within mantissa^1 range.
2117 +                #[allow(clippy::float_cmp)]
2118                  pub mod [<$id _slice_from_slice>] {
2119                      use super::*;
2120                      use crate::iter::Iterator;
2121 diff --git third_party/rust/packed_simd/src/api/slice/write_to_slice.rs third_party/rust/packed_simd/src/api/slice/write_to_slice.rs
2122 index fcb288da70fc..b634d98b9962 100644
2123 --- third_party/rust/packed_simd/src/api/slice/write_to_slice.rs
2124 +++ third_party/rust/packed_simd/src/api/slice/write_to_slice.rs
2125 @@ -39,7 +39,7 @@ macro_rules! impl_slice_write_to_slice {
2126  
2127              /// Writes the values of the vector to the `slice`.
2128              ///
2129 -            /// # Precondition
2130 +            /// # Safety
2131              ///
2132              /// If `slice.len() < Self::lanes()` or `&slice[0]` is not
2133              /// aligned to an `align_of::<Self>()` boundary, the behavior is
2134 @@ -64,7 +64,7 @@ macro_rules! impl_slice_write_to_slice {
2135  
2136              /// Writes the values of the vector to the `slice`.
2137              ///
2138 -            /// # Precondition
2139 +            /// # Safety
2140              ///
2141              /// If `slice.len() < Self::lanes()` the behavior is undefined.
2142              #[inline]
2143 @@ -86,6 +86,8 @@ macro_rules! impl_slice_write_to_slice {
2144          test_if! {
2145              $test_tt:
2146              paste::item! {
2147 +                // Comparisons use integer casts within mantissa^1 range.
2148 +                #[allow(clippy::float_cmp)]
2149                  pub mod [<$id _slice_write_to_slice>] {
2150                      use super::*;
2151                      use crate::iter::Iterator;
2152 diff --git third_party/rust/packed_simd/src/codegen.rs third_party/rust/packed_simd/src/codegen.rs
2153 index b7ccd838603f..9d1517e203d1 100644
2154 --- third_party/rust/packed_simd/src/codegen.rs
2155 +++ third_party/rust/packed_simd/src/codegen.rs
2156 @@ -16,6 +16,8 @@ macro_rules! impl_simd_array {
2157          pub struct $tuple_id($(crate $elem_tys),*);
2158          //^^^^^^^ leaked through SimdArray
2159  
2160 +        impl crate::sealed::Seal for [$elem_ty; $elem_count] {}
2161 +
2162          impl crate::sealed::SimdArray for [$elem_ty; $elem_count] {
2163              type Tuple = $tuple_id;
2164              type T = $elem_ty;
2165 @@ -23,6 +25,7 @@ macro_rules! impl_simd_array {
2166              type NT = [u32; $elem_count];
2167          }
2168  
2169 +        impl crate::sealed::Seal for $tuple_id {}
2170          impl crate::sealed::Simd for $tuple_id {
2171              type Element = $elem_ty;
2172              const LANES: usize = $elem_count;
2173 diff --git third_party/rust/packed_simd/src/codegen/bit_manip.rs third_party/rust/packed_simd/src/codegen/bit_manip.rs
2174 index 947266f5bce8..83c7d1987cac 100644
2175 --- third_party/rust/packed_simd/src/codegen/bit_manip.rs
2176 +++ third_party/rust/packed_simd/src/codegen/bit_manip.rs
2177 @@ -1,5 +1,5 @@
2178  //! LLVM bit manipulation intrinsics.
2179 -#![rustfmt::skip]
2180 +#[rustfmt::skip]
2181  
2182  use crate::*;
2183  
2184 diff --git third_party/rust/packed_simd/src/codegen/llvm.rs third_party/rust/packed_simd/src/codegen/llvm.rs
2185 index 91c2b0758dcf..93c6ce6b77ed 100644
2186 --- third_party/rust/packed_simd/src/codegen/llvm.rs
2187 +++ third_party/rust/packed_simd/src/codegen/llvm.rs
2188 @@ -10,31 +10,37 @@ extern "platform-intrinsic" {
2189      // FIXME: Passing this intrinsics an `idx` array with an index that is
2190      // out-of-bounds will produce a monomorphization-time error.
2191      // https://github.com/rust-lang-nursery/packed_simd/issues/21
2192 +    #[rustc_args_required_const(2)]
2193      pub fn simd_shuffle2<T, U>(x: T, y: T, idx: [u32; 2]) -> U
2194      where
2195          T: Simd,
2196          <T as Simd>::Element: Shuffle<[u32; 2], Output = U>;
2197  
2198 +    #[rustc_args_required_const(2)]
2199      pub fn simd_shuffle4<T, U>(x: T, y: T, idx: [u32; 4]) -> U
2200      where
2201          T: Simd,
2202          <T as Simd>::Element: Shuffle<[u32; 4], Output = U>;
2203  
2204 +    #[rustc_args_required_const(2)]
2205      pub fn simd_shuffle8<T, U>(x: T, y: T, idx: [u32; 8]) -> U
2206      where
2207          T: Simd,
2208          <T as Simd>::Element: Shuffle<[u32; 8], Output = U>;
2209  
2210 +    #[rustc_args_required_const(2)]
2211      pub fn simd_shuffle16<T, U>(x: T, y: T, idx: [u32; 16]) -> U
2212      where
2213          T: Simd,
2214          <T as Simd>::Element: Shuffle<[u32; 16], Output = U>;
2215  
2216 +    #[rustc_args_required_const(2)]
2217      pub fn simd_shuffle32<T, U>(x: T, y: T, idx: [u32; 32]) -> U
2218      where
2219          T: Simd,
2220          <T as Simd>::Element: Shuffle<[u32; 32], Output = U>;
2221  
2222 +    #[rustc_args_required_const(2)]
2223      pub fn simd_shuffle64<T, U>(x: T, y: T, idx: [u32; 64]) -> U
2224      where
2225          T: Simd,
2226 @@ -96,4 +102,6 @@ extern "platform-intrinsic" {
2227  
2228      crate fn simd_gather<T, P, M>(value: T, pointers: P, mask: M) -> T;
2229      crate fn simd_scatter<T, P, M>(value: T, pointers: P, mask: M);
2230 +
2231 +    crate fn simd_bitmask<T, U>(value: T) -> U;
2232  }
2233 diff --git third_party/rust/packed_simd/src/codegen/reductions/mask/x86.rs third_party/rust/packed_simd/src/codegen/reductions/mask/x86.rs
2234 index 2ae4ed81c416..bcfb1a6e1772 100644
2235 --- third_party/rust/packed_simd/src/codegen/reductions/mask/x86.rs
2236 +++ third_party/rust/packed_simd/src/codegen/reductions/mask/x86.rs
2237 @@ -19,13 +19,7 @@ mod avx2;
2238  /// x86 64-bit m8x8 implementation
2239  macro_rules! x86_m8x8_impl {
2240      ($id:ident) => {
2241 -        cfg_if! {
2242 -            if #[cfg(all(target_arch = "x86_64", target_feature = "sse"))] {
2243 -                x86_m8x8_sse_impl!($id);
2244 -            } else {
2245 -                fallback_impl!($id);
2246 -            }
2247 -        }
2248 +        fallback_impl!($id);
2249      };
2250  }
2251  
2252 diff --git third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse.rs third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse.rs
2253 index 7482f9430a14..eb1ef7fac922 100644
2254 --- third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse.rs
2255 +++ third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse.rs
2256 @@ -34,35 +34,3 @@ macro_rules! x86_m32x4_sse_impl {
2257          }
2258      };
2259  }
2260 -
2261 -macro_rules! x86_m8x8_sse_impl {
2262 -    ($id:ident) => {
2263 -        impl All for $id {
2264 -            #[inline]
2265 -            #[target_feature(enable = "sse")]
2266 -            unsafe fn all(self) -> bool {
2267 -                #[cfg(target_arch = "x86")]
2268 -                use crate::arch::x86::_mm_movemask_pi8;
2269 -                #[cfg(target_arch = "x86_64")]
2270 -                use crate::arch::x86_64::_mm_movemask_pi8;
2271 -                // _mm_movemask_pi8(a) creates an 8bit mask containing the most
2272 -                // significant bit of each byte of `a`. If all bits are set,
2273 -                // then all 8 lanes of the mask are true.
2274 -                _mm_movemask_pi8(crate::mem::transmute(self))
2275 -                    == u8::max_value() as i32
2276 -            }
2277 -        }
2278 -        impl Any for $id {
2279 -            #[inline]
2280 -            #[target_feature(enable = "sse")]
2281 -            unsafe fn any(self) -> bool {
2282 -                #[cfg(target_arch = "x86")]
2283 -                use crate::arch::x86::_mm_movemask_pi8;
2284 -                #[cfg(target_arch = "x86_64")]
2285 -                use crate::arch::x86_64::_mm_movemask_pi8;
2286 -
2287 -                _mm_movemask_pi8(crate::mem::transmute(self)) != 0
2288 -            }
2289 -        }
2290 -    };
2291 -}
2292 diff --git third_party/rust/packed_simd/src/codegen/shuffle.rs third_party/rust/packed_simd/src/codegen/shuffle.rs
2293 index 35a9db905339..d92c9ee22427 100644
2294 --- third_party/rust/packed_simd/src/codegen/shuffle.rs
2295 +++ third_party/rust/packed_simd/src/codegen/shuffle.rs
2296 @@ -2,301 +2,149 @@
2297  //! lanes and vector element types.
2298  
2299  use crate::masks::*;
2300 -use crate::sealed::Shuffle;
2301 -
2302 -impl Shuffle<[u32; 2]> for i8 {
2303 -    type Output = crate::codegen::i8x2;
2304 -}
2305 -impl Shuffle<[u32; 4]> for i8 {
2306 -    type Output = crate::codegen::i8x4;
2307 -}
2308 -impl Shuffle<[u32; 8]> for i8 {
2309 -    type Output = crate::codegen::i8x8;
2310 -}
2311 -impl Shuffle<[u32; 16]> for i8 {
2312 -    type Output = crate::codegen::i8x16;
2313 -}
2314 -impl Shuffle<[u32; 32]> for i8 {
2315 -    type Output = crate::codegen::i8x32;
2316 -}
2317 -impl Shuffle<[u32; 64]> for i8 {
2318 -    type Output = crate::codegen::i8x64;
2319 -}
2320 -
2321 -impl Shuffle<[u32; 2]> for u8 {
2322 -    type Output = crate::codegen::u8x2;
2323 -}
2324 -impl Shuffle<[u32; 4]> for u8 {
2325 -    type Output = crate::codegen::u8x4;
2326 -}
2327 -impl Shuffle<[u32; 8]> for u8 {
2328 -    type Output = crate::codegen::u8x8;
2329 -}
2330 -impl Shuffle<[u32; 16]> for u8 {
2331 -    type Output = crate::codegen::u8x16;
2332 -}
2333 -impl Shuffle<[u32; 32]> for u8 {
2334 -    type Output = crate::codegen::u8x32;
2335 -}
2336 -impl Shuffle<[u32; 64]> for u8 {
2337 -    type Output = crate::codegen::u8x64;
2338 -}
2339 -
2340 -impl Shuffle<[u32; 2]> for m8 {
2341 -    type Output = crate::codegen::m8x2;
2342 -}
2343 -impl Shuffle<[u32; 4]> for m8 {
2344 -    type Output = crate::codegen::m8x4;
2345 -}
2346 -impl Shuffle<[u32; 8]> for m8 {
2347 -    type Output = crate::codegen::m8x8;
2348 -}
2349 -impl Shuffle<[u32; 16]> for m8 {
2350 -    type Output = crate::codegen::m8x16;
2351 -}
2352 -impl Shuffle<[u32; 32]> for m8 {
2353 -    type Output = crate::codegen::m8x32;
2354 -}
2355 -impl Shuffle<[u32; 64]> for m8 {
2356 -    type Output = crate::codegen::m8x64;
2357 -}
2358 -
2359 -impl Shuffle<[u32; 2]> for i16 {
2360 -    type Output = crate::codegen::i16x2;
2361 -}
2362 -impl Shuffle<[u32; 4]> for i16 {
2363 -    type Output = crate::codegen::i16x4;
2364 -}
2365 -impl Shuffle<[u32; 8]> for i16 {
2366 -    type Output = crate::codegen::i16x8;
2367 -}
2368 -impl Shuffle<[u32; 16]> for i16 {
2369 -    type Output = crate::codegen::i16x16;
2370 -}
2371 -impl Shuffle<[u32; 32]> for i16 {
2372 -    type Output = crate::codegen::i16x32;
2373 -}
2374 -
2375 -impl Shuffle<[u32; 2]> for u16 {
2376 -    type Output = crate::codegen::u16x2;
2377 -}
2378 -impl Shuffle<[u32; 4]> for u16 {
2379 -    type Output = crate::codegen::u16x4;
2380 -}
2381 -impl Shuffle<[u32; 8]> for u16 {
2382 -    type Output = crate::codegen::u16x8;
2383 -}
2384 -impl Shuffle<[u32; 16]> for u16 {
2385 -    type Output = crate::codegen::u16x16;
2386 -}
2387 -impl Shuffle<[u32; 32]> for u16 {
2388 -    type Output = crate::codegen::u16x32;
2389 -}
2390 -
2391 -impl Shuffle<[u32; 2]> for m16 {
2392 -    type Output = crate::codegen::m16x2;
2393 -}
2394 -impl Shuffle<[u32; 4]> for m16 {
2395 -    type Output = crate::codegen::m16x4;
2396 -}
2397 -impl Shuffle<[u32; 8]> for m16 {
2398 -    type Output = crate::codegen::m16x8;
2399 -}
2400 -impl Shuffle<[u32; 16]> for m16 {
2401 -    type Output = crate::codegen::m16x16;
2402 -}
2403 -impl Shuffle<[u32; 32]> for m16 {
2404 -    type Output = crate::codegen::m16x32;
2405 -}
2406 -
2407 -impl Shuffle<[u32; 2]> for i32 {
2408 -    type Output = crate::codegen::i32x2;
2409 -}
2410 -impl Shuffle<[u32; 4]> for i32 {
2411 -    type Output = crate::codegen::i32x4;
2412 -}
2413 -impl Shuffle<[u32; 8]> for i32 {
2414 -    type Output = crate::codegen::i32x8;
2415 -}
2416 -impl Shuffle<[u32; 16]> for i32 {
2417 -    type Output = crate::codegen::i32x16;
2418 -}
2419 -
2420 -impl Shuffle<[u32; 2]> for u32 {
2421 -    type Output = crate::codegen::u32x2;
2422 -}
2423 -impl Shuffle<[u32; 4]> for u32 {
2424 -    type Output = crate::codegen::u32x4;
2425 -}
2426 -impl Shuffle<[u32; 8]> for u32 {
2427 -    type Output = crate::codegen::u32x8;
2428 -}
2429 -impl Shuffle<[u32; 16]> for u32 {
2430 -    type Output = crate::codegen::u32x16;
2431 -}
2432 -
2433 -impl Shuffle<[u32; 2]> for f32 {
2434 -    type Output = crate::codegen::f32x2;
2435 -}
2436 -impl Shuffle<[u32; 4]> for f32 {
2437 -    type Output = crate::codegen::f32x4;
2438 -}
2439 -impl Shuffle<[u32; 8]> for f32 {
2440 -    type Output = crate::codegen::f32x8;
2441 -}
2442 -impl Shuffle<[u32; 16]> for f32 {
2443 -    type Output = crate::codegen::f32x16;
2444 -}
2445 -
2446 -impl Shuffle<[u32; 2]> for m32 {
2447 -    type Output = crate::codegen::m32x2;
2448 -}
2449 -impl Shuffle<[u32; 4]> for m32 {
2450 -    type Output = crate::codegen::m32x4;
2451 -}
2452 -impl Shuffle<[u32; 8]> for m32 {
2453 -    type Output = crate::codegen::m32x8;
2454 -}
2455 -impl Shuffle<[u32; 16]> for m32 {
2456 -    type Output = crate::codegen::m32x16;
2457 -}
2458 +use crate::sealed::{Shuffle, Seal};
2459 +
2460 +macro_rules! impl_shuffle {
2461 +    ($array:ty, $base:ty, $out:ty) => {
2462 +        impl Seal<$array> for $base {}
2463 +        impl Shuffle<$array> for $base {
2464 +            type Output = $out;
2465 +        }
2466 +    }
2467 +}
2468 +
2469 +impl_shuffle! { [u32; 2], i8, crate::codegen::i8x2 }
2470 +impl_shuffle! { [u32; 4], i8, crate::codegen::i8x4 }
2471 +impl_shuffle! { [u32; 8], i8, crate::codegen::i8x8 }
2472 +impl_shuffle! { [u32; 16], i8, crate::codegen::i8x16 }
2473 +impl_shuffle! { [u32; 32], i8, crate::codegen::i8x32 }
2474 +impl_shuffle! { [u32; 64], i8, crate::codegen::i8x64 }
2475 +
2476 +impl_shuffle! { [u32; 2], u8, crate::codegen::u8x2 }
2477 +impl_shuffle! { [u32; 4], u8, crate::codegen::u8x4 }
2478 +impl_shuffle! { [u32; 8], u8, crate::codegen::u8x8 }
2479 +impl_shuffle! { [u32; 16], u8, crate::codegen::u8x16 }
2480 +impl_shuffle! { [u32; 32], u8, crate::codegen::u8x32 }
2481 +impl_shuffle! { [u32; 64], u8, crate::codegen::u8x64 }
2482 +
2483 +impl_shuffle! { [u32; 2], m8, crate::codegen::m8x2 }
2484 +impl_shuffle! { [u32; 4], m8, crate::codegen::m8x4 }
2485 +impl_shuffle! { [u32; 8], m8, crate::codegen::m8x8 }
2486 +impl_shuffle! { [u32; 16], m8, crate::codegen::m8x16 }
2487 +impl_shuffle! { [u32; 32], m8, crate::codegen::m8x32 }
2488 +impl_shuffle! { [u32; 64], m8, crate::codegen::m8x64 }
2489 +
2490 +impl_shuffle! { [u32; 2], i16, crate::codegen::i16x2 }
2491 +impl_shuffle! { [u32; 4], i16, crate::codegen::i16x4 }
2492 +impl_shuffle! { [u32; 8], i16, crate::codegen::i16x8 }
2493 +impl_shuffle! { [u32; 16], i16, crate::codegen::i16x16 }
2494 +impl_shuffle! { [u32; 32], i16, crate::codegen::i16x32 }
2495 +
2496 +impl_shuffle! { [u32; 2], u16, crate::codegen::u16x2 }
2497 +impl_shuffle! { [u32; 4], u16, crate::codegen::u16x4 }
2498 +impl_shuffle! { [u32; 8], u16, crate::codegen::u16x8 }
2499 +impl_shuffle! { [u32; 16], u16, crate::codegen::u16x16 }
2500 +impl_shuffle! { [u32; 32], u16, crate::codegen::u16x32 }
2501 +
2502 +impl_shuffle! { [u32; 2], m16, crate::codegen::m16x2 }
2503 +impl_shuffle! { [u32; 4], m16, crate::codegen::m16x4 }
2504 +impl_shuffle! { [u32; 8], m16, crate::codegen::m16x8 }
2505 +impl_shuffle! { [u32; 16], m16, crate::codegen::m16x16 }
2506 +
2507 +impl_shuffle! { [u32; 2], i32, crate::codegen::i32x2 }
2508 +impl_shuffle! { [u32; 4], i32, crate::codegen::i32x4 }
2509 +impl_shuffle! { [u32; 8], i32, crate::codegen::i32x8 }
2510 +impl_shuffle! { [u32; 16], i32, crate::codegen::i32x16 }
2511 +
2512 +impl_shuffle! { [u32; 2], u32, crate::codegen::u32x2 }
2513 +impl_shuffle! { [u32; 4], u32, crate::codegen::u32x4 }
2514 +impl_shuffle! { [u32; 8], u32, crate::codegen::u32x8 }
2515 +impl_shuffle! { [u32; 16], u32, crate::codegen::u32x16 }
2516 +
2517 +impl_shuffle! { [u32; 2], f32, crate::codegen::f32x2 }
2518 +impl_shuffle! { [u32; 4], f32, crate::codegen::f32x4 }
2519 +impl_shuffle! { [u32; 8], f32, crate::codegen::f32x8 }
2520 +impl_shuffle! { [u32; 16], f32, crate::codegen::f32x16 }
2521 +
2522 +impl_shuffle! { [u32; 2], m32, crate::codegen::m32x2 }
2523 +impl_shuffle! { [u32; 4], m32, crate::codegen::m32x4 }
2524 +impl_shuffle! { [u32; 8], m32, crate::codegen::m32x8 }
2525 +impl_shuffle! { [u32; 16], m32, crate::codegen::m32x16 }
2526  
2527  /* FIXME: 64-bit single element vector
2528 -impl Shuffle<[u32; 1]> for i64 {
2529 -    type Output = crate::codegen::i64x1;
2530 -}
2531 +impl_shuffle! { [u32; 1], i64, crate::codegen::i64x1 }
2532  */
2533 -impl Shuffle<[u32; 2]> for i64 {
2534 -    type Output = crate::codegen::i64x2;
2535 -}
2536 -impl Shuffle<[u32; 4]> for i64 {
2537 -    type Output = crate::codegen::i64x4;
2538 -}
2539 -impl Shuffle<[u32; 8]> for i64 {
2540 -    type Output = crate::codegen::i64x8;
2541 -}
2542 +impl_shuffle! { [u32; 2], i64, crate::codegen::i64x2 }
2543 +impl_shuffle! { [u32; 4], i64, crate::codegen::i64x4 }
2544 +impl_shuffle! { [u32; 8], i64, crate::codegen::i64x8 }
2545  
2546  /* FIXME: 64-bit single element vector
2547 -impl Shuffle<[u32; 1]> for u64 {
2548 -    type Output = crate::codegen::u64x1;
2549 -}
2550 +impl_shuffle! { [u32; 1], i64, crate::codegen::i64x1 }
2551  */
2552 -impl Shuffle<[u32; 2]> for u64 {
2553 -    type Output = crate::codegen::u64x2;
2554 -}
2555 -impl Shuffle<[u32; 4]> for u64 {
2556 -    type Output = crate::codegen::u64x4;
2557 -}
2558 -impl Shuffle<[u32; 8]> for u64 {
2559 -    type Output = crate::codegen::u64x8;
2560 -}
2561 +impl_shuffle! { [u32; 2], u64, crate::codegen::u64x2 }
2562 +impl_shuffle! { [u32; 4], u64, crate::codegen::u64x4 }
2563 +impl_shuffle! { [u32; 8], u64, crate::codegen::u64x8 }
2564  
2565  /* FIXME: 64-bit single element vector
2566 -impl Shuffle<[u32; 1]> for f64 {
2567 -    type Output = crate::codegen::f64x1;
2568 -}
2569 +impl_shuffle! { [u32; 1], i64, crate::codegen::i64x1 }
2570  */
2571 -impl Shuffle<[u32; 2]> for f64 {
2572 -    type Output = crate::codegen::f64x2;
2573 -}
2574 -impl Shuffle<[u32; 4]> for f64 {
2575 -    type Output = crate::codegen::f64x4;
2576 -}
2577 -impl Shuffle<[u32; 8]> for f64 {
2578 -    type Output = crate::codegen::f64x8;
2579 -}
2580 +impl_shuffle! { [u32; 2], f64, crate::codegen::f64x2 }
2581 +impl_shuffle! { [u32; 4], f64, crate::codegen::f64x4 }
2582 +impl_shuffle! { [u32; 8], f64, crate::codegen::f64x8 }
2583  
2584  /* FIXME: 64-bit single element vector
2585 -impl Shuffle<[u32; 1]> for m64 {
2586 -    type Output = crate::codegen::m64x1;
2587 -}
2588 +impl_shuffle! { [u32; 1], i64, crate::codegen::i64x1 }
2589  */
2590 -impl Shuffle<[u32; 2]> for m64 {
2591 -    type Output = crate::codegen::m64x2;
2592 -}
2593 -impl Shuffle<[u32; 4]> for m64 {
2594 -    type Output = crate::codegen::m64x4;
2595 -}
2596 -impl Shuffle<[u32; 8]> for m64 {
2597 -    type Output = crate::codegen::m64x8;
2598 -}
2599 +impl_shuffle! { [u32; 2], m64, crate::codegen::m64x2 }
2600 +impl_shuffle! { [u32; 4], m64, crate::codegen::m64x4 }
2601 +impl_shuffle! { [u32; 8], m64, crate::codegen::m64x8 }
2602  
2603 -impl Shuffle<[u32; 2]> for isize {
2604 -    type Output = crate::codegen::isizex2;
2605 -}
2606 -impl Shuffle<[u32; 4]> for isize {
2607 -    type Output = crate::codegen::isizex4;
2608 -}
2609 -impl Shuffle<[u32; 8]> for isize {
2610 -    type Output = crate::codegen::isizex8;
2611 -}
2612 +impl_shuffle! { [u32; 2], isize, crate::codegen::isizex2 }
2613 +impl_shuffle! { [u32; 4], isize, crate::codegen::isizex4 }
2614 +impl_shuffle! { [u32; 8], isize, crate::codegen::isizex8 }
2615  
2616 -impl Shuffle<[u32; 2]> for usize {
2617 -    type Output = crate::codegen::usizex2;
2618 -}
2619 -impl Shuffle<[u32; 4]> for usize {
2620 -    type Output = crate::codegen::usizex4;
2621 -}
2622 -impl Shuffle<[u32; 8]> for usize {
2623 -    type Output = crate::codegen::usizex8;
2624 -}
2625 +impl_shuffle! { [u32; 2], usize, crate::codegen::usizex2 }
2626 +impl_shuffle! { [u32; 4], usize, crate::codegen::usizex4 }
2627 +impl_shuffle! { [u32; 8], usize, crate::codegen::usizex8 }
2628  
2629 +impl_shuffle! { [u32; 2], msize, crate::codegen::msizex2 }
2630 +impl_shuffle! { [u32; 4], msize, crate::codegen::msizex4 }
2631 +impl_shuffle! { [u32; 8], msize, crate::codegen::msizex8 }
2632 +
2633 +impl<T> Seal<[u32; 2]> for *const T {}
2634  impl<T> Shuffle<[u32; 2]> for *const T {
2635      type Output = crate::codegen::cptrx2<T>;
2636  }
2637 +impl<T> Seal<[u32; 4]> for *const T {}
2638  impl<T> Shuffle<[u32; 4]> for *const T {
2639      type Output = crate::codegen::cptrx4<T>;
2640  }
2641 +impl<T> Seal<[u32; 8]> for *const T {}
2642  impl<T> Shuffle<[u32; 8]> for *const T {
2643      type Output = crate::codegen::cptrx8<T>;
2644  }
2645  
2646 +impl<T> Seal<[u32; 2]> for *mut T {}
2647  impl<T> Shuffle<[u32; 2]> for *mut T {
2648      type Output = crate::codegen::mptrx2<T>;
2649  }
2650 +impl<T> Seal<[u32; 4]> for *mut T {}
2651  impl<T> Shuffle<[u32; 4]> for *mut T {
2652      type Output = crate::codegen::mptrx4<T>;
2653  }
2654 +impl<T> Seal<[u32; 8]> for *mut T {}
2655  impl<T> Shuffle<[u32; 8]> for *mut T {
2656      type Output = crate::codegen::mptrx8<T>;
2657  }
2658  
2659 -impl Shuffle<[u32; 2]> for msize {
2660 -    type Output = crate::codegen::msizex2;
2661 -}
2662 -impl Shuffle<[u32; 4]> for msize {
2663 -    type Output = crate::codegen::msizex4;
2664 -}
2665 -impl Shuffle<[u32; 8]> for msize {
2666 -    type Output = crate::codegen::msizex8;
2667 -}
2668 +impl_shuffle! { [u32; 1], i128, crate::codegen::i128x1 }
2669 +impl_shuffle! { [u32; 2], i128, crate::codegen::i128x2 }
2670 +impl_shuffle! { [u32; 4], i128, crate::codegen::i128x4 }
2671  
2672 -impl Shuffle<[u32; 1]> for i128 {
2673 -    type Output = crate::codegen::i128x1;
2674 -}
2675 -impl Shuffle<[u32; 2]> for i128 {
2676 -    type Output = crate::codegen::i128x2;
2677 -}
2678 -impl Shuffle<[u32; 4]> for i128 {
2679 -    type Output = crate::codegen::i128x4;
2680 -}
2681 +impl_shuffle! { [u32; 1], u128, crate::codegen::u128x1 }
2682 +impl_shuffle! { [u32; 2], u128, crate::codegen::u128x2 }
2683 +impl_shuffle! { [u32; 4], u128, crate::codegen::u128x4 }
2684  
2685 -impl Shuffle<[u32; 1]> for u128 {
2686 -    type Output = crate::codegen::u128x1;
2687 -}
2688 -impl Shuffle<[u32; 2]> for u128 {
2689 -    type Output = crate::codegen::u128x2;
2690 -}
2691 -impl Shuffle<[u32; 4]> for u128 {
2692 -    type Output = crate::codegen::u128x4;
2693 -}
2694 -
2695 -impl Shuffle<[u32; 1]> for m128 {
2696 -    type Output = crate::codegen::m128x1;
2697 -}
2698 -impl Shuffle<[u32; 2]> for m128 {
2699 -    type Output = crate::codegen::m128x2;
2700 -}
2701 -impl Shuffle<[u32; 4]> for m128 {
2702 -    type Output = crate::codegen::m128x4;
2703 -}
2704 +impl_shuffle! { [u32; 1], m128, crate::codegen::m128x1 }
2705 +impl_shuffle! { [u32; 2], m128, crate::codegen::m128x2 }
2706 +impl_shuffle! { [u32; 4], m128, crate::codegen::m128x4 }
2707 diff --git third_party/rust/packed_simd/src/codegen/shuffle1_dyn.rs third_party/rust/packed_simd/src/codegen/shuffle1_dyn.rs
2708 index 1e9f5816371a..a5403a06bb6e 100644
2709 --- third_party/rust/packed_simd/src/codegen/shuffle1_dyn.rs
2710 +++ third_party/rust/packed_simd/src/codegen/shuffle1_dyn.rs
2711 @@ -28,31 +28,10 @@ macro_rules! impl_fallback {
2712  macro_rules! impl_shuffle1_dyn {
2713      (u8x8) => {
2714          cfg_if! {
2715 -            if #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"),
2716 -                         target_feature = "ssse3"))] {
2717 -                impl Shuffle1Dyn for u8x8 {
2718 -                    type Indices = Self;
2719 -                    #[inline]
2720 -                    fn shuffle1_dyn(self, indices: Self::Indices) -> Self {
2721 -                        #[cfg(target_arch = "x86")]
2722 -                        use crate::arch::x86::_mm_shuffle_pi8;
2723 -                        #[cfg(target_arch = "x86_64")]
2724 -                        use crate::arch::x86_64::_mm_shuffle_pi8;
2725 -
2726 -                        unsafe {
2727 -                            crate::mem::transmute(
2728 -                                _mm_shuffle_pi8(
2729 -                                    crate::mem::transmute(self.0),
2730 -                                    crate::mem::transmute(indices.0)
2731 -                                )
2732 -                            )
2733 -                        }
2734 -                    }
2735 -                }
2736 -            } else if #[cfg(all(
2737 +            if #[cfg(all(
2738                  any(
2739 -                    all(target_aarch = "aarch64", target_feature = "neon"),
2740 -                    all(target_aarch = "arm", target_feature = "v7",
2741 +                    all(target_arch = "aarch64", target_feature = "neon"),
2742 +                    all(target_arch = "doesnotexist", target_feature = "v7",
2743                          target_feature = "neon")
2744                  ),
2745                  any(feature = "core_arch", libcore_neon)
2746 @@ -62,9 +41,9 @@ macro_rules! impl_shuffle1_dyn {
2747                      type Indices = Self;
2748                      #[inline]
2749                      fn shuffle1_dyn(self, indices: Self::Indices) -> Self {
2750 -                        #[cfg(targt_arch = "aarch64")]
2751 +                        #[cfg(target_arch = "aarch64")]
2752                          use crate::arch::aarch64::vtbl1_u8;
2753 -                        #[cfg(targt_arch = "arm")]
2754 +                        #[cfg(target_arch = "doesnotexist")]
2755                          use crate::arch::arm::vtbl1_u8;
2756  
2757                          // This is safe because the binary is compiled with
2758 @@ -106,7 +85,7 @@ macro_rules! impl_shuffle1_dyn {
2759                          }
2760                      }
2761                  }
2762 -            } else if #[cfg(all(target_aarch = "aarch64", target_feature = "neon",
2763 +            } else if #[cfg(all(target_arch = "aarch64", target_feature = "neon",
2764                                  any(feature = "core_arch", libcore_neon)))] {
2765                  impl Shuffle1Dyn for u8x16 {
2766                      type Indices = Self;
2767 @@ -125,7 +104,7 @@ macro_rules! impl_shuffle1_dyn {
2768                          }
2769                      }
2770                  }
2771 -            } else if #[cfg(all(target_aarch = "arm", target_feature = "v7",
2772 +            } else if #[cfg(all(target_arch = "doesnotexist", target_feature = "v7",
2773                                  target_feature = "neon",
2774                                  any(feature = "core_arch", libcore_neon)))] {
2775                  impl Shuffle1Dyn for u8x16 {
2776 diff --git third_party/rust/packed_simd/src/codegen/vPtr.rs third_party/rust/packed_simd/src/codegen/vPtr.rs
2777 index 1f2bc7714dd9..cf4765538178 100644
2778 --- third_party/rust/packed_simd/src/codegen/vPtr.rs
2779 +++ third_party/rust/packed_simd/src/codegen/vPtr.rs
2780 @@ -8,6 +8,7 @@ macro_rules! impl_simd_ptr {
2781          pub struct $tuple_id<$ty>($(crate $tys),*);
2782          //^^^^^^^ leaked through SimdArray
2783  
2784 +        impl<$ty> crate::sealed::Seal for [$ptr_ty; $elem_count] {}
2785          impl<$ty> crate::sealed::SimdArray for [$ptr_ty; $elem_count] {
2786              type Tuple = $tuple_id<$ptr_ty>;
2787              type T = $ptr_ty;
2788 @@ -15,6 +16,7 @@ macro_rules! impl_simd_ptr {
2789              type NT = [u32; $elem_count];
2790          }
2791  
2792 +        impl<$ty> crate::sealed::Seal for $tuple_id<$ptr_ty> {}
2793          impl<$ty> crate::sealed::Simd for $tuple_id<$ptr_ty> {
2794              type Element = $ptr_ty;
2795              const LANES: usize = $elem_count;
2796 diff --git third_party/rust/packed_simd/src/lib.rs third_party/rust/packed_simd/src/lib.rs
2797 index d73645e72fbe..b0b56d4d7461 100644
2798 --- third_party/rust/packed_simd/src/lib.rs
2799 +++ third_party/rust/packed_simd/src/lib.rs
2800 @@ -201,6 +201,7 @@
2801  
2802  #![feature(
2803      repr_simd,
2804 +    rustc_attrs,
2805      const_fn,
2806      platform_intrinsics,
2807      stdsimd,
2808 @@ -209,22 +210,26 @@
2809      link_llvm_intrinsics,
2810      core_intrinsics,
2811      stmt_expr_attributes,
2812 -    align_offset,
2813 -    mmx_target_feature,
2814      crate_visibility_modifier,
2815      custom_inner_attributes
2816  )]
2817  #![allow(non_camel_case_types, non_snake_case,
2818 -         clippy::cast_possible_truncation,
2819 -         clippy::cast_lossless,
2820 -         clippy::cast_possible_wrap,
2821 -         clippy::cast_precision_loss,
2822 -         // This lint is currently broken for generic code
2823 -         // See https://github.com/rust-lang/rust-clippy/issues/3410
2824 -         clippy::use_self
2825 +        // FIXME: these types are unsound in C FFI already
2826 +        // See https://github.com/rust-lang/rust/issues/53346
2827 +        improper_ctypes_definitions,
2828 +        clippy::cast_possible_truncation,
2829 +        clippy::cast_lossless,
2830 +        clippy::cast_possible_wrap,
2831 +        clippy::cast_precision_loss,
2832 +        // TODO: manually add the `#[must_use]` attribute where appropriate
2833 +        clippy::must_use_candidate,
2834 +        // This lint is currently broken for generic code
2835 +        // See https://github.com/rust-lang/rust-clippy/issues/3410
2836 +        clippy::use_self,
2837 +        clippy::wrong_self_convention,
2838  )]
2839  #![cfg_attr(test, feature(hashmap_internals))]
2840 -#![deny(warnings, rust_2018_idioms, clippy::missing_inline_in_public_items)]
2841 +#![deny(rust_2018_idioms, clippy::missing_inline_in_public_items)]
2842  #![no_std]
2843  
2844  use cfg_if::cfg_if;
2845 @@ -256,6 +261,8 @@ mod api;
2846  mod codegen;
2847  mod sealed;
2848  
2849 +pub use crate::sealed::{Simd as SimdVector, Shuffle, SimdArray, Mask};
2850 +
2851  /// Packed SIMD vector type.
2852  ///
2853  /// # Examples
2854 @@ -276,6 +283,8 @@ pub struct Simd<A: sealed::SimdArray>(
2855      #[doc(hidden)] pub <A as sealed::SimdArray>::Tuple,
2856  );
2857  
2858 +impl<A: sealed::SimdArray> sealed::Seal for Simd<A> {}
2859 +
2860  /// Wrapper over `T` implementing a lexicoraphical order via the `PartialOrd`
2861  /// and/or `Ord` traits.
2862  #[repr(transparent)]
2863 diff --git third_party/rust/packed_simd/src/masks.rs third_party/rust/packed_simd/src/masks.rs
2864 index f83c4da95750..aeb36d232804 100644
2865 --- third_party/rust/packed_simd/src/masks.rs
2866 +++ third_party/rust/packed_simd/src/masks.rs
2867 @@ -6,7 +6,9 @@ macro_rules! impl_mask_ty {
2868          #[derive(Copy, Clone)]
2869          pub struct $id($elem_ty);
2870  
2871 +        impl crate::sealed::Seal for $id {}
2872          impl crate::sealed::Mask for $id {
2873 +            #[inline]
2874              fn test(&self) -> bool {
2875                  $id::test(self)
2876              }
2877 diff --git third_party/rust/packed_simd/src/sealed.rs third_party/rust/packed_simd/src/sealed.rs
2878 index 832acd3f1d54..0ec20300fdd4 100644
2879 --- third_party/rust/packed_simd/src/sealed.rs
2880 +++ third_party/rust/packed_simd/src/sealed.rs
2881 @@ -1,8 +1,11 @@
2882  //! Sealed traits
2883  
2884 +/// A sealed trait, this is logically private to the crate
2885 +/// and will prevent implementations from outside the crate
2886 +pub trait Seal<T = ()> {}
2887 +
2888  /// Trait implemented by arrays that can be SIMD types.
2889 -#[doc(hidden)]
2890 -pub trait SimdArray {
2891 +pub trait SimdArray: Seal {
2892      /// The type of the #[repr(simd)] type.
2893      type Tuple: Copy + Clone;
2894      /// The element type of the vector.
2895 @@ -16,7 +19,7 @@ pub trait SimdArray {
2896  /// This traits is used to constraint the arguments
2897  /// and result type of the portable shuffles.
2898  #[doc(hidden)]
2899 -pub trait Shuffle<Lanes> {
2900 +pub trait Shuffle<Lanes>: Seal<Lanes> {
2901      // Lanes is a `[u32; N]` where `N` is the number of vector lanes
2902  
2903      /// The result type of the shuffle.
2904 @@ -24,8 +27,7 @@ pub trait Shuffle<Lanes> {
2905  }
2906  
2907  /// This trait is implemented by all SIMD vector types.
2908 -#[doc(hidden)]
2909 -pub trait Simd {
2910 +pub trait Simd: Seal {
2911      /// Element type of the SIMD vector
2912      type Element;
2913      /// The number of elements in the SIMD vector.
2914 @@ -35,7 +37,6 @@ pub trait Simd {
2915  }
2916  
2917  /// This trait is implemented by all mask types
2918 -#[doc(hidden)]
2919 -pub trait Mask {
2920 +pub trait Mask: Seal {
2921      fn test(&self) -> bool;
2922  }
2923 diff --git third_party/rust/packed_simd/src/testing/utils.rs third_party/rust/packed_simd/src/testing/utils.rs
2924 index 7b8f21ac1c55..21f27aae5432 100644
2925 --- third_party/rust/packed_simd/src/testing/utils.rs
2926 +++ third_party/rust/packed_simd/src/testing/utils.rs
2927 @@ -1,6 +1,8 @@
2928  //! Testing utilities
2929  
2930  #![allow(dead_code)]
2931 +// FIXME: Or don't. But it's true this is a problematic comparison.
2932 +#![allow(clippy::neg_cmp_op_on_partial_ord)]
2933  
2934  use crate::{cmp::PartialOrd, fmt::Debug, LexicographicallyOrdered};
2935  
2936 @@ -19,14 +21,19 @@ pub fn test_lt<T>(
2937      assert!(a <= b, "{:?}, {:?}", a, b);
2938      assert!(b >= a, "{:?}, {:?}", a, b);
2939  
2940 -    // Irreflexivity
2941 -    assert!(!(a < a), "{:?}, {:?}", a, b);
2942 -    assert!(!(b < b), "{:?}, {:?}", a, b);
2943 -    assert!(!(a > a), "{:?}, {:?}", a, b);
2944 -    assert!(!(b > b), "{:?}, {:?}", a, b);
2945 +    // The elegance of the mathematical expression of irreflexivity is more
2946 +    // than clippy can handle.
2947 +    #[allow(clippy::eq_op)]
2948 +    {
2949 +        // Irreflexivity
2950 +        assert!(!(a < a), "{:?}, {:?}", a, b);
2951 +        assert!(!(b < b), "{:?}, {:?}", a, b);
2952 +        assert!(!(a > a), "{:?}, {:?}", a, b);
2953 +        assert!(!(b > b), "{:?}, {:?}", a, b);
2954  
2955 -    assert!(a <= a, "{:?}, {:?}", a, b);
2956 -    assert!(b <= b, "{:?}, {:?}", a, b);
2957 +        assert!(a <= a, "{:?}, {:?}", a, b);
2958 +        assert!(b <= b, "{:?}, {:?}", a, b);
2959 +    }
2960  }
2961  
2962  /// Tests PartialOrd for `a` and `b` where `a <= b` is true.
2963 @@ -38,8 +45,8 @@ pub fn test_le<T>(
2964      assert!(a <= b, "{:?}, {:?}", a, b);
2965      assert!(b >= a, "{:?}, {:?}", a, b);
2966  
2967 -    assert!(a == b || a < b, "{:?}, {:?}", a, b);
2968 -    assert!(a == b || b > a, "{:?}, {:?}", a, b);
2969 +    assert!(a <= b, "{:?}, {:?}", a, b);
2970 +    assert!(b >= a, "{:?}, {:?}", a, b);
2971  
2972      if a == b {
2973          assert!(!(a < b), "{:?}, {:?}", a, b);
2974 diff --git third_party/rust/packed_simd/src/v128.rs third_party/rust/packed_simd/src/v128.rs
2975 index 1d0282dc4278..7949f6619a4f 100644
2976 --- third_party/rust/packed_simd/src/v128.rs
2977 +++ third_party/rust/packed_simd/src/v128.rs
2978 @@ -1,42 +1,42 @@
2979  //! 128-bit wide vector types
2980 -#![rustfmt::skip]
2981 +#[rustfmt::skip]
2982  
2983  use crate::*;
2984  
2985 -impl_i!([i8; 16]: i8x16, m8x16 | i8 | test_v128 |
2986 +impl_i!([i8; 16]: i8x16, m8x16 | i8, u16 | test_v128 |
2987          x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 |
2988          From: |
2989          /// A 128-bit vector with 16 `i8` lanes.
2990  );
2991 -impl_u!([u8; 16]: u8x16, m8x16 | u8 | test_v128 |
2992 +impl_u!([u8; 16]: u8x16, m8x16 | u8, u16 | test_v128 |
2993          x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 |
2994          From: |
2995          /// A 128-bit vector with 16 `u8` lanes.
2996  );
2997 -impl_m!([m8; 16]: m8x16 | i8 | test_v128 |
2998 +impl_m!([m8; 16]: m8x16 | i8, u16 | test_v128 |
2999          x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 |
3000          From: m16x16 |
3001          /// A 128-bit vector mask with 16 `m8` lanes.
3002  );
3003  
3004 -impl_i!([i16; 8]: i16x8, m16x8 | i16 | test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 |
3005 +impl_i!([i16; 8]: i16x8, m16x8 | i16, u8 | test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 |
3006          From: i8x8, u8x8 |
3007          /// A 128-bit vector with 8 `i16` lanes.
3008  );
3009 -impl_u!([u16; 8]: u16x8, m16x8 | u16| test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 |
3010 +impl_u!([u16; 8]: u16x8, m16x8 | u16, u8 | test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 |
3011          From: u8x8 |
3012          /// A 128-bit vector with 8 `u16` lanes.
3013  );
3014 -impl_m!([m16; 8]: m16x8 | i16 | test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 |
3015 +impl_m!([m16; 8]: m16x8 | i16, u8 | test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 |
3016          From: m8x8, m32x8 |
3017          /// A 128-bit vector mask with 8 `m16` lanes.
3018  );
3019  
3020 -impl_i!([i32; 4]: i32x4, m32x4 | i32 | test_v128 | x0, x1, x2, x3 |
3021 +impl_i!([i32; 4]: i32x4, m32x4 | i32, u8 | test_v128 | x0, x1, x2, x3 |
3022          From: i8x4, u8x4, i16x4, u16x4  |
3023          /// A 128-bit vector with 4 `i32` lanes.
3024  );
3025 -impl_u!([u32; 4]: u32x4, m32x4 | u32| test_v128 | x0, x1, x2, x3 |
3026 +impl_u!([u32; 4]: u32x4, m32x4 | u32, u8 | test_v128 | x0, x1, x2, x3 |
3027          From: u8x4, u16x4 |
3028          /// A 128-bit vector with 4 `u32` lanes.
3029  );
3030 @@ -44,16 +44,16 @@ impl_f!([f32; 4]: f32x4, m32x4 | f32 | test_v128 | x0, x1, x2, x3 |
3031          From: i8x4, u8x4, i16x4, u16x4 |
3032          /// A 128-bit vector with 4 `f32` lanes.
3033  );
3034 -impl_m!([m32; 4]: m32x4 | i32 | test_v128 | x0, x1, x2, x3 |
3035 +impl_m!([m32; 4]: m32x4 | i32, u8 | test_v128 | x0, x1, x2, x3 |
3036          From: m8x4, m16x4, m64x4 |
3037          /// A 128-bit vector mask with 4 `m32` lanes.
3038  );
3039  
3040 -impl_i!([i64; 2]: i64x2, m64x2 | i64 | test_v128 | x0, x1 |
3041 +impl_i!([i64; 2]: i64x2, m64x2 | i64, u8 | test_v128 | x0, x1 |
3042          From: i8x2, u8x2, i16x2, u16x2, i32x2, u32x2 |
3043          /// A 128-bit vector with 2 `i64` lanes.
3044  );
3045 -impl_u!([u64; 2]: u64x2, m64x2 | u64 | test_v128 | x0, x1 |
3046 +impl_u!([u64; 2]: u64x2, m64x2 | u64, u8 | test_v128 | x0, x1 |
3047          From: u8x2, u16x2, u32x2 |
3048          /// A 128-bit vector with 2 `u64` lanes.
3049  );
3050 @@ -61,20 +61,20 @@ impl_f!([f64; 2]: f64x2, m64x2 | f64 | test_v128 | x0, x1 |
3051          From: i8x2, u8x2, i16x2, u16x2, i32x2, u32x2, f32x2 |
3052          /// A 128-bit vector with 2 `f64` lanes.
3053  );
3054 -impl_m!([m64; 2]: m64x2 | i64 | test_v128 | x0, x1 |
3055 +impl_m!([m64; 2]: m64x2 | i64, u8 | test_v128 | x0, x1 |
3056          From: m8x2, m16x2, m32x2, m128x2 |
3057          /// A 128-bit vector mask with 2 `m64` lanes.
3058  );
3059  
3060 -impl_i!([i128; 1]: i128x1, m128x1 | i128 | test_v128 | x0 |
3061 +impl_i!([i128; 1]: i128x1, m128x1 | i128, u8 | test_v128 | x0 |
3062          From: /*i8x1, u8x1, i16x1, u16x1, i32x1, u32x1, i64x1, u64x1 */ | // FIXME: unary small vector types
3063          /// A 128-bit vector with 1 `i128` lane.
3064  );
3065 -impl_u!([u128; 1]: u128x1, m128x1 | u128 | test_v128 | x0 |
3066 +impl_u!([u128; 1]: u128x1, m128x1 | u128, u8 | test_v128 | x0 |
3067          From: /*u8x1, u16x1, u32x1, u64x1 */ | // FIXME: unary small vector types
3068          /// A 128-bit vector with 1 `u128` lane.
3069  );
3070 -impl_m!([m128; 1]: m128x1 | i128 | test_v128 | x0 |
3071 +impl_m!([m128; 1]: m128x1 | i128, u8 | test_v128 | x0 |
3072          From: /*m8x1, m16x1, m32x1, m64x1 */ | // FIXME: unary small vector types
3073          /// A 128-bit vector mask with 1 `m128` lane.
3074  );
3075 diff --git third_party/rust/packed_simd/src/v16.rs third_party/rust/packed_simd/src/v16.rs
3076 index 67a3832d2530..4ca5afb2a7d5 100644
3077 --- third_party/rust/packed_simd/src/v16.rs
3078 +++ third_party/rust/packed_simd/src/v16.rs
3079 @@ -2,15 +2,15 @@
3080  
3081  use crate::*;
3082  
3083 -impl_i!([i8; 2]: i8x2, m8x2 | i8 | test_v16 | x0, x1 |
3084 +impl_i!([i8; 2]: i8x2, m8x2 | i8, u8 | test_v16 | x0, x1 |
3085          From: |
3086          /// A 16-bit vector with 2 `i8` lanes.
3087  );
3088 -impl_u!([u8; 2]: u8x2, m8x2 | u8 | test_v16 | x0, x1 |
3089 +impl_u!([u8; 2]: u8x2, m8x2 | u8, u8 | test_v16 | x0, x1 |
3090          From: |
3091          /// A 16-bit vector with 2 `u8` lanes.
3092  );
3093 -impl_m!([m8; 2]: m8x2 | i8 | test_v16 | x0, x1 |
3094 +impl_m!([m8; 2]: m8x2 | i8, u8 | test_v16 | x0, x1 |
3095          From: m16x2, m32x2, m64x2, m128x2 |
3096          /// A 16-bit vector mask with 2 `m8` lanes.
3097  );
3098 diff --git third_party/rust/packed_simd/src/v256.rs third_party/rust/packed_simd/src/v256.rs
3099 index 6b59336f68b6..f0c3bc281383 100644
3100 --- third_party/rust/packed_simd/src/v256.rs
3101 +++ third_party/rust/packed_simd/src/v256.rs
3102 @@ -1,48 +1,48 @@
3103  //! 256-bit wide vector types
3104 -#![rustfmt::skip]
3105 +#[rustfmt::skip]
3106  
3107  use crate::*;
3108  
3109 -impl_i!([i8; 32]: i8x32, m8x32 | i8 | test_v256 |
3110 +impl_i!([i8; 32]: i8x32, m8x32 | i8, u32 | test_v256 |
3111          x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15,
3112          x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 |
3113          From: |
3114          /// A 256-bit vector with 32 `i8` lanes.
3115  );
3116 -impl_u!([u8; 32]: u8x32, m8x32 | u8 | test_v256 |
3117 +impl_u!([u8; 32]: u8x32, m8x32 | u8, u32 | test_v256 |
3118          x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15,
3119          x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 |
3120          From: |
3121          /// A 256-bit vector with 32 `u8` lanes.
3122  );
3123 -impl_m!([m8; 32]: m8x32 | i8 | test_v256 |
3124 +impl_m!([m8; 32]: m8x32 | i8, u32 | test_v256 |
3125          x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15,
3126          x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 |
3127          From:  |
3128          /// A 256-bit vector mask with 32 `m8` lanes.
3129  );
3130  
3131 -impl_i!([i16; 16]: i16x16, m16x16 | i16 | test_v256 |
3132 +impl_i!([i16; 16]: i16x16, m16x16 | i16, u16 | test_v256 |
3133          x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 |
3134          From: i8x16, u8x16 |
3135          /// A 256-bit vector with 16 `i16` lanes.
3136  );
3137 -impl_u!([u16; 16]: u16x16, m16x16 | u16 | test_v256 |
3138 +impl_u!([u16; 16]: u16x16, m16x16 | u16, u16 | test_v256 |
3139          x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 |
3140          From: u8x16 |
3141          /// A 256-bit vector with 16 `u16` lanes.
3142  );
3143 -impl_m!([m16; 16]: m16x16 | i16 | test_v256 |
3144 +impl_m!([m16; 16]: m16x16 | i16, u16 | test_v256 |
3145          x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 |
3146          From: m8x16 |
3147          /// A 256-bit vector mask with 16 `m16` lanes.
3148  );
3149  
3150 -impl_i!([i32; 8]: i32x8, m32x8 | i32 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7  |
3151 +impl_i!([i32; 8]: i32x8, m32x8 | i32, u8 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7  |
3152          From: i8x8, u8x8, i16x8, u16x8 |
3153          /// A 256-bit vector with 8 `i32` lanes.
3154  );
3155 -impl_u!([u32; 8]: u32x8, m32x8 | u32 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 |
3156 +impl_u!([u32; 8]: u32x8, m32x8 | u32, u8 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 |
3157          From: u8x8, u16x8 |
3158          /// A 256-bit vector with 8 `u32` lanes.
3159  );
3160 @@ -50,16 +50,16 @@ impl_f!([f32; 8]: f32x8, m32x8 | f32 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x
3161          From: i8x8, u8x8, i16x8, u16x8 |
3162          /// A 256-bit vector with 8 `f32` lanes.
3163  );
3164 -impl_m!([m32; 8]: m32x8 | i32 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 |
3165 +impl_m!([m32; 8]: m32x8 | i32, u8 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 |
3166          From: m8x8, m16x8 |
3167          /// A 256-bit vector mask with 8 `m32` lanes.
3168  );
3169  
3170 -impl_i!([i64; 4]: i64x4, m64x4 | i64 | test_v256 | x0, x1, x2, x3 |
3171 +impl_i!([i64; 4]: i64x4, m64x4 | i64, u8 | test_v256 | x0, x1, x2, x3 |
3172          From: i8x4, u8x4, i16x4, u16x4, i32x4, u32x4 |
3173          /// A 256-bit vector with 4 `i64` lanes.
3174  );
3175 -impl_u!([u64; 4]: u64x4, m64x4 | u64 | test_v256 | x0, x1, x2, x3 |
3176 +impl_u!([u64; 4]: u64x4, m64x4 | u64, u8 | test_v256 | x0, x1, x2, x3 |
3177          From: u8x4, u16x4, u32x4 |
3178          /// A 256-bit vector with 4 `u64` lanes.
3179  );
3180 @@ -67,20 +67,20 @@ impl_f!([f64; 4]: f64x4, m64x4 | f64 | test_v256 | x0, x1, x2, x3 |
3181          From: i8x4, u8x4, i16x4, u16x4, i32x4, u32x4, f32x4 |
3182          /// A 256-bit vector with 4 `f64` lanes.
3183  );
3184 -impl_m!([m64; 4]: m64x4 | i64 | test_v256 | x0, x1, x2, x3 |
3185 +impl_m!([m64; 4]: m64x4 | i64, u8 | test_v256 | x0, x1, x2, x3 |
3186          From: m8x4, m16x4, m32x4 |
3187          /// A 256-bit vector mask with 4 `m64` lanes.
3188  );
3189  
3190 -impl_i!([i128; 2]: i128x2, m128x2 | i128 | test_v256 | x0, x1 |
3191 +impl_i!([i128; 2]: i128x2, m128x2 | i128, u8 | test_v256 | x0, x1 |
3192          From: i8x2, u8x2, i16x2, u16x2, i32x2, u32x2, i64x2, u64x2 |
3193          /// A 256-bit vector with 2 `i128` lanes.
3194  );
3195 -impl_u!([u128; 2]: u128x2, m128x2 | u128 | test_v256 | x0, x1 |
3196 +impl_u!([u128; 2]: u128x2, m128x2 | u128, u8 | test_v256 | x0, x1 |
3197          From: u8x2, u16x2, u32x2, u64x2 |
3198          /// A 256-bit vector with 2 `u128` lanes.
3199  );
3200 -impl_m!([m128; 2]: m128x2 | i128 | test_v256 | x0, x1 |
3201 +impl_m!([m128; 2]: m128x2 | i128, u8 | test_v256 | x0, x1 |
3202          From: m8x2, m16x2, m32x2, m64x2 |
3203          /// A 256-bit vector mask with 2 `m128` lanes.
3204  );
3205 diff --git third_party/rust/packed_simd/src/v32.rs third_party/rust/packed_simd/src/v32.rs
3206 index 09cef9bdd472..75a1838e5e0e 100644
3207 --- third_party/rust/packed_simd/src/v32.rs
3208 +++ third_party/rust/packed_simd/src/v32.rs
3209 @@ -2,28 +2,28 @@
3210  
3211  use crate::*;
3212  
3213 -impl_i!([i8; 4]: i8x4, m8x4 | i8 | test_v32 | x0, x1, x2, x3 |
3214 +impl_i!([i8; 4]: i8x4, m8x4 | i8, u8 | test_v32 | x0, x1, x2, x3 |
3215          From: |
3216          /// A 32-bit vector with 4 `i8` lanes.
3217  );
3218 -impl_u!([u8; 4]: u8x4, m8x4 | u8 | test_v32 | x0, x1, x2, x3 |
3219 +impl_u!([u8; 4]: u8x4, m8x4 | u8, u8 | test_v32 | x0, x1, x2, x3 |
3220          From: |
3221          /// A 32-bit vector with 4 `u8` lanes.
3222  );
3223 -impl_m!([m8; 4]: m8x4 | i8 | test_v32 | x0, x1, x2, x3 |
3224 +impl_m!([m8; 4]: m8x4 | i8, u8 | test_v32 | x0, x1, x2, x3 |
3225          From: m16x4, m32x4, m64x4 |
3226          /// A 32-bit vector mask with 4 `m8` lanes.
3227  );
3228  
3229 -impl_i!([i16; 2]: i16x2, m16x2 | i16 | test_v32 | x0, x1 |
3230 +impl_i!([i16; 2]: i16x2, m16x2 | i16, u8 | test_v32 | x0, x1 |
3231          From: i8x2, u8x2 |
3232          /// A 32-bit vector with 2 `i16` lanes.
3233  );
3234 -impl_u!([u16; 2]: u16x2, m16x2 | u16 | test_v32 | x0, x1 |
3235 +impl_u!([u16; 2]: u16x2, m16x2 | u16, u8 | test_v32 | x0, x1 |
3236          From: u8x2 |
3237          /// A 32-bit vector with 2 `u16` lanes.
3238  );
3239 -impl_m!([m16; 2]: m16x2 | i16 | test_v32 | x0, x1 |
3240 +impl_m!([m16; 2]: m16x2 | i16, u8 | test_v32 | x0, x1 |
3241          From: m8x2, m32x2, m64x2, m128x2 |
3242          /// A 32-bit vector mask with 2 `m16` lanes.
3243  );
3244 diff --git third_party/rust/packed_simd/src/v512.rs third_party/rust/packed_simd/src/v512.rs
3245 index b1714aded369..4c8c71338aca 100644
3246 --- third_party/rust/packed_simd/src/v512.rs
3247 +++ third_party/rust/packed_simd/src/v512.rs
3248 @@ -1,9 +1,9 @@
3249  //! 512-bit wide vector types
3250 -#![rustfmt::skip]
3251 +#[rustfmt::skip]
3252  
3253  use crate::*;
3254  
3255 -impl_i!([i8; 64]: i8x64, m8x64 | i8 | test_v512 |
3256 +impl_i!([i8; 64]: i8x64, m8x64 | i8, u64 | test_v512 |
3257          x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15,
3258          x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31,
3259          x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47,
3260 @@ -11,7 +11,7 @@ impl_i!([i8; 64]: i8x64, m8x64 | i8 | test_v512 |
3261          From: |
3262          /// A 512-bit vector with 64 `i8` lanes.
3263  );
3264 -impl_u!([u8; 64]: u8x64, m8x64 | u8 | test_v512 |
3265 +impl_u!([u8; 64]: u8x64, m8x64 | u8, u64 | test_v512 |
3266          x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15,
3267          x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31,
3268          x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47,
3269 @@ -19,7 +19,7 @@ impl_u!([u8; 64]: u8x64, m8x64 | u8 | test_v512 |
3270          From: |
3271          /// A 512-bit vector with 64 `u8` lanes.
3272  );
3273 -impl_m!([m8; 64]: m8x64 | i8 | test_v512 |
3274 +impl_m!([m8; 64]: m8x64 | i8, u64 | test_v512 |
3275          x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15,
3276          x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31,
3277          x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47,
3278 @@ -28,31 +28,31 @@ impl_m!([m8; 64]: m8x64 | i8 | test_v512 |
3279          /// A 512-bit vector mask with 64 `m8` lanes.
3280  );
3281  
3282 -impl_i!([i16; 32]: i16x32, m16x32 | i16 | test_v512 |
3283 +impl_i!([i16; 32]: i16x32, m16x32 | i16, u32 | test_v512 |
3284          x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15,
3285          x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 |
3286          From: i8x32, u8x32 |
3287          /// A 512-bit vector with 32 `i16` lanes.
3288  );
3289 -impl_u!([u16; 32]: u16x32, m16x32 | u16 | test_v512 |
3290 +impl_u!([u16; 32]: u16x32, m16x32 | u16, u32 | test_v512 |
3291          x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15,
3292          x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 |
3293          From: u8x32 |
3294          /// A 512-bit vector with 32 `u16` lanes.
3295  );
3296 -impl_m!([m16; 32]: m16x32 | i16 | test_v512 |
3297 +impl_m!([m16; 32]: m16x32 | i16, u32 | test_v512 |
3298          x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15,
3299          x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 |
3300          From: m8x32 |
3301          /// A 512-bit vector mask with 32 `m16` lanes.
3302  );
3303  
3304 -impl_i!([i32; 16]: i32x16, m32x16 | i32 | test_v512 |
3305 +impl_i!([i32; 16]: i32x16, m32x16 | i32, u16 | test_v512 |
3306          x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 |
3307          From: i8x16, u8x16, i16x16, u16x16 |
3308          /// A 512-bit vector with 16 `i32` lanes.
3309  );
3310 -impl_u!([u32; 16]: u32x16, m32x16 | u32 | test_v512 |
3311 +impl_u!([u32; 16]: u32x16, m32x16 | u32, u16 | test_v512 |
3312          x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 |
3313          From: u8x16, u16x16 |
3314          /// A 512-bit vector with 16 `u32` lanes.
3315 @@ -62,17 +62,17 @@ impl_f!([f32; 16]: f32x16, m32x16 | f32 | test_v512 |
3316          From: i8x16, u8x16, i16x16, u16x16 |
3317          /// A 512-bit vector with 16 `f32` lanes.
3318  );
3319 -impl_m!([m32; 16]: m32x16 | i32 | test_v512 |
3320 +impl_m!([m32; 16]: m32x16 | i32, u16 | test_v512 |
3321          x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 |
3322          From: m8x16, m16x16 |
3323          /// A 512-bit vector mask with 16 `m32` lanes.
3324  );
3325  
3326 -impl_i!([i64; 8]: i64x8, m64x8 | i64 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 |
3327 +impl_i!([i64; 8]: i64x8, m64x8 | i64, u8 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 |
3328          From: i8x8, u8x8, i16x8, u16x8, i32x8, u32x8 |
3329          /// A 512-bit vector with 8 `i64` lanes.
3330  );
3331 -impl_u!([u64; 8]: u64x8, m64x8 | u64 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 |
3332 +impl_u!([u64; 8]: u64x8, m64x8 | u64, u8 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 |
3333          From: u8x8, u16x8, u32x8 |
3334          /// A 512-bit vector with 8 `u64` lanes.
3335  );
3336 @@ -80,20 +80,20 @@ impl_f!([f64; 8]: f64x8, m64x8 | f64 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x
3337          From: i8x8, u8x8, i16x8, u16x8, i32x8, u32x8, f32x8 |
3338          /// A 512-bit vector with 8 `f64` lanes.
3339  );
3340 -impl_m!([m64; 8]: m64x8 | i64 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 |
3341 +impl_m!([m64; 8]: m64x8 | i64, u8 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 |
3342          From: m8x8, m16x8, m32x8 |
3343          /// A 512-bit vector mask with 8 `m64` lanes.
3344  );
3345  
3346 -impl_i!([i128; 4]: i128x4, m128x4 | i128 | test_v512 | x0, x1, x2, x3 |
3347 +impl_i!([i128; 4]: i128x4, m128x4 | i128, u8 | test_v512 | x0, x1, x2, x3 |
3348          From: i8x4, u8x4, i16x4, u16x4, i32x4, u32x4, i64x4, u64x4 |
3349          /// A 512-bit vector with 4 `i128` lanes.
3350  );
3351 -impl_u!([u128; 4]: u128x4, m128x4 | u128 | test_v512 | x0, x1, x2, x3 |
3352 +impl_u!([u128; 4]: u128x4, m128x4 | u128, u8 | test_v512 | x0, x1, x2, x3 |
3353          From: u8x4, u16x4, u32x4, u64x4 |
3354          /// A 512-bit vector with 4 `u128` lanes.
3355  );
3356 -impl_m!([m128; 4]: m128x4 | i128 | test_v512 | x0, x1, x2, x3 |
3357 +impl_m!([m128; 4]: m128x4 | i128, u8 | test_v512 | x0, x1, x2, x3 |
3358          From: m8x4, m16x4, m32x4, m64x4 |
3359          /// A 512-bit vector mask with 4 `m128` lanes.
3360  );
3361 diff --git third_party/rust/packed_simd/src/v64.rs third_party/rust/packed_simd/src/v64.rs
3362 index 1ee6219c040b..bf6b9de61005 100644
3363 --- third_party/rust/packed_simd/src/v64.rs
3364 +++ third_party/rust/packed_simd/src/v64.rs
3365 @@ -1,43 +1,43 @@
3366  //! 64-bit wide vector types
3367 -#![rustfmt::skip]
3368 +#[rustfmt::skip]
3369  
3370  use super::*;
3371  
3372 -impl_i!([i8; 8]: i8x8, m8x8 | i8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 |
3373 +impl_i!([i8; 8]: i8x8, m8x8 | i8, u8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 |
3374          From: |
3375          /// A 64-bit vector with 8 `i8` lanes.
3376  );
3377 -impl_u!([u8; 8]: u8x8, m8x8 | u8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 |
3378 +impl_u!([u8; 8]: u8x8, m8x8 | u8, u8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 |
3379          From: |
3380          /// A 64-bit vector with 8 `u8` lanes.
3381  );
3382 -impl_m!([m8; 8]: m8x8 | i8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 |
3383 +impl_m!([m8; 8]: m8x8 | i8, u8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 |
3384          From: m16x8, m32x8 |
3385          /// A 64-bit vector mask with 8 `m8` lanes.
3386  );
3387  
3388 -impl_i!([i16; 4]: i16x4, m16x4 | i16 | test_v64 | x0, x1, x2, x3 |
3389 +impl_i!([i16; 4]: i16x4, m16x4 | i16, u8 | test_v64 | x0, x1, x2, x3 |
3390          From: i8x4, u8x4 |
3391          /// A 64-bit vector with 4 `i16` lanes.
3392  );
3393 -impl_u!([u16; 4]: u16x4, m16x4 | u16 | test_v64 | x0, x1, x2, x3 |
3394 +impl_u!([u16; 4]: u16x4, m16x4 | u16, u8 | test_v64 | x0, x1, x2, x3 |
3395          From: u8x4 |
3396          /// A 64-bit vector with 4 `u16` lanes.
3397  );
3398 -impl_m!([m16; 4]: m16x4 | i16 | test_v64 | x0, x1, x2, x3 |
3399 +impl_m!([m16; 4]: m16x4 | i16, u8 | test_v64 | x0, x1, x2, x3 |
3400          From: m8x4, m32x4, m64x4 |
3401          /// A 64-bit vector mask with 4 `m16` lanes.
3402  );
3403  
3404 -impl_i!([i32; 2]: i32x2, m32x2 | i32 | test_v64 | x0, x1 |
3405 +impl_i!([i32; 2]: i32x2, m32x2 | i32, u8 | test_v64 | x0, x1 |
3406          From: i8x2, u8x2, i16x2, u16x2 |
3407          /// A 64-bit vector with 2 `i32` lanes.
3408  );
3409 -impl_u!([u32; 2]: u32x2, m32x2 | u32 | test_v64 | x0, x1 |
3410 +impl_u!([u32; 2]: u32x2, m32x2 | u32, u8 | test_v64 | x0, x1 |
3411          From: u8x2, u16x2 |
3412          /// A 64-bit vector with 2 `u32` lanes.
3413  );
3414 -impl_m!([m32; 2]: m32x2 | i32 | test_v64 | x0, x1 |
3415 +impl_m!([m32; 2]: m32x2 | i32, u8 | test_v64 | x0, x1 |
3416          From: m8x2, m16x2, m64x2, m128x2 |
3417          /// A 64-bit vector mask with 2 `m32` lanes.
3418  );
3419 @@ -47,15 +47,15 @@ impl_f!([f32; 2]: f32x2, m32x2 | f32 | test_v64 | x0, x1 |
3420  );
3421  
3422  /*
3423 -impl_i!([i64; 1]: i64x1, m64x1 | i64 | test_v64 | x0 |
3424 +impl_i!([i64; 1]: i64x1, m64x1 | i64, u8 | test_v64 | x0 |
3425          From: /*i8x1, u8x1, i16x1, u16x1, i32x1, u32x1*/ |  // FIXME: primitive to vector conversion
3426          /// A 64-bit vector with 1 `i64` lanes.
3427  );
3428 -impl_u!([u64; 1]: u64x1, m64x1 | u64 | test_v64 | x0 |
3429 +impl_u!([u64; 1]: u64x1, m64x1 | u64, u8 | test_v64 | x0 |
3430          From: /*u8x1, u16x1, u32x1*/ | // FIXME: primitive to vector conversion
3431          /// A 64-bit vector with 1 `u64` lanes.
3432  );
3433 -impl_m!([m64; 1]: m64x1 | i64 | test_v64 | x0 |
3434 +impl_m!([m64; 1]: m64x1 | i64, u8 | test_v64 | x0 |
3435          From: /*m8x1, m16x1, m32x1, */ m128x1 | // FIXME: unary small vector types
3436          /// A 64-bit vector mask with 1 `m64` lanes.
3437  );
3438 diff --git third_party/rust/packed_simd/src/vPtr.rs third_party/rust/packed_simd/src/vPtr.rs
3439 index fe9fb28ffa89..e34cb170eb1c 100644
3440 --- third_party/rust/packed_simd/src/vPtr.rs
3441 +++ third_party/rust/packed_simd/src/vPtr.rs
3442 @@ -1,5 +1,5 @@
3443  //! Vectors of pointers
3444 -#![rustfmt::skip]
3445 +#[rustfmt::skip]
3446  
3447  use crate::*;
3448  
3449 diff --git third_party/rust/packed_simd/src/vSize.rs third_party/rust/packed_simd/src/vSize.rs
3450 index 5594323372b4..b5d891006138 100644
3451 --- third_party/rust/packed_simd/src/vSize.rs
3452 +++ third_party/rust/packed_simd/src/vSize.rs
3453 @@ -3,50 +3,50 @@
3454  use crate::codegen::pointer_sized_int::{isize_, usize_};
3455  use crate::*;
3456  
3457 -impl_i!([isize; 2]: isizex2, msizex2 | isize_ | test_v128 |
3458 +impl_i!([isize; 2]: isizex2, msizex2 | isize_, u8 | test_v128 |
3459          x0, x1|
3460          From: |
3461          /// A vector with 2 `isize` lanes.
3462  );
3463  
3464 -impl_u!([usize; 2]: usizex2, msizex2 | usize_ | test_v128 |
3465 +impl_u!([usize; 2]: usizex2, msizex2 | usize_, u8 | test_v128 |
3466          x0, x1|
3467          From: |
3468          /// A vector with 2 `usize` lanes.
3469  );
3470 -impl_m!([msize; 2]: msizex2 | isize_ | test_v128 |
3471 +impl_m!([msize; 2]: msizex2 | isize_, u8 | test_v128 |
3472          x0, x1 |
3473          From: |
3474          /// A vector mask with 2 `msize` lanes.
3475  );
3476  
3477 -impl_i!([isize; 4]: isizex4, msizex4 | isize_ | test_v256 |
3478 +impl_i!([isize; 4]: isizex4, msizex4 | isize_, u8 | test_v256 |
3479          x0, x1, x2, x3 |
3480          From: |
3481          /// A vector with 4 `isize` lanes.
3482  );
3483 -impl_u!([usize; 4]: usizex4, msizex4 | usize_ | test_v256 |
3484 +impl_u!([usize; 4]: usizex4, msizex4 | usize_, u8 | test_v256 |
3485          x0, x1, x2, x3|
3486          From: |
3487          /// A vector with 4 `usize` lanes.
3488  );
3489 -impl_m!([msize; 4]: msizex4 | isize_ | test_v256 |
3490 +impl_m!([msize; 4]: msizex4 | isize_, u8 | test_v256 |
3491          x0, x1, x2, x3 |
3492          From: |
3493          /// A vector mask with 4 `msize` lanes.
3494  );
3495  
3496 -impl_i!([isize; 8]: isizex8, msizex8 | isize_ | test_v512 |
3497 +impl_i!([isize; 8]: isizex8, msizex8 | isize_, u8 | test_v512 |
3498          x0, x1, x2, x3, x4, x5, x6, x7 |
3499          From: |
3500 -        /// A vector with 4 `isize` lanes.
3501 +        /// A vector with 8 `isize` lanes.
3502  );
3503 -impl_u!([usize; 8]: usizex8, msizex8 | usize_ | test_v512 |
3504 +impl_u!([usize; 8]: usizex8, msizex8 | usize_, u8 | test_v512 |
3505          x0, x1, x2, x3, x4, x5, x6, x7 |
3506          From: |
3507          /// A vector with 8 `usize` lanes.
3508  );
3509 -impl_m!([msize; 8]: msizex8 | isize_ | test_v512 |
3510 +impl_m!([msize; 8]: msizex8 | isize_, u8 | test_v512 |
3511          x0, x1, x2, x3, x4, x5, x6, x7 |
3512          From: |
3513          /// A vector mask with 8 `msize` lanes.
3514 diff --git third_party/rust/packed_simd/tests/endianness.rs third_party/rust/packed_simd/tests/endianness.rs
3515 index 1e6b4f354301..31fb7073afb3 100644
3516 --- third_party/rust/packed_simd/tests/endianness.rs
3517 +++ third_party/rust/packed_simd/tests/endianness.rs
3518 @@ -17,7 +17,7 @@ fn endian_indexing() {
3519  #[cfg_attr(not(target_arch = "wasm32"), test)]
3520  #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
3521  fn endian_bitcasts() {
3522 -    #[cfg_attr(rustfmt, rustfmt_skip)]
3523 +    #[rustfmt::skip]
3524      let x = i8x16::new(
3525          0, 1, 2, 3, 4, 5, 6, 7,
3526          8, 9, 10, 11, 12, 13, 14, 15,
3527 @@ -34,13 +34,13 @@ fn endian_bitcasts() {
3528  #[cfg_attr(not(target_arch = "wasm32"), test)]
3529  #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
3530  fn endian_casts() {
3531 -    #[cfg_attr(rustfmt, rustfmt_skip)]
3532 +    #[rustfmt::skip]
3533      let x = i8x16::new(
3534          0, 1, 2, 3, 4, 5, 6, 7,
3535          8, 9, 10, 11, 12, 13, 14, 15,
3536      );
3537      let t: i16x16 = x.into(); // simd_cast
3538 -    #[cfg_attr(rustfmt, rustfmt_skip)]
3539 +    #[rustfmt::skip]
3540      let e = i16x16::new(
3541          0, 1, 2, 3, 4, 5, 6, 7,
3542          8, 9, 10, 11, 12, 13, 14, 15,
3543 @@ -51,7 +51,7 @@ fn endian_casts() {
3544  #[cfg_attr(not(target_arch = "wasm32"), test)]
3545  #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
3546  fn endian_load_and_stores() {
3547 -    #[cfg_attr(rustfmt, rustfmt_skip)]
3548 +    #[rustfmt::skip]
3549      let x = i8x16::new(
3550          0, 1, 2, 3, 4, 5, 6, 7,
3551          8, 9, 10, 11, 12, 13, 14, 15,
3552 @@ -82,10 +82,15 @@ fn endian_array_union() {
3553          vec: f32x4,
3554      }
3555      let x: [f32; 4] = unsafe { A { vec: f32x4::new(0., 1., 2., 3.) }.data };
3556 -    assert_eq!(x[0], 0_f32);
3557 -    assert_eq!(x[1], 1_f32);
3558 -    assert_eq!(x[2], 2_f32);
3559 -    assert_eq!(x[3], 3_f32);
3560 +    // As all of these are integer values within the mantissa^1 range, it
3561 +    // would be very unusual for them to actually fail to compare.
3562 +    #[allow(clippy::float_cmp)]
3563 +    {
3564 +        assert_eq!(x[0], 0_f32);
3565 +        assert_eq!(x[1], 1_f32);
3566 +        assert_eq!(x[2], 2_f32);
3567 +        assert_eq!(x[3], 3_f32);
3568 +    }
3569      let y: f32x4 = unsafe { A { data: [3., 2., 1., 0.] }.vec };
3570      assert_eq!(y, f32x4::new(3., 2., 1., 0.));
3571  
3572 @@ -93,23 +98,23 @@ fn endian_array_union() {
3573          data: [i8; 16],
3574          vec: i8x16,
3575      }
3576 -    #[cfg_attr(rustfmt, rustfmt_skip)]
3577 +    #[rustfmt::skip]
3578      let x = i8x16::new(
3579          0, 1, 2, 3, 4, 5, 6, 7,
3580          8, 9, 10, 11, 12, 13, 14, 15,
3581      );
3582      let x: [i8; 16] = unsafe { B { vec: x }.data };
3583  
3584 -    for i in 0..16 {
3585 -        assert_eq!(x[i], i as i8);
3586 +    for (i, v) in x.iter().enumerate() {
3587 +        assert_eq!(i as i8, *v);
3588      }
3589  
3590 -    #[cfg_attr(rustfmt, rustfmt_skip)]
3591 +    #[rustfmt::skip]
3592      let y = [
3593          15, 14, 13, 12, 11, 19, 9, 8,
3594          7, 6, 5, 4, 3, 2, 1, 0
3595      ];
3596 -    #[cfg_attr(rustfmt, rustfmt_skip)]
3597 +    #[rustfmt::skip]
3598      let e = i8x16::new(
3599          15, 14, 13, 12, 11, 19, 9, 8,
3600          7, 6, 5, 4, 3, 2, 1, 0
3601 @@ -121,7 +126,7 @@ fn endian_array_union() {
3602          data: [i16; 8],
3603          vec: i8x16,
3604      }
3605 -    #[cfg_attr(rustfmt, rustfmt_skip)]
3606 +    #[rustfmt::skip]
3607      let x = i8x16::new(
3608          0, 1, 2, 3, 4, 5, 6, 7,
3609          8, 9, 10, 11, 12, 13, 14, 15,
3610 @@ -145,21 +150,26 @@ fn endian_tuple_access() {
3611          vec: f32x4,
3612      }
3613      let x: F32x4T = unsafe { A { vec: f32x4::new(0., 1., 2., 3.) }.data };
3614 -    assert_eq!(x.0, 0_f32);
3615 -    assert_eq!(x.1, 1_f32);
3616 -    assert_eq!(x.2, 2_f32);
3617 -    assert_eq!(x.3, 3_f32);
3618 +    // As all of these are integer values within the mantissa^1 range, it
3619 +    // would be very unusual for them to actually fail to compare.
3620 +    #[allow(clippy::float_cmp)]
3621 +    {
3622 +        assert_eq!(x.0, 0_f32);
3623 +        assert_eq!(x.1, 1_f32);
3624 +        assert_eq!(x.2, 2_f32);
3625 +        assert_eq!(x.3, 3_f32);
3626 +    }
3627      let y: f32x4 = unsafe { A { data: (3., 2., 1., 0.) }.vec };
3628      assert_eq!(y, f32x4::new(3., 2., 1., 0.));
3629  
3630 -    #[cfg_attr(rustfmt, rustfmt_skip)]
3631 +    #[rustfmt::skip]
3632      type I8x16T = (i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8);
3633      union B {
3634          data: I8x16T,
3635          vec: i8x16,
3636      }
3637  
3638 -    #[cfg_attr(rustfmt, rustfmt_skip)]
3639 +    #[rustfmt::skip]
3640      let x = i8x16::new(
3641          0, 1, 2, 3, 4, 5, 6, 7,
3642          8, 9, 10, 11, 12, 13, 14, 15,
3643 @@ -183,27 +193,27 @@ fn endian_tuple_access() {
3644      assert_eq!(x.14, 14);
3645      assert_eq!(x.15, 15);
3646  
3647 -    #[cfg_attr(rustfmt, rustfmt_skip)]
3648 +    #[rustfmt::skip]
3649      let y = (
3650          15, 14, 13, 12, 11, 10, 9, 8,
3651          7, 6, 5, 4, 3, 2, 1, 0
3652      );
3653      let z: i8x16 = unsafe { B { data: y }.vec };
3654 -    #[cfg_attr(rustfmt, rustfmt_skip)]
3655 +    #[rustfmt::skip]
3656      let e = i8x16::new(
3657          15, 14, 13, 12, 11, 10, 9, 8,
3658          7, 6, 5, 4, 3, 2, 1, 0
3659      );
3660      assert_eq!(e, z);
3661  
3662 -    #[cfg_attr(rustfmt, rustfmt_skip)]
3663 +    #[rustfmt::skip]
3664      type I16x8T = (i16, i16, i16, i16, i16, i16, i16, i16);
3665      union C {
3666          data: I16x8T,
3667          vec: i8x16,
3668      }
3669  
3670 -    #[cfg_attr(rustfmt, rustfmt_skip)]
3671 +    #[rustfmt::skip]
3672      let x = i8x16::new(
3673          0, 1, 2, 3, 4, 5, 6, 7,
3674          8, 9, 10, 11, 12, 13, 14, 15,
3675 @@ -224,7 +234,7 @@ fn endian_tuple_access() {
3676      assert_eq!(x.6, e[6]);
3677      assert_eq!(x.7, e[7]);
3678  
3679 -    #[cfg_attr(rustfmt, rustfmt_skip)]
3680 +    #[rustfmt::skip]
3681      #[repr(C)]
3682      #[derive(Copy ,Clone)]
3683      pub struct Tup(pub i8, pub i8, pub i16, pub i8, pub i8, pub i16,
3684 @@ -235,7 +245,7 @@ fn endian_tuple_access() {
3685          vec: i8x16,
3686      }
3687  
3688 -    #[cfg_attr(rustfmt, rustfmt_skip)]
3689 +    #[rustfmt::skip]
3690      let x = i8x16::new(
3691          0, 1, 2, 3, 4, 5, 6, 7,
3692          8, 9, 10, 11, 12, 13, 14, 15,
3693
3694
3695 [FILE:11510:patches/patch-bug292127]
3696 --- comm/ldap/c-sdk/include/ldap.h~
3697 +++ comm/ldap/c-sdk/include/ldap.h
3698 @@ -40,6 +40,229 @@
3699  #ifndef _LDAP_H
3700  #define _LDAP_H
3701  
3702 +/* rename symbols to not clash with openldap (bug 292127) */
3703 +#define ldap_abandon moz_ldap_abandon
3704 +#define ldap_abandon_ext moz_ldap_abandon_ext
3705 +#define ldap_abandoned moz_ldap_abandoned
3706 +#define ldap_add moz_ldap_add
3707 +#define ldap_add_ext moz_ldap_add_ext
3708 +#define ldap_add_ext_s moz_ldap_add_ext_s
3709 +#define ldap_add_result_entry moz_ldap_add_result_entry
3710 +#define ldap_add_s moz_ldap_add_s
3711 +#define ldap_ber_free moz_ldap_ber_free
3712 +#define ldap_bind moz_ldap_bind
3713 +#define ldap_bind_s moz_ldap_bind_s
3714 +#define ldap_build_filter moz_ldap_build_filter
3715 +#define ldap_cache_flush moz_ldap_cache_flush
3716 +#define ldap_charray_add moz_ldap_charray_add
3717 +#define ldap_charray_dup moz_ldap_charray_dup
3718 +#define ldap_charray_free moz_ldap_charray_free
3719 +#define ldap_charray_inlist moz_ldap_charray_inlist
3720 +#define ldap_charray_merge moz_ldap_charray_merge
3721 +#define ldap_charray_position moz_ldap_charray_position
3722 +#define ldap_compare moz_ldap_compare
3723 +#define ldap_compare_ext moz_ldap_compare_ext
3724 +#define ldap_compare_ext_s moz_ldap_compare_ext_s
3725 +#define ldap_compare_s moz_ldap_compare_s
3726 +#define ldap_control_free moz_ldap_control_free
3727 +#define ldap_controls_free moz_ldap_controls_free
3728 +#define ldap_count_entries moz_ldap_count_entries
3729 +#define ldap_count_messages moz_ldap_count_messages
3730 +#define ldap_count_references moz_ldap_count_references
3731 +#define ldap_count_values moz_ldap_count_values
3732 +#define ldap_count_values_len moz_ldap_count_values_len
3733 +#define ldap_create_authzid_control moz_ldap_create_authzid_control
3734 +#define ldap_create_filter moz_ldap_create_filter
3735 +#define ldap_create_geteffectiveRights_control moz_ldap_create_geteffectiveRights_control
3736 +#define ldap_create_passwordpolicy_control moz_ldap_create_passwordpolicy_control
3737 +#define ldap_create_passwordpolicy_control_ext moz_ldap_create_passwordpolicy_control_ext
3738 +#define ldap_create_persistentsearch_control moz_ldap_create_persistentsearch_control
3739 +#define ldap_create_proxiedauth_control moz_ldap_create_proxiedauth_control
3740 +#define ldap_create_proxyauth_control moz_ldap_create_proxyauth_control
3741 +#define ldap_create_sort_control moz_ldap_create_sort_control
3742 +#define ldap_create_sort_keylist moz_ldap_create_sort_keylist
3743 +#define ldap_create_userstatus_control moz_ldap_create_userstatus_control
3744 +#define ldap_create_virtuallist_control moz_ldap_create_virtuallist_control
3745 +#define ldap_delete moz_ldap_delete
3746 +#define ldap_delete_ext moz_ldap_delete_ext
3747 +#define ldap_delete_ext_s moz_ldap_delete_ext_s
3748 +#define ldap_delete_result_entry moz_ldap_delete_result_entry
3749 +#define ldap_delete_s moz_ldap_delete_s
3750 +#define ldap_dn2ufn moz_ldap_dn2ufn
3751 +#define ldap_entry2html moz_ldap_entry2html
3752 +#define ldap_entry2html_search moz_ldap_entry2html_search
3753 +#define ldap_entry2text moz_ldap_entry2text
3754 +#define ldap_entry2text_search moz_ldap_entry2text_search
3755 +#define ldap_err2string moz_ldap_err2string
3756 +#define ldap_errlist moz_ldap_errlist
3757 +#define ldap_explode moz_ldap_explode
3758 +#define ldap_explode_dn moz_ldap_explode_dn
3759 +#define ldap_explode_dns moz_ldap_explode_dns
3760 +#define ldap_explode_rdn moz_ldap_explode_rdn
3761 +#define ldap_extended_operation moz_ldap_extended_operation
3762 +#define ldap_extended_operation_s moz_ldap_extended_operation_s
3763 +#define ldap_find_control moz_ldap_find_control
3764 +#define ldap_first_attribute moz_ldap_first_attribute
3765 +#define ldap_first_disptmpl moz_ldap_first_disptmpl
3766 +#define ldap_first_entry moz_ldap_first_entry
3767 +#define ldap_first_message moz_ldap_first_message
3768 +#define ldap_first_reference moz_ldap_first_reference
3769 +#define ldap_first_searchobj moz_ldap_first_searchobj
3770 +#define ldap_first_tmplcol moz_ldap_first_tmplcol
3771 +#define ldap_first_tmplrow moz_ldap_first_tmplrow
3772 +#define ldap_free_friendlymap moz_ldap_free_friendlymap
3773 +#define ldap_free_searchprefs moz_ldap_free_searchprefs
3774 +#define ldap_free_sort_keylist moz_ldap_free_sort_keylist
3775 +#define ldap_free_templates moz_ldap_free_templates
3776 +#define ldap_free_urldesc moz_ldap_free_urldesc
3777 +#define ldap_friendly_name moz_ldap_friendly_name
3778 +#define ldap_get_dn moz_ldap_get_dn
3779 +#define ldap_get_entry_controls moz_ldap_get_entry_controls
3780 +#define ldap_get_lang_values moz_ldap_get_lang_values
3781 +#define ldap_get_lang_values_len moz_ldap_get_lang_values_len
3782 +#define ldap_get_lderrno moz_ldap_get_lderrno
3783 +#define ldap_get_option moz_ldap_get_option
3784 +#define ldap_get_values moz_ldap_get_values
3785 +#define ldap_get_values_len moz_ldap_get_values_len
3786 +#define ldap_getfilter_free moz_ldap_getfilter_free
3787 +#define ldap_getfirstfilter moz_ldap_getfirstfilter
3788 +#define ldap_getnextfilter moz_ldap_getnextfilter
3789 +#define ldap_init moz_ldap_init
3790 +#define ldap_init_getfilter moz_ldap_init_getfilter
3791 +#define ldap_init_getfilter_buf moz_ldap_init_getfilter_buf
3792 +#define ldap_init_searchprefs moz_ldap_init_searchprefs
3793 +#define ldap_init_searchprefs_buf moz_ldap_init_searchprefs_buf
3794 +#define ldap_init_templates moz_ldap_init_templates
3795 +#define ldap_init_templates_buf moz_ldap_init_templates_buf
3796 +#define ldap_is_dns_dn moz_ldap_is_dns_dn
3797 +#define ldap_is_ldap_url moz_ldap_is_ldap_url
3798 +#define ldap_keysort_entries moz_ldap_keysort_entries
3799 +#define ldap_ld_free moz_ldap_ld_free
3800 +#define ldap_memcache_abandon moz_ldap_memcache_abandon
3801 +#define ldap_memcache_append moz_ldap_memcache_append
3802 +#define ldap_memcache_createkey moz_ldap_memcache_createkey
3803 +#define ldap_memcache_destroy moz_ldap_memcache_destroy
3804 +#define ldap_memcache_flush moz_ldap_memcache_flush
3805 +#define ldap_memcache_flush_results moz_ldap_memcache_flush_results
3806 +#define ldap_memcache_get moz_ldap_memcache_get
3807 +#define ldap_memcache_init moz_ldap_memcache_init
3808 +#define ldap_memcache_new moz_ldap_memcache_new
3809 +#define ldap_memcache_result moz_ldap_memcache_result
3810 +#define ldap_memcache_set moz_ldap_memcache_set
3811 +#define ldap_memcache_update moz_ldap_memcache_update
3812 +#define ldap_memfree moz_ldap_memfree
3813 +#define ldap_modify moz_ldap_modify
3814 +#define ldap_modify_ext moz_ldap_modify_ext
3815 +#define ldap_modify_ext_s moz_ldap_modify_ext_s
3816 +#define ldap_modify_s moz_ldap_modify_s
3817 +#define ldap_modrdn moz_ldap_modrdn
3818 +#define ldap_modrdn2 moz_ldap_modrdn2
3819 +#define ldap_modrdn2_s moz_ldap_modrdn2_s
3820 +#define ldap_modrdn_s moz_ldap_modrdn_s
3821 +#define ldap_mods_free moz_ldap_mods_free
3822 +#define ldap_msgdelete moz_ldap_msgdelete
3823 +#define ldap_msgfree moz_ldap_msgfree
3824 +#define ldap_msgid moz_ldap_msgid
3825 +#define ldap_msgtype moz_ldap_msgtype
3826 +#define ldap_multisort_entries moz_ldap_multisort_entries
3827 +#define ldap_name2template moz_ldap_name2template
3828 +#define ldap_next_attribute moz_ldap_next_attribute
3829 +#define ldap_next_disptmpl moz_ldap_next_disptmpl
3830 +#define ldap_next_entry moz_ldap_next_entry
3831 +#define ldap_next_message moz_ldap_next_message
3832 +#define ldap_next_reference moz_ldap_next_reference
3833 +#define ldap_next_searchobj moz_ldap_next_searchobj
3834 +#define ldap_next_tmplcol moz_ldap_next_tmplcol
3835 +#define ldap_next_tmplrow moz_ldap_next_tmplrow
3836 +#define ldap_oc2template moz_ldap_oc2template
3837 +#define ldap_open moz_ldap_open
3838 +#define ldap_parse_authzid_control moz_ldap_parse_authzid_control
3839 +#define ldap_parse_entrychange_control moz_ldap_parse_entrychange_control
3840 +#define ldap_parse_extended_result moz_ldap_parse_extended_result
3841 +#define ldap_parse_passwd moz_ldap_parse_passwd
3842 +#define ldap_parse_passwordpolicy_control moz_ldap_parse_passwordpolicy_control
3843 +#define ldap_parse_passwordpolicy_control_ext moz_ldap_parse_passwordpolicy_control_ext
3844 +#define ldap_parse_reference moz_ldap_parse_reference
3845 +#define ldap_parse_result moz_ldap_parse_result
3846 +#define ldap_parse_sasl_bind_result moz_ldap_parse_sasl_bind_result
3847 +#define ldap_parse_sort_control moz_ldap_parse_sort_control
3848 +#define ldap_parse_userstatus_control moz_ldap_parse_userstatus_control
3849 +#define ldap_parse_virtuallist_control moz_ldap_parse_virtuallist_control
3850 +#define ldap_parse_whoami moz_ldap_parse_whoami
3851 +#define ldap_passwd moz_ldap_passwd
3852 +#define ldap_passwd_s moz_ldap_passwd_s
3853 +#define ldap_passwordpolicy_err2txt moz_ldap_passwordpolicy_err2txt
3854 +#define ldap_perror moz_ldap_perror
3855 +#define ldap_rename moz_ldap_rename
3856 +#define ldap_rename_s moz_ldap_rename_s
3857 +#define ldap_result moz_ldap_result
3858 +#define ldap_result2error moz_ldap_result2error
3859 +#define ldap_sasl_bind moz_ldap_sasl_bind
3860 +#define ldap_sasl_bind_s moz_ldap_sasl_bind_s
3861 +#define ldap_sasl_interactive_bind_ext_s moz_ldap_sasl_interactive_bind_ext_s
3862 +#define ldap_sasl_interactive_bind_s moz_ldap_sasl_interactive_bind_s
3863 +#define ldap_search moz_ldap_search
3864 +#define ldap_search_ext moz_ldap_search_ext
3865 +#define ldap_search_ext_s moz_ldap_search_ext_s
3866 +#define ldap_search_s moz_ldap_search_s
3867 +#define ldap_search_st moz_ldap_search_st
3868 +#define ldap_set_filter_additions moz_ldap_set_filter_additions
3869 +#define ldap_set_lderrno moz_ldap_set_lderrno
3870 +#define ldap_set_option moz_ldap_set_option
3871 +#define ldap_set_rebind_proc moz_ldap_set_rebind_proc
3872 +#define ldap_setfilteraffixes moz_ldap_setfilteraffixes
3873 +#define ldap_simple_bind moz_ldap_simple_bind
3874 +#define ldap_simple_bind_s moz_ldap_simple_bind_s
3875 +#define ldap_sort_entries moz_ldap_sort_entries
3876 +#define ldap_sort_strcasecmp moz_ldap_sort_strcasecmp
3877 +#define ldap_sort_values moz_ldap_sort_values
3878 +#define ldap_start_tls_s moz_ldap_start_tls_s
3879 +#define ldap_str2charray moz_ldap_str2charray
3880 +#define ldap_tmplattrs moz_ldap_tmplattrs
3881 +#define ldap_tmplerr2string moz_ldap_tmplerr2string
3882 +#define ldap_tmplerrlist moz_ldap_tmplerrlist
3883 +#define ldap_ufn_search_c moz_ldap_ufn_search_c
3884 +#define ldap_ufn_search_ct moz_ldap_ufn_search_ct
3885 +#define ldap_ufn_search_ctx moz_ldap_ufn_search_ctx
3886 +#define ldap_ufn_search_s moz_ldap_ufn_search_s
3887 +#define ldap_ufn_setfilter moz_ldap_ufn_setfilter
3888 +#define ldap_ufn_setprefix moz_ldap_ufn_setprefix
3889 +#define ldap_ufn_timeout moz_ldap_ufn_timeout
3890 +#define ldap_unbind moz_ldap_unbind
3891 +#define ldap_unbind_ext moz_ldap_unbind_ext
3892 +#define ldap_unbind_s moz_ldap_unbind_s
3893 +#define ldap_url_parse moz_ldap_url_parse
3894 +#define ldap_url_parse_no_defaults moz_ldap_url_parse_no_defaults
3895 +#define ldap_url_search moz_ldap_url_search
3896 +#define ldap_url_search_s moz_ldap_url_search_s
3897 +#define ldap_url_search_st moz_ldap_url_search_st
3898 +#define ldap_utf8characters moz_ldap_utf8characters
3899 +#define ldap_utf8copy moz_ldap_utf8copy
3900 +#define ldap_utf8getcc moz_ldap_utf8getcc
3901 +#define ldap_utf8isalnum moz_ldap_utf8isalnum
3902 +#define ldap_utf8isalpha moz_ldap_utf8isalpha
3903 +#define ldap_utf8isdigit moz_ldap_utf8isdigit
3904 +#define ldap_utf8isspace moz_ldap_utf8isspace
3905 +#define ldap_utf8isxdigit moz_ldap_utf8isxdigit
3906 +#define ldap_utf8len moz_ldap_utf8len
3907 +#define ldap_utf8next moz_ldap_utf8next
3908 +#define ldap_utf8prev moz_ldap_utf8prev
3909 +#define ldap_utf8strtok_r moz_ldap_utf8strtok_r
3910 +#define ldap_vals2html moz_ldap_vals2html
3911 +#define ldap_vals2text moz_ldap_vals2text
3912 +#define ldap_value_free moz_ldap_value_free
3913 +#define ldap_value_free_len moz_ldap_value_free_len
3914 +#define ldap_version moz_ldap_version
3915 +#define ldap_whoami moz_ldap_whoami
3916 +#define ldap_whoami_s moz_ldap_whoami_s
3917 +#define ldap_x_calloc moz_ldap_x_calloc
3918 +#define ldap_x_free moz_ldap_x_free
3919 +#define ldap_x_hostlist_first moz_ldap_x_hostlist_first
3920 +#define ldap_x_hostlist_next moz_ldap_x_hostlist_next
3921 +#define ldap_x_hostlist_statusfree moz_ldap_x_hostlist_statusfree
3922 +#define ldap_x_malloc moz_ldap_x_malloc
3923 +#define ldap_x_realloc moz_ldap_x_realloc
3924 +
3925  /* Standard LDAP API functions and declarations */
3926  #include "ldap-standard.h"
3927  
3928
3929
3930 [FILE:9904:patches/patch-bug847568]
3931 # Allow building against system-wide graphite2/harfbuzz.
3932
3933 diff --git config/system-headers.mozbuild config/system-headers.mozbuild
3934 index 7620b4d00623..09d3db5ca8c0 100644
3935 --- config/system-headers.mozbuild
3936 +++ config/system-headers.mozbuild
3937 @@ -1299,6 +1299,19 @@ if CONFIG['MOZ_ENABLE_LIBPROXY']:
3938          'proxy.h',
3939      ]
3940  
3941 +if CONFIG['MOZ_SYSTEM_GRAPHITE2']:
3942 +    system_headers += [
3943 +        'graphite2/Font.h',
3944 +        'graphite2/Segment.h',
3945 +    ]
3946 +
3947 +if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
3948 +    system_headers += [
3949 +        'harfbuzz/hb-glib.h',
3950 +        'harfbuzz/hb-ot.h',
3951 +        'harfbuzz/hb.h',
3952 +    ]
3953 +
3954  if CONFIG['MOZ_SYSTEM_LIBVPX']:
3955      system_headers += [
3956          'vpx_mem/vpx_mem.h',
3957 diff --git dom/base/moz.build dom/base/moz.build
3958 index 8e19020315ae..2fcdbb6f7b42 100644
3959 --- dom/base/moz.build
3960 +++ dom/base/moz.build
3961 @@ -543,6 +543,9 @@ if CONFIG['MOZ_BUILD_APP'] in ['browser', 'mobile/android', 'xulrunner']:
3962  if CONFIG['MOZ_X11']:
3963      CXXFLAGS += CONFIG['TK_CFLAGS']
3964  
3965 +if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
3966 +    CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS']
3967 +
3968  GeneratedFile('UseCounterList.h', script='gen-usecounters.py',
3969                entry_point='use_counter_list', inputs=['UseCounters.conf'])
3970  
3971 diff --git gfx/graphite2/geckoextra/moz.build gfx/graphite2/geckoextra/moz.build
3972 new file mode 100644
3973 index 0000000000000..24e8d7a03274a
3974 --- /dev/null
3975 +++ gfx/graphite2/geckoextra/moz.build
3976 @@ -0,0 +1,21 @@
3977 +# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
3978 +# vim: set filetype=python:
3979 +# This Source Code Form is subject to the terms of the Mozilla Public
3980 +# License, v. 2.0. If a copy of the MPL was not distributed with this
3981 +# file, You can obtain one at http://mozilla.org/MPL/2.0/.
3982 +
3983 +EXPORTS.graphite2 += [
3984 +    'include/GraphiteExtra.h',
3985 +    'include/GraphiteStructsForRLBox.h',
3986 +]
3987 +
3988 +UNIFIED_SOURCES += [
3989 +    '../geckoextra/src/GraphiteExtra.cpp',
3990 +]
3991 +
3992 +CXXFLAGS += CONFIG['MOZ_GRAPHITE2_CFLAGS']
3993 +
3994 +# Match bundled graphite2 configuration
3995 +AllowCompilerWarnings()
3996 +
3997 +FINAL_LIBRARY = 'gkmedias'
3998 diff --git gfx/graphite2/moz-gr-update.sh gfx/graphite2/moz-gr-update.sh
3999 index faaab1b17971..04eff5f09882 100644
4000 --- gfx/graphite2/moz-gr-update.sh
4001 +++ gfx/graphite2/moz-gr-update.sh
4002 @@ -1,6 +1,7 @@
4003  #!/bin/bash
4004  
4005  # Script used to update the Graphite2 library in the mozilla source tree
4006 +# and bump version for --with-system-graphite2
4007  
4008  # This script lives in gfx/graphite2, along with the library source,
4009  # but must be run from the top level of the mozilla-central tree.
4010 @@ -37,12 +38,16 @@ echo "See" $0 "for update procedure." >> gfx/graphite2/README.mozilla
4011  #find gfx/graphite2/ -name "*.cpp" -exec perl -p -i -e "s/<cstdio>/<stdio.h>/;s/Windows.h/windows.h/;" {} \;
4012  #find gfx/graphite2/ -name "*.h" -exec perl -p -i -e "s/<cstdio>/<stdio.h>/;s/Windows.h/windows.h/;" {} \;
4013  
4014 +# chase version for --with-system-graphite2
4015 +perl -p -i -e "s/[0-9]+\,[0-9]+\,[0-9]+/$RELEASE/ and tr/./,/ \
4016 +  if /GR2_VERSION_REQUIRE/" old-configure.in
4017 +
4018  # summarize what's been touched
4019  echo Updated to $RELEASE.
4020  echo Here is what changed in the gfx/graphite2 directory:
4021  echo
4022  
4023 -hg stat gfx/graphite2
4024 +hg stat old-configure.in gfx/graphite2
4025  
4026  echo
4027  echo If gfx/graphite2/src/files.mk has changed, please make corresponding
4028 diff --git gfx/harfbuzz/README-mozilla gfx/harfbuzz/README-mozilla
4029 index 22c76a7df020..a01490bd49ee 100644
4030 --- gfx/harfbuzz/README-mozilla
4031 +++ gfx/harfbuzz/README-mozilla
4032 @@ -15,3 +15,8 @@ from within the gfx/harfbuzz directory.
4033  
4034  If the collection of source files changes, manual updates to moz.build may be
4035  needed as we don't use the upstream makefiles.
4036 +
4037 +The in-tree copy may be omitted during build by --with-system-harfbuzz.
4038 +Make sure to keep pkg-config version check within toolkit/moz.configure in sync
4039 +with checkout version or increment latest tag by one if it's not based
4040 +on upstream release.
4041 diff --git gfx/moz.build gfx/moz.build
4042 index 771f652e837a..3b358d84e384 100644
4043 --- gfx/moz.build
4044 +++ gfx/moz.build
4045 @@ -13,6 +13,14 @@ with Files('wr/**'):
4046  if CONFIG['MOZ_TREE_CAIRO']:
4047      DIRS += ['cairo']
4048  
4049 +if CONFIG['MOZ_SYSTEM_GRAPHITE2']:
4050 +    DIRS += ['graphite2/geckoextra']
4051 +else:
4052 +    DIRS += ['graphite2/src' ]
4053 +
4054 +if not CONFIG['MOZ_SYSTEM_HARFBUZZ']:
4055 +    DIRS += ['harfbuzz/src']
4056 +
4057  DIRS += [
4058      '2d',
4059      'ycbcr',
4060 @@ -21,8 +29,6 @@ DIRS += [
4061      'qcms',
4062      'gl',
4063      'layers',
4064 -    'graphite2/src',
4065 -    'harfbuzz/src',
4066      'ots/src',
4067      'thebes',
4068      'ipc',
4069 diff --git gfx/skia/generate_mozbuild.py gfx/skia/generate_mozbuild.py
4070 index e06ae3457a47..93faa61594a3 100755
4071 --- gfx/skia/generate_mozbuild.py
4072 +++ gfx/skia/generate_mozbuild.py
4073 @@ -117,6 +117,9 @@ if CONFIG['CC_TYPE'] in ('clang', 'clang-cl'):
4074          '-Wno-unused-private-field',
4075      ]
4076  
4077 +if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
4078 +    CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS']
4079 +
4080  if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk', 'android'):
4081      CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS']
4082      CXXFLAGS += CONFIG['CAIRO_FT_CFLAGS']
4083 diff --git gfx/skia/moz.build gfx/skia/moz.build
4084 index 2118677ca3a8..e4978b413784 100644
4085 --- gfx/skia/moz.build
4086 +++ gfx/skia/moz.build
4087 @@ -493,6 +493,9 @@ if CONFIG['CC_TYPE'] in ('clang', 'clang-cl'):
4088          '-Wno-unused-private-field',
4089      ]
4090  
4091 +if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
4092 +    CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS']
4093 +
4094  if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk', 'android'):
4095      CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS']
4096      CXXFLAGS += CONFIG['CAIRO_FT_CFLAGS']
4097 diff --git gfx/thebes/moz.build gfx/thebes/moz.build
4098 index 56f1b9fe3f4b..0ac1100b0df3 100644
4099 --- gfx/thebes/moz.build
4100 +++ gfx/thebes/moz.build
4101 @@ -284,7 +284,13 @@ if CONFIG['MOZ_WAYLAND']:
4102  
4103  LOCAL_INCLUDES += CONFIG['SKIA_INCLUDES']
4104  
4105 -DEFINES['GRAPHITE2_STATIC'] = True
4106 +if CONFIG['MOZ_SYSTEM_GRAPHITE2']:
4107 +    CXXFLAGS += CONFIG['MOZ_GRAPHITE2_CFLAGS']
4108 +else:
4109 +    DEFINES['GRAPHITE2_STATIC'] = True
4110 +
4111 +if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
4112 +    CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS']
4113  
4114  if CONFIG['CC_TYPE'] == 'clang':
4115      # Suppress warnings from Skia header files.
4116 diff --git intl/unicharutil/util/moz.build intl/unicharutil/util/moz.build
4117 index cb1233c56d7e..06fb1f9f174b 100644
4118 --- intl/unicharutil/util/moz.build
4119 +++ intl/unicharutil/util/moz.build
4120 @@ -25,4 +25,7 @@ UNIFIED_SOURCES += [
4121      'nsUnicodeProperties.cpp',
4122  ]
4123  
4124 +if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
4125 +    CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS']
4126 +
4127  FINAL_LIBRARY = 'xul'
4128 diff --git netwerk/dns/moz.build netwerk/dns/moz.build
4129 index 79c26e3e7001..c4d93bc5f7dc 100644
4130 --- netwerk/dns/moz.build
4131 +++ netwerk/dns/moz.build
4132 @@ -86,3 +86,6 @@ USE_LIBS += ['icu']
4133  
4134  if CONFIG['CC_TYPE'] in ('clang', 'gcc'):
4135      CXXFLAGS += ['-Wno-error=shadow']
4136 +
4137 +if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
4138 +    CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS']
4139 diff --git old-configure.in old-configure.in
4140 index 95a58b634593..b614eef85c89 100644
4141 --- old-configure.in
4142 +++ old-configure.in
4143 @@ -2639,6 +2639,27 @@ dnl ========================================================
4144  
4145  AC_SUBST(MOZ_LINUX_32_SSE2_STARTUP_ERROR)
4146  
4147 +dnl ========================================================
4148 +dnl Check for graphite2
4149 +dnl ========================================================
4150 +if test -n "$MOZ_SYSTEM_GRAPHITE2"; then
4151 +    dnl graphite2.pc has bogus version, check manually
4152 +    _SAVE_CFLAGS=$CFLAGS
4153 +    CFLAGS="$CFLAGS $MOZ_GRAPHITE2_CFLAGS"
4154 +    AC_TRY_COMPILE([ #include <graphite2/Font.h>
4155 +                     #define GR2_VERSION_REQUIRE(major,minor,bugfix)  \
4156 +                             ( GR2_VERSION_MAJOR * 10000 + GR2_VERSION_MINOR \
4157 +                               * 100 + GR2_VERSION_BUGFIX >= \
4158 +                               (major) * 10000 + (minor) * 100 + (bugfix) )
4159 +                   ], [
4160 +                     #if !GR2_VERSION_REQUIRE(1,3,14)
4161 +                     #error "Insufficient graphite2 version."
4162 +                     #endif
4163 +                   ], [],
4164 +                   [AC_MSG_ERROR([--with-system-graphite2 requested but no working libgraphite2 found])])
4165 +    CFLAGS=$_SAVE_CFLAGS
4166 +fi
4167 +
4168  dnl ========================================================
4169  dnl Check for pixman and cairo
4170  dnl ========================================================
4171 diff --git toolkit/library/moz.build toolkit/library/moz.build
4172 index 24f940e1ed7e..079a575adec3 100644
4173 --- toolkit/library/moz.build
4174 +++ toolkit/library/moz.build
4175 @@ -248,6 +248,12 @@ if CONFIG['MOZ_SYSTEM_PNG']:
4176  if CONFIG['MOZ_SYSTEM_WEBP']:
4177      OS_LIBS += CONFIG['MOZ_WEBP_LIBS']
4178  
4179 +if CONFIG['MOZ_SYSTEM_GRAPHITE2']:
4180 +    OS_LIBS += CONFIG['MOZ_GRAPHITE2_LIBS']
4181 +
4182 +if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
4183 +    OS_LIBS += CONFIG['MOZ_HARFBUZZ_LIBS']
4184 +
4185  if CONFIG['MOZ_SYSTEM_LIBEVENT']:
4186      OS_LIBS += CONFIG['MOZ_LIBEVENT_LIBS']
4187  
4188 diff --git toolkit/moz.configure toolkit/moz.configure
4189 index 9297e4d6f501..d8e273887e4b 100644
4190 --- toolkit/moz.configure
4191 +++ toolkit/moz.configure
4192 @@ -937,6 +937,25 @@ add_old_configure_assignment('FT2_LIBS',
4193  add_old_configure_assignment('FT2_CFLAGS',
4194                               ft2_info.cflags)
4195  
4196 +# Graphite2
4197 +# ==============================================================
4198 +option('--with-system-graphite2',
4199 +       help="Use system graphite2 (located with pkgconfig)")
4200 +
4201 +system_graphite2 = pkg_check_modules('MOZ_GRAPHITE2', 'graphite2',
4202 +                                     when='--with-system-graphite2')
4203 +
4204 +set_config('MOZ_SYSTEM_GRAPHITE2', depends_if(system_graphite2)(lambda _: True))
4205 +
4206 +# HarfBuzz
4207 +# ==============================================================
4208 +option('--with-system-harfbuzz',
4209 +       help="Use system harfbuzz (located with pkgconfig)")
4210 +
4211 +system_harfbuzz = pkg_check_modules('MOZ_HARFBUZZ', 'harfbuzz >= 2.6.6',
4212 +                                    when='--with-system-harfbuzz')
4213 +
4214 +set_config('MOZ_SYSTEM_HARFBUZZ', depends_if(system_harfbuzz)(lambda _: True))
4215  
4216  # Remote agent (part of CDP based remote protocol)
4217  # ==============================================================
4218
4219
4220 [FILE:1292:patches/patch-comm_ldap_c-sdk_include_portable.h]
4221 --- comm/ldap/c-sdk/include/portable.h.orig     2020-05-21 20:31:05 UTC
4222 +++ comm/ldap/c-sdk/include/portable.h
4223 @@ -119,11 +119,15 @@
4224  #  define OPENLOG_OPTIONS (LOG_PID | LOG_NOWAIT)
4225  #endif
4226  
4227 +#ifdef __DragonFly__
4228 +#define DRAGONFLY
4229 +#endif
4230 +
4231  /*
4232   * some systems don't have the BSD re_comp and re_exec routines
4233   */
4234  #ifndef NEED_BSDREGEX
4235 -#  if (defined(SYSV) || defined(NETBSD) || defined(FREEBSD) ||       \
4236 +#  if (defined(SYSV) || defined(NETBSD) || defined(FREEBSD) || defined(DRAGONFLY) || \
4237         defined(__OpenBSD__) || defined(linux) || defined(DARWIN)) && \
4238        !defined(sgi)
4239  #    define NEED_BSDREGEX
4240 @@ -274,7 +278,7 @@ int strncasecmp(const char *, const char
4241        defined(SUNOS4) || defined(SNI) || defined(BSDI) || defined(NCR) ||      \
4242        defined(OSF1) || defined(NEC) || defined(VMS) ||                         \
4243        (defined(HPUX10) && !defined(_REENTRANT)) || defined(HPUX11) ||          \
4244 -      defined(UnixWare) || defined(NETBSD) || defined(FREEBSD) ||              \
4245 +      defined(UnixWare) || defined(NETBSD) || defined(FREEBSD) || defined(DRAGONFLY) || \
4246        defined(OPENBSD) || (defined(LINUX) && __GLIBC__ < 2) ||                 \
4247        (defined(AIX) && !defined(USE_REENTRANT_LIBC))
4248  #    define GETHOSTBYNAME(n, r, b, l, e) gethostbyname(n)
4249
4250
4251 [FILE:421:patches/patch-comm_mail_app_nsMailApp.cpp]
4252 --- comm/mail/app/nsMailApp.cpp.orig    2020-07-13 18:10:03 UTC
4253 +++ comm/mail/app/nsMailApp.cpp
4254 @@ -306,6 +306,9 @@ int main(int argc, char* argv[], char* e
4255    }
4256  #endif
4257  
4258 +  setenv("MOZ_GMP_PATH", "%%LOCALBASE%%/lib/browser_plugins/symlinks/gecko", 0);
4259 +  setenv("MOZ_PLUGIN_PATH", "%%LOCALBASE%%/lib/browser_plugins/symlinks/gecko", 0);
4260 +
4261  #ifdef HAS_DLL_BLOCKLIST
4262    DllBlocklist_Initialize(gBlocklistInitFlags);
4263  #endif
4264
4265
4266 [FILE:679:patches/patch-comm_third__party_botan_configure.py]
4267 --- comm/third_party/botan/configure.py.orig    2020-07-13 18:10:04 UTC
4268 +++ comm/third_party/botan/configure.py
4269 @@ -2936,11 +2936,7 @@ def set_defaults_for_unset_options(optio
4270          options.os = find_canonical_os_name(options.os)
4271  
4272      def deduce_compiler_type_from_cc_bin(cc_bin):
4273 -        if cc_bin.find('clang') != -1 or cc_bin in ['emcc', 'em++']:
4274 -            return 'clang'
4275 -        if cc_bin.find('-g++') != -1 or cc_bin.find('g++') != -1:
4276 -            return 'gcc'
4277 -        return None
4278 +        return 'gcc'
4279  
4280      if options.compiler is None and options.compiler_binary is not None:
4281          options.compiler = deduce_compiler_type_from_cc_bin(options.compiler_binary)
4282
4283
4284 [FILE:286:patches/patch-comm_third__party_botan_src_build-data_os_freebsd.txt]
4285 FreeBSD 11.3 doesn't have sys/auxv.h
4286
4287 --- comm/third_party/botan/src/build-data/os/freebsd.txt.orig   2020-09-08 23:21:51 UTC
4288 +++ comm/third_party/botan/src/build-data/os/freebsd.txt
4289 @@ -11,7 +11,6 @@ dev_random
4290  arc4random
4291  explicit_bzero
4292  cap_enter
4293 -elf_aux_info
4294  getentropy
4295  
4296  atomics
4297
4298
4299 [FILE:36325:patches/patch-cubeb-oss]
4300 https://github.com/kinetiknz/cubeb/pull/600
4301
4302 --- dom/media/CubebUtils.cpp.orig       2020-08-19 02:08:51 UTC
4303 +++ dom/media/CubebUtils.cpp
4304 @@ -126,7 +126,7 @@ const char kBrandBundleURL[] = "chrome://branding/locale/brand.properties";
4305  
4306  const char* AUDIOSTREAM_BACKEND_ID_STR[] = {
4307      "jack",  "pulse",       "alsa",  "audiounit", "audioqueue", "wasapi",
4308 -    "winmm", "directsound", "sndio", "opensl",    "audiotrack", "kai"};
4309 +    "winmm", "directsound", "sndio", "opensl", "oss", "audiotrack", "kai"};
4310  /* Index for failures to create an audio stream the first time. */
4311  const int CUBEB_BACKEND_INIT_FAILURE_FIRST =
4312      ArrayLength(AUDIOSTREAM_BACKEND_ID_STR);
4313 --- media/libcubeb/src/moz.build.orig   2020-08-19 02:09:19 UTC
4314 +++ media/libcubeb/src/moz.build
4315 @@ -40,6 +40,12 @@ if CONFIG['MOZ_JACK']:
4316      ]
4317      DEFINES['USE_JACK'] = True
4318  
4319 +if CONFIG['OS_ARCH'] in ('DragonFly', 'FreeBSD', 'SunOS'):
4320 +    SOURCES += [
4321 +        'cubeb_oss.c',
4322 +    ]
4323 +    DEFINES['USE_OSS'] = True
4324 +
4325  if CONFIG['OS_ARCH'] == 'OpenBSD':
4326      SOURCES += [
4327          'cubeb_sndio.c',
4328 --- media/libcubeb/src/cubeb.c.orig     2020-08-19 02:09:26 UTC
4329 +++ media/libcubeb/src/cubeb.c
4330 @@ -60,6 +60,9 @@ int sun_init(cubeb ** context, char const * context_name);
4331  #if defined(USE_OPENSL)
4332  int opensl_init(cubeb ** context, char const * context_name);
4333  #endif
4334 +#if defined(USE_OSS)
4335 +int oss_init(cubeb ** context, char const * context_name);
4336 +#endif
4337  #if defined(USE_AUDIOTRACK)
4338  int audiotrack_init(cubeb ** context, char const * context_name);
4339  #endif
4340 @@ -165,6 +168,10 @@ cubeb_init(cubeb ** context, char const * context_name, char const * backend_nam
4341  #if defined(USE_OPENSL)
4342        init_oneshot = opensl_init;
4343  #endif
4344 +    } else if (!strcmp(backend_name, "oss")) {
4345 +#if defined(USE_OSS)
4346 +      init_oneshot = oss_init;
4347 +#endif
4348      } else if (!strcmp(backend_name, "audiotrack")) {
4349  #if defined(USE_AUDIOTRACK)
4350        init_oneshot = audiotrack_init;
4351 @@ -200,6 +207,9 @@ cubeb_init(cubeb ** context, char const * context_name, char const * backend_nam
4352  #if defined(USE_ALSA)
4353      alsa_init,
4354  #endif
4355 +#if defined (USE_OSS)
4356 +    oss_init,
4357 +#endif
4358  #if defined(USE_AUDIOUNIT_RUST)
4359      audiounit_rust_init,
4360  #endif
4361 --- /dev/null
4362 +++ media/libcubeb/src/cubeb_oss.c
4363 @@ -0,0 +1,1263 @@
4364 +/*
4365 + * Copyright Â© 2019-2020 Nia Alarie <nia@NetBSD.org>
4366 + * Copyright Â© 2020 Ka Ho Ng <khng300@gmail.com>
4367 + * Copyright Â© 2020 The FreeBSD Foundation
4368 + *
4369 + * Portions of this software were developed by Ka Ho Ng
4370 + * under sponsorship from the FreeBSD Foundation.
4371 + *
4372 + * This program is made available under an ISC-style license.  See the
4373 + * accompanying file LICENSE for details.
4374 + */
4375 +
4376 +#if defined(__FreeBSD__) && __FreeBSD__ < 12
4377 +#define _WITH_GETLINE
4378 +#endif
4379 +#include <assert.h>
4380 +#include <ctype.h>
4381 +#include <limits.h>
4382 +#include <errno.h>
4383 +#include <sys/types.h>
4384 +#include <sys/soundcard.h>
4385 +#include <sys/ioctl.h>
4386 +#include <fcntl.h>
4387 +#include <unistd.h>
4388 +#include <pthread.h>
4389 +#include <stdbool.h>
4390 +#include <stdlib.h>
4391 +#include <stdio.h>
4392 +#include <string.h>
4393 +#include <poll.h>
4394 +#include "cubeb/cubeb.h"
4395 +#include "cubeb_mixer.h"
4396 +#include "cubeb_strings.h"
4397 +#include "cubeb-internal.h"
4398 +
4399 +/* Supported well by most hardware. */
4400 +#ifndef OSS_PREFER_RATE
4401 +#define OSS_PREFER_RATE (48000)
4402 +#endif
4403 +
4404 +/* Standard acceptable minimum. */
4405 +#ifndef OSS_LATENCY_MS
4406 +#define OSS_LATENCY_MS (8)
4407 +#endif
4408 +
4409 +#ifndef OSS_NFRAGS
4410 +#define OSS_NFRAGS (4)
4411 +#endif
4412 +
4413 +#ifndef OSS_DEFAULT_DEVICE
4414 +#define OSS_DEFAULT_DEVICE "/dev/dsp"
4415 +#endif
4416 +
4417 +#ifndef OSS_DEFAULT_MIXER
4418 +#define OSS_DEFAULT_MIXER "/dev/mixer"
4419 +#endif
4420 +
4421 +#define ENV_AUDIO_DEVICE "AUDIO_DEVICE"
4422 +
4423 +#ifndef OSS_MAX_CHANNELS
4424 +# if defined(__FreeBSD__) || defined(__DragonFly__)
4425 +/*
4426 + * The current maximum number of channels supported
4427 + * on FreeBSD is 8.
4428 + *
4429 + * Reference: FreeBSD 12.1-RELEASE
4430 + */
4431 +#  define OSS_MAX_CHANNELS (8)
4432 +# elif defined(__sun__)
4433 +/*
4434 + * The current maximum number of channels supported
4435 + * on Illumos is 16.
4436 + *
4437 + * Reference: PSARC 2008/318
4438 + */
4439 +#  define OSS_MAX_CHANNELS (16)
4440 +# else
4441 +#  define OSS_MAX_CHANNELS (2)
4442 +# endif
4443 +#endif
4444 +
4445 +#if defined(__FreeBSD__) || defined(__DragonFly__)
4446 +#define SNDSTAT_BEGIN_STR "Installed devices:"
4447 +#define SNDSTAT_USER_BEGIN_STR "Installed devices from userspace:"
4448 +#define SNDSTAT_FV_BEGIN_STR "File Versions:"
4449 +#endif
4450 +
4451 +static struct cubeb_ops const oss_ops;
4452 +
4453 +struct cubeb {
4454 +  struct cubeb_ops const * ops;
4455 +
4456 +  /* Our intern string store */
4457 +  pthread_mutex_t mutex; /* protects devid_strs */
4458 +  cubeb_strings *devid_strs;
4459 +};
4460 +
4461 +struct oss_stream {
4462 +  oss_devnode_t name;
4463 +  int fd;
4464 +  void * buf;
4465 +
4466 +  struct stream_info {
4467 +    int channels;
4468 +    int sample_rate;
4469 +    int fmt;
4470 +    int precision;
4471 +  } info;
4472 +
4473 +  unsigned int frame_size; /* precision in bytes * channels */
4474 +  bool floating;
4475 +};
4476 +
4477 +struct cubeb_stream {
4478 +  struct cubeb * context;
4479 +  void * user_ptr;
4480 +  pthread_t thread;
4481 +  bool doorbell; /* (m) */
4482 +  pthread_cond_t doorbell_cv; /* (m) */
4483 +  pthread_cond_t stopped_cv; /* (m) */
4484 +  pthread_mutex_t mtx; /* Members protected by this should be marked (m) */
4485 +  bool thread_created; /* (m) */
4486 +  bool running; /* (m) */
4487 +  bool destroying; /* (m) */
4488 +  cubeb_state state; /* (m) */
4489 +  float volume /* (m) */;
4490 +  struct oss_stream play;
4491 +  struct oss_stream record;
4492 +  cubeb_data_callback data_cb;
4493 +  cubeb_state_callback state_cb;
4494 +  uint64_t frames_written /* (m) */;
4495 +  unsigned int nfr; /* Number of frames allocated */
4496 +  unsigned int nfrags;
4497 +  unsigned int bufframes;
4498 +};
4499 +
4500 +static char const *
4501 +oss_cubeb_devid_intern(cubeb *context, char const * devid)
4502 +{
4503 +  char const *is;
4504 +  pthread_mutex_lock(&context->mutex);
4505 +  is = cubeb_strings_intern(context->devid_strs, devid);
4506 +  pthread_mutex_unlock(&context->mutex);
4507 +  return is;
4508 +}
4509 +
4510 +int
4511 +oss_init(cubeb **context, char const *context_name) {
4512 +  cubeb * c;
4513 +
4514 +  (void)context_name;
4515 +  if ((c = calloc(1, sizeof(cubeb))) == NULL) {
4516 +    return CUBEB_ERROR;
4517 +  }
4518 +
4519 +  if (cubeb_strings_init(&c->devid_strs) == CUBEB_ERROR) {
4520 +    goto fail;
4521 +  }
4522 +
4523 +  if (pthread_mutex_init(&c->mutex, NULL) != 0) {
4524 +    goto fail;
4525 +  }
4526 +
4527 +  c->ops = &oss_ops;
4528 +  *context = c;
4529 +  return CUBEB_OK;
4530 +
4531 +fail:
4532 +  cubeb_strings_destroy(c->devid_strs);
4533 +  free(c);
4534 +  return CUBEB_ERROR;
4535 +}
4536 +
4537 +static void
4538 +oss_destroy(cubeb * context)
4539 +{
4540 +  pthread_mutex_destroy(&context->mutex);
4541 +  cubeb_strings_destroy(context->devid_strs);
4542 +  free(context);
4543 +}
4544 +
4545 +static char const *
4546 +oss_get_backend_id(cubeb * context)
4547 +{
4548 +  return "oss";
4549 +}
4550 +
4551 +static int
4552 +oss_get_preferred_sample_rate(cubeb * context, uint32_t * rate)
4553 +{
4554 +  (void)context;
4555 +
4556 +  *rate = OSS_PREFER_RATE;
4557 +  return CUBEB_OK;
4558 +}
4559 +
4560 +static int
4561 +oss_get_max_channel_count(cubeb * context, uint32_t * max_channels)
4562 +{
4563 +  (void)context;
4564 +
4565 +  *max_channels = OSS_MAX_CHANNELS;
4566 +  return CUBEB_OK;
4567 +}
4568 +
4569 +static int
4570 +oss_get_min_latency(cubeb * context, cubeb_stream_params params,
4571 +                    uint32_t * latency_frames)
4572 +{
4573 +  (void)context;
4574 +
4575 +  *latency_frames = (OSS_LATENCY_MS * params.rate) / 1000;
4576 +  return CUBEB_OK;
4577 +}
4578 +
4579 +static void
4580 +oss_free_cubeb_device_info_strings(cubeb_device_info *cdi)
4581 +{
4582 +  free((char *)cdi->device_id);
4583 +  free((char *)cdi->friendly_name);
4584 +  free((char *)cdi->group_id);
4585 +  cdi->device_id = NULL;
4586 +  cdi->friendly_name = NULL;
4587 +  cdi->group_id = NULL;
4588 +}
4589 +
4590 +#if defined(__FreeBSD__) || defined(__DragonFly__)
4591 +/*
4592 + * Check if the specified DSP is okay for the purpose specified
4593 + * in type. Here type can only specify one operation each time
4594 + * this helper is called.
4595 + *
4596 + * Return 0 if OK, otherwise 1.
4597 + */
4598 +static int
4599 +oss_probe_open(const char *dsppath, cubeb_device_type type,
4600 +               int *fdp, oss_audioinfo *resai)
4601 +{
4602 +  oss_audioinfo ai;
4603 +  int error;
4604 +  int oflags = (type == CUBEB_DEVICE_TYPE_INPUT) ? O_RDONLY : O_WRONLY;
4605 +  int dspfd = open(dsppath, oflags);
4606 +  if (dspfd == -1)
4607 +    return 1;
4608 +
4609 +  ai.dev = -1;
4610 +  error = ioctl(dspfd, SNDCTL_AUDIOINFO, &ai);
4611 +  if (error < 0) {
4612 +    close(dspfd);
4613 +    return 1;
4614 +  }
4615 +
4616 +  if (resai)
4617 +    *resai = ai;
4618 +  if (fdp)
4619 +    *fdp = dspfd;
4620 +  else
4621 +    close(dspfd);
4622 +  return 0;
4623 +}
4624 +
4625 +struct sndstat_info {
4626 +  oss_devnode_t devname;
4627 +  const char *desc;
4628 +  cubeb_device_type type;
4629 +  int preferred;
4630 +};
4631 +
4632 +static int
4633 +oss_sndstat_line_parse(char *line, int is_ud, struct sndstat_info *sinfo)
4634 +{
4635 +    char *matchptr = line, *n = NULL;
4636 +    struct sndstat_info res;
4637 +
4638 +    memset(&res, 0, sizeof(res));
4639 +
4640 +    n = strchr(matchptr, ':');
4641 +    if (n == NULL)
4642 +      goto fail;
4643 +    if (is_ud == 0) {
4644 +      unsigned int devunit;
4645 +
4646 +      if (sscanf(matchptr, "pcm%u: ", &devunit) < 1)
4647 +        goto fail;
4648 +
4649 +      if (snprintf(res.devname, sizeof(res.devname), "/dev/dsp%u", devunit) < 1)
4650 +        goto fail;
4651 +    } else {
4652 +      if (n - matchptr >= (ssize_t)(sizeof(res.devname) - strlen("/dev/")))
4653 +        goto fail;
4654 +
4655 +      strlcpy(res.devname, "/dev/", sizeof(res.devname));
4656 +      strncat(res.devname, matchptr, n - matchptr);
4657 +    }
4658 +    matchptr = n + 1;
4659 +
4660 +    n = strchr(matchptr, '<');
4661 +    if (n == NULL)
4662 +      goto fail;
4663 +    matchptr = n + 1;
4664 +    n = strrchr(matchptr, '>');
4665 +    if (n == NULL)
4666 +      goto fail;
4667 +    *n = 0;
4668 +    res.desc = matchptr;
4669 +    matchptr = n + 1;
4670 +
4671 +    n = strchr(matchptr, '(');
4672 +    if (n == NULL)
4673 +      goto fail;
4674 +    matchptr = n + 1;
4675 +    n = strrchr(matchptr, ')');
4676 +    if (n == NULL)
4677 +      goto fail;
4678 +    *n = 0;
4679 +    if (!isdigit(matchptr[0])) {
4680 +      if (strstr(matchptr, "play") != NULL)
4681 +        res.type |= CUBEB_DEVICE_TYPE_OUTPUT;
4682 +      if (strstr(matchptr, "rec") != NULL)
4683 +        res.type |= CUBEB_DEVICE_TYPE_INPUT;
4684 +    } else {
4685 +      int p, r;
4686 +      if (sscanf(matchptr, "%dp:%*dv/%dr:%*dv", &p, &r) != 2)
4687 +        goto fail;
4688 +      if (p > 0)
4689 +        res.type |= CUBEB_DEVICE_TYPE_OUTPUT;
4690 +      if (r > 0)
4691 +        res.type |= CUBEB_DEVICE_TYPE_INPUT;
4692 +    }
4693 +    matchptr = n + 1;
4694 +    if (strstr(matchptr, "default") != NULL)
4695 +      res.preferred = 1;
4696 +
4697 +    *sinfo = res;
4698 +    return 0;
4699 +
4700 +fail:
4701 +    return 1;
4702 +}
4703 +
4704 +/*
4705 + * XXX: On FreeBSD we have to rely on SNDCTL_CARDINFO to get all
4706 + * the usable audio devices currently, as SNDCTL_AUDIOINFO will
4707 + * never return directly usable audio device nodes.
4708 + */
4709 +static int
4710 +oss_enumerate_devices(cubeb * context, cubeb_device_type type,
4711 +                      cubeb_device_collection * collection)
4712 +{
4713 +  cubeb_device_info *devinfop = NULL;
4714 +  char *line = NULL;
4715 +  size_t linecap = 0;
4716 +  FILE *sndstatfp = NULL;
4717 +  int collection_cnt = 0;
4718 +  int is_ud = 0;
4719 +  int skipall = 0;
4720 +
4721 +  devinfop = calloc(1, sizeof(cubeb_device_info));
4722 +  if (devinfop == NULL)
4723 +    goto fail;
4724 +
4725 +  sndstatfp = fopen("/dev/sndstat", "r");
4726 +  if (sndstatfp == NULL)
4727 +    goto fail;
4728 +  while (getline(&line, &linecap, sndstatfp) > 0) {
4729 +    const char *devid = NULL;
4730 +    struct sndstat_info sinfo;
4731 +    oss_audioinfo ai;
4732 +
4733 +    if (!strncmp(line, SNDSTAT_FV_BEGIN_STR, strlen(SNDSTAT_FV_BEGIN_STR))) {
4734 +      skipall = 1;
4735 +      continue;
4736 +    }
4737 +    if (!strncmp(line, SNDSTAT_BEGIN_STR, strlen(SNDSTAT_BEGIN_STR))) {
4738 +      is_ud = 0;
4739 +      skipall = 0;
4740 +      continue;
4741 +    }
4742 +    if (!strncmp(line, SNDSTAT_USER_BEGIN_STR, strlen(SNDSTAT_USER_BEGIN_STR))) {
4743 +      is_ud = 1;
4744 +      skipall = 0;
4745 +      continue;
4746 +    }
4747 +    if (skipall || isblank(line[0]))
4748 +      continue;
4749 +
4750 +    if (oss_sndstat_line_parse(line, is_ud, &sinfo))
4751 +      continue;
4752 +
4753 +    devinfop[collection_cnt].type = 0;
4754 +    switch (sinfo.type) {
4755 +    case CUBEB_DEVICE_TYPE_INPUT:
4756 +      if (type & CUBEB_DEVICE_TYPE_OUTPUT)
4757 +        continue;
4758 +      break;
4759 +    case CUBEB_DEVICE_TYPE_OUTPUT:
4760 +      if (type & CUBEB_DEVICE_TYPE_INPUT)
4761 +        continue;
4762 +      break;
4763 +    case 0:
4764 +      continue;
4765 +    }
4766 +
4767 +    if (oss_probe_open(sinfo.devname, type, NULL, &ai))
4768 +      continue;
4769 +
4770 +    devid = oss_cubeb_devid_intern(context, sinfo.devname);
4771 +    if (devid == NULL)
4772 +      continue;
4773 +
4774 +    devinfop[collection_cnt].device_id = strdup(sinfo.devname);
4775 +    asprintf((char **)&devinfop[collection_cnt].friendly_name, "%s: %s",
4776 +             sinfo.devname, sinfo.desc);
4777 +    devinfop[collection_cnt].group_id = strdup(sinfo.devname);
4778 +    devinfop[collection_cnt].vendor_name = NULL;
4779 +    if (devinfop[collection_cnt].device_id == NULL ||
4780 +        devinfop[collection_cnt].friendly_name == NULL ||
4781 +        devinfop[collection_cnt].group_id == NULL) {
4782 +      oss_free_cubeb_device_info_strings(&devinfop[collection_cnt]);
4783 +      continue;
4784 +    }
4785 +
4786 +    devinfop[collection_cnt].type = type;
4787 +    devinfop[collection_cnt].devid = devid;
4788 +    devinfop[collection_cnt].state = CUBEB_DEVICE_STATE_ENABLED;
4789 +    devinfop[collection_cnt].preferred =
4790 +        (sinfo.preferred) ? CUBEB_DEVICE_PREF_ALL : CUBEB_DEVICE_PREF_NONE;
4791 +    devinfop[collection_cnt].format = CUBEB_DEVICE_FMT_S16NE;
4792 +    devinfop[collection_cnt].default_format = CUBEB_DEVICE_FMT_S16NE;
4793 +    devinfop[collection_cnt].max_channels = ai.max_channels;
4794 +    devinfop[collection_cnt].default_rate = OSS_PREFER_RATE;
4795 +    devinfop[collection_cnt].max_rate = ai.max_rate;
4796 +    devinfop[collection_cnt].min_rate = ai.min_rate;
4797 +    devinfop[collection_cnt].latency_lo = 0;
4798 +    devinfop[collection_cnt].latency_hi = 0;
4799 +
4800 +    collection_cnt++;
4801 +
4802 +    void *newp = reallocarray(devinfop, collection_cnt + 1,
4803 +                              sizeof(cubeb_device_info));
4804 +    if (newp == NULL)
4805 +      goto fail;
4806 +    devinfop = newp;
4807 +  }
4808 +
4809 +  free(line);
4810 +  fclose(sndstatfp);
4811 +
4812 +  collection->count = collection_cnt;
4813 +  collection->device = devinfop;
4814 +
4815 +  return CUBEB_OK;
4816 +
4817 +fail:
4818 +  free(line);
4819 +  if (sndstatfp)
4820 +    fclose(sndstatfp);
4821 +  free(devinfop);
4822 +  return CUBEB_ERROR;
4823 +}
4824 +
4825 +#else
4826 +
4827 +static int
4828 +oss_enumerate_devices(cubeb * context, cubeb_device_type type,
4829 +                      cubeb_device_collection * collection)
4830 +{
4831 +  oss_sysinfo si;
4832 +  int error, i;
4833 +  cubeb_device_info *devinfop = NULL;
4834 +  int collection_cnt = 0;
4835 +  int mixer_fd = -1;
4836 +
4837 +  mixer_fd = open(OSS_DEFAULT_MIXER, O_RDWR);
4838 +  if (mixer_fd == -1) {
4839 +    LOG("Failed to open mixer %s. errno: %d", OSS_DEFAULT_MIXER, errno);
4840 +    return CUBEB_ERROR;
4841 +  }
4842 +
4843 +  error = ioctl(mixer_fd, SNDCTL_SYSINFO, &si);
4844 +  if (error) {
4845 +    LOG("Failed to run SNDCTL_SYSINFO on mixer %s. errno: %d", OSS_DEFAULT_MIXER, errno);
4846 +    goto fail;
4847 +  }
4848 +
4849 +  devinfop = calloc(si.numaudios, sizeof(cubeb_device_info));
4850 +  if (devinfop == NULL)
4851 +    goto fail;
4852 +
4853 +  collection->count = 0;
4854 +  for (i = 0; i < si.numaudios; i++) {
4855 +    oss_audioinfo ai;
4856 +    cubeb_device_info cdi = { 0 };
4857 +    const char *devid = NULL;
4858 +
4859 +    ai.dev = i;
4860 +    error = ioctl(mixer_fd, SNDCTL_AUDIOINFO, &ai);
4861 +    if (error)
4862 +      goto fail;
4863 +
4864 +    assert(ai.dev < si.numaudios);
4865 +    if (!ai.enabled)
4866 +      continue;
4867 +
4868 +    cdi.type = 0;
4869 +    switch (ai.caps & DSP_CAP_DUPLEX) {
4870 +    case DSP_CAP_INPUT:
4871 +      if (type & CUBEB_DEVICE_TYPE_OUTPUT)
4872 +        continue;
4873 +      break;
4874 +    case DSP_CAP_OUTPUT:
4875 +      if (type & CUBEB_DEVICE_TYPE_INPUT)
4876 +        continue;
4877 +      break;
4878 +    case 0:
4879 +      continue;
4880 +    }
4881 +    cdi.type = type;
4882 +
4883 +    devid = oss_cubeb_devid_intern(context, ai.devnode);
4884 +    cdi.device_id = strdup(ai.name);
4885 +    cdi.friendly_name = strdup(ai.name);
4886 +    cdi.group_id = strdup(ai.name);
4887 +    if (devid == NULL || cdi.device_id == NULL || cdi.friendly_name == NULL ||
4888 +        cdi.group_id == NULL) {
4889 +      oss_free_cubeb_device_info_strings(&cdi);
4890 +      continue;
4891 +    }
4892 +
4893 +    cdi.devid = devid;
4894 +    cdi.vendor_name = NULL;
4895 +    cdi.state = CUBEB_DEVICE_STATE_ENABLED;
4896 +    cdi.preferred = CUBEB_DEVICE_PREF_NONE;
4897 +    cdi.format = CUBEB_DEVICE_FMT_S16NE;
4898 +    cdi.default_format = CUBEB_DEVICE_FMT_S16NE;
4899 +    cdi.max_channels = ai.max_channels;
4900 +    cdi.default_rate = OSS_PREFER_RATE;
4901 +    cdi.max_rate = ai.max_rate;
4902 +    cdi.min_rate = ai.min_rate;
4903 +    cdi.latency_lo = 0;
4904 +    cdi.latency_hi = 0;
4905 +
4906 +    devinfop[collection_cnt++] = cdi;
4907 +  }
4908 +
4909 +  collection->count = collection_cnt;
4910 +  collection->device = devinfop;
4911 +
4912 +  if (mixer_fd != -1)
4913 +    close(mixer_fd);
4914 +  return CUBEB_OK;
4915 +
4916 +fail:
4917 +  if (mixer_fd != -1)
4918 +    close(mixer_fd);
4919 +  free(devinfop);
4920 +  return CUBEB_ERROR;
4921 +}
4922 +
4923 +#endif
4924 +
4925 +static int
4926 +oss_device_collection_destroy(cubeb * context,
4927 +                              cubeb_device_collection * collection)
4928 +{
4929 +  size_t i;
4930 +  for (i = 0; i < collection->count; i++) {
4931 +    oss_free_cubeb_device_info_strings(&collection->device[i]);
4932 +  }
4933 +  free(collection->device);
4934 +  collection->device = NULL;
4935 +  collection->count = 0;
4936 +  return 0;
4937 +}
4938 +
4939 +static unsigned int
4940 +oss_chn_from_cubeb(cubeb_channel chn)
4941 +{
4942 +  switch (chn) {
4943 +    case CHANNEL_FRONT_LEFT:
4944 +      return CHID_L;
4945 +    case CHANNEL_FRONT_RIGHT:
4946 +      return CHID_R;
4947 +    case CHANNEL_FRONT_CENTER:
4948 +      return CHID_C;
4949 +    case CHANNEL_LOW_FREQUENCY:
4950 +      return CHID_LFE;
4951 +    case CHANNEL_BACK_LEFT:
4952 +      return CHID_LR;
4953 +    case CHANNEL_BACK_RIGHT:
4954 +      return CHID_RR;
4955 +    case CHANNEL_SIDE_LEFT:
4956 +      return CHID_LS;
4957 +    case CHANNEL_SIDE_RIGHT:
4958 +      return CHID_RS;
4959 +    default:
4960 +      return CHID_UNDEF;
4961 +  }
4962 +}
4963 +
4964 +static unsigned long long
4965 +oss_cubeb_layout_to_chnorder(cubeb_channel_layout layout)
4966 +{
4967 +  unsigned int i, nchns = 0;
4968 +  unsigned long long chnorder = 0;
4969 +
4970 +  for (i = 0; layout; i++, layout >>= 1) {
4971 +    unsigned long long chid = oss_chn_from_cubeb((layout & 1) << i);
4972 +    if (chid == CHID_UNDEF)
4973 +      continue;
4974 +
4975 +    chnorder |= (chid & 0xf) << nchns * 4;
4976 +    nchns++;
4977 +  }
4978 +
4979 +  return chnorder;
4980 +}
4981 +
4982 +static int
4983 +oss_copy_params(int fd, cubeb_stream * stream, cubeb_stream_params * params,
4984 +                struct stream_info * sinfo)
4985 +{
4986 +  unsigned long long chnorder;
4987 +
4988 +  sinfo->channels = params->channels;
4989 +  sinfo->sample_rate = params->rate;
4990 +  switch (params->format) {
4991 +  case CUBEB_SAMPLE_S16LE:
4992 +    sinfo->fmt = AFMT_S16_LE;
4993 +    sinfo->precision = 16;
4994 +    break;
4995 +  case CUBEB_SAMPLE_S16BE:
4996 +    sinfo->fmt = AFMT_S16_BE;
4997 +    sinfo->precision = 16;
4998 +    break;
4999 +  case CUBEB_SAMPLE_FLOAT32NE:
5000 +    sinfo->fmt = AFMT_S32_NE;
5001 +    sinfo->precision = 32;
5002 +    break;
5003 +  default:
5004 +    LOG("Unsupported format");
5005 +    return CUBEB_ERROR_INVALID_FORMAT;
5006 +  }
5007 +  if (ioctl(fd, SNDCTL_DSP_CHANNELS, &sinfo->channels) == -1) {
5008 +    return CUBEB_ERROR;
5009 +  }
5010 +  if (ioctl(fd, SNDCTL_DSP_SETFMT, &sinfo->fmt) == -1) {
5011 +    return CUBEB_ERROR;
5012 +  }
5013 +  if (ioctl(fd, SNDCTL_DSP_SPEED, &sinfo->sample_rate) == -1) {
5014 +    return CUBEB_ERROR;
5015 +  }
5016 +  /* Mono layout is an exception */
5017 +  if (params->layout != CUBEB_LAYOUT_UNDEFINED && params->layout != CUBEB_LAYOUT_MONO) {
5018 +    chnorder = oss_cubeb_layout_to_chnorder(params->layout);
5019 +    if (ioctl(fd, SNDCTL_DSP_SET_CHNORDER, &chnorder) == -1)
5020 +      LOG("Non-fatal error %d occured when setting channel order.", errno);
5021 +  }
5022 +  return CUBEB_OK;
5023 +}
5024 +
5025 +static int
5026 +oss_stream_stop(cubeb_stream * s)
5027 +{
5028 +  pthread_mutex_lock(&s->mtx);
5029 +  if (s->thread_created && s->running) {
5030 +    s->running = false;
5031 +    s->doorbell = false;
5032 +    pthread_cond_wait(&s->stopped_cv, &s->mtx);
5033 +  }
5034 +  if (s->state != CUBEB_STATE_STOPPED) {
5035 +    s->state = CUBEB_STATE_STOPPED;
5036 +    pthread_mutex_unlock(&s->mtx);
5037 +    s->state_cb(s, s->user_ptr, CUBEB_STATE_STOPPED);
5038 +  } else {
5039 +    pthread_mutex_unlock(&s->mtx);
5040 +  }
5041 +  return CUBEB_OK;
5042 +}
5043 +
5044 +static void
5045 +oss_stream_destroy(cubeb_stream * s)
5046 +{
5047 +  pthread_mutex_lock(&s->mtx);
5048 +  if (s->thread_created) {
5049 +    s->destroying = true;
5050 +    s->doorbell = true;
5051 +    pthread_cond_signal(&s->doorbell_cv);
5052 +  }
5053 +  pthread_mutex_unlock(&s->mtx);
5054 +  pthread_join(s->thread, NULL);
5055 +
5056 +  pthread_cond_destroy(&s->doorbell_cv);
5057 +  pthread_cond_destroy(&s->stopped_cv);
5058 +  pthread_mutex_destroy(&s->mtx);
5059 +  if (s->play.fd != -1) {
5060 +    close(s->play.fd);
5061 +  }
5062 +  if (s->record.fd != -1) {
5063 +    close(s->record.fd);
5064 +  }
5065 +  free(s->play.buf);
5066 +  free(s->record.buf);
5067 +  free(s);
5068 +}
5069 +
5070 +static void
5071 +oss_float_to_linear32(void * buf, unsigned sample_count, float vol)
5072 +{
5073 +  float * in = buf;
5074 +  int32_t * out = buf;
5075 +  int32_t * tail = out + sample_count;
5076 +
5077 +  while (out < tail) {
5078 +    int64_t f = *(in++) * vol * 0x80000000LL;
5079 +    if (f < -INT32_MAX)
5080 +      f = -INT32_MAX;
5081 +    else if (f > INT32_MAX)
5082 +      f = INT32_MAX;
5083 +    *(out++) = f;
5084 +  }
5085 +}
5086 +
5087 +static void
5088 +oss_linear32_to_float(void * buf, unsigned sample_count)
5089 +{
5090 +  int32_t * in = buf;
5091 +  float * out = buf;
5092 +  float * tail = out + sample_count;
5093 +
5094 +  while (out < tail) {
5095 +    *(out++) = (1.0 / 0x80000000LL) * *(in++);
5096 +  }
5097 +}
5098 +
5099 +static void
5100 +oss_linear16_set_vol(int16_t * buf, unsigned sample_count, float vol)
5101 +{
5102 +  unsigned i;
5103 +  int32_t multiplier = vol * 0x8000;
5104 +
5105 +  for (i = 0; i < sample_count; ++i) {
5106 +    buf[i] = (buf[i] * multiplier) >> 15;
5107 +  }
5108 +}
5109 +
5110 +/* 1 - Stopped by cubeb_stream_stop, otherwise 0 */
5111 +static int
5112 +oss_audio_loop(cubeb_stream * s, cubeb_state *new_state)
5113 +{
5114 +  cubeb_state state = CUBEB_STATE_STOPPED;
5115 +  int trig = 0;
5116 +  int drain = 0;
5117 +  struct pollfd pfds[2];
5118 +  unsigned int ppending, rpending;
5119 +
5120 +  pfds[0].fd = s->play.fd;
5121 +  pfds[0].events = POLLOUT;
5122 +  pfds[1].fd = s->record.fd;
5123 +  pfds[1].events = POLLIN;
5124 +
5125 +  ppending = 0;
5126 +  rpending = s->bufframes;
5127 +
5128 +  if (s->record.fd != -1) {
5129 +    if (ioctl(s->record.fd, SNDCTL_DSP_SETTRIGGER, &trig)) {
5130 +      LOG("Error %d occured when setting trigger on record fd", errno);
5131 +      state = CUBEB_STATE_ERROR;
5132 +      goto breakdown;
5133 +    }
5134 +    trig |= PCM_ENABLE_INPUT;
5135 +    if (ioctl(s->record.fd, SNDCTL_DSP_SETTRIGGER, &trig)) {
5136 +      LOG("Error %d occured when setting trigger on record fd", errno);
5137 +      state = CUBEB_STATE_ERROR;
5138 +      goto breakdown;
5139 +    }
5140 +    memset(s->record.buf, 0, s->bufframes * s->record.frame_size);
5141 +  }
5142 +
5143 +  while (1) {
5144 +    long nfr = 0;
5145 +
5146 +    pthread_mutex_lock(&s->mtx);
5147 +    if (!s->running || s->destroying) {
5148 +      pthread_mutex_unlock(&s->mtx);
5149 +      break;
5150 +    }
5151 +    pthread_mutex_unlock(&s->mtx);
5152 +    if (s->play.fd == -1 && s->record.fd == -1) {
5153 +      /*
5154 +       * Stop here if the stream is not play & record stream,
5155 +       * play-only stream or record-only stream
5156 +       */
5157 +
5158 +      goto breakdown;
5159 +    }
5160 +
5161 +    while ((s->bufframes - ppending) >= s->nfr && rpending >= s->nfr) {
5162 +      long n = ((s->bufframes - ppending) < rpending) ? s->bufframes - ppending : rpending;
5163 +      char *rptr = NULL, *pptr = NULL;
5164 +      if (s->record.fd != -1)
5165 +        rptr = (char *)s->record.buf;
5166 +      if (s->play.fd != -1)
5167 +        pptr = (char *)s->play.buf + ppending * s->play.frame_size;
5168 +      if (s->record.fd != -1 && s->record.floating) {
5169 +        oss_linear32_to_float(s->record.buf, s->record.info.channels * n);
5170 +      }
5171 +      nfr = s->data_cb(s, s->user_ptr, rptr, pptr, n);
5172 +      if (nfr == CUBEB_ERROR) {
5173 +        state = CUBEB_STATE_ERROR;
5174 +        goto breakdown;
5175 +      }
5176 +      if (pptr) {
5177 +        float vol;
5178 +
5179 +        pthread_mutex_lock(&s->mtx);
5180 +        vol = s->volume;
5181 +        pthread_mutex_unlock(&s->mtx);
5182 +
5183 +        if (s->play.floating) {
5184 +          oss_float_to_linear32(pptr, s->play.info.channels * nfr, vol);
5185 +        } else {
5186 +          oss_linear16_set_vol((int16_t *)pptr, s->play.info.channels * nfr, vol);
5187 +        }
5188 +      }
5189 +      if (pptr) {
5190 +        ppending += nfr;
5191 +        assert(ppending <= s->bufframes);
5192 +      }
5193 +      if (rptr) {
5194 +        assert(rpending >= nfr);
5195 +        rpending -= nfr;
5196 +        memmove(rptr, rptr + nfr * s->record.frame_size,
5197 +                (s->bufframes - nfr) * s->record.frame_size);
5198 +      }
5199 +      if (nfr < n) {
5200 +        if (s->play.fd != -1) {
5201 +          drain = 1;
5202 +          break;
5203 +        } else {
5204 +          /*
5205 +           * This is a record-only stream and number of frames
5206 +           * returned from data_cb() is smaller than number
5207 +           * of frames required to read. Stop here.
5208 +           */
5209 +
5210 +          state = CUBEB_STATE_STOPPED;
5211 +          goto breakdown;
5212 +        }
5213 +      }
5214 +    }
5215 +
5216 +    ssize_t n, frames;
5217 +    int nfds;
5218 +
5219 +    pfds[0].revents = 0;
5220 +    pfds[1].revents = 0;
5221 +
5222 +    nfds = poll(pfds, 2, 1000);
5223 +    if (nfds == -1) {
5224 +      if (errno == EINTR)
5225 +        continue;
5226 +      LOG("Error %d occured when polling playback and record fd", errno);
5227 +      state = CUBEB_STATE_ERROR;
5228 +      goto breakdown;
5229 +    } else if (nfds == 0)
5230 +      continue;
5231 +
5232 +    if ((pfds[0].revents & (POLLERR | POLLHUP)) ||
5233 +        (pfds[1].revents & (POLLERR | POLLHUP))) {
5234 +      LOG("Error occured on playback, record fds");
5235 +      state = CUBEB_STATE_ERROR;
5236 +      goto breakdown;
5237 +    }
5238 +
5239 +    if (pfds[0].revents) {
5240 +      while (ppending > 0) {
5241 +        size_t bytes = ppending * s->play.frame_size;
5242 +        if ((n = write(s->play.fd, (uint8_t *)s->play.buf, bytes)) < 0) {
5243 +          if (errno == EINTR)
5244 +            continue;
5245 +          if (errno == EAGAIN) {
5246 +            if (drain)
5247 +              continue;
5248 +            break;
5249 +          }
5250 +          state = CUBEB_STATE_ERROR;
5251 +          goto breakdown;
5252 +        }
5253 +        frames = n / s->play.frame_size;
5254 +        pthread_mutex_lock(&s->mtx);
5255 +        s->frames_written += frames;
5256 +        pthread_mutex_unlock(&s->mtx);
5257 +        ppending -= frames;
5258 +        memmove(s->play.buf, (uint8_t *)s->play.buf + n,
5259 +                (s->bufframes - frames) * s->play.frame_size);
5260 +      }
5261 +    }
5262 +    if (pfds[1].revents) {
5263 +      while (s->bufframes - rpending > 0) {
5264 +        size_t bytes = (s->bufframes - rpending) * s->record.frame_size;
5265 +        size_t read_ofs = rpending * s->record.frame_size;
5266 +        if ((n = read(s->record.fd, (uint8_t *)s->record.buf + read_ofs, bytes)) < 0) {
5267 +          if (errno == EINTR)
5268 +            continue;
5269 +          if (errno == EAGAIN)
5270 +            break;
5271 +          state = CUBEB_STATE_ERROR;
5272 +          goto breakdown;
5273 +        }
5274 +        frames = n / s->record.frame_size;
5275 +        rpending += frames;
5276 +      }
5277 +    }
5278 +    if (drain) {
5279 +      state = CUBEB_STATE_DRAINED;
5280 +      goto breakdown;
5281 +    }
5282 +  }
5283 +
5284 +  return 1;
5285 +
5286 +breakdown:
5287 +  pthread_mutex_lock(&s->mtx);
5288 +  *new_state = s->state = state;
5289 +  s->running = false;
5290 +  pthread_mutex_unlock(&s->mtx);
5291 +  return 0;
5292 +}
5293 +
5294 +static void *
5295 +oss_io_routine(void *arg)
5296 +{
5297 +  cubeb_stream *s = arg;
5298 +  cubeb_state new_state;
5299 +  int stopped;
5300 +
5301 +  do {
5302 +    pthread_mutex_lock(&s->mtx);
5303 +    if (s->destroying) {
5304 +      pthread_mutex_unlock(&s->mtx);
5305 +      break;
5306 +    }
5307 +    pthread_mutex_unlock(&s->mtx);
5308 +
5309 +    stopped = oss_audio_loop(s, &new_state);
5310 +    if (s->record.fd != -1)
5311 +      ioctl(s->record.fd, SNDCTL_DSP_HALT_INPUT, NULL);
5312 +    if (!stopped)
5313 +      s->state_cb(s, s->user_ptr, new_state);
5314 +
5315 +    pthread_mutex_lock(&s->mtx);
5316 +    pthread_cond_signal(&s->stopped_cv);
5317 +    if (s->destroying) {
5318 +      pthread_mutex_unlock(&s->mtx);
5319 +      break;
5320 +    }
5321 +    while (!s->doorbell) {
5322 +      pthread_cond_wait(&s->doorbell_cv, &s->mtx);
5323 +    }
5324 +    s->doorbell = false;
5325 +    pthread_mutex_unlock(&s->mtx);
5326 +  } while (1);
5327 +
5328 +  pthread_mutex_lock(&s->mtx);
5329 +  s->thread_created = false;
5330 +  pthread_mutex_unlock(&s->mtx);
5331 +  return NULL;
5332 +}
5333 +
5334 +static inline int
5335 +oss_calc_frag_shift(unsigned int frames, unsigned int frame_size)
5336 +{
5337 +  int n = 4;
5338 +  int blksize = (frames * frame_size + OSS_NFRAGS - 1) / OSS_NFRAGS;
5339 +  while ((1 << n) < blksize)
5340 +    n++;
5341 +  return n;
5342 +}
5343 +
5344 +static inline int
5345 +oss_get_frag_params(unsigned int shift)
5346 +{
5347 +  return (OSS_NFRAGS << 16) | shift;
5348 +}
5349 +
5350 +static int
5351 +oss_stream_init(cubeb * context,
5352 +                cubeb_stream ** stream,
5353 +                char const * stream_name,
5354 +                cubeb_devid input_device,
5355 +                cubeb_stream_params * input_stream_params,
5356 +                cubeb_devid output_device,
5357 +                cubeb_stream_params * output_stream_params,
5358 +                unsigned int latency_frames,
5359 +                cubeb_data_callback data_callback,
5360 +                cubeb_state_callback state_callback,
5361 +                void * user_ptr)
5362 +{
5363 +  int ret = CUBEB_OK;
5364 +  unsigned int playnfr = 0, recnfr = 0;
5365 +  cubeb_stream *s = NULL;
5366 +  const char *defdsp;
5367 +
5368 +  if (!(defdsp = getenv(ENV_AUDIO_DEVICE)) || *defdsp == '\0')
5369 +    defdsp = OSS_DEFAULT_DEVICE;
5370 +
5371 +  (void)stream_name;
5372 +  if ((s = calloc(1, sizeof(cubeb_stream))) == NULL) {
5373 +    ret = CUBEB_ERROR;
5374 +    goto error;
5375 +  }
5376 +  s->state = CUBEB_STATE_STOPPED;
5377 +  s->record.fd = s->play.fd = -1;
5378 +  s->nfr = latency_frames;
5379 +  if (input_device != NULL) {
5380 +    strlcpy(s->record.name, input_device, sizeof(s->record.name));
5381 +  } else {
5382 +    strlcpy(s->record.name, defdsp, sizeof(s->record.name));
5383 +  }
5384 +  if (output_device != NULL) {
5385 +    strlcpy(s->play.name, output_device, sizeof(s->play.name));
5386 +  } else {
5387 +    strlcpy(s->play.name, defdsp, sizeof(s->play.name));
5388 +  }
5389 +  if (input_stream_params != NULL) {
5390 +    unsigned int nb_channels;
5391 +    if (input_stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK) {
5392 +      LOG("Loopback not supported");
5393 +      ret = CUBEB_ERROR_NOT_SUPPORTED;
5394 +      goto error;
5395 +    }
5396 +    nb_channels = cubeb_channel_layout_nb_channels(input_stream_params->layout);
5397 +    if (input_stream_params->layout != CUBEB_LAYOUT_UNDEFINED &&
5398 +        nb_channels != input_stream_params->channels) {
5399 +      LOG("input_stream_params->layout does not match input_stream_params->channels");
5400 +      ret = CUBEB_ERROR_INVALID_PARAMETER;
5401 +      goto error;
5402 +    }
5403 +    if (s->record.fd == -1) {
5404 +      if ((s->record.fd = open(s->record.name, O_RDONLY | O_NONBLOCK)) == -1) {
5405 +        LOG("Audio device \"%s\" could not be opened as read-only",
5406 +            s->record.name);
5407 +        ret = CUBEB_ERROR_DEVICE_UNAVAILABLE;
5408 +        goto error;
5409 +      }
5410 +    }
5411 +    if ((ret = oss_copy_params(s->record.fd, s, input_stream_params,
5412 +                               &s->record.info)) != CUBEB_OK) {
5413 +      LOG("Setting record params failed");
5414 +      goto error;
5415 +    }
5416 +    s->record.floating = (input_stream_params->format == CUBEB_SAMPLE_FLOAT32NE);
5417 +    s->record.frame_size = s->record.info.channels * (s->record.info.precision / 8);
5418 +    recnfr = (1 << oss_calc_frag_shift(s->nfr, s->record.frame_size)) / s->record.frame_size;
5419 +  }
5420 +  if (output_stream_params != NULL) {
5421 +    unsigned int nb_channels;
5422 +    if (output_stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK) {
5423 +      LOG("Loopback not supported");
5424 +      ret = CUBEB_ERROR_NOT_SUPPORTED;
5425 +      goto error;
5426 +    }
5427 +    nb_channels = cubeb_channel_layout_nb_channels(output_stream_params->layout);
5428 +    if (output_stream_params->layout != CUBEB_LAYOUT_UNDEFINED &&
5429 +        nb_channels != output_stream_params->channels) {
5430 +      LOG("output_stream_params->layout does not match output_stream_params->channels");
5431 +      ret = CUBEB_ERROR_INVALID_PARAMETER;
5432 +      goto error;
5433 +    }
5434 +    if (s->play.fd == -1) {
5435 +      if ((s->play.fd = open(s->play.name, O_WRONLY | O_NONBLOCK)) == -1) {
5436 +        LOG("Audio device \"%s\" could not be opened as write-only",
5437 +            s->play.name);
5438 +        ret = CUBEB_ERROR_DEVICE_UNAVAILABLE;
5439 +        goto error;
5440 +      }
5441 +    }
5442 +    if ((ret = oss_copy_params(s->play.fd, s, output_stream_params,
5443 +                               &s->play.info)) != CUBEB_OK) {
5444 +      LOG("Setting play params failed");
5445 +      goto error;
5446 +    }
5447 +    s->play.floating = (output_stream_params->format == CUBEB_SAMPLE_FLOAT32NE);
5448 +    s->play.frame_size = s->play.info.channels * (s->play.info.precision / 8);
5449 +    playnfr = (1 << oss_calc_frag_shift(s->nfr, s->play.frame_size)) / s->play.frame_size;
5450 +  }
5451 +  /* Use the largest nframes among playing and recording streams */
5452 +  s->nfr = (playnfr > recnfr) ? playnfr : recnfr;
5453 +  s->nfrags = OSS_NFRAGS;
5454 +  s->bufframes = s->nfr * s->nfrags;
5455 +  if (s->play.fd != -1) {
5456 +    int frag = oss_get_frag_params(oss_calc_frag_shift(s->nfr, s->play.frame_size));
5457 +    if (ioctl(s->record.fd, SNDCTL_DSP_SETFRAGMENT, &frag))
5458 +      LOG("Failed to set record fd with SNDCTL_DSP_SETFRAGMENT. frag: 0x%x",
5459 +          frag);
5460 +  }
5461 +  if (s->record.fd != -1) {
5462 +    int frag = oss_get_frag_params(oss_calc_frag_shift(s->nfr, s->record.frame_size));
5463 +    if (ioctl(s->record.fd, SNDCTL_DSP_SETFRAGMENT, &frag))
5464 +      LOG("Failed to set record fd with SNDCTL_DSP_SETFRAGMENT. frag: 0x%x",
5465 +          frag);
5466 +  }
5467 +  s->context = context;
5468 +  s->volume = 1.0;
5469 +  s->state_cb = state_callback;
5470 +  s->data_cb = data_callback;
5471 +  s->user_ptr = user_ptr;
5472 +
5473 +  if (pthread_mutex_init(&s->mtx, NULL) != 0) {
5474 +    LOG("Failed to create mutex");
5475 +    goto error;
5476 +  }
5477 +  if (pthread_cond_init(&s->doorbell_cv, NULL) != 0) {
5478 +    LOG("Failed to create cv");
5479 +    goto error;
5480 +  }
5481 +  if (pthread_cond_init(&s->stopped_cv, NULL) != 0) {
5482 +    LOG("Failed to create cv");
5483 +    goto error;
5484 +  }
5485 +  s->doorbell = false;
5486 +
5487 +  if (s->play.fd != -1) {
5488 +    if ((s->play.buf = calloc(s->bufframes, s->play.frame_size)) == NULL) {
5489 +      ret = CUBEB_ERROR;
5490 +      goto error;
5491 +    }
5492 +  }
5493 +  if (s->record.fd != -1) {
5494 +    if ((s->record.buf = calloc(s->bufframes, s->record.frame_size)) == NULL) {
5495 +      ret = CUBEB_ERROR;
5496 +      goto error;
5497 +    }
5498 +  }
5499 +
5500 +  *stream = s;
5501 +  return CUBEB_OK;
5502 +error:
5503 +  if (s != NULL) {
5504 +    oss_stream_destroy(s);
5505 +  }
5506 +  return ret;
5507 +}
5508 +
5509 +static int
5510 +oss_stream_thr_create(cubeb_stream * s)
5511 +{
5512 +  if (s->thread_created) {
5513 +    s->doorbell = true;
5514 +    pthread_cond_signal(&s->doorbell_cv);
5515 +    return CUBEB_OK;
5516 +  }
5517 +
5518 +  if (pthread_create(&s->thread, NULL, oss_io_routine, s) != 0) {
5519 +    LOG("Couldn't create thread");
5520 +    return CUBEB_ERROR;
5521 +  }
5522 +
5523 +  return CUBEB_OK;
5524 +}
5525 +
5526 +static int
5527 +oss_stream_start(cubeb_stream * s)
5528 +{
5529 +  s->state_cb(s, s->user_ptr, CUBEB_STATE_STARTED);
5530 +  pthread_mutex_lock(&s->mtx);
5531 +  /* Disallow starting an already started stream */
5532 +  assert(!s->running && s->state != CUBEB_STATE_STARTED);
5533 +  if (oss_stream_thr_create(s) != CUBEB_OK) {
5534 +    pthread_mutex_unlock(&s->mtx);
5535 +    s->state_cb(s, s->user_ptr, CUBEB_STATE_ERROR);
5536 +    return CUBEB_ERROR;
5537 +  }
5538 +  s->state = CUBEB_STATE_STARTED;
5539 +  s->thread_created = true;
5540 +  s->running = true;
5541 +  pthread_mutex_unlock(&s->mtx);
5542 +  return CUBEB_OK;
5543 +}
5544 +
5545 +static int
5546 +oss_stream_get_position(cubeb_stream * s, uint64_t * position)
5547 +{
5548 +  pthread_mutex_lock(&s->mtx);
5549 +  *position = s->frames_written;
5550 +  pthread_mutex_unlock(&s->mtx);
5551 +  return CUBEB_OK;
5552 +}
5553 +
5554 +static int
5555 +oss_stream_get_latency(cubeb_stream * s, uint32_t * latency)
5556 +{
5557 +  int delay;
5558 +
5559 +  if (ioctl(s->play.fd, SNDCTL_DSP_GETODELAY, &delay) == -1) {
5560 +    return CUBEB_ERROR;
5561 +  }
5562 +
5563 +  /* Return number of frames there */
5564 +  *latency = delay / s->play.frame_size;
5565 +  return CUBEB_OK;
5566 +}
5567 +
5568 +static int
5569 +oss_stream_set_volume(cubeb_stream * stream, float volume)
5570 +{
5571 +  if (volume < 0.0)
5572 +    volume = 0.0;
5573 +  else if (volume > 1.0)
5574 +    volume = 1.0;
5575 +  pthread_mutex_lock(&stream->mtx);
5576 +  stream->volume = volume;
5577 +  pthread_mutex_unlock(&stream->mtx);
5578 +  return CUBEB_OK;
5579 +}
5580 +
5581 +static int
5582 +oss_get_current_device(cubeb_stream * stream, cubeb_device ** const device)
5583 +{
5584 +  *device = calloc(1, sizeof(cubeb_device));
5585 +  if (*device == NULL) {
5586 +    return CUBEB_ERROR;
5587 +  }
5588 +  (*device)->input_name = stream->record.fd != -1 ?
5589 +    strdup(stream->record.name) : NULL;
5590 +  (*device)->output_name = stream->play.fd != -1 ?
5591 +    strdup(stream->play.name) : NULL;
5592 +  return CUBEB_OK;
5593 +}
5594 +
5595 +static int
5596 +oss_stream_device_destroy(cubeb_stream * stream, cubeb_device * device)
5597 +{
5598 +  (void)stream;
5599 +  free(device->input_name);
5600 +  free(device->output_name);
5601 +  free(device);
5602 +  return CUBEB_OK;
5603 +}
5604 +
5605 +static struct cubeb_ops const oss_ops = {
5606 +    .init = oss_init,
5607 +    .get_backend_id = oss_get_backend_id,
5608 +    .get_max_channel_count = oss_get_max_channel_count,
5609 +    .get_min_latency = oss_get_min_latency,
5610 +    .get_preferred_sample_rate = oss_get_preferred_sample_rate,
5611 +    .enumerate_devices = oss_enumerate_devices,
5612 +    .device_collection_destroy = oss_device_collection_destroy,
5613 +    .destroy = oss_destroy,
5614 +    .stream_init = oss_stream_init,
5615 +    .stream_destroy = oss_stream_destroy,
5616 +    .stream_start = oss_stream_start,
5617 +    .stream_stop = oss_stream_stop,
5618 +    .stream_reset_default_device = NULL,
5619 +    .stream_get_position = oss_stream_get_position,
5620 +    .stream_get_latency = oss_stream_get_latency,
5621 +    .stream_get_input_latency = NULL,
5622 +    .stream_set_volume = oss_stream_set_volume,
5623 +    .stream_get_current_device = oss_get_current_device,
5624 +    .stream_device_destroy = oss_stream_device_destroy,
5625 +    .stream_register_device_changed_callback = NULL,
5626 +    .register_device_collection_changed = NULL};
5627
5628
5629 [FILE:886:patches/patch-env-api-keys]
5630 # Accept API keys from environment like before bug 1294585
5631
5632 --- build/moz.configure/keyfiles.configure
5633 +++ build/moz.configure/keyfiles.configure
5634 @@ -18,6 +18,7 @@ def keyfile(desc, help=None, callback=lambda x: x):
5635      @checking('for the %s key' % desc, lambda x: x and x is not no_key)
5636      @imports(_from='__builtin__', _import='open')
5637      @imports(_from='__builtin__', _import='IOError')
5638 +    @imports(_from='os', _import='environ')
5639      def keyfile(value):
5640          if value:
5641              try:
5642 @@ -28,7 +29,7 @@ def keyfile(desc, help=None, callback=lambda x: x):
5643                      raise FatalCheckError("'%s' is empty." % value[0])
5644              except IOError as e:
5645                  raise FatalCheckError("'%s': %s." % (value[0], e.strerror))
5646 -        return no_key
5647 +        return environ.get('MOZ_%s_KEY' % desc.upper().replace(' ', '_')) or no_key
5648  
5649      return keyfile
5650  
5651
5652
5653 [FILE:2142:patches/patch-freebsd11.3]
5654 Drop after FreeBSD 11.3 EOL around 2020-09-20.
5655 https://svnweb.freebsd.org/changeset/base/351766
5656
5657 mozglue/baseprofiler/core/shared-libraries-linux.cc:374:34: error: use of undeclared
5658       identifier 'NT_GNU_BUILD_ID'
5659       if (note_header->n_type == NT_GNU_BUILD_ID) break;
5660                                  ^
5661 In file included from Unified_cpp_mozglue_baseprofiler0.cpp:137:
5662 mozglue/baseprofiler/lul/LulElf.cpp:762:32: error: use of undeclared identifier
5663       'NT_GNU_BUILD_ID'
5664     if (note_header->n_type == NT_GNU_BUILD_ID) break;
5665                                ^
5666 In file included from Unified_cpp_tools_profiler1.cpp:38:
5667 tools/profiler/lul/LulElf.cpp:776:32: error: use of undeclared identifier
5668       'NT_GNU_BUILD_ID'
5669     if (note_header->n_type == NT_GNU_BUILD_ID) break;
5670                                ^
5671
5672 --- mozglue/baseprofiler/core/shared-libraries-linux.cc.orig    2020-06-25 17:04:48 UTC
5673 +++ mozglue/baseprofiler/core/shared-libraries-linux.cc
5674 @@ -50,6 +50,11 @@ extern "C" MOZ_EXPORT __attribute__((weak)) int dl_ite
5675  #  define ElfW(type) Elf_##type
5676  #endif
5677  
5678 +#if defined(GP_OS_freebsd) && !defined(NT_GNU_BUILD_ID)
5679 +// FreeBSD < 11.4 doesn't define NT_GNU_BUILD_ID
5680 +#  define NT_GNU_BUILD_ID 3
5681 +#endif
5682 +
5683  // ----------------------------------------------------------------------------
5684  // Starting imports from toolkit/crashreporter/google-breakpad/, as needed by
5685  // this file when moved to mozglue.
5686 --- mozglue/baseprofiler/lul/LulElf.cpp.orig    2020-06-25 17:04:48 UTC
5687 +++ mozglue/baseprofiler/lul/LulElf.cpp
5688 @@ -79,6 +79,11 @@
5689  #  define EM_AARCH64 183
5690  #endif
5691  
5692 +#if defined(GP_OS_freebsd) && !defined(NT_GNU_BUILD_ID)
5693 +// FreeBSD < 11.4 doesn't define NT_GNU_BUILD_ID
5694 +#  define NT_GNU_BUILD_ID 3
5695 +#endif
5696 +
5697  // This namespace contains helper functions.
5698  namespace {
5699  
5700 --- tools/profiler/lul/LulElf.cpp.orig  2020-06-25 17:05:05 UTC
5701 +++ tools/profiler/lul/LulElf.cpp
5702 @@ -84,6 +84,11 @@
5703  #  define EM_AARCH64 183
5704  #endif
5705  
5706 +#if defined(GP_OS_freebsd) && !defined(NT_GNU_BUILD_ID)
5707 +// FreeBSD < 11.4 doesn't define NT_GNU_BUILD_ID
5708 +#  define NT_GNU_BUILD_ID 3
5709 +#endif
5710 +
5711  // This namespace contains helper functions.
5712  namespace {
5713  
5714
5715
5716 [FILE:890:patches/patch-gfx_skia_skia_src_core_SkCpu.cpp]
5717 Regressed by https://svnweb.freebsd.org/changeset/base/324815
5718
5719 gfx/skia/skia/src/core/SkCpu.cpp:81:27: error: use of undeclared identifier 'getauxval'
5720         uint32_t hwcaps = getauxval(AT_HWCAP);
5721                           ^
5722
5723 --- gfx/skia/skia/src/core/SkCpu.cpp.orig       2020-07-13 18:06:57 UTC
5724 +++ gfx/skia/skia/src/core/SkCpu.cpp
5725 @@ -72,6 +72,20 @@
5726          return features;
5727      }
5728  
5729 +#elif defined(SK_CPU_ARM64) && defined(__FreeBSD__)
5730 +    #include <machine/armreg.h>
5731 +
5732 +    static uint32_t read_cpu_features() {
5733 +        uint32_t features = 0;
5734 +        uint64_t id_aa64isar0;
5735 +
5736 +        id_aa64isar0 = READ_SPECIALREG(ID_AA64ISAR0_EL1);
5737 +        if (ID_AA64ISAR0_CRC32(id_aa64isar0) == ID_AA64ISAR0_CRC32_BASE) {
5738 +            features |= SkCpu::CRC32;
5739 +        }
5740 +        return features;
5741 +    }
5742 +
5743  #elif defined(SK_CPU_ARM64) && __has_include(<sys/auxv.h>)
5744      #include <sys/auxv.h>
5745  
5746
5747
5748 [FILE:290:files/thunderbird.desktop]
5749 [Desktop Entry]
5750 Encoding=UTF-8
5751 Name=Thunderbird
5752 GenericName=Mail Client
5753 Comment=Mail client and News Reader
5754 Exec=thunderbird %u
5755 Icon=thunderbird.png
5756 StartupNotify=true
5757 Terminal=false
5758 Type=Application
5759 Categories=Network;Email;News;InstantMessaging;
5760 MimeType=application/mbox;message/rfc822;
5761