Skip to content
Snippets Groups Projects
  1. Feb 12, 2018
  2. Feb 09, 2018
  3. Feb 08, 2018
    • Noel Gordon's avatar
      Increase inflate speed: read decoder input into a uint64_t · 8a8edc1c
      Noel Gordon authored
      The chunk-copy code contribution deals with writing decoded DEFLATE data
      to the output with SIMD methods to increase inflate decode speed. Modern
      compilers such as gcc/clang/msvc elide the portable memcpy() calls used,
      replacing them with much faster SIMD machine instructions.
      
      Similarly, reading the input data to the DEFLATE decoder with wide, SIMD
      methods can also increase decode speed. See https://crbug.com/760853#c32
      for details; content-encoding: gzip decoding speed improves by 2.17x, in
      the median over the snappy testdata corpus, when this method is combined
      with the chunk-copy, and the adler32, and crc32 SIMD contributions (this
      method improves our current inflate decode speed by 20-30%).
      
      Update the chunk-copy code with a wide input data reader, which consumes
      input in 64-bit (8 byte) chunks. Update inflate_fast_chunk_() to use the
      wide reader. This feature is supported on little endian machines, and is
      enabled with the INFLATE_CHUNK_READ_64LE build flag in BUILD.gn on Intel
      CPU only for now.
      
      The wide reader idea is due to nigeltao@chromium.org who did the initial
      work. This patch is based on his patch [1]. No change in behavior (other
      than more inflate decode speed), so no new tests.
      
      [1] https://chromium-review.googlesource.com/c/chromium/src/+/601694/16
      
      Bug: 760853
      Change-Id: Ia806d9a225737039367e1b803624cd59e286ce51
      Reviewed-on: https://chromium-review.googlesource.com/900982
      
      
      Commit-Queue: Noel Gordon <noel@chromium.org>
      Reviewed-by: default avatarMike Klein <mtklein@chromium.org>
      Cr-Original-Commit-Position: refs/heads/master@{#535365}
      Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
      Cr-Mirrored-Commit: 6e212423a214e0e41794e8c9969c2896e2c33121
      8a8edc1c
  4. Jan 21, 2018
  5. Jan 04, 2018
    • Noel Gordon's avatar
      Improve zlib inflate speed by using SSE4.2 crc32 · 8e904b33
      Noel Gordon authored
      Using an SSE4.2-based crc32 improves the decoding rate of the PNG
      140 corpus by 4% average, giving a total 40% performance increase
      when combined with adler32 SIMD code and inflate chunk copy code,
      see https://crbug.com/796178#c2 for details.
      
      Raw crc32 speed is 5x - 25x faster than the zlib default "BYFOUR"
      crc32, and gzip- and zlib-wrapped inflate performance improves by
      69% and 50% for the snappy corpus (https://crbug.com/796178#c3 #4
      for details).
      
      Add crc32 SIMD implementation and update the call-site in crc32.c
      to use the new crc32 code, using run-time detection of the SSE4.2
      and PCLMUL support required by the crc32 SIMD code.
      
      Update BUILD.gn to compile the crc32 SIMD code for Intel devices,
      also update names.h with the new symbol defined by the crc32 SIMD
      code path.
      
      Bug: 796178
      Change-Id: I1bb94b47c9a4934eed01ba3d4feda51d67c4bf85
      Reviewed-on: https://chromium-review.googlesource.com/833820
      
      
      Commit-Queue: Noel Gordon <noel@chromium.org>
      Reviewed-by: default avatarChris Blume <cblume@chromium.org>
      Cr-Original-Commit-Position: refs/heads/master@{#526935}
      Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
      Cr-Mirrored-Commit: 65e2abcb74b1c07fa14f46abaa1fb1717892eec3
      8e904b33
  6. Dec 20, 2017
    • Noel Gordon's avatar
      zlib adler_simd.c: unsigned cast |blocks| on assignment · e1769aea
      Noel Gordon authored
      MSVC noted the unsigned |n| = size_t |blocks| could be a possible
      loss in precision. No loss in precision occurs since (n > blocks)
      at this point: |blocks| fits in an unsigned type.
      
      To silence compiler warnings, first update BUILD.gn for the adler
      SIMD code to use chromium compiler:chromium_code rule (more error
      checking), rather than the permissive "compiler:no_chromium_code"
      rule. Then cast |blocks| to unsigned on assigment to |n| (this is
      safe to do as mentioned above).
      
      No change in behavior, no new tests.
      
      Tbr: cblume@chromium.org
      Bug: 762564
      Change-Id: Ia97120bcca206287fd42b97674f8a6215283e4a5
      Reviewed-on: https://chromium-review.googlesource.com/835927
      
      
      Commit-Queue: Noel Gordon <noel@chromium.org>
      Reviewed-by: default avatarSam McNally <sammc@chromium.org>
      Cr-Original-Commit-Position: refs/heads/master@{#525285}
      Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
      Cr-Mirrored-Commit: 0cb9a22e2fb55e092342192d66f7e33c14432d27
      e1769aea
  7. Dec 13, 2017
  8. Dec 12, 2017
  9. Dec 08, 2017
    • Noel Gordon's avatar
      Improve zlib inflate speed by using SSE2 chunk copy · 64ffef0b
      Noel Gordon authored
      Using SSE2 chunk copies improves the decoding rate of the PNG 140
      corpus by an average 17%, giving a total 37% performance increase
      when combined with SIMD adler32 code (https://crbug.com/772870#c3
      for details).
      
      Move the arm-specific code back into the main chunk copy code and
      generalize the SIMD parts of chunkset_core() with inline function
      calls for ARM, and Intel SSE2 devices. This removes the TODO from
      arm/chunkcopy_arm.h, and that file can be deleted as a result.
      
      Add SSE2 vector load / store SSE helpers for chunkset_core(). The
      existing NEON load code had alignment issues, as noted in review.
      Fix that: use unaligned loads in the ARM helper code.
      
      Change chunkcopy.h to use __builtin_memcpy if it's available, use
      zmemcpy otherwise such as on MSVC. Also call x86_check_features()
      in inflateInit2_() to keep the adler32 SIMD code path enabled.
      
      Update BUILD.gn to conditionally compile the SIMD chunk copy code
      on Intel SSE2 and ARM NEON devices. Update names.h to add the new
      symbol defined by the inflate chunk copy code path.
      
      Code had various comment styles; pick one and use it consistently
      everywhere. Add inffast_chunk.h TODO(cblume).
      
      Bug: 772870
      Change-Id: I47004c68ee675acf418825fb0e1f8fa8018d4342
      Reviewed-on: https://chromium-review.googlesource.com/708834
      
      
      Commit-Queue: Noel Gordon <noel@chromium.org>
      Reviewed-by: default avatarChris Blume <cblume@chromium.org>
      Cr-Original-Commit-Position: refs/heads/master@{#522764}
      Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
      Cr-Mirrored-Commit: c293a3255eb27dee8879f85f2c45dedff58e2452
      64ffef0b
  10. Nov 30, 2017
    • Boris Sazonov's avatar
      Revert "Using ARMv8 CRC32 specific instruction" · 0f473a1d
      Boris Sazonov authored
      This reverts commit 35988c821c051a57e30c76f9fcd87b7b677bd9bd.
      
      Reason for revert: broke build ('cpu-features.h' not found)
      https://uberchromegw.corp.google.com/i/internal.client.clank/builders/x64-builder/builds/13697
      
      Original change's description:
      > Using ARMv8 CRC32 specific instruction
      > 
      > CRC32 affects performance for both image decompression (PNG)
      > as also in general browsing while accessing websites that serve
      > content using compression (i.e. Content-Encoding: gzip).
      > 
      > This patch implements an optimized CRC32 function using the
      > dedicated instruction available in ARMv8. This instruction is available
      > in new Android devices featuring an ARMv8 SoC, like Nexus 5x and
      > Google Pixel.
      > 
      > It should be between 6x (A53: 116ms X 22ms for a 4Kx4Kx4 buffer) to
      > 10x faster (A72: 91ms x 9ms) than the C implementation currently used
      > by zlib.
      > 
      > PNG decoding performance gains should be around 5-9%.
      > 
      > Finally it also introduces code to perform the ARM CPU features detection
      > using getauxval()@Linux/CrOS or android_getCpuFeatures(). We pre-built
      > and link the CRC32 instruction dependent code but will decide if to
      > use it at run time.
      > 
      > If the feature is not supported, we fallback to the C implementation.
      > 
      > This approach allows to use the instruction in both 32bits and 64bits
      > builds and works fine either in ARMv7 or ARMv8 processor. I tested the
      > generated Chromium apk in both a ARMv7 (Nexus 4 and 6) and ARMv8 (Nexus 5x and
      > Google Pixel).
      > 
      > Change-Id: I069408ebc06c49a3c2be4ba3253319e025ee09d7
      > Bug: 709716
      > Reviewed-on: https://chromium-review.googlesource.com/612629
      
      
      > Reviewed-by: default avatarChris Blume <cblume@chromium.org>
      > Commit-Queue: Adenilson Cavalcanti <cavalcantii@chromium.org>
      > Cr-Commit-Position: refs/heads/master@{#520377}
      
      TBR=agl@chromium.org,noel@chromium.org,cavalcantii@chromium.org,cblume@chromium.org,mtklein@chromium.org,adenilson.cavalcanti@arm.com
      
      Change-Id: Ief2c32df5c8a37635f937cd6a671f5574f5a53a3
      No-Presubmit: true
      No-Tree-Checks: true
      No-Try: true
      Bug: 709716
      Reviewed-on: https://chromium-review.googlesource.com/799930
      
      
      Reviewed-by: default avatarChris Blume <cblume@chromium.org>
      Reviewed-by: default avatarBoris Sazonov <bsazonov@chromium.org>
      Commit-Queue: Boris Sazonov <bsazonov@chromium.org>
      Cr-Original-Commit-Position: refs/heads/master@{#520497}
      Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
      Cr-Mirrored-Commit: e7d9a4649bde6f047105d29f0026dd8c3d54143a
      0f473a1d
    • Adenilson Cavalcanti's avatar
      Using ARMv8 CRC32 specific instruction · d7601c23
      Adenilson Cavalcanti authored
      CRC32 affects performance for both image decompression (PNG)
      as also in general browsing while accessing websites that serve
      content using compression (i.e. Content-Encoding: gzip).
      
      This patch implements an optimized CRC32 function using the
      dedicated instruction available in ARMv8. This instruction is available
      in new Android devices featuring an ARMv8 SoC, like Nexus 5x and
      Google Pixel.
      
      It should be between 6x (A53: 116ms X 22ms for a 4Kx4Kx4 buffer) to
      10x faster (A72: 91ms x 9ms) than the C implementation currently used
      by zlib.
      
      PNG decoding performance gains should be around 5-9%.
      
      Finally it also introduces code to perform the ARM CPU features detection
      using getauxval()@Linux/CrOS or android_getCpuFeatures(). We pre-built
      and link the CRC32 instruction dependent code but will decide if to
      use it at run time.
      
      If the feature is not supported, we fallback to the C implementation.
      
      This approach allows to use the instruction in both 32bits and 64bits
      builds and works fine either in ARMv7 or ARMv8 processor. I tested the
      generated Chromium apk in both a ARMv7 (Nexus 4 and 6) and ARMv8 (Nexus 5x and
      Google Pixel).
      
      Change-Id: I069408ebc06c49a3c2be4ba3253319e025ee09d7
      Bug: 709716
      Reviewed-on: https://chromium-review.googlesource.com/612629
      
      
      Reviewed-by: default avatarChris Blume <cblume@chromium.org>
      Commit-Queue: Adenilson Cavalcanti <cavalcantii@chromium.org>
      Cr-Original-Commit-Position: refs/heads/master@{#520377}
      Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
      Cr-Mirrored-Commit: 35988c821c051a57e30c76f9fcd87b7b677bd9bd
      d7601c23
  11. Nov 04, 2017
  12. Nov 03, 2017
  13. Nov 02, 2017
  14. Oct 31, 2017
  15. Oct 30, 2017
    • Adenilson Cavalcanti's avatar
      Isolating ARM specific code in inffast · f44229bb
      Adenilson Cavalcanti authored
      The NEON specific code will be hosted in the folder 
      'contrib/optimizations/arm' while the platform independent 
      C code is hosted in the upper directory.
      
      This allows to easily implement the inffast optimization for other
      architectures by simply implementing 2 functions and including the
      necessary header in chunk_copy.h (that is used by inflate and inffast).
      
      The idea is with time to move all optimizations to this new folder.
      
      Bug: 769880
      Change-Id: I404ec0fdf3f6867c9c124da859ca38bf57b25447
      Reviewed-on: https://chromium-review.googlesource.com/740907
      
      
      Reviewed-by: default avatarChris Blume <cblume@chromium.org>
      Commit-Queue: Adenilson Cavalcanti <cavalcantii@chromium.org>
      Cr-Original-Commit-Position: refs/heads/master@{#512542}
      Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
      Cr-Mirrored-Commit: 626df311481f7fac07b58799fbc94e09c848f01d
      f44229bb
  16. Sep 29, 2017
    • Noel Gordon's avatar
      zlib adler_simd.c · 17bbb3d7
      Noel Gordon authored
      Add SSSE3 implementation of the adler32 checksum, suitable for
      both large workloads, and small workloads commonly seen during
      PNG image decoding. Add a NEON implementation.
      
      Speed is comparable to the serial adler32 computation but near
      64 bytes of input data, the SIMD code paths begin to be faster
      than the serial path: 3x faster at 256 bytes of input data, to
      ~8x faster for 1M of input data (~4x on ARMv8 NEON).
      
      For the PNG 140 image corpus, PNG decoding speed is ~8% faster
      on average on the desktop machines tested, and ~2% on an ARMv8
      Pixel C Android (N) tablet, https://crbug.com/762564#c41
      
      Update x86.{c,h} to runtime detect SSSE3 support and use it to
      enable the adler32_simd code path and update inflate.c to call
      x86_check_features(). Update the name mangler file names.h for
      the new symbols added, add FIXME about simd.patch.
      
      Ignore data alignment in the SSSE3 case since unaligned access
      is no longer penalized on current generation Intel CPU. Use it
      in the NEON case however to avoid the extra costs of unaligned
      memory access on ARMv8/v7.
      
      NEON credits: the v_s1/s2 vector component accumulate code was
      provided by Adenilson Cavalcanti. The uint16 column vector sum
      code is from libdeflate with corrections to process NMAX input
      bytes which improves performance by 3% for large buffers.
      
      Update BUILD.gn to put the code in its own source set, and add
      it conditionally to the zlib library build rule. On ARM, build
      the SIMD with max-speed config to produce the smallest code.
      
      No change in behavior, covered by many existing tests.
      
      Bug: 762564
      Change-Id: I14a39940ae113b5a67ba70a99c3741e289b1796b
      Reviewed-on: https://chromium-review.googlesource.com/660019
      
      
      Commit-Queue: Chris Blume <cblume@chromium.org>
      Reviewed-by: default avatarAdenilson Cavalcanti <cavalcantii@chromium.org>
      Reviewed-by: default avatarChris Blume <cblume@chromium.org>
      Cr-Original-Commit-Position: refs/heads/master@{#505447}
      Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
      Cr-Mirrored-Commit: 09b784fd12f255a9da38107ac6e0386f4dde6d68
      17bbb3d7
    • Adenilson Cavalcanti's avatar
      zlib: inflate using wider loads and stores · 3060dcbd
      Adenilson Cavalcanti authored
      In inflate_fast() the output pointer always has plenty of room to write.
      This means that so long as the target is capable, wide un-aligned
      loads and stores can be used to transfer several bytes at once.
      
      When the reference distance is too short simply unroll the data a
      little to increase the distance. Patch by Simon Hosie.
      
      PNG decoding performance gains should be around 30-33%.
      
      This also includes the fix reported in madler/zlib#245.
      
      Bug: 697280
      Change-Id: I90a9866cc56aa766df5de472cd10c007f4b560d8
      Reviewed-on: https://chromium-review.googlesource.com/689961
      
      
      Reviewed-by: default avatarChris Blume <cblume@chromium.org>
      Commit-Queue: Adenilson Cavalcanti <cavalcantii@chromium.org>
      Cr-Original-Commit-Position: refs/heads/master@{#505276}
      Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
      Cr-Mirrored-Commit: 78104f4d73e3bbb4155fa804d00ed66682180556
      3060dcbd
  17. Sep 16, 2017
    • Mike Klein's avatar
      Revert "Reland "zlib: inflate using wider loads and stores"" · 567815a5
      Mike Klein authored
      This reverts commit 0397489124ce7e6aced020f8b85f5034c7d5f49b.
      
      Reason for revert: appears to break Cronet.
      
      Original change's description:
      > Reland "zlib: inflate using wider loads and stores"
      > 
      > This reverts commit e1f30a329eccf19ce1c8772e873abf88970cb65c.
      > 
      > Reason for revert: This patch was originally reverted because
      > we have an ARMv6 build target (part of Cronet) which
      > incorrectly set NEON support in our build files. As a result,
      > the NEON intrinsics were included despite ARMv6 not
      > supporting NEON.
      > 
      > The build problem was addressed here:
      > https://chromium-review.googlesource.com/c/chromium/src/+/639931
      > 
      > Now that ARMv6 builds do not set NEON support, these zlib
      > changes (which are only applied if NEON support is set in the
      > build) will not cause errors on ARMv6 targets.
      > 
      > BUG=697280
      > 
      > Original change's description:
      > > zlib: inflate using wider loads and stores
      > > 
      > > In inflate_fast() the output pointer always has plenty of room to write.  
      > > This means that so long as the target is capable, wide un-aligned 
      > > loads and stores can be used to transfer several bytes at once.
      > > 
      > > When the reference distance is too short simply unroll the data a 
      > > little to increase the distance. Patch by Simon Hosie.
      > > 
      > > PNG decoding performance gains should be around 30-33%.
      > > 
      > > BUG=697280
      > > 
      > > Change-Id: I59854eb25d2b1e43561c8a2afaf9175bf10cf674
      > > Reviewed-on: https://chromium-review.googlesource.com/627098
      
      
      > > Reviewed-by: default avatarAdenilson Cavalcanti <cavalcantii@chromium.org>
      > > Reviewed-by: default avatarMike Klein <mtklein@chromium.org>
      > > Commit-Queue: Adenilson Cavalcanti <cavalcantii@chromium.org>
      > > Cr-Commit-Position: refs/heads/master@{#497866}
      > >
      > 
      > Change-Id: I0b4cd1a393464c960c6a1e48a022a20340781e75
      > Reviewed-on: https://chromium-review.googlesource.com/641575
      
      
      > Commit-Queue: Chris Blume <cblume@chromium.org>
      > Reviewed-by: default avatarAdenilson Cavalcanti <cavalcantii@chromium.org>
      > Reviewed-by: default avatarLeon Scroggins <scroggo@chromium.org>
      > Cr-Commit-Position: refs/heads/master@{#498580}
      
      TBR=scroggo@chromium.org,agl@chromium.org,cavalcantii@chromium.org,cblume@chromium.org,mtklein@chromium.org,adenilson.cavalcanti@arm.com
      
      # Not skipping CQ checks because original CL landed > 1 day ago.
      
      Bug: 697280
      Change-Id: I200e0e3b9cb9c884acfd6868067464a5f6cef804
      Reviewed-on: https://chromium-review.googlesource.com/669259
      
      
      Reviewed-by: default avatarMike Klein <mtklein@chromium.org>
      Reviewed-by: default avatarAdenilson Cavalcanti <cavalcantii@chromium.org>
      Commit-Queue: Mike Klein <mtklein@chromium.org>
      Cr-Original-Commit-Position: refs/heads/master@{#502474}
      Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
      Cr-Mirrored-Commit: 7a620575b0512b33708e723c260fe66b90b5b103
      567815a5
  18. Sep 15, 2017
  19. Sep 07, 2017
  20. Aug 30, 2017
  21. Aug 28, 2017
  22. May 22, 2017
  23. May 19, 2017
  24. Apr 07, 2017
  25. Mar 30, 2017
  26. Feb 15, 2017
    • mark's avatar
      Update zlib to 1.2.11 · 13dc246a
      mark authored
      Reapply and regenerate all local patches to upstream zlib 1.2.11
      
      Explicitly specify 9 as the minimum windowBits value (representing a
      512-byte window) during compression in net/websockets even when 8
      (representing 256) is received. This was previously silently done during
      compression. Because of how zlib's deflate is implemented, when
      windowBits is 9, it will produce a stream that can be decompressed with
      a 250-byte or larger window.
      
      Changes in 1.2.9 (31 Dec 2016)
      - Fix contrib/minizip to permit unzipping with desktop API [Zouzou]
      - Improve contrib/blast to return unused bytes
      - Assure that gzoffset() is correct when appending
      - Improve compress() and uncompress() to support large lengths
      - Fix bug in test/example.c where error code not saved
      - Remedy Coverity warning [Randers-Pehrson]
      - Improve speed of gzprintf() in transparent mode
      - Fix inflateInit2() bug when windowBits is 16 or 32
      - Change DEBUG macro to ZLIB_DEBUG
      - Avoid uninitialized access by gzclose_w()
      - Allow building zlib outside of the source directory
      - Fix bug that accepted invalid zlib header when windowBits is zero
      - Fix gzseek() problem on MinGW due to buggy _lseeki64 there
      - Loop on write() calls in gzwrite.c in case of non-blocking I/O
      - Add --warn (-w) option to ./configure for more compiler warnings
      - Reject a window size of 256 bytes if not using the zlib wrapper
      - Fix bug when level 0 used with Z_HUFFMAN or Z_RLE
      - Add --debug (-d) option to ./configure to define ZLIB_DEBUG
      - Fix bugs in creating a very large gzip header
      - Add uncompress2() function, which returns the input size used
      - Assure that deflateParams() will not switch functions mid-block
      - Dramatically speed up deflation for level 0 (storing)
      - Add gzfread(), duplicating the interface of fread()
      - Add gzfwrite(), duplicating the interface of fwrite()
      - Add deflateGetDictionary() function
      - Use snprintf() for later versions of Microsoft C
      - Fix *Init macros to use z_ prefix when requested
      - Replace as400 with os400 for OS/400 support [Monnerat]
      - Add crc32_z() and adler32_z() functions with size_t lengths
      - Update Visual Studio project files [AraHaan]
      
      Changes in 1.2.10 (2 Jan 2017)
      - Avoid warnings on snprintf() return value
      - Fix bug in deflate_stored() for zero-length input
      - Fix bug in gzwrite.c that produced corrupt gzip files
      - Remove files to be installed before copying them in Makefile.in
      - Add warnings when compiling with assembler code
      
      Changes in 1.2.11 (15 Jan 2017)
      - Fix deflate stored bug when pulling last block from window
      - Permit immediate deflateParams changes before any deflate input
      
      BUG=691074, 691075
      
      Review-Url: https://codereview.chromium.org/2690623003
      Cr-Original-Commit-Position: refs/heads/master@{#450585}
      Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
      Cr-Mirrored-Commit: 6d9a6251dfe87183075dc16cfa134e41dc4cee0d
      13dc246a
  27. Jan 14, 2016
  28. Nov 03, 2015
  29. Sep 02, 2015
  30. Sep 01, 2015
  31. Aug 31, 2015
  32. Jul 10, 2015
  33. Jul 01, 2015
  34. Feb 20, 2015
    • dpranke's avatar
      Update Chomium's build files to work w/ latest GN binaries. · 4ba7cdd0
      dpranke authored
      The latest GN binaries rename cpu_arch to current_cpu and/or target_cpu
      as appropriate, build_cpu_arch to host_cpu, and os to current_os and target_os as appropriate.
      
      R=brettw@chromium.org
      TBR=ddorwin@chromium.org
      EXTRA_TRYBOTS=tryserver.chromium.linux:android_chromium_gn_compile_dbg,android_chromium_gn_compile_rel;tryserver.chromium.win:win8_chromium_gn_rel,win8_chromium_gn_dbg;tryserver.chromium.mac:mac_chromium_gn_rel,mac_chromium_gn_dbg
      BUG=344767
      
      Review URL: https://codereview.chromium.org/913373002
      
      Cr-Original-Commit-Position: refs/heads/master@{#317223}
      Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
      Cr-Mirrored-Commit: 4327621a322c964a8bc6d1ef5a4534f0f877d63e
      4ba7cdd0
Loading