* [Qemu-devel] [RFC 00/14] tcg aarch64 improvements
@ 2013-08-12 18:44 Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 01/14] tcg-aarch64: Allow immediate operands to add and sub Richard Henderson
` (13 more replies)
0 siblings, 14 replies; 17+ messages in thread
From: Richard Henderson @ 2013-08-12 18:44 UTC (permalink / raw)
To: qemu-devel; +Cc: claudio.fontana
Several of these patches need cleaning up, but brings the state of
the port in line with the other targets.
The last patch is dependant on another patch set I've got in the
queue for 1.7 (http://patchwork.ozlabs.org/patch/264736/), but is
otherwise independant.
The patch set is at git://github.com/rth7680/qemu.git tcg-aarch
r~
Richard Henderson (14):
tcg-aarch64: Allow immediate operands to add and sub
tcg-aarch64: Allow immediate operands to and, or, xor
tcg-aarch64: Allow immediate operands to compare
tcg-aarch64: Convert from opcode enums to insn enums
tcg-aarch64: Support andc, orc, eqv, not
tcg-aarch64: Handle zero as first argument to sub
tcg-aarch64: Support movcond
tcg-aarch64: Support deposit
tcg-aarch64: Support add2, sub2
tcg-aarch64: Support div, mulu2
tcg-aarch64: Improve tcg_out_movi
tcg-aarch64: Avoid add with zero in tlb load
tcg-aarch64: Use adrp in tcg_out_movi
tcg-aarch64: Pass return address to load/store helpers directly.
include/exec/exec-all.h | 16 +-
tcg/aarch64/bitmask-table.c | 85 +
tcg/aarch64/bitmask-table.h | 5342 +++++++++++++++++++++++++++++++++++++++++++
tcg/aarch64/tcg-target.c | 979 +++++---
tcg/aarch64/tcg-target.h | 38 +-
5 files changed, 6143 insertions(+), 317 deletions(-)
create mode 100644 tcg/aarch64/bitmask-table.c
create mode 100644 tcg/aarch64/bitmask-table.h
--
1.8.3.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* [Qemu-devel] [RFC 01/14] tcg-aarch64: Allow immediate operands to add and sub
2013-08-12 18:44 [Qemu-devel] [RFC 00/14] tcg aarch64 improvements Richard Henderson
@ 2013-08-12 18:44 ` Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 02/14] tcg-aarch64: Allow immediate operands to and, or, xor Richard Henderson
` (12 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2013-08-12 18:44 UTC (permalink / raw)
To: qemu-devel; +Cc: claudio.fontana, Richard Henderson
Use signed 25-bit operands, because two 12-bit operations is
smaller than movz+movk+add.
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
tcg/aarch64/tcg-target.c | 107 +++++++++++++++++++++++++++--------------------
1 file changed, 61 insertions(+), 46 deletions(-)
diff --git a/tcg/aarch64/tcg-target.c b/tcg/aarch64/tcg-target.c
index 41a17f8..ed32f64 100644
--- a/tcg/aarch64/tcg-target.c
+++ b/tcg/aarch64/tcg-target.c
@@ -106,6 +106,8 @@ static inline void patch_reloc(uint8_t *code_ptr, int type,
}
}
+#define TCG_CT_CONST_S25 0x100
+
/* parse target specific constraints */
static int target_parse_constraint(TCGArgConstraint *ct,
const char **pct_str)
@@ -129,6 +131,9 @@ static int target_parse_constraint(TCGArgConstraint *ct,
tcg_regset_reset_reg(ct->u.regs, TCG_REG_X3);
#endif
break;
+ case 'A': /* 25-bit signed, to be added or subtracted. */
+ ct->ct |= TCG_CT_CONST_S25;
+ break;
default:
return -1;
}
@@ -146,6 +151,9 @@ static inline int tcg_target_const_match(tcg_target_long val,
if (ct & TCG_CT_CONST) {
return 1;
}
+ if ((ct & TCG_CT_CONST_S25) && sextract32(val, 0, 25) == val) {
+ return 1;
+ }
return 0;
}
@@ -200,12 +208,14 @@ enum aarch64_ldst_op_type { /* type of operation */
};
enum aarch64_arith_opc {
- ARITH_AND = 0x0a,
- ARITH_ADD = 0x0b,
- ARITH_OR = 0x2a,
+ ARITH_AND = 0x0a,
+ ARITH_ADD = 0x0b,
+ ARITH_ADDI = 0x11,
+ ARITH_OR = 0x2a,
ARITH_ADDS = 0x2b,
- ARITH_XOR = 0x4a,
- ARITH_SUB = 0x4b,
+ ARITH_XOR = 0x4a,
+ ARITH_SUB = 0x4b,
+ ARITH_SUBI = 0x51,
ARITH_ANDS = 0x6a,
ARITH_SUBS = 0x6b,
};
@@ -453,6 +463,20 @@ static inline void tcg_out_arith(TCGContext *s, enum aarch64_arith_opc opc,
tcg_out32(s, base | rm << 16 | shift | rn << 5 | rd);
}
+static inline void tcg_out_aimm(TCGContext *s, enum aarch64_arith_opc opc,
+ int ext, TCGReg rd, TCGReg rn, uint64_t aimm)
+{
+ unsigned int base = (ext ? 0x80 | opc : opc) << 24;
+
+ if (aimm > 0xfff) {
+ assert((aimm & 0xfff) == 0);
+ aimm >>= 12;
+ base |= 1 << 22; /* apply LSL 12 */
+ assert(aimm <= 0xfff);
+ }
+ tcg_out32(s, base | (aimm << 10) | (rn << 5) | rd);
+}
+
static inline void tcg_out_mul(TCGContext *s, int ext,
TCGReg rd, TCGReg rn, TCGReg rm)
{
@@ -732,44 +756,27 @@ static inline void tcg_out_uxt(TCGContext *s, int s_bits,
tcg_out_ubfm(s, 0, rd, rn, 0, bits);
}
-static inline void tcg_out_addi(TCGContext *s, int ext,
- TCGReg rd, TCGReg rn, unsigned int aimm)
+static void tcg_out_addi(TCGContext *s, int ext, TCGReg rd, TCGReg rn,
+ tcg_target_long aimm)
{
- /* add immediate aimm unsigned 12bit value (with LSL 0 or 12) */
- /* using ADD 0x11000000 | (ext) | (aimm << 10) | (rn << 5) | rd */
- unsigned int base = ext ? 0x91000000 : 0x11000000;
+ enum aarch64_arith_opc opc = ARITH_ADDI;
+ tcg_target_long lo, hi;
- if (aimm <= 0xfff) {
- aimm <<= 10;
- } else {
- /* we can only shift left by 12, on assert we cannot represent */
- assert(!(aimm & 0xfff));
- assert(aimm <= 0xfff000);
- base |= 1 << 22; /* apply LSL 12 */
- aimm >>= 2;
+ if (aimm < 0) {
+ aimm = -aimm;
+ opc = ARITH_SUBI;
}
+ hi = aimm & 0xfff000;
+ lo = aimm & 0xfff;
+ assert(aimm == hi + lo);
- tcg_out32(s, base | aimm | (rn << 5) | rd);
-}
-
-static inline void tcg_out_subi(TCGContext *s, int ext,
- TCGReg rd, TCGReg rn, unsigned int aimm)
-{
- /* sub immediate aimm unsigned 12bit value (with LSL 0 or 12) */
- /* using SUB 0x51000000 | (ext) | (aimm << 10) | (rn << 5) | rd */
- unsigned int base = ext ? 0xd1000000 : 0x51000000;
-
- if (aimm <= 0xfff) {
- aimm <<= 10;
- } else {
- /* we can only shift left by 12, on assert we cannot represent */
- assert(!(aimm & 0xfff));
- assert(aimm <= 0xfff000);
- base |= 1 << 22; /* apply LSL 12 */
- aimm >>= 2;
+ if (hi != 0) {
+ tcg_out_aimm(s, opc, ext, rd, rn, hi);
+ rn = rd;
+ }
+ if (lo != 0 || rd != rn) {
+ tcg_out_aimm(s, opc, ext, rd, rn, lo);
}
-
- tcg_out32(s, base | aimm | (rn << 5) | rd);
}
static inline void tcg_out_nop(TCGContext *s)
@@ -1180,13 +1187,21 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
case INDEX_op_add_i64:
ext = 1; /* fall through */
case INDEX_op_add_i32:
- tcg_out_arith(s, ARITH_ADD, ext, args[0], args[1], args[2], 0);
+ if (const_args[2]) {
+ tcg_out_addi(s, ext, args[0], args[1], args[2]);
+ } else {
+ tcg_out_arith(s, ARITH_ADD, ext, args[0], args[1], args[2], 0);
+ }
break;
case INDEX_op_sub_i64:
ext = 1; /* fall through */
case INDEX_op_sub_i32:
- tcg_out_arith(s, ARITH_SUB, ext, args[0], args[1], args[2], 0);
+ if (const_args[2]) {
+ tcg_out_addi(s, ext, args[0], args[1], -args[2]);
+ } else {
+ tcg_out_arith(s, ARITH_SUB, ext, args[0], args[1], args[2], 0);
+ }
break;
case INDEX_op_and_i64:
@@ -1391,10 +1406,10 @@ static const TCGTargetOpDef aarch64_op_defs[] = {
{ INDEX_op_st32_i64, { "r", "r" } },
{ INDEX_op_st_i64, { "r", "r" } },
- { INDEX_op_add_i32, { "r", "r", "r" } },
- { INDEX_op_add_i64, { "r", "r", "r" } },
- { INDEX_op_sub_i32, { "r", "r", "r" } },
- { INDEX_op_sub_i64, { "r", "r", "r" } },
+ { INDEX_op_add_i32, { "r", "r", "rA" } },
+ { INDEX_op_add_i64, { "r", "r", "rA" } },
+ { INDEX_op_sub_i32, { "r", "r", "rA" } },
+ { INDEX_op_sub_i64, { "r", "r", "rA" } },
{ INDEX_op_mul_i32, { "r", "r", "r" } },
{ INDEX_op_mul_i64, { "r", "r", "r" } },
{ INDEX_op_and_i32, { "r", "r", "r" } },
@@ -1518,8 +1533,8 @@ static void tcg_target_qemu_prologue(TCGContext *s)
}
/* make stack space for TCG locals */
- tcg_out_subi(s, 1, TCG_REG_SP, TCG_REG_SP,
- frame_size_tcg_locals * TCG_TARGET_STACK_ALIGN);
+ tcg_out_addi(s, 1, TCG_REG_SP, TCG_REG_SP,
+ -frame_size_tcg_locals * TCG_TARGET_STACK_ALIGN);
/* inform TCG about how to find TCG locals with register, offset, size */
tcg_set_frame(s, TCG_REG_SP, TCG_STATIC_CALL_ARGS_SIZE,
CPU_TEMP_BUF_NLONGS * sizeof(long));
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [RFC 02/14] tcg-aarch64: Allow immediate operands to and, or, xor
2013-08-12 18:44 [Qemu-devel] [RFC 00/14] tcg aarch64 improvements Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 01/14] tcg-aarch64: Allow immediate operands to add and sub Richard Henderson
@ 2013-08-12 18:44 ` Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 03/14] tcg-aarch64: Allow immediate operands to compare Richard Henderson
` (11 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2013-08-12 18:44 UTC (permalink / raw)
To: qemu-devel; +Cc: claudio.fontana, Richard Henderson
It isn't obvious how to have the makefile generate bitmask-table.h,
so check it in along with the generator.
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
tcg/aarch64/bitmask-table.c | 85 +
tcg/aarch64/bitmask-table.h | 5342 +++++++++++++++++++++++++++++++++++++++++++
tcg/aarch64/tcg-target.c | 82 +-
3 files changed, 5500 insertions(+), 9 deletions(-)
create mode 100644 tcg/aarch64/bitmask-table.c
create mode 100644 tcg/aarch64/bitmask-table.h
diff --git a/tcg/aarch64/bitmask-table.c b/tcg/aarch64/bitmask-table.c
new file mode 100644
index 0000000..03a1a52
--- /dev/null
+++ b/tcg/aarch64/bitmask-table.c
@@ -0,0 +1,85 @@
+#include <stdint.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+typedef struct {
+ uint64_t imm;
+ unsigned enc;
+} imm_enc;
+
+static int do_cmp (const void *x1, const void *x2)
+{
+ const imm_enc *i1 = x1;
+ const imm_enc *i2 = x2;
+
+ if (i1->imm < i2->imm)
+ return -1;
+ if (i1->imm > i2->imm)
+ return +1;
+ return 0;
+}
+
+#define N 5334
+static imm_enc bitmasks[N];
+
+int main(void)
+{
+ unsigned int log_e;
+ unsigned int n = 0;
+
+ for (log_e = 1; log_e <= 6; log_e++) {
+ unsigned s, e = 1 << log_e;
+ uint64_t mask = (e == 64 ? 0 : 1ULL << e) - 1;
+ unsigned s_mask = (0x3e << log_e) & 0x3f;
+
+ for (s = 0; s < e - 1; s++) {
+ unsigned r;
+ for (r = 0; r < e; r++) {
+ /* set s+1 consecutive bits to 1 (s < 64) */
+ uint64_t imm = (1ULL << (s + 1)) - 1;
+
+ /* rotate right by r */
+ if (r != 0) {
+ imm = ((imm >> r) | (imm << (e - r))) & mask;
+ }
+
+ /* replicate the constant depending on SIMD size */
+ switch (log_e) {
+ case 1: imm |= (imm << 2);
+ case 2: imm |= (imm << 4);
+ case 3: imm |= (imm << 8);
+ case 4: imm |= (imm << 16);
+ case 5: imm |= (imm << 32);
+ case 6:
+ break;
+ default:
+ abort();
+ }
+ assert (n < N);
+ bitmasks[n].imm = imm;
+ bitmasks[n].enc = (e == 64) << 12 | (r << 6) | s | s_mask;
+ n++;
+ }
+ }
+ }
+ assert (n == N);
+
+ qsort (bitmasks, N, sizeof(bitmasks[0]), do_cmp);
+
+ printf("/* Auto-generated from bitmask-table.c. */\n\n");
+
+ printf("static uint64_t const bitmask_imm[] = {\n");
+ for (n = 0; n < N; n += 2) {
+ printf(" %#018lx, %#018lx,\n", bitmasks[n].imm, bitmasks[n+1].imm);
+ }
+ printf("};\n\n");
+
+ printf("static uint16_t const bitmask_enc[] = {\n");
+ for (n = 0; n < N; n += 2) {
+ printf(" %#06x, %#06x,\n", bitmasks[n].enc, bitmasks[n+1].enc);
+ }
+ printf("};\n\n");
+
+ return 0;
+}
diff --git a/tcg/aarch64/bitmask-table.h b/tcg/aarch64/bitmask-table.h
new file mode 100644
index 0000000..be37002
--- /dev/null
+++ b/tcg/aarch64/bitmask-table.h
@@ -0,0 +1,5342 @@
+/* Auto-generated from bitmask-table.c. */
+
+static uint64_t const bitmask_imm[] = {
+ 0x0000000000000001, 0x0000000000000002,
+ 0x0000000000000003, 0x0000000000000004,
+ 0x0000000000000006, 0x0000000000000007,
+ 0x0000000000000008, 0x000000000000000c,
+ 0x000000000000000e, 0x000000000000000f,
+ 0x0000000000000010, 0x0000000000000018,
+ 0x000000000000001c, 0x000000000000001e,
+ 0x000000000000001f, 0x0000000000000020,
+ 0x0000000000000030, 0x0000000000000038,
+ 0x000000000000003c, 0x000000000000003e,
+ 0x000000000000003f, 0x0000000000000040,
+ 0x0000000000000060, 0x0000000000000070,
+ 0x0000000000000078, 0x000000000000007c,
+ 0x000000000000007e, 0x000000000000007f,
+ 0x0000000000000080, 0x00000000000000c0,
+ 0x00000000000000e0, 0x00000000000000f0,
+ 0x00000000000000f8, 0x00000000000000fc,
+ 0x00000000000000fe, 0x00000000000000ff,
+ 0x0000000000000100, 0x0000000000000180,
+ 0x00000000000001c0, 0x00000000000001e0,
+ 0x00000000000001f0, 0x00000000000001f8,
+ 0x00000000000001fc, 0x00000000000001fe,
+ 0x00000000000001ff, 0x0000000000000200,
+ 0x0000000000000300, 0x0000000000000380,
+ 0x00000000000003c0, 0x00000000000003e0,
+ 0x00000000000003f0, 0x00000000000003f8,
+ 0x00000000000003fc, 0x00000000000003fe,
+ 0x00000000000003ff, 0x0000000000000400,
+ 0x0000000000000600, 0x0000000000000700,
+ 0x0000000000000780, 0x00000000000007c0,
+ 0x00000000000007e0, 0x00000000000007f0,
+ 0x00000000000007f8, 0x00000000000007fc,
+ 0x00000000000007fe, 0x00000000000007ff,
+ 0x0000000000000800, 0x0000000000000c00,
+ 0x0000000000000e00, 0x0000000000000f00,
+ 0x0000000000000f80, 0x0000000000000fc0,
+ 0x0000000000000fe0, 0x0000000000000ff0,
+ 0x0000000000000ff8, 0x0000000000000ffc,
+ 0x0000000000000ffe, 0x0000000000000fff,
+ 0x0000000000001000, 0x0000000000001800,
+ 0x0000000000001c00, 0x0000000000001e00,
+ 0x0000000000001f00, 0x0000000000001f80,
+ 0x0000000000001fc0, 0x0000000000001fe0,
+ 0x0000000000001ff0, 0x0000000000001ff8,
+ 0x0000000000001ffc, 0x0000000000001ffe,
+ 0x0000000000001fff, 0x0000000000002000,
+ 0x0000000000003000, 0x0000000000003800,
+ 0x0000000000003c00, 0x0000000000003e00,
+ 0x0000000000003f00, 0x0000000000003f80,
+ 0x0000000000003fc0, 0x0000000000003fe0,
+ 0x0000000000003ff0, 0x0000000000003ff8,
+ 0x0000000000003ffc, 0x0000000000003ffe,
+ 0x0000000000003fff, 0x0000000000004000,
+ 0x0000000000006000, 0x0000000000007000,
+ 0x0000000000007800, 0x0000000000007c00,
+ 0x0000000000007e00, 0x0000000000007f00,
+ 0x0000000000007f80, 0x0000000000007fc0,
+ 0x0000000000007fe0, 0x0000000000007ff0,
+ 0x0000000000007ff8, 0x0000000000007ffc,
+ 0x0000000000007ffe, 0x0000000000007fff,
+ 0x0000000000008000, 0x000000000000c000,
+ 0x000000000000e000, 0x000000000000f000,
+ 0x000000000000f800, 0x000000000000fc00,
+ 0x000000000000fe00, 0x000000000000ff00,
+ 0x000000000000ff80, 0x000000000000ffc0,
+ 0x000000000000ffe0, 0x000000000000fff0,
+ 0x000000000000fff8, 0x000000000000fffc,
+ 0x000000000000fffe, 0x000000000000ffff,
+ 0x0000000000010000, 0x0000000000018000,
+ 0x000000000001c000, 0x000000000001e000,
+ 0x000000000001f000, 0x000000000001f800,
+ 0x000000000001fc00, 0x000000000001fe00,
+ 0x000000000001ff00, 0x000000000001ff80,
+ 0x000000000001ffc0, 0x000000000001ffe0,
+ 0x000000000001fff0, 0x000000000001fff8,
+ 0x000000000001fffc, 0x000000000001fffe,
+ 0x000000000001ffff, 0x0000000000020000,
+ 0x0000000000030000, 0x0000000000038000,
+ 0x000000000003c000, 0x000000000003e000,
+ 0x000000000003f000, 0x000000000003f800,
+ 0x000000000003fc00, 0x000000000003fe00,
+ 0x000000000003ff00, 0x000000000003ff80,
+ 0x000000000003ffc0, 0x000000000003ffe0,
+ 0x000000000003fff0, 0x000000000003fff8,
+ 0x000000000003fffc, 0x000000000003fffe,
+ 0x000000000003ffff, 0x0000000000040000,
+ 0x0000000000060000, 0x0000000000070000,
+ 0x0000000000078000, 0x000000000007c000,
+ 0x000000000007e000, 0x000000000007f000,
+ 0x000000000007f800, 0x000000000007fc00,
+ 0x000000000007fe00, 0x000000000007ff00,
+ 0x000000000007ff80, 0x000000000007ffc0,
+ 0x000000000007ffe0, 0x000000000007fff0,
+ 0x000000000007fff8, 0x000000000007fffc,
+ 0x000000000007fffe, 0x000000000007ffff,
+ 0x0000000000080000, 0x00000000000c0000,
+ 0x00000000000e0000, 0x00000000000f0000,
+ 0x00000000000f8000, 0x00000000000fc000,
+ 0x00000000000fe000, 0x00000000000ff000,
+ 0x00000000000ff800, 0x00000000000ffc00,
+ 0x00000000000ffe00, 0x00000000000fff00,
+ 0x00000000000fff80, 0x00000000000fffc0,
+ 0x00000000000fffe0, 0x00000000000ffff0,
+ 0x00000000000ffff8, 0x00000000000ffffc,
+ 0x00000000000ffffe, 0x00000000000fffff,
+ 0x0000000000100000, 0x0000000000180000,
+ 0x00000000001c0000, 0x00000000001e0000,
+ 0x00000000001f0000, 0x00000000001f8000,
+ 0x00000000001fc000, 0x00000000001fe000,
+ 0x00000000001ff000, 0x00000000001ff800,
+ 0x00000000001ffc00, 0x00000000001ffe00,
+ 0x00000000001fff00, 0x00000000001fff80,
+ 0x00000000001fffc0, 0x00000000001fffe0,
+ 0x00000000001ffff0, 0x00000000001ffff8,
+ 0x00000000001ffffc, 0x00000000001ffffe,
+ 0x00000000001fffff, 0x0000000000200000,
+ 0x0000000000300000, 0x0000000000380000,
+ 0x00000000003c0000, 0x00000000003e0000,
+ 0x00000000003f0000, 0x00000000003f8000,
+ 0x00000000003fc000, 0x00000000003fe000,
+ 0x00000000003ff000, 0x00000000003ff800,
+ 0x00000000003ffc00, 0x00000000003ffe00,
+ 0x00000000003fff00, 0x00000000003fff80,
+ 0x00000000003fffc0, 0x00000000003fffe0,
+ 0x00000000003ffff0, 0x00000000003ffff8,
+ 0x00000000003ffffc, 0x00000000003ffffe,
+ 0x00000000003fffff, 0x0000000000400000,
+ 0x0000000000600000, 0x0000000000700000,
+ 0x0000000000780000, 0x00000000007c0000,
+ 0x00000000007e0000, 0x00000000007f0000,
+ 0x00000000007f8000, 0x00000000007fc000,
+ 0x00000000007fe000, 0x00000000007ff000,
+ 0x00000000007ff800, 0x00000000007ffc00,
+ 0x00000000007ffe00, 0x00000000007fff00,
+ 0x00000000007fff80, 0x00000000007fffc0,
+ 0x00000000007fffe0, 0x00000000007ffff0,
+ 0x00000000007ffff8, 0x00000000007ffffc,
+ 0x00000000007ffffe, 0x00000000007fffff,
+ 0x0000000000800000, 0x0000000000c00000,
+ 0x0000000000e00000, 0x0000000000f00000,
+ 0x0000000000f80000, 0x0000000000fc0000,
+ 0x0000000000fe0000, 0x0000000000ff0000,
+ 0x0000000000ff8000, 0x0000000000ffc000,
+ 0x0000000000ffe000, 0x0000000000fff000,
+ 0x0000000000fff800, 0x0000000000fffc00,
+ 0x0000000000fffe00, 0x0000000000ffff00,
+ 0x0000000000ffff80, 0x0000000000ffffc0,
+ 0x0000000000ffffe0, 0x0000000000fffff0,
+ 0x0000000000fffff8, 0x0000000000fffffc,
+ 0x0000000000fffffe, 0x0000000000ffffff,
+ 0x0000000001000000, 0x0000000001800000,
+ 0x0000000001c00000, 0x0000000001e00000,
+ 0x0000000001f00000, 0x0000000001f80000,
+ 0x0000000001fc0000, 0x0000000001fe0000,
+ 0x0000000001ff0000, 0x0000000001ff8000,
+ 0x0000000001ffc000, 0x0000000001ffe000,
+ 0x0000000001fff000, 0x0000000001fff800,
+ 0x0000000001fffc00, 0x0000000001fffe00,
+ 0x0000000001ffff00, 0x0000000001ffff80,
+ 0x0000000001ffffc0, 0x0000000001ffffe0,
+ 0x0000000001fffff0, 0x0000000001fffff8,
+ 0x0000000001fffffc, 0x0000000001fffffe,
+ 0x0000000001ffffff, 0x0000000002000000,
+ 0x0000000003000000, 0x0000000003800000,
+ 0x0000000003c00000, 0x0000000003e00000,
+ 0x0000000003f00000, 0x0000000003f80000,
+ 0x0000000003fc0000, 0x0000000003fe0000,
+ 0x0000000003ff0000, 0x0000000003ff8000,
+ 0x0000000003ffc000, 0x0000000003ffe000,
+ 0x0000000003fff000, 0x0000000003fff800,
+ 0x0000000003fffc00, 0x0000000003fffe00,
+ 0x0000000003ffff00, 0x0000000003ffff80,
+ 0x0000000003ffffc0, 0x0000000003ffffe0,
+ 0x0000000003fffff0, 0x0000000003fffff8,
+ 0x0000000003fffffc, 0x0000000003fffffe,
+ 0x0000000003ffffff, 0x0000000004000000,
+ 0x0000000006000000, 0x0000000007000000,
+ 0x0000000007800000, 0x0000000007c00000,
+ 0x0000000007e00000, 0x0000000007f00000,
+ 0x0000000007f80000, 0x0000000007fc0000,
+ 0x0000000007fe0000, 0x0000000007ff0000,
+ 0x0000000007ff8000, 0x0000000007ffc000,
+ 0x0000000007ffe000, 0x0000000007fff000,
+ 0x0000000007fff800, 0x0000000007fffc00,
+ 0x0000000007fffe00, 0x0000000007ffff00,
+ 0x0000000007ffff80, 0x0000000007ffffc0,
+ 0x0000000007ffffe0, 0x0000000007fffff0,
+ 0x0000000007fffff8, 0x0000000007fffffc,
+ 0x0000000007fffffe, 0x0000000007ffffff,
+ 0x0000000008000000, 0x000000000c000000,
+ 0x000000000e000000, 0x000000000f000000,
+ 0x000000000f800000, 0x000000000fc00000,
+ 0x000000000fe00000, 0x000000000ff00000,
+ 0x000000000ff80000, 0x000000000ffc0000,
+ 0x000000000ffe0000, 0x000000000fff0000,
+ 0x000000000fff8000, 0x000000000fffc000,
+ 0x000000000fffe000, 0x000000000ffff000,
+ 0x000000000ffff800, 0x000000000ffffc00,
+ 0x000000000ffffe00, 0x000000000fffff00,
+ 0x000000000fffff80, 0x000000000fffffc0,
+ 0x000000000fffffe0, 0x000000000ffffff0,
+ 0x000000000ffffff8, 0x000000000ffffffc,
+ 0x000000000ffffffe, 0x000000000fffffff,
+ 0x0000000010000000, 0x0000000018000000,
+ 0x000000001c000000, 0x000000001e000000,
+ 0x000000001f000000, 0x000000001f800000,
+ 0x000000001fc00000, 0x000000001fe00000,
+ 0x000000001ff00000, 0x000000001ff80000,
+ 0x000000001ffc0000, 0x000000001ffe0000,
+ 0x000000001fff0000, 0x000000001fff8000,
+ 0x000000001fffc000, 0x000000001fffe000,
+ 0x000000001ffff000, 0x000000001ffff800,
+ 0x000000001ffffc00, 0x000000001ffffe00,
+ 0x000000001fffff00, 0x000000001fffff80,
+ 0x000000001fffffc0, 0x000000001fffffe0,
+ 0x000000001ffffff0, 0x000000001ffffff8,
+ 0x000000001ffffffc, 0x000000001ffffffe,
+ 0x000000001fffffff, 0x0000000020000000,
+ 0x0000000030000000, 0x0000000038000000,
+ 0x000000003c000000, 0x000000003e000000,
+ 0x000000003f000000, 0x000000003f800000,
+ 0x000000003fc00000, 0x000000003fe00000,
+ 0x000000003ff00000, 0x000000003ff80000,
+ 0x000000003ffc0000, 0x000000003ffe0000,
+ 0x000000003fff0000, 0x000000003fff8000,
+ 0x000000003fffc000, 0x000000003fffe000,
+ 0x000000003ffff000, 0x000000003ffff800,
+ 0x000000003ffffc00, 0x000000003ffffe00,
+ 0x000000003fffff00, 0x000000003fffff80,
+ 0x000000003fffffc0, 0x000000003fffffe0,
+ 0x000000003ffffff0, 0x000000003ffffff8,
+ 0x000000003ffffffc, 0x000000003ffffffe,
+ 0x000000003fffffff, 0x0000000040000000,
+ 0x0000000060000000, 0x0000000070000000,
+ 0x0000000078000000, 0x000000007c000000,
+ 0x000000007e000000, 0x000000007f000000,
+ 0x000000007f800000, 0x000000007fc00000,
+ 0x000000007fe00000, 0x000000007ff00000,
+ 0x000000007ff80000, 0x000000007ffc0000,
+ 0x000000007ffe0000, 0x000000007fff0000,
+ 0x000000007fff8000, 0x000000007fffc000,
+ 0x000000007fffe000, 0x000000007ffff000,
+ 0x000000007ffff800, 0x000000007ffffc00,
+ 0x000000007ffffe00, 0x000000007fffff00,
+ 0x000000007fffff80, 0x000000007fffffc0,
+ 0x000000007fffffe0, 0x000000007ffffff0,
+ 0x000000007ffffff8, 0x000000007ffffffc,
+ 0x000000007ffffffe, 0x000000007fffffff,
+ 0x0000000080000000, 0x00000000c0000000,
+ 0x00000000e0000000, 0x00000000f0000000,
+ 0x00000000f8000000, 0x00000000fc000000,
+ 0x00000000fe000000, 0x00000000ff000000,
+ 0x00000000ff800000, 0x00000000ffc00000,
+ 0x00000000ffe00000, 0x00000000fff00000,
+ 0x00000000fff80000, 0x00000000fffc0000,
+ 0x00000000fffe0000, 0x00000000ffff0000,
+ 0x00000000ffff8000, 0x00000000ffffc000,
+ 0x00000000ffffe000, 0x00000000fffff000,
+ 0x00000000fffff800, 0x00000000fffffc00,
+ 0x00000000fffffe00, 0x00000000ffffff00,
+ 0x00000000ffffff80, 0x00000000ffffffc0,
+ 0x00000000ffffffe0, 0x00000000fffffff0,
+ 0x00000000fffffff8, 0x00000000fffffffc,
+ 0x00000000fffffffe, 0x00000000ffffffff,
+ 0x0000000100000000, 0x0000000100000001,
+ 0x0000000180000000, 0x00000001c0000000,
+ 0x00000001e0000000, 0x00000001f0000000,
+ 0x00000001f8000000, 0x00000001fc000000,
+ 0x00000001fe000000, 0x00000001ff000000,
+ 0x00000001ff800000, 0x00000001ffc00000,
+ 0x00000001ffe00000, 0x00000001fff00000,
+ 0x00000001fff80000, 0x00000001fffc0000,
+ 0x00000001fffe0000, 0x00000001ffff0000,
+ 0x00000001ffff8000, 0x00000001ffffc000,
+ 0x00000001ffffe000, 0x00000001fffff000,
+ 0x00000001fffff800, 0x00000001fffffc00,
+ 0x00000001fffffe00, 0x00000001ffffff00,
+ 0x00000001ffffff80, 0x00000001ffffffc0,
+ 0x00000001ffffffe0, 0x00000001fffffff0,
+ 0x00000001fffffff8, 0x00000001fffffffc,
+ 0x00000001fffffffe, 0x00000001ffffffff,
+ 0x0000000200000000, 0x0000000200000002,
+ 0x0000000300000000, 0x0000000300000003,
+ 0x0000000380000000, 0x00000003c0000000,
+ 0x00000003e0000000, 0x00000003f0000000,
+ 0x00000003f8000000, 0x00000003fc000000,
+ 0x00000003fe000000, 0x00000003ff000000,
+ 0x00000003ff800000, 0x00000003ffc00000,
+ 0x00000003ffe00000, 0x00000003fff00000,
+ 0x00000003fff80000, 0x00000003fffc0000,
+ 0x00000003fffe0000, 0x00000003ffff0000,
+ 0x00000003ffff8000, 0x00000003ffffc000,
+ 0x00000003ffffe000, 0x00000003fffff000,
+ 0x00000003fffff800, 0x00000003fffffc00,
+ 0x00000003fffffe00, 0x00000003ffffff00,
+ 0x00000003ffffff80, 0x00000003ffffffc0,
+ 0x00000003ffffffe0, 0x00000003fffffff0,
+ 0x00000003fffffff8, 0x00000003fffffffc,
+ 0x00000003fffffffe, 0x00000003ffffffff,
+ 0x0000000400000000, 0x0000000400000004,
+ 0x0000000600000000, 0x0000000600000006,
+ 0x0000000700000000, 0x0000000700000007,
+ 0x0000000780000000, 0x00000007c0000000,
+ 0x00000007e0000000, 0x00000007f0000000,
+ 0x00000007f8000000, 0x00000007fc000000,
+ 0x00000007fe000000, 0x00000007ff000000,
+ 0x00000007ff800000, 0x00000007ffc00000,
+ 0x00000007ffe00000, 0x00000007fff00000,
+ 0x00000007fff80000, 0x00000007fffc0000,
+ 0x00000007fffe0000, 0x00000007ffff0000,
+ 0x00000007ffff8000, 0x00000007ffffc000,
+ 0x00000007ffffe000, 0x00000007fffff000,
+ 0x00000007fffff800, 0x00000007fffffc00,
+ 0x00000007fffffe00, 0x00000007ffffff00,
+ 0x00000007ffffff80, 0x00000007ffffffc0,
+ 0x00000007ffffffe0, 0x00000007fffffff0,
+ 0x00000007fffffff8, 0x00000007fffffffc,
+ 0x00000007fffffffe, 0x00000007ffffffff,
+ 0x0000000800000000, 0x0000000800000008,
+ 0x0000000c00000000, 0x0000000c0000000c,
+ 0x0000000e00000000, 0x0000000e0000000e,
+ 0x0000000f00000000, 0x0000000f0000000f,
+ 0x0000000f80000000, 0x0000000fc0000000,
+ 0x0000000fe0000000, 0x0000000ff0000000,
+ 0x0000000ff8000000, 0x0000000ffc000000,
+ 0x0000000ffe000000, 0x0000000fff000000,
+ 0x0000000fff800000, 0x0000000fffc00000,
+ 0x0000000fffe00000, 0x0000000ffff00000,
+ 0x0000000ffff80000, 0x0000000ffffc0000,
+ 0x0000000ffffe0000, 0x0000000fffff0000,
+ 0x0000000fffff8000, 0x0000000fffffc000,
+ 0x0000000fffffe000, 0x0000000ffffff000,
+ 0x0000000ffffff800, 0x0000000ffffffc00,
+ 0x0000000ffffffe00, 0x0000000fffffff00,
+ 0x0000000fffffff80, 0x0000000fffffffc0,
+ 0x0000000fffffffe0, 0x0000000ffffffff0,
+ 0x0000000ffffffff8, 0x0000000ffffffffc,
+ 0x0000000ffffffffe, 0x0000000fffffffff,
+ 0x0000001000000000, 0x0000001000000010,
+ 0x0000001800000000, 0x0000001800000018,
+ 0x0000001c00000000, 0x0000001c0000001c,
+ 0x0000001e00000000, 0x0000001e0000001e,
+ 0x0000001f00000000, 0x0000001f0000001f,
+ 0x0000001f80000000, 0x0000001fc0000000,
+ 0x0000001fe0000000, 0x0000001ff0000000,
+ 0x0000001ff8000000, 0x0000001ffc000000,
+ 0x0000001ffe000000, 0x0000001fff000000,
+ 0x0000001fff800000, 0x0000001fffc00000,
+ 0x0000001fffe00000, 0x0000001ffff00000,
+ 0x0000001ffff80000, 0x0000001ffffc0000,
+ 0x0000001ffffe0000, 0x0000001fffff0000,
+ 0x0000001fffff8000, 0x0000001fffffc000,
+ 0x0000001fffffe000, 0x0000001ffffff000,
+ 0x0000001ffffff800, 0x0000001ffffffc00,
+ 0x0000001ffffffe00, 0x0000001fffffff00,
+ 0x0000001fffffff80, 0x0000001fffffffc0,
+ 0x0000001fffffffe0, 0x0000001ffffffff0,
+ 0x0000001ffffffff8, 0x0000001ffffffffc,
+ 0x0000001ffffffffe, 0x0000001fffffffff,
+ 0x0000002000000000, 0x0000002000000020,
+ 0x0000003000000000, 0x0000003000000030,
+ 0x0000003800000000, 0x0000003800000038,
+ 0x0000003c00000000, 0x0000003c0000003c,
+ 0x0000003e00000000, 0x0000003e0000003e,
+ 0x0000003f00000000, 0x0000003f0000003f,
+ 0x0000003f80000000, 0x0000003fc0000000,
+ 0x0000003fe0000000, 0x0000003ff0000000,
+ 0x0000003ff8000000, 0x0000003ffc000000,
+ 0x0000003ffe000000, 0x0000003fff000000,
+ 0x0000003fff800000, 0x0000003fffc00000,
+ 0x0000003fffe00000, 0x0000003ffff00000,
+ 0x0000003ffff80000, 0x0000003ffffc0000,
+ 0x0000003ffffe0000, 0x0000003fffff0000,
+ 0x0000003fffff8000, 0x0000003fffffc000,
+ 0x0000003fffffe000, 0x0000003ffffff000,
+ 0x0000003ffffff800, 0x0000003ffffffc00,
+ 0x0000003ffffffe00, 0x0000003fffffff00,
+ 0x0000003fffffff80, 0x0000003fffffffc0,
+ 0x0000003fffffffe0, 0x0000003ffffffff0,
+ 0x0000003ffffffff8, 0x0000003ffffffffc,
+ 0x0000003ffffffffe, 0x0000003fffffffff,
+ 0x0000004000000000, 0x0000004000000040,
+ 0x0000006000000000, 0x0000006000000060,
+ 0x0000007000000000, 0x0000007000000070,
+ 0x0000007800000000, 0x0000007800000078,
+ 0x0000007c00000000, 0x0000007c0000007c,
+ 0x0000007e00000000, 0x0000007e0000007e,
+ 0x0000007f00000000, 0x0000007f0000007f,
+ 0x0000007f80000000, 0x0000007fc0000000,
+ 0x0000007fe0000000, 0x0000007ff0000000,
+ 0x0000007ff8000000, 0x0000007ffc000000,
+ 0x0000007ffe000000, 0x0000007fff000000,
+ 0x0000007fff800000, 0x0000007fffc00000,
+ 0x0000007fffe00000, 0x0000007ffff00000,
+ 0x0000007ffff80000, 0x0000007ffffc0000,
+ 0x0000007ffffe0000, 0x0000007fffff0000,
+ 0x0000007fffff8000, 0x0000007fffffc000,
+ 0x0000007fffffe000, 0x0000007ffffff000,
+ 0x0000007ffffff800, 0x0000007ffffffc00,
+ 0x0000007ffffffe00, 0x0000007fffffff00,
+ 0x0000007fffffff80, 0x0000007fffffffc0,
+ 0x0000007fffffffe0, 0x0000007ffffffff0,
+ 0x0000007ffffffff8, 0x0000007ffffffffc,
+ 0x0000007ffffffffe, 0x0000007fffffffff,
+ 0x0000008000000000, 0x0000008000000080,
+ 0x000000c000000000, 0x000000c0000000c0,
+ 0x000000e000000000, 0x000000e0000000e0,
+ 0x000000f000000000, 0x000000f0000000f0,
+ 0x000000f800000000, 0x000000f8000000f8,
+ 0x000000fc00000000, 0x000000fc000000fc,
+ 0x000000fe00000000, 0x000000fe000000fe,
+ 0x000000ff00000000, 0x000000ff000000ff,
+ 0x000000ff80000000, 0x000000ffc0000000,
+ 0x000000ffe0000000, 0x000000fff0000000,
+ 0x000000fff8000000, 0x000000fffc000000,
+ 0x000000fffe000000, 0x000000ffff000000,
+ 0x000000ffff800000, 0x000000ffffc00000,
+ 0x000000ffffe00000, 0x000000fffff00000,
+ 0x000000fffff80000, 0x000000fffffc0000,
+ 0x000000fffffe0000, 0x000000ffffff0000,
+ 0x000000ffffff8000, 0x000000ffffffc000,
+ 0x000000ffffffe000, 0x000000fffffff000,
+ 0x000000fffffff800, 0x000000fffffffc00,
+ 0x000000fffffffe00, 0x000000ffffffff00,
+ 0x000000ffffffff80, 0x000000ffffffffc0,
+ 0x000000ffffffffe0, 0x000000fffffffff0,
+ 0x000000fffffffff8, 0x000000fffffffffc,
+ 0x000000fffffffffe, 0x000000ffffffffff,
+ 0x0000010000000000, 0x0000010000000100,
+ 0x0000018000000000, 0x0000018000000180,
+ 0x000001c000000000, 0x000001c0000001c0,
+ 0x000001e000000000, 0x000001e0000001e0,
+ 0x000001f000000000, 0x000001f0000001f0,
+ 0x000001f800000000, 0x000001f8000001f8,
+ 0x000001fc00000000, 0x000001fc000001fc,
+ 0x000001fe00000000, 0x000001fe000001fe,
+ 0x000001ff00000000, 0x000001ff000001ff,
+ 0x000001ff80000000, 0x000001ffc0000000,
+ 0x000001ffe0000000, 0x000001fff0000000,
+ 0x000001fff8000000, 0x000001fffc000000,
+ 0x000001fffe000000, 0x000001ffff000000,
+ 0x000001ffff800000, 0x000001ffffc00000,
+ 0x000001ffffe00000, 0x000001fffff00000,
+ 0x000001fffff80000, 0x000001fffffc0000,
+ 0x000001fffffe0000, 0x000001ffffff0000,
+ 0x000001ffffff8000, 0x000001ffffffc000,
+ 0x000001ffffffe000, 0x000001fffffff000,
+ 0x000001fffffff800, 0x000001fffffffc00,
+ 0x000001fffffffe00, 0x000001ffffffff00,
+ 0x000001ffffffff80, 0x000001ffffffffc0,
+ 0x000001ffffffffe0, 0x000001fffffffff0,
+ 0x000001fffffffff8, 0x000001fffffffffc,
+ 0x000001fffffffffe, 0x000001ffffffffff,
+ 0x0000020000000000, 0x0000020000000200,
+ 0x0000030000000000, 0x0000030000000300,
+ 0x0000038000000000, 0x0000038000000380,
+ 0x000003c000000000, 0x000003c0000003c0,
+ 0x000003e000000000, 0x000003e0000003e0,
+ 0x000003f000000000, 0x000003f0000003f0,
+ 0x000003f800000000, 0x000003f8000003f8,
+ 0x000003fc00000000, 0x000003fc000003fc,
+ 0x000003fe00000000, 0x000003fe000003fe,
+ 0x000003ff00000000, 0x000003ff000003ff,
+ 0x000003ff80000000, 0x000003ffc0000000,
+ 0x000003ffe0000000, 0x000003fff0000000,
+ 0x000003fff8000000, 0x000003fffc000000,
+ 0x000003fffe000000, 0x000003ffff000000,
+ 0x000003ffff800000, 0x000003ffffc00000,
+ 0x000003ffffe00000, 0x000003fffff00000,
+ 0x000003fffff80000, 0x000003fffffc0000,
+ 0x000003fffffe0000, 0x000003ffffff0000,
+ 0x000003ffffff8000, 0x000003ffffffc000,
+ 0x000003ffffffe000, 0x000003fffffff000,
+ 0x000003fffffff800, 0x000003fffffffc00,
+ 0x000003fffffffe00, 0x000003ffffffff00,
+ 0x000003ffffffff80, 0x000003ffffffffc0,
+ 0x000003ffffffffe0, 0x000003fffffffff0,
+ 0x000003fffffffff8, 0x000003fffffffffc,
+ 0x000003fffffffffe, 0x000003ffffffffff,
+ 0x0000040000000000, 0x0000040000000400,
+ 0x0000060000000000, 0x0000060000000600,
+ 0x0000070000000000, 0x0000070000000700,
+ 0x0000078000000000, 0x0000078000000780,
+ 0x000007c000000000, 0x000007c0000007c0,
+ 0x000007e000000000, 0x000007e0000007e0,
+ 0x000007f000000000, 0x000007f0000007f0,
+ 0x000007f800000000, 0x000007f8000007f8,
+ 0x000007fc00000000, 0x000007fc000007fc,
+ 0x000007fe00000000, 0x000007fe000007fe,
+ 0x000007ff00000000, 0x000007ff000007ff,
+ 0x000007ff80000000, 0x000007ffc0000000,
+ 0x000007ffe0000000, 0x000007fff0000000,
+ 0x000007fff8000000, 0x000007fffc000000,
+ 0x000007fffe000000, 0x000007ffff000000,
+ 0x000007ffff800000, 0x000007ffffc00000,
+ 0x000007ffffe00000, 0x000007fffff00000,
+ 0x000007fffff80000, 0x000007fffffc0000,
+ 0x000007fffffe0000, 0x000007ffffff0000,
+ 0x000007ffffff8000, 0x000007ffffffc000,
+ 0x000007ffffffe000, 0x000007fffffff000,
+ 0x000007fffffff800, 0x000007fffffffc00,
+ 0x000007fffffffe00, 0x000007ffffffff00,
+ 0x000007ffffffff80, 0x000007ffffffffc0,
+ 0x000007ffffffffe0, 0x000007fffffffff0,
+ 0x000007fffffffff8, 0x000007fffffffffc,
+ 0x000007fffffffffe, 0x000007ffffffffff,
+ 0x0000080000000000, 0x0000080000000800,
+ 0x00000c0000000000, 0x00000c0000000c00,
+ 0x00000e0000000000, 0x00000e0000000e00,
+ 0x00000f0000000000, 0x00000f0000000f00,
+ 0x00000f8000000000, 0x00000f8000000f80,
+ 0x00000fc000000000, 0x00000fc000000fc0,
+ 0x00000fe000000000, 0x00000fe000000fe0,
+ 0x00000ff000000000, 0x00000ff000000ff0,
+ 0x00000ff800000000, 0x00000ff800000ff8,
+ 0x00000ffc00000000, 0x00000ffc00000ffc,
+ 0x00000ffe00000000, 0x00000ffe00000ffe,
+ 0x00000fff00000000, 0x00000fff00000fff,
+ 0x00000fff80000000, 0x00000fffc0000000,
+ 0x00000fffe0000000, 0x00000ffff0000000,
+ 0x00000ffff8000000, 0x00000ffffc000000,
+ 0x00000ffffe000000, 0x00000fffff000000,
+ 0x00000fffff800000, 0x00000fffffc00000,
+ 0x00000fffffe00000, 0x00000ffffff00000,
+ 0x00000ffffff80000, 0x00000ffffffc0000,
+ 0x00000ffffffe0000, 0x00000fffffff0000,
+ 0x00000fffffff8000, 0x00000fffffffc000,
+ 0x00000fffffffe000, 0x00000ffffffff000,
+ 0x00000ffffffff800, 0x00000ffffffffc00,
+ 0x00000ffffffffe00, 0x00000fffffffff00,
+ 0x00000fffffffff80, 0x00000fffffffffc0,
+ 0x00000fffffffffe0, 0x00000ffffffffff0,
+ 0x00000ffffffffff8, 0x00000ffffffffffc,
+ 0x00000ffffffffffe, 0x00000fffffffffff,
+ 0x0000100000000000, 0x0000100000001000,
+ 0x0000180000000000, 0x0000180000001800,
+ 0x00001c0000000000, 0x00001c0000001c00,
+ 0x00001e0000000000, 0x00001e0000001e00,
+ 0x00001f0000000000, 0x00001f0000001f00,
+ 0x00001f8000000000, 0x00001f8000001f80,
+ 0x00001fc000000000, 0x00001fc000001fc0,
+ 0x00001fe000000000, 0x00001fe000001fe0,
+ 0x00001ff000000000, 0x00001ff000001ff0,
+ 0x00001ff800000000, 0x00001ff800001ff8,
+ 0x00001ffc00000000, 0x00001ffc00001ffc,
+ 0x00001ffe00000000, 0x00001ffe00001ffe,
+ 0x00001fff00000000, 0x00001fff00001fff,
+ 0x00001fff80000000, 0x00001fffc0000000,
+ 0x00001fffe0000000, 0x00001ffff0000000,
+ 0x00001ffff8000000, 0x00001ffffc000000,
+ 0x00001ffffe000000, 0x00001fffff000000,
+ 0x00001fffff800000, 0x00001fffffc00000,
+ 0x00001fffffe00000, 0x00001ffffff00000,
+ 0x00001ffffff80000, 0x00001ffffffc0000,
+ 0x00001ffffffe0000, 0x00001fffffff0000,
+ 0x00001fffffff8000, 0x00001fffffffc000,
+ 0x00001fffffffe000, 0x00001ffffffff000,
+ 0x00001ffffffff800, 0x00001ffffffffc00,
+ 0x00001ffffffffe00, 0x00001fffffffff00,
+ 0x00001fffffffff80, 0x00001fffffffffc0,
+ 0x00001fffffffffe0, 0x00001ffffffffff0,
+ 0x00001ffffffffff8, 0x00001ffffffffffc,
+ 0x00001ffffffffffe, 0x00001fffffffffff,
+ 0x0000200000000000, 0x0000200000002000,
+ 0x0000300000000000, 0x0000300000003000,
+ 0x0000380000000000, 0x0000380000003800,
+ 0x00003c0000000000, 0x00003c0000003c00,
+ 0x00003e0000000000, 0x00003e0000003e00,
+ 0x00003f0000000000, 0x00003f0000003f00,
+ 0x00003f8000000000, 0x00003f8000003f80,
+ 0x00003fc000000000, 0x00003fc000003fc0,
+ 0x00003fe000000000, 0x00003fe000003fe0,
+ 0x00003ff000000000, 0x00003ff000003ff0,
+ 0x00003ff800000000, 0x00003ff800003ff8,
+ 0x00003ffc00000000, 0x00003ffc00003ffc,
+ 0x00003ffe00000000, 0x00003ffe00003ffe,
+ 0x00003fff00000000, 0x00003fff00003fff,
+ 0x00003fff80000000, 0x00003fffc0000000,
+ 0x00003fffe0000000, 0x00003ffff0000000,
+ 0x00003ffff8000000, 0x00003ffffc000000,
+ 0x00003ffffe000000, 0x00003fffff000000,
+ 0x00003fffff800000, 0x00003fffffc00000,
+ 0x00003fffffe00000, 0x00003ffffff00000,
+ 0x00003ffffff80000, 0x00003ffffffc0000,
+ 0x00003ffffffe0000, 0x00003fffffff0000,
+ 0x00003fffffff8000, 0x00003fffffffc000,
+ 0x00003fffffffe000, 0x00003ffffffff000,
+ 0x00003ffffffff800, 0x00003ffffffffc00,
+ 0x00003ffffffffe00, 0x00003fffffffff00,
+ 0x00003fffffffff80, 0x00003fffffffffc0,
+ 0x00003fffffffffe0, 0x00003ffffffffff0,
+ 0x00003ffffffffff8, 0x00003ffffffffffc,
+ 0x00003ffffffffffe, 0x00003fffffffffff,
+ 0x0000400000000000, 0x0000400000004000,
+ 0x0000600000000000, 0x0000600000006000,
+ 0x0000700000000000, 0x0000700000007000,
+ 0x0000780000000000, 0x0000780000007800,
+ 0x00007c0000000000, 0x00007c0000007c00,
+ 0x00007e0000000000, 0x00007e0000007e00,
+ 0x00007f0000000000, 0x00007f0000007f00,
+ 0x00007f8000000000, 0x00007f8000007f80,
+ 0x00007fc000000000, 0x00007fc000007fc0,
+ 0x00007fe000000000, 0x00007fe000007fe0,
+ 0x00007ff000000000, 0x00007ff000007ff0,
+ 0x00007ff800000000, 0x00007ff800007ff8,
+ 0x00007ffc00000000, 0x00007ffc00007ffc,
+ 0x00007ffe00000000, 0x00007ffe00007ffe,
+ 0x00007fff00000000, 0x00007fff00007fff,
+ 0x00007fff80000000, 0x00007fffc0000000,
+ 0x00007fffe0000000, 0x00007ffff0000000,
+ 0x00007ffff8000000, 0x00007ffffc000000,
+ 0x00007ffffe000000, 0x00007fffff000000,
+ 0x00007fffff800000, 0x00007fffffc00000,
+ 0x00007fffffe00000, 0x00007ffffff00000,
+ 0x00007ffffff80000, 0x00007ffffffc0000,
+ 0x00007ffffffe0000, 0x00007fffffff0000,
+ 0x00007fffffff8000, 0x00007fffffffc000,
+ 0x00007fffffffe000, 0x00007ffffffff000,
+ 0x00007ffffffff800, 0x00007ffffffffc00,
+ 0x00007ffffffffe00, 0x00007fffffffff00,
+ 0x00007fffffffff80, 0x00007fffffffffc0,
+ 0x00007fffffffffe0, 0x00007ffffffffff0,
+ 0x00007ffffffffff8, 0x00007ffffffffffc,
+ 0x00007ffffffffffe, 0x00007fffffffffff,
+ 0x0000800000000000, 0x0000800000008000,
+ 0x0000c00000000000, 0x0000c0000000c000,
+ 0x0000e00000000000, 0x0000e0000000e000,
+ 0x0000f00000000000, 0x0000f0000000f000,
+ 0x0000f80000000000, 0x0000f8000000f800,
+ 0x0000fc0000000000, 0x0000fc000000fc00,
+ 0x0000fe0000000000, 0x0000fe000000fe00,
+ 0x0000ff0000000000, 0x0000ff000000ff00,
+ 0x0000ff8000000000, 0x0000ff800000ff80,
+ 0x0000ffc000000000, 0x0000ffc00000ffc0,
+ 0x0000ffe000000000, 0x0000ffe00000ffe0,
+ 0x0000fff000000000, 0x0000fff00000fff0,
+ 0x0000fff800000000, 0x0000fff80000fff8,
+ 0x0000fffc00000000, 0x0000fffc0000fffc,
+ 0x0000fffe00000000, 0x0000fffe0000fffe,
+ 0x0000ffff00000000, 0x0000ffff0000ffff,
+ 0x0000ffff80000000, 0x0000ffffc0000000,
+ 0x0000ffffe0000000, 0x0000fffff0000000,
+ 0x0000fffff8000000, 0x0000fffffc000000,
+ 0x0000fffffe000000, 0x0000ffffff000000,
+ 0x0000ffffff800000, 0x0000ffffffc00000,
+ 0x0000ffffffe00000, 0x0000fffffff00000,
+ 0x0000fffffff80000, 0x0000fffffffc0000,
+ 0x0000fffffffe0000, 0x0000ffffffff0000,
+ 0x0000ffffffff8000, 0x0000ffffffffc000,
+ 0x0000ffffffffe000, 0x0000fffffffff000,
+ 0x0000fffffffff800, 0x0000fffffffffc00,
+ 0x0000fffffffffe00, 0x0000ffffffffff00,
+ 0x0000ffffffffff80, 0x0000ffffffffffc0,
+ 0x0000ffffffffffe0, 0x0000fffffffffff0,
+ 0x0000fffffffffff8, 0x0000fffffffffffc,
+ 0x0000fffffffffffe, 0x0000ffffffffffff,
+ 0x0001000000000000, 0x0001000000010000,
+ 0x0001000100010001, 0x0001800000000000,
+ 0x0001800000018000, 0x0001c00000000000,
+ 0x0001c0000001c000, 0x0001e00000000000,
+ 0x0001e0000001e000, 0x0001f00000000000,
+ 0x0001f0000001f000, 0x0001f80000000000,
+ 0x0001f8000001f800, 0x0001fc0000000000,
+ 0x0001fc000001fc00, 0x0001fe0000000000,
+ 0x0001fe000001fe00, 0x0001ff0000000000,
+ 0x0001ff000001ff00, 0x0001ff8000000000,
+ 0x0001ff800001ff80, 0x0001ffc000000000,
+ 0x0001ffc00001ffc0, 0x0001ffe000000000,
+ 0x0001ffe00001ffe0, 0x0001fff000000000,
+ 0x0001fff00001fff0, 0x0001fff800000000,
+ 0x0001fff80001fff8, 0x0001fffc00000000,
+ 0x0001fffc0001fffc, 0x0001fffe00000000,
+ 0x0001fffe0001fffe, 0x0001ffff00000000,
+ 0x0001ffff0001ffff, 0x0001ffff80000000,
+ 0x0001ffffc0000000, 0x0001ffffe0000000,
+ 0x0001fffff0000000, 0x0001fffff8000000,
+ 0x0001fffffc000000, 0x0001fffffe000000,
+ 0x0001ffffff000000, 0x0001ffffff800000,
+ 0x0001ffffffc00000, 0x0001ffffffe00000,
+ 0x0001fffffff00000, 0x0001fffffff80000,
+ 0x0001fffffffc0000, 0x0001fffffffe0000,
+ 0x0001ffffffff0000, 0x0001ffffffff8000,
+ 0x0001ffffffffc000, 0x0001ffffffffe000,
+ 0x0001fffffffff000, 0x0001fffffffff800,
+ 0x0001fffffffffc00, 0x0001fffffffffe00,
+ 0x0001ffffffffff00, 0x0001ffffffffff80,
+ 0x0001ffffffffffc0, 0x0001ffffffffffe0,
+ 0x0001fffffffffff0, 0x0001fffffffffff8,
+ 0x0001fffffffffffc, 0x0001fffffffffffe,
+ 0x0001ffffffffffff, 0x0002000000000000,
+ 0x0002000000020000, 0x0002000200020002,
+ 0x0003000000000000, 0x0003000000030000,
+ 0x0003000300030003, 0x0003800000000000,
+ 0x0003800000038000, 0x0003c00000000000,
+ 0x0003c0000003c000, 0x0003e00000000000,
+ 0x0003e0000003e000, 0x0003f00000000000,
+ 0x0003f0000003f000, 0x0003f80000000000,
+ 0x0003f8000003f800, 0x0003fc0000000000,
+ 0x0003fc000003fc00, 0x0003fe0000000000,
+ 0x0003fe000003fe00, 0x0003ff0000000000,
+ 0x0003ff000003ff00, 0x0003ff8000000000,
+ 0x0003ff800003ff80, 0x0003ffc000000000,
+ 0x0003ffc00003ffc0, 0x0003ffe000000000,
+ 0x0003ffe00003ffe0, 0x0003fff000000000,
+ 0x0003fff00003fff0, 0x0003fff800000000,
+ 0x0003fff80003fff8, 0x0003fffc00000000,
+ 0x0003fffc0003fffc, 0x0003fffe00000000,
+ 0x0003fffe0003fffe, 0x0003ffff00000000,
+ 0x0003ffff0003ffff, 0x0003ffff80000000,
+ 0x0003ffffc0000000, 0x0003ffffe0000000,
+ 0x0003fffff0000000, 0x0003fffff8000000,
+ 0x0003fffffc000000, 0x0003fffffe000000,
+ 0x0003ffffff000000, 0x0003ffffff800000,
+ 0x0003ffffffc00000, 0x0003ffffffe00000,
+ 0x0003fffffff00000, 0x0003fffffff80000,
+ 0x0003fffffffc0000, 0x0003fffffffe0000,
+ 0x0003ffffffff0000, 0x0003ffffffff8000,
+ 0x0003ffffffffc000, 0x0003ffffffffe000,
+ 0x0003fffffffff000, 0x0003fffffffff800,
+ 0x0003fffffffffc00, 0x0003fffffffffe00,
+ 0x0003ffffffffff00, 0x0003ffffffffff80,
+ 0x0003ffffffffffc0, 0x0003ffffffffffe0,
+ 0x0003fffffffffff0, 0x0003fffffffffff8,
+ 0x0003fffffffffffc, 0x0003fffffffffffe,
+ 0x0003ffffffffffff, 0x0004000000000000,
+ 0x0004000000040000, 0x0004000400040004,
+ 0x0006000000000000, 0x0006000000060000,
+ 0x0006000600060006, 0x0007000000000000,
+ 0x0007000000070000, 0x0007000700070007,
+ 0x0007800000000000, 0x0007800000078000,
+ 0x0007c00000000000, 0x0007c0000007c000,
+ 0x0007e00000000000, 0x0007e0000007e000,
+ 0x0007f00000000000, 0x0007f0000007f000,
+ 0x0007f80000000000, 0x0007f8000007f800,
+ 0x0007fc0000000000, 0x0007fc000007fc00,
+ 0x0007fe0000000000, 0x0007fe000007fe00,
+ 0x0007ff0000000000, 0x0007ff000007ff00,
+ 0x0007ff8000000000, 0x0007ff800007ff80,
+ 0x0007ffc000000000, 0x0007ffc00007ffc0,
+ 0x0007ffe000000000, 0x0007ffe00007ffe0,
+ 0x0007fff000000000, 0x0007fff00007fff0,
+ 0x0007fff800000000, 0x0007fff80007fff8,
+ 0x0007fffc00000000, 0x0007fffc0007fffc,
+ 0x0007fffe00000000, 0x0007fffe0007fffe,
+ 0x0007ffff00000000, 0x0007ffff0007ffff,
+ 0x0007ffff80000000, 0x0007ffffc0000000,
+ 0x0007ffffe0000000, 0x0007fffff0000000,
+ 0x0007fffff8000000, 0x0007fffffc000000,
+ 0x0007fffffe000000, 0x0007ffffff000000,
+ 0x0007ffffff800000, 0x0007ffffffc00000,
+ 0x0007ffffffe00000, 0x0007fffffff00000,
+ 0x0007fffffff80000, 0x0007fffffffc0000,
+ 0x0007fffffffe0000, 0x0007ffffffff0000,
+ 0x0007ffffffff8000, 0x0007ffffffffc000,
+ 0x0007ffffffffe000, 0x0007fffffffff000,
+ 0x0007fffffffff800, 0x0007fffffffffc00,
+ 0x0007fffffffffe00, 0x0007ffffffffff00,
+ 0x0007ffffffffff80, 0x0007ffffffffffc0,
+ 0x0007ffffffffffe0, 0x0007fffffffffff0,
+ 0x0007fffffffffff8, 0x0007fffffffffffc,
+ 0x0007fffffffffffe, 0x0007ffffffffffff,
+ 0x0008000000000000, 0x0008000000080000,
+ 0x0008000800080008, 0x000c000000000000,
+ 0x000c0000000c0000, 0x000c000c000c000c,
+ 0x000e000000000000, 0x000e0000000e0000,
+ 0x000e000e000e000e, 0x000f000000000000,
+ 0x000f0000000f0000, 0x000f000f000f000f,
+ 0x000f800000000000, 0x000f8000000f8000,
+ 0x000fc00000000000, 0x000fc000000fc000,
+ 0x000fe00000000000, 0x000fe000000fe000,
+ 0x000ff00000000000, 0x000ff000000ff000,
+ 0x000ff80000000000, 0x000ff800000ff800,
+ 0x000ffc0000000000, 0x000ffc00000ffc00,
+ 0x000ffe0000000000, 0x000ffe00000ffe00,
+ 0x000fff0000000000, 0x000fff00000fff00,
+ 0x000fff8000000000, 0x000fff80000fff80,
+ 0x000fffc000000000, 0x000fffc0000fffc0,
+ 0x000fffe000000000, 0x000fffe0000fffe0,
+ 0x000ffff000000000, 0x000ffff0000ffff0,
+ 0x000ffff800000000, 0x000ffff8000ffff8,
+ 0x000ffffc00000000, 0x000ffffc000ffffc,
+ 0x000ffffe00000000, 0x000ffffe000ffffe,
+ 0x000fffff00000000, 0x000fffff000fffff,
+ 0x000fffff80000000, 0x000fffffc0000000,
+ 0x000fffffe0000000, 0x000ffffff0000000,
+ 0x000ffffff8000000, 0x000ffffffc000000,
+ 0x000ffffffe000000, 0x000fffffff000000,
+ 0x000fffffff800000, 0x000fffffffc00000,
+ 0x000fffffffe00000, 0x000ffffffff00000,
+ 0x000ffffffff80000, 0x000ffffffffc0000,
+ 0x000ffffffffe0000, 0x000fffffffff0000,
+ 0x000fffffffff8000, 0x000fffffffffc000,
+ 0x000fffffffffe000, 0x000ffffffffff000,
+ 0x000ffffffffff800, 0x000ffffffffffc00,
+ 0x000ffffffffffe00, 0x000fffffffffff00,
+ 0x000fffffffffff80, 0x000fffffffffffc0,
+ 0x000fffffffffffe0, 0x000ffffffffffff0,
+ 0x000ffffffffffff8, 0x000ffffffffffffc,
+ 0x000ffffffffffffe, 0x000fffffffffffff,
+ 0x0010000000000000, 0x0010000000100000,
+ 0x0010001000100010, 0x0018000000000000,
+ 0x0018000000180000, 0x0018001800180018,
+ 0x001c000000000000, 0x001c0000001c0000,
+ 0x001c001c001c001c, 0x001e000000000000,
+ 0x001e0000001e0000, 0x001e001e001e001e,
+ 0x001f000000000000, 0x001f0000001f0000,
+ 0x001f001f001f001f, 0x001f800000000000,
+ 0x001f8000001f8000, 0x001fc00000000000,
+ 0x001fc000001fc000, 0x001fe00000000000,
+ 0x001fe000001fe000, 0x001ff00000000000,
+ 0x001ff000001ff000, 0x001ff80000000000,
+ 0x001ff800001ff800, 0x001ffc0000000000,
+ 0x001ffc00001ffc00, 0x001ffe0000000000,
+ 0x001ffe00001ffe00, 0x001fff0000000000,
+ 0x001fff00001fff00, 0x001fff8000000000,
+ 0x001fff80001fff80, 0x001fffc000000000,
+ 0x001fffc0001fffc0, 0x001fffe000000000,
+ 0x001fffe0001fffe0, 0x001ffff000000000,
+ 0x001ffff0001ffff0, 0x001ffff800000000,
+ 0x001ffff8001ffff8, 0x001ffffc00000000,
+ 0x001ffffc001ffffc, 0x001ffffe00000000,
+ 0x001ffffe001ffffe, 0x001fffff00000000,
+ 0x001fffff001fffff, 0x001fffff80000000,
+ 0x001fffffc0000000, 0x001fffffe0000000,
+ 0x001ffffff0000000, 0x001ffffff8000000,
+ 0x001ffffffc000000, 0x001ffffffe000000,
+ 0x001fffffff000000, 0x001fffffff800000,
+ 0x001fffffffc00000, 0x001fffffffe00000,
+ 0x001ffffffff00000, 0x001ffffffff80000,
+ 0x001ffffffffc0000, 0x001ffffffffe0000,
+ 0x001fffffffff0000, 0x001fffffffff8000,
+ 0x001fffffffffc000, 0x001fffffffffe000,
+ 0x001ffffffffff000, 0x001ffffffffff800,
+ 0x001ffffffffffc00, 0x001ffffffffffe00,
+ 0x001fffffffffff00, 0x001fffffffffff80,
+ 0x001fffffffffffc0, 0x001fffffffffffe0,
+ 0x001ffffffffffff0, 0x001ffffffffffff8,
+ 0x001ffffffffffffc, 0x001ffffffffffffe,
+ 0x001fffffffffffff, 0x0020000000000000,
+ 0x0020000000200000, 0x0020002000200020,
+ 0x0030000000000000, 0x0030000000300000,
+ 0x0030003000300030, 0x0038000000000000,
+ 0x0038000000380000, 0x0038003800380038,
+ 0x003c000000000000, 0x003c0000003c0000,
+ 0x003c003c003c003c, 0x003e000000000000,
+ 0x003e0000003e0000, 0x003e003e003e003e,
+ 0x003f000000000000, 0x003f0000003f0000,
+ 0x003f003f003f003f, 0x003f800000000000,
+ 0x003f8000003f8000, 0x003fc00000000000,
+ 0x003fc000003fc000, 0x003fe00000000000,
+ 0x003fe000003fe000, 0x003ff00000000000,
+ 0x003ff000003ff000, 0x003ff80000000000,
+ 0x003ff800003ff800, 0x003ffc0000000000,
+ 0x003ffc00003ffc00, 0x003ffe0000000000,
+ 0x003ffe00003ffe00, 0x003fff0000000000,
+ 0x003fff00003fff00, 0x003fff8000000000,
+ 0x003fff80003fff80, 0x003fffc000000000,
+ 0x003fffc0003fffc0, 0x003fffe000000000,
+ 0x003fffe0003fffe0, 0x003ffff000000000,
+ 0x003ffff0003ffff0, 0x003ffff800000000,
+ 0x003ffff8003ffff8, 0x003ffffc00000000,
+ 0x003ffffc003ffffc, 0x003ffffe00000000,
+ 0x003ffffe003ffffe, 0x003fffff00000000,
+ 0x003fffff003fffff, 0x003fffff80000000,
+ 0x003fffffc0000000, 0x003fffffe0000000,
+ 0x003ffffff0000000, 0x003ffffff8000000,
+ 0x003ffffffc000000, 0x003ffffffe000000,
+ 0x003fffffff000000, 0x003fffffff800000,
+ 0x003fffffffc00000, 0x003fffffffe00000,
+ 0x003ffffffff00000, 0x003ffffffff80000,
+ 0x003ffffffffc0000, 0x003ffffffffe0000,
+ 0x003fffffffff0000, 0x003fffffffff8000,
+ 0x003fffffffffc000, 0x003fffffffffe000,
+ 0x003ffffffffff000, 0x003ffffffffff800,
+ 0x003ffffffffffc00, 0x003ffffffffffe00,
+ 0x003fffffffffff00, 0x003fffffffffff80,
+ 0x003fffffffffffc0, 0x003fffffffffffe0,
+ 0x003ffffffffffff0, 0x003ffffffffffff8,
+ 0x003ffffffffffffc, 0x003ffffffffffffe,
+ 0x003fffffffffffff, 0x0040000000000000,
+ 0x0040000000400000, 0x0040004000400040,
+ 0x0060000000000000, 0x0060000000600000,
+ 0x0060006000600060, 0x0070000000000000,
+ 0x0070000000700000, 0x0070007000700070,
+ 0x0078000000000000, 0x0078000000780000,
+ 0x0078007800780078, 0x007c000000000000,
+ 0x007c0000007c0000, 0x007c007c007c007c,
+ 0x007e000000000000, 0x007e0000007e0000,
+ 0x007e007e007e007e, 0x007f000000000000,
+ 0x007f0000007f0000, 0x007f007f007f007f,
+ 0x007f800000000000, 0x007f8000007f8000,
+ 0x007fc00000000000, 0x007fc000007fc000,
+ 0x007fe00000000000, 0x007fe000007fe000,
+ 0x007ff00000000000, 0x007ff000007ff000,
+ 0x007ff80000000000, 0x007ff800007ff800,
+ 0x007ffc0000000000, 0x007ffc00007ffc00,
+ 0x007ffe0000000000, 0x007ffe00007ffe00,
+ 0x007fff0000000000, 0x007fff00007fff00,
+ 0x007fff8000000000, 0x007fff80007fff80,
+ 0x007fffc000000000, 0x007fffc0007fffc0,
+ 0x007fffe000000000, 0x007fffe0007fffe0,
+ 0x007ffff000000000, 0x007ffff0007ffff0,
+ 0x007ffff800000000, 0x007ffff8007ffff8,
+ 0x007ffffc00000000, 0x007ffffc007ffffc,
+ 0x007ffffe00000000, 0x007ffffe007ffffe,
+ 0x007fffff00000000, 0x007fffff007fffff,
+ 0x007fffff80000000, 0x007fffffc0000000,
+ 0x007fffffe0000000, 0x007ffffff0000000,
+ 0x007ffffff8000000, 0x007ffffffc000000,
+ 0x007ffffffe000000, 0x007fffffff000000,
+ 0x007fffffff800000, 0x007fffffffc00000,
+ 0x007fffffffe00000, 0x007ffffffff00000,
+ 0x007ffffffff80000, 0x007ffffffffc0000,
+ 0x007ffffffffe0000, 0x007fffffffff0000,
+ 0x007fffffffff8000, 0x007fffffffffc000,
+ 0x007fffffffffe000, 0x007ffffffffff000,
+ 0x007ffffffffff800, 0x007ffffffffffc00,
+ 0x007ffffffffffe00, 0x007fffffffffff00,
+ 0x007fffffffffff80, 0x007fffffffffffc0,
+ 0x007fffffffffffe0, 0x007ffffffffffff0,
+ 0x007ffffffffffff8, 0x007ffffffffffffc,
+ 0x007ffffffffffffe, 0x007fffffffffffff,
+ 0x0080000000000000, 0x0080000000800000,
+ 0x0080008000800080, 0x00c0000000000000,
+ 0x00c0000000c00000, 0x00c000c000c000c0,
+ 0x00e0000000000000, 0x00e0000000e00000,
+ 0x00e000e000e000e0, 0x00f0000000000000,
+ 0x00f0000000f00000, 0x00f000f000f000f0,
+ 0x00f8000000000000, 0x00f8000000f80000,
+ 0x00f800f800f800f8, 0x00fc000000000000,
+ 0x00fc000000fc0000, 0x00fc00fc00fc00fc,
+ 0x00fe000000000000, 0x00fe000000fe0000,
+ 0x00fe00fe00fe00fe, 0x00ff000000000000,
+ 0x00ff000000ff0000, 0x00ff00ff00ff00ff,
+ 0x00ff800000000000, 0x00ff800000ff8000,
+ 0x00ffc00000000000, 0x00ffc00000ffc000,
+ 0x00ffe00000000000, 0x00ffe00000ffe000,
+ 0x00fff00000000000, 0x00fff00000fff000,
+ 0x00fff80000000000, 0x00fff80000fff800,
+ 0x00fffc0000000000, 0x00fffc0000fffc00,
+ 0x00fffe0000000000, 0x00fffe0000fffe00,
+ 0x00ffff0000000000, 0x00ffff0000ffff00,
+ 0x00ffff8000000000, 0x00ffff8000ffff80,
+ 0x00ffffc000000000, 0x00ffffc000ffffc0,
+ 0x00ffffe000000000, 0x00ffffe000ffffe0,
+ 0x00fffff000000000, 0x00fffff000fffff0,
+ 0x00fffff800000000, 0x00fffff800fffff8,
+ 0x00fffffc00000000, 0x00fffffc00fffffc,
+ 0x00fffffe00000000, 0x00fffffe00fffffe,
+ 0x00ffffff00000000, 0x00ffffff00ffffff,
+ 0x00ffffff80000000, 0x00ffffffc0000000,
+ 0x00ffffffe0000000, 0x00fffffff0000000,
+ 0x00fffffff8000000, 0x00fffffffc000000,
+ 0x00fffffffe000000, 0x00ffffffff000000,
+ 0x00ffffffff800000, 0x00ffffffffc00000,
+ 0x00ffffffffe00000, 0x00fffffffff00000,
+ 0x00fffffffff80000, 0x00fffffffffc0000,
+ 0x00fffffffffe0000, 0x00ffffffffff0000,
+ 0x00ffffffffff8000, 0x00ffffffffffc000,
+ 0x00ffffffffffe000, 0x00fffffffffff000,
+ 0x00fffffffffff800, 0x00fffffffffffc00,
+ 0x00fffffffffffe00, 0x00ffffffffffff00,
+ 0x00ffffffffffff80, 0x00ffffffffffffc0,
+ 0x00ffffffffffffe0, 0x00fffffffffffff0,
+ 0x00fffffffffffff8, 0x00fffffffffffffc,
+ 0x00fffffffffffffe, 0x00ffffffffffffff,
+ 0x0100000000000000, 0x0100000001000000,
+ 0x0100010001000100, 0x0101010101010101,
+ 0x0180000000000000, 0x0180000001800000,
+ 0x0180018001800180, 0x01c0000000000000,
+ 0x01c0000001c00000, 0x01c001c001c001c0,
+ 0x01e0000000000000, 0x01e0000001e00000,
+ 0x01e001e001e001e0, 0x01f0000000000000,
+ 0x01f0000001f00000, 0x01f001f001f001f0,
+ 0x01f8000000000000, 0x01f8000001f80000,
+ 0x01f801f801f801f8, 0x01fc000000000000,
+ 0x01fc000001fc0000, 0x01fc01fc01fc01fc,
+ 0x01fe000000000000, 0x01fe000001fe0000,
+ 0x01fe01fe01fe01fe, 0x01ff000000000000,
+ 0x01ff000001ff0000, 0x01ff01ff01ff01ff,
+ 0x01ff800000000000, 0x01ff800001ff8000,
+ 0x01ffc00000000000, 0x01ffc00001ffc000,
+ 0x01ffe00000000000, 0x01ffe00001ffe000,
+ 0x01fff00000000000, 0x01fff00001fff000,
+ 0x01fff80000000000, 0x01fff80001fff800,
+ 0x01fffc0000000000, 0x01fffc0001fffc00,
+ 0x01fffe0000000000, 0x01fffe0001fffe00,
+ 0x01ffff0000000000, 0x01ffff0001ffff00,
+ 0x01ffff8000000000, 0x01ffff8001ffff80,
+ 0x01ffffc000000000, 0x01ffffc001ffffc0,
+ 0x01ffffe000000000, 0x01ffffe001ffffe0,
+ 0x01fffff000000000, 0x01fffff001fffff0,
+ 0x01fffff800000000, 0x01fffff801fffff8,
+ 0x01fffffc00000000, 0x01fffffc01fffffc,
+ 0x01fffffe00000000, 0x01fffffe01fffffe,
+ 0x01ffffff00000000, 0x01ffffff01ffffff,
+ 0x01ffffff80000000, 0x01ffffffc0000000,
+ 0x01ffffffe0000000, 0x01fffffff0000000,
+ 0x01fffffff8000000, 0x01fffffffc000000,
+ 0x01fffffffe000000, 0x01ffffffff000000,
+ 0x01ffffffff800000, 0x01ffffffffc00000,
+ 0x01ffffffffe00000, 0x01fffffffff00000,
+ 0x01fffffffff80000, 0x01fffffffffc0000,
+ 0x01fffffffffe0000, 0x01ffffffffff0000,
+ 0x01ffffffffff8000, 0x01ffffffffffc000,
+ 0x01ffffffffffe000, 0x01fffffffffff000,
+ 0x01fffffffffff800, 0x01fffffffffffc00,
+ 0x01fffffffffffe00, 0x01ffffffffffff00,
+ 0x01ffffffffffff80, 0x01ffffffffffffc0,
+ 0x01ffffffffffffe0, 0x01fffffffffffff0,
+ 0x01fffffffffffff8, 0x01fffffffffffffc,
+ 0x01fffffffffffffe, 0x01ffffffffffffff,
+ 0x0200000000000000, 0x0200000002000000,
+ 0x0200020002000200, 0x0202020202020202,
+ 0x0300000000000000, 0x0300000003000000,
+ 0x0300030003000300, 0x0303030303030303,
+ 0x0380000000000000, 0x0380000003800000,
+ 0x0380038003800380, 0x03c0000000000000,
+ 0x03c0000003c00000, 0x03c003c003c003c0,
+ 0x03e0000000000000, 0x03e0000003e00000,
+ 0x03e003e003e003e0, 0x03f0000000000000,
+ 0x03f0000003f00000, 0x03f003f003f003f0,
+ 0x03f8000000000000, 0x03f8000003f80000,
+ 0x03f803f803f803f8, 0x03fc000000000000,
+ 0x03fc000003fc0000, 0x03fc03fc03fc03fc,
+ 0x03fe000000000000, 0x03fe000003fe0000,
+ 0x03fe03fe03fe03fe, 0x03ff000000000000,
+ 0x03ff000003ff0000, 0x03ff03ff03ff03ff,
+ 0x03ff800000000000, 0x03ff800003ff8000,
+ 0x03ffc00000000000, 0x03ffc00003ffc000,
+ 0x03ffe00000000000, 0x03ffe00003ffe000,
+ 0x03fff00000000000, 0x03fff00003fff000,
+ 0x03fff80000000000, 0x03fff80003fff800,
+ 0x03fffc0000000000, 0x03fffc0003fffc00,
+ 0x03fffe0000000000, 0x03fffe0003fffe00,
+ 0x03ffff0000000000, 0x03ffff0003ffff00,
+ 0x03ffff8000000000, 0x03ffff8003ffff80,
+ 0x03ffffc000000000, 0x03ffffc003ffffc0,
+ 0x03ffffe000000000, 0x03ffffe003ffffe0,
+ 0x03fffff000000000, 0x03fffff003fffff0,
+ 0x03fffff800000000, 0x03fffff803fffff8,
+ 0x03fffffc00000000, 0x03fffffc03fffffc,
+ 0x03fffffe00000000, 0x03fffffe03fffffe,
+ 0x03ffffff00000000, 0x03ffffff03ffffff,
+ 0x03ffffff80000000, 0x03ffffffc0000000,
+ 0x03ffffffe0000000, 0x03fffffff0000000,
+ 0x03fffffff8000000, 0x03fffffffc000000,
+ 0x03fffffffe000000, 0x03ffffffff000000,
+ 0x03ffffffff800000, 0x03ffffffffc00000,
+ 0x03ffffffffe00000, 0x03fffffffff00000,
+ 0x03fffffffff80000, 0x03fffffffffc0000,
+ 0x03fffffffffe0000, 0x03ffffffffff0000,
+ 0x03ffffffffff8000, 0x03ffffffffffc000,
+ 0x03ffffffffffe000, 0x03fffffffffff000,
+ 0x03fffffffffff800, 0x03fffffffffffc00,
+ 0x03fffffffffffe00, 0x03ffffffffffff00,
+ 0x03ffffffffffff80, 0x03ffffffffffffc0,
+ 0x03ffffffffffffe0, 0x03fffffffffffff0,
+ 0x03fffffffffffff8, 0x03fffffffffffffc,
+ 0x03fffffffffffffe, 0x03ffffffffffffff,
+ 0x0400000000000000, 0x0400000004000000,
+ 0x0400040004000400, 0x0404040404040404,
+ 0x0600000000000000, 0x0600000006000000,
+ 0x0600060006000600, 0x0606060606060606,
+ 0x0700000000000000, 0x0700000007000000,
+ 0x0700070007000700, 0x0707070707070707,
+ 0x0780000000000000, 0x0780000007800000,
+ 0x0780078007800780, 0x07c0000000000000,
+ 0x07c0000007c00000, 0x07c007c007c007c0,
+ 0x07e0000000000000, 0x07e0000007e00000,
+ 0x07e007e007e007e0, 0x07f0000000000000,
+ 0x07f0000007f00000, 0x07f007f007f007f0,
+ 0x07f8000000000000, 0x07f8000007f80000,
+ 0x07f807f807f807f8, 0x07fc000000000000,
+ 0x07fc000007fc0000, 0x07fc07fc07fc07fc,
+ 0x07fe000000000000, 0x07fe000007fe0000,
+ 0x07fe07fe07fe07fe, 0x07ff000000000000,
+ 0x07ff000007ff0000, 0x07ff07ff07ff07ff,
+ 0x07ff800000000000, 0x07ff800007ff8000,
+ 0x07ffc00000000000, 0x07ffc00007ffc000,
+ 0x07ffe00000000000, 0x07ffe00007ffe000,
+ 0x07fff00000000000, 0x07fff00007fff000,
+ 0x07fff80000000000, 0x07fff80007fff800,
+ 0x07fffc0000000000, 0x07fffc0007fffc00,
+ 0x07fffe0000000000, 0x07fffe0007fffe00,
+ 0x07ffff0000000000, 0x07ffff0007ffff00,
+ 0x07ffff8000000000, 0x07ffff8007ffff80,
+ 0x07ffffc000000000, 0x07ffffc007ffffc0,
+ 0x07ffffe000000000, 0x07ffffe007ffffe0,
+ 0x07fffff000000000, 0x07fffff007fffff0,
+ 0x07fffff800000000, 0x07fffff807fffff8,
+ 0x07fffffc00000000, 0x07fffffc07fffffc,
+ 0x07fffffe00000000, 0x07fffffe07fffffe,
+ 0x07ffffff00000000, 0x07ffffff07ffffff,
+ 0x07ffffff80000000, 0x07ffffffc0000000,
+ 0x07ffffffe0000000, 0x07fffffff0000000,
+ 0x07fffffff8000000, 0x07fffffffc000000,
+ 0x07fffffffe000000, 0x07ffffffff000000,
+ 0x07ffffffff800000, 0x07ffffffffc00000,
+ 0x07ffffffffe00000, 0x07fffffffff00000,
+ 0x07fffffffff80000, 0x07fffffffffc0000,
+ 0x07fffffffffe0000, 0x07ffffffffff0000,
+ 0x07ffffffffff8000, 0x07ffffffffffc000,
+ 0x07ffffffffffe000, 0x07fffffffffff000,
+ 0x07fffffffffff800, 0x07fffffffffffc00,
+ 0x07fffffffffffe00, 0x07ffffffffffff00,
+ 0x07ffffffffffff80, 0x07ffffffffffffc0,
+ 0x07ffffffffffffe0, 0x07fffffffffffff0,
+ 0x07fffffffffffff8, 0x07fffffffffffffc,
+ 0x07fffffffffffffe, 0x07ffffffffffffff,
+ 0x0800000000000000, 0x0800000008000000,
+ 0x0800080008000800, 0x0808080808080808,
+ 0x0c00000000000000, 0x0c0000000c000000,
+ 0x0c000c000c000c00, 0x0c0c0c0c0c0c0c0c,
+ 0x0e00000000000000, 0x0e0000000e000000,
+ 0x0e000e000e000e00, 0x0e0e0e0e0e0e0e0e,
+ 0x0f00000000000000, 0x0f0000000f000000,
+ 0x0f000f000f000f00, 0x0f0f0f0f0f0f0f0f,
+ 0x0f80000000000000, 0x0f8000000f800000,
+ 0x0f800f800f800f80, 0x0fc0000000000000,
+ 0x0fc000000fc00000, 0x0fc00fc00fc00fc0,
+ 0x0fe0000000000000, 0x0fe000000fe00000,
+ 0x0fe00fe00fe00fe0, 0x0ff0000000000000,
+ 0x0ff000000ff00000, 0x0ff00ff00ff00ff0,
+ 0x0ff8000000000000, 0x0ff800000ff80000,
+ 0x0ff80ff80ff80ff8, 0x0ffc000000000000,
+ 0x0ffc00000ffc0000, 0x0ffc0ffc0ffc0ffc,
+ 0x0ffe000000000000, 0x0ffe00000ffe0000,
+ 0x0ffe0ffe0ffe0ffe, 0x0fff000000000000,
+ 0x0fff00000fff0000, 0x0fff0fff0fff0fff,
+ 0x0fff800000000000, 0x0fff80000fff8000,
+ 0x0fffc00000000000, 0x0fffc0000fffc000,
+ 0x0fffe00000000000, 0x0fffe0000fffe000,
+ 0x0ffff00000000000, 0x0ffff0000ffff000,
+ 0x0ffff80000000000, 0x0ffff8000ffff800,
+ 0x0ffffc0000000000, 0x0ffffc000ffffc00,
+ 0x0ffffe0000000000, 0x0ffffe000ffffe00,
+ 0x0fffff0000000000, 0x0fffff000fffff00,
+ 0x0fffff8000000000, 0x0fffff800fffff80,
+ 0x0fffffc000000000, 0x0fffffc00fffffc0,
+ 0x0fffffe000000000, 0x0fffffe00fffffe0,
+ 0x0ffffff000000000, 0x0ffffff00ffffff0,
+ 0x0ffffff800000000, 0x0ffffff80ffffff8,
+ 0x0ffffffc00000000, 0x0ffffffc0ffffffc,
+ 0x0ffffffe00000000, 0x0ffffffe0ffffffe,
+ 0x0fffffff00000000, 0x0fffffff0fffffff,
+ 0x0fffffff80000000, 0x0fffffffc0000000,
+ 0x0fffffffe0000000, 0x0ffffffff0000000,
+ 0x0ffffffff8000000, 0x0ffffffffc000000,
+ 0x0ffffffffe000000, 0x0fffffffff000000,
+ 0x0fffffffff800000, 0x0fffffffffc00000,
+ 0x0fffffffffe00000, 0x0ffffffffff00000,
+ 0x0ffffffffff80000, 0x0ffffffffffc0000,
+ 0x0ffffffffffe0000, 0x0fffffffffff0000,
+ 0x0fffffffffff8000, 0x0fffffffffffc000,
+ 0x0fffffffffffe000, 0x0ffffffffffff000,
+ 0x0ffffffffffff800, 0x0ffffffffffffc00,
+ 0x0ffffffffffffe00, 0x0fffffffffffff00,
+ 0x0fffffffffffff80, 0x0fffffffffffffc0,
+ 0x0fffffffffffffe0, 0x0ffffffffffffff0,
+ 0x0ffffffffffffff8, 0x0ffffffffffffffc,
+ 0x0ffffffffffffffe, 0x0fffffffffffffff,
+ 0x1000000000000000, 0x1000000010000000,
+ 0x1000100010001000, 0x1010101010101010,
+ 0x1111111111111111, 0x1800000000000000,
+ 0x1800000018000000, 0x1800180018001800,
+ 0x1818181818181818, 0x1c00000000000000,
+ 0x1c0000001c000000, 0x1c001c001c001c00,
+ 0x1c1c1c1c1c1c1c1c, 0x1e00000000000000,
+ 0x1e0000001e000000, 0x1e001e001e001e00,
+ 0x1e1e1e1e1e1e1e1e, 0x1f00000000000000,
+ 0x1f0000001f000000, 0x1f001f001f001f00,
+ 0x1f1f1f1f1f1f1f1f, 0x1f80000000000000,
+ 0x1f8000001f800000, 0x1f801f801f801f80,
+ 0x1fc0000000000000, 0x1fc000001fc00000,
+ 0x1fc01fc01fc01fc0, 0x1fe0000000000000,
+ 0x1fe000001fe00000, 0x1fe01fe01fe01fe0,
+ 0x1ff0000000000000, 0x1ff000001ff00000,
+ 0x1ff01ff01ff01ff0, 0x1ff8000000000000,
+ 0x1ff800001ff80000, 0x1ff81ff81ff81ff8,
+ 0x1ffc000000000000, 0x1ffc00001ffc0000,
+ 0x1ffc1ffc1ffc1ffc, 0x1ffe000000000000,
+ 0x1ffe00001ffe0000, 0x1ffe1ffe1ffe1ffe,
+ 0x1fff000000000000, 0x1fff00001fff0000,
+ 0x1fff1fff1fff1fff, 0x1fff800000000000,
+ 0x1fff80001fff8000, 0x1fffc00000000000,
+ 0x1fffc0001fffc000, 0x1fffe00000000000,
+ 0x1fffe0001fffe000, 0x1ffff00000000000,
+ 0x1ffff0001ffff000, 0x1ffff80000000000,
+ 0x1ffff8001ffff800, 0x1ffffc0000000000,
+ 0x1ffffc001ffffc00, 0x1ffffe0000000000,
+ 0x1ffffe001ffffe00, 0x1fffff0000000000,
+ 0x1fffff001fffff00, 0x1fffff8000000000,
+ 0x1fffff801fffff80, 0x1fffffc000000000,
+ 0x1fffffc01fffffc0, 0x1fffffe000000000,
+ 0x1fffffe01fffffe0, 0x1ffffff000000000,
+ 0x1ffffff01ffffff0, 0x1ffffff800000000,
+ 0x1ffffff81ffffff8, 0x1ffffffc00000000,
+ 0x1ffffffc1ffffffc, 0x1ffffffe00000000,
+ 0x1ffffffe1ffffffe, 0x1fffffff00000000,
+ 0x1fffffff1fffffff, 0x1fffffff80000000,
+ 0x1fffffffc0000000, 0x1fffffffe0000000,
+ 0x1ffffffff0000000, 0x1ffffffff8000000,
+ 0x1ffffffffc000000, 0x1ffffffffe000000,
+ 0x1fffffffff000000, 0x1fffffffff800000,
+ 0x1fffffffffc00000, 0x1fffffffffe00000,
+ 0x1ffffffffff00000, 0x1ffffffffff80000,
+ 0x1ffffffffffc0000, 0x1ffffffffffe0000,
+ 0x1fffffffffff0000, 0x1fffffffffff8000,
+ 0x1fffffffffffc000, 0x1fffffffffffe000,
+ 0x1ffffffffffff000, 0x1ffffffffffff800,
+ 0x1ffffffffffffc00, 0x1ffffffffffffe00,
+ 0x1fffffffffffff00, 0x1fffffffffffff80,
+ 0x1fffffffffffffc0, 0x1fffffffffffffe0,
+ 0x1ffffffffffffff0, 0x1ffffffffffffff8,
+ 0x1ffffffffffffffc, 0x1ffffffffffffffe,
+ 0x1fffffffffffffff, 0x2000000000000000,
+ 0x2000000020000000, 0x2000200020002000,
+ 0x2020202020202020, 0x2222222222222222,
+ 0x3000000000000000, 0x3000000030000000,
+ 0x3000300030003000, 0x3030303030303030,
+ 0x3333333333333333, 0x3800000000000000,
+ 0x3800000038000000, 0x3800380038003800,
+ 0x3838383838383838, 0x3c00000000000000,
+ 0x3c0000003c000000, 0x3c003c003c003c00,
+ 0x3c3c3c3c3c3c3c3c, 0x3e00000000000000,
+ 0x3e0000003e000000, 0x3e003e003e003e00,
+ 0x3e3e3e3e3e3e3e3e, 0x3f00000000000000,
+ 0x3f0000003f000000, 0x3f003f003f003f00,
+ 0x3f3f3f3f3f3f3f3f, 0x3f80000000000000,
+ 0x3f8000003f800000, 0x3f803f803f803f80,
+ 0x3fc0000000000000, 0x3fc000003fc00000,
+ 0x3fc03fc03fc03fc0, 0x3fe0000000000000,
+ 0x3fe000003fe00000, 0x3fe03fe03fe03fe0,
+ 0x3ff0000000000000, 0x3ff000003ff00000,
+ 0x3ff03ff03ff03ff0, 0x3ff8000000000000,
+ 0x3ff800003ff80000, 0x3ff83ff83ff83ff8,
+ 0x3ffc000000000000, 0x3ffc00003ffc0000,
+ 0x3ffc3ffc3ffc3ffc, 0x3ffe000000000000,
+ 0x3ffe00003ffe0000, 0x3ffe3ffe3ffe3ffe,
+ 0x3fff000000000000, 0x3fff00003fff0000,
+ 0x3fff3fff3fff3fff, 0x3fff800000000000,
+ 0x3fff80003fff8000, 0x3fffc00000000000,
+ 0x3fffc0003fffc000, 0x3fffe00000000000,
+ 0x3fffe0003fffe000, 0x3ffff00000000000,
+ 0x3ffff0003ffff000, 0x3ffff80000000000,
+ 0x3ffff8003ffff800, 0x3ffffc0000000000,
+ 0x3ffffc003ffffc00, 0x3ffffe0000000000,
+ 0x3ffffe003ffffe00, 0x3fffff0000000000,
+ 0x3fffff003fffff00, 0x3fffff8000000000,
+ 0x3fffff803fffff80, 0x3fffffc000000000,
+ 0x3fffffc03fffffc0, 0x3fffffe000000000,
+ 0x3fffffe03fffffe0, 0x3ffffff000000000,
+ 0x3ffffff03ffffff0, 0x3ffffff800000000,
+ 0x3ffffff83ffffff8, 0x3ffffffc00000000,
+ 0x3ffffffc3ffffffc, 0x3ffffffe00000000,
+ 0x3ffffffe3ffffffe, 0x3fffffff00000000,
+ 0x3fffffff3fffffff, 0x3fffffff80000000,
+ 0x3fffffffc0000000, 0x3fffffffe0000000,
+ 0x3ffffffff0000000, 0x3ffffffff8000000,
+ 0x3ffffffffc000000, 0x3ffffffffe000000,
+ 0x3fffffffff000000, 0x3fffffffff800000,
+ 0x3fffffffffc00000, 0x3fffffffffe00000,
+ 0x3ffffffffff00000, 0x3ffffffffff80000,
+ 0x3ffffffffffc0000, 0x3ffffffffffe0000,
+ 0x3fffffffffff0000, 0x3fffffffffff8000,
+ 0x3fffffffffffc000, 0x3fffffffffffe000,
+ 0x3ffffffffffff000, 0x3ffffffffffff800,
+ 0x3ffffffffffffc00, 0x3ffffffffffffe00,
+ 0x3fffffffffffff00, 0x3fffffffffffff80,
+ 0x3fffffffffffffc0, 0x3fffffffffffffe0,
+ 0x3ffffffffffffff0, 0x3ffffffffffffff8,
+ 0x3ffffffffffffffc, 0x3ffffffffffffffe,
+ 0x3fffffffffffffff, 0x4000000000000000,
+ 0x4000000040000000, 0x4000400040004000,
+ 0x4040404040404040, 0x4444444444444444,
+ 0x5555555555555555, 0x6000000000000000,
+ 0x6000000060000000, 0x6000600060006000,
+ 0x6060606060606060, 0x6666666666666666,
+ 0x7000000000000000, 0x7000000070000000,
+ 0x7000700070007000, 0x7070707070707070,
+ 0x7777777777777777, 0x7800000000000000,
+ 0x7800000078000000, 0x7800780078007800,
+ 0x7878787878787878, 0x7c00000000000000,
+ 0x7c0000007c000000, 0x7c007c007c007c00,
+ 0x7c7c7c7c7c7c7c7c, 0x7e00000000000000,
+ 0x7e0000007e000000, 0x7e007e007e007e00,
+ 0x7e7e7e7e7e7e7e7e, 0x7f00000000000000,
+ 0x7f0000007f000000, 0x7f007f007f007f00,
+ 0x7f7f7f7f7f7f7f7f, 0x7f80000000000000,
+ 0x7f8000007f800000, 0x7f807f807f807f80,
+ 0x7fc0000000000000, 0x7fc000007fc00000,
+ 0x7fc07fc07fc07fc0, 0x7fe0000000000000,
+ 0x7fe000007fe00000, 0x7fe07fe07fe07fe0,
+ 0x7ff0000000000000, 0x7ff000007ff00000,
+ 0x7ff07ff07ff07ff0, 0x7ff8000000000000,
+ 0x7ff800007ff80000, 0x7ff87ff87ff87ff8,
+ 0x7ffc000000000000, 0x7ffc00007ffc0000,
+ 0x7ffc7ffc7ffc7ffc, 0x7ffe000000000000,
+ 0x7ffe00007ffe0000, 0x7ffe7ffe7ffe7ffe,
+ 0x7fff000000000000, 0x7fff00007fff0000,
+ 0x7fff7fff7fff7fff, 0x7fff800000000000,
+ 0x7fff80007fff8000, 0x7fffc00000000000,
+ 0x7fffc0007fffc000, 0x7fffe00000000000,
+ 0x7fffe0007fffe000, 0x7ffff00000000000,
+ 0x7ffff0007ffff000, 0x7ffff80000000000,
+ 0x7ffff8007ffff800, 0x7ffffc0000000000,
+ 0x7ffffc007ffffc00, 0x7ffffe0000000000,
+ 0x7ffffe007ffffe00, 0x7fffff0000000000,
+ 0x7fffff007fffff00, 0x7fffff8000000000,
+ 0x7fffff807fffff80, 0x7fffffc000000000,
+ 0x7fffffc07fffffc0, 0x7fffffe000000000,
+ 0x7fffffe07fffffe0, 0x7ffffff000000000,
+ 0x7ffffff07ffffff0, 0x7ffffff800000000,
+ 0x7ffffff87ffffff8, 0x7ffffffc00000000,
+ 0x7ffffffc7ffffffc, 0x7ffffffe00000000,
+ 0x7ffffffe7ffffffe, 0x7fffffff00000000,
+ 0x7fffffff7fffffff, 0x7fffffff80000000,
+ 0x7fffffffc0000000, 0x7fffffffe0000000,
+ 0x7ffffffff0000000, 0x7ffffffff8000000,
+ 0x7ffffffffc000000, 0x7ffffffffe000000,
+ 0x7fffffffff000000, 0x7fffffffff800000,
+ 0x7fffffffffc00000, 0x7fffffffffe00000,
+ 0x7ffffffffff00000, 0x7ffffffffff80000,
+ 0x7ffffffffffc0000, 0x7ffffffffffe0000,
+ 0x7fffffffffff0000, 0x7fffffffffff8000,
+ 0x7fffffffffffc000, 0x7fffffffffffe000,
+ 0x7ffffffffffff000, 0x7ffffffffffff800,
+ 0x7ffffffffffffc00, 0x7ffffffffffffe00,
+ 0x7fffffffffffff00, 0x7fffffffffffff80,
+ 0x7fffffffffffffc0, 0x7fffffffffffffe0,
+ 0x7ffffffffffffff0, 0x7ffffffffffffff8,
+ 0x7ffffffffffffffc, 0x7ffffffffffffffe,
+ 0x7fffffffffffffff, 0x8000000000000000,
+ 0x8000000000000001, 0x8000000000000003,
+ 0x8000000000000007, 0x800000000000000f,
+ 0x800000000000001f, 0x800000000000003f,
+ 0x800000000000007f, 0x80000000000000ff,
+ 0x80000000000001ff, 0x80000000000003ff,
+ 0x80000000000007ff, 0x8000000000000fff,
+ 0x8000000000001fff, 0x8000000000003fff,
+ 0x8000000000007fff, 0x800000000000ffff,
+ 0x800000000001ffff, 0x800000000003ffff,
+ 0x800000000007ffff, 0x80000000000fffff,
+ 0x80000000001fffff, 0x80000000003fffff,
+ 0x80000000007fffff, 0x8000000000ffffff,
+ 0x8000000001ffffff, 0x8000000003ffffff,
+ 0x8000000007ffffff, 0x800000000fffffff,
+ 0x800000001fffffff, 0x800000003fffffff,
+ 0x800000007fffffff, 0x8000000080000000,
+ 0x80000000ffffffff, 0x8000000180000001,
+ 0x80000001ffffffff, 0x8000000380000003,
+ 0x80000003ffffffff, 0x8000000780000007,
+ 0x80000007ffffffff, 0x8000000f8000000f,
+ 0x8000000fffffffff, 0x8000001f8000001f,
+ 0x8000001fffffffff, 0x8000003f8000003f,
+ 0x8000003fffffffff, 0x8000007f8000007f,
+ 0x8000007fffffffff, 0x800000ff800000ff,
+ 0x800000ffffffffff, 0x800001ff800001ff,
+ 0x800001ffffffffff, 0x800003ff800003ff,
+ 0x800003ffffffffff, 0x800007ff800007ff,
+ 0x800007ffffffffff, 0x80000fff80000fff,
+ 0x80000fffffffffff, 0x80001fff80001fff,
+ 0x80001fffffffffff, 0x80003fff80003fff,
+ 0x80003fffffffffff, 0x80007fff80007fff,
+ 0x80007fffffffffff, 0x8000800080008000,
+ 0x8000ffff8000ffff, 0x8000ffffffffffff,
+ 0x8001800180018001, 0x8001ffff8001ffff,
+ 0x8001ffffffffffff, 0x8003800380038003,
+ 0x8003ffff8003ffff, 0x8003ffffffffffff,
+ 0x8007800780078007, 0x8007ffff8007ffff,
+ 0x8007ffffffffffff, 0x800f800f800f800f,
+ 0x800fffff800fffff, 0x800fffffffffffff,
+ 0x801f801f801f801f, 0x801fffff801fffff,
+ 0x801fffffffffffff, 0x803f803f803f803f,
+ 0x803fffff803fffff, 0x803fffffffffffff,
+ 0x807f807f807f807f, 0x807fffff807fffff,
+ 0x807fffffffffffff, 0x8080808080808080,
+ 0x80ff80ff80ff80ff, 0x80ffffff80ffffff,
+ 0x80ffffffffffffff, 0x8181818181818181,
+ 0x81ff81ff81ff81ff, 0x81ffffff81ffffff,
+ 0x81ffffffffffffff, 0x8383838383838383,
+ 0x83ff83ff83ff83ff, 0x83ffffff83ffffff,
+ 0x83ffffffffffffff, 0x8787878787878787,
+ 0x87ff87ff87ff87ff, 0x87ffffff87ffffff,
+ 0x87ffffffffffffff, 0x8888888888888888,
+ 0x8f8f8f8f8f8f8f8f, 0x8fff8fff8fff8fff,
+ 0x8fffffff8fffffff, 0x8fffffffffffffff,
+ 0x9999999999999999, 0x9f9f9f9f9f9f9f9f,
+ 0x9fff9fff9fff9fff, 0x9fffffff9fffffff,
+ 0x9fffffffffffffff, 0xaaaaaaaaaaaaaaaa,
+ 0xbbbbbbbbbbbbbbbb, 0xbfbfbfbfbfbfbfbf,
+ 0xbfffbfffbfffbfff, 0xbfffffffbfffffff,
+ 0xbfffffffffffffff, 0xc000000000000000,
+ 0xc000000000000001, 0xc000000000000003,
+ 0xc000000000000007, 0xc00000000000000f,
+ 0xc00000000000001f, 0xc00000000000003f,
+ 0xc00000000000007f, 0xc0000000000000ff,
+ 0xc0000000000001ff, 0xc0000000000003ff,
+ 0xc0000000000007ff, 0xc000000000000fff,
+ 0xc000000000001fff, 0xc000000000003fff,
+ 0xc000000000007fff, 0xc00000000000ffff,
+ 0xc00000000001ffff, 0xc00000000003ffff,
+ 0xc00000000007ffff, 0xc0000000000fffff,
+ 0xc0000000001fffff, 0xc0000000003fffff,
+ 0xc0000000007fffff, 0xc000000000ffffff,
+ 0xc000000001ffffff, 0xc000000003ffffff,
+ 0xc000000007ffffff, 0xc00000000fffffff,
+ 0xc00000001fffffff, 0xc00000003fffffff,
+ 0xc00000007fffffff, 0xc0000000c0000000,
+ 0xc0000000ffffffff, 0xc0000001c0000001,
+ 0xc0000001ffffffff, 0xc0000003c0000003,
+ 0xc0000003ffffffff, 0xc0000007c0000007,
+ 0xc0000007ffffffff, 0xc000000fc000000f,
+ 0xc000000fffffffff, 0xc000001fc000001f,
+ 0xc000001fffffffff, 0xc000003fc000003f,
+ 0xc000003fffffffff, 0xc000007fc000007f,
+ 0xc000007fffffffff, 0xc00000ffc00000ff,
+ 0xc00000ffffffffff, 0xc00001ffc00001ff,
+ 0xc00001ffffffffff, 0xc00003ffc00003ff,
+ 0xc00003ffffffffff, 0xc00007ffc00007ff,
+ 0xc00007ffffffffff, 0xc0000fffc0000fff,
+ 0xc0000fffffffffff, 0xc0001fffc0001fff,
+ 0xc0001fffffffffff, 0xc0003fffc0003fff,
+ 0xc0003fffffffffff, 0xc0007fffc0007fff,
+ 0xc0007fffffffffff, 0xc000c000c000c000,
+ 0xc000ffffc000ffff, 0xc000ffffffffffff,
+ 0xc001c001c001c001, 0xc001ffffc001ffff,
+ 0xc001ffffffffffff, 0xc003c003c003c003,
+ 0xc003ffffc003ffff, 0xc003ffffffffffff,
+ 0xc007c007c007c007, 0xc007ffffc007ffff,
+ 0xc007ffffffffffff, 0xc00fc00fc00fc00f,
+ 0xc00fffffc00fffff, 0xc00fffffffffffff,
+ 0xc01fc01fc01fc01f, 0xc01fffffc01fffff,
+ 0xc01fffffffffffff, 0xc03fc03fc03fc03f,
+ 0xc03fffffc03fffff, 0xc03fffffffffffff,
+ 0xc07fc07fc07fc07f, 0xc07fffffc07fffff,
+ 0xc07fffffffffffff, 0xc0c0c0c0c0c0c0c0,
+ 0xc0ffc0ffc0ffc0ff, 0xc0ffffffc0ffffff,
+ 0xc0ffffffffffffff, 0xc1c1c1c1c1c1c1c1,
+ 0xc1ffc1ffc1ffc1ff, 0xc1ffffffc1ffffff,
+ 0xc1ffffffffffffff, 0xc3c3c3c3c3c3c3c3,
+ 0xc3ffc3ffc3ffc3ff, 0xc3ffffffc3ffffff,
+ 0xc3ffffffffffffff, 0xc7c7c7c7c7c7c7c7,
+ 0xc7ffc7ffc7ffc7ff, 0xc7ffffffc7ffffff,
+ 0xc7ffffffffffffff, 0xcccccccccccccccc,
+ 0xcfcfcfcfcfcfcfcf, 0xcfffcfffcfffcfff,
+ 0xcfffffffcfffffff, 0xcfffffffffffffff,
+ 0xdddddddddddddddd, 0xdfdfdfdfdfdfdfdf,
+ 0xdfffdfffdfffdfff, 0xdfffffffdfffffff,
+ 0xdfffffffffffffff, 0xe000000000000000,
+ 0xe000000000000001, 0xe000000000000003,
+ 0xe000000000000007, 0xe00000000000000f,
+ 0xe00000000000001f, 0xe00000000000003f,
+ 0xe00000000000007f, 0xe0000000000000ff,
+ 0xe0000000000001ff, 0xe0000000000003ff,
+ 0xe0000000000007ff, 0xe000000000000fff,
+ 0xe000000000001fff, 0xe000000000003fff,
+ 0xe000000000007fff, 0xe00000000000ffff,
+ 0xe00000000001ffff, 0xe00000000003ffff,
+ 0xe00000000007ffff, 0xe0000000000fffff,
+ 0xe0000000001fffff, 0xe0000000003fffff,
+ 0xe0000000007fffff, 0xe000000000ffffff,
+ 0xe000000001ffffff, 0xe000000003ffffff,
+ 0xe000000007ffffff, 0xe00000000fffffff,
+ 0xe00000001fffffff, 0xe00000003fffffff,
+ 0xe00000007fffffff, 0xe0000000e0000000,
+ 0xe0000000ffffffff, 0xe0000001e0000001,
+ 0xe0000001ffffffff, 0xe0000003e0000003,
+ 0xe0000003ffffffff, 0xe0000007e0000007,
+ 0xe0000007ffffffff, 0xe000000fe000000f,
+ 0xe000000fffffffff, 0xe000001fe000001f,
+ 0xe000001fffffffff, 0xe000003fe000003f,
+ 0xe000003fffffffff, 0xe000007fe000007f,
+ 0xe000007fffffffff, 0xe00000ffe00000ff,
+ 0xe00000ffffffffff, 0xe00001ffe00001ff,
+ 0xe00001ffffffffff, 0xe00003ffe00003ff,
+ 0xe00003ffffffffff, 0xe00007ffe00007ff,
+ 0xe00007ffffffffff, 0xe0000fffe0000fff,
+ 0xe0000fffffffffff, 0xe0001fffe0001fff,
+ 0xe0001fffffffffff, 0xe0003fffe0003fff,
+ 0xe0003fffffffffff, 0xe0007fffe0007fff,
+ 0xe0007fffffffffff, 0xe000e000e000e000,
+ 0xe000ffffe000ffff, 0xe000ffffffffffff,
+ 0xe001e001e001e001, 0xe001ffffe001ffff,
+ 0xe001ffffffffffff, 0xe003e003e003e003,
+ 0xe003ffffe003ffff, 0xe003ffffffffffff,
+ 0xe007e007e007e007, 0xe007ffffe007ffff,
+ 0xe007ffffffffffff, 0xe00fe00fe00fe00f,
+ 0xe00fffffe00fffff, 0xe00fffffffffffff,
+ 0xe01fe01fe01fe01f, 0xe01fffffe01fffff,
+ 0xe01fffffffffffff, 0xe03fe03fe03fe03f,
+ 0xe03fffffe03fffff, 0xe03fffffffffffff,
+ 0xe07fe07fe07fe07f, 0xe07fffffe07fffff,
+ 0xe07fffffffffffff, 0xe0e0e0e0e0e0e0e0,
+ 0xe0ffe0ffe0ffe0ff, 0xe0ffffffe0ffffff,
+ 0xe0ffffffffffffff, 0xe1e1e1e1e1e1e1e1,
+ 0xe1ffe1ffe1ffe1ff, 0xe1ffffffe1ffffff,
+ 0xe1ffffffffffffff, 0xe3e3e3e3e3e3e3e3,
+ 0xe3ffe3ffe3ffe3ff, 0xe3ffffffe3ffffff,
+ 0xe3ffffffffffffff, 0xe7e7e7e7e7e7e7e7,
+ 0xe7ffe7ffe7ffe7ff, 0xe7ffffffe7ffffff,
+ 0xe7ffffffffffffff, 0xeeeeeeeeeeeeeeee,
+ 0xefefefefefefefef, 0xefffefffefffefff,
+ 0xefffffffefffffff, 0xefffffffffffffff,
+ 0xf000000000000000, 0xf000000000000001,
+ 0xf000000000000003, 0xf000000000000007,
+ 0xf00000000000000f, 0xf00000000000001f,
+ 0xf00000000000003f, 0xf00000000000007f,
+ 0xf0000000000000ff, 0xf0000000000001ff,
+ 0xf0000000000003ff, 0xf0000000000007ff,
+ 0xf000000000000fff, 0xf000000000001fff,
+ 0xf000000000003fff, 0xf000000000007fff,
+ 0xf00000000000ffff, 0xf00000000001ffff,
+ 0xf00000000003ffff, 0xf00000000007ffff,
+ 0xf0000000000fffff, 0xf0000000001fffff,
+ 0xf0000000003fffff, 0xf0000000007fffff,
+ 0xf000000000ffffff, 0xf000000001ffffff,
+ 0xf000000003ffffff, 0xf000000007ffffff,
+ 0xf00000000fffffff, 0xf00000001fffffff,
+ 0xf00000003fffffff, 0xf00000007fffffff,
+ 0xf0000000f0000000, 0xf0000000ffffffff,
+ 0xf0000001f0000001, 0xf0000001ffffffff,
+ 0xf0000003f0000003, 0xf0000003ffffffff,
+ 0xf0000007f0000007, 0xf0000007ffffffff,
+ 0xf000000ff000000f, 0xf000000fffffffff,
+ 0xf000001ff000001f, 0xf000001fffffffff,
+ 0xf000003ff000003f, 0xf000003fffffffff,
+ 0xf000007ff000007f, 0xf000007fffffffff,
+ 0xf00000fff00000ff, 0xf00000ffffffffff,
+ 0xf00001fff00001ff, 0xf00001ffffffffff,
+ 0xf00003fff00003ff, 0xf00003ffffffffff,
+ 0xf00007fff00007ff, 0xf00007ffffffffff,
+ 0xf0000ffff0000fff, 0xf0000fffffffffff,
+ 0xf0001ffff0001fff, 0xf0001fffffffffff,
+ 0xf0003ffff0003fff, 0xf0003fffffffffff,
+ 0xf0007ffff0007fff, 0xf0007fffffffffff,
+ 0xf000f000f000f000, 0xf000fffff000ffff,
+ 0xf000ffffffffffff, 0xf001f001f001f001,
+ 0xf001fffff001ffff, 0xf001ffffffffffff,
+ 0xf003f003f003f003, 0xf003fffff003ffff,
+ 0xf003ffffffffffff, 0xf007f007f007f007,
+ 0xf007fffff007ffff, 0xf007ffffffffffff,
+ 0xf00ff00ff00ff00f, 0xf00ffffff00fffff,
+ 0xf00fffffffffffff, 0xf01ff01ff01ff01f,
+ 0xf01ffffff01fffff, 0xf01fffffffffffff,
+ 0xf03ff03ff03ff03f, 0xf03ffffff03fffff,
+ 0xf03fffffffffffff, 0xf07ff07ff07ff07f,
+ 0xf07ffffff07fffff, 0xf07fffffffffffff,
+ 0xf0f0f0f0f0f0f0f0, 0xf0fff0fff0fff0ff,
+ 0xf0fffffff0ffffff, 0xf0ffffffffffffff,
+ 0xf1f1f1f1f1f1f1f1, 0xf1fff1fff1fff1ff,
+ 0xf1fffffff1ffffff, 0xf1ffffffffffffff,
+ 0xf3f3f3f3f3f3f3f3, 0xf3fff3fff3fff3ff,
+ 0xf3fffffff3ffffff, 0xf3ffffffffffffff,
+ 0xf7f7f7f7f7f7f7f7, 0xf7fff7fff7fff7ff,
+ 0xf7fffffff7ffffff, 0xf7ffffffffffffff,
+ 0xf800000000000000, 0xf800000000000001,
+ 0xf800000000000003, 0xf800000000000007,
+ 0xf80000000000000f, 0xf80000000000001f,
+ 0xf80000000000003f, 0xf80000000000007f,
+ 0xf8000000000000ff, 0xf8000000000001ff,
+ 0xf8000000000003ff, 0xf8000000000007ff,
+ 0xf800000000000fff, 0xf800000000001fff,
+ 0xf800000000003fff, 0xf800000000007fff,
+ 0xf80000000000ffff, 0xf80000000001ffff,
+ 0xf80000000003ffff, 0xf80000000007ffff,
+ 0xf8000000000fffff, 0xf8000000001fffff,
+ 0xf8000000003fffff, 0xf8000000007fffff,
+ 0xf800000000ffffff, 0xf800000001ffffff,
+ 0xf800000003ffffff, 0xf800000007ffffff,
+ 0xf80000000fffffff, 0xf80000001fffffff,
+ 0xf80000003fffffff, 0xf80000007fffffff,
+ 0xf8000000f8000000, 0xf8000000ffffffff,
+ 0xf8000001f8000001, 0xf8000001ffffffff,
+ 0xf8000003f8000003, 0xf8000003ffffffff,
+ 0xf8000007f8000007, 0xf8000007ffffffff,
+ 0xf800000ff800000f, 0xf800000fffffffff,
+ 0xf800001ff800001f, 0xf800001fffffffff,
+ 0xf800003ff800003f, 0xf800003fffffffff,
+ 0xf800007ff800007f, 0xf800007fffffffff,
+ 0xf80000fff80000ff, 0xf80000ffffffffff,
+ 0xf80001fff80001ff, 0xf80001ffffffffff,
+ 0xf80003fff80003ff, 0xf80003ffffffffff,
+ 0xf80007fff80007ff, 0xf80007ffffffffff,
+ 0xf8000ffff8000fff, 0xf8000fffffffffff,
+ 0xf8001ffff8001fff, 0xf8001fffffffffff,
+ 0xf8003ffff8003fff, 0xf8003fffffffffff,
+ 0xf8007ffff8007fff, 0xf8007fffffffffff,
+ 0xf800f800f800f800, 0xf800fffff800ffff,
+ 0xf800ffffffffffff, 0xf801f801f801f801,
+ 0xf801fffff801ffff, 0xf801ffffffffffff,
+ 0xf803f803f803f803, 0xf803fffff803ffff,
+ 0xf803ffffffffffff, 0xf807f807f807f807,
+ 0xf807fffff807ffff, 0xf807ffffffffffff,
+ 0xf80ff80ff80ff80f, 0xf80ffffff80fffff,
+ 0xf80fffffffffffff, 0xf81ff81ff81ff81f,
+ 0xf81ffffff81fffff, 0xf81fffffffffffff,
+ 0xf83ff83ff83ff83f, 0xf83ffffff83fffff,
+ 0xf83fffffffffffff, 0xf87ff87ff87ff87f,
+ 0xf87ffffff87fffff, 0xf87fffffffffffff,
+ 0xf8f8f8f8f8f8f8f8, 0xf8fff8fff8fff8ff,
+ 0xf8fffffff8ffffff, 0xf8ffffffffffffff,
+ 0xf9f9f9f9f9f9f9f9, 0xf9fff9fff9fff9ff,
+ 0xf9fffffff9ffffff, 0xf9ffffffffffffff,
+ 0xfbfbfbfbfbfbfbfb, 0xfbfffbfffbfffbff,
+ 0xfbfffffffbffffff, 0xfbffffffffffffff,
+ 0xfc00000000000000, 0xfc00000000000001,
+ 0xfc00000000000003, 0xfc00000000000007,
+ 0xfc0000000000000f, 0xfc0000000000001f,
+ 0xfc0000000000003f, 0xfc0000000000007f,
+ 0xfc000000000000ff, 0xfc000000000001ff,
+ 0xfc000000000003ff, 0xfc000000000007ff,
+ 0xfc00000000000fff, 0xfc00000000001fff,
+ 0xfc00000000003fff, 0xfc00000000007fff,
+ 0xfc0000000000ffff, 0xfc0000000001ffff,
+ 0xfc0000000003ffff, 0xfc0000000007ffff,
+ 0xfc000000000fffff, 0xfc000000001fffff,
+ 0xfc000000003fffff, 0xfc000000007fffff,
+ 0xfc00000000ffffff, 0xfc00000001ffffff,
+ 0xfc00000003ffffff, 0xfc00000007ffffff,
+ 0xfc0000000fffffff, 0xfc0000001fffffff,
+ 0xfc0000003fffffff, 0xfc0000007fffffff,
+ 0xfc000000fc000000, 0xfc000000ffffffff,
+ 0xfc000001fc000001, 0xfc000001ffffffff,
+ 0xfc000003fc000003, 0xfc000003ffffffff,
+ 0xfc000007fc000007, 0xfc000007ffffffff,
+ 0xfc00000ffc00000f, 0xfc00000fffffffff,
+ 0xfc00001ffc00001f, 0xfc00001fffffffff,
+ 0xfc00003ffc00003f, 0xfc00003fffffffff,
+ 0xfc00007ffc00007f, 0xfc00007fffffffff,
+ 0xfc0000fffc0000ff, 0xfc0000ffffffffff,
+ 0xfc0001fffc0001ff, 0xfc0001ffffffffff,
+ 0xfc0003fffc0003ff, 0xfc0003ffffffffff,
+ 0xfc0007fffc0007ff, 0xfc0007ffffffffff,
+ 0xfc000ffffc000fff, 0xfc000fffffffffff,
+ 0xfc001ffffc001fff, 0xfc001fffffffffff,
+ 0xfc003ffffc003fff, 0xfc003fffffffffff,
+ 0xfc007ffffc007fff, 0xfc007fffffffffff,
+ 0xfc00fc00fc00fc00, 0xfc00fffffc00ffff,
+ 0xfc00ffffffffffff, 0xfc01fc01fc01fc01,
+ 0xfc01fffffc01ffff, 0xfc01ffffffffffff,
+ 0xfc03fc03fc03fc03, 0xfc03fffffc03ffff,
+ 0xfc03ffffffffffff, 0xfc07fc07fc07fc07,
+ 0xfc07fffffc07ffff, 0xfc07ffffffffffff,
+ 0xfc0ffc0ffc0ffc0f, 0xfc0ffffffc0fffff,
+ 0xfc0fffffffffffff, 0xfc1ffc1ffc1ffc1f,
+ 0xfc1ffffffc1fffff, 0xfc1fffffffffffff,
+ 0xfc3ffc3ffc3ffc3f, 0xfc3ffffffc3fffff,
+ 0xfc3fffffffffffff, 0xfc7ffc7ffc7ffc7f,
+ 0xfc7ffffffc7fffff, 0xfc7fffffffffffff,
+ 0xfcfcfcfcfcfcfcfc, 0xfcfffcfffcfffcff,
+ 0xfcfffffffcffffff, 0xfcffffffffffffff,
+ 0xfdfdfdfdfdfdfdfd, 0xfdfffdfffdfffdff,
+ 0xfdfffffffdffffff, 0xfdffffffffffffff,
+ 0xfe00000000000000, 0xfe00000000000001,
+ 0xfe00000000000003, 0xfe00000000000007,
+ 0xfe0000000000000f, 0xfe0000000000001f,
+ 0xfe0000000000003f, 0xfe0000000000007f,
+ 0xfe000000000000ff, 0xfe000000000001ff,
+ 0xfe000000000003ff, 0xfe000000000007ff,
+ 0xfe00000000000fff, 0xfe00000000001fff,
+ 0xfe00000000003fff, 0xfe00000000007fff,
+ 0xfe0000000000ffff, 0xfe0000000001ffff,
+ 0xfe0000000003ffff, 0xfe0000000007ffff,
+ 0xfe000000000fffff, 0xfe000000001fffff,
+ 0xfe000000003fffff, 0xfe000000007fffff,
+ 0xfe00000000ffffff, 0xfe00000001ffffff,
+ 0xfe00000003ffffff, 0xfe00000007ffffff,
+ 0xfe0000000fffffff, 0xfe0000001fffffff,
+ 0xfe0000003fffffff, 0xfe0000007fffffff,
+ 0xfe000000fe000000, 0xfe000000ffffffff,
+ 0xfe000001fe000001, 0xfe000001ffffffff,
+ 0xfe000003fe000003, 0xfe000003ffffffff,
+ 0xfe000007fe000007, 0xfe000007ffffffff,
+ 0xfe00000ffe00000f, 0xfe00000fffffffff,
+ 0xfe00001ffe00001f, 0xfe00001fffffffff,
+ 0xfe00003ffe00003f, 0xfe00003fffffffff,
+ 0xfe00007ffe00007f, 0xfe00007fffffffff,
+ 0xfe0000fffe0000ff, 0xfe0000ffffffffff,
+ 0xfe0001fffe0001ff, 0xfe0001ffffffffff,
+ 0xfe0003fffe0003ff, 0xfe0003ffffffffff,
+ 0xfe0007fffe0007ff, 0xfe0007ffffffffff,
+ 0xfe000ffffe000fff, 0xfe000fffffffffff,
+ 0xfe001ffffe001fff, 0xfe001fffffffffff,
+ 0xfe003ffffe003fff, 0xfe003fffffffffff,
+ 0xfe007ffffe007fff, 0xfe007fffffffffff,
+ 0xfe00fe00fe00fe00, 0xfe00fffffe00ffff,
+ 0xfe00ffffffffffff, 0xfe01fe01fe01fe01,
+ 0xfe01fffffe01ffff, 0xfe01ffffffffffff,
+ 0xfe03fe03fe03fe03, 0xfe03fffffe03ffff,
+ 0xfe03ffffffffffff, 0xfe07fe07fe07fe07,
+ 0xfe07fffffe07ffff, 0xfe07ffffffffffff,
+ 0xfe0ffe0ffe0ffe0f, 0xfe0ffffffe0fffff,
+ 0xfe0fffffffffffff, 0xfe1ffe1ffe1ffe1f,
+ 0xfe1ffffffe1fffff, 0xfe1fffffffffffff,
+ 0xfe3ffe3ffe3ffe3f, 0xfe3ffffffe3fffff,
+ 0xfe3fffffffffffff, 0xfe7ffe7ffe7ffe7f,
+ 0xfe7ffffffe7fffff, 0xfe7fffffffffffff,
+ 0xfefefefefefefefe, 0xfefffefffefffeff,
+ 0xfefffffffeffffff, 0xfeffffffffffffff,
+ 0xff00000000000000, 0xff00000000000001,
+ 0xff00000000000003, 0xff00000000000007,
+ 0xff0000000000000f, 0xff0000000000001f,
+ 0xff0000000000003f, 0xff0000000000007f,
+ 0xff000000000000ff, 0xff000000000001ff,
+ 0xff000000000003ff, 0xff000000000007ff,
+ 0xff00000000000fff, 0xff00000000001fff,
+ 0xff00000000003fff, 0xff00000000007fff,
+ 0xff0000000000ffff, 0xff0000000001ffff,
+ 0xff0000000003ffff, 0xff0000000007ffff,
+ 0xff000000000fffff, 0xff000000001fffff,
+ 0xff000000003fffff, 0xff000000007fffff,
+ 0xff00000000ffffff, 0xff00000001ffffff,
+ 0xff00000003ffffff, 0xff00000007ffffff,
+ 0xff0000000fffffff, 0xff0000001fffffff,
+ 0xff0000003fffffff, 0xff0000007fffffff,
+ 0xff000000ff000000, 0xff000000ffffffff,
+ 0xff000001ff000001, 0xff000001ffffffff,
+ 0xff000003ff000003, 0xff000003ffffffff,
+ 0xff000007ff000007, 0xff000007ffffffff,
+ 0xff00000fff00000f, 0xff00000fffffffff,
+ 0xff00001fff00001f, 0xff00001fffffffff,
+ 0xff00003fff00003f, 0xff00003fffffffff,
+ 0xff00007fff00007f, 0xff00007fffffffff,
+ 0xff0000ffff0000ff, 0xff0000ffffffffff,
+ 0xff0001ffff0001ff, 0xff0001ffffffffff,
+ 0xff0003ffff0003ff, 0xff0003ffffffffff,
+ 0xff0007ffff0007ff, 0xff0007ffffffffff,
+ 0xff000fffff000fff, 0xff000fffffffffff,
+ 0xff001fffff001fff, 0xff001fffffffffff,
+ 0xff003fffff003fff, 0xff003fffffffffff,
+ 0xff007fffff007fff, 0xff007fffffffffff,
+ 0xff00ff00ff00ff00, 0xff00ffffff00ffff,
+ 0xff00ffffffffffff, 0xff01ff01ff01ff01,
+ 0xff01ffffff01ffff, 0xff01ffffffffffff,
+ 0xff03ff03ff03ff03, 0xff03ffffff03ffff,
+ 0xff03ffffffffffff, 0xff07ff07ff07ff07,
+ 0xff07ffffff07ffff, 0xff07ffffffffffff,
+ 0xff0fff0fff0fff0f, 0xff0fffffff0fffff,
+ 0xff0fffffffffffff, 0xff1fff1fff1fff1f,
+ 0xff1fffffff1fffff, 0xff1fffffffffffff,
+ 0xff3fff3fff3fff3f, 0xff3fffffff3fffff,
+ 0xff3fffffffffffff, 0xff7fff7fff7fff7f,
+ 0xff7fffffff7fffff, 0xff7fffffffffffff,
+ 0xff80000000000000, 0xff80000000000001,
+ 0xff80000000000003, 0xff80000000000007,
+ 0xff8000000000000f, 0xff8000000000001f,
+ 0xff8000000000003f, 0xff8000000000007f,
+ 0xff800000000000ff, 0xff800000000001ff,
+ 0xff800000000003ff, 0xff800000000007ff,
+ 0xff80000000000fff, 0xff80000000001fff,
+ 0xff80000000003fff, 0xff80000000007fff,
+ 0xff8000000000ffff, 0xff8000000001ffff,
+ 0xff8000000003ffff, 0xff8000000007ffff,
+ 0xff800000000fffff, 0xff800000001fffff,
+ 0xff800000003fffff, 0xff800000007fffff,
+ 0xff80000000ffffff, 0xff80000001ffffff,
+ 0xff80000003ffffff, 0xff80000007ffffff,
+ 0xff8000000fffffff, 0xff8000001fffffff,
+ 0xff8000003fffffff, 0xff8000007fffffff,
+ 0xff800000ff800000, 0xff800000ffffffff,
+ 0xff800001ff800001, 0xff800001ffffffff,
+ 0xff800003ff800003, 0xff800003ffffffff,
+ 0xff800007ff800007, 0xff800007ffffffff,
+ 0xff80000fff80000f, 0xff80000fffffffff,
+ 0xff80001fff80001f, 0xff80001fffffffff,
+ 0xff80003fff80003f, 0xff80003fffffffff,
+ 0xff80007fff80007f, 0xff80007fffffffff,
+ 0xff8000ffff8000ff, 0xff8000ffffffffff,
+ 0xff8001ffff8001ff, 0xff8001ffffffffff,
+ 0xff8003ffff8003ff, 0xff8003ffffffffff,
+ 0xff8007ffff8007ff, 0xff8007ffffffffff,
+ 0xff800fffff800fff, 0xff800fffffffffff,
+ 0xff801fffff801fff, 0xff801fffffffffff,
+ 0xff803fffff803fff, 0xff803fffffffffff,
+ 0xff807fffff807fff, 0xff807fffffffffff,
+ 0xff80ff80ff80ff80, 0xff80ffffff80ffff,
+ 0xff80ffffffffffff, 0xff81ff81ff81ff81,
+ 0xff81ffffff81ffff, 0xff81ffffffffffff,
+ 0xff83ff83ff83ff83, 0xff83ffffff83ffff,
+ 0xff83ffffffffffff, 0xff87ff87ff87ff87,
+ 0xff87ffffff87ffff, 0xff87ffffffffffff,
+ 0xff8fff8fff8fff8f, 0xff8fffffff8fffff,
+ 0xff8fffffffffffff, 0xff9fff9fff9fff9f,
+ 0xff9fffffff9fffff, 0xff9fffffffffffff,
+ 0xffbfffbfffbfffbf, 0xffbfffffffbfffff,
+ 0xffbfffffffffffff, 0xffc0000000000000,
+ 0xffc0000000000001, 0xffc0000000000003,
+ 0xffc0000000000007, 0xffc000000000000f,
+ 0xffc000000000001f, 0xffc000000000003f,
+ 0xffc000000000007f, 0xffc00000000000ff,
+ 0xffc00000000001ff, 0xffc00000000003ff,
+ 0xffc00000000007ff, 0xffc0000000000fff,
+ 0xffc0000000001fff, 0xffc0000000003fff,
+ 0xffc0000000007fff, 0xffc000000000ffff,
+ 0xffc000000001ffff, 0xffc000000003ffff,
+ 0xffc000000007ffff, 0xffc00000000fffff,
+ 0xffc00000001fffff, 0xffc00000003fffff,
+ 0xffc00000007fffff, 0xffc0000000ffffff,
+ 0xffc0000001ffffff, 0xffc0000003ffffff,
+ 0xffc0000007ffffff, 0xffc000000fffffff,
+ 0xffc000001fffffff, 0xffc000003fffffff,
+ 0xffc000007fffffff, 0xffc00000ffc00000,
+ 0xffc00000ffffffff, 0xffc00001ffc00001,
+ 0xffc00001ffffffff, 0xffc00003ffc00003,
+ 0xffc00003ffffffff, 0xffc00007ffc00007,
+ 0xffc00007ffffffff, 0xffc0000fffc0000f,
+ 0xffc0000fffffffff, 0xffc0001fffc0001f,
+ 0xffc0001fffffffff, 0xffc0003fffc0003f,
+ 0xffc0003fffffffff, 0xffc0007fffc0007f,
+ 0xffc0007fffffffff, 0xffc000ffffc000ff,
+ 0xffc000ffffffffff, 0xffc001ffffc001ff,
+ 0xffc001ffffffffff, 0xffc003ffffc003ff,
+ 0xffc003ffffffffff, 0xffc007ffffc007ff,
+ 0xffc007ffffffffff, 0xffc00fffffc00fff,
+ 0xffc00fffffffffff, 0xffc01fffffc01fff,
+ 0xffc01fffffffffff, 0xffc03fffffc03fff,
+ 0xffc03fffffffffff, 0xffc07fffffc07fff,
+ 0xffc07fffffffffff, 0xffc0ffc0ffc0ffc0,
+ 0xffc0ffffffc0ffff, 0xffc0ffffffffffff,
+ 0xffc1ffc1ffc1ffc1, 0xffc1ffffffc1ffff,
+ 0xffc1ffffffffffff, 0xffc3ffc3ffc3ffc3,
+ 0xffc3ffffffc3ffff, 0xffc3ffffffffffff,
+ 0xffc7ffc7ffc7ffc7, 0xffc7ffffffc7ffff,
+ 0xffc7ffffffffffff, 0xffcfffcfffcfffcf,
+ 0xffcfffffffcfffff, 0xffcfffffffffffff,
+ 0xffdfffdfffdfffdf, 0xffdfffffffdfffff,
+ 0xffdfffffffffffff, 0xffe0000000000000,
+ 0xffe0000000000001, 0xffe0000000000003,
+ 0xffe0000000000007, 0xffe000000000000f,
+ 0xffe000000000001f, 0xffe000000000003f,
+ 0xffe000000000007f, 0xffe00000000000ff,
+ 0xffe00000000001ff, 0xffe00000000003ff,
+ 0xffe00000000007ff, 0xffe0000000000fff,
+ 0xffe0000000001fff, 0xffe0000000003fff,
+ 0xffe0000000007fff, 0xffe000000000ffff,
+ 0xffe000000001ffff, 0xffe000000003ffff,
+ 0xffe000000007ffff, 0xffe00000000fffff,
+ 0xffe00000001fffff, 0xffe00000003fffff,
+ 0xffe00000007fffff, 0xffe0000000ffffff,
+ 0xffe0000001ffffff, 0xffe0000003ffffff,
+ 0xffe0000007ffffff, 0xffe000000fffffff,
+ 0xffe000001fffffff, 0xffe000003fffffff,
+ 0xffe000007fffffff, 0xffe00000ffe00000,
+ 0xffe00000ffffffff, 0xffe00001ffe00001,
+ 0xffe00001ffffffff, 0xffe00003ffe00003,
+ 0xffe00003ffffffff, 0xffe00007ffe00007,
+ 0xffe00007ffffffff, 0xffe0000fffe0000f,
+ 0xffe0000fffffffff, 0xffe0001fffe0001f,
+ 0xffe0001fffffffff, 0xffe0003fffe0003f,
+ 0xffe0003fffffffff, 0xffe0007fffe0007f,
+ 0xffe0007fffffffff, 0xffe000ffffe000ff,
+ 0xffe000ffffffffff, 0xffe001ffffe001ff,
+ 0xffe001ffffffffff, 0xffe003ffffe003ff,
+ 0xffe003ffffffffff, 0xffe007ffffe007ff,
+ 0xffe007ffffffffff, 0xffe00fffffe00fff,
+ 0xffe00fffffffffff, 0xffe01fffffe01fff,
+ 0xffe01fffffffffff, 0xffe03fffffe03fff,
+ 0xffe03fffffffffff, 0xffe07fffffe07fff,
+ 0xffe07fffffffffff, 0xffe0ffe0ffe0ffe0,
+ 0xffe0ffffffe0ffff, 0xffe0ffffffffffff,
+ 0xffe1ffe1ffe1ffe1, 0xffe1ffffffe1ffff,
+ 0xffe1ffffffffffff, 0xffe3ffe3ffe3ffe3,
+ 0xffe3ffffffe3ffff, 0xffe3ffffffffffff,
+ 0xffe7ffe7ffe7ffe7, 0xffe7ffffffe7ffff,
+ 0xffe7ffffffffffff, 0xffefffefffefffef,
+ 0xffefffffffefffff, 0xffefffffffffffff,
+ 0xfff0000000000000, 0xfff0000000000001,
+ 0xfff0000000000003, 0xfff0000000000007,
+ 0xfff000000000000f, 0xfff000000000001f,
+ 0xfff000000000003f, 0xfff000000000007f,
+ 0xfff00000000000ff, 0xfff00000000001ff,
+ 0xfff00000000003ff, 0xfff00000000007ff,
+ 0xfff0000000000fff, 0xfff0000000001fff,
+ 0xfff0000000003fff, 0xfff0000000007fff,
+ 0xfff000000000ffff, 0xfff000000001ffff,
+ 0xfff000000003ffff, 0xfff000000007ffff,
+ 0xfff00000000fffff, 0xfff00000001fffff,
+ 0xfff00000003fffff, 0xfff00000007fffff,
+ 0xfff0000000ffffff, 0xfff0000001ffffff,
+ 0xfff0000003ffffff, 0xfff0000007ffffff,
+ 0xfff000000fffffff, 0xfff000001fffffff,
+ 0xfff000003fffffff, 0xfff000007fffffff,
+ 0xfff00000fff00000, 0xfff00000ffffffff,
+ 0xfff00001fff00001, 0xfff00001ffffffff,
+ 0xfff00003fff00003, 0xfff00003ffffffff,
+ 0xfff00007fff00007, 0xfff00007ffffffff,
+ 0xfff0000ffff0000f, 0xfff0000fffffffff,
+ 0xfff0001ffff0001f, 0xfff0001fffffffff,
+ 0xfff0003ffff0003f, 0xfff0003fffffffff,
+ 0xfff0007ffff0007f, 0xfff0007fffffffff,
+ 0xfff000fffff000ff, 0xfff000ffffffffff,
+ 0xfff001fffff001ff, 0xfff001ffffffffff,
+ 0xfff003fffff003ff, 0xfff003ffffffffff,
+ 0xfff007fffff007ff, 0xfff007ffffffffff,
+ 0xfff00ffffff00fff, 0xfff00fffffffffff,
+ 0xfff01ffffff01fff, 0xfff01fffffffffff,
+ 0xfff03ffffff03fff, 0xfff03fffffffffff,
+ 0xfff07ffffff07fff, 0xfff07fffffffffff,
+ 0xfff0fff0fff0fff0, 0xfff0fffffff0ffff,
+ 0xfff0ffffffffffff, 0xfff1fff1fff1fff1,
+ 0xfff1fffffff1ffff, 0xfff1ffffffffffff,
+ 0xfff3fff3fff3fff3, 0xfff3fffffff3ffff,
+ 0xfff3ffffffffffff, 0xfff7fff7fff7fff7,
+ 0xfff7fffffff7ffff, 0xfff7ffffffffffff,
+ 0xfff8000000000000, 0xfff8000000000001,
+ 0xfff8000000000003, 0xfff8000000000007,
+ 0xfff800000000000f, 0xfff800000000001f,
+ 0xfff800000000003f, 0xfff800000000007f,
+ 0xfff80000000000ff, 0xfff80000000001ff,
+ 0xfff80000000003ff, 0xfff80000000007ff,
+ 0xfff8000000000fff, 0xfff8000000001fff,
+ 0xfff8000000003fff, 0xfff8000000007fff,
+ 0xfff800000000ffff, 0xfff800000001ffff,
+ 0xfff800000003ffff, 0xfff800000007ffff,
+ 0xfff80000000fffff, 0xfff80000001fffff,
+ 0xfff80000003fffff, 0xfff80000007fffff,
+ 0xfff8000000ffffff, 0xfff8000001ffffff,
+ 0xfff8000003ffffff, 0xfff8000007ffffff,
+ 0xfff800000fffffff, 0xfff800001fffffff,
+ 0xfff800003fffffff, 0xfff800007fffffff,
+ 0xfff80000fff80000, 0xfff80000ffffffff,
+ 0xfff80001fff80001, 0xfff80001ffffffff,
+ 0xfff80003fff80003, 0xfff80003ffffffff,
+ 0xfff80007fff80007, 0xfff80007ffffffff,
+ 0xfff8000ffff8000f, 0xfff8000fffffffff,
+ 0xfff8001ffff8001f, 0xfff8001fffffffff,
+ 0xfff8003ffff8003f, 0xfff8003fffffffff,
+ 0xfff8007ffff8007f, 0xfff8007fffffffff,
+ 0xfff800fffff800ff, 0xfff800ffffffffff,
+ 0xfff801fffff801ff, 0xfff801ffffffffff,
+ 0xfff803fffff803ff, 0xfff803ffffffffff,
+ 0xfff807fffff807ff, 0xfff807ffffffffff,
+ 0xfff80ffffff80fff, 0xfff80fffffffffff,
+ 0xfff81ffffff81fff, 0xfff81fffffffffff,
+ 0xfff83ffffff83fff, 0xfff83fffffffffff,
+ 0xfff87ffffff87fff, 0xfff87fffffffffff,
+ 0xfff8fff8fff8fff8, 0xfff8fffffff8ffff,
+ 0xfff8ffffffffffff, 0xfff9fff9fff9fff9,
+ 0xfff9fffffff9ffff, 0xfff9ffffffffffff,
+ 0xfffbfffbfffbfffb, 0xfffbfffffffbffff,
+ 0xfffbffffffffffff, 0xfffc000000000000,
+ 0xfffc000000000001, 0xfffc000000000003,
+ 0xfffc000000000007, 0xfffc00000000000f,
+ 0xfffc00000000001f, 0xfffc00000000003f,
+ 0xfffc00000000007f, 0xfffc0000000000ff,
+ 0xfffc0000000001ff, 0xfffc0000000003ff,
+ 0xfffc0000000007ff, 0xfffc000000000fff,
+ 0xfffc000000001fff, 0xfffc000000003fff,
+ 0xfffc000000007fff, 0xfffc00000000ffff,
+ 0xfffc00000001ffff, 0xfffc00000003ffff,
+ 0xfffc00000007ffff, 0xfffc0000000fffff,
+ 0xfffc0000001fffff, 0xfffc0000003fffff,
+ 0xfffc0000007fffff, 0xfffc000000ffffff,
+ 0xfffc000001ffffff, 0xfffc000003ffffff,
+ 0xfffc000007ffffff, 0xfffc00000fffffff,
+ 0xfffc00001fffffff, 0xfffc00003fffffff,
+ 0xfffc00007fffffff, 0xfffc0000fffc0000,
+ 0xfffc0000ffffffff, 0xfffc0001fffc0001,
+ 0xfffc0001ffffffff, 0xfffc0003fffc0003,
+ 0xfffc0003ffffffff, 0xfffc0007fffc0007,
+ 0xfffc0007ffffffff, 0xfffc000ffffc000f,
+ 0xfffc000fffffffff, 0xfffc001ffffc001f,
+ 0xfffc001fffffffff, 0xfffc003ffffc003f,
+ 0xfffc003fffffffff, 0xfffc007ffffc007f,
+ 0xfffc007fffffffff, 0xfffc00fffffc00ff,
+ 0xfffc00ffffffffff, 0xfffc01fffffc01ff,
+ 0xfffc01ffffffffff, 0xfffc03fffffc03ff,
+ 0xfffc03ffffffffff, 0xfffc07fffffc07ff,
+ 0xfffc07ffffffffff, 0xfffc0ffffffc0fff,
+ 0xfffc0fffffffffff, 0xfffc1ffffffc1fff,
+ 0xfffc1fffffffffff, 0xfffc3ffffffc3fff,
+ 0xfffc3fffffffffff, 0xfffc7ffffffc7fff,
+ 0xfffc7fffffffffff, 0xfffcfffcfffcfffc,
+ 0xfffcfffffffcffff, 0xfffcffffffffffff,
+ 0xfffdfffdfffdfffd, 0xfffdfffffffdffff,
+ 0xfffdffffffffffff, 0xfffe000000000000,
+ 0xfffe000000000001, 0xfffe000000000003,
+ 0xfffe000000000007, 0xfffe00000000000f,
+ 0xfffe00000000001f, 0xfffe00000000003f,
+ 0xfffe00000000007f, 0xfffe0000000000ff,
+ 0xfffe0000000001ff, 0xfffe0000000003ff,
+ 0xfffe0000000007ff, 0xfffe000000000fff,
+ 0xfffe000000001fff, 0xfffe000000003fff,
+ 0xfffe000000007fff, 0xfffe00000000ffff,
+ 0xfffe00000001ffff, 0xfffe00000003ffff,
+ 0xfffe00000007ffff, 0xfffe0000000fffff,
+ 0xfffe0000001fffff, 0xfffe0000003fffff,
+ 0xfffe0000007fffff, 0xfffe000000ffffff,
+ 0xfffe000001ffffff, 0xfffe000003ffffff,
+ 0xfffe000007ffffff, 0xfffe00000fffffff,
+ 0xfffe00001fffffff, 0xfffe00003fffffff,
+ 0xfffe00007fffffff, 0xfffe0000fffe0000,
+ 0xfffe0000ffffffff, 0xfffe0001fffe0001,
+ 0xfffe0001ffffffff, 0xfffe0003fffe0003,
+ 0xfffe0003ffffffff, 0xfffe0007fffe0007,
+ 0xfffe0007ffffffff, 0xfffe000ffffe000f,
+ 0xfffe000fffffffff, 0xfffe001ffffe001f,
+ 0xfffe001fffffffff, 0xfffe003ffffe003f,
+ 0xfffe003fffffffff, 0xfffe007ffffe007f,
+ 0xfffe007fffffffff, 0xfffe00fffffe00ff,
+ 0xfffe00ffffffffff, 0xfffe01fffffe01ff,
+ 0xfffe01ffffffffff, 0xfffe03fffffe03ff,
+ 0xfffe03ffffffffff, 0xfffe07fffffe07ff,
+ 0xfffe07ffffffffff, 0xfffe0ffffffe0fff,
+ 0xfffe0fffffffffff, 0xfffe1ffffffe1fff,
+ 0xfffe1fffffffffff, 0xfffe3ffffffe3fff,
+ 0xfffe3fffffffffff, 0xfffe7ffffffe7fff,
+ 0xfffe7fffffffffff, 0xfffefffefffefffe,
+ 0xfffefffffffeffff, 0xfffeffffffffffff,
+ 0xffff000000000000, 0xffff000000000001,
+ 0xffff000000000003, 0xffff000000000007,
+ 0xffff00000000000f, 0xffff00000000001f,
+ 0xffff00000000003f, 0xffff00000000007f,
+ 0xffff0000000000ff, 0xffff0000000001ff,
+ 0xffff0000000003ff, 0xffff0000000007ff,
+ 0xffff000000000fff, 0xffff000000001fff,
+ 0xffff000000003fff, 0xffff000000007fff,
+ 0xffff00000000ffff, 0xffff00000001ffff,
+ 0xffff00000003ffff, 0xffff00000007ffff,
+ 0xffff0000000fffff, 0xffff0000001fffff,
+ 0xffff0000003fffff, 0xffff0000007fffff,
+ 0xffff000000ffffff, 0xffff000001ffffff,
+ 0xffff000003ffffff, 0xffff000007ffffff,
+ 0xffff00000fffffff, 0xffff00001fffffff,
+ 0xffff00003fffffff, 0xffff00007fffffff,
+ 0xffff0000ffff0000, 0xffff0000ffffffff,
+ 0xffff0001ffff0001, 0xffff0001ffffffff,
+ 0xffff0003ffff0003, 0xffff0003ffffffff,
+ 0xffff0007ffff0007, 0xffff0007ffffffff,
+ 0xffff000fffff000f, 0xffff000fffffffff,
+ 0xffff001fffff001f, 0xffff001fffffffff,
+ 0xffff003fffff003f, 0xffff003fffffffff,
+ 0xffff007fffff007f, 0xffff007fffffffff,
+ 0xffff00ffffff00ff, 0xffff00ffffffffff,
+ 0xffff01ffffff01ff, 0xffff01ffffffffff,
+ 0xffff03ffffff03ff, 0xffff03ffffffffff,
+ 0xffff07ffffff07ff, 0xffff07ffffffffff,
+ 0xffff0fffffff0fff, 0xffff0fffffffffff,
+ 0xffff1fffffff1fff, 0xffff1fffffffffff,
+ 0xffff3fffffff3fff, 0xffff3fffffffffff,
+ 0xffff7fffffff7fff, 0xffff7fffffffffff,
+ 0xffff800000000000, 0xffff800000000001,
+ 0xffff800000000003, 0xffff800000000007,
+ 0xffff80000000000f, 0xffff80000000001f,
+ 0xffff80000000003f, 0xffff80000000007f,
+ 0xffff8000000000ff, 0xffff8000000001ff,
+ 0xffff8000000003ff, 0xffff8000000007ff,
+ 0xffff800000000fff, 0xffff800000001fff,
+ 0xffff800000003fff, 0xffff800000007fff,
+ 0xffff80000000ffff, 0xffff80000001ffff,
+ 0xffff80000003ffff, 0xffff80000007ffff,
+ 0xffff8000000fffff, 0xffff8000001fffff,
+ 0xffff8000003fffff, 0xffff8000007fffff,
+ 0xffff800000ffffff, 0xffff800001ffffff,
+ 0xffff800003ffffff, 0xffff800007ffffff,
+ 0xffff80000fffffff, 0xffff80001fffffff,
+ 0xffff80003fffffff, 0xffff80007fffffff,
+ 0xffff8000ffff8000, 0xffff8000ffffffff,
+ 0xffff8001ffff8001, 0xffff8001ffffffff,
+ 0xffff8003ffff8003, 0xffff8003ffffffff,
+ 0xffff8007ffff8007, 0xffff8007ffffffff,
+ 0xffff800fffff800f, 0xffff800fffffffff,
+ 0xffff801fffff801f, 0xffff801fffffffff,
+ 0xffff803fffff803f, 0xffff803fffffffff,
+ 0xffff807fffff807f, 0xffff807fffffffff,
+ 0xffff80ffffff80ff, 0xffff80ffffffffff,
+ 0xffff81ffffff81ff, 0xffff81ffffffffff,
+ 0xffff83ffffff83ff, 0xffff83ffffffffff,
+ 0xffff87ffffff87ff, 0xffff87ffffffffff,
+ 0xffff8fffffff8fff, 0xffff8fffffffffff,
+ 0xffff9fffffff9fff, 0xffff9fffffffffff,
+ 0xffffbfffffffbfff, 0xffffbfffffffffff,
+ 0xffffc00000000000, 0xffffc00000000001,
+ 0xffffc00000000003, 0xffffc00000000007,
+ 0xffffc0000000000f, 0xffffc0000000001f,
+ 0xffffc0000000003f, 0xffffc0000000007f,
+ 0xffffc000000000ff, 0xffffc000000001ff,
+ 0xffffc000000003ff, 0xffffc000000007ff,
+ 0xffffc00000000fff, 0xffffc00000001fff,
+ 0xffffc00000003fff, 0xffffc00000007fff,
+ 0xffffc0000000ffff, 0xffffc0000001ffff,
+ 0xffffc0000003ffff, 0xffffc0000007ffff,
+ 0xffffc000000fffff, 0xffffc000001fffff,
+ 0xffffc000003fffff, 0xffffc000007fffff,
+ 0xffffc00000ffffff, 0xffffc00001ffffff,
+ 0xffffc00003ffffff, 0xffffc00007ffffff,
+ 0xffffc0000fffffff, 0xffffc0001fffffff,
+ 0xffffc0003fffffff, 0xffffc0007fffffff,
+ 0xffffc000ffffc000, 0xffffc000ffffffff,
+ 0xffffc001ffffc001, 0xffffc001ffffffff,
+ 0xffffc003ffffc003, 0xffffc003ffffffff,
+ 0xffffc007ffffc007, 0xffffc007ffffffff,
+ 0xffffc00fffffc00f, 0xffffc00fffffffff,
+ 0xffffc01fffffc01f, 0xffffc01fffffffff,
+ 0xffffc03fffffc03f, 0xffffc03fffffffff,
+ 0xffffc07fffffc07f, 0xffffc07fffffffff,
+ 0xffffc0ffffffc0ff, 0xffffc0ffffffffff,
+ 0xffffc1ffffffc1ff, 0xffffc1ffffffffff,
+ 0xffffc3ffffffc3ff, 0xffffc3ffffffffff,
+ 0xffffc7ffffffc7ff, 0xffffc7ffffffffff,
+ 0xffffcfffffffcfff, 0xffffcfffffffffff,
+ 0xffffdfffffffdfff, 0xffffdfffffffffff,
+ 0xffffe00000000000, 0xffffe00000000001,
+ 0xffffe00000000003, 0xffffe00000000007,
+ 0xffffe0000000000f, 0xffffe0000000001f,
+ 0xffffe0000000003f, 0xffffe0000000007f,
+ 0xffffe000000000ff, 0xffffe000000001ff,
+ 0xffffe000000003ff, 0xffffe000000007ff,
+ 0xffffe00000000fff, 0xffffe00000001fff,
+ 0xffffe00000003fff, 0xffffe00000007fff,
+ 0xffffe0000000ffff, 0xffffe0000001ffff,
+ 0xffffe0000003ffff, 0xffffe0000007ffff,
+ 0xffffe000000fffff, 0xffffe000001fffff,
+ 0xffffe000003fffff, 0xffffe000007fffff,
+ 0xffffe00000ffffff, 0xffffe00001ffffff,
+ 0xffffe00003ffffff, 0xffffe00007ffffff,
+ 0xffffe0000fffffff, 0xffffe0001fffffff,
+ 0xffffe0003fffffff, 0xffffe0007fffffff,
+ 0xffffe000ffffe000, 0xffffe000ffffffff,
+ 0xffffe001ffffe001, 0xffffe001ffffffff,
+ 0xffffe003ffffe003, 0xffffe003ffffffff,
+ 0xffffe007ffffe007, 0xffffe007ffffffff,
+ 0xffffe00fffffe00f, 0xffffe00fffffffff,
+ 0xffffe01fffffe01f, 0xffffe01fffffffff,
+ 0xffffe03fffffe03f, 0xffffe03fffffffff,
+ 0xffffe07fffffe07f, 0xffffe07fffffffff,
+ 0xffffe0ffffffe0ff, 0xffffe0ffffffffff,
+ 0xffffe1ffffffe1ff, 0xffffe1ffffffffff,
+ 0xffffe3ffffffe3ff, 0xffffe3ffffffffff,
+ 0xffffe7ffffffe7ff, 0xffffe7ffffffffff,
+ 0xffffefffffffefff, 0xffffefffffffffff,
+ 0xfffff00000000000, 0xfffff00000000001,
+ 0xfffff00000000003, 0xfffff00000000007,
+ 0xfffff0000000000f, 0xfffff0000000001f,
+ 0xfffff0000000003f, 0xfffff0000000007f,
+ 0xfffff000000000ff, 0xfffff000000001ff,
+ 0xfffff000000003ff, 0xfffff000000007ff,
+ 0xfffff00000000fff, 0xfffff00000001fff,
+ 0xfffff00000003fff, 0xfffff00000007fff,
+ 0xfffff0000000ffff, 0xfffff0000001ffff,
+ 0xfffff0000003ffff, 0xfffff0000007ffff,
+ 0xfffff000000fffff, 0xfffff000001fffff,
+ 0xfffff000003fffff, 0xfffff000007fffff,
+ 0xfffff00000ffffff, 0xfffff00001ffffff,
+ 0xfffff00003ffffff, 0xfffff00007ffffff,
+ 0xfffff0000fffffff, 0xfffff0001fffffff,
+ 0xfffff0003fffffff, 0xfffff0007fffffff,
+ 0xfffff000fffff000, 0xfffff000ffffffff,
+ 0xfffff001fffff001, 0xfffff001ffffffff,
+ 0xfffff003fffff003, 0xfffff003ffffffff,
+ 0xfffff007fffff007, 0xfffff007ffffffff,
+ 0xfffff00ffffff00f, 0xfffff00fffffffff,
+ 0xfffff01ffffff01f, 0xfffff01fffffffff,
+ 0xfffff03ffffff03f, 0xfffff03fffffffff,
+ 0xfffff07ffffff07f, 0xfffff07fffffffff,
+ 0xfffff0fffffff0ff, 0xfffff0ffffffffff,
+ 0xfffff1fffffff1ff, 0xfffff1ffffffffff,
+ 0xfffff3fffffff3ff, 0xfffff3ffffffffff,
+ 0xfffff7fffffff7ff, 0xfffff7ffffffffff,
+ 0xfffff80000000000, 0xfffff80000000001,
+ 0xfffff80000000003, 0xfffff80000000007,
+ 0xfffff8000000000f, 0xfffff8000000001f,
+ 0xfffff8000000003f, 0xfffff8000000007f,
+ 0xfffff800000000ff, 0xfffff800000001ff,
+ 0xfffff800000003ff, 0xfffff800000007ff,
+ 0xfffff80000000fff, 0xfffff80000001fff,
+ 0xfffff80000003fff, 0xfffff80000007fff,
+ 0xfffff8000000ffff, 0xfffff8000001ffff,
+ 0xfffff8000003ffff, 0xfffff8000007ffff,
+ 0xfffff800000fffff, 0xfffff800001fffff,
+ 0xfffff800003fffff, 0xfffff800007fffff,
+ 0xfffff80000ffffff, 0xfffff80001ffffff,
+ 0xfffff80003ffffff, 0xfffff80007ffffff,
+ 0xfffff8000fffffff, 0xfffff8001fffffff,
+ 0xfffff8003fffffff, 0xfffff8007fffffff,
+ 0xfffff800fffff800, 0xfffff800ffffffff,
+ 0xfffff801fffff801, 0xfffff801ffffffff,
+ 0xfffff803fffff803, 0xfffff803ffffffff,
+ 0xfffff807fffff807, 0xfffff807ffffffff,
+ 0xfffff80ffffff80f, 0xfffff80fffffffff,
+ 0xfffff81ffffff81f, 0xfffff81fffffffff,
+ 0xfffff83ffffff83f, 0xfffff83fffffffff,
+ 0xfffff87ffffff87f, 0xfffff87fffffffff,
+ 0xfffff8fffffff8ff, 0xfffff8ffffffffff,
+ 0xfffff9fffffff9ff, 0xfffff9ffffffffff,
+ 0xfffffbfffffffbff, 0xfffffbffffffffff,
+ 0xfffffc0000000000, 0xfffffc0000000001,
+ 0xfffffc0000000003, 0xfffffc0000000007,
+ 0xfffffc000000000f, 0xfffffc000000001f,
+ 0xfffffc000000003f, 0xfffffc000000007f,
+ 0xfffffc00000000ff, 0xfffffc00000001ff,
+ 0xfffffc00000003ff, 0xfffffc00000007ff,
+ 0xfffffc0000000fff, 0xfffffc0000001fff,
+ 0xfffffc0000003fff, 0xfffffc0000007fff,
+ 0xfffffc000000ffff, 0xfffffc000001ffff,
+ 0xfffffc000003ffff, 0xfffffc000007ffff,
+ 0xfffffc00000fffff, 0xfffffc00001fffff,
+ 0xfffffc00003fffff, 0xfffffc00007fffff,
+ 0xfffffc0000ffffff, 0xfffffc0001ffffff,
+ 0xfffffc0003ffffff, 0xfffffc0007ffffff,
+ 0xfffffc000fffffff, 0xfffffc001fffffff,
+ 0xfffffc003fffffff, 0xfffffc007fffffff,
+ 0xfffffc00fffffc00, 0xfffffc00ffffffff,
+ 0xfffffc01fffffc01, 0xfffffc01ffffffff,
+ 0xfffffc03fffffc03, 0xfffffc03ffffffff,
+ 0xfffffc07fffffc07, 0xfffffc07ffffffff,
+ 0xfffffc0ffffffc0f, 0xfffffc0fffffffff,
+ 0xfffffc1ffffffc1f, 0xfffffc1fffffffff,
+ 0xfffffc3ffffffc3f, 0xfffffc3fffffffff,
+ 0xfffffc7ffffffc7f, 0xfffffc7fffffffff,
+ 0xfffffcfffffffcff, 0xfffffcffffffffff,
+ 0xfffffdfffffffdff, 0xfffffdffffffffff,
+ 0xfffffe0000000000, 0xfffffe0000000001,
+ 0xfffffe0000000003, 0xfffffe0000000007,
+ 0xfffffe000000000f, 0xfffffe000000001f,
+ 0xfffffe000000003f, 0xfffffe000000007f,
+ 0xfffffe00000000ff, 0xfffffe00000001ff,
+ 0xfffffe00000003ff, 0xfffffe00000007ff,
+ 0xfffffe0000000fff, 0xfffffe0000001fff,
+ 0xfffffe0000003fff, 0xfffffe0000007fff,
+ 0xfffffe000000ffff, 0xfffffe000001ffff,
+ 0xfffffe000003ffff, 0xfffffe000007ffff,
+ 0xfffffe00000fffff, 0xfffffe00001fffff,
+ 0xfffffe00003fffff, 0xfffffe00007fffff,
+ 0xfffffe0000ffffff, 0xfffffe0001ffffff,
+ 0xfffffe0003ffffff, 0xfffffe0007ffffff,
+ 0xfffffe000fffffff, 0xfffffe001fffffff,
+ 0xfffffe003fffffff, 0xfffffe007fffffff,
+ 0xfffffe00fffffe00, 0xfffffe00ffffffff,
+ 0xfffffe01fffffe01, 0xfffffe01ffffffff,
+ 0xfffffe03fffffe03, 0xfffffe03ffffffff,
+ 0xfffffe07fffffe07, 0xfffffe07ffffffff,
+ 0xfffffe0ffffffe0f, 0xfffffe0fffffffff,
+ 0xfffffe1ffffffe1f, 0xfffffe1fffffffff,
+ 0xfffffe3ffffffe3f, 0xfffffe3fffffffff,
+ 0xfffffe7ffffffe7f, 0xfffffe7fffffffff,
+ 0xfffffefffffffeff, 0xfffffeffffffffff,
+ 0xffffff0000000000, 0xffffff0000000001,
+ 0xffffff0000000003, 0xffffff0000000007,
+ 0xffffff000000000f, 0xffffff000000001f,
+ 0xffffff000000003f, 0xffffff000000007f,
+ 0xffffff00000000ff, 0xffffff00000001ff,
+ 0xffffff00000003ff, 0xffffff00000007ff,
+ 0xffffff0000000fff, 0xffffff0000001fff,
+ 0xffffff0000003fff, 0xffffff0000007fff,
+ 0xffffff000000ffff, 0xffffff000001ffff,
+ 0xffffff000003ffff, 0xffffff000007ffff,
+ 0xffffff00000fffff, 0xffffff00001fffff,
+ 0xffffff00003fffff, 0xffffff00007fffff,
+ 0xffffff0000ffffff, 0xffffff0001ffffff,
+ 0xffffff0003ffffff, 0xffffff0007ffffff,
+ 0xffffff000fffffff, 0xffffff001fffffff,
+ 0xffffff003fffffff, 0xffffff007fffffff,
+ 0xffffff00ffffff00, 0xffffff00ffffffff,
+ 0xffffff01ffffff01, 0xffffff01ffffffff,
+ 0xffffff03ffffff03, 0xffffff03ffffffff,
+ 0xffffff07ffffff07, 0xffffff07ffffffff,
+ 0xffffff0fffffff0f, 0xffffff0fffffffff,
+ 0xffffff1fffffff1f, 0xffffff1fffffffff,
+ 0xffffff3fffffff3f, 0xffffff3fffffffff,
+ 0xffffff7fffffff7f, 0xffffff7fffffffff,
+ 0xffffff8000000000, 0xffffff8000000001,
+ 0xffffff8000000003, 0xffffff8000000007,
+ 0xffffff800000000f, 0xffffff800000001f,
+ 0xffffff800000003f, 0xffffff800000007f,
+ 0xffffff80000000ff, 0xffffff80000001ff,
+ 0xffffff80000003ff, 0xffffff80000007ff,
+ 0xffffff8000000fff, 0xffffff8000001fff,
+ 0xffffff8000003fff, 0xffffff8000007fff,
+ 0xffffff800000ffff, 0xffffff800001ffff,
+ 0xffffff800003ffff, 0xffffff800007ffff,
+ 0xffffff80000fffff, 0xffffff80001fffff,
+ 0xffffff80003fffff, 0xffffff80007fffff,
+ 0xffffff8000ffffff, 0xffffff8001ffffff,
+ 0xffffff8003ffffff, 0xffffff8007ffffff,
+ 0xffffff800fffffff, 0xffffff801fffffff,
+ 0xffffff803fffffff, 0xffffff807fffffff,
+ 0xffffff80ffffff80, 0xffffff80ffffffff,
+ 0xffffff81ffffff81, 0xffffff81ffffffff,
+ 0xffffff83ffffff83, 0xffffff83ffffffff,
+ 0xffffff87ffffff87, 0xffffff87ffffffff,
+ 0xffffff8fffffff8f, 0xffffff8fffffffff,
+ 0xffffff9fffffff9f, 0xffffff9fffffffff,
+ 0xffffffbfffffffbf, 0xffffffbfffffffff,
+ 0xffffffc000000000, 0xffffffc000000001,
+ 0xffffffc000000003, 0xffffffc000000007,
+ 0xffffffc00000000f, 0xffffffc00000001f,
+ 0xffffffc00000003f, 0xffffffc00000007f,
+ 0xffffffc0000000ff, 0xffffffc0000001ff,
+ 0xffffffc0000003ff, 0xffffffc0000007ff,
+ 0xffffffc000000fff, 0xffffffc000001fff,
+ 0xffffffc000003fff, 0xffffffc000007fff,
+ 0xffffffc00000ffff, 0xffffffc00001ffff,
+ 0xffffffc00003ffff, 0xffffffc00007ffff,
+ 0xffffffc0000fffff, 0xffffffc0001fffff,
+ 0xffffffc0003fffff, 0xffffffc0007fffff,
+ 0xffffffc000ffffff, 0xffffffc001ffffff,
+ 0xffffffc003ffffff, 0xffffffc007ffffff,
+ 0xffffffc00fffffff, 0xffffffc01fffffff,
+ 0xffffffc03fffffff, 0xffffffc07fffffff,
+ 0xffffffc0ffffffc0, 0xffffffc0ffffffff,
+ 0xffffffc1ffffffc1, 0xffffffc1ffffffff,
+ 0xffffffc3ffffffc3, 0xffffffc3ffffffff,
+ 0xffffffc7ffffffc7, 0xffffffc7ffffffff,
+ 0xffffffcfffffffcf, 0xffffffcfffffffff,
+ 0xffffffdfffffffdf, 0xffffffdfffffffff,
+ 0xffffffe000000000, 0xffffffe000000001,
+ 0xffffffe000000003, 0xffffffe000000007,
+ 0xffffffe00000000f, 0xffffffe00000001f,
+ 0xffffffe00000003f, 0xffffffe00000007f,
+ 0xffffffe0000000ff, 0xffffffe0000001ff,
+ 0xffffffe0000003ff, 0xffffffe0000007ff,
+ 0xffffffe000000fff, 0xffffffe000001fff,
+ 0xffffffe000003fff, 0xffffffe000007fff,
+ 0xffffffe00000ffff, 0xffffffe00001ffff,
+ 0xffffffe00003ffff, 0xffffffe00007ffff,
+ 0xffffffe0000fffff, 0xffffffe0001fffff,
+ 0xffffffe0003fffff, 0xffffffe0007fffff,
+ 0xffffffe000ffffff, 0xffffffe001ffffff,
+ 0xffffffe003ffffff, 0xffffffe007ffffff,
+ 0xffffffe00fffffff, 0xffffffe01fffffff,
+ 0xffffffe03fffffff, 0xffffffe07fffffff,
+ 0xffffffe0ffffffe0, 0xffffffe0ffffffff,
+ 0xffffffe1ffffffe1, 0xffffffe1ffffffff,
+ 0xffffffe3ffffffe3, 0xffffffe3ffffffff,
+ 0xffffffe7ffffffe7, 0xffffffe7ffffffff,
+ 0xffffffefffffffef, 0xffffffefffffffff,
+ 0xfffffff000000000, 0xfffffff000000001,
+ 0xfffffff000000003, 0xfffffff000000007,
+ 0xfffffff00000000f, 0xfffffff00000001f,
+ 0xfffffff00000003f, 0xfffffff00000007f,
+ 0xfffffff0000000ff, 0xfffffff0000001ff,
+ 0xfffffff0000003ff, 0xfffffff0000007ff,
+ 0xfffffff000000fff, 0xfffffff000001fff,
+ 0xfffffff000003fff, 0xfffffff000007fff,
+ 0xfffffff00000ffff, 0xfffffff00001ffff,
+ 0xfffffff00003ffff, 0xfffffff00007ffff,
+ 0xfffffff0000fffff, 0xfffffff0001fffff,
+ 0xfffffff0003fffff, 0xfffffff0007fffff,
+ 0xfffffff000ffffff, 0xfffffff001ffffff,
+ 0xfffffff003ffffff, 0xfffffff007ffffff,
+ 0xfffffff00fffffff, 0xfffffff01fffffff,
+ 0xfffffff03fffffff, 0xfffffff07fffffff,
+ 0xfffffff0fffffff0, 0xfffffff0ffffffff,
+ 0xfffffff1fffffff1, 0xfffffff1ffffffff,
+ 0xfffffff3fffffff3, 0xfffffff3ffffffff,
+ 0xfffffff7fffffff7, 0xfffffff7ffffffff,
+ 0xfffffff800000000, 0xfffffff800000001,
+ 0xfffffff800000003, 0xfffffff800000007,
+ 0xfffffff80000000f, 0xfffffff80000001f,
+ 0xfffffff80000003f, 0xfffffff80000007f,
+ 0xfffffff8000000ff, 0xfffffff8000001ff,
+ 0xfffffff8000003ff, 0xfffffff8000007ff,
+ 0xfffffff800000fff, 0xfffffff800001fff,
+ 0xfffffff800003fff, 0xfffffff800007fff,
+ 0xfffffff80000ffff, 0xfffffff80001ffff,
+ 0xfffffff80003ffff, 0xfffffff80007ffff,
+ 0xfffffff8000fffff, 0xfffffff8001fffff,
+ 0xfffffff8003fffff, 0xfffffff8007fffff,
+ 0xfffffff800ffffff, 0xfffffff801ffffff,
+ 0xfffffff803ffffff, 0xfffffff807ffffff,
+ 0xfffffff80fffffff, 0xfffffff81fffffff,
+ 0xfffffff83fffffff, 0xfffffff87fffffff,
+ 0xfffffff8fffffff8, 0xfffffff8ffffffff,
+ 0xfffffff9fffffff9, 0xfffffff9ffffffff,
+ 0xfffffffbfffffffb, 0xfffffffbffffffff,
+ 0xfffffffc00000000, 0xfffffffc00000001,
+ 0xfffffffc00000003, 0xfffffffc00000007,
+ 0xfffffffc0000000f, 0xfffffffc0000001f,
+ 0xfffffffc0000003f, 0xfffffffc0000007f,
+ 0xfffffffc000000ff, 0xfffffffc000001ff,
+ 0xfffffffc000003ff, 0xfffffffc000007ff,
+ 0xfffffffc00000fff, 0xfffffffc00001fff,
+ 0xfffffffc00003fff, 0xfffffffc00007fff,
+ 0xfffffffc0000ffff, 0xfffffffc0001ffff,
+ 0xfffffffc0003ffff, 0xfffffffc0007ffff,
+ 0xfffffffc000fffff, 0xfffffffc001fffff,
+ 0xfffffffc003fffff, 0xfffffffc007fffff,
+ 0xfffffffc00ffffff, 0xfffffffc01ffffff,
+ 0xfffffffc03ffffff, 0xfffffffc07ffffff,
+ 0xfffffffc0fffffff, 0xfffffffc1fffffff,
+ 0xfffffffc3fffffff, 0xfffffffc7fffffff,
+ 0xfffffffcfffffffc, 0xfffffffcffffffff,
+ 0xfffffffdfffffffd, 0xfffffffdffffffff,
+ 0xfffffffe00000000, 0xfffffffe00000001,
+ 0xfffffffe00000003, 0xfffffffe00000007,
+ 0xfffffffe0000000f, 0xfffffffe0000001f,
+ 0xfffffffe0000003f, 0xfffffffe0000007f,
+ 0xfffffffe000000ff, 0xfffffffe000001ff,
+ 0xfffffffe000003ff, 0xfffffffe000007ff,
+ 0xfffffffe00000fff, 0xfffffffe00001fff,
+ 0xfffffffe00003fff, 0xfffffffe00007fff,
+ 0xfffffffe0000ffff, 0xfffffffe0001ffff,
+ 0xfffffffe0003ffff, 0xfffffffe0007ffff,
+ 0xfffffffe000fffff, 0xfffffffe001fffff,
+ 0xfffffffe003fffff, 0xfffffffe007fffff,
+ 0xfffffffe00ffffff, 0xfffffffe01ffffff,
+ 0xfffffffe03ffffff, 0xfffffffe07ffffff,
+ 0xfffffffe0fffffff, 0xfffffffe1fffffff,
+ 0xfffffffe3fffffff, 0xfffffffe7fffffff,
+ 0xfffffffefffffffe, 0xfffffffeffffffff,
+ 0xffffffff00000000, 0xffffffff00000001,
+ 0xffffffff00000003, 0xffffffff00000007,
+ 0xffffffff0000000f, 0xffffffff0000001f,
+ 0xffffffff0000003f, 0xffffffff0000007f,
+ 0xffffffff000000ff, 0xffffffff000001ff,
+ 0xffffffff000003ff, 0xffffffff000007ff,
+ 0xffffffff00000fff, 0xffffffff00001fff,
+ 0xffffffff00003fff, 0xffffffff00007fff,
+ 0xffffffff0000ffff, 0xffffffff0001ffff,
+ 0xffffffff0003ffff, 0xffffffff0007ffff,
+ 0xffffffff000fffff, 0xffffffff001fffff,
+ 0xffffffff003fffff, 0xffffffff007fffff,
+ 0xffffffff00ffffff, 0xffffffff01ffffff,
+ 0xffffffff03ffffff, 0xffffffff07ffffff,
+ 0xffffffff0fffffff, 0xffffffff1fffffff,
+ 0xffffffff3fffffff, 0xffffffff7fffffff,
+ 0xffffffff80000000, 0xffffffff80000001,
+ 0xffffffff80000003, 0xffffffff80000007,
+ 0xffffffff8000000f, 0xffffffff8000001f,
+ 0xffffffff8000003f, 0xffffffff8000007f,
+ 0xffffffff800000ff, 0xffffffff800001ff,
+ 0xffffffff800003ff, 0xffffffff800007ff,
+ 0xffffffff80000fff, 0xffffffff80001fff,
+ 0xffffffff80003fff, 0xffffffff80007fff,
+ 0xffffffff8000ffff, 0xffffffff8001ffff,
+ 0xffffffff8003ffff, 0xffffffff8007ffff,
+ 0xffffffff800fffff, 0xffffffff801fffff,
+ 0xffffffff803fffff, 0xffffffff807fffff,
+ 0xffffffff80ffffff, 0xffffffff81ffffff,
+ 0xffffffff83ffffff, 0xffffffff87ffffff,
+ 0xffffffff8fffffff, 0xffffffff9fffffff,
+ 0xffffffffbfffffff, 0xffffffffc0000000,
+ 0xffffffffc0000001, 0xffffffffc0000003,
+ 0xffffffffc0000007, 0xffffffffc000000f,
+ 0xffffffffc000001f, 0xffffffffc000003f,
+ 0xffffffffc000007f, 0xffffffffc00000ff,
+ 0xffffffffc00001ff, 0xffffffffc00003ff,
+ 0xffffffffc00007ff, 0xffffffffc0000fff,
+ 0xffffffffc0001fff, 0xffffffffc0003fff,
+ 0xffffffffc0007fff, 0xffffffffc000ffff,
+ 0xffffffffc001ffff, 0xffffffffc003ffff,
+ 0xffffffffc007ffff, 0xffffffffc00fffff,
+ 0xffffffffc01fffff, 0xffffffffc03fffff,
+ 0xffffffffc07fffff, 0xffffffffc0ffffff,
+ 0xffffffffc1ffffff, 0xffffffffc3ffffff,
+ 0xffffffffc7ffffff, 0xffffffffcfffffff,
+ 0xffffffffdfffffff, 0xffffffffe0000000,
+ 0xffffffffe0000001, 0xffffffffe0000003,
+ 0xffffffffe0000007, 0xffffffffe000000f,
+ 0xffffffffe000001f, 0xffffffffe000003f,
+ 0xffffffffe000007f, 0xffffffffe00000ff,
+ 0xffffffffe00001ff, 0xffffffffe00003ff,
+ 0xffffffffe00007ff, 0xffffffffe0000fff,
+ 0xffffffffe0001fff, 0xffffffffe0003fff,
+ 0xffffffffe0007fff, 0xffffffffe000ffff,
+ 0xffffffffe001ffff, 0xffffffffe003ffff,
+ 0xffffffffe007ffff, 0xffffffffe00fffff,
+ 0xffffffffe01fffff, 0xffffffffe03fffff,
+ 0xffffffffe07fffff, 0xffffffffe0ffffff,
+ 0xffffffffe1ffffff, 0xffffffffe3ffffff,
+ 0xffffffffe7ffffff, 0xffffffffefffffff,
+ 0xfffffffff0000000, 0xfffffffff0000001,
+ 0xfffffffff0000003, 0xfffffffff0000007,
+ 0xfffffffff000000f, 0xfffffffff000001f,
+ 0xfffffffff000003f, 0xfffffffff000007f,
+ 0xfffffffff00000ff, 0xfffffffff00001ff,
+ 0xfffffffff00003ff, 0xfffffffff00007ff,
+ 0xfffffffff0000fff, 0xfffffffff0001fff,
+ 0xfffffffff0003fff, 0xfffffffff0007fff,
+ 0xfffffffff000ffff, 0xfffffffff001ffff,
+ 0xfffffffff003ffff, 0xfffffffff007ffff,
+ 0xfffffffff00fffff, 0xfffffffff01fffff,
+ 0xfffffffff03fffff, 0xfffffffff07fffff,
+ 0xfffffffff0ffffff, 0xfffffffff1ffffff,
+ 0xfffffffff3ffffff, 0xfffffffff7ffffff,
+ 0xfffffffff8000000, 0xfffffffff8000001,
+ 0xfffffffff8000003, 0xfffffffff8000007,
+ 0xfffffffff800000f, 0xfffffffff800001f,
+ 0xfffffffff800003f, 0xfffffffff800007f,
+ 0xfffffffff80000ff, 0xfffffffff80001ff,
+ 0xfffffffff80003ff, 0xfffffffff80007ff,
+ 0xfffffffff8000fff, 0xfffffffff8001fff,
+ 0xfffffffff8003fff, 0xfffffffff8007fff,
+ 0xfffffffff800ffff, 0xfffffffff801ffff,
+ 0xfffffffff803ffff, 0xfffffffff807ffff,
+ 0xfffffffff80fffff, 0xfffffffff81fffff,
+ 0xfffffffff83fffff, 0xfffffffff87fffff,
+ 0xfffffffff8ffffff, 0xfffffffff9ffffff,
+ 0xfffffffffbffffff, 0xfffffffffc000000,
+ 0xfffffffffc000001, 0xfffffffffc000003,
+ 0xfffffffffc000007, 0xfffffffffc00000f,
+ 0xfffffffffc00001f, 0xfffffffffc00003f,
+ 0xfffffffffc00007f, 0xfffffffffc0000ff,
+ 0xfffffffffc0001ff, 0xfffffffffc0003ff,
+ 0xfffffffffc0007ff, 0xfffffffffc000fff,
+ 0xfffffffffc001fff, 0xfffffffffc003fff,
+ 0xfffffffffc007fff, 0xfffffffffc00ffff,
+ 0xfffffffffc01ffff, 0xfffffffffc03ffff,
+ 0xfffffffffc07ffff, 0xfffffffffc0fffff,
+ 0xfffffffffc1fffff, 0xfffffffffc3fffff,
+ 0xfffffffffc7fffff, 0xfffffffffcffffff,
+ 0xfffffffffdffffff, 0xfffffffffe000000,
+ 0xfffffffffe000001, 0xfffffffffe000003,
+ 0xfffffffffe000007, 0xfffffffffe00000f,
+ 0xfffffffffe00001f, 0xfffffffffe00003f,
+ 0xfffffffffe00007f, 0xfffffffffe0000ff,
+ 0xfffffffffe0001ff, 0xfffffffffe0003ff,
+ 0xfffffffffe0007ff, 0xfffffffffe000fff,
+ 0xfffffffffe001fff, 0xfffffffffe003fff,
+ 0xfffffffffe007fff, 0xfffffffffe00ffff,
+ 0xfffffffffe01ffff, 0xfffffffffe03ffff,
+ 0xfffffffffe07ffff, 0xfffffffffe0fffff,
+ 0xfffffffffe1fffff, 0xfffffffffe3fffff,
+ 0xfffffffffe7fffff, 0xfffffffffeffffff,
+ 0xffffffffff000000, 0xffffffffff000001,
+ 0xffffffffff000003, 0xffffffffff000007,
+ 0xffffffffff00000f, 0xffffffffff00001f,
+ 0xffffffffff00003f, 0xffffffffff00007f,
+ 0xffffffffff0000ff, 0xffffffffff0001ff,
+ 0xffffffffff0003ff, 0xffffffffff0007ff,
+ 0xffffffffff000fff, 0xffffffffff001fff,
+ 0xffffffffff003fff, 0xffffffffff007fff,
+ 0xffffffffff00ffff, 0xffffffffff01ffff,
+ 0xffffffffff03ffff, 0xffffffffff07ffff,
+ 0xffffffffff0fffff, 0xffffffffff1fffff,
+ 0xffffffffff3fffff, 0xffffffffff7fffff,
+ 0xffffffffff800000, 0xffffffffff800001,
+ 0xffffffffff800003, 0xffffffffff800007,
+ 0xffffffffff80000f, 0xffffffffff80001f,
+ 0xffffffffff80003f, 0xffffffffff80007f,
+ 0xffffffffff8000ff, 0xffffffffff8001ff,
+ 0xffffffffff8003ff, 0xffffffffff8007ff,
+ 0xffffffffff800fff, 0xffffffffff801fff,
+ 0xffffffffff803fff, 0xffffffffff807fff,
+ 0xffffffffff80ffff, 0xffffffffff81ffff,
+ 0xffffffffff83ffff, 0xffffffffff87ffff,
+ 0xffffffffff8fffff, 0xffffffffff9fffff,
+ 0xffffffffffbfffff, 0xffffffffffc00000,
+ 0xffffffffffc00001, 0xffffffffffc00003,
+ 0xffffffffffc00007, 0xffffffffffc0000f,
+ 0xffffffffffc0001f, 0xffffffffffc0003f,
+ 0xffffffffffc0007f, 0xffffffffffc000ff,
+ 0xffffffffffc001ff, 0xffffffffffc003ff,
+ 0xffffffffffc007ff, 0xffffffffffc00fff,
+ 0xffffffffffc01fff, 0xffffffffffc03fff,
+ 0xffffffffffc07fff, 0xffffffffffc0ffff,
+ 0xffffffffffc1ffff, 0xffffffffffc3ffff,
+ 0xffffffffffc7ffff, 0xffffffffffcfffff,
+ 0xffffffffffdfffff, 0xffffffffffe00000,
+ 0xffffffffffe00001, 0xffffffffffe00003,
+ 0xffffffffffe00007, 0xffffffffffe0000f,
+ 0xffffffffffe0001f, 0xffffffffffe0003f,
+ 0xffffffffffe0007f, 0xffffffffffe000ff,
+ 0xffffffffffe001ff, 0xffffffffffe003ff,
+ 0xffffffffffe007ff, 0xffffffffffe00fff,
+ 0xffffffffffe01fff, 0xffffffffffe03fff,
+ 0xffffffffffe07fff, 0xffffffffffe0ffff,
+ 0xffffffffffe1ffff, 0xffffffffffe3ffff,
+ 0xffffffffffe7ffff, 0xffffffffffefffff,
+ 0xfffffffffff00000, 0xfffffffffff00001,
+ 0xfffffffffff00003, 0xfffffffffff00007,
+ 0xfffffffffff0000f, 0xfffffffffff0001f,
+ 0xfffffffffff0003f, 0xfffffffffff0007f,
+ 0xfffffffffff000ff, 0xfffffffffff001ff,
+ 0xfffffffffff003ff, 0xfffffffffff007ff,
+ 0xfffffffffff00fff, 0xfffffffffff01fff,
+ 0xfffffffffff03fff, 0xfffffffffff07fff,
+ 0xfffffffffff0ffff, 0xfffffffffff1ffff,
+ 0xfffffffffff3ffff, 0xfffffffffff7ffff,
+ 0xfffffffffff80000, 0xfffffffffff80001,
+ 0xfffffffffff80003, 0xfffffffffff80007,
+ 0xfffffffffff8000f, 0xfffffffffff8001f,
+ 0xfffffffffff8003f, 0xfffffffffff8007f,
+ 0xfffffffffff800ff, 0xfffffffffff801ff,
+ 0xfffffffffff803ff, 0xfffffffffff807ff,
+ 0xfffffffffff80fff, 0xfffffffffff81fff,
+ 0xfffffffffff83fff, 0xfffffffffff87fff,
+ 0xfffffffffff8ffff, 0xfffffffffff9ffff,
+ 0xfffffffffffbffff, 0xfffffffffffc0000,
+ 0xfffffffffffc0001, 0xfffffffffffc0003,
+ 0xfffffffffffc0007, 0xfffffffffffc000f,
+ 0xfffffffffffc001f, 0xfffffffffffc003f,
+ 0xfffffffffffc007f, 0xfffffffffffc00ff,
+ 0xfffffffffffc01ff, 0xfffffffffffc03ff,
+ 0xfffffffffffc07ff, 0xfffffffffffc0fff,
+ 0xfffffffffffc1fff, 0xfffffffffffc3fff,
+ 0xfffffffffffc7fff, 0xfffffffffffcffff,
+ 0xfffffffffffdffff, 0xfffffffffffe0000,
+ 0xfffffffffffe0001, 0xfffffffffffe0003,
+ 0xfffffffffffe0007, 0xfffffffffffe000f,
+ 0xfffffffffffe001f, 0xfffffffffffe003f,
+ 0xfffffffffffe007f, 0xfffffffffffe00ff,
+ 0xfffffffffffe01ff, 0xfffffffffffe03ff,
+ 0xfffffffffffe07ff, 0xfffffffffffe0fff,
+ 0xfffffffffffe1fff, 0xfffffffffffe3fff,
+ 0xfffffffffffe7fff, 0xfffffffffffeffff,
+ 0xffffffffffff0000, 0xffffffffffff0001,
+ 0xffffffffffff0003, 0xffffffffffff0007,
+ 0xffffffffffff000f, 0xffffffffffff001f,
+ 0xffffffffffff003f, 0xffffffffffff007f,
+ 0xffffffffffff00ff, 0xffffffffffff01ff,
+ 0xffffffffffff03ff, 0xffffffffffff07ff,
+ 0xffffffffffff0fff, 0xffffffffffff1fff,
+ 0xffffffffffff3fff, 0xffffffffffff7fff,
+ 0xffffffffffff8000, 0xffffffffffff8001,
+ 0xffffffffffff8003, 0xffffffffffff8007,
+ 0xffffffffffff800f, 0xffffffffffff801f,
+ 0xffffffffffff803f, 0xffffffffffff807f,
+ 0xffffffffffff80ff, 0xffffffffffff81ff,
+ 0xffffffffffff83ff, 0xffffffffffff87ff,
+ 0xffffffffffff8fff, 0xffffffffffff9fff,
+ 0xffffffffffffbfff, 0xffffffffffffc000,
+ 0xffffffffffffc001, 0xffffffffffffc003,
+ 0xffffffffffffc007, 0xffffffffffffc00f,
+ 0xffffffffffffc01f, 0xffffffffffffc03f,
+ 0xffffffffffffc07f, 0xffffffffffffc0ff,
+ 0xffffffffffffc1ff, 0xffffffffffffc3ff,
+ 0xffffffffffffc7ff, 0xffffffffffffcfff,
+ 0xffffffffffffdfff, 0xffffffffffffe000,
+ 0xffffffffffffe001, 0xffffffffffffe003,
+ 0xffffffffffffe007, 0xffffffffffffe00f,
+ 0xffffffffffffe01f, 0xffffffffffffe03f,
+ 0xffffffffffffe07f, 0xffffffffffffe0ff,
+ 0xffffffffffffe1ff, 0xffffffffffffe3ff,
+ 0xffffffffffffe7ff, 0xffffffffffffefff,
+ 0xfffffffffffff000, 0xfffffffffffff001,
+ 0xfffffffffffff003, 0xfffffffffffff007,
+ 0xfffffffffffff00f, 0xfffffffffffff01f,
+ 0xfffffffffffff03f, 0xfffffffffffff07f,
+ 0xfffffffffffff0ff, 0xfffffffffffff1ff,
+ 0xfffffffffffff3ff, 0xfffffffffffff7ff,
+ 0xfffffffffffff800, 0xfffffffffffff801,
+ 0xfffffffffffff803, 0xfffffffffffff807,
+ 0xfffffffffffff80f, 0xfffffffffffff81f,
+ 0xfffffffffffff83f, 0xfffffffffffff87f,
+ 0xfffffffffffff8ff, 0xfffffffffffff9ff,
+ 0xfffffffffffffbff, 0xfffffffffffffc00,
+ 0xfffffffffffffc01, 0xfffffffffffffc03,
+ 0xfffffffffffffc07, 0xfffffffffffffc0f,
+ 0xfffffffffffffc1f, 0xfffffffffffffc3f,
+ 0xfffffffffffffc7f, 0xfffffffffffffcff,
+ 0xfffffffffffffdff, 0xfffffffffffffe00,
+ 0xfffffffffffffe01, 0xfffffffffffffe03,
+ 0xfffffffffffffe07, 0xfffffffffffffe0f,
+ 0xfffffffffffffe1f, 0xfffffffffffffe3f,
+ 0xfffffffffffffe7f, 0xfffffffffffffeff,
+ 0xffffffffffffff00, 0xffffffffffffff01,
+ 0xffffffffffffff03, 0xffffffffffffff07,
+ 0xffffffffffffff0f, 0xffffffffffffff1f,
+ 0xffffffffffffff3f, 0xffffffffffffff7f,
+ 0xffffffffffffff80, 0xffffffffffffff81,
+ 0xffffffffffffff83, 0xffffffffffffff87,
+ 0xffffffffffffff8f, 0xffffffffffffff9f,
+ 0xffffffffffffffbf, 0xffffffffffffffc0,
+ 0xffffffffffffffc1, 0xffffffffffffffc3,
+ 0xffffffffffffffc7, 0xffffffffffffffcf,
+ 0xffffffffffffffdf, 0xffffffffffffffe0,
+ 0xffffffffffffffe1, 0xffffffffffffffe3,
+ 0xffffffffffffffe7, 0xffffffffffffffef,
+ 0xfffffffffffffff0, 0xfffffffffffffff1,
+ 0xfffffffffffffff3, 0xfffffffffffffff7,
+ 0xfffffffffffffff8, 0xfffffffffffffff9,
+ 0xfffffffffffffffb, 0xfffffffffffffffc,
+ 0xfffffffffffffffd, 0xfffffffffffffffe,
+};
+
+static uint16_t const bitmask_enc[] = {
+ 0x1000, 0x1fc0,
+ 0x1001, 0x1f80,
+ 0x1fc1, 0x1002,
+ 0x1f40, 0x1f81,
+ 0x1fc2, 0x1003,
+ 0x1f00, 0x1f41,
+ 0x1f82, 0x1fc3,
+ 0x1004, 0x1ec0,
+ 0x1f01, 0x1f42,
+ 0x1f83, 0x1fc4,
+ 0x1005, 0x1e80,
+ 0x1ec1, 0x1f02,
+ 0x1f43, 0x1f84,
+ 0x1fc5, 0x1006,
+ 0x1e40, 0x1e81,
+ 0x1ec2, 0x1f03,
+ 0x1f44, 0x1f85,
+ 0x1fc6, 0x1007,
+ 0x1e00, 0x1e41,
+ 0x1e82, 0x1ec3,
+ 0x1f04, 0x1f45,
+ 0x1f86, 0x1fc7,
+ 0x1008, 0x1dc0,
+ 0x1e01, 0x1e42,
+ 0x1e83, 0x1ec4,
+ 0x1f05, 0x1f46,
+ 0x1f87, 0x1fc8,
+ 0x1009, 0x1d80,
+ 0x1dc1, 0x1e02,
+ 0x1e43, 0x1e84,
+ 0x1ec5, 0x1f06,
+ 0x1f47, 0x1f88,
+ 0x1fc9, 0x100a,
+ 0x1d40, 0x1d81,
+ 0x1dc2, 0x1e03,
+ 0x1e44, 0x1e85,
+ 0x1ec6, 0x1f07,
+ 0x1f48, 0x1f89,
+ 0x1fca, 0x100b,
+ 0x1d00, 0x1d41,
+ 0x1d82, 0x1dc3,
+ 0x1e04, 0x1e45,
+ 0x1e86, 0x1ec7,
+ 0x1f08, 0x1f49,
+ 0x1f8a, 0x1fcb,
+ 0x100c, 0x1cc0,
+ 0x1d01, 0x1d42,
+ 0x1d83, 0x1dc4,
+ 0x1e05, 0x1e46,
+ 0x1e87, 0x1ec8,
+ 0x1f09, 0x1f4a,
+ 0x1f8b, 0x1fcc,
+ 0x100d, 0x1c80,
+ 0x1cc1, 0x1d02,
+ 0x1d43, 0x1d84,
+ 0x1dc5, 0x1e06,
+ 0x1e47, 0x1e88,
+ 0x1ec9, 0x1f0a,
+ 0x1f4b, 0x1f8c,
+ 0x1fcd, 0x100e,
+ 0x1c40, 0x1c81,
+ 0x1cc2, 0x1d03,
+ 0x1d44, 0x1d85,
+ 0x1dc6, 0x1e07,
+ 0x1e48, 0x1e89,
+ 0x1eca, 0x1f0b,
+ 0x1f4c, 0x1f8d,
+ 0x1fce, 0x100f,
+ 0x1c00, 0x1c41,
+ 0x1c82, 0x1cc3,
+ 0x1d04, 0x1d45,
+ 0x1d86, 0x1dc7,
+ 0x1e08, 0x1e49,
+ 0x1e8a, 0x1ecb,
+ 0x1f0c, 0x1f4d,
+ 0x1f8e, 0x1fcf,
+ 0x1010, 0x1bc0,
+ 0x1c01, 0x1c42,
+ 0x1c83, 0x1cc4,
+ 0x1d05, 0x1d46,
+ 0x1d87, 0x1dc8,
+ 0x1e09, 0x1e4a,
+ 0x1e8b, 0x1ecc,
+ 0x1f0d, 0x1f4e,
+ 0x1f8f, 0x1fd0,
+ 0x1011, 0x1b80,
+ 0x1bc1, 0x1c02,
+ 0x1c43, 0x1c84,
+ 0x1cc5, 0x1d06,
+ 0x1d47, 0x1d88,
+ 0x1dc9, 0x1e0a,
+ 0x1e4b, 0x1e8c,
+ 0x1ecd, 0x1f0e,
+ 0x1f4f, 0x1f90,
+ 0x1fd1, 0x1012,
+ 0x1b40, 0x1b81,
+ 0x1bc2, 0x1c03,
+ 0x1c44, 0x1c85,
+ 0x1cc6, 0x1d07,
+ 0x1d48, 0x1d89,
+ 0x1dca, 0x1e0b,
+ 0x1e4c, 0x1e8d,
+ 0x1ece, 0x1f0f,
+ 0x1f50, 0x1f91,
+ 0x1fd2, 0x1013,
+ 0x1b00, 0x1b41,
+ 0x1b82, 0x1bc3,
+ 0x1c04, 0x1c45,
+ 0x1c86, 0x1cc7,
+ 0x1d08, 0x1d49,
+ 0x1d8a, 0x1dcb,
+ 0x1e0c, 0x1e4d,
+ 0x1e8e, 0x1ecf,
+ 0x1f10, 0x1f51,
+ 0x1f92, 0x1fd3,
+ 0x1014, 0x1ac0,
+ 0x1b01, 0x1b42,
+ 0x1b83, 0x1bc4,
+ 0x1c05, 0x1c46,
+ 0x1c87, 0x1cc8,
+ 0x1d09, 0x1d4a,
+ 0x1d8b, 0x1dcc,
+ 0x1e0d, 0x1e4e,
+ 0x1e8f, 0x1ed0,
+ 0x1f11, 0x1f52,
+ 0x1f93, 0x1fd4,
+ 0x1015, 0x1a80,
+ 0x1ac1, 0x1b02,
+ 0x1b43, 0x1b84,
+ 0x1bc5, 0x1c06,
+ 0x1c47, 0x1c88,
+ 0x1cc9, 0x1d0a,
+ 0x1d4b, 0x1d8c,
+ 0x1dcd, 0x1e0e,
+ 0x1e4f, 0x1e90,
+ 0x1ed1, 0x1f12,
+ 0x1f53, 0x1f94,
+ 0x1fd5, 0x1016,
+ 0x1a40, 0x1a81,
+ 0x1ac2, 0x1b03,
+ 0x1b44, 0x1b85,
+ 0x1bc6, 0x1c07,
+ 0x1c48, 0x1c89,
+ 0x1cca, 0x1d0b,
+ 0x1d4c, 0x1d8d,
+ 0x1dce, 0x1e0f,
+ 0x1e50, 0x1e91,
+ 0x1ed2, 0x1f13,
+ 0x1f54, 0x1f95,
+ 0x1fd6, 0x1017,
+ 0x1a00, 0x1a41,
+ 0x1a82, 0x1ac3,
+ 0x1b04, 0x1b45,
+ 0x1b86, 0x1bc7,
+ 0x1c08, 0x1c49,
+ 0x1c8a, 0x1ccb,
+ 0x1d0c, 0x1d4d,
+ 0x1d8e, 0x1dcf,
+ 0x1e10, 0x1e51,
+ 0x1e92, 0x1ed3,
+ 0x1f14, 0x1f55,
+ 0x1f96, 0x1fd7,
+ 0x1018, 0x19c0,
+ 0x1a01, 0x1a42,
+ 0x1a83, 0x1ac4,
+ 0x1b05, 0x1b46,
+ 0x1b87, 0x1bc8,
+ 0x1c09, 0x1c4a,
+ 0x1c8b, 0x1ccc,
+ 0x1d0d, 0x1d4e,
+ 0x1d8f, 0x1dd0,
+ 0x1e11, 0x1e52,
+ 0x1e93, 0x1ed4,
+ 0x1f15, 0x1f56,
+ 0x1f97, 0x1fd8,
+ 0x1019, 0x1980,
+ 0x19c1, 0x1a02,
+ 0x1a43, 0x1a84,
+ 0x1ac5, 0x1b06,
+ 0x1b47, 0x1b88,
+ 0x1bc9, 0x1c0a,
+ 0x1c4b, 0x1c8c,
+ 0x1ccd, 0x1d0e,
+ 0x1d4f, 0x1d90,
+ 0x1dd1, 0x1e12,
+ 0x1e53, 0x1e94,
+ 0x1ed5, 0x1f16,
+ 0x1f57, 0x1f98,
+ 0x1fd9, 0x101a,
+ 0x1940, 0x1981,
+ 0x19c2, 0x1a03,
+ 0x1a44, 0x1a85,
+ 0x1ac6, 0x1b07,
+ 0x1b48, 0x1b89,
+ 0x1bca, 0x1c0b,
+ 0x1c4c, 0x1c8d,
+ 0x1cce, 0x1d0f,
+ 0x1d50, 0x1d91,
+ 0x1dd2, 0x1e13,
+ 0x1e54, 0x1e95,
+ 0x1ed6, 0x1f17,
+ 0x1f58, 0x1f99,
+ 0x1fda, 0x101b,
+ 0x1900, 0x1941,
+ 0x1982, 0x19c3,
+ 0x1a04, 0x1a45,
+ 0x1a86, 0x1ac7,
+ 0x1b08, 0x1b49,
+ 0x1b8a, 0x1bcb,
+ 0x1c0c, 0x1c4d,
+ 0x1c8e, 0x1ccf,
+ 0x1d10, 0x1d51,
+ 0x1d92, 0x1dd3,
+ 0x1e14, 0x1e55,
+ 0x1e96, 0x1ed7,
+ 0x1f18, 0x1f59,
+ 0x1f9a, 0x1fdb,
+ 0x101c, 0x18c0,
+ 0x1901, 0x1942,
+ 0x1983, 0x19c4,
+ 0x1a05, 0x1a46,
+ 0x1a87, 0x1ac8,
+ 0x1b09, 0x1b4a,
+ 0x1b8b, 0x1bcc,
+ 0x1c0d, 0x1c4e,
+ 0x1c8f, 0x1cd0,
+ 0x1d11, 0x1d52,
+ 0x1d93, 0x1dd4,
+ 0x1e15, 0x1e56,
+ 0x1e97, 0x1ed8,
+ 0x1f19, 0x1f5a,
+ 0x1f9b, 0x1fdc,
+ 0x101d, 0x1880,
+ 0x18c1, 0x1902,
+ 0x1943, 0x1984,
+ 0x19c5, 0x1a06,
+ 0x1a47, 0x1a88,
+ 0x1ac9, 0x1b0a,
+ 0x1b4b, 0x1b8c,
+ 0x1bcd, 0x1c0e,
+ 0x1c4f, 0x1c90,
+ 0x1cd1, 0x1d12,
+ 0x1d53, 0x1d94,
+ 0x1dd5, 0x1e16,
+ 0x1e57, 0x1e98,
+ 0x1ed9, 0x1f1a,
+ 0x1f5b, 0x1f9c,
+ 0x1fdd, 0x101e,
+ 0x1840, 0x1881,
+ 0x18c2, 0x1903,
+ 0x1944, 0x1985,
+ 0x19c6, 0x1a07,
+ 0x1a48, 0x1a89,
+ 0x1aca, 0x1b0b,
+ 0x1b4c, 0x1b8d,
+ 0x1bce, 0x1c0f,
+ 0x1c50, 0x1c91,
+ 0x1cd2, 0x1d13,
+ 0x1d54, 0x1d95,
+ 0x1dd6, 0x1e17,
+ 0x1e58, 0x1e99,
+ 0x1eda, 0x1f1b,
+ 0x1f5c, 0x1f9d,
+ 0x1fde, 0x101f,
+ 0x1800, 000000,
+ 0x1841, 0x1882,
+ 0x18c3, 0x1904,
+ 0x1945, 0x1986,
+ 0x19c7, 0x1a08,
+ 0x1a49, 0x1a8a,
+ 0x1acb, 0x1b0c,
+ 0x1b4d, 0x1b8e,
+ 0x1bcf, 0x1c10,
+ 0x1c51, 0x1c92,
+ 0x1cd3, 0x1d14,
+ 0x1d55, 0x1d96,
+ 0x1dd7, 0x1e18,
+ 0x1e59, 0x1e9a,
+ 0x1edb, 0x1f1c,
+ 0x1f5d, 0x1f9e,
+ 0x1fdf, 0x1020,
+ 0x17c0, 0x07c0,
+ 0x1801, 0x0001,
+ 0x1842, 0x1883,
+ 0x18c4, 0x1905,
+ 0x1946, 0x1987,
+ 0x19c8, 0x1a09,
+ 0x1a4a, 0x1a8b,
+ 0x1acc, 0x1b0d,
+ 0x1b4e, 0x1b8f,
+ 0x1bd0, 0x1c11,
+ 0x1c52, 0x1c93,
+ 0x1cd4, 0x1d15,
+ 0x1d56, 0x1d97,
+ 0x1dd8, 0x1e19,
+ 0x1e5a, 0x1e9b,
+ 0x1edc, 0x1f1d,
+ 0x1f5e, 0x1f9f,
+ 0x1fe0, 0x1021,
+ 0x1780, 0x0780,
+ 0x17c1, 0x07c1,
+ 0x1802, 0x0002,
+ 0x1843, 0x1884,
+ 0x18c5, 0x1906,
+ 0x1947, 0x1988,
+ 0x19c9, 0x1a0a,
+ 0x1a4b, 0x1a8c,
+ 0x1acd, 0x1b0e,
+ 0x1b4f, 0x1b90,
+ 0x1bd1, 0x1c12,
+ 0x1c53, 0x1c94,
+ 0x1cd5, 0x1d16,
+ 0x1d57, 0x1d98,
+ 0x1dd9, 0x1e1a,
+ 0x1e5b, 0x1e9c,
+ 0x1edd, 0x1f1e,
+ 0x1f5f, 0x1fa0,
+ 0x1fe1, 0x1022,
+ 0x1740, 0x0740,
+ 0x1781, 0x0781,
+ 0x17c2, 0x07c2,
+ 0x1803, 0x0003,
+ 0x1844, 0x1885,
+ 0x18c6, 0x1907,
+ 0x1948, 0x1989,
+ 0x19ca, 0x1a0b,
+ 0x1a4c, 0x1a8d,
+ 0x1ace, 0x1b0f,
+ 0x1b50, 0x1b91,
+ 0x1bd2, 0x1c13,
+ 0x1c54, 0x1c95,
+ 0x1cd6, 0x1d17,
+ 0x1d58, 0x1d99,
+ 0x1dda, 0x1e1b,
+ 0x1e5c, 0x1e9d,
+ 0x1ede, 0x1f1f,
+ 0x1f60, 0x1fa1,
+ 0x1fe2, 0x1023,
+ 0x1700, 0x0700,
+ 0x1741, 0x0741,
+ 0x1782, 0x0782,
+ 0x17c3, 0x07c3,
+ 0x1804, 0x0004,
+ 0x1845, 0x1886,
+ 0x18c7, 0x1908,
+ 0x1949, 0x198a,
+ 0x19cb, 0x1a0c,
+ 0x1a4d, 0x1a8e,
+ 0x1acf, 0x1b10,
+ 0x1b51, 0x1b92,
+ 0x1bd3, 0x1c14,
+ 0x1c55, 0x1c96,
+ 0x1cd7, 0x1d18,
+ 0x1d59, 0x1d9a,
+ 0x1ddb, 0x1e1c,
+ 0x1e5d, 0x1e9e,
+ 0x1edf, 0x1f20,
+ 0x1f61, 0x1fa2,
+ 0x1fe3, 0x1024,
+ 0x16c0, 0x06c0,
+ 0x1701, 0x0701,
+ 0x1742, 0x0742,
+ 0x1783, 0x0783,
+ 0x17c4, 0x07c4,
+ 0x1805, 0x0005,
+ 0x1846, 0x1887,
+ 0x18c8, 0x1909,
+ 0x194a, 0x198b,
+ 0x19cc, 0x1a0d,
+ 0x1a4e, 0x1a8f,
+ 0x1ad0, 0x1b11,
+ 0x1b52, 0x1b93,
+ 0x1bd4, 0x1c15,
+ 0x1c56, 0x1c97,
+ 0x1cd8, 0x1d19,
+ 0x1d5a, 0x1d9b,
+ 0x1ddc, 0x1e1d,
+ 0x1e5e, 0x1e9f,
+ 0x1ee0, 0x1f21,
+ 0x1f62, 0x1fa3,
+ 0x1fe4, 0x1025,
+ 0x1680, 0x0680,
+ 0x16c1, 0x06c1,
+ 0x1702, 0x0702,
+ 0x1743, 0x0743,
+ 0x1784, 0x0784,
+ 0x17c5, 0x07c5,
+ 0x1806, 0x0006,
+ 0x1847, 0x1888,
+ 0x18c9, 0x190a,
+ 0x194b, 0x198c,
+ 0x19cd, 0x1a0e,
+ 0x1a4f, 0x1a90,
+ 0x1ad1, 0x1b12,
+ 0x1b53, 0x1b94,
+ 0x1bd5, 0x1c16,
+ 0x1c57, 0x1c98,
+ 0x1cd9, 0x1d1a,
+ 0x1d5b, 0x1d9c,
+ 0x1ddd, 0x1e1e,
+ 0x1e5f, 0x1ea0,
+ 0x1ee1, 0x1f22,
+ 0x1f63, 0x1fa4,
+ 0x1fe5, 0x1026,
+ 0x1640, 0x0640,
+ 0x1681, 0x0681,
+ 0x16c2, 0x06c2,
+ 0x1703, 0x0703,
+ 0x1744, 0x0744,
+ 0x1785, 0x0785,
+ 0x17c6, 0x07c6,
+ 0x1807, 0x0007,
+ 0x1848, 0x1889,
+ 0x18ca, 0x190b,
+ 0x194c, 0x198d,
+ 0x19ce, 0x1a0f,
+ 0x1a50, 0x1a91,
+ 0x1ad2, 0x1b13,
+ 0x1b54, 0x1b95,
+ 0x1bd6, 0x1c17,
+ 0x1c58, 0x1c99,
+ 0x1cda, 0x1d1b,
+ 0x1d5c, 0x1d9d,
+ 0x1dde, 0x1e1f,
+ 0x1e60, 0x1ea1,
+ 0x1ee2, 0x1f23,
+ 0x1f64, 0x1fa5,
+ 0x1fe6, 0x1027,
+ 0x1600, 0x0600,
+ 0x1641, 0x0641,
+ 0x1682, 0x0682,
+ 0x16c3, 0x06c3,
+ 0x1704, 0x0704,
+ 0x1745, 0x0745,
+ 0x1786, 0x0786,
+ 0x17c7, 0x07c7,
+ 0x1808, 0x0008,
+ 0x1849, 0x188a,
+ 0x18cb, 0x190c,
+ 0x194d, 0x198e,
+ 0x19cf, 0x1a10,
+ 0x1a51, 0x1a92,
+ 0x1ad3, 0x1b14,
+ 0x1b55, 0x1b96,
+ 0x1bd7, 0x1c18,
+ 0x1c59, 0x1c9a,
+ 0x1cdb, 0x1d1c,
+ 0x1d5d, 0x1d9e,
+ 0x1ddf, 0x1e20,
+ 0x1e61, 0x1ea2,
+ 0x1ee3, 0x1f24,
+ 0x1f65, 0x1fa6,
+ 0x1fe7, 0x1028,
+ 0x15c0, 0x05c0,
+ 0x1601, 0x0601,
+ 0x1642, 0x0642,
+ 0x1683, 0x0683,
+ 0x16c4, 0x06c4,
+ 0x1705, 0x0705,
+ 0x1746, 0x0746,
+ 0x1787, 0x0787,
+ 0x17c8, 0x07c8,
+ 0x1809, 0x0009,
+ 0x184a, 0x188b,
+ 0x18cc, 0x190d,
+ 0x194e, 0x198f,
+ 0x19d0, 0x1a11,
+ 0x1a52, 0x1a93,
+ 0x1ad4, 0x1b15,
+ 0x1b56, 0x1b97,
+ 0x1bd8, 0x1c19,
+ 0x1c5a, 0x1c9b,
+ 0x1cdc, 0x1d1d,
+ 0x1d5e, 0x1d9f,
+ 0x1de0, 0x1e21,
+ 0x1e62, 0x1ea3,
+ 0x1ee4, 0x1f25,
+ 0x1f66, 0x1fa7,
+ 0x1fe8, 0x1029,
+ 0x1580, 0x0580,
+ 0x15c1, 0x05c1,
+ 0x1602, 0x0602,
+ 0x1643, 0x0643,
+ 0x1684, 0x0684,
+ 0x16c5, 0x06c5,
+ 0x1706, 0x0706,
+ 0x1747, 0x0747,
+ 0x1788, 0x0788,
+ 0x17c9, 0x07c9,
+ 0x180a, 0x000a,
+ 0x184b, 0x188c,
+ 0x18cd, 0x190e,
+ 0x194f, 0x1990,
+ 0x19d1, 0x1a12,
+ 0x1a53, 0x1a94,
+ 0x1ad5, 0x1b16,
+ 0x1b57, 0x1b98,
+ 0x1bd9, 0x1c1a,
+ 0x1c5b, 0x1c9c,
+ 0x1cdd, 0x1d1e,
+ 0x1d5f, 0x1da0,
+ 0x1de1, 0x1e22,
+ 0x1e63, 0x1ea4,
+ 0x1ee5, 0x1f26,
+ 0x1f67, 0x1fa8,
+ 0x1fe9, 0x102a,
+ 0x1540, 0x0540,
+ 0x1581, 0x0581,
+ 0x15c2, 0x05c2,
+ 0x1603, 0x0603,
+ 0x1644, 0x0644,
+ 0x1685, 0x0685,
+ 0x16c6, 0x06c6,
+ 0x1707, 0x0707,
+ 0x1748, 0x0748,
+ 0x1789, 0x0789,
+ 0x17ca, 0x07ca,
+ 0x180b, 0x000b,
+ 0x184c, 0x188d,
+ 0x18ce, 0x190f,
+ 0x1950, 0x1991,
+ 0x19d2, 0x1a13,
+ 0x1a54, 0x1a95,
+ 0x1ad6, 0x1b17,
+ 0x1b58, 0x1b99,
+ 0x1bda, 0x1c1b,
+ 0x1c5c, 0x1c9d,
+ 0x1cde, 0x1d1f,
+ 0x1d60, 0x1da1,
+ 0x1de2, 0x1e23,
+ 0x1e64, 0x1ea5,
+ 0x1ee6, 0x1f27,
+ 0x1f68, 0x1fa9,
+ 0x1fea, 0x102b,
+ 0x1500, 0x0500,
+ 0x1541, 0x0541,
+ 0x1582, 0x0582,
+ 0x15c3, 0x05c3,
+ 0x1604, 0x0604,
+ 0x1645, 0x0645,
+ 0x1686, 0x0686,
+ 0x16c7, 0x06c7,
+ 0x1708, 0x0708,
+ 0x1749, 0x0749,
+ 0x178a, 0x078a,
+ 0x17cb, 0x07cb,
+ 0x180c, 0x000c,
+ 0x184d, 0x188e,
+ 0x18cf, 0x1910,
+ 0x1951, 0x1992,
+ 0x19d3, 0x1a14,
+ 0x1a55, 0x1a96,
+ 0x1ad7, 0x1b18,
+ 0x1b59, 0x1b9a,
+ 0x1bdb, 0x1c1c,
+ 0x1c5d, 0x1c9e,
+ 0x1cdf, 0x1d20,
+ 0x1d61, 0x1da2,
+ 0x1de3, 0x1e24,
+ 0x1e65, 0x1ea6,
+ 0x1ee7, 0x1f28,
+ 0x1f69, 0x1faa,
+ 0x1feb, 0x102c,
+ 0x14c0, 0x04c0,
+ 0x1501, 0x0501,
+ 0x1542, 0x0542,
+ 0x1583, 0x0583,
+ 0x15c4, 0x05c4,
+ 0x1605, 0x0605,
+ 0x1646, 0x0646,
+ 0x1687, 0x0687,
+ 0x16c8, 0x06c8,
+ 0x1709, 0x0709,
+ 0x174a, 0x074a,
+ 0x178b, 0x078b,
+ 0x17cc, 0x07cc,
+ 0x180d, 0x000d,
+ 0x184e, 0x188f,
+ 0x18d0, 0x1911,
+ 0x1952, 0x1993,
+ 0x19d4, 0x1a15,
+ 0x1a56, 0x1a97,
+ 0x1ad8, 0x1b19,
+ 0x1b5a, 0x1b9b,
+ 0x1bdc, 0x1c1d,
+ 0x1c5e, 0x1c9f,
+ 0x1ce0, 0x1d21,
+ 0x1d62, 0x1da3,
+ 0x1de4, 0x1e25,
+ 0x1e66, 0x1ea7,
+ 0x1ee8, 0x1f29,
+ 0x1f6a, 0x1fab,
+ 0x1fec, 0x102d,
+ 0x1480, 0x0480,
+ 0x14c1, 0x04c1,
+ 0x1502, 0x0502,
+ 0x1543, 0x0543,
+ 0x1584, 0x0584,
+ 0x15c5, 0x05c5,
+ 0x1606, 0x0606,
+ 0x1647, 0x0647,
+ 0x1688, 0x0688,
+ 0x16c9, 0x06c9,
+ 0x170a, 0x070a,
+ 0x174b, 0x074b,
+ 0x178c, 0x078c,
+ 0x17cd, 0x07cd,
+ 0x180e, 0x000e,
+ 0x184f, 0x1890,
+ 0x18d1, 0x1912,
+ 0x1953, 0x1994,
+ 0x19d5, 0x1a16,
+ 0x1a57, 0x1a98,
+ 0x1ad9, 0x1b1a,
+ 0x1b5b, 0x1b9c,
+ 0x1bdd, 0x1c1e,
+ 0x1c5f, 0x1ca0,
+ 0x1ce1, 0x1d22,
+ 0x1d63, 0x1da4,
+ 0x1de5, 0x1e26,
+ 0x1e67, 0x1ea8,
+ 0x1ee9, 0x1f2a,
+ 0x1f6b, 0x1fac,
+ 0x1fed, 0x102e,
+ 0x1440, 0x0440,
+ 0x1481, 0x0481,
+ 0x14c2, 0x04c2,
+ 0x1503, 0x0503,
+ 0x1544, 0x0544,
+ 0x1585, 0x0585,
+ 0x15c6, 0x05c6,
+ 0x1607, 0x0607,
+ 0x1648, 0x0648,
+ 0x1689, 0x0689,
+ 0x16ca, 0x06ca,
+ 0x170b, 0x070b,
+ 0x174c, 0x074c,
+ 0x178d, 0x078d,
+ 0x17ce, 0x07ce,
+ 0x180f, 0x000f,
+ 0x1850, 0x1891,
+ 0x18d2, 0x1913,
+ 0x1954, 0x1995,
+ 0x19d6, 0x1a17,
+ 0x1a58, 0x1a99,
+ 0x1ada, 0x1b1b,
+ 0x1b5c, 0x1b9d,
+ 0x1bde, 0x1c1f,
+ 0x1c60, 0x1ca1,
+ 0x1ce2, 0x1d23,
+ 0x1d64, 0x1da5,
+ 0x1de6, 0x1e27,
+ 0x1e68, 0x1ea9,
+ 0x1eea, 0x1f2b,
+ 0x1f6c, 0x1fad,
+ 0x1fee, 0x102f,
+ 0x1400, 0x0400,
+ 0x0020, 0x1441,
+ 0x0441, 0x1482,
+ 0x0482, 0x14c3,
+ 0x04c3, 0x1504,
+ 0x0504, 0x1545,
+ 0x0545, 0x1586,
+ 0x0586, 0x15c7,
+ 0x05c7, 0x1608,
+ 0x0608, 0x1649,
+ 0x0649, 0x168a,
+ 0x068a, 0x16cb,
+ 0x06cb, 0x170c,
+ 0x070c, 0x174d,
+ 0x074d, 0x178e,
+ 0x078e, 0x17cf,
+ 0x07cf, 0x1810,
+ 0x0010, 0x1851,
+ 0x1892, 0x18d3,
+ 0x1914, 0x1955,
+ 0x1996, 0x19d7,
+ 0x1a18, 0x1a59,
+ 0x1a9a, 0x1adb,
+ 0x1b1c, 0x1b5d,
+ 0x1b9e, 0x1bdf,
+ 0x1c20, 0x1c61,
+ 0x1ca2, 0x1ce3,
+ 0x1d24, 0x1d65,
+ 0x1da6, 0x1de7,
+ 0x1e28, 0x1e69,
+ 0x1eaa, 0x1eeb,
+ 0x1f2c, 0x1f6d,
+ 0x1fae, 0x1fef,
+ 0x1030, 0x13c0,
+ 0x03c0, 0x03e0,
+ 0x1401, 0x0401,
+ 0x0021, 0x1442,
+ 0x0442, 0x1483,
+ 0x0483, 0x14c4,
+ 0x04c4, 0x1505,
+ 0x0505, 0x1546,
+ 0x0546, 0x1587,
+ 0x0587, 0x15c8,
+ 0x05c8, 0x1609,
+ 0x0609, 0x164a,
+ 0x064a, 0x168b,
+ 0x068b, 0x16cc,
+ 0x06cc, 0x170d,
+ 0x070d, 0x174e,
+ 0x074e, 0x178f,
+ 0x078f, 0x17d0,
+ 0x07d0, 0x1811,
+ 0x0011, 0x1852,
+ 0x1893, 0x18d4,
+ 0x1915, 0x1956,
+ 0x1997, 0x19d8,
+ 0x1a19, 0x1a5a,
+ 0x1a9b, 0x1adc,
+ 0x1b1d, 0x1b5e,
+ 0x1b9f, 0x1be0,
+ 0x1c21, 0x1c62,
+ 0x1ca3, 0x1ce4,
+ 0x1d25, 0x1d66,
+ 0x1da7, 0x1de8,
+ 0x1e29, 0x1e6a,
+ 0x1eab, 0x1eec,
+ 0x1f2d, 0x1f6e,
+ 0x1faf, 0x1ff0,
+ 0x1031, 0x1380,
+ 0x0380, 0x03a0,
+ 0x13c1, 0x03c1,
+ 0x03e1, 0x1402,
+ 0x0402, 0x0022,
+ 0x1443, 0x0443,
+ 0x1484, 0x0484,
+ 0x14c5, 0x04c5,
+ 0x1506, 0x0506,
+ 0x1547, 0x0547,
+ 0x1588, 0x0588,
+ 0x15c9, 0x05c9,
+ 0x160a, 0x060a,
+ 0x164b, 0x064b,
+ 0x168c, 0x068c,
+ 0x16cd, 0x06cd,
+ 0x170e, 0x070e,
+ 0x174f, 0x074f,
+ 0x1790, 0x0790,
+ 0x17d1, 0x07d1,
+ 0x1812, 0x0012,
+ 0x1853, 0x1894,
+ 0x18d5, 0x1916,
+ 0x1957, 0x1998,
+ 0x19d9, 0x1a1a,
+ 0x1a5b, 0x1a9c,
+ 0x1add, 0x1b1e,
+ 0x1b5f, 0x1ba0,
+ 0x1be1, 0x1c22,
+ 0x1c63, 0x1ca4,
+ 0x1ce5, 0x1d26,
+ 0x1d67, 0x1da8,
+ 0x1de9, 0x1e2a,
+ 0x1e6b, 0x1eac,
+ 0x1eed, 0x1f2e,
+ 0x1f6f, 0x1fb0,
+ 0x1ff1, 0x1032,
+ 0x1340, 0x0340,
+ 0x0360, 0x1381,
+ 0x0381, 0x03a1,
+ 0x13c2, 0x03c2,
+ 0x03e2, 0x1403,
+ 0x0403, 0x0023,
+ 0x1444, 0x0444,
+ 0x1485, 0x0485,
+ 0x14c6, 0x04c6,
+ 0x1507, 0x0507,
+ 0x1548, 0x0548,
+ 0x1589, 0x0589,
+ 0x15ca, 0x05ca,
+ 0x160b, 0x060b,
+ 0x164c, 0x064c,
+ 0x168d, 0x068d,
+ 0x16ce, 0x06ce,
+ 0x170f, 0x070f,
+ 0x1750, 0x0750,
+ 0x1791, 0x0791,
+ 0x17d2, 0x07d2,
+ 0x1813, 0x0013,
+ 0x1854, 0x1895,
+ 0x18d6, 0x1917,
+ 0x1958, 0x1999,
+ 0x19da, 0x1a1b,
+ 0x1a5c, 0x1a9d,
+ 0x1ade, 0x1b1f,
+ 0x1b60, 0x1ba1,
+ 0x1be2, 0x1c23,
+ 0x1c64, 0x1ca5,
+ 0x1ce6, 0x1d27,
+ 0x1d68, 0x1da9,
+ 0x1dea, 0x1e2b,
+ 0x1e6c, 0x1ead,
+ 0x1eee, 0x1f2f,
+ 0x1f70, 0x1fb1,
+ 0x1ff2, 0x1033,
+ 0x1300, 0x0300,
+ 0x0320, 0x1341,
+ 0x0341, 0x0361,
+ 0x1382, 0x0382,
+ 0x03a2, 0x13c3,
+ 0x03c3, 0x03e3,
+ 0x1404, 0x0404,
+ 0x0024, 0x1445,
+ 0x0445, 0x1486,
+ 0x0486, 0x14c7,
+ 0x04c7, 0x1508,
+ 0x0508, 0x1549,
+ 0x0549, 0x158a,
+ 0x058a, 0x15cb,
+ 0x05cb, 0x160c,
+ 0x060c, 0x164d,
+ 0x064d, 0x168e,
+ 0x068e, 0x16cf,
+ 0x06cf, 0x1710,
+ 0x0710, 0x1751,
+ 0x0751, 0x1792,
+ 0x0792, 0x17d3,
+ 0x07d3, 0x1814,
+ 0x0014, 0x1855,
+ 0x1896, 0x18d7,
+ 0x1918, 0x1959,
+ 0x199a, 0x19db,
+ 0x1a1c, 0x1a5d,
+ 0x1a9e, 0x1adf,
+ 0x1b20, 0x1b61,
+ 0x1ba2, 0x1be3,
+ 0x1c24, 0x1c65,
+ 0x1ca6, 0x1ce7,
+ 0x1d28, 0x1d69,
+ 0x1daa, 0x1deb,
+ 0x1e2c, 0x1e6d,
+ 0x1eae, 0x1eef,
+ 0x1f30, 0x1f71,
+ 0x1fb2, 0x1ff3,
+ 0x1034, 0x12c0,
+ 0x02c0, 0x02e0,
+ 0x1301, 0x0301,
+ 0x0321, 0x1342,
+ 0x0342, 0x0362,
+ 0x1383, 0x0383,
+ 0x03a3, 0x13c4,
+ 0x03c4, 0x03e4,
+ 0x1405, 0x0405,
+ 0x0025, 0x1446,
+ 0x0446, 0x1487,
+ 0x0487, 0x14c8,
+ 0x04c8, 0x1509,
+ 0x0509, 0x154a,
+ 0x054a, 0x158b,
+ 0x058b, 0x15cc,
+ 0x05cc, 0x160d,
+ 0x060d, 0x164e,
+ 0x064e, 0x168f,
+ 0x068f, 0x16d0,
+ 0x06d0, 0x1711,
+ 0x0711, 0x1752,
+ 0x0752, 0x1793,
+ 0x0793, 0x17d4,
+ 0x07d4, 0x1815,
+ 0x0015, 0x1856,
+ 0x1897, 0x18d8,
+ 0x1919, 0x195a,
+ 0x199b, 0x19dc,
+ 0x1a1d, 0x1a5e,
+ 0x1a9f, 0x1ae0,
+ 0x1b21, 0x1b62,
+ 0x1ba3, 0x1be4,
+ 0x1c25, 0x1c66,
+ 0x1ca7, 0x1ce8,
+ 0x1d29, 0x1d6a,
+ 0x1dab, 0x1dec,
+ 0x1e2d, 0x1e6e,
+ 0x1eaf, 0x1ef0,
+ 0x1f31, 0x1f72,
+ 0x1fb3, 0x1ff4,
+ 0x1035, 0x1280,
+ 0x0280, 0x02a0,
+ 0x12c1, 0x02c1,
+ 0x02e1, 0x1302,
+ 0x0302, 0x0322,
+ 0x1343, 0x0343,
+ 0x0363, 0x1384,
+ 0x0384, 0x03a4,
+ 0x13c5, 0x03c5,
+ 0x03e5, 0x1406,
+ 0x0406, 0x0026,
+ 0x1447, 0x0447,
+ 0x1488, 0x0488,
+ 0x14c9, 0x04c9,
+ 0x150a, 0x050a,
+ 0x154b, 0x054b,
+ 0x158c, 0x058c,
+ 0x15cd, 0x05cd,
+ 0x160e, 0x060e,
+ 0x164f, 0x064f,
+ 0x1690, 0x0690,
+ 0x16d1, 0x06d1,
+ 0x1712, 0x0712,
+ 0x1753, 0x0753,
+ 0x1794, 0x0794,
+ 0x17d5, 0x07d5,
+ 0x1816, 0x0016,
+ 0x1857, 0x1898,
+ 0x18d9, 0x191a,
+ 0x195b, 0x199c,
+ 0x19dd, 0x1a1e,
+ 0x1a5f, 0x1aa0,
+ 0x1ae1, 0x1b22,
+ 0x1b63, 0x1ba4,
+ 0x1be5, 0x1c26,
+ 0x1c67, 0x1ca8,
+ 0x1ce9, 0x1d2a,
+ 0x1d6b, 0x1dac,
+ 0x1ded, 0x1e2e,
+ 0x1e6f, 0x1eb0,
+ 0x1ef1, 0x1f32,
+ 0x1f73, 0x1fb4,
+ 0x1ff5, 0x1036,
+ 0x1240, 0x0240,
+ 0x0260, 0x1281,
+ 0x0281, 0x02a1,
+ 0x12c2, 0x02c2,
+ 0x02e2, 0x1303,
+ 0x0303, 0x0323,
+ 0x1344, 0x0344,
+ 0x0364, 0x1385,
+ 0x0385, 0x03a5,
+ 0x13c6, 0x03c6,
+ 0x03e6, 0x1407,
+ 0x0407, 0x0027,
+ 0x1448, 0x0448,
+ 0x1489, 0x0489,
+ 0x14ca, 0x04ca,
+ 0x150b, 0x050b,
+ 0x154c, 0x054c,
+ 0x158d, 0x058d,
+ 0x15ce, 0x05ce,
+ 0x160f, 0x060f,
+ 0x1650, 0x0650,
+ 0x1691, 0x0691,
+ 0x16d2, 0x06d2,
+ 0x1713, 0x0713,
+ 0x1754, 0x0754,
+ 0x1795, 0x0795,
+ 0x17d6, 0x07d6,
+ 0x1817, 0x0017,
+ 0x1858, 0x1899,
+ 0x18da, 0x191b,
+ 0x195c, 0x199d,
+ 0x19de, 0x1a1f,
+ 0x1a60, 0x1aa1,
+ 0x1ae2, 0x1b23,
+ 0x1b64, 0x1ba5,
+ 0x1be6, 0x1c27,
+ 0x1c68, 0x1ca9,
+ 0x1cea, 0x1d2b,
+ 0x1d6c, 0x1dad,
+ 0x1dee, 0x1e2f,
+ 0x1e70, 0x1eb1,
+ 0x1ef2, 0x1f33,
+ 0x1f74, 0x1fb5,
+ 0x1ff6, 0x1037,
+ 0x1200, 0x0200,
+ 0x0220, 0x0030,
+ 0x1241, 0x0241,
+ 0x0261, 0x1282,
+ 0x0282, 0x02a2,
+ 0x12c3, 0x02c3,
+ 0x02e3, 0x1304,
+ 0x0304, 0x0324,
+ 0x1345, 0x0345,
+ 0x0365, 0x1386,
+ 0x0386, 0x03a6,
+ 0x13c7, 0x03c7,
+ 0x03e7, 0x1408,
+ 0x0408, 0x0028,
+ 0x1449, 0x0449,
+ 0x148a, 0x048a,
+ 0x14cb, 0x04cb,
+ 0x150c, 0x050c,
+ 0x154d, 0x054d,
+ 0x158e, 0x058e,
+ 0x15cf, 0x05cf,
+ 0x1610, 0x0610,
+ 0x1651, 0x0651,
+ 0x1692, 0x0692,
+ 0x16d3, 0x06d3,
+ 0x1714, 0x0714,
+ 0x1755, 0x0755,
+ 0x1796, 0x0796,
+ 0x17d7, 0x07d7,
+ 0x1818, 0x0018,
+ 0x1859, 0x189a,
+ 0x18db, 0x191c,
+ 0x195d, 0x199e,
+ 0x19df, 0x1a20,
+ 0x1a61, 0x1aa2,
+ 0x1ae3, 0x1b24,
+ 0x1b65, 0x1ba6,
+ 0x1be7, 0x1c28,
+ 0x1c69, 0x1caa,
+ 0x1ceb, 0x1d2c,
+ 0x1d6d, 0x1dae,
+ 0x1def, 0x1e30,
+ 0x1e71, 0x1eb2,
+ 0x1ef3, 0x1f34,
+ 0x1f75, 0x1fb6,
+ 0x1ff7, 0x1038,
+ 0x11c0, 0x01c0,
+ 0x01e0, 0x01f0,
+ 0x1201, 0x0201,
+ 0x0221, 0x0031,
+ 0x1242, 0x0242,
+ 0x0262, 0x1283,
+ 0x0283, 0x02a3,
+ 0x12c4, 0x02c4,
+ 0x02e4, 0x1305,
+ 0x0305, 0x0325,
+ 0x1346, 0x0346,
+ 0x0366, 0x1387,
+ 0x0387, 0x03a7,
+ 0x13c8, 0x03c8,
+ 0x03e8, 0x1409,
+ 0x0409, 0x0029,
+ 0x144a, 0x044a,
+ 0x148b, 0x048b,
+ 0x14cc, 0x04cc,
+ 0x150d, 0x050d,
+ 0x154e, 0x054e,
+ 0x158f, 0x058f,
+ 0x15d0, 0x05d0,
+ 0x1611, 0x0611,
+ 0x1652, 0x0652,
+ 0x1693, 0x0693,
+ 0x16d4, 0x06d4,
+ 0x1715, 0x0715,
+ 0x1756, 0x0756,
+ 0x1797, 0x0797,
+ 0x17d8, 0x07d8,
+ 0x1819, 0x0019,
+ 0x185a, 0x189b,
+ 0x18dc, 0x191d,
+ 0x195e, 0x199f,
+ 0x19e0, 0x1a21,
+ 0x1a62, 0x1aa3,
+ 0x1ae4, 0x1b25,
+ 0x1b66, 0x1ba7,
+ 0x1be8, 0x1c29,
+ 0x1c6a, 0x1cab,
+ 0x1cec, 0x1d2d,
+ 0x1d6e, 0x1daf,
+ 0x1df0, 0x1e31,
+ 0x1e72, 0x1eb3,
+ 0x1ef4, 0x1f35,
+ 0x1f76, 0x1fb7,
+ 0x1ff8, 0x1039,
+ 0x1180, 0x0180,
+ 0x01a0, 0x01b0,
+ 0x11c1, 0x01c1,
+ 0x01e1, 0x01f1,
+ 0x1202, 0x0202,
+ 0x0222, 0x0032,
+ 0x1243, 0x0243,
+ 0x0263, 0x1284,
+ 0x0284, 0x02a4,
+ 0x12c5, 0x02c5,
+ 0x02e5, 0x1306,
+ 0x0306, 0x0326,
+ 0x1347, 0x0347,
+ 0x0367, 0x1388,
+ 0x0388, 0x03a8,
+ 0x13c9, 0x03c9,
+ 0x03e9, 0x140a,
+ 0x040a, 0x002a,
+ 0x144b, 0x044b,
+ 0x148c, 0x048c,
+ 0x14cd, 0x04cd,
+ 0x150e, 0x050e,
+ 0x154f, 0x054f,
+ 0x1590, 0x0590,
+ 0x15d1, 0x05d1,
+ 0x1612, 0x0612,
+ 0x1653, 0x0653,
+ 0x1694, 0x0694,
+ 0x16d5, 0x06d5,
+ 0x1716, 0x0716,
+ 0x1757, 0x0757,
+ 0x1798, 0x0798,
+ 0x17d9, 0x07d9,
+ 0x181a, 0x001a,
+ 0x185b, 0x189c,
+ 0x18dd, 0x191e,
+ 0x195f, 0x19a0,
+ 0x19e1, 0x1a22,
+ 0x1a63, 0x1aa4,
+ 0x1ae5, 0x1b26,
+ 0x1b67, 0x1ba8,
+ 0x1be9, 0x1c2a,
+ 0x1c6b, 0x1cac,
+ 0x1ced, 0x1d2e,
+ 0x1d6f, 0x1db0,
+ 0x1df1, 0x1e32,
+ 0x1e73, 0x1eb4,
+ 0x1ef5, 0x1f36,
+ 0x1f77, 0x1fb8,
+ 0x1ff9, 0x103a,
+ 0x1140, 0x0140,
+ 0x0160, 0x0170,
+ 0x1181, 0x0181,
+ 0x01a1, 0x01b1,
+ 0x11c2, 0x01c2,
+ 0x01e2, 0x01f2,
+ 0x1203, 0x0203,
+ 0x0223, 0x0033,
+ 0x1244, 0x0244,
+ 0x0264, 0x1285,
+ 0x0285, 0x02a5,
+ 0x12c6, 0x02c6,
+ 0x02e6, 0x1307,
+ 0x0307, 0x0327,
+ 0x1348, 0x0348,
+ 0x0368, 0x1389,
+ 0x0389, 0x03a9,
+ 0x13ca, 0x03ca,
+ 0x03ea, 0x140b,
+ 0x040b, 0x002b,
+ 0x144c, 0x044c,
+ 0x148d, 0x048d,
+ 0x14ce, 0x04ce,
+ 0x150f, 0x050f,
+ 0x1550, 0x0550,
+ 0x1591, 0x0591,
+ 0x15d2, 0x05d2,
+ 0x1613, 0x0613,
+ 0x1654, 0x0654,
+ 0x1695, 0x0695,
+ 0x16d6, 0x06d6,
+ 0x1717, 0x0717,
+ 0x1758, 0x0758,
+ 0x1799, 0x0799,
+ 0x17da, 0x07da,
+ 0x181b, 0x001b,
+ 0x185c, 0x189d,
+ 0x18de, 0x191f,
+ 0x1960, 0x19a1,
+ 0x19e2, 0x1a23,
+ 0x1a64, 0x1aa5,
+ 0x1ae6, 0x1b27,
+ 0x1b68, 0x1ba9,
+ 0x1bea, 0x1c2b,
+ 0x1c6c, 0x1cad,
+ 0x1cee, 0x1d2f,
+ 0x1d70, 0x1db1,
+ 0x1df2, 0x1e33,
+ 0x1e74, 0x1eb5,
+ 0x1ef6, 0x1f37,
+ 0x1f78, 0x1fb9,
+ 0x1ffa, 0x103b,
+ 0x1100, 0x0100,
+ 0x0120, 0x0130,
+ 0x0038, 0x1141,
+ 0x0141, 0x0161,
+ 0x0171, 0x1182,
+ 0x0182, 0x01a2,
+ 0x01b2, 0x11c3,
+ 0x01c3, 0x01e3,
+ 0x01f3, 0x1204,
+ 0x0204, 0x0224,
+ 0x0034, 0x1245,
+ 0x0245, 0x0265,
+ 0x1286, 0x0286,
+ 0x02a6, 0x12c7,
+ 0x02c7, 0x02e7,
+ 0x1308, 0x0308,
+ 0x0328, 0x1349,
+ 0x0349, 0x0369,
+ 0x138a, 0x038a,
+ 0x03aa, 0x13cb,
+ 0x03cb, 0x03eb,
+ 0x140c, 0x040c,
+ 0x002c, 0x144d,
+ 0x044d, 0x148e,
+ 0x048e, 0x14cf,
+ 0x04cf, 0x1510,
+ 0x0510, 0x1551,
+ 0x0551, 0x1592,
+ 0x0592, 0x15d3,
+ 0x05d3, 0x1614,
+ 0x0614, 0x1655,
+ 0x0655, 0x1696,
+ 0x0696, 0x16d7,
+ 0x06d7, 0x1718,
+ 0x0718, 0x1759,
+ 0x0759, 0x179a,
+ 0x079a, 0x17db,
+ 0x07db, 0x181c,
+ 0x001c, 0x185d,
+ 0x189e, 0x18df,
+ 0x1920, 0x1961,
+ 0x19a2, 0x19e3,
+ 0x1a24, 0x1a65,
+ 0x1aa6, 0x1ae7,
+ 0x1b28, 0x1b69,
+ 0x1baa, 0x1beb,
+ 0x1c2c, 0x1c6d,
+ 0x1cae, 0x1cef,
+ 0x1d30, 0x1d71,
+ 0x1db2, 0x1df3,
+ 0x1e34, 0x1e75,
+ 0x1eb6, 0x1ef7,
+ 0x1f38, 0x1f79,
+ 0x1fba, 0x1ffb,
+ 0x103c, 0x10c0,
+ 0x00c0, 0x00e0,
+ 0x00f0, 0x00f8,
+ 0x1101, 0x0101,
+ 0x0121, 0x0131,
+ 0x0039, 0x1142,
+ 0x0142, 0x0162,
+ 0x0172, 0x1183,
+ 0x0183, 0x01a3,
+ 0x01b3, 0x11c4,
+ 0x01c4, 0x01e4,
+ 0x01f4, 0x1205,
+ 0x0205, 0x0225,
+ 0x0035, 0x1246,
+ 0x0246, 0x0266,
+ 0x1287, 0x0287,
+ 0x02a7, 0x12c8,
+ 0x02c8, 0x02e8,
+ 0x1309, 0x0309,
+ 0x0329, 0x134a,
+ 0x034a, 0x036a,
+ 0x138b, 0x038b,
+ 0x03ab, 0x13cc,
+ 0x03cc, 0x03ec,
+ 0x140d, 0x040d,
+ 0x002d, 0x144e,
+ 0x044e, 0x148f,
+ 0x048f, 0x14d0,
+ 0x04d0, 0x1511,
+ 0x0511, 0x1552,
+ 0x0552, 0x1593,
+ 0x0593, 0x15d4,
+ 0x05d4, 0x1615,
+ 0x0615, 0x1656,
+ 0x0656, 0x1697,
+ 0x0697, 0x16d8,
+ 0x06d8, 0x1719,
+ 0x0719, 0x175a,
+ 0x075a, 0x179b,
+ 0x079b, 0x17dc,
+ 0x07dc, 0x181d,
+ 0x001d, 0x185e,
+ 0x189f, 0x18e0,
+ 0x1921, 0x1962,
+ 0x19a3, 0x19e4,
+ 0x1a25, 0x1a66,
+ 0x1aa7, 0x1ae8,
+ 0x1b29, 0x1b6a,
+ 0x1bab, 0x1bec,
+ 0x1c2d, 0x1c6e,
+ 0x1caf, 0x1cf0,
+ 0x1d31, 0x1d72,
+ 0x1db3, 0x1df4,
+ 0x1e35, 0x1e76,
+ 0x1eb7, 0x1ef8,
+ 0x1f39, 0x1f7a,
+ 0x1fbb, 0x1ffc,
+ 0x103d, 0x1080,
+ 0x0080, 0x00a0,
+ 0x00b0, 0x00b8,
+ 0x003c, 0x10c1,
+ 0x00c1, 0x00e1,
+ 0x00f1, 0x00f9,
+ 0x1102, 0x0102,
+ 0x0122, 0x0132,
+ 0x003a, 0x1143,
+ 0x0143, 0x0163,
+ 0x0173, 0x1184,
+ 0x0184, 0x01a4,
+ 0x01b4, 0x11c5,
+ 0x01c5, 0x01e5,
+ 0x01f5, 0x1206,
+ 0x0206, 0x0226,
+ 0x0036, 0x1247,
+ 0x0247, 0x0267,
+ 0x1288, 0x0288,
+ 0x02a8, 0x12c9,
+ 0x02c9, 0x02e9,
+ 0x130a, 0x030a,
+ 0x032a, 0x134b,
+ 0x034b, 0x036b,
+ 0x138c, 0x038c,
+ 0x03ac, 0x13cd,
+ 0x03cd, 0x03ed,
+ 0x140e, 0x040e,
+ 0x002e, 0x144f,
+ 0x044f, 0x1490,
+ 0x0490, 0x14d1,
+ 0x04d1, 0x1512,
+ 0x0512, 0x1553,
+ 0x0553, 0x1594,
+ 0x0594, 0x15d5,
+ 0x05d5, 0x1616,
+ 0x0616, 0x1657,
+ 0x0657, 0x1698,
+ 0x0698, 0x16d9,
+ 0x06d9, 0x171a,
+ 0x071a, 0x175b,
+ 0x075b, 0x179c,
+ 0x079c, 0x17dd,
+ 0x07dd, 0x181e,
+ 0x001e, 0x185f,
+ 0x18a0, 0x18e1,
+ 0x1922, 0x1963,
+ 0x19a4, 0x19e5,
+ 0x1a26, 0x1a67,
+ 0x1aa8, 0x1ae9,
+ 0x1b2a, 0x1b6b,
+ 0x1bac, 0x1bed,
+ 0x1c2e, 0x1c6f,
+ 0x1cb0, 0x1cf1,
+ 0x1d32, 0x1d73,
+ 0x1db4, 0x1df5,
+ 0x1e36, 0x1e77,
+ 0x1eb8, 0x1ef9,
+ 0x1f3a, 0x1f7b,
+ 0x1fbc, 0x1ffd,
+ 0x103e, 0x1040,
+ 0x1041, 0x1042,
+ 0x1043, 0x1044,
+ 0x1045, 0x1046,
+ 0x1047, 0x1048,
+ 0x1049, 0x104a,
+ 0x104b, 0x104c,
+ 0x104d, 0x104e,
+ 0x104f, 0x1050,
+ 0x1051, 0x1052,
+ 0x1053, 0x1054,
+ 0x1055, 0x1056,
+ 0x1057, 0x1058,
+ 0x1059, 0x105a,
+ 0x105b, 0x105c,
+ 0x105d, 0x105e,
+ 0x105f, 0x0040,
+ 0x1060, 0x0041,
+ 0x1061, 0x0042,
+ 0x1062, 0x0043,
+ 0x1063, 0x0044,
+ 0x1064, 0x0045,
+ 0x1065, 0x0046,
+ 0x1066, 0x0047,
+ 0x1067, 0x0048,
+ 0x1068, 0x0049,
+ 0x1069, 0x004a,
+ 0x106a, 0x004b,
+ 0x106b, 0x004c,
+ 0x106c, 0x004d,
+ 0x106d, 0x004e,
+ 0x106e, 0x004f,
+ 0x106f, 0x0060,
+ 0x0050, 0x1070,
+ 0x0061, 0x0051,
+ 0x1071, 0x0062,
+ 0x0052, 0x1072,
+ 0x0063, 0x0053,
+ 0x1073, 0x0064,
+ 0x0054, 0x1074,
+ 0x0065, 0x0055,
+ 0x1075, 0x0066,
+ 0x0056, 0x1076,
+ 0x0067, 0x0057,
+ 0x1077, 0x0070,
+ 0x0068, 0x0058,
+ 0x1078, 0x0071,
+ 0x0069, 0x0059,
+ 0x1079, 0x0072,
+ 0x006a, 0x005a,
+ 0x107a, 0x0073,
+ 0x006b, 0x005b,
+ 0x107b, 0x0078,
+ 0x0074, 0x006c,
+ 0x005c, 0x107c,
+ 0x0079, 0x0075,
+ 0x006d, 0x005d,
+ 0x107d, 0x007c,
+ 0x007a, 0x0076,
+ 0x006e, 0x005e,
+ 0x107e, 0x1081,
+ 0x1082, 0x1083,
+ 0x1084, 0x1085,
+ 0x1086, 0x1087,
+ 0x1088, 0x1089,
+ 0x108a, 0x108b,
+ 0x108c, 0x108d,
+ 0x108e, 0x108f,
+ 0x1090, 0x1091,
+ 0x1092, 0x1093,
+ 0x1094, 0x1095,
+ 0x1096, 0x1097,
+ 0x1098, 0x1099,
+ 0x109a, 0x109b,
+ 0x109c, 0x109d,
+ 0x109e, 0x109f,
+ 0x10a0, 0x0081,
+ 0x10a1, 0x0082,
+ 0x10a2, 0x0083,
+ 0x10a3, 0x0084,
+ 0x10a4, 0x0085,
+ 0x10a5, 0x0086,
+ 0x10a6, 0x0087,
+ 0x10a7, 0x0088,
+ 0x10a8, 0x0089,
+ 0x10a9, 0x008a,
+ 0x10aa, 0x008b,
+ 0x10ab, 0x008c,
+ 0x10ac, 0x008d,
+ 0x10ad, 0x008e,
+ 0x10ae, 0x008f,
+ 0x10af, 0x0090,
+ 0x10b0, 0x00a1,
+ 0x0091, 0x10b1,
+ 0x00a2, 0x0092,
+ 0x10b2, 0x00a3,
+ 0x0093, 0x10b3,
+ 0x00a4, 0x0094,
+ 0x10b4, 0x00a5,
+ 0x0095, 0x10b5,
+ 0x00a6, 0x0096,
+ 0x10b6, 0x00a7,
+ 0x0097, 0x10b7,
+ 0x00a8, 0x0098,
+ 0x10b8, 0x00b1,
+ 0x00a9, 0x0099,
+ 0x10b9, 0x00b2,
+ 0x00aa, 0x009a,
+ 0x10ba, 0x00b3,
+ 0x00ab, 0x009b,
+ 0x10bb, 0x00b4,
+ 0x00ac, 0x009c,
+ 0x10bc, 0x00b9,
+ 0x00b5, 0x00ad,
+ 0x009d, 0x10bd,
+ 0x00ba, 0x00b6,
+ 0x00ae, 0x009e,
+ 0x10be, 0x10c2,
+ 0x10c3, 0x10c4,
+ 0x10c5, 0x10c6,
+ 0x10c7, 0x10c8,
+ 0x10c9, 0x10ca,
+ 0x10cb, 0x10cc,
+ 0x10cd, 0x10ce,
+ 0x10cf, 0x10d0,
+ 0x10d1, 0x10d2,
+ 0x10d3, 0x10d4,
+ 0x10d5, 0x10d6,
+ 0x10d7, 0x10d8,
+ 0x10d9, 0x10da,
+ 0x10db, 0x10dc,
+ 0x10dd, 0x10de,
+ 0x10df, 0x10e0,
+ 0x10e1, 0x00c2,
+ 0x10e2, 0x00c3,
+ 0x10e3, 0x00c4,
+ 0x10e4, 0x00c5,
+ 0x10e5, 0x00c6,
+ 0x10e6, 0x00c7,
+ 0x10e7, 0x00c8,
+ 0x10e8, 0x00c9,
+ 0x10e9, 0x00ca,
+ 0x10ea, 0x00cb,
+ 0x10eb, 0x00cc,
+ 0x10ec, 0x00cd,
+ 0x10ed, 0x00ce,
+ 0x10ee, 0x00cf,
+ 0x10ef, 0x00d0,
+ 0x10f0, 0x00d1,
+ 0x10f1, 0x00e2,
+ 0x00d2, 0x10f2,
+ 0x00e3, 0x00d3,
+ 0x10f3, 0x00e4,
+ 0x00d4, 0x10f4,
+ 0x00e5, 0x00d5,
+ 0x10f5, 0x00e6,
+ 0x00d6, 0x10f6,
+ 0x00e7, 0x00d7,
+ 0x10f7, 0x00e8,
+ 0x00d8, 0x10f8,
+ 0x00e9, 0x00d9,
+ 0x10f9, 0x00f2,
+ 0x00ea, 0x00da,
+ 0x10fa, 0x00f3,
+ 0x00eb, 0x00db,
+ 0x10fb, 0x00f4,
+ 0x00ec, 0x00dc,
+ 0x10fc, 0x00f5,
+ 0x00ed, 0x00dd,
+ 0x10fd, 0x00fa,
+ 0x00f6, 0x00ee,
+ 0x00de, 0x10fe,
+ 0x1103, 0x1104,
+ 0x1105, 0x1106,
+ 0x1107, 0x1108,
+ 0x1109, 0x110a,
+ 0x110b, 0x110c,
+ 0x110d, 0x110e,
+ 0x110f, 0x1110,
+ 0x1111, 0x1112,
+ 0x1113, 0x1114,
+ 0x1115, 0x1116,
+ 0x1117, 0x1118,
+ 0x1119, 0x111a,
+ 0x111b, 0x111c,
+ 0x111d, 0x111e,
+ 0x111f, 0x1120,
+ 0x1121, 0x1122,
+ 0x0103, 0x1123,
+ 0x0104, 0x1124,
+ 0x0105, 0x1125,
+ 0x0106, 0x1126,
+ 0x0107, 0x1127,
+ 0x0108, 0x1128,
+ 0x0109, 0x1129,
+ 0x010a, 0x112a,
+ 0x010b, 0x112b,
+ 0x010c, 0x112c,
+ 0x010d, 0x112d,
+ 0x010e, 0x112e,
+ 0x010f, 0x112f,
+ 0x0110, 0x1130,
+ 0x0111, 0x1131,
+ 0x0112, 0x1132,
+ 0x0123, 0x0113,
+ 0x1133, 0x0124,
+ 0x0114, 0x1134,
+ 0x0125, 0x0115,
+ 0x1135, 0x0126,
+ 0x0116, 0x1136,
+ 0x0127, 0x0117,
+ 0x1137, 0x0128,
+ 0x0118, 0x1138,
+ 0x0129, 0x0119,
+ 0x1139, 0x012a,
+ 0x011a, 0x113a,
+ 0x0133, 0x012b,
+ 0x011b, 0x113b,
+ 0x0134, 0x012c,
+ 0x011c, 0x113c,
+ 0x0135, 0x012d,
+ 0x011d, 0x113d,
+ 0x0136, 0x012e,
+ 0x011e, 0x113e,
+ 0x1144, 0x1145,
+ 0x1146, 0x1147,
+ 0x1148, 0x1149,
+ 0x114a, 0x114b,
+ 0x114c, 0x114d,
+ 0x114e, 0x114f,
+ 0x1150, 0x1151,
+ 0x1152, 0x1153,
+ 0x1154, 0x1155,
+ 0x1156, 0x1157,
+ 0x1158, 0x1159,
+ 0x115a, 0x115b,
+ 0x115c, 0x115d,
+ 0x115e, 0x115f,
+ 0x1160, 0x1161,
+ 0x1162, 0x1163,
+ 0x0144, 0x1164,
+ 0x0145, 0x1165,
+ 0x0146, 0x1166,
+ 0x0147, 0x1167,
+ 0x0148, 0x1168,
+ 0x0149, 0x1169,
+ 0x014a, 0x116a,
+ 0x014b, 0x116b,
+ 0x014c, 0x116c,
+ 0x014d, 0x116d,
+ 0x014e, 0x116e,
+ 0x014f, 0x116f,
+ 0x0150, 0x1170,
+ 0x0151, 0x1171,
+ 0x0152, 0x1172,
+ 0x0153, 0x1173,
+ 0x0164, 0x0154,
+ 0x1174, 0x0165,
+ 0x0155, 0x1175,
+ 0x0166, 0x0156,
+ 0x1176, 0x0167,
+ 0x0157, 0x1177,
+ 0x0168, 0x0158,
+ 0x1178, 0x0169,
+ 0x0159, 0x1179,
+ 0x016a, 0x015a,
+ 0x117a, 0x016b,
+ 0x015b, 0x117b,
+ 0x0174, 0x016c,
+ 0x015c, 0x117c,
+ 0x0175, 0x016d,
+ 0x015d, 0x117d,
+ 0x0176, 0x016e,
+ 0x015e, 0x117e,
+ 0x1185, 0x1186,
+ 0x1187, 0x1188,
+ 0x1189, 0x118a,
+ 0x118b, 0x118c,
+ 0x118d, 0x118e,
+ 0x118f, 0x1190,
+ 0x1191, 0x1192,
+ 0x1193, 0x1194,
+ 0x1195, 0x1196,
+ 0x1197, 0x1198,
+ 0x1199, 0x119a,
+ 0x119b, 0x119c,
+ 0x119d, 0x119e,
+ 0x119f, 0x11a0,
+ 0x11a1, 0x11a2,
+ 0x11a3, 0x11a4,
+ 0x0185, 0x11a5,
+ 0x0186, 0x11a6,
+ 0x0187, 0x11a7,
+ 0x0188, 0x11a8,
+ 0x0189, 0x11a9,
+ 0x018a, 0x11aa,
+ 0x018b, 0x11ab,
+ 0x018c, 0x11ac,
+ 0x018d, 0x11ad,
+ 0x018e, 0x11ae,
+ 0x018f, 0x11af,
+ 0x0190, 0x11b0,
+ 0x0191, 0x11b1,
+ 0x0192, 0x11b2,
+ 0x0193, 0x11b3,
+ 0x0194, 0x11b4,
+ 0x01a5, 0x0195,
+ 0x11b5, 0x01a6,
+ 0x0196, 0x11b6,
+ 0x01a7, 0x0197,
+ 0x11b7, 0x01a8,
+ 0x0198, 0x11b8,
+ 0x01a9, 0x0199,
+ 0x11b9, 0x01aa,
+ 0x019a, 0x11ba,
+ 0x01ab, 0x019b,
+ 0x11bb, 0x01ac,
+ 0x019c, 0x11bc,
+ 0x01b5, 0x01ad,
+ 0x019d, 0x11bd,
+ 0x01b6, 0x01ae,
+ 0x019e, 0x11be,
+ 0x11c6, 0x11c7,
+ 0x11c8, 0x11c9,
+ 0x11ca, 0x11cb,
+ 0x11cc, 0x11cd,
+ 0x11ce, 0x11cf,
+ 0x11d0, 0x11d1,
+ 0x11d2, 0x11d3,
+ 0x11d4, 0x11d5,
+ 0x11d6, 0x11d7,
+ 0x11d8, 0x11d9,
+ 0x11da, 0x11db,
+ 0x11dc, 0x11dd,
+ 0x11de, 0x11df,
+ 0x11e0, 0x11e1,
+ 0x11e2, 0x11e3,
+ 0x11e4, 0x11e5,
+ 0x01c6, 0x11e6,
+ 0x01c7, 0x11e7,
+ 0x01c8, 0x11e8,
+ 0x01c9, 0x11e9,
+ 0x01ca, 0x11ea,
+ 0x01cb, 0x11eb,
+ 0x01cc, 0x11ec,
+ 0x01cd, 0x11ed,
+ 0x01ce, 0x11ee,
+ 0x01cf, 0x11ef,
+ 0x01d0, 0x11f0,
+ 0x01d1, 0x11f1,
+ 0x01d2, 0x11f2,
+ 0x01d3, 0x11f3,
+ 0x01d4, 0x11f4,
+ 0x01d5, 0x11f5,
+ 0x01e6, 0x01d6,
+ 0x11f6, 0x01e7,
+ 0x01d7, 0x11f7,
+ 0x01e8, 0x01d8,
+ 0x11f8, 0x01e9,
+ 0x01d9, 0x11f9,
+ 0x01ea, 0x01da,
+ 0x11fa, 0x01eb,
+ 0x01db, 0x11fb,
+ 0x01ec, 0x01dc,
+ 0x11fc, 0x01ed,
+ 0x01dd, 0x11fd,
+ 0x01f6, 0x01ee,
+ 0x01de, 0x11fe,
+ 0x1207, 0x1208,
+ 0x1209, 0x120a,
+ 0x120b, 0x120c,
+ 0x120d, 0x120e,
+ 0x120f, 0x1210,
+ 0x1211, 0x1212,
+ 0x1213, 0x1214,
+ 0x1215, 0x1216,
+ 0x1217, 0x1218,
+ 0x1219, 0x121a,
+ 0x121b, 0x121c,
+ 0x121d, 0x121e,
+ 0x121f, 0x1220,
+ 0x1221, 0x1222,
+ 0x1223, 0x1224,
+ 0x1225, 0x1226,
+ 0x0207, 0x1227,
+ 0x0208, 0x1228,
+ 0x0209, 0x1229,
+ 0x020a, 0x122a,
+ 0x020b, 0x122b,
+ 0x020c, 0x122c,
+ 0x020d, 0x122d,
+ 0x020e, 0x122e,
+ 0x020f, 0x122f,
+ 0x0210, 0x1230,
+ 0x0211, 0x1231,
+ 0x0212, 0x1232,
+ 0x0213, 0x1233,
+ 0x0214, 0x1234,
+ 0x0215, 0x1235,
+ 0x0216, 0x1236,
+ 0x0227, 0x0217,
+ 0x1237, 0x0228,
+ 0x0218, 0x1238,
+ 0x0229, 0x0219,
+ 0x1239, 0x022a,
+ 0x021a, 0x123a,
+ 0x022b, 0x021b,
+ 0x123b, 0x022c,
+ 0x021c, 0x123c,
+ 0x022d, 0x021d,
+ 0x123d, 0x022e,
+ 0x021e, 0x123e,
+ 0x1248, 0x1249,
+ 0x124a, 0x124b,
+ 0x124c, 0x124d,
+ 0x124e, 0x124f,
+ 0x1250, 0x1251,
+ 0x1252, 0x1253,
+ 0x1254, 0x1255,
+ 0x1256, 0x1257,
+ 0x1258, 0x1259,
+ 0x125a, 0x125b,
+ 0x125c, 0x125d,
+ 0x125e, 0x125f,
+ 0x1260, 0x1261,
+ 0x1262, 0x1263,
+ 0x1264, 0x1265,
+ 0x1266, 0x1267,
+ 0x0248, 0x1268,
+ 0x0249, 0x1269,
+ 0x024a, 0x126a,
+ 0x024b, 0x126b,
+ 0x024c, 0x126c,
+ 0x024d, 0x126d,
+ 0x024e, 0x126e,
+ 0x024f, 0x126f,
+ 0x0250, 0x1270,
+ 0x0251, 0x1271,
+ 0x0252, 0x1272,
+ 0x0253, 0x1273,
+ 0x0254, 0x1274,
+ 0x0255, 0x1275,
+ 0x0256, 0x1276,
+ 0x0257, 0x1277,
+ 0x0268, 0x0258,
+ 0x1278, 0x0269,
+ 0x0259, 0x1279,
+ 0x026a, 0x025a,
+ 0x127a, 0x026b,
+ 0x025b, 0x127b,
+ 0x026c, 0x025c,
+ 0x127c, 0x026d,
+ 0x025d, 0x127d,
+ 0x026e, 0x025e,
+ 0x127e, 0x1289,
+ 0x128a, 0x128b,
+ 0x128c, 0x128d,
+ 0x128e, 0x128f,
+ 0x1290, 0x1291,
+ 0x1292, 0x1293,
+ 0x1294, 0x1295,
+ 0x1296, 0x1297,
+ 0x1298, 0x1299,
+ 0x129a, 0x129b,
+ 0x129c, 0x129d,
+ 0x129e, 0x129f,
+ 0x12a0, 0x12a1,
+ 0x12a2, 0x12a3,
+ 0x12a4, 0x12a5,
+ 0x12a6, 0x12a7,
+ 0x12a8, 0x0289,
+ 0x12a9, 0x028a,
+ 0x12aa, 0x028b,
+ 0x12ab, 0x028c,
+ 0x12ac, 0x028d,
+ 0x12ad, 0x028e,
+ 0x12ae, 0x028f,
+ 0x12af, 0x0290,
+ 0x12b0, 0x0291,
+ 0x12b1, 0x0292,
+ 0x12b2, 0x0293,
+ 0x12b3, 0x0294,
+ 0x12b4, 0x0295,
+ 0x12b5, 0x0296,
+ 0x12b6, 0x0297,
+ 0x12b7, 0x0298,
+ 0x12b8, 0x02a9,
+ 0x0299, 0x12b9,
+ 0x02aa, 0x029a,
+ 0x12ba, 0x02ab,
+ 0x029b, 0x12bb,
+ 0x02ac, 0x029c,
+ 0x12bc, 0x02ad,
+ 0x029d, 0x12bd,
+ 0x02ae, 0x029e,
+ 0x12be, 0x12ca,
+ 0x12cb, 0x12cc,
+ 0x12cd, 0x12ce,
+ 0x12cf, 0x12d0,
+ 0x12d1, 0x12d2,
+ 0x12d3, 0x12d4,
+ 0x12d5, 0x12d6,
+ 0x12d7, 0x12d8,
+ 0x12d9, 0x12da,
+ 0x12db, 0x12dc,
+ 0x12dd, 0x12de,
+ 0x12df, 0x12e0,
+ 0x12e1, 0x12e2,
+ 0x12e3, 0x12e4,
+ 0x12e5, 0x12e6,
+ 0x12e7, 0x12e8,
+ 0x12e9, 0x02ca,
+ 0x12ea, 0x02cb,
+ 0x12eb, 0x02cc,
+ 0x12ec, 0x02cd,
+ 0x12ed, 0x02ce,
+ 0x12ee, 0x02cf,
+ 0x12ef, 0x02d0,
+ 0x12f0, 0x02d1,
+ 0x12f1, 0x02d2,
+ 0x12f2, 0x02d3,
+ 0x12f3, 0x02d4,
+ 0x12f4, 0x02d5,
+ 0x12f5, 0x02d6,
+ 0x12f6, 0x02d7,
+ 0x12f7, 0x02d8,
+ 0x12f8, 0x02d9,
+ 0x12f9, 0x02ea,
+ 0x02da, 0x12fa,
+ 0x02eb, 0x02db,
+ 0x12fb, 0x02ec,
+ 0x02dc, 0x12fc,
+ 0x02ed, 0x02dd,
+ 0x12fd, 0x02ee,
+ 0x02de, 0x12fe,
+ 0x130b, 0x130c,
+ 0x130d, 0x130e,
+ 0x130f, 0x1310,
+ 0x1311, 0x1312,
+ 0x1313, 0x1314,
+ 0x1315, 0x1316,
+ 0x1317, 0x1318,
+ 0x1319, 0x131a,
+ 0x131b, 0x131c,
+ 0x131d, 0x131e,
+ 0x131f, 0x1320,
+ 0x1321, 0x1322,
+ 0x1323, 0x1324,
+ 0x1325, 0x1326,
+ 0x1327, 0x1328,
+ 0x1329, 0x132a,
+ 0x030b, 0x132b,
+ 0x030c, 0x132c,
+ 0x030d, 0x132d,
+ 0x030e, 0x132e,
+ 0x030f, 0x132f,
+ 0x0310, 0x1330,
+ 0x0311, 0x1331,
+ 0x0312, 0x1332,
+ 0x0313, 0x1333,
+ 0x0314, 0x1334,
+ 0x0315, 0x1335,
+ 0x0316, 0x1336,
+ 0x0317, 0x1337,
+ 0x0318, 0x1338,
+ 0x0319, 0x1339,
+ 0x031a, 0x133a,
+ 0x032b, 0x031b,
+ 0x133b, 0x032c,
+ 0x031c, 0x133c,
+ 0x032d, 0x031d,
+ 0x133d, 0x032e,
+ 0x031e, 0x133e,
+ 0x134c, 0x134d,
+ 0x134e, 0x134f,
+ 0x1350, 0x1351,
+ 0x1352, 0x1353,
+ 0x1354, 0x1355,
+ 0x1356, 0x1357,
+ 0x1358, 0x1359,
+ 0x135a, 0x135b,
+ 0x135c, 0x135d,
+ 0x135e, 0x135f,
+ 0x1360, 0x1361,
+ 0x1362, 0x1363,
+ 0x1364, 0x1365,
+ 0x1366, 0x1367,
+ 0x1368, 0x1369,
+ 0x136a, 0x136b,
+ 0x034c, 0x136c,
+ 0x034d, 0x136d,
+ 0x034e, 0x136e,
+ 0x034f, 0x136f,
+ 0x0350, 0x1370,
+ 0x0351, 0x1371,
+ 0x0352, 0x1372,
+ 0x0353, 0x1373,
+ 0x0354, 0x1374,
+ 0x0355, 0x1375,
+ 0x0356, 0x1376,
+ 0x0357, 0x1377,
+ 0x0358, 0x1378,
+ 0x0359, 0x1379,
+ 0x035a, 0x137a,
+ 0x035b, 0x137b,
+ 0x036c, 0x035c,
+ 0x137c, 0x036d,
+ 0x035d, 0x137d,
+ 0x036e, 0x035e,
+ 0x137e, 0x138d,
+ 0x138e, 0x138f,
+ 0x1390, 0x1391,
+ 0x1392, 0x1393,
+ 0x1394, 0x1395,
+ 0x1396, 0x1397,
+ 0x1398, 0x1399,
+ 0x139a, 0x139b,
+ 0x139c, 0x139d,
+ 0x139e, 0x139f,
+ 0x13a0, 0x13a1,
+ 0x13a2, 0x13a3,
+ 0x13a4, 0x13a5,
+ 0x13a6, 0x13a7,
+ 0x13a8, 0x13a9,
+ 0x13aa, 0x13ab,
+ 0x13ac, 0x038d,
+ 0x13ad, 0x038e,
+ 0x13ae, 0x038f,
+ 0x13af, 0x0390,
+ 0x13b0, 0x0391,
+ 0x13b1, 0x0392,
+ 0x13b2, 0x0393,
+ 0x13b3, 0x0394,
+ 0x13b4, 0x0395,
+ 0x13b5, 0x0396,
+ 0x13b6, 0x0397,
+ 0x13b7, 0x0398,
+ 0x13b8, 0x0399,
+ 0x13b9, 0x039a,
+ 0x13ba, 0x039b,
+ 0x13bb, 0x039c,
+ 0x13bc, 0x03ad,
+ 0x039d, 0x13bd,
+ 0x03ae, 0x039e,
+ 0x13be, 0x13ce,
+ 0x13cf, 0x13d0,
+ 0x13d1, 0x13d2,
+ 0x13d3, 0x13d4,
+ 0x13d5, 0x13d6,
+ 0x13d7, 0x13d8,
+ 0x13d9, 0x13da,
+ 0x13db, 0x13dc,
+ 0x13dd, 0x13de,
+ 0x13df, 0x13e0,
+ 0x13e1, 0x13e2,
+ 0x13e3, 0x13e4,
+ 0x13e5, 0x13e6,
+ 0x13e7, 0x13e8,
+ 0x13e9, 0x13ea,
+ 0x13eb, 0x13ec,
+ 0x13ed, 0x03ce,
+ 0x13ee, 0x03cf,
+ 0x13ef, 0x03d0,
+ 0x13f0, 0x03d1,
+ 0x13f1, 0x03d2,
+ 0x13f2, 0x03d3,
+ 0x13f3, 0x03d4,
+ 0x13f4, 0x03d5,
+ 0x13f5, 0x03d6,
+ 0x13f6, 0x03d7,
+ 0x13f7, 0x03d8,
+ 0x13f8, 0x03d9,
+ 0x13f9, 0x03da,
+ 0x13fa, 0x03db,
+ 0x13fb, 0x03dc,
+ 0x13fc, 0x03dd,
+ 0x13fd, 0x03ee,
+ 0x03de, 0x13fe,
+ 0x140f, 0x1410,
+ 0x1411, 0x1412,
+ 0x1413, 0x1414,
+ 0x1415, 0x1416,
+ 0x1417, 0x1418,
+ 0x1419, 0x141a,
+ 0x141b, 0x141c,
+ 0x141d, 0x141e,
+ 0x141f, 0x1420,
+ 0x1421, 0x1422,
+ 0x1423, 0x1424,
+ 0x1425, 0x1426,
+ 0x1427, 0x1428,
+ 0x1429, 0x142a,
+ 0x142b, 0x142c,
+ 0x142d, 0x142e,
+ 0x040f, 0x142f,
+ 0x0410, 0x1430,
+ 0x0411, 0x1431,
+ 0x0412, 0x1432,
+ 0x0413, 0x1433,
+ 0x0414, 0x1434,
+ 0x0415, 0x1435,
+ 0x0416, 0x1436,
+ 0x0417, 0x1437,
+ 0x0418, 0x1438,
+ 0x0419, 0x1439,
+ 0x041a, 0x143a,
+ 0x041b, 0x143b,
+ 0x041c, 0x143c,
+ 0x041d, 0x143d,
+ 0x041e, 0x143e,
+ 0x1450, 0x1451,
+ 0x1452, 0x1453,
+ 0x1454, 0x1455,
+ 0x1456, 0x1457,
+ 0x1458, 0x1459,
+ 0x145a, 0x145b,
+ 0x145c, 0x145d,
+ 0x145e, 0x145f,
+ 0x1460, 0x1461,
+ 0x1462, 0x1463,
+ 0x1464, 0x1465,
+ 0x1466, 0x1467,
+ 0x1468, 0x1469,
+ 0x146a, 0x146b,
+ 0x146c, 0x146d,
+ 0x146e, 0x146f,
+ 0x0450, 0x1470,
+ 0x0451, 0x1471,
+ 0x0452, 0x1472,
+ 0x0453, 0x1473,
+ 0x0454, 0x1474,
+ 0x0455, 0x1475,
+ 0x0456, 0x1476,
+ 0x0457, 0x1477,
+ 0x0458, 0x1478,
+ 0x0459, 0x1479,
+ 0x045a, 0x147a,
+ 0x045b, 0x147b,
+ 0x045c, 0x147c,
+ 0x045d, 0x147d,
+ 0x045e, 0x147e,
+ 0x1491, 0x1492,
+ 0x1493, 0x1494,
+ 0x1495, 0x1496,
+ 0x1497, 0x1498,
+ 0x1499, 0x149a,
+ 0x149b, 0x149c,
+ 0x149d, 0x149e,
+ 0x149f, 0x14a0,
+ 0x14a1, 0x14a2,
+ 0x14a3, 0x14a4,
+ 0x14a5, 0x14a6,
+ 0x14a7, 0x14a8,
+ 0x14a9, 0x14aa,
+ 0x14ab, 0x14ac,
+ 0x14ad, 0x14ae,
+ 0x14af, 0x14b0,
+ 0x0491, 0x14b1,
+ 0x0492, 0x14b2,
+ 0x0493, 0x14b3,
+ 0x0494, 0x14b4,
+ 0x0495, 0x14b5,
+ 0x0496, 0x14b6,
+ 0x0497, 0x14b7,
+ 0x0498, 0x14b8,
+ 0x0499, 0x14b9,
+ 0x049a, 0x14ba,
+ 0x049b, 0x14bb,
+ 0x049c, 0x14bc,
+ 0x049d, 0x14bd,
+ 0x049e, 0x14be,
+ 0x14d2, 0x14d3,
+ 0x14d4, 0x14d5,
+ 0x14d6, 0x14d7,
+ 0x14d8, 0x14d9,
+ 0x14da, 0x14db,
+ 0x14dc, 0x14dd,
+ 0x14de, 0x14df,
+ 0x14e0, 0x14e1,
+ 0x14e2, 0x14e3,
+ 0x14e4, 0x14e5,
+ 0x14e6, 0x14e7,
+ 0x14e8, 0x14e9,
+ 0x14ea, 0x14eb,
+ 0x14ec, 0x14ed,
+ 0x14ee, 0x14ef,
+ 0x14f0, 0x14f1,
+ 0x04d2, 0x14f2,
+ 0x04d3, 0x14f3,
+ 0x04d4, 0x14f4,
+ 0x04d5, 0x14f5,
+ 0x04d6, 0x14f6,
+ 0x04d7, 0x14f7,
+ 0x04d8, 0x14f8,
+ 0x04d9, 0x14f9,
+ 0x04da, 0x14fa,
+ 0x04db, 0x14fb,
+ 0x04dc, 0x14fc,
+ 0x04dd, 0x14fd,
+ 0x04de, 0x14fe,
+ 0x1513, 0x1514,
+ 0x1515, 0x1516,
+ 0x1517, 0x1518,
+ 0x1519, 0x151a,
+ 0x151b, 0x151c,
+ 0x151d, 0x151e,
+ 0x151f, 0x1520,
+ 0x1521, 0x1522,
+ 0x1523, 0x1524,
+ 0x1525, 0x1526,
+ 0x1527, 0x1528,
+ 0x1529, 0x152a,
+ 0x152b, 0x152c,
+ 0x152d, 0x152e,
+ 0x152f, 0x1530,
+ 0x1531, 0x1532,
+ 0x0513, 0x1533,
+ 0x0514, 0x1534,
+ 0x0515, 0x1535,
+ 0x0516, 0x1536,
+ 0x0517, 0x1537,
+ 0x0518, 0x1538,
+ 0x0519, 0x1539,
+ 0x051a, 0x153a,
+ 0x051b, 0x153b,
+ 0x051c, 0x153c,
+ 0x051d, 0x153d,
+ 0x051e, 0x153e,
+ 0x1554, 0x1555,
+ 0x1556, 0x1557,
+ 0x1558, 0x1559,
+ 0x155a, 0x155b,
+ 0x155c, 0x155d,
+ 0x155e, 0x155f,
+ 0x1560, 0x1561,
+ 0x1562, 0x1563,
+ 0x1564, 0x1565,
+ 0x1566, 0x1567,
+ 0x1568, 0x1569,
+ 0x156a, 0x156b,
+ 0x156c, 0x156d,
+ 0x156e, 0x156f,
+ 0x1570, 0x1571,
+ 0x1572, 0x1573,
+ 0x0554, 0x1574,
+ 0x0555, 0x1575,
+ 0x0556, 0x1576,
+ 0x0557, 0x1577,
+ 0x0558, 0x1578,
+ 0x0559, 0x1579,
+ 0x055a, 0x157a,
+ 0x055b, 0x157b,
+ 0x055c, 0x157c,
+ 0x055d, 0x157d,
+ 0x055e, 0x157e,
+ 0x1595, 0x1596,
+ 0x1597, 0x1598,
+ 0x1599, 0x159a,
+ 0x159b, 0x159c,
+ 0x159d, 0x159e,
+ 0x159f, 0x15a0,
+ 0x15a1, 0x15a2,
+ 0x15a3, 0x15a4,
+ 0x15a5, 0x15a6,
+ 0x15a7, 0x15a8,
+ 0x15a9, 0x15aa,
+ 0x15ab, 0x15ac,
+ 0x15ad, 0x15ae,
+ 0x15af, 0x15b0,
+ 0x15b1, 0x15b2,
+ 0x15b3, 0x15b4,
+ 0x0595, 0x15b5,
+ 0x0596, 0x15b6,
+ 0x0597, 0x15b7,
+ 0x0598, 0x15b8,
+ 0x0599, 0x15b9,
+ 0x059a, 0x15ba,
+ 0x059b, 0x15bb,
+ 0x059c, 0x15bc,
+ 0x059d, 0x15bd,
+ 0x059e, 0x15be,
+ 0x15d6, 0x15d7,
+ 0x15d8, 0x15d9,
+ 0x15da, 0x15db,
+ 0x15dc, 0x15dd,
+ 0x15de, 0x15df,
+ 0x15e0, 0x15e1,
+ 0x15e2, 0x15e3,
+ 0x15e4, 0x15e5,
+ 0x15e6, 0x15e7,
+ 0x15e8, 0x15e9,
+ 0x15ea, 0x15eb,
+ 0x15ec, 0x15ed,
+ 0x15ee, 0x15ef,
+ 0x15f0, 0x15f1,
+ 0x15f2, 0x15f3,
+ 0x15f4, 0x15f5,
+ 0x05d6, 0x15f6,
+ 0x05d7, 0x15f7,
+ 0x05d8, 0x15f8,
+ 0x05d9, 0x15f9,
+ 0x05da, 0x15fa,
+ 0x05db, 0x15fb,
+ 0x05dc, 0x15fc,
+ 0x05dd, 0x15fd,
+ 0x05de, 0x15fe,
+ 0x1617, 0x1618,
+ 0x1619, 0x161a,
+ 0x161b, 0x161c,
+ 0x161d, 0x161e,
+ 0x161f, 0x1620,
+ 0x1621, 0x1622,
+ 0x1623, 0x1624,
+ 0x1625, 0x1626,
+ 0x1627, 0x1628,
+ 0x1629, 0x162a,
+ 0x162b, 0x162c,
+ 0x162d, 0x162e,
+ 0x162f, 0x1630,
+ 0x1631, 0x1632,
+ 0x1633, 0x1634,
+ 0x1635, 0x1636,
+ 0x0617, 0x1637,
+ 0x0618, 0x1638,
+ 0x0619, 0x1639,
+ 0x061a, 0x163a,
+ 0x061b, 0x163b,
+ 0x061c, 0x163c,
+ 0x061d, 0x163d,
+ 0x061e, 0x163e,
+ 0x1658, 0x1659,
+ 0x165a, 0x165b,
+ 0x165c, 0x165d,
+ 0x165e, 0x165f,
+ 0x1660, 0x1661,
+ 0x1662, 0x1663,
+ 0x1664, 0x1665,
+ 0x1666, 0x1667,
+ 0x1668, 0x1669,
+ 0x166a, 0x166b,
+ 0x166c, 0x166d,
+ 0x166e, 0x166f,
+ 0x1670, 0x1671,
+ 0x1672, 0x1673,
+ 0x1674, 0x1675,
+ 0x1676, 0x1677,
+ 0x0658, 0x1678,
+ 0x0659, 0x1679,
+ 0x065a, 0x167a,
+ 0x065b, 0x167b,
+ 0x065c, 0x167c,
+ 0x065d, 0x167d,
+ 0x065e, 0x167e,
+ 0x1699, 0x169a,
+ 0x169b, 0x169c,
+ 0x169d, 0x169e,
+ 0x169f, 0x16a0,
+ 0x16a1, 0x16a2,
+ 0x16a3, 0x16a4,
+ 0x16a5, 0x16a6,
+ 0x16a7, 0x16a8,
+ 0x16a9, 0x16aa,
+ 0x16ab, 0x16ac,
+ 0x16ad, 0x16ae,
+ 0x16af, 0x16b0,
+ 0x16b1, 0x16b2,
+ 0x16b3, 0x16b4,
+ 0x16b5, 0x16b6,
+ 0x16b7, 0x16b8,
+ 0x0699, 0x16b9,
+ 0x069a, 0x16ba,
+ 0x069b, 0x16bb,
+ 0x069c, 0x16bc,
+ 0x069d, 0x16bd,
+ 0x069e, 0x16be,
+ 0x16da, 0x16db,
+ 0x16dc, 0x16dd,
+ 0x16de, 0x16df,
+ 0x16e0, 0x16e1,
+ 0x16e2, 0x16e3,
+ 0x16e4, 0x16e5,
+ 0x16e6, 0x16e7,
+ 0x16e8, 0x16e9,
+ 0x16ea, 0x16eb,
+ 0x16ec, 0x16ed,
+ 0x16ee, 0x16ef,
+ 0x16f0, 0x16f1,
+ 0x16f2, 0x16f3,
+ 0x16f4, 0x16f5,
+ 0x16f6, 0x16f7,
+ 0x16f8, 0x16f9,
+ 0x06da, 0x16fa,
+ 0x06db, 0x16fb,
+ 0x06dc, 0x16fc,
+ 0x06dd, 0x16fd,
+ 0x06de, 0x16fe,
+ 0x171b, 0x171c,
+ 0x171d, 0x171e,
+ 0x171f, 0x1720,
+ 0x1721, 0x1722,
+ 0x1723, 0x1724,
+ 0x1725, 0x1726,
+ 0x1727, 0x1728,
+ 0x1729, 0x172a,
+ 0x172b, 0x172c,
+ 0x172d, 0x172e,
+ 0x172f, 0x1730,
+ 0x1731, 0x1732,
+ 0x1733, 0x1734,
+ 0x1735, 0x1736,
+ 0x1737, 0x1738,
+ 0x1739, 0x173a,
+ 0x071b, 0x173b,
+ 0x071c, 0x173c,
+ 0x071d, 0x173d,
+ 0x071e, 0x173e,
+ 0x175c, 0x175d,
+ 0x175e, 0x175f,
+ 0x1760, 0x1761,
+ 0x1762, 0x1763,
+ 0x1764, 0x1765,
+ 0x1766, 0x1767,
+ 0x1768, 0x1769,
+ 0x176a, 0x176b,
+ 0x176c, 0x176d,
+ 0x176e, 0x176f,
+ 0x1770, 0x1771,
+ 0x1772, 0x1773,
+ 0x1774, 0x1775,
+ 0x1776, 0x1777,
+ 0x1778, 0x1779,
+ 0x177a, 0x177b,
+ 0x075c, 0x177c,
+ 0x075d, 0x177d,
+ 0x075e, 0x177e,
+ 0x179d, 0x179e,
+ 0x179f, 0x17a0,
+ 0x17a1, 0x17a2,
+ 0x17a3, 0x17a4,
+ 0x17a5, 0x17a6,
+ 0x17a7, 0x17a8,
+ 0x17a9, 0x17aa,
+ 0x17ab, 0x17ac,
+ 0x17ad, 0x17ae,
+ 0x17af, 0x17b0,
+ 0x17b1, 0x17b2,
+ 0x17b3, 0x17b4,
+ 0x17b5, 0x17b6,
+ 0x17b7, 0x17b8,
+ 0x17b9, 0x17ba,
+ 0x17bb, 0x17bc,
+ 0x079d, 0x17bd,
+ 0x079e, 0x17be,
+ 0x17de, 0x17df,
+ 0x17e0, 0x17e1,
+ 0x17e2, 0x17e3,
+ 0x17e4, 0x17e5,
+ 0x17e6, 0x17e7,
+ 0x17e8, 0x17e9,
+ 0x17ea, 0x17eb,
+ 0x17ec, 0x17ed,
+ 0x17ee, 0x17ef,
+ 0x17f0, 0x17f1,
+ 0x17f2, 0x17f3,
+ 0x17f4, 0x17f5,
+ 0x17f6, 0x17f7,
+ 0x17f8, 0x17f9,
+ 0x17fa, 0x17fb,
+ 0x17fc, 0x17fd,
+ 0x07de, 0x17fe,
+ 0x181f, 0x1820,
+ 0x1821, 0x1822,
+ 0x1823, 0x1824,
+ 0x1825, 0x1826,
+ 0x1827, 0x1828,
+ 0x1829, 0x182a,
+ 0x182b, 0x182c,
+ 0x182d, 0x182e,
+ 0x182f, 0x1830,
+ 0x1831, 0x1832,
+ 0x1833, 0x1834,
+ 0x1835, 0x1836,
+ 0x1837, 0x1838,
+ 0x1839, 0x183a,
+ 0x183b, 0x183c,
+ 0x183d, 0x183e,
+ 0x1860, 0x1861,
+ 0x1862, 0x1863,
+ 0x1864, 0x1865,
+ 0x1866, 0x1867,
+ 0x1868, 0x1869,
+ 0x186a, 0x186b,
+ 0x186c, 0x186d,
+ 0x186e, 0x186f,
+ 0x1870, 0x1871,
+ 0x1872, 0x1873,
+ 0x1874, 0x1875,
+ 0x1876, 0x1877,
+ 0x1878, 0x1879,
+ 0x187a, 0x187b,
+ 0x187c, 0x187d,
+ 0x187e, 0x18a1,
+ 0x18a2, 0x18a3,
+ 0x18a4, 0x18a5,
+ 0x18a6, 0x18a7,
+ 0x18a8, 0x18a9,
+ 0x18aa, 0x18ab,
+ 0x18ac, 0x18ad,
+ 0x18ae, 0x18af,
+ 0x18b0, 0x18b1,
+ 0x18b2, 0x18b3,
+ 0x18b4, 0x18b5,
+ 0x18b6, 0x18b7,
+ 0x18b8, 0x18b9,
+ 0x18ba, 0x18bb,
+ 0x18bc, 0x18bd,
+ 0x18be, 0x18e2,
+ 0x18e3, 0x18e4,
+ 0x18e5, 0x18e6,
+ 0x18e7, 0x18e8,
+ 0x18e9, 0x18ea,
+ 0x18eb, 0x18ec,
+ 0x18ed, 0x18ee,
+ 0x18ef, 0x18f0,
+ 0x18f1, 0x18f2,
+ 0x18f3, 0x18f4,
+ 0x18f5, 0x18f6,
+ 0x18f7, 0x18f8,
+ 0x18f9, 0x18fa,
+ 0x18fb, 0x18fc,
+ 0x18fd, 0x18fe,
+ 0x1923, 0x1924,
+ 0x1925, 0x1926,
+ 0x1927, 0x1928,
+ 0x1929, 0x192a,
+ 0x192b, 0x192c,
+ 0x192d, 0x192e,
+ 0x192f, 0x1930,
+ 0x1931, 0x1932,
+ 0x1933, 0x1934,
+ 0x1935, 0x1936,
+ 0x1937, 0x1938,
+ 0x1939, 0x193a,
+ 0x193b, 0x193c,
+ 0x193d, 0x193e,
+ 0x1964, 0x1965,
+ 0x1966, 0x1967,
+ 0x1968, 0x1969,
+ 0x196a, 0x196b,
+ 0x196c, 0x196d,
+ 0x196e, 0x196f,
+ 0x1970, 0x1971,
+ 0x1972, 0x1973,
+ 0x1974, 0x1975,
+ 0x1976, 0x1977,
+ 0x1978, 0x1979,
+ 0x197a, 0x197b,
+ 0x197c, 0x197d,
+ 0x197e, 0x19a5,
+ 0x19a6, 0x19a7,
+ 0x19a8, 0x19a9,
+ 0x19aa, 0x19ab,
+ 0x19ac, 0x19ad,
+ 0x19ae, 0x19af,
+ 0x19b0, 0x19b1,
+ 0x19b2, 0x19b3,
+ 0x19b4, 0x19b5,
+ 0x19b6, 0x19b7,
+ 0x19b8, 0x19b9,
+ 0x19ba, 0x19bb,
+ 0x19bc, 0x19bd,
+ 0x19be, 0x19e6,
+ 0x19e7, 0x19e8,
+ 0x19e9, 0x19ea,
+ 0x19eb, 0x19ec,
+ 0x19ed, 0x19ee,
+ 0x19ef, 0x19f0,
+ 0x19f1, 0x19f2,
+ 0x19f3, 0x19f4,
+ 0x19f5, 0x19f6,
+ 0x19f7, 0x19f8,
+ 0x19f9, 0x19fa,
+ 0x19fb, 0x19fc,
+ 0x19fd, 0x19fe,
+ 0x1a27, 0x1a28,
+ 0x1a29, 0x1a2a,
+ 0x1a2b, 0x1a2c,
+ 0x1a2d, 0x1a2e,
+ 0x1a2f, 0x1a30,
+ 0x1a31, 0x1a32,
+ 0x1a33, 0x1a34,
+ 0x1a35, 0x1a36,
+ 0x1a37, 0x1a38,
+ 0x1a39, 0x1a3a,
+ 0x1a3b, 0x1a3c,
+ 0x1a3d, 0x1a3e,
+ 0x1a68, 0x1a69,
+ 0x1a6a, 0x1a6b,
+ 0x1a6c, 0x1a6d,
+ 0x1a6e, 0x1a6f,
+ 0x1a70, 0x1a71,
+ 0x1a72, 0x1a73,
+ 0x1a74, 0x1a75,
+ 0x1a76, 0x1a77,
+ 0x1a78, 0x1a79,
+ 0x1a7a, 0x1a7b,
+ 0x1a7c, 0x1a7d,
+ 0x1a7e, 0x1aa9,
+ 0x1aaa, 0x1aab,
+ 0x1aac, 0x1aad,
+ 0x1aae, 0x1aaf,
+ 0x1ab0, 0x1ab1,
+ 0x1ab2, 0x1ab3,
+ 0x1ab4, 0x1ab5,
+ 0x1ab6, 0x1ab7,
+ 0x1ab8, 0x1ab9,
+ 0x1aba, 0x1abb,
+ 0x1abc, 0x1abd,
+ 0x1abe, 0x1aea,
+ 0x1aeb, 0x1aec,
+ 0x1aed, 0x1aee,
+ 0x1aef, 0x1af0,
+ 0x1af1, 0x1af2,
+ 0x1af3, 0x1af4,
+ 0x1af5, 0x1af6,
+ 0x1af7, 0x1af8,
+ 0x1af9, 0x1afa,
+ 0x1afb, 0x1afc,
+ 0x1afd, 0x1afe,
+ 0x1b2b, 0x1b2c,
+ 0x1b2d, 0x1b2e,
+ 0x1b2f, 0x1b30,
+ 0x1b31, 0x1b32,
+ 0x1b33, 0x1b34,
+ 0x1b35, 0x1b36,
+ 0x1b37, 0x1b38,
+ 0x1b39, 0x1b3a,
+ 0x1b3b, 0x1b3c,
+ 0x1b3d, 0x1b3e,
+ 0x1b6c, 0x1b6d,
+ 0x1b6e, 0x1b6f,
+ 0x1b70, 0x1b71,
+ 0x1b72, 0x1b73,
+ 0x1b74, 0x1b75,
+ 0x1b76, 0x1b77,
+ 0x1b78, 0x1b79,
+ 0x1b7a, 0x1b7b,
+ 0x1b7c, 0x1b7d,
+ 0x1b7e, 0x1bad,
+ 0x1bae, 0x1baf,
+ 0x1bb0, 0x1bb1,
+ 0x1bb2, 0x1bb3,
+ 0x1bb4, 0x1bb5,
+ 0x1bb6, 0x1bb7,
+ 0x1bb8, 0x1bb9,
+ 0x1bba, 0x1bbb,
+ 0x1bbc, 0x1bbd,
+ 0x1bbe, 0x1bee,
+ 0x1bef, 0x1bf0,
+ 0x1bf1, 0x1bf2,
+ 0x1bf3, 0x1bf4,
+ 0x1bf5, 0x1bf6,
+ 0x1bf7, 0x1bf8,
+ 0x1bf9, 0x1bfa,
+ 0x1bfb, 0x1bfc,
+ 0x1bfd, 0x1bfe,
+ 0x1c2f, 0x1c30,
+ 0x1c31, 0x1c32,
+ 0x1c33, 0x1c34,
+ 0x1c35, 0x1c36,
+ 0x1c37, 0x1c38,
+ 0x1c39, 0x1c3a,
+ 0x1c3b, 0x1c3c,
+ 0x1c3d, 0x1c3e,
+ 0x1c70, 0x1c71,
+ 0x1c72, 0x1c73,
+ 0x1c74, 0x1c75,
+ 0x1c76, 0x1c77,
+ 0x1c78, 0x1c79,
+ 0x1c7a, 0x1c7b,
+ 0x1c7c, 0x1c7d,
+ 0x1c7e, 0x1cb1,
+ 0x1cb2, 0x1cb3,
+ 0x1cb4, 0x1cb5,
+ 0x1cb6, 0x1cb7,
+ 0x1cb8, 0x1cb9,
+ 0x1cba, 0x1cbb,
+ 0x1cbc, 0x1cbd,
+ 0x1cbe, 0x1cf2,
+ 0x1cf3, 0x1cf4,
+ 0x1cf5, 0x1cf6,
+ 0x1cf7, 0x1cf8,
+ 0x1cf9, 0x1cfa,
+ 0x1cfb, 0x1cfc,
+ 0x1cfd, 0x1cfe,
+ 0x1d33, 0x1d34,
+ 0x1d35, 0x1d36,
+ 0x1d37, 0x1d38,
+ 0x1d39, 0x1d3a,
+ 0x1d3b, 0x1d3c,
+ 0x1d3d, 0x1d3e,
+ 0x1d74, 0x1d75,
+ 0x1d76, 0x1d77,
+ 0x1d78, 0x1d79,
+ 0x1d7a, 0x1d7b,
+ 0x1d7c, 0x1d7d,
+ 0x1d7e, 0x1db5,
+ 0x1db6, 0x1db7,
+ 0x1db8, 0x1db9,
+ 0x1dba, 0x1dbb,
+ 0x1dbc, 0x1dbd,
+ 0x1dbe, 0x1df6,
+ 0x1df7, 0x1df8,
+ 0x1df9, 0x1dfa,
+ 0x1dfb, 0x1dfc,
+ 0x1dfd, 0x1dfe,
+ 0x1e37, 0x1e38,
+ 0x1e39, 0x1e3a,
+ 0x1e3b, 0x1e3c,
+ 0x1e3d, 0x1e3e,
+ 0x1e78, 0x1e79,
+ 0x1e7a, 0x1e7b,
+ 0x1e7c, 0x1e7d,
+ 0x1e7e, 0x1eb9,
+ 0x1eba, 0x1ebb,
+ 0x1ebc, 0x1ebd,
+ 0x1ebe, 0x1efa,
+ 0x1efb, 0x1efc,
+ 0x1efd, 0x1efe,
+ 0x1f3b, 0x1f3c,
+ 0x1f3d, 0x1f3e,
+ 0x1f7c, 0x1f7d,
+ 0x1f7e, 0x1fbd,
+ 0x1fbe, 0x1ffe,
+};
+
diff --git a/tcg/aarch64/tcg-target.c b/tcg/aarch64/tcg-target.c
index ed32f64..e8370a9 100644
--- a/tcg/aarch64/tcg-target.c
+++ b/tcg/aarch64/tcg-target.c
@@ -107,6 +107,33 @@ static inline void patch_reloc(uint8_t *code_ptr, int type,
}
#define TCG_CT_CONST_S25 0x100
+#define TCG_CT_CONST_LI32 0x200
+#define TCG_CT_CONST_LI64 0x400
+
+#include "bitmask-table.h"
+
+static int find_bitmask64(uint64_t val)
+{
+ unsigned l = 0, h = ARRAY_SIZE(bitmask_imm);
+
+ while (l < h) {
+ unsigned m = (l + h) / 2;
+ if (bitmask_imm[m] == val) {
+ return m;
+ }
+ if (bitmask_imm[m] < val) {
+ l = m + 1;
+ } else {
+ h = m;
+ }
+ }
+ return -1;
+}
+
+static int find_bitmask32(uint32_t val)
+{
+ return find_bitmask64(((uint64_t)val << 32) | val);
+}
/* parse target specific constraints */
static int target_parse_constraint(TCGArgConstraint *ct,
@@ -134,6 +161,12 @@ static int target_parse_constraint(TCGArgConstraint *ct,
case 'A': /* 25-bit signed, to be added or subtracted. */
ct->ct |= TCG_CT_CONST_S25;
break;
+ case 'K': /* logical immediate 32-bit */
+ ct->ct |= TCG_CT_CONST_LI32;
+ break;
+ case 'L': /* logical immediate 64-bit */
+ ct->ct |= TCG_CT_CONST_LI64;
+ break;
default:
return -1;
}
@@ -154,6 +187,12 @@ static inline int tcg_target_const_match(tcg_target_long val,
if ((ct & TCG_CT_CONST_S25) && sextract32(val, 0, 25) == val) {
return 1;
}
+ if ((ct & TCG_CT_CONST_LI64) && find_bitmask64(val) >= 0) {
+ return 1;
+ }
+ if ((ct & TCG_CT_CONST_LI32) && find_bitmask32(val) >= 0) {
+ return 1;
+ }
return 0;
}
@@ -211,11 +250,14 @@ enum aarch64_arith_opc {
ARITH_AND = 0x0a,
ARITH_ADD = 0x0b,
ARITH_ADDI = 0x11,
+ ARITH_ANDI = 0x12,
ARITH_OR = 0x2a,
ARITH_ADDS = 0x2b,
+ ARITH_ORI = 0x32,
ARITH_XOR = 0x4a,
ARITH_SUB = 0x4b,
ARITH_SUBI = 0x51,
+ ARITH_XORI = 0x52,
ARITH_ANDS = 0x6a,
ARITH_SUBS = 0x6b,
};
@@ -477,6 +519,16 @@ static inline void tcg_out_aimm(TCGContext *s, enum aarch64_arith_opc opc,
tcg_out32(s, base | (aimm << 10) | (rn << 5) | rd);
}
+static void tcg_out_limm(TCGContext *s, enum aarch64_arith_opc opc, int ext,
+ TCGReg rd, TCGReg rn, tcg_target_long val)
+{
+ int index = (ext ? find_bitmask64(val) : find_bitmask32(val));
+ unsigned base = (ext ? 0x80 | opc : opc) << 24;
+
+ assert(index >= 0);
+ tcg_out32(s, base | bitmask_enc[index] << 10 | rn << 5 | rd);
+}
+
static inline void tcg_out_mul(TCGContext *s, int ext,
TCGReg rd, TCGReg rn, TCGReg rm)
{
@@ -1207,19 +1259,31 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
case INDEX_op_and_i64:
ext = 1; /* fall through */
case INDEX_op_and_i32:
- tcg_out_arith(s, ARITH_AND, ext, args[0], args[1], args[2], 0);
+ if (const_args[2]) {
+ tcg_out_limm(s, ARITH_ANDI, ext, args[0], args[1], args[2]);
+ } else {
+ tcg_out_arith(s, ARITH_AND, ext, args[0], args[1], args[2], 0);
+ }
break;
case INDEX_op_or_i64:
ext = 1; /* fall through */
case INDEX_op_or_i32:
- tcg_out_arith(s, ARITH_OR, ext, args[0], args[1], args[2], 0);
+ if (const_args[2]) {
+ tcg_out_limm(s, ARITH_ORI, ext, args[0], args[1], args[2]);
+ } else {
+ tcg_out_arith(s, ARITH_OR, ext, args[0], args[1], args[2], 0);
+ }
break;
case INDEX_op_xor_i64:
ext = 1; /* fall through */
case INDEX_op_xor_i32:
- tcg_out_arith(s, ARITH_XOR, ext, args[0], args[1], args[2], 0);
+ if (const_args[2]) {
+ tcg_out_limm(s, ARITH_XORI, ext, args[0], args[1], args[2]);
+ } else {
+ tcg_out_arith(s, ARITH_XOR, ext, args[0], args[1], args[2], 0);
+ }
break;
case INDEX_op_mul_i64:
@@ -1412,12 +1476,12 @@ static const TCGTargetOpDef aarch64_op_defs[] = {
{ INDEX_op_sub_i64, { "r", "r", "rA" } },
{ INDEX_op_mul_i32, { "r", "r", "r" } },
{ INDEX_op_mul_i64, { "r", "r", "r" } },
- { INDEX_op_and_i32, { "r", "r", "r" } },
- { INDEX_op_and_i64, { "r", "r", "r" } },
- { INDEX_op_or_i32, { "r", "r", "r" } },
- { INDEX_op_or_i64, { "r", "r", "r" } },
- { INDEX_op_xor_i32, { "r", "r", "r" } },
- { INDEX_op_xor_i64, { "r", "r", "r" } },
+ { INDEX_op_and_i32, { "r", "r", "rK" } },
+ { INDEX_op_and_i64, { "r", "r", "rL" } },
+ { INDEX_op_or_i32, { "r", "r", "rK" } },
+ { INDEX_op_or_i64, { "r", "r", "rL" } },
+ { INDEX_op_xor_i32, { "r", "r", "rK" } },
+ { INDEX_op_xor_i64, { "r", "r", "rL" } },
{ INDEX_op_shl_i32, { "r", "r", "ri" } },
{ INDEX_op_shr_i32, { "r", "r", "ri" } },
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [RFC 03/14] tcg-aarch64: Allow immediate operands to compare
2013-08-12 18:44 [Qemu-devel] [RFC 00/14] tcg aarch64 improvements Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 01/14] tcg-aarch64: Allow immediate operands to add and sub Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 02/14] tcg-aarch64: Allow immediate operands to and, or, xor Richard Henderson
@ 2013-08-12 18:44 ` Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 04/14] tcg-aarch64: Convert from opcode enums to insn enums Richard Henderson
` (10 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2013-08-12 18:44 UTC (permalink / raw)
To: qemu-devel; +Cc: claudio.fontana, Richard Henderson
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
tcg/aarch64/tcg-target.c | 74 +++++++++++++++++++++++++++++++++---------------
1 file changed, 51 insertions(+), 23 deletions(-)
diff --git a/tcg/aarch64/tcg-target.c b/tcg/aarch64/tcg-target.c
index e8370a9..76595b4 100644
--- a/tcg/aarch64/tcg-target.c
+++ b/tcg/aarch64/tcg-target.c
@@ -109,6 +109,7 @@ static inline void patch_reloc(uint8_t *code_ptr, int type,
#define TCG_CT_CONST_S25 0x100
#define TCG_CT_CONST_LI32 0x200
#define TCG_CT_CONST_LI64 0x400
+#define TCG_CT_CONST_CMP 0x800
#include "bitmask-table.h"
@@ -135,6 +136,14 @@ static int find_bitmask32(uint32_t val)
return find_bitmask64(((uint64_t)val << 32) | val);
}
+static int can_cmpi(tcg_target_long val)
+{
+ if (val < 0) {
+ val = ~val;
+ }
+ return (val & ~0xfff) == 0 || (val & ~0xfff000) == 0;
+}
+
/* parse target specific constraints */
static int target_parse_constraint(TCGArgConstraint *ct,
const char **pct_str)
@@ -161,6 +170,9 @@ static int target_parse_constraint(TCGArgConstraint *ct,
case 'A': /* 25-bit signed, to be added or subtracted. */
ct->ct |= TCG_CT_CONST_S25;
break;
+ case 'C': /* a 12-bit constant (maybe inverted) to be used with compare. */
+ ct->ct |= TCG_CT_CONST_CMP;
+ break;
case 'K': /* logical immediate 32-bit */
ct->ct |= TCG_CT_CONST_LI32;
break;
@@ -193,6 +205,9 @@ static inline int tcg_target_const_match(tcg_target_long val,
if ((ct & TCG_CT_CONST_LI32) && find_bitmask32(val) >= 0) {
return 1;
}
+ if ((ct & TCG_CT_CONST_CMP) && can_cmpi(val)) {
+ return 1;
+ }
return 0;
}
@@ -247,19 +262,21 @@ enum aarch64_ldst_op_type { /* type of operation */
};
enum aarch64_arith_opc {
- ARITH_AND = 0x0a,
- ARITH_ADD = 0x0b,
- ARITH_ADDI = 0x11,
- ARITH_ANDI = 0x12,
- ARITH_OR = 0x2a,
- ARITH_ADDS = 0x2b,
- ARITH_ORI = 0x32,
- ARITH_XOR = 0x4a,
- ARITH_SUB = 0x4b,
- ARITH_SUBI = 0x51,
- ARITH_XORI = 0x52,
- ARITH_ANDS = 0x6a,
- ARITH_SUBS = 0x6b,
+ ARITH_AND = 0x0a,
+ ARITH_ADD = 0x0b,
+ ARITH_ADDI = 0x11,
+ ARITH_ANDI = 0x12,
+ ARITH_OR = 0x2a,
+ ARITH_ADDS = 0x2b,
+ ARITH_ADDSI = 0x31,
+ ARITH_ORI = 0x32,
+ ARITH_XOR = 0x4a,
+ ARITH_SUB = 0x4b,
+ ARITH_SUBI = 0x51,
+ ARITH_XORI = 0x52,
+ ARITH_ANDS = 0x6a,
+ ARITH_SUBS = 0x6b,
+ ARITH_SUBSI = 0x71,
};
enum aarch64_srr_opc {
@@ -609,11 +626,22 @@ static inline void tcg_out_rotl(TCGContext *s, int ext,
tcg_out_extr(s, ext, rd, rn, rn, bits - (m & max));
}
-static inline void tcg_out_cmp(TCGContext *s, int ext, TCGReg rn, TCGReg rm,
- int shift_imm)
+static void tcg_out_cmp(TCGContext *s, int ext, TCGReg a,
+ tcg_target_long b, bool const_b)
{
- /* Using CMP alias SUBS wzr, Wn, Wm */
- tcg_out_arith(s, ARITH_SUBS, ext, TCG_REG_XZR, rn, rm, shift_imm);
+ if (const_b) {
+ /* Using CMP alias SUBS xzr, Xn, const */
+ enum aarch64_arith_opc opc = ARITH_SUBSI;
+
+ if (b < 0) {
+ b = ~b;
+ opc = ARITH_ADDSI;
+ }
+ tcg_out_aimm(s, opc, ext, TCG_REG_XZR, a, b);
+ } else {
+ /* Using CMP alias SUBS wzr, Wn, Wm */
+ tcg_out_arith(s, ARITH_SUBS, ext, TCG_REG_XZR, a, b, 0);
+ }
}
static inline void tcg_out_cset(TCGContext *s, int ext, TCGReg rd, TCGCond c)
@@ -1348,14 +1376,14 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
case INDEX_op_brcond_i64:
ext = 1; /* fall through */
case INDEX_op_brcond_i32: /* CMP 0, 1, cond(2), label 3 */
- tcg_out_cmp(s, ext, args[0], args[1], 0);
+ tcg_out_cmp(s, ext, args[0], args[1], const_args[1]);
tcg_out_goto_label_cond(s, args[2], args[3]);
break;
case INDEX_op_setcond_i64:
ext = 1; /* fall through */
case INDEX_op_setcond_i32:
- tcg_out_cmp(s, ext, args[1], args[2], 0);
+ tcg_out_cmp(s, ext, args[1], args[2], const_args[2]);
tcg_out_cset(s, 0, args[0], args[3]);
break;
@@ -1494,10 +1522,10 @@ static const TCGTargetOpDef aarch64_op_defs[] = {
{ INDEX_op_rotl_i64, { "r", "r", "ri" } },
{ INDEX_op_rotr_i64, { "r", "r", "ri" } },
- { INDEX_op_brcond_i32, { "r", "r" } },
- { INDEX_op_setcond_i32, { "r", "r", "r" } },
- { INDEX_op_brcond_i64, { "r", "r" } },
- { INDEX_op_setcond_i64, { "r", "r", "r" } },
+ { INDEX_op_brcond_i32, { "r", "rC" } },
+ { INDEX_op_setcond_i32, { "r", "r", "rC" } },
+ { INDEX_op_brcond_i64, { "r", "rC" } },
+ { INDEX_op_setcond_i64, { "r", "r", "rC" } },
{ INDEX_op_qemu_ld8u, { "r", "l" } },
{ INDEX_op_qemu_ld8s, { "r", "l" } },
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [RFC 04/14] tcg-aarch64: Convert from opcode enums to insn enums
2013-08-12 18:44 [Qemu-devel] [RFC 00/14] tcg aarch64 improvements Richard Henderson
` (2 preceding siblings ...)
2013-08-12 18:44 ` [Qemu-devel] [RFC 03/14] tcg-aarch64: Allow immediate operands to compare Richard Henderson
@ 2013-08-12 18:44 ` Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 05/14] tcg-aarch64: Support andc, orc, eqv, not Richard Henderson
` (9 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2013-08-12 18:44 UTC (permalink / raw)
To: qemu-devel; +Cc: claudio.fontana, Richard Henderson
The difference being that INSN_* has been pre-shifted into place.
This should result in less runtime shifting of constants.
The patch could be split into smaller pieces for clarity...
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
tcg/aarch64/tcg-target.c | 518 ++++++++++++++++++++++++-----------------------
1 file changed, 269 insertions(+), 249 deletions(-)
diff --git a/tcg/aarch64/tcg-target.c b/tcg/aarch64/tcg-target.c
index 76595b4..3640486 100644
--- a/tcg/aarch64/tcg-target.c
+++ b/tcg/aarch64/tcg-target.c
@@ -212,7 +212,76 @@ static inline int tcg_target_const_match(tcg_target_long val,
return 0;
}
-enum aarch64_cond_code {
+typedef enum {
+ /* Logical immediate instructions */
+ INSN_ANDI = 0x12000000,
+ INSN_ORRI = 0x32000000,
+ INSN_EORI = 0x52000000,
+
+ /* Logical shifted register instructions */
+ INSN_AND = 0x0a000000,
+ INSN_BIC = 0x0a200000,
+ INSN_ORR = 0x2a000000,
+ INSN_ORN = 0x2a200000,
+ INSN_EOR = 0x4a000000,
+ INSN_EON = 0x4a200000,
+
+ /* Move wide immediate instructions */
+ INSN_MOVN = 0x12800000,
+ INSN_MOVZ = 0x52800000,
+ INSN_MOVK = 0x72800000,
+
+ /* Add/subtract immediate instructions */
+ INSN_ADDI = 0x11000000,
+ INSN_ADDSI = 0x31000000,
+ INSN_SUBI = 0x51000000,
+ INSN_SUBSI = 0x71000000,
+
+ /* Add/subtract shifted register instructions */
+ INSN_ADD = 0x0b000000,
+ INSN_SUB = 0x4b000000,
+ INSN_SUBS = 0x6b000000,
+
+ /* Data-processing (1 source) instructions */
+ INSN_REV16 = 0x5ac00400,
+ INSN_REVx = 0xdac00c00,
+ INSN_REVw = 0x5ac00800,
+
+ /* Data-processing (2 source) instructions */
+ INSN_LSLV = 0x1ac02000,
+ INSN_LSRV = 0x1ac02400,
+ INSN_ASRV = 0x1ac02800,
+ INSN_RORV = 0x1ac02c00,
+ INSN_MUL = 0x1b007c00, /* MADD alias with Ra = xzr */
+
+ /* Bitfield instructions */
+ INSN_SBFM = 0x13000000,
+ INSN_UBFM = 0x53000000,
+ INSN_EXTR = 0x13800000,
+
+ /* Conditional select instructions */
+ INSN_CSINC = 0x1a800400,
+
+ /* Branch instructions */
+ INSN_B = 0x14000000,
+ INSN_BL = 0x94000000,
+ INSN_BR = 0xd61f0000,
+ INSN_BLR = 0xd63f0000,
+ INSN_RET = 0xd65f0000,
+ INSN_B_C = 0x54000000,
+
+ /* System instructions */
+ INSN_NOP = 0xd503201f,
+} AArch64Insn;
+
+typedef enum {
+ E32 = 0,
+ E64 = 0x80000000u,
+} AArch64Ext;
+
+#define EXT(cond) (cond ? E64 : E32)
+
+typedef enum {
COND_EQ = 0x0,
COND_NE = 0x1,
COND_CS = 0x2, /* Unsigned greater or equal */
@@ -231,9 +300,9 @@ enum aarch64_cond_code {
COND_LE = 0xd,
COND_AL = 0xe,
COND_NV = 0xf, /* behaves like COND_AL here */
-};
+} AArch64Cond;
-static const enum aarch64_cond_code tcg_cond_to_aarch64[] = {
+static const AArch64Cond tcg_cond_to_aarch64[] = {
[TCG_COND_EQ] = COND_EQ,
[TCG_COND_NE] = COND_NE,
[TCG_COND_LT] = COND_LT,
@@ -261,31 +330,6 @@ enum aarch64_ldst_op_type { /* type of operation */
LDST_LD_S_W = 0xc, /* load and sign-extend into Wt */
};
-enum aarch64_arith_opc {
- ARITH_AND = 0x0a,
- ARITH_ADD = 0x0b,
- ARITH_ADDI = 0x11,
- ARITH_ANDI = 0x12,
- ARITH_OR = 0x2a,
- ARITH_ADDS = 0x2b,
- ARITH_ADDSI = 0x31,
- ARITH_ORI = 0x32,
- ARITH_XOR = 0x4a,
- ARITH_SUB = 0x4b,
- ARITH_SUBI = 0x51,
- ARITH_XORI = 0x52,
- ARITH_ANDS = 0x6a,
- ARITH_SUBS = 0x6b,
- ARITH_SUBSI = 0x71,
-};
-
-enum aarch64_srr_opc {
- SRR_SHL = 0x0,
- SRR_SHR = 0x4,
- SRR_SAR = 0x8,
- SRR_ROR = 0xc
-};
-
static inline enum aarch64_ldst_op_data
aarch64_ldst_get_data(TCGOpcode tcg_op)
{
@@ -395,46 +439,78 @@ static inline void tcg_out_ldst_12(TCGContext *s,
| op_type << 20 | scaled_uimm << 10 | rn << 5 | rd);
}
-static inline void tcg_out_movr(TCGContext *s, int ext, TCGReg rd, TCGReg src)
+/* Suitable for add/sub and logical shifted register instructions. */
+static inline void tcg_out_arith(TCGContext *s, AArch64Insn insn,
+ AArch64Ext ext, TCGReg rd, TCGReg rn,
+ TCGReg rm, int shift_imm)
{
- /* register to register move using MOV (shifted register with no shift) */
- /* using MOV 0x2a0003e0 | (shift).. */
- unsigned int base = ext ? 0xaa0003e0 : 0x2a0003e0;
- tcg_out32(s, base | src << 16 | rd);
+ unsigned int shift;
+ if (shift_imm == 0) {
+ shift = 0;
+ } else if (shift_imm > 0) {
+ shift = shift_imm << 10 | 1 << 22;
+ } else /* (shift_imm < 0) */ {
+ shift = (-shift_imm) << 10;
+ }
+ tcg_out32(s, insn | ext | shift | rm << 16 | rn << 5 | rd);
}
-static inline void tcg_out_movi_aux(TCGContext *s,
- TCGReg rd, uint64_t value)
+static inline void tcg_out_aimm(TCGContext *s, AArch64Insn insn,
+ AArch64Ext ext, TCGReg rd, TCGReg rn,
+ uint64_t aimm)
{
- uint32_t half, base, shift, movk = 0;
- /* construct halfwords of the immediate with MOVZ/MOVK with LSL */
- /* using MOVZ 0x52800000 | extended reg.. */
- base = (value > 0xffffffff) ? 0xd2800000 : 0x52800000;
- /* count trailing zeros in 16 bit steps, mapping 64 to 0. Emit the
- first MOVZ with the half-word immediate skipping the zeros, with a shift
- (LSL) equal to this number. Then morph all next instructions into MOVKs.
+ if (aimm > 0xfff) {
+ assert((aimm & 0xfff) == 0);
+ aimm >>= 12;
+ assert(aimm <= 0xfff);
+ aimm |= 1 << 12; /* apply LSL 12 */
+ }
+ tcg_out32(s, insn | ext | aimm << 10 | rn << 5 | rd);
+}
+
+static void tcg_out_limm(TCGContext *s, AArch64Insn insn, AArch64Ext ext,
+ TCGReg rd, TCGReg rn, tcg_target_long val)
+{
+ int index = (ext ? find_bitmask64(val) : find_bitmask32(val));
+ assert(index >= 0);
+ tcg_out32(s, insn | ext | bitmask_enc[index] << 10 | rn << 5 | rd);
+}
+
+/* Register-register move, assuming XSP not XZR. */
+static inline void tcg_out_movr(TCGContext *s, AArch64Ext ext,
+ TCGReg dest, TCGReg src)
+{
+ tcg_out_aimm(s, INSN_ADDI, ext, dest, src, 0);
+}
+
+static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
+ tcg_target_long value)
+{
+ AArch64Insn insn = INSN_MOVZ;
+
+ if (type == TCG_TYPE_I32) {
+ value = (uint32_t)value;
+ }
+
+ /* Construct halfwords of the immediate with MOVZ/MOVK with LSL.
+ Count trailing zeros in 16 bit steps, mapping 64 to 0. Emit the
+ first MOVZ with the half-word immediate skipping the zeros, with
+ a shift (LSL) equal to this number. Then all other insns are MOVKs.
Zero the processed half-word in the value, continue until empty.
We build the final result 16bits at a time with up to 4 instructions,
but do not emit instructions for 16bit zero holes. */
do {
- shift = ctz64(value) & (63 & -16);
- half = (value >> shift) & 0xffff;
- tcg_out32(s, base | movk | shift << 17 | half << 5 | rd);
- movk = 0x20000000; /* morph next MOVZs into MOVKs */
+ unsigned shift = ctz64(value) & (63 & -16);
+ unsigned half = (value >> shift) & 0xffff;
+ AArch64Ext ext = EXT(shift >= 32);
+
+ tcg_out32(s, insn | ext | shift << 17 | half << 5 | rd);
+
+ insn = INSN_MOVK;
value &= ~(0xffffUL << shift);
} while (value);
}
-static inline void tcg_out_movi(TCGContext *s, TCGType type,
- TCGReg rd, tcg_target_long value)
-{
- if (type == TCG_TYPE_I64) {
- tcg_out_movi_aux(s, rd, value);
- } else {
- tcg_out_movi_aux(s, rd, value & 0xffffffff);
- }
-}
-
static inline void tcg_out_ldst_r(TCGContext *s,
enum aarch64_ldst_op_data op_data,
enum aarch64_ldst_op_type op_type,
@@ -475,19 +551,11 @@ static inline void tcg_out_ldst(TCGContext *s, enum aarch64_ldst_op_data data,
tcg_out_ldst_r(s, data, type, rd, rn, TCG_REG_TMP);
}
-/* mov alias implemented with add immediate, useful to move to/from SP */
-static inline void tcg_out_movr_sp(TCGContext *s, int ext, TCGReg rd, TCGReg rn)
-{
- /* using ADD 0x11000000 | (ext) | rn << 5 | rd */
- unsigned int base = ext ? 0x91000000 : 0x11000000;
- tcg_out32(s, base | rn << 5 | rd);
-}
-
static inline void tcg_out_mov(TCGContext *s,
TCGType type, TCGReg ret, TCGReg arg)
{
if (ret != arg) {
- tcg_out_movr(s, type == TCG_TYPE_I64, ret, arg);
+ tcg_out_movr(s, EXT(type == TCG_TYPE_I64), ret, arg);
}
}
@@ -505,90 +573,35 @@ static inline void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg,
arg, arg1, arg2);
}
-static inline void tcg_out_arith(TCGContext *s, enum aarch64_arith_opc opc,
- int ext, TCGReg rd, TCGReg rn, TCGReg rm,
- int shift_imm)
-{
- /* Using shifted register arithmetic operations */
- /* if extended register operation (64bit) just OR with 0x80 << 24 */
- unsigned int shift, base = ext ? (0x80 | opc) << 24 : opc << 24;
- if (shift_imm == 0) {
- shift = 0;
- } else if (shift_imm > 0) {
- shift = shift_imm << 10 | 1 << 22;
- } else /* (shift_imm < 0) */ {
- shift = (-shift_imm) << 10;
- }
- tcg_out32(s, base | rm << 16 | shift | rn << 5 | rd);
-}
-
-static inline void tcg_out_aimm(TCGContext *s, enum aarch64_arith_opc opc,
- int ext, TCGReg rd, TCGReg rn, uint64_t aimm)
-{
- unsigned int base = (ext ? 0x80 | opc : opc) << 24;
-
- if (aimm > 0xfff) {
- assert((aimm & 0xfff) == 0);
- aimm >>= 12;
- base |= 1 << 22; /* apply LSL 12 */
- assert(aimm <= 0xfff);
- }
- tcg_out32(s, base | (aimm << 10) | (rn << 5) | rd);
-}
-
-static void tcg_out_limm(TCGContext *s, enum aarch64_arith_opc opc, int ext,
- TCGReg rd, TCGReg rn, tcg_target_long val)
-{
- int index = (ext ? find_bitmask64(val) : find_bitmask32(val));
- unsigned base = (ext ? 0x80 | opc : opc) << 24;
-
- assert(index >= 0);
- tcg_out32(s, base | bitmask_enc[index] << 10 | rn << 5 | rd);
-}
-
-static inline void tcg_out_mul(TCGContext *s, int ext,
- TCGReg rd, TCGReg rn, TCGReg rm)
+static inline void tcg_out_data2(TCGContext *s, AArch64Insn insn,
+ AArch64Ext ext, TCGReg rd,
+ TCGReg rn, TCGReg rm)
{
- /* Using MADD 0x1b000000 with Ra = wzr alias MUL 0x1b007c00 */
- unsigned int base = ext ? 0x9b007c00 : 0x1b007c00;
- tcg_out32(s, base | rm << 16 | rn << 5 | rd);
+ tcg_out32(s, insn | ext | rm << 16 | rn << 5 | rd);
}
-static inline void tcg_out_shiftrot_reg(TCGContext *s,
- enum aarch64_srr_opc opc, int ext,
- TCGReg rd, TCGReg rn, TCGReg rm)
+static inline void tcg_out_ubfm(TCGContext *s, AArch64Ext ext, TCGReg rd,
+ TCGReg rn, unsigned int a, unsigned int b)
{
- /* using 2-source data processing instructions 0x1ac02000 */
- unsigned int base = ext ? 0x9ac02000 : 0x1ac02000;
- tcg_out32(s, base | rm << 16 | opc << 8 | rn << 5 | rd);
-}
-
-static inline void tcg_out_ubfm(TCGContext *s, int ext, TCGReg rd, TCGReg rn,
- unsigned int a, unsigned int b)
-{
- /* Using UBFM 0x53000000 Wd, Wn, a, b */
- unsigned int base = ext ? 0xd3400000 : 0x53000000;
+ unsigned int base = INSN_UBFM | (ext ? 0x80400000 : 0);
tcg_out32(s, base | a << 16 | b << 10 | rn << 5 | rd);
}
-static inline void tcg_out_sbfm(TCGContext *s, int ext, TCGReg rd, TCGReg rn,
- unsigned int a, unsigned int b)
+static inline void tcg_out_sbfm(TCGContext *s, AArch64Ext ext, TCGReg rd,
+ TCGReg rn, unsigned int a, unsigned int b)
{
- /* Using SBFM 0x13000000 Wd, Wn, a, b */
- unsigned int base = ext ? 0x93400000 : 0x13000000;
+ unsigned int base = INSN_SBFM | (ext ? 0x80400000 : 0);
tcg_out32(s, base | a << 16 | b << 10 | rn << 5 | rd);
}
-static inline void tcg_out_extr(TCGContext *s, int ext, TCGReg rd,
+static inline void tcg_out_extr(TCGContext *s, AArch64Ext ext, TCGReg rd,
TCGReg rn, TCGReg rm, unsigned int a)
{
- /* Using EXTR 0x13800000 Wd, Wn, Wm, a */
- unsigned int base = ext ? 0x93c00000 : 0x13800000;
- tcg_out32(s, base | rm << 16 | a << 10 | rn << 5 | rd);
+ tcg_out32(s, INSN_EXTR | ext | rm << 16 | a << 10 | rn << 5 | rd);
}
-static inline void tcg_out_shl(TCGContext *s, int ext,
- TCGReg rd, TCGReg rn, unsigned int m)
+static inline void tcg_out_shli(TCGContext *s, AArch64Ext ext, TCGReg rd,
+ TCGReg rn, unsigned int m)
{
int bits, max;
bits = ext ? 64 : 32;
@@ -596,29 +609,29 @@ static inline void tcg_out_shl(TCGContext *s, int ext,
tcg_out_ubfm(s, ext, rd, rn, bits - (m & max), max - (m & max));
}
-static inline void tcg_out_shr(TCGContext *s, int ext,
- TCGReg rd, TCGReg rn, unsigned int m)
+static inline void tcg_out_shri(TCGContext *s, AArch64Ext ext, TCGReg rd,
+ TCGReg rn, unsigned int m)
{
int max = ext ? 63 : 31;
tcg_out_ubfm(s, ext, rd, rn, m & max, max);
}
-static inline void tcg_out_sar(TCGContext *s, int ext,
- TCGReg rd, TCGReg rn, unsigned int m)
+static inline void tcg_out_sari(TCGContext *s, AArch64Ext ext, TCGReg rd,
+ TCGReg rn, unsigned int m)
{
int max = ext ? 63 : 31;
tcg_out_sbfm(s, ext, rd, rn, m & max, max);
}
-static inline void tcg_out_rotr(TCGContext *s, int ext,
- TCGReg rd, TCGReg rn, unsigned int m)
+static inline void tcg_out_rotri(TCGContext *s, AArch64Ext ext, TCGReg rd,
+ TCGReg rn, unsigned int m)
{
int max = ext ? 63 : 31;
tcg_out_extr(s, ext, rd, rn, rn, m & max);
}
-static inline void tcg_out_rotl(TCGContext *s, int ext,
- TCGReg rd, TCGReg rn, unsigned int m)
+static inline void tcg_out_rotli(TCGContext *s, AArch64Ext ext, TCGReg rd,
+ TCGReg rn, unsigned int m)
{
int bits, max;
bits = ext ? 64 : 32;
@@ -626,29 +639,31 @@ static inline void tcg_out_rotl(TCGContext *s, int ext,
tcg_out_extr(s, ext, rd, rn, rn, bits - (m & max));
}
-static void tcg_out_cmp(TCGContext *s, int ext, TCGReg a,
+static void tcg_out_cmp(TCGContext *s, AArch64Ext ext, TCGReg a,
tcg_target_long b, bool const_b)
{
if (const_b) {
/* Using CMP alias SUBS xzr, Xn, const */
- enum aarch64_arith_opc opc = ARITH_SUBSI;
+ AArch64Insn insn = INSN_SUBSI;
if (b < 0) {
b = ~b;
- opc = ARITH_ADDSI;
+ insn = INSN_ADDSI;
}
- tcg_out_aimm(s, opc, ext, TCG_REG_XZR, a, b);
+ tcg_out_aimm(s, insn, ext, TCG_REG_XZR, a, b);
} else {
/* Using CMP alias SUBS wzr, Wn, Wm */
- tcg_out_arith(s, ARITH_SUBS, ext, TCG_REG_XZR, a, b, 0);
+ tcg_out_arith(s, INSN_SUBS, ext, TCG_REG_XZR, a, b, 0);
}
}
-static inline void tcg_out_cset(TCGContext *s, int ext, TCGReg rd, TCGCond c)
+static inline void tcg_out_cset(TCGContext *s, AArch64Ext ext,
+ TCGReg rd, TCGCond c)
{
/* Using CSET alias of CSINC 0x1a800400 Xd, XZR, XZR, invert(cond) */
- unsigned int base = ext ? 0x9a9f07e0 : 0x1a9f07e0;
- tcg_out32(s, base | tcg_cond_to_aarch64[tcg_invert_cond(c)] << 12 | rd);
+ unsigned int base = INSN_CSINC | TCG_REG_XZR << 16 | TCG_REG_XZR << 5;
+ unsigned int cond = tcg_cond_to_aarch64[tcg_invert_cond(c)];
+ tcg_out32(s, base | ext | cond << 12 | rd);
}
static inline void tcg_out_goto(TCGContext *s, tcg_target_long target)
@@ -661,7 +676,7 @@ static inline void tcg_out_goto(TCGContext *s, tcg_target_long target)
tcg_abort();
}
- tcg_out32(s, 0x14000000 | (offset & 0x03ffffff));
+ tcg_out32(s, INSN_B | (offset & 0x03ffffff));
}
static inline void tcg_out_goto_noaddr(TCGContext *s)
@@ -672,7 +687,7 @@ static inline void tcg_out_goto_noaddr(TCGContext *s)
Mask away possible garbage in the high bits for the first translation,
while keeping the offset bits for retranslation. */
uint32_t insn;
- insn = (tcg_in32(s) & 0x03ffffff) | 0x14000000;
+ insn = (tcg_in32(s) & 0x03ffffff) | INSN_B;
tcg_out32(s, insn);
}
@@ -681,7 +696,7 @@ static inline void tcg_out_goto_cond_noaddr(TCGContext *s, TCGCond c)
/* see comments in tcg_out_goto_noaddr */
uint32_t insn;
insn = tcg_in32(s) & (0x07ffff << 5);
- insn |= 0x54000000 | tcg_cond_to_aarch64[c];
+ insn |= INSN_B_C | tcg_cond_to_aarch64[c];
tcg_out32(s, insn);
}
@@ -697,17 +712,17 @@ static inline void tcg_out_goto_cond(TCGContext *s, TCGCond c,
}
offset &= 0x7ffff;
- tcg_out32(s, 0x54000000 | tcg_cond_to_aarch64[c] | offset << 5);
+ tcg_out32(s, INSN_B_C | tcg_cond_to_aarch64[c] | offset << 5);
}
static inline void tcg_out_callr(TCGContext *s, TCGReg reg)
{
- tcg_out32(s, 0xd63f0000 | reg << 5);
+ tcg_out32(s, INSN_BLR | reg << 5);
}
static inline void tcg_out_gotor(TCGContext *s, TCGReg reg)
{
- tcg_out32(s, 0xd61f0000 | reg << 5);
+ tcg_out32(s, INSN_BR | reg << 5);
}
static inline void tcg_out_call(TCGContext *s, tcg_target_long target)
@@ -720,7 +735,7 @@ static inline void tcg_out_call(TCGContext *s, tcg_target_long target)
tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_TMP, target);
tcg_out_callr(s, TCG_REG_TMP);
} else {
- tcg_out32(s, 0x94000000 | (offset & 0x03ffffff));
+ tcg_out32(s, INSN_BL | (offset & 0x03ffffff));
}
}
@@ -741,7 +756,7 @@ aarch64_limm(unsigned int m, unsigned int r)
to test a 32bit reg against 0xff000000, pass M = 8, R = 8.
to test a 32bit reg against 0xff0000ff, pass M = 16, R = 8.
*/
-static inline void tcg_out_tst(TCGContext *s, int ext, TCGReg rn,
+static inline void tcg_out_tst(TCGContext *s, AArch64Ext ext, TCGReg rn,
unsigned int m, unsigned int r)
{
/* using TST alias of ANDS XZR, Xn,#bimm64 0x7200001f */
@@ -750,8 +765,8 @@ static inline void tcg_out_tst(TCGContext *s, int ext, TCGReg rn,
}
/* and a register with a bit pattern, similarly to TST, no flags change */
-static inline void tcg_out_andi(TCGContext *s, int ext, TCGReg rd, TCGReg rn,
- unsigned int m, unsigned int r)
+static inline void tcg_out_andi(TCGContext *s, AArch64Ext ext, TCGReg rd,
+ TCGReg rn, unsigned int m, unsigned int r)
{
/* using AND 0x12000000 */
unsigned int base = ext ? 0x92400000 : 0x12000000;
@@ -760,8 +775,7 @@ static inline void tcg_out_andi(TCGContext *s, int ext, TCGReg rd, TCGReg rn,
static inline void tcg_out_ret(TCGContext *s)
{
- /* emit RET { LR } */
- tcg_out32(s, 0xd65f03c0);
+ tcg_out32(s, INSN_RET | TCG_REG_LR << 5);
}
void aarch64_tb_set_jmp_target(uintptr_t jmp_addr, uintptr_t addr)
@@ -804,25 +818,23 @@ static inline void tcg_out_goto_label_cond(TCGContext *s,
}
}
-static inline void tcg_out_rev(TCGContext *s, int ext, TCGReg rd, TCGReg rm)
+static inline void tcg_out_rev(TCGContext *s, AArch64Ext ext,
+ TCGReg rd, TCGReg rm)
{
- /* using REV 0x5ac00800 */
- unsigned int base = ext ? 0xdac00c00 : 0x5ac00800;
- tcg_out32(s, base | rm << 5 | rd);
+ AArch64Insn insn = ext ? INSN_REVx : INSN_REVw;
+ tcg_out32(s, insn | rm << 5 | rd);
}
-static inline void tcg_out_rev16(TCGContext *s, int ext, TCGReg rd, TCGReg rm)
+static inline void tcg_out_rev16(TCGContext *s, AArch64Ext ext,
+ TCGReg rd, TCGReg rm)
{
- /* using REV16 0x5ac00400 */
- unsigned int base = ext ? 0xdac00400 : 0x5ac00400;
- tcg_out32(s, base | rm << 5 | rd);
+ tcg_out32(s, INSN_REV16 | ext | rm << 5 | rd);
}
-static inline void tcg_out_sxt(TCGContext *s, int ext, int s_bits,
+static inline void tcg_out_sxt(TCGContext *s, AArch64Ext ext, int s_bits,
TCGReg rd, TCGReg rn)
{
- /* using ALIASes SXTB 0x13001c00, SXTH 0x13003c00, SXTW 0x93407c00
- of SBFM Xd, Xn, #0, #7|15|31 */
+ /* using ALIASes SXTB, SXTH, SXTW of SBFM Xd, Xn, #0, #7|15|31 */
int bits = 8 * (1 << s_bits) - 1;
tcg_out_sbfm(s, ext, rd, rn, 0, bits);
}
@@ -830,38 +842,37 @@ static inline void tcg_out_sxt(TCGContext *s, int ext, int s_bits,
static inline void tcg_out_uxt(TCGContext *s, int s_bits,
TCGReg rd, TCGReg rn)
{
- /* using ALIASes UXTB 0x53001c00, UXTH 0x53003c00
- of UBFM Wd, Wn, #0, #7|15 */
+ /* using ALIASes UXTB, UXTH, of UBFM Wd, Wn, #0, #7|15 */
int bits = 8 * (1 << s_bits) - 1;
tcg_out_ubfm(s, 0, rd, rn, 0, bits);
}
-static void tcg_out_addi(TCGContext *s, int ext, TCGReg rd, TCGReg rn,
+static void tcg_out_addi(TCGContext *s, AArch64Ext ext, TCGReg rd, TCGReg rn,
tcg_target_long aimm)
{
- enum aarch64_arith_opc opc = ARITH_ADDI;
+ AArch64Insn insn = INSN_ADDI;
tcg_target_long lo, hi;
if (aimm < 0) {
aimm = -aimm;
- opc = ARITH_SUBI;
+ insn = INSN_SUBI;
}
hi = aimm & 0xfff000;
lo = aimm & 0xfff;
assert(aimm == hi + lo);
if (hi != 0) {
- tcg_out_aimm(s, opc, ext, rd, rn, hi);
+ tcg_out_aimm(s, insn, ext, rd, rn, hi);
rn = rd;
}
if (lo != 0 || rd != rn) {
- tcg_out_aimm(s, opc, ext, rd, rn, lo);
+ tcg_out_aimm(s, insn, ext, rd, rn, lo);
}
}
static inline void tcg_out_nop(TCGContext *s)
{
- tcg_out32(s, 0xd503201f);
+ tcg_out32(s, INSN_NOP);
}
#ifdef CONFIG_SOFTMMU
@@ -887,17 +898,23 @@ static const void * const qemu_st_helpers[4] = {
static void tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
{
+ int opc = lb->opc;
+ int s_bits = opc & 3;
+
reloc_pc19(lb->label_ptr[0], (tcg_target_long)s->code_ptr);
- tcg_out_movr(s, 1, TCG_REG_X0, TCG_AREG0);
- tcg_out_movr(s, (TARGET_LONG_BITS == 64), TCG_REG_X1, lb->addrlo_reg);
+
+ tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_X0, TCG_AREG0);
+ tcg_out_mov(s, TCG_TYPE_TL, TCG_REG_X1, lb->addrlo_reg);
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_X2, lb->mem_index);
tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_TMP,
- (tcg_target_long)qemu_ld_helpers[lb->opc & 3]);
+ (tcg_target_long)qemu_ld_helpers[s_bits]);
tcg_out_callr(s, TCG_REG_TMP);
- if (lb->opc & 0x04) {
- tcg_out_sxt(s, 1, lb->opc & 3, lb->datalo_reg, TCG_REG_X0);
+
+ if (opc & 0x04) {
+ tcg_out_sxt(s, E64, s_bits, lb->datalo_reg, TCG_REG_X0);
} else {
- tcg_out_movr(s, 1, lb->datalo_reg, TCG_REG_X0);
+ tcg_out_mov(s, s_bits == 3 ? TCG_TYPE_I64 : TCG_TYPE_I32,
+ lb->datalo_reg, TCG_REG_X0);
}
tcg_out_goto(s, (tcg_target_long)lb->raddr);
@@ -905,14 +922,17 @@ static void tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
static void tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
{
+ int s_bits = lb->opc;
+
reloc_pc19(lb->label_ptr[0], (tcg_target_long)s->code_ptr);
- tcg_out_movr(s, 1, TCG_REG_X0, TCG_AREG0);
- tcg_out_movr(s, (TARGET_LONG_BITS == 64), TCG_REG_X1, lb->addrlo_reg);
- tcg_out_movr(s, 1, TCG_REG_X2, lb->datalo_reg);
+ tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_X0, TCG_AREG0);
+ tcg_out_mov(s, TCG_TYPE_TL, TCG_REG_X1, lb->addrlo_reg);
+ tcg_out_mov(s, s_bits == 3 ? TCG_TYPE_I64 : TCG_TYPE_I32,
+ TCG_REG_X2, lb->datalo_reg);
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_X3, lb->mem_index);
tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_TMP,
- (tcg_target_long)qemu_st_helpers[lb->opc & 3]);
+ (tcg_target_long)qemu_st_helpers[s_bits]);
tcg_out_callr(s, TCG_REG_TMP);
tcg_out_nop(s);
@@ -980,10 +1000,10 @@ static void tcg_out_tlb_read(TCGContext *s, TCGReg addr_reg,
/* Add any "high bits" from the tlb offset to the env address into X2,
to take advantage of the LSL12 form of the addi instruction.
X2 = env + (tlb_offset & 0xfff000) */
- tcg_out_addi(s, 1, TCG_REG_X2, base, tlb_offset & 0xfff000);
+ tcg_out_addi(s, E64, TCG_REG_X2, base, tlb_offset & 0xfff000);
/* Merge the tlb index contribution into X2.
X2 = X2 + (X0 << CPU_TLB_ENTRY_BITS) */
- tcg_out_arith(s, ARITH_ADD, 1, TCG_REG_X2, TCG_REG_X2,
+ tcg_out_arith(s, INSN_ADD, E64, TCG_REG_X2, TCG_REG_X2,
TCG_REG_X0, -CPU_TLB_ENTRY_BITS);
/* Merge "low bits" from tlb offset, load the tlb comparator into X0.
X0 = load [X2 + (tlb_offset & 0x000fff)] */
@@ -997,7 +1017,7 @@ static void tcg_out_tlb_read(TCGContext *s, TCGReg addr_reg,
(is_read ? offsetof(CPUTLBEntry, addr_read)
: offsetof(CPUTLBEntry, addr_write)));
/* Perform the address comparison. */
- tcg_out_cmp(s, (TARGET_LONG_BITS == 64), TCG_REG_X0, TCG_REG_X3, 0);
+ tcg_out_cmp(s, EXT(TARGET_LONG_BITS == 64), TCG_REG_X0, TCG_REG_X3, 0);
*label_ptr = s->code_ptr;
/* If not equal, we jump to the slow path. */
tcg_out_goto_cond_noaddr(s, TCG_COND_NE);
@@ -1024,8 +1044,8 @@ static void tcg_out_qemu_ld_direct(TCGContext *s, int opc, TCGReg data_r,
case 1 | 4:
if (TCG_LDST_BSWAP) {
tcg_out_ldst_r(s, LDST_16, LDST_LD, data_r, addr_r, off_r);
- tcg_out_rev16(s, 0, data_r, data_r);
- tcg_out_sxt(s, 1, 1, data_r, data_r);
+ tcg_out_rev16(s, E32, data_r, data_r);
+ tcg_out_sxt(s, E64, 1, data_r, data_r);
} else {
tcg_out_ldst_r(s, LDST_16, LDST_LD_S_X, data_r, addr_r, off_r);
}
@@ -1033,14 +1053,14 @@ static void tcg_out_qemu_ld_direct(TCGContext *s, int opc, TCGReg data_r,
case 2:
tcg_out_ldst_r(s, LDST_32, LDST_LD, data_r, addr_r, off_r);
if (TCG_LDST_BSWAP) {
- tcg_out_rev(s, 0, data_r, data_r);
+ tcg_out_rev(s, E32, data_r, data_r);
}
break;
case 2 | 4:
if (TCG_LDST_BSWAP) {
tcg_out_ldst_r(s, LDST_32, LDST_LD, data_r, addr_r, off_r);
- tcg_out_rev(s, 0, data_r, data_r);
- tcg_out_sxt(s, 1, 2, data_r, data_r);
+ tcg_out_rev(s, E32, data_r, data_r);
+ tcg_out_sxt(s, E64, 2, data_r, data_r);
} else {
tcg_out_ldst_r(s, LDST_32, LDST_LD_S_X, data_r, addr_r, off_r);
}
@@ -1048,7 +1068,7 @@ static void tcg_out_qemu_ld_direct(TCGContext *s, int opc, TCGReg data_r,
case 3:
tcg_out_ldst_r(s, LDST_64, LDST_LD, data_r, addr_r, off_r);
if (TCG_LDST_BSWAP) {
- tcg_out_rev(s, 1, data_r, data_r);
+ tcg_out_rev(s, E64, data_r, data_r);
}
break;
default:
@@ -1065,7 +1085,7 @@ static void tcg_out_qemu_st_direct(TCGContext *s, int opc, TCGReg data_r,
break;
case 1:
if (TCG_LDST_BSWAP) {
- tcg_out_rev16(s, 0, TCG_REG_TMP, data_r);
+ tcg_out_rev16(s, E32, TCG_REG_TMP, data_r);
tcg_out_ldst_r(s, LDST_16, LDST_ST, TCG_REG_TMP, addr_r, off_r);
} else {
tcg_out_ldst_r(s, LDST_16, LDST_ST, data_r, addr_r, off_r);
@@ -1073,7 +1093,7 @@ static void tcg_out_qemu_st_direct(TCGContext *s, int opc, TCGReg data_r,
break;
case 2:
if (TCG_LDST_BSWAP) {
- tcg_out_rev(s, 0, TCG_REG_TMP, data_r);
+ tcg_out_rev(s, E32, TCG_REG_TMP, data_r);
tcg_out_ldst_r(s, LDST_32, LDST_ST, TCG_REG_TMP, addr_r, off_r);
} else {
tcg_out_ldst_r(s, LDST_32, LDST_ST, data_r, addr_r, off_r);
@@ -1081,7 +1101,7 @@ static void tcg_out_qemu_st_direct(TCGContext *s, int opc, TCGReg data_r,
break;
case 3:
if (TCG_LDST_BSWAP) {
- tcg_out_rev(s, 1, TCG_REG_TMP, data_r);
+ tcg_out_rev(s, E64, TCG_REG_TMP, data_r);
tcg_out_ldst_r(s, LDST_64, LDST_ST, TCG_REG_TMP, addr_r, off_r);
} else {
tcg_out_ldst_r(s, LDST_64, LDST_ST, data_r, addr_r, off_r);
@@ -1196,7 +1216,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
{
/* ext will be set in the switch below, which will fall through to the
common code. It triggers the use of extended regs where appropriate. */
- int ext = 0;
+ AArch64Ext ext = E32;
switch (opc) {
case INDEX_op_exit_tb:
@@ -1252,9 +1272,10 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
break;
case INDEX_op_mov_i64:
- ext = 1; /* fall through */
+ tcg_out_mov(s, TCG_TYPE_I64, args[0], args[1]);
+ break;
case INDEX_op_mov_i32:
- tcg_out_movr(s, ext, args[0], args[1]);
+ tcg_out_mov(s, TCG_TYPE_I32, args[0], args[1]);
break;
case INDEX_op_movi_i64:
@@ -1265,123 +1286,122 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
break;
case INDEX_op_add_i64:
- ext = 1; /* fall through */
+ ext = E64; /* fall through */
case INDEX_op_add_i32:
if (const_args[2]) {
tcg_out_addi(s, ext, args[0], args[1], args[2]);
} else {
- tcg_out_arith(s, ARITH_ADD, ext, args[0], args[1], args[2], 0);
+ tcg_out_arith(s, INSN_ADD, ext, args[0], args[1], args[2], 0);
}
break;
case INDEX_op_sub_i64:
- ext = 1; /* fall through */
+ ext = E64; /* fall through */
case INDEX_op_sub_i32:
if (const_args[2]) {
tcg_out_addi(s, ext, args[0], args[1], -args[2]);
} else {
- tcg_out_arith(s, ARITH_SUB, ext, args[0], args[1], args[2], 0);
+ tcg_out_arith(s, INSN_SUB, ext, args[0], args[1], args[2], 0);
}
break;
case INDEX_op_and_i64:
- ext = 1; /* fall through */
+ ext = E64; /* fall through */
case INDEX_op_and_i32:
if (const_args[2]) {
- tcg_out_limm(s, ARITH_ANDI, ext, args[0], args[1], args[2]);
+ tcg_out_limm(s, INSN_ANDI, ext, args[0], args[1], args[2]);
} else {
- tcg_out_arith(s, ARITH_AND, ext, args[0], args[1], args[2], 0);
+ tcg_out_arith(s, INSN_AND, ext, args[0], args[1], args[2], 0);
}
break;
case INDEX_op_or_i64:
- ext = 1; /* fall through */
+ ext = E64; /* fall through */
case INDEX_op_or_i32:
if (const_args[2]) {
- tcg_out_limm(s, ARITH_ORI, ext, args[0], args[1], args[2]);
+ tcg_out_limm(s, INSN_ORRI, ext, args[0], args[1], args[2]);
} else {
- tcg_out_arith(s, ARITH_OR, ext, args[0], args[1], args[2], 0);
+ tcg_out_arith(s, INSN_ORR, ext, args[0], args[1], args[2], 0);
}
break;
case INDEX_op_xor_i64:
- ext = 1; /* fall through */
+ ext = E64; /* fall through */
case INDEX_op_xor_i32:
if (const_args[2]) {
- tcg_out_limm(s, ARITH_XORI, ext, args[0], args[1], args[2]);
+ tcg_out_limm(s, INSN_EORI, ext, args[0], args[1], args[2]);
} else {
- tcg_out_arith(s, ARITH_XOR, ext, args[0], args[1], args[2], 0);
+ tcg_out_arith(s, INSN_EOR, ext, args[0], args[1], args[2], 0);
}
break;
case INDEX_op_mul_i64:
- ext = 1; /* fall through */
+ ext = E64; /* fall through */
case INDEX_op_mul_i32:
- tcg_out_mul(s, ext, args[0], args[1], args[2]);
+ tcg_out_data2(s, INSN_MUL, ext, args[0], args[1], args[2]);
break;
case INDEX_op_shl_i64:
- ext = 1; /* fall through */
+ ext = E64; /* fall through */
case INDEX_op_shl_i32:
if (const_args[2]) { /* LSL / UBFM Wd, Wn, (32 - m) */
- tcg_out_shl(s, ext, args[0], args[1], args[2]);
+ tcg_out_shli(s, ext, args[0], args[1], args[2]);
} else { /* LSL / LSLV */
- tcg_out_shiftrot_reg(s, SRR_SHL, ext, args[0], args[1], args[2]);
+ tcg_out_data2(s, INSN_LSLV, ext, args[0], args[1], args[2]);
}
break;
case INDEX_op_shr_i64:
- ext = 1; /* fall through */
+ ext = E64; /* fall through */
case INDEX_op_shr_i32:
if (const_args[2]) { /* LSR / UBFM Wd, Wn, m, 31 */
- tcg_out_shr(s, ext, args[0], args[1], args[2]);
+ tcg_out_shri(s, ext, args[0], args[1], args[2]);
} else { /* LSR / LSRV */
- tcg_out_shiftrot_reg(s, SRR_SHR, ext, args[0], args[1], args[2]);
+ tcg_out_data2(s, INSN_LSRV, ext, args[0], args[1], args[2]);
}
break;
case INDEX_op_sar_i64:
- ext = 1; /* fall through */
+ ext = E64; /* fall through */
case INDEX_op_sar_i32:
if (const_args[2]) { /* ASR / SBFM Wd, Wn, m, 31 */
- tcg_out_sar(s, ext, args[0], args[1], args[2]);
+ tcg_out_sari(s, ext, args[0], args[1], args[2]);
} else { /* ASR / ASRV */
- tcg_out_shiftrot_reg(s, SRR_SAR, ext, args[0], args[1], args[2]);
+ tcg_out_data2(s, INSN_ASRV, ext, args[0], args[1], args[2]);
}
break;
case INDEX_op_rotr_i64:
- ext = 1; /* fall through */
+ ext = E64; /* fall through */
case INDEX_op_rotr_i32:
if (const_args[2]) { /* ROR / EXTR Wd, Wm, Wm, m */
- tcg_out_rotr(s, ext, args[0], args[1], args[2]);
+ tcg_out_rotri(s, ext, args[0], args[1], args[2]);
} else { /* ROR / RORV */
- tcg_out_shiftrot_reg(s, SRR_ROR, ext, args[0], args[1], args[2]);
+ tcg_out_data2(s, INSN_RORV, ext, args[0], args[1], args[2]);
}
break;
case INDEX_op_rotl_i64:
- ext = 1; /* fall through */
+ ext = E64; /* fall through */
case INDEX_op_rotl_i32: /* same as rotate right by (32 - m) */
if (const_args[2]) { /* ROR / EXTR Wd, Wm, Wm, 32 - m */
- tcg_out_rotl(s, ext, args[0], args[1], args[2]);
+ tcg_out_rotli(s, ext, args[0], args[1], args[2]);
} else {
- tcg_out_arith(s, ARITH_SUB, 0,
+ tcg_out_arith(s, INSN_SUB, E32,
TCG_REG_TMP, TCG_REG_XZR, args[2], 0);
- tcg_out_shiftrot_reg(s, SRR_ROR, ext,
- args[0], args[1], TCG_REG_TMP);
+ tcg_out_data2(s, INSN_RORV, ext, args[0], args[1], TCG_REG_TMP);
}
break;
case INDEX_op_brcond_i64:
- ext = 1; /* fall through */
- case INDEX_op_brcond_i32: /* CMP 0, 1, cond(2), label 3 */
+ ext = E64; /* fall through */
+ case INDEX_op_brcond_i32:
tcg_out_cmp(s, ext, args[0], args[1], const_args[1]);
tcg_out_goto_label_cond(s, args[2], args[3]);
break;
case INDEX_op_setcond_i64:
- ext = 1; /* fall through */
+ ext = E64; /* fall through */
case INDEX_op_setcond_i32:
tcg_out_cmp(s, ext, args[1], args[2], const_args[2]);
tcg_out_cset(s, 0, args[0], args[3]);
@@ -1425,7 +1445,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
break;
case INDEX_op_bswap64_i64:
- ext = 1; /* fall through */
+ ext = E64; /* fall through */
case INDEX_op_bswap32_i64:
case INDEX_op_bswap32_i32:
tcg_out_rev(s, ext, args[0], args[1]);
@@ -1436,17 +1456,17 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
break;
case INDEX_op_ext8s_i64:
- ext = 1; /* fall through */
+ ext = E64; /* fall through */
case INDEX_op_ext8s_i32:
tcg_out_sxt(s, ext, 0, args[0], args[1]);
break;
case INDEX_op_ext16s_i64:
- ext = 1; /* fall through */
+ ext = E64; /* fall through */
case INDEX_op_ext16s_i32:
tcg_out_sxt(s, ext, 1, args[0], args[1]);
break;
case INDEX_op_ext32s_i64:
- tcg_out_sxt(s, 1, 2, args[0], args[1]);
+ tcg_out_sxt(s, E64, 2, args[0], args[1]);
break;
case INDEX_op_ext8u_i64:
case INDEX_op_ext8u_i32:
@@ -1457,7 +1477,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
tcg_out_uxt(s, 1, args[0], args[1]);
break;
case INDEX_op_ext32u_i64:
- tcg_out_movr(s, 0, args[0], args[1]);
+ tcg_out_movr(s, E32, args[0], args[1]);
break;
default:
@@ -1616,7 +1636,7 @@ static void tcg_target_qemu_prologue(TCGContext *s)
TCG_REG_FP, TCG_REG_LR, frame_size_callee_saved);
/* FP -> callee_saved */
- tcg_out_movr_sp(s, 1, TCG_REG_FP, TCG_REG_SP);
+ tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_FP, TCG_REG_SP);
/* store callee-preserved regs x19..x28 using FP -> callee_saved */
for (r = TCG_REG_X19; r <= TCG_REG_X27; r += 2) {
@@ -1625,7 +1645,7 @@ static void tcg_target_qemu_prologue(TCGContext *s)
}
/* make stack space for TCG locals */
- tcg_out_addi(s, 1, TCG_REG_SP, TCG_REG_SP,
+ tcg_out_addi(s, E64, TCG_REG_SP, TCG_REG_SP,
-frame_size_tcg_locals * TCG_TARGET_STACK_ALIGN);
/* inform TCG about how to find TCG locals with register, offset, size */
tcg_set_frame(s, TCG_REG_SP, TCG_STATIC_CALL_ARGS_SIZE,
@@ -1644,7 +1664,7 @@ static void tcg_target_qemu_prologue(TCGContext *s)
tb_ret_addr = s->code_ptr;
/* remove TCG locals stack space */
- tcg_out_addi(s, 1, TCG_REG_SP, TCG_REG_SP,
+ tcg_out_addi(s, E64, TCG_REG_SP, TCG_REG_SP,
frame_size_tcg_locals * TCG_TARGET_STACK_ALIGN);
/* restore registers x19..x28.
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [RFC 05/14] tcg-aarch64: Support andc, orc, eqv, not
2013-08-12 18:44 [Qemu-devel] [RFC 00/14] tcg aarch64 improvements Richard Henderson
` (3 preceding siblings ...)
2013-08-12 18:44 ` [Qemu-devel] [RFC 04/14] tcg-aarch64: Convert from opcode enums to insn enums Richard Henderson
@ 2013-08-12 18:44 ` Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 06/14] tcg-aarch64: Handle zero as first argument to sub Richard Henderson
` (8 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2013-08-12 18:44 UTC (permalink / raw)
To: qemu-devel; +Cc: claudio.fontana, Richard Henderson
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
tcg/aarch64/tcg-target.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
tcg/aarch64/tcg-target.h | 16 ++++++++--------
2 files changed, 52 insertions(+), 8 deletions(-)
diff --git a/tcg/aarch64/tcg-target.c b/tcg/aarch64/tcg-target.c
index 3640486..7aeb3cd 100644
--- a/tcg/aarch64/tcg-target.c
+++ b/tcg/aarch64/tcg-target.c
@@ -1314,6 +1314,15 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
tcg_out_arith(s, INSN_AND, ext, args[0], args[1], args[2], 0);
}
break;
+ case INDEX_op_andc_i64:
+ ext = E64; /* fall through */
+ case INDEX_op_andc_i32:
+ if (const_args[2]) {
+ tcg_out_limm(s, INSN_ANDI, ext, args[0], args[1], ~args[2]);
+ } else {
+ tcg_out_arith(s, INSN_BIC, ext, args[0], args[1], args[2], 0);
+ }
+ break;
case INDEX_op_or_i64:
ext = E64; /* fall through */
@@ -1325,6 +1334,16 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
}
break;
+ case INDEX_op_orc_i64:
+ ext = E64; /* fall through */
+ case INDEX_op_orc_i32:
+ if (const_args[2]) {
+ tcg_out_limm(s, INSN_ORRI, ext, args[0], args[1], ~args[2]);
+ } else {
+ tcg_out_arith(s, INSN_ORN, ext, args[0], args[1], args[2], 0);
+ }
+ break;
+
case INDEX_op_xor_i64:
ext = E64; /* fall through */
case INDEX_op_xor_i32:
@@ -1335,6 +1354,22 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
}
break;
+ case INDEX_op_eqv_i64:
+ ext = E64; /* fall through */
+ case INDEX_op_eqv_i32:
+ if (const_args[2]) {
+ tcg_out_limm(s, INSN_EORI, ext, args[0], args[1], ~args[2]);
+ } else {
+ tcg_out_arith(s, INSN_EON, ext, args[0], args[1], args[2], 0);
+ }
+ break;
+
+ case INDEX_op_not_i64:
+ ext = E64; /* fall through */
+ case INDEX_op_not_i32:
+ tcg_out_arith(s, INSN_ORN, ext, args[0], TCG_REG_XZR, args[1], 0);
+ break;
+
case INDEX_op_mul_i64:
ext = E64; /* fall through */
case INDEX_op_mul_i32:
@@ -1530,6 +1565,15 @@ static const TCGTargetOpDef aarch64_op_defs[] = {
{ INDEX_op_or_i64, { "r", "r", "rL" } },
{ INDEX_op_xor_i32, { "r", "r", "rK" } },
{ INDEX_op_xor_i64, { "r", "r", "rL" } },
+ { INDEX_op_andc_i32, { "r", "r", "rK" } },
+ { INDEX_op_andc_i64, { "r", "r", "rL" } },
+ { INDEX_op_orc_i32, { "r", "r", "rK" } },
+ { INDEX_op_orc_i64, { "r", "r", "rL" } },
+ { INDEX_op_eqv_i32, { "r", "r", "rK" } },
+ { INDEX_op_eqv_i64, { "r", "r", "rL" } },
+
+ { INDEX_op_not_i32, { "r", "r" } },
+ { INDEX_op_not_i64, { "r", "r" } },
{ INDEX_op_shl_i32, { "r", "r", "ri" } },
{ INDEX_op_shr_i32, { "r", "r", "ri" } },
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
index 51e5092..ffe9429 100644
--- a/tcg/aarch64/tcg-target.h
+++ b/tcg/aarch64/tcg-target.h
@@ -47,12 +47,12 @@ typedef enum {
#define TCG_TARGET_HAS_ext16u_i32 1
#define TCG_TARGET_HAS_bswap16_i32 1
#define TCG_TARGET_HAS_bswap32_i32 1
-#define TCG_TARGET_HAS_not_i32 0
+#define TCG_TARGET_HAS_not_i32 1
#define TCG_TARGET_HAS_neg_i32 0
#define TCG_TARGET_HAS_rot_i32 1
-#define TCG_TARGET_HAS_andc_i32 0
-#define TCG_TARGET_HAS_orc_i32 0
-#define TCG_TARGET_HAS_eqv_i32 0
+#define TCG_TARGET_HAS_andc_i32 1
+#define TCG_TARGET_HAS_orc_i32 1
+#define TCG_TARGET_HAS_eqv_i32 1
#define TCG_TARGET_HAS_nand_i32 0
#define TCG_TARGET_HAS_nor_i32 0
#define TCG_TARGET_HAS_deposit_i32 0
@@ -73,12 +73,12 @@ typedef enum {
#define TCG_TARGET_HAS_bswap16_i64 1
#define TCG_TARGET_HAS_bswap32_i64 1
#define TCG_TARGET_HAS_bswap64_i64 1
-#define TCG_TARGET_HAS_not_i64 0
+#define TCG_TARGET_HAS_not_i64 1
#define TCG_TARGET_HAS_neg_i64 0
#define TCG_TARGET_HAS_rot_i64 1
-#define TCG_TARGET_HAS_andc_i64 0
-#define TCG_TARGET_HAS_orc_i64 0
-#define TCG_TARGET_HAS_eqv_i64 0
+#define TCG_TARGET_HAS_andc_i64 1
+#define TCG_TARGET_HAS_orc_i64 1
+#define TCG_TARGET_HAS_eqv_i64 1
#define TCG_TARGET_HAS_nand_i64 0
#define TCG_TARGET_HAS_nor_i64 0
#define TCG_TARGET_HAS_deposit_i64 0
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [RFC 06/14] tcg-aarch64: Handle zero as first argument to sub
2013-08-12 18:44 [Qemu-devel] [RFC 00/14] tcg aarch64 improvements Richard Henderson
` (4 preceding siblings ...)
2013-08-12 18:44 ` [Qemu-devel] [RFC 05/14] tcg-aarch64: Support andc, orc, eqv, not Richard Henderson
@ 2013-08-12 18:44 ` Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 07/14] tcg-aarch64: Support movcond Richard Henderson
` (7 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2013-08-12 18:44 UTC (permalink / raw)
To: qemu-devel; +Cc: claudio.fontana, Richard Henderson
In order to properly handle neg, as generated by TCG generic code.
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
tcg/aarch64/tcg-target.c | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/tcg/aarch64/tcg-target.c b/tcg/aarch64/tcg-target.c
index 7aeb3cd..88bbfd2 100644
--- a/tcg/aarch64/tcg-target.c
+++ b/tcg/aarch64/tcg-target.c
@@ -110,6 +110,7 @@ static inline void patch_reloc(uint8_t *code_ptr, int type,
#define TCG_CT_CONST_LI32 0x200
#define TCG_CT_CONST_LI64 0x400
#define TCG_CT_CONST_CMP 0x800
+#define TCG_CT_CONST_ZERO 0x1000
#include "bitmask-table.h"
@@ -179,6 +180,9 @@ static int target_parse_constraint(TCGArgConstraint *ct,
case 'L': /* logical immediate 64-bit */
ct->ct |= TCG_CT_CONST_LI64;
break;
+ case 'Z': /* zero */
+ ct->ct |= TCG_CT_CONST_ZERO;
+ break;
default:
return -1;
}
@@ -208,6 +212,9 @@ static inline int tcg_target_const_match(tcg_target_long val,
if ((ct & TCG_CT_CONST_CMP) && can_cmpi(val)) {
return 1;
}
+ if ((ct & TCG_CT_CONST_ZERO) && val == 0) {
+ return 1;
+ }
return 0;
}
@@ -1218,6 +1225,10 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
common code. It triggers the use of extended regs where appropriate. */
AArch64Ext ext = E32;
+ /* Some operands are defined with "rZ" constraint, a register or
+ the zero register. These need not actually test args[I] == 0. */
+#define REG0(I) (const_args[I] ? TCG_REG_XZR : args[I])
+
switch (opc) {
case INDEX_op_exit_tb:
tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_X0, args[0]);
@@ -1299,9 +1310,9 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
ext = E64; /* fall through */
case INDEX_op_sub_i32:
if (const_args[2]) {
- tcg_out_addi(s, ext, args[0], args[1], -args[2]);
+ tcg_out_addi(s, ext, args[0], REG0(1), -args[2]);
} else {
- tcg_out_arith(s, INSN_SUB, ext, args[0], args[1], args[2], 0);
+ tcg_out_arith(s, INSN_SUB, ext, args[0], REG0(1), args[2], 0);
}
break;
@@ -1518,6 +1529,8 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
default:
tcg_abort(); /* opcode not implemented */
}
+
+#undef REG0
}
static const TCGTargetOpDef aarch64_op_defs[] = {
@@ -1555,8 +1568,8 @@ static const TCGTargetOpDef aarch64_op_defs[] = {
{ INDEX_op_add_i32, { "r", "r", "rA" } },
{ INDEX_op_add_i64, { "r", "r", "rA" } },
- { INDEX_op_sub_i32, { "r", "r", "rA" } },
- { INDEX_op_sub_i64, { "r", "r", "rA" } },
+ { INDEX_op_sub_i32, { "r", "rZ", "rA" } },
+ { INDEX_op_sub_i64, { "r", "rZ", "rA" } },
{ INDEX_op_mul_i32, { "r", "r", "r" } },
{ INDEX_op_mul_i64, { "r", "r", "r" } },
{ INDEX_op_and_i32, { "r", "r", "rK" } },
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [RFC 07/14] tcg-aarch64: Support movcond
2013-08-12 18:44 [Qemu-devel] [RFC 00/14] tcg aarch64 improvements Richard Henderson
` (5 preceding siblings ...)
2013-08-12 18:44 ` [Qemu-devel] [RFC 06/14] tcg-aarch64: Handle zero as first argument to sub Richard Henderson
@ 2013-08-12 18:44 ` Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 08/14] tcg-aarch64: Support deposit Richard Henderson
` (6 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2013-08-12 18:44 UTC (permalink / raw)
To: qemu-devel; +Cc: claudio.fontana, Richard Henderson
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
tcg/aarch64/tcg-target.c | 19 ++++++++++++++++++-
tcg/aarch64/tcg-target.h | 4 ++--
2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/tcg/aarch64/tcg-target.c b/tcg/aarch64/tcg-target.c
index 88bbfd2..f0febc9 100644
--- a/tcg/aarch64/tcg-target.c
+++ b/tcg/aarch64/tcg-target.c
@@ -267,6 +267,7 @@ typedef enum {
INSN_EXTR = 0x13800000,
/* Conditional select instructions */
+ INSN_CSEL = 0x1a800000,
INSN_CSINC = 0x1a800400,
/* Branch instructions */
@@ -673,6 +674,13 @@ static inline void tcg_out_cset(TCGContext *s, AArch64Ext ext,
tcg_out32(s, base | ext | cond << 12 | rd);
}
+static inline void tcg_out_csel(TCGContext *s, AArch64Ext ext, TCGReg rd,
+ TCGReg rn, TCGReg rm, TCGCond c)
+{
+ unsigned int cond = tcg_cond_to_aarch64[c];
+ tcg_out32(s, INSN_CSEL | ext | rm << 16 | cond << 12 | rn << 5 | rd);
+}
+
static inline void tcg_out_goto(TCGContext *s, tcg_target_long target)
{
tcg_target_long offset;
@@ -1453,6 +1461,13 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
tcg_out_cset(s, 0, args[0], args[3]);
break;
+ case INDEX_op_movcond_i64:
+ ext = E64; /* fall through */
+ case INDEX_op_movcond_i32:
+ tcg_out_cmp(s, ext, args[1], args[2], const_args[2]);
+ tcg_out_csel(s, ext, args[0], REG0(3), REG0(4), args[5]);
+ break;
+
case INDEX_op_qemu_ld8u:
tcg_out_qemu_ld(s, args, 0 | 0);
break;
@@ -1600,9 +1615,11 @@ static const TCGTargetOpDef aarch64_op_defs[] = {
{ INDEX_op_rotr_i64, { "r", "r", "ri" } },
{ INDEX_op_brcond_i32, { "r", "rC" } },
- { INDEX_op_setcond_i32, { "r", "r", "rC" } },
{ INDEX_op_brcond_i64, { "r", "rC" } },
+ { INDEX_op_setcond_i32, { "r", "r", "rC" } },
{ INDEX_op_setcond_i64, { "r", "r", "rC" } },
+ { INDEX_op_movcond_i32, { "r", "r", "rC", "rZ", "rZ" } },
+ { INDEX_op_movcond_i64, { "r", "r", "rC", "rZ", "rZ" } },
{ INDEX_op_qemu_ld8u, { "r", "l" } },
{ INDEX_op_qemu_ld8s, { "r", "l" } },
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
index ffe9429..7d87870 100644
--- a/tcg/aarch64/tcg-target.h
+++ b/tcg/aarch64/tcg-target.h
@@ -56,7 +56,7 @@ typedef enum {
#define TCG_TARGET_HAS_nand_i32 0
#define TCG_TARGET_HAS_nor_i32 0
#define TCG_TARGET_HAS_deposit_i32 0
-#define TCG_TARGET_HAS_movcond_i32 0
+#define TCG_TARGET_HAS_movcond_i32 1
#define TCG_TARGET_HAS_add2_i32 0
#define TCG_TARGET_HAS_sub2_i32 0
#define TCG_TARGET_HAS_mulu2_i32 0
@@ -82,7 +82,7 @@ typedef enum {
#define TCG_TARGET_HAS_nand_i64 0
#define TCG_TARGET_HAS_nor_i64 0
#define TCG_TARGET_HAS_deposit_i64 0
-#define TCG_TARGET_HAS_movcond_i64 0
+#define TCG_TARGET_HAS_movcond_i64 1
#define TCG_TARGET_HAS_add2_i64 0
#define TCG_TARGET_HAS_sub2_i64 0
#define TCG_TARGET_HAS_mulu2_i64 0
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [RFC 08/14] tcg-aarch64: Support deposit
2013-08-12 18:44 [Qemu-devel] [RFC 00/14] tcg aarch64 improvements Richard Henderson
` (6 preceding siblings ...)
2013-08-12 18:44 ` [Qemu-devel] [RFC 07/14] tcg-aarch64: Support movcond Richard Henderson
@ 2013-08-12 18:44 ` Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 09/14] tcg-aarch64: Support add2, sub2 Richard Henderson
` (5 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2013-08-12 18:44 UTC (permalink / raw)
To: qemu-devel; +Cc: claudio.fontana, Richard Henderson
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
tcg/aarch64/tcg-target.c | 25 +++++++++++++++++++++++++
tcg/aarch64/tcg-target.h | 4 ++--
2 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/tcg/aarch64/tcg-target.c b/tcg/aarch64/tcg-target.c
index f0febc9..3474ca4 100644
--- a/tcg/aarch64/tcg-target.c
+++ b/tcg/aarch64/tcg-target.c
@@ -262,6 +262,7 @@ typedef enum {
INSN_MUL = 0x1b007c00, /* MADD alias with Ra = xzr */
/* Bitfield instructions */
+ INSN_BFM = 0x33000000,
INSN_SBFM = 0x13000000,
INSN_UBFM = 0x53000000,
INSN_EXTR = 0x13800000,
@@ -588,6 +589,12 @@ static inline void tcg_out_data2(TCGContext *s, AArch64Insn insn,
tcg_out32(s, insn | ext | rm << 16 | rn << 5 | rd);
}
+static inline void tcg_out_bfm(TCGContext *s, AArch64Ext ext, TCGReg rd,
+ TCGReg rn, unsigned int a, unsigned int b)
+{
+ tcg_out32(s, INSN_BFM | ext | a << 16 | b << 10 | rn << 5 | rd);
+}
+
static inline void tcg_out_ubfm(TCGContext *s, AArch64Ext ext, TCGReg rd,
TCGReg rn, unsigned int a, unsigned int b)
{
@@ -647,6 +654,15 @@ static inline void tcg_out_rotli(TCGContext *s, AArch64Ext ext, TCGReg rd,
tcg_out_extr(s, ext, rd, rn, rn, bits - (m & max));
}
+static inline void tcg_out_dep(TCGContext *s, AArch64Ext ext, TCGReg rd,
+ TCGReg rn, unsigned lsb, unsigned width)
+{
+ unsigned size = ext ? 64 : 32;
+ unsigned a = (size - lsb) & (size - 1);
+ unsigned b = width - 1;
+ tcg_out_bfm(s, ext, rd, rn, a, b);
+}
+
static void tcg_out_cmp(TCGContext *s, AArch64Ext ext, TCGReg a,
tcg_target_long b, bool const_b)
{
@@ -1541,6 +1557,12 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
tcg_out_movr(s, E32, args[0], args[1]);
break;
+ case INDEX_op_deposit_i64:
+ ext = E64; /* fall through */
+ case INDEX_op_deposit_i32:
+ tcg_out_dep(s, ext, args[0], REG0(2), args[3], args[4]);
+ break;
+
default:
tcg_abort(); /* opcode not implemented */
}
@@ -1654,6 +1676,9 @@ static const TCGTargetOpDef aarch64_op_defs[] = {
{ INDEX_op_ext16u_i64, { "r", "r" } },
{ INDEX_op_ext32u_i64, { "r", "r" } },
+ { INDEX_op_deposit_i32, { "r", "0", "rZ" } },
+ { INDEX_op_deposit_i64, { "r", "0", "rZ" } },
+
{ -1 },
};
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
index 7d87870..4082172 100644
--- a/tcg/aarch64/tcg-target.h
+++ b/tcg/aarch64/tcg-target.h
@@ -55,7 +55,7 @@ typedef enum {
#define TCG_TARGET_HAS_eqv_i32 1
#define TCG_TARGET_HAS_nand_i32 0
#define TCG_TARGET_HAS_nor_i32 0
-#define TCG_TARGET_HAS_deposit_i32 0
+#define TCG_TARGET_HAS_deposit_i32 1
#define TCG_TARGET_HAS_movcond_i32 1
#define TCG_TARGET_HAS_add2_i32 0
#define TCG_TARGET_HAS_sub2_i32 0
@@ -81,7 +81,7 @@ typedef enum {
#define TCG_TARGET_HAS_eqv_i64 1
#define TCG_TARGET_HAS_nand_i64 0
#define TCG_TARGET_HAS_nor_i64 0
-#define TCG_TARGET_HAS_deposit_i64 0
+#define TCG_TARGET_HAS_deposit_i64 1
#define TCG_TARGET_HAS_movcond_i64 1
#define TCG_TARGET_HAS_add2_i64 0
#define TCG_TARGET_HAS_sub2_i64 0
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [RFC 09/14] tcg-aarch64: Support add2, sub2
2013-08-12 18:44 [Qemu-devel] [RFC 00/14] tcg aarch64 improvements Richard Henderson
` (7 preceding siblings ...)
2013-08-12 18:44 ` [Qemu-devel] [RFC 08/14] tcg-aarch64: Support deposit Richard Henderson
@ 2013-08-12 18:44 ` Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 10/14] tcg-aarch64: Support div, mulu2 Richard Henderson
` (4 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2013-08-12 18:44 UTC (permalink / raw)
To: qemu-devel; +Cc: claudio.fontana, Richard Henderson
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
tcg/aarch64/tcg-target.c | 110 ++++++++++++++++++++++++++++++++++++-----------
tcg/aarch64/tcg-target.h | 8 ++--
2 files changed, 90 insertions(+), 28 deletions(-)
diff --git a/tcg/aarch64/tcg-target.c b/tcg/aarch64/tcg-target.c
index 3474ca4..967526b 100644
--- a/tcg/aarch64/tcg-target.c
+++ b/tcg/aarch64/tcg-target.c
@@ -109,8 +109,10 @@ static inline void patch_reloc(uint8_t *code_ptr, int type,
#define TCG_CT_CONST_S25 0x100
#define TCG_CT_CONST_LI32 0x200
#define TCG_CT_CONST_LI64 0x400
-#define TCG_CT_CONST_CMP 0x800
-#define TCG_CT_CONST_ZERO 0x1000
+#define TCG_CT_CONST_ZERO 0x800
+#define TCG_CT_CONST_AI 0x1000
+#define TCG_CT_CONST_AIC 0x2000
+#define TCG_CT_CONST_AIN 0x4000
#include "bitmask-table.h"
@@ -137,14 +139,11 @@ static int find_bitmask32(uint32_t val)
return find_bitmask64(((uint64_t)val << 32) | val);
}
-static int can_cmpi(tcg_target_long val)
+static int is_aimm(tcg_target_long val)
{
- if (val < 0) {
- val = ~val;
- }
return (val & ~0xfff) == 0 || (val & ~0xfff000) == 0;
}
-
+
/* parse target specific constraints */
static int target_parse_constraint(TCGArgConstraint *ct,
const char **pct_str)
@@ -168,12 +167,9 @@ static int target_parse_constraint(TCGArgConstraint *ct,
tcg_regset_reset_reg(ct->u.regs, TCG_REG_X3);
#endif
break;
- case 'A': /* 25-bit signed, to be added or subtracted. */
+ case 'I': /* 25-bit signed, to be added or subtracted. */
ct->ct |= TCG_CT_CONST_S25;
break;
- case 'C': /* a 12-bit constant (maybe inverted) to be used with compare. */
- ct->ct |= TCG_CT_CONST_CMP;
- break;
case 'K': /* logical immediate 32-bit */
ct->ct |= TCG_CT_CONST_LI32;
break;
@@ -183,6 +179,15 @@ static int target_parse_constraint(TCGArgConstraint *ct,
case 'Z': /* zero */
ct->ct |= TCG_CT_CONST_ZERO;
break;
+ case 'A': /* an arithmetic immediate. */
+ ct->ct |= TCG_CT_CONST_AI;
+ break;
+ case 'C': /* a complimented arithmetic immediate. */
+ ct->ct |= TCG_CT_CONST_AIC;
+ break;
+ case 'N': /* a negated arithmetic immediate. */
+ ct->ct |= TCG_CT_CONST_AIN;
+ break;
default:
return -1;
}
@@ -209,10 +214,16 @@ static inline int tcg_target_const_match(tcg_target_long val,
if ((ct & TCG_CT_CONST_LI32) && find_bitmask32(val) >= 0) {
return 1;
}
- if ((ct & TCG_CT_CONST_CMP) && can_cmpi(val)) {
+ if ((ct & TCG_CT_CONST_ZERO) && val == 0) {
return 1;
}
- if ((ct & TCG_CT_CONST_ZERO) && val == 0) {
+ if ((ct & TCG_CT_CONST_AI) && is_aimm(val)) {
+ return 1;
+ }
+ if ((ct & TCG_CT_CONST_AIC) && is_aimm(~val)) {
+ return 1;
+ }
+ if ((ct & TCG_CT_CONST_AIN) && is_aimm(-val)) {
return 1;
}
@@ -246,9 +257,14 @@ typedef enum {
/* Add/subtract shifted register instructions */
INSN_ADD = 0x0b000000,
+ INSN_ADDS = 0x2b000000,
INSN_SUB = 0x4b000000,
INSN_SUBS = 0x6b000000,
+ /* Add/subtract with carry instructions */
+ INSN_ADC = 0x1a000000,
+ INSN_SBC = 0x5a000000,
+
/* Data-processing (1 source) instructions */
INSN_REV16 = 0x5ac00400,
INSN_REVx = 0xdac00c00,
@@ -1242,6 +1258,33 @@ static inline void tcg_out_load_pair(TCGContext *s, TCGReg addr,
tcg_out32(s, 0xa9400000 | idx << 16 | r2 << 10 | addr << 5 | r1);
}
+static inline void tcg_out_addsub2(TCGContext *s, AArch64Ext ext, TCGReg rl,
+ TCGReg rh, TCGReg al, TCGReg ah,
+ tcg_target_long bl, TCGReg bh,
+ bool const_bl, bool sub)
+{
+ TCGReg orig_rl = rl;
+
+ if (rl == ah || rl == bh) {
+ rl = TCG_REG_TMP;
+ }
+ if (const_bl) {
+ if ((bl < 0) ^ sub) {
+ tcg_out_aimm(s, INSN_SUBSI, ext, rl, al, -bl);
+ } else {
+ tcg_out_aimm(s, INSN_ADDSI, ext, rl, al, bl);
+ }
+ } else {
+ tcg_out_arith(s, sub ? INSN_SUBS : INSN_ADDS, ext, rl, al, bl, 0);
+ }
+
+ tcg_out_arith(s, sub ? INSN_ADC : INSN_SBC, ext, rh, ah, bh, 0);
+
+ if (rl != orig_rl) {
+ tcg_out_movr(s, ext, orig_rl, rl);
+ }
+}
+
static void tcg_out_op(TCGContext *s, TCGOpcode opc,
const TCGArg *args, const int *const_args)
{
@@ -1562,7 +1605,21 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
case INDEX_op_deposit_i32:
tcg_out_dep(s, ext, args[0], REG0(2), args[3], args[4]);
break;
-
+
+ case INDEX_op_add2_i64:
+ ext = E64; /* fall through */
+ case INDEX_op_add2_i32:
+ tcg_out_addsub2(s, ext, args[0], args[1], REG0(2), REG0(3), args[4],
+ REG0(5), const_args[4], false);
+ break;
+
+ case INDEX_op_sub2_i64:
+ ext = E64; /* fall through */
+ case INDEX_op_sub2_i32:
+ tcg_out_addsub2(s, ext, args[0], args[1], REG0(2), REG0(3), args[4],
+ REG0(5), const_args[4], true);
+ break;
+
default:
tcg_abort(); /* opcode not implemented */
}
@@ -1603,10 +1660,10 @@ static const TCGTargetOpDef aarch64_op_defs[] = {
{ INDEX_op_st32_i64, { "r", "r" } },
{ INDEX_op_st_i64, { "r", "r" } },
- { INDEX_op_add_i32, { "r", "r", "rA" } },
- { INDEX_op_add_i64, { "r", "r", "rA" } },
- { INDEX_op_sub_i32, { "r", "rZ", "rA" } },
- { INDEX_op_sub_i64, { "r", "rZ", "rA" } },
+ { INDEX_op_add_i32, { "r", "r", "rI" } },
+ { INDEX_op_add_i64, { "r", "r", "rI" } },
+ { INDEX_op_sub_i32, { "r", "rZ", "rI" } },
+ { INDEX_op_sub_i64, { "r", "rZ", "rI" } },
{ INDEX_op_mul_i32, { "r", "r", "r" } },
{ INDEX_op_mul_i64, { "r", "r", "r" } },
{ INDEX_op_and_i32, { "r", "r", "rK" } },
@@ -1636,12 +1693,12 @@ static const TCGTargetOpDef aarch64_op_defs[] = {
{ INDEX_op_rotl_i64, { "r", "r", "ri" } },
{ INDEX_op_rotr_i64, { "r", "r", "ri" } },
- { INDEX_op_brcond_i32, { "r", "rC" } },
- { INDEX_op_brcond_i64, { "r", "rC" } },
- { INDEX_op_setcond_i32, { "r", "r", "rC" } },
- { INDEX_op_setcond_i64, { "r", "r", "rC" } },
- { INDEX_op_movcond_i32, { "r", "r", "rC", "rZ", "rZ" } },
- { INDEX_op_movcond_i64, { "r", "r", "rC", "rZ", "rZ" } },
+ { INDEX_op_brcond_i32, { "r", "rAC" } },
+ { INDEX_op_brcond_i64, { "r", "rAC" } },
+ { INDEX_op_setcond_i32, { "r", "r", "rAC" } },
+ { INDEX_op_setcond_i64, { "r", "r", "rAC" } },
+ { INDEX_op_movcond_i32, { "r", "r", "rAC", "rZ", "rZ" } },
+ { INDEX_op_movcond_i64, { "r", "r", "rAC", "rZ", "rZ" } },
{ INDEX_op_qemu_ld8u, { "r", "l" } },
{ INDEX_op_qemu_ld8s, { "r", "l" } },
@@ -1679,6 +1736,11 @@ static const TCGTargetOpDef aarch64_op_defs[] = {
{ INDEX_op_deposit_i32, { "r", "0", "rZ" } },
{ INDEX_op_deposit_i64, { "r", "0", "rZ" } },
+ { INDEX_op_add2_i32, { "r", "r", "rZ", "rZ", "rAN", "rZ" } },
+ { INDEX_op_add2_i64, { "r", "r", "rZ", "rZ", "rAN", "rZ" } },
+ { INDEX_op_sub2_i32, { "r", "r", "rZ", "rZ", "rAN", "rZ" } },
+ { INDEX_op_sub2_i64, { "r", "r", "rZ", "rZ", "rAN", "rZ" } },
+
{ -1 },
};
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
index 4082172..0c71048 100644
--- a/tcg/aarch64/tcg-target.h
+++ b/tcg/aarch64/tcg-target.h
@@ -57,8 +57,8 @@ typedef enum {
#define TCG_TARGET_HAS_nor_i32 0
#define TCG_TARGET_HAS_deposit_i32 1
#define TCG_TARGET_HAS_movcond_i32 1
-#define TCG_TARGET_HAS_add2_i32 0
-#define TCG_TARGET_HAS_sub2_i32 0
+#define TCG_TARGET_HAS_add2_i32 1
+#define TCG_TARGET_HAS_sub2_i32 1
#define TCG_TARGET_HAS_mulu2_i32 0
#define TCG_TARGET_HAS_muls2_i32 0
@@ -83,8 +83,8 @@ typedef enum {
#define TCG_TARGET_HAS_nor_i64 0
#define TCG_TARGET_HAS_deposit_i64 1
#define TCG_TARGET_HAS_movcond_i64 1
-#define TCG_TARGET_HAS_add2_i64 0
-#define TCG_TARGET_HAS_sub2_i64 0
+#define TCG_TARGET_HAS_add2_i64 1
+#define TCG_TARGET_HAS_sub2_i64 1
#define TCG_TARGET_HAS_mulu2_i64 0
#define TCG_TARGET_HAS_muls2_i64 0
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [RFC 10/14] tcg-aarch64: Support div, mulu2
2013-08-12 18:44 [Qemu-devel] [RFC 00/14] tcg aarch64 improvements Richard Henderson
` (8 preceding siblings ...)
2013-08-12 18:44 ` [Qemu-devel] [RFC 09/14] tcg-aarch64: Support add2, sub2 Richard Henderson
@ 2013-08-12 18:44 ` Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 11/14] tcg-aarch64: Improve tcg_out_movi Richard Henderson
` (3 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2013-08-12 18:44 UTC (permalink / raw)
To: qemu-devel; +Cc: claudio.fontana, Richard Henderson
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
tcg/aarch64/tcg-target.c | 42 ++++++++++++++++++++++++++++++++++++++++++
tcg/aarch64/tcg-target.h | 6 +++---
2 files changed, 45 insertions(+), 3 deletions(-)
diff --git a/tcg/aarch64/tcg-target.c b/tcg/aarch64/tcg-target.c
index 967526b..920c63c 100644
--- a/tcg/aarch64/tcg-target.c
+++ b/tcg/aarch64/tcg-target.c
@@ -276,6 +276,9 @@ typedef enum {
INSN_ASRV = 0x1ac02800,
INSN_RORV = 0x1ac02c00,
INSN_MUL = 0x1b007c00, /* MADD alias with Ra = xzr */
+ INSN_UMULH = 0x9bc07c00,
+ INSN_UDIV = 0x1ac00800,
+ INSN_SDIV = 0x1ac00c00,
/* Bitfield instructions */
INSN_BFM = 0x33000000,
@@ -1285,6 +1288,26 @@ static inline void tcg_out_addsub2(TCGContext *s, AArch64Ext ext, TCGReg rl,
}
}
+static inline void tcg_out_mulu2(TCGContext *s, TCGReg rl, TCGReg rh,
+ TCGReg a, TCGReg b)
+{
+ if (rl == a || rl == b) {
+ if (rh == a || rh == b) {
+ /* Overlap on both outputs -- use a temporary. */
+ tcg_out_data2(s, INSN_MUL, E64, TCG_REG_TMP, a, b);
+ tcg_out_data2(s, INSN_UMULH, E64, rh, a, b);
+ tcg_out_mov(s, TCG_TYPE_I64, rl, TCG_REG_TMP);
+ } else {
+ /* Overlap on low output -- do high part first. */
+ tcg_out_data2(s, INSN_UMULH, E64, rh, a, b);
+ tcg_out_data2(s, INSN_MUL, E64, rl, a, b);
+ }
+ } else {
+ tcg_out_data2(s, INSN_MUL, E64, rl, a, b);
+ tcg_out_data2(s, INSN_UMULH, E64, rh, a, b);
+ }
+}
+
static void tcg_out_op(TCGContext *s, TCGOpcode opc,
const TCGArg *args, const int *const_args)
{
@@ -1453,6 +1476,16 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
case INDEX_op_mul_i32:
tcg_out_data2(s, INSN_MUL, ext, args[0], args[1], args[2]);
break;
+ case INDEX_op_div_i64:
+ ext = E64; /* fall through */
+ case INDEX_op_div_i32:
+ tcg_out_data2(s, INSN_SDIV, ext, args[0], args[1], args[2]);
+ break;
+ case INDEX_op_divu_i64:
+ ext = E64; /* fall through */
+ case INDEX_op_divu_i32:
+ tcg_out_data2(s, INSN_UDIV, ext, args[0], args[1], args[2]);
+ break;
case INDEX_op_shl_i64:
ext = E64; /* fall through */
@@ -1620,6 +1653,10 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
REG0(5), const_args[4], true);
break;
+ case INDEX_op_mulu2_i64:
+ tcg_out_mulu2(s, args[0], args[1], args[2], args[3]);
+ break;
+
default:
tcg_abort(); /* opcode not implemented */
}
@@ -1666,6 +1703,10 @@ static const TCGTargetOpDef aarch64_op_defs[] = {
{ INDEX_op_sub_i64, { "r", "rZ", "rI" } },
{ INDEX_op_mul_i32, { "r", "r", "r" } },
{ INDEX_op_mul_i64, { "r", "r", "r" } },
+ { INDEX_op_div_i32, { "r", "r", "r" } },
+ { INDEX_op_div_i64, { "r", "r", "r" } },
+ { INDEX_op_divu_i32, { "r", "r", "r" } },
+ { INDEX_op_divu_i64, { "r", "r", "r" } },
{ INDEX_op_and_i32, { "r", "r", "rK" } },
{ INDEX_op_and_i64, { "r", "r", "rL" } },
{ INDEX_op_or_i32, { "r", "r", "rK" } },
@@ -1740,6 +1781,7 @@ static const TCGTargetOpDef aarch64_op_defs[] = {
{ INDEX_op_add2_i64, { "r", "r", "rZ", "rZ", "rAN", "rZ" } },
{ INDEX_op_sub2_i32, { "r", "r", "rZ", "rZ", "rAN", "rZ" } },
{ INDEX_op_sub2_i64, { "r", "r", "rZ", "rZ", "rAN", "rZ" } },
+ { INDEX_op_mulu2_i64, { "r", "r", "r", "r" } },
{ -1 },
};
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
index 0c71048..507e192 100644
--- a/tcg/aarch64/tcg-target.h
+++ b/tcg/aarch64/tcg-target.h
@@ -39,7 +39,7 @@ typedef enum {
#define TCG_TARGET_CALL_STACK_OFFSET 0
/* optional instructions */
-#define TCG_TARGET_HAS_div_i32 0
+#define TCG_TARGET_HAS_div_i32 1
#define TCG_TARGET_HAS_rem_i32 0
#define TCG_TARGET_HAS_ext8s_i32 1
#define TCG_TARGET_HAS_ext16s_i32 1
@@ -62,7 +62,7 @@ typedef enum {
#define TCG_TARGET_HAS_mulu2_i32 0
#define TCG_TARGET_HAS_muls2_i32 0
-#define TCG_TARGET_HAS_div_i64 0
+#define TCG_TARGET_HAS_div_i64 1
#define TCG_TARGET_HAS_rem_i64 0
#define TCG_TARGET_HAS_ext8s_i64 1
#define TCG_TARGET_HAS_ext16s_i64 1
@@ -85,7 +85,7 @@ typedef enum {
#define TCG_TARGET_HAS_movcond_i64 1
#define TCG_TARGET_HAS_add2_i64 1
#define TCG_TARGET_HAS_sub2_i64 1
-#define TCG_TARGET_HAS_mulu2_i64 0
+#define TCG_TARGET_HAS_mulu2_i64 1
#define TCG_TARGET_HAS_muls2_i64 0
enum {
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [RFC 11/14] tcg-aarch64: Improve tcg_out_movi
2013-08-12 18:44 [Qemu-devel] [RFC 00/14] tcg aarch64 improvements Richard Henderson
` (9 preceding siblings ...)
2013-08-12 18:44 ` [Qemu-devel] [RFC 10/14] tcg-aarch64: Support div, mulu2 Richard Henderson
@ 2013-08-12 18:44 ` Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 12/14] tcg-aarch64: Avoid add with zero in tlb load Richard Henderson
` (2 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2013-08-12 18:44 UTC (permalink / raw)
To: qemu-devel; +Cc: claudio.fontana, Richard Henderson
Handle small positive and negative numbers early. Check for logical
immediates. Check if using MOVN for the first set helps.
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
tcg/aarch64/tcg-target.c | 85 +++++++++++++++++++++++++++++++++++++-----------
1 file changed, 66 insertions(+), 19 deletions(-)
diff --git a/tcg/aarch64/tcg-target.c b/tcg/aarch64/tcg-target.c
index 920c63c..02ab278 100644
--- a/tcg/aarch64/tcg-target.c
+++ b/tcg/aarch64/tcg-target.c
@@ -511,32 +511,79 @@ static inline void tcg_out_movr(TCGContext *s, AArch64Ext ext,
tcg_out_aimm(s, INSN_ADDI, ext, dest, src, 0);
}
+static inline void tcg_out_movwi(TCGContext *s, AArch64Insn insn,
+ AArch64Ext ext, TCGReg rd,
+ uint16_t value, int shift)
+{
+ tcg_out32(s, insn | ext | shift << 17 | value << 5 | rd);
+}
+
static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
tcg_target_long value)
{
- AArch64Insn insn = INSN_MOVZ;
+ tcg_target_long valid = (type == TCG_TYPE_I32 ? 0xffffffffull : -1ull);
+ AArch64Insn insn;
+ AArch64Ext ext;
+ int i, wantinv, shift;
+
+ value &= valid;
+
+ /* Check small positive values. */
+ if ((value & ~0xffff) == 0) {
+ tcg_out_movwi(s, INSN_MOVZ, E32, rd, value, 0);
+ return;
+ }
+
+ /* Check small negative values. */
+ if ((~value & valid & ~0xffff) == 0) {
+ tcg_out_movwi(s, INSN_MOVN, EXT(type == TCG_TYPE_I64), rd, ~value, 0);
+ return;
+ }
+
+ /* Check for bitfield immediates. */
+ if ((value & ~0xffffffffull) == 0) {
+ i = find_bitmask32(value);
+ ext = E32;
+ } else {
+ i = find_bitmask64(value);
+ ext = E64;
+ }
+ if (i >= 0) {
+ tcg_out32(s, INSN_ORRI | TCG_REG_XZR << 5 | ext
+ | bitmask_enc[i] << 10 | rd);
+ return;
+ }
- if (type == TCG_TYPE_I32) {
- value = (uint32_t)value;
+ /* Would it take fewer insns to load the inverse? */
+ wantinv = 0;
+ for (i = 0; i < 64; i += 16) {
+ if (((value >> i) & 0xffff) == 0) {
+ wantinv--;
+ }
+ if (((~value >> i) & 0xffff) == 0) {
+ wantinv++;
+ }
}
- /* Construct halfwords of the immediate with MOVZ/MOVK with LSL.
- Count trailing zeros in 16 bit steps, mapping 64 to 0. Emit the
- first MOVZ with the half-word immediate skipping the zeros, with
- a shift (LSL) equal to this number. Then all other insns are MOVKs.
- Zero the processed half-word in the value, continue until empty.
- We build the final result 16bits at a time with up to 4 instructions,
- but do not emit instructions for 16bit zero holes. */
- do {
- unsigned shift = ctz64(value) & (63 & -16);
- unsigned half = (value >> shift) & 0xffff;
- AArch64Ext ext = EXT(shift >= 32);
-
- tcg_out32(s, insn | ext | shift << 17 | half << 5 | rd);
-
- insn = INSN_MOVK;
+ if (wantinv > 0) {
+ value = ~value;
+ insn = INSN_MOVN;
+ valid = -1;
+ } else {
+ insn = INSN_MOVZ;
+ valid = 0;
+ }
+
+ /* Perform the first round specially, to handle the inverse. */
+ shift = ctz64(value) & (63 & -16);
+ tcg_out_movwi(s, insn, ext, rd, value >> shift, shift);
+ value &= ~(0xffffUL << shift);
+
+ while (value) {
+ shift = ctz64(value) & (63 & -16);
+ tcg_out_movwi(s, INSN_MOVK, ext, rd, (value ^ valid) >> shift, shift);
value &= ~(0xffffUL << shift);
- } while (value);
+ }
}
static inline void tcg_out_ldst_r(TCGContext *s,
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [RFC 12/14] tcg-aarch64: Avoid add with zero in tlb load
2013-08-12 18:44 [Qemu-devel] [RFC 00/14] tcg aarch64 improvements Richard Henderson
` (10 preceding siblings ...)
2013-08-12 18:44 ` [Qemu-devel] [RFC 11/14] tcg-aarch64: Improve tcg_out_movi Richard Henderson
@ 2013-08-12 18:44 ` Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 13/14] tcg-aarch64: Use adrp in tcg_out_movi Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 14/14] tcg-aarch64: Pass return address to load/store helpers directly Richard Henderson
13 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2013-08-12 18:44 UTC (permalink / raw)
To: qemu-devel; +Cc: claudio.fontana, Richard Henderson
Some guest env are small enough to reach the tlb with only a 12-bit addition.
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
tcg/aarch64/tcg-target.c | 25 ++++++++++++++++++-------
1 file changed, 18 insertions(+), 7 deletions(-)
diff --git a/tcg/aarch64/tcg-target.c b/tcg/aarch64/tcg-target.c
index 02ab278..3ea5db7 100644
--- a/tcg/aarch64/tcg-target.c
+++ b/tcg/aarch64/tcg-target.c
@@ -1076,47 +1076,58 @@ static void add_qemu_ldst_label(TCGContext *s, int is_ld, int opc,
slow path for the failure case, which will be patched later when finalizing
the slow path. Generated code returns the host addend in X1,
clobbers X0,X2,X3,TMP. */
-static void tcg_out_tlb_read(TCGContext *s, TCGReg addr_reg,
- int s_bits, uint8_t **label_ptr, int mem_index, int is_read)
+static void tcg_out_tlb_read(TCGContext *s, TCGReg addr_reg, int s_bits,
+ uint8_t **label_ptr, int mem_index, int is_read)
{
TCGReg base = TCG_AREG0;
int tlb_offset = is_read ?
offsetof(CPUArchState, tlb_table[mem_index][0].addr_read)
: offsetof(CPUArchState, tlb_table[mem_index][0].addr_write);
+
/* Extract the TLB index from the address into X0.
X0<CPU_TLB_BITS:0> =
addr_reg<TARGET_PAGE_BITS+CPU_TLB_BITS:TARGET_PAGE_BITS> */
tcg_out_ubfm(s, (TARGET_LONG_BITS == 64), TCG_REG_X0, addr_reg,
TARGET_PAGE_BITS, TARGET_PAGE_BITS + CPU_TLB_BITS);
+
/* Store the page mask part of the address and the low s_bits into X3.
Later this allows checking for equality and alignment at the same time.
X3 = addr_reg & (PAGE_MASK | ((1 << s_bits) - 1)) */
tcg_out_andi(s, (TARGET_LONG_BITS == 64), TCG_REG_X3, addr_reg,
(TARGET_LONG_BITS - TARGET_PAGE_BITS) + s_bits,
(TARGET_LONG_BITS - TARGET_PAGE_BITS));
+
/* Add any "high bits" from the tlb offset to the env address into X2,
to take advantage of the LSL12 form of the addi instruction.
- X2 = env + (tlb_offset & 0xfff000) */
- tcg_out_addi(s, E64, TCG_REG_X2, base, tlb_offset & 0xfff000);
+ base = env + (tlb_offset & 0xfff000) */
+ if (tlb_offset & 0xfff000) {
+ tcg_out_addi(s, E64, TCG_REG_X2, base, tlb_offset & 0xfff000);
+ base = TCG_REG_X2;
+ }
+
/* Merge the tlb index contribution into X2.
- X2 = X2 + (X0 << CPU_TLB_ENTRY_BITS) */
- tcg_out_arith(s, INSN_ADD, E64, TCG_REG_X2, TCG_REG_X2,
+ X2 = base + (X0 << CPU_TLB_ENTRY_BITS) */
+ tcg_out_arith(s, INSN_ADD, E64, TCG_REG_X2, base,
TCG_REG_X0, -CPU_TLB_ENTRY_BITS);
+
/* Merge "low bits" from tlb offset, load the tlb comparator into X0.
X0 = load [X2 + (tlb_offset & 0x000fff)] */
tcg_out_ldst(s, TARGET_LONG_BITS == 64 ? LDST_64 : LDST_32,
LDST_LD, TCG_REG_X0, TCG_REG_X2,
(tlb_offset & 0xfff));
+
/* Load the tlb addend. Do that early to avoid stalling.
X1 = load [X2 + (tlb_offset & 0xfff) + offsetof(addend)] */
tcg_out_ldst(s, LDST_64, LDST_LD, TCG_REG_X1, TCG_REG_X2,
(tlb_offset & 0xfff) + (offsetof(CPUTLBEntry, addend)) -
(is_read ? offsetof(CPUTLBEntry, addr_read)
: offsetof(CPUTLBEntry, addr_write)));
+
/* Perform the address comparison. */
tcg_out_cmp(s, EXT(TARGET_LONG_BITS == 64), TCG_REG_X0, TCG_REG_X3, 0);
- *label_ptr = s->code_ptr;
+
/* If not equal, we jump to the slow path. */
+ *label_ptr = s->code_ptr;
tcg_out_goto_cond_noaddr(s, TCG_COND_NE);
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [RFC 13/14] tcg-aarch64: Use adrp in tcg_out_movi
2013-08-12 18:44 [Qemu-devel] [RFC 00/14] tcg aarch64 improvements Richard Henderson
` (11 preceding siblings ...)
2013-08-12 18:44 ` [Qemu-devel] [RFC 12/14] tcg-aarch64: Avoid add with zero in tlb load Richard Henderson
@ 2013-08-12 18:44 ` Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 14/14] tcg-aarch64: Pass return address to load/store helpers directly Richard Henderson
13 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2013-08-12 18:44 UTC (permalink / raw)
To: qemu-devel; +Cc: claudio.fontana, Richard Henderson
Loading an qemu pointer as an immediate happens often:
- exit_tb $0x7fa8140013
+ exit_tb $0x7f81ee0013
...
- : d2800260 mov x0, #0x13
- : f2b50280 movk x0, #0xa814, lsl #16
- : f2c00fe0 movk x0, #0x7f, lsl #32
+ : 90ff1000 adrp x0, 0x7f81ee0000
+ : 91004c00 add x0, x0, #0x13
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
tcg/aarch64/tcg-target.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/tcg/aarch64/tcg-target.c b/tcg/aarch64/tcg-target.c
index 3ea5db7..a03da58 100644
--- a/tcg/aarch64/tcg-target.c
+++ b/tcg/aarch64/tcg-target.c
@@ -298,6 +298,10 @@ typedef enum {
INSN_RET = 0xd65f0000,
INSN_B_C = 0x54000000,
+ /* PC relative addressing instructions */
+ INSN_ADR = 0x10000000,
+ INSN_ADRP = 0x90000000,
+
/* System instructions */
INSN_NOP = 0xd503201f,
} AArch64Insn;
@@ -554,6 +558,20 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
return;
}
+ /* Look for host pointer values within 4G of the PC. This happens
+ often when loading pointers to QEMU's data structures. */
+ valid = (value >> 12) - ((intptr_t)s->code_ptr >> 12);
+ if (valid == sextract64(valid, 0, 21)) {
+ insn = INSN_ADRP | rd;
+ insn |= (valid & 3) << 29;
+ insn |= (valid & 0x1ffffc) << (5 - 2);
+ tcg_out32(s, insn);
+ if (value & 0xfff) {
+ tcg_out_aimm(s, INSN_ADDI, ext, rd, rd, value & 0xfff);
+ }
+ return;
+ }
+
/* Would it take fewer insns to load the inverse? */
wantinv = 0;
for (i = 0; i < 64; i += 16) {
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [RFC 14/14] tcg-aarch64: Pass return address to load/store helpers directly.
2013-08-12 18:44 [Qemu-devel] [RFC 00/14] tcg aarch64 improvements Richard Henderson
` (12 preceding siblings ...)
2013-08-12 18:44 ` [Qemu-devel] [RFC 13/14] tcg-aarch64: Use adrp in tcg_out_movi Richard Henderson
@ 2013-08-12 18:44 ` Richard Henderson
13 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2013-08-12 18:44 UTC (permalink / raw)
To: qemu-devel; +Cc: claudio.fontana, Richard Henderson
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
include/exec/exec-all.h | 16 +----------
tcg/aarch64/tcg-target.c | 69 ++++++++++++++++++++++++++----------------------
2 files changed, 39 insertions(+), 46 deletions(-)
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
index b3402a1..10e680d 100644
--- a/include/exec/exec-all.h
+++ b/include/exec/exec-all.h
@@ -325,7 +325,7 @@ extern uintptr_t tci_tb_ptr;
(5) post-process (e.g. stack adjust)
(6) jump to corresponding code of the next of fast path
*/
-# if defined(__i386__) || defined(__x86_64__)
+# if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__)
# define GETRA() ((uintptr_t)__builtin_return_address(0))
/* The return address argument for ldst is passed directly. */
# define GETPC_LDST() (abort(), 0)
@@ -334,20 +334,6 @@ extern uintptr_t tci_tb_ptr;
# define GETPC_LDST() ((uintptr_t) ((*(int32_t *)(GETRA() - 4)) - 1))
# elif defined(__arm__)
# define GETPC_EXT() GETPC()
-# elif defined(__aarch64__)
-# define GETRA() ((uintptr_t)__builtin_return_address(0))
-# define GETPC_LDST() tcg_getpc_ldst(GETRA())
-static inline uintptr_t tcg_getpc_ldst(uintptr_t ra)
-{
- int32_t b;
- ra += 4; /* skip one instruction */
- b = *(int32_t *)ra; /* load the branch insn */
- b = (b << 6) >> (6 - 2); /* extract the displacement */
- ra += b; /* apply the displacement */
- ra -= 4; /* return a pointer into the current opcode,
- not the start of the next opcode */
- return ra;
-}
# else
# error "CONFIG_QEMU_LDST_OPTIMIZATION needs GETPC_LDST() implementation!"
# endif
diff --git a/tcg/aarch64/tcg-target.c b/tcg/aarch64/tcg-target.c
index a03da58..52c1be4 100644
--- a/tcg/aarch64/tcg-target.c
+++ b/tcg/aarch64/tcg-target.c
@@ -301,9 +301,6 @@ typedef enum {
/* PC relative addressing instructions */
INSN_ADR = 0x10000000,
INSN_ADRP = 0x90000000,
-
- /* System instructions */
- INSN_NOP = 0xd503201f,
} AArch64Insn;
typedef enum {
@@ -522,6 +519,12 @@ static inline void tcg_out_movwi(TCGContext *s, AArch64Insn insn,
tcg_out32(s, insn | ext | shift << 17 | value << 5 | rd);
}
+static inline void tcg_out_fmt_adr(TCGContext *s, AArch64Insn insn,
+ TCGReg rd, tcg_target_long diff)
+{
+ tcg_out32(s, insn | rd | (diff & 3) << 29 | (diff & 0x1ffffc) << (5 - 2));
+}
+
static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
tcg_target_long value)
{
@@ -562,10 +565,7 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
often when loading pointers to QEMU's data structures. */
valid = (value >> 12) - ((intptr_t)s->code_ptr >> 12);
if (valid == sextract64(valid, 0, 21)) {
- insn = INSN_ADRP | rd;
- insn |= (valid & 3) << 29;
- insn |= (valid & 0x1ffffc) << (5 - 2);
- tcg_out32(s, insn);
+ tcg_out_fmt_adr(s, INSN_ADRP, rd, valid);
if (value & 0xfff) {
tcg_out_aimm(s, INSN_ADDI, ext, rd, rd, value & 0xfff);
}
@@ -985,32 +985,40 @@ static void tcg_out_addi(TCGContext *s, AArch64Ext ext, TCGReg rd, TCGReg rn,
}
}
-static inline void tcg_out_nop(TCGContext *s)
-{
- tcg_out32(s, INSN_NOP);
-}
-
#ifdef CONFIG_SOFTMMU
#include "exec/softmmu_defs.h"
-/* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr,
- int mmu_idx) */
+/* helper signature: helper_ret_ld_mmu(CPUState *env, target_ulong addr,
+ * int mmu_idx, uintptr_t ra)
+ */
static const void * const qemu_ld_helpers[4] = {
- helper_ldb_mmu,
- helper_ldw_mmu,
- helper_ldl_mmu,
- helper_ldq_mmu,
+ helper_ret_ldb_mmu,
+ helper_ret_ldw_mmu,
+ helper_ret_ldl_mmu,
+ helper_ret_ldq_mmu,
};
-/* helper signature: helper_st_mmu(CPUState *env, target_ulong addr,
- uintxx_t val, int mmu_idx) */
+/* helper signature: helper_ret_st_mmu(CPUState *env, target_ulong addr,
+ * uintxx_t val, int mmu_idx, uintptr_t ra)
+ */
static const void * const qemu_st_helpers[4] = {
- helper_stb_mmu,
- helper_stw_mmu,
- helper_stl_mmu,
- helper_stq_mmu,
+ helper_ret_stb_mmu,
+ helper_ret_stw_mmu,
+ helper_ret_stl_mmu,
+ helper_ret_stq_mmu,
};
+static inline void tcg_out_adr(TCGContext *s, TCGReg rd, tcg_target_long addr)
+{
+ tcg_out_fmt_adr(s, INSN_ADR, rd, addr - (tcg_target_long)s->code_ptr);
+}
+
+/* See the GETPC definition in include/exec/exec-all.h. */
+static inline uintptr_t do_getpc(uint8_t *raddr)
+{
+ return (uintptr_t)raddr - 1;
+}
+
static void tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
{
int opc = lb->opc;
@@ -1021,9 +1029,9 @@ static void tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_X0, TCG_AREG0);
tcg_out_mov(s, TCG_TYPE_TL, TCG_REG_X1, lb->addrlo_reg);
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_X2, lb->mem_index);
- tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_TMP,
- (tcg_target_long)qemu_ld_helpers[s_bits]);
- tcg_out_callr(s, TCG_REG_TMP);
+ tcg_out_adr(s, TCG_REG_X3, do_getpc(lb->raddr));
+
+ tcg_out_call(s, (tcg_target_long)qemu_ld_helpers[s_bits]);
if (opc & 0x04) {
tcg_out_sxt(s, E64, s_bits, lb->datalo_reg, TCG_REG_X0);
@@ -1046,11 +1054,10 @@ static void tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
tcg_out_mov(s, s_bits == 3 ? TCG_TYPE_I64 : TCG_TYPE_I32,
TCG_REG_X2, lb->datalo_reg);
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_X3, lb->mem_index);
- tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_TMP,
- (tcg_target_long)qemu_st_helpers[s_bits]);
- tcg_out_callr(s, TCG_REG_TMP);
+ tcg_out_adr(s, TCG_REG_X4, do_getpc(lb->raddr));
+
+ tcg_out_call(s, (tcg_target_long)qemu_st_helpers[s_bits]);
- tcg_out_nop(s);
tcg_out_goto(s, (tcg_target_long)lb->raddr);
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [RFC 01/14] tcg-aarch64: Allow immediate operands to add and sub
@ 2013-08-13 8:57 Jay Foad
2013-08-13 16:08 ` Richard Henderson
0 siblings, 1 reply; 17+ messages in thread
From: Jay Foad @ 2013-08-13 8:57 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel
> -static inline void tcg_out_addi(TCGContext *s, int ext,
> - TCGReg rd, TCGReg rn, unsigned int aimm)
> +static void tcg_out_addi(TCGContext *s, int ext, TCGReg rd, TCGReg rn,
> + tcg_target_long aimm)
> {
> - /* add immediate aimm unsigned 12bit value (with LSL 0 or 12) */
> - /* using ADD 0x11000000 | (ext) | (aimm << 10) | (rn << 5) | rd */
> - unsigned int base = ext ? 0x91000000 : 0x11000000;
> + enum aarch64_arith_opc opc = ARITH_ADDI;
> + tcg_target_long lo, hi;
>
> - if (aimm <= 0xfff) {
> - aimm <<= 10;
> - } else {
> - /* we can only shift left by 12, on assert we cannot represent */
> - assert(!(aimm & 0xfff));
> - assert(aimm <= 0xfff000);
> - base |= 1 << 22; /* apply LSL 12 */
> - aimm >>= 2;
> + if (aimm < 0) {
> + aimm = -aimm;
> + opc = ARITH_SUBI;
> }
> + hi = aimm & 0xfff000;
> + lo = aimm & 0xfff;
> + assert(aimm == hi + lo);
Won't this fail if aimm was -0x1000000 on entry?
Jay.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Qemu-devel] [RFC 01/14] tcg-aarch64: Allow immediate operands to add and sub
2013-08-13 8:57 [Qemu-devel] [RFC 01/14] tcg-aarch64: Allow immediate operands to add and sub Jay Foad
@ 2013-08-13 16:08 ` Richard Henderson
0 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2013-08-13 16:08 UTC (permalink / raw)
To: Jay Foad; +Cc: qemu-devel
On 08/13/2013 01:57 AM, Jay Foad wrote:
>> -static inline void tcg_out_addi(TCGContext *s, int ext,
>> - TCGReg rd, TCGReg rn, unsigned int aimm)
>> +static void tcg_out_addi(TCGContext *s, int ext, TCGReg rd, TCGReg rn,
>> + tcg_target_long aimm)
>> {
>> - /* add immediate aimm unsigned 12bit value (with LSL 0 or 12) */
>> - /* using ADD 0x11000000 | (ext) | (aimm << 10) | (rn << 5) | rd */
>> - unsigned int base = ext ? 0x91000000 : 0x11000000;
>> + enum aarch64_arith_opc opc = ARITH_ADDI;
>> + tcg_target_long lo, hi;
>>
>> - if (aimm <= 0xfff) {
>> - aimm <<= 10;
>> - } else {
>> - /* we can only shift left by 12, on assert we cannot represent */
>> - assert(!(aimm & 0xfff));
>> - assert(aimm <= 0xfff000);
>> - base |= 1 << 22; /* apply LSL 12 */
>> - aimm >>= 2;
>> + if (aimm < 0) {
>> + aimm = -aimm;
>> + opc = ARITH_SUBI;
>> }
>> + hi = aimm & 0xfff000;
>> + lo = aimm & 0xfff;
>> + assert(aimm == hi + lo);
>
> Won't this fail if aimm was -0x1000000 on entry?
Yep, off-by-one thinko on the constraint test.
Should only allow -0xffffff <= x <= 0xffffff.
r~
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2013-08-13 16:09 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-08-12 18:44 [Qemu-devel] [RFC 00/14] tcg aarch64 improvements Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 01/14] tcg-aarch64: Allow immediate operands to add and sub Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 02/14] tcg-aarch64: Allow immediate operands to and, or, xor Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 03/14] tcg-aarch64: Allow immediate operands to compare Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 04/14] tcg-aarch64: Convert from opcode enums to insn enums Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 05/14] tcg-aarch64: Support andc, orc, eqv, not Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 06/14] tcg-aarch64: Handle zero as first argument to sub Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 07/14] tcg-aarch64: Support movcond Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 08/14] tcg-aarch64: Support deposit Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 09/14] tcg-aarch64: Support add2, sub2 Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 10/14] tcg-aarch64: Support div, mulu2 Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 11/14] tcg-aarch64: Improve tcg_out_movi Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 12/14] tcg-aarch64: Avoid add with zero in tlb load Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 13/14] tcg-aarch64: Use adrp in tcg_out_movi Richard Henderson
2013-08-12 18:44 ` [Qemu-devel] [RFC 14/14] tcg-aarch64: Pass return address to load/store helpers directly Richard Henderson
-- strict thread matches above, loose matches on Subject: below --
2013-08-13 8:57 [Qemu-devel] [RFC 01/14] tcg-aarch64: Allow immediate operands to add and sub Jay Foad
2013-08-13 16:08 ` Richard Henderson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).