[llvm-branch-commits] [libcxx] [libc++][format] Improves escaping performance. (PR #88533)

2024-04-12 Thread via llvm-branch-commits

llvmbot wrote:




@llvm/pr-subscribers-libcxx

Author: Mark de Wever (mordante)


Changes

The previous patch implemented
- P2713R1 Escaping improvements in std::format
- LWG3965 Incorrect example in [format.string.escaped] p3 for formatting of 
combining characters

These changes were correct, but has a size and performance penalty. This patch 
improves the size and performance of the previous patch. The performance is 
still worse than before since the lookups may require two property lookups 
instead of one before implementing the paper. The changes give a tighter 
coupling between the Unicode data and the algorithm. An additional tests are 
added to notify about changes in future Unicode updates.

Before
---
Benchmark Time CPU   Iterations
---
BM_ascii_escaped   110704 ns   110696 ns 6206
BM_unicode_escaped 101371 ns   101374 ns 6862
BM_cyrillic_escaped 63329 ns63327 ns11013
BM_japanese_escaped 41223 ns41225 ns16938
BM_emoji_escaped   111022 ns   111021 ns 6304
BM_ascii_escaped112441 ns   112443 ns 6231
BM_unicode_escaped  102776 ns   102779 ns 6813
BM_cyrillic_escaped  58977 ns58975 ns11868
BM_japanese_escaped  36885 ns36886 ns18975
BM_emoji_escaped115885 ns   115881 ns 6051

The first change is to manually encode the entire last area and make a manual 
exception for the 240 excluded entries. This reduced the table from 1077 to 729 
entries and gave the following benchmark results. 
---
Benchmark Time CPU   Iterations
---
BM_ascii_escaped   104777 ns   104776 ns 6550
BM_unicode_escaped  96980 ns96982 ns 7238
BM_cyrillic_escaped 60254 ns60251 ns11670
BM_japanese_escaped 44452 ns44452 ns15734
BM_emoji_escaped   104557 ns   104551 ns 6685
BM_ascii_escaped107456 ns   107454 ns 6505
BM_unicode_escaped   96219 ns96216 ns 7301
BM_cyrillic_escaped  56921 ns56904 ns12288
BM_japanese_escaped  39530 ns39529 ns17492
BM_emoji_escaped108494 ns   108496 ns 6408

An entry in the table can only contain 2048 code points. For larger ranges 
there are multiple entries split in chunks with a maximum size of 2048 entries. 
To encode the entire Unicode code point range 21 bits are required. The manual 
part starts at 0x323B0 this means all entries in the table fit in 18 bits. This 
allows to allocate 3 additional bits for the range. This allows entries to have 
16384 elements. This range always avoids splitting the range in multiple chunks.

This reduces the number of table elements from 729 to 711 and gives the 
following benchmark results.
---
Benchmark Time CPU   Iterations
---
BM_ascii_escaped   104289 ns   104289 ns 6619
BM_unicode_escaped  96682 ns96681 ns 7215
BM_cyrillic_escaped 59673 ns59673 ns11732
BM_japanese_escaped 41983 ns41982 ns16646
BM_emoji_escaped   104119 ns   104120 ns 6683
BM_ascii_escaped104503 ns   104505 ns 6693
BM_unicode_escaped   93426 ns93423 ns 7489
BM_cyrillic_escaped  54858 ns54859 ns12742
BM_japanese_escaped  36385 ns36384 ns19259
BM_emoji_escaped105608 ns   105610 ns 6592

---

Patch is 102.90 KiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/88533.diff


3 Files Affected:

- (modified) libcxx/include/__format/escaped_output_table.h (+729-1092) 
- (added) 
libcxx/test/libcxx/utilities/format/format.string/format.string.std/escaped_output.pass.cpp
 (+100) 
- (modified) libcxx/utils/generate_escaped_output_table.py (+51-35) 


``diff
diff --git a/libcxx/include/__format/escaped_output_table.h 
b/libcxx/include/__format/escaped_output_table.h
index 3144abdd3f9a80..6abe121661bdf6 100644
--- a/libcxx/include/__format/escaped_output_table.h
+++ b/libcxx/include/__format/escaped_output_table.

[llvm-branch-commits] [libcxx] [libc++][format] Improves escaping performance. (PR #88533)

2024-04-23 Thread Louis Dionne via llvm-branch-commits

https://github.com/ldionne edited 
https://github.com/llvm/llvm-project/pull/88533
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [libcxx] [libc++][format] Improves escaping performance. (PR #88533)

2024-04-23 Thread Louis Dionne via llvm-branch-commits

https://github.com/ldionne approved this pull request.

LGTM with a few comments!

https://github.com/llvm/llvm-project/pull/88533
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [libcxx] [libc++][format] Improves escaping performance. (PR #88533)

2024-04-23 Thread Louis Dionne via llvm-branch-commits


@@ -305,23 +316,28 @@ def generate_data_tables() -> str:
 
 data = compactPropertyRanges(sorted(properties, key=lambda x: x.lower))
 
-# The last entry is large. In Unicode 14 it contains the entries
-# 3134B..0 912564 elements
-# This are 446 entries of 1325 entries in the table.
-# Based on the nature of these entries it is expected they remain for the
-# forseeable future. Therefore we only store the lower bound of this 
section.
-#
-# When this region becomes substantially smaller we need to investigate
-# this design.
-#
-# Due to P2713R1 Escaping improvements in std::format the range
+# The output table has two large entries at the end, with a small "gap"
 #   E0100..E01EF  ; Grapheme_Extend # Mn [240] VARIATION 
SELECTOR-17..VARIATION SELECTOR-256
-# is no longer part of these entries. This causes an increase in the size
-# of the table.
-assert data[-1].upper == 0x10
-# assert data[-1].upper - data[-1].lower > 90
-
-return "\n".join([generate_cpp_data(data[:-1], data[-1].lower)])
+# Based on Unicode 15.1.0:
+# - Encoding all these entries in the table requires 1173 entries.
+# - Manually handling these last two blocks reduces the size to 729 
entries.
+# This not only reduces the binary size, but also improves the performance
+# by having less elements to search.

ldionne wrote:

```suggestion
# by having fewer elements to search.
```

https://github.com/llvm/llvm-project/pull/88533
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [libcxx] [libc++][format] Improves escaping performance. (PR #88533)

2024-04-23 Thread Louis Dionne via llvm-branch-commits

https://github.com/ldionne edited 
https://github.com/llvm/llvm-project/pull/88533
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [libcxx] [libc++][format] Improves escaping performance. (PR #88533)

2024-04-23 Thread Louis Dionne via llvm-branch-commits


@@ -305,23 +316,28 @@ def generate_data_tables() -> str:
 
 data = compactPropertyRanges(sorted(properties, key=lambda x: x.lower))
 
-# The last entry is large. In Unicode 14 it contains the entries
-# 3134B..0 912564 elements
-# This are 446 entries of 1325 entries in the table.
-# Based on the nature of these entries it is expected they remain for the
-# forseeable future. Therefore we only store the lower bound of this 
section.
-#
-# When this region becomes substantially smaller we need to investigate
-# this design.
-#
-# Due to P2713R1 Escaping improvements in std::format the range
+# The output table has two large entries at the end, with a small "gap"
 #   E0100..E01EF  ; Grapheme_Extend # Mn [240] VARIATION 
SELECTOR-17..VARIATION SELECTOR-256
-# is no longer part of these entries. This causes an increase in the size
-# of the table.
-assert data[-1].upper == 0x10
-# assert data[-1].upper - data[-1].lower > 90
-
-return "\n".join([generate_cpp_data(data[:-1], data[-1].lower)])
+# Based on Unicode 15.1.0:
+# - Encoding all these entries in the table requires 1173 entries.
+# - Manually handling these last two blocks reduces the size to 729 
entries.
+# This not only reduces the binary size, but also improves the performance
+# by having less elements to search.
+# The exact entrires may differ between Unicode versions. When these 
numbers
+# change the test needs to be updated too.
+#   
test/libcxx/utilities/format/format.string/format.string.std/escaped_output.pass.cpp

ldionne wrote:

```suggestion
#   
libcxx/test/libcxx/utilities/format/format.string/format.string.std/escaped_output.pass.cpp
```

https://github.com/llvm/llvm-project/pull/88533
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [libcxx] [libc++][format] Improves escaping performance. (PR #88533)

2024-04-23 Thread Louis Dionne via llvm-branch-commits


@@ -305,23 +316,28 @@ def generate_data_tables() -> str:
 
 data = compactPropertyRanges(sorted(properties, key=lambda x: x.lower))
 
-# The last entry is large. In Unicode 14 it contains the entries
-# 3134B..0 912564 elements
-# This are 446 entries of 1325 entries in the table.
-# Based on the nature of these entries it is expected they remain for the
-# forseeable future. Therefore we only store the lower bound of this 
section.
-#
-# When this region becomes substantially smaller we need to investigate
-# this design.
-#
-# Due to P2713R1 Escaping improvements in std::format the range
+# The output table has two large entries at the end, with a small "gap"
 #   E0100..E01EF  ; Grapheme_Extend # Mn [240] VARIATION 
SELECTOR-17..VARIATION SELECTOR-256
-# is no longer part of these entries. This causes an increase in the size
-# of the table.
-assert data[-1].upper == 0x10
-# assert data[-1].upper - data[-1].lower > 90
-
-return "\n".join([generate_cpp_data(data[:-1], data[-1].lower)])
+# Based on Unicode 15.1.0:
+# - Encoding all these entries in the table requires 1173 entries.
+# - Manually handling these last two blocks reduces the size to 729 
entries.
+# This not only reduces the binary size, but also improves the performance
+# by having less elements to search.
+# The exact entrires may differ between Unicode versions. When these 
numbers

ldionne wrote:

```suggestion
# The exact entries may differ between Unicode versions. When these numbers
```

https://github.com/llvm/llvm-project/pull/88533
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [libcxx] [libc++][format] Improves escaping performance. (PR #88533)

2024-04-23 Thread Louis Dionne via llvm-branch-commits


@@ -106,1110 +105,748 @@ namespace __escaped_output_table {
 /// table lacks a property, thus having more bits available for the size.
 ///
 /// The data has 2 values:
-/// - bits [0, 10] The size of the range, allowing 2048 elements.
-/// - bits [11, 31] The lower bound code point of the range. The upper bound of
-///   the range is lower bound + size.
-_LIBCPP_HIDE_FROM_ABI inline constexpr uint32_t __entries[1077] = {
+/// - bits [0, 13] The size of the range, allowing 16384 elements.
+/// - bits [14, 31] The lower bound code point of the range. The upper bound of
+///   the range is lower bound + size. Note the code expects code units the fit
+///   into 18 bits, instead of the 21 bits needed for the full Unicode range.
+_LIBCPP_HIDE_FROM_ABI inline constexpr uint32_t __entries[711] = {
 0x0020 /*  - 0020 [   33] */,
-0x0003f821 /* 007f - 00a0 [   34] */,
-0x00056800 /* 00ad - 00ad [1] */,
-0x001bc001 /* 0378 - 0379 [2] */,
-0x001c0003 /* 0380 - 0383 [4] */,
-0x001c5800 /* 038b - 038b [1] */,
-0x001c6800 /* 038d - 038d [1] */,
-0x001d1000 /* 03a2 - 03a2 [1] */,
-0x00298000 /* 0530 - 0530 [1] */,
-0x002ab801 /* 0557 - 0558 [2] */,
-0x002c5801 /* 058b - 058c [2] */,
-0x002c8000 /* 0590 - 0590 [1] */,
-0x002e4007 /* 05c8 - 05cf [8] */,
-0x002f5803 /* 05eb - 05ee [4] */,
-0x002fa810 /* 05f5 - 0605 [   17] */,
-0x0030e000 /* 061c - 061c [1] */,
-0x0036e800 /* 06dd - 06dd [1] */,
-0x00387001 /* 070e - 070f [2] */,
-0x003a5801 /* 074b - 074c [2] */,
-0x003d900d /* 07b2 - 07bf [   14] */,
-0x003fd801 /* 07fb - 07fc [2] */,
-0x00417001 /* 082e - 082f [2] */,
-0x0041f800 /* 083f - 083f [1] */,
-0x0042e001 /* 085c - 085d [2] */,
-0x0042f800 /* 085f - 085f [1] */,
-0x00435804 /* 086b - 086f [5] */,
-0x00447808 /* 088f - 0897 [9] */,
-0x00471000 /* 08e2 - 08e2 [1] */,
-0x004c2000 /* 0984 - 0984 [1] */,
-0x004c6801 /* 098d - 098e [2] */,
-0x004c8801 /* 0991 - 0992 [2] */,
-0x004d4800 /* 09a9 - 09a9 [1] */,
-0x004d8800 /* 09b1 - 09b1 [1] */,
-0x004d9802 /* 09b3 - 09b5 [3] */,
-0x004dd001 /* 09ba - 09bb [2] */,
-0x004e2801 /* 09c5 - 09c6 [2] */,
-0x004e4801 /* 09c9 - 09ca [2] */,
-0x004e7807 /* 09cf - 09d6 [8] */,
-0x004ec003 /* 09d8 - 09db [4] */,
-0x004ef000 /* 09de - 09de [1] */,
-0x004f2001 /* 09e4 - 09e5 [2] */,
-0x004ff801 /* 09ff - 0a00 [2] */,
-0x00502000 /* 0a04 - 0a04 [1] */,
-0x00505803 /* 0a0b - 0a0e [4] */,
-0x00508801 /* 0a11 - 0a12 [2] */,
-0x00514800 /* 0a29 - 0a29 [1] */,
-0x00518800 /* 0a31 - 0a31 [1] */,
-0x0051a000 /* 0a34 - 0a34 [1] */,
-0x0051b800 /* 0a37 - 0a37 [1] */,
-0x0051d001 /* 0a3a - 0a3b [2] */,
-0x0051e800 /* 0a3d - 0a3d [1] */,
-0x00521803 /* 0a43 - 0a46 [4] */,
-0x00524801 /* 0a49 - 0a4a [2] */,
-0x00527002 /* 0a4e - 0a50 [3] */,
-0x00529006 /* 0a52 - 0a58 [7] */,
-0x0052e800 /* 0a5d - 0a5d [1] */,
-0x0052f806 /* 0a5f - 0a65 [7] */,
-0x0053b809 /* 0a77 - 0a80 [   10] */,
-0x00542000 /* 0a84 - 0a84 [1] */,
-0x00547000 /* 0a8e - 0a8e [1] */,
-0x00549000 /* 0a92 - 0a92 [1] */,
-0x00554800 /* 0aa9 - 0aa9 [1] */,
-0x00558800 /* 0ab1 - 0ab1 [1] */,
-0x0055a000 /* 0ab4 - 0ab4 [1] */,
-0x0055d001 /* 0aba - 0abb [2] */,
-0x00563000 /* 0ac6 - 0ac6 [1] */,
-0x00565000 /* 0aca - 0aca [1] */,
-0x00567001 /* 0ace - 0acf [2] */,
-0x0056880e /* 0ad1 - 0adf [   15] */,
-0x00572001 /* 0ae4 - 0ae5 [2] */,
-0x00579006 /* 0af2 - 0af8 [7] */,
-0x0058 /* 0b00 - 0b00 [1] */,
-0x00582000 /* 0b04 - 0b04 [1] */,
-0x00586801 /* 0b0d - 0b0e [2] */,
-0x00588801 /* 0b11 - 0b12 [2] */,
-0x00594800 /* 0b29 - 0b29 [1] */,
-0x00598800 /* 0b31 - 0b31 [1] */,
-0x0059a000 /* 0b34 - 0b34 [1] */,
-0x0059d001 /* 0b3a - 0b3b [2] */,
-0x005a2801 /* 0b45 - 0b46 [2] */,
-0x005a4801 /* 0b49 - 0b4a [2] */,
-0x005a7006 /* 0b4e - 0b54 [7] *

[llvm-branch-commits] [libcxx] [libc++][format] Improves escaping performance. (PR #88533)

2024-04-23 Thread Louis Dionne via llvm-branch-commits


@@ -0,0 +1,100 @@
+//===--===//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
+// UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME
+
+// 
+
+// Tests the properties of the Unicode escaped output table.
+// The libc++ algorithm has size and speed optimizations based on the 
properties
+// of Unicode. This means updating the Unicode tables has a likilihood of
+// breaking test. This is an assert; it requires validating whether the
+// assumptions of the size and speed optimizations are still valid.
+
+#include 
+#include 
+#include 
+#include 
+
+// Contains the entries for [format.string.escaped]/2.2.1.2.1
+//   CE is a Unicode encoding and C corresponds to a UCS scalar value whose
+//   Unicode property General_Category has a value in the groups Separator (Z)
+//   or Other (C), as described by table 12 of UAX #44
+//
+// Separator (Z) consists of General_Category
+// - Zs Space_Separator,
+// - Zl Line_Separator,
+// - Zp Paragraph_Separator.
+//
+// Other (C) consists of General_Category
+// - Cc Control,
+// - Cf Format,
+// - Cs Surrogate,
+// - Co Private_Use,
+// - Cn Unassigned.
+inline constexpr int Zs = 17;
+inline constexpr int Zl = 1;
+inline constexpr int Zp = 1;
+inline constexpr int Z  = Zs + Zl + Zp;
+
+inline constexpr int Cc = 65;
+inline constexpr int Cf = 170;
+inline constexpr int Cs = 2'048;
+inline constexpr int Co = 137'468;
+inline constexpr int Cn = 824'718;
+inline constexpr int C  = Cc + Cf + Cs + Co + Cn;
+
+// This is the final part of the Unicode properties table:
+//
+// 31350..323AF  ; Lo # [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED 
IDEOGRAPH-323AF
+// 323B0..E  ; Cn # [711761] ..
+// E0001 ; Cf #   LANGUAGE TAG
+// E0002..E001F  ; Cn #  [30] ..
+// E0020..E007F  ; Cf #  [96] TAG SPACE..CANCEL TAG
+// E0080..E00FF  ; Cn # [128] ..
+// E0100..E01EF  ; Mn # [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+// E01F0..E  ; Cn # [65040] ..
+// F..D  ; Co # [65534] ..
+// E..F  ; Cn #   [2] ..
+// 10..10FFFD; Co # [65534] ..
+// 10FFFE..10; Cn #   [2] ..
+//
+// It can be observed all entries in the range 323B0..10 are in the
+// categories Cf, Co, Cn, except a small range with the property Mn.
+// In order to reduce the size of the table only the entires in the range
+// [, 323B0) are stored in the table. The entries in the range
+// [323B0, 10] use a hand-crafted algorithm.
+//
+// This means a number of entries are omitted
+inline constexpr int excluded = ((0x10 - 0x323B0) + 1) - 240;
+
+inline constexpr int entries = Z + C - excluded;
+
+static constexpr int count_entries() {
+  return std::transform_reduce(
+  std::begin(std::__escaped_output_table::__entries),
+  std::end(std::__escaped_output_table::__entries),
+  0,
+  std::plus{},
+  [](auto entry) { return 1 + static_cast(entry & 0x3fffu); });
+}
+static_assert(count_entries() == entries);
+
+int main() {

ldionne wrote:

```suggestion
int main(int, char**) {
```

and `return 0;`

https://github.com/llvm/llvm-project/pull/88533
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [libcxx] [libc++][format] Improves escaping performance. (PR #88533)

2024-04-23 Thread Louis Dionne via llvm-branch-commits


@@ -106,1110 +105,748 @@ namespace __escaped_output_table {
 /// table lacks a property, thus having more bits available for the size.
 ///
 /// The data has 2 values:
-/// - bits [0, 10] The size of the range, allowing 2048 elements.
-/// - bits [11, 31] The lower bound code point of the range. The upper bound of
-///   the range is lower bound + size.
-_LIBCPP_HIDE_FROM_ABI inline constexpr uint32_t __entries[1077] = {
+/// - bits [0, 13] The size of the range, allowing 16384 elements.
+/// - bits [14, 31] The lower bound code point of the range. The upper bound of
+///   the range is lower bound + size. Note the code expects code units the fit
+///   into 18 bits, instead of the 21 bits needed for the full Unicode range.
+_LIBCPP_HIDE_FROM_ABI inline constexpr uint32_t __entries[711] = {
 0x0020 /*  - 0020 [   33] */,
-0x0003f821 /* 007f - 00a0 [   34] */,
-0x00056800 /* 00ad - 00ad [1] */,
-0x001bc001 /* 0378 - 0379 [2] */,
-0x001c0003 /* 0380 - 0383 [4] */,
-0x001c5800 /* 038b - 038b [1] */,
-0x001c6800 /* 038d - 038d [1] */,
-0x001d1000 /* 03a2 - 03a2 [1] */,
-0x00298000 /* 0530 - 0530 [1] */,
-0x002ab801 /* 0557 - 0558 [2] */,
-0x002c5801 /* 058b - 058c [2] */,
-0x002c8000 /* 0590 - 0590 [1] */,
-0x002e4007 /* 05c8 - 05cf [8] */,
-0x002f5803 /* 05eb - 05ee [4] */,
-0x002fa810 /* 05f5 - 0605 [   17] */,
-0x0030e000 /* 061c - 061c [1] */,
-0x0036e800 /* 06dd - 06dd [1] */,
-0x00387001 /* 070e - 070f [2] */,
-0x003a5801 /* 074b - 074c [2] */,
-0x003d900d /* 07b2 - 07bf [   14] */,
-0x003fd801 /* 07fb - 07fc [2] */,
-0x00417001 /* 082e - 082f [2] */,
-0x0041f800 /* 083f - 083f [1] */,
-0x0042e001 /* 085c - 085d [2] */,
-0x0042f800 /* 085f - 085f [1] */,
-0x00435804 /* 086b - 086f [5] */,
-0x00447808 /* 088f - 0897 [9] */,
-0x00471000 /* 08e2 - 08e2 [1] */,
-0x004c2000 /* 0984 - 0984 [1] */,
-0x004c6801 /* 098d - 098e [2] */,
-0x004c8801 /* 0991 - 0992 [2] */,
-0x004d4800 /* 09a9 - 09a9 [1] */,
-0x004d8800 /* 09b1 - 09b1 [1] */,
-0x004d9802 /* 09b3 - 09b5 [3] */,
-0x004dd001 /* 09ba - 09bb [2] */,
-0x004e2801 /* 09c5 - 09c6 [2] */,
-0x004e4801 /* 09c9 - 09ca [2] */,
-0x004e7807 /* 09cf - 09d6 [8] */,
-0x004ec003 /* 09d8 - 09db [4] */,
-0x004ef000 /* 09de - 09de [1] */,
-0x004f2001 /* 09e4 - 09e5 [2] */,
-0x004ff801 /* 09ff - 0a00 [2] */,
-0x00502000 /* 0a04 - 0a04 [1] */,
-0x00505803 /* 0a0b - 0a0e [4] */,
-0x00508801 /* 0a11 - 0a12 [2] */,
-0x00514800 /* 0a29 - 0a29 [1] */,
-0x00518800 /* 0a31 - 0a31 [1] */,
-0x0051a000 /* 0a34 - 0a34 [1] */,
-0x0051b800 /* 0a37 - 0a37 [1] */,
-0x0051d001 /* 0a3a - 0a3b [2] */,
-0x0051e800 /* 0a3d - 0a3d [1] */,
-0x00521803 /* 0a43 - 0a46 [4] */,
-0x00524801 /* 0a49 - 0a4a [2] */,
-0x00527002 /* 0a4e - 0a50 [3] */,
-0x00529006 /* 0a52 - 0a58 [7] */,
-0x0052e800 /* 0a5d - 0a5d [1] */,
-0x0052f806 /* 0a5f - 0a65 [7] */,
-0x0053b809 /* 0a77 - 0a80 [   10] */,
-0x00542000 /* 0a84 - 0a84 [1] */,
-0x00547000 /* 0a8e - 0a8e [1] */,
-0x00549000 /* 0a92 - 0a92 [1] */,
-0x00554800 /* 0aa9 - 0aa9 [1] */,
-0x00558800 /* 0ab1 - 0ab1 [1] */,
-0x0055a000 /* 0ab4 - 0ab4 [1] */,
-0x0055d001 /* 0aba - 0abb [2] */,
-0x00563000 /* 0ac6 - 0ac6 [1] */,
-0x00565000 /* 0aca - 0aca [1] */,
-0x00567001 /* 0ace - 0acf [2] */,
-0x0056880e /* 0ad1 - 0adf [   15] */,
-0x00572001 /* 0ae4 - 0ae5 [2] */,
-0x00579006 /* 0af2 - 0af8 [7] */,
-0x0058 /* 0b00 - 0b00 [1] */,
-0x00582000 /* 0b04 - 0b04 [1] */,
-0x00586801 /* 0b0d - 0b0e [2] */,
-0x00588801 /* 0b11 - 0b12 [2] */,
-0x00594800 /* 0b29 - 0b29 [1] */,
-0x00598800 /* 0b31 - 0b31 [1] */,
-0x0059a000 /* 0b34 - 0b34 [1] */,
-0x0059d001 /* 0b3a - 0b3b [2] */,
-0x005a2801 /* 0b45 - 0b46 [2] */,
-0x005a4801 /* 0b49 - 0b4a [2] */,
-0x005a7006 /* 0b4e - 0b54 [7] *