[base] Properly detect NEON support on ARM{,64}

This is essentially a reland of
https://chromium-review.googlesource.com/c/chromium/src/+/4579589 which
was reverted because it was breaking a WPT test for WebAudio due to
float precision issues on macOS 11, see crbug.com/40915857.

Since then, the upstream test has been updated to increase tolerances,
see
https://github.com/web-platform-tests/wpt/commit/e164c49e841a37398fed3cbafe76d5f5a4547f19.

Original change description:
olivierli@chromium.org discovered that CPU_ARM_NEON is not defined where
it should (in particular on ARM64). This commit fixes the detection.

However, fixing this makes ARM64 builds fail. This is because of buggy
hand-written assembly code in WTF::CopyLCharsFramUCharSource() for the
NEON path. The path uses inline assembly to perform the char16_t -> char
conversion in the case where all the characters in the char16_t array
are 8-bit. This is potentially quite hot code in blink, but the code is
broken because it uses inline assembly with incorrect registers.

A clean solution would be to use intrinsics, but a lazier one is to
trust the "sufficiently smart compiler", which indeed auto-vectorizes
the loop at "-O2" (tested with compiler explorer, on reasonably recent
clang versions). Since this assembly code path wasn't used before, we
lose nothing by not using inline assembly.

For reference, the error message generated when leaving the inline
assembly as is:

In file included from ../../third_party/blink/renderer/platform/wtf/text/wtf_string.cc:41:
../../third_party/blink/renderer/platform/wtf/text/copy_lchars_from_uchar_source.h:97:11: error: vector register expected
      asm("vld2.8   { d0-d1 }, [%[SOURCE]] !\n\t"
          ^
<inline asm>:1:13: note: instantiated into assembly here
        vld2.8   { d0-d1 }, [x1] !

Also need to update a webaudio fingerprinting test. The result changes
because... floating point, and enabling NEON expectedly changes the
results.

Note for sheriffs: If there is a build breakage on ARM64 in range, this is likely the culprit.

Change-Id: I2ba48eaa3924148b79f1a80be244949e9e195805
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6343101
Commit-Queue: Benoit Lize <lizeb@chromium.org>
Reviewed-by: Hongchan Choi <hongchan@chromium.org>
Reviewed-by: Sylvain Defresne <sdefresne@chromium.org>
Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1431544}
3 files changed
tree: 839ae60356eea25ef828c19ac2d3b7b0fdbe823e
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. codelabs/
  13. components/
  14. content/
  15. crypto/
  16. dbus/
  17. device/
  18. docs/
  19. extensions/
  20. fuchsia_web/
  21. gin/
  22. google_apis/
  23. gpu/
  24. headless/
  25. infra/
  26. ios/
  27. ipc/
  28. media/
  29. mojo/
  30. native_client_sdk/
  31. net/
  32. pdf/
  33. ppapi/
  34. printing/
  35. remoting/
  36. rlz/
  37. sandbox/
  38. services/
  39. skia/
  40. sql/
  41. storage/
  42. styleguide/
  43. testing/
  44. third_party/
  45. tools/
  46. ui/
  47. url/
  48. webkit/
  49. .clang-format
  50. .clang-tidy
  51. .clangd
  52. .git-blame-ignore-revs
  53. .gitallowed
  54. .gitattributes
  55. .gitignore
  56. .gitmodules
  57. .gn
  58. .mailmap
  59. .rustfmt.toml
  60. .vpython3
  61. .yapfignore
  62. ATL_OWNERS
  63. AUTHORS
  64. BUILD.gn
  65. CODE_OF_CONDUCT.md
  66. codereview.settings
  67. CPPLINT.cfg
  68. CRYPTO_OWNERS
  69. DEPS
  70. DIR_METADATA
  71. LICENSE
  72. LICENSE.chromium_os
  73. OWNERS
  74. PRESUBMIT.py
  75. PRESUBMIT_test.py
  76. PRESUBMIT_test_mocks.py
  77. README.md
  78. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure.

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.

If you found a bug, please file it at https://crbug.com/new.