1cc1dc7a3Sopenharmony_ci# 3.x series change log 2cc1dc7a3Sopenharmony_ci 3cc1dc7a3Sopenharmony_ciThis page summarizes the major functional and performance changes in each 4cc1dc7a3Sopenharmony_cirelease of the 3.x series. 5cc1dc7a3Sopenharmony_ci 6cc1dc7a3Sopenharmony_ciAll performance data on this page is measured on an Intel Core i5-9600K 7cc1dc7a3Sopenharmony_ciclocked at 4.2 GHz, running `astcenc` using AVX2 and 6 threads. 8cc1dc7a3Sopenharmony_ci 9cc1dc7a3Sopenharmony_ci<!-- ---------------------------------------------------------------------- --> 10cc1dc7a3Sopenharmony_ci## 3.7 11cc1dc7a3Sopenharmony_ci 12cc1dc7a3Sopenharmony_ci**Status:** April 2022 13cc1dc7a3Sopenharmony_ci 14cc1dc7a3Sopenharmony_ciThe 3.7 release contains another round of performance optimizations, including 15cc1dc7a3Sopenharmony_cisignificant improvements to the command line front-end (faster PNG loader) and 16cc1dc7a3Sopenharmony_cithe arm64 build of the codec (faster NEON implementation). 17cc1dc7a3Sopenharmony_ci 18cc1dc7a3Sopenharmony_ci* **General:** 19cc1dc7a3Sopenharmony_ci * **Feature:** The command line tool PNG loader has been switched to use 20cc1dc7a3Sopenharmony_ci the Wuffs library, which is robust and significantly faster than the 21cc1dc7a3Sopenharmony_ci current stb_image implementation. 22cc1dc7a3Sopenharmony_ci * **Feature:** Support for non-invariant builds returns. Opt-in to slightly 23cc1dc7a3Sopenharmony_ci faster, but not bit-exact, builds by setting `-DNO_INVARIANCE=ON` for the 24cc1dc7a3Sopenharmony_ci CMake configuration. This improves performance by around 2%. 25cc1dc7a3Sopenharmony_ci * **Optimization:** Changed SIMD `select()` so that it matches the default 26cc1dc7a3Sopenharmony_ci NEON behavior (bitwise select), rather than the default x86-64 behavior 27cc1dc7a3Sopenharmony_ci (lane select on MSB). Specialization `select_msb()` added for the one case 28cc1dc7a3Sopenharmony_ci we want to select on a sign-bit, where NEON needs a different 29cc1dc7a3Sopenharmony_ci implementation. This provides a significant (>25%) performance uplift on 30cc1dc7a3Sopenharmony_ci NEON implementations. 31cc1dc7a3Sopenharmony_ci 32cc1dc7a3Sopenharmony_ci### Performance: 33cc1dc7a3Sopenharmony_ci 34cc1dc7a3Sopenharmony_ciKey for charts: 35cc1dc7a3Sopenharmony_ci 36cc1dc7a3Sopenharmony_ci* Color = block size (see legend). 37cc1dc7a3Sopenharmony_ci* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). 38cc1dc7a3Sopenharmony_ci 39cc1dc7a3Sopenharmony_ci**Relative performance vs 3.5 release:** 40cc1dc7a3Sopenharmony_ci 41cc1dc7a3Sopenharmony_ci 42cc1dc7a3Sopenharmony_ci 43cc1dc7a3Sopenharmony_ci<!-- ---------------------------------------------------------------------- --> 44cc1dc7a3Sopenharmony_ci## 3.6 45cc1dc7a3Sopenharmony_ci 46cc1dc7a3Sopenharmony_ci**Status:** April 2022 47cc1dc7a3Sopenharmony_ci 48cc1dc7a3Sopenharmony_ciThe 3.6 release contains another round of performance optimizations. 49cc1dc7a3Sopenharmony_ci 50cc1dc7a3Sopenharmony_ciThere are no interface changes in this release, but in general the API is not 51cc1dc7a3Sopenharmony_cidesigned to be binary compatible across versions. We always recommend 52cc1dc7a3Sopenharmony_cirebuilding your client-side code using the updated `astcenc.h` header. 53cc1dc7a3Sopenharmony_ci 54cc1dc7a3Sopenharmony_ci* **General:** 55cc1dc7a3Sopenharmony_ci * **Feature:** Data tables are now optimized for contexts without the 56cc1dc7a3Sopenharmony_ci `SELF_DECOMPRESS_ONLY` flag set. The flag therefore no longer improves 57cc1dc7a3Sopenharmony_ci compression performance, but still reduces context creation time and 58cc1dc7a3Sopenharmony_ci context data table memory footprint. 59cc1dc7a3Sopenharmony_ci * **Feature:** Image quality for 4x4 `-fastest` configuration has been 60cc1dc7a3Sopenharmony_ci improved. 61cc1dc7a3Sopenharmony_ci * **Optimization:** Decimation modes are reliably excluded from processing 62cc1dc7a3Sopenharmony_ci when they are only partially selected in the compressor configuration (e.g. 63cc1dc7a3Sopenharmony_ci if used for single plane, but not dual plane modes). This is a significant 64cc1dc7a3Sopenharmony_ci performance optimization for all quality levels. 65cc1dc7a3Sopenharmony_ci * **Optimization:** Fast-path block load function variant added for 2D LDR 66cc1dc7a3Sopenharmony_ci images with no swizzle. This is a moderate performance optimization for the 67cc1dc7a3Sopenharmony_ci fast and fastest quality levels. 68cc1dc7a3Sopenharmony_ci 69cc1dc7a3Sopenharmony_ci### Performance: 70cc1dc7a3Sopenharmony_ci 71cc1dc7a3Sopenharmony_ciKey for charts: 72cc1dc7a3Sopenharmony_ci 73cc1dc7a3Sopenharmony_ci* Color = block size (see legend). 74cc1dc7a3Sopenharmony_ci* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). 75cc1dc7a3Sopenharmony_ci 76cc1dc7a3Sopenharmony_ci**Relative performance vs 3.5 release:** 77cc1dc7a3Sopenharmony_ci 78cc1dc7a3Sopenharmony_ci 79cc1dc7a3Sopenharmony_ci 80cc1dc7a3Sopenharmony_ci<!-- ---------------------------------------------------------------------- --> 81cc1dc7a3Sopenharmony_ci## 3.5 82cc1dc7a3Sopenharmony_ci 83cc1dc7a3Sopenharmony_ci**Status:** March 2022 84cc1dc7a3Sopenharmony_ci 85cc1dc7a3Sopenharmony_ciThe 3.5 release contains another round of performance optimizations. 86cc1dc7a3Sopenharmony_ci 87cc1dc7a3Sopenharmony_ciThere are no interface changes in this release, but in general the API is not 88cc1dc7a3Sopenharmony_cidesigned to be binary compatible across versions. We always recommend 89cc1dc7a3Sopenharmony_cirebuilding your client-side code using the updated `astcenc.h` header. 90cc1dc7a3Sopenharmony_ci 91cc1dc7a3Sopenharmony_ci* **General:** 92cc1dc7a3Sopenharmony_ci * **Feature:** Compressor configurations using `SELF_DECOMPRESS_ONLY` mode 93cc1dc7a3Sopenharmony_ci store compacted partition tables, which significantly improves both 94cc1dc7a3Sopenharmony_ci context create time and runtime performance. 95cc1dc7a3Sopenharmony_ci * **Feature:** Bilinear infill for decimated weight grids supports a new 96cc1dc7a3Sopenharmony_ci variant for half-decimated grids which are only decimated in one axis. 97cc1dc7a3Sopenharmony_ci 98cc1dc7a3Sopenharmony_ci### Performance: 99cc1dc7a3Sopenharmony_ci 100cc1dc7a3Sopenharmony_ciKey for charts: 101cc1dc7a3Sopenharmony_ci 102cc1dc7a3Sopenharmony_ci* Color = block size (see legend). 103cc1dc7a3Sopenharmony_ci* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). 104cc1dc7a3Sopenharmony_ci 105cc1dc7a3Sopenharmony_ci**Relative performance vs 3.4 release:** 106cc1dc7a3Sopenharmony_ci 107cc1dc7a3Sopenharmony_ci 108cc1dc7a3Sopenharmony_ci 109cc1dc7a3Sopenharmony_ci 110cc1dc7a3Sopenharmony_ci<!-- ---------------------------------------------------------------------- --> 111cc1dc7a3Sopenharmony_ci## 3.4 112cc1dc7a3Sopenharmony_ci 113cc1dc7a3Sopenharmony_ci**Status:** February 2022 114cc1dc7a3Sopenharmony_ci 115cc1dc7a3Sopenharmony_ciThe 3.4 release introduces another round of optimizations, removing a number 116cc1dc7a3Sopenharmony_ciof power-user configuration options to simplify the core compressor data path. 117cc1dc7a3Sopenharmony_ci 118cc1dc7a3Sopenharmony_ciReminder for users of the library interface - the API is not designed to be 119cc1dc7a3Sopenharmony_cibinary compatible across versions, and this release is not compatible with 120cc1dc7a3Sopenharmony_ciearlier releases. Please update and rebuild your client-side code using the 121cc1dc7a3Sopenharmony_ciupdated `astcenc.h` header. 122cc1dc7a3Sopenharmony_ci 123cc1dc7a3Sopenharmony_ci* **General:** 124cc1dc7a3Sopenharmony_ci * **Feature:** Many memory allocations have been moved off the stack into 125cc1dc7a3Sopenharmony_ci dynamically allocated working memory. This significantly reduces the peak 126cc1dc7a3Sopenharmony_ci stack usage, allowing the compressor to run in systems with 128KB stack 127cc1dc7a3Sopenharmony_ci limits. 128cc1dc7a3Sopenharmony_ci * **Feature:** Builds now support `-DBLOCK_MAX_TEXELS=<count>` to allow a 129cc1dc7a3Sopenharmony_ci compressor to support a subset of block sizes. This can reduce binary size 130cc1dc7a3Sopenharmony_ci and runtime memory footprint, and improve performance. 131cc1dc7a3Sopenharmony_ci * **Feature:** The `-v` and `-va` options to set a per-texel error weight 132cc1dc7a3Sopenharmony_ci function are no longer supported. 133cc1dc7a3Sopenharmony_ci * **Feature:** The `-b` option to set a per-texel error weight boost for 134cc1dc7a3Sopenharmony_ci block border texels is no longer supported. 135cc1dc7a3Sopenharmony_ci * **Feature:** The `-a` option to set a per-texel error weight based on texel 136cc1dc7a3Sopenharmony_ci alpha value is no longer supported as an error weighting tool, but is still 137cc1dc7a3Sopenharmony_ci supported for providing sprite-sheet RDO. 138cc1dc7a3Sopenharmony_ci * **Feature:** The `-mask` option to set an error metric for mask map 139cc1dc7a3Sopenharmony_ci textures is still supported, but is currently a no-op in the compressor. 140cc1dc7a3Sopenharmony_ci * **Feature:** The `-perceptual` option to set a perceptual error metric is 141cc1dc7a3Sopenharmony_ci still supported, but is currently a no-op in the compressor for mask map 142cc1dc7a3Sopenharmony_ci and normal map textures. 143cc1dc7a3Sopenharmony_ci * **Bug-fix:** Corrected decompression of error blocks in some cases, so now 144cc1dc7a3Sopenharmony_ci returning the expected error color (magenta for LDR, NaN for HDR). Note 145cc1dc7a3Sopenharmony_ci that astcenc determines the error color to use based on the output image 146cc1dc7a3Sopenharmony_ci data type not the decoder profile. 147cc1dc7a3Sopenharmony_ci* **Binary releases:** 148cc1dc7a3Sopenharmony_ci * **Improvement:** Windows binaries changed to use ClangCL 12.0, which gives 149cc1dc7a3Sopenharmony_ci up to 10% performance improvement. 150cc1dc7a3Sopenharmony_ci 151cc1dc7a3Sopenharmony_ci### Performance: 152cc1dc7a3Sopenharmony_ci 153cc1dc7a3Sopenharmony_ciKey for charts: 154cc1dc7a3Sopenharmony_ci 155cc1dc7a3Sopenharmony_ci* Color = block size (see legend). 156cc1dc7a3Sopenharmony_ci* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). 157cc1dc7a3Sopenharmony_ci 158cc1dc7a3Sopenharmony_ci**Relative performance vs 3.3 release:** 159cc1dc7a3Sopenharmony_ci 160cc1dc7a3Sopenharmony_ci 161cc1dc7a3Sopenharmony_ci 162cc1dc7a3Sopenharmony_ci 163cc1dc7a3Sopenharmony_ci<!-- ---------------------------------------------------------------------- --> 164cc1dc7a3Sopenharmony_ci## 3.3 165cc1dc7a3Sopenharmony_ci 166cc1dc7a3Sopenharmony_ci**Status:** November 2021 167cc1dc7a3Sopenharmony_ci 168cc1dc7a3Sopenharmony_ciThe 3.3 release improves image quality for normal maps, and two component 169cc1dc7a3Sopenharmony_citextures. Normal maps are expected to compress 25% slower than the 3.2 170cc1dc7a3Sopenharmony_cirelease, although it should be noted that they are still faster to compress 171cc1dc7a3Sopenharmony_ciin 3.3 than when using the 2.5 series. This release also fixes one reported 172cc1dc7a3Sopenharmony_cistability issue. 173cc1dc7a3Sopenharmony_ci 174cc1dc7a3Sopenharmony_ci* **General:** 175cc1dc7a3Sopenharmony_ci * **Feature:** Normal map image quality has been improved. 176cc1dc7a3Sopenharmony_ci * **Feature:** Two component image quality has been improved, provided 177cc1dc7a3Sopenharmony_ci that unused components are correctly zero-weighted using e.g. `-cw` on the 178cc1dc7a3Sopenharmony_ci command line. 179cc1dc7a3Sopenharmony_ci * **Bug-fix:** Improved stability when trying to compress complex blocks that 180cc1dc7a3Sopenharmony_ci could not beat even the starting quality threshold. These will now always 181cc1dc7a3Sopenharmony_ci compress in to a constant color blocks. 182cc1dc7a3Sopenharmony_ci 183cc1dc7a3Sopenharmony_ci<!-- ---------------------------------------------------------------------- --> 184cc1dc7a3Sopenharmony_ci## 3.2 185cc1dc7a3Sopenharmony_ci 186cc1dc7a3Sopenharmony_ci**Status:** August 2021 187cc1dc7a3Sopenharmony_ci 188cc1dc7a3Sopenharmony_ciThe 3.2 release is a bugfix release; no significant image quality or 189cc1dc7a3Sopenharmony_ciperformance differences are expected. 190cc1dc7a3Sopenharmony_ci 191cc1dc7a3Sopenharmony_ci* **General:** 192cc1dc7a3Sopenharmony_ci * **Bug-fix:** Improved stability when new contexts were created while other 193cc1dc7a3Sopenharmony_ci contexts were compressing or decompressing an image. 194cc1dc7a3Sopenharmony_ci * **Bug-fix:** Improved stability when decompressing blocks with invalid 195cc1dc7a3Sopenharmony_ci block encodings. 196cc1dc7a3Sopenharmony_ci 197cc1dc7a3Sopenharmony_ci<!-- ---------------------------------------------------------------------- --> 198cc1dc7a3Sopenharmony_ci## 3.1 199cc1dc7a3Sopenharmony_ci 200cc1dc7a3Sopenharmony_ci**Status:** July 2021 201cc1dc7a3Sopenharmony_ci 202cc1dc7a3Sopenharmony_ciThe 3.1 release gives another performance boost, typically between 5 and 20% 203cc1dc7a3Sopenharmony_cifaster than the 3.0 release, as well as further incremental improvements to 204cc1dc7a3Sopenharmony_ciimage quality. A number of build system improvements make astcenc easier and 205cc1dc7a3Sopenharmony_cifaster to integrate into other projects as a library, including support for 206cc1dc7a3Sopenharmony_cibuilding universal binaries on macOS. Full change list is shown below. 207cc1dc7a3Sopenharmony_ci 208cc1dc7a3Sopenharmony_ciReminder for users of the library interface - the API is not designed to be 209cc1dc7a3Sopenharmony_cibinary compatible across versions, and this release is not compatible with 210cc1dc7a3Sopenharmony_ciearlier releases. Please update and rebuild your client-side code using the 211cc1dc7a3Sopenharmony_ciupdated `astcenc.h` header. 212cc1dc7a3Sopenharmony_ci 213cc1dc7a3Sopenharmony_ci* **General:** 214cc1dc7a3Sopenharmony_ci * **Feature:** RGB color data now supports `-perceptual` operation. The 215cc1dc7a3Sopenharmony_ci current implementation is simple, weighting color channel errors by their 216cc1dc7a3Sopenharmony_ci contribution to perceived luminance. This mimics the behavior of the human 217cc1dc7a3Sopenharmony_ci visual system, which is most sensitive to green, then red, then blue. 218cc1dc7a3Sopenharmony_ci * **Feature:** Codec supports a new low weight search mode, which is a 219cc1dc7a3Sopenharmony_ci simpler weight assignment for encodings with a low number of weights in the 220cc1dc7a3Sopenharmony_ci weight grid. The weight threshold can be overridden using the new 221cc1dc7a3Sopenharmony_ci `-lowweightmodelimit` command line option. 222cc1dc7a3Sopenharmony_ci * **Feature:** All platform builds now support building a native binary. 223cc1dc7a3Sopenharmony_ci Native binaries automatically select the SIMD level based on the default 224cc1dc7a3Sopenharmony_ci configuration of the compiler in use. Native binaries built on one machine 225cc1dc7a3Sopenharmony_ci may use different SIMD options than native binaries build on another. 226cc1dc7a3Sopenharmony_ci * **Feature:** macOS platform builds now support building universal binaries 227cc1dc7a3Sopenharmony_ci containing both `x86_64` and `arm64` target support. 228cc1dc7a3Sopenharmony_ci * **Feature:** Building the command line can be disabled when using as a 229cc1dc7a3Sopenharmony_ci library in another project. Set `-DCLI=OFF` during the CMake configure 230cc1dc7a3Sopenharmony_ci step. 231cc1dc7a3Sopenharmony_ci * **Feature:** A standalone minimal example of the core codec API usage has 232cc1dc7a3Sopenharmony_ci been added in the `./Utils/Example/` directory. 233cc1dc7a3Sopenharmony_ci* **Core API:** 234cc1dc7a3Sopenharmony_ci * **Feature:** Config flag `ASTCENC_FLG_USE_PERCEPTUAL` works for color data. 235cc1dc7a3Sopenharmony_ci * **Feature:** Config option `tune_low_weight_count_limit` added. 236cc1dc7a3Sopenharmony_ci * **Feature:** New heuristic added which prunes dual weight plane searches if 237cc1dc7a3Sopenharmony_ci they are unlikely to help. This heuristic is not user controllable. 238cc1dc7a3Sopenharmony_ci * **Feature:** Image quality has been improved. In general we see significant 239cc1dc7a3Sopenharmony_ci improvements (up to 0.2dB) for high bitrate encodings (4x4, 5x4), and a 240cc1dc7a3Sopenharmony_ci smaller improvement (up to 0.1dB) for lower bitrate encodings. 241cc1dc7a3Sopenharmony_ci * **Bug fix:** Arm "none" SIMD builds could be invariant with other builds. 242cc1dc7a3Sopenharmony_ci This fix has also been back-ported to the 2.x LTS branch. 243cc1dc7a3Sopenharmony_ci 244cc1dc7a3Sopenharmony_ci### Performance: 245cc1dc7a3Sopenharmony_ci 246cc1dc7a3Sopenharmony_ciKey for charts: 247cc1dc7a3Sopenharmony_ci 248cc1dc7a3Sopenharmony_ci* Color = block size (see legend). 249cc1dc7a3Sopenharmony_ci* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). 250cc1dc7a3Sopenharmony_ci 251cc1dc7a3Sopenharmony_ci**Relative performance vs 3.0 release:** 252cc1dc7a3Sopenharmony_ci 253cc1dc7a3Sopenharmony_ci 254cc1dc7a3Sopenharmony_ci 255cc1dc7a3Sopenharmony_ci<!-- ---------------------------------------------------------------------- --> 256cc1dc7a3Sopenharmony_ci## 3.0 257cc1dc7a3Sopenharmony_ci 258cc1dc7a3Sopenharmony_ci**Status:** June 2021 259cc1dc7a3Sopenharmony_ci 260cc1dc7a3Sopenharmony_ciThe 3.0 release is the first in a series of updates to the compressor that are 261cc1dc7a3Sopenharmony_cimaking more radical changes than we felt we could make with the 2.x series. 262cc1dc7a3Sopenharmony_ciThe primary goals of the 3.x series are to keep the image quality ~static or 263cc1dc7a3Sopenharmony_cibetter compared to the 2.5 release, but continue to improve performance. 264cc1dc7a3Sopenharmony_ci 265cc1dc7a3Sopenharmony_ciReminder for users of the library interface - the API is not designed to be 266cc1dc7a3Sopenharmony_cibinary compatible across versions, and this release is not compatible with 267cc1dc7a3Sopenharmony_ciearlier releases. Please update and rebuild your client-side code using the 268cc1dc7a3Sopenharmony_ciupdated `astcenc.h` header. 269cc1dc7a3Sopenharmony_ci 270cc1dc7a3Sopenharmony_ci* **General:** 271cc1dc7a3Sopenharmony_ci * **Feature:** The code has been significantly cleaned up, with improved 272cc1dc7a3Sopenharmony_ci comments, API documentation, function naming, and variable naming. 273cc1dc7a3Sopenharmony_ci* **Core API:** 274cc1dc7a3Sopenharmony_ci * **API Change:** The core APIs for `astcenc_compress_image()` and for 275cc1dc7a3Sopenharmony_ci `astcenc_decompress_image()` now accept swizzle structures by `const` 276cc1dc7a3Sopenharmony_ci pointer, instead of pass-by-value. 277cc1dc7a3Sopenharmony_ci * **API Change:** Calling the `astcenc_compress_reset()` and the 278cc1dc7a3Sopenharmony_ci `astcenc_decompress_reset()` functions between images is no longer required 279cc1dc7a3Sopenharmony_ci if the context was created for use by a single thread. 280cc1dc7a3Sopenharmony_ci * **Feature:** New heuristics have been added for controlling when to search 281cc1dc7a3Sopenharmony_ci beyond 2 partitions and 1 plane, and when to search beyond 3 partitions and 282cc1dc7a3Sopenharmony_ci 1 plane. The previous `tune_partition_early_out_limit` config option has 283cc1dc7a3Sopenharmony_ci been removed, and replaced with two new options 284cc1dc7a3Sopenharmony_ci `tune_2_partition_early_out_limit_factor` and 285cc1dc7a3Sopenharmony_ci `tune_3_partition_early_out_limit_factor`. See command line help for more 286cc1dc7a3Sopenharmony_ci detailed documentation. 287cc1dc7a3Sopenharmony_ci * **Feature:** New heuristics have been added for controlling when to use 288cc1dc7a3Sopenharmony_ci dual weight planes. The previous `tune_two_plane_early_out_limit` has been 289cc1dc7a3Sopenharmony_ci renamed to`tune_2_plane_early_out_limit_correlation`. See command line help 290cc1dc7a3Sopenharmony_ci for more detailed documentation. 291cc1dc7a3Sopenharmony_ci * **Feature:** Support for using dual weight planes has been restricted to 292cc1dc7a3Sopenharmony_ci single partition blocks; it rarely helps blocks with 2 or more partitions 293cc1dc7a3Sopenharmony_ci and takes considerable compression search time. 294cc1dc7a3Sopenharmony_ci 295cc1dc7a3Sopenharmony_ci### Performance: 296cc1dc7a3Sopenharmony_ci 297cc1dc7a3Sopenharmony_ciKey for charts: 298cc1dc7a3Sopenharmony_ci 299cc1dc7a3Sopenharmony_ci* Color = block size (see legend). 300cc1dc7a3Sopenharmony_ci* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). 301cc1dc7a3Sopenharmony_ci 302cc1dc7a3Sopenharmony_ci**Relative performance vs 2.5 release:** 303cc1dc7a3Sopenharmony_ci 304cc1dc7a3Sopenharmony_ci 305cc1dc7a3Sopenharmony_ci 306cc1dc7a3Sopenharmony_ci- - - 307cc1dc7a3Sopenharmony_ci 308cc1dc7a3Sopenharmony_ci_Copyright © 2021-2022, Arm Limited and contributors. All rights reserved._ 309